xonecode 0.1.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 (187) hide show
  1. package/README.md +167 -0
  2. package/dist/agent/authEnDisco.js +56 -0
  3. package/dist/agent/authEnDisco.js.map +1 -0
  4. package/dist/agent/configEnDisco.js +109 -0
  5. package/dist/agent/configEnDisco.js.map +1 -0
  6. package/dist/agent/crearProyecto.js +34 -0
  7. package/dist/agent/crearProyecto.js.map +1 -0
  8. package/dist/agent/entorno.js +124 -0
  9. package/dist/agent/entorno.js.map +1 -0
  10. package/dist/agent/guionizado.js +53 -0
  11. package/dist/agent/guionizado.js.map +1 -0
  12. package/dist/agent/instantanea.js +129 -0
  13. package/dist/agent/instantanea.js.map +1 -0
  14. package/dist/agent/interrupts.js +83 -0
  15. package/dist/agent/interrupts.js.map +1 -0
  16. package/dist/agent/mensajes.js +24 -0
  17. package/dist/agent/mensajes.js.map +1 -0
  18. package/dist/agent/modelos.js +42 -0
  19. package/dist/agent/modelos.js.map +1 -0
  20. package/dist/agent/normalizar.js +20 -0
  21. package/dist/agent/normalizar.js.map +1 -0
  22. package/dist/agent/perfiles.js +103 -0
  23. package/dist/agent/perfiles.js.map +1 -0
  24. package/dist/agent/proyecto.js +107 -0
  25. package/dist/agent/proyecto.js.map +1 -0
  26. package/dist/agent/puente.js +142 -0
  27. package/dist/agent/puente.js.map +1 -0
  28. package/dist/agent/resumenDeTool.js +48 -0
  29. package/dist/agent/resumenDeTool.js.map +1 -0
  30. package/dist/agent/skills.js +65 -0
  31. package/dist/agent/skills.js.map +1 -0
  32. package/dist/agent/textoDeTool.js +113 -0
  33. package/dist/agent/textoDeTool.js.map +1 -0
  34. package/dist/agent/turnoReal.js +173 -0
  35. package/dist/agent/turnoReal.js.map +1 -0
  36. package/dist/agent/verificador.js +65 -0
  37. package/dist/agent/verificador.js.map +1 -0
  38. package/dist/agent/xoneAgent.js +106 -0
  39. package/dist/agent/xoneAgent.js.map +1 -0
  40. package/dist/bin.js +9 -0
  41. package/dist/bin.js.map +1 -0
  42. package/dist/cli/aprobar.js +82 -0
  43. package/dist/cli/aprobar.js.map +1 -0
  44. package/dist/cli/config.js +133 -0
  45. package/dist/cli/config.js.map +1 -0
  46. package/dist/cli/consola.js +346 -0
  47. package/dist/cli/consola.js.map +1 -0
  48. package/dist/cli/describe.js +53 -0
  49. package/dist/cli/describe.js.map +1 -0
  50. package/dist/cli/doctor.js +45 -0
  51. package/dist/cli/doctor.js.map +1 -0
  52. package/dist/cli/main.js +520 -0
  53. package/dist/cli/main.js.map +1 -0
  54. package/dist/cli/markdown.js +90 -0
  55. package/dist/cli/markdown.js.map +1 -0
  56. package/dist/cli/run.js +164 -0
  57. package/dist/cli/run.js.map +1 -0
  58. package/dist/cli/spinner.js +89 -0
  59. package/dist/cli/spinner.js.map +1 -0
  60. package/dist/cli/stdio.js +193 -0
  61. package/dist/cli/stdio.js.map +1 -0
  62. package/dist/cli/tema.js +40 -0
  63. package/dist/cli/tema.js.map +1 -0
  64. package/dist/cli/verify.js +62 -0
  65. package/dist/cli/verify.js.map +1 -0
  66. package/dist/core/bitacora.js +30 -0
  67. package/dist/core/bitacora.js.map +1 -0
  68. package/dist/core/config.js +236 -0
  69. package/dist/core/config.js.map +1 -0
  70. package/dist/core/contextos.js +56 -0
  71. package/dist/core/contextos.js.map +1 -0
  72. package/dist/core/deps.js +51 -0
  73. package/dist/core/deps.js.map +1 -0
  74. package/dist/core/diff.js +79 -0
  75. package/dist/core/diff.js.map +1 -0
  76. package/dist/core/esqueleto.js +366 -0
  77. package/dist/core/esqueleto.js.map +1 -0
  78. package/dist/core/events.js +2 -0
  79. package/dist/core/events.js.map +1 -0
  80. package/dist/core/modelos.js +85 -0
  81. package/dist/core/modelos.js.map +1 -0
  82. package/dist/core/notify.js +106 -0
  83. package/dist/core/notify.js.map +1 -0
  84. package/dist/core/ports.js +114 -0
  85. package/dist/core/ports.js.map +1 -0
  86. package/dist/core/turno.js +127 -0
  87. package/dist/core/turno.js.map +1 -0
  88. package/dist/vendor/hitl.js +103 -0
  89. package/dist/vendor/hitl.js.map +1 -0
  90. package/dist/vendor/skillLoaders/catalog.js +74 -0
  91. package/dist/vendor/skillLoaders/catalog.js.map +1 -0
  92. package/dist/vendor/tokenTracking.js +58 -0
  93. package/dist/vendor/tokenTracking.js.map +1 -0
  94. package/package.json +41 -0
  95. package/skills/xone-debugging/SKILL.md +52 -0
  96. package/skills/xone-debugging/references/faq.md +561 -0
  97. package/skills/xone-debugging/references/troubleshooting-y-glosario.md +429 -0
  98. package/skills/xone-development/SKILL.md +105 -0
  99. package/skills/xone-development/references/anti-patrones.md +94 -0
  100. package/skills/xone-development/references/css/atributos-por-categoria.md +509 -0
  101. package/skills/xone-development/references/css/buenas-practicas-y-parser.md +419 -0
  102. package/skills/xone-development/references/css/dinamicos-cascada-y-componentes.md +550 -0
  103. package/skills/xone-development/references/css/patrones-material-y-temas.md +1140 -0
  104. package/skills/xone-development/references/css/propiedades-y-herencia.md +885 -0
  105. package/skills/xone-development/references/css/selectores-unidades-colores.md +840 -0
  106. package/skills/xone-development/references/datos/appdata-referencia-ampliada.md +457 -0
  107. package/skills/xone-development/references/datos/appdata.md +611 -0
  108. package/skills/xone-development/references/datos/http-sqlmanager-y-crypto.md +720 -0
  109. package/skills/xone-development/references/datos/http.md +366 -0
  110. package/skills/xone-development/references/datos/oauth2-y-replica.md +156 -0
  111. package/skills/xone-development/references/device/biometria-imagedrawing-y-otros.md +544 -0
  112. package/skills/xone-development/references/device/objetos-de-dispositivo.md +583 -0
  113. package/skills/xone-development/references/device/systemsettings-referencia-ampliada.md +396 -0
  114. package/skills/xone-development/references/device/systemsettings-y-permisos.md +342 -0
  115. package/skills/xone-development/references/fundamentos/conceptos-clave.md +695 -0
  116. package/skills/xone-development/references/fundamentos/configuracion-app-xml-ini-mappings.md +668 -0
  117. package/skills/xone-development/references/fundamentos/errores-comunes.md +312 -0
  118. package/skills/xone-development/references/fundamentos/navegacion-convenciones-y-primer-proyecto.md +576 -0
  119. package/skills/xone-development/references/fundamentos/plataforma-y-anatomia-de-proyecto.md +387 -0
  120. package/skills/xone-development/references/indice-completo.md +77 -0
  121. package/skills/xone-development/references/javascript/coleccion-error-y-usuario.md +260 -0
  122. package/skills/xone-development/references/javascript/debugging-y-best-practices.md +245 -0
  123. package/skills/xone-development/references/javascript/metodos-de-los-controles.md +556 -0
  124. package/skills/xone-development/references/javascript/metodos-nativos-de-la-vista.md +114 -0
  125. package/skills/xone-development/references/javascript/motor-js-y-contexto-de-ejecucion.md +319 -0
  126. package/skills/xone-development/references/javascript/objeto-ai-llm-en-dispositivo.md +358 -0
  127. package/skills/xone-development/references/javascript/objetos-creables-a-m.md +527 -0
  128. package/skills/xone-development/references/javascript/objetos-creables-n-z.md +385 -0
  129. package/skills/xone-development/references/javascript/patrones-criticos-seguridad-y-rendimiento.md +595 -0
  130. package/skills/xone-development/references/javascript/patrones-de-navegacion-datos-y-codigo.md +751 -0
  131. package/skills/xone-development/references/javascript/patrones-de-ui-voz-integracion-y-seguridad.md +701 -0
  132. package/skills/xone-development/references/javascript/plantillas-y-funciones-utilitarias.md +647 -0
  133. package/skills/xone-development/references/javascript/self-y-dataobject.md +449 -0
  134. package/skills/xone-development/references/javascript/singletons-globales.md +361 -0
  135. package/skills/xone-development/references/javascript/ui-catalogo-de-metodos.md +464 -0
  136. package/skills/xone-development/references/javascript/ui-gps-camara-y-multimedia.md +506 -0
  137. package/skills/xone-development/references/javascript/ui-navegacion-mensajes-y-vista.md +422 -0
  138. package/skills/xone-development/references/resumen-js-datos-dispositivo.md +80 -0
  139. package/skills/xone-development/references/resumen-xml-y-css.md +74 -0
  140. package/skills/xone-development/references/tipos-de-prop.md +28 -0
  141. package/skills/xone-development/references/xml-ui/asfilter-visibilidad-eventos-y-macros.md +576 -0
  142. package/skills/xone-development/references/xml-ui/atributos-coll-group-frame.md +235 -0
  143. package/skills/xone-development/references/xml-ui/atributos-method-macro-script-event-app.md +244 -0
  144. package/skills/xone-development/references/xml-ui/atributos-prop.md +439 -0
  145. package/skills/xone-development/references/xml-ui/contents-y-macros.md +392 -0
  146. package/skills/xone-development/references/xml-ui/errores-comunes-xml.md +245 -0
  147. package/skills/xone-development/references/xml-ui/estructura-y-nodo-coll.md +326 -0
  148. package/skills/xone-development/references/xml-ui/eventos-ciclo-de-vida-e-interaccion.md +704 -0
  149. package/skills/xone-development/references/xml-ui/eventos-sistema-login-y-personalizados.md +944 -0
  150. package/skills/xone-development/references/xml-ui/layouts-herencia-y-buenas-practicas.md +618 -0
  151. package/skills/xone-development/references/xml-ui/mapas.md +685 -0
  152. package/skills/xone-development/references/xml-ui/mappings-y-colecciones-separadas.md +148 -0
  153. package/skills/xone-development/references/xml-ui/nodos-group-y-frame.md +666 -0
  154. package/skills/xone-development/references/xml-ui/patrones-de-pantalla.md +643 -0
  155. package/skills/xone-development/references/xml-ui/prop-atributos-y-condiciones.md +298 -0
  156. package/skills/xone-development/references/xml-ui/prop-tipos-basicos.md +493 -0
  157. package/skills/xone-development/references/xml-ui/prop-tipos-combos-y-controles.md +664 -0
  158. package/skills/xone-development/references/xml-ui/prop-tipos-listas-y-mapas.md +412 -0
  159. package/skills/xone-plan-builder/SKILL.md +183 -0
  160. package/skills/xone-plan-builder/agents/openai.yaml +5 -0
  161. package/skills/xone-plan-builder/references/TASKS-FORMAT.md +132 -0
  162. package/skills/xone-project-generator/SKILL.md +111 -0
  163. package/skills/xone-project-generator/references/canonical-sizes.md +292 -0
  164. package/skills/xone-project-generator/references/colecciones-base.md +16 -0
  165. package/skills/xone-project-generator/references/convenciones-de-nombres.md +16 -0
  166. package/skills/xone-project-generator/references/ejemplos-por-sector-y-prohibiciones.md +140 -0
  167. package/skills/xone-project-generator/references/fase-3-estilos-css.md +597 -0
  168. package/skills/xone-project-generator/references/fase-6-colecciones.md +762 -0
  169. package/skills/xone-project-generator/references/fase-7-asfilter-e-integraciones.md +142 -0
  170. package/skills/xone-project-generator/references/fase-7-entidades-y-estructura-de-pantalla.md +494 -0
  171. package/skills/xone-project-generator/references/fase-7-plantilla-consola.md +477 -0
  172. package/skills/xone-project-generator/references/fase-7-plantillas-de-pantalla.md +302 -0
  173. package/skills/xone-project-generator/references/fase-7-viewmodes-graficos-y-listas.md +681 -0
  174. package/skills/xone-project-generator/references/fase-7-viewmodes-mapa-y-calendario.md +479 -0
  175. package/skills/xone-project-generator/references/fases-0-2-analisis-y-modelo-de-datos.md +350 -0
  176. package/skills/xone-project-generator/references/fases-10-12-readmes-y-validacion.md +194 -0
  177. package/skills/xone-project-generator/references/fases-4-5-estructura-y-configuracion.md +587 -0
  178. package/skills/xone-project-generator/references/fases-8-9-eventos-y-javascript.md +861 -0
  179. package/skills/xone-project-generator/references/flujo-de-generacion.md +67 -0
  180. package/skills/xone-project-generator/references/plantillas-estandar.md +98 -0
  181. package/skills/xone-project-generator/references/tamanos-canonicos.md +49 -0
  182. package/skills/xone-review/SKILL.md +189 -0
  183. package/skills/xone-spec-builder/SKILL.md +235 -0
  184. package/skills/xone-spec-builder/agents/openai.yaml +5 -0
  185. package/skills/xone-spec-builder/references/ADR-FORMAT.md +55 -0
  186. package/skills/xone-spec-builder/references/CONTEXT-FORMAT.md +42 -0
  187. package/skills/xone-spec-builder/references/PLAN-FORMAT.md +120 -0
