From 25cbaa45b836f356265f87bec827114f18c0d2b3 Mon Sep 17 00:00:00 2001
From: ValueOn AG
Date: Mon, 5 Jan 2026 01:36:39 +0100
Subject: [PATCH] fixed cut json handling
---
modules/shared/jsonUtils.py | 54 +++++++++++++++++++++++--------------
1 file changed, 34 insertions(+), 20 deletions(-)
diff --git a/modules/shared/jsonUtils.py b/modules/shared/jsonUtils.py
index 3c8e366f..d89b2f76 100644
--- a/modules/shared/jsonUtils.py
+++ b/modules/shared/jsonUtils.py
@@ -1397,44 +1397,58 @@ def buildIncompleteContext(jsonContent: str, breakPosition: int) -> str:
nextLevelStart = breakPosition
# Show opening structure for this level
- resultLines.append(f'{indent}{{' if levelType == 'object' else f'{indent}[')
- childIndent = indent + " "
-
- if isCutLevel:
- # Cut level: show cut piece
- if cutPiece:
+ # For cut level, check if cut piece already starts with bracket/brace - if so, don't duplicate
+ if isCutLevel and cutPiece:
+ cutPieceStripped = cutPiece.strip()
+ if (levelType == 'array' and cutPieceStripped.startswith('[')) or \
+ (levelType == 'object' and cutPieceStripped.startswith('{')):
+ # Cut piece already includes opening bracket, don't add it separately
+ # Use parent level's child indent (cut element is a child of parent, not a separate level)
+ if levelIndex > 0:
+ parentLevel = hierarchy[levelIndex - 1]
+ parentIndent = " " * parentLevel['depth']
+ childIndent = parentIndent + " "
+ else:
+ childIndent = indent + " "
for line in cutPiece.split('\n'):
stripped = line.strip()
if stripped:
resultLines.append(f'{childIndent}{stripped}')
resultLines[-1] += ' <-- CUT POINT (incomplete)'
else:
- resultLines.append(f'{childIndent}... <-- CUT POINT (incomplete)')
-
- elif isParentOfCutLevel and levelType == 'array':
- # Parent of cut level: show complete elements with budget
+ # Cut piece doesn't start with matching bracket, add opening structure
+ resultLines.append(f'{indent}{{' if levelType == 'object' else f'{indent}[')
+ childIndent = indent + " "
+ for line in cutPiece.split('\n'):
+ stripped = line.strip()
+ if stripped:
+ resultLines.append(f'{childIndent}{stripped}')
+ resultLines[-1] += ' <-- CUT POINT (incomplete)'
+ elif isCutLevel:
+ # Cut level but no cut piece - add opening structure
+ resultLines.append(f'{indent}{{' if levelType == 'object' else f'{indent}[')
+ childIndent = indent + " "
+ resultLines.append(f'{childIndent}... <-- CUT POINT (incomplete)')
+ elif isParentOfCutLevel:
+ # Parent of cut level: add opening structure, then show complete elements with budget
+ # Works for both arrays and objects
+ resultLines.append(f'{indent}{{' if levelType == 'object' else f'{indent}[')
+ childIndent = indent + " "
completeElements = _findCompleteElementsAtLevel(
jsonContent, levelStart, nextLevelStart, levelDepth
)
- print(f"DEBUG: Found {len(completeElements)} complete elements")
- print(f"DEBUG: Budget = {DATA_BUDGET}")
-
dataBudget = DATA_BUDGET
for elementStart, elementEnd in reversed(completeElements):
elementData = jsonContent[elementStart:elementEnd].strip()
elementSize = len(elementData)
- print(f"DEBUG: Element size = {elementSize}, remaining budget = {dataBudget}")
-
if elementSize == 0:
continue
if elementSize > dataBudget:
- print(f"DEBUG: Element too large, stopping")
break
- print(f"DEBUG: Adding element (size {elementSize})")
for line in elementData.split('\n'):
stripped = line.strip()
if stripped:
@@ -1443,14 +1457,14 @@ def buildIncompleteContext(jsonContent: str, breakPosition: int) -> str:
resultLines[-1] += ','
dataBudget -= elementSize
- print(f"DEBUG: Budget after decrement = {dataBudget}")
if dataBudget <= 0:
- print(f"DEBUG: Budget exhausted, stopping")
break
else:
- # Other parent levels: show path content (keys and values) leading to next level
+ # Other parent levels: add opening structure, then show path content
+ resultLines.append(f'{indent}{{' if levelType == 'object' else f'{indent}[')
+ childIndent = indent + " "
pathContent = jsonContent[levelStart + 1:nextLevelStart].strip()
if pathContent:
# Show all path content (structure is always shown, not truncated)