Skip to main content
Version: Next

Upgrade notes

Upgrade to 2026.3.0

Raised minimum Pimcore Studio Backend Bundle version

pimcore/studio-backend-bundle is now required at ^2026.3, up from ^2026.1.1. That release is where the shared MCP tool boundary lives, which the automation action MCP tools build on. The requirement applies to every installation, including those that never install mcp/sdk and therefore never register the tool groups.

Raised minimum Pimcore version

pimcore/pimcore is now required at ^2026.3, up from ^2026.1. That release is where the usage.* telemetry extension point (BundleUsageProviderInterface) lives, which the bundle's usage.copilot provider builds on: once a day the maintenance snapshot reports whether at least one automation or interaction action is configured. Only that boolean leaves the installation; action names are never emitted.

Upgrade to 2026.2.3

Frontend Build Ships as a Packaged Archive

The compiled Studio frontend is no longer committed as an expanded public/studio/build/ directory. It now ships as a single archive (build-dist/build-<id>.zip) that is extracted into public/studio/build/ automatically during cache warmup.

pimcore/studio-ui-bundle ^2026.2.1 is now required, as it provides the archive extraction.

Note: Read-only filesystem deployments must run bin/console cache:warmup (or cache:clear) during the build/deploy phase while the bundle directory (usually under vendor/) is still writable. Standard Pimcore deployments already do this. When assets:install runs in copy mode, run cache:warmup before it, otherwise no frontend assets are copied. If the filesystem becomes read-only before the first warmup, the bundle fails with BuildArchiveNotWritableException because there is no build to serve.

Upgrade to 2026.1.0

Removed ExtJS / Admin Classic UI Support

The bundle no longer ships any ExtJS-based frontend code or integrates with the Pimcore Admin Classic UI.

PimcoreCopilotBundle no longer implements PimcoreBundleAdminClassicInterface and no longer uses BundleAdminClassicTrait. The following methods have been removed from the bundle class:

  • getJsPaths() (registered 38 JS files under public/js/pimcore/)
  • getCssPaths() (registered public/css/icons.css and public/css/styles.css)

All ExtJS JavaScript files under public/js/pimcore/, all CSS files under public/css/, and all SVG images under public/img/ have been deleted.

The following PHP classes have been deleted:

  • All controllers under src/Controller/Admin/ (configuration, interaction action, automation action, job run, role, user controllers)
  • src/Controller/CopilotController.php
  • src/Controller/AutomationActionExecutionController.php
  • src/EventSubscriber/AdminSubscriber.php
  • src/Routing/StudioRouteLoader.php
  • src/Utils/Traits/AuditTrait.php
  • src/Utils/Traits/LogAndReturnTrait.php
  • src/Utils/Traits/ThrowableChainTrait.php
  • src/Utils/Traits/UpdateControllerTrait.php
  • src/Controller/Studio/Configuration/AutomationAction/ValidateStepConfigurationTrait.php
  • config/admin-classic.yaml

If you relied on these Admin controllers or traits, you need to migrate to the equivalent Studio API endpoints.

Added Pimcore Studio Backend & UI Bundle Support

pimcore/studio-ui-bundle has been added as a required dependency. The Studio UI bundle must be registered in config/bundles.php:

"Pimcore\\Bundle\\StudioUiBundle\\PimcoreStudioUiBundle" => ['all' => true],

The Symfony security configuration must be updated to include the Studio firewall and access-control rules. Example:

security:
firewalls:
pimcore_studio: '%pimcore_studio_backend.firewall_settings%'
# ...

access_control:
- { path: ^/pimcore-studio/api/(docs|docs/json|translations|user/reset-password)$, roles: PUBLIC_ACCESS }
- { path: ^/pimcore-studio/api, roles: ROLE_PIMCORE_USER }
- { path: ^/asset/webdav, roles: ROLE_PIMCORE_USER }

Interface Changes

The following service interfaces have changed. If you implement or extend them, you must update your code accordingly.

ConfigurationCrudServiceInterface

