chocolatito-code 1.6.6 → 1.6.7

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.
@@ -1,92 +0,0 @@
1
- /**
2
- * LO QUE HA SALIDO POR PANTALLA, GUARDADO EN MEMORIA
3
- *
4
- * POR QUE HACE FALTA
5
- *
6
- * En la pantalla normal el historial lo lleva el terminal: sale una línea, se va
7
- * hacia arriba, y la rueda del ratón la recupera. Por eso la barra de abajo sube
8
- * con el scroll: es una línea más del historial, no una capa encima.
9
- *
10
- * En la pantalla alternativa —la que usan vim o htop— el terminal NO guarda
11
- * nada. A cambio, la barra se queda clavada de verdad. Pero si nadie recuerda lo
12
- * que salió, la conversación desaparece en cuanto pasa de una pantalla, que sería
13
- * mucho peor que el problema que se quiere resolver.
14
- *
15
- * Así que aquí se guarda. Es el precio de tener la barra fija: el historial deja
16
- * de ser del terminal y pasa a ser nuestro.
17
- *
18
- * POR QUE SE GUARDA POR LÍNEAS Y NO EL FLUJO CRUDO
19
- *
20
- * Lo que llega trae códigos de color y a veces medio renglón sin terminar. Para
21
- * poder pintar "las últimas N líneas" hay que saber dónde acaba cada una, así
22
- * que se parte por saltos y el resto sin terminar se queda esperando al suyo.
23
- * Los colores se conservan tal cual: recortarlos aquí sería pintar la
24
- * conversación en gris.
25
- */
26
- /** Tope de líneas recordadas. Más allá, se olvidan las de arriba. */
27
- const MAXIMO = Number(process.env.CHOCOLATITO_HISTORIAL_LINEAS || 5000);
28
- let lineas = [];
29
- let resto = "";
30
- const oyentes = [];
31
- /** Añade lo que se acaba de escribir. Acepta trozos a medio renglón. */
32
- export function apuntar(texto) {
33
- if (!texto)
34
- return;
35
- const completo = resto + texto.replace(/\r\n/g, "\n");
36
- const partes = completo.split("\n");
37
- // El último trozo no lleva salto: todavía no es una línea terminada.
38
- resto = partes.pop() ?? "";
39
- for (const l of partes)
40
- lineas.push(l);
41
- if (lineas.length > MAXIMO)
42
- lineas = lineas.slice(lineas.length - MAXIMO);
43
- for (const cb of oyentes) {
44
- try {
45
- cb();
46
- }
47
- catch { }
48
- }
49
- }
50
- /**
51
- * Todas las líneas, con el resto sin terminar como última.
52
- *
53
- * Se incluye a propósito: mientras el modelo escribe una frase larga, el resto
54
- * ES lo que está saliendo. Ocultarlo hasta el salto haría que la respuesta
55
- * apareciera a tirones, un renglón entero de golpe.
56
- */
57
- export function todas() {
58
- return resto ? [...lineas, resto] : lineas;
59
- }
60
- export function cuantas() {
61
- return todas().length;
62
- }
63
- /** Se llama en cada escritura, para que quien pinte se entere. */
64
- export function alEscribir(cb) {
65
- oyentes.push(cb);
66
- return () => {
67
- const i = oyentes.indexOf(cb);
68
- if (i >= 0)
69
- oyentes.splice(i, 1);
70
- };
71
- }
72
- export function vaciar() {
73
- lineas = [];
74
- resto = "";
75
- }
76
- /**
77
- * La ventana visible: `alto` líneas terminando `desdeElFinal` por encima del
78
- * final.
79
- *
80
- * `desdeElFinal` es cuánto se ha subido con el scroll. Cero es el fondo, que es
81
- * donde se está mientras se trabaja.
82
- */
83
- export function ventana(alto, desdeElFinal = 0) {
84
- const todo = todas();
85
- const fin = Math.max(0, todo.length - Math.max(0, desdeElFinal));
86
- const inicio = Math.max(0, fin - Math.max(1, alto));
87
- return todo.slice(inicio, fin);
88
- }
89
- /** Cuánto se puede subir todavía. Sirve para no pasarse del principio. */
90
- export function tope(alto) {
91
- return Math.max(0, cuantas() - Math.max(1, alto));
92
- }