@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.
- package/dist/chat/claude.d.ts +11 -0
- package/dist/chat/claude.d.ts.map +1 -1
- package/dist/chat/claude.js.map +1 -1
- package/dist/chat/claude_cli.d.ts.map +1 -1
- package/dist/chat/claude_cli.js +11 -2
- package/dist/chat/claude_cli.js.map +1 -1
- package/dist/chat/doctrine_digest.d.ts.map +1 -1
- package/dist/chat/doctrine_digest.js +11 -0
- package/dist/chat/doctrine_digest.js.map +1 -1
- package/dist/chat/panel.d.ts.map +1 -1
- package/dist/chat/panel.js +50 -24
- package/dist/chat/panel.js.map +1 -1
- package/dist/chat/server.d.ts.map +1 -1
- package/dist/chat/server.js +113 -16
- package/dist/chat/server.js.map +1 -1
- package/dist/chat/tools/config_write.d.ts +35 -0
- package/dist/chat/tools/config_write.d.ts.map +1 -0
- package/dist/chat/tools/config_write.js +381 -0
- package/dist/chat/tools/config_write.js.map +1 -0
- package/dist/chat/tools/db_query.d.ts +20 -0
- package/dist/chat/tools/db_query.d.ts.map +1 -1
- package/dist/chat/tools/db_query.js +3 -3
- package/dist/chat/tools/db_query.js.map +1 -1
- package/dist/chat/tools/nac3_invoke.d.ts.map +1 -1
- package/dist/chat/tools/nac3_invoke.js +19 -1
- package/dist/chat/tools/nac3_invoke.js.map +1 -1
- package/dist/chat/tools/orchestrator_write.d.ts +27 -0
- package/dist/chat/tools/orchestrator_write.d.ts.map +1 -0
- package/dist/chat/tools/orchestrator_write.js +481 -0
- package/dist/chat/tools/orchestrator_write.js.map +1 -0
- package/dist/chat/tools.d.ts.map +1 -1
- package/dist/chat/tools.js +28 -0
- package/dist/chat/tools.js.map +1 -1
- package/dist/commands/embed.d.ts +1 -0
- package/dist/commands/embed.d.ts.map +1 -1
- package/dist/commands/embed.js +5 -1
- package/dist/commands/embed.js.map +1 -1
- package/dist/core/config_formats.d.ts +45 -0
- package/dist/core/config_formats.d.ts.map +1 -0
- package/dist/core/config_formats.js +519 -0
- package/dist/core/config_formats.js.map +1 -0
- package/dist/core/db_write.d.ts +26 -0
- package/dist/core/db_write.d.ts.map +1 -0
- package/dist/core/db_write.js +262 -0
- package/dist/core/db_write.js.map +1 -0
- package/dist/core/forge_embed.d.ts +1 -0
- package/dist/core/forge_embed.d.ts.map +1 -1
- package/dist/core/forge_embed.js +132 -2
- package/dist/core/forge_embed.js.map +1 -1
- package/dist/core/forge_profile.d.ts +23 -0
- package/dist/core/forge_profile.d.ts.map +1 -1
- package/dist/core/forge_profile.js +56 -0
- package/dist/core/forge_profile.js.map +1 -1
- package/dist/core/operate_guard.d.ts +154 -0
- package/dist/core/operate_guard.d.ts.map +1 -0
- package/dist/core/operate_guard.js +542 -0
- package/dist/core/operate_guard.js.map +1 -0
- package/dist/core/projects.d.ts +10 -4
- package/dist/core/projects.d.ts.map +1 -1
- package/dist/core/projects.js +42 -2
- package/dist/core/projects.js.map +1 -1
- package/dist/docs/doctrine/operate-mode.md +118 -0
- package/dist/nac3/internal_manifest.d.ts.map +1 -1
- package/dist/nac3/internal_manifest.js +186 -0
- package/dist/nac3/internal_manifest.js.map +1 -1
- package/dist/nac3/manifest_lazy.d.ts +5 -0
- package/dist/nac3/manifest_lazy.d.ts.map +1 -1
- package/dist/nac3/manifest_lazy.js +3 -1
- package/dist/nac3/manifest_lazy.js.map +1 -1
- package/dist/pending/store.d.ts.map +1 -1
- package/dist/pending/store.js +9 -0
- package/dist/pending/store.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/docs/doctrine/operate-mode.md +118 -0
- 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.
|
|
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>",
|