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,346 @@
1
+ /**
2
+ * El lazo de la consola interactiva y los comandos de barra.
3
+ *
4
+ * La regla que gobierna este fichero: una consola no llama a `input()` ni imprime por su
5
+ * cuenta. `correrConsola` recibe de dónde leer (`consola.lineas`) y a dónde escribir
6
+ * (`consola.escribir`) — en producción stdin y el `escribir` con flush; en los tests, una
7
+ * lista de líneas y un acumulador. Sin esa costura la consola no se puede probar.
8
+ */
9
+ import { randomUUID } from "node:crypto";
10
+ import { homedir } from "node:os";
11
+ import { join } from "node:path";
12
+ import { cmdConfig } from "./config.js";
13
+ import { cmdDescribe } from "./describe.js";
14
+ import { cmdDoctor } from "./doctor.js";
15
+ import { cmdVerify } from "./verify.js";
16
+ import { AgenteGuionizado } from "../agent/guionizado.js";
17
+ import { correrTurno } from "../core/turno.js";
18
+ import { PAPELES, POR_OMISION, ModeloMalEscrito, parsear, PROVEEDORES } from "../core/modelos.js";
19
+ import { esDoble } from "../core/ports.js";
20
+ import { crearPielStdio } from "./stdio.js";
21
+ import { guardarCredencial, AuthRotoEnDisco } from "../agent/authEnDisco.js";
22
+ import { cargar, NOMBRE_CARPETA } from "../agent/configEnDisco.js";
23
+ /**
24
+ * Duplicado a propósito de `cli/config.ts` (que a su vez lo duplica de
25
+ * `agent/configEnDisco.ts`, no exportado y no tocable): misma regla y misma
26
+ * omisión — `ollama` no lleva variable porque no necesita credencial.
27
+ */
28
+ const VARIABLE_POR_PROVEEDOR = {
29
+ anthropic: "ANTHROPIC_API_KEY",
30
+ openai: "OPENAI_API_KEY",
31
+ gemini: "GOOGLE_API_KEY",
32
+ };
33
+ /**
34
+ * Un turno con `AgenteGuionizado`, igual que el `cmdRun` sin `--real`.
35
+ *
36
+ * Es el valor por omisión de `correrConsola`: mantiene el invariante de fase 1 (todo corre
37
+ * sin API y sin red). El cableado del agente REAL va en otra tarea y se inyecta como
38
+ * tercer parámetro, mismo patrón que `cmdVerify(ruta, escribir, verificador = ...)`.
39
+ */
40
+ export async function ejecutarTurnoGuionizado(peticion, _estado, consola) {
41
+ const agente = new AgenteGuionizado();
42
+ const piel = crearPielStdio(consola.escribir);
43
+ if (esDoble(agente)) {
44
+ consola.escribir("⚠ AGENTE DE PEGA: esto es un guion, no ha corrido ningún modelo.\n\n");
45
+ }
46
+ await correrTurno(agente.turno(peticion), piel, {
47
+ avisos: (b) => (b.corrio("verify") && esDoble(agente) ? ["⚠ El veredicto es de pega."] : []),
48
+ });
49
+ }
50
+ /** El nombre del tipo de error y su mensaje: «ModeloMalEscrito: ...» no cuenta lo mismo que «Error: ...». */
51
+ function describirError(e) {
52
+ if (e instanceof Error)
53
+ return `${e.constructor.name}: ${e.message}`;
54
+ return String(e);
55
+ }
56
+ /**
57
+ * Ruta de `auth.json` en el mismo momento de la llamada (no cacheada en un módulo, por lo
58
+ * mismo que `rutaAuth` tampoco lo hace) y SIN importar la función del writer: `provider`
59
+ * solo necesita NOMBRAR la ruta, nunca leerla.
60
+ */
61
+ function rutaAuthParaAviso() {
62
+ return join(homedir(), NOMBRE_CARPETA, "auth.json");
63
+ }
64
+ /**
65
+ * El `completer` de readline (ver docs de node:readline: firma síncrona
66
+ * `(line: string) => [string[], string]`). Dos mundos:
67
+ *
68
+ * - Una línea que empieza por «/» propone SIEMPRE desde `COMANDOS`, nunca de una lista
69
+ * aparte. Con un único candidato, se completa. Con varios, se listan con su
70
+ * descripción (readline por sí solo no la pinta) usando `escribir`.
71
+ * - Una línea en prosa no completa nada… salvo tras una «@»: entonces propone
72
+ * FICHEROS del proyecto. Los ficheros entran por FUNCIÓN porque el completer se
73
+ * construye una vez al arrancar y los ficheros cambian durante la sesión. Los
74
+ * candidatos son líneas COMPLETAS (mismo pacto que con «/prov» → /provider): readline
75
+ * sustituye la línea entera por el candidato y completa al prefijo común solo.
76
+ *
77
+ * Fuera de eso, no molesta: en medio de una petición en prosa, un completer que
78
+ * sugiriera siempre sería un estorbo.
79
+ */
80
+ const TOPE_DE_PILDORAS = 8;
81
+ export function crearCompleter(escribir, ficherosDelProyecto = () => new Set()) {
82
+ return (linea) => {
83
+ if (!linea.startsWith("/")) {
84
+ const arroba = linea.lastIndexOf("@");
85
+ if (arroba === -1)
86
+ return [[], linea];
87
+ const prefijo = linea.slice(arroba + 1);
88
+ const base = linea.slice(0, arroba + 1);
89
+ // La barra inicial es el convenio del espacio virtual del backend, no algo que el
90
+ // usuario deba teclear: se ofrece la ruta RELATIVA.
91
+ const ficheros = [...ficherosDelProyecto()]
92
+ .map((f) => (f.startsWith("/") ? f.slice(1) : f))
93
+ .filter((f) => f.startsWith(prefijo))
94
+ .sort()
95
+ .map((f) => base + f);
96
+ if (ficheros.length === 0)
97
+ return [[], linea];
98
+ if (ficheros.length > 1) {
99
+ escribir("\n");
100
+ const visibles = ficheros.slice(0, TOPE_DE_PILDORAS);
101
+ escribir(` ${visibles.map((f) => f.slice(base.length)).join(" ")}\n`);
102
+ const restantes = ficheros.length - visibles.length;
103
+ if (restantes > 0)
104
+ escribir(` … y ${restantes} más\n`);
105
+ }
106
+ return [ficheros, linea];
107
+ }
108
+ const prefijo = linea.slice(1).toLowerCase();
109
+ const candidatos = Object.keys(COMANDOS)
110
+ .filter((n) => n.startsWith(prefijo))
111
+ .map((n) => `/${n}`);
112
+ if (candidatos.length > 1) {
113
+ escribir("\n");
114
+ for (const c of candidatos) {
115
+ const nombre = c.slice(1);
116
+ escribir(` ${c.padEnd(20)} ${COMANDOS[nombre].descripcion}\n`);
117
+ }
118
+ }
119
+ return [candidatos, linea];
120
+ };
121
+ }
122
+ /**
123
+ * La maquinaria común de los cuatro comandos de modelo: validación con `parsear` y cambio
124
+ * del modelo EN CALIENTE. `papel === undefined` fija los TRES papeles (la bandera);
125
+ * en otro caso fija uno, que gana sobre la bandera.
126
+ *
127
+ * El estado solo cambia con un modelo VÁLIDO: un fallo de tecleo no puede dejar la sesión
128
+ * apuntando a algo que revienta al construir el cliente.
129
+ */
130
+ function manejadorDeModelo(papel) {
131
+ const nombre = papel === undefined ? "/modelo" : `/modelo-${papel}`;
132
+ return async (args, estado, consola) => {
133
+ const valor = args[0];
134
+ if (!valor) {
135
+ consola.escribir(`uso: ${nombre} <proveedor>/<modelo> — proveedores: ${PROVEEDORES.join(", ")}\n`);
136
+ return { seguir: true };
137
+ }
138
+ try {
139
+ parsear(valor);
140
+ }
141
+ catch (e) {
142
+ // El mensaje del error ya lista los proveedores válidos: se reusa, no se reescribe.
143
+ if (!(e instanceof ModeloMalEscrito))
144
+ throw e;
145
+ consola.escribir(`${e.message}\n`);
146
+ return { seguir: true };
147
+ }
148
+ const fuentes = papel === undefined
149
+ ? { ...estado.fuentes, bandera: valor }
150
+ : { ...estado.fuentes, porPapel: { ...estado.fuentes.porPapel, [papel]: valor } };
151
+ consola.escribir(papel === undefined ? `modelo (los tres papeles): ${valor}\n` : `modelo ${papel}: ${valor}\n`);
152
+ return { seguir: true, estado: { ...estado, fuentes } };
153
+ };
154
+ }
155
+ export const COMANDOS = {
156
+ ayuda: {
157
+ descripcion: "lista los comandos de barra",
158
+ // Se genera RECORRIENDO COMANDOS: una lista escrita a mano se queda vieja en cuanto
159
+ // alguien añade un comando. La auto-referencia es segura porque esto corre en runtime.
160
+ manejador: async (_args, _estado, consola) => {
161
+ consola.escribir("comandos:\n");
162
+ for (const [nombre, c] of Object.entries(COMANDOS)) {
163
+ consola.escribir(` /${nombre.padEnd(16)} ${c.descripcion}\n`);
164
+ }
165
+ return { seguir: true };
166
+ },
167
+ },
168
+ config: {
169
+ descripcion: "config y credenciales, sin claves — como `xonecode config`",
170
+ manejador: async (_args, estado, consola) => {
171
+ cmdConfig(estado.fuentes, {}, consola.escribir, estado.raiz);
172
+ return { seguir: true };
173
+ },
174
+ },
175
+ describe: {
176
+ descripcion: "qué hay montado y qué es de pega — como `xonecode describe`",
177
+ manejador: async (_args, estado, consola) => {
178
+ cmdDescribe(estado.fuentes, consola.escribir, estado.raiz);
179
+ return { seguir: true };
180
+ },
181
+ },
182
+ doctor: {
183
+ descripcion: "¿hay proyecto aquí? ¿responde el simulador? — como `xonecode doctor`",
184
+ manejador: async (_args, _estado, consola) => {
185
+ // Firma real de cmdDoctor: pregunta por `process.cwd()`, no por `estado.raiz` — es lo
186
+ // que un diagnóstico de entorno debe hacer, así que no se le pasa la raíz de sesión.
187
+ await cmdDoctor(consola.escribir);
188
+ return { seguir: true };
189
+ },
190
+ },
191
+ verify: {
192
+ descripcion: "valida el proyecto con el simulador — como `xonecode verify`",
193
+ manejador: async (_args, estado, consola) => {
194
+ await cmdVerify(estado.raiz, consola.escribir);
195
+ return { seguir: true };
196
+ },
197
+ },
198
+ modelo: {
199
+ descripcion: "cambia los TRES papeles en caliente: /modelo <proveedor>/<modelo>",
200
+ manejador: manejadorDeModelo(undefined),
201
+ },
202
+ "modelo-rapido": {
203
+ descripcion: "cambia el papel `rapido` en caliente: /modelo-rapido <proveedor>/<modelo>",
204
+ manejador: manejadorDeModelo("rapido"),
205
+ },
206
+ "modelo-trabajo": {
207
+ descripcion: "cambia el papel `trabajo` en caliente: /modelo-trabajo <proveedor>/<modelo>",
208
+ manejador: manejadorDeModelo("trabajo"),
209
+ },
210
+ "modelo-afilado": {
211
+ descripcion: "cambia el papel `afilado` en caliente: /modelo-afilado <proveedor>/<modelo>",
212
+ manejador: manejadorDeModelo("afilado"),
213
+ },
214
+ hilo: {
215
+ descripcion: "muestra el hilo (thread_id) de esta sesión",
216
+ manejador: async (_args, estado, consola) => {
217
+ consola.escribir(`${estado.hilo}\n`);
218
+ return { seguir: true };
219
+ },
220
+ },
221
+ nuevo: {
222
+ descripcion: "abre un hilo nuevo sin salir de la sesión",
223
+ manejador: async (_args, estado, consola) => {
224
+ // Mismo patrón que run.ts: prefijo xonecode- + uuid.
225
+ const nuevoHilo = `xonecode-${randomUUID()}`;
226
+ consola.escribir(`hilo nuevo: ${nuevoHilo}\n`);
227
+ return { seguir: true, estado: { ...estado, hilo: nuevoHilo } };
228
+ },
229
+ },
230
+ provider: {
231
+ descripcion: "lista credenciales o guarda una: /provider [proveedor]",
232
+ manejador: async (args, estado, consola) => {
233
+ const nombre = args[0];
234
+ if (!nombre) {
235
+ // El entorno gana sobre auth.json (aplicarAuth no pisa una variable que ya
236
+ // existía): mismo orden de mirón que cmdConfig — primero env, luego disco.
237
+ const cargado = cargar(estado.raiz);
238
+ for (const p of PROVEEDORES) {
239
+ const variable = VARIABLE_POR_PROVEEDOR[p];
240
+ const enEntorno = variable !== undefined && process.env[variable] !== undefined;
241
+ const enAuth = !enEntorno && cargado.auth[p] !== undefined;
242
+ // ollama no se marca «sin credencial»: no la necesita, no le falta nada.
243
+ const estadoClave = variable === undefined
244
+ ? "no necesita credencial"
245
+ : enEntorno || enAuth
246
+ ? "✓ puesta"
247
+ : "· sin credencial";
248
+ consola.escribir(` ${p} ${estadoClave}\n`);
249
+ }
250
+ consola.escribir("--- modelos por omisión ---\n");
251
+ for (const p of PROVEEDORES) {
252
+ const papeles = PAPELES.filter((papel) => POR_OMISION[papel].proveedor === p);
253
+ if (papeles.length > 0) {
254
+ consola.escribir(` ${p}: ${papeles.map((papel) => `${papel}=${POR_OMISION[papel].modelo}`).join(", ")}\n`);
255
+ }
256
+ }
257
+ return { seguir: true };
258
+ }
259
+ if (!PROVEEDORES.includes(nombre)) {
260
+ consola.escribir(`proveedor «${nombre}» desconocido. Los que hay: ${PROVEEDORES.join(", ")}\n`);
261
+ return { seguir: true };
262
+ }
263
+ if (!consola.interactivo) {
264
+ // Sin TTY no hay eco-off posible: la clave tecleada quedaría en el scrollback.
265
+ consola.escribir(`sin TTY no se puede leer la clave sin eco; edita ${rutaAuthParaAviso()} a mano\n`);
266
+ return { seguir: true };
267
+ }
268
+ const clave = (await consola.leerSecreto(`clave de ${nombre}: `)).trim();
269
+ if (clave === "") {
270
+ consola.escribir("clave vacía: no se guardó nada\n");
271
+ return { seguir: true };
272
+ }
273
+ try {
274
+ const { ruta, avisos } = guardarCredencial(nombre, clave);
275
+ consola.escribir(`credencial de ${nombre} guardada en ${ruta}\n`);
276
+ for (const a of avisos) {
277
+ consola.escribir(` ${a.severidad === "grave" ? "⚠" : "·"} ${a.texto}\n`);
278
+ }
279
+ }
280
+ catch (e) {
281
+ // AuthRotoEnDisco no se relanza: su mensaje ya dice que no se sobrescribió y hay
282
+ // que editar a mano — el catch genérico de correrConsola no diría eso.
283
+ if (!(e instanceof AuthRotoEnDisco))
284
+ throw e;
285
+ consola.escribir(`${e.message}\n`);
286
+ }
287
+ return { seguir: true };
288
+ },
289
+ },
290
+ salir: {
291
+ descripcion: "termina la sesión",
292
+ manejador: async (_args, _estado, consola) => {
293
+ consola.escribir("hasta luego.\n");
294
+ return { seguir: false };
295
+ },
296
+ },
297
+ };
298
+ /**
299
+ * El lazo: una línea, una acción, y a la siguiente.
300
+ *
301
+ * Tres cosas NO tumban la sesión: un comando de barra que lanza, un turno que lanza y un
302
+ * comando desconocido (que jamás se manda al modelo). El hilo vive en el checkpointer, así
303
+ * que lo que falle en un turno lo pierde ese turno, no la sesión.
304
+ */
305
+ export async function correrConsola(consola, estado, ejecutarTurno = ejecutarTurnoGuionizado) {
306
+ for await (const cruda of consola.lineas) {
307
+ const linea = cruda.trim();
308
+ // Un Enter de más no gasta ni una llamada al modelo ni un error: no hay nada que hacer.
309
+ if (linea === "")
310
+ continue;
311
+ if (linea.startsWith("/")) {
312
+ // El comando se compara en minúsculas; los args respetan lo tecleado (p.ej. un id
313
+ // de Ollama con mayúsculas tiene que llegar entero a `parsear`).
314
+ const trozos = linea.split(/\s+/);
315
+ const comando = trozos[0].slice(1).toLowerCase();
316
+ const args = trozos.slice(1);
317
+ const entrada = COMANDOS[comando];
318
+ if (!entrada) {
319
+ consola.escribir(`comando desconocido: /${comando} (usa /ayuda)\n`);
320
+ continue;
321
+ }
322
+ try {
323
+ const resultado = await entrada.manejador(args, estado, consola);
324
+ if (!resultado.seguir)
325
+ return 0;
326
+ // El estado MÁS RECIENTE manda: el turno siguiente parte de lo que devolvió el
327
+ // último manejador, no del estado de arranque.
328
+ if (resultado.estado !== undefined)
329
+ estado = resultado.estado;
330
+ }
331
+ catch (e) {
332
+ consola.escribir(`${describirError(e)}\n`);
333
+ }
334
+ continue;
335
+ }
336
+ try {
337
+ await ejecutarTurno(linea, estado, consola);
338
+ }
339
+ catch (e) {
340
+ consola.escribir(`${describirError(e)}\n`);
341
+ }
342
+ }
343
+ // EOF: la misma salida que /salir — un pipe que se cierra no es un error.
344
+ return 0;
345
+ }
346
+ //# sourceMappingURL=consola.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consola.js","sourceRoot":"","sources":["../../src/cli/consola.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,OAAO,EAAE,WAAW,EAA0C,MAAM,oBAAoB,CAAC;AAG1I,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAiB,MAAM,YAAY,CAAC;AAE3D,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC7E,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAqCnE;;;;GAIG;AACH,MAAM,sBAAsB,GAAuC;IACjE,SAAS,EAAE,mBAAmB;IAC9B,MAAM,EAAE,gBAAgB;IACxB,MAAM,EAAE,gBAAgB;CACzB,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,QAAgB,EAChB,OAAuB,EACvB,OAAgB;IAEhB,MAAM,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;IACtC,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAE9C,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACpB,OAAO,CAAC,QAAQ,CAAC,uEAAuE,CAAC,CAAC;IAC5F,CAAC;IAED,MAAM,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE;QAC9C,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9F,CAAC,CAAC;AACL,CAAC;AAED,6GAA6G;AAC7G,SAAS,cAAc,CAAC,CAAU;IAChC,IAAI,CAAC,YAAY,KAAK;QAAE,OAAO,GAAG,CAAC,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;IACrE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;AACnB,CAAC;AAED;;;;GAIG;AACH,SAAS,iBAAiB;IACxB,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC;AACtD,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAE3B,MAAM,UAAU,cAAc,CAC5B,QAAkB,EAClB,sBAAiD,GAAG,EAAE,CAAC,IAAI,GAAG,EAAE;IAEhE,OAAO,CAAC,KAAa,EAAE,EAAE;QACvB,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YACtC,IAAI,MAAM,KAAK,CAAC,CAAC;gBAAE,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YACtC,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACxC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;YACxC,kFAAkF;YAClF,oDAAoD;YACpD,MAAM,QAAQ,GAAG,CAAC,GAAG,mBAAmB,EAAE,CAAC;iBACxC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;iBAChD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;iBACpC,IAAI,EAAE;iBACN,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;YACxB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YAC9C,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACf,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;gBACrD,QAAQ,CAAC,KAAK,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACzE,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;gBACpD,IAAI,SAAS,GAAG,CAAC;oBAAE,QAAQ,CAAC,SAAS,SAAS,QAAQ,CAAC,CAAC;YAC1D,CAAC;YACD,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC3B,CAAC;QACD,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7C,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;aACrC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;aACpC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvB,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,QAAQ,CAAC,IAAI,CAAC,CAAC;YACf,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;gBAC3B,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC1B,QAAQ,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,QAAQ,CAAC,MAAM,CAAE,CAAC,WAAW,IAAI,CAAC,CAAC;YACpE,CAAC;QACH,CAAC;QACD,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,iBAAiB,CAAC,KAAwB;IACjD,MAAM,MAAM,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,KAAK,EAAE,CAAC;IACpE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,QAAQ,CACd,QAAQ,MAAM,wCAAwC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CACjF,CAAC;YACF,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAC1B,CAAC;QACD,IAAI,CAAC;YACH,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,oFAAoF;YACpF,IAAI,CAAC,CAAC,CAAC,YAAY,gBAAgB,CAAC;gBAAE,MAAM,CAAC,CAAC;YAC9C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC;YACnC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAC1B,CAAC;QACD,MAAM,OAAO,GACX,KAAK,KAAK,SAAS;YACjB,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE;YACvC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QACtF,OAAO,CAAC,QAAQ,CACd,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,8BAA8B,KAAK,IAAI,CAAC,CAAC,CAAC,UAAU,KAAK,KAAK,KAAK,IAAI,CAC9F,CAAC;QACF,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;IAC1D,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,QAAQ,GAAyE;IAC5F,KAAK,EAAE;QACL,WAAW,EAAE,6BAA6B;QAC1C,oFAAoF;QACpF,uFAAuF;QACvF,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;YAC3C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;YAChC,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACnD,OAAO,CAAC,QAAQ,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC;YAClE,CAAC;YACD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAC1B,CAAC;KACF;IACD,MAAM,EAAE;QACN,WAAW,EAAE,4DAA4D;QACzE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE;YAC1C,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YAC7D,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAC1B,CAAC;KACF;IACD,QAAQ,EAAE;QACR,WAAW,EAAE,6DAA6D;QAC1E,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE;YAC1C,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YAC3D,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAC1B,CAAC;KACF;IACD,MAAM,EAAE;QACN,WAAW,EAAE,sEAAsE;QACnF,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;YAC3C,sFAAsF;YACtF,qFAAqF;YACrF,MAAM,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAClC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAC1B,CAAC;KACF;IACD,MAAM,EAAE;QACN,WAAW,EAAE,8DAA8D;QAC3E,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE;YAC1C,MAAM,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC/C,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAC1B,CAAC;KACF;IACD,MAAM,EAAE;QACN,WAAW,EAAE,mEAAmE;QAChF,SAAS,EAAE,iBAAiB,CAAC,SAAS,CAAC;KACxC;IACD,eAAe,EAAE;QACf,WAAW,EAAE,2EAA2E;QACxF,SAAS,EAAE,iBAAiB,CAAC,QAAQ,CAAC;KACvC;IACD,gBAAgB,EAAE;QAChB,WAAW,EAAE,6EAA6E;QAC1F,SAAS,EAAE,iBAAiB,CAAC,SAAS,CAAC;KACxC;IACD,gBAAgB,EAAE;QAChB,WAAW,EAAE,6EAA6E;QAC1F,SAAS,EAAE,iBAAiB,CAAC,SAAS,CAAC;KACxC;IACD,IAAI,EAAE;QACJ,WAAW,EAAE,4CAA4C;QACzD,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE;YAC1C,OAAO,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;YACrC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAC1B,CAAC;KACF;IACD,KAAK,EAAE;QACL,WAAW,EAAE,2CAA2C;QACxD,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE;YAC1C,qDAAqD;YACrD,MAAM,SAAS,GAAG,YAAY,UAAU,EAAE,EAAE,CAAC;YAC7C,OAAO,CAAC,QAAQ,CAAC,eAAe,SAAS,IAAI,CAAC,CAAC;YAC/C,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC;QAClE,CAAC;KACF;IACD,QAAQ,EAAE;QACR,WAAW,EAAE,wDAAwD;QACrE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE;YACzC,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACvB,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,2EAA2E;gBAC3E,2EAA2E;gBAC3E,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACpC,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;oBAC5B,MAAM,QAAQ,GAAG,sBAAsB,CAAC,CAAC,CAAC,CAAC;oBAC3C,MAAM,SAAS,GAAG,QAAQ,KAAK,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,SAAS,CAAC;oBAChF,MAAM,MAAM,GAAG,CAAC,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC;oBAC3D,yEAAyE;oBACzE,MAAM,WAAW,GAAG,QAAQ,KAAK,SAAS;wBACxC,CAAC,CAAC,wBAAwB;wBAC1B,CAAC,CAAC,SAAS,IAAI,MAAM;4BACnB,CAAC,CAAC,UAAU;4BACZ,CAAC,CAAC,kBAAkB,CAAC;oBACzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,WAAW,IAAI,CAAC,CAAC;gBAC/C,CAAC;gBACD,OAAO,CAAC,QAAQ,CAAC,+BAA+B,CAAC,CAAC;gBAClD,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;oBAC5B,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC;oBAC9E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACvB,OAAO,CAAC,QAAQ,CACd,KAAK,CAAC,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAC1F,CAAC;oBACJ,CAAC;gBACH,CAAC;gBACD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;YAC1B,CAAC;YACD,IAAI,CAAE,WAAiC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACzD,OAAO,CAAC,QAAQ,CAAC,cAAc,MAAM,+BAA+B,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAChG,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;YAC1B,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;gBACzB,+EAA+E;gBAC/E,OAAO,CAAC,QAAQ,CACd,oDAAoD,iBAAiB,EAAE,WAAW,CACnF,CAAC;gBACF,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;YAC1B,CAAC;YACD,MAAM,KAAK,GAAG,CAAC,MAAM,OAAO,CAAC,WAAW,CAAC,YAAY,MAAM,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACzE,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;gBACjB,OAAO,CAAC,QAAQ,CAAC,kCAAkC,CAAC,CAAC;gBACrD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;YAC1B,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,iBAAiB,CAAC,MAAmB,EAAE,KAAK,CAAC,CAAC;gBACvE,OAAO,CAAC,QAAQ,CAAC,iBAAiB,MAAM,gBAAgB,IAAI,IAAI,CAAC,CAAC;gBAClE,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;oBACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;gBAC7E,CAAC;YACH,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,iFAAiF;gBACjF,uEAAuE;gBACvE,IAAI,CAAC,CAAC,CAAC,YAAY,eAAe,CAAC;oBAAE,MAAM,CAAC,CAAC;gBAC7C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC;YACrC,CAAC;YACD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAC1B,CAAC;KACF;IACD,KAAK,EAAE;QACL,WAAW,EAAE,mBAAmB;QAChC,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;YAC3C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;YACnC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAC3B,CAAC;KACF;CACF,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAgB,EAChB,MAAsB,EACtB,gBAAiC,uBAAuB;IAExD,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC3B,wFAAwF;QACxF,IAAI,KAAK,KAAK,EAAE;YAAE,SAAS;QAE3B,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,kFAAkF;YAClF,iEAAiE;YACjE,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAClC,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YAClD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC7B,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;YAClC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,CAAC,QAAQ,CAAC,yBAAyB,OAAO,iBAAiB,CAAC,CAAC;gBACpE,SAAS;YACX,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;gBACjE,IAAI,CAAC,SAAS,CAAC,MAAM;oBAAE,OAAO,CAAC,CAAC;gBAChC,+EAA+E;gBAC/E,+CAA+C;gBAC/C,IAAI,SAAS,CAAC,MAAM,KAAK,SAAS;oBAAE,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;YAChE,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,QAAQ,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC7C,CAAC;YACD,SAAS;QACX,CAAC;QAED,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,QAAQ,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,0EAA0E;IAC1E,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,53 @@
1
+ import { describir, depsOffline } from "../core/deps.js";
2
+ import { Modelos } from "../agent/modelos.js";
3
+ import { cargar } from "../agent/configEnDisco.js";
4
+ import { ModeloMalEscrito } from "../core/modelos.js";
5
+ import { escribirEnStdout } from "./stdio.js";
6
+ /**
7
+ * Qué hay montado. **Sin red, sin claves y sin el simulador**, a propósito: existe para
8
+ * ver la deriva, y un diagnóstico que necesita credenciales no se usa cuando hace falta.
9
+ */
10
+ export function cmdDescribe(fuentes, escribir = escribirEnStdout, raiz = process.cwd()) {
11
+ // Se leen los config.json de disco para que los papeles puedan enseñar las
12
+ // procedencias (proyecto)/(global) —`fuentes` solo trae banderas y entorno— y para
13
+ // sacar también aquí los avisos GRAVES: un aviso que solo aparece en
14
+ // `xonecode config`, que nadie corre, no protege de nada.
15
+ const cargado = cargar(raiz);
16
+ const fuentesCompletas = {
17
+ ...fuentes,
18
+ proyecto: cargado.config.proyecto,
19
+ global: cargado.config.global,
20
+ };
21
+ let modelos;
22
+ const avisosDeResolucion = [];
23
+ try {
24
+ // Los modelos SÍ son reales aquí: lo que se enseña es qué se usaría, y construirlos
25
+ // es perezoso, así que no hace falta ninguna clave para imprimirlo.
26
+ modelos = new Modelos(fuentesCompletas);
27
+ }
28
+ catch (e) {
29
+ if (!(e instanceof ModeloMalEscrito))
30
+ throw e;
31
+ // Un `modelo` mal escrito en un config.json lanza en el constructor (vía resolver);
32
+ // un fichero de configuración mal escrito no puede impedir que describe funcione,
33
+ // así que se cae a bandera/entorno/omisión y se avisa como grave.
34
+ modelos = new Modelos(fuentes);
35
+ avisosDeResolucion.push(`no se pudo resolver el modelo desde la configuración de fichero (${e.message}); ` +
36
+ "se ignoran proyecto y global solo para el modelo.");
37
+ }
38
+ const deps = { ...depsOffline(), modelos };
39
+ for (const linea of describir(deps))
40
+ escribir(`${linea}\n`);
41
+ // Solo los GRAVES: los avisos normales ya salen en `xonecode config`; aquí se repiten
42
+ // los que de verdad importan (auth.json legible por otros, clave colada en config...).
43
+ // `cargado.auth` no se imprime jamás: describe no toca credenciales en absoluto.
44
+ const graves = cargado.avisos.filter((a) => a.severidad === "grave").map((a) => a.texto);
45
+ const todosLosGraves = [...graves, ...avisosDeResolucion];
46
+ if (todosLosGraves.length > 0) {
47
+ escribir("--- avisos de configuración ---\n");
48
+ for (const texto of todosLosGraves)
49
+ escribir(` ⚠ ${texto}\n`);
50
+ }
51
+ return 0;
52
+ }
53
+ //# sourceMappingURL=describe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"describe.js","sourceRoot":"","sources":["../../src/cli/describe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAa,MAAM,iBAAiB,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAA0B,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAiB,MAAM,YAAY,CAAC;AAE7D;;;GAGG;AACH,MAAM,UAAU,WAAW,CACzB,OAA0B,EAC1B,WAAqB,gBAAgB,EACrC,OAAe,OAAO,CAAC,GAAG,EAAE;IAE5B,2EAA2E;IAC3E,mFAAmF;IACnF,qEAAqE;IACrE,0DAA0D;IAC1D,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,gBAAgB,GAAsB;QAC1C,GAAG,OAAO;QACV,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ;QACjC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM;KAC9B,CAAC;IAEF,IAAI,OAAgB,CAAC;IACrB,MAAM,kBAAkB,GAAa,EAAE,CAAC;IACxC,IAAI,CAAC;QACH,oFAAoF;QACpF,oEAAoE;QACpE,OAAO,GAAG,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,CAAC,CAAC,YAAY,gBAAgB,CAAC;YAAE,MAAM,CAAC,CAAC;QAC9C,oFAAoF;QACpF,kFAAkF;QAClF,kEAAkE;QAClE,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;QAC/B,kBAAkB,CAAC,IAAI,CACrB,oEAAoE,CAAC,CAAC,OAAO,KAAK;YAChF,mDAAmD,CACtD,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAS,EAAE,GAAG,WAAW,EAAE,EAAE,OAAO,EAAE,CAAC;IACjD,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,IAAI,CAAC;QAAE,QAAQ,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;IAE5D,sFAAsF;IACtF,uFAAuF;IACvF,iFAAiF;IACjF,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACzF,MAAM,cAAc,GAAG,CAAC,GAAG,MAAM,EAAE,GAAG,kBAAkB,CAAC,CAAC;IAC1D,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,QAAQ,CAAC,mCAAmC,CAAC,CAAC;QAC9C,KAAK,MAAM,KAAK,IAAI,cAAc;YAAE,QAAQ,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,45 @@
1
+ import { inspeccionar } from "../agent/entorno.js";
2
+ import { escribirEnStdout } from "./stdio.js";
3
+ /**
4
+ * ¿Puede este sitio ser un proyecto XOne, y responde el simulador?
5
+ *
6
+ * Sale con código != 0 si falta algo imprescindible: es un diagnóstico, y uno que siempre
7
+ * dice que sí no sirve de nada en CI.
8
+ */
9
+ export async function cmdDoctor(escribir = escribirEnStdout) {
10
+ const e = await inspeccionar();
11
+ const linea = (marca, texto) => escribir(` ${marca} ${texto}\n`);
12
+ escribir("--- el sitio ---\n");
13
+ linea(e.esProyectoXone ? "✓" : "✗", `${e.raiz}${e.esProyectoXone ? "" : " (no hay app.xml aquí)"}`);
14
+ linea(e.colecciones > 0 ? "✓" : "·", `${e.colecciones} colección(es) .xne`);
15
+ // La foto del ANTES se toma con un ÍNDICE DE GIT PRIVADO, así que basta con que HAYA
16
+ // repo: no hace falta ni ser su raíz ni tener ningún commit (medido, `DISENO.md` §15).
17
+ // Lo que sí se dice es cuándo el repo abarca más que el proyecto, porque eso cambia lo
18
+ // que uno puede prometer sobre deshacer.
19
+ if (!e.git.usable) {
20
+ linea("⚠", "sin git: la foto del ANTES se hará por huellas de fichero (más lenta y sin diff)");
21
+ linea(" ", "Para el modo git: `git init` aquí.");
22
+ }
23
+ else if (e.git.esRaiz) {
24
+ linea("✓", "git: foto y diff por árbol privado, sin tocar tu índice");
25
+ }
26
+ else {
27
+ linea("✓", `git: foto y diff por árbol privado (repo en ${e.git.raizRepo}, prefijo «${e.git.prefijo}»)`);
28
+ }
29
+ if (e.git.usable && !e.git.tieneCommits) {
30
+ // No impide la foto —`write-tree` no necesita HEAD— pero sí las ramas y los worktrees.
31
+ linea("·", "el repo no tiene commits: la foto funciona igual, pero no hay ramas ni worktrees");
32
+ }
33
+ if (e.vistasAplanadas.length > 0) {
34
+ linea("·", `${e.vistasAplanadas.length} vista(s) aplanada(s) .xml — se le ocultarán al agente`);
35
+ }
36
+ escribir("--- el verificador ---\n");
37
+ // El binario NO expone versión (`--version` responde «Comando desconocido»), así que
38
+ // se dice la ruta y si responde. Inventar una versión sería peor que no darla.
39
+ linea(e.simulador.responde ? "✓" : "✗", `${e.simulador.ruta}${e.simulador.responde ? " responde" : " NO responde"}`);
40
+ const falta = !e.esProyectoXone || !e.simulador.responde;
41
+ if (falta)
42
+ escribir("\n✗ falta algo imprescindible: xonecode no puede trabajar aquí.\n");
43
+ return falta ? 1 : 0;
44
+ }
45
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAiB,MAAM,YAAY,CAAC;AAE7D;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,WAAqB,gBAAgB;IACnE,MAAM,CAAC,GAAG,MAAM,YAAY,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,KAAa,EAAQ,EAAE,CAAC,QAAQ,CAAC,KAAK,KAAK,KAAK,KAAK,IAAI,CAAC,CAAC;IAEzF,QAAQ,CAAC,oBAAoB,CAAC,CAAC;IAC/B,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,yBAAyB,EAAE,CAAC,CAAC;IACrG,KAAK,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,WAAW,qBAAqB,CAAC,CAAC;IAC5E,qFAAqF;IACrF,uFAAuF;IACvF,uFAAuF;IACvF,yCAAyC;IACzC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QAClB,KAAK,CAAC,GAAG,EAAE,kFAAkF,CAAC,CAAC;QAC/F,KAAK,CAAC,GAAG,EAAE,oCAAoC,CAAC,CAAC;IACnD,CAAC;SAAM,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QACxB,KAAK,CAAC,GAAG,EAAE,yDAAyD,CAAC,CAAC;IACxE,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,GAAG,EAAE,+CAA+C,CAAC,CAAC,GAAG,CAAC,QAAQ,cAAc,CAAC,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC;IAC3G,CAAC;IACD,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QACxC,uFAAuF;QACvF,KAAK,CAAC,GAAG,EAAE,kFAAkF,CAAC,CAAC;IACjG,CAAC;IACD,IAAI,CAAC,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,eAAe,CAAC,MAAM,wDAAwD,CAAC,CAAC;IAClG,CAAC;IAED,QAAQ,CAAC,0BAA0B,CAAC,CAAC;IACrC,qFAAqF;IACrF,+EAA+E;IAC/E,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC;IAErH,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC;IACzD,IAAI,KAAK;QAAE,QAAQ,CAAC,mEAAmE,CAAC,CAAC;IACzF,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACvB,CAAC"}