chocolatito-code 1.3.2 → 1.3.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 +18 -3
- package/dist/ui/banner.d.ts +15 -13
- package/dist/ui/banner.js +36 -20
- package/dist/ui/marco.js +12 -3
- package/dist/ui/motorActual.d.ts +15 -1
- package/dist/ui/motorActual.js +33 -1
- package/extension/manifest.json +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -15,6 +15,7 @@ import { codigoDeSalida, EXIT_OK, EXIT_FALLO, EXIT_USO, EXIT_LICENCIA } from "./
|
|
|
15
15
|
import { showBanner, animateStartupBanner, showHelp, showEffortMenu } from "./ui/banner.js";
|
|
16
16
|
import { fijarMotor } from "./ui/motorActual.js";
|
|
17
17
|
import { elegirDeLista } from "./ui/selector.js";
|
|
18
|
+
import { reafirmarModoCrudo } from "./ui/keyboardGuard.js";
|
|
18
19
|
import { askInteractivePrompt, SLASH_COMMANDS } from "./ui/prompt.js";
|
|
19
20
|
import { changeDir } from "./tools/changeDir.js";
|
|
20
21
|
import { gitDiff, gitCommit } from "./tools/gitTools.js";
|
|
@@ -237,7 +238,7 @@ ${nodeViejo}
|
|
|
237
238
|
let currentModel = DEFAULT_ESPECTRO;
|
|
238
239
|
// La barra de estado lo lee de aqui. Fijarlo al arrancar y no solo al
|
|
239
240
|
// cambiarlo: si no, hasta el primer /effort la barra no dice nada.
|
|
240
|
-
fijarMotor(currentModel.name);
|
|
241
|
+
fijarMotor(currentModel.name, currentModel.effortLevel);
|
|
241
242
|
let isPlanMode = false;
|
|
242
243
|
let systemPrompt = buildSystemPrompt(context, currentModel, skillManager, memoryManager, isPlanMode);
|
|
243
244
|
const agent = new AgentLoop(apiKey, getEngineBaseUrl(), currentModel, systemPrompt);
|
|
@@ -434,7 +435,7 @@ ${sessionData}
|
|
|
434
435
|
const restauracion = prepararRestauracion(loaded, { cwd: agent.currentCwd, modelId: currentModel.id });
|
|
435
436
|
agent.currentCwd = restauracion.cwd;
|
|
436
437
|
currentModel = ESPECTRO_MODELS[restauracion.modelId] || currentModel;
|
|
437
|
-
fijarMotor(currentModel.name);
|
|
438
|
+
fijarMotor(currentModel.name, currentModel.effortLevel);
|
|
438
439
|
const refreshedContext = await getProjectContext(agent.currentCwd);
|
|
439
440
|
systemPrompt = buildSystemPrompt(refreshedContext, currentModel, skillManager, memoryManager, isPlanMode);
|
|
440
441
|
agent.messages = [{ role: "system", content: systemPrompt }, ...restauracion.conversacion];
|
|
@@ -612,7 +613,7 @@ Directivas de ejecución:
|
|
|
612
613
|
}
|
|
613
614
|
currentModel = ESPECTRO_MODELS[targetId];
|
|
614
615
|
// Sin esto la barra de abajo sigue anunciando el motor anterior.
|
|
615
|
-
fijarMotor(currentModel.name);
|
|
616
|
+
fijarMotor(currentModel.name, currentModel.effortLevel);
|
|
616
617
|
const refreshedContext = await getProjectContext(agent.currentCwd);
|
|
617
618
|
const updatedPrompt = buildSystemPrompt(refreshedContext, currentModel, skillManager, memoryManager, isPlanMode);
|
|
618
619
|
agent.setEspectroModel(currentModel, updatedPrompt);
|
|
@@ -623,6 +624,20 @@ Directivas de ejecución:
|
|
|
623
624
|
`
|
|
624
625
|
${chalk.italic.gray(currentModel.description)}
|
|
625
626
|
`);
|
|
627
|
+
// EL TECLADO SE QUEDABA TRABADO AL CAMBIAR DE MOTOR
|
|
628
|
+
//
|
|
629
|
+
// "una vez cambiado de effort se queda trabado y con un enter se va la
|
|
630
|
+
// traba". Ese "con un enter se arregla" es la firma del modo COCIDO: la
|
|
631
|
+
// consola retiene lo tecleado hasta el salto de linea, asi que el prompt
|
|
632
|
+
// no recibe nada hasta que pulsas Enter.
|
|
633
|
+
//
|
|
634
|
+
// Aqui en medio se refresca el contexto del proyecto, que lanza git. Un
|
|
635
|
+
// hijo que hereda la consola puede devolverla en cocido al terminar, y
|
|
636
|
+
// Node no se entera: `process.stdin.isRaw` sigue diciendo true. Por eso el
|
|
637
|
+
// vigilante del prompt no lo arregla —solo actua cuando SABE que se
|
|
638
|
+
// perdio— y hace falta reafirmar, que pasa por false antes de poner true
|
|
639
|
+
// y por tanto no se lo come la cache de libuv.
|
|
640
|
+
reafirmarModoCrudo(process.stdin);
|
|
626
641
|
continue;
|
|
627
642
|
}
|
|
628
643
|
if (trimmed === "/clear") {
|
package/dist/ui/banner.d.ts
CHANGED
|
@@ -5,13 +5,13 @@ export declare function colorizeSilkscreenLine(line: string): string;
|
|
|
5
5
|
export declare function renderMascotLines(isBlinking?: boolean): string[];
|
|
6
6
|
export declare function buildBannerContent(cwd: string, model: EspectroModel, isBlinking?: boolean): string;
|
|
7
7
|
/**
|
|
8
|
-
* Ventana por debajo de esto y no se ancla nada:
|
|
9
|
-
*
|
|
8
|
+
* Ventana por debajo de esto y no se ancla nada: no sobra sitio y el hueco solo
|
|
9
|
+
* serviria para empujar el banner fuera de la pantalla.
|
|
10
10
|
*/
|
|
11
11
|
export declare const FILAS_MINIMAS_PARA_ANCLAR = 16;
|
|
12
12
|
/**
|
|
13
|
-
* Filas en blanco que hay que soltar
|
|
14
|
-
*
|
|
13
|
+
* Filas en blanco que hay que soltar ANTES de `contenido` para que el prompt
|
|
14
|
+
* acabe pegado al fondo de la ventana. Cero si no cabe o no hace falta.
|
|
15
15
|
*
|
|
16
16
|
* Se exporta para poder comprobar la cuenta: dentro de un terminal esto no se
|
|
17
17
|
* revisa a ojo, y pasarse de una fila hace desaparecer la primera del banner.
|
|
@@ -20,16 +20,18 @@ export declare function filasParaAnclar(contenido: string, filasDeVentana: numbe
|
|
|
20
20
|
/**
|
|
21
21
|
* ANCLAR EL PROMPT AL FONDO DE LA VENTANA
|
|
22
22
|
*
|
|
23
|
-
* El usuario lo
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
* si el programa estuviera a medio dibujar.
|
|
23
|
+
* El usuario lo enseño con una captura: "mira hay espacio y no es fijo, eso debe
|
|
24
|
+
* estar fijo en la parte de abajo". Con la sesion recien empezada el contenido
|
|
25
|
+
* no llega al final de la pantalla, asi que el marco del prompt se quedaba a
|
|
26
|
+
* media altura con hueco vacio DEBAJO.
|
|
28
27
|
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
28
|
+
* POR QUE EL HUECO VA ARRIBA Y NO ABAJO
|
|
29
|
+
*
|
|
30
|
+
* La primera version soltaba las filas en blanco DETRAS del banner. Anclaba,
|
|
31
|
+
* si, pero dejaba un claro enorme entre el banner y el prompt que se leia como
|
|
32
|
+
* un dibujo a medio hacer. Puestas DELANTE, el banner y el prompt quedan
|
|
33
|
+
* pegados en la parte baja y el hueco queda arriba, donde se lee como lo que es:
|
|
34
|
+
* una sesion que acaba de empezar.
|
|
33
35
|
*
|
|
34
36
|
* NO se usa la region de scroll ni la pantalla alternativa: las dos se llevan
|
|
35
37
|
* por delante el historial del terminal, y aqui media sesion consiste en subir
|
package/dist/ui/banner.js
CHANGED
|
@@ -115,13 +115,27 @@ export function buildBannerContent(cwd, model, isBlinking = false) {
|
|
|
115
115
|
return ["", ...combinedRows, ""].join("\n");
|
|
116
116
|
}
|
|
117
117
|
/**
|
|
118
|
-
* Ventana por debajo de esto y no se ancla nada:
|
|
119
|
-
*
|
|
118
|
+
* Ventana por debajo de esto y no se ancla nada: no sobra sitio y el hueco solo
|
|
119
|
+
* serviria para empujar el banner fuera de la pantalla.
|
|
120
120
|
*/
|
|
121
121
|
export const FILAS_MINIMAS_PARA_ANCLAR = 16;
|
|
122
122
|
/**
|
|
123
|
-
* Filas
|
|
124
|
-
*
|
|
123
|
+
* Filas que se imprimen DESPUES del banner y hay que dejarles sitio.
|
|
124
|
+
*
|
|
125
|
+
* 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 (barra, entrada, barra, estado: 4).
|
|
127
|
+
*
|
|
128
|
+
* AQUI ESTABA EL FALLO DEL ZORRO CORTADO
|
|
129
|
+
*
|
|
130
|
+
* La primera version rellenaba hasta la ultima fila y se olvidaba de estas seis.
|
|
131
|
+
* Al imprimirse despues, el terminal desplazaba seis filas y se llevaba por
|
|
132
|
+
* arriba la cabeza del zorro. El usuario lo vio en cuanto abrio: "hay mucho
|
|
133
|
+
* espacio y se baja y se corta el zorrito al iniciar".
|
|
134
|
+
*/
|
|
135
|
+
const FILAS_DESPUES_DEL_BANNER = 6;
|
|
136
|
+
/**
|
|
137
|
+
* Filas en blanco que hay que soltar ANTES de `contenido` para que el prompt
|
|
138
|
+
* acabe pegado al fondo de la ventana. Cero si no cabe o no hace falta.
|
|
125
139
|
*
|
|
126
140
|
* Se exporta para poder comprobar la cuenta: dentro de un terminal esto no se
|
|
127
141
|
* revisa a ojo, y pasarse de una fila hace desaparecer la primera del banner.
|
|
@@ -131,22 +145,24 @@ export function filasParaAnclar(contenido, filasDeVentana) {
|
|
|
131
145
|
return 0;
|
|
132
146
|
// El `console.log` anade su propio salto: por eso la altura del bloque es una
|
|
133
147
|
// linea mas de las que trae el texto.
|
|
134
|
-
const alto = contenido.split("\n").length;
|
|
135
|
-
return Math.max(0, filasDeVentana - alto -
|
|
148
|
+
const alto = contenido.split("\n").length + 1;
|
|
149
|
+
return Math.max(0, filasDeVentana - alto - FILAS_DESPUES_DEL_BANNER);
|
|
136
150
|
}
|
|
137
151
|
/**
|
|
138
152
|
* ANCLAR EL PROMPT AL FONDO DE LA VENTANA
|
|
139
153
|
*
|
|
140
|
-
* El usuario lo
|
|
141
|
-
*
|
|
142
|
-
*
|
|
143
|
-
*
|
|
144
|
-
*
|
|
154
|
+
* El usuario lo enseño con una captura: "mira hay espacio y no es fijo, eso debe
|
|
155
|
+
* estar fijo en la parte de abajo". Con la sesion recien empezada el contenido
|
|
156
|
+
* no llega al final de la pantalla, asi que el marco del prompt se quedaba a
|
|
157
|
+
* media altura con hueco vacio DEBAJO.
|
|
158
|
+
*
|
|
159
|
+
* POR QUE EL HUECO VA ARRIBA Y NO ABAJO
|
|
145
160
|
*
|
|
146
|
-
*
|
|
147
|
-
*
|
|
148
|
-
*
|
|
149
|
-
*
|
|
161
|
+
* La primera version soltaba las filas en blanco DETRAS del banner. Anclaba,
|
|
162
|
+
* si, pero dejaba un claro enorme entre el banner y el prompt que se leia como
|
|
163
|
+
* un dibujo a medio hacer. Puestas DELANTE, el banner y el prompt quedan
|
|
164
|
+
* pegados en la parte baja y el hueco queda arriba, donde se lee como lo que es:
|
|
165
|
+
* una sesion que acaba de empezar.
|
|
150
166
|
*
|
|
151
167
|
* NO se usa la region de scroll ni la pantalla alternativa: las dos se llevan
|
|
152
168
|
* por delante el historial del terminal, y aqui media sesion consiste en subir
|
|
@@ -154,12 +170,12 @@ export function filasParaAnclar(contenido, filasDeVentana) {
|
|
|
154
170
|
*/
|
|
155
171
|
export function showBanner(cwd, model, state = "idle") {
|
|
156
172
|
const content = buildBannerContent(cwd, model, state === "blink");
|
|
173
|
+
if (process.stdout.isTTY) {
|
|
174
|
+
const relleno = filasParaAnclar(content, process.stdout.rows || 0);
|
|
175
|
+
if (relleno > 0)
|
|
176
|
+
dibujar("\n".repeat(relleno));
|
|
177
|
+
}
|
|
157
178
|
console.log(content);
|
|
158
|
-
if (!process.stdout.isTTY)
|
|
159
|
-
return;
|
|
160
|
-
const relleno = filasParaAnclar(content, process.stdout.rows || 0);
|
|
161
|
-
if (relleno > 0)
|
|
162
|
-
dibujar("\n".repeat(relleno));
|
|
163
179
|
}
|
|
164
180
|
export async function animateStartupBanner(cwd, model) {
|
|
165
181
|
// Impresión limpia instantánea sin animaciones lentas en el terminal
|
package/dist/ui/marco.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import chalk from "chalk";
|
|
2
2
|
import { describeMode, getMode, TRIANGULOS } from "./modes.js";
|
|
3
|
-
import { motorActual } from "./motorActual.js";
|
|
3
|
+
import { ESFUERZO_MAXIMO, esfuerzoActual, marcaDeMotor, motorActual } from "./motorActual.js";
|
|
4
4
|
/**
|
|
5
5
|
* EL MARCO DE LA BARRA, EN UN SOLO SITIO
|
|
6
6
|
*
|
|
@@ -137,10 +137,19 @@ export function buildPromptFrame(opts) {
|
|
|
137
137
|
const modePlain = `${TRIANGULOS} modo ${modeLook.label}`;
|
|
138
138
|
// Estaba escrito a mano y por eso no cambiaba nunca. Vacio si nadie lo ha
|
|
139
139
|
// fijado: mejor un hueco que un nombre que no es el que se esta usando.
|
|
140
|
-
|
|
140
|
+
//
|
|
141
|
+
// El nivel de esfuerzo va PEGADO al motor y no en una linea aparte: es un dato
|
|
142
|
+
// del mismo hecho -con que potencia trabajas-, y una fila mas en el pie es una
|
|
143
|
+
// fila menos de conversacion en pantalla.
|
|
144
|
+
const nivel = esfuerzoActual();
|
|
145
|
+
const marca = marcaDeMotor(nivel);
|
|
146
|
+
const motor = motorActual();
|
|
147
|
+
const enginePlain = motor ? `${marca ? `${marca} ` : ""}${motor}${nivel ? ` · ${nivel}` : ""}` : "";
|
|
141
148
|
const hintPlain = "shift+tab cambia · esc cancela · ? /help";
|
|
142
149
|
const modeTag = chalk.hex(modeLook.color)(modePlain);
|
|
143
|
-
|
|
150
|
+
// En el maximo se pinta encendido, no en gris: es el unico nivel que conviene
|
|
151
|
+
// que se note, porque es el que se come la cuota.
|
|
152
|
+
const engine = nivel === ESFUERZO_MAXIMO ? chalk.hex("#FFA500")(enginePlain) : chalk.gray(enginePlain);
|
|
144
153
|
// Dos columnas de respiro. Los triangulos son un glifo de anchura ambigua y
|
|
145
154
|
// hay terminales que lo pintan doble: si la linea llegara justa al ancho, el
|
|
146
155
|
// terminal la partiria en dos filas y el repintado del marco se descuadraria
|
package/dist/ui/motorActual.d.ts
CHANGED
|
@@ -18,7 +18,21 @@
|
|
|
18
18
|
* por que conocer al otro.
|
|
19
19
|
*/
|
|
20
20
|
/** Lo pone index.ts al arrancar y cada vez que se cambia de motor. */
|
|
21
|
-
export declare function fijarMotor(nuevo: string): void;
|
|
21
|
+
export declare function fijarMotor(nuevo: string, nivel?: string): void;
|
|
22
|
+
/** El nivel de esfuerzo activo ("Normal", "Alto", "Extendido", "Máximo"). */
|
|
23
|
+
export declare function esfuerzoActual(): string;
|
|
24
|
+
/** El nivel mas alto. Es el unico que se anuncia distinto. */
|
|
25
|
+
export declare const ESFUERZO_MAXIMO = "M\u00E1ximo";
|
|
26
|
+
/**
|
|
27
|
+
* La marca que precede al nombre del motor.
|
|
28
|
+
*
|
|
29
|
+
* Recibe el reloj en vez de leerlo: asi se puede comprobar fotograma a
|
|
30
|
+
* fotograma, que dentro de un terminal no se revisa a ojo.
|
|
31
|
+
*
|
|
32
|
+
* Cambia cada 180 ms, no cada 120 como el spinner. Dos cosas latiendo al mismo
|
|
33
|
+
* ritmo se leen como una sola parpadeando; a ritmos distintos se distinguen.
|
|
34
|
+
*/
|
|
35
|
+
export declare function marcaDeMotor(nivel?: string, ahora?: number): string;
|
|
22
36
|
/**
|
|
23
37
|
* El nombre del motor activo.
|
|
24
38
|
*
|
package/dist/ui/motorActual.js
CHANGED
|
@@ -18,10 +18,42 @@
|
|
|
18
18
|
* por que conocer al otro.
|
|
19
19
|
*/
|
|
20
20
|
let nombre = "";
|
|
21
|
+
let esfuerzo = "";
|
|
21
22
|
/** Lo pone index.ts al arrancar y cada vez que se cambia de motor. */
|
|
22
|
-
export function fijarMotor(nuevo) {
|
|
23
|
+
export function fijarMotor(nuevo, nivel = "") {
|
|
23
24
|
if (nuevo && nuevo.trim())
|
|
24
25
|
nombre = nuevo.trim();
|
|
26
|
+
if (nivel && nivel.trim())
|
|
27
|
+
esfuerzo = nivel.trim();
|
|
28
|
+
}
|
|
29
|
+
/** El nivel de esfuerzo activo ("Normal", "Alto", "Extendido", "Máximo"). */
|
|
30
|
+
export function esfuerzoActual() {
|
|
31
|
+
return esfuerzo;
|
|
32
|
+
}
|
|
33
|
+
/** El nivel mas alto. Es el unico que se anuncia distinto. */
|
|
34
|
+
export const ESFUERZO_MAXIMO = "Máximo";
|
|
35
|
+
/**
|
|
36
|
+
* Los cuatro fotogramas del latido del maximo.
|
|
37
|
+
*
|
|
38
|
+
* Solo se anima el nivel mas alto, y a proposito: si parpadeara siempre seria
|
|
39
|
+
* ruido de fondo que se deja de ver a los dos minutos. Animando solo el maximo,
|
|
40
|
+
* el movimiento SIGNIFICA algo -"estas gastando el motor caro"- en vez de ser
|
|
41
|
+
* decoracion.
|
|
42
|
+
*/
|
|
43
|
+
const LATIDO = ["◇", "◈", "◆", "◈"];
|
|
44
|
+
/**
|
|
45
|
+
* La marca que precede al nombre del motor.
|
|
46
|
+
*
|
|
47
|
+
* Recibe el reloj en vez de leerlo: asi se puede comprobar fotograma a
|
|
48
|
+
* fotograma, que dentro de un terminal no se revisa a ojo.
|
|
49
|
+
*
|
|
50
|
+
* Cambia cada 180 ms, no cada 120 como el spinner. Dos cosas latiendo al mismo
|
|
51
|
+
* ritmo se leen como una sola parpadeando; a ritmos distintos se distinguen.
|
|
52
|
+
*/
|
|
53
|
+
export function marcaDeMotor(nivel = esfuerzo, ahora = Date.now()) {
|
|
54
|
+
if (nivel !== ESFUERZO_MAXIMO)
|
|
55
|
+
return "";
|
|
56
|
+
return LATIDO[Math.floor(ahora / 180) % LATIDO.length];
|
|
25
57
|
}
|
|
26
58
|
/**
|
|
27
59
|
* El nombre del motor activo.
|
package/extension/manifest.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"manifest_version": 3,
|
|
3
3
|
"minimum_chrome_version": "102",
|
|
4
4
|
"name": "Chocolatito Code",
|
|
5
|
-
"version": "1.3.
|
|
5
|
+
"version": "1.3.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