Namespace: Pimcore\Bundle\CopilotBundle\Service\Studio\Configuration\AutomationAction

  • createConfiguration(): added @throws ConflictException
  • updateConfiguration(): added @throws InvalidArgumentException

Configuration\InteractionAction\ServiceInterface

Namespace: Pimcore\Bundle\CopilotBundle\Service\Studio\Configuration\InteractionAction

  • createConfiguration(): added @throws ConflictException
  • updateConfiguration(): added @throws InvalidArgumentException

EnvironmentServiceInterface

Namespace: Pimcore\Bundle\CopilotBundle\Service\Studio\Configuration\AutomationAction

  • getEnvironmentTypes(): @throws Exception removed (method no longer declares a checked exception)
  • getEnvironmentInlineHelp(): @throws Exception removed

StepServiceInterface

Namespace: Pimcore\Bundle\CopilotBundle\Service\Studio\Configuration\AutomationAction

  • getPreconditionFilters(): now throws InvalidArgumentException (was Exception)
  • All other methods: @throws Exception removed

ChatServiceInterface

Namespace: Pimcore\Bundle\CopilotBundle\Service\Studio\InteractionAction

  • initial(), prompt(), apply(): added @throws EnvironmentException|InvalidArgumentException (were previously undeclared)

OneStepServiceInterface

Namespace: Pimcore\Bundle\CopilotBundle\Service\Studio\InteractionAction

  • oneStep(): added @throws EnvironmentException|InvalidArgumentException

AutomationAction\ServiceInterface (new)

Namespace: Pimcore\Bundle\CopilotBundle\Service\Studio\AutomationAction

A new interface ServiceInterface has been introduced:

public function runAction(string $configurationName, AutomationActionRunParameters $parameters): CopilotJobRunId;
// @throws InvalidArgumentException|NotFoundException|ValidationFailedException

If you previously called Service::runAction() directly without the interface, type-hint against ServiceInterface instead.

Schema Classes Now Implement AdditionalAttributesInterface

The following schema classes now implement Pimcore\Bundle\StudioBackendBundle\Util\Schema\AdditionalAttributesInterface (via AdditionalAttributesTrait) and are no longer declared readonly:

  • CopilotJobRunId
  • InteractionActionChatHistory
  • InteractionActionOneStep

If you relied on these being readonly classes or serialized them directly, review your code for compatibility.

New Pre-Response Events

Three new event classes have been added under Pimcore\Bundle\CopilotBundle\Event\PreResponse, each extending AbstractPreResponseEvent:

ClassEVENT_NAME constant
CopilotJobRunIdEventpre_response.copilot.job_run_id
InteractionActionChatHistoryEventpre_response.copilot.interaction_action_chat_history
InteractionActionOneStepEventpre_response.copilot.interaction_action_one_step

These events are dispatched before the corresponding Studio API responses are returned and allow you to enrich the response with additional attributes.

Removed Doctrine Enum Mapping

The custom Doctrine mapping type enum: string has been removed from the test/application configuration. Pimcore 2026.x handles enum types natively. Remove the following from your config/packages/doctrine.yaml (or equivalent) if present:

doctrine:
dbal:
connections:
default:
mapping_types:
enum: string # remove this line

Updated Dependencies

  • PHPStan updated from 1.x to 2.x. Review your phpstan-baseline.neon and custom PHPStan rules, since PHPStan 2.x may report new errors.
  • Added support for PHP 8.5.
  • Removed support for PHP 8.3 and Symfony v6.

1.1.0 to 2.0.0

  • The job execution engine was removed. You need to implement/adapt your actions to run with Generic Execution Engine.
    • To do so, please follow the migration guide here.

1.0.0 to 1.1.0

  • The job execution engine has been extracted to the core framework as Generic Execution Engine and it is highly recommended to switch to it. Following things need to be considered:
    • The old way of implementing custom job steps is deprecated. If you already have custom job steps implemented, you can still use them for now, but it is recommended to migrate them to the new way. Please see the migration guide here.
    • Use the Generic Execution Engine as soon as possible. To do so, also follow the migration guide here.