Monday, September 14, 2026
7 changes · master
Enhancements to existing features
The AI assistant no longer needs to keep a single request open while it works through answers and tool actions. Conversations can continue through secure background callbacks, support delegated sub-tasks, and keep users updated in the browser more reliably.
Original PR description
Previously, we kept an HTTP request open while the agent went through successive model rounds and tool calls. The worker waited for each model response until the conversation finished or paused for…
Previously, we kept an HTTP request open while the agent went through
successive model rounds and tool calls. The worker waited for each model
response until the conversation finished or paused for an interaction.
We now store the pending work on ai.session and advance the conversation
across separate requests, each using its normal transaction boundary:
- /ai/start_session_advance starts an exchange from a new user message.
- /ai/completion_result_ready receives the model result from IAP, then
runs tools or finishes the exchange.
- /ai/resume_pending_interaction continues a paused tool batch from a
user or browser response.
```text
[ 1. Start / Resume Request ]
|
v
[ 2. Save Request & Commit ] <---------------+
| |
Submit Request | | Next Round
v |
[ 3. Asynchronous IAP Processing ] |
| |
HTTP callback to webhook |
v |
[ 4. Process Result & Run Tools ] -----------+
|
+----> [ 5. Final Answer / Pause ]
|
+----> [ 6. Child Session (Subagent) ]
|
(Same loop, steps 2-6)
|
(Result to parent batch)
```
Requests are saved before commit and submitted to IAP afterward, ensuring
their state is visible when the result arrives. IAP delivers model results
through signed HTTP requests to our webhook endpoint. The signature and
request UUID are checked before we restore the saved user and context
and process the response. Tool calls still run synchronously within
that request.
Agents can now delegate work through tools that start or continue child
sessions. Each child has its own conversation history and uses the same
loop, including further delegation. Its result returns to the parent's
pending tool batch, which continues once the required results arrive.
The browser now receives messages, loop state, pending interactions, and
client tools through the bus instead of the response stream. User and
browser responses resume the saved tool batch, with client tools
targeted to the requesting tab.
Existing AI integrations and tests are adapted to the webhook-driven flow.
TASK-ID: 5153883
Co-Authored-By: Andrzej(pian) <pian@odoo.com>Odoo Sign can now let signers apply their own qualified electronic signature through itsme, instead of only sealing completed documents with the company certificate. This strengthens legal assurance for signed documents and preserves each signer’s contribution as the document progresses through the signing process.
Original PR description
Until now the completed document was signed with the company certificate only. An identity check like `itsme` told us who the signer was, but the signature on the file stayed the company one. The signer can now sign with their own qualified certificate. The file then carries their signature and not only the company one. For that, the completed document is now built with incremental updates over the original file. Each signer's values are added as a new revision, so a signature already on the file stays valid when the next signer adds theirs. The qualified signature is made by a service running on its own server. It shows the signer the document before signing it. That service is added in odoo/iap-apps#1890 and the `itsme` role needs it. task-4951149
This update makes it easier for businesses with multiple companies to move goods between warehouses without creating matching sales and purchase documents each time. It also improves visibility and valuation of these inter-company transfers, helping teams track stock movement and internal recharging more accurately.
Original PR description
Improves inter-company flows by reducing the friction in multi-company settings, as well as allowing easier inter-company transfers without going through SO <-> PO inter-company transactions. Summary…
Inter-company sales and purchase flows now stay better aligned when quantities, prices, discounts, or display lines change. Related deliveries and receipts are linked more consistently, reducing manual follow-up and improving visibility across companies.
Original PR description
Summary of the changes: - Update inter-company transaction settings to remove intercompany user / warehouse / picking type - Now when the intercompany sync is active, it will link moves from the SO <-> PO pickings through the `move_dest_ids`/`move_orig_ids`, the same way they would be linked through an inter-company resupply - Correctly updates and notify the corresponding SO/PO when a quantity/price/discount is updated on a PO/SO line. - Minor updates to follow the changes made in community Task-4816396
Payroll users are now warned when changing an employee version that is tied to validated payslips. They can either create a new version from a chosen date or deliberately correct the current version, reducing the risk of accidental changes to payroll history.
Original PR description
**Description :-** This PR introduces a front-to-back version control mechanism for the version records (hr.employee / hr.version). When an end-user attempts to modify a version that is protected…
**Description :-**
This PR introduces a front-to-back version control mechanism for the version records (hr.employee / hr.version). When an end-user attempts to modify a version that is protected with validated payslips, the system intercepts the modification in real-time and prompts the user with an interactive confirmation dialog (VersionUpdateDialog).
The user can choose between two operational modes:-
. Create New Version: Closes the current version and creates a new active hr.version record incorporating the modified fields, and relinks the employee.
. Correct Current Version: Bypasses version splitting and applies modifications directly to the active version record (displaying a warning regarding payslip impacts).
**Implementation :-**
The feature is implemented cleanly by inheriting the base hr form view (hr_employee_version_form) and extending HrEmployeeFormController without using global record patching, onRecordChanged() method overridden to intercepts the version updates flow
1. [ Field Modification on the version form view ]
│
▼
2. Controller Interception (onRecordChanged)
│ • check the version status via RPC: action_check_version_status
│ • Halts execution flow with an asynchronous Promise wrapper
│
▼
3. Interactive Protection Prompt (VersionUpdateDialog)
│ • Renders responsive options ("Create New Version" vs "Correct Current Version")
│ • Captures effective start date for new versions
│
▼
4. Promise Resolution & State Caching
│ • Apply: Resolves selection object { mode, dateStart } -> Cached in this.versionChoice
│ • Discard / Close: Resolves null -> Triggers record.discard() to revert pending edits
│
▼
5. Intercepted Save Execution (save())
│ • Mode A ("create_new_version"): RPC calls action_create_version_from_update,
│ resets old record state, and reloads view model to the new version.
│ • Mode B ("correct_current_version"): Executes standard ORM write via super.save().
▼
6. Apply the changes
task-6482857The AI website assistant now gets clear feedback when page or CSS edits fail, so it can correct issues instead of assuming changes worked. It also uses a dedicated, validated process for creating website forms, making forms more reliable, editable in the website builder, and better suited for advanced flows like multi-step wizards and live calculations.
Original PR description
Previously, the "Apply HTML to Page" and "Write Custom CSS" tools blinded the agent to actual edit failures by always returning a success string. Additionally, the agent hand-wrote form markup, which…
Previously, the "Apply HTML to Page" and "Write Custom CSS" tools blinded the agent to actual edit failures by always returning a success string. Additionally, the agent hand-wrote form markup, which frequently resulted in broken forms that were not editable in Odoo's website builder or missed a destination. This commit introduces comprehensive edit reporting and a dedicated tool to safely handle webforms: - Edit Reporting: The HTML and CSS tools now return a `client_tool`entry (`website_apply_html`, `website_reload_css`). The builder applies the actions and returns a detailed report (success/errors, dropped elements, post-edit content, duration). - Edit Webform Tool: Form work is now handled by a dedicated tool rather than raw HTML edits. Specs (actions, fields, visibility, layouts) are validated server-side and applied via the builder's form plugin machinery. Raw form HTML in the standard apply tool is now explicitly rejected. - JSON Form Context: Webforms are exposed to the agent as JSON under `website_page.forms` instead of raw HTML, replacing the markup with a marker. The tool result returns the updated form in the same JSON shape. - Advanced Primitives: The webform tool supports multi-step forms, choice display variants, sliders, and computed fields. - Skill Updates: The agent's instructions are updated to check edit reports, retry failed actions, and steer wizards/live totals towards the new form primitives instead of hand-building them. task-6251785
Website forms can now offer multi-step flows, improved choice displays, sliders for numeric answers, and live calculated totals. This helps businesses create clearer, more interactive forms while also resolving issues that could disrupt saving forms or editing builder lists.
Original PR description
Forms gain four building primitives: multi-step layout (step containers with runtime-inserted Previous/Next navigation, a dots/bar progress indicator and per-step validation), buttons/boxed display variants for choice fields with an explicit checked state and focus ring, a slider display for number fields with a keyboard-editable value input, and a computed field type displaying a live total from a declarative formula over field values and option weights. Also fixes saving a form containing an unnamed field (the whitelist computation crashed on the empty name) and stops the builder list from clobbering item ids when a non-display_name column is edited. task-6251785
Improves inter-company flows by reducing the friction in multi-company settings, as well as allowing easier inter-company transfers without going through SO <-> PO inter-company transactions. Summary of the changes: - Always set the right `inter-warehouse transit`/ `inter-company transit` locations to warehouse partners - Refactor the way resupply from warehouse to warehouse works - Now always consists of 3 rules, regardless of the delivery steps, but now make use of the push delivery routes. - If more than one company is accessible, warehouse from other companies can be selected for resupply - Allow to select a warehouse from another company as the SO's warehouse and trigger its delivery from there. - Allow to select a warehouse from another company as the PO's warehouse and trigger its receipt from there. - When computing a move's value, if the product came from a previous company, then use the value it had there when leaving the company. - Add a favorite filter in Move Analysis to better track these new inter-company transfers Task-4816396 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr