Skip to content

CAMEL-26400: camel-jbang - AI tools: camel_eval_expression takes headers, variables, resultType and predicate - #28683

Merged
Croway merged 6 commits into
apache:mainfrom
Croway:CAMEL-26400-eval-headers-result-type
Oct 29, 2026
Merged

Croway merged 6 commits into
apache:mainfrom
Croway:CAMEL-26400-eval-headers-result-type

Conversation

@Croway

@Croway Croway commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

Claude Code on behalf of Croway

CAMEL-26400

Problem

camel_eval_expression takes only expression, language, body and name, so it cannot evaluate an expression the
way the route does:

  • the XPath language evaluates to nodes by default, so a function such as string(), local-name(), boolean() or
    count() fails with Can not convert #STRING to a NodeList!; in a route it runs with resultType: java.lang.String
    or as a predicate;
  • predicate mode is guessed for simple only, so an XPath or jsonpath predicate is always evaluated as an expression;
  • the scratch exchange has no headers or variables, so headers.x (groovy) or variable("x") (jq) is null, and a
    headers argument is silently ignored;
  • a local XPath that works shows the class of the node list (DTMNodeList@60b333fd), because the local path answers
    toString() of the value, while the integration converts it to String.

Fix

  • camel_eval_expression (shared tool and MCP wrapper) gets four optional arguments:
    • headers and variables: a JSON object, whose values keep their JSON type (so the rows of a query work for a
      groovy headers.rows[0].total), or key=value lines as camel_runtime_send takes headers (same parser). The MCP
      wrapper declares them as Object, so the schema takes any JSON: a client can send an object or a string;
    • predicate: evaluate as a predicate in any language; when absent, simple keeps its guess and the other languages
      are expressions;
    • resultType: a class name passed to the language as its resultType option, as the reifiers pass it
      (createExpression(text, new Object[] { type })); the context's class resolver resolves it, so String and
      Integer work as in a route.
  • ExpressionEvaluator takes a Request record. Locally the headers and variables are set on the scratch exchange,
    and the value is converted to String by the context's type converter (falling back to toString()), as the
    integration does, so a node list shows its XML.
  • In the integration: the eval action gets the headers and variables in its {key, value} form, predicate and
    resultType. EvalLanguageDevConsole has a new resultType option (text and JSON), and
    LocalCliConnector.doActionEvalTask passes it on and keeps the JSON type of a header or variable value (it read
    every value with getString). An integration before Camel 4.24 gets a list or object value as JSON text, and the
    answer notes that it ignores resultType.
  • An XPath that fails with Can not convert #STRING / #BOOLEAN / #NUMBER to a NodeList gets a hint with the
    argument to pass and the route form, e.g. this XPath returns a string, not nodes: pass resultType java.lang.String (in a route: xpath: {expression: "local-name(...)", resultType: java.lang.String}); predicate=true for a boolean,
    java.lang.Integer or java.lang.Double for a number. In the integration the failed eval action is a tool error
    (CAMEL-25398), so there the hint is appended to the error message.
