> For the complete documentation index, see [llms.txt](https://docs.appmixer.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.appmixer.com/changelog/version-6/6/6.5/6.5.1.md).

# 6.5.1

2026-08-24

## New Features

#### AI Copilot <a href="#ai-copilot" id="ai-copilot"></a>

* **Copilot now persists the flow while it builds it** — Instead of assembling a flow descriptor and submitting it only at the end, Copilot saves the flow to the database as it goes and runs a save → validate → fix loop against the stored flow. The flow is an ordinary flow from the first save, not a draft, and later conversation turns update that same flow. Persistence goes through the platform's own API, so ACL, storage quotas, flow and component limits, payload schema validation and audit all apply exactly as they do to a flow built by hand. Running flows are never modified — the flow must be stopped first. Set `INTERNAL_API_URL` to the in-cluster engine URL so these self-calls do not route through the external load balancer; it falls back to `APPMIXER_API_URL`.
* **Copilot connects accounts and reads live variables while building** — Copilot can connect a user's available account to a component and load real variable values during construction, rather than leaving accounts unconnected and variables unresolved until the user opens the flow. Sizing is bounded by `COPILOT_VARIABLES_MAX_*` limits.
* **Copilot is configurable from the Backoffice, with hot reload** — The Copilot system plugin's configuration moves into the cluster configuration, editable via the Backoffice and applied without restarting a pod. This covers the LLM endpoint (`COPILOT_LLM_URL`), the customer prompt extensions below, and the variable size caps.
* **Custom context and tone of response** — Two optional settings extend the Copilot system prompt: `COPILOT_CUSTOM_CONTEXT` for customer-specific use cases, connectors and data specifics, and `COPILOT_TONE_OF_RESPONSE` for the tone, vocabulary and register of replies. Both are unset by default. Values are injected as delimited, lower-authority operator configuration — they can refine behaviour and tone but cannot override Copilot's core role, its safety rules or its flow-building rules, nor reveal the system prompt.
* **`aiDescription` for connectors and components** — `component.json`, module and service manifests accept an optional `aiDescription` field (up to 1000 characters) written for the model rather than for the Designer UI, where `description` is deliberately kept short. Copilot's discovery tools prefer it and fall back to `description`, so connectors without the field behave exactly as before. Useful for steering Copilot on custom connectors:

  ```json
  {
    "description": "Creates a customer in Salesforce.",
    "aiDescription": "Use this component when the user wants to create a new Salesforce Account or Contact. It does not update existing records."
  }
  ```
* **Dangling variable references are rejected before a flow is saved** — Copilot validates the descriptor's variable references before anything is persisted: every `{{{token}}}` in a lambda must have a matching entry in that field's `modifiers` group, and a raw `$.…` path used inside braces or as plain lambda text is rejected with the exact correction to make. Legacy components carrying no `modifiers` object are only flagged when a reference is provably broken, so a Designer-built component re-submitted during an edit can never fail a save. Rejecting before persisting leaves the last valid save intact.

#### Flows <a href="#flows" id="flows"></a>

* **Opt-in account auto-connection on flow save and clone** — A new `autoConnectAccounts` parameter connects the user's available account after a flow is saved or cloned. Copilot-built flows use it so they preselect an account exactly as manual flow building does, including when the user has more than one account available.

#### Navigation <a href="#navigation" id="navigation"></a>

* **Reworked navigation menu** — The main navigation is now a flyout in the collapsed rail, keeps a single group open at a time, and is visually unified with the workspace switcher.

## Bug Fixes

* **Copilot: one request owns the flow it is changing** — Concurrent Copilot requests could interleave writes to the same flow. A run is now owned by the Designer for its duration: the canvas is locked while a request is in flight, the target flow is nominated before the prompt is sent, the backend writes only that flow and only one write at a time, and the run is reconciled at its end rather than mid-stream. The composer explains why it is blocked instead of silently refusing input, a request survives the panel being closed, and the History button is visibly disabled while Copilot writes.
* **Copilot: a refused save is no longer hidden** — The Designer now surfaces a save that Copilot refused instead of swallowing it, no longer re-saves a flow that Copilot has already persisted, and reports the backend's mid-turn write on every handoff route. The pre-Copilot snapshot is taken in the plugin and reported to the client, so it is no longer captured too late.
* **Copilot: an empty canvas is no longer versioned before the first write** — Starting a Copilot conversation on a blank canvas created a spurious flow version.
* **Copilot: an unvalidated flow is never shipped silently** — When the validation call failed after a save round, the loop previously told the model to proceed, and the rest of the build ran with validation effectively off — which is how flows with invalid variables could reach the Designer looking finished. A failed validation is now retried once where a retry can plausibly succeed (5xx and network failures; deterministic 4xx failures fail the round immediately), and when validation stays unavailable the state is remembered, the user is warned once by the platform, and `submitFlow` reports a `validationUnavailable` flag on the `flow-result` event so clients can render a proper localizable warning. Existing clients are unaffected.
* **Designer stays alive when a template field hits a composite validation error** — A composite validation error on a template field could take down the Designer.
* **Template field paths survive link reroutes** — Template field paths are now carried across a link reroute instead of being lost, and the collision dedupe no longer removes wizard fields that name no input.
* **A supplied localization key is honoured whatever its value** — Localization overrides passed through `appmixer.set('strings', …)`, the instance options, or a widget's `l10n` factory option were resolved by truthiness, so a key deliberately set to an empty string, `0` or `false` was treated as absent and the shipped English default was rendered instead. Presence now decides: a key that is absent falls back to the default, and a key that is present overrides it whatever its value or type, with `null` and `undefined` normalized to an empty string and other non-strings converted rather than ignored. All three entry points behave identically.
* **Fixed only one action being removed per job run** — The `ActionsController` queue event listener activated only once, so a single action was removed per job instead of all of them.

## Performance & Technical Improvements

* **Node.js upgraded to 24.19.0** — Base images across the engine, frontend and Backoffice move to Node.js 24.19.0. This also fixes outbound TLS failures (`UNABLE_TO_GET_ISSUER_CERT_LOCALLY`) to endpoints whose certificate chains to Let's Encrypt's ISRG Root YR, which is absent from the older image's compiled-in root CA store.
* **`node_modules` is reinstalled only on a Node.js major version change** — Previously every patch or minor Node.js image bump triggered a cluster-wide `npm install` and a GridFS re-upload of every plugin's and component's `node_modules`. Only the major version segment is compared now, since that is what native addon ABI compatibility depends on.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.appmixer.com/changelog/version-6/6/6.5/6.5.1.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
