Skip to content

story: ext. plugin results value resolvers and use ext. plugins in bb - #830

Open
mbritense wants to merge 9 commits into
feature/external-plugin-systemfrom
story/771-plugin-value-resolvers
Open

story: ext. plugin results value resolvers and use ext. plugins in bb#830
mbritense wants to merge 9 commits into
feature/external-plugin-systemfrom
story/771-plugin-value-resolvers

Conversation

@mbritense

@mbritense mbritense commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

Closes generiekzaakafhandelcomponent/gzac-issues#771 and generiekzaakafhandelcomponent/gzac-issues#768

Reviewer test guide

#771 — Action result write-back

  • Link an external action that declares outputs in its manifest (e.g. case-summary) to a service task → the wizard shows an extra Output mapping step (Next on the config step, Save on the mapping step). An action without outputs gets no extra step (Save directly).
  • On the mapping step: source is a dropdown of the declared keys, target a doc/case path selector. Zero rows = saveable; a row missing source or target disables Save.
  • Run a case: mapped result values land on the case/BB document (pv: targets become process variables). A plugin returning null for a mapped key is skipped with a warning instead of failing the process.
  • Reopen a saved link and hop between steps — dropdowns show their selections immediately, without clicking. Also spot-check other v-select / value-path-selector screens (e.g. BB mappings step) for regressions.

External plugins in building blocks

  • In a building block's process, the plugin picker lists external plugin definitions; linking an action saves a BUILDING_BLOCK reference (no configuration id).
  • On the call activity's Configure plugins step, the external row offers activated configurations — exact pluginId@version matches by default, other versions behind a warning. Run the case → the action executes via the mapped configuration.
  • Deleting a configuration referenced only by a BB link is still allowed.

Import/export parity

  • Export a case definition with an external plugin link + EXTERNAL_PLUGIN case tab, re-import: the PLUGINS step shows external rows with a configuration chooser (version-mismatch warning). After import the links point at the chosen configuration and the case tab still works.
  • Import without mapping → issue banner on the case's General tab → repair via the missing-plugin-configurations panel.
  • Same wizard flow works for a task-form link.

Fixes worth spot-checking

  • Edit an embedded plugin link right after editing an external one — "No configuration component available" should no longer appear.
  • Back from the Output-mapping step returns to the action config step (not plugin selection).

@mbritense
mbritense requested review from a team as code owners July 21, 2026 11:39
@mbritense
mbritense changed the base branch from next-minor to feature/external-plugin-system July 21, 2026 11:39
@coderabbitai

coderabbitai Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Too many files!

This PR contains 159 files, which is 59 over the limit of 100.

To get a review, narrow the scope:
• coderabbit review --committed # exclude uncommitted changes
• coderabbit review --dir # limit to a subdirectory
• coderabbit review --base # compare against a closer base

Upgrade to a paid plan to raise the limit.

This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 49abb6b2-15bc-4c7b-b9e6-beb10b9c7142

📥 Commits

Reviewing files that changed from the base of the PR and between f196d22 and 564d8f6.

⛔ Files ignored due to path filters (2)
  • plugin-host/app/package-lock.json is excluded by !**/package-lock.json
  • plugin-host/sample-plugins/case-summary/package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (159)
  • backend/apps/dev/src/main/resources/config/case/energy-subsidy-request/1-0-0/building-block-link/building-block-test.case-building-block-links.json
  • backend/apps/dev/src/main/resources/config/case/energy-subsidy-request/1-0-0/process-link/energy-subsidy-request.process-link.json
  • backend/building-block/src/main/kotlin/com/ritense/buildingblock/configuration/BuildingBlockAutoConfiguration.kt
  • backend/building-block/src/main/kotlin/com/ritense/buildingblock/processlink/domain/BuildingBlockProcessLink.kt
  • backend/building-block/src/main/kotlin/com/ritense/buildingblock/processlink/service/DefaultBuildingBlockPluginConfigurationResolver.kt
  • backend/building-block/src/main/kotlin/com/ritense/buildingblock/processlink/service/DefaultBuildingBlockPluginMappingUsageFinder.kt
  • backend/building-block/src/main/kotlin/com/ritense/buildingblock/repository/BuildingBlockProcessLinkRepository.kt
  • backend/building-block/src/main/kotlin/com/ritense/buildingblock/service/BuildingBlockPluginDefinitionService.kt
  • backend/building-block/src/test/kotlin/com/ritense/buildingblock/processlink/domain/BuildingBlockProcessLinkPersistenceIT.kt
  • backend/building-block/src/test/kotlin/com/ritense/buildingblock/processlink/service/DefaultBuildingBlockPluginConfigurationResolverIT.kt
  • backend/building-block/src/test/kotlin/com/ritense/buildingblock/processlink/service/DefaultBuildingBlockPluginMappingUsageFinderTest.kt
  • backend/building-block/src/test/kotlin/com/ritense/buildingblock/service/BuildingBlockPluginDefinitionServiceTest.kt
  • backend/case/src/main/kotlin/com/ritense/case/configuration/CaseAutoConfiguration.kt
  • backend/case/src/main/kotlin/com/ritense/case/deployment/CaseTabDto.kt
  • backend/case/src/main/kotlin/com/ritense/case/service/CaseDefinitionCheckerImpl.kt
  • backend/case/src/main/kotlin/com/ritense/case/service/CaseDefinitionImportPreviewService.kt
  • backend/case/src/main/kotlin/com/ritense/case/service/CaseTabExporter.kt
  • backend/case/src/main/kotlin/com/ritense/case/service/CaseTabImporter.kt
  • backend/case/src/main/kotlin/com/ritense/case/web/rest/CaseDefinitionResource.kt
  • backend/case/src/main/kotlin/com/ritense/case/web/rest/dto/PluginConfigurationPreviewDto.kt
  • backend/case/src/main/kotlin/com/ritense/case_/domain/tab/CaseExternalPluginTab.kt
  • backend/case/src/main/kotlin/com/ritense/case_/service/CaseExternalPluginTabService.kt
  • backend/case/src/main/kotlin/com/ritense/case_/service/ExternalPluginCaseTabResolver.kt
  • backend/case/src/main/kotlin/com/ritense/case_/service/event/CaseTabCreatedEvent.kt
  • backend/case/src/test/kotlin/com/ritense/case/service/CaseTabImporterTest.kt
  • backend/case/src/test/kotlin/com/ritense/case/web/rest/CaseDefinitionResourceTest.kt
  • backend/contract/src/main/kotlin/com/ritense/valtimo/contract/case_/CaseDefinitionChecker.kt
  • backend/contract/src/main/kotlin/com/ritense/valtimo/contract/importer/ImportPreviewContribution.kt
  • backend/contract/src/main/kotlin/com/ritense/valtimo/contract/plugin/PluginConfigurationMappingResolver.kt
  • backend/core/src/main/resources/config/liquibase/13-32-0/13-32-0-master.xml
  • backend/core/src/main/resources/config/liquibase/13-32-0/20260716-external-plugin-granted-capability.xml
  • backend/core/src/main/resources/config/liquibase/13-32-0/20260720-plugin-action-result-mappings.xml
  • backend/core/src/main/resources/config/liquibase/13-32-0/20260720-plugin-configuration-reference-external-plugin-version.xml
  • backend/core/src/main/resources/config/liquibase/13-32-0/20260728-add-case-external-plugin-tab-plugin-definition.xml
  • backend/docker-resources/docker-compose-base-test-mysql.yml
  • backend/docker-resources/docker-compose-base-test-postgresql.yml
  • backend/external-plugin/build.gradle
  • backend/external-plugin/docker-compose-override-mysql.yml
  • backend/external-plugin/docker-compose-override-postgresql.yml
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/autoconfigure/ExternalPluginAutoConfiguration.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/domain/ExternalPluginProcessLink.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/domain/ExternalPluginTaskFormProcessLink.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/preview/ExternalPluginImportPreviewContributor.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/processlink/ExternalPluginProcessLinkMapper.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/processlink/ExternalPluginServiceTaskStartListener.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/processlink/ExternalPluginTaskFormProcessLinkMapper.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/processlink/ExternalPluginTaskFormSubmissionService.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/processlink/web/dto/ExternalPluginProcessLinkCreateRequestDto.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/processlink/web/dto/ExternalPluginProcessLinkDeployDto.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/processlink/web/dto/ExternalPluginProcessLinkExportResponseDto.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/processlink/web/dto/ExternalPluginProcessLinkResponseDto.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/processlink/web/dto/ExternalPluginProcessLinkUpdateRequestDto.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/processlink/web/dto/ExternalPluginTaskFormProcessLinkExportResponseDto.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/processlink/web/dto/ExternalPluginTaskFormProcessLinkResponseDto.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/repository/ExternalPluginProcessLinkRepository.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/repository/ExternalPluginTaskFormProcessLinkRepository.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/service/ExternalPluginCaseTabResolverImpl.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/service/ExternalPluginConfigurationMappingResolver.kt
  • backend/external-plugin/src/main/kotlin/com/ritense/externalplugin/service/ExternalPluginHostUsageResolver.kt
  • backend/external-plugin/src/test/kotlin/com/ritense/externalplugin/BaseIntegrationTest.kt
  • backend/external-plugin/src/test/kotlin/com/ritense/externalplugin/TestApplication.kt
  • backend/external-plugin/src/test/kotlin/com/ritense/externalplugin/autoconfigure/DualPluginConfigurationMappingResolverIntTest.kt
  • backend/external-plugin/src/test/kotlin/com/ritense/externalplugin/autoconfigure/ExternalPluginAutoConfigurationWiringTest.kt
  • backend/external-plugin/src/test/kotlin/com/ritense/externalplugin/preview/ExternalPluginImportPreviewContributorTest.kt
  • backend/external-plugin/src/test/kotlin/com/ritense/externalplugin/processlink/ExternalPluginProcessLinkExportImportRoundTripTest.kt
  • backend/external-plugin/src/test/kotlin/com/ritense/externalplugin/processlink/ExternalPluginProcessLinkImportIntTest.kt
  • backend/external-plugin/src/test/kotlin/com/ritense/externalplugin/processlink/ExternalPluginProcessLinkMapperTest.kt
  • backend/external-plugin/src/test/kotlin/com/ritense/externalplugin/processlink/ExternalPluginProcessLinkTypeDeductionTest.kt
  • backend/external-plugin/src/test/kotlin/com/ritense/externalplugin/processlink/ExternalPluginServiceTaskStartListenerTest.kt
  • backend/external-plugin/src/test/kotlin/com/ritense/externalplugin/processlink/ExternalPluginTaskFormProcessLinkActivityHandlerTest.kt
  • backend/external-plugin/src/test/kotlin/com/ritense/externalplugin/processlink/ExternalPluginTaskFormProcessLinkMapperTest.kt
  • backend/external-plugin/src/test/kotlin/com/ritense/externalplugin/processlink/ExternalPluginTaskFormSubmissionServiceTest.kt
  • backend/external-plugin/src/test/kotlin/com/ritense/externalplugin/service/ExternalPluginCaseTabResolverImplTest.kt
  • backend/external-plugin/src/test/kotlin/com/ritense/externalplugin/service/ExternalPluginConfigurationMappingResolverTest.kt
  • backend/external-plugin/src/test/kotlin/com/ritense/externalplugin/service/ExternalPluginHostUsageResolverTest.kt
  • backend/external-plugin/src/test/resources/config/application-mysql.yml
  • backend/external-plugin/src/test/resources/config/application-postgresql.yml
  • backend/external-plugin/src/test/resources/config/application.yml
  • backend/external-plugin/src/test/resources/config/case/autodeploy/1-0-0/bpmn/external-plugin-import-process.bpmn
  • backend/external-plugin/src/test/resources/config/case/autodeploy/1-0-0/case/definition/autodeploy.case-definition.json
  • backend/plugin-valtimo/build.gradle
  • backend/plugin-valtimo/src/main/kotlin/com/ritense/valtimo/processlink/ProcessLinkAutoConfiguration.kt
  • backend/plugin-valtimo/src/main/kotlin/com/ritense/valtimo/processlink/listener/ProcessLinkChangedEventListener.kt
  • backend/plugin-valtimo/src/main/kotlin/com/ritense/valtimo/processlink/mapper/PluginProcessLinkDeployDto.kt
  • backend/plugin-valtimo/src/main/kotlin/com/ritense/valtimo/processlink/mapper/PluginProcessLinkExportResponseDto.kt
  • backend/plugin-valtimo/src/main/kotlin/com/ritense/valtimo/processlink/mapper/PluginProcessLinkMapper.kt
  • backend/plugin-valtimo/src/main/kotlin/com/ritense/valtimo/processlink/repository/ValtimoPluginProcessLinkRepository.kt
  • backend/plugin-valtimo/src/test/kotlin/com/ritense/valtimo/processlink/ProcessLinkAutoConfigurationWiringTest.kt
  • backend/plugin-valtimo/src/test/kotlin/com/ritense/valtimo/processlink/listener/ProcessLinkChangedEventListenerTest.kt
  • backend/plugin-valtimo/src/test/kotlin/com/ritense/valtimo/processlink/mapper/PluginProcessLinkMapperTest.kt
  • backend/plugin/src/main/kotlin/com/ritense/plugin/configuration/PluginAutoConfiguration.kt
  • backend/plugin/src/main/kotlin/com/ritense/plugin/domain/PluginActionResultMapping.kt
  • backend/plugin/src/main/kotlin/com/ritense/plugin/domain/PluginConfigurationReference.kt
  • backend/plugin/src/main/kotlin/com/ritense/plugin/domain/PluginProcessLink.kt
  • backend/plugin/src/main/kotlin/com/ritense/plugin/service/BuildingBlockPluginConfigurationResolver.kt
  • backend/plugin/src/main/kotlin/com/ritense/plugin/service/BuildingBlockPluginMappingUsageFinder.kt
  • backend/plugin/src/main/kotlin/com/ritense/plugin/service/PluginActionResultHandler.kt
  • backend/plugin/src/main/kotlin/com/ritense/plugin/service/PluginActionResultMappingValidator.kt
  • backend/plugin/src/main/kotlin/com/ritense/plugin/service/PluginService.kt
  • backend/plugin/src/main/kotlin/com/ritense/plugin/web/rest/dto/PluginUsageDto.kt
  • backend/plugin/src/main/kotlin/com/ritense/plugin/web/rest/request/PluginProcessLinkCreateDto.kt
  • backend/plugin/src/main/kotlin/com/ritense/plugin/web/rest/request/PluginProcessLinkUpdateDto.kt
  • backend/plugin/src/main/kotlin/com/ritense/plugin/web/rest/result/PluginDefinitionsWithDependenciesDto.kt
  • backend/plugin/src/main/kotlin/com/ritense/plugin/web/rest/result/PluginProcessLinkResultDto.kt
  • backend/plugin/src/test/kotlin/com/ritense/plugin/domain/PluginConfigurationReferenceStiSpikeTest.kt
  • backend/plugin/src/test/kotlin/com/ritense/plugin/domain/PluginConfigurationReferenceTest.kt
  • backend/plugin/src/test/kotlin/com/ritense/plugin/domain/StiSpikeExternalPluginProcessLink.kt
  • backend/plugin/src/test/kotlin/com/ritense/plugin/service/PluginActionResultHandlerTest.kt
  • backend/plugin/src/test/kotlin/com/ritense/plugin/service/PluginServiceTest.kt
  • backend/process-link/src/main/kotlin/com/ritense/processlink/importer/ProcessLinkImporter.kt
  • backend/process-link/src/main/kotlin/com/ritense/processlink/mapper/ProcessLinkMapper.kt
  • backend/process-link/src/test/kotlin/com/ritense/processlink/importer/ProcessLinkImporterTest.kt
  • backend/process-link/src/test/kotlin/com/ritense/processlink/mapper/RemapConfigurationIdFieldTest.kt
  • frontend/projects/valtimo/case-management/src/lib/components/case-management-detail/case-management-detail.component.ts
  • frontend/projects/valtimo/case-management/src/lib/components/case-management-detail/tabs/case-management-general/components/case-management-missing-plugin-configurations/case-management-missing-plugin-configurations.component.html
  • frontend/projects/valtimo/case-management/src/lib/components/case-management-detail/tabs/case-management-general/components/case-management-missing-plugin-configurations/case-management-missing-plugin-configurations.component.scss
  • frontend/projects/valtimo/case-management/src/lib/components/case-management-detail/tabs/case-management-general/components/case-management-missing-plugin-configurations/case-management-missing-plugin-configurations.component.ts
  • frontend/projects/valtimo/case-management/src/lib/components/case-management-upload/case-management-upload.component.html
  • frontend/projects/valtimo/case-management/src/lib/components/case-management-upload/case-management-upload.component.scss
  • frontend/projects/valtimo/case-management/src/lib/components/case-management-upload/case-management-upload.component.ts
  • frontend/projects/valtimo/case-management/src/lib/models/case-deployment.model.ts
  • frontend/projects/valtimo/components/src/lib/components/select/select.component.ts
  • frontend/projects/valtimo/components/src/lib/components/value-path-selector/value-path-selector.component.ts
  • frontend/projects/valtimo/plugin-management/src/lib/components/plugin-usage-modal/plugin-usage-modal.component.html
  • frontend/projects/valtimo/plugin-management/src/lib/components/plugin-usage-modal/plugin-usage-modal.component.ts
  • frontend/projects/valtimo/plugin/src/lib/models/external-plugin.model.ts
  • frontend/projects/valtimo/plugin/src/lib/models/plugin.ts
  • frontend/projects/valtimo/process-link/src/lib/components/configure-building-block-plugins/configure-building-block-plugins.component.html
  • frontend/projects/valtimo/process-link/src/lib/components/configure-building-block-plugins/configure-building-block-plugins.component.scss
  • frontend/projects/valtimo/process-link/src/lib/components/configure-building-block-plugins/configure-building-block-plugins.component.ts
  • frontend/projects/valtimo/process-link/src/lib/components/plugin-action-configuration/plugin-action-configuration.component.html
  • frontend/projects/valtimo/process-link/src/lib/components/plugin-action-configuration/plugin-action-configuration.component.ts
  • frontend/projects/valtimo/process-link/src/lib/components/plugin-action-result-mappings/plugin-action-result-mappings.component.html
  • frontend/projects/valtimo/process-link/src/lib/components/plugin-action-result-mappings/plugin-action-result-mappings.component.scss
  • frontend/projects/valtimo/process-link/src/lib/components/plugin-action-result-mappings/plugin-action-result-mappings.component.ts
  • frontend/projects/valtimo/process-link/src/lib/components/process-link-modal/process-link-modal.component.html
  • frontend/projects/valtimo/process-link/src/lib/components/select-plugin-action/select-plugin-action.component.ts
  • frontend/projects/valtimo/process-link/src/lib/components/select-plugin-configuration/select-plugin-configuration.component.ts
  • frontend/projects/valtimo/process-link/src/lib/constants/process-link.test-ids.ts
  • frontend/projects/valtimo/process-link/src/lib/models/building-block-field.model.ts
  • frontend/projects/valtimo/process-link/src/lib/models/plugin.model.ts
  • frontend/projects/valtimo/process-link/src/lib/models/process-link.model.ts
  • frontend/projects/valtimo/process-link/src/lib/process-link.module.ts
  • frontend/projects/valtimo/process-link/src/lib/services/building-block-state.service.ts
  • frontend/projects/valtimo/process-link/src/lib/services/plugin-state.service.ts
  • frontend/projects/valtimo/process-link/src/lib/services/process-link-step.service.ts
  • frontend/projects/valtimo/shared/assets/core/en.json
  • frontend/projects/valtimo/shared/assets/core/nl.json
  • plugin-host/app/src/plugin-manager.ts
  • plugin-host/app/src/routes/plugin-actions.test.ts
  • plugin-host/app/src/routes/plugin-actions.ts
  • plugin-host/plugin-sdk/src/manifest-validation.ts
  • plugin-host/plugin-sdk/src/models/types.ts
  • plugin-host/plugin-sdk/src/runtime.test.ts
  • plugin-host/plugin-sdk/src/runtime.ts
  • plugin-host/sample-plugins/case-summary/README.md
  • plugin-host/sample-plugins/case-summary/manifest.json
  • plugin-host/sample-plugins/case-summary/src/plugin.ts
  • plugin-host/scratch/external-plugin-system-plan.md

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch story/771-plugin-value-resolvers

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@ivo-ritense

