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.
Files changed (55) hide show
  1. package/README.md +66 -0
  2. package/dist/agent/huecos.d.ts +58 -0
  3. package/dist/agent/huecos.js +81 -0
  4. package/dist/agent/loop.js +218 -41
  5. package/dist/agent/salidaDelAgente.d.ts +43 -0
  6. package/dist/agent/salidaDelAgente.js +39 -0
  7. package/dist/agent/toolGate.js +6 -1
  8. package/dist/config/engine.d.ts +21 -1
  9. package/dist/config/engine.js +22 -1
  10. package/dist/config/nodeVersion.d.ts +13 -0
  11. package/dist/config/nodeVersion.js +26 -0
  12. package/dist/index.js +22 -7
  13. package/dist/mcp/client.d.ts +28 -0
  14. package/dist/mcp/client.js +62 -8
  15. package/dist/mcp/ide.d.ts +76 -0
  16. package/dist/mcp/ide.js +160 -0
  17. package/dist/mcp/manager.js +9 -0
  18. package/dist/tools/browserExtension.js +153 -7
  19. package/dist/tools/computerUse.d.ts +1 -1
  20. package/dist/tools/computerUse.js +183 -2
  21. package/dist/tools/definitions.js +9 -2
  22. package/dist/tools/grepSearch.js +111 -23
  23. package/dist/tools/runner.js +1 -1
  24. package/dist/tools/toolDefsComputer.js +6 -2
  25. package/dist/tools/visionBridge.js +60 -3
  26. package/dist/tools/win/hostScript.js +154 -0
  27. package/dist/tools/writeFile.d.ts +16 -1
  28. package/dist/tools/writeFile.js +22 -1
  29. package/dist/ui/interrupt.d.ts +10 -0
  30. package/dist/ui/interrupt.js +53 -4
  31. package/dist/ui/keyboardGuard.d.ts +21 -0
  32. package/dist/ui/keyboardGuard.js +30 -1
  33. package/dist/ui/pegados.d.ts +50 -0
  34. package/dist/ui/pegados.js +83 -0
  35. package/dist/ui/pieFijo.d.ts +56 -0
  36. package/dist/ui/pieFijo.js +309 -0
  37. package/dist/ui/prompt.d.ts +5 -0
  38. package/dist/ui/prompt.js +109 -16
  39. package/dist/ui/reasoningStream.js +22 -12
  40. package/dist/ui/salida.d.ts +10 -0
  41. package/dist/ui/salida.js +50 -0
  42. package/dist/ui/spinner.d.ts +15 -8
  43. package/dist/ui/spinner.js +80 -42
  44. package/extension/background.js +191 -14
  45. package/extension/content.js +446 -48
  46. package/extension/fuentes/Chocolatito-Marca.ttf +0 -0
  47. package/extension/iconos/128.png +0 -0
  48. package/extension/iconos/16.png +0 -0
  49. package/extension/iconos/32.png +0 -0
  50. package/extension/iconos/48.png +0 -0
  51. package/extension/iconos/ORIGEN.md +48 -0
  52. package/extension/iconos/logotipo.png +0 -0
  53. package/extension/manifest.json +27 -4
  54. package/extension/popup.html +16 -6
  55. 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
+ }