chocolatito-code 1.1.0 → 1.3.0
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/README.md +66 -0
- package/dist/agent/huecos.d.ts +58 -0
- package/dist/agent/huecos.js +81 -0
- package/dist/agent/loop.js +218 -41
- package/dist/agent/salidaDelAgente.d.ts +43 -0
- package/dist/agent/salidaDelAgente.js +39 -0
- package/dist/agent/toolGate.js +6 -1
- package/dist/config/engine.d.ts +21 -1
- package/dist/config/engine.js +22 -1
- package/dist/config/nodeVersion.d.ts +13 -0
- package/dist/config/nodeVersion.js +26 -0
- package/dist/index.js +22 -7
- package/dist/mcp/client.d.ts +28 -0
- package/dist/mcp/client.js +62 -8
- package/dist/mcp/ide.d.ts +76 -0
- package/dist/mcp/ide.js +160 -0
- package/dist/mcp/manager.js +9 -0
- package/dist/tools/browserExtension.js +153 -7
- package/dist/tools/computerUse.d.ts +1 -1
- package/dist/tools/computerUse.js +183 -2
- package/dist/tools/definitions.js +9 -2
- package/dist/tools/grepSearch.js +111 -23
- package/dist/tools/runner.js +1 -1
- package/dist/tools/toolDefsComputer.js +6 -2
- package/dist/tools/visionBridge.js +60 -3
- package/dist/tools/win/hostScript.js +154 -0
- package/dist/tools/writeFile.d.ts +16 -1
- package/dist/tools/writeFile.js +22 -1
- package/dist/ui/interrupt.d.ts +10 -0
- package/dist/ui/interrupt.js +53 -4
- package/dist/ui/keyboardGuard.d.ts +21 -0
- package/dist/ui/keyboardGuard.js +30 -1
- package/dist/ui/pegados.d.ts +50 -0
- package/dist/ui/pegados.js +83 -0
- package/dist/ui/pieFijo.d.ts +56 -0
- package/dist/ui/pieFijo.js +309 -0
- package/dist/ui/prompt.d.ts +5 -0
- package/dist/ui/prompt.js +109 -16
- package/dist/ui/reasoningStream.js +22 -12
- package/dist/ui/salida.d.ts +10 -0
- package/dist/ui/salida.js +50 -0
- package/dist/ui/spinner.d.ts +15 -8
- package/dist/ui/spinner.js +80 -42
- package/extension/background.js +191 -14
- package/extension/content.js +446 -48
- package/extension/fuentes/Chocolatito-Marca.ttf +0 -0
- package/extension/iconos/128.png +0 -0
- package/extension/iconos/16.png +0 -0
- package/extension/iconos/32.png +0 -0
- package/extension/iconos/48.png +0 -0
- package/extension/iconos/ORIGEN.md +48 -0
- package/extension/iconos/logotipo.png +0 -0
- package/extension/manifest.json +27 -4
- package/extension/popup.html +16 -6
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -85,6 +85,55 @@ Si repite tres veces la misma llamada con el mismo resultado, se para y pregunta
|
|
|
85
85
|
seguir, o le dices que cambie de enfoque. Sin terminal (CI, `chocolatito "haz X"`) se corta
|
|
86
86
|
solo, para que un bucle que nadie está mirando no se coma la cuota.
|
|
87
87
|
|
|
88
|
+
## 🧩 VSCode
|
|
89
|
+
|
|
90
|
+
Si tienes la extensión instalada y abres `chocolatito` en la terminal integrada, **se conecta
|
|
91
|
+
solo**. No hay nada que configurar.
|
|
92
|
+
|
|
93
|
+
El truco está al revés de lo que parece: la extensión es un **servidor MCP** y el agente es el
|
|
94
|
+
cliente. Cada ventana de VSCode levanta un servidor en `127.0.0.1` y deja una ficha en
|
|
95
|
+
`~/.chocolatito/ide/` con su puerto, su token y la carpeta que tiene abierta. El agente busca la
|
|
96
|
+
ficha cuya carpeta contiene su directorio de trabajo.
|
|
97
|
+
|
|
98
|
+
Lo que gana el agente (lo único que no puede tener por su cuenta):
|
|
99
|
+
|
|
100
|
+
| Herramienta | Para qué |
|
|
101
|
+
| --- | --- |
|
|
102
|
+
| `diagnosticos` | Los errores del servidor de lenguaje. Los subrayados rojos, sin esperar a compilar. |
|
|
103
|
+
| `seleccion_actual` | Qué archivo tienes abierto y qué has seleccionado. Hace que «arregla esto» signifique algo. |
|
|
104
|
+
| `archivos_abiertos` | Las pestañas abiertas, en orden. |
|
|
105
|
+
| `mostrar_diff` | Abre el visor de diferencias nativo. No escribe nada: es para que lo veas antes. |
|
|
106
|
+
|
|
107
|
+
**Con varias ventanas abiertas se elige la correcta**, no la primera: gana la carpeta más
|
|
108
|
+
específica que contenga el directorio de trabajo, y si ninguna lo contiene **no se conecta a
|
|
109
|
+
nada**. Conectarse a la ventana de otro proyecto sería peor que no conectarse: los diffs saldrían
|
|
110
|
+
en el sitio equivocado.
|
|
111
|
+
|
|
112
|
+
El servidor escucha solo en `127.0.0.1` y exige un token de 32 bytes que va en la ficha, dentro de
|
|
113
|
+
tu carpeta personal. Sin eso, cualquier programa de la máquina podría manejar tu editor.
|
|
114
|
+
|
|
115
|
+
Para apagarlo: `CHOCOLATITO_SIN_EDITOR=1`, o la opción `chocolatito.puente` en VSCode.
|
|
116
|
+
|
|
117
|
+
### Instalarla
|
|
118
|
+
|
|
119
|
+
Mientras no esté en el marketplace, se instala desde el paquete:
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
cd extension-vscode
|
|
123
|
+
npx @vscode/vsce package --allow-missing-repository --skip-license
|
|
124
|
+
code --install-extension chocolatito-code-vscode-0.1.1.vsix
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
**Con VSCode cerrado**, y reiniciándolo después. Copiar la carpeta a mano a `~/.vscode/extensions`
|
|
128
|
+
**no funciona**: falta el `.vsixmanifest` y VSCode la lista pero no la carga nunca, sin dar ningún
|
|
129
|
+
error. Para desarrollar, `F5` sobre la carpeta abre una ventana con la extensión cargada al vuelo.
|
|
130
|
+
|
|
131
|
+
En la barra de estado, abajo a la derecha, pone **Chocolatito** con el estado del puente. Si algo
|
|
132
|
+
falla —sin carpeta abierta, puente apagado, puerto ocupado— lo dice ahí, y al pulsarlo se abre el
|
|
133
|
+
detalle.
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
88
137
|
## 🔌 MCP (Model Context Protocol)
|
|
89
138
|
|
|
90
139
|
Conecta cualquier servidor MCP y sus herramientas quedan disponibles para el agente.
|
|
@@ -141,6 +190,23 @@ solo lectura de verdad: ni comandos, ni clics, ni escrituras.
|
|
|
141
190
|
|
|
142
191
|
`--yes` aprueba todo sin preguntar: es para CI, no para el día a día.
|
|
143
192
|
|
|
193
|
+
## 📋 Pegar texto largo
|
|
194
|
+
|
|
195
|
+
Pegar un log de 300 líneas ya no mete 300 líneas en el recuadro. Se guarda aparte y en el prompt
|
|
196
|
+
queda una marca corta:
|
|
197
|
+
|
|
198
|
+
```
|
|
199
|
+
❯ arregla esto [pegado #1 · 347 lineas]
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
**El modelo recibe el texto entero**, no la marca: al enviar se sustituye por lo que pegaste. Y un
|
|
203
|
+
solo `backspace` con el cursor detrás de la marca se la lleva completa — lo que ocupa una línea se
|
|
204
|
+
borra como una línea.
|
|
205
|
+
|
|
206
|
+
Por debajo de 5 líneas o 400 caracteres se pega normal, entero y a la vista.
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
144
210
|
## ⌨️ Escribir mientras trabaja
|
|
145
211
|
|
|
146
212
|
No hace falta esperar a que termine. Lo que escribas durante una generación aparece bajo
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NO GASTAR UN HUECO DE PETICION QUE YA SABEMOS QUE NO HAY
|
|
3
|
+
*
|
|
4
|
+
* DE DONDE SALE
|
|
5
|
+
*
|
|
6
|
+
* Sesion real. Una respuesta se corto a mitad, el bucle reintento, y en cuatro
|
|
7
|
+
* mensajes el usuario se quedo sin servicio:
|
|
8
|
+
*
|
|
9
|
+
* ⏸ Tienes 4 peticiones en curso. Reintenta en 197s.
|
|
10
|
+
* ❯ q paso?
|
|
11
|
+
* ⏸ Tienes 4 peticiones en curso. Reintenta en 189s.
|
|
12
|
+
*
|
|
13
|
+
* Fijate en la segunda. El agente ya SABIA que no habia huecos y que faltaban
|
|
14
|
+
* 197 segundos; ocho segundos despues volvio a llamar al motor para que se lo
|
|
15
|
+
* repitiera. Esa llamada no podia salir bien por definicion, y ademas es la
|
|
16
|
+
* clase de peticion que puede refrescar la reserva del proxy y alargar la
|
|
17
|
+
* espera. El usuario tecleaba, esperaba, y se llevaba la misma pared.
|
|
18
|
+
*
|
|
19
|
+
* LO QUE HACE
|
|
20
|
+
*
|
|
21
|
+
* Se apunta hasta cuando no hay huecos y se responde desde aqui, sin red. Deja
|
|
22
|
+
* de gastarse una peticion por cada intento y el usuario ve la cuenta atras
|
|
23
|
+
* bajar de verdad en lugar de quedarse clavada.
|
|
24
|
+
*
|
|
25
|
+
* POR QUE NO SE FIA DEL RELOJ A CIEGAS
|
|
26
|
+
*
|
|
27
|
+
* Un reloj que se adelanta desbloquea antes de tiempo -inofensivo, la siguiente
|
|
28
|
+
* peticion dira la verdad-. Pero uno que se atrasa dejaria `ocupadoHasta` en un
|
|
29
|
+
* futuro lejano y el agente se negaria a llamar al motor durante horas sin que
|
|
30
|
+
* nada lo despierte. Por eso la espera nunca puede pasar de la ventana que se
|
|
31
|
+
* anoto: en el peor caso se espera de mas una vez, no para siempre.
|
|
32
|
+
*/
|
|
33
|
+
/** Cuando el proxy no dice cuanto falta. Un minuto es su reserva mas corta. */
|
|
34
|
+
export declare const SEGUNDOS_POR_DEFECTO = 60;
|
|
35
|
+
/** Techo de la espera. Ninguna reserva del proxy dura mas de unos minutos. */
|
|
36
|
+
export declare const SEGUNDOS_MAXIMOS = 300;
|
|
37
|
+
/**
|
|
38
|
+
* Apunta que los huecos estan llenos.
|
|
39
|
+
*
|
|
40
|
+
* `retryAfterS` es lo que dice el proxy en `error.retry_after_s`. Si no viene,
|
|
41
|
+
* o viene con un valor absurdo, se usa un minuto: adivinar de mas encierra al
|
|
42
|
+
* usuario y adivinar de menos le devuelve a la misma pared.
|
|
43
|
+
*/
|
|
44
|
+
export declare function anotarHuecosOcupados(retryAfterS?: unknown): void;
|
|
45
|
+
/** Segundos que faltan para volver a tener hueco. 0 si ya lo hay. */
|
|
46
|
+
export declare function segundosDeEspera(): number;
|
|
47
|
+
/**
|
|
48
|
+
* Olvida la espera. Se llama en cuanto el motor concede una peticion: si
|
|
49
|
+
* contesta, es que habia hueco, y seguir bloqueando seria mentir.
|
|
50
|
+
*/
|
|
51
|
+
export declare function liberarHuecos(): void;
|
|
52
|
+
/**
|
|
53
|
+
* Lo que se le dice al usuario en vez de llamar al motor.
|
|
54
|
+
*
|
|
55
|
+
* Dice de donde sale la cuenta -no es una invencion del cliente- y que no tiene
|
|
56
|
+
* que hacer nada: es lo unico que se arregla solo con esperar.
|
|
57
|
+
*/
|
|
58
|
+
export declare function mensajeDeEspera(segundos: number): string;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NO GASTAR UN HUECO DE PETICION QUE YA SABEMOS QUE NO HAY
|
|
3
|
+
*
|
|
4
|
+
* DE DONDE SALE
|
|
5
|
+
*
|
|
6
|
+
* Sesion real. Una respuesta se corto a mitad, el bucle reintento, y en cuatro
|
|
7
|
+
* mensajes el usuario se quedo sin servicio:
|
|
8
|
+
*
|
|
9
|
+
* ⏸ Tienes 4 peticiones en curso. Reintenta en 197s.
|
|
10
|
+
* ❯ q paso?
|
|
11
|
+
* ⏸ Tienes 4 peticiones en curso. Reintenta en 189s.
|
|
12
|
+
*
|
|
13
|
+
* Fijate en la segunda. El agente ya SABIA que no habia huecos y que faltaban
|
|
14
|
+
* 197 segundos; ocho segundos despues volvio a llamar al motor para que se lo
|
|
15
|
+
* repitiera. Esa llamada no podia salir bien por definicion, y ademas es la
|
|
16
|
+
* clase de peticion que puede refrescar la reserva del proxy y alargar la
|
|
17
|
+
* espera. El usuario tecleaba, esperaba, y se llevaba la misma pared.
|
|
18
|
+
*
|
|
19
|
+
* LO QUE HACE
|
|
20
|
+
*
|
|
21
|
+
* Se apunta hasta cuando no hay huecos y se responde desde aqui, sin red. Deja
|
|
22
|
+
* de gastarse una peticion por cada intento y el usuario ve la cuenta atras
|
|
23
|
+
* bajar de verdad en lugar de quedarse clavada.
|
|
24
|
+
*
|
|
25
|
+
* POR QUE NO SE FIA DEL RELOJ A CIEGAS
|
|
26
|
+
*
|
|
27
|
+
* Un reloj que se adelanta desbloquea antes de tiempo -inofensivo, la siguiente
|
|
28
|
+
* peticion dira la verdad-. Pero uno que se atrasa dejaria `ocupadoHasta` en un
|
|
29
|
+
* futuro lejano y el agente se negaria a llamar al motor durante horas sin que
|
|
30
|
+
* nada lo despierte. Por eso la espera nunca puede pasar de la ventana que se
|
|
31
|
+
* anoto: en el peor caso se espera de mas una vez, no para siempre.
|
|
32
|
+
*/
|
|
33
|
+
/** Cuando el proxy no dice cuanto falta. Un minuto es su reserva mas corta. */
|
|
34
|
+
export const SEGUNDOS_POR_DEFECTO = 60;
|
|
35
|
+
/** Techo de la espera. Ninguna reserva del proxy dura mas de unos minutos. */
|
|
36
|
+
export const SEGUNDOS_MAXIMOS = 300;
|
|
37
|
+
let ocupadoHasta = 0;
|
|
38
|
+
let ventanaMs = 0;
|
|
39
|
+
/**
|
|
40
|
+
* Apunta que los huecos estan llenos.
|
|
41
|
+
*
|
|
42
|
+
* `retryAfterS` es lo que dice el proxy en `error.retry_after_s`. Si no viene,
|
|
43
|
+
* o viene con un valor absurdo, se usa un minuto: adivinar de mas encierra al
|
|
44
|
+
* usuario y adivinar de menos le devuelve a la misma pared.
|
|
45
|
+
*/
|
|
46
|
+
export function anotarHuecosOcupados(retryAfterS) {
|
|
47
|
+
const dicho = Number(retryAfterS);
|
|
48
|
+
const segundos = Number.isFinite(dicho) && dicho > 0 ? Math.min(dicho, SEGUNDOS_MAXIMOS) : SEGUNDOS_POR_DEFECTO;
|
|
49
|
+
ventanaMs = segundos * 1000;
|
|
50
|
+
ocupadoHasta = Date.now() + ventanaMs;
|
|
51
|
+
}
|
|
52
|
+
/** Segundos que faltan para volver a tener hueco. 0 si ya lo hay. */
|
|
53
|
+
export function segundosDeEspera() {
|
|
54
|
+
if (ocupadoHasta === 0)
|
|
55
|
+
return 0;
|
|
56
|
+
const faltan = Math.min(ocupadoHasta - Date.now(), ventanaMs);
|
|
57
|
+
if (faltan <= 0) {
|
|
58
|
+
liberarHuecos();
|
|
59
|
+
return 0;
|
|
60
|
+
}
|
|
61
|
+
return Math.ceil(faltan / 1000);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Olvida la espera. Se llama en cuanto el motor concede una peticion: si
|
|
65
|
+
* contesta, es que habia hueco, y seguir bloqueando seria mentir.
|
|
66
|
+
*/
|
|
67
|
+
export function liberarHuecos() {
|
|
68
|
+
ocupadoHasta = 0;
|
|
69
|
+
ventanaMs = 0;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Lo que se le dice al usuario en vez de llamar al motor.
|
|
73
|
+
*
|
|
74
|
+
* Dice de donde sale la cuenta -no es una invencion del cliente- y que no tiene
|
|
75
|
+
* que hacer nada: es lo unico que se arregla solo con esperar.
|
|
76
|
+
*/
|
|
77
|
+
export function mensajeDeEspera(segundos) {
|
|
78
|
+
return (`Los huecos de peticion de tu licencia siguen ocupados. Faltan ${segundos}s. ` +
|
|
79
|
+
"No llamo al motor porque la respuesta seria la misma y cada intento puede alargar la espera. " +
|
|
80
|
+
"No hace falta que hagas nada: el hueco se libera solo.");
|
|
81
|
+
}
|