ivo-ritense commented Jul 23, 2026

Copy link
Copy Markdown
Collaborator

There seems to be no runtime validation or binding of the returned values. I ran the test plugin and tried to bind the title to a case property. the title was missing from the plugin invocation result.

So there a question here: Do we always need to return all result fields as described in the manifest, or are they optional?

And a bug: The title is in this case actually returned (though might be null) in the result, but not received on the valtimo side. I think returning a null value can be valid and should not be confused for "no value returned".

@ivo-ritense

Copy link
Copy Markdown
Collaborator

Please check the external plugin module integration tests.

@ivo-ritense

Copy link
Copy Markdown
Collaborator

When exporting and importing a case using an external plugin it will sometimes ask to match the plugin configuration, but sometimes it's missing.

I configured a case, exported it. Now when importing using a new name i always get to choose the plugin, see bottom row

image

bezwaar_1.0.1_2026-07-23_11-25.case.zip

Then i exported that config and imported that again using a new name and i don't get to choose it.

image

bezwaar-2_1.0.1_2026-07-23_12-57.case.zip

@ivo-ritense

ivo-ritense commented Jul 23, 2026

Copy link
Copy Markdown
Collaborator

I get this while configuring a process link in a building block in the breadbrumbs

image

@ivo-ritense

ivo-ritense commented Jul 23, 2026

Copy link
Copy Markdown
Collaborator

When configuring a building block that uses a different version of plugin than the configuration you choose you get a warning (good) that is not correctly including a variable (bad) and the color is a bit hard to read on a white background (could be improved)

image

@ivo-ritense

Copy link
Copy Markdown
Collaborator

"Deleting a configuration referenced only by a BB link is still allowed." Should this be allowed? The configuration is used regardless.

@mbritense
mbritense requested a review from ivo-ritense July 27, 2026 07:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants