chocolatito-code 1.6.2 → 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/index.js CHANGED
@@ -344,7 +344,10 @@ ${nodeViejo}
344
344
  // Interactive REPL Mode with lively startup walking animation
345
345
  await animateStartupBanner(context.cwd, currentModel);
346
346
  // El atajo hay que anunciarlo: un modo que nadie sabe que existe no sirve.
347
- console.log(chalk.gray(" shift+tab cambia el modo de permisos · puedes escribir mientras trabaja y se encola\n"));
347
+ console.log(
348
+ // Dos saltos: uno separa del zorro y otro de la caja. Con uno solo, el
349
+ // arranque entero se lee como un bloque pegado.
350
+ chalk.gray(" shift+tab cambia el modo de permisos · puedes escribir mientras trabaja y se encola\n\n"));
348
351
  if (getMode() !== "default")
349
352
  console.log(` ${modeAnnouncement()}\n`);
350
353
  // Lo que el usuario escribio mientras el agente trabajaba entra como siguiente
package/dist/ui/banner.js CHANGED
@@ -112,7 +112,11 @@ export function buildBannerContent(cwd, model, isBlinking = false) {
112
112
  const left = mascotLines[i] || " ";
113
113
  combinedRows.push(`${left}${rightLines[i]}`);
114
114
  }
115
- return ["", ...combinedRows, ""].join("\n");
115
+ // Dos filas en blanco al final, no una: el zorro y la caja de escribir se
116
+ // quedaban pegados y el arranque se veía apretado. Van DENTRO del contenido a
117
+ // propósito, para que `filasParaAnclar` las cuente sola y el anclaje siga
118
+ // cuadrando sin tener que acordarse de sumarlas aparte.
119
+ return ["", ...combinedRows, "", ""].join("\n");
116
120
  }
117
121
  /**
118
122
  * Ventana por debajo de esto y no se ancla nada: no sobra sitio y el hueco solo
@@ -123,8 +127,9 @@ export const FILAS_MINIMAS_PARA_ANCLAR = 16;
123
127
  * Filas que se imprimen DESPUES del banner y hay que dejarles sitio.
124
128
  *
125
129
  * Son el aviso del atajo (su texto ya trae un salto dentro, mas el que anade
126
- * console.log: 2 filas) y el marco del prompt, que son cinco: una de aire y
127
- * despues barra, entrada, barra y estado.
130
+ * console.log: 3 filas ahora, que lleva un salto de mas para separar del zorro)
131
+ * y el marco del prompt, que son cinco: una de aire y despues barra, entrada,
132
+ * barra y estado.
128
133
  *
129
134
  * AQUI ESTABA EL FALLO DEL ZORRO CORTADO
130
135
  *
@@ -133,7 +138,7 @@ export const FILAS_MINIMAS_PARA_ANCLAR = 16;
133
138
  * arriba la cabeza del zorro. El usuario lo vio en cuanto abrio: "hay mucho
134
139
  * espacio y se baja y se corta el zorrito al iniciar".
135
140
  */
136
- const FILAS_DESPUES_DEL_BANNER = 7;
141
+ const FILAS_DESPUES_DEL_BANNER = 9;
137
142
  /**
138
143
  * Filas en blanco que hay que soltar ANTES de `contenido` para que el prompt
139
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.2",
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.2",
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": {