luigidemasi commented on code in PR #150:
URL: https://github.com/apache/camel-kit/pull/150#discussion_r4490318309
##########
kit/camel-kit-core/src/main/java/org/apache/camel/kit/ship/controller/ShipStageResult.java:
##########
@@ -280,6 +281,128 @@ private static void requireReport(String report) throws
IOException {
utf8(report, MAX_REPORT_BYTES, "stage report");
}
+ private static String extractJsonObject(String text) throws IOException {
+ if (text == null) {
+ return text;
+ }
+ String stripped = text.strip();
+ if (stripped.startsWith("{")) {
+ return stripped;
+ }
+ String fenced = extractFencedJson(text);
+ if (fenced != null) {
+ return fenced;
+ }
+ int start = text.indexOf('{');
+ int end = text.lastIndexOf('}');
+ if (start >= 0 && end > start) {
+ String prefix = text.substring(0, start).strip();
+ if (!prefix.isEmpty() && prefix.indexOf('[') >= 0) {
+ throw new IOException("Pi stage result is wrapped in an
array");
+ }
+ return text.substring(start, end + 1);
+ }
+ return stripped;
+ }
+
+ private static String extractFencedJson(String text) throws IOException {
+ String result = null;
+ int regionStart = -1;
+ int regionEnd = -1;
+ int pos = 0;
+ int len = text.length();
+
+ while (pos < len) {
+ int tick = text.indexOf("```", pos);
+ if (tick < 0) {
+ break;
+ }
+ if (tick > 0 && text.charAt(tick - 1) != '\n') {
+ pos = tick + 3;
+ continue;
+ }
+ int cur = tick + 3;
+ if (cur + 4 <= len && text.startsWith("json", cur)) {
+ cur += 4;
+ }
+ while (cur < len && (text.charAt(cur) == ' ' || text.charAt(cur)
== '\t')) {
+ cur++;
+ }
+ if (cur >= len || text.charAt(cur) != '\n') {
+ pos = tick + 3;
+ continue;
+ }
+ int contentStart = cur + 1;
+
+ int close = contentStart;
+ boolean found = false;
+ while (true) {
+ close = text.indexOf("\n```", close);
+ if (close < 0) {
+ break;
+ }
+ int afterClose = close + 4;
+ if (afterClose >= len || text.charAt(afterClose) == '\n') {
+ found = true;
+ break;
+ }
+ close = afterClose;
+ }
+ if (!found) {
+ break;
+ }
+
+ String content = text.substring(contentStart, close).strip();
+ int end = close + 4;
+ if (end < len && text.charAt(end) == '\n') {
+ end++;
+ }
+
+ if (content.startsWith("{") && content.endsWith("}")) {
+ if (result != null) {
+ throw new IOException("Pi stage result contains
conflicting fenced JSON envelopes");
+ }
+ result = content;
+ regionStart = tick;
+ regionEnd = end;
+ }
+ pos = end;
+ }
+
+ if (result == null) {
+ return null;
+ }
+ String before = text.substring(0, regionStart);
+ String after = text.substring(regionEnd);
+ if (hasBareJsonStart(before) || hasBareJsonStart(after)) {
+ throw new IOException("Pi stage result contains conflicting JSON
envelopes");
+ }
+ return result;
+ }
+
+ private static boolean hasBareJsonStart(String fragment) {
+ int i = 0;
+ int len = fragment.length();
+ while (i < len) {
+ char c = fragment.charAt(i);
+ if (c == '`') {
+ int j = i + 1;
+ while (j < len && fragment.charAt(j) != '`' &&
fragment.charAt(j) != '\n') {
+ j++;
+ }
+ if (j < len && fragment.charAt(j) == '`') {
+ i = j + 1;
+ continue;
Review Comment:
[P2] Check inline-code spans for conflicting stage envelopes
Skipping every backtick-delimited span also skips a complete corrected stage
result. After a valid fenced DESIGN result with `materialAmbiguity:false`,
append `Correction, use this instead:` and a one-line backtick-quoted envelope
containing `materialAmbiguity:true` and an unanswered question. This branch
skips that entire envelope and accepts the earlier result.
I reproduced the consequence through the real coordinator with its Pi RPC
fixture: DESIGN is completed with zero questions and PLAN gets one attempt
under SMART. The corrected envelope alone pauses with one question and zero
PLAN attempts; the base parser and `352b4589` reject the mixed response. This
is a remaining case of the ambiguity finding, not a claim that the fixture
completes or publishes a workflow.
Please retain the harmless inline `{"status":"ok"}` example without treating
every inline object as ignorable prose. Reject an additional stage-result
envelope regardless of Markdown quoting, and cover this inline correction in
the parser/coordinator regression tests.
_AI-generated by Codex on behalf of @luigidemasi._
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]