This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new 53112be421e5 CAMEL-24514: camel-console - Use GET instead of POST for 
read-only dev consoles in OpenAPI spec (#25883)
53112be421e5 is described below

commit 53112be421e5f09140f53f468f14209cd0603130
Author: Claus Ibsen <[email protected]>
AuthorDate: Sat Aug 29 13:41:58 2026 +0200

    CAMEL-24514: camel-console - Use GET instead of POST for read-only dev 
consoles in OpenAPI spec (#25883)
    
    * CAMEL-24514: camel-console - Generate GET instead of POST for read-only 
dev consoles in OpenAPI spec
    
    ApiDevConsole previously advertised every dev console as a POST operation, 
even
    though /q/dev was originally GET-only and most consoles are safe, read-only
    introspection endpoints. Add a DevConsole.isReadOnly() SPI method (default 
true)
    so each console declares whether it mutates runtime state; ApiDevConsole now
    generates a GET operation with query parameters for read-only consoles, and
    keeps POST with a JSON requestBody only for the consoles that need an 
arbitrary
    body (eval-language, send, sql-query) or that mutate state (route, 
route-group,
    processor, trace, jfr-memory-leak, receive, debug, heap-dump, reload, and
    camel-jfr's jfr console).
    
    Co-Authored-By: Claude Sonnet 5 <[email protected]>
    Signed-off-by: Claus Ibsen <[email protected]>
    
    * CAMEL-24514: camel-console - Surface readOnly flag in DevConsole catalog 
metadata
    
    Move the read-only/mutating classification from a per-class isReadOnly()
    override onto a new @DevConsole(readOnly=...) annotation attribute, so it is
    available both at runtime (AbstractDevConsole reads it reflectively) and at
    build time. GenerateDevConsoleMojo now emits "readOnly" into each console's
    generated dev-console/*.json, so the static catalog metadata already carries
    the safe/mutating classification ahead of a future release-time static
    OpenAPI doc generator, without needing a running CamelContext.
    
    Regenerated the dev-console JSON for every module with a @DevConsole class
    (core, camel-jfr, and ~24 component/dsl/catalog modules) to pick up the new
    field; no Java behavior changes outside camel-console and camel-jfr.
    
    Co-Authored-By: Claude Sonnet 5 <[email protected]>
    Signed-off-by: Claus Ibsen <[email protected]>
    
    ---------
    
    Signed-off-by: Claus Ibsen <[email protected]>
    Co-authored-by: Claude Sonnet 5 <[email protected]>
---
 .../org/apache/camel/dev-console/catalog.json      |   1 +
 .../org/apache/camel/dev-console/aws-secrets.json  |   1 +
 .../org/apache/camel/dev-console/aws2-s3.json      |   1 +
 .../apache/camel/dev-console/azure-secrets.json    |   1 +
 .../apache/camel/dev-console/route-diagram.json    |   1 +
 .../org/apache/camel/dev-console/sftp.json         |   1 +
 .../org/apache/camel/dev-console/gcp-secrets.json  |   1 +
 .../org/apache/camel/dev-console/groovy.json       |   1 +
 .../camel/dev-console/hashicorp-secrets.json       |   1 +
 .../org/apache/camel/dev-console/ibm-secrets.json  |   1 +
 .../META-INF/org/apache/camel/dev-console/jfr.json |   1 +
 .../camel/runtime/jfr/CamelJfrDevConsole.java      |   2 +-
 .../camel/runtime/jfr/CamelJfrDevConsoleTest.java  |   6 +
 .../org/apache/camel/dev-console/kafka.json        |   1 +
 .../camel/dev-console/kubernetes-configmaps.json   |   1 +
 .../camel/dev-console/kubernetes-secrets.json      |   1 +
 .../org/apache/camel/dev-console/micrometer.json   |   1 +
 .../apache/camel/dev-console/fault-tolerance.json  |   1 +
 .../apache/camel/dev-console/opentelemetry.json    |   1 +
 .../apache/camel/dev-console/main-http-server.json |   1 +
 .../apache/camel/dev-console/platform-http.json    |   1 +
 .../org/apache/camel/dev-console/quartz.json       |   1 +
 .../org/apache/camel/dev-console/resilience4j.json |   1 +
 .../org/apache/camel/dev-console/stub.json         |   1 +
 .../apache/camel/dev-console/vertx-websocket.json  |   1 +
 .../apache/camel/spi/annotations/DevConsole.java   |   8 +
 .../java/org/apache/camel/console/DevConsole.java  |  13 ++
 .../org/apache/camel/dev-console/activity.json     |   1 +
 .../META-INF/org/apache/camel/dev-console/api.json |   1 +
 .../org/apache/camel/dev-console/bean.json         |   1 +
 .../org/apache/camel/dev-console/blocked.json      |   1 +
 .../org/apache/camel/dev-console/browse.json       |   1 +
 .../apache/camel/dev-console/circuit-breaker.json  |   1 +
 .../org/apache/camel/dev-console/consumer.json     |   1 +
 .../org/apache/camel/dev-console/context.json      |   1 +
 .../org/apache/camel/dev-console/datasource.json   |   1 +
 .../org/apache/camel/dev-console/debug.json        |   1 +
 .../org/apache/camel/dev-console/endpoint.json     |   1 +
 .../org/apache/camel/dev-console/errors.json       |   1 +
 .../apache/camel/dev-console/eval-language.json    |   1 +
 .../org/apache/camel/dev-console/event.json        |   1 +
 .../META-INF/org/apache/camel/dev-console/gc.json  |   1 +
 .../org/apache/camel/dev-console/health.json       |   1 +
 .../org/apache/camel/dev-console/heap-dump.json    |   1 +
 .../apache/camel/dev-console/heap-histogram.json   |   1 +
 .../org/apache/camel/dev-console/inflight.json     |   1 +
 .../apache/camel/dev-console/internal-tasks.json   |   1 +
 .../apache/camel/dev-console/java-security.json    |   1 +
 .../apache/camel/dev-console/jfr-memory-leak.json  |   1 +
 .../META-INF/org/apache/camel/dev-console/jvm.json |   1 +
 .../META-INF/org/apache/camel/dev-console/log.json |   1 +
 .../org/apache/camel/dev-console/memory.json       |   1 +
 .../apache/camel/dev-console/message-history.json  |   1 +
 .../apache/camel/dev-console/processor-detail.json |   1 +
 .../org/apache/camel/dev-console/processor.json    |   1 +
 .../org/apache/camel/dev-console/producer.json     |   1 +
 .../org/apache/camel/dev-console/properties.json   |   1 +
 .../org/apache/camel/dev-console/receive.json      |   1 +
 .../org/apache/camel/dev-console/reload.json       |   1 +
 .../org/apache/camel/dev-console/rest-spec.json    |   1 +
 .../org/apache/camel/dev-console/rest.json         |   1 +
 .../apache/camel/dev-console/route-controller.json |   1 +
 .../org/apache/camel/dev-console/route-dump.json   |   1 +
 .../org/apache/camel/dev-console/route-group.json  |   1 +
 .../apache/camel/dev-console/route-structure.json  |   1 +
 .../apache/camel/dev-console/route-topology.json   |   1 +
 .../org/apache/camel/dev-console/route.json        |   1 +
 .../org/apache/camel/dev-console/send.json         |   1 +
 .../org/apache/camel/dev-console/service.json      |   1 +
 .../apache/camel/dev-console/simple-language.json  |   1 +
 .../org/apache/camel/dev-console/source.json       |   1 +
 .../org/apache/camel/dev-console/sql-query.json    |   1 +
 .../org/apache/camel/dev-console/sql-trace.json    |   1 +
 .../apache/camel/dev-console/startup-recorder.json |   1 +
 .../camel/dev-console/system-properties.json       |   1 +
 .../org/apache/camel/dev-console/thread.json       |   1 +
 .../META-INF/org/apache/camel/dev-console/top.json |   1 +
 .../org/apache/camel/dev-console/trace.json        |   1 +
 .../org/apache/camel/dev-console/transformers.json |   1 +
 .../apache/camel/dev-console/type-converters.json  |   1 +
 .../org/apache/camel/dev-console/variables.json    |   1 +
 .../apache/camel/impl/console/ApiDevConsole.java   | 172 ++++++++++++++-------
 .../apache/camel/impl/console/DebugDevConsole.java |   2 +-
 .../camel/impl/console/EvalLanguageDevConsole.java |   3 +-
 .../camel/impl/console/HeapDumpDevConsole.java     |   2 +-
 .../impl/console/JfrMemoryLeakDevConsole.java      |   2 +-
 .../camel/impl/console/ProcessorDevConsole.java    |   2 +-
 .../camel/impl/console/ReceiveDevConsole.java      |   3 +-
 .../camel/impl/console/ReloadDevConsole.java       |   2 +-
 .../apache/camel/impl/console/RouteDevConsole.java |   2 +-
 .../camel/impl/console/RouteGroupDevConsole.java   |   2 +-
 .../apache/camel/impl/console/SendDevConsole.java  |   2 +-
 .../camel/impl/console/SqlQueryDevConsole.java     |   3 +-
 .../apache/camel/impl/console/TraceDevConsole.java |   2 +-
 .../camel/impl/console/ApiDevConsoleTest.java      |  69 +++++++++
 .../org/apache/camel/dev-console/bean-model.json   |   1 +
 .../camel/dev-console/main-configuration.json      |   1 +
 .../camel/support/console/AbstractDevConsole.java  |   7 +
 .../org/apache/camel/dev-console/jbang.json        |   1 +
 .../org/apache/camel/dev-console/source-dir.json   |   1 +
 .../camel/dev-console/dependency-downloader.json   |   1 +
 .../maven/packaging/GenerateDevConsoleMojo.java    |  11 ++
 .../apache/camel/spi/annotations/DevConsole.java   |   8 +
 103 files changed, 338 insertions(+), 67 deletions(-)

diff --git 
a/catalog/camel-catalog-console/src/generated/resources/META-INF/org/apache/camel/dev-console/catalog.json
 
b/catalog/camel-catalog-console/src/generated/resources/META-INF/org/apache/camel/dev-console/catalog.json
index e3831053d358..cf9b99383714 100644
--- 
a/catalog/camel-catalog-console/src/generated/resources/META-INF/org/apache/camel/dev-console/catalog.json
+++ 
b/catalog/camel-catalog-console/src/generated/resources/META-INF/org/apache/camel/dev-console/catalog.json
@@ -6,6 +6,7 @@
     "title": "Catalog",
     "description": "Information about used Camel artifacts",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.catalog.console.CatalogConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-catalog-console",
diff --git 
a/components/camel-aws/camel-aws-secrets-manager/src/generated/resources/META-INF/org/apache/camel/dev-console/aws-secrets.json
 
b/components/camel-aws/camel-aws-secrets-manager/src/generated/resources/META-INF/org/apache/camel/dev-console/aws-secrets.json
index b97e902cc923..d0f70871f2a5 100644
--- 
a/components/camel-aws/camel-aws-secrets-manager/src/generated/resources/META-INF/org/apache/camel/dev-console/aws-secrets.json
+++ 
b/components/camel-aws/camel-aws-secrets-manager/src/generated/resources/META-INF/org/apache/camel/dev-console/aws-secrets.json
@@ -6,6 +6,7 @@
     "title": "AWS Secrets",
     "description": "AWS Secrets Manager",
     "deprecated": false,
+    "readOnly": true,
     "javaType": 
"org.apache.camel.component.aws.secretsmanager.SecretsDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-aws-secrets-manager",
diff --git 
a/components/camel-aws/camel-aws2-s3/src/generated/resources/META-INF/org/apache/camel/dev-console/aws2-s3.json
 
b/components/camel-aws/camel-aws2-s3/src/generated/resources/META-INF/org/apache/camel/dev-console/aws2-s3.json
index e9be83caf8a8..ce0e95b664b0 100644
--- 
a/components/camel-aws/camel-aws2-s3/src/generated/resources/META-INF/org/apache/camel/dev-console/aws2-s3.json
+++ 
b/components/camel-aws/camel-aws2-s3/src/generated/resources/META-INF/org/apache/camel/dev-console/aws2-s3.json
@@ -6,6 +6,7 @@
     "title": "AWS S3",
     "description": "AWS S3 Consumer",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.component.aws2.s3.AWS2S3Console",
     "groupId": "org.apache.camel",
     "artifactId": "camel-aws2-s3",
diff --git 
a/components/camel-azure/camel-azure-key-vault/src/generated/resources/META-INF/org/apache/camel/dev-console/azure-secrets.json
 
b/components/camel-azure/camel-azure-key-vault/src/generated/resources/META-INF/org/apache/camel/dev-console/azure-secrets.json
index 628682ac5f97..a5054e19e5c4 100644
--- 
a/components/camel-azure/camel-azure-key-vault/src/generated/resources/META-INF/org/apache/camel/dev-console/azure-secrets.json
+++ 
b/components/camel-azure/camel-azure-key-vault/src/generated/resources/META-INF/org/apache/camel/dev-console/azure-secrets.json
@@ -6,6 +6,7 @@
     "title": "Azure Key Vault Secrets",
     "description": "Azure Key Vault Secret Manager",
     "deprecated": false,
+    "readOnly": true,
     "javaType": 
"org.apache.camel.component.azure.key.vault.AzureKeyVaultManagerDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-azure-key-vault",
diff --git 
a/components/camel-diagram/src/generated/resources/META-INF/org/apache/camel/dev-console/route-diagram.json
 
b/components/camel-diagram/src/generated/resources/META-INF/org/apache/camel/dev-console/route-diagram.json
index 8b826a92455e..ead0c381c918 100644
--- 
a/components/camel-diagram/src/generated/resources/META-INF/org/apache/camel/dev-console/route-diagram.json
+++ 
b/components/camel-diagram/src/generated/resources/META-INF/org/apache/camel/dev-console/route-diagram.json
@@ -6,6 +6,7 @@
     "title": "Route Diagram",
     "description": "Visual route diagrams",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.diagram.DiagramDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-diagram",
diff --git 
a/components/camel-ftp/src/generated/resources/META-INF/org/apache/camel/dev-console/sftp.json
 
b/components/camel-ftp/src/generated/resources/META-INF/org/apache/camel/dev-console/sftp.json
index cba9575de6f1..655a877681b5 100644
--- 
a/components/camel-ftp/src/generated/resources/META-INF/org/apache/camel/dev-console/sftp.json
+++ 
b/components/camel-ftp/src/generated/resources/META-INF/org/apache/camel/dev-console/sftp.json
@@ -6,6 +6,7 @@
     "title": "SFTP",
     "description": "Secure FTP using JSCH",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.component.file.remote.SftpDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-ftp",
diff --git 
a/components/camel-google/camel-google-secret-manager/src/generated/resources/META-INF/org/apache/camel/dev-console/gcp-secrets.json
 
b/components/camel-google/camel-google-secret-manager/src/generated/resources/META-INF/org/apache/camel/dev-console/gcp-secrets.json
index 2db63f44d2db..6c705b200b9d 100644
--- 
a/components/camel-google/camel-google-secret-manager/src/generated/resources/META-INF/org/apache/camel/dev-console/gcp-secrets.json
+++ 
b/components/camel-google/camel-google-secret-manager/src/generated/resources/META-INF/org/apache/camel/dev-console/gcp-secrets.json
@@ -6,6 +6,7 @@
     "title": "GCP Secrets",
     "description": "GCP Secret Manager",
     "deprecated": false,
+    "readOnly": true,
     "javaType": 
"org.apache.camel.component.google.secret.manager.GoogleSecretManagerDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-google-secret-manager",
diff --git 
a/components/camel-groovy/src/generated/resources/META-INF/org/apache/camel/dev-console/groovy.json
 
b/components/camel-groovy/src/generated/resources/META-INF/org/apache/camel/dev-console/groovy.json
index 513ef16d49cc..078f567341ee 100644
--- 
a/components/camel-groovy/src/generated/resources/META-INF/org/apache/camel/dev-console/groovy.json
+++ 
b/components/camel-groovy/src/generated/resources/META-INF/org/apache/camel/dev-console/groovy.json
@@ -6,6 +6,7 @@
     "title": "Groovy",
     "description": "Groovy Language",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.language.groovy.GroovyDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-groovy",
diff --git 
a/components/camel-hashicorp-vault/src/generated/resources/META-INF/org/apache/camel/dev-console/hashicorp-secrets.json
 
b/components/camel-hashicorp-vault/src/generated/resources/META-INF/org/apache/camel/dev-console/hashicorp-secrets.json
index 47e2800607a0..bc159fc67b39 100644
--- 
a/components/camel-hashicorp-vault/src/generated/resources/META-INF/org/apache/camel/dev-console/hashicorp-secrets.json
+++ 
b/components/camel-hashicorp-vault/src/generated/resources/META-INF/org/apache/camel/dev-console/hashicorp-secrets.json
@@ -6,6 +6,7 @@
     "title": "HashiCorp Secrets",
     "description": "HashiCorp Vault Secrets",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.component.hashicorp.vault.SecretsDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-hashicorp-vault",
diff --git 
a/components/camel-ibm/camel-ibm-secrets-manager/src/generated/resources/META-INF/org/apache/camel/dev-console/ibm-secrets.json
 
b/components/camel-ibm/camel-ibm-secrets-manager/src/generated/resources/META-INF/org/apache/camel/dev-console/ibm-secrets.json
index 33a3d8558138..5235512e6bbf 100644
--- 
a/components/camel-ibm/camel-ibm-secrets-manager/src/generated/resources/META-INF/org/apache/camel/dev-console/ibm-secrets.json
+++ 
b/components/camel-ibm/camel-ibm-secrets-manager/src/generated/resources/META-INF/org/apache/camel/dev-console/ibm-secrets.json
@@ -6,6 +6,7 @@
     "title": "IBM Secrets",
     "description": "IBM Secrets Manager",
     "deprecated": false,
+    "readOnly": true,
     "javaType": 
"org.apache.camel.component.ibm.secrets.manager.SecretsDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-ibm-secrets-manager",
diff --git 
a/components/camel-jfr/src/generated/resources/META-INF/org/apache/camel/dev-console/jfr.json
 
b/components/camel-jfr/src/generated/resources/META-INF/org/apache/camel/dev-console/jfr.json
index 8fc43cff3864..fddf05f6a74b 100644
--- 
a/components/camel-jfr/src/generated/resources/META-INF/org/apache/camel/dev-console/jfr.json
+++ 
b/components/camel-jfr/src/generated/resources/META-INF/org/apache/camel/dev-console/jfr.json
@@ -6,6 +6,7 @@
     "title": "JFR Runtime Instrumentation",
     "description": "Status and live control of camel-jfr runtime 
instrumentation",
     "deprecated": false,
+    "readOnly": false,
     "javaType": "org.apache.camel.runtime.jfr.CamelJfrDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-jfr",
diff --git 
a/components/camel-jfr/src/main/java/org/apache/camel/runtime/jfr/CamelJfrDevConsole.java
 
b/components/camel-jfr/src/main/java/org/apache/camel/runtime/jfr/CamelJfrDevConsole.java
index 3aeff394ee6c..8dff129be7a7 100644
--- 
a/components/camel-jfr/src/main/java/org/apache/camel/runtime/jfr/CamelJfrDevConsole.java
+++ 
b/components/camel-jfr/src/main/java/org/apache/camel/runtime/jfr/CamelJfrDevConsole.java
@@ -49,7 +49,7 @@ import org.apache.camel.util.json.JsonObject;
  * @since 4.22
  */
 @DevConsole(name = "jfr", displayName = "JFR Runtime Instrumentation",
-            description = "Status and live control of camel-jfr runtime 
instrumentation")
+            description = "Status and live control of camel-jfr runtime 
instrumentation", readOnly = false)
 public class CamelJfrDevConsole extends AbstractDevConsole {
 
     @Metadata(label = "query", description = "Command to perform", javaType = 
"java.lang.String",
diff --git 
a/components/camel-jfr/src/test/java/org/apache/camel/runtime/jfr/CamelJfrDevConsoleTest.java
 
b/components/camel-jfr/src/test/java/org/apache/camel/runtime/jfr/CamelJfrDevConsoleTest.java
index cabb6dbe087e..ce49030870aa 100644
--- 
a/components/camel-jfr/src/test/java/org/apache/camel/runtime/jfr/CamelJfrDevConsoleTest.java
+++ 
b/components/camel-jfr/src/test/java/org/apache/camel/runtime/jfr/CamelJfrDevConsoleTest.java
@@ -62,6 +62,12 @@ class CamelJfrDevConsoleTest extends CamelTestSupport {
         return recording;
     }
 
+    @Test
+    void isNotReadOnly() {
+        // the console can enable/disable JFR events and trigger snapshots, so 
it must not be advertised as safe
+        assertThat(resolveConsole(context).isReadOnly()).isFalse();
+    }
+
     @Test
     void statusReportsNotRegisteredByDefault() {
         // camel-jfr is on the classpath, but its runtime instrumentation is 
opt-in, so merely having the
diff --git 
a/components/camel-kafka/src/generated/resources/META-INF/org/apache/camel/dev-console/kafka.json
 
b/components/camel-kafka/src/generated/resources/META-INF/org/apache/camel/dev-console/kafka.json
index d00ed37bbd02..a62ec0cceef8 100644
--- 
a/components/camel-kafka/src/generated/resources/META-INF/org/apache/camel/dev-console/kafka.json
+++ 
b/components/camel-kafka/src/generated/resources/META-INF/org/apache/camel/dev-console/kafka.json
@@ -6,6 +6,7 @@
     "title": "Kafka",
     "description": "Apache Kafka",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.component.kafka.KafkaDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-kafka",
diff --git 
a/components/camel-kubernetes/src/generated/resources/META-INF/org/apache/camel/dev-console/kubernetes-configmaps.json
 
b/components/camel-kubernetes/src/generated/resources/META-INF/org/apache/camel/dev-console/kubernetes-configmaps.json
index a6aad11d4626..56d3db2e6a1d 100644
--- 
a/components/camel-kubernetes/src/generated/resources/META-INF/org/apache/camel/dev-console/kubernetes-configmaps.json
+++ 
b/components/camel-kubernetes/src/generated/resources/META-INF/org/apache/camel/dev-console/kubernetes-configmaps.json
@@ -6,6 +6,7 @@
     "title": "Kubernetes Config Maps",
     "description": "Kubernetes Cluster Config Maps",
     "deprecated": false,
+    "readOnly": true,
     "javaType": 
"org.apache.camel.component.kubernetes.config_maps.vault.ConfigmapsDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-kubernetes",
diff --git 
a/components/camel-kubernetes/src/generated/resources/META-INF/org/apache/camel/dev-console/kubernetes-secrets.json
 
b/components/camel-kubernetes/src/generated/resources/META-INF/org/apache/camel/dev-console/kubernetes-secrets.json
index 6c054feee0c0..9bffab3a5997 100644
--- 
a/components/camel-kubernetes/src/generated/resources/META-INF/org/apache/camel/dev-console/kubernetes-secrets.json
+++ 
b/components/camel-kubernetes/src/generated/resources/META-INF/org/apache/camel/dev-console/kubernetes-secrets.json
@@ -6,6 +6,7 @@
     "title": "Kubernetes Secrets",
     "description": "Kubernetes Cluster Secrets",
     "deprecated": false,
+    "readOnly": true,
     "javaType": 
"org.apache.camel.component.kubernetes.secrets.vault.SecretsDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-kubernetes",
diff --git 
a/components/camel-micrometer/src/generated/resources/META-INF/org/apache/camel/dev-console/micrometer.json
 
b/components/camel-micrometer/src/generated/resources/META-INF/org/apache/camel/dev-console/micrometer.json
index cf7ccb455e6c..1b7f0790f5a9 100644
--- 
a/components/camel-micrometer/src/generated/resources/META-INF/org/apache/camel/dev-console/micrometer.json
+++ 
b/components/camel-micrometer/src/generated/resources/META-INF/org/apache/camel/dev-console/micrometer.json
@@ -6,6 +6,7 @@
     "title": "Micrometer",
     "description": "Display runtime metrics",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.component.micrometer.MicrometerConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-micrometer",
diff --git 
a/components/camel-microprofile/camel-microprofile-fault-tolerance/src/generated/resources/META-INF/org/apache/camel/dev-console/fault-tolerance.json
 
b/components/camel-microprofile/camel-microprofile-fault-tolerance/src/generated/resources/META-INF/org/apache/camel/dev-console/fault-tolerance.json
index a0f18c4e1045..86d20f11be29 100644
--- 
a/components/camel-microprofile/camel-microprofile-fault-tolerance/src/generated/resources/META-INF/org/apache/camel/dev-console/fault-tolerance.json
+++ 
b/components/camel-microprofile/camel-microprofile-fault-tolerance/src/generated/resources/META-INF/org/apache/camel/dev-console/fault-tolerance.json
@@ -6,6 +6,7 @@
     "title": "MicroProfile Circuit Breaker",
     "description": "Display circuit breaker information",
     "deprecated": false,
+    "readOnly": true,
     "javaType": 
"org.apache.camel.component.microprofile.faulttolerance.FaultToleranceConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-microprofile-fault-tolerance",
diff --git 
a/components/camel-opentelemetry2/src/generated/resources/META-INF/org/apache/camel/dev-console/opentelemetry.json
 
b/components/camel-opentelemetry2/src/generated/resources/META-INF/org/apache/camel/dev-console/opentelemetry.json
index 2ad91bca36e1..f1825f1e26a8 100644
--- 
a/components/camel-opentelemetry2/src/generated/resources/META-INF/org/apache/camel/dev-console/opentelemetry.json
+++ 
b/components/camel-opentelemetry2/src/generated/resources/META-INF/org/apache/camel/dev-console/opentelemetry.json
@@ -6,6 +6,7 @@
     "title": "OpenTelemetry Spans",
     "description": "OpenTelemetry span data captured in dev mode",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.opentelemetry2.OpenTelemetryDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-opentelemetry2",
diff --git 
a/components/camel-platform-http-main/src/generated/resources/META-INF/org/apache/camel/dev-console/main-http-server.json
 
b/components/camel-platform-http-main/src/generated/resources/META-INF/org/apache/camel/dev-console/main-http-server.json
index c472ad472389..2a601f4e1a6e 100644
--- 
a/components/camel-platform-http-main/src/generated/resources/META-INF/org/apache/camel/dev-console/main-http-server.json
+++ 
b/components/camel-platform-http-main/src/generated/resources/META-INF/org/apache/camel/dev-console/main-http-server.json
@@ -6,6 +6,7 @@
     "title": "Main HTTP Server",
     "description": "Camel Main HTTP Server",
     "deprecated": false,
+    "readOnly": true,
     "javaType": 
"org.apache.camel.component.platform.http.main.MainHttpServerDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-platform-http-main",
diff --git 
a/components/camel-platform-http/src/generated/resources/META-INF/org/apache/camel/dev-console/platform-http.json
 
b/components/camel-platform-http/src/generated/resources/META-INF/org/apache/camel/dev-console/platform-http.json
index d07aecc32730..373be8a7e29b 100644
--- 
a/components/camel-platform-http/src/generated/resources/META-INF/org/apache/camel/dev-console/platform-http.json
+++ 
b/components/camel-platform-http/src/generated/resources/META-INF/org/apache/camel/dev-console/platform-http.json
@@ -6,6 +6,7 @@
     "title": "Platform HTTP",
     "description": "Embedded HTTP Server",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.component.platform.http.PlatformHttpConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-platform-http",
diff --git 
a/components/camel-quartz/src/generated/resources/META-INF/org/apache/camel/dev-console/quartz.json
 
b/components/camel-quartz/src/generated/resources/META-INF/org/apache/camel/dev-console/quartz.json
index f97ae20916f6..d2d4c1561783 100644
--- 
a/components/camel-quartz/src/generated/resources/META-INF/org/apache/camel/dev-console/quartz.json
+++ 
b/components/camel-quartz/src/generated/resources/META-INF/org/apache/camel/dev-console/quartz.json
@@ -6,6 +6,7 @@
     "title": "Quartz",
     "description": "Quartz Scheduler",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.component.quartz.QuartzConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-quartz",
diff --git 
a/components/camel-resilience4j/src/generated/resources/META-INF/org/apache/camel/dev-console/resilience4j.json
 
b/components/camel-resilience4j/src/generated/resources/META-INF/org/apache/camel/dev-console/resilience4j.json
index 5ed2e3cccfb2..e0abe6cb770d 100644
--- 
a/components/camel-resilience4j/src/generated/resources/META-INF/org/apache/camel/dev-console/resilience4j.json
+++ 
b/components/camel-resilience4j/src/generated/resources/META-INF/org/apache/camel/dev-console/resilience4j.json
@@ -6,6 +6,7 @@
     "title": "Resilience Circuit Breaker",
     "description": "Display circuit breaker information",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.component.resilience4j.ResilienceConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-resilience4j",
diff --git 
a/components/camel-stub/src/generated/resources/META-INF/org/apache/camel/dev-console/stub.json
 
b/components/camel-stub/src/generated/resources/META-INF/org/apache/camel/dev-console/stub.json
index 549225c95dcd..82a20938adb1 100644
--- 
a/components/camel-stub/src/generated/resources/META-INF/org/apache/camel/dev-console/stub.json
+++ 
b/components/camel-stub/src/generated/resources/META-INF/org/apache/camel/dev-console/stub.json
@@ -6,6 +6,7 @@
     "title": "Stub",
     "description": "Browse messages on stub endpoints",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.component.stub.StubConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-stub",
diff --git 
a/components/camel-vertx/camel-vertx-websocket/src/generated/resources/META-INF/org/apache/camel/dev-console/vertx-websocket.json
 
b/components/camel-vertx/camel-vertx-websocket/src/generated/resources/META-INF/org/apache/camel/dev-console/vertx-websocket.json
index a204e5a42b15..aab4753de9d6 100644
--- 
a/components/camel-vertx/camel-vertx-websocket/src/generated/resources/META-INF/org/apache/camel/dev-console/vertx-websocket.json
+++ 
b/components/camel-vertx/camel-vertx-websocket/src/generated/resources/META-INF/org/apache/camel/dev-console/vertx-websocket.json
@@ -6,6 +6,7 @@
     "title": "Vert.x WebSocket",
     "description": "Vert.x WebSocket consumer details",
     "deprecated": false,
+    "readOnly": true,
     "javaType": 
"org.apache.camel.component.vertx.websocket.VertxWebsocketDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-vertx-websocket",
diff --git 
a/core/camel-api/src/generated/java/org/apache/camel/spi/annotations/DevConsole.java
 
b/core/camel-api/src/generated/java/org/apache/camel/spi/annotations/DevConsole.java
index 337360203da4..1f93908cac86 100644
--- 
a/core/camel-api/src/generated/java/org/apache/camel/spi/annotations/DevConsole.java
+++ 
b/core/camel-api/src/generated/java/org/apache/camel/spi/annotations/DevConsole.java
@@ -51,4 +51,12 @@ public @interface DevConsole {
      */
     String description();
 
+    /**
+     * Whether this console is read-only (safe, and does not change any 
runtime state).
+     * <p/>
+     * Consoles that mutate state (such as starting/stopping a route, sending 
a message, or triggering a heap dump) must
+     * set this to {@code false}.
+     */
+    boolean readOnly() default true;
+
 }
diff --git 
a/core/camel-api/src/main/java/org/apache/camel/console/DevConsole.java 
b/core/camel-api/src/main/java/org/apache/camel/console/DevConsole.java
index 087fd269a6b7..ccda24bac038 100644
--- a/core/camel-api/src/main/java/org/apache/camel/console/DevConsole.java
+++ b/core/camel-api/src/main/java/org/apache/camel/console/DevConsole.java
@@ -62,6 +62,19 @@ public interface DevConsole {
      */
     boolean supportMediaType(MediaType mediaType);
 
+    /**
+     * Whether this console is read-only (safe, and does not change any 
runtime state).
+     * <p/>
+     * Consoles that mutate state (such as starting/stopping a route, sending 
a message, or triggering a heap dump) must
+     * override this method to return {@code false}.
+     *
+     * @return true if read-only (the default), false if invoking this console 
changes runtime state.
+     * @since  4.23
+     */
+    default boolean isReadOnly() {
+        return true;
+    }
+
     /**
      * Invokes and gets the output from this console.
      */
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/activity.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/activity.json
index fd0b049476fd..7139adb66b3e 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/activity.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/activity.json
@@ -6,6 +6,7 @@
     "title": "Camel Activity",
     "description": "Recent completed exchange activity",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.impl.console.ActivityDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/api.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/api.json
index 815d84495893..9fa8ce489e4f 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/api.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/api.json
@@ -6,6 +6,7 @@
     "title": "API",
     "description": "OpenAPI specification for the dev console API",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.impl.console.ApiDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/bean.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/bean.json
index f281d19180be..379d778fcd71 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/bean.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/bean.json
@@ -6,6 +6,7 @@
     "title": "Bean",
     "description": "Displays Java beans from the registry",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.impl.console.BeanDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/blocked.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/blocked.json
index 47e637c0bc53..da11ffd63cae 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/blocked.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/blocked.json
@@ -6,6 +6,7 @@
     "title": "Blocked Exchanges",
     "description": "Display blocked exchanges",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.impl.console.BlockedConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/browse.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/browse.json
index 35d4431083cd..1baf361f8071 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/browse.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/browse.json
@@ -6,6 +6,7 @@
     "title": "Browse",
     "description": "Browse pending messages on Camel components",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.impl.console.BrowseDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/circuit-breaker.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/circuit-breaker.json
index 2c735d14513a..5426d9653234 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/circuit-breaker.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/circuit-breaker.json
@@ -6,6 +6,7 @@
     "title": "Circuit Breaker",
     "description": "Display circuit breaker information",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.impl.console.CircuitBreakerDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/consumer.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/consumer.json
index e5aa0f91d75c..b846c934a55f 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/consumer.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/consumer.json
@@ -6,6 +6,7 @@
     "title": "Consumers",
     "description": "Display information about Camel consumers",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.impl.console.ConsumerDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/context.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/context.json
index b55bdbc2c90e..aa9c21003630 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/context.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/context.json
@@ -6,6 +6,7 @@
     "title": "CamelContext",
     "description": "Overall information about the CamelContext",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.impl.console.ContextDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/datasource.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/datasource.json
index ac0e5983d0ea..2ac439d18181 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/datasource.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/datasource.json
@@ -6,6 +6,7 @@
     "title": "DataSource",
     "description": "Displays DataSource connection pool metrics",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.impl.console.DataSourceDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/debug.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/debug.json
index 92eab4e852a8..04b95b63dd64 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/debug.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/debug.json
@@ -6,6 +6,7 @@
     "title": "Debug",
     "description": "Camel route debugger",
     "deprecated": false,
+    "readOnly": false,
     "javaType": "org.apache.camel.impl.console.DebugDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/endpoint.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/endpoint.json
index 4e2f6e662a06..a8b4fb61bd92 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/endpoint.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/endpoint.json
@@ -6,6 +6,7 @@
     "title": "Endpoints",
     "description": "Endpoint Registry information",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.impl.console.EndpointDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/errors.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/errors.json
index 38d6d50322f6..1522e583d3ea 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/errors.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/errors.json
@@ -6,6 +6,7 @@
     "title": "Error Registry",
     "description": "Display captured routing errors",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.impl.console.ErrorRegistryConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/eval-language.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/eval-language.json
index 4f32f0a2c412..0086f1b21082 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/eval-language.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/eval-language.json
@@ -6,6 +6,7 @@
     "title": "Evaluate Language",
     "description": "Evaluate Language and display result",
     "deprecated": false,
+    "readOnly": false,
     "javaType": "org.apache.camel.impl.console.EvalLanguageDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/event.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/event.json
index 28836520fd22..1fc4fbdce8eb 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/event.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/event.json
@@ -6,6 +6,7 @@
     "title": "Camel Events",
     "description": "The most recent Camel events",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.impl.console.EventConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/gc.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/gc.json
index 83df44fdfa99..66e21ec22064 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/gc.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/gc.json
@@ -6,6 +6,7 @@
     "title": "Garbage Collector",
     "description": "Displays Garbage Collector information",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.impl.console.GarbageCollectorDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/health.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/health.json
index 32bbfc1c5c04..e5083a15e3e5 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/health.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/health.json
@@ -6,6 +6,7 @@
     "title": "Health Check",
     "description": "Health Check Status",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.impl.console.HealthDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/heap-dump.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/heap-dump.json
index a430cc1420ee..781c565a9d80 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/heap-dump.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/heap-dump.json
@@ -6,6 +6,7 @@
     "title": "Heap Dump",
     "description": "Write a heap dump (.hprof) file for deep memory analysis",
     "deprecated": false,
+    "readOnly": false,
     "javaType": "org.apache.camel.impl.console.HeapDumpDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/heap-histogram.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/heap-histogram.json
index 2353f33b9456..69148a67e464 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/heap-histogram.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/heap-histogram.json
@@ -6,6 +6,7 @@
     "title": "Heap Histogram",
     "description": "Displays class-level heap memory usage",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.impl.console.HeapHistogramDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/inflight.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/inflight.json
index d40ea6b4a80e..b758445cf916 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/inflight.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/inflight.json
@@ -6,6 +6,7 @@
     "title": "Inflight Exchanges",
     "description": "Display inflight exchanges",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.impl.console.InflightConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/internal-tasks.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/internal-tasks.json
index 869038a890d6..0fb582f03c1e 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/internal-tasks.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/internal-tasks.json
@@ -6,6 +6,7 @@
     "title": "Internal Tasks",
     "description": "Display information about internal tasks",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.impl.console.TaskRegistryDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/java-security.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/java-security.json
index a26a922dfa11..c5877f34274c 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/java-security.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/java-security.json
@@ -6,6 +6,7 @@
     "title": "Java Security",
     "description": "Displays Java Security (JSSE) information",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.impl.console.JavaSecurityDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/jfr-memory-leak.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/jfr-memory-leak.json
index 9060eac5e162..d6dd0387587f 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/jfr-memory-leak.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/jfr-memory-leak.json
@@ -6,6 +6,7 @@
     "title": "JFR Memory Leak",
     "description": "JFR-based old object sampling for memory leak diagnosis",
     "deprecated": false,
+    "readOnly": false,
     "javaType": "org.apache.camel.impl.console.JfrMemoryLeakDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/jvm.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/jvm.json
index 4d8cd2789763..c4d5d32567db 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/jvm.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/jvm.json
@@ -6,6 +6,7 @@
     "title": "JVM",
     "description": "Displays JVM information",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.impl.console.JvmDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/log.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/log.json
index 15bd74e81283..30f93775f196 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/log.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/log.json
@@ -6,6 +6,7 @@
     "title": "Log",
     "description": "Logging framework",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.impl.console.LogDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/memory.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/memory.json
index 9f7d8b403df7..0bd7215dde80 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/memory.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/memory.json
@@ -6,6 +6,7 @@
     "title": "JVM Memory",
     "description": "Displays JVM memory information",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.impl.console.MemoryDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/message-history.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/message-history.json
index e950b50cd95c..cb4f9e2a0fb6 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/message-history.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/message-history.json
@@ -6,6 +6,7 @@
     "title": "Message History",
     "description": "History of latest completed exchange",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.impl.console.MessageHistoryDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/processor-detail.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/processor-detail.json
index 8e22af1c1968..ebf8ce65ad2d 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/processor-detail.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/processor-detail.json
@@ -6,6 +6,7 @@
     "title": "Processor Detail",
     "description": "Show configured options for all processors in a route",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.impl.console.ProcessorDetailDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/processor.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/processor.json
index c92c77296a08..4187206fd03d 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/processor.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/processor.json
@@ -6,6 +6,7 @@
     "title": "Processor",
     "description": "Processor information",
     "deprecated": false,
+    "readOnly": false,
     "javaType": "org.apache.camel.impl.console.ProcessorDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/producer.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/producer.json
index dbac98c57280..865f49fa969e 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/producer.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/producer.json
@@ -6,6 +6,7 @@
     "title": "Producers",
     "description": "Display information about Camel producers",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.impl.console.ProducerDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/properties.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/properties.json
index 8c661d342d80..8a70c7b3e1f6 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/properties.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/properties.json
@@ -6,6 +6,7 @@
     "title": "Properties",
     "description": "Displays the properties loaded by Camel",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.impl.console.PropertiesDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/receive.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/receive.json
index faa96aca845f..d6eef0033fb7 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/receive.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/receive.json
@@ -6,6 +6,7 @@
     "title": "Camel Receive",
     "description": "Consume messages from endpoints",
     "deprecated": false,
+    "readOnly": false,
     "javaType": "org.apache.camel.impl.console.ReceiveDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/reload.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/reload.json
index 48b8737e0b16..9a9ac8798415 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/reload.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/reload.json
@@ -6,6 +6,7 @@
     "title": "Reload",
     "description": "Console for reloading running Camel",
     "deprecated": false,
+    "readOnly": false,
     "javaType": "org.apache.camel.impl.console.ReloadDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/rest-spec.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/rest-spec.json
index 46ddad46dcc1..e9f5e8eaa235 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/rest-spec.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/rest-spec.json
@@ -6,6 +6,7 @@
     "title": "Rest Spec",
     "description": "OpenAPI specification content for contract-first REST 
services",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.impl.console.RestSpecDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/rest.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/rest.json
index 7d237debce0c..865442fdcdea 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/rest.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/rest.json
@@ -6,6 +6,7 @@
     "title": "Rest",
     "description": "Rest DSL Registry information",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.impl.console.RestDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/route-controller.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/route-controller.json
index 986252e5ca52..2e26709b7178 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/route-controller.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/route-controller.json
@@ -6,6 +6,7 @@
     "title": "Route Controller",
     "description": "Route controller information",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.impl.console.RouteControllerConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/route-dump.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/route-dump.json
index 3795188ace1a..b456dd2bcfa1 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/route-dump.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/route-dump.json
@@ -6,6 +6,7 @@
     "title": "Route Dump",
     "description": "Dump route in XML, YAML, or Java DSL format",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.impl.console.RouteDumpDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/route-group.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/route-group.json
index c2fd5b8c8502..385cdd8cd957 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/route-group.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/route-group.json
@@ -6,6 +6,7 @@
     "title": "Route Group",
     "description": "Route Group information",
     "deprecated": false,
+    "readOnly": false,
     "javaType": "org.apache.camel.impl.console.RouteGroupDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/route-structure.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/route-structure.json
index cad3cda9403f..ea33d5983a20 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/route-structure.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/route-structure.json
@@ -6,6 +6,7 @@
     "title": "Route Structure",
     "description": "Dump route structure",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.impl.console.RouteStructureDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/route-topology.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/route-topology.json
index 2a5a27807324..7986ba7bddbf 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/route-topology.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/route-topology.json
@@ -6,6 +6,7 @@
     "title": "Route Topology",
     "description": "Route topology showing inter-route connections",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.impl.console.RouteTopologyDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/route.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/route.json
index 36f75cd52f6d..555a1a0dd5c1 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/route.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/route.json
@@ -6,6 +6,7 @@
     "title": "Route",
     "description": "Route information",
     "deprecated": false,
+    "readOnly": false,
     "javaType": "org.apache.camel.impl.console.RouteDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/send.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/send.json
index a15a608be3f5..0900fa44626c 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/send.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/send.json
@@ -6,6 +6,7 @@
     "title": "Camel Send",
     "description": "Send messages to endpoints",
     "deprecated": false,
+    "readOnly": false,
     "javaType": "org.apache.camel.impl.console.SendDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/service.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/service.json
index 33138f8dd4c9..b56cf0641d0c 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/service.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/service.json
@@ -6,6 +6,7 @@
     "title": "Services",
     "description": "Services used for network communication with clients",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.impl.console.ServiceDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/simple-language.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/simple-language.json
index 07ebd2626447..3c84e7ff2202 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/simple-language.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/simple-language.json
@@ -6,6 +6,7 @@
     "title": "Simple Language",
     "description": "Display simple language details",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.impl.console.SimpleLanguageDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/source.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/source.json
index b641917712e6..824a1f09535b 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/source.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/source.json
@@ -6,6 +6,7 @@
     "title": "Source",
     "description": "Dump route source code",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.impl.console.SourceDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/sql-query.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/sql-query.json
index bde872c3cde3..131e314fd5b8 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/sql-query.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/sql-query.json
@@ -6,6 +6,7 @@
     "title": "SQL Query",
     "description": "Execute SQL queries on DataSource beans",
     "deprecated": false,
+    "readOnly": false,
     "javaType": "org.apache.camel.impl.console.SqlQueryDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/sql-trace.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/sql-trace.json
index 43ee6575ec41..1b2c4a040bfd 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/sql-trace.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/sql-trace.json
@@ -6,6 +6,7 @@
     "title": "SQL Trace",
     "description": "Trace SQL query executions",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.impl.console.SqlTraceDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/startup-recorder.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/startup-recorder.json
index 83bbb40681e9..b258f1962d36 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/startup-recorder.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/startup-recorder.json
@@ -6,6 +6,7 @@
     "title": "Startup Recorder",
     "description": "Starting recording information",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.impl.console.StartupRecorderDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/system-properties.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/system-properties.json
index 972f953ae340..d8f996856e7e 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/system-properties.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/system-properties.json
@@ -6,6 +6,7 @@
     "title": "System Properties",
     "description": "Displays Java System Properties",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.impl.console.SystemPropertiesDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/thread.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/thread.json
index 4b9008704da5..7ef081e60cf5 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/thread.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/thread.json
@@ -6,6 +6,7 @@
     "title": "Thread",
     "description": "Displays JVM Threads information",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.impl.console.ThreadDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/top.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/top.json
index f6d95b92dd95..58e79ae88399 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/top.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/top.json
@@ -6,6 +6,7 @@
     "title": "Top Routes",
     "description": "Display the top routes",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.impl.console.TopDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/trace.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/trace.json
index e9814d31eb7a..9edb3eca5601 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/trace.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/trace.json
@@ -6,6 +6,7 @@
     "title": "Camel Tracing",
     "description": "Trace routed messages",
     "deprecated": false,
+    "readOnly": false,
     "javaType": "org.apache.camel.impl.console.TraceDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/transformers.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/transformers.json
index fae346548208..e5490278b2fe 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/transformers.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/transformers.json
@@ -6,6 +6,7 @@
     "title": "Data Type Transformers",
     "description": "Data-type transformer information",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.impl.console.TransformerConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/type-converters.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/type-converters.json
index fbc09620bc17..45f5ea1da158 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/type-converters.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/type-converters.json
@@ -6,6 +6,7 @@
     "title": "Type Converters",
     "description": "Camel Type Converter information",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.impl.console.TypeConverterConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/variables.json
 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/variables.json
index d73b94b813c7..0f2c9c059fa8 100644
--- 
a/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/variables.json
+++ 
b/core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/variables.json
@@ -6,6 +6,7 @@
     "title": "Variables",
     "description": "Displays variables",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.impl.console.VariablesDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-console",
diff --git 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/ApiDevConsole.java
 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/ApiDevConsole.java
index f3963069a2c6..2fe27561dda6 100644
--- 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/ApiDevConsole.java
+++ 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/ApiDevConsole.java
@@ -82,15 +82,24 @@ public class ApiDevConsole extends AbstractDevConsole {
 
             for (org.apache.camel.console.DevConsole console : consoles) {
                 String id = console.getId();
+                boolean readOnly = console.isReadOnly();
+
                 JsonObject pathItem = new JsonObject();
-                JsonObject post = new JsonObject();
-                post.put("summary", console.getDisplayName());
-                post.put("description", console.getDescription());
-                post.put("operationId", id);
-
-                JsonObject requestBody = buildConsoleRequestBody(id);
-                if (requestBody != null) {
-                    post.put("requestBody", requestBody);
+                JsonObject operation = new JsonObject();
+                operation.put("summary", console.getDisplayName());
+                operation.put("description", console.getDescription());
+                operation.put("operationId", id);
+
+                if (readOnly) {
+                    JsonArray parameters = buildConsoleParameters(id);
+                    if (parameters != null) {
+                        operation.put("parameters", parameters);
+                    }
+                } else {
+                    JsonObject requestBody = buildConsoleRequestBody(id);
+                    if (requestBody != null) {
+                        operation.put("requestBody", requestBody);
+                    }
                 }
 
                 JsonObject responses = new JsonObject();
@@ -100,9 +109,9 @@ public class ApiDevConsole extends AbstractDevConsole {
                 responseContent.put("application/json", new JsonObject());
                 ok.put("content", responseContent);
                 responses.put("200", ok);
-                post.put("responses", responses);
+                operation.put("responses", responses);
 
-                pathItem.put("post", post);
+                pathItem.put(readOnly ? "get" : "post", operation);
                 paths.put("/q/dev/" + id, pathItem);
             }
         }
@@ -111,7 +120,12 @@ public class ApiDevConsole extends AbstractDevConsole {
         return Jsoner.prettyPrint(root.toJson());
     }
 
-    private JsonObject buildConsoleRequestBody(String consoleId) {
+    /**
+     * Loads and parses the option schema for the given console.
+     *
+     * @return the parsed options, or null if the console has no options or 
the schema could not be loaded
+     */
+    private JsonObject loadConsoleOptions(String consoleId) {
         try {
             String json = ((CatalogCamelContext) getCamelContext())
                     .getDevConsoleParameterJsonSchema(consoleId);
@@ -126,56 +140,106 @@ public class ApiDevConsole extends AbstractDevConsole {
             if (!(optionsObj instanceof JsonObject opts) || opts.isEmpty()) {
                 return null;
             }
+            return opts;
+        } catch (Exception e) {
+            // ignore
+            return null;
+        }
+    }
 
-            JsonObject properties = new JsonObject();
-            JsonArray required = new JsonArray();
-            for (Map.Entry<String, Object> entry : opts.entrySet()) {
-                String name = entry.getKey();
-                if (!(entry.getValue() instanceof JsonObject opt)) {
-                    continue;
-                }
-                JsonObject prop = new JsonObject();
-                String type = opt.getString("type");
-                if (type != null) {
-                    prop.put("type", type);
-                }
-                String description = opt.getString("description");
-                if (description != null) {
-                    prop.put("description", description);
-                }
-                Object defaultValue = opt.get("defaultValue");
-                if (defaultValue != null) {
-                    prop.put("default", defaultValue);
-                }
-                Object enumValues = opt.get("enum");
-                if (enumValues instanceof JsonArray ea && !ea.isEmpty()) {
-                    prop.put("enum", enumValues);
-                }
-                properties.put(name, prop);
+    private JsonObject buildConsoleRequestBody(String consoleId) {
+        JsonObject opts = loadConsoleOptions(consoleId);
+        if (opts == null) {
+            return null;
+        }
 
-                Boolean req = opt.getBoolean("required");
-                if (req != null && req) {
-                    required.add(name);
-                }
+        JsonObject properties = new JsonObject();
+        JsonArray required = new JsonArray();
+        for (Map.Entry<String, Object> entry : opts.entrySet()) {
+            String name = entry.getKey();
+            if (!(entry.getValue() instanceof JsonObject opt)) {
+                continue;
+            }
+            JsonObject prop = new JsonObject();
+            String type = opt.getString("type");
+            if (type != null) {
+                prop.put("type", type);
+            }
+            String description = opt.getString("description");
+            if (description != null) {
+                prop.put("description", description);
+            }
+            Object defaultValue = opt.get("defaultValue");
+            if (defaultValue != null) {
+                prop.put("default", defaultValue);
             }
+            Object enumValues = opt.get("enum");
+            if (enumValues instanceof JsonArray ea && !ea.isEmpty()) {
+                prop.put("enum", enumValues);
+            }
+            properties.put(name, prop);
 
-            JsonObject schema = new JsonObject();
-            schema.put("type", "object");
-            schema.put("properties", properties);
-            if (!required.isEmpty()) {
-                schema.put("required", required);
+            Boolean req = opt.getBoolean("required");
+            if (req != null && req) {
+                required.add(name);
             }
+        }
 
-            JsonObject mediaType = new JsonObject();
-            mediaType.put("schema", schema);
-            JsonObject content = new JsonObject();
-            content.put("application/json", mediaType);
-            JsonObject requestBody = new JsonObject();
-            requestBody.put("content", content);
-            return requestBody;
-        } catch (Exception e) {
-            // ignore
+        JsonObject schema = new JsonObject();
+        schema.put("type", "object");
+        schema.put("properties", properties);
+        if (!required.isEmpty()) {
+            schema.put("required", required);
+        }
+
+        JsonObject mediaType = new JsonObject();
+        mediaType.put("schema", schema);
+        JsonObject content = new JsonObject();
+        content.put("application/json", mediaType);
+        JsonObject requestBody = new JsonObject();
+        requestBody.put("content", content);
+        return requestBody;
+    }
+
+    private JsonArray buildConsoleParameters(String consoleId) {
+        JsonObject opts = loadConsoleOptions(consoleId);
+        if (opts == null) {
             return null;
         }
+
+        JsonArray parameters = new JsonArray();
+        for (Map.Entry<String, Object> entry : opts.entrySet()) {
+            String name = entry.getKey();
+            if (!(entry.getValue() instanceof JsonObject opt)) {
+                continue;
+            }
+            JsonObject param = new JsonObject();
+            param.put("name", name);
+            param.put("in", "query");
+            String description = opt.getString("description");
+            if (description != null) {
+                param.put("description", description);
+            }
+            Boolean req = opt.getBoolean("required");
+            param.put("required", req != null && req);
+
+            JsonObject schema = new JsonObject();
+            String type = opt.getString("type");
+            if (type != null) {
+                schema.put("type", type);
+            }
+            Object defaultValue = opt.get("defaultValue");
+            if (defaultValue != null) {
+                schema.put("default", defaultValue);
+            }
+            Object enumValues = opt.get("enum");
+            if (enumValues instanceof JsonArray ea && !ea.isEmpty()) {
+                schema.put("enum", enumValues);
+            }
+            param.put("schema", schema);
+
+            parameters.add(param);
+        }
+        return parameters.isEmpty() ? null : parameters;
     }
 }
diff --git 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/DebugDevConsole.java
 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/DebugDevConsole.java
index 211598e215ed..1d726e7d911f 100644
--- 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/DebugDevConsole.java
+++ 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/DebugDevConsole.java
@@ -41,7 +41,7 @@ import org.apache.camel.util.json.JsonArray;
 import org.apache.camel.util.json.JsonObject;
 import org.apache.camel.util.json.Jsoner;
 
-@DevConsole(name = "debug", description = "Camel route debugger")
+@DevConsole(name = "debug", description = "Camel route debugger", readOnly = 
false)
 public class DebugDevConsole extends AbstractDevConsole {
 
     @Metadata(label = "query", description = "Action command to execute on the 
debugger", javaType = "java.lang.String")
diff --git 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/EvalLanguageDevConsole.java
 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/EvalLanguageDevConsole.java
index 2eeea51acd74..0dd14f26f844 100644
--- 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/EvalLanguageDevConsole.java
+++ 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/EvalLanguageDevConsole.java
@@ -28,7 +28,8 @@ import org.apache.camel.support.MessageHelper;
 import org.apache.camel.support.console.AbstractDevConsole;
 import org.apache.camel.util.json.JsonObject;
 
-@DevConsole(name = "eval-language", displayName = "Evaluate Language", 
description = "Evaluate Language and display result")
+@DevConsole(name = "eval-language", displayName = "Evaluate Language", 
description = "Evaluate Language and display result",
+            readOnly = false)
 public class EvalLanguageDevConsole extends AbstractDevConsole {
 
     @Metadata(label = "query", description = "The language to use", javaType = 
"java.lang.String", defaultValue = "simple")
diff --git 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/HeapDumpDevConsole.java
 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/HeapDumpDevConsole.java
index 9351218b149a..9280c7a397a3 100644
--- 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/HeapDumpDevConsole.java
+++ 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/HeapDumpDevConsole.java
@@ -33,7 +33,7 @@ import org.apache.camel.support.console.AbstractDevConsole;
 import org.apache.camel.util.json.JsonObject;
 
 @DevConsole(name = "heap-dump", displayName = "Heap Dump",
-            description = "Write a heap dump (.hprof) file for deep memory 
analysis")
+            description = "Write a heap dump (.hprof) file for deep memory 
analysis", readOnly = false)
 @Configurer(extended = true)
 public class HeapDumpDevConsole extends AbstractDevConsole {
 
diff --git 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/JfrMemoryLeakDevConsole.java
 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/JfrMemoryLeakDevConsole.java
index 705b375790de..0c8ffc94c33a 100644
--- 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/JfrMemoryLeakDevConsole.java
+++ 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/JfrMemoryLeakDevConsole.java
@@ -52,7 +52,7 @@ import org.slf4j.LoggerFactory;
  * chains back to GC roots, enabling memory leak diagnosis.
  */
 @DevConsole(name = "jfr-memory-leak", displayName = "JFR Memory Leak",
-            description = "JFR-based old object sampling for memory leak 
diagnosis")
+            description = "JFR-based old object sampling for memory leak 
diagnosis", readOnly = false)
 @Configurer(extended = true)
 public class JfrMemoryLeakDevConsole extends AbstractDevConsole {
 
diff --git 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/ProcessorDevConsole.java
 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/ProcessorDevConsole.java
index a1c0b8baf57a..f65f956013eb 100644
--- 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/ProcessorDevConsole.java
+++ 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/ProcessorDevConsole.java
@@ -42,7 +42,7 @@ import org.apache.camel.util.json.Jsoner;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@DevConsole(name = "processor", description = "Processor information")
+@DevConsole(name = "processor", description = "Processor information", 
readOnly = false)
 public class ProcessorDevConsole extends AbstractDevConsole {
 
     private static final Logger LOG = 
LoggerFactory.getLogger(ProcessorDevConsole.class);
diff --git 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/ReceiveDevConsole.java
 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/ReceiveDevConsole.java
index 71e8da82d952..776f836041ab 100644
--- 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/ReceiveDevConsole.java
+++ 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/ReceiveDevConsole.java
@@ -47,7 +47,8 @@ import org.apache.camel.util.json.JsonArray;
 import org.apache.camel.util.json.JsonObject;
 import org.apache.camel.util.json.Jsoner;
 
-@DevConsole(name = "receive", displayName = "Camel Receive", description = 
"Consume messages from endpoints")
+@DevConsole(name = "receive", displayName = "Camel Receive", description = 
"Consume messages from endpoints",
+            readOnly = false)
 @Configurer(extended = true)
 public class ReceiveDevConsole extends AbstractDevConsole {
 
diff --git 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/ReloadDevConsole.java
 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/ReloadDevConsole.java
index 1507da680973..995226c32eb1 100644
--- 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/ReloadDevConsole.java
+++ 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/ReloadDevConsole.java
@@ -31,7 +31,7 @@ import org.apache.camel.support.console.AbstractDevConsole;
 import org.apache.camel.util.json.JsonArray;
 import org.apache.camel.util.json.JsonObject;
 
-@DevConsole(name = "reload", description = "Console for reloading running 
Camel")
+@DevConsole(name = "reload", description = "Console for reloading running 
Camel", readOnly = false)
 public class ReloadDevConsole extends AbstractDevConsole {
 
     @Metadata(label = "query", description = "Option to trigger reloading", 
javaType = "java.lang.Boolean",
diff --git 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/RouteDevConsole.java
 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/RouteDevConsole.java
index 5e77d6f69f5f..62fe9db3d0fc 100644
--- 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/RouteDevConsole.java
+++ 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/RouteDevConsole.java
@@ -45,7 +45,7 @@ import org.apache.camel.util.json.JsonObject;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@DevConsole(name = "route", description = "Route information")
+@DevConsole(name = "route", description = "Route information", readOnly = 
false)
 public class RouteDevConsole extends AbstractDevConsole {
 
     private static final Logger LOG = 
LoggerFactory.getLogger(RouteDevConsole.class);
diff --git 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/RouteGroupDevConsole.java
 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/RouteGroupDevConsole.java
index 80984b9fd8a5..5c0180d9ce34 100644
--- 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/RouteGroupDevConsole.java
+++ 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/RouteGroupDevConsole.java
@@ -43,7 +43,7 @@ import org.apache.camel.util.json.JsonObject;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@DevConsole(name = "route-group", description = "Route Group information")
+@DevConsole(name = "route-group", description = "Route Group information", 
readOnly = false)
 public class RouteGroupDevConsole extends AbstractDevConsole {
 
     private static final Logger LOG = 
LoggerFactory.getLogger(RouteGroupDevConsole.class);
diff --git 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/SendDevConsole.java
 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/SendDevConsole.java
index 8fd1c5e39034..d9aeeaa1ffce 100644
--- 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/SendDevConsole.java
+++ 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/SendDevConsole.java
@@ -43,7 +43,7 @@ import org.apache.camel.util.StopWatch;
 import org.apache.camel.util.TimeUtils;
 import org.apache.camel.util.json.JsonObject;
 
-@DevConsole(name = "send", displayName = "Camel Send", description = "Send 
messages to endpoints")
+@DevConsole(name = "send", displayName = "Camel Send", description = "Send 
messages to endpoints", readOnly = false)
 @Configurer(extended = true)
 public class SendDevConsole extends AbstractDevConsole {
 
diff --git 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/SqlQueryDevConsole.java
 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/SqlQueryDevConsole.java
index 914d1de0a948..1a6ba861c709 100644
--- 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/SqlQueryDevConsole.java
+++ 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/SqlQueryDevConsole.java
@@ -40,7 +40,8 @@ import org.apache.camel.util.json.JsonArray;
 import org.apache.camel.util.json.JsonObject;
 import org.apache.camel.util.json.Jsoner;
 
-@DevConsole(name = "sql-query", displayName = "SQL Query", description = 
"Execute SQL queries on DataSource beans")
+@DevConsole(name = "sql-query", displayName = "SQL Query", description = 
"Execute SQL queries on DataSource beans",
+            readOnly = false)
 @Configurer(extended = true)
 public class SqlQueryDevConsole extends AbstractDevConsole {
 
diff --git 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/TraceDevConsole.java
 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/TraceDevConsole.java
index d1aeda3d3d48..eb59c10534d3 100644
--- 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/TraceDevConsole.java
+++ 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/TraceDevConsole.java
@@ -29,7 +29,7 @@ import org.apache.camel.support.console.AbstractDevConsole;
 import org.apache.camel.util.json.JsonArray;
 import org.apache.camel.util.json.JsonObject;
 
-@DevConsole(name = "trace", displayName = "Camel Tracing", description = 
"Trace routed messages")
+@DevConsole(name = "trace", displayName = "Camel Tracing", description = 
"Trace routed messages", readOnly = false)
 @Configurer(extended = true)
 public class TraceDevConsole extends AbstractDevConsole {
 
diff --git 
a/core/camel-console/src/test/java/org/apache/camel/impl/console/ApiDevConsoleTest.java
 
b/core/camel-console/src/test/java/org/apache/camel/impl/console/ApiDevConsoleTest.java
new file mode 100644
index 000000000000..0fbab572ad9b
--- /dev/null
+++ 
b/core/camel-console/src/test/java/org/apache/camel/impl/console/ApiDevConsoleTest.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.impl.console;
+
+import org.apache.camel.console.DevConsole;
+import org.apache.camel.console.DevConsoleRegistry;
+import org.apache.camel.util.json.JsonObject;
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class ApiDevConsoleTest extends AbstractDevConsoleTest {
+
+    private JsonObject openApiPaths() {
+        DevConsoleRegistry dcr = 
context.getCamelContextExtension().getContextPlugin(DevConsoleRegistry.class);
+        dcr.loadDevConsoles();
+
+        DevConsole con = assertConsoleExists("api", "camel");
+        JsonObject root = callJson(con);
+        JsonObject paths = root.getJsonObject("paths");
+        assertThat(paths).isNotNull();
+        return paths;
+    }
+
+    @Test
+    public void testReadOnlyConsoleUsesGet() {
+        JsonObject paths = openApiPaths();
+
+        JsonObject contextPath = paths.getJsonObject("/q/dev/context");
+        assertThat(contextPath).as("context console path should 
exist").isNotNull();
+        assertThat(contextPath.getJsonObject("get")).as("context console 
should be declared as GET").isNotNull();
+        assertThat(contextPath.getJsonObject("post")).as("context console 
should not be declared as POST").isNull();
+    }
+
+    @Test
+    public void testMutatingConsoleUsesPost() {
+        JsonObject paths = openApiPaths();
+
+        JsonObject routePath = paths.getJsonObject("/q/dev/route");
+        assertThat(routePath).as("route console path should 
exist").isNotNull();
+        assertThat(routePath.getJsonObject("get")).as("route console should 
not be declared as GET").isNull();
+
+        JsonObject post = routePath.getJsonObject("post");
+        assertThat(post).as("route console should be declared as 
POST").isNotNull();
+        assertThat(post.get("requestBody")).as("route console POST should 
carry a requestBody").isNotNull();
+    }
+
+    @Test
+    public void testIsReadOnlyDefaults() {
+        assertThat(new ContextDevConsole().isReadOnly()).isTrue();
+        assertThat(new RouteDevConsole().isReadOnly()).isFalse();
+        assertThat(new EvalLanguageDevConsole().isReadOnly()).isFalse();
+        assertThat(new SendDevConsole().isReadOnly()).isFalse();
+    }
+}
diff --git 
a/core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/dev-console/bean-model.json
 
b/core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/dev-console/bean-model.json
index 23840a6e83e8..6ee5e78ec5f2 100644
--- 
a/core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/dev-console/bean-model.json
+++ 
b/core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/dev-console/bean-model.json
@@ -6,6 +6,7 @@
     "title": "Bean Model",
     "description": "Displays beans from the DSL model",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.model.console.BeanModelDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-core-model",
diff --git 
a/core/camel-main/src/generated/resources/META-INF/org/apache/camel/dev-console/main-configuration.json
 
b/core/camel-main/src/generated/resources/META-INF/org/apache/camel/dev-console/main-configuration.json
index bcdda430dafb..35d1fc8dc0d1 100644
--- 
a/core/camel-main/src/generated/resources/META-INF/org/apache/camel/dev-console/main-configuration.json
+++ 
b/core/camel-main/src/generated/resources/META-INF/org/apache/camel/dev-console/main-configuration.json
@@ -6,6 +6,7 @@
     "title": "Main Configuration",
     "description": "Display Camel startup configuration",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.main.MainConfigurationDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-main",
diff --git 
a/core/camel-support/src/main/java/org/apache/camel/support/console/AbstractDevConsole.java
 
b/core/camel-support/src/main/java/org/apache/camel/support/console/AbstractDevConsole.java
index bfe752d92475..ce888aa9e7b0 100644
--- 
a/core/camel-support/src/main/java/org/apache/camel/support/console/AbstractDevConsole.java
+++ 
b/core/camel-support/src/main/java/org/apache/camel/support/console/AbstractDevConsole.java
@@ -61,6 +61,13 @@ public abstract class AbstractDevConsole extends 
ServiceSupport implements DevCo
         return true;
     }
 
+    @Override
+    public boolean isReadOnly() {
+        org.apache.camel.spi.annotations.DevConsole ann
+                = 
getClass().getAnnotation(org.apache.camel.spi.annotations.DevConsole.class);
+        return ann == null || ann.readOnly();
+    }
+
     @Override
     public String getGroup() {
         return group;
diff --git 
a/dsl/camel-jbang/camel-jbang-console/src/generated/resources/META-INF/org/apache/camel/dev-console/jbang.json
 
b/dsl/camel-jbang/camel-jbang-console/src/generated/resources/META-INF/org/apache/camel/dev-console/jbang.json
index baaca0aeee09..616c7d091054 100644
--- 
a/dsl/camel-jbang/camel-jbang-console/src/generated/resources/META-INF/org/apache/camel/dev-console/jbang.json
+++ 
b/dsl/camel-jbang/camel-jbang-console/src/generated/resources/META-INF/org/apache/camel/dev-console/jbang.json
@@ -6,6 +6,7 @@
     "title": "Camel CLI",
     "description": "Information about Camel CLI",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.jbang.console.JBangDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-jbang-console",
diff --git 
a/dsl/camel-jbang/camel-jbang-console/src/generated/resources/META-INF/org/apache/camel/dev-console/source-dir.json
 
b/dsl/camel-jbang/camel-jbang-console/src/generated/resources/META-INF/org/apache/camel/dev-console/source-dir.json
index 492f7d07826b..f7e60cfb3684 100644
--- 
a/dsl/camel-jbang/camel-jbang-console/src/generated/resources/META-INF/org/apache/camel/dev-console/source-dir.json
+++ 
b/dsl/camel-jbang/camel-jbang-console/src/generated/resources/META-INF/org/apache/camel/dev-console/source-dir.json
@@ -6,6 +6,7 @@
     "title": "Source Directory",
     "description": "Information about Camel CLI source files",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.jbang.console.SourceDirDevConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-jbang-console",
diff --git 
a/dsl/camel-kamelet-main/src/generated/resources/META-INF/org/apache/camel/dev-console/dependency-downloader.json
 
b/dsl/camel-kamelet-main/src/generated/resources/META-INF/org/apache/camel/dev-console/dependency-downloader.json
index b3ed8a6458e0..a9e68394e0d6 100644
--- 
a/dsl/camel-kamelet-main/src/generated/resources/META-INF/org/apache/camel/dev-console/dependency-downloader.json
+++ 
b/dsl/camel-kamelet-main/src/generated/resources/META-INF/org/apache/camel/dev-console/dependency-downloader.json
@@ -6,6 +6,7 @@
     "title": "Maven Dependency Downloader",
     "description": "Displays information about dependencies downloaded at 
runtime",
     "deprecated": false,
+    "readOnly": true,
     "javaType": "org.apache.camel.main.console.DependencyDownloaderConsole",
     "groupId": "org.apache.camel",
     "artifactId": "camel-kamelet-main",
diff --git 
a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateDevConsoleMojo.java
 
b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateDevConsoleMojo.java
index 8c3fa3d24bbf..2f2c0976b70b 100644
--- 
a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateDevConsoleMojo.java
+++ 
b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateDevConsoleMojo.java
@@ -83,6 +83,7 @@ public class GenerateDevConsoleMojo extends 
AbstractGeneratorMojo {
         private String displayName;
         private String description;
         private boolean deprecated;
+        private boolean readOnly = true;
         private final List<DevConsoleOptionModel> options = new ArrayList<>();
 
         public String getClassName() {
@@ -133,6 +134,14 @@ public class GenerateDevConsoleMojo extends 
AbstractGeneratorMojo {
             this.deprecated = deprecated;
         }
 
+        public boolean isReadOnly() {
+            return readOnly;
+        }
+
+        public void setReadOnly(boolean readOnly) {
+            this.readOnly = readOnly;
+        }
+
         public List<DevConsoleOptionModel> getOptions() {
             return options;
         }
@@ -169,6 +178,7 @@ public class GenerateDevConsoleMojo extends 
AbstractGeneratorMojo {
             model.setName(annotationValue(a, "name"));
             model.setDisplayName(annotationValue(a, "displayName"));
             model.setDescription(annotationValue(a, "description"));
+            model.setReadOnly(!"false".equals(annotationValue(a, "readOnly")));
             // skip default registry
             boolean skip = "default-registry".equals(model.getName());
             if (!skip) {
@@ -228,6 +238,7 @@ public class GenerateDevConsoleMojo extends 
AbstractGeneratorMojo {
         }
         jo.put("description", model.getDescription());
         jo.put("deprecated", model.isDeprecated());
+        jo.put("readOnly", model.isReadOnly());
         jo.put("javaType", model.getClassName());
         jo.put("groupId", project.getGroupId());
         jo.put("artifactId", project.getArtifactId());
diff --git 
a/tooling/spi-annotations/src/main/java/org/apache/camel/spi/annotations/DevConsole.java
 
b/tooling/spi-annotations/src/main/java/org/apache/camel/spi/annotations/DevConsole.java
index 337360203da4..1f93908cac86 100644
--- 
a/tooling/spi-annotations/src/main/java/org/apache/camel/spi/annotations/DevConsole.java
+++ 
b/tooling/spi-annotations/src/main/java/org/apache/camel/spi/annotations/DevConsole.java
@@ -51,4 +51,12 @@ public @interface DevConsole {
      */
     String description();
 
+    /**
+     * Whether this console is read-only (safe, and does not change any 
runtime state).
+     * <p/>
+     * Consoles that mutate state (such as starting/stopping a route, sending 
a message, or triggering a heap dump) must
+     * set this to {@code false}.
+     */
+    boolean readOnly() default true;
+
 }

Reply via email to