chocolatito-code 1.6.6 → 1.6.8
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 +437 -341
- package/dist/agent/context.d.ts +6 -0
- package/dist/agent/context.js +69 -2
- package/dist/agent/loop.js +8 -0
- package/dist/agent/toolGate.js +13 -7
- package/dist/agent/verifier.js +2 -1
- package/dist/config/permissions.d.ts +17 -0
- package/dist/config/permissions.js +47 -7
- package/dist/config/plataforma.d.ts +62 -0
- package/dist/config/plataforma.js +109 -0
- package/dist/config/updater.js +4 -1
- package/dist/hooks/manager.js +2 -1
- package/dist/index.js +164 -39
- package/dist/memory/manager.d.ts +15 -5
- package/dist/memory/manager.js +146 -29
- package/dist/servidor/captura.d.ts +36 -0
- package/dist/servidor/captura.js +74 -0
- package/dist/servidor/pagina.d.ts +27 -0
- package/dist/servidor/pagina.js +268 -0
- package/dist/servidor/puente.d.ts +34 -0
- package/dist/servidor/puente.js +115 -0
- package/dist/servidor/servidor.d.ts +61 -0
- package/dist/servidor/servidor.js +249 -0
- package/dist/sessions/manager.d.ts +8 -0
- package/dist/sessions/manager.js +44 -0
- package/dist/sessions/resume.d.ts +12 -0
- package/dist/sessions/resume.js +10 -0
- package/dist/tools/backgroundTask.d.ts +64 -0
- package/dist/tools/backgroundTask.js +264 -0
- package/dist/tools/browserExtension.d.ts +2 -1
- package/dist/tools/browserExtension.js +48 -0
- package/dist/tools/computerUse.js +51 -9
- package/dist/tools/definitions.js +93 -1
- package/dist/tools/gitAudit.d.ts +41 -0
- package/dist/tools/gitAudit.js +282 -0
- package/dist/tools/runCommand.js +5 -2
- package/dist/tools/runner.js +36 -2
- package/dist/tools/safety.d.ts +1 -0
- package/dist/tools/safety.js +3 -0
- package/dist/tools/todoTool.d.ts +2 -0
- package/dist/tools/todoTool.js +29 -0
- package/dist/tools/toolDefsComputer.js +9 -0
- package/dist/tools/win/hostScript.js +7 -2
- package/dist/ui/comandos.js +2 -0
- package/dist/ui/ink/App.d.ts +0 -23
- package/dist/ui/ink/App.js +86 -57
- package/dist/ui/ink/Prompt.d.ts +16 -6
- package/dist/ui/ink/Prompt.js +37 -62
- package/dist/ui/ink/montarApp.d.ts +34 -0
- package/dist/ui/ink/montarApp.js +93 -1
- package/dist/ui/ink/prestamo.d.ts +63 -0
- package/dist/ui/ink/prestamo.js +92 -0
- package/dist/ui/ink/teclado.d.ts +48 -0
- package/dist/ui/ink/teclado.js +96 -0
- package/dist/ui/ink/transcripcion.d.ts +114 -0
- package/dist/ui/ink/transcripcion.js +180 -0
- package/dist/ui/interrupt.js +4 -1
- package/dist/ui/loopPrompt.d.ts +6 -7
- package/dist/ui/loopPrompt.js +14 -1
- package/dist/ui/marco.d.ts +3 -0
- package/dist/ui/marco.js +22 -3
- package/dist/ui/pantalla.d.ts +45 -17
- package/dist/ui/pantalla.js +150 -92
- package/dist/ui/permissionPrompt.d.ts +19 -17
- package/dist/ui/permissionPrompt.js +44 -1
- package/dist/ui/pieFijo.d.ts +1 -1
- package/dist/ui/pieFijo.js +27 -5
- package/dist/ui/renderer.js +8 -0
- package/dist/ui/selector.d.ts +6 -4
- package/dist/ui/selector.js +14 -1
- package/extension/background.js +80 -0
- package/extension/content.js +106 -0
- package/extension/manifest.json +3 -2
- package/package.json +3 -2
- package/dist/ui/historial.d.ts +0 -49
- package/dist/ui/historial.js +0 -92
package/extension/content.js
CHANGED
|
@@ -17,6 +17,103 @@
|
|
|
17
17
|
|
|
18
18
|
const IS_TOP = window.top === window;
|
|
19
19
|
|
|
20
|
+
// ======================================================== telemetría de consola y errores de página
|
|
21
|
+
const MAX_CONSOLE_LOGS = 100;
|
|
22
|
+
const consoleLogsBuffer = [];
|
|
23
|
+
|
|
24
|
+
function addConsoleLog(level, message, stack, url) {
|
|
25
|
+
const entry = {
|
|
26
|
+
timestamp: Date.now(),
|
|
27
|
+
level: level === "warn" ? "warn" : "error",
|
|
28
|
+
message: String(message || ""),
|
|
29
|
+
};
|
|
30
|
+
if (stack) entry.stack = String(stack);
|
|
31
|
+
if (url) entry.url = String(url);
|
|
32
|
+
|
|
33
|
+
consoleLogsBuffer.push(entry);
|
|
34
|
+
if (consoleLogsBuffer.length > MAX_CONSOLE_LOGS) {
|
|
35
|
+
consoleLogsBuffer.shift();
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
try {
|
|
40
|
+
window.addEventListener("error", (event) => {
|
|
41
|
+
try {
|
|
42
|
+
const msg = event.message || (event.error && event.error.message) || String(event);
|
|
43
|
+
const stack = (event.error && event.error.stack) || undefined;
|
|
44
|
+
const url = event.filename || undefined;
|
|
45
|
+
addConsoleLog("error", msg, stack, url);
|
|
46
|
+
} catch (_) {}
|
|
47
|
+
});
|
|
48
|
+
} catch (_) {}
|
|
49
|
+
|
|
50
|
+
try {
|
|
51
|
+
window.addEventListener("unhandledrejection", (event) => {
|
|
52
|
+
try {
|
|
53
|
+
const reason = event.reason;
|
|
54
|
+
const msg =
|
|
55
|
+
(reason && (reason.message || (typeof reason === "object" ? JSON.stringify(reason) : String(reason)))) ||
|
|
56
|
+
"Unhandled Promise Rejection";
|
|
57
|
+
const stack = (reason && reason.stack) || undefined;
|
|
58
|
+
addConsoleLog("error", `Unhandled rejection: ${msg}`, stack);
|
|
59
|
+
} catch (_) {}
|
|
60
|
+
});
|
|
61
|
+
} catch (_) {}
|
|
62
|
+
|
|
63
|
+
try {
|
|
64
|
+
const originalConsoleError = console.error;
|
|
65
|
+
console.error = function (...args) {
|
|
66
|
+
try {
|
|
67
|
+
const msg = args
|
|
68
|
+
.map((a) => {
|
|
69
|
+
if (a instanceof Error) return a.message || String(a);
|
|
70
|
+
if (typeof a === "object" && a !== null) {
|
|
71
|
+
try {
|
|
72
|
+
return JSON.stringify(a);
|
|
73
|
+
} catch (_) {
|
|
74
|
+
return String(a);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return String(a);
|
|
78
|
+
})
|
|
79
|
+
.join(" ");
|
|
80
|
+
const errObj = args.find((a) => a instanceof Error);
|
|
81
|
+
const stack = errObj && errObj.stack ? errObj.stack : undefined;
|
|
82
|
+
addConsoleLog("error", msg, stack);
|
|
83
|
+
} catch (_) {}
|
|
84
|
+
if (typeof originalConsoleError === "function") {
|
|
85
|
+
originalConsoleError.apply(console, args);
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
} catch (_) {}
|
|
89
|
+
|
|
90
|
+
try {
|
|
91
|
+
const originalConsoleWarn = console.warn;
|
|
92
|
+
console.warn = function (...args) {
|
|
93
|
+
try {
|
|
94
|
+
const msg = args
|
|
95
|
+
.map((a) => {
|
|
96
|
+
if (a instanceof Error) return a.message || String(a);
|
|
97
|
+
if (typeof a === "object" && a !== null) {
|
|
98
|
+
try {
|
|
99
|
+
return JSON.stringify(a);
|
|
100
|
+
} catch (_) {
|
|
101
|
+
return String(a);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return String(a);
|
|
105
|
+
})
|
|
106
|
+
.join(" ");
|
|
107
|
+
const errObj = args.find((a) => a instanceof Error);
|
|
108
|
+
const stack = errObj && errObj.stack ? errObj.stack : undefined;
|
|
109
|
+
addConsoleLog("warn", msg, stack);
|
|
110
|
+
} catch (_) {}
|
|
111
|
+
if (typeof originalConsoleWarn === "function") {
|
|
112
|
+
originalConsoleWarn.apply(console, args);
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
} catch (_) {}
|
|
116
|
+
|
|
20
117
|
// ======================================================== overlay visual y borde naranja (#D97757)
|
|
21
118
|
|
|
22
119
|
let overlayHost = null;
|
|
@@ -916,6 +1013,15 @@
|
|
|
916
1013
|
break;
|
|
917
1014
|
}
|
|
918
1015
|
|
|
1016
|
+
case "getConsoleLogs": {
|
|
1017
|
+
const logs = [...consoleLogsBuffer];
|
|
1018
|
+
if (msg.clear === true) {
|
|
1019
|
+
consoleLogsBuffer.length = 0;
|
|
1020
|
+
}
|
|
1021
|
+
sendResponse({ ok: true, logs });
|
|
1022
|
+
break;
|
|
1023
|
+
}
|
|
1024
|
+
|
|
919
1025
|
default:
|
|
920
1026
|
sendResponse({ ok: false, error: "comando desconocido: " + (msg.cmd || msg.tipo) });
|
|
921
1027
|
}
|
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.6.
|
|
5
|
+
"version": "1.6.8",
|
|
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",
|
|
@@ -11,7 +11,8 @@
|
|
|
11
11
|
"debugger",
|
|
12
12
|
"webNavigation",
|
|
13
13
|
"storage",
|
|
14
|
-
"downloads"
|
|
14
|
+
"downloads",
|
|
15
|
+
"webRequest"
|
|
15
16
|
],
|
|
16
17
|
"host_permissions": [
|
|
17
18
|
"<all_urls>"
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "chocolatito-code",
|
|
3
|
-
"version": "1.6.
|
|
3
|
+
"version": "1.6.8",
|
|
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": {
|
|
@@ -21,7 +21,8 @@
|
|
|
21
21
|
"os": [
|
|
22
22
|
"win32",
|
|
23
23
|
"darwin",
|
|
24
|
-
"linux"
|
|
24
|
+
"linux",
|
|
25
|
+
"android"
|
|
25
26
|
],
|
|
26
27
|
"scripts": {
|
|
27
28
|
"build": "tsc",
|
package/dist/ui/historial.d.ts
DELETED
|
@@ -1,49 +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
|
-
/** Añade lo que se acaba de escribir. Acepta trozos a medio renglón. */
|
|
27
|
-
export declare function apuntar(texto: string): void;
|
|
28
|
-
/**
|
|
29
|
-
* Todas las líneas, con el resto sin terminar como última.
|
|
30
|
-
*
|
|
31
|
-
* Se incluye a propósito: mientras el modelo escribe una frase larga, el resto
|
|
32
|
-
* ES lo que está saliendo. Ocultarlo hasta el salto haría que la respuesta
|
|
33
|
-
* apareciera a tirones, un renglón entero de golpe.
|
|
34
|
-
*/
|
|
35
|
-
export declare function todas(): string[];
|
|
36
|
-
export declare function cuantas(): number;
|
|
37
|
-
/** Se llama en cada escritura, para que quien pinte se entere. */
|
|
38
|
-
export declare function alEscribir(cb: () => void): () => void;
|
|
39
|
-
export declare function vaciar(): void;
|
|
40
|
-
/**
|
|
41
|
-
* La ventana visible: `alto` líneas terminando `desdeElFinal` por encima del
|
|
42
|
-
* final.
|
|
43
|
-
*
|
|
44
|
-
* `desdeElFinal` es cuánto se ha subido con el scroll. Cero es el fondo, que es
|
|
45
|
-
* donde se está mientras se trabaja.
|
|
46
|
-
*/
|
|
47
|
-
export declare function ventana(alto: number, desdeElFinal?: number): string[];
|
|
48
|
-
/** Cuánto se puede subir todavía. Sirve para no pasarse del principio. */
|
|
49
|
-
export declare function tope(alto: number): number;
|
package/dist/ui/historial.js
DELETED
|
@@ -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
|
-
}
|