chocolatito-code 1.6.3 → 1.6.5

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
  }
@@ -1,18 +1,20 @@
1
1
  /**
2
- * Fija SOLO SI SE PIDE, otra vez.
2
+ * Fija POR DEFECTO, esta vez con pruebas que lo respaldan.
3
3
  *
4
- * Estuvo por defecto media hora y la sesion salia en negro: "esta fallando, no
5
- * sale nada, se bugea". Lo puse de serie sin haberlo podido abrir en un terminal
6
- * de verdad -aqui no hay TTY- y se publico roto para los clientes.
4
+ * La primera vez que se puso de serie la sesion salia en negro, y las 820
5
+ * pruebas pasaban: comprobaban el ARBOL que Ink quiere pintar, no lo que una
6
+ * consola hace con esos bytes. El terminal de mentira de la libreria no
7
+ * desplaza al pasarse de alto, que era justo el fallo.
7
8
  *
8
- * La leccion no es "la pantalla fija es mala": es que un cambio que se lleva por
9
- * delante TODO el dibujado no puede entrar por defecto verificado solo con
10
- * pruebas. Las pruebas dicen que el arbol pinta lo que debe; no dicen que la
11
- * consola de verdad se comporte como el emulador de la libreria.
9
+ * Ahora hay un emulador de verdad (tests/terminal.test.mjs): se le da a Ink un
10
+ * stdout con tamaño, se capturan sus bytes y se pasan por un interprete que
11
+ * desplaza como lo haria la consola. Con el arreglo puesto, cien repintados no
12
+ * desplazan ni una fila en cinco tamaños de ventana distintos; devolviendo el
13
+ * fallo, tres de esas pruebas se caen. Eso es lo que faltaba la vez anterior.
12
14
  *
13
- * Vuelve a estar detras de CHOCOLATITO_PANTALLA=fija hasta que este vista
14
- * funcionando en una consola. El comportamiento normal es el que llevaba
15
- * funcionando toda la semana.
15
+ * CHOCOLATITO_PANTALLA=normal devuelve el comportamiento de siempre: el
16
+ * historial vuelve a ser del terminal y la rueda del raton a servir, a cambio de
17
+ * que la barra suba con el scroll.
16
18
  */
17
19
  export declare function pantallaFijaPedida(): boolean;
18
20
  /**
@@ -21,34 +21,37 @@ import { habilitarPie } from "./pieFijo.js";
21
21
  * avisos— siguen imprimiendo directo, y en la pantalla alternativa eso escribe
22
22
  * encima de lo que Ink acaba de dibujar y descuadra el árbol entero.
23
23
  *
24
- * ES UN MODO, NO EL COMPORTAMIENTO NORMAL
24
+ * EL INTERCAMBIO
25
25
  *
26
- * Cambiar el historial del terminal por uno propio es un intercambio de verdad,
27
- * no una mejora: quien use mucho la rueda del ratón para releer sale perdiendo.
28
- * Se activa con CHOCOLATITO_PANTALLA=fija.
26
+ * Cambiar el historial del terminal por uno propio no es gratis: quien use la
27
+ * rueda del ratón para releer sale perdiendo, y a cambio se recorre con Re Pág
28
+ * y Av Pág. Se pidió así cinco veces, así que va de serie;
29
+ * CHOCOLATITO_PANTALLA=normal devuelve lo de antes.
29
30
  */
30
31
  const ENTRAR = "\x1b[?1049h";
31
32
  const SALIR = "\x1b[?1049l";
32
33
  let dentro = false;
33
34
  let logOriginal = null;
34
35
  /**
35
- * Fija SOLO SI SE PIDE, otra vez.
36
+ * Fija POR DEFECTO, esta vez con pruebas que lo respaldan.
36
37
  *
37
- * Estuvo por defecto media hora y la sesion salia en negro: "esta fallando, no
38
- * sale nada, se bugea". Lo puse de serie sin haberlo podido abrir en un terminal
39
- * de verdad -aqui no hay TTY- y se publico roto para los clientes.
38
+ * La primera vez que se puso de serie la sesion salia en negro, y las 820
39
+ * pruebas pasaban: comprobaban el ARBOL que Ink quiere pintar, no lo que una
40
+ * consola hace con esos bytes. El terminal de mentira de la libreria no
41
+ * desplaza al pasarse de alto, que era justo el fallo.
40
42
  *
41
- * La leccion no es "la pantalla fija es mala": es que un cambio que se lleva por
42
- * delante TODO el dibujado no puede entrar por defecto verificado solo con
43
- * pruebas. Las pruebas dicen que el arbol pinta lo que debe; no dicen que la
44
- * consola de verdad se comporte como el emulador de la libreria.
43
+ * Ahora hay un emulador de verdad (tests/terminal.test.mjs): se le da a Ink un
44
+ * stdout con tamaño, se capturan sus bytes y se pasan por un interprete que
45
+ * desplaza como lo haria la consola. Con el arreglo puesto, cien repintados no
46
+ * desplazan ni una fila en cinco tamaños de ventana distintos; devolviendo el
47
+ * fallo, tres de esas pruebas se caen. Eso es lo que faltaba la vez anterior.
45
48
  *
46
- * Vuelve a estar detras de CHOCOLATITO_PANTALLA=fija hasta que este vista
47
- * funcionando en una consola. El comportamiento normal es el que llevaba
48
- * funcionando toda la semana.
49
+ * CHOCOLATITO_PANTALLA=normal devuelve el comportamiento de siempre: el
50
+ * historial vuelve a ser del terminal y la rueda del raton a servir, a cambio de
51
+ * que la barra suba con el scroll.
49
52
  */
50
53
  export function pantallaFijaPedida() {
51
- return process.env.CHOCOLATITO_PANTALLA === "fija";
54
+ return process.env.CHOCOLATITO_PANTALLA !== "normal";
52
55
  }
53
56
  /** `null` = manda el estado real. Las pruebas lo fuerzan. */
54
57
  let forzado = null;
@@ -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.5",
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.5",
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": {