{
    "generatedAt": "2026-08-13T00:19:33+02:00",
    "baseline": {
        "commandsPass": 8,
        "commandsTokens": 310,
        "legacyTokens": 23803
    },
    "models": [
        {
            "modelKey": "gpt-oss-20b",
            "available": true,
            "cases": [
                {
                    "id": "A_move_one",
                    "instruction": "muévelo 10 mm a la derecha",
                    "response": {
                        "cInstruction": "muévelo 10 mm a la derecha",
                        "cProvider": "Ollama",
                        "cModelSelection": "Ollama — GPT-OSS 20B",
                        "cModel": "gpt-oss:20b",
                        "cRepresentation": "COMMANDS",
                        "cRawResponse": "{\"commands\":[{\"command\":\"move\",\"target\":\"selection\",\"dx\":10,\"dy\":0}]}",
                        "cThinking": "Need move selection. target selection. Output JSON.",
                        "cOllamaRequest": "{\"model\":\"gpt-oss:20b\",\"messages\":[{\"role\":\"system\",\"content\":\"Interpreta la instrucción y devuelve únicamente JSON válido con la forma {\\\"commands\\\":[{\\\"command\\\":\\\"setProperty\\\",\\\"target\\\":\\\"selection\\\" o {\\\"ids\\\":[\\\"id_real\\\"]},\\\"property\\\":\\\"propiedad_real\\\",\\\"value\\\":valor}]}. Cada comando DEBE usar la clave command (nunca type) y target. Comandos permitidos: setProperty, move, resize, delete, align, distribute, reorder, duplicate, tableMoveColumn, tableSetColumnWidth, tableInsertColumn, tableDeleteColumn, tableInsertLine, tableDeleteLine, tableMoveLine, tableSetLineHeight, tableSetLineBackground, tableSetLineBorderColor, tableSetLineBorderWidth, tableSetLinePadding, tableSetLineBorderRadius, tableSetLineBorderSide, tableSetLineVerticalSeparators, tableSetLineZebraEnabled, tableSetLineZebraColor, tableSetLineCondition, tableSetLineSuppressCondition, tableSetLineBackgroundColorFormula, tableSetLineBorderColorFormula. Prioridad: propiedad o estilo → setProperty; desplazamiento relativo → move; tamaño relativo → resize; alineación de varios objetos → align; eliminar objetos → delete. Para eliminar usa exactamente {\\\"command\\\":\\\"delete\\\",\\\"target\\\":\\\"selection\\\"}. Si se pide duplicar, reducir o cambiar el tamaño, devuelve únicamente resize y no uses setProperty para propiedades numéricas. Para setProperty usa exactamente property y value, nunca name ni valores como *2. Para move usa {\\\"command\\\":\\\"move\\\",\\\"target\\\":\\\"selection\\\",\\\"dx\\\":10,\\\"dy\\\":0}; para resize usa {\\\"command\\\":\\\"resize\\\",\\\"target\\\":\\\"selection\\\",\\\"scaleX\\\":0.5,\\\"scaleY\\\":0.5}. Para alinear usa exactamente {\\\"command\\\":\\\"align\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"left\\\"}; modos válidos: left|right|top|bottom|horizontalCenter|verticalCenter. Si la orden se refiere a los objetos seleccionados, usa target:\\\"selection\\\". No inventes IDs ni calcules coordenadas o dimensiones finales. Para distribuir usa exactamente {\\\"command\\\":\\\"distribute\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"horizontal\\\"}; modos válidos: horizontal|vertical. Para reordenar usa exactamente {\\\"command\\\":\\\"reorder\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"bringToFront\\\"}; modos válidos: bringToFront=traer al frente, sendToBack=enviar al fondo, bringForward=subir un nivel, sendBackward=bajar un nivel. Para duplicar usa exactamente {\\\"command\\\":\\\"duplicate\\\",\\\"target\\\":\\\"selection\\\"}. Para tablas usa únicamente estas formas: {\\\"command\\\":\\\"tableMoveColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"fromIndex\\\":2,\\\"toIndex\\\":0}, {\\\"command\\\":\\\"tableSetColumnWidth\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":0,\\\"width\\\":30}, {\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2}, {\\\"command\\\":\\\"tableDeleteColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2}, {\\\"command\\\":\\\"tableInsertLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":1}, {\\\"command\\\":\\\"tableDeleteLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":1}, {\\\"command\\\":\\\"tableMoveLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"fromIndex\\\":1,\\\"toIndex\\\":0}, {\\\"command\\\":\\\"tableSetLineHeight\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"height\\\":12}, {\\\"command\\\":\\\"tableSetLineBackground\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"color\\\":\\\"#d3d3d3\\\"}; section: header|groupHeader|detail|groupFooter|footer. Los índices son enteros cero-basados y no negativos. tableSetLineHeight usa altura fija en milímetros >=1. tableSetLineBackground usa únicamente color HEX fijo; no usa fórmulas ni paths privados. Insertar columna usa columnIndex como posición antes de la columna existente; si coincide con el número actual de columnas, añade al final. Insertar línea usa lineIndex como posición antes de la línea existente; si coincide con el número actual de líneas, añade al final. No uses hSections, aLines ni aCells. Semántica de líneas OBLIGATORIA: si una sección tiene una sola línea, basta mencionar la sección y usa lineIndex 0. Si tiene varias líneas, una operación estructural debe indicar la línea; si no la indica y no dice todas, devuelve EXACTAMENTE {\\\"commands\\\":[]}. Solo si dice todas las líneas genera una operación por cada línea existente. Esta regla no afecta a objetos visuales de celda, que siguen usando commands normales. Para cambiar altura o fondo fijo de una línea de TTable usa obligatoriamente tableSetLineHeight o tableSetLineBackground con section y lineIndex; no uses setProperty para esas operaciones. Shapes adicionales de línea: {\\\"command\\\":\\\"tableSetLineBorderColor\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"color\\\":\\\"#0000ff\\\"}, {\\\"command\\\":\\\"tableSetLineBorderWidth\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"width\\\":1}, {\\\"command\\\":\\\"tableSetLinePadding\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"side\\\":\\\"nTop\\\",\\\"value\\\":2}, {\\\"command\\\":\\\"tableSetLineBorderRadius\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"radius\\\":2}, {\\\"command\\\":\\\"tableSetLineBorderSide\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"side\\\":\\\"top\\\",\\\"visible\\\":true}, {\\\"command\\\":\\\"tableSetLineVerticalSeparators\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"visible\\\":true}, {\\\"command\\\":\\\"tableSetLineCondition\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"DETAIL.cantidad > 0\\\"}, {\\\"command\\\":\\\"tableSetLineSuppressCondition\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"DETAIL.importe == 0\\\"}, {\\\"command\\\":\\\"tableSetLineBackgroundColorFormula\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"IF(...)\\\"}, {\\\"command\\\":\\\"tableSetLineBorderColorFormula\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"IF(...)\\\"}. Las cuatro primitivas de fórmula reciben formula como string literal y aceptan string vacío para borrar; no evalúes ni cambies la sintaxis. Usa la primitiva específica según sea condición, supresión o fórmula de color; no uses paths hBorder, hBackground ni setProperty. Si la instrucción menciona una línea, cabecera, detalle o pie, el color de borde de esa línea usa tableSetLineBorderColor y nunca setProperty. Zebra solo existe en líneas detail. Shapes exactas: {\\\"command\\\":\\\"tableSetLineZebraEnabled\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"enabled\\\":true} y {\\\"command\\\":\\\"tableSetLineZebraColor\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"role\\\":\\\"odd\\\",\\\"color\\\":\\\"#d3d3d3\\\"}. Usa enabled booleano para activar o desactivar y role odd/even para filas impares/pares. No uses hZebraPattern ni paths privados. REGLA DE SCOPE OBLIGATORIA: estos, ellos, los seleccionados y pronombres equivalentes -> target:\\\"selection\\\". Todos, todas, todo el documento, todos los objetos o todos los objetos de un tipo -> target:{\\\"ids\\\":[...]} usando todos los cId coincidentes de DOCUMENTO_COMPLETO_SCOPE=global, incluidos objetos anidados en TTable. Si la selección está vacía, una orden global debe usar siempre ids. Para una orden global no uses target:\\\"selection\\\" ni mezcles ambos targets. También se permite create: {\\\"command\\\":\\\"create\\\",\\\"type\\\":\\\"TText\\\",\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\\\\\"texto\\\\\\\\\\\"\\\"}}. En create describe únicamente lo solicitado: incluye solo el tipo, contenido, posición y propiedades que la instrucción pida explícitamente; el diseñador completa los defaults reales. Tipos reales: TText,TRectangle,TEllipse,TImage,TLine,TBarcode,richText,TFormattedText,TTable. Properties solo editables, nunca cId, defaults, estructura interna ni geometría. position usa {\\\"x\\\":20,\\\"y\\\":30}. Para crear una tabla usa {\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"tabla1\\\",\\\"type\\\":\\\"TTable\\\"}; las primitives TTable posteriores pueden usar target:{\\\"ref\\\":\\\"tabla1\\\"}. Una TTable recién creada tiene las secciones vacías. Antes de insertar columnas o modificar una línea, crea esa línea con tableInsertLine. tableInsertLine crea siempre una línea válida con exactamente 1 columna inicial. SEMÁNTICA OBLIGATORIA DEL NÚMERO DE COLUMNAS: \\\"de N columnas\\\", \\\"con N columnas\\\" y \\\"que tenga N columnas\\\" expresan el TOTAL FINAL deseado; genera exactamente N menos las columnas actuales operaciones tableInsertColumn. Después de tableInsertLine ya hay 1 columna: para una línea de 4 columnas genera exactamente 3 tableInsertColumn y el total final es 4, nunca 4 inserciones. \\\"añade N columnas\\\", \\\"agrega N columnas\\\", \\\"inserta N columnas más\\\" y equivalentes explícitos expresan una CANTIDAD ADICIONAL; genera exactamente N tableInsertColumn. La fachada ejecuta literalmente esas inserciones y no corrige ni reinterpreta el número. Ejemplo total final 4: {\\\"commands\\\":[{\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"tabla1\\\",\\\"type\\\":\\\"TTable\\\"},{\\\"command\\\":\\\"tableInsertLine\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":1},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":3}]}. No envíes hSections, aLines ni aCells en create. Para crear contenido real en una celda usa {\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"txt1\\\",\\\"type\\\":\\\"TText\\\",\\\"targetCell\\\":{\\\"table\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"cellIndex\\\":0},\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\"Título\\\\\\\"\\\"}}; table admite \\\"selection\\\", {\\\"ids\\\":[\\\"id_real\\\"]} o {\\\"ref\\\":\\\"tabla1\\\"}. Tipos manuales admitidos en celda: TText,richText,TBarcode,TImage. Si la instrucción enumera contenidos o títulos, crea un objeto por cada literal en la celda correspondiente; no omitas esos contenidos. No uses position ni geometría para contenido de celda. Una ref es temporal dentro de esta respuesta: el create declara ref:\\\"new1\\\" y un comando posterior apunta al mismo objeto con target:{\\\"ref\\\":\\\"new1\\\"}. Ejemplo: {\\\"commands\\\":[{\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"new1\\\",\\\"type\\\":\\\"TText\\\",\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\\\\\"TOTAL\\\\\\\\\\\"\\\"}},{\\\"command\\\":\\\"resize\\\",\\\"target\\\":{\\\"ref\\\":\\\"new1\\\"},\\\"scaleX\\\":2,\\\"scaleY\\\":2}]}. PLANIFICACION INTERNA PARA INSTRUCCIONES COMPLEJAS: antes de devolver Commands, divide mentalmente la peticion en bloques visuales, asigna posiciones y tamanos aproximados, enumera todos los requisitos explicitos, ordena los commands por dependencias y revisa que no falte ningun requisito realizable. No devuelvas ni expliques este plan; la salida sigue siendo solo {\\\"commands\\\":[...]}. En disenos completos organiza conceptualmente cabecera superior, datos principales, bloque central, totales y pie cuando hayan sido pedidos y sean realizables. Cada objeto visual explicitamente solicitado requiere su propio create. Asigna position y, cuando proceda, move o resize a los objetos raiz; evita que sus cajas se solapen salvo peticion expresa. Crear contenido no sustituye sus estilos: incluye los colores, negrita, alineacion, tamano y fondo pedidos usando propiedades o commands ya disponibles. Para un objeto interno nuevo, incluye sus estilos en create.properties o declara ref en create y usa despues target:{\\\"ref\\\":\\\"...\\\"}; targetCell solo existe en create y nunca es target de setProperty. Todo texto fijo visible usa cText como expresion literal canonica entre comillas. Si se pide un formato y ya existe una sintaxis canonica disponible, usala sin inventar funciones. Si existe una referencia real claramente compatible con un dato solicitado, usala en vez de crear ese dato como literal. Si una columna debe ser mas ancha, incluye tableSetColumnWidth explicitamente. En planes largos prefiere: limpieza; contenedores; estructura; objetos internos; propiedades; geometria; estilos finales, salvo que una dependencia exija otro orden. Omite de forma segura solo lo que no pueda realizarse por falta de campos o capacidades. CTEXT CANONICO: texto fijo=\\\"\\\\\\\\\\\"FACTURA\\\\\\\\\\\"\\\"; campo=REFERENCIA_EXACTA; texto+campo=\\\"\\\\\\\\\\\"Factura: \\\\\\\\\\\"+REFERENCIA_EXACTA\\\"; formula=\\\"Transform(REFERENCIA_EXACTA,\\\\\\\\\\\"99/99/9999\\\\\\\\\\\")\\\". Para contenido de celda usa el mismo TText y la misma semantica. Usa exclusivamente referencias exactas de CAMPOS_Y_VARIABLES_DISPONIBLES; no inventes campos. Si la instruccion pide un dato/campo y no existe una referencia compatible, no conviertas su descripcion en texto fijo: omite esa parte o devuelve {\\\"commands\\\":[]}. En TTable, para CADA seccion usada, el orden obligatorio es: tableInsertLine; N-1 tableInsertColumn para obtener N columnas; despues los create.targetCell. El contenido header exige linea header y el contenido detail exige linea detail; antes de cellIndex K deben existir al menos K+1 columnas en esa misma linea. Nunca uses create.targetCell sobre una linea o celda inexistente. Para una celda vacia de una TTable existente seleccionada usa exactamente {\\\"command\\\":\\\"create\\\",\\\"type\\\":\\\"TText\\\",\\\"targetCell\\\":{\\\"table\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"cellIndex\\\":K},\\\"properties\\\":{\\\"cText\\\":\\\"REFERENCIA_EXACTA\\\"}}. Para una TTable existente identificada table puede ser {\\\"ids\\\":[\\\"id_real\\\"]}; nunca uses {\\\"cId\\\":\\\"...\\\"}. Para una tabla creada en ESTA respuesta, todas las estructuras y targetCell.table usan siempre {\\\"ref\\\":\\\"tabla1\\\"}, nunca \\\"selection\\\". Una lista de N nombres de columnas son N titulos fijos TText de header con cText=\\\"\\\\\\\\\\\"TITULO\\\\\\\\\\\"\\\"; si ademas se piden sus campos o campos disponibles, crea header Y detail, cada seccion con su tableInsertLine y exactamente N-1 inserciones, y despues N TText por seccion. Esquema minimo de dos secciones y dos columnas: create TTable ref tabla1; tableInsertLine header; tableInsertColumn header columnIndex 1; tableInsertLine detail; tableInsertColumn detail columnIndex 1; despues create.targetCell header 0 y 1, y detail 0 y 1, todos con table:{\\\"ref\\\":\\\"tabla1\\\"}. Alinear el contenido o texto a izquierda/centro/derecha usa setProperty con property:\\\"cTextAlign\\\" y value:\\\"left\\\"|\\\"center\\\"|\\\"right\\\"; align se reserva para alinear geometricamente varios objetos.\"},{\"role\":\"user\",\"content\":\"SELECCION_ACTUAL_SCOPE=selection:\\n[]\\nDOCUMENTO_COMPLETO_SCOPE=global:\\n[]\\nGLOBAL_COUNTS:\\nGLOBAL_IDS_BY_TYPE:\\nPROPIEDADES COMUNES EDITABLES: cBackgroundColor:string=Dimensiones y Color / Color de fondo,cBorderColor:string=Borde / Color,cCondition:string,cFillColor2:string,cFillColor3:string,cFillStyle:string,cFontFamily:string,cShadowColor:string,cText:string,cTextAlign:string,cTextColor:string=Texto / Color,cTextFitMode:string,cTextVerticalAlign:string,lAllowPageBreak:boolean,lBorderBottom:boolean,lBorderLeft:boolean,lBorderRight:boolean,lBorderTop:boolean,lFontBold:boolean=Texto / Negrita,lFontItalic:boolean=Texto / Cursiva,lFontStrikeout:boolean,lFontUnderline:boolean,lForceWrap:boolean,lKeepEmptyParagraphs:boolean,lLocked:boolean,lTextAdjusted:boolean,lTextWrap:boolean,lTrimSpaces:boolean,lVisible:boolean,nBorderWidth:number,nFillOpacity:number,nFontSize:number=Texto / Tamaño,nLayerId:number,nLineSpacing:number,nOpacity:number=Transformación / Opacidad,nPaddingBottom:number,nPaddingLeft:number,nPaddingRight:number,nPaddingTop:number,nParagraphSpacing:number,nRotation:number,nRounded:number,nShadowSize:number,nShadowTransparency:number,nTextDecimalPosition:number,nTextOpacity:number,nZIndex:number\\nCOLORES CANÓNICOS: rojo:#ff0000 · verde:#008000 · verde oscuro:#006400 · azul:#0000ff · azul oscuro:#00008b · amarillo:#ffff00 · gris claro:#d3d3d3\\nCAMPOS_Y_VARIABLES_DISPONIBLES\\nTIPOS:C=texto,N=numero,D=fecha,I=imagen,M=memo,L=booleano\\n\\nINSTRUCCIÓN:\\nmuévelo 10 mm a la derecha\"}],\"stream\":false,\"format\":\"json\",\"keep_alive\":-1,\"options\":{\"temperature\":0,\"top_p\":1,\"top_k\":0,\"repeat_penalty\":1.1,\"frequency_penalty\":0,\"presence_penalty\":0,\"num_ctx\":65536,\"num_batch\":4096,\"num_thread\":10,\"num_gpu\":99,\"num_predict\":4096},\"think\":\"low\"}",
                        "cHttpBody": "{\"model\":\"gpt-oss:20b\",\"created_at\":\"2026-08-12T22:19:53.8115514Z\",\"message\":{\"role\":\"assistant\",\"content\":\"{\\\"commands\\\":[{\\\"command\\\":\\\"move\\\",\\\"target\\\":\\\"selection\\\",\\\"dx\\\":10,\\\"dy\\\":0}]}\",\"thinking\":\"Need move selection. target selection. Output JSON.\"},\"done\":true,\"done_reason\":\"stop\",\"total_duration\":20150409000,\"load_duration\":200653100,\"prompt_eval_count\":3668,\"prompt_eval_duration\":97063000,\"eval_count\":22,\"eval_duration\":275748000}",
                        "hMetrics": {
                            "total_duration": 20150409000,
                            "load_duration": 200653100,
                            "prompt_eval_count": 3668,
                            "prompt_eval_duration": 97063000,
                            "eval_count": 22,
                            "eval_duration": 275748000,
                            "unattributed_duration": 19576944900
                        },
                        "hCommands": {
                            "commands": [
                                {
                                    "command": "move",
                                    "target": "selection",
                                    "dx": 10,
                                    "dy": 0
                                }
                            ]
                        },
                        "lValid": true,
                        "nCreates": 0,
                        "nChanges": 0,
                        "nDeletes": 0,
                        "nStructures": 0,
                        "nGeneratedIds": 0,
                        "nOperations": 1,
                        "nFinalOperations": 1,
                        "cValidation": "Shape commands válida; validación de ejecución pendiente",
                        "nResponseMilliseconds": 20163.051,
                        "tRequestStartedAt": "2026-08-13T00:19:33.650333+02:00",
                        "tResponseFinishedAt": "2026-08-13T00:19:53.813401+02:00",
                        "hPromptDiagnostics": {
                            "nSystemCharacters": 13534,
                            "nUserCharacters": 1495,
                            "nPromptCharacters": 15030,
                            "nPromptCharactersBeforeFields": 12839,
                            "nFieldsCharacters": 88,
                            "nPromptTokensBeforeEstimated": 3210,
                            "nPromptTokensAfterEstimated": 3758,
                            "nContextTokens": 65536,
                            "lPromptFitsContext": true,
                            "hFields": {
                                "nGroups": 0,
                                "nFields": 0,
                                "nUserVariables": 0,
                                "nAccumulators": 0
                            }
                        }
                    },
                    "commands": [
                        {
                            "command": "move",
                            "target": "selection",
                            "dx": 10,
                            "dy": 0
                        }
                    ],
                    "valid": true
                },
                {
                    "id": "B_move_many",
                    "instruction": "muévelos 5 mm abajo",
                    "response": {
                        "cInstruction": "muévelos 5 mm abajo",
                        "cProvider": "Ollama",
                        "cModelSelection": "Ollama — GPT-OSS 20B",
                        "cModel": "gpt-oss:20b",
                        "cRepresentation": "COMMANDS",
                        "cRawResponse": "{\"commands\":[{\"command\":\"move\",\"target\":\"selection\",\"dx\":0,\"dy\":5}]}",
                        "cThinking": "Need move selection down 5mm. Use move command with dy:5. Output JSON.",
                        "cOllamaRequest": "{\"model\":\"gpt-oss:20b\",\"messages\":[{\"role\":\"system\",\"content\":\"Interpreta la instrucción y devuelve únicamente JSON válido con la forma {\\\"commands\\\":[{\\\"command\\\":\\\"setProperty\\\",\\\"target\\\":\\\"selection\\\" o {\\\"ids\\\":[\\\"id_real\\\"]},\\\"property\\\":\\\"propiedad_real\\\",\\\"value\\\":valor}]}. Cada comando DEBE usar la clave command (nunca type) y target. Comandos permitidos: setProperty, move, resize, delete, align, distribute, reorder, duplicate, tableMoveColumn, tableSetColumnWidth, tableInsertColumn, tableDeleteColumn, tableInsertLine, tableDeleteLine, tableMoveLine, tableSetLineHeight, tableSetLineBackground, tableSetLineBorderColor, tableSetLineBorderWidth, tableSetLinePadding, tableSetLineBorderRadius, tableSetLineBorderSide, tableSetLineVerticalSeparators, tableSetLineZebraEnabled, tableSetLineZebraColor, tableSetLineCondition, tableSetLineSuppressCondition, tableSetLineBackgroundColorFormula, tableSetLineBorderColorFormula. Prioridad: propiedad o estilo → setProperty; desplazamiento relativo → move; tamaño relativo → resize; alineación de varios objetos → align; eliminar objetos → delete. Para eliminar usa exactamente {\\\"command\\\":\\\"delete\\\",\\\"target\\\":\\\"selection\\\"}. Si se pide duplicar, reducir o cambiar el tamaño, devuelve únicamente resize y no uses setProperty para propiedades numéricas. Para setProperty usa exactamente property y value, nunca name ni valores como *2. Para move usa {\\\"command\\\":\\\"move\\\",\\\"target\\\":\\\"selection\\\",\\\"dx\\\":10,\\\"dy\\\":0}; para resize usa {\\\"command\\\":\\\"resize\\\",\\\"target\\\":\\\"selection\\\",\\\"scaleX\\\":0.5,\\\"scaleY\\\":0.5}. Para alinear usa exactamente {\\\"command\\\":\\\"align\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"left\\\"}; modos válidos: left|right|top|bottom|horizontalCenter|verticalCenter. Si la orden se refiere a los objetos seleccionados, usa target:\\\"selection\\\". No inventes IDs ni calcules coordenadas o dimensiones finales. Para distribuir usa exactamente {\\\"command\\\":\\\"distribute\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"horizontal\\\"}; modos válidos: horizontal|vertical. Para reordenar usa exactamente {\\\"command\\\":\\\"reorder\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"bringToFront\\\"}; modos válidos: bringToFront=traer al frente, sendToBack=enviar al fondo, bringForward=subir un nivel, sendBackward=bajar un nivel. Para duplicar usa exactamente {\\\"command\\\":\\\"duplicate\\\",\\\"target\\\":\\\"selection\\\"}. Para tablas usa únicamente estas formas: {\\\"command\\\":\\\"tableMoveColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"fromIndex\\\":2,\\\"toIndex\\\":0}, {\\\"command\\\":\\\"tableSetColumnWidth\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":0,\\\"width\\\":30}, {\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2}, {\\\"command\\\":\\\"tableDeleteColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2}, {\\\"command\\\":\\\"tableInsertLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":1}, {\\\"command\\\":\\\"tableDeleteLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":1}, {\\\"command\\\":\\\"tableMoveLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"fromIndex\\\":1,\\\"toIndex\\\":0}, {\\\"command\\\":\\\"tableSetLineHeight\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"height\\\":12}, {\\\"command\\\":\\\"tableSetLineBackground\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"color\\\":\\\"#d3d3d3\\\"}; section: header|groupHeader|detail|groupFooter|footer. Los índices son enteros cero-basados y no negativos. tableSetLineHeight usa altura fija en milímetros >=1. tableSetLineBackground usa únicamente color HEX fijo; no usa fórmulas ni paths privados. Insertar columna usa columnIndex como posición antes de la columna existente; si coincide con el número actual de columnas, añade al final. Insertar línea usa lineIndex como posición antes de la línea existente; si coincide con el número actual de líneas, añade al final. No uses hSections, aLines ni aCells. Semántica de líneas OBLIGATORIA: si una sección tiene una sola línea, basta mencionar la sección y usa lineIndex 0. Si tiene varias líneas, una operación estructural debe indicar la línea; si no la indica y no dice todas, devuelve EXACTAMENTE {\\\"commands\\\":[]}. Solo si dice todas las líneas genera una operación por cada línea existente. Esta regla no afecta a objetos visuales de celda, que siguen usando commands normales. Para cambiar altura o fondo fijo de una línea de TTable usa obligatoriamente tableSetLineHeight o tableSetLineBackground con section y lineIndex; no uses setProperty para esas operaciones. Shapes adicionales de línea: {\\\"command\\\":\\\"tableSetLineBorderColor\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"color\\\":\\\"#0000ff\\\"}, {\\\"command\\\":\\\"tableSetLineBorderWidth\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"width\\\":1}, {\\\"command\\\":\\\"tableSetLinePadding\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"side\\\":\\\"nTop\\\",\\\"value\\\":2}, {\\\"command\\\":\\\"tableSetLineBorderRadius\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"radius\\\":2}, {\\\"command\\\":\\\"tableSetLineBorderSide\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"side\\\":\\\"top\\\",\\\"visible\\\":true}, {\\\"command\\\":\\\"tableSetLineVerticalSeparators\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"visible\\\":true}, {\\\"command\\\":\\\"tableSetLineCondition\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"DETAIL.cantidad > 0\\\"}, {\\\"command\\\":\\\"tableSetLineSuppressCondition\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"DETAIL.importe == 0\\\"}, {\\\"command\\\":\\\"tableSetLineBackgroundColorFormula\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"IF(...)\\\"}, {\\\"command\\\":\\\"tableSetLineBorderColorFormula\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"IF(...)\\\"}. Las cuatro primitivas de fórmula reciben formula como string literal y aceptan string vacío para borrar; no evalúes ni cambies la sintaxis. Usa la primitiva específica según sea condición, supresión o fórmula de color; no uses paths hBorder, hBackground ni setProperty. Si la instrucción menciona una línea, cabecera, detalle o pie, el color de borde de esa línea usa tableSetLineBorderColor y nunca setProperty. Zebra solo existe en líneas detail. Shapes exactas: {\\\"command\\\":\\\"tableSetLineZebraEnabled\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"enabled\\\":true} y {\\\"command\\\":\\\"tableSetLineZebraColor\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"role\\\":\\\"odd\\\",\\\"color\\\":\\\"#d3d3d3\\\"}. Usa enabled booleano para activar o desactivar y role odd/even para filas impares/pares. No uses hZebraPattern ni paths privados. REGLA DE SCOPE OBLIGATORIA: estos, ellos, los seleccionados y pronombres equivalentes -> target:\\\"selection\\\". Todos, todas, todo el documento, todos los objetos o todos los objetos de un tipo -> target:{\\\"ids\\\":[...]} usando todos los cId coincidentes de DOCUMENTO_COMPLETO_SCOPE=global, incluidos objetos anidados en TTable. Si la selección está vacía, una orden global debe usar siempre ids. Para una orden global no uses target:\\\"selection\\\" ni mezcles ambos targets. También se permite create: {\\\"command\\\":\\\"create\\\",\\\"type\\\":\\\"TText\\\",\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\\\\\"texto\\\\\\\\\\\"\\\"}}. En create describe únicamente lo solicitado: incluye solo el tipo, contenido, posición y propiedades que la instrucción pida explícitamente; el diseñador completa los defaults reales. Tipos reales: TText,TRectangle,TEllipse,TImage,TLine,TBarcode,richText,TFormattedText,TTable. Properties solo editables, nunca cId, defaults, estructura interna ni geometría. position usa {\\\"x\\\":20,\\\"y\\\":30}. Para crear una tabla usa {\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"tabla1\\\",\\\"type\\\":\\\"TTable\\\"}; las primitives TTable posteriores pueden usar target:{\\\"ref\\\":\\\"tabla1\\\"}. Una TTable recién creada tiene las secciones vacías. Antes de insertar columnas o modificar una línea, crea esa línea con tableInsertLine. tableInsertLine crea siempre una línea válida con exactamente 1 columna inicial. SEMÁNTICA OBLIGATORIA DEL NÚMERO DE COLUMNAS: \\\"de N columnas\\\", \\\"con N columnas\\\" y \\\"que tenga N columnas\\\" expresan el TOTAL FINAL deseado; genera exactamente N menos las columnas actuales operaciones tableInsertColumn. Después de tableInsertLine ya hay 1 columna: para una línea de 4 columnas genera exactamente 3 tableInsertColumn y el total final es 4, nunca 4 inserciones. \\\"añade N columnas\\\", \\\"agrega N columnas\\\", \\\"inserta N columnas más\\\" y equivalentes explícitos expresan una CANTIDAD ADICIONAL; genera exactamente N tableInsertColumn. La fachada ejecuta literalmente esas inserciones y no corrige ni reinterpreta el número. Ejemplo total final 4: {\\\"commands\\\":[{\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"tabla1\\\",\\\"type\\\":\\\"TTable\\\"},{\\\"command\\\":\\\"tableInsertLine\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":1},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":3}]}. No envíes hSections, aLines ni aCells en create. Para crear contenido real en una celda usa {\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"txt1\\\",\\\"type\\\":\\\"TText\\\",\\\"targetCell\\\":{\\\"table\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"cellIndex\\\":0},\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\"Título\\\\\\\"\\\"}}; table admite \\\"selection\\\", {\\\"ids\\\":[\\\"id_real\\\"]} o {\\\"ref\\\":\\\"tabla1\\\"}. Tipos manuales admitidos en celda: TText,richText,TBarcode,TImage. Si la instrucción enumera contenidos o títulos, crea un objeto por cada literal en la celda correspondiente; no omitas esos contenidos. No uses position ni geometría para contenido de celda. Una ref es temporal dentro de esta respuesta: el create declara ref:\\\"new1\\\" y un comando posterior apunta al mismo objeto con target:{\\\"ref\\\":\\\"new1\\\"}. Ejemplo: {\\\"commands\\\":[{\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"new1\\\",\\\"type\\\":\\\"TText\\\",\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\\\\\"TOTAL\\\\\\\\\\\"\\\"}},{\\\"command\\\":\\\"resize\\\",\\\"target\\\":{\\\"ref\\\":\\\"new1\\\"},\\\"scaleX\\\":2,\\\"scaleY\\\":2}]}. PLANIFICACION INTERNA PARA INSTRUCCIONES COMPLEJAS: antes de devolver Commands, divide mentalmente la peticion en bloques visuales, asigna posiciones y tamanos aproximados, enumera todos los requisitos explicitos, ordena los commands por dependencias y revisa que no falte ningun requisito realizable. No devuelvas ni expliques este plan; la salida sigue siendo solo {\\\"commands\\\":[...]}. En disenos completos organiza conceptualmente cabecera superior, datos principales, bloque central, totales y pie cuando hayan sido pedidos y sean realizables. Cada objeto visual explicitamente solicitado requiere su propio create. Asigna position y, cuando proceda, move o resize a los objetos raiz; evita que sus cajas se solapen salvo peticion expresa. Crear contenido no sustituye sus estilos: incluye los colores, negrita, alineacion, tamano y fondo pedidos usando propiedades o commands ya disponibles. Para un objeto interno nuevo, incluye sus estilos en create.properties o declara ref en create y usa despues target:{\\\"ref\\\":\\\"...\\\"}; targetCell solo existe en create y nunca es target de setProperty. Todo texto fijo visible usa cText como expresion literal canonica entre comillas. Si se pide un formato y ya existe una sintaxis canonica disponible, usala sin inventar funciones. Si existe una referencia real claramente compatible con un dato solicitado, usala en vez de crear ese dato como literal. Si una columna debe ser mas ancha, incluye tableSetColumnWidth explicitamente. En planes largos prefiere: limpieza; contenedores; estructura; objetos internos; propiedades; geometria; estilos finales, salvo que una dependencia exija otro orden. Omite de forma segura solo lo que no pueda realizarse por falta de campos o capacidades. CTEXT CANONICO: texto fijo=\\\"\\\\\\\\\\\"FACTURA\\\\\\\\\\\"\\\"; campo=REFERENCIA_EXACTA; texto+campo=\\\"\\\\\\\\\\\"Factura: \\\\\\\\\\\"+REFERENCIA_EXACTA\\\"; formula=\\\"Transform(REFERENCIA_EXACTA,\\\\\\\\\\\"99/99/9999\\\\\\\\\\\")\\\". Para contenido de celda usa el mismo TText y la misma semantica. Usa exclusivamente referencias exactas de CAMPOS_Y_VARIABLES_DISPONIBLES; no inventes campos. Si la instruccion pide un dato/campo y no existe una referencia compatible, no conviertas su descripcion en texto fijo: omite esa parte o devuelve {\\\"commands\\\":[]}. En TTable, para CADA seccion usada, el orden obligatorio es: tableInsertLine; N-1 tableInsertColumn para obtener N columnas; despues los create.targetCell. El contenido header exige linea header y el contenido detail exige linea detail; antes de cellIndex K deben existir al menos K+1 columnas en esa misma linea. Nunca uses create.targetCell sobre una linea o celda inexistente. Para una celda vacia de una TTable existente seleccionada usa exactamente {\\\"command\\\":\\\"create\\\",\\\"type\\\":\\\"TText\\\",\\\"targetCell\\\":{\\\"table\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"cellIndex\\\":K},\\\"properties\\\":{\\\"cText\\\":\\\"REFERENCIA_EXACTA\\\"}}. Para una TTable existente identificada table puede ser {\\\"ids\\\":[\\\"id_real\\\"]}; nunca uses {\\\"cId\\\":\\\"...\\\"}. Para una tabla creada en ESTA respuesta, todas las estructuras y targetCell.table usan siempre {\\\"ref\\\":\\\"tabla1\\\"}, nunca \\\"selection\\\". Una lista de N nombres de columnas son N titulos fijos TText de header con cText=\\\"\\\\\\\\\\\"TITULO\\\\\\\\\\\"\\\"; si ademas se piden sus campos o campos disponibles, crea header Y detail, cada seccion con su tableInsertLine y exactamente N-1 inserciones, y despues N TText por seccion. Esquema minimo de dos secciones y dos columnas: create TTable ref tabla1; tableInsertLine header; tableInsertColumn header columnIndex 1; tableInsertLine detail; tableInsertColumn detail columnIndex 1; despues create.targetCell header 0 y 1, y detail 0 y 1, todos con table:{\\\"ref\\\":\\\"tabla1\\\"}. Alinear el contenido o texto a izquierda/centro/derecha usa setProperty con property:\\\"cTextAlign\\\" y value:\\\"left\\\"|\\\"center\\\"|\\\"right\\\"; align se reserva para alinear geometricamente varios objetos.\"},{\"role\":\"user\",\"content\":\"SELECCION_ACTUAL_SCOPE=selection:\\n[]\\nDOCUMENTO_COMPLETO_SCOPE=global:\\n[]\\nGLOBAL_COUNTS:\\nGLOBAL_IDS_BY_TYPE:\\nPROPIEDADES COMUNES EDITABLES: cBackgroundColor:string=Dimensiones y Color / Color de fondo,cBorderColor:string=Borde / Color,cCondition:string,cFillColor2:string,cFillColor3:string,cFillStyle:string,cShadowColor:string,lBorderBottom:boolean,lBorderLeft:boolean,lBorderRight:boolean,lBorderTop:boolean,lLocked:boolean,lVisible:boolean,nBorderWidth:number,nFillOpacity:number,nLayerId:number,nOpacity:number=Transformación / Opacidad,nPaddingBottom:number,nPaddingLeft:number,nPaddingRight:number,nPaddingTop:number,nRotation:number,nRounded:number,nShadowSize:number,nShadowTransparency:number,nZIndex:number\\nCOLORES CANÓNICOS: rojo:#ff0000 · verde:#008000 · verde oscuro:#006400 · azul:#0000ff · azul oscuro:#00008b · amarillo:#ffff00 · gris claro:#d3d3d3\\nCAMPOS_Y_VARIABLES_DISPONIBLES\\nTIPOS:C=texto,N=numero,D=fecha,I=imagen,M=memo,L=booleano\\n\\nINSTRUCCIÓN:\\nmuévelos 5 mm abajo\"}],\"stream\":false,\"format\":\"json\",\"keep_alive\":-1,\"options\":{\"temperature\":0,\"top_p\":1,\"top_k\":0,\"repeat_penalty\":1.1,\"frequency_penalty\":0,\"presence_penalty\":0,\"num_ctx\":65536,\"num_batch\":4096,\"num_thread\":10,\"num_gpu\":99,\"num_predict\":4096},\"think\":\"low\"}",
                        "cHttpBody": "{\"model\":\"gpt-oss:20b\",\"created_at\":\"2026-08-12T22:19:56.0862749Z\",\"message\":{\"role\":\"assistant\",\"content\":\"{\\\"commands\\\":[{\\\"command\\\":\\\"move\\\",\\\"target\\\":\\\"selection\\\",\\\"dx\\\":0,\\\"dy\\\":5}]}\",\"thinking\":\"Need move selection down 5mm. Use move command with dy:5. Output JSON.\"},\"done\":true,\"done_reason\":\"stop\",\"total_duration\":2257980900,\"load_duration\":208737200,\"prompt_eval_count\":3564,\"prompt_eval_duration\":79137000,\"eval_count\":22,\"eval_duration\":276235000}",
                        "hMetrics": {
                            "total_duration": 2257980900,
                            "load_duration": 208737200,
                            "prompt_eval_count": 3564,
                            "prompt_eval_duration": 79137000,
                            "eval_count": 22,
                            "eval_duration": 276235000,
                            "unattributed_duration": 1693871700
                        },
                        "hCommands": {
                            "commands": [
                                {
                                    "command": "move",
                                    "target": "selection",
                                    "dx": 0,
                                    "dy": 5
                                }
                            ]
                        },
                        "lValid": true,
                        "nCreates": 0,
                        "nChanges": 0,
                        "nDeletes": 0,
                        "nStructures": 0,
                        "nGeneratedIds": 0,
                        "nOperations": 1,
                        "nFinalOperations": 1,
                        "cValidation": "Shape commands válida; validación de ejecución pendiente",
                        "nResponseMilliseconds": 2273.822,
                        "tRequestStartedAt": "2026-08-13T00:19:53.814379+02:00",
                        "tResponseFinishedAt": "2026-08-13T00:19:56.088218+02:00",
                        "hPromptDiagnostics": {
                            "nSystemCharacters": 13534,
                            "nUserCharacters": 987,
                            "nPromptCharacters": 14522,
                            "nPromptCharactersBeforeFields": 12331,
                            "nFieldsCharacters": 88,
                            "nPromptTokensBeforeEstimated": 3083,
                            "nPromptTokensAfterEstimated": 3631,
                            "nContextTokens": 65536,
                            "lPromptFitsContext": true,
                            "hFields": {
                                "nGroups": 0,
                                "nFields": 0,
                                "nUserVariables": 0,
                                "nAccumulators": 0
                            }
                        }
                    },
                    "commands": [
                        {
                            "command": "move",
                            "target": "selection",
                            "dx": 0,
                            "dy": 5
                        }
                    ],
                    "valid": true
                },
                {
                    "id": "C_half",
                    "instruction": "hazlo a la mitad",
                    "response": {
                        "cInstruction": "hazlo a la mitad",
                        "cProvider": "Ollama",
                        "cModelSelection": "Ollama — GPT-OSS 20B",
                        "cModel": "gpt-oss:20b",
                        "cRepresentation": "COMMANDS",
                        "cRawResponse": "{\"commands\":[{\"command\":\"resize\",\"target\":\"selection\",\"scaleX\":0.5,\"scaleY\":0.5}]}",
                        "cThinking": "Need to output JSON commands. Instruction: \"hazlo a la mitad\" unclear context. Probably means scale selection by half? So use resize with scaleX 0.5, scaleY 0.5 on selection. Output accordingly.",
                        "cOllamaRequest": "{\"model\":\"gpt-oss:20b\",\"messages\":[{\"role\":\"system\",\"content\":\"Interpreta la instrucción y devuelve únicamente JSON válido con la forma {\\\"commands\\\":[{\\\"command\\\":\\\"setProperty\\\",\\\"target\\\":\\\"selection\\\" o {\\\"ids\\\":[\\\"id_real\\\"]},\\\"property\\\":\\\"propiedad_real\\\",\\\"value\\\":valor}]}. Cada comando DEBE usar la clave command (nunca type) y target. Comandos permitidos: setProperty, move, resize, delete, align, distribute, reorder, duplicate, tableMoveColumn, tableSetColumnWidth, tableInsertColumn, tableDeleteColumn, tableInsertLine, tableDeleteLine, tableMoveLine, tableSetLineHeight, tableSetLineBackground, tableSetLineBorderColor, tableSetLineBorderWidth, tableSetLinePadding, tableSetLineBorderRadius, tableSetLineBorderSide, tableSetLineVerticalSeparators, tableSetLineZebraEnabled, tableSetLineZebraColor, tableSetLineCondition, tableSetLineSuppressCondition, tableSetLineBackgroundColorFormula, tableSetLineBorderColorFormula. Prioridad: propiedad o estilo → setProperty; desplazamiento relativo → move; tamaño relativo → resize; alineación de varios objetos → align; eliminar objetos → delete. Para eliminar usa exactamente {\\\"command\\\":\\\"delete\\\",\\\"target\\\":\\\"selection\\\"}. Si se pide duplicar, reducir o cambiar el tamaño, devuelve únicamente resize y no uses setProperty para propiedades numéricas. Para setProperty usa exactamente property y value, nunca name ni valores como *2. Para move usa {\\\"command\\\":\\\"move\\\",\\\"target\\\":\\\"selection\\\",\\\"dx\\\":10,\\\"dy\\\":0}; para resize usa {\\\"command\\\":\\\"resize\\\",\\\"target\\\":\\\"selection\\\",\\\"scaleX\\\":0.5,\\\"scaleY\\\":0.5}. Para alinear usa exactamente {\\\"command\\\":\\\"align\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"left\\\"}; modos válidos: left|right|top|bottom|horizontalCenter|verticalCenter. Si la orden se refiere a los objetos seleccionados, usa target:\\\"selection\\\". No inventes IDs ni calcules coordenadas o dimensiones finales. Para distribuir usa exactamente {\\\"command\\\":\\\"distribute\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"horizontal\\\"}; modos válidos: horizontal|vertical. Para reordenar usa exactamente {\\\"command\\\":\\\"reorder\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"bringToFront\\\"}; modos válidos: bringToFront=traer al frente, sendToBack=enviar al fondo, bringForward=subir un nivel, sendBackward=bajar un nivel. Para duplicar usa exactamente {\\\"command\\\":\\\"duplicate\\\",\\\"target\\\":\\\"selection\\\"}. Para tablas usa únicamente estas formas: {\\\"command\\\":\\\"tableMoveColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"fromIndex\\\":2,\\\"toIndex\\\":0}, {\\\"command\\\":\\\"tableSetColumnWidth\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":0,\\\"width\\\":30}, {\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2}, {\\\"command\\\":\\\"tableDeleteColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2}, {\\\"command\\\":\\\"tableInsertLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":1}, {\\\"command\\\":\\\"tableDeleteLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":1}, {\\\"command\\\":\\\"tableMoveLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"fromIndex\\\":1,\\\"toIndex\\\":0}, {\\\"command\\\":\\\"tableSetLineHeight\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"height\\\":12}, {\\\"command\\\":\\\"tableSetLineBackground\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"color\\\":\\\"#d3d3d3\\\"}; section: header|groupHeader|detail|groupFooter|footer. Los índices son enteros cero-basados y no negativos. tableSetLineHeight usa altura fija en milímetros >=1. tableSetLineBackground usa únicamente color HEX fijo; no usa fórmulas ni paths privados. Insertar columna usa columnIndex como posición antes de la columna existente; si coincide con el número actual de columnas, añade al final. Insertar línea usa lineIndex como posición antes de la línea existente; si coincide con el número actual de líneas, añade al final. No uses hSections, aLines ni aCells. Semántica de líneas OBLIGATORIA: si una sección tiene una sola línea, basta mencionar la sección y usa lineIndex 0. Si tiene varias líneas, una operación estructural debe indicar la línea; si no la indica y no dice todas, devuelve EXACTAMENTE {\\\"commands\\\":[]}. Solo si dice todas las líneas genera una operación por cada línea existente. Esta regla no afecta a objetos visuales de celda, que siguen usando commands normales. Para cambiar altura o fondo fijo de una línea de TTable usa obligatoriamente tableSetLineHeight o tableSetLineBackground con section y lineIndex; no uses setProperty para esas operaciones. Shapes adicionales de línea: {\\\"command\\\":\\\"tableSetLineBorderColor\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"color\\\":\\\"#0000ff\\\"}, {\\\"command\\\":\\\"tableSetLineBorderWidth\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"width\\\":1}, {\\\"command\\\":\\\"tableSetLinePadding\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"side\\\":\\\"nTop\\\",\\\"value\\\":2}, {\\\"command\\\":\\\"tableSetLineBorderRadius\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"radius\\\":2}, {\\\"command\\\":\\\"tableSetLineBorderSide\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"side\\\":\\\"top\\\",\\\"visible\\\":true}, {\\\"command\\\":\\\"tableSetLineVerticalSeparators\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"visible\\\":true}, {\\\"command\\\":\\\"tableSetLineCondition\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"DETAIL.cantidad > 0\\\"}, {\\\"command\\\":\\\"tableSetLineSuppressCondition\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"DETAIL.importe == 0\\\"}, {\\\"command\\\":\\\"tableSetLineBackgroundColorFormula\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"IF(...)\\\"}, {\\\"command\\\":\\\"tableSetLineBorderColorFormula\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"IF(...)\\\"}. Las cuatro primitivas de fórmula reciben formula como string literal y aceptan string vacío para borrar; no evalúes ni cambies la sintaxis. Usa la primitiva específica según sea condición, supresión o fórmula de color; no uses paths hBorder, hBackground ni setProperty. Si la instrucción menciona una línea, cabecera, detalle o pie, el color de borde de esa línea usa tableSetLineBorderColor y nunca setProperty. Zebra solo existe en líneas detail. Shapes exactas: {\\\"command\\\":\\\"tableSetLineZebraEnabled\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"enabled\\\":true} y {\\\"command\\\":\\\"tableSetLineZebraColor\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"role\\\":\\\"odd\\\",\\\"color\\\":\\\"#d3d3d3\\\"}. Usa enabled booleano para activar o desactivar y role odd/even para filas impares/pares. No uses hZebraPattern ni paths privados. REGLA DE SCOPE OBLIGATORIA: estos, ellos, los seleccionados y pronombres equivalentes -> target:\\\"selection\\\". Todos, todas, todo el documento, todos los objetos o todos los objetos de un tipo -> target:{\\\"ids\\\":[...]} usando todos los cId coincidentes de DOCUMENTO_COMPLETO_SCOPE=global, incluidos objetos anidados en TTable. Si la selección está vacía, una orden global debe usar siempre ids. Para una orden global no uses target:\\\"selection\\\" ni mezcles ambos targets. También se permite create: {\\\"command\\\":\\\"create\\\",\\\"type\\\":\\\"TText\\\",\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\\\\\"texto\\\\\\\\\\\"\\\"}}. En create describe únicamente lo solicitado: incluye solo el tipo, contenido, posición y propiedades que la instrucción pida explícitamente; el diseñador completa los defaults reales. Tipos reales: TText,TRectangle,TEllipse,TImage,TLine,TBarcode,richText,TFormattedText,TTable. Properties solo editables, nunca cId, defaults, estructura interna ni geometría. position usa {\\\"x\\\":20,\\\"y\\\":30}. Para crear una tabla usa {\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"tabla1\\\",\\\"type\\\":\\\"TTable\\\"}; las primitives TTable posteriores pueden usar target:{\\\"ref\\\":\\\"tabla1\\\"}. Una TTable recién creada tiene las secciones vacías. Antes de insertar columnas o modificar una línea, crea esa línea con tableInsertLine. tableInsertLine crea siempre una línea válida con exactamente 1 columna inicial. SEMÁNTICA OBLIGATORIA DEL NÚMERO DE COLUMNAS: \\\"de N columnas\\\", \\\"con N columnas\\\" y \\\"que tenga N columnas\\\" expresan el TOTAL FINAL deseado; genera exactamente N menos las columnas actuales operaciones tableInsertColumn. Después de tableInsertLine ya hay 1 columna: para una línea de 4 columnas genera exactamente 3 tableInsertColumn y el total final es 4, nunca 4 inserciones. \\\"añade N columnas\\\", \\\"agrega N columnas\\\", \\\"inserta N columnas más\\\" y equivalentes explícitos expresan una CANTIDAD ADICIONAL; genera exactamente N tableInsertColumn. La fachada ejecuta literalmente esas inserciones y no corrige ni reinterpreta el número. Ejemplo total final 4: {\\\"commands\\\":[{\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"tabla1\\\",\\\"type\\\":\\\"TTable\\\"},{\\\"command\\\":\\\"tableInsertLine\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":1},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":3}]}. No envíes hSections, aLines ni aCells en create. Para crear contenido real en una celda usa {\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"txt1\\\",\\\"type\\\":\\\"TText\\\",\\\"targetCell\\\":{\\\"table\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"cellIndex\\\":0},\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\"Título\\\\\\\"\\\"}}; table admite \\\"selection\\\", {\\\"ids\\\":[\\\"id_real\\\"]} o {\\\"ref\\\":\\\"tabla1\\\"}. Tipos manuales admitidos en celda: TText,richText,TBarcode,TImage. Si la instrucción enumera contenidos o títulos, crea un objeto por cada literal en la celda correspondiente; no omitas esos contenidos. No uses position ni geometría para contenido de celda. Una ref es temporal dentro de esta respuesta: el create declara ref:\\\"new1\\\" y un comando posterior apunta al mismo objeto con target:{\\\"ref\\\":\\\"new1\\\"}. Ejemplo: {\\\"commands\\\":[{\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"new1\\\",\\\"type\\\":\\\"TText\\\",\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\\\\\"TOTAL\\\\\\\\\\\"\\\"}},{\\\"command\\\":\\\"resize\\\",\\\"target\\\":{\\\"ref\\\":\\\"new1\\\"},\\\"scaleX\\\":2,\\\"scaleY\\\":2}]}. PLANIFICACION INTERNA PARA INSTRUCCIONES COMPLEJAS: antes de devolver Commands, divide mentalmente la peticion en bloques visuales, asigna posiciones y tamanos aproximados, enumera todos los requisitos explicitos, ordena los commands por dependencias y revisa que no falte ningun requisito realizable. No devuelvas ni expliques este plan; la salida sigue siendo solo {\\\"commands\\\":[...]}. En disenos completos organiza conceptualmente cabecera superior, datos principales, bloque central, totales y pie cuando hayan sido pedidos y sean realizables. Cada objeto visual explicitamente solicitado requiere su propio create. Asigna position y, cuando proceda, move o resize a los objetos raiz; evita que sus cajas se solapen salvo peticion expresa. Crear contenido no sustituye sus estilos: incluye los colores, negrita, alineacion, tamano y fondo pedidos usando propiedades o commands ya disponibles. Para un objeto interno nuevo, incluye sus estilos en create.properties o declara ref en create y usa despues target:{\\\"ref\\\":\\\"...\\\"}; targetCell solo existe en create y nunca es target de setProperty. Todo texto fijo visible usa cText como expresion literal canonica entre comillas. Si se pide un formato y ya existe una sintaxis canonica disponible, usala sin inventar funciones. Si existe una referencia real claramente compatible con un dato solicitado, usala en vez de crear ese dato como literal. Si una columna debe ser mas ancha, incluye tableSetColumnWidth explicitamente. En planes largos prefiere: limpieza; contenedores; estructura; objetos internos; propiedades; geometria; estilos finales, salvo que una dependencia exija otro orden. Omite de forma segura solo lo que no pueda realizarse por falta de campos o capacidades. CTEXT CANONICO: texto fijo=\\\"\\\\\\\\\\\"FACTURA\\\\\\\\\\\"\\\"; campo=REFERENCIA_EXACTA; texto+campo=\\\"\\\\\\\\\\\"Factura: \\\\\\\\\\\"+REFERENCIA_EXACTA\\\"; formula=\\\"Transform(REFERENCIA_EXACTA,\\\\\\\\\\\"99/99/9999\\\\\\\\\\\")\\\". Para contenido de celda usa el mismo TText y la misma semantica. Usa exclusivamente referencias exactas de CAMPOS_Y_VARIABLES_DISPONIBLES; no inventes campos. Si la instruccion pide un dato/campo y no existe una referencia compatible, no conviertas su descripcion en texto fijo: omite esa parte o devuelve {\\\"commands\\\":[]}. En TTable, para CADA seccion usada, el orden obligatorio es: tableInsertLine; N-1 tableInsertColumn para obtener N columnas; despues los create.targetCell. El contenido header exige linea header y el contenido detail exige linea detail; antes de cellIndex K deben existir al menos K+1 columnas en esa misma linea. Nunca uses create.targetCell sobre una linea o celda inexistente. Para una celda vacia de una TTable existente seleccionada usa exactamente {\\\"command\\\":\\\"create\\\",\\\"type\\\":\\\"TText\\\",\\\"targetCell\\\":{\\\"table\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"cellIndex\\\":K},\\\"properties\\\":{\\\"cText\\\":\\\"REFERENCIA_EXACTA\\\"}}. Para una TTable existente identificada table puede ser {\\\"ids\\\":[\\\"id_real\\\"]}; nunca uses {\\\"cId\\\":\\\"...\\\"}. Para una tabla creada en ESTA respuesta, todas las estructuras y targetCell.table usan siempre {\\\"ref\\\":\\\"tabla1\\\"}, nunca \\\"selection\\\". Una lista de N nombres de columnas son N titulos fijos TText de header con cText=\\\"\\\\\\\\\\\"TITULO\\\\\\\\\\\"\\\"; si ademas se piden sus campos o campos disponibles, crea header Y detail, cada seccion con su tableInsertLine y exactamente N-1 inserciones, y despues N TText por seccion. Esquema minimo de dos secciones y dos columnas: create TTable ref tabla1; tableInsertLine header; tableInsertColumn header columnIndex 1; tableInsertLine detail; tableInsertColumn detail columnIndex 1; despues create.targetCell header 0 y 1, y detail 0 y 1, todos con table:{\\\"ref\\\":\\\"tabla1\\\"}. Alinear el contenido o texto a izquierda/centro/derecha usa setProperty con property:\\\"cTextAlign\\\" y value:\\\"left\\\"|\\\"center\\\"|\\\"right\\\"; align se reserva para alinear geometricamente varios objetos.\"},{\"role\":\"user\",\"content\":\"SELECCION_ACTUAL_SCOPE=selection:\\n[]\\nDOCUMENTO_COMPLETO_SCOPE=global:\\n[]\\nGLOBAL_COUNTS:\\nGLOBAL_IDS_BY_TYPE:\\nPROPIEDADES COMUNES EDITABLES: cBackgroundColor:string=Dimensiones y Color / Color de fondo,cBorderColor:string=Borde / Color,cCondition:string,cFillColor2:string,cFillColor3:string,cFillStyle:string,cFontFamily:string,cShadowColor:string,cText:string,cTextAlign:string,cTextColor:string=Texto / Color,cTextFitMode:string,cTextVerticalAlign:string,lAllowPageBreak:boolean,lBorderBottom:boolean,lBorderLeft:boolean,lBorderRight:boolean,lBorderTop:boolean,lFontBold:boolean=Texto / Negrita,lFontItalic:boolean=Texto / Cursiva,lFontStrikeout:boolean,lFontUnderline:boolean,lForceWrap:boolean,lKeepEmptyParagraphs:boolean,lLocked:boolean,lTextAdjusted:boolean,lTextWrap:boolean,lTrimSpaces:boolean,lVisible:boolean,nBorderWidth:number,nFillOpacity:number,nFontSize:number=Texto / Tamaño,nLayerId:number,nLineSpacing:number,nOpacity:number=Transformación / Opacidad,nPaddingBottom:number,nPaddingLeft:number,nPaddingRight:number,nPaddingTop:number,nParagraphSpacing:number,nRotation:number,nRounded:number,nShadowSize:number,nShadowTransparency:number,nTextDecimalPosition:number,nTextOpacity:number,nZIndex:number\\nCOLORES CANÓNICOS: rojo:#ff0000 · verde:#008000 · verde oscuro:#006400 · azul:#0000ff · azul oscuro:#00008b · amarillo:#ffff00 · gris claro:#d3d3d3\\nCAMPOS_Y_VARIABLES_DISPONIBLES\\nTIPOS:C=texto,N=numero,D=fecha,I=imagen,M=memo,L=booleano\\n\\nINSTRUCCIÓN:\\nhazlo a la mitad\"}],\"stream\":false,\"format\":\"json\",\"keep_alive\":-1,\"options\":{\"temperature\":0,\"top_p\":1,\"top_k\":0,\"repeat_penalty\":1.1,\"frequency_penalty\":0,\"presence_penalty\":0,\"num_ctx\":65536,\"num_batch\":4096,\"num_thread\":10,\"num_gpu\":99,\"num_predict\":4096},\"think\":\"low\"}",
                        "cHttpBody": "{\"model\":\"gpt-oss:20b\",\"created_at\":\"2026-08-12T22:20:10.7746293Z\",\"message\":{\"role\":\"assistant\",\"content\":\"{\\\"commands\\\":[{\\\"command\\\":\\\"resize\\\",\\\"target\\\":\\\"selection\\\",\\\"scaleX\\\":0.5,\\\"scaleY\\\":0.5}]}\",\"thinking\":\"Need to output JSON commands. Instruction: \\\"hazlo a la mitad\\\" unclear context. Probably means scale selection by half? So use resize with scaleX 0.5, scaleY 0.5 on selection. Output accordingly.\"},\"done\":true,\"done_reason\":\"stop\",\"total_duration\":14670512900,\"load_duration\":209589900,\"prompt_eval_count\":3702,\"prompt_eval_duration\":747739000,\"eval_count\":28,\"eval_duration\":350233000}",
                        "hMetrics": {
                            "total_duration": 14670512900,
                            "load_duration": 209589900,
                            "prompt_eval_count": 3702,
                            "prompt_eval_duration": 747739000,
                            "eval_count": 28,
                            "eval_duration": 350233000,
                            "unattributed_duration": 13362951000
                        },
                        "hCommands": {
                            "commands": [
                                {
                                    "command": "resize",
                                    "target": "selection",
                                    "scaleX": 0.5,
                                    "scaleY": 0.5
                                }
                            ]
                        },
                        "lValid": true,
                        "nCreates": 0,
                        "nChanges": 0,
                        "nDeletes": 0,
                        "nStructures": 0,
                        "nGeneratedIds": 0,
                        "nOperations": 1,
                        "nFinalOperations": 1,
                        "cValidation": "Shape commands válida; validación de ejecución pendiente",
                        "nResponseMilliseconds": 14688.038,
                        "tRequestStartedAt": "2026-08-13T00:19:56.088801+02:00",
                        "tResponseFinishedAt": "2026-08-13T00:20:10.776855+02:00",
                        "hPromptDiagnostics": {
                            "nSystemCharacters": 13534,
                            "nUserCharacters": 1485,
                            "nPromptCharacters": 15020,
                            "nPromptCharactersBeforeFields": 12829,
                            "nFieldsCharacters": 88,
                            "nPromptTokensBeforeEstimated": 3208,
                            "nPromptTokensAfterEstimated": 3755,
                            "nContextTokens": 65536,
                            "lPromptFitsContext": true,
                            "hFields": {
                                "nGroups": 0,
                                "nFields": 0,
                                "nUserVariables": 0,
                                "nAccumulators": 0
                            }
                        }
                    },
                    "commands": [
                        {
                            "command": "resize",
                            "target": "selection",
                            "scaleX": 0.5,
                            "scaleY": 0.5
                        }
                    ],
                    "valid": true
                },
                {
                    "id": "D_double",
                    "instruction": "haz los seleccionados el doble",
                    "response": {
                        "cInstruction": "haz los seleccionados el doble",
                        "cProvider": "Ollama",
                        "cModelSelection": "Ollama — GPT-OSS 20B",
                        "cModel": "gpt-oss:20b",
                        "cRepresentation": "COMMANDS",
                        "cRawResponse": "{\"commands\":[{\"command\":\"resize\",\"target\":\"selection\",\"scaleX\":2,\"scaleY\":2}]}",
                        "cThinking": "Need to double size of selected objects. Use resize command with scaleX 2, scaleY 2. target selection. Output JSON.",
                        "cOllamaRequest": "{\"model\":\"gpt-oss:20b\",\"messages\":[{\"role\":\"system\",\"content\":\"Interpreta la instrucción y devuelve únicamente JSON válido con la forma {\\\"commands\\\":[{\\\"command\\\":\\\"setProperty\\\",\\\"target\\\":\\\"selection\\\" o {\\\"ids\\\":[\\\"id_real\\\"]},\\\"property\\\":\\\"propiedad_real\\\",\\\"value\\\":valor}]}. Cada comando DEBE usar la clave command (nunca type) y target. Comandos permitidos: setProperty, move, resize, delete, align, distribute, reorder, duplicate, tableMoveColumn, tableSetColumnWidth, tableInsertColumn, tableDeleteColumn, tableInsertLine, tableDeleteLine, tableMoveLine, tableSetLineHeight, tableSetLineBackground, tableSetLineBorderColor, tableSetLineBorderWidth, tableSetLinePadding, tableSetLineBorderRadius, tableSetLineBorderSide, tableSetLineVerticalSeparators, tableSetLineZebraEnabled, tableSetLineZebraColor, tableSetLineCondition, tableSetLineSuppressCondition, tableSetLineBackgroundColorFormula, tableSetLineBorderColorFormula. Prioridad: propiedad o estilo → setProperty; desplazamiento relativo → move; tamaño relativo → resize; alineación de varios objetos → align; eliminar objetos → delete. Para eliminar usa exactamente {\\\"command\\\":\\\"delete\\\",\\\"target\\\":\\\"selection\\\"}. Si se pide duplicar, reducir o cambiar el tamaño, devuelve únicamente resize y no uses setProperty para propiedades numéricas. Para setProperty usa exactamente property y value, nunca name ni valores como *2. Para move usa {\\\"command\\\":\\\"move\\\",\\\"target\\\":\\\"selection\\\",\\\"dx\\\":10,\\\"dy\\\":0}; para resize usa {\\\"command\\\":\\\"resize\\\",\\\"target\\\":\\\"selection\\\",\\\"scaleX\\\":0.5,\\\"scaleY\\\":0.5}. Para alinear usa exactamente {\\\"command\\\":\\\"align\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"left\\\"}; modos válidos: left|right|top|bottom|horizontalCenter|verticalCenter. Si la orden se refiere a los objetos seleccionados, usa target:\\\"selection\\\". No inventes IDs ni calcules coordenadas o dimensiones finales. Para distribuir usa exactamente {\\\"command\\\":\\\"distribute\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"horizontal\\\"}; modos válidos: horizontal|vertical. Para reordenar usa exactamente {\\\"command\\\":\\\"reorder\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"bringToFront\\\"}; modos válidos: bringToFront=traer al frente, sendToBack=enviar al fondo, bringForward=subir un nivel, sendBackward=bajar un nivel. Para duplicar usa exactamente {\\\"command\\\":\\\"duplicate\\\",\\\"target\\\":\\\"selection\\\"}. Para tablas usa únicamente estas formas: {\\\"command\\\":\\\"tableMoveColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"fromIndex\\\":2,\\\"toIndex\\\":0}, {\\\"command\\\":\\\"tableSetColumnWidth\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":0,\\\"width\\\":30}, {\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2}, {\\\"command\\\":\\\"tableDeleteColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2}, {\\\"command\\\":\\\"tableInsertLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":1}, {\\\"command\\\":\\\"tableDeleteLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":1}, {\\\"command\\\":\\\"tableMoveLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"fromIndex\\\":1,\\\"toIndex\\\":0}, {\\\"command\\\":\\\"tableSetLineHeight\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"height\\\":12}, {\\\"command\\\":\\\"tableSetLineBackground\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"color\\\":\\\"#d3d3d3\\\"}; section: header|groupHeader|detail|groupFooter|footer. Los índices son enteros cero-basados y no negativos. tableSetLineHeight usa altura fija en milímetros >=1. tableSetLineBackground usa únicamente color HEX fijo; no usa fórmulas ni paths privados. Insertar columna usa columnIndex como posición antes de la columna existente; si coincide con el número actual de columnas, añade al final. Insertar línea usa lineIndex como posición antes de la línea existente; si coincide con el número actual de líneas, añade al final. No uses hSections, aLines ni aCells. Semántica de líneas OBLIGATORIA: si una sección tiene una sola línea, basta mencionar la sección y usa lineIndex 0. Si tiene varias líneas, una operación estructural debe indicar la línea; si no la indica y no dice todas, devuelve EXACTAMENTE {\\\"commands\\\":[]}. Solo si dice todas las líneas genera una operación por cada línea existente. Esta regla no afecta a objetos visuales de celda, que siguen usando commands normales. Para cambiar altura o fondo fijo de una línea de TTable usa obligatoriamente tableSetLineHeight o tableSetLineBackground con section y lineIndex; no uses setProperty para esas operaciones. Shapes adicionales de línea: {\\\"command\\\":\\\"tableSetLineBorderColor\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"color\\\":\\\"#0000ff\\\"}, {\\\"command\\\":\\\"tableSetLineBorderWidth\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"width\\\":1}, {\\\"command\\\":\\\"tableSetLinePadding\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"side\\\":\\\"nTop\\\",\\\"value\\\":2}, {\\\"command\\\":\\\"tableSetLineBorderRadius\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"radius\\\":2}, {\\\"command\\\":\\\"tableSetLineBorderSide\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"side\\\":\\\"top\\\",\\\"visible\\\":true}, {\\\"command\\\":\\\"tableSetLineVerticalSeparators\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"visible\\\":true}, {\\\"command\\\":\\\"tableSetLineCondition\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"DETAIL.cantidad > 0\\\"}, {\\\"command\\\":\\\"tableSetLineSuppressCondition\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"DETAIL.importe == 0\\\"}, {\\\"command\\\":\\\"tableSetLineBackgroundColorFormula\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"IF(...)\\\"}, {\\\"command\\\":\\\"tableSetLineBorderColorFormula\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"IF(...)\\\"}. Las cuatro primitivas de fórmula reciben formula como string literal y aceptan string vacío para borrar; no evalúes ni cambies la sintaxis. Usa la primitiva específica según sea condición, supresión o fórmula de color; no uses paths hBorder, hBackground ni setProperty. Si la instrucción menciona una línea, cabecera, detalle o pie, el color de borde de esa línea usa tableSetLineBorderColor y nunca setProperty. Zebra solo existe en líneas detail. Shapes exactas: {\\\"command\\\":\\\"tableSetLineZebraEnabled\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"enabled\\\":true} y {\\\"command\\\":\\\"tableSetLineZebraColor\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"role\\\":\\\"odd\\\",\\\"color\\\":\\\"#d3d3d3\\\"}. Usa enabled booleano para activar o desactivar y role odd/even para filas impares/pares. No uses hZebraPattern ni paths privados. REGLA DE SCOPE OBLIGATORIA: estos, ellos, los seleccionados y pronombres equivalentes -> target:\\\"selection\\\". Todos, todas, todo el documento, todos los objetos o todos los objetos de un tipo -> target:{\\\"ids\\\":[...]} usando todos los cId coincidentes de DOCUMENTO_COMPLETO_SCOPE=global, incluidos objetos anidados en TTable. Si la selección está vacía, una orden global debe usar siempre ids. Para una orden global no uses target:\\\"selection\\\" ni mezcles ambos targets. También se permite create: {\\\"command\\\":\\\"create\\\",\\\"type\\\":\\\"TText\\\",\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\\\\\"texto\\\\\\\\\\\"\\\"}}. En create describe únicamente lo solicitado: incluye solo el tipo, contenido, posición y propiedades que la instrucción pida explícitamente; el diseñador completa los defaults reales. Tipos reales: TText,TRectangle,TEllipse,TImage,TLine,TBarcode,richText,TFormattedText,TTable. Properties solo editables, nunca cId, defaults, estructura interna ni geometría. position usa {\\\"x\\\":20,\\\"y\\\":30}. Para crear una tabla usa {\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"tabla1\\\",\\\"type\\\":\\\"TTable\\\"}; las primitives TTable posteriores pueden usar target:{\\\"ref\\\":\\\"tabla1\\\"}. Una TTable recién creada tiene las secciones vacías. Antes de insertar columnas o modificar una línea, crea esa línea con tableInsertLine. tableInsertLine crea siempre una línea válida con exactamente 1 columna inicial. SEMÁNTICA OBLIGATORIA DEL NÚMERO DE COLUMNAS: \\\"de N columnas\\\", \\\"con N columnas\\\" y \\\"que tenga N columnas\\\" expresan el TOTAL FINAL deseado; genera exactamente N menos las columnas actuales operaciones tableInsertColumn. Después de tableInsertLine ya hay 1 columna: para una línea de 4 columnas genera exactamente 3 tableInsertColumn y el total final es 4, nunca 4 inserciones. \\\"añade N columnas\\\", \\\"agrega N columnas\\\", \\\"inserta N columnas más\\\" y equivalentes explícitos expresan una CANTIDAD ADICIONAL; genera exactamente N tableInsertColumn. La fachada ejecuta literalmente esas inserciones y no corrige ni reinterpreta el número. Ejemplo total final 4: {\\\"commands\\\":[{\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"tabla1\\\",\\\"type\\\":\\\"TTable\\\"},{\\\"command\\\":\\\"tableInsertLine\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":1},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":3}]}. No envíes hSections, aLines ni aCells en create. Para crear contenido real en una celda usa {\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"txt1\\\",\\\"type\\\":\\\"TText\\\",\\\"targetCell\\\":{\\\"table\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"cellIndex\\\":0},\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\"Título\\\\\\\"\\\"}}; table admite \\\"selection\\\", {\\\"ids\\\":[\\\"id_real\\\"]} o {\\\"ref\\\":\\\"tabla1\\\"}. Tipos manuales admitidos en celda: TText,richText,TBarcode,TImage. Si la instrucción enumera contenidos o títulos, crea un objeto por cada literal en la celda correspondiente; no omitas esos contenidos. No uses position ni geometría para contenido de celda. Una ref es temporal dentro de esta respuesta: el create declara ref:\\\"new1\\\" y un comando posterior apunta al mismo objeto con target:{\\\"ref\\\":\\\"new1\\\"}. Ejemplo: {\\\"commands\\\":[{\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"new1\\\",\\\"type\\\":\\\"TText\\\",\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\\\\\"TOTAL\\\\\\\\\\\"\\\"}},{\\\"command\\\":\\\"resize\\\",\\\"target\\\":{\\\"ref\\\":\\\"new1\\\"},\\\"scaleX\\\":2,\\\"scaleY\\\":2}]}. PLANIFICACION INTERNA PARA INSTRUCCIONES COMPLEJAS: antes de devolver Commands, divide mentalmente la peticion en bloques visuales, asigna posiciones y tamanos aproximados, enumera todos los requisitos explicitos, ordena los commands por dependencias y revisa que no falte ningun requisito realizable. No devuelvas ni expliques este plan; la salida sigue siendo solo {\\\"commands\\\":[...]}. En disenos completos organiza conceptualmente cabecera superior, datos principales, bloque central, totales y pie cuando hayan sido pedidos y sean realizables. Cada objeto visual explicitamente solicitado requiere su propio create. Asigna position y, cuando proceda, move o resize a los objetos raiz; evita que sus cajas se solapen salvo peticion expresa. Crear contenido no sustituye sus estilos: incluye los colores, negrita, alineacion, tamano y fondo pedidos usando propiedades o commands ya disponibles. Para un objeto interno nuevo, incluye sus estilos en create.properties o declara ref en create y usa despues target:{\\\"ref\\\":\\\"...\\\"}; targetCell solo existe en create y nunca es target de setProperty. Todo texto fijo visible usa cText como expresion literal canonica entre comillas. Si se pide un formato y ya existe una sintaxis canonica disponible, usala sin inventar funciones. Si existe una referencia real claramente compatible con un dato solicitado, usala en vez de crear ese dato como literal. Si una columna debe ser mas ancha, incluye tableSetColumnWidth explicitamente. En planes largos prefiere: limpieza; contenedores; estructura; objetos internos; propiedades; geometria; estilos finales, salvo que una dependencia exija otro orden. Omite de forma segura solo lo que no pueda realizarse por falta de campos o capacidades. CTEXT CANONICO: texto fijo=\\\"\\\\\\\\\\\"FACTURA\\\\\\\\\\\"\\\"; campo=REFERENCIA_EXACTA; texto+campo=\\\"\\\\\\\\\\\"Factura: \\\\\\\\\\\"+REFERENCIA_EXACTA\\\"; formula=\\\"Transform(REFERENCIA_EXACTA,\\\\\\\\\\\"99/99/9999\\\\\\\\\\\")\\\". Para contenido de celda usa el mismo TText y la misma semantica. Usa exclusivamente referencias exactas de CAMPOS_Y_VARIABLES_DISPONIBLES; no inventes campos. Si la instruccion pide un dato/campo y no existe una referencia compatible, no conviertas su descripcion en texto fijo: omite esa parte o devuelve {\\\"commands\\\":[]}. En TTable, para CADA seccion usada, el orden obligatorio es: tableInsertLine; N-1 tableInsertColumn para obtener N columnas; despues los create.targetCell. El contenido header exige linea header y el contenido detail exige linea detail; antes de cellIndex K deben existir al menos K+1 columnas en esa misma linea. Nunca uses create.targetCell sobre una linea o celda inexistente. Para una celda vacia de una TTable existente seleccionada usa exactamente {\\\"command\\\":\\\"create\\\",\\\"type\\\":\\\"TText\\\",\\\"targetCell\\\":{\\\"table\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"cellIndex\\\":K},\\\"properties\\\":{\\\"cText\\\":\\\"REFERENCIA_EXACTA\\\"}}. Para una TTable existente identificada table puede ser {\\\"ids\\\":[\\\"id_real\\\"]}; nunca uses {\\\"cId\\\":\\\"...\\\"}. Para una tabla creada en ESTA respuesta, todas las estructuras y targetCell.table usan siempre {\\\"ref\\\":\\\"tabla1\\\"}, nunca \\\"selection\\\". Una lista de N nombres de columnas son N titulos fijos TText de header con cText=\\\"\\\\\\\\\\\"TITULO\\\\\\\\\\\"\\\"; si ademas se piden sus campos o campos disponibles, crea header Y detail, cada seccion con su tableInsertLine y exactamente N-1 inserciones, y despues N TText por seccion. Esquema minimo de dos secciones y dos columnas: create TTable ref tabla1; tableInsertLine header; tableInsertColumn header columnIndex 1; tableInsertLine detail; tableInsertColumn detail columnIndex 1; despues create.targetCell header 0 y 1, y detail 0 y 1, todos con table:{\\\"ref\\\":\\\"tabla1\\\"}. Alinear el contenido o texto a izquierda/centro/derecha usa setProperty con property:\\\"cTextAlign\\\" y value:\\\"left\\\"|\\\"center\\\"|\\\"right\\\"; align se reserva para alinear geometricamente varios objetos.\"},{\"role\":\"user\",\"content\":\"SELECCION_ACTUAL_SCOPE=selection:\\n[]\\nDOCUMENTO_COMPLETO_SCOPE=global:\\n[]\\nGLOBAL_COUNTS:\\nGLOBAL_IDS_BY_TYPE:\\nPROPIEDADES COMUNES EDITABLES: cBackgroundColor:string=Dimensiones y Color / Color de fondo,cBorderColor:string=Borde / Color,cCondition:string,cFillColor2:string,cFillColor3:string,cFillStyle:string,cShadowColor:string,lBorderBottom:boolean,lBorderLeft:boolean,lBorderRight:boolean,lBorderTop:boolean,lLocked:boolean,lVisible:boolean,nBorderWidth:number,nFillOpacity:number,nLayerId:number,nOpacity:number=Transformación / Opacidad,nPaddingBottom:number,nPaddingLeft:number,nPaddingRight:number,nPaddingTop:number,nRotation:number,nRounded:number,nShadowSize:number,nShadowTransparency:number,nZIndex:number\\nCOLORES CANÓNICOS: rojo:#ff0000 · verde:#008000 · verde oscuro:#006400 · azul:#0000ff · azul oscuro:#00008b · amarillo:#ffff00 · gris claro:#d3d3d3\\nCAMPOS_Y_VARIABLES_DISPONIBLES\\nTIPOS:C=texto,N=numero,D=fecha,I=imagen,M=memo,L=booleano\\n\\nINSTRUCCIÓN:\\nhaz los seleccionados el doble\"}],\"stream\":false,\"format\":\"json\",\"keep_alive\":-1,\"options\":{\"temperature\":0,\"top_p\":1,\"top_k\":0,\"repeat_penalty\":1.1,\"frequency_penalty\":0,\"presence_penalty\":0,\"num_ctx\":65536,\"num_batch\":4096,\"num_thread\":10,\"num_gpu\":99,\"num_predict\":4096},\"think\":\"low\"}",
                        "cHttpBody": "{\"model\":\"gpt-oss:20b\",\"created_at\":\"2026-08-12T22:20:12.9942222Z\",\"message\":{\"role\":\"assistant\",\"content\":\"{\\\"commands\\\":[{\\\"command\\\":\\\"resize\\\",\\\"target\\\":\\\"selection\\\",\\\"scaleX\\\":2,\\\"scaleY\\\":2}]}\",\"thinking\":\"Need to double size of selected objects. Use resize command with scaleX 2, scaleY 2. target selection. Output JSON.\"},\"done\":true,\"done_reason\":\"stop\",\"total_duration\":2214633100,\"load_duration\":214063200,\"prompt_eval_count\":3572,\"prompt_eval_duration\":79544000,\"eval_count\":24,\"eval_duration\":303850000}",
                        "hMetrics": {
                            "total_duration": 2214633100,
                            "load_duration": 214063200,
                            "prompt_eval_count": 3572,
                            "prompt_eval_duration": 79544000,
                            "eval_count": 24,
                            "eval_duration": 303850000,
                            "unattributed_duration": 1617175900
                        },
                        "hCommands": {
                            "commands": [
                                {
                                    "command": "resize",
                                    "target": "selection",
                                    "scaleX": 2,
                                    "scaleY": 2
                                }
                            ]
                        },
                        "lValid": true,
                        "nCreates": 0,
                        "nChanges": 0,
                        "nDeletes": 0,
                        "nStructures": 0,
                        "nGeneratedIds": 0,
                        "nOperations": 1,
                        "nFinalOperations": 1,
                        "cValidation": "Shape commands válida; validación de ejecución pendiente",
                        "nResponseMilliseconds": 2219.036,
                        "tRequestStartedAt": "2026-08-13T00:20:10.777424+02:00",
                        "tResponseFinishedAt": "2026-08-13T00:20:12.996476+02:00",
                        "hPromptDiagnostics": {
                            "nSystemCharacters": 13534,
                            "nUserCharacters": 998,
                            "nPromptCharacters": 14533,
                            "nPromptCharactersBeforeFields": 12342,
                            "nFieldsCharacters": 88,
                            "nPromptTokensBeforeEstimated": 3086,
                            "nPromptTokensAfterEstimated": 3634,
                            "nContextTokens": 65536,
                            "lPromptFitsContext": true,
                            "hFields": {
                                "nGroups": 0,
                                "nFields": 0,
                                "nUserVariables": 0,
                                "nAccumulators": 0
                            }
                        }
                    },
                    "commands": [
                        {
                            "command": "resize",
                            "target": "selection",
                            "scaleX": 2,
                            "scaleY": 2
                        }
                    ],
                    "valid": true
                },
                {
                    "id": "E_red",
                    "instruction": "pon los seleccionados en rojo",
                    "response": {
                        "cInstruction": "pon los seleccionados en rojo",
                        "cProvider": "Ollama",
                        "cModelSelection": "Ollama — GPT-OSS 20B",
                        "cModel": "gpt-oss:20b",
                        "cRepresentation": "COMMANDS",
                        "cRawResponse": "{\"commands\":[{\"command\":\"setProperty\",\"target\":\"selection\",\"property\":\"cBorderColor\",\"value\":\"#ff0000\"}]}",
                        "cThinking": "Need setProperty color red. target selection. property cBorderColor? or cBackgroundColor? \"en rojo\" likely border. Use cBorderColor.",
                        "cOllamaRequest": "{\"model\":\"gpt-oss:20b\",\"messages\":[{\"role\":\"system\",\"content\":\"Interpreta la instrucción y devuelve únicamente JSON válido con la forma {\\\"commands\\\":[{\\\"command\\\":\\\"setProperty\\\",\\\"target\\\":\\\"selection\\\" o {\\\"ids\\\":[\\\"id_real\\\"]},\\\"property\\\":\\\"propiedad_real\\\",\\\"value\\\":valor}]}. Cada comando DEBE usar la clave command (nunca type) y target. Comandos permitidos: setProperty, move, resize, delete, align, distribute, reorder, duplicate, tableMoveColumn, tableSetColumnWidth, tableInsertColumn, tableDeleteColumn, tableInsertLine, tableDeleteLine, tableMoveLine, tableSetLineHeight, tableSetLineBackground, tableSetLineBorderColor, tableSetLineBorderWidth, tableSetLinePadding, tableSetLineBorderRadius, tableSetLineBorderSide, tableSetLineVerticalSeparators, tableSetLineZebraEnabled, tableSetLineZebraColor, tableSetLineCondition, tableSetLineSuppressCondition, tableSetLineBackgroundColorFormula, tableSetLineBorderColorFormula. Prioridad: propiedad o estilo → setProperty; desplazamiento relativo → move; tamaño relativo → resize; alineación de varios objetos → align; eliminar objetos → delete. Para eliminar usa exactamente {\\\"command\\\":\\\"delete\\\",\\\"target\\\":\\\"selection\\\"}. Si se pide duplicar, reducir o cambiar el tamaño, devuelve únicamente resize y no uses setProperty para propiedades numéricas. Para setProperty usa exactamente property y value, nunca name ni valores como *2. Para move usa {\\\"command\\\":\\\"move\\\",\\\"target\\\":\\\"selection\\\",\\\"dx\\\":10,\\\"dy\\\":0}; para resize usa {\\\"command\\\":\\\"resize\\\",\\\"target\\\":\\\"selection\\\",\\\"scaleX\\\":0.5,\\\"scaleY\\\":0.5}. Para alinear usa exactamente {\\\"command\\\":\\\"align\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"left\\\"}; modos válidos: left|right|top|bottom|horizontalCenter|verticalCenter. Si la orden se refiere a los objetos seleccionados, usa target:\\\"selection\\\". No inventes IDs ni calcules coordenadas o dimensiones finales. Para distribuir usa exactamente {\\\"command\\\":\\\"distribute\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"horizontal\\\"}; modos válidos: horizontal|vertical. Para reordenar usa exactamente {\\\"command\\\":\\\"reorder\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"bringToFront\\\"}; modos válidos: bringToFront=traer al frente, sendToBack=enviar al fondo, bringForward=subir un nivel, sendBackward=bajar un nivel. Para duplicar usa exactamente {\\\"command\\\":\\\"duplicate\\\",\\\"target\\\":\\\"selection\\\"}. Para tablas usa únicamente estas formas: {\\\"command\\\":\\\"tableMoveColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"fromIndex\\\":2,\\\"toIndex\\\":0}, {\\\"command\\\":\\\"tableSetColumnWidth\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":0,\\\"width\\\":30}, {\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2}, {\\\"command\\\":\\\"tableDeleteColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2}, {\\\"command\\\":\\\"tableInsertLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":1}, {\\\"command\\\":\\\"tableDeleteLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":1}, {\\\"command\\\":\\\"tableMoveLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"fromIndex\\\":1,\\\"toIndex\\\":0}, {\\\"command\\\":\\\"tableSetLineHeight\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"height\\\":12}, {\\\"command\\\":\\\"tableSetLineBackground\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"color\\\":\\\"#d3d3d3\\\"}; section: header|groupHeader|detail|groupFooter|footer. Los índices son enteros cero-basados y no negativos. tableSetLineHeight usa altura fija en milímetros >=1. tableSetLineBackground usa únicamente color HEX fijo; no usa fórmulas ni paths privados. Insertar columna usa columnIndex como posición antes de la columna existente; si coincide con el número actual de columnas, añade al final. Insertar línea usa lineIndex como posición antes de la línea existente; si coincide con el número actual de líneas, añade al final. No uses hSections, aLines ni aCells. Semántica de líneas OBLIGATORIA: si una sección tiene una sola línea, basta mencionar la sección y usa lineIndex 0. Si tiene varias líneas, una operación estructural debe indicar la línea; si no la indica y no dice todas, devuelve EXACTAMENTE {\\\"commands\\\":[]}. Solo si dice todas las líneas genera una operación por cada línea existente. Esta regla no afecta a objetos visuales de celda, que siguen usando commands normales. Para cambiar altura o fondo fijo de una línea de TTable usa obligatoriamente tableSetLineHeight o tableSetLineBackground con section y lineIndex; no uses setProperty para esas operaciones. Shapes adicionales de línea: {\\\"command\\\":\\\"tableSetLineBorderColor\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"color\\\":\\\"#0000ff\\\"}, {\\\"command\\\":\\\"tableSetLineBorderWidth\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"width\\\":1}, {\\\"command\\\":\\\"tableSetLinePadding\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"side\\\":\\\"nTop\\\",\\\"value\\\":2}, {\\\"command\\\":\\\"tableSetLineBorderRadius\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"radius\\\":2}, {\\\"command\\\":\\\"tableSetLineBorderSide\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"side\\\":\\\"top\\\",\\\"visible\\\":true}, {\\\"command\\\":\\\"tableSetLineVerticalSeparators\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"visible\\\":true}, {\\\"command\\\":\\\"tableSetLineCondition\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"DETAIL.cantidad > 0\\\"}, {\\\"command\\\":\\\"tableSetLineSuppressCondition\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"DETAIL.importe == 0\\\"}, {\\\"command\\\":\\\"tableSetLineBackgroundColorFormula\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"IF(...)\\\"}, {\\\"command\\\":\\\"tableSetLineBorderColorFormula\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"IF(...)\\\"}. Las cuatro primitivas de fórmula reciben formula como string literal y aceptan string vacío para borrar; no evalúes ni cambies la sintaxis. Usa la primitiva específica según sea condición, supresión o fórmula de color; no uses paths hBorder, hBackground ni setProperty. Si la instrucción menciona una línea, cabecera, detalle o pie, el color de borde de esa línea usa tableSetLineBorderColor y nunca setProperty. Zebra solo existe en líneas detail. Shapes exactas: {\\\"command\\\":\\\"tableSetLineZebraEnabled\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"enabled\\\":true} y {\\\"command\\\":\\\"tableSetLineZebraColor\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"role\\\":\\\"odd\\\",\\\"color\\\":\\\"#d3d3d3\\\"}. Usa enabled booleano para activar o desactivar y role odd/even para filas impares/pares. No uses hZebraPattern ni paths privados. REGLA DE SCOPE OBLIGATORIA: estos, ellos, los seleccionados y pronombres equivalentes -> target:\\\"selection\\\". Todos, todas, todo el documento, todos los objetos o todos los objetos de un tipo -> target:{\\\"ids\\\":[...]} usando todos los cId coincidentes de DOCUMENTO_COMPLETO_SCOPE=global, incluidos objetos anidados en TTable. Si la selección está vacía, una orden global debe usar siempre ids. Para una orden global no uses target:\\\"selection\\\" ni mezcles ambos targets. También se permite create: {\\\"command\\\":\\\"create\\\",\\\"type\\\":\\\"TText\\\",\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\\\\\"texto\\\\\\\\\\\"\\\"}}. En create describe únicamente lo solicitado: incluye solo el tipo, contenido, posición y propiedades que la instrucción pida explícitamente; el diseñador completa los defaults reales. Tipos reales: TText,TRectangle,TEllipse,TImage,TLine,TBarcode,richText,TFormattedText,TTable. Properties solo editables, nunca cId, defaults, estructura interna ni geometría. position usa {\\\"x\\\":20,\\\"y\\\":30}. Para crear una tabla usa {\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"tabla1\\\",\\\"type\\\":\\\"TTable\\\"}; las primitives TTable posteriores pueden usar target:{\\\"ref\\\":\\\"tabla1\\\"}. Una TTable recién creada tiene las secciones vacías. Antes de insertar columnas o modificar una línea, crea esa línea con tableInsertLine. tableInsertLine crea siempre una línea válida con exactamente 1 columna inicial. SEMÁNTICA OBLIGATORIA DEL NÚMERO DE COLUMNAS: \\\"de N columnas\\\", \\\"con N columnas\\\" y \\\"que tenga N columnas\\\" expresan el TOTAL FINAL deseado; genera exactamente N menos las columnas actuales operaciones tableInsertColumn. Después de tableInsertLine ya hay 1 columna: para una línea de 4 columnas genera exactamente 3 tableInsertColumn y el total final es 4, nunca 4 inserciones. \\\"añade N columnas\\\", \\\"agrega N columnas\\\", \\\"inserta N columnas más\\\" y equivalentes explícitos expresan una CANTIDAD ADICIONAL; genera exactamente N tableInsertColumn. La fachada ejecuta literalmente esas inserciones y no corrige ni reinterpreta el número. Ejemplo total final 4: {\\\"commands\\\":[{\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"tabla1\\\",\\\"type\\\":\\\"TTable\\\"},{\\\"command\\\":\\\"tableInsertLine\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":1},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":3}]}. No envíes hSections, aLines ni aCells en create. Para crear contenido real en una celda usa {\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"txt1\\\",\\\"type\\\":\\\"TText\\\",\\\"targetCell\\\":{\\\"table\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"cellIndex\\\":0},\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\"Título\\\\\\\"\\\"}}; table admite \\\"selection\\\", {\\\"ids\\\":[\\\"id_real\\\"]} o {\\\"ref\\\":\\\"tabla1\\\"}. Tipos manuales admitidos en celda: TText,richText,TBarcode,TImage. Si la instrucción enumera contenidos o títulos, crea un objeto por cada literal en la celda correspondiente; no omitas esos contenidos. No uses position ni geometría para contenido de celda. Una ref es temporal dentro de esta respuesta: el create declara ref:\\\"new1\\\" y un comando posterior apunta al mismo objeto con target:{\\\"ref\\\":\\\"new1\\\"}. Ejemplo: {\\\"commands\\\":[{\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"new1\\\",\\\"type\\\":\\\"TText\\\",\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\\\\\"TOTAL\\\\\\\\\\\"\\\"}},{\\\"command\\\":\\\"resize\\\",\\\"target\\\":{\\\"ref\\\":\\\"new1\\\"},\\\"scaleX\\\":2,\\\"scaleY\\\":2}]}. PLANIFICACION INTERNA PARA INSTRUCCIONES COMPLEJAS: antes de devolver Commands, divide mentalmente la peticion en bloques visuales, asigna posiciones y tamanos aproximados, enumera todos los requisitos explicitos, ordena los commands por dependencias y revisa que no falte ningun requisito realizable. No devuelvas ni expliques este plan; la salida sigue siendo solo {\\\"commands\\\":[...]}. En disenos completos organiza conceptualmente cabecera superior, datos principales, bloque central, totales y pie cuando hayan sido pedidos y sean realizables. Cada objeto visual explicitamente solicitado requiere su propio create. Asigna position y, cuando proceda, move o resize a los objetos raiz; evita que sus cajas se solapen salvo peticion expresa. Crear contenido no sustituye sus estilos: incluye los colores, negrita, alineacion, tamano y fondo pedidos usando propiedades o commands ya disponibles. Para un objeto interno nuevo, incluye sus estilos en create.properties o declara ref en create y usa despues target:{\\\"ref\\\":\\\"...\\\"}; targetCell solo existe en create y nunca es target de setProperty. Todo texto fijo visible usa cText como expresion literal canonica entre comillas. Si se pide un formato y ya existe una sintaxis canonica disponible, usala sin inventar funciones. Si existe una referencia real claramente compatible con un dato solicitado, usala en vez de crear ese dato como literal. Si una columna debe ser mas ancha, incluye tableSetColumnWidth explicitamente. En planes largos prefiere: limpieza; contenedores; estructura; objetos internos; propiedades; geometria; estilos finales, salvo que una dependencia exija otro orden. Omite de forma segura solo lo que no pueda realizarse por falta de campos o capacidades. CTEXT CANONICO: texto fijo=\\\"\\\\\\\\\\\"FACTURA\\\\\\\\\\\"\\\"; campo=REFERENCIA_EXACTA; texto+campo=\\\"\\\\\\\\\\\"Factura: \\\\\\\\\\\"+REFERENCIA_EXACTA\\\"; formula=\\\"Transform(REFERENCIA_EXACTA,\\\\\\\\\\\"99/99/9999\\\\\\\\\\\")\\\". Para contenido de celda usa el mismo TText y la misma semantica. Usa exclusivamente referencias exactas de CAMPOS_Y_VARIABLES_DISPONIBLES; no inventes campos. Si la instruccion pide un dato/campo y no existe una referencia compatible, no conviertas su descripcion en texto fijo: omite esa parte o devuelve {\\\"commands\\\":[]}. En TTable, para CADA seccion usada, el orden obligatorio es: tableInsertLine; N-1 tableInsertColumn para obtener N columnas; despues los create.targetCell. El contenido header exige linea header y el contenido detail exige linea detail; antes de cellIndex K deben existir al menos K+1 columnas en esa misma linea. Nunca uses create.targetCell sobre una linea o celda inexistente. Para una celda vacia de una TTable existente seleccionada usa exactamente {\\\"command\\\":\\\"create\\\",\\\"type\\\":\\\"TText\\\",\\\"targetCell\\\":{\\\"table\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"cellIndex\\\":K},\\\"properties\\\":{\\\"cText\\\":\\\"REFERENCIA_EXACTA\\\"}}. Para una TTable existente identificada table puede ser {\\\"ids\\\":[\\\"id_real\\\"]}; nunca uses {\\\"cId\\\":\\\"...\\\"}. Para una tabla creada en ESTA respuesta, todas las estructuras y targetCell.table usan siempre {\\\"ref\\\":\\\"tabla1\\\"}, nunca \\\"selection\\\". Una lista de N nombres de columnas son N titulos fijos TText de header con cText=\\\"\\\\\\\\\\\"TITULO\\\\\\\\\\\"\\\"; si ademas se piden sus campos o campos disponibles, crea header Y detail, cada seccion con su tableInsertLine y exactamente N-1 inserciones, y despues N TText por seccion. Esquema minimo de dos secciones y dos columnas: create TTable ref tabla1; tableInsertLine header; tableInsertColumn header columnIndex 1; tableInsertLine detail; tableInsertColumn detail columnIndex 1; despues create.targetCell header 0 y 1, y detail 0 y 1, todos con table:{\\\"ref\\\":\\\"tabla1\\\"}. Alinear el contenido o texto a izquierda/centro/derecha usa setProperty con property:\\\"cTextAlign\\\" y value:\\\"left\\\"|\\\"center\\\"|\\\"right\\\"; align se reserva para alinear geometricamente varios objetos.\"},{\"role\":\"user\",\"content\":\"SELECCION_ACTUAL_SCOPE=selection:\\n[]\\nDOCUMENTO_COMPLETO_SCOPE=global:\\n[]\\nGLOBAL_COUNTS:\\nGLOBAL_IDS_BY_TYPE:\\nPROPIEDADES COMUNES EDITABLES: cBackgroundColor:string=Dimensiones y Color / Color de fondo,cBorderColor:string=Borde / Color,cCondition:string,cFillColor2:string,cFillColor3:string,cFillStyle:string,cFontFamily:string,cShadowColor:string,cText:string,cTextAlign:string,cTextColor:string=Texto / Color,cTextFitMode:string,cTextVerticalAlign:string,lAllowPageBreak:boolean,lBorderBottom:boolean,lBorderLeft:boolean,lBorderRight:boolean,lBorderTop:boolean,lFontBold:boolean=Texto / Negrita,lFontItalic:boolean=Texto / Cursiva,lFontStrikeout:boolean,lFontUnderline:boolean,lForceWrap:boolean,lKeepEmptyParagraphs:boolean,lLocked:boolean,lTextAdjusted:boolean,lTextWrap:boolean,lTrimSpaces:boolean,lVisible:boolean,nBorderWidth:number,nFillOpacity:number,nFontSize:number=Texto / Tamaño,nLayerId:number,nLineSpacing:number,nOpacity:number=Transformación / Opacidad,nPaddingBottom:number,nPaddingLeft:number,nPaddingRight:number,nPaddingTop:number,nParagraphSpacing:number,nRotation:number,nRounded:number,nShadowSize:number,nShadowTransparency:number,nTextDecimalPosition:number,nTextOpacity:number,nZIndex:number\\nCOLORES CANÓNICOS: rojo:#ff0000 · verde:#008000 · verde oscuro:#006400 · azul:#0000ff · azul oscuro:#00008b · amarillo:#ffff00 · gris claro:#d3d3d3\\nCAMPOS_Y_VARIABLES_DISPONIBLES\\nTIPOS:C=texto,N=numero,D=fecha,I=imagen,M=memo,L=booleano\\n\\nINSTRUCCIÓN:\\npon los seleccionados en rojo\"}],\"stream\":false,\"format\":\"json\",\"keep_alive\":-1,\"options\":{\"temperature\":0,\"top_p\":1,\"top_k\":0,\"repeat_penalty\":1.1,\"frequency_penalty\":0,\"presence_penalty\":0,\"num_ctx\":65536,\"num_batch\":4096,\"num_thread\":10,\"num_gpu\":99,\"num_predict\":4096},\"think\":\"low\"}",
                        "cHttpBody": "{\"model\":\"gpt-oss:20b\",\"created_at\":\"2026-08-12T22:20:28.3893975Z\",\"message\":{\"role\":\"assistant\",\"content\":\"{\\\"commands\\\":[{\\\"command\\\":\\\"setProperty\\\",\\\"target\\\":\\\"selection\\\",\\\"property\\\":\\\"cBorderColor\\\",\\\"value\\\":\\\"#ff0000\\\"}]}\",\"thinking\":\"Need setProperty color red. target selection. property cBorderColor? or cBackgroundColor? \\\"en rojo\\\" likely border. Use cBorderColor.\"},\"done\":true,\"done_reason\":\"stop\",\"total_duration\":15384288700,\"load_duration\":206113500,\"prompt_eval_count\":3686,\"prompt_eval_duration\":742175000,\"eval_count\":28,\"eval_duration\":350549000}",
                        "hMetrics": {
                            "total_duration": 15384288700,
                            "load_duration": 206113500,
                            "prompt_eval_count": 3686,
                            "prompt_eval_duration": 742175000,
                            "eval_count": 28,
                            "eval_duration": 350549000,
                            "unattributed_duration": 14085451200
                        },
                        "hCommands": {
                            "commands": [
                                {
                                    "command": "setProperty",
                                    "target": "selection",
                                    "property": "cBorderColor",
                                    "value": "#ff0000"
                                }
                            ]
                        },
                        "lValid": true,
                        "nCreates": 0,
                        "nChanges": 0,
                        "nDeletes": 0,
                        "nStructures": 0,
                        "nGeneratedIds": 0,
                        "nOperations": 1,
                        "nFinalOperations": 1,
                        "cValidation": "Shape commands válida; validación de ejecución pendiente",
                        "nResponseMilliseconds": 15394.538,
                        "tRequestStartedAt": "2026-08-13T00:20:12.997068+02:00",
                        "tResponseFinishedAt": "2026-08-13T00:20:28.391623+02:00",
                        "hPromptDiagnostics": {
                            "nSystemCharacters": 13534,
                            "nUserCharacters": 1498,
                            "nPromptCharacters": 15033,
                            "nPromptCharactersBeforeFields": 12842,
                            "nFieldsCharacters": 88,
                            "nPromptTokensBeforeEstimated": 3211,
                            "nPromptTokensAfterEstimated": 3759,
                            "nContextTokens": 65536,
                            "lPromptFitsContext": true,
                            "hFields": {
                                "nGroups": 0,
                                "nFields": 0,
                                "nUserVariables": 0,
                                "nAccumulators": 0
                            }
                        }
                    },
                    "commands": [
                        {
                            "command": "setProperty",
                            "target": "selection",
                            "property": "cBorderColor",
                            "value": "#ff0000"
                        }
                    ],
                    "valid": true
                },
                {
                    "id": "F_bold",
                    "instruction": "ponlo en negrita",
                    "response": {
                        "cInstruction": "ponlo en negrita",
                        "cProvider": "Ollama",
                        "cModelSelection": "Ollama — GPT-OSS 20B",
                        "cModel": "gpt-oss:20b",
                        "cRepresentation": "COMMANDS",
                        "cRawResponse": "{\"commands\":[{\"command\":\"setProperty\",\"target\":\"selection\",\"property\":\"lFontBold\",\"value\":true}]}",
                        "cThinking": "Need to set bold property for selection. So command setProperty target:\"selection\" property:\"lFontBold\" value:true.",
                        "cOllamaRequest": "{\"model\":\"gpt-oss:20b\",\"messages\":[{\"role\":\"system\",\"content\":\"Interpreta la instrucción y devuelve únicamente JSON válido con la forma {\\\"commands\\\":[{\\\"command\\\":\\\"setProperty\\\",\\\"target\\\":\\\"selection\\\" o {\\\"ids\\\":[\\\"id_real\\\"]},\\\"property\\\":\\\"propiedad_real\\\",\\\"value\\\":valor}]}. Cada comando DEBE usar la clave command (nunca type) y target. Comandos permitidos: setProperty, move, resize, delete, align, distribute, reorder, duplicate, tableMoveColumn, tableSetColumnWidth, tableInsertColumn, tableDeleteColumn, tableInsertLine, tableDeleteLine, tableMoveLine, tableSetLineHeight, tableSetLineBackground, tableSetLineBorderColor, tableSetLineBorderWidth, tableSetLinePadding, tableSetLineBorderRadius, tableSetLineBorderSide, tableSetLineVerticalSeparators, tableSetLineZebraEnabled, tableSetLineZebraColor, tableSetLineCondition, tableSetLineSuppressCondition, tableSetLineBackgroundColorFormula, tableSetLineBorderColorFormula. Prioridad: propiedad o estilo → setProperty; desplazamiento relativo → move; tamaño relativo → resize; alineación de varios objetos → align; eliminar objetos → delete. Para eliminar usa exactamente {\\\"command\\\":\\\"delete\\\",\\\"target\\\":\\\"selection\\\"}. Si se pide duplicar, reducir o cambiar el tamaño, devuelve únicamente resize y no uses setProperty para propiedades numéricas. Para setProperty usa exactamente property y value, nunca name ni valores como *2. Para move usa {\\\"command\\\":\\\"move\\\",\\\"target\\\":\\\"selection\\\",\\\"dx\\\":10,\\\"dy\\\":0}; para resize usa {\\\"command\\\":\\\"resize\\\",\\\"target\\\":\\\"selection\\\",\\\"scaleX\\\":0.5,\\\"scaleY\\\":0.5}. Para alinear usa exactamente {\\\"command\\\":\\\"align\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"left\\\"}; modos válidos: left|right|top|bottom|horizontalCenter|verticalCenter. Si la orden se refiere a los objetos seleccionados, usa target:\\\"selection\\\". No inventes IDs ni calcules coordenadas o dimensiones finales. Para distribuir usa exactamente {\\\"command\\\":\\\"distribute\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"horizontal\\\"}; modos válidos: horizontal|vertical. Para reordenar usa exactamente {\\\"command\\\":\\\"reorder\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"bringToFront\\\"}; modos válidos: bringToFront=traer al frente, sendToBack=enviar al fondo, bringForward=subir un nivel, sendBackward=bajar un nivel. Para duplicar usa exactamente {\\\"command\\\":\\\"duplicate\\\",\\\"target\\\":\\\"selection\\\"}. Para tablas usa únicamente estas formas: {\\\"command\\\":\\\"tableMoveColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"fromIndex\\\":2,\\\"toIndex\\\":0}, {\\\"command\\\":\\\"tableSetColumnWidth\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":0,\\\"width\\\":30}, {\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2}, {\\\"command\\\":\\\"tableDeleteColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2}, {\\\"command\\\":\\\"tableInsertLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":1}, {\\\"command\\\":\\\"tableDeleteLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":1}, {\\\"command\\\":\\\"tableMoveLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"fromIndex\\\":1,\\\"toIndex\\\":0}, {\\\"command\\\":\\\"tableSetLineHeight\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"height\\\":12}, {\\\"command\\\":\\\"tableSetLineBackground\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"color\\\":\\\"#d3d3d3\\\"}; section: header|groupHeader|detail|groupFooter|footer. Los índices son enteros cero-basados y no negativos. tableSetLineHeight usa altura fija en milímetros >=1. tableSetLineBackground usa únicamente color HEX fijo; no usa fórmulas ni paths privados. Insertar columna usa columnIndex como posición antes de la columna existente; si coincide con el número actual de columnas, añade al final. Insertar línea usa lineIndex como posición antes de la línea existente; si coincide con el número actual de líneas, añade al final. No uses hSections, aLines ni aCells. Semántica de líneas OBLIGATORIA: si una sección tiene una sola línea, basta mencionar la sección y usa lineIndex 0. Si tiene varias líneas, una operación estructural debe indicar la línea; si no la indica y no dice todas, devuelve EXACTAMENTE {\\\"commands\\\":[]}. Solo si dice todas las líneas genera una operación por cada línea existente. Esta regla no afecta a objetos visuales de celda, que siguen usando commands normales. Para cambiar altura o fondo fijo de una línea de TTable usa obligatoriamente tableSetLineHeight o tableSetLineBackground con section y lineIndex; no uses setProperty para esas operaciones. Shapes adicionales de línea: {\\\"command\\\":\\\"tableSetLineBorderColor\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"color\\\":\\\"#0000ff\\\"}, {\\\"command\\\":\\\"tableSetLineBorderWidth\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"width\\\":1}, {\\\"command\\\":\\\"tableSetLinePadding\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"side\\\":\\\"nTop\\\",\\\"value\\\":2}, {\\\"command\\\":\\\"tableSetLineBorderRadius\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"radius\\\":2}, {\\\"command\\\":\\\"tableSetLineBorderSide\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"side\\\":\\\"top\\\",\\\"visible\\\":true}, {\\\"command\\\":\\\"tableSetLineVerticalSeparators\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"visible\\\":true}, {\\\"command\\\":\\\"tableSetLineCondition\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"DETAIL.cantidad > 0\\\"}, {\\\"command\\\":\\\"tableSetLineSuppressCondition\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"DETAIL.importe == 0\\\"}, {\\\"command\\\":\\\"tableSetLineBackgroundColorFormula\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"IF(...)\\\"}, {\\\"command\\\":\\\"tableSetLineBorderColorFormula\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"IF(...)\\\"}. Las cuatro primitivas de fórmula reciben formula como string literal y aceptan string vacío para borrar; no evalúes ni cambies la sintaxis. Usa la primitiva específica según sea condición, supresión o fórmula de color; no uses paths hBorder, hBackground ni setProperty. Si la instrucción menciona una línea, cabecera, detalle o pie, el color de borde de esa línea usa tableSetLineBorderColor y nunca setProperty. Zebra solo existe en líneas detail. Shapes exactas: {\\\"command\\\":\\\"tableSetLineZebraEnabled\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"enabled\\\":true} y {\\\"command\\\":\\\"tableSetLineZebraColor\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"role\\\":\\\"odd\\\",\\\"color\\\":\\\"#d3d3d3\\\"}. Usa enabled booleano para activar o desactivar y role odd/even para filas impares/pares. No uses hZebraPattern ni paths privados. REGLA DE SCOPE OBLIGATORIA: estos, ellos, los seleccionados y pronombres equivalentes -> target:\\\"selection\\\". Todos, todas, todo el documento, todos los objetos o todos los objetos de un tipo -> target:{\\\"ids\\\":[...]} usando todos los cId coincidentes de DOCUMENTO_COMPLETO_SCOPE=global, incluidos objetos anidados en TTable. Si la selección está vacía, una orden global debe usar siempre ids. Para una orden global no uses target:\\\"selection\\\" ni mezcles ambos targets. También se permite create: {\\\"command\\\":\\\"create\\\",\\\"type\\\":\\\"TText\\\",\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\\\\\"texto\\\\\\\\\\\"\\\"}}. En create describe únicamente lo solicitado: incluye solo el tipo, contenido, posición y propiedades que la instrucción pida explícitamente; el diseñador completa los defaults reales. Tipos reales: TText,TRectangle,TEllipse,TImage,TLine,TBarcode,richText,TFormattedText,TTable. Properties solo editables, nunca cId, defaults, estructura interna ni geometría. position usa {\\\"x\\\":20,\\\"y\\\":30}. Para crear una tabla usa {\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"tabla1\\\",\\\"type\\\":\\\"TTable\\\"}; las primitives TTable posteriores pueden usar target:{\\\"ref\\\":\\\"tabla1\\\"}. Una TTable recién creada tiene las secciones vacías. Antes de insertar columnas o modificar una línea, crea esa línea con tableInsertLine. tableInsertLine crea siempre una línea válida con exactamente 1 columna inicial. SEMÁNTICA OBLIGATORIA DEL NÚMERO DE COLUMNAS: \\\"de N columnas\\\", \\\"con N columnas\\\" y \\\"que tenga N columnas\\\" expresan el TOTAL FINAL deseado; genera exactamente N menos las columnas actuales operaciones tableInsertColumn. Después de tableInsertLine ya hay 1 columna: para una línea de 4 columnas genera exactamente 3 tableInsertColumn y el total final es 4, nunca 4 inserciones. \\\"añade N columnas\\\", \\\"agrega N columnas\\\", \\\"inserta N columnas más\\\" y equivalentes explícitos expresan una CANTIDAD ADICIONAL; genera exactamente N tableInsertColumn. La fachada ejecuta literalmente esas inserciones y no corrige ni reinterpreta el número. Ejemplo total final 4: {\\\"commands\\\":[{\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"tabla1\\\",\\\"type\\\":\\\"TTable\\\"},{\\\"command\\\":\\\"tableInsertLine\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":1},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":3}]}. No envíes hSections, aLines ni aCells en create. Para crear contenido real en una celda usa {\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"txt1\\\",\\\"type\\\":\\\"TText\\\",\\\"targetCell\\\":{\\\"table\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"cellIndex\\\":0},\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\"Título\\\\\\\"\\\"}}; table admite \\\"selection\\\", {\\\"ids\\\":[\\\"id_real\\\"]} o {\\\"ref\\\":\\\"tabla1\\\"}. Tipos manuales admitidos en celda: TText,richText,TBarcode,TImage. Si la instrucción enumera contenidos o títulos, crea un objeto por cada literal en la celda correspondiente; no omitas esos contenidos. No uses position ni geometría para contenido de celda. Una ref es temporal dentro de esta respuesta: el create declara ref:\\\"new1\\\" y un comando posterior apunta al mismo objeto con target:{\\\"ref\\\":\\\"new1\\\"}. Ejemplo: {\\\"commands\\\":[{\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"new1\\\",\\\"type\\\":\\\"TText\\\",\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\\\\\"TOTAL\\\\\\\\\\\"\\\"}},{\\\"command\\\":\\\"resize\\\",\\\"target\\\":{\\\"ref\\\":\\\"new1\\\"},\\\"scaleX\\\":2,\\\"scaleY\\\":2}]}. PLANIFICACION INTERNA PARA INSTRUCCIONES COMPLEJAS: antes de devolver Commands, divide mentalmente la peticion en bloques visuales, asigna posiciones y tamanos aproximados, enumera todos los requisitos explicitos, ordena los commands por dependencias y revisa que no falte ningun requisito realizable. No devuelvas ni expliques este plan; la salida sigue siendo solo {\\\"commands\\\":[...]}. En disenos completos organiza conceptualmente cabecera superior, datos principales, bloque central, totales y pie cuando hayan sido pedidos y sean realizables. Cada objeto visual explicitamente solicitado requiere su propio create. Asigna position y, cuando proceda, move o resize a los objetos raiz; evita que sus cajas se solapen salvo peticion expresa. Crear contenido no sustituye sus estilos: incluye los colores, negrita, alineacion, tamano y fondo pedidos usando propiedades o commands ya disponibles. Para un objeto interno nuevo, incluye sus estilos en create.properties o declara ref en create y usa despues target:{\\\"ref\\\":\\\"...\\\"}; targetCell solo existe en create y nunca es target de setProperty. Todo texto fijo visible usa cText como expresion literal canonica entre comillas. Si se pide un formato y ya existe una sintaxis canonica disponible, usala sin inventar funciones. Si existe una referencia real claramente compatible con un dato solicitado, usala en vez de crear ese dato como literal. Si una columna debe ser mas ancha, incluye tableSetColumnWidth explicitamente. En planes largos prefiere: limpieza; contenedores; estructura; objetos internos; propiedades; geometria; estilos finales, salvo que una dependencia exija otro orden. Omite de forma segura solo lo que no pueda realizarse por falta de campos o capacidades. CTEXT CANONICO: texto fijo=\\\"\\\\\\\\\\\"FACTURA\\\\\\\\\\\"\\\"; campo=REFERENCIA_EXACTA; texto+campo=\\\"\\\\\\\\\\\"Factura: \\\\\\\\\\\"+REFERENCIA_EXACTA\\\"; formula=\\\"Transform(REFERENCIA_EXACTA,\\\\\\\\\\\"99/99/9999\\\\\\\\\\\")\\\". Para contenido de celda usa el mismo TText y la misma semantica. Usa exclusivamente referencias exactas de CAMPOS_Y_VARIABLES_DISPONIBLES; no inventes campos. Si la instruccion pide un dato/campo y no existe una referencia compatible, no conviertas su descripcion en texto fijo: omite esa parte o devuelve {\\\"commands\\\":[]}. En TTable, para CADA seccion usada, el orden obligatorio es: tableInsertLine; N-1 tableInsertColumn para obtener N columnas; despues los create.targetCell. El contenido header exige linea header y el contenido detail exige linea detail; antes de cellIndex K deben existir al menos K+1 columnas en esa misma linea. Nunca uses create.targetCell sobre una linea o celda inexistente. Para una celda vacia de una TTable existente seleccionada usa exactamente {\\\"command\\\":\\\"create\\\",\\\"type\\\":\\\"TText\\\",\\\"targetCell\\\":{\\\"table\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"cellIndex\\\":K},\\\"properties\\\":{\\\"cText\\\":\\\"REFERENCIA_EXACTA\\\"}}. Para una TTable existente identificada table puede ser {\\\"ids\\\":[\\\"id_real\\\"]}; nunca uses {\\\"cId\\\":\\\"...\\\"}. Para una tabla creada en ESTA respuesta, todas las estructuras y targetCell.table usan siempre {\\\"ref\\\":\\\"tabla1\\\"}, nunca \\\"selection\\\". Una lista de N nombres de columnas son N titulos fijos TText de header con cText=\\\"\\\\\\\\\\\"TITULO\\\\\\\\\\\"\\\"; si ademas se piden sus campos o campos disponibles, crea header Y detail, cada seccion con su tableInsertLine y exactamente N-1 inserciones, y despues N TText por seccion. Esquema minimo de dos secciones y dos columnas: create TTable ref tabla1; tableInsertLine header; tableInsertColumn header columnIndex 1; tableInsertLine detail; tableInsertColumn detail columnIndex 1; despues create.targetCell header 0 y 1, y detail 0 y 1, todos con table:{\\\"ref\\\":\\\"tabla1\\\"}. Alinear el contenido o texto a izquierda/centro/derecha usa setProperty con property:\\\"cTextAlign\\\" y value:\\\"left\\\"|\\\"center\\\"|\\\"right\\\"; align se reserva para alinear geometricamente varios objetos.\"},{\"role\":\"user\",\"content\":\"SELECCION_ACTUAL_SCOPE=selection:\\n[]\\nDOCUMENTO_COMPLETO_SCOPE=global:\\n[]\\nGLOBAL_COUNTS:\\nGLOBAL_IDS_BY_TYPE:\\nPROPIEDADES COMUNES EDITABLES: cBackgroundColor:string=Dimensiones y Color / Color de fondo,cBorderColor:string=Borde / Color,cCondition:string,cFillColor2:string,cFillColor3:string,cFillStyle:string,cFontFamily:string,cShadowColor:string,cText:string,cTextAlign:string,cTextColor:string=Texto / Color,cTextFitMode:string,cTextVerticalAlign:string,lAllowPageBreak:boolean,lBorderBottom:boolean,lBorderLeft:boolean,lBorderRight:boolean,lBorderTop:boolean,lFontBold:boolean=Texto / Negrita,lFontItalic:boolean=Texto / Cursiva,lFontStrikeout:boolean,lFontUnderline:boolean,lForceWrap:boolean,lKeepEmptyParagraphs:boolean,lLocked:boolean,lTextAdjusted:boolean,lTextWrap:boolean,lTrimSpaces:boolean,lVisible:boolean,nBorderWidth:number,nFillOpacity:number,nFontSize:number=Texto / Tamaño,nLayerId:number,nLineSpacing:number,nOpacity:number=Transformación / Opacidad,nPaddingBottom:number,nPaddingLeft:number,nPaddingRight:number,nPaddingTop:number,nParagraphSpacing:number,nRotation:number,nRounded:number,nShadowSize:number,nShadowTransparency:number,nTextDecimalPosition:number,nTextOpacity:number,nZIndex:number\\nCOLORES CANÓNICOS: rojo:#ff0000 · verde:#008000 · verde oscuro:#006400 · azul:#0000ff · azul oscuro:#00008b · amarillo:#ffff00 · gris claro:#d3d3d3\\nCAMPOS_Y_VARIABLES_DISPONIBLES\\nTIPOS:C=texto,N=numero,D=fecha,I=imagen,M=memo,L=booleano\\n\\nINSTRUCCIÓN:\\nponlo en negrita\"}],\"stream\":false,\"format\":\"json\",\"keep_alive\":-1,\"options\":{\"temperature\":0,\"top_p\":1,\"top_k\":0,\"repeat_penalty\":1.1,\"frequency_penalty\":0,\"presence_penalty\":0,\"num_ctx\":65536,\"num_batch\":4096,\"num_thread\":10,\"num_gpu\":99,\"num_predict\":4096},\"think\":\"low\"}",
                        "cHttpBody": "{\"model\":\"gpt-oss:20b\",\"created_at\":\"2026-08-12T22:20:29.5238896Z\",\"message\":{\"role\":\"assistant\",\"content\":\"{\\\"commands\\\":[{\\\"command\\\":\\\"setProperty\\\",\\\"target\\\":\\\"selection\\\",\\\"property\\\":\\\"lFontBold\\\",\\\"value\\\":true}]}\",\"thinking\":\"Need to set bold property for selection. So command setProperty target:\\\"selection\\\" property:\\\"lFontBold\\\" value:true.\"},\"done\":true,\"done_reason\":\"stop\",\"total_duration\":1118127000,\"load_duration\":197804900,\"prompt_eval_count\":3680,\"prompt_eval_duration\":13907000,\"eval_count\":25,\"eval_duration\":309356000}",
                        "hMetrics": {
                            "total_duration": 1118127000,
                            "load_duration": 197804900,
                            "prompt_eval_count": 3680,
                            "prompt_eval_duration": 13907000,
                            "eval_count": 25,
                            "eval_duration": 309356000,
                            "unattributed_duration": 597059100
                        },
                        "hCommands": {
                            "commands": [
                                {
                                    "command": "setProperty",
                                    "target": "selection",
                                    "property": "lFontBold",
                                    "value": true
                                }
                            ]
                        },
                        "lValid": true,
                        "nCreates": 0,
                        "nChanges": 0,
                        "nDeletes": 0,
                        "nStructures": 0,
                        "nGeneratedIds": 0,
                        "nOperations": 1,
                        "nFinalOperations": 1,
                        "cValidation": "Shape commands válida; validación de ejecución pendiente",
                        "nResponseMilliseconds": 1133.76,
                        "tRequestStartedAt": "2026-08-13T00:20:28.392175+02:00",
                        "tResponseFinishedAt": "2026-08-13T00:20:29.525952+02:00",
                        "hPromptDiagnostics": {
                            "nSystemCharacters": 13534,
                            "nUserCharacters": 1485,
                            "nPromptCharacters": 15020,
                            "nPromptCharactersBeforeFields": 12829,
                            "nFieldsCharacters": 88,
                            "nPromptTokensBeforeEstimated": 3208,
                            "nPromptTokensAfterEstimated": 3755,
                            "nContextTokens": 65536,
                            "lPromptFitsContext": true,
                            "hFields": {
                                "nGroups": 0,
                                "nFields": 0,
                                "nUserVariables": 0,
                                "nAccumulators": 0
                            }
                        }
                    },
                    "commands": [
                        {
                            "command": "setProperty",
                            "target": "selection",
                            "property": "lFontBold",
                            "value": true
                        }
                    ],
                    "valid": true
                },
                {
                    "id": "G_combined",
                    "instruction": "muévelos 10 mm a la derecha y hazlos a la mitad",
                    "response": {
                        "cInstruction": "muévelos 10 mm a la derecha y hazlos a la mitad",
                        "cProvider": "Ollama",
                        "cModelSelection": "Ollama — GPT-OSS 20B",
                        "cModel": "gpt-oss:20b",
                        "cRepresentation": "COMMANDS",
                        "cRawResponse": "{\"commands\":[{\"command\":\"move\",\"target\":\"selection\",\"dx\":10,\"dy\":0},{\"command\":\"resize\",\"target\":\"selection\",\"scaleX\":0.5,\"scaleY\":0.5}]}",
                        "cThinking": "We need to move selection by 10 mm right and resize to half. Use move dx:10 dy:0, then resize scaleX:0.5 scaleY:0.5. Output JSON with commands array.",
                        "cOllamaRequest": "{\"model\":\"gpt-oss:20b\",\"messages\":[{\"role\":\"system\",\"content\":\"Interpreta la instrucción y devuelve únicamente JSON válido con la forma {\\\"commands\\\":[{\\\"command\\\":\\\"setProperty\\\",\\\"target\\\":\\\"selection\\\" o {\\\"ids\\\":[\\\"id_real\\\"]},\\\"property\\\":\\\"propiedad_real\\\",\\\"value\\\":valor}]}. Cada comando DEBE usar la clave command (nunca type) y target. Comandos permitidos: setProperty, move, resize, delete, align, distribute, reorder, duplicate, tableMoveColumn, tableSetColumnWidth, tableInsertColumn, tableDeleteColumn, tableInsertLine, tableDeleteLine, tableMoveLine, tableSetLineHeight, tableSetLineBackground, tableSetLineBorderColor, tableSetLineBorderWidth, tableSetLinePadding, tableSetLineBorderRadius, tableSetLineBorderSide, tableSetLineVerticalSeparators, tableSetLineZebraEnabled, tableSetLineZebraColor, tableSetLineCondition, tableSetLineSuppressCondition, tableSetLineBackgroundColorFormula, tableSetLineBorderColorFormula. Prioridad: propiedad o estilo → setProperty; desplazamiento relativo → move; tamaño relativo → resize; alineación de varios objetos → align; eliminar objetos → delete. Para eliminar usa exactamente {\\\"command\\\":\\\"delete\\\",\\\"target\\\":\\\"selection\\\"}. Si se pide duplicar, reducir o cambiar el tamaño, devuelve únicamente resize y no uses setProperty para propiedades numéricas. Para setProperty usa exactamente property y value, nunca name ni valores como *2. Para move usa {\\\"command\\\":\\\"move\\\",\\\"target\\\":\\\"selection\\\",\\\"dx\\\":10,\\\"dy\\\":0}; para resize usa {\\\"command\\\":\\\"resize\\\",\\\"target\\\":\\\"selection\\\",\\\"scaleX\\\":0.5,\\\"scaleY\\\":0.5}. Para alinear usa exactamente {\\\"command\\\":\\\"align\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"left\\\"}; modos válidos: left|right|top|bottom|horizontalCenter|verticalCenter. Si la orden se refiere a los objetos seleccionados, usa target:\\\"selection\\\". No inventes IDs ni calcules coordenadas o dimensiones finales. Para distribuir usa exactamente {\\\"command\\\":\\\"distribute\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"horizontal\\\"}; modos válidos: horizontal|vertical. Para reordenar usa exactamente {\\\"command\\\":\\\"reorder\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"bringToFront\\\"}; modos válidos: bringToFront=traer al frente, sendToBack=enviar al fondo, bringForward=subir un nivel, sendBackward=bajar un nivel. Para duplicar usa exactamente {\\\"command\\\":\\\"duplicate\\\",\\\"target\\\":\\\"selection\\\"}. Para tablas usa únicamente estas formas: {\\\"command\\\":\\\"tableMoveColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"fromIndex\\\":2,\\\"toIndex\\\":0}, {\\\"command\\\":\\\"tableSetColumnWidth\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":0,\\\"width\\\":30}, {\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2}, {\\\"command\\\":\\\"tableDeleteColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2}, {\\\"command\\\":\\\"tableInsertLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":1}, {\\\"command\\\":\\\"tableDeleteLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":1}, {\\\"command\\\":\\\"tableMoveLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"fromIndex\\\":1,\\\"toIndex\\\":0}, {\\\"command\\\":\\\"tableSetLineHeight\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"height\\\":12}, {\\\"command\\\":\\\"tableSetLineBackground\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"color\\\":\\\"#d3d3d3\\\"}; section: header|groupHeader|detail|groupFooter|footer. Los índices son enteros cero-basados y no negativos. tableSetLineHeight usa altura fija en milímetros >=1. tableSetLineBackground usa únicamente color HEX fijo; no usa fórmulas ni paths privados. Insertar columna usa columnIndex como posición antes de la columna existente; si coincide con el número actual de columnas, añade al final. Insertar línea usa lineIndex como posición antes de la línea existente; si coincide con el número actual de líneas, añade al final. No uses hSections, aLines ni aCells. Semántica de líneas OBLIGATORIA: si una sección tiene una sola línea, basta mencionar la sección y usa lineIndex 0. Si tiene varias líneas, una operación estructural debe indicar la línea; si no la indica y no dice todas, devuelve EXACTAMENTE {\\\"commands\\\":[]}. Solo si dice todas las líneas genera una operación por cada línea existente. Esta regla no afecta a objetos visuales de celda, que siguen usando commands normales. Para cambiar altura o fondo fijo de una línea de TTable usa obligatoriamente tableSetLineHeight o tableSetLineBackground con section y lineIndex; no uses setProperty para esas operaciones. Shapes adicionales de línea: {\\\"command\\\":\\\"tableSetLineBorderColor\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"color\\\":\\\"#0000ff\\\"}, {\\\"command\\\":\\\"tableSetLineBorderWidth\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"width\\\":1}, {\\\"command\\\":\\\"tableSetLinePadding\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"side\\\":\\\"nTop\\\",\\\"value\\\":2}, {\\\"command\\\":\\\"tableSetLineBorderRadius\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"radius\\\":2}, {\\\"command\\\":\\\"tableSetLineBorderSide\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"side\\\":\\\"top\\\",\\\"visible\\\":true}, {\\\"command\\\":\\\"tableSetLineVerticalSeparators\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"visible\\\":true}, {\\\"command\\\":\\\"tableSetLineCondition\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"DETAIL.cantidad > 0\\\"}, {\\\"command\\\":\\\"tableSetLineSuppressCondition\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"DETAIL.importe == 0\\\"}, {\\\"command\\\":\\\"tableSetLineBackgroundColorFormula\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"IF(...)\\\"}, {\\\"command\\\":\\\"tableSetLineBorderColorFormula\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"IF(...)\\\"}. Las cuatro primitivas de fórmula reciben formula como string literal y aceptan string vacío para borrar; no evalúes ni cambies la sintaxis. Usa la primitiva específica según sea condición, supresión o fórmula de color; no uses paths hBorder, hBackground ni setProperty. Si la instrucción menciona una línea, cabecera, detalle o pie, el color de borde de esa línea usa tableSetLineBorderColor y nunca setProperty. Zebra solo existe en líneas detail. Shapes exactas: {\\\"command\\\":\\\"tableSetLineZebraEnabled\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"enabled\\\":true} y {\\\"command\\\":\\\"tableSetLineZebraColor\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"role\\\":\\\"odd\\\",\\\"color\\\":\\\"#d3d3d3\\\"}. Usa enabled booleano para activar o desactivar y role odd/even para filas impares/pares. No uses hZebraPattern ni paths privados. REGLA DE SCOPE OBLIGATORIA: estos, ellos, los seleccionados y pronombres equivalentes -> target:\\\"selection\\\". Todos, todas, todo el documento, todos los objetos o todos los objetos de un tipo -> target:{\\\"ids\\\":[...]} usando todos los cId coincidentes de DOCUMENTO_COMPLETO_SCOPE=global, incluidos objetos anidados en TTable. Si la selección está vacía, una orden global debe usar siempre ids. Para una orden global no uses target:\\\"selection\\\" ni mezcles ambos targets. También se permite create: {\\\"command\\\":\\\"create\\\",\\\"type\\\":\\\"TText\\\",\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\\\\\"texto\\\\\\\\\\\"\\\"}}. En create describe únicamente lo solicitado: incluye solo el tipo, contenido, posición y propiedades que la instrucción pida explícitamente; el diseñador completa los defaults reales. Tipos reales: TText,TRectangle,TEllipse,TImage,TLine,TBarcode,richText,TFormattedText,TTable. Properties solo editables, nunca cId, defaults, estructura interna ni geometría. position usa {\\\"x\\\":20,\\\"y\\\":30}. Para crear una tabla usa {\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"tabla1\\\",\\\"type\\\":\\\"TTable\\\"}; las primitives TTable posteriores pueden usar target:{\\\"ref\\\":\\\"tabla1\\\"}. Una TTable recién creada tiene las secciones vacías. Antes de insertar columnas o modificar una línea, crea esa línea con tableInsertLine. tableInsertLine crea siempre una línea válida con exactamente 1 columna inicial. SEMÁNTICA OBLIGATORIA DEL NÚMERO DE COLUMNAS: \\\"de N columnas\\\", \\\"con N columnas\\\" y \\\"que tenga N columnas\\\" expresan el TOTAL FINAL deseado; genera exactamente N menos las columnas actuales operaciones tableInsertColumn. Después de tableInsertLine ya hay 1 columna: para una línea de 4 columnas genera exactamente 3 tableInsertColumn y el total final es 4, nunca 4 inserciones. \\\"añade N columnas\\\", \\\"agrega N columnas\\\", \\\"inserta N columnas más\\\" y equivalentes explícitos expresan una CANTIDAD ADICIONAL; genera exactamente N tableInsertColumn. La fachada ejecuta literalmente esas inserciones y no corrige ni reinterpreta el número. Ejemplo total final 4: {\\\"commands\\\":[{\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"tabla1\\\",\\\"type\\\":\\\"TTable\\\"},{\\\"command\\\":\\\"tableInsertLine\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":1},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":3}]}. No envíes hSections, aLines ni aCells en create. Para crear contenido real en una celda usa {\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"txt1\\\",\\\"type\\\":\\\"TText\\\",\\\"targetCell\\\":{\\\"table\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"cellIndex\\\":0},\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\"Título\\\\\\\"\\\"}}; table admite \\\"selection\\\", {\\\"ids\\\":[\\\"id_real\\\"]} o {\\\"ref\\\":\\\"tabla1\\\"}. Tipos manuales admitidos en celda: TText,richText,TBarcode,TImage. Si la instrucción enumera contenidos o títulos, crea un objeto por cada literal en la celda correspondiente; no omitas esos contenidos. No uses position ni geometría para contenido de celda. Una ref es temporal dentro de esta respuesta: el create declara ref:\\\"new1\\\" y un comando posterior apunta al mismo objeto con target:{\\\"ref\\\":\\\"new1\\\"}. Ejemplo: {\\\"commands\\\":[{\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"new1\\\",\\\"type\\\":\\\"TText\\\",\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\\\\\"TOTAL\\\\\\\\\\\"\\\"}},{\\\"command\\\":\\\"resize\\\",\\\"target\\\":{\\\"ref\\\":\\\"new1\\\"},\\\"scaleX\\\":2,\\\"scaleY\\\":2}]}. PLANIFICACION INTERNA PARA INSTRUCCIONES COMPLEJAS: antes de devolver Commands, divide mentalmente la peticion en bloques visuales, asigna posiciones y tamanos aproximados, enumera todos los requisitos explicitos, ordena los commands por dependencias y revisa que no falte ningun requisito realizable. No devuelvas ni expliques este plan; la salida sigue siendo solo {\\\"commands\\\":[...]}. En disenos completos organiza conceptualmente cabecera superior, datos principales, bloque central, totales y pie cuando hayan sido pedidos y sean realizables. Cada objeto visual explicitamente solicitado requiere su propio create. Asigna position y, cuando proceda, move o resize a los objetos raiz; evita que sus cajas se solapen salvo peticion expresa. Crear contenido no sustituye sus estilos: incluye los colores, negrita, alineacion, tamano y fondo pedidos usando propiedades o commands ya disponibles. Para un objeto interno nuevo, incluye sus estilos en create.properties o declara ref en create y usa despues target:{\\\"ref\\\":\\\"...\\\"}; targetCell solo existe en create y nunca es target de setProperty. Todo texto fijo visible usa cText como expresion literal canonica entre comillas. Si se pide un formato y ya existe una sintaxis canonica disponible, usala sin inventar funciones. Si existe una referencia real claramente compatible con un dato solicitado, usala en vez de crear ese dato como literal. Si una columna debe ser mas ancha, incluye tableSetColumnWidth explicitamente. En planes largos prefiere: limpieza; contenedores; estructura; objetos internos; propiedades; geometria; estilos finales, salvo que una dependencia exija otro orden. Omite de forma segura solo lo que no pueda realizarse por falta de campos o capacidades. CTEXT CANONICO: texto fijo=\\\"\\\\\\\\\\\"FACTURA\\\\\\\\\\\"\\\"; campo=REFERENCIA_EXACTA; texto+campo=\\\"\\\\\\\\\\\"Factura: \\\\\\\\\\\"+REFERENCIA_EXACTA\\\"; formula=\\\"Transform(REFERENCIA_EXACTA,\\\\\\\\\\\"99/99/9999\\\\\\\\\\\")\\\". Para contenido de celda usa el mismo TText y la misma semantica. Usa exclusivamente referencias exactas de CAMPOS_Y_VARIABLES_DISPONIBLES; no inventes campos. Si la instruccion pide un dato/campo y no existe una referencia compatible, no conviertas su descripcion en texto fijo: omite esa parte o devuelve {\\\"commands\\\":[]}. En TTable, para CADA seccion usada, el orden obligatorio es: tableInsertLine; N-1 tableInsertColumn para obtener N columnas; despues los create.targetCell. El contenido header exige linea header y el contenido detail exige linea detail; antes de cellIndex K deben existir al menos K+1 columnas en esa misma linea. Nunca uses create.targetCell sobre una linea o celda inexistente. Para una celda vacia de una TTable existente seleccionada usa exactamente {\\\"command\\\":\\\"create\\\",\\\"type\\\":\\\"TText\\\",\\\"targetCell\\\":{\\\"table\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"cellIndex\\\":K},\\\"properties\\\":{\\\"cText\\\":\\\"REFERENCIA_EXACTA\\\"}}. Para una TTable existente identificada table puede ser {\\\"ids\\\":[\\\"id_real\\\"]}; nunca uses {\\\"cId\\\":\\\"...\\\"}. Para una tabla creada en ESTA respuesta, todas las estructuras y targetCell.table usan siempre {\\\"ref\\\":\\\"tabla1\\\"}, nunca \\\"selection\\\". Una lista de N nombres de columnas son N titulos fijos TText de header con cText=\\\"\\\\\\\\\\\"TITULO\\\\\\\\\\\"\\\"; si ademas se piden sus campos o campos disponibles, crea header Y detail, cada seccion con su tableInsertLine y exactamente N-1 inserciones, y despues N TText por seccion. Esquema minimo de dos secciones y dos columnas: create TTable ref tabla1; tableInsertLine header; tableInsertColumn header columnIndex 1; tableInsertLine detail; tableInsertColumn detail columnIndex 1; despues create.targetCell header 0 y 1, y detail 0 y 1, todos con table:{\\\"ref\\\":\\\"tabla1\\\"}. Alinear el contenido o texto a izquierda/centro/derecha usa setProperty con property:\\\"cTextAlign\\\" y value:\\\"left\\\"|\\\"center\\\"|\\\"right\\\"; align se reserva para alinear geometricamente varios objetos.\"},{\"role\":\"user\",\"content\":\"SELECCION_ACTUAL_SCOPE=selection:\\n[]\\nDOCUMENTO_COMPLETO_SCOPE=global:\\n[]\\nGLOBAL_COUNTS:\\nGLOBAL_IDS_BY_TYPE:\\nPROPIEDADES COMUNES EDITABLES: cBackgroundColor:string=Dimensiones y Color / Color de fondo,cBorderColor:string=Borde / Color,cCondition:string,cFillColor2:string,cFillColor3:string,cFillStyle:string,cShadowColor:string,lBorderBottom:boolean,lBorderLeft:boolean,lBorderRight:boolean,lBorderTop:boolean,lLocked:boolean,lVisible:boolean,nBorderWidth:number,nFillOpacity:number,nLayerId:number,nOpacity:number=Transformación / Opacidad,nPaddingBottom:number,nPaddingLeft:number,nPaddingRight:number,nPaddingTop:number,nRotation:number,nRounded:number,nShadowSize:number,nShadowTransparency:number,nZIndex:number\\nCOLORES CANÓNICOS: rojo:#ff0000 · verde:#008000 · verde oscuro:#006400 · azul:#0000ff · azul oscuro:#00008b · amarillo:#ffff00 · gris claro:#d3d3d3\\nCAMPOS_Y_VARIABLES_DISPONIBLES\\nTIPOS:C=texto,N=numero,D=fecha,I=imagen,M=memo,L=booleano\\n\\nINSTRUCCIÓN:\\nmuévelos 10 mm a la derecha y hazlos a la mitad\"}],\"stream\":false,\"format\":\"json\",\"keep_alive\":-1,\"options\":{\"temperature\":0,\"top_p\":1,\"top_k\":0,\"repeat_penalty\":1.1,\"frequency_penalty\":0,\"presence_penalty\":0,\"num_ctx\":65536,\"num_batch\":4096,\"num_thread\":10,\"num_gpu\":99,\"num_predict\":4096},\"think\":\"low\"}",
                        "cHttpBody": "{\"model\":\"gpt-oss:20b\",\"created_at\":\"2026-08-12T22:20:31.2139344Z\",\"message\":{\"role\":\"assistant\",\"content\":\"{\\\"commands\\\":[{\\\"command\\\":\\\"move\\\",\\\"target\\\":\\\"selection\\\",\\\"dx\\\":10,\\\"dy\\\":0},{\\\"command\\\":\\\"resize\\\",\\\"target\\\":\\\"selection\\\",\\\"scaleX\\\":0.5,\\\"scaleY\\\":0.5}]}\",\"thinking\":\"We need to move selection by 10 mm right and resize to half. Use move dx:10 dy:0, then resize scaleX:0.5 scaleY:0.5. Output JSON with commands array.\"},\"done\":true,\"done_reason\":\"stop\",\"total_duration\":1666133800,\"load_duration\":202955900,\"prompt_eval_count\":3598,\"prompt_eval_duration\":13721000,\"eval_count\":44,\"eval_duration\":553684000}",
                        "hMetrics": {
                            "total_duration": 1666133800,
                            "load_duration": 202955900,
                            "prompt_eval_count": 3598,
                            "prompt_eval_duration": 13721000,
                            "eval_count": 44,
                            "eval_duration": 553684000,
                            "unattributed_duration": 895772900
                        },
                        "hCommands": {
                            "commands": [
                                {
                                    "command": "move",
                                    "target": "selection",
                                    "dx": 10,
                                    "dy": 0
                                },
                                {
                                    "command": "resize",
                                    "target": "selection",
                                    "scaleX": 0.5,
                                    "scaleY": 0.5
                                }
                            ]
                        },
                        "lValid": true,
                        "nCreates": 0,
                        "nChanges": 0,
                        "nDeletes": 0,
                        "nStructures": 0,
                        "nGeneratedIds": 0,
                        "nOperations": 2,
                        "nFinalOperations": 2,
                        "cValidation": "Shape commands válida; validación de ejecución pendiente",
                        "nResponseMilliseconds": 1689.172,
                        "tRequestStartedAt": "2026-08-13T00:20:29.526576+02:00",
                        "tResponseFinishedAt": "2026-08-13T00:20:31.215764+02:00",
                        "hPromptDiagnostics": {
                            "nSystemCharacters": 13534,
                            "nUserCharacters": 1015,
                            "nPromptCharacters": 14550,
                            "nPromptCharactersBeforeFields": 12359,
                            "nFieldsCharacters": 88,
                            "nPromptTokensBeforeEstimated": 3090,
                            "nPromptTokensAfterEstimated": 3638,
                            "nContextTokens": 65536,
                            "lPromptFitsContext": true,
                            "hFields": {
                                "nGroups": 0,
                                "nFields": 0,
                                "nUserVariables": 0,
                                "nAccumulators": 0
                            }
                        }
                    },
                    "commands": [
                        {
                            "command": "move",
                            "target": "selection",
                            "dx": 10,
                            "dy": 0
                        },
                        {
                            "command": "resize",
                            "target": "selection",
                            "scaleX": 0.5,
                            "scaleY": 0.5
                        }
                    ],
                    "valid": true
                },
                {
                    "id": "H_text_rectangle",
                    "instruction": "hazlos el doble",
                    "response": {
                        "cInstruction": "hazlos el doble",
                        "cProvider": "Ollama",
                        "cModelSelection": "Ollama — GPT-OSS 20B",
                        "cModel": "gpt-oss:20b",
                        "cRepresentation": "COMMANDS",
                        "cRawResponse": "{\"commands\":[]}",
                        "cThinking": "The instruction: \"hazlos el doble\" meaning double them. But no context of what to double. Likely refers to previous selection? The selection is empty. So nothing to double. Should output empty commands array.",
                        "cOllamaRequest": "{\"model\":\"gpt-oss:20b\",\"messages\":[{\"role\":\"system\",\"content\":\"Interpreta la instrucción y devuelve únicamente JSON válido con la forma {\\\"commands\\\":[{\\\"command\\\":\\\"setProperty\\\",\\\"target\\\":\\\"selection\\\" o {\\\"ids\\\":[\\\"id_real\\\"]},\\\"property\\\":\\\"propiedad_real\\\",\\\"value\\\":valor}]}. Cada comando DEBE usar la clave command (nunca type) y target. Comandos permitidos: setProperty, move, resize, delete, align, distribute, reorder, duplicate, tableMoveColumn, tableSetColumnWidth, tableInsertColumn, tableDeleteColumn, tableInsertLine, tableDeleteLine, tableMoveLine, tableSetLineHeight, tableSetLineBackground, tableSetLineBorderColor, tableSetLineBorderWidth, tableSetLinePadding, tableSetLineBorderRadius, tableSetLineBorderSide, tableSetLineVerticalSeparators, tableSetLineZebraEnabled, tableSetLineZebraColor, tableSetLineCondition, tableSetLineSuppressCondition, tableSetLineBackgroundColorFormula, tableSetLineBorderColorFormula. Prioridad: propiedad o estilo → setProperty; desplazamiento relativo → move; tamaño relativo → resize; alineación de varios objetos → align; eliminar objetos → delete. Para eliminar usa exactamente {\\\"command\\\":\\\"delete\\\",\\\"target\\\":\\\"selection\\\"}. Si se pide duplicar, reducir o cambiar el tamaño, devuelve únicamente resize y no uses setProperty para propiedades numéricas. Para setProperty usa exactamente property y value, nunca name ni valores como *2. Para move usa {\\\"command\\\":\\\"move\\\",\\\"target\\\":\\\"selection\\\",\\\"dx\\\":10,\\\"dy\\\":0}; para resize usa {\\\"command\\\":\\\"resize\\\",\\\"target\\\":\\\"selection\\\",\\\"scaleX\\\":0.5,\\\"scaleY\\\":0.5}. Para alinear usa exactamente {\\\"command\\\":\\\"align\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"left\\\"}; modos válidos: left|right|top|bottom|horizontalCenter|verticalCenter. Si la orden se refiere a los objetos seleccionados, usa target:\\\"selection\\\". No inventes IDs ni calcules coordenadas o dimensiones finales. Para distribuir usa exactamente {\\\"command\\\":\\\"distribute\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"horizontal\\\"}; modos válidos: horizontal|vertical. Para reordenar usa exactamente {\\\"command\\\":\\\"reorder\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"bringToFront\\\"}; modos válidos: bringToFront=traer al frente, sendToBack=enviar al fondo, bringForward=subir un nivel, sendBackward=bajar un nivel. Para duplicar usa exactamente {\\\"command\\\":\\\"duplicate\\\",\\\"target\\\":\\\"selection\\\"}. Para tablas usa únicamente estas formas: {\\\"command\\\":\\\"tableMoveColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"fromIndex\\\":2,\\\"toIndex\\\":0}, {\\\"command\\\":\\\"tableSetColumnWidth\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":0,\\\"width\\\":30}, {\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2}, {\\\"command\\\":\\\"tableDeleteColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2}, {\\\"command\\\":\\\"tableInsertLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":1}, {\\\"command\\\":\\\"tableDeleteLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":1}, {\\\"command\\\":\\\"tableMoveLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"fromIndex\\\":1,\\\"toIndex\\\":0}, {\\\"command\\\":\\\"tableSetLineHeight\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"height\\\":12}, {\\\"command\\\":\\\"tableSetLineBackground\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"color\\\":\\\"#d3d3d3\\\"}; section: header|groupHeader|detail|groupFooter|footer. Los índices son enteros cero-basados y no negativos. tableSetLineHeight usa altura fija en milímetros >=1. tableSetLineBackground usa únicamente color HEX fijo; no usa fórmulas ni paths privados. Insertar columna usa columnIndex como posición antes de la columna existente; si coincide con el número actual de columnas, añade al final. Insertar línea usa lineIndex como posición antes de la línea existente; si coincide con el número actual de líneas, añade al final. No uses hSections, aLines ni aCells. Semántica de líneas OBLIGATORIA: si una sección tiene una sola línea, basta mencionar la sección y usa lineIndex 0. Si tiene varias líneas, una operación estructural debe indicar la línea; si no la indica y no dice todas, devuelve EXACTAMENTE {\\\"commands\\\":[]}. Solo si dice todas las líneas genera una operación por cada línea existente. Esta regla no afecta a objetos visuales de celda, que siguen usando commands normales. Para cambiar altura o fondo fijo de una línea de TTable usa obligatoriamente tableSetLineHeight o tableSetLineBackground con section y lineIndex; no uses setProperty para esas operaciones. Shapes adicionales de línea: {\\\"command\\\":\\\"tableSetLineBorderColor\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"color\\\":\\\"#0000ff\\\"}, {\\\"command\\\":\\\"tableSetLineBorderWidth\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"width\\\":1}, {\\\"command\\\":\\\"tableSetLinePadding\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"side\\\":\\\"nTop\\\",\\\"value\\\":2}, {\\\"command\\\":\\\"tableSetLineBorderRadius\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"radius\\\":2}, {\\\"command\\\":\\\"tableSetLineBorderSide\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"side\\\":\\\"top\\\",\\\"visible\\\":true}, {\\\"command\\\":\\\"tableSetLineVerticalSeparators\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"visible\\\":true}, {\\\"command\\\":\\\"tableSetLineCondition\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"DETAIL.cantidad > 0\\\"}, {\\\"command\\\":\\\"tableSetLineSuppressCondition\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"DETAIL.importe == 0\\\"}, {\\\"command\\\":\\\"tableSetLineBackgroundColorFormula\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"IF(...)\\\"}, {\\\"command\\\":\\\"tableSetLineBorderColorFormula\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"IF(...)\\\"}. Las cuatro primitivas de fórmula reciben formula como string literal y aceptan string vacío para borrar; no evalúes ni cambies la sintaxis. Usa la primitiva específica según sea condición, supresión o fórmula de color; no uses paths hBorder, hBackground ni setProperty. Si la instrucción menciona una línea, cabecera, detalle o pie, el color de borde de esa línea usa tableSetLineBorderColor y nunca setProperty. Zebra solo existe en líneas detail. Shapes exactas: {\\\"command\\\":\\\"tableSetLineZebraEnabled\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"enabled\\\":true} y {\\\"command\\\":\\\"tableSetLineZebraColor\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"role\\\":\\\"odd\\\",\\\"color\\\":\\\"#d3d3d3\\\"}. Usa enabled booleano para activar o desactivar y role odd/even para filas impares/pares. No uses hZebraPattern ni paths privados. REGLA DE SCOPE OBLIGATORIA: estos, ellos, los seleccionados y pronombres equivalentes -> target:\\\"selection\\\". Todos, todas, todo el documento, todos los objetos o todos los objetos de un tipo -> target:{\\\"ids\\\":[...]} usando todos los cId coincidentes de DOCUMENTO_COMPLETO_SCOPE=global, incluidos objetos anidados en TTable. Si la selección está vacía, una orden global debe usar siempre ids. Para una orden global no uses target:\\\"selection\\\" ni mezcles ambos targets. También se permite create: {\\\"command\\\":\\\"create\\\",\\\"type\\\":\\\"TText\\\",\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\\\\\"texto\\\\\\\\\\\"\\\"}}. En create describe únicamente lo solicitado: incluye solo el tipo, contenido, posición y propiedades que la instrucción pida explícitamente; el diseñador completa los defaults reales. Tipos reales: TText,TRectangle,TEllipse,TImage,TLine,TBarcode,richText,TFormattedText,TTable. Properties solo editables, nunca cId, defaults, estructura interna ni geometría. position usa {\\\"x\\\":20,\\\"y\\\":30}. Para crear una tabla usa {\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"tabla1\\\",\\\"type\\\":\\\"TTable\\\"}; las primitives TTable posteriores pueden usar target:{\\\"ref\\\":\\\"tabla1\\\"}. Una TTable recién creada tiene las secciones vacías. Antes de insertar columnas o modificar una línea, crea esa línea con tableInsertLine. tableInsertLine crea siempre una línea válida con exactamente 1 columna inicial. SEMÁNTICA OBLIGATORIA DEL NÚMERO DE COLUMNAS: \\\"de N columnas\\\", \\\"con N columnas\\\" y \\\"que tenga N columnas\\\" expresan el TOTAL FINAL deseado; genera exactamente N menos las columnas actuales operaciones tableInsertColumn. Después de tableInsertLine ya hay 1 columna: para una línea de 4 columnas genera exactamente 3 tableInsertColumn y el total final es 4, nunca 4 inserciones. \\\"añade N columnas\\\", \\\"agrega N columnas\\\", \\\"inserta N columnas más\\\" y equivalentes explícitos expresan una CANTIDAD ADICIONAL; genera exactamente N tableInsertColumn. La fachada ejecuta literalmente esas inserciones y no corrige ni reinterpreta el número. Ejemplo total final 4: {\\\"commands\\\":[{\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"tabla1\\\",\\\"type\\\":\\\"TTable\\\"},{\\\"command\\\":\\\"tableInsertLine\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":1},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":3}]}. No envíes hSections, aLines ni aCells en create. Para crear contenido real en una celda usa {\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"txt1\\\",\\\"type\\\":\\\"TText\\\",\\\"targetCell\\\":{\\\"table\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"cellIndex\\\":0},\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\"Título\\\\\\\"\\\"}}; table admite \\\"selection\\\", {\\\"ids\\\":[\\\"id_real\\\"]} o {\\\"ref\\\":\\\"tabla1\\\"}. Tipos manuales admitidos en celda: TText,richText,TBarcode,TImage. Si la instrucción enumera contenidos o títulos, crea un objeto por cada literal en la celda correspondiente; no omitas esos contenidos. No uses position ni geometría para contenido de celda. Una ref es temporal dentro de esta respuesta: el create declara ref:\\\"new1\\\" y un comando posterior apunta al mismo objeto con target:{\\\"ref\\\":\\\"new1\\\"}. Ejemplo: {\\\"commands\\\":[{\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"new1\\\",\\\"type\\\":\\\"TText\\\",\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\\\\\"TOTAL\\\\\\\\\\\"\\\"}},{\\\"command\\\":\\\"resize\\\",\\\"target\\\":{\\\"ref\\\":\\\"new1\\\"},\\\"scaleX\\\":2,\\\"scaleY\\\":2}]}. PLANIFICACION INTERNA PARA INSTRUCCIONES COMPLEJAS: antes de devolver Commands, divide mentalmente la peticion en bloques visuales, asigna posiciones y tamanos aproximados, enumera todos los requisitos explicitos, ordena los commands por dependencias y revisa que no falte ningun requisito realizable. No devuelvas ni expliques este plan; la salida sigue siendo solo {\\\"commands\\\":[...]}. En disenos completos organiza conceptualmente cabecera superior, datos principales, bloque central, totales y pie cuando hayan sido pedidos y sean realizables. Cada objeto visual explicitamente solicitado requiere su propio create. Asigna position y, cuando proceda, move o resize a los objetos raiz; evita que sus cajas se solapen salvo peticion expresa. Crear contenido no sustituye sus estilos: incluye los colores, negrita, alineacion, tamano y fondo pedidos usando propiedades o commands ya disponibles. Para un objeto interno nuevo, incluye sus estilos en create.properties o declara ref en create y usa despues target:{\\\"ref\\\":\\\"...\\\"}; targetCell solo existe en create y nunca es target de setProperty. Todo texto fijo visible usa cText como expresion literal canonica entre comillas. Si se pide un formato y ya existe una sintaxis canonica disponible, usala sin inventar funciones. Si existe una referencia real claramente compatible con un dato solicitado, usala en vez de crear ese dato como literal. Si una columna debe ser mas ancha, incluye tableSetColumnWidth explicitamente. En planes largos prefiere: limpieza; contenedores; estructura; objetos internos; propiedades; geometria; estilos finales, salvo que una dependencia exija otro orden. Omite de forma segura solo lo que no pueda realizarse por falta de campos o capacidades. CTEXT CANONICO: texto fijo=\\\"\\\\\\\\\\\"FACTURA\\\\\\\\\\\"\\\"; campo=REFERENCIA_EXACTA; texto+campo=\\\"\\\\\\\\\\\"Factura: \\\\\\\\\\\"+REFERENCIA_EXACTA\\\"; formula=\\\"Transform(REFERENCIA_EXACTA,\\\\\\\\\\\"99/99/9999\\\\\\\\\\\")\\\". Para contenido de celda usa el mismo TText y la misma semantica. Usa exclusivamente referencias exactas de CAMPOS_Y_VARIABLES_DISPONIBLES; no inventes campos. Si la instruccion pide un dato/campo y no existe una referencia compatible, no conviertas su descripcion en texto fijo: omite esa parte o devuelve {\\\"commands\\\":[]}. En TTable, para CADA seccion usada, el orden obligatorio es: tableInsertLine; N-1 tableInsertColumn para obtener N columnas; despues los create.targetCell. El contenido header exige linea header y el contenido detail exige linea detail; antes de cellIndex K deben existir al menos K+1 columnas en esa misma linea. Nunca uses create.targetCell sobre una linea o celda inexistente. Para una celda vacia de una TTable existente seleccionada usa exactamente {\\\"command\\\":\\\"create\\\",\\\"type\\\":\\\"TText\\\",\\\"targetCell\\\":{\\\"table\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"cellIndex\\\":K},\\\"properties\\\":{\\\"cText\\\":\\\"REFERENCIA_EXACTA\\\"}}. Para una TTable existente identificada table puede ser {\\\"ids\\\":[\\\"id_real\\\"]}; nunca uses {\\\"cId\\\":\\\"...\\\"}. Para una tabla creada en ESTA respuesta, todas las estructuras y targetCell.table usan siempre {\\\"ref\\\":\\\"tabla1\\\"}, nunca \\\"selection\\\". Una lista de N nombres de columnas son N titulos fijos TText de header con cText=\\\"\\\\\\\\\\\"TITULO\\\\\\\\\\\"\\\"; si ademas se piden sus campos o campos disponibles, crea header Y detail, cada seccion con su tableInsertLine y exactamente N-1 inserciones, y despues N TText por seccion. Esquema minimo de dos secciones y dos columnas: create TTable ref tabla1; tableInsertLine header; tableInsertColumn header columnIndex 1; tableInsertLine detail; tableInsertColumn detail columnIndex 1; despues create.targetCell header 0 y 1, y detail 0 y 1, todos con table:{\\\"ref\\\":\\\"tabla1\\\"}. Alinear el contenido o texto a izquierda/centro/derecha usa setProperty con property:\\\"cTextAlign\\\" y value:\\\"left\\\"|\\\"center\\\"|\\\"right\\\"; align se reserva para alinear geometricamente varios objetos.\"},{\"role\":\"user\",\"content\":\"SELECCION_ACTUAL_SCOPE=selection:\\n[]\\nDOCUMENTO_COMPLETO_SCOPE=global:\\n[]\\nGLOBAL_COUNTS:\\nGLOBAL_IDS_BY_TYPE:\\nPROPIEDADES COMUNES EDITABLES: cBackgroundColor:string=Dimensiones y Color / Color de fondo,cBorderColor:string=Borde / Color,cCondition:string,cFillColor2:string,cFillColor3:string,cFillStyle:string,cShadowColor:string,lBorderBottom:boolean,lBorderLeft:boolean,lBorderRight:boolean,lBorderTop:boolean,lLocked:boolean,lVisible:boolean,nBorderWidth:number,nFillOpacity:number,nLayerId:number,nOpacity:number=Transformación / Opacidad,nPaddingBottom:number,nPaddingLeft:number,nPaddingRight:number,nPaddingTop:number,nRotation:number,nRounded:number,nShadowSize:number,nShadowTransparency:number,nZIndex:number\\nCOLORES CANÓNICOS: rojo:#ff0000 · verde:#008000 · verde oscuro:#006400 · azul:#0000ff · azul oscuro:#00008b · amarillo:#ffff00 · gris claro:#d3d3d3\\nCAMPOS_Y_VARIABLES_DISPONIBLES\\nTIPOS:C=texto,N=numero,D=fecha,I=imagen,M=memo,L=booleano\\n\\nINSTRUCCIÓN:\\nhazlos el doble\"}],\"stream\":false,\"format\":\"json\",\"keep_alive\":-1,\"options\":{\"temperature\":0,\"top_p\":1,\"top_k\":0,\"repeat_penalty\":1.1,\"frequency_penalty\":0,\"presence_penalty\":0,\"num_ctx\":65536,\"num_batch\":4096,\"num_thread\":10,\"num_gpu\":99,\"num_predict\":4096},\"think\":\"low\"}",
                        "cHttpBody": "{\"model\":\"gpt-oss:20b\",\"created_at\":\"2026-08-12T22:20:32.3349203Z\",\"message\":{\"role\":\"assistant\",\"content\":\"{\\\"commands\\\":[]}\",\"thinking\":\"The instruction: \\\"hazlos el doble\\\" meaning double them. But no context of what to double. Likely refers to previous selection? The selection is empty. So nothing to double. Should output empty commands array.\"},\"done\":true,\"done_reason\":\"stop\",\"total_duration\":1115527000,\"load_duration\":199178700,\"prompt_eval_count\":3586,\"prompt_eval_duration\":13923000,\"eval_count\":5,\"eval_duration\":51544000}",
                        "hMetrics": {
                            "total_duration": 1115527000,
                            "load_duration": 199178700,
                            "prompt_eval_count": 3586,
                            "prompt_eval_duration": 13923000,
                            "eval_count": 5,
                            "eval_duration": 51544000,
                            "unattributed_duration": 850881300
                        },
                        "hCommands": {
                            "commands": []
                        },
                        "lValid": true,
                        "nCreates": 0,
                        "nChanges": 0,
                        "nDeletes": 0,
                        "nStructures": 0,
                        "nGeneratedIds": 0,
                        "nOperations": 0,
                        "nFinalOperations": 0,
                        "cValidation": "Shape commands válida; validación de ejecución pendiente",
                        "nResponseMilliseconds": 1120.382,
                        "tRequestStartedAt": "2026-08-13T00:20:31.216355+02:00",
                        "tResponseFinishedAt": "2026-08-13T00:20:32.336753+02:00",
                        "hPromptDiagnostics": {
                            "nSystemCharacters": 13534,
                            "nUserCharacters": 983,
                            "nPromptCharacters": 14518,
                            "nPromptCharactersBeforeFields": 12327,
                            "nFieldsCharacters": 88,
                            "nPromptTokensBeforeEstimated": 3082,
                            "nPromptTokensAfterEstimated": 3630,
                            "nContextTokens": 65536,
                            "lPromptFitsContext": true,
                            "hFields": {
                                "nGroups": 0,
                                "nFields": 0,
                                "nUserVariables": 0,
                                "nAccumulators": 0
                            }
                        }
                    },
                    "commands": [],
                    "valid": true
                },
                {
                    "id": "I_table_resize",
                    "instruction": "hazla a la mitad",
                    "response": {
                        "cInstruction": "hazla a la mitad",
                        "cProvider": "Ollama",
                        "cModelSelection": "Ollama — GPT-OSS 20B",
                        "cModel": "gpt-oss:20b",
                        "cRepresentation": "COMMANDS",
                        "cRawResponse": "{\"commands\":[{\"command\":\"resize\",\"target\":\"selection\",\"scaleX\":0.5,\"scaleY\":0.5}]}",
                        "cThinking": "Need to interpret instruction: \"hazla a la mitad\" meaning make it half? Probably resize selection to half size. So command resize with scaleX 0.5, scaleY 0.5. Output JSON.",
                        "cOllamaRequest": "{\"model\":\"gpt-oss:20b\",\"messages\":[{\"role\":\"system\",\"content\":\"Interpreta la instrucción y devuelve únicamente JSON válido con la forma {\\\"commands\\\":[{\\\"command\\\":\\\"setProperty\\\",\\\"target\\\":\\\"selection\\\" o {\\\"ids\\\":[\\\"id_real\\\"]},\\\"property\\\":\\\"propiedad_real\\\",\\\"value\\\":valor}]}. Cada comando DEBE usar la clave command (nunca type) y target. Comandos permitidos: setProperty, move, resize, delete, align, distribute, reorder, duplicate, tableMoveColumn, tableSetColumnWidth, tableInsertColumn, tableDeleteColumn, tableInsertLine, tableDeleteLine, tableMoveLine, tableSetLineHeight, tableSetLineBackground, tableSetLineBorderColor, tableSetLineBorderWidth, tableSetLinePadding, tableSetLineBorderRadius, tableSetLineBorderSide, tableSetLineVerticalSeparators, tableSetLineZebraEnabled, tableSetLineZebraColor, tableSetLineCondition, tableSetLineSuppressCondition, tableSetLineBackgroundColorFormula, tableSetLineBorderColorFormula. Prioridad: propiedad o estilo → setProperty; desplazamiento relativo → move; tamaño relativo → resize; alineación de varios objetos → align; eliminar objetos → delete. Para eliminar usa exactamente {\\\"command\\\":\\\"delete\\\",\\\"target\\\":\\\"selection\\\"}. Si se pide duplicar, reducir o cambiar el tamaño, devuelve únicamente resize y no uses setProperty para propiedades numéricas. Para setProperty usa exactamente property y value, nunca name ni valores como *2. Para move usa {\\\"command\\\":\\\"move\\\",\\\"target\\\":\\\"selection\\\",\\\"dx\\\":10,\\\"dy\\\":0}; para resize usa {\\\"command\\\":\\\"resize\\\",\\\"target\\\":\\\"selection\\\",\\\"scaleX\\\":0.5,\\\"scaleY\\\":0.5}. Para alinear usa exactamente {\\\"command\\\":\\\"align\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"left\\\"}; modos válidos: left|right|top|bottom|horizontalCenter|verticalCenter. Si la orden se refiere a los objetos seleccionados, usa target:\\\"selection\\\". No inventes IDs ni calcules coordenadas o dimensiones finales. Para distribuir usa exactamente {\\\"command\\\":\\\"distribute\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"horizontal\\\"}; modos válidos: horizontal|vertical. Para reordenar usa exactamente {\\\"command\\\":\\\"reorder\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"bringToFront\\\"}; modos válidos: bringToFront=traer al frente, sendToBack=enviar al fondo, bringForward=subir un nivel, sendBackward=bajar un nivel. Para duplicar usa exactamente {\\\"command\\\":\\\"duplicate\\\",\\\"target\\\":\\\"selection\\\"}. Para tablas usa únicamente estas formas: {\\\"command\\\":\\\"tableMoveColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"fromIndex\\\":2,\\\"toIndex\\\":0}, {\\\"command\\\":\\\"tableSetColumnWidth\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":0,\\\"width\\\":30}, {\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2}, {\\\"command\\\":\\\"tableDeleteColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2}, {\\\"command\\\":\\\"tableInsertLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":1}, {\\\"command\\\":\\\"tableDeleteLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":1}, {\\\"command\\\":\\\"tableMoveLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"fromIndex\\\":1,\\\"toIndex\\\":0}, {\\\"command\\\":\\\"tableSetLineHeight\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"height\\\":12}, {\\\"command\\\":\\\"tableSetLineBackground\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"color\\\":\\\"#d3d3d3\\\"}; section: header|groupHeader|detail|groupFooter|footer. Los índices son enteros cero-basados y no negativos. tableSetLineHeight usa altura fija en milímetros >=1. tableSetLineBackground usa únicamente color HEX fijo; no usa fórmulas ni paths privados. Insertar columna usa columnIndex como posición antes de la columna existente; si coincide con el número actual de columnas, añade al final. Insertar línea usa lineIndex como posición antes de la línea existente; si coincide con el número actual de líneas, añade al final. No uses hSections, aLines ni aCells. Semántica de líneas OBLIGATORIA: si una sección tiene una sola línea, basta mencionar la sección y usa lineIndex 0. Si tiene varias líneas, una operación estructural debe indicar la línea; si no la indica y no dice todas, devuelve EXACTAMENTE {\\\"commands\\\":[]}. Solo si dice todas las líneas genera una operación por cada línea existente. Esta regla no afecta a objetos visuales de celda, que siguen usando commands normales. Para cambiar altura o fondo fijo de una línea de TTable usa obligatoriamente tableSetLineHeight o tableSetLineBackground con section y lineIndex; no uses setProperty para esas operaciones. Shapes adicionales de línea: {\\\"command\\\":\\\"tableSetLineBorderColor\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"color\\\":\\\"#0000ff\\\"}, {\\\"command\\\":\\\"tableSetLineBorderWidth\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"width\\\":1}, {\\\"command\\\":\\\"tableSetLinePadding\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"side\\\":\\\"nTop\\\",\\\"value\\\":2}, {\\\"command\\\":\\\"tableSetLineBorderRadius\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"radius\\\":2}, {\\\"command\\\":\\\"tableSetLineBorderSide\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"side\\\":\\\"top\\\",\\\"visible\\\":true}, {\\\"command\\\":\\\"tableSetLineVerticalSeparators\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"visible\\\":true}, {\\\"command\\\":\\\"tableSetLineCondition\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"DETAIL.cantidad > 0\\\"}, {\\\"command\\\":\\\"tableSetLineSuppressCondition\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"DETAIL.importe == 0\\\"}, {\\\"command\\\":\\\"tableSetLineBackgroundColorFormula\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"IF(...)\\\"}, {\\\"command\\\":\\\"tableSetLineBorderColorFormula\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"IF(...)\\\"}. Las cuatro primitivas de fórmula reciben formula como string literal y aceptan string vacío para borrar; no evalúes ni cambies la sintaxis. Usa la primitiva específica según sea condición, supresión o fórmula de color; no uses paths hBorder, hBackground ni setProperty. Si la instrucción menciona una línea, cabecera, detalle o pie, el color de borde de esa línea usa tableSetLineBorderColor y nunca setProperty. Zebra solo existe en líneas detail. Shapes exactas: {\\\"command\\\":\\\"tableSetLineZebraEnabled\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"enabled\\\":true} y {\\\"command\\\":\\\"tableSetLineZebraColor\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"role\\\":\\\"odd\\\",\\\"color\\\":\\\"#d3d3d3\\\"}. Usa enabled booleano para activar o desactivar y role odd/even para filas impares/pares. No uses hZebraPattern ni paths privados. REGLA DE SCOPE OBLIGATORIA: estos, ellos, los seleccionados y pronombres equivalentes -> target:\\\"selection\\\". Todos, todas, todo el documento, todos los objetos o todos los objetos de un tipo -> target:{\\\"ids\\\":[...]} usando todos los cId coincidentes de DOCUMENTO_COMPLETO_SCOPE=global, incluidos objetos anidados en TTable. Si la selección está vacía, una orden global debe usar siempre ids. Para una orden global no uses target:\\\"selection\\\" ni mezcles ambos targets. También se permite create: {\\\"command\\\":\\\"create\\\",\\\"type\\\":\\\"TText\\\",\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\\\\\"texto\\\\\\\\\\\"\\\"}}. En create describe únicamente lo solicitado: incluye solo el tipo, contenido, posición y propiedades que la instrucción pida explícitamente; el diseñador completa los defaults reales. Tipos reales: TText,TRectangle,TEllipse,TImage,TLine,TBarcode,richText,TFormattedText,TTable. Properties solo editables, nunca cId, defaults, estructura interna ni geometría. position usa {\\\"x\\\":20,\\\"y\\\":30}. Para crear una tabla usa {\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"tabla1\\\",\\\"type\\\":\\\"TTable\\\"}; las primitives TTable posteriores pueden usar target:{\\\"ref\\\":\\\"tabla1\\\"}. Una TTable recién creada tiene las secciones vacías. Antes de insertar columnas o modificar una línea, crea esa línea con tableInsertLine. tableInsertLine crea siempre una línea válida con exactamente 1 columna inicial. SEMÁNTICA OBLIGATORIA DEL NÚMERO DE COLUMNAS: \\\"de N columnas\\\", \\\"con N columnas\\\" y \\\"que tenga N columnas\\\" expresan el TOTAL FINAL deseado; genera exactamente N menos las columnas actuales operaciones tableInsertColumn. Después de tableInsertLine ya hay 1 columna: para una línea de 4 columnas genera exactamente 3 tableInsertColumn y el total final es 4, nunca 4 inserciones. \\\"añade N columnas\\\", \\\"agrega N columnas\\\", \\\"inserta N columnas más\\\" y equivalentes explícitos expresan una CANTIDAD ADICIONAL; genera exactamente N tableInsertColumn. La fachada ejecuta literalmente esas inserciones y no corrige ni reinterpreta el número. Ejemplo total final 4: {\\\"commands\\\":[{\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"tabla1\\\",\\\"type\\\":\\\"TTable\\\"},{\\\"command\\\":\\\"tableInsertLine\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":1},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":3}]}. No envíes hSections, aLines ni aCells en create. Para crear contenido real en una celda usa {\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"txt1\\\",\\\"type\\\":\\\"TText\\\",\\\"targetCell\\\":{\\\"table\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"cellIndex\\\":0},\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\"Título\\\\\\\"\\\"}}; table admite \\\"selection\\\", {\\\"ids\\\":[\\\"id_real\\\"]} o {\\\"ref\\\":\\\"tabla1\\\"}. Tipos manuales admitidos en celda: TText,richText,TBarcode,TImage. Si la instrucción enumera contenidos o títulos, crea un objeto por cada literal en la celda correspondiente; no omitas esos contenidos. No uses position ni geometría para contenido de celda. Una ref es temporal dentro de esta respuesta: el create declara ref:\\\"new1\\\" y un comando posterior apunta al mismo objeto con target:{\\\"ref\\\":\\\"new1\\\"}. Ejemplo: {\\\"commands\\\":[{\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"new1\\\",\\\"type\\\":\\\"TText\\\",\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\\\\\"TOTAL\\\\\\\\\\\"\\\"}},{\\\"command\\\":\\\"resize\\\",\\\"target\\\":{\\\"ref\\\":\\\"new1\\\"},\\\"scaleX\\\":2,\\\"scaleY\\\":2}]}. PLANIFICACION INTERNA PARA INSTRUCCIONES COMPLEJAS: antes de devolver Commands, divide mentalmente la peticion en bloques visuales, asigna posiciones y tamanos aproximados, enumera todos los requisitos explicitos, ordena los commands por dependencias y revisa que no falte ningun requisito realizable. No devuelvas ni expliques este plan; la salida sigue siendo solo {\\\"commands\\\":[...]}. En disenos completos organiza conceptualmente cabecera superior, datos principales, bloque central, totales y pie cuando hayan sido pedidos y sean realizables. Cada objeto visual explicitamente solicitado requiere su propio create. Asigna position y, cuando proceda, move o resize a los objetos raiz; evita que sus cajas se solapen salvo peticion expresa. Crear contenido no sustituye sus estilos: incluye los colores, negrita, alineacion, tamano y fondo pedidos usando propiedades o commands ya disponibles. Para un objeto interno nuevo, incluye sus estilos en create.properties o declara ref en create y usa despues target:{\\\"ref\\\":\\\"...\\\"}; targetCell solo existe en create y nunca es target de setProperty. Todo texto fijo visible usa cText como expresion literal canonica entre comillas. Si se pide un formato y ya existe una sintaxis canonica disponible, usala sin inventar funciones. Si existe una referencia real claramente compatible con un dato solicitado, usala en vez de crear ese dato como literal. Si una columna debe ser mas ancha, incluye tableSetColumnWidth explicitamente. En planes largos prefiere: limpieza; contenedores; estructura; objetos internos; propiedades; geometria; estilos finales, salvo que una dependencia exija otro orden. Omite de forma segura solo lo que no pueda realizarse por falta de campos o capacidades. CTEXT CANONICO: texto fijo=\\\"\\\\\\\\\\\"FACTURA\\\\\\\\\\\"\\\"; campo=REFERENCIA_EXACTA; texto+campo=\\\"\\\\\\\\\\\"Factura: \\\\\\\\\\\"+REFERENCIA_EXACTA\\\"; formula=\\\"Transform(REFERENCIA_EXACTA,\\\\\\\\\\\"99/99/9999\\\\\\\\\\\")\\\". Para contenido de celda usa el mismo TText y la misma semantica. Usa exclusivamente referencias exactas de CAMPOS_Y_VARIABLES_DISPONIBLES; no inventes campos. Si la instruccion pide un dato/campo y no existe una referencia compatible, no conviertas su descripcion en texto fijo: omite esa parte o devuelve {\\\"commands\\\":[]}. En TTable, para CADA seccion usada, el orden obligatorio es: tableInsertLine; N-1 tableInsertColumn para obtener N columnas; despues los create.targetCell. El contenido header exige linea header y el contenido detail exige linea detail; antes de cellIndex K deben existir al menos K+1 columnas en esa misma linea. Nunca uses create.targetCell sobre una linea o celda inexistente. Para una celda vacia de una TTable existente seleccionada usa exactamente {\\\"command\\\":\\\"create\\\",\\\"type\\\":\\\"TText\\\",\\\"targetCell\\\":{\\\"table\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"cellIndex\\\":K},\\\"properties\\\":{\\\"cText\\\":\\\"REFERENCIA_EXACTA\\\"}}. Para una TTable existente identificada table puede ser {\\\"ids\\\":[\\\"id_real\\\"]}; nunca uses {\\\"cId\\\":\\\"...\\\"}. Para una tabla creada en ESTA respuesta, todas las estructuras y targetCell.table usan siempre {\\\"ref\\\":\\\"tabla1\\\"}, nunca \\\"selection\\\". Una lista de N nombres de columnas son N titulos fijos TText de header con cText=\\\"\\\\\\\\\\\"TITULO\\\\\\\\\\\"\\\"; si ademas se piden sus campos o campos disponibles, crea header Y detail, cada seccion con su tableInsertLine y exactamente N-1 inserciones, y despues N TText por seccion. Esquema minimo de dos secciones y dos columnas: create TTable ref tabla1; tableInsertLine header; tableInsertColumn header columnIndex 1; tableInsertLine detail; tableInsertColumn detail columnIndex 1; despues create.targetCell header 0 y 1, y detail 0 y 1, todos con table:{\\\"ref\\\":\\\"tabla1\\\"}. Alinear el contenido o texto a izquierda/centro/derecha usa setProperty con property:\\\"cTextAlign\\\" y value:\\\"left\\\"|\\\"center\\\"|\\\"right\\\"; align se reserva para alinear geometricamente varios objetos.\"},{\"role\":\"user\",\"content\":\"SELECCION_ACTUAL_SCOPE=selection:\\n[]\\nDOCUMENTO_COMPLETO_SCOPE=global:\\n[]\\nGLOBAL_COUNTS:\\nGLOBAL_IDS_BY_TYPE:\\nPROPIEDADES COMUNES EDITABLES: cBackgroundColor:string=Dimensiones y Color / Color de fondo,cBorderColor:string=Borde / Color,cCondition:string,cFillColor2:string,cFillColor3:string,cFillStyle:string,cHeightMode:string,cPageBreakCondition:string,cShadowColor:string,lBorderBottom:boolean,lBorderLeft:boolean,lBorderRight:boolean,lBorderTop:boolean,lFixedSeparators:boolean,lFooterOnBottom:boolean,lLocked:boolean,lVisible:boolean,nBorderWidth:number,nFillOpacity:number,nLayerId:number,nOpacity:number=Transformación / Opacidad,nPaddingBottom:number,nPaddingLeft:number,nPaddingRight:number,nPaddingTop:number,nRotation:number,nRounded:number,nShadowSize:number,nShadowTransparency:number,nZIndex:number\\nCOLORES CANÓNICOS: rojo:#ff0000 · verde:#008000 · verde oscuro:#006400 · azul:#0000ff · azul oscuro:#00008b · amarillo:#ffff00 · gris claro:#d3d3d3\\nCAMPOS_Y_VARIABLES_DISPONIBLES\\nTIPOS:C=texto,N=numero,D=fecha,I=imagen,M=memo,L=booleano\\n\\nINSTRUCCIÓN:\\nhazla a la mitad\"}],\"stream\":false,\"format\":\"json\",\"keep_alive\":-1,\"options\":{\"temperature\":0,\"top_p\":1,\"top_k\":0,\"repeat_penalty\":1.1,\"frequency_penalty\":0,\"presence_penalty\":0,\"num_ctx\":65536,\"num_batch\":4096,\"num_thread\":10,\"num_gpu\":99,\"num_predict\":4096},\"think\":\"low\"}",
                        "cHttpBody": "{\"model\":\"gpt-oss:20b\",\"created_at\":\"2026-08-12T22:20:33.8006112Z\",\"message\":{\"role\":\"assistant\",\"content\":\"{\\\"commands\\\":[{\\\"command\\\":\\\"resize\\\",\\\"target\\\":\\\"selection\\\",\\\"scaleX\\\":0.5,\\\"scaleY\\\":0.5}]}\",\"thinking\":\"Need to interpret instruction: \\\"hazla a la mitad\\\" meaning make it half? Probably resize selection to half size. So command resize with scaleX 0.5, scaleY 0.5. Output JSON.\"},\"done\":true,\"done_reason\":\"stop\",\"total_duration\":1461721500,\"load_duration\":201680400,\"prompt_eval_count\":3607,\"prompt_eval_duration\":13833000,\"eval_count\":28,\"eval_duration\":348478000}",
                        "hMetrics": {
                            "total_duration": 1461721500,
                            "load_duration": 201680400,
                            "prompt_eval_count": 3607,
                            "prompt_eval_duration": 13833000,
                            "eval_count": 28,
                            "eval_duration": 348478000,
                            "unattributed_duration": 897730100
                        },
                        "hCommands": {
                            "commands": [
                                {
                                    "command": "resize",
                                    "target": "selection",
                                    "scaleX": 0.5,
                                    "scaleY": 0.5
                                }
                            ]
                        },
                        "lValid": true,
                        "nCreates": 0,
                        "nChanges": 0,
                        "nDeletes": 0,
                        "nStructures": 0,
                        "nGeneratedIds": 0,
                        "nOperations": 1,
                        "nFinalOperations": 1,
                        "cValidation": "Shape commands válida; validación de ejecución pendiente",
                        "nResponseMilliseconds": 1465.704,
                        "tRequestStartedAt": "2026-08-13T00:20:32.337305+02:00",
                        "tResponseFinishedAt": "2026-08-13T00:20:33.803025+02:00",
                        "hPromptDiagnostics": {
                            "nSystemCharacters": 13534,
                            "nUserCharacters": 1079,
                            "nPromptCharacters": 14614,
                            "nPromptCharactersBeforeFields": 12423,
                            "nFieldsCharacters": 88,
                            "nPromptTokensBeforeEstimated": 3106,
                            "nPromptTokensAfterEstimated": 3654,
                            "nContextTokens": 65536,
                            "lPromptFitsContext": true,
                            "hFields": {
                                "nGroups": 0,
                                "nFields": 0,
                                "nUserVariables": 0,
                                "nAccumulators": 0
                            }
                        }
                    },
                    "commands": [
                        {
                            "command": "resize",
                            "target": "selection",
                            "scaleX": 0.5,
                            "scaleY": 0.5
                        }
                    ],
                    "valid": true
                },
                {
                    "id": "J_table_move",
                    "instruction": "muévela 20 mm a la derecha",
                    "response": {
                        "cInstruction": "muévela 20 mm a la derecha",
                        "cProvider": "Ollama",
                        "cModelSelection": "Ollama — GPT-OSS 20B",
                        "cModel": "gpt-oss:20b",
                        "cRepresentation": "COMMANDS",
                        "cRawResponse": "{\"commands\":[{\"command\":\"move\",\"target\":\"selection\",\"dx\":20,\"dy\":0}]}",
                        "cThinking": "Need move selection by 20mm. Use dx in mm? Probably units mm. So {\"dx\":20,\"dy\":0}.",
                        "cOllamaRequest": "{\"model\":\"gpt-oss:20b\",\"messages\":[{\"role\":\"system\",\"content\":\"Interpreta la instrucción y devuelve únicamente JSON válido con la forma {\\\"commands\\\":[{\\\"command\\\":\\\"setProperty\\\",\\\"target\\\":\\\"selection\\\" o {\\\"ids\\\":[\\\"id_real\\\"]},\\\"property\\\":\\\"propiedad_real\\\",\\\"value\\\":valor}]}. Cada comando DEBE usar la clave command (nunca type) y target. Comandos permitidos: setProperty, move, resize, delete, align, distribute, reorder, duplicate, tableMoveColumn, tableSetColumnWidth, tableInsertColumn, tableDeleteColumn, tableInsertLine, tableDeleteLine, tableMoveLine, tableSetLineHeight, tableSetLineBackground, tableSetLineBorderColor, tableSetLineBorderWidth, tableSetLinePadding, tableSetLineBorderRadius, tableSetLineBorderSide, tableSetLineVerticalSeparators, tableSetLineZebraEnabled, tableSetLineZebraColor, tableSetLineCondition, tableSetLineSuppressCondition, tableSetLineBackgroundColorFormula, tableSetLineBorderColorFormula. Prioridad: propiedad o estilo → setProperty; desplazamiento relativo → move; tamaño relativo → resize; alineación de varios objetos → align; eliminar objetos → delete. Para eliminar usa exactamente {\\\"command\\\":\\\"delete\\\",\\\"target\\\":\\\"selection\\\"}. Si se pide duplicar, reducir o cambiar el tamaño, devuelve únicamente resize y no uses setProperty para propiedades numéricas. Para setProperty usa exactamente property y value, nunca name ni valores como *2. Para move usa {\\\"command\\\":\\\"move\\\",\\\"target\\\":\\\"selection\\\",\\\"dx\\\":10,\\\"dy\\\":0}; para resize usa {\\\"command\\\":\\\"resize\\\",\\\"target\\\":\\\"selection\\\",\\\"scaleX\\\":0.5,\\\"scaleY\\\":0.5}. Para alinear usa exactamente {\\\"command\\\":\\\"align\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"left\\\"}; modos válidos: left|right|top|bottom|horizontalCenter|verticalCenter. Si la orden se refiere a los objetos seleccionados, usa target:\\\"selection\\\". No inventes IDs ni calcules coordenadas o dimensiones finales. Para distribuir usa exactamente {\\\"command\\\":\\\"distribute\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"horizontal\\\"}; modos válidos: horizontal|vertical. Para reordenar usa exactamente {\\\"command\\\":\\\"reorder\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"bringToFront\\\"}; modos válidos: bringToFront=traer al frente, sendToBack=enviar al fondo, bringForward=subir un nivel, sendBackward=bajar un nivel. Para duplicar usa exactamente {\\\"command\\\":\\\"duplicate\\\",\\\"target\\\":\\\"selection\\\"}. Para tablas usa únicamente estas formas: {\\\"command\\\":\\\"tableMoveColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"fromIndex\\\":2,\\\"toIndex\\\":0}, {\\\"command\\\":\\\"tableSetColumnWidth\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":0,\\\"width\\\":30}, {\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2}, {\\\"command\\\":\\\"tableDeleteColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2}, {\\\"command\\\":\\\"tableInsertLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":1}, {\\\"command\\\":\\\"tableDeleteLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":1}, {\\\"command\\\":\\\"tableMoveLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"fromIndex\\\":1,\\\"toIndex\\\":0}, {\\\"command\\\":\\\"tableSetLineHeight\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"height\\\":12}, {\\\"command\\\":\\\"tableSetLineBackground\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"color\\\":\\\"#d3d3d3\\\"}; section: header|groupHeader|detail|groupFooter|footer. Los índices son enteros cero-basados y no negativos. tableSetLineHeight usa altura fija en milímetros >=1. tableSetLineBackground usa únicamente color HEX fijo; no usa fórmulas ni paths privados. Insertar columna usa columnIndex como posición antes de la columna existente; si coincide con el número actual de columnas, añade al final. Insertar línea usa lineIndex como posición antes de la línea existente; si coincide con el número actual de líneas, añade al final. No uses hSections, aLines ni aCells. Semántica de líneas OBLIGATORIA: si una sección tiene una sola línea, basta mencionar la sección y usa lineIndex 0. Si tiene varias líneas, una operación estructural debe indicar la línea; si no la indica y no dice todas, devuelve EXACTAMENTE {\\\"commands\\\":[]}. Solo si dice todas las líneas genera una operación por cada línea existente. Esta regla no afecta a objetos visuales de celda, que siguen usando commands normales. Para cambiar altura o fondo fijo de una línea de TTable usa obligatoriamente tableSetLineHeight o tableSetLineBackground con section y lineIndex; no uses setProperty para esas operaciones. Shapes adicionales de línea: {\\\"command\\\":\\\"tableSetLineBorderColor\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"color\\\":\\\"#0000ff\\\"}, {\\\"command\\\":\\\"tableSetLineBorderWidth\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"width\\\":1}, {\\\"command\\\":\\\"tableSetLinePadding\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"side\\\":\\\"nTop\\\",\\\"value\\\":2}, {\\\"command\\\":\\\"tableSetLineBorderRadius\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"radius\\\":2}, {\\\"command\\\":\\\"tableSetLineBorderSide\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"side\\\":\\\"top\\\",\\\"visible\\\":true}, {\\\"command\\\":\\\"tableSetLineVerticalSeparators\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"visible\\\":true}, {\\\"command\\\":\\\"tableSetLineCondition\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"DETAIL.cantidad > 0\\\"}, {\\\"command\\\":\\\"tableSetLineSuppressCondition\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"DETAIL.importe == 0\\\"}, {\\\"command\\\":\\\"tableSetLineBackgroundColorFormula\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"IF(...)\\\"}, {\\\"command\\\":\\\"tableSetLineBorderColorFormula\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"IF(...)\\\"}. Las cuatro primitivas de fórmula reciben formula como string literal y aceptan string vacío para borrar; no evalúes ni cambies la sintaxis. Usa la primitiva específica según sea condición, supresión o fórmula de color; no uses paths hBorder, hBackground ni setProperty. Si la instrucción menciona una línea, cabecera, detalle o pie, el color de borde de esa línea usa tableSetLineBorderColor y nunca setProperty. Zebra solo existe en líneas detail. Shapes exactas: {\\\"command\\\":\\\"tableSetLineZebraEnabled\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"enabled\\\":true} y {\\\"command\\\":\\\"tableSetLineZebraColor\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"role\\\":\\\"odd\\\",\\\"color\\\":\\\"#d3d3d3\\\"}. Usa enabled booleano para activar o desactivar y role odd/even para filas impares/pares. No uses hZebraPattern ni paths privados. REGLA DE SCOPE OBLIGATORIA: estos, ellos, los seleccionados y pronombres equivalentes -> target:\\\"selection\\\". Todos, todas, todo el documento, todos los objetos o todos los objetos de un tipo -> target:{\\\"ids\\\":[...]} usando todos los cId coincidentes de DOCUMENTO_COMPLETO_SCOPE=global, incluidos objetos anidados en TTable. Si la selección está vacía, una orden global debe usar siempre ids. Para una orden global no uses target:\\\"selection\\\" ni mezcles ambos targets. También se permite create: {\\\"command\\\":\\\"create\\\",\\\"type\\\":\\\"TText\\\",\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\\\\\"texto\\\\\\\\\\\"\\\"}}. En create describe únicamente lo solicitado: incluye solo el tipo, contenido, posición y propiedades que la instrucción pida explícitamente; el diseñador completa los defaults reales. Tipos reales: TText,TRectangle,TEllipse,TImage,TLine,TBarcode,richText,TFormattedText,TTable. Properties solo editables, nunca cId, defaults, estructura interna ni geometría. position usa {\\\"x\\\":20,\\\"y\\\":30}. Para crear una tabla usa {\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"tabla1\\\",\\\"type\\\":\\\"TTable\\\"}; las primitives TTable posteriores pueden usar target:{\\\"ref\\\":\\\"tabla1\\\"}. Una TTable recién creada tiene las secciones vacías. Antes de insertar columnas o modificar una línea, crea esa línea con tableInsertLine. tableInsertLine crea siempre una línea válida con exactamente 1 columna inicial. SEMÁNTICA OBLIGATORIA DEL NÚMERO DE COLUMNAS: \\\"de N columnas\\\", \\\"con N columnas\\\" y \\\"que tenga N columnas\\\" expresan el TOTAL FINAL deseado; genera exactamente N menos las columnas actuales operaciones tableInsertColumn. Después de tableInsertLine ya hay 1 columna: para una línea de 4 columnas genera exactamente 3 tableInsertColumn y el total final es 4, nunca 4 inserciones. \\\"añade N columnas\\\", \\\"agrega N columnas\\\", \\\"inserta N columnas más\\\" y equivalentes explícitos expresan una CANTIDAD ADICIONAL; genera exactamente N tableInsertColumn. La fachada ejecuta literalmente esas inserciones y no corrige ni reinterpreta el número. Ejemplo total final 4: {\\\"commands\\\":[{\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"tabla1\\\",\\\"type\\\":\\\"TTable\\\"},{\\\"command\\\":\\\"tableInsertLine\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":1},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":3}]}. No envíes hSections, aLines ni aCells en create. Para crear contenido real en una celda usa {\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"txt1\\\",\\\"type\\\":\\\"TText\\\",\\\"targetCell\\\":{\\\"table\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"cellIndex\\\":0},\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\"Título\\\\\\\"\\\"}}; table admite \\\"selection\\\", {\\\"ids\\\":[\\\"id_real\\\"]} o {\\\"ref\\\":\\\"tabla1\\\"}. Tipos manuales admitidos en celda: TText,richText,TBarcode,TImage. Si la instrucción enumera contenidos o títulos, crea un objeto por cada literal en la celda correspondiente; no omitas esos contenidos. No uses position ni geometría para contenido de celda. Una ref es temporal dentro de esta respuesta: el create declara ref:\\\"new1\\\" y un comando posterior apunta al mismo objeto con target:{\\\"ref\\\":\\\"new1\\\"}. Ejemplo: {\\\"commands\\\":[{\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"new1\\\",\\\"type\\\":\\\"TText\\\",\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\\\\\"TOTAL\\\\\\\\\\\"\\\"}},{\\\"command\\\":\\\"resize\\\",\\\"target\\\":{\\\"ref\\\":\\\"new1\\\"},\\\"scaleX\\\":2,\\\"scaleY\\\":2}]}. PLANIFICACION INTERNA PARA INSTRUCCIONES COMPLEJAS: antes de devolver Commands, divide mentalmente la peticion en bloques visuales, asigna posiciones y tamanos aproximados, enumera todos los requisitos explicitos, ordena los commands por dependencias y revisa que no falte ningun requisito realizable. No devuelvas ni expliques este plan; la salida sigue siendo solo {\\\"commands\\\":[...]}. En disenos completos organiza conceptualmente cabecera superior, datos principales, bloque central, totales y pie cuando hayan sido pedidos y sean realizables. Cada objeto visual explicitamente solicitado requiere su propio create. Asigna position y, cuando proceda, move o resize a los objetos raiz; evita que sus cajas se solapen salvo peticion expresa. Crear contenido no sustituye sus estilos: incluye los colores, negrita, alineacion, tamano y fondo pedidos usando propiedades o commands ya disponibles. Para un objeto interno nuevo, incluye sus estilos en create.properties o declara ref en create y usa despues target:{\\\"ref\\\":\\\"...\\\"}; targetCell solo existe en create y nunca es target de setProperty. Todo texto fijo visible usa cText como expresion literal canonica entre comillas. Si se pide un formato y ya existe una sintaxis canonica disponible, usala sin inventar funciones. Si existe una referencia real claramente compatible con un dato solicitado, usala en vez de crear ese dato como literal. Si una columna debe ser mas ancha, incluye tableSetColumnWidth explicitamente. En planes largos prefiere: limpieza; contenedores; estructura; objetos internos; propiedades; geometria; estilos finales, salvo que una dependencia exija otro orden. Omite de forma segura solo lo que no pueda realizarse por falta de campos o capacidades. CTEXT CANONICO: texto fijo=\\\"\\\\\\\\\\\"FACTURA\\\\\\\\\\\"\\\"; campo=REFERENCIA_EXACTA; texto+campo=\\\"\\\\\\\\\\\"Factura: \\\\\\\\\\\"+REFERENCIA_EXACTA\\\"; formula=\\\"Transform(REFERENCIA_EXACTA,\\\\\\\\\\\"99/99/9999\\\\\\\\\\\")\\\". Para contenido de celda usa el mismo TText y la misma semantica. Usa exclusivamente referencias exactas de CAMPOS_Y_VARIABLES_DISPONIBLES; no inventes campos. Si la instruccion pide un dato/campo y no existe una referencia compatible, no conviertas su descripcion en texto fijo: omite esa parte o devuelve {\\\"commands\\\":[]}. En TTable, para CADA seccion usada, el orden obligatorio es: tableInsertLine; N-1 tableInsertColumn para obtener N columnas; despues los create.targetCell. El contenido header exige linea header y el contenido detail exige linea detail; antes de cellIndex K deben existir al menos K+1 columnas en esa misma linea. Nunca uses create.targetCell sobre una linea o celda inexistente. Para una celda vacia de una TTable existente seleccionada usa exactamente {\\\"command\\\":\\\"create\\\",\\\"type\\\":\\\"TText\\\",\\\"targetCell\\\":{\\\"table\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"cellIndex\\\":K},\\\"properties\\\":{\\\"cText\\\":\\\"REFERENCIA_EXACTA\\\"}}. Para una TTable existente identificada table puede ser {\\\"ids\\\":[\\\"id_real\\\"]}; nunca uses {\\\"cId\\\":\\\"...\\\"}. Para una tabla creada en ESTA respuesta, todas las estructuras y targetCell.table usan siempre {\\\"ref\\\":\\\"tabla1\\\"}, nunca \\\"selection\\\". Una lista de N nombres de columnas son N titulos fijos TText de header con cText=\\\"\\\\\\\\\\\"TITULO\\\\\\\\\\\"\\\"; si ademas se piden sus campos o campos disponibles, crea header Y detail, cada seccion con su tableInsertLine y exactamente N-1 inserciones, y despues N TText por seccion. Esquema minimo de dos secciones y dos columnas: create TTable ref tabla1; tableInsertLine header; tableInsertColumn header columnIndex 1; tableInsertLine detail; tableInsertColumn detail columnIndex 1; despues create.targetCell header 0 y 1, y detail 0 y 1, todos con table:{\\\"ref\\\":\\\"tabla1\\\"}. Alinear el contenido o texto a izquierda/centro/derecha usa setProperty con property:\\\"cTextAlign\\\" y value:\\\"left\\\"|\\\"center\\\"|\\\"right\\\"; align se reserva para alinear geometricamente varios objetos.\"},{\"role\":\"user\",\"content\":\"SELECCION_ACTUAL_SCOPE=selection:\\n[]\\nDOCUMENTO_COMPLETO_SCOPE=global:\\n[]\\nGLOBAL_COUNTS:\\nGLOBAL_IDS_BY_TYPE:\\nPROPIEDADES COMUNES EDITABLES: cBackgroundColor:string=Dimensiones y Color / Color de fondo,cBorderColor:string=Borde / Color,cCondition:string,cFillColor2:string,cFillColor3:string,cFillStyle:string,cHeightMode:string,cPageBreakCondition:string,cShadowColor:string,lBorderBottom:boolean,lBorderLeft:boolean,lBorderRight:boolean,lBorderTop:boolean,lFixedSeparators:boolean,lFooterOnBottom:boolean,lLocked:boolean,lVisible:boolean,nBorderWidth:number,nFillOpacity:number,nLayerId:number,nOpacity:number=Transformación / Opacidad,nPaddingBottom:number,nPaddingLeft:number,nPaddingRight:number,nPaddingTop:number,nRotation:number,nRounded:number,nShadowSize:number,nShadowTransparency:number,nZIndex:number\\nCOLORES CANÓNICOS: rojo:#ff0000 · verde:#008000 · verde oscuro:#006400 · azul:#0000ff · azul oscuro:#00008b · amarillo:#ffff00 · gris claro:#d3d3d3\\nCAMPOS_Y_VARIABLES_DISPONIBLES\\nTIPOS:C=texto,N=numero,D=fecha,I=imagen,M=memo,L=booleano\\n\\nINSTRUCCIÓN:\\nmuévela 20 mm a la derecha\"}],\"stream\":false,\"format\":\"json\",\"keep_alive\":-1,\"options\":{\"temperature\":0,\"top_p\":1,\"top_k\":0,\"repeat_penalty\":1.1,\"frequency_penalty\":0,\"presence_penalty\":0,\"num_ctx\":65536,\"num_batch\":4096,\"num_thread\":10,\"num_gpu\":99,\"num_predict\":4096},\"think\":\"low\"}",
                        "cHttpBody": "{\"model\":\"gpt-oss:20b\",\"created_at\":\"2026-08-12T22:20:34.9512157Z\",\"message\":{\"role\":\"assistant\",\"content\":\"{\\\"commands\\\":[{\\\"command\\\":\\\"move\\\",\\\"target\\\":\\\"selection\\\",\\\"dx\\\":20,\\\"dy\\\":0}]}\",\"thinking\":\"Need move selection by 20mm. Use dx in mm? Probably units mm. So {\\\"dx\\\":20,\\\"dy\\\":0}.\"},\"done\":true,\"done_reason\":\"stop\",\"total_duration\":1134432300,\"load_duration\":213569300,\"prompt_eval_count\":3593,\"prompt_eval_duration\":13807000,\"eval_count\":22,\"eval_duration\":270839000}",
                        "hMetrics": {
                            "total_duration": 1134432300,
                            "load_duration": 213569300,
                            "prompt_eval_count": 3593,
                            "prompt_eval_duration": 13807000,
                            "eval_count": 22,
                            "eval_duration": 270839000,
                            "unattributed_duration": 636217000
                        },
                        "hCommands": {
                            "commands": [
                                {
                                    "command": "move",
                                    "target": "selection",
                                    "dx": 20,
                                    "dy": 0
                                }
                            ]
                        },
                        "lValid": true,
                        "nCreates": 0,
                        "nChanges": 0,
                        "nDeletes": 0,
                        "nStructures": 0,
                        "nGeneratedIds": 0,
                        "nOperations": 1,
                        "nFinalOperations": 1,
                        "cValidation": "Shape commands válida; validación de ejecución pendiente",
                        "nResponseMilliseconds": 1149.806,
                        "tRequestStartedAt": "2026-08-13T00:20:33.803579+02:00",
                        "tResponseFinishedAt": "2026-08-13T00:20:34.953401+02:00",
                        "hPromptDiagnostics": {
                            "nSystemCharacters": 13534,
                            "nUserCharacters": 1089,
                            "nPromptCharacters": 14624,
                            "nPromptCharactersBeforeFields": 12433,
                            "nFieldsCharacters": 88,
                            "nPromptTokensBeforeEstimated": 3109,
                            "nPromptTokensAfterEstimated": 3656,
                            "nContextTokens": 65536,
                            "lPromptFitsContext": true,
                            "hFields": {
                                "nGroups": 0,
                                "nFields": 0,
                                "nUserVariables": 0,
                                "nAccumulators": 0
                            }
                        }
                    },
                    "commands": [
                        {
                            "command": "move",
                            "target": "selection",
                            "dx": 20,
                            "dy": 0
                        }
                    ],
                    "valid": true
                },
                {
                    "id": "K_text_color",
                    "instruction": "cambia el color del texto a rojo",
                    "response": {
                        "cInstruction": "cambia el color del texto a rojo",
                        "cProvider": "Ollama",
                        "cModelSelection": "Ollama — GPT-OSS 20B",
                        "cModel": "gpt-oss:20b",
                        "cRepresentation": "COMMANDS",
                        "cRawResponse": "{\"commands\":[{\"command\":\"setProperty\",\"target\":\"selection\",\"property\":\"cTextColor\",\"value\":\"#ff0000\"}]}",
                        "cThinking": "Need setProperty cTextColor to #ff0000 on selection.",
                        "cOllamaRequest": "{\"model\":\"gpt-oss:20b\",\"messages\":[{\"role\":\"system\",\"content\":\"Interpreta la instrucción y devuelve únicamente JSON válido con la forma {\\\"commands\\\":[{\\\"command\\\":\\\"setProperty\\\",\\\"target\\\":\\\"selection\\\" o {\\\"ids\\\":[\\\"id_real\\\"]},\\\"property\\\":\\\"propiedad_real\\\",\\\"value\\\":valor}]}. Cada comando DEBE usar la clave command (nunca type) y target. Comandos permitidos: setProperty, move, resize, delete, align, distribute, reorder, duplicate, tableMoveColumn, tableSetColumnWidth, tableInsertColumn, tableDeleteColumn, tableInsertLine, tableDeleteLine, tableMoveLine, tableSetLineHeight, tableSetLineBackground, tableSetLineBorderColor, tableSetLineBorderWidth, tableSetLinePadding, tableSetLineBorderRadius, tableSetLineBorderSide, tableSetLineVerticalSeparators, tableSetLineZebraEnabled, tableSetLineZebraColor, tableSetLineCondition, tableSetLineSuppressCondition, tableSetLineBackgroundColorFormula, tableSetLineBorderColorFormula. Prioridad: propiedad o estilo → setProperty; desplazamiento relativo → move; tamaño relativo → resize; alineación de varios objetos → align; eliminar objetos → delete. Para eliminar usa exactamente {\\\"command\\\":\\\"delete\\\",\\\"target\\\":\\\"selection\\\"}. Si se pide duplicar, reducir o cambiar el tamaño, devuelve únicamente resize y no uses setProperty para propiedades numéricas. Para setProperty usa exactamente property y value, nunca name ni valores como *2. Para move usa {\\\"command\\\":\\\"move\\\",\\\"target\\\":\\\"selection\\\",\\\"dx\\\":10,\\\"dy\\\":0}; para resize usa {\\\"command\\\":\\\"resize\\\",\\\"target\\\":\\\"selection\\\",\\\"scaleX\\\":0.5,\\\"scaleY\\\":0.5}. Para alinear usa exactamente {\\\"command\\\":\\\"align\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"left\\\"}; modos válidos: left|right|top|bottom|horizontalCenter|verticalCenter. Si la orden se refiere a los objetos seleccionados, usa target:\\\"selection\\\". No inventes IDs ni calcules coordenadas o dimensiones finales. Para distribuir usa exactamente {\\\"command\\\":\\\"distribute\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"horizontal\\\"}; modos válidos: horizontal|vertical. Para reordenar usa exactamente {\\\"command\\\":\\\"reorder\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"bringToFront\\\"}; modos válidos: bringToFront=traer al frente, sendToBack=enviar al fondo, bringForward=subir un nivel, sendBackward=bajar un nivel. Para duplicar usa exactamente {\\\"command\\\":\\\"duplicate\\\",\\\"target\\\":\\\"selection\\\"}. Para tablas usa únicamente estas formas: {\\\"command\\\":\\\"tableMoveColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"fromIndex\\\":2,\\\"toIndex\\\":0}, {\\\"command\\\":\\\"tableSetColumnWidth\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":0,\\\"width\\\":30}, {\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2}, {\\\"command\\\":\\\"tableDeleteColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2}, {\\\"command\\\":\\\"tableInsertLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":1}, {\\\"command\\\":\\\"tableDeleteLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":1}, {\\\"command\\\":\\\"tableMoveLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"fromIndex\\\":1,\\\"toIndex\\\":0}, {\\\"command\\\":\\\"tableSetLineHeight\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"height\\\":12}, {\\\"command\\\":\\\"tableSetLineBackground\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"color\\\":\\\"#d3d3d3\\\"}; section: header|groupHeader|detail|groupFooter|footer. Los índices son enteros cero-basados y no negativos. tableSetLineHeight usa altura fija en milímetros >=1. tableSetLineBackground usa únicamente color HEX fijo; no usa fórmulas ni paths privados. Insertar columna usa columnIndex como posición antes de la columna existente; si coincide con el número actual de columnas, añade al final. Insertar línea usa lineIndex como posición antes de la línea existente; si coincide con el número actual de líneas, añade al final. No uses hSections, aLines ni aCells. Semántica de líneas OBLIGATORIA: si una sección tiene una sola línea, basta mencionar la sección y usa lineIndex 0. Si tiene varias líneas, una operación estructural debe indicar la línea; si no la indica y no dice todas, devuelve EXACTAMENTE {\\\"commands\\\":[]}. Solo si dice todas las líneas genera una operación por cada línea existente. Esta regla no afecta a objetos visuales de celda, que siguen usando commands normales. Para cambiar altura o fondo fijo de una línea de TTable usa obligatoriamente tableSetLineHeight o tableSetLineBackground con section y lineIndex; no uses setProperty para esas operaciones. Shapes adicionales de línea: {\\\"command\\\":\\\"tableSetLineBorderColor\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"color\\\":\\\"#0000ff\\\"}, {\\\"command\\\":\\\"tableSetLineBorderWidth\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"width\\\":1}, {\\\"command\\\":\\\"tableSetLinePadding\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"side\\\":\\\"nTop\\\",\\\"value\\\":2}, {\\\"command\\\":\\\"tableSetLineBorderRadius\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"radius\\\":2}, {\\\"command\\\":\\\"tableSetLineBorderSide\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"side\\\":\\\"top\\\",\\\"visible\\\":true}, {\\\"command\\\":\\\"tableSetLineVerticalSeparators\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"visible\\\":true}, {\\\"command\\\":\\\"tableSetLineCondition\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"DETAIL.cantidad > 0\\\"}, {\\\"command\\\":\\\"tableSetLineSuppressCondition\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"DETAIL.importe == 0\\\"}, {\\\"command\\\":\\\"tableSetLineBackgroundColorFormula\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"IF(...)\\\"}, {\\\"command\\\":\\\"tableSetLineBorderColorFormula\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"IF(...)\\\"}. Las cuatro primitivas de fórmula reciben formula como string literal y aceptan string vacío para borrar; no evalúes ni cambies la sintaxis. Usa la primitiva específica según sea condición, supresión o fórmula de color; no uses paths hBorder, hBackground ni setProperty. Si la instrucción menciona una línea, cabecera, detalle o pie, el color de borde de esa línea usa tableSetLineBorderColor y nunca setProperty. Zebra solo existe en líneas detail. Shapes exactas: {\\\"command\\\":\\\"tableSetLineZebraEnabled\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"enabled\\\":true} y {\\\"command\\\":\\\"tableSetLineZebraColor\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"role\\\":\\\"odd\\\",\\\"color\\\":\\\"#d3d3d3\\\"}. Usa enabled booleano para activar o desactivar y role odd/even para filas impares/pares. No uses hZebraPattern ni paths privados. REGLA DE SCOPE OBLIGATORIA: estos, ellos, los seleccionados y pronombres equivalentes -> target:\\\"selection\\\". Todos, todas, todo el documento, todos los objetos o todos los objetos de un tipo -> target:{\\\"ids\\\":[...]} usando todos los cId coincidentes de DOCUMENTO_COMPLETO_SCOPE=global, incluidos objetos anidados en TTable. Si la selección está vacía, una orden global debe usar siempre ids. Para una orden global no uses target:\\\"selection\\\" ni mezcles ambos targets. También se permite create: {\\\"command\\\":\\\"create\\\",\\\"type\\\":\\\"TText\\\",\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\\\\\"texto\\\\\\\\\\\"\\\"}}. En create describe únicamente lo solicitado: incluye solo el tipo, contenido, posición y propiedades que la instrucción pida explícitamente; el diseñador completa los defaults reales. Tipos reales: TText,TRectangle,TEllipse,TImage,TLine,TBarcode,richText,TFormattedText,TTable. Properties solo editables, nunca cId, defaults, estructura interna ni geometría. position usa {\\\"x\\\":20,\\\"y\\\":30}. Para crear una tabla usa {\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"tabla1\\\",\\\"type\\\":\\\"TTable\\\"}; las primitives TTable posteriores pueden usar target:{\\\"ref\\\":\\\"tabla1\\\"}. Una TTable recién creada tiene las secciones vacías. Antes de insertar columnas o modificar una línea, crea esa línea con tableInsertLine. tableInsertLine crea siempre una línea válida con exactamente 1 columna inicial. SEMÁNTICA OBLIGATORIA DEL NÚMERO DE COLUMNAS: \\\"de N columnas\\\", \\\"con N columnas\\\" y \\\"que tenga N columnas\\\" expresan el TOTAL FINAL deseado; genera exactamente N menos las columnas actuales operaciones tableInsertColumn. Después de tableInsertLine ya hay 1 columna: para una línea de 4 columnas genera exactamente 3 tableInsertColumn y el total final es 4, nunca 4 inserciones. \\\"añade N columnas\\\", \\\"agrega N columnas\\\", \\\"inserta N columnas más\\\" y equivalentes explícitos expresan una CANTIDAD ADICIONAL; genera exactamente N tableInsertColumn. La fachada ejecuta literalmente esas inserciones y no corrige ni reinterpreta el número. Ejemplo total final 4: {\\\"commands\\\":[{\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"tabla1\\\",\\\"type\\\":\\\"TTable\\\"},{\\\"command\\\":\\\"tableInsertLine\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":1},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":3}]}. No envíes hSections, aLines ni aCells en create. Para crear contenido real en una celda usa {\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"txt1\\\",\\\"type\\\":\\\"TText\\\",\\\"targetCell\\\":{\\\"table\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"cellIndex\\\":0},\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\"Título\\\\\\\"\\\"}}; table admite \\\"selection\\\", {\\\"ids\\\":[\\\"id_real\\\"]} o {\\\"ref\\\":\\\"tabla1\\\"}. Tipos manuales admitidos en celda: TText,richText,TBarcode,TImage. Si la instrucción enumera contenidos o títulos, crea un objeto por cada literal en la celda correspondiente; no omitas esos contenidos. No uses position ni geometría para contenido de celda. Una ref es temporal dentro de esta respuesta: el create declara ref:\\\"new1\\\" y un comando posterior apunta al mismo objeto con target:{\\\"ref\\\":\\\"new1\\\"}. Ejemplo: {\\\"commands\\\":[{\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"new1\\\",\\\"type\\\":\\\"TText\\\",\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\\\\\"TOTAL\\\\\\\\\\\"\\\"}},{\\\"command\\\":\\\"resize\\\",\\\"target\\\":{\\\"ref\\\":\\\"new1\\\"},\\\"scaleX\\\":2,\\\"scaleY\\\":2}]}. PLANIFICACION INTERNA PARA INSTRUCCIONES COMPLEJAS: antes de devolver Commands, divide mentalmente la peticion en bloques visuales, asigna posiciones y tamanos aproximados, enumera todos los requisitos explicitos, ordena los commands por dependencias y revisa que no falte ningun requisito realizable. No devuelvas ni expliques este plan; la salida sigue siendo solo {\\\"commands\\\":[...]}. En disenos completos organiza conceptualmente cabecera superior, datos principales, bloque central, totales y pie cuando hayan sido pedidos y sean realizables. Cada objeto visual explicitamente solicitado requiere su propio create. Asigna position y, cuando proceda, move o resize a los objetos raiz; evita que sus cajas se solapen salvo peticion expresa. Crear contenido no sustituye sus estilos: incluye los colores, negrita, alineacion, tamano y fondo pedidos usando propiedades o commands ya disponibles. Para un objeto interno nuevo, incluye sus estilos en create.properties o declara ref en create y usa despues target:{\\\"ref\\\":\\\"...\\\"}; targetCell solo existe en create y nunca es target de setProperty. Todo texto fijo visible usa cText como expresion literal canonica entre comillas. Si se pide un formato y ya existe una sintaxis canonica disponible, usala sin inventar funciones. Si existe una referencia real claramente compatible con un dato solicitado, usala en vez de crear ese dato como literal. Si una columna debe ser mas ancha, incluye tableSetColumnWidth explicitamente. En planes largos prefiere: limpieza; contenedores; estructura; objetos internos; propiedades; geometria; estilos finales, salvo que una dependencia exija otro orden. Omite de forma segura solo lo que no pueda realizarse por falta de campos o capacidades. CTEXT CANONICO: texto fijo=\\\"\\\\\\\\\\\"FACTURA\\\\\\\\\\\"\\\"; campo=REFERENCIA_EXACTA; texto+campo=\\\"\\\\\\\\\\\"Factura: \\\\\\\\\\\"+REFERENCIA_EXACTA\\\"; formula=\\\"Transform(REFERENCIA_EXACTA,\\\\\\\\\\\"99/99/9999\\\\\\\\\\\")\\\". Para contenido de celda usa el mismo TText y la misma semantica. Usa exclusivamente referencias exactas de CAMPOS_Y_VARIABLES_DISPONIBLES; no inventes campos. Si la instruccion pide un dato/campo y no existe una referencia compatible, no conviertas su descripcion en texto fijo: omite esa parte o devuelve {\\\"commands\\\":[]}. En TTable, para CADA seccion usada, el orden obligatorio es: tableInsertLine; N-1 tableInsertColumn para obtener N columnas; despues los create.targetCell. El contenido header exige linea header y el contenido detail exige linea detail; antes de cellIndex K deben existir al menos K+1 columnas en esa misma linea. Nunca uses create.targetCell sobre una linea o celda inexistente. Para una celda vacia de una TTable existente seleccionada usa exactamente {\\\"command\\\":\\\"create\\\",\\\"type\\\":\\\"TText\\\",\\\"targetCell\\\":{\\\"table\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"cellIndex\\\":K},\\\"properties\\\":{\\\"cText\\\":\\\"REFERENCIA_EXACTA\\\"}}. Para una TTable existente identificada table puede ser {\\\"ids\\\":[\\\"id_real\\\"]}; nunca uses {\\\"cId\\\":\\\"...\\\"}. Para una tabla creada en ESTA respuesta, todas las estructuras y targetCell.table usan siempre {\\\"ref\\\":\\\"tabla1\\\"}, nunca \\\"selection\\\". Una lista de N nombres de columnas son N titulos fijos TText de header con cText=\\\"\\\\\\\\\\\"TITULO\\\\\\\\\\\"\\\"; si ademas se piden sus campos o campos disponibles, crea header Y detail, cada seccion con su tableInsertLine y exactamente N-1 inserciones, y despues N TText por seccion. Esquema minimo de dos secciones y dos columnas: create TTable ref tabla1; tableInsertLine header; tableInsertColumn header columnIndex 1; tableInsertLine detail; tableInsertColumn detail columnIndex 1; despues create.targetCell header 0 y 1, y detail 0 y 1, todos con table:{\\\"ref\\\":\\\"tabla1\\\"}. Alinear el contenido o texto a izquierda/centro/derecha usa setProperty con property:\\\"cTextAlign\\\" y value:\\\"left\\\"|\\\"center\\\"|\\\"right\\\"; align se reserva para alinear geometricamente varios objetos.\"},{\"role\":\"user\",\"content\":\"SELECCION_ACTUAL_SCOPE=selection:\\n[]\\nDOCUMENTO_COMPLETO_SCOPE=global:\\n[]\\nGLOBAL_COUNTS:\\nGLOBAL_IDS_BY_TYPE:\\nPROPIEDADES COMUNES EDITABLES: cBackgroundColor:string=Dimensiones y Color / Color de fondo,cBorderColor:string=Borde / Color,cCondition:string,cFillColor2:string,cFillColor3:string,cFillStyle:string,cFontFamily:string,cShadowColor:string,cText:string,cTextAlign:string,cTextColor:string=Texto / Color,cTextFitMode:string,cTextVerticalAlign:string,lAllowPageBreak:boolean,lBorderBottom:boolean,lBorderLeft:boolean,lBorderRight:boolean,lBorderTop:boolean,lFontBold:boolean=Texto / Negrita,lFontItalic:boolean=Texto / Cursiva,lFontStrikeout:boolean,lFontUnderline:boolean,lForceWrap:boolean,lKeepEmptyParagraphs:boolean,lLocked:boolean,lTextAdjusted:boolean,lTextWrap:boolean,lTrimSpaces:boolean,lVisible:boolean,nBorderWidth:number,nFillOpacity:number,nFontSize:number=Texto / Tamaño,nLayerId:number,nLineSpacing:number,nOpacity:number=Transformación / Opacidad,nPaddingBottom:number,nPaddingLeft:number,nPaddingRight:number,nPaddingTop:number,nParagraphSpacing:number,nRotation:number,nRounded:number,nShadowSize:number,nShadowTransparency:number,nTextDecimalPosition:number,nTextOpacity:number,nZIndex:number\\nCOLORES CANÓNICOS: rojo:#ff0000 · verde:#008000 · verde oscuro:#006400 · azul:#0000ff · azul oscuro:#00008b · amarillo:#ffff00 · gris claro:#d3d3d3\\nCAMPOS_Y_VARIABLES_DISPONIBLES\\nTIPOS:C=texto,N=numero,D=fecha,I=imagen,M=memo,L=booleano\\n\\nINSTRUCCIÓN:\\ncambia el color del texto a rojo\"}],\"stream\":false,\"format\":\"json\",\"keep_alive\":-1,\"options\":{\"temperature\":0,\"top_p\":1,\"top_k\":0,\"repeat_penalty\":1.1,\"frequency_penalty\":0,\"presence_penalty\":0,\"num_ctx\":65536,\"num_batch\":4096,\"num_thread\":10,\"num_gpu\":99,\"num_predict\":4096},\"think\":\"low\"}",
                        "cHttpBody": "{\"model\":\"gpt-oss:20b\",\"created_at\":\"2026-08-12T22:20:36.0275845Z\",\"message\":{\"role\":\"assistant\",\"content\":\"{\\\"commands\\\":[{\\\"command\\\":\\\"setProperty\\\",\\\"target\\\":\\\"selection\\\",\\\"property\\\":\\\"cTextColor\\\",\\\"value\\\":\\\"#ff0000\\\"}]}\",\"thinking\":\"Need setProperty cTextColor to #ff0000 on selection.\"},\"done\":true,\"done_reason\":\"stop\",\"total_duration\":1073549600,\"load_duration\":199914600,\"prompt_eval_count\":3671,\"prompt_eval_duration\":22410000,\"eval_count\":28,\"eval_duration\":349142000}",
                        "hMetrics": {
                            "total_duration": 1073549600,
                            "load_duration": 199914600,
                            "prompt_eval_count": 3671,
                            "prompt_eval_duration": 22410000,
                            "eval_count": 28,
                            "eval_duration": 349142000,
                            "unattributed_duration": 502083000
                        },
                        "hCommands": {
                            "commands": [
                                {
                                    "command": "setProperty",
                                    "target": "selection",
                                    "property": "cTextColor",
                                    "value": "#ff0000"
                                }
                            ]
                        },
                        "lValid": true,
                        "nCreates": 0,
                        "nChanges": 0,
                        "nDeletes": 0,
                        "nStructures": 0,
                        "nGeneratedIds": 0,
                        "nOperations": 1,
                        "nFinalOperations": 1,
                        "cValidation": "Shape commands válida; validación de ejecución pendiente",
                        "nResponseMilliseconds": 1075.628,
                        "tRequestStartedAt": "2026-08-13T00:20:34.953945+02:00",
                        "tResponseFinishedAt": "2026-08-13T00:20:36.029589+02:00",
                        "hPromptDiagnostics": {
                            "nSystemCharacters": 13534,
                            "nUserCharacters": 1501,
                            "nPromptCharacters": 15036,
                            "nPromptCharactersBeforeFields": 12845,
                            "nFieldsCharacters": 88,
                            "nPromptTokensBeforeEstimated": 3212,
                            "nPromptTokensAfterEstimated": 3759,
                            "nContextTokens": 65536,
                            "lPromptFitsContext": true,
                            "hFields": {
                                "nGroups": 0,
                                "nFields": 0,
                                "nUserVariables": 0,
                                "nAccumulators": 0
                            }
                        }
                    },
                    "commands": [
                        {
                            "command": "setProperty",
                            "target": "selection",
                            "property": "cTextColor",
                            "value": "#ff0000"
                        }
                    ],
                    "valid": true
                },
                {
                    "id": "L_background_color",
                    "instruction": "cambia el color de fondo a rojo",
                    "response": {
                        "cInstruction": "cambia el color de fondo a rojo",
                        "cProvider": "Ollama",
                        "cModelSelection": "Ollama — GPT-OSS 20B",
                        "cModel": "gpt-oss:20b",
                        "cRepresentation": "COMMANDS",
                        "cRawResponse": "{\"commands\":[{\"command\":\"setProperty\",\"target\":\"selection\",\"property\":\"cBackgroundColor\",\"value\":\"#ff0000\"}]}",
                        "cThinking": "Need setProperty background to red for selection.",
                        "cOllamaRequest": "{\"model\":\"gpt-oss:20b\",\"messages\":[{\"role\":\"system\",\"content\":\"Interpreta la instrucción y devuelve únicamente JSON válido con la forma {\\\"commands\\\":[{\\\"command\\\":\\\"setProperty\\\",\\\"target\\\":\\\"selection\\\" o {\\\"ids\\\":[\\\"id_real\\\"]},\\\"property\\\":\\\"propiedad_real\\\",\\\"value\\\":valor}]}. Cada comando DEBE usar la clave command (nunca type) y target. Comandos permitidos: setProperty, move, resize, delete, align, distribute, reorder, duplicate, tableMoveColumn, tableSetColumnWidth, tableInsertColumn, tableDeleteColumn, tableInsertLine, tableDeleteLine, tableMoveLine, tableSetLineHeight, tableSetLineBackground, tableSetLineBorderColor, tableSetLineBorderWidth, tableSetLinePadding, tableSetLineBorderRadius, tableSetLineBorderSide, tableSetLineVerticalSeparators, tableSetLineZebraEnabled, tableSetLineZebraColor, tableSetLineCondition, tableSetLineSuppressCondition, tableSetLineBackgroundColorFormula, tableSetLineBorderColorFormula. Prioridad: propiedad o estilo → setProperty; desplazamiento relativo → move; tamaño relativo → resize; alineación de varios objetos → align; eliminar objetos → delete. Para eliminar usa exactamente {\\\"command\\\":\\\"delete\\\",\\\"target\\\":\\\"selection\\\"}. Si se pide duplicar, reducir o cambiar el tamaño, devuelve únicamente resize y no uses setProperty para propiedades numéricas. Para setProperty usa exactamente property y value, nunca name ni valores como *2. Para move usa {\\\"command\\\":\\\"move\\\",\\\"target\\\":\\\"selection\\\",\\\"dx\\\":10,\\\"dy\\\":0}; para resize usa {\\\"command\\\":\\\"resize\\\",\\\"target\\\":\\\"selection\\\",\\\"scaleX\\\":0.5,\\\"scaleY\\\":0.5}. Para alinear usa exactamente {\\\"command\\\":\\\"align\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"left\\\"}; modos válidos: left|right|top|bottom|horizontalCenter|verticalCenter. Si la orden se refiere a los objetos seleccionados, usa target:\\\"selection\\\". No inventes IDs ni calcules coordenadas o dimensiones finales. Para distribuir usa exactamente {\\\"command\\\":\\\"distribute\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"horizontal\\\"}; modos válidos: horizontal|vertical. Para reordenar usa exactamente {\\\"command\\\":\\\"reorder\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"bringToFront\\\"}; modos válidos: bringToFront=traer al frente, sendToBack=enviar al fondo, bringForward=subir un nivel, sendBackward=bajar un nivel. Para duplicar usa exactamente {\\\"command\\\":\\\"duplicate\\\",\\\"target\\\":\\\"selection\\\"}. Para tablas usa únicamente estas formas: {\\\"command\\\":\\\"tableMoveColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"fromIndex\\\":2,\\\"toIndex\\\":0}, {\\\"command\\\":\\\"tableSetColumnWidth\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":0,\\\"width\\\":30}, {\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2}, {\\\"command\\\":\\\"tableDeleteColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2}, {\\\"command\\\":\\\"tableInsertLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":1}, {\\\"command\\\":\\\"tableDeleteLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":1}, {\\\"command\\\":\\\"tableMoveLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"fromIndex\\\":1,\\\"toIndex\\\":0}, {\\\"command\\\":\\\"tableSetLineHeight\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"height\\\":12}, {\\\"command\\\":\\\"tableSetLineBackground\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"color\\\":\\\"#d3d3d3\\\"}; section: header|groupHeader|detail|groupFooter|footer. Los índices son enteros cero-basados y no negativos. tableSetLineHeight usa altura fija en milímetros >=1. tableSetLineBackground usa únicamente color HEX fijo; no usa fórmulas ni paths privados. Insertar columna usa columnIndex como posición antes de la columna existente; si coincide con el número actual de columnas, añade al final. Insertar línea usa lineIndex como posición antes de la línea existente; si coincide con el número actual de líneas, añade al final. No uses hSections, aLines ni aCells. Semántica de líneas OBLIGATORIA: si una sección tiene una sola línea, basta mencionar la sección y usa lineIndex 0. Si tiene varias líneas, una operación estructural debe indicar la línea; si no la indica y no dice todas, devuelve EXACTAMENTE {\\\"commands\\\":[]}. Solo si dice todas las líneas genera una operación por cada línea existente. Esta regla no afecta a objetos visuales de celda, que siguen usando commands normales. Para cambiar altura o fondo fijo de una línea de TTable usa obligatoriamente tableSetLineHeight o tableSetLineBackground con section y lineIndex; no uses setProperty para esas operaciones. Shapes adicionales de línea: {\\\"command\\\":\\\"tableSetLineBorderColor\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"color\\\":\\\"#0000ff\\\"}, {\\\"command\\\":\\\"tableSetLineBorderWidth\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"width\\\":1}, {\\\"command\\\":\\\"tableSetLinePadding\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"side\\\":\\\"nTop\\\",\\\"value\\\":2}, {\\\"command\\\":\\\"tableSetLineBorderRadius\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"radius\\\":2}, {\\\"command\\\":\\\"tableSetLineBorderSide\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"side\\\":\\\"top\\\",\\\"visible\\\":true}, {\\\"command\\\":\\\"tableSetLineVerticalSeparators\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"visible\\\":true}, {\\\"command\\\":\\\"tableSetLineCondition\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"DETAIL.cantidad > 0\\\"}, {\\\"command\\\":\\\"tableSetLineSuppressCondition\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"DETAIL.importe == 0\\\"}, {\\\"command\\\":\\\"tableSetLineBackgroundColorFormula\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"IF(...)\\\"}, {\\\"command\\\":\\\"tableSetLineBorderColorFormula\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"IF(...)\\\"}. Las cuatro primitivas de fórmula reciben formula como string literal y aceptan string vacío para borrar; no evalúes ni cambies la sintaxis. Usa la primitiva específica según sea condición, supresión o fórmula de color; no uses paths hBorder, hBackground ni setProperty. Si la instrucción menciona una línea, cabecera, detalle o pie, el color de borde de esa línea usa tableSetLineBorderColor y nunca setProperty. Zebra solo existe en líneas detail. Shapes exactas: {\\\"command\\\":\\\"tableSetLineZebraEnabled\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"enabled\\\":true} y {\\\"command\\\":\\\"tableSetLineZebraColor\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"role\\\":\\\"odd\\\",\\\"color\\\":\\\"#d3d3d3\\\"}. Usa enabled booleano para activar o desactivar y role odd/even para filas impares/pares. No uses hZebraPattern ni paths privados. REGLA DE SCOPE OBLIGATORIA: estos, ellos, los seleccionados y pronombres equivalentes -> target:\\\"selection\\\". Todos, todas, todo el documento, todos los objetos o todos los objetos de un tipo -> target:{\\\"ids\\\":[...]} usando todos los cId coincidentes de DOCUMENTO_COMPLETO_SCOPE=global, incluidos objetos anidados en TTable. Si la selección está vacía, una orden global debe usar siempre ids. Para una orden global no uses target:\\\"selection\\\" ni mezcles ambos targets. También se permite create: {\\\"command\\\":\\\"create\\\",\\\"type\\\":\\\"TText\\\",\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\\\\\"texto\\\\\\\\\\\"\\\"}}. En create describe únicamente lo solicitado: incluye solo el tipo, contenido, posición y propiedades que la instrucción pida explícitamente; el diseñador completa los defaults reales. Tipos reales: TText,TRectangle,TEllipse,TImage,TLine,TBarcode,richText,TFormattedText,TTable. Properties solo editables, nunca cId, defaults, estructura interna ni geometría. position usa {\\\"x\\\":20,\\\"y\\\":30}. Para crear una tabla usa {\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"tabla1\\\",\\\"type\\\":\\\"TTable\\\"}; las primitives TTable posteriores pueden usar target:{\\\"ref\\\":\\\"tabla1\\\"}. Una TTable recién creada tiene las secciones vacías. Antes de insertar columnas o modificar una línea, crea esa línea con tableInsertLine. tableInsertLine crea siempre una línea válida con exactamente 1 columna inicial. SEMÁNTICA OBLIGATORIA DEL NÚMERO DE COLUMNAS: \\\"de N columnas\\\", \\\"con N columnas\\\" y \\\"que tenga N columnas\\\" expresan el TOTAL FINAL deseado; genera exactamente N menos las columnas actuales operaciones tableInsertColumn. Después de tableInsertLine ya hay 1 columna: para una línea de 4 columnas genera exactamente 3 tableInsertColumn y el total final es 4, nunca 4 inserciones. \\\"añade N columnas\\\", \\\"agrega N columnas\\\", \\\"inserta N columnas más\\\" y equivalentes explícitos expresan una CANTIDAD ADICIONAL; genera exactamente N tableInsertColumn. La fachada ejecuta literalmente esas inserciones y no corrige ni reinterpreta el número. Ejemplo total final 4: {\\\"commands\\\":[{\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"tabla1\\\",\\\"type\\\":\\\"TTable\\\"},{\\\"command\\\":\\\"tableInsertLine\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":1},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":3}]}. No envíes hSections, aLines ni aCells en create. Para crear contenido real en una celda usa {\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"txt1\\\",\\\"type\\\":\\\"TText\\\",\\\"targetCell\\\":{\\\"table\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"cellIndex\\\":0},\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\"Título\\\\\\\"\\\"}}; table admite \\\"selection\\\", {\\\"ids\\\":[\\\"id_real\\\"]} o {\\\"ref\\\":\\\"tabla1\\\"}. Tipos manuales admitidos en celda: TText,richText,TBarcode,TImage. Si la instrucción enumera contenidos o títulos, crea un objeto por cada literal en la celda correspondiente; no omitas esos contenidos. No uses position ni geometría para contenido de celda. Una ref es temporal dentro de esta respuesta: el create declara ref:\\\"new1\\\" y un comando posterior apunta al mismo objeto con target:{\\\"ref\\\":\\\"new1\\\"}. Ejemplo: {\\\"commands\\\":[{\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"new1\\\",\\\"type\\\":\\\"TText\\\",\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\\\\\"TOTAL\\\\\\\\\\\"\\\"}},{\\\"command\\\":\\\"resize\\\",\\\"target\\\":{\\\"ref\\\":\\\"new1\\\"},\\\"scaleX\\\":2,\\\"scaleY\\\":2}]}. PLANIFICACION INTERNA PARA INSTRUCCIONES COMPLEJAS: antes de devolver Commands, divide mentalmente la peticion en bloques visuales, asigna posiciones y tamanos aproximados, enumera todos los requisitos explicitos, ordena los commands por dependencias y revisa que no falte ningun requisito realizable. No devuelvas ni expliques este plan; la salida sigue siendo solo {\\\"commands\\\":[...]}. En disenos completos organiza conceptualmente cabecera superior, datos principales, bloque central, totales y pie cuando hayan sido pedidos y sean realizables. Cada objeto visual explicitamente solicitado requiere su propio create. Asigna position y, cuando proceda, move o resize a los objetos raiz; evita que sus cajas se solapen salvo peticion expresa. Crear contenido no sustituye sus estilos: incluye los colores, negrita, alineacion, tamano y fondo pedidos usando propiedades o commands ya disponibles. Para un objeto interno nuevo, incluye sus estilos en create.properties o declara ref en create y usa despues target:{\\\"ref\\\":\\\"...\\\"}; targetCell solo existe en create y nunca es target de setProperty. Todo texto fijo visible usa cText como expresion literal canonica entre comillas. Si se pide un formato y ya existe una sintaxis canonica disponible, usala sin inventar funciones. Si existe una referencia real claramente compatible con un dato solicitado, usala en vez de crear ese dato como literal. Si una columna debe ser mas ancha, incluye tableSetColumnWidth explicitamente. En planes largos prefiere: limpieza; contenedores; estructura; objetos internos; propiedades; geometria; estilos finales, salvo que una dependencia exija otro orden. Omite de forma segura solo lo que no pueda realizarse por falta de campos o capacidades. CTEXT CANONICO: texto fijo=\\\"\\\\\\\\\\\"FACTURA\\\\\\\\\\\"\\\"; campo=REFERENCIA_EXACTA; texto+campo=\\\"\\\\\\\\\\\"Factura: \\\\\\\\\\\"+REFERENCIA_EXACTA\\\"; formula=\\\"Transform(REFERENCIA_EXACTA,\\\\\\\\\\\"99/99/9999\\\\\\\\\\\")\\\". Para contenido de celda usa el mismo TText y la misma semantica. Usa exclusivamente referencias exactas de CAMPOS_Y_VARIABLES_DISPONIBLES; no inventes campos. Si la instruccion pide un dato/campo y no existe una referencia compatible, no conviertas su descripcion en texto fijo: omite esa parte o devuelve {\\\"commands\\\":[]}. En TTable, para CADA seccion usada, el orden obligatorio es: tableInsertLine; N-1 tableInsertColumn para obtener N columnas; despues los create.targetCell. El contenido header exige linea header y el contenido detail exige linea detail; antes de cellIndex K deben existir al menos K+1 columnas en esa misma linea. Nunca uses create.targetCell sobre una linea o celda inexistente. Para una celda vacia de una TTable existente seleccionada usa exactamente {\\\"command\\\":\\\"create\\\",\\\"type\\\":\\\"TText\\\",\\\"targetCell\\\":{\\\"table\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"cellIndex\\\":K},\\\"properties\\\":{\\\"cText\\\":\\\"REFERENCIA_EXACTA\\\"}}. Para una TTable existente identificada table puede ser {\\\"ids\\\":[\\\"id_real\\\"]}; nunca uses {\\\"cId\\\":\\\"...\\\"}. Para una tabla creada en ESTA respuesta, todas las estructuras y targetCell.table usan siempre {\\\"ref\\\":\\\"tabla1\\\"}, nunca \\\"selection\\\". Una lista de N nombres de columnas son N titulos fijos TText de header con cText=\\\"\\\\\\\\\\\"TITULO\\\\\\\\\\\"\\\"; si ademas se piden sus campos o campos disponibles, crea header Y detail, cada seccion con su tableInsertLine y exactamente N-1 inserciones, y despues N TText por seccion. Esquema minimo de dos secciones y dos columnas: create TTable ref tabla1; tableInsertLine header; tableInsertColumn header columnIndex 1; tableInsertLine detail; tableInsertColumn detail columnIndex 1; despues create.targetCell header 0 y 1, y detail 0 y 1, todos con table:{\\\"ref\\\":\\\"tabla1\\\"}. Alinear el contenido o texto a izquierda/centro/derecha usa setProperty con property:\\\"cTextAlign\\\" y value:\\\"left\\\"|\\\"center\\\"|\\\"right\\\"; align se reserva para alinear geometricamente varios objetos.\"},{\"role\":\"user\",\"content\":\"SELECCION_ACTUAL_SCOPE=selection:\\n[]\\nDOCUMENTO_COMPLETO_SCOPE=global:\\n[]\\nGLOBAL_COUNTS:\\nGLOBAL_IDS_BY_TYPE:\\nPROPIEDADES COMUNES EDITABLES: cBackgroundColor:string=Dimensiones y Color / Color de fondo,cBorderColor:string=Borde / Color,cCondition:string,cFillColor2:string,cFillColor3:string,cFillStyle:string,cFontFamily:string,cShadowColor:string,cText:string,cTextAlign:string,cTextColor:string=Texto / Color,cTextFitMode:string,cTextVerticalAlign:string,lAllowPageBreak:boolean,lBorderBottom:boolean,lBorderLeft:boolean,lBorderRight:boolean,lBorderTop:boolean,lFontBold:boolean=Texto / Negrita,lFontItalic:boolean=Texto / Cursiva,lFontStrikeout:boolean,lFontUnderline:boolean,lForceWrap:boolean,lKeepEmptyParagraphs:boolean,lLocked:boolean,lTextAdjusted:boolean,lTextWrap:boolean,lTrimSpaces:boolean,lVisible:boolean,nBorderWidth:number,nFillOpacity:number,nFontSize:number=Texto / Tamaño,nLayerId:number,nLineSpacing:number,nOpacity:number=Transformación / Opacidad,nPaddingBottom:number,nPaddingLeft:number,nPaddingRight:number,nPaddingTop:number,nParagraphSpacing:number,nRotation:number,nRounded:number,nShadowSize:number,nShadowTransparency:number,nTextDecimalPosition:number,nTextOpacity:number,nZIndex:number\\nCOLORES CANÓNICOS: rojo:#ff0000 · verde:#008000 · verde oscuro:#006400 · azul:#0000ff · azul oscuro:#00008b · amarillo:#ffff00 · gris claro:#d3d3d3\\nCAMPOS_Y_VARIABLES_DISPONIBLES\\nTIPOS:C=texto,N=numero,D=fecha,I=imagen,M=memo,L=booleano\\n\\nINSTRUCCIÓN:\\ncambia el color de fondo a rojo\"}],\"stream\":false,\"format\":\"json\",\"keep_alive\":-1,\"options\":{\"temperature\":0,\"top_p\":1,\"top_k\":0,\"repeat_penalty\":1.1,\"frequency_penalty\":0,\"presence_penalty\":0,\"num_ctx\":65536,\"num_batch\":4096,\"num_thread\":10,\"num_gpu\":99,\"num_predict\":4096},\"think\":\"low\"}",
                        "cHttpBody": "{\"model\":\"gpt-oss:20b\",\"created_at\":\"2026-08-12T22:20:37.0350165Z\",\"message\":{\"role\":\"assistant\",\"content\":\"{\\\"commands\\\":[{\\\"command\\\":\\\"setProperty\\\",\\\"target\\\":\\\"selection\\\",\\\"property\\\":\\\"cBackgroundColor\\\",\\\"value\\\":\\\"#ff0000\\\"}]}\",\"thinking\":\"Need setProperty background to red for selection.\"},\"done\":true,\"done_reason\":\"stop\",\"total_duration\":992090400,\"load_duration\":199908700,\"prompt_eval_count\":3666,\"prompt_eval_duration\":13864000,\"eval_count\":28,\"eval_duration\":349312000}",
                        "hMetrics": {
                            "total_duration": 992090400,
                            "load_duration": 199908700,
                            "prompt_eval_count": 3666,
                            "prompt_eval_duration": 13864000,
                            "eval_count": 28,
                            "eval_duration": 349312000,
                            "unattributed_duration": 429005700
                        },
                        "hCommands": {
                            "commands": [
                                {
                                    "command": "setProperty",
                                    "target": "selection",
                                    "property": "cBackgroundColor",
                                    "value": "#ff0000"
                                }
                            ]
                        },
                        "lValid": true,
                        "nCreates": 0,
                        "nChanges": 0,
                        "nDeletes": 0,
                        "nStructures": 0,
                        "nGeneratedIds": 0,
                        "nOperations": 1,
                        "nFinalOperations": 1,
                        "cValidation": "Shape commands válida; validación de ejecución pendiente",
                        "nResponseMilliseconds": 1006.811,
                        "tRequestStartedAt": "2026-08-13T00:20:36.030132+02:00",
                        "tResponseFinishedAt": "2026-08-13T00:20:37.036958+02:00",
                        "hPromptDiagnostics": {
                            "nSystemCharacters": 13534,
                            "nUserCharacters": 1500,
                            "nPromptCharacters": 15035,
                            "nPromptCharactersBeforeFields": 12844,
                            "nFieldsCharacters": 88,
                            "nPromptTokensBeforeEstimated": 3211,
                            "nPromptTokensAfterEstimated": 3759,
                            "nContextTokens": 65536,
                            "lPromptFitsContext": true,
                            "hFields": {
                                "nGroups": 0,
                                "nFields": 0,
                                "nUserVariables": 0,
                                "nAccumulators": 0
                            }
                        }
                    },
                    "commands": [
                        {
                            "command": "setProperty",
                            "target": "selection",
                            "property": "cBackgroundColor",
                            "value": "#ff0000"
                        }
                    ],
                    "valid": true
                },
                {
                    "id": "M_border_color",
                    "instruction": "cambia el color del borde a rojo",
                    "response": {
                        "cInstruction": "cambia el color del borde a rojo",
                        "cProvider": "Ollama",
                        "cModelSelection": "Ollama — GPT-OSS 20B",
                        "cModel": "gpt-oss:20b",
                        "cRepresentation": "COMMANDS",
                        "cRawResponse": "{\"commands\":[{\"command\":\"setProperty\",\"target\":\"selection\",\"property\":\"cBorderColor\",\"value\":\"#ff0000\"}]}",
                        "cThinking": "Need setProperty borderColor to red for selection. Use command setProperty target:\"selection\" property:\"cBorderColor\" value:\"#ff0000\".",
                        "cOllamaRequest": "{\"model\":\"gpt-oss:20b\",\"messages\":[{\"role\":\"system\",\"content\":\"Interpreta la instrucción y devuelve únicamente JSON válido con la forma {\\\"commands\\\":[{\\\"command\\\":\\\"setProperty\\\",\\\"target\\\":\\\"selection\\\" o {\\\"ids\\\":[\\\"id_real\\\"]},\\\"property\\\":\\\"propiedad_real\\\",\\\"value\\\":valor}]}. Cada comando DEBE usar la clave command (nunca type) y target. Comandos permitidos: setProperty, move, resize, delete, align, distribute, reorder, duplicate, tableMoveColumn, tableSetColumnWidth, tableInsertColumn, tableDeleteColumn, tableInsertLine, tableDeleteLine, tableMoveLine, tableSetLineHeight, tableSetLineBackground, tableSetLineBorderColor, tableSetLineBorderWidth, tableSetLinePadding, tableSetLineBorderRadius, tableSetLineBorderSide, tableSetLineVerticalSeparators, tableSetLineZebraEnabled, tableSetLineZebraColor, tableSetLineCondition, tableSetLineSuppressCondition, tableSetLineBackgroundColorFormula, tableSetLineBorderColorFormula. Prioridad: propiedad o estilo → setProperty; desplazamiento relativo → move; tamaño relativo → resize; alineación de varios objetos → align; eliminar objetos → delete. Para eliminar usa exactamente {\\\"command\\\":\\\"delete\\\",\\\"target\\\":\\\"selection\\\"}. Si se pide duplicar, reducir o cambiar el tamaño, devuelve únicamente resize y no uses setProperty para propiedades numéricas. Para setProperty usa exactamente property y value, nunca name ni valores como *2. Para move usa {\\\"command\\\":\\\"move\\\",\\\"target\\\":\\\"selection\\\",\\\"dx\\\":10,\\\"dy\\\":0}; para resize usa {\\\"command\\\":\\\"resize\\\",\\\"target\\\":\\\"selection\\\",\\\"scaleX\\\":0.5,\\\"scaleY\\\":0.5}. Para alinear usa exactamente {\\\"command\\\":\\\"align\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"left\\\"}; modos válidos: left|right|top|bottom|horizontalCenter|verticalCenter. Si la orden se refiere a los objetos seleccionados, usa target:\\\"selection\\\". No inventes IDs ni calcules coordenadas o dimensiones finales. Para distribuir usa exactamente {\\\"command\\\":\\\"distribute\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"horizontal\\\"}; modos válidos: horizontal|vertical. Para reordenar usa exactamente {\\\"command\\\":\\\"reorder\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"bringToFront\\\"}; modos válidos: bringToFront=traer al frente, sendToBack=enviar al fondo, bringForward=subir un nivel, sendBackward=bajar un nivel. Para duplicar usa exactamente {\\\"command\\\":\\\"duplicate\\\",\\\"target\\\":\\\"selection\\\"}. Para tablas usa únicamente estas formas: {\\\"command\\\":\\\"tableMoveColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"fromIndex\\\":2,\\\"toIndex\\\":0}, {\\\"command\\\":\\\"tableSetColumnWidth\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":0,\\\"width\\\":30}, {\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2}, {\\\"command\\\":\\\"tableDeleteColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2}, {\\\"command\\\":\\\"tableInsertLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":1}, {\\\"command\\\":\\\"tableDeleteLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":1}, {\\\"command\\\":\\\"tableMoveLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"fromIndex\\\":1,\\\"toIndex\\\":0}, {\\\"command\\\":\\\"tableSetLineHeight\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"height\\\":12}, {\\\"command\\\":\\\"tableSetLineBackground\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"color\\\":\\\"#d3d3d3\\\"}; section: header|groupHeader|detail|groupFooter|footer. Los índices son enteros cero-basados y no negativos. tableSetLineHeight usa altura fija en milímetros >=1. tableSetLineBackground usa únicamente color HEX fijo; no usa fórmulas ni paths privados. Insertar columna usa columnIndex como posición antes de la columna existente; si coincide con el número actual de columnas, añade al final. Insertar línea usa lineIndex como posición antes de la línea existente; si coincide con el número actual de líneas, añade al final. No uses hSections, aLines ni aCells. Semántica de líneas OBLIGATORIA: si una sección tiene una sola línea, basta mencionar la sección y usa lineIndex 0. Si tiene varias líneas, una operación estructural debe indicar la línea; si no la indica y no dice todas, devuelve EXACTAMENTE {\\\"commands\\\":[]}. Solo si dice todas las líneas genera una operación por cada línea existente. Esta regla no afecta a objetos visuales de celda, que siguen usando commands normales. Para cambiar altura o fondo fijo de una línea de TTable usa obligatoriamente tableSetLineHeight o tableSetLineBackground con section y lineIndex; no uses setProperty para esas operaciones. Shapes adicionales de línea: {\\\"command\\\":\\\"tableSetLineBorderColor\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"color\\\":\\\"#0000ff\\\"}, {\\\"command\\\":\\\"tableSetLineBorderWidth\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"width\\\":1}, {\\\"command\\\":\\\"tableSetLinePadding\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"side\\\":\\\"nTop\\\",\\\"value\\\":2}, {\\\"command\\\":\\\"tableSetLineBorderRadius\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"radius\\\":2}, {\\\"command\\\":\\\"tableSetLineBorderSide\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"side\\\":\\\"top\\\",\\\"visible\\\":true}, {\\\"command\\\":\\\"tableSetLineVerticalSeparators\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"visible\\\":true}, {\\\"command\\\":\\\"tableSetLineCondition\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"DETAIL.cantidad > 0\\\"}, {\\\"command\\\":\\\"tableSetLineSuppressCondition\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"DETAIL.importe == 0\\\"}, {\\\"command\\\":\\\"tableSetLineBackgroundColorFormula\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"IF(...)\\\"}, {\\\"command\\\":\\\"tableSetLineBorderColorFormula\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"IF(...)\\\"}. Las cuatro primitivas de fórmula reciben formula como string literal y aceptan string vacío para borrar; no evalúes ni cambies la sintaxis. Usa la primitiva específica según sea condición, supresión o fórmula de color; no uses paths hBorder, hBackground ni setProperty. Si la instrucción menciona una línea, cabecera, detalle o pie, el color de borde de esa línea usa tableSetLineBorderColor y nunca setProperty. Zebra solo existe en líneas detail. Shapes exactas: {\\\"command\\\":\\\"tableSetLineZebraEnabled\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"enabled\\\":true} y {\\\"command\\\":\\\"tableSetLineZebraColor\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"role\\\":\\\"odd\\\",\\\"color\\\":\\\"#d3d3d3\\\"}. Usa enabled booleano para activar o desactivar y role odd/even para filas impares/pares. No uses hZebraPattern ni paths privados. REGLA DE SCOPE OBLIGATORIA: estos, ellos, los seleccionados y pronombres equivalentes -> target:\\\"selection\\\". Todos, todas, todo el documento, todos los objetos o todos los objetos de un tipo -> target:{\\\"ids\\\":[...]} usando todos los cId coincidentes de DOCUMENTO_COMPLETO_SCOPE=global, incluidos objetos anidados en TTable. Si la selección está vacía, una orden global debe usar siempre ids. Para una orden global no uses target:\\\"selection\\\" ni mezcles ambos targets. También se permite create: {\\\"command\\\":\\\"create\\\",\\\"type\\\":\\\"TText\\\",\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\\\\\"texto\\\\\\\\\\\"\\\"}}. En create describe únicamente lo solicitado: incluye solo el tipo, contenido, posición y propiedades que la instrucción pida explícitamente; el diseñador completa los defaults reales. Tipos reales: TText,TRectangle,TEllipse,TImage,TLine,TBarcode,richText,TFormattedText,TTable. Properties solo editables, nunca cId, defaults, estructura interna ni geometría. position usa {\\\"x\\\":20,\\\"y\\\":30}. Para crear una tabla usa {\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"tabla1\\\",\\\"type\\\":\\\"TTable\\\"}; las primitives TTable posteriores pueden usar target:{\\\"ref\\\":\\\"tabla1\\\"}. Una TTable recién creada tiene las secciones vacías. Antes de insertar columnas o modificar una línea, crea esa línea con tableInsertLine. tableInsertLine crea siempre una línea válida con exactamente 1 columna inicial. SEMÁNTICA OBLIGATORIA DEL NÚMERO DE COLUMNAS: \\\"de N columnas\\\", \\\"con N columnas\\\" y \\\"que tenga N columnas\\\" expresan el TOTAL FINAL deseado; genera exactamente N menos las columnas actuales operaciones tableInsertColumn. Después de tableInsertLine ya hay 1 columna: para una línea de 4 columnas genera exactamente 3 tableInsertColumn y el total final es 4, nunca 4 inserciones. \\\"añade N columnas\\\", \\\"agrega N columnas\\\", \\\"inserta N columnas más\\\" y equivalentes explícitos expresan una CANTIDAD ADICIONAL; genera exactamente N tableInsertColumn. La fachada ejecuta literalmente esas inserciones y no corrige ni reinterpreta el número. Ejemplo total final 4: {\\\"commands\\\":[{\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"tabla1\\\",\\\"type\\\":\\\"TTable\\\"},{\\\"command\\\":\\\"tableInsertLine\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":1},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":3}]}. No envíes hSections, aLines ni aCells en create. Para crear contenido real en una celda usa {\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"txt1\\\",\\\"type\\\":\\\"TText\\\",\\\"targetCell\\\":{\\\"table\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"cellIndex\\\":0},\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\"Título\\\\\\\"\\\"}}; table admite \\\"selection\\\", {\\\"ids\\\":[\\\"id_real\\\"]} o {\\\"ref\\\":\\\"tabla1\\\"}. Tipos manuales admitidos en celda: TText,richText,TBarcode,TImage. Si la instrucción enumera contenidos o títulos, crea un objeto por cada literal en la celda correspondiente; no omitas esos contenidos. No uses position ni geometría para contenido de celda. Una ref es temporal dentro de esta respuesta: el create declara ref:\\\"new1\\\" y un comando posterior apunta al mismo objeto con target:{\\\"ref\\\":\\\"new1\\\"}. Ejemplo: {\\\"commands\\\":[{\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"new1\\\",\\\"type\\\":\\\"TText\\\",\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\\\\\"TOTAL\\\\\\\\\\\"\\\"}},{\\\"command\\\":\\\"resize\\\",\\\"target\\\":{\\\"ref\\\":\\\"new1\\\"},\\\"scaleX\\\":2,\\\"scaleY\\\":2}]}. PLANIFICACION INTERNA PARA INSTRUCCIONES COMPLEJAS: antes de devolver Commands, divide mentalmente la peticion en bloques visuales, asigna posiciones y tamanos aproximados, enumera todos los requisitos explicitos, ordena los commands por dependencias y revisa que no falte ningun requisito realizable. No devuelvas ni expliques este plan; la salida sigue siendo solo {\\\"commands\\\":[...]}. En disenos completos organiza conceptualmente cabecera superior, datos principales, bloque central, totales y pie cuando hayan sido pedidos y sean realizables. Cada objeto visual explicitamente solicitado requiere su propio create. Asigna position y, cuando proceda, move o resize a los objetos raiz; evita que sus cajas se solapen salvo peticion expresa. Crear contenido no sustituye sus estilos: incluye los colores, negrita, alineacion, tamano y fondo pedidos usando propiedades o commands ya disponibles. Para un objeto interno nuevo, incluye sus estilos en create.properties o declara ref en create y usa despues target:{\\\"ref\\\":\\\"...\\\"}; targetCell solo existe en create y nunca es target de setProperty. Todo texto fijo visible usa cText como expresion literal canonica entre comillas. Si se pide un formato y ya existe una sintaxis canonica disponible, usala sin inventar funciones. Si existe una referencia real claramente compatible con un dato solicitado, usala en vez de crear ese dato como literal. Si una columna debe ser mas ancha, incluye tableSetColumnWidth explicitamente. En planes largos prefiere: limpieza; contenedores; estructura; objetos internos; propiedades; geometria; estilos finales, salvo que una dependencia exija otro orden. Omite de forma segura solo lo que no pueda realizarse por falta de campos o capacidades. CTEXT CANONICO: texto fijo=\\\"\\\\\\\\\\\"FACTURA\\\\\\\\\\\"\\\"; campo=REFERENCIA_EXACTA; texto+campo=\\\"\\\\\\\\\\\"Factura: \\\\\\\\\\\"+REFERENCIA_EXACTA\\\"; formula=\\\"Transform(REFERENCIA_EXACTA,\\\\\\\\\\\"99/99/9999\\\\\\\\\\\")\\\". Para contenido de celda usa el mismo TText y la misma semantica. Usa exclusivamente referencias exactas de CAMPOS_Y_VARIABLES_DISPONIBLES; no inventes campos. Si la instruccion pide un dato/campo y no existe una referencia compatible, no conviertas su descripcion en texto fijo: omite esa parte o devuelve {\\\"commands\\\":[]}. En TTable, para CADA seccion usada, el orden obligatorio es: tableInsertLine; N-1 tableInsertColumn para obtener N columnas; despues los create.targetCell. El contenido header exige linea header y el contenido detail exige linea detail; antes de cellIndex K deben existir al menos K+1 columnas en esa misma linea. Nunca uses create.targetCell sobre una linea o celda inexistente. Para una celda vacia de una TTable existente seleccionada usa exactamente {\\\"command\\\":\\\"create\\\",\\\"type\\\":\\\"TText\\\",\\\"targetCell\\\":{\\\"table\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"cellIndex\\\":K},\\\"properties\\\":{\\\"cText\\\":\\\"REFERENCIA_EXACTA\\\"}}. Para una TTable existente identificada table puede ser {\\\"ids\\\":[\\\"id_real\\\"]}; nunca uses {\\\"cId\\\":\\\"...\\\"}. Para una tabla creada en ESTA respuesta, todas las estructuras y targetCell.table usan siempre {\\\"ref\\\":\\\"tabla1\\\"}, nunca \\\"selection\\\". Una lista de N nombres de columnas son N titulos fijos TText de header con cText=\\\"\\\\\\\\\\\"TITULO\\\\\\\\\\\"\\\"; si ademas se piden sus campos o campos disponibles, crea header Y detail, cada seccion con su tableInsertLine y exactamente N-1 inserciones, y despues N TText por seccion. Esquema minimo de dos secciones y dos columnas: create TTable ref tabla1; tableInsertLine header; tableInsertColumn header columnIndex 1; tableInsertLine detail; tableInsertColumn detail columnIndex 1; despues create.targetCell header 0 y 1, y detail 0 y 1, todos con table:{\\\"ref\\\":\\\"tabla1\\\"}. Alinear el contenido o texto a izquierda/centro/derecha usa setProperty con property:\\\"cTextAlign\\\" y value:\\\"left\\\"|\\\"center\\\"|\\\"right\\\"; align se reserva para alinear geometricamente varios objetos.\"},{\"role\":\"user\",\"content\":\"SELECCION_ACTUAL_SCOPE=selection:\\n[]\\nDOCUMENTO_COMPLETO_SCOPE=global:\\n[]\\nGLOBAL_COUNTS:\\nGLOBAL_IDS_BY_TYPE:\\nPROPIEDADES COMUNES EDITABLES: cBackgroundColor:string=Dimensiones y Color / Color de fondo,cBorderColor:string=Borde / Color,cCondition:string,cFillColor2:string,cFillColor3:string,cFillStyle:string,cFontFamily:string,cShadowColor:string,cText:string,cTextAlign:string,cTextColor:string=Texto / Color,cTextFitMode:string,cTextVerticalAlign:string,lAllowPageBreak:boolean,lBorderBottom:boolean,lBorderLeft:boolean,lBorderRight:boolean,lBorderTop:boolean,lFontBold:boolean=Texto / Negrita,lFontItalic:boolean=Texto / Cursiva,lFontStrikeout:boolean,lFontUnderline:boolean,lForceWrap:boolean,lKeepEmptyParagraphs:boolean,lLocked:boolean,lTextAdjusted:boolean,lTextWrap:boolean,lTrimSpaces:boolean,lVisible:boolean,nBorderWidth:number,nFillOpacity:number,nFontSize:number=Texto / Tamaño,nLayerId:number,nLineSpacing:number,nOpacity:number=Transformación / Opacidad,nPaddingBottom:number,nPaddingLeft:number,nPaddingRight:number,nPaddingTop:number,nParagraphSpacing:number,nRotation:number,nRounded:number,nShadowSize:number,nShadowTransparency:number,nTextDecimalPosition:number,nTextOpacity:number,nZIndex:number\\nCOLORES CANÓNICOS: rojo:#ff0000 · verde:#008000 · verde oscuro:#006400 · azul:#0000ff · azul oscuro:#00008b · amarillo:#ffff00 · gris claro:#d3d3d3\\nCAMPOS_Y_VARIABLES_DISPONIBLES\\nTIPOS:C=texto,N=numero,D=fecha,I=imagen,M=memo,L=booleano\\n\\nINSTRUCCIÓN:\\ncambia el color del borde a rojo\"}],\"stream\":false,\"format\":\"json\",\"keep_alive\":-1,\"options\":{\"temperature\":0,\"top_p\":1,\"top_k\":0,\"repeat_penalty\":1.1,\"frequency_penalty\":0,\"presence_penalty\":0,\"num_ctx\":65536,\"num_batch\":4096,\"num_thread\":10,\"num_gpu\":99,\"num_predict\":4096},\"think\":\"low\"}",
                        "cHttpBody": "{\"model\":\"gpt-oss:20b\",\"created_at\":\"2026-08-12T22:20:38.2751164Z\",\"message\":{\"role\":\"assistant\",\"content\":\"{\\\"commands\\\":[{\\\"command\\\":\\\"setProperty\\\",\\\"target\\\":\\\"selection\\\",\\\"property\\\":\\\"cBorderColor\\\",\\\"value\\\":\\\"#ff0000\\\"}]}\",\"thinking\":\"Need setProperty borderColor to red for selection. Use command setProperty target:\\\"selection\\\" property:\\\"cBorderColor\\\" value:\\\"#ff0000\\\".\"},\"done\":true,\"done_reason\":\"stop\",\"total_duration\":1227366100,\"load_duration\":198271500,\"prompt_eval_count\":3687,\"prompt_eval_duration\":13901000,\"eval_count\":28,\"eval_duration\":349340000}",
                        "hMetrics": {
                            "total_duration": 1227366100,
                            "load_duration": 198271500,
                            "prompt_eval_count": 3687,
                            "prompt_eval_duration": 13901000,
                            "eval_count": 28,
                            "eval_duration": 349340000,
                            "unattributed_duration": 665853600
                        },
                        "hCommands": {
                            "commands": [
                                {
                                    "command": "setProperty",
                                    "target": "selection",
                                    "property": "cBorderColor",
                                    "value": "#ff0000"
                                }
                            ]
                        },
                        "lValid": true,
                        "nCreates": 0,
                        "nChanges": 0,
                        "nDeletes": 0,
                        "nStructures": 0,
                        "nGeneratedIds": 0,
                        "nOperations": 1,
                        "nFinalOperations": 1,
                        "cValidation": "Shape commands válida; validación de ejecución pendiente",
                        "nResponseMilliseconds": 1239.844,
                        "tRequestStartedAt": "2026-08-13T00:20:37.037533+02:00",
                        "tResponseFinishedAt": "2026-08-13T00:20:38.277394+02:00",
                        "hPromptDiagnostics": {
                            "nSystemCharacters": 13534,
                            "nUserCharacters": 1501,
                            "nPromptCharacters": 15036,
                            "nPromptCharactersBeforeFields": 12845,
                            "nFieldsCharacters": 88,
                            "nPromptTokensBeforeEstimated": 3212,
                            "nPromptTokensAfterEstimated": 3759,
                            "nContextTokens": 65536,
                            "lPromptFitsContext": true,
                            "hFields": {
                                "nGroups": 0,
                                "nFields": 0,
                                "nUserVariables": 0,
                                "nAccumulators": 0
                            }
                        }
                    },
                    "commands": [
                        {
                            "command": "setProperty",
                            "target": "selection",
                            "property": "cBorderColor",
                            "value": "#ff0000"
                        }
                    ],
                    "valid": true
                },
                {
                    "id": "N_font_size",
                    "instruction": "pon el tamaño de fuente a 18",
                    "response": {
                        "cInstruction": "pon el tamaño de fuente a 18",
                        "cProvider": "Ollama",
                        "cModelSelection": "Ollama — GPT-OSS 20B",
                        "cModel": "gpt-oss:20b",
                        "cRepresentation": "COMMANDS",
                        "cRawResponse": "{\"commands\":[{\"command\":\"setProperty\",\"target\":\"selection\",\"property\":\"cFontSize\",\"value\":18}]}",
                        "cThinking": "Need setProperty cFontSize to 18 for selection.",
                        "cOllamaRequest": "{\"model\":\"gpt-oss:20b\",\"messages\":[{\"role\":\"system\",\"content\":\"Interpreta la instrucción y devuelve únicamente JSON válido con la forma {\\\"commands\\\":[{\\\"command\\\":\\\"setProperty\\\",\\\"target\\\":\\\"selection\\\" o {\\\"ids\\\":[\\\"id_real\\\"]},\\\"property\\\":\\\"propiedad_real\\\",\\\"value\\\":valor}]}. Cada comando DEBE usar la clave command (nunca type) y target. Comandos permitidos: setProperty, move, resize, delete, align, distribute, reorder, duplicate, tableMoveColumn, tableSetColumnWidth, tableInsertColumn, tableDeleteColumn, tableInsertLine, tableDeleteLine, tableMoveLine, tableSetLineHeight, tableSetLineBackground, tableSetLineBorderColor, tableSetLineBorderWidth, tableSetLinePadding, tableSetLineBorderRadius, tableSetLineBorderSide, tableSetLineVerticalSeparators, tableSetLineZebraEnabled, tableSetLineZebraColor, tableSetLineCondition, tableSetLineSuppressCondition, tableSetLineBackgroundColorFormula, tableSetLineBorderColorFormula. Prioridad: propiedad o estilo → setProperty; desplazamiento relativo → move; tamaño relativo → resize; alineación de varios objetos → align; eliminar objetos → delete. Para eliminar usa exactamente {\\\"command\\\":\\\"delete\\\",\\\"target\\\":\\\"selection\\\"}. Si se pide duplicar, reducir o cambiar el tamaño, devuelve únicamente resize y no uses setProperty para propiedades numéricas. Para setProperty usa exactamente property y value, nunca name ni valores como *2. Para move usa {\\\"command\\\":\\\"move\\\",\\\"target\\\":\\\"selection\\\",\\\"dx\\\":10,\\\"dy\\\":0}; para resize usa {\\\"command\\\":\\\"resize\\\",\\\"target\\\":\\\"selection\\\",\\\"scaleX\\\":0.5,\\\"scaleY\\\":0.5}. Para alinear usa exactamente {\\\"command\\\":\\\"align\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"left\\\"}; modos válidos: left|right|top|bottom|horizontalCenter|verticalCenter. Si la orden se refiere a los objetos seleccionados, usa target:\\\"selection\\\". No inventes IDs ni calcules coordenadas o dimensiones finales. Para distribuir usa exactamente {\\\"command\\\":\\\"distribute\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"horizontal\\\"}; modos válidos: horizontal|vertical. Para reordenar usa exactamente {\\\"command\\\":\\\"reorder\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"bringToFront\\\"}; modos válidos: bringToFront=traer al frente, sendToBack=enviar al fondo, bringForward=subir un nivel, sendBackward=bajar un nivel. Para duplicar usa exactamente {\\\"command\\\":\\\"duplicate\\\",\\\"target\\\":\\\"selection\\\"}. Para tablas usa únicamente estas formas: {\\\"command\\\":\\\"tableMoveColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"fromIndex\\\":2,\\\"toIndex\\\":0}, {\\\"command\\\":\\\"tableSetColumnWidth\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":0,\\\"width\\\":30}, {\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2}, {\\\"command\\\":\\\"tableDeleteColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2}, {\\\"command\\\":\\\"tableInsertLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":1}, {\\\"command\\\":\\\"tableDeleteLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":1}, {\\\"command\\\":\\\"tableMoveLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"fromIndex\\\":1,\\\"toIndex\\\":0}, {\\\"command\\\":\\\"tableSetLineHeight\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"height\\\":12}, {\\\"command\\\":\\\"tableSetLineBackground\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"color\\\":\\\"#d3d3d3\\\"}; section: header|groupHeader|detail|groupFooter|footer. Los índices son enteros cero-basados y no negativos. tableSetLineHeight usa altura fija en milímetros >=1. tableSetLineBackground usa únicamente color HEX fijo; no usa fórmulas ni paths privados. Insertar columna usa columnIndex como posición antes de la columna existente; si coincide con el número actual de columnas, añade al final. Insertar línea usa lineIndex como posición antes de la línea existente; si coincide con el número actual de líneas, añade al final. No uses hSections, aLines ni aCells. Semántica de líneas OBLIGATORIA: si una sección tiene una sola línea, basta mencionar la sección y usa lineIndex 0. Si tiene varias líneas, una operación estructural debe indicar la línea; si no la indica y no dice todas, devuelve EXACTAMENTE {\\\"commands\\\":[]}. Solo si dice todas las líneas genera una operación por cada línea existente. Esta regla no afecta a objetos visuales de celda, que siguen usando commands normales. Para cambiar altura o fondo fijo de una línea de TTable usa obligatoriamente tableSetLineHeight o tableSetLineBackground con section y lineIndex; no uses setProperty para esas operaciones. Shapes adicionales de línea: {\\\"command\\\":\\\"tableSetLineBorderColor\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"color\\\":\\\"#0000ff\\\"}, {\\\"command\\\":\\\"tableSetLineBorderWidth\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"width\\\":1}, {\\\"command\\\":\\\"tableSetLinePadding\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"side\\\":\\\"nTop\\\",\\\"value\\\":2}, {\\\"command\\\":\\\"tableSetLineBorderRadius\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"radius\\\":2}, {\\\"command\\\":\\\"tableSetLineBorderSide\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"side\\\":\\\"top\\\",\\\"visible\\\":true}, {\\\"command\\\":\\\"tableSetLineVerticalSeparators\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"visible\\\":true}, {\\\"command\\\":\\\"tableSetLineCondition\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"DETAIL.cantidad > 0\\\"}, {\\\"command\\\":\\\"tableSetLineSuppressCondition\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"DETAIL.importe == 0\\\"}, {\\\"command\\\":\\\"tableSetLineBackgroundColorFormula\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"IF(...)\\\"}, {\\\"command\\\":\\\"tableSetLineBorderColorFormula\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"IF(...)\\\"}. Las cuatro primitivas de fórmula reciben formula como string literal y aceptan string vacío para borrar; no evalúes ni cambies la sintaxis. Usa la primitiva específica según sea condición, supresión o fórmula de color; no uses paths hBorder, hBackground ni setProperty. Si la instrucción menciona una línea, cabecera, detalle o pie, el color de borde de esa línea usa tableSetLineBorderColor y nunca setProperty. Zebra solo existe en líneas detail. Shapes exactas: {\\\"command\\\":\\\"tableSetLineZebraEnabled\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"enabled\\\":true} y {\\\"command\\\":\\\"tableSetLineZebraColor\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"role\\\":\\\"odd\\\",\\\"color\\\":\\\"#d3d3d3\\\"}. Usa enabled booleano para activar o desactivar y role odd/even para filas impares/pares. No uses hZebraPattern ni paths privados. REGLA DE SCOPE OBLIGATORIA: estos, ellos, los seleccionados y pronombres equivalentes -> target:\\\"selection\\\". Todos, todas, todo el documento, todos los objetos o todos los objetos de un tipo -> target:{\\\"ids\\\":[...]} usando todos los cId coincidentes de DOCUMENTO_COMPLETO_SCOPE=global, incluidos objetos anidados en TTable. Si la selección está vacía, una orden global debe usar siempre ids. Para una orden global no uses target:\\\"selection\\\" ni mezcles ambos targets. También se permite create: {\\\"command\\\":\\\"create\\\",\\\"type\\\":\\\"TText\\\",\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\\\\\"texto\\\\\\\\\\\"\\\"}}. En create describe únicamente lo solicitado: incluye solo el tipo, contenido, posición y propiedades que la instrucción pida explícitamente; el diseñador completa los defaults reales. Tipos reales: TText,TRectangle,TEllipse,TImage,TLine,TBarcode,richText,TFormattedText,TTable. Properties solo editables, nunca cId, defaults, estructura interna ni geometría. position usa {\\\"x\\\":20,\\\"y\\\":30}. Para crear una tabla usa {\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"tabla1\\\",\\\"type\\\":\\\"TTable\\\"}; las primitives TTable posteriores pueden usar target:{\\\"ref\\\":\\\"tabla1\\\"}. Una TTable recién creada tiene las secciones vacías. Antes de insertar columnas o modificar una línea, crea esa línea con tableInsertLine. tableInsertLine crea siempre una línea válida con exactamente 1 columna inicial. SEMÁNTICA OBLIGATORIA DEL NÚMERO DE COLUMNAS: \\\"de N columnas\\\", \\\"con N columnas\\\" y \\\"que tenga N columnas\\\" expresan el TOTAL FINAL deseado; genera exactamente N menos las columnas actuales operaciones tableInsertColumn. Después de tableInsertLine ya hay 1 columna: para una línea de 4 columnas genera exactamente 3 tableInsertColumn y el total final es 4, nunca 4 inserciones. \\\"añade N columnas\\\", \\\"agrega N columnas\\\", \\\"inserta N columnas más\\\" y equivalentes explícitos expresan una CANTIDAD ADICIONAL; genera exactamente N tableInsertColumn. La fachada ejecuta literalmente esas inserciones y no corrige ni reinterpreta el número. Ejemplo total final 4: {\\\"commands\\\":[{\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"tabla1\\\",\\\"type\\\":\\\"TTable\\\"},{\\\"command\\\":\\\"tableInsertLine\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":1},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":3}]}. No envíes hSections, aLines ni aCells en create. Para crear contenido real en una celda usa {\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"txt1\\\",\\\"type\\\":\\\"TText\\\",\\\"targetCell\\\":{\\\"table\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"cellIndex\\\":0},\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\"Título\\\\\\\"\\\"}}; table admite \\\"selection\\\", {\\\"ids\\\":[\\\"id_real\\\"]} o {\\\"ref\\\":\\\"tabla1\\\"}. Tipos manuales admitidos en celda: TText,richText,TBarcode,TImage. Si la instrucción enumera contenidos o títulos, crea un objeto por cada literal en la celda correspondiente; no omitas esos contenidos. No uses position ni geometría para contenido de celda. Una ref es temporal dentro de esta respuesta: el create declara ref:\\\"new1\\\" y un comando posterior apunta al mismo objeto con target:{\\\"ref\\\":\\\"new1\\\"}. Ejemplo: {\\\"commands\\\":[{\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"new1\\\",\\\"type\\\":\\\"TText\\\",\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\\\\\"TOTAL\\\\\\\\\\\"\\\"}},{\\\"command\\\":\\\"resize\\\",\\\"target\\\":{\\\"ref\\\":\\\"new1\\\"},\\\"scaleX\\\":2,\\\"scaleY\\\":2}]}. PLANIFICACION INTERNA PARA INSTRUCCIONES COMPLEJAS: antes de devolver Commands, divide mentalmente la peticion en bloques visuales, asigna posiciones y tamanos aproximados, enumera todos los requisitos explicitos, ordena los commands por dependencias y revisa que no falte ningun requisito realizable. No devuelvas ni expliques este plan; la salida sigue siendo solo {\\\"commands\\\":[...]}. En disenos completos organiza conceptualmente cabecera superior, datos principales, bloque central, totales y pie cuando hayan sido pedidos y sean realizables. Cada objeto visual explicitamente solicitado requiere su propio create. Asigna position y, cuando proceda, move o resize a los objetos raiz; evita que sus cajas se solapen salvo peticion expresa. Crear contenido no sustituye sus estilos: incluye los colores, negrita, alineacion, tamano y fondo pedidos usando propiedades o commands ya disponibles. Para un objeto interno nuevo, incluye sus estilos en create.properties o declara ref en create y usa despues target:{\\\"ref\\\":\\\"...\\\"}; targetCell solo existe en create y nunca es target de setProperty. Todo texto fijo visible usa cText como expresion literal canonica entre comillas. Si se pide un formato y ya existe una sintaxis canonica disponible, usala sin inventar funciones. Si existe una referencia real claramente compatible con un dato solicitado, usala en vez de crear ese dato como literal. Si una columna debe ser mas ancha, incluye tableSetColumnWidth explicitamente. En planes largos prefiere: limpieza; contenedores; estructura; objetos internos; propiedades; geometria; estilos finales, salvo que una dependencia exija otro orden. Omite de forma segura solo lo que no pueda realizarse por falta de campos o capacidades. CTEXT CANONICO: texto fijo=\\\"\\\\\\\\\\\"FACTURA\\\\\\\\\\\"\\\"; campo=REFERENCIA_EXACTA; texto+campo=\\\"\\\\\\\\\\\"Factura: \\\\\\\\\\\"+REFERENCIA_EXACTA\\\"; formula=\\\"Transform(REFERENCIA_EXACTA,\\\\\\\\\\\"99/99/9999\\\\\\\\\\\")\\\". Para contenido de celda usa el mismo TText y la misma semantica. Usa exclusivamente referencias exactas de CAMPOS_Y_VARIABLES_DISPONIBLES; no inventes campos. Si la instruccion pide un dato/campo y no existe una referencia compatible, no conviertas su descripcion en texto fijo: omite esa parte o devuelve {\\\"commands\\\":[]}. En TTable, para CADA seccion usada, el orden obligatorio es: tableInsertLine; N-1 tableInsertColumn para obtener N columnas; despues los create.targetCell. El contenido header exige linea header y el contenido detail exige linea detail; antes de cellIndex K deben existir al menos K+1 columnas en esa misma linea. Nunca uses create.targetCell sobre una linea o celda inexistente. Para una celda vacia de una TTable existente seleccionada usa exactamente {\\\"command\\\":\\\"create\\\",\\\"type\\\":\\\"TText\\\",\\\"targetCell\\\":{\\\"table\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"cellIndex\\\":K},\\\"properties\\\":{\\\"cText\\\":\\\"REFERENCIA_EXACTA\\\"}}. Para una TTable existente identificada table puede ser {\\\"ids\\\":[\\\"id_real\\\"]}; nunca uses {\\\"cId\\\":\\\"...\\\"}. Para una tabla creada en ESTA respuesta, todas las estructuras y targetCell.table usan siempre {\\\"ref\\\":\\\"tabla1\\\"}, nunca \\\"selection\\\". Una lista de N nombres de columnas son N titulos fijos TText de header con cText=\\\"\\\\\\\\\\\"TITULO\\\\\\\\\\\"\\\"; si ademas se piden sus campos o campos disponibles, crea header Y detail, cada seccion con su tableInsertLine y exactamente N-1 inserciones, y despues N TText por seccion. Esquema minimo de dos secciones y dos columnas: create TTable ref tabla1; tableInsertLine header; tableInsertColumn header columnIndex 1; tableInsertLine detail; tableInsertColumn detail columnIndex 1; despues create.targetCell header 0 y 1, y detail 0 y 1, todos con table:{\\\"ref\\\":\\\"tabla1\\\"}. Alinear el contenido o texto a izquierda/centro/derecha usa setProperty con property:\\\"cTextAlign\\\" y value:\\\"left\\\"|\\\"center\\\"|\\\"right\\\"; align se reserva para alinear geometricamente varios objetos.\"},{\"role\":\"user\",\"content\":\"SELECCION_ACTUAL_SCOPE=selection:\\n[]\\nDOCUMENTO_COMPLETO_SCOPE=global:\\n[]\\nGLOBAL_COUNTS:\\nGLOBAL_IDS_BY_TYPE:\\nPROPIEDADES COMUNES EDITABLES: cBackgroundColor:string=Dimensiones y Color / Color de fondo,cBorderColor:string=Borde / Color,cCondition:string,cFillColor2:string,cFillColor3:string,cFillStyle:string,cFontFamily:string,cShadowColor:string,cText:string,cTextAlign:string,cTextColor:string=Texto / Color,cTextFitMode:string,cTextVerticalAlign:string,lAllowPageBreak:boolean,lBorderBottom:boolean,lBorderLeft:boolean,lBorderRight:boolean,lBorderTop:boolean,lFontBold:boolean=Texto / Negrita,lFontItalic:boolean=Texto / Cursiva,lFontStrikeout:boolean,lFontUnderline:boolean,lForceWrap:boolean,lKeepEmptyParagraphs:boolean,lLocked:boolean,lTextAdjusted:boolean,lTextWrap:boolean,lTrimSpaces:boolean,lVisible:boolean,nBorderWidth:number,nFillOpacity:number,nFontSize:number=Texto / Tamaño,nLayerId:number,nLineSpacing:number,nOpacity:number=Transformación / Opacidad,nPaddingBottom:number,nPaddingLeft:number,nPaddingRight:number,nPaddingTop:number,nParagraphSpacing:number,nRotation:number,nRounded:number,nShadowSize:number,nShadowTransparency:number,nTextDecimalPosition:number,nTextOpacity:number,nZIndex:number\\nCOLORES CANÓNICOS: rojo:#ff0000 · verde:#008000 · verde oscuro:#006400 · azul:#0000ff · azul oscuro:#00008b · amarillo:#ffff00 · gris claro:#d3d3d3\\nCAMPOS_Y_VARIABLES_DISPONIBLES\\nTIPOS:C=texto,N=numero,D=fecha,I=imagen,M=memo,L=booleano\\n\\nINSTRUCCIÓN:\\npon el tamaño de fuente a 18\"}],\"stream\":false,\"format\":\"json\",\"keep_alive\":-1,\"options\":{\"temperature\":0,\"top_p\":1,\"top_k\":0,\"repeat_penalty\":1.1,\"frequency_penalty\":0,\"presence_penalty\":0,\"num_ctx\":65536,\"num_batch\":4096,\"num_thread\":10,\"num_gpu\":99,\"num_predict\":4096},\"think\":\"low\"}",
                        "cHttpBody": "{\"model\":\"gpt-oss:20b\",\"created_at\":\"2026-08-12T22:20:39.2626635Z\",\"message\":{\"role\":\"assistant\",\"content\":\"{\\\"commands\\\":[{\\\"command\\\":\\\"setProperty\\\",\\\"target\\\":\\\"selection\\\",\\\"property\\\":\\\"cFontSize\\\",\\\"value\\\":18}]}\",\"thinking\":\"Need setProperty cFontSize to 18 for selection.\"},\"done\":true,\"done_reason\":\"stop\",\"total_duration\":971514500,\"load_duration\":200676100,\"prompt_eval_count\":3669,\"prompt_eval_duration\":13946000,\"eval_count\":25,\"eval_duration\":310243000}",
                        "hMetrics": {
                            "total_duration": 971514500,
                            "load_duration": 200676100,
                            "prompt_eval_count": 3669,
                            "prompt_eval_duration": 13946000,
                            "eval_count": 25,
                            "eval_duration": 310243000,
                            "unattributed_duration": 446649400
                        },
                        "hCommands": {
                            "commands": [
                                {
                                    "command": "setProperty",
                                    "target": "selection",
                                    "property": "cFontSize",
                                    "value": 18
                                }
                            ]
                        },
                        "lValid": true,
                        "nCreates": 0,
                        "nChanges": 0,
                        "nDeletes": 0,
                        "nStructures": 0,
                        "nGeneratedIds": 0,
                        "nOperations": 1,
                        "nFinalOperations": 1,
                        "cValidation": "Shape commands válida; validación de ejecución pendiente",
                        "nResponseMilliseconds": 986.541,
                        "tRequestStartedAt": "2026-08-13T00:20:38.278113+02:00",
                        "tResponseFinishedAt": "2026-08-13T00:20:39.264670+02:00",
                        "hPromptDiagnostics": {
                            "nSystemCharacters": 13534,
                            "nUserCharacters": 1497,
                            "nPromptCharacters": 15032,
                            "nPromptCharactersBeforeFields": 12841,
                            "nFieldsCharacters": 88,
                            "nPromptTokensBeforeEstimated": 3211,
                            "nPromptTokensAfterEstimated": 3758,
                            "nContextTokens": 65536,
                            "lPromptFitsContext": true,
                            "hFields": {
                                "nGroups": 0,
                                "nFields": 0,
                                "nUserVariables": 0,
                                "nAccumulators": 0
                            }
                        }
                    },
                    "commands": [
                        {
                            "command": "setProperty",
                            "target": "selection",
                            "property": "cFontSize",
                            "value": 18
                        }
                    ],
                    "valid": true
                },
                {
                    "id": "O_italic",
                    "instruction": "ponlo en cursiva",
                    "response": {
                        "cInstruction": "ponlo en cursiva",
                        "cProvider": "Ollama",
                        "cModelSelection": "Ollama — GPT-OSS 20B",
                        "cModel": "gpt-oss:20b",
                        "cRepresentation": "COMMANDS",
                        "cRawResponse": "{\"commands\":[{\"command\":\"setProperty\",\"target\":\"selection\",\"property\":\"cFontItalic\",\"value\":true}]}",
                        "cThinking": "Need to italicize selection. Use setProperty cFontItalic true. target selection.",
                        "cOllamaRequest": "{\"model\":\"gpt-oss:20b\",\"messages\":[{\"role\":\"system\",\"content\":\"Interpreta la instrucción y devuelve únicamente JSON válido con la forma {\\\"commands\\\":[{\\\"command\\\":\\\"setProperty\\\",\\\"target\\\":\\\"selection\\\" o {\\\"ids\\\":[\\\"id_real\\\"]},\\\"property\\\":\\\"propiedad_real\\\",\\\"value\\\":valor}]}. Cada comando DEBE usar la clave command (nunca type) y target. Comandos permitidos: setProperty, move, resize, delete, align, distribute, reorder, duplicate, tableMoveColumn, tableSetColumnWidth, tableInsertColumn, tableDeleteColumn, tableInsertLine, tableDeleteLine, tableMoveLine, tableSetLineHeight, tableSetLineBackground, tableSetLineBorderColor, tableSetLineBorderWidth, tableSetLinePadding, tableSetLineBorderRadius, tableSetLineBorderSide, tableSetLineVerticalSeparators, tableSetLineZebraEnabled, tableSetLineZebraColor, tableSetLineCondition, tableSetLineSuppressCondition, tableSetLineBackgroundColorFormula, tableSetLineBorderColorFormula. Prioridad: propiedad o estilo → setProperty; desplazamiento relativo → move; tamaño relativo → resize; alineación de varios objetos → align; eliminar objetos → delete. Para eliminar usa exactamente {\\\"command\\\":\\\"delete\\\",\\\"target\\\":\\\"selection\\\"}. Si se pide duplicar, reducir o cambiar el tamaño, devuelve únicamente resize y no uses setProperty para propiedades numéricas. Para setProperty usa exactamente property y value, nunca name ni valores como *2. Para move usa {\\\"command\\\":\\\"move\\\",\\\"target\\\":\\\"selection\\\",\\\"dx\\\":10,\\\"dy\\\":0}; para resize usa {\\\"command\\\":\\\"resize\\\",\\\"target\\\":\\\"selection\\\",\\\"scaleX\\\":0.5,\\\"scaleY\\\":0.5}. Para alinear usa exactamente {\\\"command\\\":\\\"align\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"left\\\"}; modos válidos: left|right|top|bottom|horizontalCenter|verticalCenter. Si la orden se refiere a los objetos seleccionados, usa target:\\\"selection\\\". No inventes IDs ni calcules coordenadas o dimensiones finales. Para distribuir usa exactamente {\\\"command\\\":\\\"distribute\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"horizontal\\\"}; modos válidos: horizontal|vertical. Para reordenar usa exactamente {\\\"command\\\":\\\"reorder\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"bringToFront\\\"}; modos válidos: bringToFront=traer al frente, sendToBack=enviar al fondo, bringForward=subir un nivel, sendBackward=bajar un nivel. Para duplicar usa exactamente {\\\"command\\\":\\\"duplicate\\\",\\\"target\\\":\\\"selection\\\"}. Para tablas usa únicamente estas formas: {\\\"command\\\":\\\"tableMoveColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"fromIndex\\\":2,\\\"toIndex\\\":0}, {\\\"command\\\":\\\"tableSetColumnWidth\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":0,\\\"width\\\":30}, {\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2}, {\\\"command\\\":\\\"tableDeleteColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2}, {\\\"command\\\":\\\"tableInsertLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":1}, {\\\"command\\\":\\\"tableDeleteLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":1}, {\\\"command\\\":\\\"tableMoveLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"fromIndex\\\":1,\\\"toIndex\\\":0}, {\\\"command\\\":\\\"tableSetLineHeight\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"height\\\":12}, {\\\"command\\\":\\\"tableSetLineBackground\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"color\\\":\\\"#d3d3d3\\\"}; section: header|groupHeader|detail|groupFooter|footer. Los índices son enteros cero-basados y no negativos. tableSetLineHeight usa altura fija en milímetros >=1. tableSetLineBackground usa únicamente color HEX fijo; no usa fórmulas ni paths privados. Insertar columna usa columnIndex como posición antes de la columna existente; si coincide con el número actual de columnas, añade al final. Insertar línea usa lineIndex como posición antes de la línea existente; si coincide con el número actual de líneas, añade al final. No uses hSections, aLines ni aCells. Semántica de líneas OBLIGATORIA: si una sección tiene una sola línea, basta mencionar la sección y usa lineIndex 0. Si tiene varias líneas, una operación estructural debe indicar la línea; si no la indica y no dice todas, devuelve EXACTAMENTE {\\\"commands\\\":[]}. Solo si dice todas las líneas genera una operación por cada línea existente. Esta regla no afecta a objetos visuales de celda, que siguen usando commands normales. Para cambiar altura o fondo fijo de una línea de TTable usa obligatoriamente tableSetLineHeight o tableSetLineBackground con section y lineIndex; no uses setProperty para esas operaciones. Shapes adicionales de línea: {\\\"command\\\":\\\"tableSetLineBorderColor\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"color\\\":\\\"#0000ff\\\"}, {\\\"command\\\":\\\"tableSetLineBorderWidth\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"width\\\":1}, {\\\"command\\\":\\\"tableSetLinePadding\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"side\\\":\\\"nTop\\\",\\\"value\\\":2}, {\\\"command\\\":\\\"tableSetLineBorderRadius\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"radius\\\":2}, {\\\"command\\\":\\\"tableSetLineBorderSide\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"side\\\":\\\"top\\\",\\\"visible\\\":true}, {\\\"command\\\":\\\"tableSetLineVerticalSeparators\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"visible\\\":true}, {\\\"command\\\":\\\"tableSetLineCondition\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"DETAIL.cantidad > 0\\\"}, {\\\"command\\\":\\\"tableSetLineSuppressCondition\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"DETAIL.importe == 0\\\"}, {\\\"command\\\":\\\"tableSetLineBackgroundColorFormula\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"IF(...)\\\"}, {\\\"command\\\":\\\"tableSetLineBorderColorFormula\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"IF(...)\\\"}. Las cuatro primitivas de fórmula reciben formula como string literal y aceptan string vacío para borrar; no evalúes ni cambies la sintaxis. Usa la primitiva específica según sea condición, supresión o fórmula de color; no uses paths hBorder, hBackground ni setProperty. Si la instrucción menciona una línea, cabecera, detalle o pie, el color de borde de esa línea usa tableSetLineBorderColor y nunca setProperty. Zebra solo existe en líneas detail. Shapes exactas: {\\\"command\\\":\\\"tableSetLineZebraEnabled\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"enabled\\\":true} y {\\\"command\\\":\\\"tableSetLineZebraColor\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"role\\\":\\\"odd\\\",\\\"color\\\":\\\"#d3d3d3\\\"}. Usa enabled booleano para activar o desactivar y role odd/even para filas impares/pares. No uses hZebraPattern ni paths privados. REGLA DE SCOPE OBLIGATORIA: estos, ellos, los seleccionados y pronombres equivalentes -> target:\\\"selection\\\". Todos, todas, todo el documento, todos los objetos o todos los objetos de un tipo -> target:{\\\"ids\\\":[...]} usando todos los cId coincidentes de DOCUMENTO_COMPLETO_SCOPE=global, incluidos objetos anidados en TTable. Si la selección está vacía, una orden global debe usar siempre ids. Para una orden global no uses target:\\\"selection\\\" ni mezcles ambos targets. También se permite create: {\\\"command\\\":\\\"create\\\",\\\"type\\\":\\\"TText\\\",\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\\\\\"texto\\\\\\\\\\\"\\\"}}. En create describe únicamente lo solicitado: incluye solo el tipo, contenido, posición y propiedades que la instrucción pida explícitamente; el diseñador completa los defaults reales. Tipos reales: TText,TRectangle,TEllipse,TImage,TLine,TBarcode,richText,TFormattedText,TTable. Properties solo editables, nunca cId, defaults, estructura interna ni geometría. position usa {\\\"x\\\":20,\\\"y\\\":30}. Para crear una tabla usa {\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"tabla1\\\",\\\"type\\\":\\\"TTable\\\"}; las primitives TTable posteriores pueden usar target:{\\\"ref\\\":\\\"tabla1\\\"}. Una TTable recién creada tiene las secciones vacías. Antes de insertar columnas o modificar una línea, crea esa línea con tableInsertLine. tableInsertLine crea siempre una línea válida con exactamente 1 columna inicial. SEMÁNTICA OBLIGATORIA DEL NÚMERO DE COLUMNAS: \\\"de N columnas\\\", \\\"con N columnas\\\" y \\\"que tenga N columnas\\\" expresan el TOTAL FINAL deseado; genera exactamente N menos las columnas actuales operaciones tableInsertColumn. Después de tableInsertLine ya hay 1 columna: para una línea de 4 columnas genera exactamente 3 tableInsertColumn y el total final es 4, nunca 4 inserciones. \\\"añade N columnas\\\", \\\"agrega N columnas\\\", \\\"inserta N columnas más\\\" y equivalentes explícitos expresan una CANTIDAD ADICIONAL; genera exactamente N tableInsertColumn. La fachada ejecuta literalmente esas inserciones y no corrige ni reinterpreta el número. Ejemplo total final 4: {\\\"commands\\\":[{\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"tabla1\\\",\\\"type\\\":\\\"TTable\\\"},{\\\"command\\\":\\\"tableInsertLine\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":1},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":3}]}. No envíes hSections, aLines ni aCells en create. Para crear contenido real en una celda usa {\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"txt1\\\",\\\"type\\\":\\\"TText\\\",\\\"targetCell\\\":{\\\"table\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"cellIndex\\\":0},\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\"Título\\\\\\\"\\\"}}; table admite \\\"selection\\\", {\\\"ids\\\":[\\\"id_real\\\"]} o {\\\"ref\\\":\\\"tabla1\\\"}. Tipos manuales admitidos en celda: TText,richText,TBarcode,TImage. Si la instrucción enumera contenidos o títulos, crea un objeto por cada literal en la celda correspondiente; no omitas esos contenidos. No uses position ni geometría para contenido de celda. Una ref es temporal dentro de esta respuesta: el create declara ref:\\\"new1\\\" y un comando posterior apunta al mismo objeto con target:{\\\"ref\\\":\\\"new1\\\"}. Ejemplo: {\\\"commands\\\":[{\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"new1\\\",\\\"type\\\":\\\"TText\\\",\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\\\\\"TOTAL\\\\\\\\\\\"\\\"}},{\\\"command\\\":\\\"resize\\\",\\\"target\\\":{\\\"ref\\\":\\\"new1\\\"},\\\"scaleX\\\":2,\\\"scaleY\\\":2}]}. PLANIFICACION INTERNA PARA INSTRUCCIONES COMPLEJAS: antes de devolver Commands, divide mentalmente la peticion en bloques visuales, asigna posiciones y tamanos aproximados, enumera todos los requisitos explicitos, ordena los commands por dependencias y revisa que no falte ningun requisito realizable. No devuelvas ni expliques este plan; la salida sigue siendo solo {\\\"commands\\\":[...]}. En disenos completos organiza conceptualmente cabecera superior, datos principales, bloque central, totales y pie cuando hayan sido pedidos y sean realizables. Cada objeto visual explicitamente solicitado requiere su propio create. Asigna position y, cuando proceda, move o resize a los objetos raiz; evita que sus cajas se solapen salvo peticion expresa. Crear contenido no sustituye sus estilos: incluye los colores, negrita, alineacion, tamano y fondo pedidos usando propiedades o commands ya disponibles. Para un objeto interno nuevo, incluye sus estilos en create.properties o declara ref en create y usa despues target:{\\\"ref\\\":\\\"...\\\"}; targetCell solo existe en create y nunca es target de setProperty. Todo texto fijo visible usa cText como expresion literal canonica entre comillas. Si se pide un formato y ya existe una sintaxis canonica disponible, usala sin inventar funciones. Si existe una referencia real claramente compatible con un dato solicitado, usala en vez de crear ese dato como literal. Si una columna debe ser mas ancha, incluye tableSetColumnWidth explicitamente. En planes largos prefiere: limpieza; contenedores; estructura; objetos internos; propiedades; geometria; estilos finales, salvo que una dependencia exija otro orden. Omite de forma segura solo lo que no pueda realizarse por falta de campos o capacidades. CTEXT CANONICO: texto fijo=\\\"\\\\\\\\\\\"FACTURA\\\\\\\\\\\"\\\"; campo=REFERENCIA_EXACTA; texto+campo=\\\"\\\\\\\\\\\"Factura: \\\\\\\\\\\"+REFERENCIA_EXACTA\\\"; formula=\\\"Transform(REFERENCIA_EXACTA,\\\\\\\\\\\"99/99/9999\\\\\\\\\\\")\\\". Para contenido de celda usa el mismo TText y la misma semantica. Usa exclusivamente referencias exactas de CAMPOS_Y_VARIABLES_DISPONIBLES; no inventes campos. Si la instruccion pide un dato/campo y no existe una referencia compatible, no conviertas su descripcion en texto fijo: omite esa parte o devuelve {\\\"commands\\\":[]}. En TTable, para CADA seccion usada, el orden obligatorio es: tableInsertLine; N-1 tableInsertColumn para obtener N columnas; despues los create.targetCell. El contenido header exige linea header y el contenido detail exige linea detail; antes de cellIndex K deben existir al menos K+1 columnas en esa misma linea. Nunca uses create.targetCell sobre una linea o celda inexistente. Para una celda vacia de una TTable existente seleccionada usa exactamente {\\\"command\\\":\\\"create\\\",\\\"type\\\":\\\"TText\\\",\\\"targetCell\\\":{\\\"table\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"cellIndex\\\":K},\\\"properties\\\":{\\\"cText\\\":\\\"REFERENCIA_EXACTA\\\"}}. Para una TTable existente identificada table puede ser {\\\"ids\\\":[\\\"id_real\\\"]}; nunca uses {\\\"cId\\\":\\\"...\\\"}. Para una tabla creada en ESTA respuesta, todas las estructuras y targetCell.table usan siempre {\\\"ref\\\":\\\"tabla1\\\"}, nunca \\\"selection\\\". Una lista de N nombres de columnas son N titulos fijos TText de header con cText=\\\"\\\\\\\\\\\"TITULO\\\\\\\\\\\"\\\"; si ademas se piden sus campos o campos disponibles, crea header Y detail, cada seccion con su tableInsertLine y exactamente N-1 inserciones, y despues N TText por seccion. Esquema minimo de dos secciones y dos columnas: create TTable ref tabla1; tableInsertLine header; tableInsertColumn header columnIndex 1; tableInsertLine detail; tableInsertColumn detail columnIndex 1; despues create.targetCell header 0 y 1, y detail 0 y 1, todos con table:{\\\"ref\\\":\\\"tabla1\\\"}. Alinear el contenido o texto a izquierda/centro/derecha usa setProperty con property:\\\"cTextAlign\\\" y value:\\\"left\\\"|\\\"center\\\"|\\\"right\\\"; align se reserva para alinear geometricamente varios objetos.\"},{\"role\":\"user\",\"content\":\"SELECCION_ACTUAL_SCOPE=selection:\\n[]\\nDOCUMENTO_COMPLETO_SCOPE=global:\\n[]\\nGLOBAL_COUNTS:\\nGLOBAL_IDS_BY_TYPE:\\nPROPIEDADES COMUNES EDITABLES: cBackgroundColor:string=Dimensiones y Color / Color de fondo,cBorderColor:string=Borde / Color,cCondition:string,cFillColor2:string,cFillColor3:string,cFillStyle:string,cFontFamily:string,cShadowColor:string,cText:string,cTextAlign:string,cTextColor:string=Texto / Color,cTextFitMode:string,cTextVerticalAlign:string,lAllowPageBreak:boolean,lBorderBottom:boolean,lBorderLeft:boolean,lBorderRight:boolean,lBorderTop:boolean,lFontBold:boolean=Texto / Negrita,lFontItalic:boolean=Texto / Cursiva,lFontStrikeout:boolean,lFontUnderline:boolean,lForceWrap:boolean,lKeepEmptyParagraphs:boolean,lLocked:boolean,lTextAdjusted:boolean,lTextWrap:boolean,lTrimSpaces:boolean,lVisible:boolean,nBorderWidth:number,nFillOpacity:number,nFontSize:number=Texto / Tamaño,nLayerId:number,nLineSpacing:number,nOpacity:number=Transformación / Opacidad,nPaddingBottom:number,nPaddingLeft:number,nPaddingRight:number,nPaddingTop:number,nParagraphSpacing:number,nRotation:number,nRounded:number,nShadowSize:number,nShadowTransparency:number,nTextDecimalPosition:number,nTextOpacity:number,nZIndex:number\\nCOLORES CANÓNICOS: rojo:#ff0000 · verde:#008000 · verde oscuro:#006400 · azul:#0000ff · azul oscuro:#00008b · amarillo:#ffff00 · gris claro:#d3d3d3\\nCAMPOS_Y_VARIABLES_DISPONIBLES\\nTIPOS:C=texto,N=numero,D=fecha,I=imagen,M=memo,L=booleano\\n\\nINSTRUCCIÓN:\\nponlo en cursiva\"}],\"stream\":false,\"format\":\"json\",\"keep_alive\":-1,\"options\":{\"temperature\":0,\"top_p\":1,\"top_k\":0,\"repeat_penalty\":1.1,\"frequency_penalty\":0,\"presence_penalty\":0,\"num_ctx\":65536,\"num_batch\":4096,\"num_thread\":10,\"num_gpu\":99,\"num_predict\":4096},\"think\":\"low\"}",
                        "cHttpBody": "{\"model\":\"gpt-oss:20b\",\"created_at\":\"2026-08-12T22:20:40.2981949Z\",\"message\":{\"role\":\"assistant\",\"content\":\"{\\\"commands\\\":[{\\\"command\\\":\\\"setProperty\\\",\\\"target\\\":\\\"selection\\\",\\\"property\\\":\\\"cFontItalic\\\",\\\"value\\\":true}]}\",\"thinking\":\"Need to italicize selection. Use setProperty cFontItalic true. target selection.\"},\"done\":true,\"done_reason\":\"stop\",\"total_duration\":1021681200,\"load_duration\":203176000,\"prompt_eval_count\":3671,\"prompt_eval_duration\":13943000,\"eval_count\":25,\"eval_duration\":309726000}",
                        "hMetrics": {
                            "total_duration": 1021681200,
                            "load_duration": 203176000,
                            "prompt_eval_count": 3671,
                            "prompt_eval_duration": 13943000,
                            "eval_count": 25,
                            "eval_duration": 309726000,
                            "unattributed_duration": 494836200
                        },
                        "hCommands": {
                            "commands": [
                                {
                                    "command": "setProperty",
                                    "target": "selection",
                                    "property": "cFontItalic",
                                    "value": true
                                }
                            ]
                        },
                        "lValid": true,
                        "nCreates": 0,
                        "nChanges": 0,
                        "nDeletes": 0,
                        "nStructures": 0,
                        "nGeneratedIds": 0,
                        "nOperations": 1,
                        "nFinalOperations": 1,
                        "cValidation": "Shape commands válida; validación de ejecución pendiente",
                        "nResponseMilliseconds": 1035.03,
                        "tRequestStartedAt": "2026-08-13T00:20:39.265242+02:00",
                        "tResponseFinishedAt": "2026-08-13T00:20:40.300289+02:00",
                        "hPromptDiagnostics": {
                            "nSystemCharacters": 13534,
                            "nUserCharacters": 1485,
                            "nPromptCharacters": 15020,
                            "nPromptCharactersBeforeFields": 12829,
                            "nFieldsCharacters": 88,
                            "nPromptTokensBeforeEstimated": 3208,
                            "nPromptTokensAfterEstimated": 3755,
                            "nContextTokens": 65536,
                            "lPromptFitsContext": true,
                            "hFields": {
                                "nGroups": 0,
                                "nFields": 0,
                                "nUserVariables": 0,
                                "nAccumulators": 0
                            }
                        }
                    },
                    "commands": [
                        {
                            "command": "setProperty",
                            "target": "selection",
                            "property": "cFontItalic",
                            "value": true
                        }
                    ],
                    "valid": true
                },
                {
                    "id": "P_opacity",
                    "instruction": "pon la opacidad al 50 por ciento",
                    "response": {
                        "cInstruction": "pon la opacidad al 50 por ciento",
                        "cProvider": "Ollama",
                        "cModelSelection": "Ollama — GPT-OSS 20B",
                        "cModel": "gpt-oss:20b",
                        "cRepresentation": "COMMANDS",
                        "cRawResponse": "{\"commands\":[{\"command\":\"setProperty\",\"target\":\"selection\",\"property\":\"nOpacity\",\"value\":0.5}]}",
                        "cThinking": "Need setProperty opacity to 0.5 for selection. Use property nOpacity? Actually opacity property is nOpacity or nOpacity? In list: nOpacity:number=Transformación / Opacidad. So setProperty target selection property:\"nOpacity\" value:0.5.",
                        "cOllamaRequest": "{\"model\":\"gpt-oss:20b\",\"messages\":[{\"role\":\"system\",\"content\":\"Interpreta la instrucción y devuelve únicamente JSON válido con la forma {\\\"commands\\\":[{\\\"command\\\":\\\"setProperty\\\",\\\"target\\\":\\\"selection\\\" o {\\\"ids\\\":[\\\"id_real\\\"]},\\\"property\\\":\\\"propiedad_real\\\",\\\"value\\\":valor}]}. Cada comando DEBE usar la clave command (nunca type) y target. Comandos permitidos: setProperty, move, resize, delete, align, distribute, reorder, duplicate, tableMoveColumn, tableSetColumnWidth, tableInsertColumn, tableDeleteColumn, tableInsertLine, tableDeleteLine, tableMoveLine, tableSetLineHeight, tableSetLineBackground, tableSetLineBorderColor, tableSetLineBorderWidth, tableSetLinePadding, tableSetLineBorderRadius, tableSetLineBorderSide, tableSetLineVerticalSeparators, tableSetLineZebraEnabled, tableSetLineZebraColor, tableSetLineCondition, tableSetLineSuppressCondition, tableSetLineBackgroundColorFormula, tableSetLineBorderColorFormula. Prioridad: propiedad o estilo → setProperty; desplazamiento relativo → move; tamaño relativo → resize; alineación de varios objetos → align; eliminar objetos → delete. Para eliminar usa exactamente {\\\"command\\\":\\\"delete\\\",\\\"target\\\":\\\"selection\\\"}. Si se pide duplicar, reducir o cambiar el tamaño, devuelve únicamente resize y no uses setProperty para propiedades numéricas. Para setProperty usa exactamente property y value, nunca name ni valores como *2. Para move usa {\\\"command\\\":\\\"move\\\",\\\"target\\\":\\\"selection\\\",\\\"dx\\\":10,\\\"dy\\\":0}; para resize usa {\\\"command\\\":\\\"resize\\\",\\\"target\\\":\\\"selection\\\",\\\"scaleX\\\":0.5,\\\"scaleY\\\":0.5}. Para alinear usa exactamente {\\\"command\\\":\\\"align\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"left\\\"}; modos válidos: left|right|top|bottom|horizontalCenter|verticalCenter. Si la orden se refiere a los objetos seleccionados, usa target:\\\"selection\\\". No inventes IDs ni calcules coordenadas o dimensiones finales. Para distribuir usa exactamente {\\\"command\\\":\\\"distribute\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"horizontal\\\"}; modos válidos: horizontal|vertical. Para reordenar usa exactamente {\\\"command\\\":\\\"reorder\\\",\\\"target\\\":\\\"selection\\\",\\\"mode\\\":\\\"bringToFront\\\"}; modos válidos: bringToFront=traer al frente, sendToBack=enviar al fondo, bringForward=subir un nivel, sendBackward=bajar un nivel. Para duplicar usa exactamente {\\\"command\\\":\\\"duplicate\\\",\\\"target\\\":\\\"selection\\\"}. Para tablas usa únicamente estas formas: {\\\"command\\\":\\\"tableMoveColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"fromIndex\\\":2,\\\"toIndex\\\":0}, {\\\"command\\\":\\\"tableSetColumnWidth\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":0,\\\"width\\\":30}, {\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2}, {\\\"command\\\":\\\"tableDeleteColumn\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2}, {\\\"command\\\":\\\"tableInsertLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":1}, {\\\"command\\\":\\\"tableDeleteLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":1}, {\\\"command\\\":\\\"tableMoveLine\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"fromIndex\\\":1,\\\"toIndex\\\":0}, {\\\"command\\\":\\\"tableSetLineHeight\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"height\\\":12}, {\\\"command\\\":\\\"tableSetLineBackground\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"color\\\":\\\"#d3d3d3\\\"}; section: header|groupHeader|detail|groupFooter|footer. Los índices son enteros cero-basados y no negativos. tableSetLineHeight usa altura fija en milímetros >=1. tableSetLineBackground usa únicamente color HEX fijo; no usa fórmulas ni paths privados. Insertar columna usa columnIndex como posición antes de la columna existente; si coincide con el número actual de columnas, añade al final. Insertar línea usa lineIndex como posición antes de la línea existente; si coincide con el número actual de líneas, añade al final. No uses hSections, aLines ni aCells. Semántica de líneas OBLIGATORIA: si una sección tiene una sola línea, basta mencionar la sección y usa lineIndex 0. Si tiene varias líneas, una operación estructural debe indicar la línea; si no la indica y no dice todas, devuelve EXACTAMENTE {\\\"commands\\\":[]}. Solo si dice todas las líneas genera una operación por cada línea existente. Esta regla no afecta a objetos visuales de celda, que siguen usando commands normales. Para cambiar altura o fondo fijo de una línea de TTable usa obligatoriamente tableSetLineHeight o tableSetLineBackground con section y lineIndex; no uses setProperty para esas operaciones. Shapes adicionales de línea: {\\\"command\\\":\\\"tableSetLineBorderColor\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"color\\\":\\\"#0000ff\\\"}, {\\\"command\\\":\\\"tableSetLineBorderWidth\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"width\\\":1}, {\\\"command\\\":\\\"tableSetLinePadding\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"side\\\":\\\"nTop\\\",\\\"value\\\":2}, {\\\"command\\\":\\\"tableSetLineBorderRadius\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"radius\\\":2}, {\\\"command\\\":\\\"tableSetLineBorderSide\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"side\\\":\\\"top\\\",\\\"visible\\\":true}, {\\\"command\\\":\\\"tableSetLineVerticalSeparators\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"visible\\\":true}, {\\\"command\\\":\\\"tableSetLineCondition\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"DETAIL.cantidad > 0\\\"}, {\\\"command\\\":\\\"tableSetLineSuppressCondition\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"DETAIL.importe == 0\\\"}, {\\\"command\\\":\\\"tableSetLineBackgroundColorFormula\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"IF(...)\\\"}, {\\\"command\\\":\\\"tableSetLineBorderColorFormula\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"formula\\\":\\\"IF(...)\\\"}. Las cuatro primitivas de fórmula reciben formula como string literal y aceptan string vacío para borrar; no evalúes ni cambies la sintaxis. Usa la primitiva específica según sea condición, supresión o fórmula de color; no uses paths hBorder, hBackground ni setProperty. Si la instrucción menciona una línea, cabecera, detalle o pie, el color de borde de esa línea usa tableSetLineBorderColor y nunca setProperty. Zebra solo existe en líneas detail. Shapes exactas: {\\\"command\\\":\\\"tableSetLineZebraEnabled\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"enabled\\\":true} y {\\\"command\\\":\\\"tableSetLineZebraColor\\\",\\\"target\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"role\\\":\\\"odd\\\",\\\"color\\\":\\\"#d3d3d3\\\"}. Usa enabled booleano para activar o desactivar y role odd/even para filas impares/pares. No uses hZebraPattern ni paths privados. REGLA DE SCOPE OBLIGATORIA: estos, ellos, los seleccionados y pronombres equivalentes -> target:\\\"selection\\\". Todos, todas, todo el documento, todos los objetos o todos los objetos de un tipo -> target:{\\\"ids\\\":[...]} usando todos los cId coincidentes de DOCUMENTO_COMPLETO_SCOPE=global, incluidos objetos anidados en TTable. Si la selección está vacía, una orden global debe usar siempre ids. Para una orden global no uses target:\\\"selection\\\" ni mezcles ambos targets. También se permite create: {\\\"command\\\":\\\"create\\\",\\\"type\\\":\\\"TText\\\",\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\\\\\"texto\\\\\\\\\\\"\\\"}}. En create describe únicamente lo solicitado: incluye solo el tipo, contenido, posición y propiedades que la instrucción pida explícitamente; el diseñador completa los defaults reales. Tipos reales: TText,TRectangle,TEllipse,TImage,TLine,TBarcode,richText,TFormattedText,TTable. Properties solo editables, nunca cId, defaults, estructura interna ni geometría. position usa {\\\"x\\\":20,\\\"y\\\":30}. Para crear una tabla usa {\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"tabla1\\\",\\\"type\\\":\\\"TTable\\\"}; las primitives TTable posteriores pueden usar target:{\\\"ref\\\":\\\"tabla1\\\"}. Una TTable recién creada tiene las secciones vacías. Antes de insertar columnas o modificar una línea, crea esa línea con tableInsertLine. tableInsertLine crea siempre una línea válida con exactamente 1 columna inicial. SEMÁNTICA OBLIGATORIA DEL NÚMERO DE COLUMNAS: \\\"de N columnas\\\", \\\"con N columnas\\\" y \\\"que tenga N columnas\\\" expresan el TOTAL FINAL deseado; genera exactamente N menos las columnas actuales operaciones tableInsertColumn. Después de tableInsertLine ya hay 1 columna: para una línea de 4 columnas genera exactamente 3 tableInsertColumn y el total final es 4, nunca 4 inserciones. \\\"añade N columnas\\\", \\\"agrega N columnas\\\", \\\"inserta N columnas más\\\" y equivalentes explícitos expresan una CANTIDAD ADICIONAL; genera exactamente N tableInsertColumn. La fachada ejecuta literalmente esas inserciones y no corrige ni reinterpreta el número. Ejemplo total final 4: {\\\"commands\\\":[{\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"tabla1\\\",\\\"type\\\":\\\"TTable\\\"},{\\\"command\\\":\\\"tableInsertLine\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":1},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":2},{\\\"command\\\":\\\"tableInsertColumn\\\",\\\"target\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"columnIndex\\\":3}]}. No envíes hSections, aLines ni aCells en create. Para crear contenido real en una celda usa {\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"txt1\\\",\\\"type\\\":\\\"TText\\\",\\\"targetCell\\\":{\\\"table\\\":{\\\"ref\\\":\\\"tabla1\\\"},\\\"section\\\":\\\"header\\\",\\\"lineIndex\\\":0,\\\"cellIndex\\\":0},\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\"Título\\\\\\\"\\\"}}; table admite \\\"selection\\\", {\\\"ids\\\":[\\\"id_real\\\"]} o {\\\"ref\\\":\\\"tabla1\\\"}. Tipos manuales admitidos en celda: TText,richText,TBarcode,TImage. Si la instrucción enumera contenidos o títulos, crea un objeto por cada literal en la celda correspondiente; no omitas esos contenidos. No uses position ni geometría para contenido de celda. Una ref es temporal dentro de esta respuesta: el create declara ref:\\\"new1\\\" y un comando posterior apunta al mismo objeto con target:{\\\"ref\\\":\\\"new1\\\"}. Ejemplo: {\\\"commands\\\":[{\\\"command\\\":\\\"create\\\",\\\"ref\\\":\\\"new1\\\",\\\"type\\\":\\\"TText\\\",\\\"properties\\\":{\\\"cText\\\":\\\"\\\\\\\\\\\"TOTAL\\\\\\\\\\\"\\\"}},{\\\"command\\\":\\\"resize\\\",\\\"target\\\":{\\\"ref\\\":\\\"new1\\\"},\\\"scaleX\\\":2,\\\"scaleY\\\":2}]}. PLANIFICACION INTERNA PARA INSTRUCCIONES COMPLEJAS: antes de devolver Commands, divide mentalmente la peticion en bloques visuales, asigna posiciones y tamanos aproximados, enumera todos los requisitos explicitos, ordena los commands por dependencias y revisa que no falte ningun requisito realizable. No devuelvas ni expliques este plan; la salida sigue siendo solo {\\\"commands\\\":[...]}. En disenos completos organiza conceptualmente cabecera superior, datos principales, bloque central, totales y pie cuando hayan sido pedidos y sean realizables. Cada objeto visual explicitamente solicitado requiere su propio create. Asigna position y, cuando proceda, move o resize a los objetos raiz; evita que sus cajas se solapen salvo peticion expresa. Crear contenido no sustituye sus estilos: incluye los colores, negrita, alineacion, tamano y fondo pedidos usando propiedades o commands ya disponibles. Para un objeto interno nuevo, incluye sus estilos en create.properties o declara ref en create y usa despues target:{\\\"ref\\\":\\\"...\\\"}; targetCell solo existe en create y nunca es target de setProperty. Todo texto fijo visible usa cText como expresion literal canonica entre comillas. Si se pide un formato y ya existe una sintaxis canonica disponible, usala sin inventar funciones. Si existe una referencia real claramente compatible con un dato solicitado, usala en vez de crear ese dato como literal. Si una columna debe ser mas ancha, incluye tableSetColumnWidth explicitamente. En planes largos prefiere: limpieza; contenedores; estructura; objetos internos; propiedades; geometria; estilos finales, salvo que una dependencia exija otro orden. Omite de forma segura solo lo que no pueda realizarse por falta de campos o capacidades. CTEXT CANONICO: texto fijo=\\\"\\\\\\\\\\\"FACTURA\\\\\\\\\\\"\\\"; campo=REFERENCIA_EXACTA; texto+campo=\\\"\\\\\\\\\\\"Factura: \\\\\\\\\\\"+REFERENCIA_EXACTA\\\"; formula=\\\"Transform(REFERENCIA_EXACTA,\\\\\\\\\\\"99/99/9999\\\\\\\\\\\")\\\". Para contenido de celda usa el mismo TText y la misma semantica. Usa exclusivamente referencias exactas de CAMPOS_Y_VARIABLES_DISPONIBLES; no inventes campos. Si la instruccion pide un dato/campo y no existe una referencia compatible, no conviertas su descripcion en texto fijo: omite esa parte o devuelve {\\\"commands\\\":[]}. En TTable, para CADA seccion usada, el orden obligatorio es: tableInsertLine; N-1 tableInsertColumn para obtener N columnas; despues los create.targetCell. El contenido header exige linea header y el contenido detail exige linea detail; antes de cellIndex K deben existir al menos K+1 columnas en esa misma linea. Nunca uses create.targetCell sobre una linea o celda inexistente. Para una celda vacia de una TTable existente seleccionada usa exactamente {\\\"command\\\":\\\"create\\\",\\\"type\\\":\\\"TText\\\",\\\"targetCell\\\":{\\\"table\\\":\\\"selection\\\",\\\"section\\\":\\\"detail\\\",\\\"lineIndex\\\":0,\\\"cellIndex\\\":K},\\\"properties\\\":{\\\"cText\\\":\\\"REFERENCIA_EXACTA\\\"}}. Para una TTable existente identificada table puede ser {\\\"ids\\\":[\\\"id_real\\\"]}; nunca uses {\\\"cId\\\":\\\"...\\\"}. Para una tabla creada en ESTA respuesta, todas las estructuras y targetCell.table usan siempre {\\\"ref\\\":\\\"tabla1\\\"}, nunca \\\"selection\\\". Una lista de N nombres de columnas son N titulos fijos TText de header con cText=\\\"\\\\\\\\\\\"TITULO\\\\\\\\\\\"\\\"; si ademas se piden sus campos o campos disponibles, crea header Y detail, cada seccion con su tableInsertLine y exactamente N-1 inserciones, y despues N TText por seccion. Esquema minimo de dos secciones y dos columnas: create TTable ref tabla1; tableInsertLine header; tableInsertColumn header columnIndex 1; tableInsertLine detail; tableInsertColumn detail columnIndex 1; despues create.targetCell header 0 y 1, y detail 0 y 1, todos con table:{\\\"ref\\\":\\\"tabla1\\\"}. Alinear el contenido o texto a izquierda/centro/derecha usa setProperty con property:\\\"cTextAlign\\\" y value:\\\"left\\\"|\\\"center\\\"|\\\"right\\\"; align se reserva para alinear geometricamente varios objetos.\"},{\"role\":\"user\",\"content\":\"SELECCION_ACTUAL_SCOPE=selection:\\n[]\\nDOCUMENTO_COMPLETO_SCOPE=global:\\n[]\\nGLOBAL_COUNTS:\\nGLOBAL_IDS_BY_TYPE:\\nPROPIEDADES COMUNES EDITABLES: cBackgroundColor:string=Dimensiones y Color / Color de fondo,cBorderColor:string=Borde / Color,cCondition:string,cFillColor2:string,cFillColor3:string,cFillStyle:string,cFontFamily:string,cShadowColor:string,cText:string,cTextAlign:string,cTextColor:string=Texto / Color,cTextFitMode:string,cTextVerticalAlign:string,lAllowPageBreak:boolean,lBorderBottom:boolean,lBorderLeft:boolean,lBorderRight:boolean,lBorderTop:boolean,lFontBold:boolean=Texto / Negrita,lFontItalic:boolean=Texto / Cursiva,lFontStrikeout:boolean,lFontUnderline:boolean,lForceWrap:boolean,lKeepEmptyParagraphs:boolean,lLocked:boolean,lTextAdjusted:boolean,lTextWrap:boolean,lTrimSpaces:boolean,lVisible:boolean,nBorderWidth:number,nFillOpacity:number,nFontSize:number=Texto / Tamaño,nLayerId:number,nLineSpacing:number,nOpacity:number=Transformación / Opacidad,nPaddingBottom:number,nPaddingLeft:number,nPaddingRight:number,nPaddingTop:number,nParagraphSpacing:number,nRotation:number,nRounded:number,nShadowSize:number,nShadowTransparency:number,nTextDecimalPosition:number,nTextOpacity:number,nZIndex:number\\nCOLORES CANÓNICOS: rojo:#ff0000 · verde:#008000 · verde oscuro:#006400 · azul:#0000ff · azul oscuro:#00008b · amarillo:#ffff00 · gris claro:#d3d3d3\\nCAMPOS_Y_VARIABLES_DISPONIBLES\\nTIPOS:C=texto,N=numero,D=fecha,I=imagen,M=memo,L=booleano\\n\\nINSTRUCCIÓN:\\npon la opacidad al 50 por ciento\"}],\"stream\":false,\"format\":\"json\",\"keep_alive\":-1,\"options\":{\"temperature\":0,\"top_p\":1,\"top_k\":0,\"repeat_penalty\":1.1,\"frequency_penalty\":0,\"presence_penalty\":0,\"num_ctx\":65536,\"num_batch\":4096,\"num_thread\":10,\"num_gpu\":99,\"num_predict\":4096},\"think\":\"low\"}",
                        "cHttpBody": "{\"model\":\"gpt-oss:20b\",\"created_at\":\"2026-08-12T22:20:41.8369596Z\",\"message\":{\"role\":\"assistant\",\"content\":\"{\\\"commands\\\":[{\\\"command\\\":\\\"setProperty\\\",\\\"target\\\":\\\"selection\\\",\\\"property\\\":\\\"nOpacity\\\",\\\"value\\\":0.5}]}\",\"thinking\":\"Need setProperty opacity to 0.5 for selection. Use property nOpacity? Actually opacity property is nOpacity or nOpacity? In list: nOpacity:number=Transformación / Opacidad. So setProperty target selection property:\\\"nOpacity\\\" value:0.5.\"},\"done\":true,\"done_reason\":\"stop\",\"total_duration\":1534791800,\"load_duration\":204622800,\"prompt_eval_count\":3714,\"prompt_eval_duration\":13869000,\"eval_count\":26,\"eval_duration\":322174000}",
                        "hMetrics": {
                            "total_duration": 1534791800,
                            "load_duration": 204622800,
                            "prompt_eval_count": 3714,
                            "prompt_eval_duration": 13869000,
                            "eval_count": 26,
                            "eval_duration": 322174000,
                            "unattributed_duration": 994126000
                        },
                        "hCommands": {
                            "commands": [
                                {
                                    "command": "setProperty",
                                    "target": "selection",
                                    "property": "nOpacity",
                                    "value": 0.5
                                }
                            ]
                        },
                        "lValid": true,
                        "nCreates": 0,
                        "nChanges": 0,
                        "nDeletes": 0,
                        "nStructures": 0,
                        "nGeneratedIds": 0,
                        "nOperations": 1,
                        "nFinalOperations": 1,
                        "cValidation": "Shape commands válida; validación de ejecución pendiente",
                        "nResponseMilliseconds": 1538.283,
                        "tRequestStartedAt": "2026-08-13T00:20:40.300866+02:00",
                        "tResponseFinishedAt": "2026-08-13T00:20:41.839174+02:00",
                        "hPromptDiagnostics": {
                            "nSystemCharacters": 13534,
                            "nUserCharacters": 1501,
                            "nPromptCharacters": 15036,
                            "nPromptCharactersBeforeFields": 12845,
                            "nFieldsCharacters": 88,
                            "nPromptTokensBeforeEstimated": 3212,
                            "nPromptTokensAfterEstimated": 3759,
                            "nContextTokens": 65536,
                            "lPromptFitsContext": true,
                            "hFields": {
                                "nGroups": 0,
                                "nFields": 0,
                                "nUserVariables": 0,
                                "nAccumulators": 0
                            }
                        }
                    },
                    "commands": [
                        {
                            "command": "setProperty",
                            "target": "selection",
                            "property": "nOpacity",
                            "value": 0.5
                        }
                    ],
                    "valid": true
                }
            ]
        },
        {
            "modelKey": "opencode-big-pickle",
            "available": true,
            "cases": [
                {
                    "id": "A_move_one",
                    "instruction": "muévelo 10 mm a la derecha",
                    "error": "API key no configurada para OpenCode Zen.",
                    "valid": false
                },
                {
                    "id": "B_move_many",
                    "instruction": "muévelos 5 mm abajo",
                    "error": "API key no configurada para OpenCode Zen.",
                    "valid": false
                },
                {
                    "id": "C_half",
                    "instruction": "hazlo a la mitad",
                    "error": "API key no configurada para OpenCode Zen.",
                    "valid": false
                },
                {
                    "id": "D_double",
                    "instruction": "haz los seleccionados el doble",
                    "error": "API key no configurada para OpenCode Zen.",
                    "valid": false
                },
                {
                    "id": "E_red",
                    "instruction": "pon los seleccionados en rojo",
                    "error": "API key no configurada para OpenCode Zen.",
                    "valid": false
                },
                {
                    "id": "F_bold",
                    "instruction": "ponlo en negrita",
                    "error": "API key no configurada para OpenCode Zen.",
                    "valid": false
                },
                {
                    "id": "G_combined",
                    "instruction": "muévelos 10 mm a la derecha y hazlos a la mitad",
                    "error": "API key no configurada para OpenCode Zen.",
                    "valid": false
                },
                {
                    "id": "H_text_rectangle",
                    "instruction": "hazlos el doble",
                    "error": "API key no configurada para OpenCode Zen.",
                    "valid": false
                },
                {
                    "id": "I_table_resize",
                    "instruction": "hazla a la mitad",
                    "error": "API key no configurada para OpenCode Zen.",
                    "valid": false
                },
                {
                    "id": "J_table_move",
                    "instruction": "muévela 20 mm a la derecha",
                    "error": "API key no configurada para OpenCode Zen.",
                    "valid": false
                },
                {
                    "id": "K_text_color",
                    "instruction": "cambia el color del texto a rojo",
                    "error": "API key no configurada para OpenCode Zen.",
                    "valid": false
                },
                {
                    "id": "L_background_color",
                    "instruction": "cambia el color de fondo a rojo",
                    "error": "API key no configurada para OpenCode Zen.",
                    "valid": false
                },
                {
                    "id": "M_border_color",
                    "instruction": "cambia el color del borde a rojo",
                    "error": "API key no configurada para OpenCode Zen.",
                    "valid": false
                },
                {
                    "id": "N_font_size",
                    "instruction": "pon el tamaño de fuente a 18",
                    "error": "API key no configurada para OpenCode Zen.",
                    "valid": false
                },
                {
                    "id": "O_italic",
                    "instruction": "ponlo en cursiva",
                    "error": "API key no configurada para OpenCode Zen.",
                    "valid": false
                },
                {
                    "id": "P_opacity",
                    "instruction": "pon la opacidad al 50 por ciento",
                    "error": "API key no configurada para OpenCode Zen.",
                    "valid": false
                }
            ]
        }
    ]
}