bpmnlint-plugin-camunda-compat 2.59.2 → 2.60.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bpmnlint-plugin-camunda-compat",
3
- "version": "2.59.2",
3
+ "version": "2.60.0",
4
4
  "description": "A bpmnlint plug-in for Camunda compatibility",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -15,10 +15,11 @@ const { annotateRule } = require('../helper');
15
15
  * or a part like `toolCallResult.statusCode`), a script task or called decision
16
16
  * `resultVariable`, or a connector `resultVariable`/`resultExpression` header.
17
17
  *
18
- * The rule warns once per tool: on the element that actually miswrote a
19
- * result-shaped variable, when the tool flow writes some but none of them is
20
- * `toolCallResult` (misdirection or wrong casing); on the entry activity when
21
- * the flow writes none at all, since there's no single offending element to
18
+ * When the tool flow writes result-shaped variables but none of them is
19
+ * `toolCallResult`, every miswrite is reported individually on the element
20
+ * that wrote it (misdirection or wrong casing), so each offending output row
21
+ * carries its own finding. When the flow writes none at all, the rule reports
22
+ * once on the entry activity, since there's no single offending element to
22
23
  * point to (the agent gets no completion signal and may retry or hallucinate
23
24
  * an outcome). Results written from arbitrary FEEL expressions are not
24
25
  * statically detectable.
@@ -47,26 +48,25 @@ module.exports = skipInNonExecutableProcess(function(config = {}) {
47
48
 
48
49
  const hasResult = channels.some(isToolCallResultChannel);
49
50
  if (!hasResult) {
50
- const casingMismatch = channels.find(isToolCallResultCasingMismatch);
51
-
52
- if (casingMismatch) {
53
- reportErrors(casingMismatch.element, reporter, {
54
- message: `Wrong casing "${getCasingMismatchText(casingMismatch)}": use toolCallResult (case-sensitive).`,
55
- data: { type: ERROR_TYPES.AGENT_TOOL_OUTPUT_KEY_CASING_INVALID },
56
- path: getChannelPath(casingMismatch),
57
- });
58
- return;
59
- }
60
51
 
61
52
  // Every channel here is a miswrite (none matched toolCallResult), so
62
- // the first one is a real misdirected write; report on the element
63
- // that actually wrote it, not the tool's entry.
64
- const misdirected = channels[ 0 ];
65
- reportErrors(misdirected.element, reporter, {
66
- message: '"toolCallResult" output is not mapped.',
67
- data: { type: ERROR_TYPES.AGENT_TOOL_OUTPUT_KEY_INVALID },
68
- path: getChannelPath(misdirected),
69
- });
53
+ // each is reported on the element that wrote it. A wrong-casing
54
+ // near-miss gets the more specific guidance.
55
+ for (const channel of channels) {
56
+ if (isToolCallResultCasingMismatch(channel)) {
57
+ reportErrors(channel.element, reporter, {
58
+ message: `Wrong casing "${getCasingMismatchText(channel)}": use toolCallResult (case-sensitive).`,
59
+ data: { type: ERROR_TYPES.AGENT_TOOL_OUTPUT_KEY_CASING_INVALID },
60
+ path: getChannelPath(channel),
61
+ });
62
+ } else {
63
+ reportErrors(channel.element, reporter, {
64
+ message: '"toolCallResult" output is not mapped.',
65
+ data: { type: ERROR_TYPES.AGENT_TOOL_OUTPUT_KEY_INVALID },
66
+ path: getChannelPath(channel),
67
+ });
68
+ }
69
+ }
70
70
  return;
71
71
  }
72
72