Skip to content
60 changes: 59 additions & 1 deletion modules/ROOT/pages/8.9.0-release-notes.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ include::partial$misc/admon-releasenotes-for-stable.adoc[]
[[overview]]
== Overview

{productname} {release-version} was released for {enterpriseversion} and {cloudname} on <weekday>, <month> <DD>^<st|nd|rd|th>^, <YYYY>. These release notes provide an overview of the changes for {productname} {release-version}, including:
{productname} {release-version} was released for {enterpriseversion} and {cloudname} on Wednesday, August 26^th^, 2026. These release notes provide an overview of the changes for {productname} {release-version}, including:

// Remove sections and section boilerplates as necessary.
// Pluralise as necessary or remove the placeholder plural marker.
Expand Down Expand Up @@ -71,6 +71,41 @@ The {productname} {release-version} release includes an accompanying release of

For information on the **<Premium plugin name 1>** plugin, see: xref:<plugincode>.adoc[<Premium plugin name 1>].

=== TinyMCE AI

The {productname} {release-version} release includes an accompanying release of the **TinyMCE AI** premium plugin.

**TinyMCE AI** includes the following addition and improvements.

==== Improved error message shown when the chat prompt exceeds the maximum length
// #TINYMCE-13659

Previously, when the text typed into the Chat sidebar exceeded the maximum length that the AI service accepts for a single message, the request failed and the Chat sidebar reported it with the general message `+An error occurred while processing the AI response.+` That message did not identify the length of the typed text as the cause, so users could not tell that shortening the message would resolve the failure.

In {productname} {release-version}, the **TinyMCE AI** plugin shows `+This prompt is too long. Try a shorter one.+` when the typed text exceeds that limit. This message applies to the typed message on its own, and is distinct from the message shown when a message and the conversation history together exceed the context limit of the AI service.

==== The `tinymceai_chat_fetch_sources` option can now specify default sources for chat conversations.
// #TINYMCE-14777

Previously, the **TinyMCE AI** plugin applied only the current document to the context of a new AI Chat conversation. Users had to manually add every other context source, such as a style guide or reference document, to each new conversation.

In {productname} {release-version}, the function supplied to xref:tinymceai.adoc#tinymceai_chat_fetch_sources[`+tinymceai_chat_fetch_sources+`] can resolve to an object with a `+menu+` property, holding the source groups shown in the sources menu, and a `+defaults+` property, holding an array of source identifiers. The plugin adds each source listed in `+defaults+` to the context of every new conversation, and shows it as selected in the sources menu. Users can remove a default source from a conversation and add it again from the sources menu.

Identifiers listed in `+defaults+` without a matching source in `+sources+` are not added to the context, and the plugin logs an error in the browser console.

The option continues to accept a function that resolves to an array of source groups, so existing configurations are unaffected.

For details on configuring conversation context, see xref:tinymceai-chat.adoc#context-configuration[Adding custom context sources].

==== Scroll position is preserved between the editor content and the AI preview
// #TINYMCE-14769

Previously, the scroll position was not carried between the editor content and the AI preview. Opening the preview, running a review, or applying a quick action could move the viewport away from the part of the document being worked on, so users lost their place.

In {productname} {release-version}, the **TinyMCE AI** plugin records the content block nearest to the current scroll position and restores the view to that block. The position is preserved when opening the preview, running a review, and applying a quick action, and it is restored to the same block even when the content is a different height in the editor and in the preview.

For information on the **TinyMCE AI** plugin, see: xref:tinymceai.adoc[TinyMCE AI].


[[accompanying-premium-plugin-end-of-life-announcement]]
== Accompanying Premium plugin end-of-life announcement
Expand Down Expand Up @@ -116,6 +151,13 @@ For information on using Enhanced Skins & Icon Packs, see: xref:enhanced-skins-a

// CCFR here.

=== The Help dialog lists plugins with invalid metadata as plain text
// #TINYMCE-14730

Previously, the _Plugins_ tab of the xref:help.adoc[Help] dialog used the metadata returned by a plugin without checking that the expected fields were present and of the expected type. A plugin that supplied a name but no URL was still rendered as a link, and selecting that link navigated to `+/undefined+`.

In {productname} {release-version}, the Help dialog checks the metadata a plugin supplies before rendering it. A plugin whose metadata is missing or of an unexpected type is listed as plain text rather than as a link, using the plugin name where one is supplied, and the plugin identifier where one is not.


[[additions]]
== Additions
Expand Down Expand Up @@ -160,6 +202,22 @@ For information on using Enhanced Skins & Icon Packs, see: xref:enhanced-skins-a

// CCFR here.

=== Image with empty alt text would add `+role="presentation"+` instead of adding alt text when updated
// #TINYMCE-13738

Previously, the xref:image.adoc[Image] plugin treated any image with an empty `+alt+` attribute as decorative. When xref:image.adoc#a11y_advanced_options[`+a11y_advanced_options+`] was disabled, the _Insert/Edit Image_ dialog did not show the *Image is decorative* option, so the dialog offered no way to change that state. Entering alternative text for such an image and saving the dialog applied `+role="presentation"+` and left the `+alt+` attribute empty, discarding the text that had been entered.

In {productname} {release-version}, the Image plugin marks an image as decorative only when the _Insert/Edit Image_ dialog presents the accessibility options. Entering alternative text for an image with an empty `+alt+` attribute now applies that text to the image.

=== Opening or closing a sidebar from the toolbar scrolled the editor to the selection
// #TINYMCE-14765

Previously, opening or closing a sidebar from a toolbar button scrolled the editor content to the current selection when the editor was not focused. Toggling a sidebar is not a content operation, so the viewport moved away from the part of the document the user was reading.

In {productname} {release-version}, toggling a sidebar from the toolbar no longer scrolls the selection into view. This applies to every sidebar registered through `+editor.ui.registry.addSidebar+`. Commands that change content, such as _Bold_, continue to focus the editor and scroll to the selection as before.

The xref:apis/tinymce.editor.adoc#focus[`+editor.focus()+`] method also accepts an object argument, so callers can focus the editor without scrolling the selection into view, as in `+editor.focus({ scrollToSelection: false })+`. The `+scrollToSelection+` property defaults to `+true+`, and passing a boolean continues to behave as before.


[[security-fixes]]
== Security fixes
Expand Down
2 changes: 1 addition & 1 deletion modules/ROOT/pages/changelog.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

NOTE: This is the {productname} Community version changelog. For information about the latest {cloudname} or {enterpriseversion} Release, see: xref:release-notes.adoc[{productname} Release Notes].

== xref:8.9.0-release-notes.adoc[8.9.0 - <YYYY-MM-DD>]
== xref:8.9.0-release-notes.adoc[8.9.0 - 2026-08-26]

//TODO

Expand Down
6 changes: 4 additions & 2 deletions modules/ROOT/pages/tinymceai-chat.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,8 @@ To add custom external sources for users to select from, configure:

Full schemas, return types, and examples are documented under xref:tinymceai.adoc#tinymceai_chat_fetch_sources[Chat configuration options].

To apply a custom source to every new conversation without requiring users to select it, return an object from xref:tinymceai.adoc#tinymceai_chat_fetch_sources[`+tinymceai_chat_fetch_sources+`] and list the source ID in its `+defaults+` property.

[source,js]
----
tinymce.init({
Expand All @@ -176,9 +178,9 @@ tinymce.init({
}
],
tinymceai_chat_fetch_source: async (id) => {
const res = await fetch(`/api/documents/\$\{id\}`);
const res = await fetch(`/api/documents/${id}`);
const blob = await res.blob();
const filename = `\$\{id\}.pdf`;
const filename = `${id}.pdf`;
return { type: 'file', file: new File([blob], filename, { type: blob.type }) };
},
// Required for authentication
Expand Down
4 changes: 2 additions & 2 deletions modules/ROOT/pages/tinymceai.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -93,9 +93,9 @@ tinymce.init({
}
],
tinymceai_chat_fetch_source: async (id) => {
const res = await fetch(`/api/documents/\$\{id\}`);
const res = await fetch(`/api/documents/${id}`);
const blob = await res.blob();
const filename = `\$\{id\}.pdf`;
const filename = `${id}.pdf`;
return { type: 'file', file: new File([blob], filename, { type: blob.type }) };
},
tinymceai_quickactions_custom: [
Expand Down
62 changes: 53 additions & 9 deletions modules/ROOT/partials/configuration/tinymceai_options.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -178,17 +178,28 @@ These options configure the AI Chat sidebar, where users have interactive conver
[[tinymceai_chat_fetch_sources]]
=== `+tinymceai_chat_fetch_sources+`

Populates the sources menu with submenus of files and web resources. Users can select these sources as additional context for chat conversations.
Populates the sources menu with submenus of files and web resources. Users can select these sources as additional context for chat conversations. The option can also nominate default sources, which the {pluginname} plugin adds to the context of every new conversation.

Takes a function that returns a Promise resolving to an array of additional context source groups. Each group has `+label+`, optional `+icon+`, and `+sources+` array. Each source has `+id+`, `+label+`, and `+type+` (`+'web-resource'+` or `+'file'+`). A source's `+id+` is used to fetch its content through xref:tinymceai.adoc#tinymceai_chat_fetch_source[`tinymceai_chat_fetch_source`].
Takes a function that returns a Promise resolving to either of the following:

*Type:* `+Function+` (`+() => Promise<Array>+`)
* An array of source groups.
* An object with a `+menu+` property, holding the array of source groups, and a `+defaults+` property, holding an array of source identifiers.

Each source group has `+label+`, optional `+icon+`, and `+sources+` array. Each source has `+id+`, `+label+`, and `+type+` (`+'web-resource'+` or `+'file'+`). A source's `+id+` is used to fetch its content through xref:tinymceai.adoc#tinymceai_chat_fetch_source[`tinymceai_chat_fetch_source`].

Both shapes are supported. Returning an array populates the sources menu without nominating any default sources.

Each identifier listed in `+defaults+` must match the `+id+` of a source listed in `+sources+`. The plugin adds each matching source to the context of every new conversation, and shows it as selected in the sources menu. Identifiers without a matching source are not added to the context, and the plugin logs an error in the browser console. Users can remove a default source from a conversation and add it again from the sources menu.

If `+menu+` is missing or empty, the plugin logs an error in the browser console and populates no sources.

*Type:* `+Function+` (`+() => Promise<Array | Object>+`)

*Possible Values:* For source `+type+` property: `+'web-resource'+`, `+'file'+`

*Default value:* `+() => Promise.resolve([])+`

.Example
.Example: populating the sources menu
[source,js]
----
tinymce.init({
Expand All @@ -206,9 +217,42 @@ tinymce.init({
}
],
tinymceai_chat_fetch_source: async (id) => {
const res = await fetch(`/api/documents/\$\{id\}`);
const res = await fetch(`/api/documents/${id}`);
const blob = await res.blob();
const filename = `${id}.pdf`;
return { type: 'file', file: new File([blob], filename, { type: blob.type }) };
},
// Required for authentication
tinymceai_token_provider: () => {
return fetch('/api/token').then(r => r.json());
}
});
----

.Example: nominating default sources
[source,js]
----
tinymce.init({
selector: 'textarea',
plugins: 'tinymceai',
toolbar: 'tinymceai-chat tinymceai-quickactions tinymceai-review',
tinymceai_chat_fetch_sources: async () => ({
defaults: [ 'doc-1' ],
menu: [
{
label: 'My Documents',
icon: 'folder',
sources: [
{ id: 'doc-1', label: 'Style guide', type: 'file' },
{ id: 'url-1', label: 'Web Page', type: 'web-resource' }
]
}
]
}),
tinymceai_chat_fetch_source: async (id) => {
const res = await fetch(`/api/documents/${id}`);
const blob = await res.blob();
const filename = `\$\{id\}.pdf`;
const filename = `${id}.pdf`;
return { type: 'file', file: new File([blob], filename, { type: blob.type }) };
},
// Required for authentication
Expand All @@ -227,7 +271,7 @@ A function that fetches the content for an additional source by ID. Receives the

*Possible Values:* For return object `+type+` property: `+'file'+`, `+'web-resource'+`

*Default value:* `+(id) => Promise.resolve(\`Should fetch additional source with given \$\{id\}\`)+`
*Default value:* `+++(id) => Promise.resolve(`Should fetch additional source with given ${id}`)+++`

.Example
[source,js]
Expand All @@ -240,9 +284,9 @@ tinymce.init({
{ label: 'Docs', sources: [{ id: 'doc-1', label: 'Document 1', type: 'file' }] }
],
tinymceai_chat_fetch_source: async (id) => {
const res = await fetch(`/api/documents/\$\{id\}`);
const res = await fetch(`/api/documents/${id}`);
const blob = await res.blob();
const filename = `\$\{id\}.pdf`;
const filename = `${id}.pdf`;
return { type: 'file', file: new File([blob], filename, { type: blob.type }) };
},
// Required for authentication
Expand Down
2 changes: 1 addition & 1 deletion modules/ROOT/partials/misc/supported-versions.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ Supported versions of {productname}:
[cols="^,^,^",options="header"]
|===
|Version |Release Date |End of Premium Support
|8.9 |<YYYY-MM-DD> |<YYYY-MM-DD>
|8.9 |2026-08-26 |2028-02-26
|8.8 |2026-07-15 |2028-01-15
|8.7 |2026-06-30 |2027-12-30
|8.6 |2026-06-03 |2027-12-03
Expand Down
Loading