@nac3/forge-cli 1.8.5 → 1.9.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 (76) hide show
  1. package/dist/chat/claude.d.ts +11 -0
  2. package/dist/chat/claude.d.ts.map +1 -1
  3. package/dist/chat/claude.js.map +1 -1
  4. package/dist/chat/claude_cli.d.ts.map +1 -1
  5. package/dist/chat/claude_cli.js +11 -2
  6. package/dist/chat/claude_cli.js.map +1 -1
  7. package/dist/chat/doctrine_digest.d.ts.map +1 -1
  8. package/dist/chat/doctrine_digest.js +11 -0
  9. package/dist/chat/doctrine_digest.js.map +1 -1
  10. package/dist/chat/panel.d.ts.map +1 -1
  11. package/dist/chat/panel.js +50 -24
  12. package/dist/chat/panel.js.map +1 -1
  13. package/dist/chat/server.d.ts.map +1 -1
  14. package/dist/chat/server.js +113 -16
  15. package/dist/chat/server.js.map +1 -1
  16. package/dist/chat/tools/config_write.d.ts +35 -0
  17. package/dist/chat/tools/config_write.d.ts.map +1 -0
  18. package/dist/chat/tools/config_write.js +381 -0
  19. package/dist/chat/tools/config_write.js.map +1 -0
  20. package/dist/chat/tools/db_query.d.ts +20 -0
  21. package/dist/chat/tools/db_query.d.ts.map +1 -1
  22. package/dist/chat/tools/db_query.js +3 -3
  23. package/dist/chat/tools/db_query.js.map +1 -1
  24. package/dist/chat/tools/nac3_invoke.d.ts.map +1 -1
  25. package/dist/chat/tools/nac3_invoke.js +19 -1
  26. package/dist/chat/tools/nac3_invoke.js.map +1 -1
  27. package/dist/chat/tools/orchestrator_write.d.ts +27 -0
  28. package/dist/chat/tools/orchestrator_write.d.ts.map +1 -0
  29. package/dist/chat/tools/orchestrator_write.js +481 -0
  30. package/dist/chat/tools/orchestrator_write.js.map +1 -0
  31. package/dist/chat/tools.d.ts.map +1 -1
  32. package/dist/chat/tools.js +28 -0
  33. package/dist/chat/tools.js.map +1 -1
  34. package/dist/commands/embed.d.ts +1 -0
  35. package/dist/commands/embed.d.ts.map +1 -1
  36. package/dist/commands/embed.js +5 -1
  37. package/dist/commands/embed.js.map +1 -1
  38. package/dist/core/config_formats.d.ts +45 -0
  39. package/dist/core/config_formats.d.ts.map +1 -0
  40. package/dist/core/config_formats.js +519 -0
  41. package/dist/core/config_formats.js.map +1 -0
  42. package/dist/core/db_write.d.ts +26 -0
  43. package/dist/core/db_write.d.ts.map +1 -0
  44. package/dist/core/db_write.js +262 -0
  45. package/dist/core/db_write.js.map +1 -0
  46. package/dist/core/forge_embed.d.ts +1 -0
  47. package/dist/core/forge_embed.d.ts.map +1 -1
  48. package/dist/core/forge_embed.js +132 -2
  49. package/dist/core/forge_embed.js.map +1 -1
  50. package/dist/core/forge_profile.d.ts +23 -0
  51. package/dist/core/forge_profile.d.ts.map +1 -1
  52. package/dist/core/forge_profile.js +56 -0
  53. package/dist/core/forge_profile.js.map +1 -1
  54. package/dist/core/operate_guard.d.ts +154 -0
  55. package/dist/core/operate_guard.d.ts.map +1 -0
  56. package/dist/core/operate_guard.js +542 -0
  57. package/dist/core/operate_guard.js.map +1 -0
  58. package/dist/core/projects.d.ts +10 -4
  59. package/dist/core/projects.d.ts.map +1 -1
  60. package/dist/core/projects.js +42 -2
  61. package/dist/core/projects.js.map +1 -1
  62. package/dist/docs/doctrine/operate-mode.md +118 -0
  63. package/dist/nac3/internal_manifest.d.ts.map +1 -1
  64. package/dist/nac3/internal_manifest.js +186 -0
  65. package/dist/nac3/internal_manifest.js.map +1 -1
  66. package/dist/nac3/manifest_lazy.d.ts +5 -0
  67. package/dist/nac3/manifest_lazy.d.ts.map +1 -1
  68. package/dist/nac3/manifest_lazy.js +3 -1
  69. package/dist/nac3/manifest_lazy.js.map +1 -1
  70. package/dist/pending/store.d.ts.map +1 -1
  71. package/dist/pending/store.js +9 -0
  72. package/dist/pending/store.js.map +1 -1
  73. package/dist/version.d.ts +1 -1
  74. package/dist/version.js +1 -1
  75. package/docs/doctrine/operate-mode.md +118 -0
  76. package/package.json +1 -1
@@ -0,0 +1,118 @@
1
+ # Operate-mode doctrine (Forge Embedded que CONFIGURA el sistema)
2
+
3
+ El asistente residente nacio DIAGNOSTICO (ver `diagnostic-mode`): leer,
4
+ consultar la base read-only, escribir reportes, y emitir la instruccion precisa
5
+ para el operador. El **operate mode** (Pablo, 2026-10-10) es la salida ACOTADA
6
+ de ese read-only: el asistente ademas CONFIGURA el sistema que atiende.
7
+
8
+ ## 1. El alcance, textual
9
+
10
+ Tres cosas, y nada mas:
11
+
12
+ 1. **Configurar por ARCHIVOS de datos de configuracion** -- json, xml, txt,
13
+ ini, env, properties, yaml, toml, vaults.
14
+ 2. **Configurar por TABLAS de configuracion** -- UPDATE/INSERT estructurado
15
+ sobre tablas declaradas como configuracion.
16
+ 3. **Crear procesos nuevos y cronearlos en el orquestador** del sistema.
17
+
18
+ Explicitamente AFUERA:
19
+
20
+ 4. **Las tablas de DATOS del sistema** no se tocan.
21
+ 5. **El software del sistema** no se modifica (codigo fuente, binarios, units,
22
+ definiciones de build o dependencias).
23
+
24
+ ## 2. Como se hace cumplir (no es prompt, es dispatcher)
25
+
26
+ La ley de esta casa: *las reglas son enforcement, no prompt* -- un cerebro
27
+ ignora un prompt. El alcance vive en `src/core/operate_guard.ts` y se aplica en
28
+ tres capas, donde una capa posterior NUNCA puede ensanchar a la anterior:
29
+
30
+ - **A. Invariantes compilados.** Toda extension que es software se rechaza
31
+ aunque el allowlist diga `**/*`; igual el arbol del SO (`/etc`, `/usr`,
32
+ `/boot`...), los esquemas de sistema de la base, y `.forge/` (el perfil que
33
+ otorga estos poderes: el asistente no puede ampliarse a si mismo).
34
+ - **B. Allowlist del operador.** `operate.config_files.allow` (globs) y
35
+ `operate.config_tables.allow` (tablas) en `.forge/profile.<env>.json`.
36
+ **Default deny**: sin allowlist no se escribe nada. Las tablas de datos
37
+ quedan afuera por omision -- no hay que enumerarlas.
38
+ - **C. Validacion por llamada.** Topes de tamano, columnas inmutables, WHERE
39
+ obligatorio, preflight de filas afectadas (0 filas -> no-op rechazado; mas
40
+ que `max_rows` -> cambio demasiado amplio rechazado), gramatica de cron,
41
+ saneado de nombres y argumentos que llegan a una linea de comando.
42
+
43
+ Y una decision de diseno que sostiene el punto 4: **no existe ningun verbo que
44
+ ejecute SQL mutante arbitrario**. El asistente pasa `{table, op, set, where}` y
45
+ el servidor compone la sentencia con identificadores validados y valores
46
+ literales. No hay superficie para "UPDATE pacientes SET ...".
47
+
48
+ ## 3. Los verbos
49
+
50
+ | Verbo | Para que |
51
+ | --- | --- |
52
+ | `yujin.config.file-set` | Cambiar UN valor en un archivo de configuracion. Preferido: deja el resto del archivo byte a byte, hace backup y VERIFICA releyendo (si no verifica, restaura el backup y falla). |
53
+ | `yujin.config.file-write` | Contenido completo, para lo que el editor puntual no puede expresar (XML complejo, blob de vault, archivo nuevo con `create:true`). Leer el archivo ANTES. |
54
+ | `yujin.config.file-revert` | Restaurar un backup por `backup_id`. El contenido actual tambien se respalda: el revert es reversible. |
55
+ | `yujin.config.table-set` | `{table, op: update\|insert\|delete, set, where}` sobre una tabla de configuracion allowlisteada. |
56
+ | `yujin.orchestrator.process-create` | Registrar un proceso nuevo en el orquestador (y opcionalmente cronearlo en la misma llamada). |
57
+ | `yujin.orchestrator.schedule-set` | Poner/cambiar el cron (5 campos Linux; `@daily` se rechaza) y el enabled de un proceso. |
58
+
59
+ Los verbos solo aparecen en el manifest cuando el perfil habilita operate mode,
60
+ y `nac3_invoke` los rechaza a nivel perfil cuando esta apagado. Un embed
61
+ diagnostico comun es identico al build anterior.
62
+
63
+ ## 4. El orquestador se declara, no se adivina
64
+
65
+ Cada sistema tiene su orquestador, asi que la FORMA la declara el operador una
66
+ vez en `operate.orchestrator` y el cerebro solo aporta la intencion
67
+ (`{name, command, cron}`). Tres adaptadores:
68
+
69
+ - `db_table`: filas en las tablas del orquestador (`process_table` +
70
+ `schedule_table`) con un mapa logico -> columna real. El orquestador RPA
71
+ clasico.
72
+ - `http`: POST a la API del propio orquestador (`base_url` + paths, key por env
73
+ var). **Preferido cuando el sistema valida y recarga sus agendas solo**: un
74
+ INSERT directo en un motor que hidrata su catalogo en memoria al arrancar no
75
+ tomaria efecto hasta un reinicio.
76
+ - `cron_file`: fragmento de crontab en un directorio declarado, armado desde un
77
+ `command_template`. Para sistemas cuyo "orquestador" es cron.
78
+
79
+ La URL / tabla / template siempre vienen del perfil: el asistente elige QUE
80
+ agendar, nunca ADONDE postear ni QUE binario correr.
81
+
82
+ ## 5. Como trabajar un pedido de configuracion (siendo el asistente)
83
+
84
+ 1. **Triage**: contra el system map, confirmar que el pedido se resuelve
85
+ OPERANDO el sistema. Si es bug o excepcion no contemplada -> ticket.
86
+ 2. **Leer el valor actual** (`yujin.fs.read-file` / `yujin.db.query`). Nunca
87
+ escribir a ciegas: un archivo de config reconstruido de memoria pierde
88
+ settings en silencio.
89
+ 3. **Decir en una linea** que se va a cambiar y donde, antes de hacerlo.
90
+ 4. **Aplicar** con el verbo puntual, de a un valor.
91
+ 5. **Verificar** releyendo, y reportar `antes -> despues`.
92
+ 6. **Decir que falta para que tome efecto** (reload / restart / proximo tick).
93
+ Reiniciar un servicio NO es del asistente: se le da al operador el comando
94
+ exacto.
95
+ 7. **Todo queda en el journal** (`.forge/changes/changes.jsonl`) con backup del
96
+ archivo o before-image de la fila + sentencia de rollback. Ante la duda:
97
+ revertir, o pasarle al operador el rollback.
98
+ 8. Fuera del alcance sigue siendo el asistente DIAGNOSTICO: instruccion
99
+ precisa, pending, o ticket.
100
+
101
+ `require_approval` (default true) muestra el cambio en el modal del panel antes
102
+ de aplicarlo -- el operador ve exactamente que se va a tocar. Ponerlo en false
103
+ es una decision deliberada del despliegue (queda igual en el journal).
104
+
105
+ ## 6. Como habilitarlo en un despliegue
106
+
107
+ `yf embed` genera `.forge/profile.ops.json` (read_only + operate con allowlists
108
+ VACIOS) y su unit `forge-<app>-ops.service` con `YF_ENV=ops`. Receta:
109
+
110
+ 1. Levantar el servicio ops con los allowlists vacios: el asistente ya
111
+ diagnostica y, como no hay nada declarado, no puede cambiar nada.
112
+ 2. Pedirle que construya/actualice su `system-map.md` y que **proponga** el
113
+ bloque `operate` -- que archivos de config y que tablas de configuracion
114
+ encontro, y como se registran y agendan los procesos.
115
+ 3. Revisar esa propuesta, recortarla (en la duda, afuera) y commitearla. El
116
+ asistente no puede ampliarse: `.forge/` esta fuera de su alcance.
117
+ 4. Reiniciar el servicio ops y probar UN cambio real de punta a punta
118
+ (antes -> despues -> journal -> revert).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nac3/forge-cli",
3
- "version": "1.8.5",
3
+ "version": "1.9.0",
4
4
  "description": "Yujin Forge -- voice-first NAC-3 React development framework. CLI + chat panel + spec ingest + 10-format document reader + voice loop.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "author": "Pablo Kuschnirof <pablo@rpaforce.com>",