@@ -0,0 +1,129 @@
1
+ import { execFile } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ import { createHash } from "node:crypto";
4
+ import { mkdtempSync, rmSync, readFileSync, readdirSync, statSync, existsSync } from "node:fs";
5
+ import { tmpdir } from "node:os";
6
+ import { join } from "node:path";
7
+ const ejecutar = promisify(execFile);
8
+ /** Índice de git propio y temporal: ni toca el del usuario ni lo comparten dos sesiones. */
9
+ function indicePrivado() {
10
+ const dir = mkdtempSync(join(tmpdir(), "xonecode-idx-"));
11
+ return { ruta: join(dir, "git.index"), limpiar: () => rmSync(dir, { recursive: true, force: true }) };
12
+ }
13
+ const CLASE = { A: "nuevo", D: "borrado", M: "modificado", R: "modificado", C: "modificado" };
14
+ /**
15
+ * La foto por árbol de git.
16
+ *
17
+ * Tres propiedades medidas, y cada una resuelve un fallo del enfoque anterior:
18
+ *
19
+ * - **No necesita commits**: `write-tree` escribe desde el índice, HEAD no entra. El repo
20
+ * del usuario tiene cero commits y funciona igual.
21
+ * - **No necesita ser la raíz del repo**: se acota con `-- .` y las rutas del diff se
22
+ * recortan con `prefijo` (`git rev-parse --show-prefix`).
23
+ * - **No toca nada del usuario**: ni su índice, ni su staging, ni su `.gitignore`.
24
+ */
25
+ async function porArbol(raiz, prefijo) {
26
+ const escribirArbol = async () => {
27
+ const idx = indicePrivado();
28
+ try {
29
+ await ejecutar("git", ["add", "-A", "--", "."], {
30
+ cwd: raiz,
31
+ env: { ...process.env, GIT_INDEX_FILE: idx.ruta },
32
+ });
33
+ const { stdout } = await ejecutar("git", ["write-tree"], {
34
+ cwd: raiz,
35
+ env: { ...process.env, GIT_INDEX_FILE: idx.ruta },
36
+ });
37
+ return stdout.trim();
38
+ }
39
+ finally {
40
+ idx.limpiar();
41
+ }
42
+ };
43
+ const antes = await escribirArbol();
44
+ // Quita el prefijo del repo para que las rutas se lean desde el proyecto.
45
+ const recortar = (r) => (prefijo && r.startsWith(prefijo) ? r.slice(prefijo.length) : r);
46
+ return {
47
+ via: "git",
48
+ async cambios() {
49
+ const ahora = await escribirArbol();
50
+ if (ahora === antes)
51
+ return [];
52
+ const { stdout } = await ejecutar("git", ["diff-tree", "-r", "--name-status", antes, ahora, "--", "."], { cwd: raiz });
53
+ return stdout
54
+ .split("\n")
55
+ .filter((l) => l.trim())
56
+ .map((l) => {
57
+ const [estado, ...resto] = l.split("\t");
58
+ return { ruta: recortar(resto[resto.length - 1].trim()), clase: CLASE[estado[0]] ?? "modificado" };
59
+ });
60
+ },
61
+ async diff() {
62
+ const ahora = await escribirArbol();
63
+ if (ahora === antes)
64
+ return "";
65
+ const { stdout } = await ejecutar("git", ["diff", antes, ahora, "--", "."], { cwd: raiz, maxBuffer: 32 * 1024 * 1024 });
66
+ return stdout;
67
+ },
68
+ };
69
+ }
70
+ const hash = (f) => createHash("sha1").update(readFileSync(f)).digest("hex");
71
+ function huellas(raiz, base, prof = 0) {
72
+ const m = new Map();
73
+ if (prof > 6 || !existsSync(raiz))
74
+ return m;
75
+ for (const entrada of readdirSync(raiz)) {
76
+ if (entrada === "node_modules" || entrada === ".git")
77
+ continue;
78
+ const ruta = join(raiz, entrada);
79
+ try {
80
+ if (statSync(ruta).isDirectory())
81
+ for (const [k, v] of huellas(ruta, base, prof + 1))
82
+ m.set(k, v);
83
+ else
84
+ m.set(ruta.slice(base.length + 1), hash(ruta));
85
+ }
86
+ catch {
87
+ // Un enlace roto no invalida la foto del resto.
88
+ }
89
+ }
90
+ return m;
91
+ }
92
+ /** Sin git: huellas de contenido. Más lenta, y sin diff — se dice, no se disimula. */
93
+ function porHuellas(raiz) {
94
+ const antes = huellas(raiz, raiz);
95
+ return {
96
+ via: "huellas",
97
+ async cambios() {
98
+ const ahora = huellas(raiz, raiz);
99
+ const salida = [];
100
+ for (const [ruta, h] of ahora) {
101
+ const previo = antes.get(ruta);
102
+ if (previo === undefined)
103
+ salida.push({ ruta, clase: "nuevo" });
104
+ else if (previo !== h)
105
+ salida.push({ ruta, clase: "modificado" });
106
+ }
107
+ for (const ruta of antes.keys())
108
+ if (!ahora.has(ruta))
109
+ salida.push({ ruta, clase: "borrado" });
110
+ return salida.sort((a, b) => a.ruta.localeCompare(b.ruta));
111
+ },
112
+ async diff() {
113
+ return ""; // sin git no hay diff con contenido, y se declara en `via`
114
+ },
115
+ };
116
+ }
117
+ export async function tomarInstantanea(raiz, git) {
118
+ if (!git.usable)
119
+ return porHuellas(raiz);
120
+ try {
121
+ return await porArbol(raiz, git.prefijo);
122
+ }
123
+ catch {
124
+ // Git puede fallar por algo que no anticipamos (un hook, permisos). Caer a huellas
125
+ // es peor pero funciona, y `via` lo dice — nunca se finge que la foto es de git.
126
+ return porHuellas(raiz);
127
+ }
128
+ }
129
+ //# sourceMappingURL=instantanea.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instantanea.js","sourceRoot":"","sources":["../../src/agent/instantanea.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ import { collectPending, buildResume } from "../vendor/hitl.js";
2
+ import { diffDeLineas } from "../core/diff.js";
3
+ export { buildResume };
4
+ /**
5
+ * Los interrupts pendientes de un hilo, en el vocabulario de xonecode.
6
+ *
7
+ * **Se pregunta al ESTADO, no al resultado del stream.** La clave `__interrupt__` solo
8
+ * existe en la llamada que pausó; el estado sobrevive al proceso y es la fuente de verdad.
9
+ * Es la misma razón por la que se puede pausar en un proceso y aprobar desde otro.
10
+ */
11
+ export async function pendientesDe(agente, config) {
12
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
13
+ const estado = await agente.getState(config);
14
+ return collectPending(estado).map(aPendiente);
15
+ }
16
+ /**
17
+ * De la forma de deepagents a la de xonecode.
18
+ *
19
+ * El `origen` sale de la `description`, que es donde `hitlDe()` metió el nombre del perfil
20
+ * —`[dev] quiere escribir un fichero del proyecto`—: **el interrupt no dice de qué
21
+ * subagente viene**, y `dev` y `mockup` comparten `write_file`.
22
+ */
23
+ export function aPendiente(p) {
24
+ const m = /^\[([^\]]+)\]/.exec(p.description);
25
+ return {
26
+ id: p.id,
27
+ origen: m?.[1] ?? p.tool,
28
+ descripcion: p.description,
29
+ decisionesPermitidas: p.allowedDecisions,
30
+ };
31
+ }
32
+ /**
33
+ * Qué fichero se va a tocar, para poder decirlo sin enseñar los argumentos.
34
+ *
35
+ * Los argumentos NO se publican: `write_file` lleva el contenido entero. Pero aprobar a
36
+ * ciegas es peor que no aprobar, así que se extrae **solo la ruta** de la lista blanca de
37
+ * claves que la llevan.
38
+ */
39
+ export function ficheroDe(p) {
40
+ for (const clave of ["file_path", "path", "filePath", "file"]) {
41
+ const v = p.args[clave];
42
+ if (typeof v === "string" && v.length > 0)
43
+ return v;
44
+ }
45
+ return undefined;
46
+ }
47
+ /**
48
+ * La vista del cambio que pide un pendiente: el ANTES es el disco (el interrupt para
49
+ * ANTES de escribir, así que disco == antes) y el DESPUÉS sale de los argumentos.
50
+ *
51
+ * Este es el ÚNICO sitio donde el contenido sale de los argumentos, y es a propósito:
52
+ * la aprobación es el paso donde enseñar el contenido es la REGLA — aprobar a ciegas
53
+ * es peor que no aprobar. Fuera de aquí, la lista blanca de `resumenDeTool.ts` manda.
54
+ *
55
+ * `leer` entra por parámetro (en producción lee del disco; en los tests, un mapa) y
56
+ * una tool que no es de escritura, o args incompletos, no produce vista — no crash.
57
+ */
58
+ export function cambioDe(p, leer) {
59
+ const ruta = ficheroDe(p);
60
+ if (ruta === undefined)
61
+ return undefined;
62
+ if (p.tool === "write_file") {
63
+ const despues = p.args.content;
64
+ if (typeof despues !== "string")
65
+ return undefined;
66
+ return { ruta, lineas: diffDeLineas(leer(ruta), despues) };
67
+ }
68
+ if (p.tool === "edit_file") {
69
+ const viejo = p.args.old_string;
70
+ const nuevo = p.args.new_string;
71
+ if (typeof viejo !== "string" || typeof nuevo !== "string")
72
+ return undefined;
73
+ const antes = leer(ruta);
74
+ if (!antes.includes(viejo)) {
75
+ // El reemplazo no calza con lo que hay en disco: enseñar un diff fingido sería
76
+ // peor que el crudo. Las dos piezas, tal cual.
77
+ return { ruta, lineas: [...diffDeLineas(viejo, nuevo)] };
78
+ }
79
+ return { ruta, lineas: diffDeLineas(antes, antes.split(viejo).join(nuevo)) };
80
+ }
81
+ return undefined;
82
+ }
83
+ //# sourceMappingURL=interrupts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interrupts.js","sourceRoot":"","sources":["../../src/agent/interrupts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,WAAW,EAAwC,MAAM,mBAAmB,CAAC;AAEtG,OAAO,EAAE,YAAY,EAAoB,MAAM,iBAAiB,CAAC;AAEjE,OAAO,EAAE,WAAW,EAAwC,CAAC;AAE7D;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAe,EAAE,MAAe;IACjE,8DAA8D;IAC9D,MAAM,MAAM,GAAG,MAAO,MAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACtD,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AAChD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CAAC,CAAmB;IAC5C,MAAM,CAAC,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IAC9C,OAAO;QACL,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;QACxB,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,oBAAoB,EAAE,CAAC,CAAC,gBAAgB;KACzC,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CAAC,CAAmB;IAC3C,KAAK,MAAM,KAAK,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,CAAC;QAC9D,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAQD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,QAAQ,CACtB,CAAmB,EACnB,IAA8B;IAE9B,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IAC1B,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAEzC,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;QAC/B,IAAI,OAAO,OAAO,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QAClD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC;IAC7D,CAAC;IAED,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;QAChC,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;QAChC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QAC7E,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,+EAA+E;YAC/E,+CAA+C;YAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,GAAG,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;QAC3D,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;IAC/E,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,24 @@
1
+ export class Mensajes {
2
+ abierto;
3
+ cerrados = new Set();
4
+ /** `texto` vacío o `undefined` no pinta: Gemini manda trozos finales sin texto. */
5
+ trozo(id, texto) {
6
+ if (!texto)
7
+ return { pintar: false, cierraLinea: false };
8
+ if (id !== undefined && this.cerrados.has(id)) {
9
+ return { pintar: false, cierraLinea: false }; // reemisión del mensaje entero
10
+ }
11
+ const cierraLinea = this.abierto !== undefined && id !== this.abierto;
12
+ if (cierraLinea)
13
+ this.cerrados.add(this.abierto);
14
+ this.abierto = id;
15
+ return { pintar: true, cierraLinea };
16
+ }
17
+ /** Fin del turno: lo abierto se da por cerrado. */
18
+ fin() {
19
+ if (this.abierto !== undefined)
20
+ this.cerrados.add(this.abierto);
21
+ this.abierto = undefined;
22
+ }
23
+ }
24
+ //# sourceMappingURL=mensajes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mensajes.js","sourceRoot":"","sources":["../../src/agent/mensajes.ts"],"names":[],"mappings":"AAgBA,MAAM,OAAO,QAAQ;IACX,OAAO,CAAqB;IACnB,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IAE9C,mFAAmF;IACnF,KAAK,CAAC,EAAsB,EAAE,KAAyB;QACrD,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;QACzD,IAAI,EAAE,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAC9C,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,+BAA+B;QAC/E,CAAC;QACD,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,KAAK,IAAI,CAAC,OAAO,CAAC;QACtE,IAAI,WAAW;YAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,OAAQ,CAAC,CAAC;QAClD,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IACvC,CAAC;IAED,mDAAmD;IACnD,GAAG;QACD,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS;YAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChE,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;IAC3B,CAAC;CACF"}
@@ -0,0 +1,42 @@
1
+ import { ChatGoogleGenerativeAI } from "@langchain/google-genai";
2
+ import { ChatOpenAI } from "@langchain/openai";
3
+ import { ChatAnthropic } from "@langchain/anthropic";
4
+ import { ChatOllama } from "@langchain/ollama";
5
+ import { resolver } from "../core/modelos.js";
6
+ /**
7
+ * Construye el modelo de cada papel. NO lleva la marca de doble: es real.
8
+ *
9
+ * Los clientes se construyen PEREZOSAMENTE, al pedir el papel: `describe` solo llama a
10
+ * `descripcion()`, y construir cuatro clientes para imprimir un texto obligaría a tener
11
+ * las claves puestas para poder mirar la configuración — justo lo que este comando evita.
12
+ */
13
+ export class Modelos {
14
+ eleccion;
15
+ constructor(fuentes = {}) {
16
+ this.eleccion = resolver(fuentes);
17
+ }
18
+ paraPapel(papel) {
19
+ const { proveedor, modelo } = this.eleccion[papel];
20
+ switch (proveedor) {
21
+ case "openai":
22
+ return new ChatOpenAI({ model: modelo, apiKey: process.env.OPENAI_API_KEY });
23
+ case "anthropic":
24
+ return new ChatAnthropic({ model: modelo, apiKey: process.env.ANTHROPIC_API_KEY });
25
+ case "ollama":
26
+ return new ChatOllama({
27
+ model: modelo,
28
+ baseUrl: process.env.OLLAMA_BASE_URL ?? "http://localhost:11434",
29
+ });
30
+ case "gemini":
31
+ return new ChatGoogleGenerativeAI({ model: modelo, apiKey: process.env.GOOGLE_API_KEY });
32
+ }
33
+ }
34
+ descripcion() {
35
+ const salida = {};
36
+ for (const [papel, e] of Object.entries(this.eleccion)) {
37
+ salida[papel] = `${e.proveedor}/${e.modelo} (${e.origen})`;
38
+ }
39
+ return salida;
40
+ }
41
+ }
42
+ //# sourceMappingURL=modelos.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modelos.js","sourceRoot":"","sources":["../../src/agent/modelos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,EAAE,QAAQ,EAAyC,MAAM,oBAAoB,CAAC;AAErF;;;;;;GAMG;AACH,MAAM,OAAO,OAAO;IACD,QAAQ,CAA0B;IAEnD,YAAY,UAA6B,EAAE;QACzC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IAED,SAAS,CAAC,KAAY;QACpB,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACnD,QAAQ,SAAS,EAAE,CAAC;YAClB,KAAK,QAAQ;gBACX,OAAO,IAAI,UAAU,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC;YAC/E,KAAK,WAAW;gBACd,OAAO,IAAI,aAAa,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC,CAAC;YACrF,KAAK,QAAQ;gBACX,OAAO,IAAI,UAAU,CAAC;oBACpB,KAAK,EAAE,MAAM;oBACb,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,wBAAwB;iBACjE,CAAC,CAAC;YACL,KAAK,QAAQ;gBACX,OAAO,IAAI,sBAAsB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC;QAC7F,CAAC;IACH,CAAC;IAED,WAAW;QACT,MAAM,MAAM,GAAG,EAA2B,CAAC;QAC3C,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAwB,EAAE,CAAC;YAC9E,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC;QAC9D,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
@@ -0,0 +1,20 @@
1
+ export function normalizar(chunk) {
2
+ if (!Array.isArray(chunk))
3
+ return null;
4
+ // [namespace, modo, dato] — con subgraphs: true
5
+ if (chunk.length === 3) {
6
+ const [ns, modo, dato] = chunk;
7
+ if (!Array.isArray(ns) || typeof modo !== "string")
8
+ return null;
9
+ return { ns: ns.map(String), modo, dato };
10
+ }
11
+ // [modo, dato] — sin subgraphs
12
+ if (chunk.length === 2) {
13
+ const [modo, dato] = chunk;
14
+ if (typeof modo !== "string")
15
+ return null;
16
+ return { ns: [], modo, dato };
17
+ }
18
+ return null;
19
+ }
20
+ //# sourceMappingURL=normalizar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalizar.js","sourceRoot":"","sources":["../../src/agent/normalizar.ts"],"names":[],"mappings":"AAeA,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEvC,gDAAgD;IAChD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,KAAoC,CAAC;QAC9D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAChE,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC5C,CAAC;IAED,+BAA+B;IAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,KAA2B,CAAC;QACjD,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC1C,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAChC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,103 @@
1
+ /** Las tools de fichero que monta deepagents sobre el backend. */
2
+ export const TOOLS_LECTURA = ["ls", "read_file", "glob", "grep"];
3
+ export const TOOLS_ESCRITURA = ["write_file", "edit_file"];
4
+ export const PERFILES = {
5
+ docs: {
6
+ nombre: "docs",
7
+ descripcion: "Responde preguntas técnicas de la plataforma XOne (XML/.xne, JavaScript, CSS, " +
8
+ "eventos, patrones). Puede leer el proyecto para no contradecir el código real. " +
9
+ "No modifica nada.",
10
+ soloLectura: true,
11
+ skills: ["xone-development"],
12
+ },
13
+ planner: {
14
+ nombre: "planner",
15
+ descripcion: "Inspecciona el proyecto real para anclar planes y diagnósticos: estructura, " +
16
+ "colecciones y búsqueda de código. No modifica nada.",
17
+ soloLectura: true,
18
+ skills: ["xone-spec-builder", "xone-plan-builder"],
19
+ },
20
+ dev: {
21
+ nombre: "dev",
22
+ descripcion: "Desarrolla: crea y modifica colecciones, escribe scripts y edita ficheros. " +
23
+ "Las modificaciones requieren aprobación humana.",
24
+ soloLectura: false,
25
+ skills: ["xone-development", "xone-debugging"],
26
+ },
27
+ mockup: {
28
+ nombre: "mockup",
29
+ descripcion: "Trabajo visual: layouts, CSS y recursos. Las modificaciones requieren " +
30
+ "aprobación humana.",
31
+ soloLectura: false,
32
+ skills: ["xone-development"],
33
+ },
34
+ };
35
+ /** Lo que estructuralmente da igual quién seas: nunca se lee ni se escribe. */
36
+ export const DENEGADO_SIEMPRE = [
37
+ {
38
+ operations: ["read", "write"],
39
+ paths: ["/.env", "/.env.*", "/.git", "/.git/**", "/.xonecode", "/.xonecode/**"],
40
+ mode: "deny",
41
+ },
42
+ ];
43
+ /**
44
+ * Los permisos de un perfil. **Nunca los escribas a mano.**
45
+ *
46
+ * `SubAgent.permissions` REEMPLAZA los del padre, no los fusiona. Así que cada perfil que
47
+ * declare permisos propios tiene que traerse las denegaciones base consigo o las pierde —
48
+ * y perder la de `.env` significa que un especialista «de solo lectura» puede leer las
49
+ * claves del usuario. Esta función es lo único que evita ese olvido.
50
+ */
51
+ export function permisosDe(perfil) {
52
+ const base = [...DENEGADO_SIEMPRE];
53
+ if (!perfil.soloLectura)
54
+ return base;
55
+ return [...base, { operations: ["write"], paths: ["/**"], mode: "deny" }];
56
+ }
57
+ /**
58
+ * Las tools de fichero que le corresponden a un perfil.
59
+ *
60
+ * **No se le pasa a `SubAgent.tools`**: ese campo es `StructuredTool[]` —objetos, para
61
+ * tools propias— y darle nombres deja al especialista sin capacidades. Las de fichero las
62
+ * monta el `FilesystemMiddleware` desde el backend, y el solo-lectura se impone con
63
+ * `permisosDe()`, que la librería aplica sobre las seis.
64
+ *
65
+ * Esta función se conserva porque describe la intención y la comprueban los tests. El día
66
+ * que se quiera OCULTAR las de escritura (en vez de denegarlas), el sitio es la opción
67
+ * `tools` del `FilesystemMiddleware` — y ahí `read_file` es obligatorio en la lista.
68
+ */
69
+ export function toolsDe(perfil) {
70
+ return perfil.soloLectura
71
+ ? [...TOOLS_LECTURA]
72
+ : [...TOOLS_LECTURA, ...TOOLS_ESCRITURA];
73
+ }
74
+ /** Texto de la petición de aprobación, por tool. */
75
+ const TEXTO_HITL = {
76
+ write_file: "escribir un fichero del proyecto",
77
+ edit_file: "modificar un fichero del proyecto",
78
+ };
79
+ /**
80
+ * El HITL de un perfil: **sobre las tools de FICHERO**, no sobre las de MCP.
81
+ *
82
+ * Con MCP las escrituras iban a CloudStudio y el disco local estaba denegado entero; ahora
83
+ * las escrituras SON el mecanismo. Si esto no se mueve, la aprobación humana desaparece en
84
+ * silencio y la promesa de que «las escrituras se aprueban» se queda escrita y falsa.
85
+ *
86
+ * `edit` no se ofrece como decisión: no hay interfaz para editar los argumentos antes de
87
+ * aprobar, así que anunciarla sería mentirle al modelo.
88
+ */
89
+ export function hitlDe(perfil) {
90
+ if (perfil.soloLectura)
91
+ return {};
92
+ const salida = {};
93
+ for (const tool of TOOLS_ESCRITURA) {
94
+ salida[tool] = {
95
+ allowedDecisions: ["approve", "reject"],
96
+ // El nombre del perfil va DENTRO de la descripción por necesidad: el interrupt que
97
+ // llega al runner no dice de qué subagente viene, y `dev` y `mockup` comparten tools.
98
+ description: `[${perfil.nombre}] quiere ${TEXTO_HITL[tool] ?? tool}`,
99
+ };
100
+ }
101
+ return salida;
102
+ }
103
+ //# sourceMappingURL=perfiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"perfiles.js","sourceRoot":"","sources":["../../src/agent/perfiles.ts"],"names":[],"mappings":"AAQA,kEAAkE;AAClE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,CAAU,CAAC;AAC1E,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,YAAY,EAAE,WAAW,CAAU,CAAC;AAWpE,MAAM,CAAC,MAAM,QAAQ,GAAiC;IACpD,IAAI,EAAE;QACJ,MAAM,EAAE,MAAM;QACd,WAAW,EACT,gFAAgF;YAChF,iFAAiF;YACjF,mBAAmB;QACrB,WAAW,EAAE,IAAI;QACjB,MAAM,EAAE,CAAC,kBAAkB,CAAC;KAC7B;IACD,OAAO,EAAE;QACP,MAAM,EAAE,SAAS;QACjB,WAAW,EACT,8EAA8E;YAC9E,qDAAqD;QACvD,WAAW,EAAE,IAAI;QACjB,MAAM,EAAE,CAAC,mBAAmB,EAAE,mBAAmB,CAAC;KACnD;IACD,GAAG,EAAE;QACH,MAAM,EAAE,KAAK;QACb,WAAW,EACT,6EAA6E;YAC7E,iDAAiD;QACnD,WAAW,EAAE,KAAK;QAClB,MAAM,EAAE,CAAC,kBAAkB,EAAE,gBAAgB,CAAC;KAC/C;IACD,MAAM,EAAE;QACN,MAAM,EAAE,QAAQ;QAChB,WAAW,EACT,wEAAwE;YACxE,oBAAoB;QACtB,WAAW,EAAE,KAAK;QAClB,MAAM,EAAE,CAAC,kBAAkB,CAAC;KAC7B;CACF,CAAC;AAEF,+EAA+E;AAC/E,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B;QACE,UAAU,EAAE,CAAC,MAAM,EAAE,OAAO,CAAU;QACtC,KAAK,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,eAAe,CAAC;QAC/E,IAAI,EAAE,MAAe;KACtB;CACF,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,MAAM,IAAI,GAAG,CAAC,GAAG,gBAAgB,CAAC,CAAC;IACnC,IAAI,CAAC,MAAM,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IACrC,OAAO,CAAC,GAAG,IAAI,EAAE,EAAE,UAAU,EAAE,CAAC,OAAO,CAAU,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,CAAC,CAAC;AAC9F,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,OAAO,CAAC,MAAc;IACpC,OAAO,MAAM,CAAC,WAAW;QACvB,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC;QACpB,CAAC,CAAC,CAAC,GAAG,aAAa,EAAE,GAAG,eAAe,CAAC,CAAC;AAC7C,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,GAA2B;IACzC,UAAU,EAAE,kCAAkC;IAC9C,SAAS,EAAE,mCAAmC;CAC/C,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,UAAU,MAAM,CAAC,MAAc;IACnC,IAAI,MAAM,CAAC,WAAW;QAAE,OAAO,EAAE,CAAC;IAClC,MAAM,MAAM,GAAwE,EAAE,CAAC;IACvF,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,GAAG;YACb,gBAAgB,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC;YACvC,mFAAmF;YACnF,sFAAsF;YACtF,WAAW,EAAE,IAAI,MAAM,CAAC,MAAM,YAAY,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE;SACrE,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,107 @@
1
+ import { FilesystemBackend } from "deepagents";
2
+ /**
3
+ * El backend del proyecto: confinado, y sin las vistas aplanadas.
4
+ *
5
+ * **`virtualMode: true` no es configurable.** Medido contra deepagents 1.12.0: con el
6
+ * default (`false`) el backend LEYÓ una ruta absoluta de fuera de la raíz. La propia
7
+ * librería lo dice de su default — «absolute paths and `..` can bypass rootDir».
8
+ *
9
+ * Y nada de `LocalShellBackend`: la librería avisa de que `virtualMode` **no restringe los
10
+ * comandos de shell**. El simulador lo invoca el código de xonecode, no el modelo.
11
+ */
12
+ export function backendDelProyecto(raiz) {
13
+ return new FilesystemBackend({ rootDir: raiz, virtualMode: true });
14
+ }
15
+ /** ¿Es `ruta` una vista aplanada, teniendo a la vista el conjunto de ficheros del proyecto? */
16
+ export function esVistaAplanada(ruta, todas) {
17
+ return ruta.endsWith(".xml") && todas.has(`${ruta.slice(0, -4)}.xne`);
18
+ }
19
+ /**
20
+ * El mensaje con el que se rechaza tocar una vista aplanada.
21
+ *
22
+ * **Rechazar y explicar, no fallar en seco.** Un «fichero no encontrado» hace que el modelo
23
+ * pruebe otra ruta, o peor, que dé por hecho que el cambio no hacía falta. Diciéndole dónde
24
+ * está la fuente, corrige a la primera.
25
+ */
26
+ export const porQueNo = (ruta) => `«${ruta}» es una vista APLANADA que genera XOne Studio a partir de «${ruta.slice(0, -4)}.xne». ` +
27
+ `No se lee ni se edita: los cambios se hacen en el .xne y Studio regenera esta. ` +
28
+ `Abre «${ruta.slice(0, -4)}.xne».`;
29
+ /**
30
+ * Envuelve un backend para que las vistas aplanadas no existan para el agente.
31
+ *
32
+ * **Por qué no basta con decirlo en el prompt.** La regla ya vivía ahí en el harness
33
+ * anterior, solo en el del ejecutor, y falló por donde tenía que fallar: *un permiso solo
34
+ * protege a quien lo choca*. El planner planificaba sobre el `.xml` y el juez exigía el
35
+ * cambio ahí — ninguno de los dos podía conocer una regla que vivía en otro prompt.
36
+ * Retirarlas del backend la convierte en una propiedad del PROYECTO, no de un prompt.
37
+ *
38
+ * **Se ocultan, no se borran.** El disco es del usuario. (El harness con MCP sí las
39
+ * borraba de su copia, pero aquella copia era suya y se tiraba al final.)
40
+ *
41
+ * `app.xml` no tiene hermano `.xne`, así que el propio predicado lo conserva: es fuente.
42
+ */
43
+ export function sinVistasAplanadas(backend, todas) {
44
+ const guarda = (ruta) => {
45
+ if (typeof ruta === "string" && esVistaAplanada(ruta, todas))
46
+ throw new Error(porQueNo(ruta));
47
+ };
48
+ return new Proxy(backend, {
49
+ get(destino, prop, receptor) {
50
+ const valor = Reflect.get(destino, prop, receptor);
51
+ if (typeof valor !== "function")
52
+ return valor;
53
+ // Las que reciben una ruta y la tocan: se rechazan con explicación.
54
+ if (prop === "read" || prop === "readRaw" || prop === "write" || prop === "edit" || prop === "delete") {
55
+ // `async` a propósito, y no una función normal que lanza. Los métodos del backend
56
+ // real son asíncronos, así que un `throw` SÍNCRONO aquí cambia el contrato de la
57
+ // llamada: quien haga `backend.read(x).catch(...)` se comería la excepción antes
58
+ // de tener una promesa que rechazar. Con `async`, el rechazo llega por donde el
59
+ // llamador lo espera.
60
+ return async (...args) => {
61
+ guarda(args[0]);
62
+ return valor.apply(destino, args);
63
+ };
64
+ }
65
+ // Las que LISTAN: se filtra el resultado, para que ni aparezcan.
66
+ if (prop === "ls" || prop === "grep") {
67
+ return async (...args) => {
68
+ const r = await valor.apply(destino, args);
69
+ return filtrarResultado(r, todas);
70
+ };
71
+ }
72
+ return valor.bind(destino);
73
+ },
74
+ });
75
+ }
76
+ /**
77
+ * Quita las vistas aplanadas de lo que devuelve un `ls`/`grep`.
78
+ *
79
+ * La forma del resultado varía entre versiones de la librería, así que se filtra lo que se
80
+ * reconoce y lo que no se deja pasar TAL CUAL: perder resultados en silencio sería peor que
81
+ * enseñar un `.xml` de más, y esto no es la barrera —la barrera es la guarda de arriba—.
82
+ */
83
+ function filtrarResultado(r, todas) {
84
+ const quita = (v) => typeof v === "string" && esVistaAplanada(v, todas);
85
+ if (Array.isArray(r))
86
+ return r.filter((v) => !quita(v));
87
+ if (r && typeof r === "object") {
88
+ const o = r;
89
+ const salida = { ...o };
90
+ for (const clave of ["files", "matches", "paths", "results", "entries"]) {
91
+ if (Array.isArray(o[clave])) {
92
+ salida[clave] = o[clave].filter((v) => {
93
+ if (quita(v))
94
+ return false;
95
+ if (v && typeof v === "object") {
96
+ const f = v.file ?? v.path;
97
+ return !quita(f);
98
+ }
99
+ return true;
100
+ });
101
+ }
102
+ }
103
+ return salida;
104
+ }
105
+ return r;
106
+ }
107
+ //# sourceMappingURL=proyecto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proyecto.js","sourceRoot":"","sources":["../../src/agent/proyecto.ts"],"names":[],"mappings":"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"}