@danieltmn/openbridge 0.6.4 → 0.7.1

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/CHANGELOG.md CHANGED
@@ -1,207 +1,233 @@
1
- # Changelog
2
-
3
- Todos los cambios relevantes de OpenBridge. Formato basado en
4
- [Keep a Changelog](https://keepachangelog.com/es-ES/1.1.0/) y
1
+ # Changelog
2
+
3
+ Todos los cambios relevantes de OpenBridge. Formato basado en
4
+ [Keep a Changelog](https://keepachangelog.com/es-ES/1.1.0/) y
5
5
  [Versionado Semantico](https://semver.org/lang/es/).
6
6
 
7
- ## [0.6.4] - 2026-09-16
8
-
9
- ### Cambiado
10
-
11
- - **Color por proyecto** en la lista de sesiones y en el sidebar (hash estable
12
- de la ruta) para distinguir los proyectos de un vistazo, y nombre un poco mas
13
- grande.
14
-
15
- ## [0.6.3] - 2026-09-15
16
-
17
- ### Agregado
18
-
19
- - **Sincronizacion casi en tiempo real**: el puente vigila la base de opencode
20
- (`opencode.db`/`-wal`) y dispara un barrido tras ~8 s de calma, en vez de
21
- esperar 15 min (que queda como respaldo cada 3 min).
22
-
23
- ### Corregido
24
-
25
- - El barrido ya **no se pierde** cuando opencode esta ocupado: se marca pendiente
26
- y corre al terminar el mensaje (antes se salteaba el tick entero).
27
- - **Mensajes del TUI en sesiones web**: las sesiones vinculadas a la web ya no
28
- quedan solo con refresco de tokens; se importan los mensajes nuevos.
29
- - **Sin duplicados**: el merge deduplica por el id de mensaje de opencode
30
- (`oc_msg`) y "adopta" el mensaje optimista que publico la web. Paridad en el
31
- hub Node (`store.sessionImport`) y en el PHP.
32
-
33
- ## [0.6.2] - 2026-09-14
34
-
35
- ### Corregido
36
-
37
- - **Tunel en Windows**: los shims `.cmd` (p. ej. `tmole`) se lanzaban con doble
38
- cita (`cmd.exe /d /s /c "\"ruta\""`) y fallaban con "no se reconoce como un
39
- comando". Ahora se usa `windowsVerbatimArguments` y, si `tmole` falla, el
40
- puente **reintenta con `npx --yes tunnelmole`** (antes solo lo intentaba si
41
- `tmole` no estaba en el PATH). Timeout del tunel: 85 s.
42
-
43
- ## [0.6.1] - 2026-09-14
44
-
45
- ### Agregado
46
-
47
- - `openbridge bridge --background` (segundo plano; sobrevive al cierre de la
48
- consola), `--stop` y `--status`. `openbridge pair`/`join` aceptan `--background`.
49
-
50
- ### Corregido
51
-
52
- - `autostart` corre solo el puente cuando la PC pertenece a un hub remoto
53
- (`join`/`pair`), en vez del server local.
54
-
55
- ## [0.6.0] - 2026-09-14
56
-
57
- ### Agregado
58
-
59
- - **Hub PHP** para correr la app en un hosting (cPanel) con URL fija, sin tunel
60
- (`php/app` + `scripts/build-php-hub.mjs`; comparte el frontend con el hub Node).
61
- Auth multiusuario con scrypt compatible con Node (usa `sodium`; si falta, scrypt
62
- puro en PHP), roles, cookie de sesion firmada, rate limit y CSP.
63
- - **Emparejamiento por codigo** (`openbridge pair <url>`): la PC muestra un codigo,
64
- el usuario lo ingresa en la web (Dispositivos) y la PC recibe su **token propio**
65
- y revocable. Cada usuario ve solo sus PCs; el admin, todas.
66
- - Comando `openbridge pair` y vista **Dispositivos** en la web (solo en el hub PHP,
67
- gateada por `features.pairing`).
68
- - `docs/DEPLOY-PHP.md`: guia de despliegue del hub PHP.
69
-
70
- ## [0.5.2] - 2026-09-14
71
-
72
- ### Corregido
73
-
74
- - Diagnostico de puerto ocupado: `status` y `server` muestran que **PID** usa el
75
- puerto (suele ser otra casa con otro `--dir`) y, si el arranque en segundo plano
76
- muere, se muestran las ultimas lineas de `server.log`.
77
- - `store`: reintentos con backoff en el `rename` atomico (EPERM/EACCES/EBUSY en
78
- Windows) y limpieza del `.tmp` si no se puede.
79
-
80
- ## [0.5.1] - 2026-09-14
81
-
82
- ### Corregido
83
-
84
- - `openbridge join` normaliza la URL del hub a `/api.php` (antes, pasar la base
85
- o `/chat.php` apuntaba a `/` y el puente se quedaba sin trabajo).
86
-
87
- ## [0.5.0] - 2026-09-14
88
-
89
- ### Agregado
90
-
91
- - Comando `openbridge update` (compara con npm; `--yes` actualiza la instalacion
92
- global).
93
- - Comando `openbridge join <url>` para sumar una PC como puente de un hub:
94
- persiste `apiUrl`/`apiToken`/`bridgeId` y arranca el puente (`--no-start` solo
95
- guarda).
96
- - `npm run lint` (`scripts/lint.mjs`): `node --check` sobre todo el JS; corre en
97
- CI.
98
- - Test end-to-end del puente con `opencode` mockeado (`test/bridge.test.js`) y
99
- tests del CLI (`test/cli.test.js`).
100
- - **MCP**: vista en la web y comando de chat `/mcp` que muestran los servidores
101
- MCP de opencode y su estado (`opencode mcp list`); comando de puente
102
- `mcp_list`.
103
- - `CONTRIBUTING.md`.
104
-
105
- ### Cambiado
106
-
107
- - Claves internas `ocx_*` renombradas a `ob_*` con migracion automatica
108
- (localStorage y cookie de tema). Se mantienen como compatibilidad el env
109
- `OPENCONEX_HOME` y el bin `openconex` (deprecados).
110
- - `config.command` puede apuntar a un script de Node (`.js`/`.mjs`/`.cjs`): se
111
- ejecuta con el `node` actual (wrappers propios y pruebas con CLI simulado).
112
-
113
- ## [0.4.0] - 2026-09-14
114
-
115
- ### Agregado
116
-
117
- - **Multiusuario** con roles `admin`/`user`: login con usuario + contrasena,
118
- sesion ligada al usuario y a la version de contrasena, rate limit por
119
- IP+usuario, y comando CLI `users`
120
- (`list`/`add`/`remove`/`passwd`/`role`/`disable`/`enable`); `passwd --user`.
121
- - Gate server-side: `session_delete` y los comandos mutantes del puente
122
- (procesos, tuneles, revertir) solo para `admin`; la web oculta esos controles.
123
- - **Autor** en cada mensaje (auditoria) y muestra del usuario en el sidebar.
124
- - **Content-Security-Policy** y `Secure` de cookie solo desde loopback
125
- (`trust proxy` explicito).
126
-
127
- ### Cambiado
128
-
129
- - La sesion se invalida al cambiar la contrasena (`pv`); los usuarios
130
- deshabilitados no pueden entrar.
131
- - `app.json` migra el `username`/`password` legado a `users[]`.
132
-
133
- ## [0.3.0] - 2026-09-13
134
-
135
- ### Cambios
136
-
137
- - web: revertir un archivo puntual desde la vista cambios
138
- - cli: comando tunnel (estado/cambio de proveedor y dominio fijo)
139
- - web: plantillas de prompts y boton de revertir cambios
140
- - web: vista de cambios del proyecto (git status/diff) via el puente
141
- - release: recupera flags que npm se queda (--yes, --tag, --dry-run, --preid)
142
-
143
- ## [0.2.0] - 2026-09-13
144
-
145
- ### Cambios
146
-
147
- - web: muestra el costo acumulado por sesion y total
148
- - cli: QR de la URL (init/status/server y comando qr)
149
- - web: dictado por voz en el compositor (Web Speech API)
150
- - release: exporta logica de version/changelog y agrega tests
151
- - release: proceso privado con guard de dueno, semver y dist-tags
152
- - UI: porcentaje de contexto, boton ver archivos y badge plan; refresco de tokens al responder
153
-
154
- ## [0.1.0] - 2026-09-11
155
-
156
- Primera version publicada. Paquete npm **`@danieltmn/openbridge`** y repo
157
- **`tamnora/openbridge`** en GitHub (el nombre `openbridge` a secas esta bloqueado
158
- por npm por similitud con `open-bridge`).
159
-
160
- ### Agregado
161
-
162
- - CLI: `init`, `passwd`, `server`, `stop`, `status`, `logs`, `bridge`, `import`,
163
- `reset`, `autostart`, `doctor`, `version`, `help`.
164
- - Casa portable en `<base>/.openbridge/` (`config.json`, `app.json`,
165
- `folders.json`, `data/`, `logs/`), con **migracion automatica** del layout
166
- viejo.
167
- - Store JSON (`src/store/`) con mutex por archivo y escritura atomica.
168
- - Auth: cookie de sesion firmada, CSRF, remember-me, token del puente (scrypt) y
169
- **rate limit / lockout** de login (5 intentos, 15 min).
170
- - Server web (`src/web/`): router, templates, estaticos, SSE y API completa
171
- compatible con `app.js`/`bridge.js`; logs reales a `logs/server.log`.
172
- - Web Push (`src/push.js`): VAPID + `web-push`.
173
- - Tuneles enchufables: `tunnelmole`, `ngrok` y `cloudflare`.
174
- - `openbridge server` en segundo plano (muestra el estado al levantar);
175
- `--stream` para primer plano. `--detach` se mantiene como alias.
176
- - `bridge --api --token --id --name` para apuntar a otro hub sin editar
177
- `config.json`.
178
- - `import <data-dir>` (trae `data/` de OpenConex), `reset`
179
- (`--session <id>` / `--yes`) y `autostart install|remove` (Windows/Linux/macOS).
180
- - `logs --follow`, `logs --server` y `logs --bridge`.
181
- - Consumo de **tokens y capacidad de contexto** por sesion (sidebar, encabezado,
182
- statusbar y franja de trabajo); el puente sincroniza `models_ctx` desde
183
- `opencode models --verbose`.
184
- - Indicador KITT con bordes y estela luminosa.
185
- - Guard de Node < 18 con mensaje amigable.
186
- - Tests con `node --test` (store, auth, API, `safeJoinWorkspace`, migracion) y
187
- CI en Windows/Linux/macOS.
188
- - `docs/ARCHITECTURE.md`, `CHANGELOG.md`, `AGENTS.md`, README y LICENSE.
189
-
190
- ### Cambiado
191
-
192
- - **Login solo con contrasena**: se quito el campo de usuario (es un unico
193
- `admin`).
194
- - `init --force` y `passwd` detienen un server en ejecucion antes de reescribir
195
- la config, para no dejar la contrasena vieja en memoria.
196
- - `init`: contrasena oculta al escribir, resumen con credenciales/URL, validacion
197
- del proveedor de tunel y exclusion de `.openbridge/` en el escaneo.
198
- - `status`: muestra puente en linea y cantidad de chats.
199
- - `stop`: mata el arbol completo de procesos (Windows `taskkill /T`; POSIX grupo
200
- detached).
201
- - Mensaje claro cuando el puerto esta ocupado.
202
-
203
- ### Corregido
204
-
205
- - El servidor ya no falla en silencio: los errores y los 4xx/5xx van a
206
- `logs/server.log`.
207
- - Evita anidar `.openbridge/.openbridge` y valida la instancia ya corriendo.
7
+ ## [0.7.1] - 2026-09-17
8
+
9
+
10
+ ### Corregido
11
+
12
+ - `processes.allow` con el default viejo (`npm`/`node`/`npx`) se actualiza solo al
13
+ actualizar OpenBridge, asi `php`/`python`/`composer` quedan permitidos sin editar
14
+ la config a mano. Los `allow` personalizados se respetan.
15
+
16
+ ## [0.7.0] - 2026-09-17
17
+
18
+
19
+ ### Agregado
20
+
21
+ - **Panel del proyecto (escritorio)**: panel derecho colapsable con pestañas
22
+ **estructura** (arbol de carpetas/archivos del proyecto de la sesion) y **preview**
23
+ (iframe del dev server: `localhost`/LAN o la URL del tunel). Oculto en movil.
24
+ - **Dev run por proyecto**: el puente detecta como correrlo (`proc_detect`: scripts de
25
+ `package.json`, `composer.json`/`artisan` y entrypoints PHP) y los muestra como chips
26
+ en **procs**; recuerda el ultimo comando por carpeta. `processes.bins` permite mapear
27
+ binarios fuera del PATH (p. ej. `php`) y `allow` suma `php`/`python`/`composer`.
28
+
29
+ ### Cambiado
30
+
31
+ - CSP: se agrega `frame-src 'self' http: https:` para embeber la vista previa.
32
+
33
+ ## [0.6.4] - 2026-09-16
34
+
35
+ ### Cambiado
36
+
37
+ - **Color por proyecto** en la lista de sesiones y en el sidebar (hash estable
38
+ de la ruta) para distinguir los proyectos de un vistazo, y nombre un poco mas
39
+ grande.
40
+
41
+ ## [0.6.3] - 2026-09-15
42
+
43
+ ### Agregado
44
+
45
+ - **Sincronizacion casi en tiempo real**: el puente vigila la base de opencode
46
+ (`opencode.db`/`-wal`) y dispara un barrido tras ~8 s de calma, en vez de
47
+ esperar 15 min (que queda como respaldo cada 3 min).
48
+
49
+ ### Corregido
50
+
51
+ - El barrido ya **no se pierde** cuando opencode esta ocupado: se marca pendiente
52
+ y corre al terminar el mensaje (antes se salteaba el tick entero).
53
+ - **Mensajes del TUI en sesiones web**: las sesiones vinculadas a la web ya no
54
+ quedan solo con refresco de tokens; se importan los mensajes nuevos.
55
+ - **Sin duplicados**: el merge deduplica por el id de mensaje de opencode
56
+ (`oc_msg`) y "adopta" el mensaje optimista que publico la web. Paridad en el
57
+ hub Node (`store.sessionImport`) y en el PHP.
58
+
59
+ ## [0.6.2] - 2026-09-14
60
+
61
+ ### Corregido
62
+
63
+ - **Tunel en Windows**: los shims `.cmd` (p. ej. `tmole`) se lanzaban con doble
64
+ cita (`cmd.exe /d /s /c "\"ruta\""`) y fallaban con "no se reconoce como un
65
+ comando". Ahora se usa `windowsVerbatimArguments` y, si `tmole` falla, el
66
+ puente **reintenta con `npx --yes tunnelmole`** (antes solo lo intentaba si
67
+ `tmole` no estaba en el PATH). Timeout del tunel: 85 s.
68
+
69
+ ## [0.6.1] - 2026-09-14
70
+
71
+ ### Agregado
72
+
73
+ - `openbridge bridge --background` (segundo plano; sobrevive al cierre de la
74
+ consola), `--stop` y `--status`. `openbridge pair`/`join` aceptan `--background`.
75
+
76
+ ### Corregido
77
+
78
+ - `autostart` corre solo el puente cuando la PC pertenece a un hub remoto
79
+ (`join`/`pair`), en vez del server local.
80
+
81
+ ## [0.6.0] - 2026-09-14
82
+
83
+ ### Agregado
84
+
85
+ - **Hub PHP** para correr la app en un hosting (cPanel) con URL fija, sin tunel
86
+ (`php/app` + `scripts/build-php-hub.mjs`; comparte el frontend con el hub Node).
87
+ Auth multiusuario con scrypt compatible con Node (usa `sodium`; si falta, scrypt
88
+ puro en PHP), roles, cookie de sesion firmada, rate limit y CSP.
89
+ - **Emparejamiento por codigo** (`openbridge pair <url>`): la PC muestra un codigo,
90
+ el usuario lo ingresa en la web (Dispositivos) y la PC recibe su **token propio**
91
+ y revocable. Cada usuario ve solo sus PCs; el admin, todas.
92
+ - Comando `openbridge pair` y vista **Dispositivos** en la web (solo en el hub PHP,
93
+ gateada por `features.pairing`).
94
+ - `docs/DEPLOY-PHP.md`: guia de despliegue del hub PHP.
95
+
96
+ ## [0.5.2] - 2026-09-14
97
+
98
+ ### Corregido
99
+
100
+ - Diagnostico de puerto ocupado: `status` y `server` muestran que **PID** usa el
101
+ puerto (suele ser otra casa con otro `--dir`) y, si el arranque en segundo plano
102
+ muere, se muestran las ultimas lineas de `server.log`.
103
+ - `store`: reintentos con backoff en el `rename` atomico (EPERM/EACCES/EBUSY en
104
+ Windows) y limpieza del `.tmp` si no se puede.
105
+
106
+ ## [0.5.1] - 2026-09-14
107
+
108
+ ### Corregido
109
+
110
+ - `openbridge join` normaliza la URL del hub a `/api.php` (antes, pasar la base
111
+ o `/chat.php` apuntaba a `/` y el puente se quedaba sin trabajo).
112
+
113
+ ## [0.5.0] - 2026-09-14
114
+
115
+ ### Agregado
116
+
117
+ - Comando `openbridge update` (compara con npm; `--yes` actualiza la instalacion
118
+ global).
119
+ - Comando `openbridge join <url>` para sumar una PC como puente de un hub:
120
+ persiste `apiUrl`/`apiToken`/`bridgeId` y arranca el puente (`--no-start` solo
121
+ guarda).
122
+ - `npm run lint` (`scripts/lint.mjs`): `node --check` sobre todo el JS; corre en
123
+ CI.
124
+ - Test end-to-end del puente con `opencode` mockeado (`test/bridge.test.js`) y
125
+ tests del CLI (`test/cli.test.js`).
126
+ - **MCP**: vista en la web y comando de chat `/mcp` que muestran los servidores
127
+ MCP de opencode y su estado (`opencode mcp list`); comando de puente
128
+ `mcp_list`.
129
+ - `CONTRIBUTING.md`.
130
+
131
+ ### Cambiado
132
+
133
+ - Claves internas `ocx_*` renombradas a `ob_*` con migracion automatica
134
+ (localStorage y cookie de tema). Se mantienen como compatibilidad el env
135
+ `OPENCONEX_HOME` y el bin `openconex` (deprecados).
136
+ - `config.command` puede apuntar a un script de Node (`.js`/`.mjs`/`.cjs`): se
137
+ ejecuta con el `node` actual (wrappers propios y pruebas con CLI simulado).
138
+
139
+ ## [0.4.0] - 2026-09-14
140
+
141
+ ### Agregado
142
+
143
+ - **Multiusuario** con roles `admin`/`user`: login con usuario + contrasena,
144
+ sesion ligada al usuario y a la version de contrasena, rate limit por
145
+ IP+usuario, y comando CLI `users`
146
+ (`list`/`add`/`remove`/`passwd`/`role`/`disable`/`enable`); `passwd --user`.
147
+ - Gate server-side: `session_delete` y los comandos mutantes del puente
148
+ (procesos, tuneles, revertir) solo para `admin`; la web oculta esos controles.
149
+ - **Autor** en cada mensaje (auditoria) y muestra del usuario en el sidebar.
150
+ - **Content-Security-Policy** y `Secure` de cookie solo desde loopback
151
+ (`trust proxy` explicito).
152
+
153
+ ### Cambiado
154
+
155
+ - La sesion se invalida al cambiar la contrasena (`pv`); los usuarios
156
+ deshabilitados no pueden entrar.
157
+ - `app.json` migra el `username`/`password` legado a `users[]`.
158
+
159
+ ## [0.3.0] - 2026-09-13
160
+
161
+ ### Cambios
162
+
163
+ - web: revertir un archivo puntual desde la vista cambios
164
+ - cli: comando tunnel (estado/cambio de proveedor y dominio fijo)
165
+ - web: plantillas de prompts y boton de revertir cambios
166
+ - web: vista de cambios del proyecto (git status/diff) via el puente
167
+ - release: recupera flags que npm se queda (--yes, --tag, --dry-run, --preid)
168
+
169
+ ## [0.2.0] - 2026-09-13
170
+
171
+ ### Cambios
172
+
173
+ - web: muestra el costo acumulado por sesion y total
174
+ - cli: QR de la URL (init/status/server y comando qr)
175
+ - web: dictado por voz en el compositor (Web Speech API)
176
+ - release: exporta logica de version/changelog y agrega tests
177
+ - release: proceso privado con guard de dueno, semver y dist-tags
178
+ - UI: porcentaje de contexto, boton ver archivos y badge plan; refresco de tokens al responder
179
+
180
+ ## [0.1.0] - 2026-09-11
181
+
182
+ Primera version publicada. Paquete npm **`@danieltmn/openbridge`** y repo
183
+ **`tamnora/openbridge`** en GitHub (el nombre `openbridge` a secas esta bloqueado
184
+ por npm por similitud con `open-bridge`).
185
+
186
+ ### Agregado
187
+
188
+ - CLI: `init`, `passwd`, `server`, `stop`, `status`, `logs`, `bridge`, `import`,
189
+ `reset`, `autostart`, `doctor`, `version`, `help`.
190
+ - Casa portable en `<base>/.openbridge/` (`config.json`, `app.json`,
191
+ `folders.json`, `data/`, `logs/`), con **migracion automatica** del layout
192
+ viejo.
193
+ - Store JSON (`src/store/`) con mutex por archivo y escritura atomica.
194
+ - Auth: cookie de sesion firmada, CSRF, remember-me, token del puente (scrypt) y
195
+ **rate limit / lockout** de login (5 intentos, 15 min).
196
+ - Server web (`src/web/`): router, templates, estaticos, SSE y API completa
197
+ compatible con `app.js`/`bridge.js`; logs reales a `logs/server.log`.
198
+ - Web Push (`src/push.js`): VAPID + `web-push`.
199
+ - Tuneles enchufables: `tunnelmole`, `ngrok` y `cloudflare`.
200
+ - `openbridge server` en segundo plano (muestra el estado al levantar);
201
+ `--stream` para primer plano. `--detach` se mantiene como alias.
202
+ - `bridge --api --token --id --name` para apuntar a otro hub sin editar
203
+ `config.json`.
204
+ - `import <data-dir>` (trae `data/` de OpenConex), `reset`
205
+ (`--session <id>` / `--yes`) y `autostart install|remove` (Windows/Linux/macOS).
206
+ - `logs --follow`, `logs --server` y `logs --bridge`.
207
+ - Consumo de **tokens y capacidad de contexto** por sesion (sidebar, encabezado,
208
+ statusbar y franja de trabajo); el puente sincroniza `models_ctx` desde
209
+ `opencode models --verbose`.
210
+ - Indicador KITT con bordes y estela luminosa.
211
+ - Guard de Node < 18 con mensaje amigable.
212
+ - Tests con `node --test` (store, auth, API, `safeJoinWorkspace`, migracion) y
213
+ CI en Windows/Linux/macOS.
214
+ - `docs/ARCHITECTURE.md`, `CHANGELOG.md`, `AGENTS.md`, README y LICENSE.
215
+
216
+ ### Cambiado
217
+
218
+ - **Login solo con contrasena**: se quito el campo de usuario (es un unico
219
+ `admin`).
220
+ - `init --force` y `passwd` detienen un server en ejecucion antes de reescribir
221
+ la config, para no dejar la contrasena vieja en memoria.
222
+ - `init`: contrasena oculta al escribir, resumen con credenciales/URL, validacion
223
+ del proveedor de tunel y exclusion de `.openbridge/` en el escaneo.
224
+ - `status`: muestra puente en linea y cantidad de chats.
225
+ - `stop`: mata el arbol completo de procesos (Windows `taskkill /T`; POSIX grupo
226
+ detached).
227
+ - Mensaje claro cuando el puerto esta ocupado.
228
+
229
+ ### Corregido
230
+
231
+ - El servidor ya no falla en silencio: los errores y los 4xx/5xx van a
232
+ `logs/server.log`.
233
+ - Evita anidar `.openbridge/.openbridge` y valida la instancia ya corriendo.
package/README.md CHANGED
@@ -155,6 +155,40 @@ vigila la base de opencode (`opencode.db`) y sincroniza a los pocos segundos
155
155
  revés), los mensajes nuevos se agregan sin duplicarse: el merge identifica cada
156
156
  mensaje por su id de opencode (`oc_msg`).
157
157
 
158
+ ## Panel del proyecto y dev run (escritorio)
159
+
160
+ En pantallas de escritorio la app muestra un **panel derecho** (botón `▥` en el
161
+ encabezado; se puede colapsar y ajustar el ancho) con dos pestañas:
162
+
163
+ - **estructura**: árbol de carpetas y archivos del proyecto de la sesión abierta;
164
+ al tocar un archivo se abre en el visor. Se oculta en el celular.
165
+ - **preview**: embebe el dev server en un `iframe`. Si el navegador está en la
166
+ misma PC/LAN que el puente usa `http://127.0.0.1:<puerto>`; si estás remoto, el
167
+ botón **túnel** levanta un TunnelMole y embebe esa URL.
168
+
169
+ Para arrancar el server de desarrollo, la vista **procs** detecta cómo correr
170
+ cada proyecto (`proc_detect`): mira `package.json` (scripts `dev`/`start`/`serve`/
171
+ `preview`), `composer.json`/`artisan` y entrypoints PHP (`public/index.php`,
172
+ `backend/public/index.php`, `index.php`), y ofrece los comandos como chips.
173
+ Recuerda el último comando usado por carpeta.
174
+
175
+ El puente solo ejecuta binarios permitidos en `bridge/config.json`:
176
+
177
+ ```json
178
+ {
179
+ "processes": {
180
+ "enabled": true,
181
+ "allow": ["npm", "node", "npx", "php", "python", "composer"],
182
+ "bins": { "php": "C:\\xampp\\php\\php.exe" }
183
+ }
184
+ }
185
+ ```
186
+
187
+ `allow` es la lista blanca (ya trae `php`/`python`/`composer`; una config con el
188
+ default viejo `npm`/`node`/`npx` se actualiza sola al actualizar OpenBridge). `bins`
189
+ mapea un nombre a una ruta absoluta cuando el ejecutable **no** está en el `PATH`.
190
+ Los comandos corren **sin shell** y con `cwd` dentro del workspace.
191
+
158
192
  ## Hub en hosting PHP (URL fija, sin túnel)
159
193
 
160
194
  Además del hub Node, OpenBridge puede correr su hub en un **hosting PHP** (cPanel),
@@ -219,8 +253,9 @@ puente, así que refleja la configuración de opencode de esa computadora.
219
253
  token del puente autogenerado.
220
254
  - La cookie usa `Secure` cuando el pedido llega por HTTPS **desde loopback** (el
221
255
  túnel); no se confía en `X-Forwarded-Proto` de otros orígenes.
222
- - Respuestas con `Content-Security-Policy` (orígenes externos, frames y objetos
223
- bloqueados), `X-Content-Type-Options: nosniff`, `X-Frame-Options: DENY` y
256
+ - Respuestas con `Content-Security-Policy` (orígenes externos, objetos y
257
+ `frame-ancestors` bloqueados; `frame-src` permite embeber la vista previa del
258
+ dev server), `X-Content-Type-Options: nosniff`, `X-Frame-Options: DENY` y
224
259
  `Referrer-Policy: no-referrer`.
225
260
  - El túnel es **público mientras corre**: detenelo (`openbridge stop`) cuando no
226
261
  lo uses y mantené la contraseña fuerte.
@@ -259,9 +294,10 @@ en primer plano), `stop`, `status`, `qr`, `tunnel`, `logs` (`--follow`), `bridge
259
294
  **multiusuario** con roles `admin`/`user` y rate limit; API completa y SSE;
260
295
  catálogo por PC; Web Push; túnel (TunnelMole/ngrok/cloudflare); y en la web: chat
261
296
  con streaming, adjuntar imagen, dictado por voz, plantillas de prompts,
262
- tokens/contexto y **costo** por sesión, vista de archivos, vista de **cambios**
263
- (git status/diff) con **revertir**, búsqueda global, sesiones de opencode y
264
- **autor** en cada mensaje. Tests en `npm test` (28).
297
+ tokens/contexto y **costo** por sesión, vista de archivos, **panel derecho** de
298
+ estructura y vista previa (escritorio), **procs** con detección de dev run por
299
+ proyecto, vista de **cambios** (git status/diff) con **revertir**, búsqueda global,
300
+ sesiones de opencode y **autor** en cada mensaje. Tests en `npm test` (40).
265
301
 
266
302
  ## Licencia
267
303
 
@@ -29,9 +29,9 @@ el estado); `--stream` lo deja en primer plano.
29
29
  | `src/tunnel/` | Proveedores de tunel enchufables. |
30
30
  | `src/web/server.js` | Servidor HTTP, estaticos, cabeceras de seguridad (CSP). |
31
31
  | `src/web/routes.js` | Router de paginas y API (`?action=...`), gate de roles, compatible con `app.js`/`bridge.js`. |
32
- | `src/web/assets/` | Frontend (`app.js`, temas, iconos, service worker, manifest). |
32
+ | `src/web/assets/` | Frontend (`app.js`, temas, iconos, service worker, manifest), panel derecho (estructura/preview). |
33
33
  | `src/store/` | Store JSON con mutex por archivo y escritura atomica. |
34
- | `src/bridge/bridge.js` | Puente: sincroniza catalogo, hace poll y ejecuta opencode; comandos fs/proc/tunel/git. |
34
+ | `src/bridge/bridge.js` | Puente: sincroniza catalogo, hace poll y ejecuta opencode; comandos fs/proc/tunel/git y deteccion de dev run (`proc_detect`). |
35
35
  | `scripts/release.mjs` | Release local (fuera del paquete npm): version, changelog, tag, push y publish. |
36
36
 
37
37
  ## Casa portable
@@ -96,13 +96,21 @@ resuelve (los resultados vuelven por `command_done`/`fs_result`). Sirve tanto en
96
96
  local como en remoto:
97
97
 
98
98
  - Lectura: `models`, `session_list`, `session_info`, `opencode_version`,
99
- `fs_list`, `fs_read`, `proc_list`, `proc_log`, `tunnel_list`, `git_status`,
100
- `git_diff`.
99
+ `fs_list`, `fs_read`, `proc_list`, `proc_log`, `proc_detect`, `tunnel_list`,
100
+ `git_status`, `git_diff`.
101
101
  - Mutantes (solo `admin`): `proc_start`, `proc_stop`, `tunnel_start`,
102
102
  `tunnel_stop`, `git_checkout`.
103
103
 
104
104
  Las rutas se validan contra el workspace (`procResolveFolder`/`resolveInWorkspace`)
105
- y los argumentos con una whitelist (`OC_ALLOWED`).
105
+ y los argumentos con una whitelist (`OC_ALLOWED`). `proc_detect` es read-only:
106
+ inspecciona el proyecto (`package.json`, `composer.json`/`artisan`, entrypoints
107
+ PHP) y devuelve los comandos sugeridos para correrlo en dev.
108
+
109
+ `proc_start` solo ejecuta binarios de `bridge/config.json → processes.allow` (ya
110
+ incluye `php`/`python`/`composer`; una config con el default viejo `npm`/`node`/
111
+ `npx` se actualiza sola al actualizar OpenBridge, y los allow personalizados se
112
+ respetan); `processes.bins` mapea un nombre a una ruta absoluta para ejecutables
113
+ fuera del `PATH`. Corre sin shell y con `cwd` dentro del workspace.
106
114
 
107
115
  ## Decisiones
108
116
 
@@ -115,7 +123,8 @@ y los argumentos con una whitelist (`OC_ALLOWED`).
115
123
  - **Sin dependencias de framework**: HTTP nativo de Node; la unica dependencia
116
124
  es `web-push`. El QR se genera con codigo propio (`src/qr.js`).
117
125
  - **Cabeceras de seguridad**: CSP restrictiva; permite scripts/estilos inline
118
- porque los templates los usan.
126
+ porque los templates los usan, y `frame-src` para embeber la vista previa
127
+ (dev server local/LAN o la URL del tunel).
119
128
  - **Cola de comandos del puente**: un solo canal (poll) para fs, procesos,
120
129
  tuneles y git, valido igual en local y remoto.
121
130
  - **Proveedores de tunel detras de una interfaz**: `startTunnel(port, provider)`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@danieltmn/openbridge",
3
- "version": "0.6.4",
3
+ "version": "0.7.1",
4
4
  "description": "Tu opencode en el celular, sin hosting: corre la app, el puente y un tunel publico desde tu PC.",
5
5
  "type": "commonjs",
6
6
  "author": "tamnora",