Call Before After
xpath boolean(/*[local-name()='x']) error Can not convert #BOOLEAN to a NodeList! same error, with the hint pass predicate=true
same, predicate: true (no such argument) true
xpath local-name(/*[local-name()='x']/*[1]) error #STRING to a NodeList! same error, with the hint pass resultType java.lang.String
same, resultType: java.lang.String (no such argument) y
xpath /x/y on <x><y>1</y></x> com.sun.org.apache.xml.internal.dtm.ref.DTMNodeList@60b333fd <y>1</y>
groovy headers.totalOrdersRows[0].total_orders as long, headers: {"totalOrdersRows": [{"total_orders": 21}]} Cannot invoke method getAt() on null object the value
jq (variable("requestBodyJson") | fromjson).products[], variables: {"requestBodyJson": "..."} null (null) only strings can be parsed the list
${header.foo}, headers: {"foo": "bar"} ok, no result (argument ignored) bar
${header.foo}, headers: "foo=bar" ok, no result bar

Testing

New tests (each fails on origin/main: the camel-jbang-core and MCP ones do not compile there, as the arguments
and ExpressionEvaluator.Request are new; the console and connector ones were run against the main code of their
module and fail):

  • ExpressionEvaluatorRequestTest (local): xpath boolean() errors with the predicate=true hint and gives true
    with predicate=true; local-name() gives the resultType hint and y with java.lang.String (and String);
    count() gets the number hint and 2 with java.lang.Integer; /x/y[1] shows <y>1</y>; an unknown resultType
    says what to pass; a predicate notes that resultType is not used; groovy reads the rows of a JSON header; jq reads a
    variable with fromjson; key=value headers and variables; invalid headers say why; the registry tool takes the
    four arguments as text. camel-xpath, camel-groovy and camel-jq are test dependencies of camel-jbang-core for this.
  • EvalInTheIntegrationTest (in-process, through the test integration and the real EvalLanguageDevConsole): the
    action carries headers and variables as {key, value}, predicate and resultType; a JSON list keeps its type;
    an integration of Camel 4.23.0 (status file) gets the list as JSON text and the note on resultType; a failed XPath
    of the integration gets the hint in the tool error.
  • EvalLanguageDevConsoleTest.testEvalWithResultType: ${body} of 0042 with java.lang.Integer (and Integer)
    gives 42, in JSON and text; an unknown class fails with its name. Fails on main (0042).
  • LocalCliConnectorEvalActionTest: the eval action passes resultType, and a list header and a number variable keep
    their type (${header.rows.size()} ${variable.count} gives 1 7). Both fail on main (0042, and a
    ClassCastException on getString of the list).
  • MCP AuthoringToolsTest: the wrapper passes a JSON object header, key=value variables, predicate and
    resultType; jsonText serializes an object argument.

Runs (mvnd -P apache-snapshots test over core/camel-console,dsl/camel-cli-connector,dsl/camel-jbang/camel-jbang-core,dsl/camel-jbang/camel-jbang-mcp):

Module Tests Result
camel-console (EvalLanguageDevConsoleTest) 7 pass
camel-cli-connector (LocalCliConnector*Test) 29 pass
camel-jbang-core (commands/ai/**, common/*, AskToolsTest) 1214 pass (2 skipped)
camel-jbang-mcp (whole module) 507 pass
camel-jbang-plugin-tui (AiPanel*Test, TuiToolRegistry*Test, McpFacadeConfirmTest, TuiMcpServer*Test) 202 pass (1 skipped)

AiPanelPromptBudgetTest: the four arguments cost ~114 tokens in every prefix (core 5119 -> 5233, core with groups
5898 -> 6011, full 10731 -> 10844, semantic core 6248 -> 6361). Main was within 2 tokens of two budgets, so the
budgets are raised with a comment.

End to end, with the MCP server runner jar built from the branch (stdio client):

  • local: every call of the table above gives the answer in the After column;
  • in a running Camel 4.23.0 integration (camel run, selected by name): the XPath errors carry the hint, and for
    resultType the note that 4.23.0 ignores it; predicate: true gives true; a JSON object header and key=value
    variables give x-y; a list header arrives as JSON text; resultType with 0042 gives 0042 with the note.
  • the input schema of headers and variables has no type (the wrapper declares Object), so a client can send
    a JSON object or a string; both work.

Notes for reviewers

  • headers and variables are Object in the MCP wrapper, so the schema takes a JSON object or text. A string is
    checked by McpSecurityInterceptor as before; the JSON of an object is held to the same
    camel.mcp.security.max-argument-length in the wrapper (review of davsclaus). A predicate other than true or
    false is refused.
  • The local value now goes through the type converter, as in the integration: a jq result is shown indented
    ([ "A", "B" ] where it was ["A","B"]), and other object results can read differently than their toString().
  • camel-xpath, camel-groovy and camel-jq are test dependencies of camel-jbang-core, so a change in one of them also
    runs the camel-jbang-core tests on CI.

Update after the rebase on main

Rebased on main after #28678 (CAMEL-26396) and #28679 (CAMEL-26401). The conflicts in ExpressionEvaluator and in
the camel_eval_expression row of camel-jbang-mcp.adoc keep both sides: the scratch context still starts without
the CLI connector, and the null and elvis notes of CAMEL-26401 run after both paths, next to the notes of this PR.

One addition (last commit): an integration before Camel 4.24 refuses the elvis operator inside ${...}, and a failed
eval action is a tool error, so the rewrite CAMEL-26401 gives (write it after the function: ${header.missing} ?: 10)
never reached the model for the integration it is meant for. It now goes with the tool error, as the XPath hint of
this PR does. EvalInTheIntegrationTest#anElvisInsideThePlaceholderRefusedByAnOlderIntegrationGetsTheRewrite fails
without it.

@Croway
Croway requested review from davsclaus and oscerd October 29, 2026 11:12
@github-actions

Copy link
Copy Markdown
Contributor

🌟 Thank you for your contribution to the Apache Camel project! 🌟
🤖 CI automation will test this PR automatically.

🐫 Apache Camel Committers, please review the following items:

  • First-time contributors require MANUAL approval for the GitHub Actions to run
  • You can use the command /component-test (camel-)component-name1 (camel-)component-name2.. to request a test from the test bot although they are normally detected and executed by CI.
  • You can label PRs using skip-tests and test-dependents to fine-tune the checks executed by this PR.
  • Build and test logs are available in the summary page. Only Apache Camel committers have access to the summary.

⚠️ Be careful when sharing logs. Review their contents before sharing them publicly.

@github-actions

github-actions Bot commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

✅ Generated files are up to date

An earlier CI run reported uncommitted generated changes; the latest run no longer does.

@oscerd oscerd left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Read the evaluator and checked the surface this touches, since eval-in-an-integration is security-adjacent. It's a clean enrichment of the existing eval tool, and importantly it doesn't change the gating.

The new ExpressionEvaluator.Request (language, expression, body, headers, variables, predicate, resultType) is a tidy way to carry the richer request, and the semantics are sensible: predicate null means "guess for simple (operator present), false otherwise", and resultType mirrors a route's resultType (language default — nodes for xpath — when null). parseValues accepting either a JSON object (values keeping their JSON type) or key=value lines is the right call, since it's what makes groovy expressions like headers.rows[0].total work against structured header values, and it matches how camel_runtime_send already takes headers.

The evaluation runs in the selected integration via the dev-console / LocalCliConnector eval action, i.e. in the operator's own running process with that process's own classpath — not in the tool runner — which is the right place for it and the trusted case.

On the part I most wanted to check: this PR does not touch the TUI's ask-first gate. The only TUI file it changes is AiPanelPromptBudgetTest (a token-budget test); McpSecurityInterceptor and the AI-panel confirmation path are untouched. So the security-model contract that the TUI asks before a code-running language like groovy is unaffected — this change makes an already-gated capability richer, it doesn't open a new ungated code path. And camel-groovy is added only at <scope>test</scope>, so it's for the eval tests, not a new runtime dependency of camel-jbang-core (production groovy eval still depends on the target integration having it).

The generated dev-console metadata (eval-language.json, the dev-consoles openapi) is regenerated to match, and the tests cover the new arguments (ExpressionEvaluatorRequestTest, EvalInTheIntegrationTest, the groovy-reads-header-rows case, and the dev-console/cli-connector eval-action tests).

CI was mid-run when I looked; worth green before merge. No blockers.

Claude Code on behalf of oscerd

@github-actions

github-actions Bot commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

🧪 CI tested the following changed modules:

  • catalog/camel-catalog
  • core/camel-console
  • docs
  • dsl/camel-cli-connector
  • dsl/camel-jbang/camel-jbang-core
  • dsl/camel-jbang/camel-jbang-mcp
  • dsl/camel-jbang/camel-jbang-plugin-tui

🔁 2 tests passed only after a retry on JDK 21 (3 retried attempts)

Recovered flaky tests on JDK 21 (2)
Module Test Failed attempts First failure
dsl/camel-jbang/camel-jbang-plugin-tui AiPanelAcpTest.clearOpensANewSessionOnTheNextPrompt 2 expected: <2> but was: <1>
dsl/camel-jbang/camel-jbang-plugin-tui MonitorStartupTest.browserOnlyServesUntilTheServerStops 1 Connection refused (connect failed)

ℹ️ These tests did not fail the build. Surefire retried them and they passed.
Retries are enabled project-wide by surefire.rerunFailingTestsCount in parent/pom.xml.


🔬 Scalpel shadow comparison — Scalpel: 18 of 709 tested, 3 compile-only — current: 18 all tested

Maveniverse Scalpel detected 18 affected modules (current approach: 18).

Skip-tests mode would test 18 modules (7 direct + 0 downstream), skip tests for 3 (generated code, meta-modules)

Modules Scalpel would test (18)
  • camel-cli-connector ← dsl/camel-cli-connector/src/main/java/org/apache/camel/cli/connector/LocalCliConnector.java, dsl/camel-cli-connector/src/test/java/org/apache/camel/cli/connector/LocalCliConnectorEvalActionTest.java
  • camel-cli-debug ← depends on affected reactor module org.apache.camel:camel-cli-connector
  • camel-console ← core/camel-console/src/generated/resources/META-INF/org/apache/camel/dev-console/eval-language.json, core/camel-console/src/main/java/org/apache/camel/impl/console/EvalLanguageDevConsole.java, core/camel-console/src/test/java/org/apache/camel/impl/console/EvalLanguageDevConsoleTest.java
  • camel-core-all ← depends on affected reactor module org.apache.camel:camel-console
  • camel-diagram ← depends on affected reactor module org.apache.camel:camel-console
  • camel-jbang-console ← depends on affected reactor module org.apache.camel:camel-console
  • camel-jbang-mcp ← dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/AuthoringTools.java, dsl/camel-jbang/camel-jbang-mcp/src/test/java/org/apache/camel/dsl/jbang/core/commands/mcp/AuthoringToolsTest.java
  • camel-jbang-plugin-mcp ← depends on affected reactor module org.apache.camel:camel-jbang-core
  • camel-jbang-plugin-tui ← dsl/camel-jbang/camel-jbang-plugin-tui/src/test/java/org/apache/camel/dsl/jbang/core/commands/tui/AiPanelPromptBudgetTest.java
  • camel-jbang-plugin-validate ← depends on affected reactor module org.apache.camel:camel-yaml-dsl-validator
  • camel-launcher-container ← depends on affected reactor module org.apache.camel:camel-launcher
  • camel-mcp-server ← depends on affected reactor module org.apache.camel:camel-platform-http-main
  • camel-micrometer-prometheus ← depends on affected reactor module org.apache.camel:camel-platform-http-main
  • camel-oauth ← depends on affected reactor module org.apache.camel:camel-platform-http-main
  • camel-observability-services ← depends on affected reactor module org.apache.camel:camel-micrometer-prometheus
  • camel-platform-http-main ← depends on affected reactor module org.apache.camel:camel-console
  • camel-yaml-dsl-validator ← depends on affected reactor module org.apache.camel:camel-catalog
  • camel-yaml-dsl-validator-maven-plugin ← depends on affected reactor module org.apache.camel:camel-yaml-dsl-validator
Modules with tests skipped (3)
  • camel-itest
  • camel-yaml-dsl
  • camel-yaml-dsl-deserializers

ℹ️ Shadow mode — Scalpel observes but does not affect test execution. Learn more

⚠️ Some tests are disabled on GitHub Actions (@DisabledIfSystemProperty(named = "ci.env.name")) and require manual verification:

  • dsl/camel-jbang/camel-jbang-core: 2 test(s) disabled on GitHub Actions
  • dsl/camel-jbang/camel-jbang-mcp: 2 test(s) disabled on GitHub Actions

💡 Manual integration tests recommended:

You modified dsl/camel-jbang/camel-jbang-core. The related integration tests in dsl/camel-jbang/camel-jbang-it are excluded from CI. Consider running them manually:

mvn verify -f dsl/camel-jbang/camel-jbang-it -Djbang-it-test
All tested modules (45 modules, 8m 28s total)

Total reactor time: 8m 28s

Module Duration Status
Camel :: DSL :: CLI Connector 56.7s SUCCESS
Camel :: AI :: MCP Server 54.8s SUCCESS
Camel :: JBang :: MCP 48.6s SUCCESS
Camel :: Console 37.4s SUCCESS
Camel :: JBang :: Plugin :: Validate 30.1s SUCCESS
Camel :: Docs 29.2s SUCCESS
Camel :: OAuth 28.7s SUCCESS
Camel :: YAML DSL :: Validator 26.9s SUCCESS
Camel :: YAML DSL 23.1s SUCCESS
Camel :: Catalog :: Camel Catalog 18.8s SUCCESS
Camel :: Component DSL 17.7s SUCCESS
Camel :: JBang :: Plugin :: Testing 17.3s SUCCESS
Camel :: Kamelet Main 16.1s SUCCESS
Camel :: JBang :: Plugin :: Kubernetes 15.2s SUCCESS
Camel :: Catalog :: Camel Report Maven Plugin 13.2s SUCCESS
Camel :: Diagram 13.0s SUCCESS
Camel :: Platform HTTP :: Main 12.3s SUCCESS
Camel :: Catalog :: Camel Route Parser 6.9s SUCCESS
Camel :: YAML DSL :: Deserializers 6.4s SUCCESS
Camel :: Catalog :: Suggest (deprecated) 6.1s SUCCESS
Camel :: All Components Sync point 5.1s SUCCESS
Camel :: YAML DSL :: Validator Maven Plugin 3.7s SUCCESS
Camel :: Micrometer :: Prometheus 2.6s SUCCESS
Camel :: Catalog :: Maven 2.1s SUCCESS
Camel :: YAML DSL :: Maven Plugins 2.0s SUCCESS
Camel :: Assembly 1.8s SUCCESS
Camel :: Coverage 1.4s SUCCESS
Camel :: DSL :: CLI Debug 1.3s SUCCESS
Camel :: Endpoint DSL :: Support 1.2s SUCCESS
Camel :: JBang :: Plugin :: MCP 1.2s SUCCESS
Camel :: JBang :: Plugin :: Generate 1.1s SUCCESS
Camel :: Catalog :: Dummy Component 0.9s SUCCESS
Camel :: JBang :: Plugin :: Edit 0.7s SUCCESS
Camel :: JBang :: Main 0.7s SUCCESS
Camel :: JBang :: Console 0.7s SUCCESS
Camel :: JBang :: Integration tests 0.7s SUCCESS
Camel :: Launcher :: Container 0.7s SUCCESS
Camel :: Catalog :: Console 0.5s SUCCESS
Camel :: All Core Sync point 0.4s SUCCESS
Camel :: Observability Services 0.4s SUCCESS
Camel :: Endpoint DSL n/a
Camel :: Integration Tests n/a
Camel :: JBang :: Core n/a
Camel :: JBang :: Plugin :: TUI n/a
Camel :: Launcher n/a

Top 20 slowest modules:

  • Camel :: DSL :: CLI Connector (56.7s)
  • Camel :: AI :: MCP Server (54.8s)
  • Camel :: JBang :: MCP (48.6s)
  • Camel :: Console (37.4s)
  • Camel :: JBang :: Plugin :: Validate (30.1s)
  • Camel :: Docs (29.2s)
  • Camel :: OAuth (28.7s)
  • Camel :: YAML DSL :: Validator (26.9s)
  • Camel :: YAML DSL (23.1s)
  • Camel :: Catalog :: Camel Catalog (18.8s)
  • Camel :: Component DSL (17.7s)
  • Camel :: JBang :: Plugin :: Testing (17.3s)
  • Camel :: Kamelet Main (16.1s)
  • Camel :: JBang :: Plugin :: Kubernetes (15.2s)
  • Camel :: Catalog :: Camel Report Maven Plugin (13.2s)
  • Camel :: Diagram (13.0s)
  • Camel :: Platform HTTP :: Main (12.3s)
  • Camel :: Catalog :: Camel Route Parser (6.9s)
  • Camel :: YAML DSL :: Deserializers (6.4s)
  • Camel :: Catalog :: Suggest (deprecated) (6.1s)

⚙️ View full build and test results

@davsclaus davsclaus left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good; CI is green. Tests and docs are present and older connectors are handled. Suggestion: in the MCP AuthoringTools (~L321-328) headers and variables are declared as Object, so they skip the McpSecurityInterceptor string checks (max length, control characters); applying the length limit to the jsonText(...) result would close that. Nit: in the core camel_eval_expression executor, Boolean.valueOf(predicate.strip()) turns e.g. yes into false silently. Note this conflicts with #28678 in ExpressionEvaluator.evaluateWith (keep this PR's signature and add the withoutCliConnector wrapper); whichever merges second needs a rebase.

Claude Code on behalf of davsclaus. This review was generated by an AI agent and may contain inaccuracies; please verify all suggestions before applying.

…ers, variables, resultType and predicate

camel_eval_expression took only the expression, language, body and integration name, so it could not evaluate an
expression the way the route runs it: an XPath function such as string(), local-name(), boolean() or count() failed
with "Can not convert #STRING to a NodeList!" (the xpath language gives nodes unless resultType says otherwise),
predicate mode was guessed for simple only, and a header or variable an earlier step sets was null. A headers
argument was silently ignored, and a local XPath that worked showed the class of its node list.

The tool (shared registry and MCP wrapper) now takes headers and variables (a JSON object, whose values keep their
JSON type, or key=value lines as camel_runtime_send takes headers), predicate for any language (simple keeps its
guess when it is absent) and resultType, a class name passed to the language as its resultType option as the
reifiers pass it. Locally they are set on the scratch exchange and the value is converted to String by the
context's type converter, as the integration does. In the integration the eval action carries them;
EvalLanguageDevConsole gets a resultType option and LocalCliConnector passes it on and keeps the JSON type of a
header or variable value. An integration before Camel 4.24 gets a list or object value as JSON text, and the answer
notes that it ignores resultType.

An XPath that fails with "Can not convert #STRING/#BOOLEAN/#NUMBER to a NodeList" gets a hint with the argument to
pass and the route form (resultType java.lang.String, predicate=true, java.lang.Integer); in the integration, where
the failed eval action is a tool error, the hint is appended to the error message.

camel-jbang-core gets camel-xpath, camel-groovy and camel-jq as test dependencies, so the tests evaluate them
locally without a download. The prompt budgets of the TUI AI panel are raised by the ~114 tokens of the four
arguments.
… the tool error of an integration before 4.24

An integration before Camel 4.24 refuses ${header.missing ?: 10}, and a failed
eval action is a tool error (CAMEL-25398), so the rewrite that CAMEL-26401 adds
to the answer never reached the model for the integration it was meant for. It
now goes with the error, as the XPath hint does.
@Croway
Croway force-pushed the CAMEL-26400-eval-headers-result-type branch from 510c6ef to 4b1703a Compare October 29, 2026 12:55
…s is held to the argument length limit, and a predicate is true or false

McpSecurityInterceptor checks the arguments that are strings; headers and
variables sent as a JSON object are not, so their JSON is now held to the same
max-argument-length. A predicate other than true or false (such as yes) is
refused instead of being taken for false.
@Croway

Croway commented Oct 29, 2026

Copy link
Copy Markdown
Contributor Author

Claude Code on behalf of Croway

Thanks for the review. Done in 2f9d51c:

@Croway
Croway requested a review from davsclaus October 29, 2026 12:59

@gnodet-bot gnodet-bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The new jsonText method looks correct. One minor observation on the catch block.

This review was generated by an AI agent, Hermès on behalf of @gnodet.

…/dsl/jbang/core/commands/mcp/AuthoringTools.java

Co-authored-by: Guillaume Nodet - AI Bot <gnodet+bot@gmail.com>

@gnodet-bot gnodet-bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Following up on my earlier review — the jsonText fallback nit is addressed (LOG.debug added in 355223f). Two new issues in EvalLanguageDevConsole from this push.

This review was generated by an AI agent, Hermès on behalf of @gnodet.

… an error instead of throwing

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Signed-off-by: Claus Ibsen <claus.ibsen@gmail.com>
@Croway
Croway merged commit 0bd7869 into apache:main Oct 29, 2026
7 checks passed
@Croway Croway added the enhancement New feature or request label Oct 29, 2026
@Croway Croway self-assigned this Oct 29, 2026
@Croway Croway added this to the 4.24.0 milestone Oct 29, 2026
@Croway
Croway deleted the CAMEL-26400-eval-headers-result-type branch October 29, 2026 16:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants