chocolatito-code 1.6.3 → 1.6.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/ui/banner.js CHANGED
@@ -138,7 +138,7 @@ export const FILAS_MINIMAS_PARA_ANCLAR = 16;
138
138
  * arriba la cabeza del zorro. El usuario lo vio en cuanto abrio: "hay mucho
139
139
  * espacio y se baja y se corta el zorrito al iniciar".
140
140
  */
141
- const FILAS_DESPUES_DEL_BANNER = 8;
141
+ const FILAS_DESPUES_DEL_BANNER = 9;
142
142
  /**
143
143
  * Filas en blanco que hay que soltar ANTES de `contenido` para que el prompt
144
144
  * acabe pegado al fondo de la ventana. Cero si no cabe o no hace falta.
@@ -30,7 +30,17 @@ import { alCambiarElTurno, estadoDelTurno } from "./control.js";
30
30
  */
31
31
  export function App() {
32
32
  const { stdout } = useStdout();
33
- const filas = Math.max(6, stdout?.rows || 24);
33
+ // UNA FILA MENOS QUE LA VENTANA, Y ES LA CLAVE
34
+ //
35
+ // Ink escribe su arbol y detras un salto de linea. Si el arbol mide justo lo
36
+ // que la ventana, ese salto la desborda: el terminal desplaza una fila, y como
37
+ // Ink repinta subiendo el numero de filas que escribio, a partir de ahi borra
38
+ // una fila que ya no es la suya. En la pantalla alternativa, que no tiene
39
+ // historial al que recurrir, eso degenera en pantalla en negro.
40
+ //
41
+ // Es lo que se publico roto en la 1.6.0: "esta fallando, no sale nada". Las
42
+ // pruebas no lo cazan porque el terminal de mentira de la libreria no desplaza.
43
+ const filas = Math.max(6, (stdout?.rows || 24) - 1);
34
44
  const [, setRedibujar] = useState(0);
35
45
  const [subido, setSubido] = useState(0);
36
46
  const [turno, setTurno] = useState(estadoDelTurno());
@@ -55,5 +65,15 @@ export function App() {
55
65
  const altoDelTexto = Math.max(1, filas - altoBarra - altoAviso - (turno.esperando ? 5 : 0));
56
66
  const visible = ventana(altoDelTexto, subido);
57
67
  const huecos = Math.max(0, altoDelTexto - visible.length);
58
- return (_jsxs(Box, { flexDirection: "column", height: filas, children: [Array.from({ length: huecos }, (_, i) => (_jsx(Text, { children: " " }, `hueco-${i}`))), visible.map((linea, i) => (_jsx(Text, { children: linea }, `h-${i}`))), subido > 0 && (_jsx(Text, { dimColor: true, children: ` ↑ ${subido} lineas mas arriba · Av Pag para volver al final` })), turno.esperando ? (_jsx(Prompt, { alEnviar: turno.responder, alCancelar: () => turno.responder("/exit"), cwd: turno.cwd, promptSymbol: turno.promptSymbol, avisos: [], sinHistorial: true, alDesplazar: (cuanto) => setSubido((n) => Math.max(0, Math.min(tope(altoDelTexto), n + cuanto))) })) : (barraDeTrabajo.map((linea, i) => _jsx(Text, { children: linea }, `t-${i}`)))] }));
68
+ return (_jsxs(Box, { flexDirection: "column", height: filas, children: [Array.from({ length: huecos }, (_, i) => (_jsx(Text, { children: " " }, `hueco-${i}`))), visible.map((linea, i) => (_jsx(Text, { children: linea }, `h-${i}`))), subido > 0 && (_jsx(Text, { dimColor: true, children: ` ↑ ${subido} lineas mas arriba · Av Pag para volver al final` })), turno.esperando ? (_jsx(Prompt, { alEnviar: turno.responder, alCancelar: () => turno.responder("/exit"), cwd: turno.cwd, promptSymbol: turno.promptSymbol, avisos: [], sinHistorial: true, alDesplazar: (direccion) => setSubido((n) => {
69
+ // El salto sale del alto SIN el aviso de "estas mirando atras".
70
+ // Si se contara, subir y bajar usarian bases distintas -el aviso
71
+ // solo existe cuando ya has subido- y bajar no deshacia lo que
72
+ // acababas de subir: el scroll derivaba solo.
73
+ const base = Math.max(1, filas - altoBarra - 5);
74
+ const salto = Math.max(1, Math.floor(base / 2));
75
+ return direccion > 0
76
+ ? Math.min(tope(base), n + salto)
77
+ : Math.max(0, n - salto);
78
+ }) })) : (barraDeTrabajo.map((linea, i) => _jsx(Text, { children: linea }, `t-${i}`)))] }));
59
79
  }
@@ -44,7 +44,7 @@ export interface PromptProps {
44
44
  * Sin esto se pintaria dos veces: una desde App y otra desde aqui.
45
45
  */
46
46
  sinHistorial?: boolean;
47
- /** Re Pag / Av Pag cuando quien manda el scroll es el arbol de arriba. */
48
- alDesplazar?: (cuanto: number) => void;
47
+ /** Re Pag / Av Pag: +1 sube, -1 baja. El salto lo decide quien recibe. */
48
+ alDesplazar?: (direccion: number) => void;
49
49
  }
50
50
  export declare function Prompt({ alEnviar, alCancelar, cwd, promptSymbol, avisos, sinHistorial, alDesplazar, }: PromptProps): React.ReactElement;
@@ -63,7 +63,12 @@ export function Prompt({ alEnviar, alCancelar, cwd, promptSymbol, avisos, sinHis
63
63
  // atras. Sin descontarla, el arbol mide una fila mas que la ventana y el
64
64
  // terminal desplaza: la barra dejaria de estar clavada justo al usar el scroll,
65
65
  // que es para lo que existe este modo.
66
- const altoDelTexto = Math.max(1, rows - marco.lines.length - (subido > 0 ? 1 : 0));
66
+ // El alto SIN el aviso de "estas mirando atras". El salto se calcula sobre
67
+ // esto y no sobre el alto real: el aviso solo existe cuando ya has subido, asi
68
+ // que contarlo hacia que bajar no deshiciera lo que acababas de subir y el
69
+ // scroll derivara solo.
70
+ const baseDelSalto = Math.max(1, rows - marco.lines.length);
71
+ const altoDelTexto = Math.max(1, baseDelSalto - (subido > 0 ? 1 : 0));
67
72
  function enviar() {
68
73
  const orden = texto.trim();
69
74
  if (!orden)
@@ -77,15 +82,18 @@ export function Prompt({ alEnviar, alCancelar, cwd, promptSymbol, avisos, sinHis
77
82
  // Solo Re Pag y Av Pag. Las flechas y los caracteres son para escribir:
78
83
  // robarselos aqui dejaria al usuario sin poder teclear.
79
84
  if (tecla.pageUp || tecla.pageDown) {
80
- const salto = Math.max(1, Math.floor(altoDelTexto / 2));
81
- // Con el arbol de App al mando, el scroll lo lleva el: aqui no se sabe
82
- // cuanto sitio hay arriba, porque el prompt es solo la parte de abajo.
85
+ const salto = Math.max(1, Math.floor(baseDelSalto / 2));
86
+ // Con el arbol de App al mando se le manda la DIRECCION, no el salto:
87
+ // aqui no se sabe cuanto sitio hay arriba, y calcular el salto en los dos
88
+ // sitios con alturas distintas hacia que bajar no deshiciera lo que
89
+ // acababa de subir. Con la direccion, el salto sale de un solo sitio y las
90
+ // dos teclas son simetricas.
83
91
  if (alDesplazar) {
84
- alDesplazar(tecla.pageUp ? salto : -salto);
92
+ alDesplazar(tecla.pageUp ? 1 : -1);
85
93
  return;
86
94
  }
87
95
  if (fija) {
88
- setSubido((n) => tecla.pageUp ? Math.min(tope(altoDelTexto), n + salto) : Math.max(0, n - salto));
96
+ setSubido((n) => tecla.pageUp ? Math.min(tope(baseDelSalto), n + salto) : Math.max(0, n - salto));
89
97
  return;
90
98
  }
91
99
  }
package/dist/ui/marco.js CHANGED
@@ -94,7 +94,7 @@ export function buildPromptFrame(opts) {
94
94
  // El 1 de delante es la fila de aire; despues barra, entrada, barra y pie.
95
95
  // Sin contarla, el desplegable pide una fila mas de las que caben y el marco
96
96
  // se sale por arriba de la ventana.
97
- const room = Math.max(1, viewportRows - 1 - (1 + 1 + inputRows + 1 + 1));
97
+ const room = Math.max(1, viewportRows - 1 - (2 + 1 + inputRows + 1 + 1));
98
98
  const shown = Math.min(items.length, room);
99
99
  const dropdownOffset = shown > 0 && items.length > shown
100
100
  ? Math.min(Math.max(0, selectedIndex - Math.floor(shown / 2)), items.length - shown)
@@ -187,16 +187,17 @@ export function buildPromptFrame(opts) {
187
187
  else {
188
188
  footerLine = chalk.hex(modeLook.color)(truncatePlain(modePlain, util));
189
189
  }
190
- // UNA FILA DE AIRE ENCIMA DE LA CAJA
190
+ // DOS FILAS DE AIRE ENCIMA DE LA CAJA
191
191
  //
192
192
  // Al anclar el prompt al fondo, el marco quedo pegado a lo de arriba: la
193
193
  // ultima linea de la respuesta y la barra superior de la caja, seguidas. Se
194
194
  // lee apelotonado y cuesta ver donde acaba una cosa y empieza la otra. El
195
195
  // usuario lo pidio asi: "ponle un poquito de espacio pero no tanto".
196
196
  //
197
- // Una fila, no dos: dos ya son un hueco, y en una ventana corta cada fila que
198
- // se gasta en aire es una que no se ve de conversacion.
199
- const lines = ["", bar, inputLine, ...dropdownLines, bar, footerLine];
197
+ // Dos, no una. Con una, la caja seguia leyendose pegada a lo de arriba: "pusiste
198
+ // una linea de espacio, que sea bien pues". Con dos se separa de verdad, y es
199
+ // el mismo aire que hay al arrancar entre el zorro y el aviso.
200
+ const lines = ["", "", bar, inputLine, ...dropdownLines, bar, footerLine];
200
201
  // 4. Donde queda el cursor, en filas fisicas. Antes se hacia cursorCol =
201
202
  // total % cols: aplicaba el modulo pero nunca sumaba la fila, asi que en
202
203
  // cuanto la entrada se partia el acento se iba a escribir a otra linea.
@@ -204,7 +205,7 @@ export function buildPromptFrame(opts) {
204
205
  const segments = typed.split("\n");
205
206
  // La fila de aire de arriba cuenta: sin sumarla, el cursor se dibuja una fila
206
207
  // por encima de donde se escribe.
207
- let cursorRow = 1 + physicalRows(bar, cols);
208
+ let cursorRow = 2 + physicalRows(bar, cols);
208
209
  for (let i = 0; i < segments.length - 1; i++) {
209
210
  cursorRow += Math.max(1, Math.ceil(((i === 0 ? symbolWidth : 0) + segments[i].length) / cols));
210
211
  }
@@ -2,7 +2,7 @@
2
2
  "manifest_version": 3,
3
3
  "minimum_chrome_version": "102",
4
4
  "name": "Chocolatito Code",
5
- "version": "1.6.3",
5
+ "version": "1.6.4",
6
6
  "description": "Deja que Chocolatito Code trabaje dentro de tu Chrome, en segundo plano y con tus sesiones ya iniciadas.",
7
7
  "permissions": [
8
8
  "tabs",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "chocolatito-code",
3
- "version": "1.6.3",
3
+ "version": "1.6.4",
4
4
  "description": "Agente autónomo de programación para la terminal, con control real del ordenador y del navegador. Desarrollado por Chocolatito.",
5
5
  "type": "module",
6
6
  "bin": {