@danieltmn/openbridge 0.6.3 → 0.7.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/CHANGELOG.md +222 -197
- package/README.md +41 -5
- package/docs/ARCHITECTURE.md +14 -6
- package/package.json +1 -1
- package/src/bridge/bridge.js +2587 -2495
- package/src/web/assets/app.js +4802 -4454
- package/src/web/routes.js +915 -914
- package/src/web/server.js +3 -1
- package/src/web/templates/chat.html +1468 -1374
package/CHANGELOG.md
CHANGED
|
@@ -1,199 +1,224 @@
|
|
|
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.
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
- `
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
## [0.
|
|
73
|
-
|
|
74
|
-
###
|
|
75
|
-
|
|
76
|
-
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
- Comando `openbridge
|
|
84
|
-
|
|
85
|
-
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
-
|
|
114
|
-
|
|
115
|
-
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
-
|
|
141
|
-
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
###
|
|
153
|
-
|
|
154
|
-
-
|
|
155
|
-
|
|
156
|
-
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
-
|
|
165
|
-
-
|
|
166
|
-
-
|
|
167
|
-
|
|
168
|
-
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
-
|
|
191
|
-
- `
|
|
192
|
-
|
|
193
|
-
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
-
|
|
198
|
-
|
|
199
|
-
|
|
7
|
+
## [0.7.0] - 2026-09-17
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
### Agregado
|
|
11
|
+
|
|
12
|
+
- **Panel del proyecto (escritorio)**: panel derecho colapsable con pestañas
|
|
13
|
+
**estructura** (arbol de carpetas/archivos del proyecto de la sesion) y **preview**
|
|
14
|
+
(iframe del dev server: `localhost`/LAN o la URL del tunel). Oculto en movil.
|
|
15
|
+
- **Dev run por proyecto**: el puente detecta como correrlo (`proc_detect`: scripts de
|
|
16
|
+
`package.json`, `composer.json`/`artisan` y entrypoints PHP) y los muestra como chips
|
|
17
|
+
en **procs**; recuerda el ultimo comando por carpeta. `processes.bins` permite mapear
|
|
18
|
+
binarios fuera del PATH (p. ej. `php`) y `allow` suma `php`/`python`/`composer`.
|
|
19
|
+
|
|
20
|
+
### Cambiado
|
|
21
|
+
|
|
22
|
+
- CSP: se agrega `frame-src 'self' http: https:` para embeber la vista previa.
|
|
23
|
+
|
|
24
|
+
## [0.6.4] - 2026-09-16
|
|
25
|
+
|
|
26
|
+
### Cambiado
|
|
27
|
+
|
|
28
|
+
- **Color por proyecto** en la lista de sesiones y en el sidebar (hash estable
|
|
29
|
+
de la ruta) para distinguir los proyectos de un vistazo, y nombre un poco mas
|
|
30
|
+
grande.
|
|
31
|
+
|
|
32
|
+
## [0.6.3] - 2026-09-15
|
|
33
|
+
|
|
34
|
+
### Agregado
|
|
35
|
+
|
|
36
|
+
- **Sincronizacion casi en tiempo real**: el puente vigila la base de opencode
|
|
37
|
+
(`opencode.db`/`-wal`) y dispara un barrido tras ~8 s de calma, en vez de
|
|
38
|
+
esperar 15 min (que queda como respaldo cada 3 min).
|
|
39
|
+
|
|
40
|
+
### Corregido
|
|
41
|
+
|
|
42
|
+
- El barrido ya **no se pierde** cuando opencode esta ocupado: se marca pendiente
|
|
43
|
+
y corre al terminar el mensaje (antes se salteaba el tick entero).
|
|
44
|
+
- **Mensajes del TUI en sesiones web**: las sesiones vinculadas a la web ya no
|
|
45
|
+
quedan solo con refresco de tokens; se importan los mensajes nuevos.
|
|
46
|
+
- **Sin duplicados**: el merge deduplica por el id de mensaje de opencode
|
|
47
|
+
(`oc_msg`) y "adopta" el mensaje optimista que publico la web. Paridad en el
|
|
48
|
+
hub Node (`store.sessionImport`) y en el PHP.
|
|
49
|
+
|
|
50
|
+
## [0.6.2] - 2026-09-14
|
|
51
|
+
|
|
52
|
+
### Corregido
|
|
53
|
+
|
|
54
|
+
- **Tunel en Windows**: los shims `.cmd` (p. ej. `tmole`) se lanzaban con doble
|
|
55
|
+
cita (`cmd.exe /d /s /c "\"ruta\""`) y fallaban con "no se reconoce como un
|
|
56
|
+
comando". Ahora se usa `windowsVerbatimArguments` y, si `tmole` falla, el
|
|
57
|
+
puente **reintenta con `npx --yes tunnelmole`** (antes solo lo intentaba si
|
|
58
|
+
`tmole` no estaba en el PATH). Timeout del tunel: 85 s.
|
|
59
|
+
|
|
60
|
+
## [0.6.1] - 2026-09-14
|
|
61
|
+
|
|
62
|
+
### Agregado
|
|
63
|
+
|
|
64
|
+
- `openbridge bridge --background` (segundo plano; sobrevive al cierre de la
|
|
65
|
+
consola), `--stop` y `--status`. `openbridge pair`/`join` aceptan `--background`.
|
|
66
|
+
|
|
67
|
+
### Corregido
|
|
68
|
+
|
|
69
|
+
- `autostart` corre solo el puente cuando la PC pertenece a un hub remoto
|
|
70
|
+
(`join`/`pair`), en vez del server local.
|
|
71
|
+
|
|
72
|
+
## [0.6.0] - 2026-09-14
|
|
73
|
+
|
|
74
|
+
### Agregado
|
|
75
|
+
|
|
76
|
+
- **Hub PHP** para correr la app en un hosting (cPanel) con URL fija, sin tunel
|
|
77
|
+
(`php/app` + `scripts/build-php-hub.mjs`; comparte el frontend con el hub Node).
|
|
78
|
+
Auth multiusuario con scrypt compatible con Node (usa `sodium`; si falta, scrypt
|
|
79
|
+
puro en PHP), roles, cookie de sesion firmada, rate limit y CSP.
|
|
80
|
+
- **Emparejamiento por codigo** (`openbridge pair <url>`): la PC muestra un codigo,
|
|
81
|
+
el usuario lo ingresa en la web (Dispositivos) y la PC recibe su **token propio**
|
|
82
|
+
y revocable. Cada usuario ve solo sus PCs; el admin, todas.
|
|
83
|
+
- Comando `openbridge pair` y vista **Dispositivos** en la web (solo en el hub PHP,
|
|
84
|
+
gateada por `features.pairing`).
|
|
85
|
+
- `docs/DEPLOY-PHP.md`: guia de despliegue del hub PHP.
|
|
86
|
+
|
|
87
|
+
## [0.5.2] - 2026-09-14
|
|
88
|
+
|
|
89
|
+
### Corregido
|
|
90
|
+
|
|
91
|
+
- Diagnostico de puerto ocupado: `status` y `server` muestran que **PID** usa el
|
|
92
|
+
puerto (suele ser otra casa con otro `--dir`) y, si el arranque en segundo plano
|
|
93
|
+
muere, se muestran las ultimas lineas de `server.log`.
|
|
94
|
+
- `store`: reintentos con backoff en el `rename` atomico (EPERM/EACCES/EBUSY en
|
|
95
|
+
Windows) y limpieza del `.tmp` si no se puede.
|
|
96
|
+
|
|
97
|
+
## [0.5.1] - 2026-09-14
|
|
98
|
+
|
|
99
|
+
### Corregido
|
|
100
|
+
|
|
101
|
+
- `openbridge join` normaliza la URL del hub a `/api.php` (antes, pasar la base
|
|
102
|
+
o `/chat.php` apuntaba a `/` y el puente se quedaba sin trabajo).
|
|
103
|
+
|
|
104
|
+
## [0.5.0] - 2026-09-14
|
|
105
|
+
|
|
106
|
+
### Agregado
|
|
107
|
+
|
|
108
|
+
- Comando `openbridge update` (compara con npm; `--yes` actualiza la instalacion
|
|
109
|
+
global).
|
|
110
|
+
- Comando `openbridge join <url>` para sumar una PC como puente de un hub:
|
|
111
|
+
persiste `apiUrl`/`apiToken`/`bridgeId` y arranca el puente (`--no-start` solo
|
|
112
|
+
guarda).
|
|
113
|
+
- `npm run lint` (`scripts/lint.mjs`): `node --check` sobre todo el JS; corre en
|
|
114
|
+
CI.
|
|
115
|
+
- Test end-to-end del puente con `opencode` mockeado (`test/bridge.test.js`) y
|
|
116
|
+
tests del CLI (`test/cli.test.js`).
|
|
117
|
+
- **MCP**: vista en la web y comando de chat `/mcp` que muestran los servidores
|
|
118
|
+
MCP de opencode y su estado (`opencode mcp list`); comando de puente
|
|
119
|
+
`mcp_list`.
|
|
120
|
+
- `CONTRIBUTING.md`.
|
|
121
|
+
|
|
122
|
+
### Cambiado
|
|
123
|
+
|
|
124
|
+
- Claves internas `ocx_*` renombradas a `ob_*` con migracion automatica
|
|
125
|
+
(localStorage y cookie de tema). Se mantienen como compatibilidad el env
|
|
126
|
+
`OPENCONEX_HOME` y el bin `openconex` (deprecados).
|
|
127
|
+
- `config.command` puede apuntar a un script de Node (`.js`/`.mjs`/`.cjs`): se
|
|
128
|
+
ejecuta con el `node` actual (wrappers propios y pruebas con CLI simulado).
|
|
129
|
+
|
|
130
|
+
## [0.4.0] - 2026-09-14
|
|
131
|
+
|
|
132
|
+
### Agregado
|
|
133
|
+
|
|
134
|
+
- **Multiusuario** con roles `admin`/`user`: login con usuario + contrasena,
|
|
135
|
+
sesion ligada al usuario y a la version de contrasena, rate limit por
|
|
136
|
+
IP+usuario, y comando CLI `users`
|
|
137
|
+
(`list`/`add`/`remove`/`passwd`/`role`/`disable`/`enable`); `passwd --user`.
|
|
138
|
+
- Gate server-side: `session_delete` y los comandos mutantes del puente
|
|
139
|
+
(procesos, tuneles, revertir) solo para `admin`; la web oculta esos controles.
|
|
140
|
+
- **Autor** en cada mensaje (auditoria) y muestra del usuario en el sidebar.
|
|
141
|
+
- **Content-Security-Policy** y `Secure` de cookie solo desde loopback
|
|
142
|
+
(`trust proxy` explicito).
|
|
143
|
+
|
|
144
|
+
### Cambiado
|
|
145
|
+
|
|
146
|
+
- La sesion se invalida al cambiar la contrasena (`pv`); los usuarios
|
|
147
|
+
deshabilitados no pueden entrar.
|
|
148
|
+
- `app.json` migra el `username`/`password` legado a `users[]`.
|
|
149
|
+
|
|
150
|
+
## [0.3.0] - 2026-09-13
|
|
151
|
+
|
|
152
|
+
### Cambios
|
|
153
|
+
|
|
154
|
+
- web: revertir un archivo puntual desde la vista cambios
|
|
155
|
+
- cli: comando tunnel (estado/cambio de proveedor y dominio fijo)
|
|
156
|
+
- web: plantillas de prompts y boton de revertir cambios
|
|
157
|
+
- web: vista de cambios del proyecto (git status/diff) via el puente
|
|
158
|
+
- release: recupera flags que npm se queda (--yes, --tag, --dry-run, --preid)
|
|
159
|
+
|
|
160
|
+
## [0.2.0] - 2026-09-13
|
|
161
|
+
|
|
162
|
+
### Cambios
|
|
163
|
+
|
|
164
|
+
- web: muestra el costo acumulado por sesion y total
|
|
165
|
+
- cli: QR de la URL (init/status/server y comando qr)
|
|
166
|
+
- web: dictado por voz en el compositor (Web Speech API)
|
|
167
|
+
- release: exporta logica de version/changelog y agrega tests
|
|
168
|
+
- release: proceso privado con guard de dueno, semver y dist-tags
|
|
169
|
+
- UI: porcentaje de contexto, boton ver archivos y badge plan; refresco de tokens al responder
|
|
170
|
+
|
|
171
|
+
## [0.1.0] - 2026-09-11
|
|
172
|
+
|
|
173
|
+
Primera version publicada. Paquete npm **`@danieltmn/openbridge`** y repo
|
|
174
|
+
**`tamnora/openbridge`** en GitHub (el nombre `openbridge` a secas esta bloqueado
|
|
175
|
+
por npm por similitud con `open-bridge`).
|
|
176
|
+
|
|
177
|
+
### Agregado
|
|
178
|
+
|
|
179
|
+
- CLI: `init`, `passwd`, `server`, `stop`, `status`, `logs`, `bridge`, `import`,
|
|
180
|
+
`reset`, `autostart`, `doctor`, `version`, `help`.
|
|
181
|
+
- Casa portable en `<base>/.openbridge/` (`config.json`, `app.json`,
|
|
182
|
+
`folders.json`, `data/`, `logs/`), con **migracion automatica** del layout
|
|
183
|
+
viejo.
|
|
184
|
+
- Store JSON (`src/store/`) con mutex por archivo y escritura atomica.
|
|
185
|
+
- Auth: cookie de sesion firmada, CSRF, remember-me, token del puente (scrypt) y
|
|
186
|
+
**rate limit / lockout** de login (5 intentos, 15 min).
|
|
187
|
+
- Server web (`src/web/`): router, templates, estaticos, SSE y API completa
|
|
188
|
+
compatible con `app.js`/`bridge.js`; logs reales a `logs/server.log`.
|
|
189
|
+
- Web Push (`src/push.js`): VAPID + `web-push`.
|
|
190
|
+
- Tuneles enchufables: `tunnelmole`, `ngrok` y `cloudflare`.
|
|
191
|
+
- `openbridge server` en segundo plano (muestra el estado al levantar);
|
|
192
|
+
`--stream` para primer plano. `--detach` se mantiene como alias.
|
|
193
|
+
- `bridge --api --token --id --name` para apuntar a otro hub sin editar
|
|
194
|
+
`config.json`.
|
|
195
|
+
- `import <data-dir>` (trae `data/` de OpenConex), `reset`
|
|
196
|
+
(`--session <id>` / `--yes`) y `autostart install|remove` (Windows/Linux/macOS).
|
|
197
|
+
- `logs --follow`, `logs --server` y `logs --bridge`.
|
|
198
|
+
- Consumo de **tokens y capacidad de contexto** por sesion (sidebar, encabezado,
|
|
199
|
+
statusbar y franja de trabajo); el puente sincroniza `models_ctx` desde
|
|
200
|
+
`opencode models --verbose`.
|
|
201
|
+
- Indicador KITT con bordes y estela luminosa.
|
|
202
|
+
- Guard de Node < 18 con mensaje amigable.
|
|
203
|
+
- Tests con `node --test` (store, auth, API, `safeJoinWorkspace`, migracion) y
|
|
204
|
+
CI en Windows/Linux/macOS.
|
|
205
|
+
- `docs/ARCHITECTURE.md`, `CHANGELOG.md`, `AGENTS.md`, README y LICENSE.
|
|
206
|
+
|
|
207
|
+
### Cambiado
|
|
208
|
+
|
|
209
|
+
- **Login solo con contrasena**: se quito el campo de usuario (es un unico
|
|
210
|
+
`admin`).
|
|
211
|
+
- `init --force` y `passwd` detienen un server en ejecucion antes de reescribir
|
|
212
|
+
la config, para no dejar la contrasena vieja en memoria.
|
|
213
|
+
- `init`: contrasena oculta al escribir, resumen con credenciales/URL, validacion
|
|
214
|
+
del proveedor de tunel y exclusion de `.openbridge/` en el escaneo.
|
|
215
|
+
- `status`: muestra puente en linea y cantidad de chats.
|
|
216
|
+
- `stop`: mata el arbol completo de procesos (Windows `taskkill /T`; POSIX grupo
|
|
217
|
+
detached).
|
|
218
|
+
- Mensaje claro cuando el puerto esta ocupado.
|
|
219
|
+
|
|
220
|
+
### Corregido
|
|
221
|
+
|
|
222
|
+
- El servidor ya no falla en silencio: los errores y los 4xx/5xx van a
|
|
223
|
+
`logs/server.log`.
|
|
224
|
+
- 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 (las instalaciones nuevas ya traen `php`/`python`/
|
|
188
|
+
`composer`; si actualizás una vieja, agregalos a mano). `bins` mapea un nombre a
|
|
189
|
+
una ruta absoluta cuando el ejecutable **no** está en el `PATH`. Los comandos
|
|
190
|
+
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,
|
|
223
|
-
|
|
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,
|
|
263
|
-
(
|
|
264
|
-
**
|
|
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
|
|
package/docs/ARCHITECTURE.md
CHANGED
|
@@ -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,20 @@ 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`, `
|
|
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` (las
|
|
110
|
+
instalaciones nuevas incluyen `php`/`python`/`composer`); `processes.bins` mapea un
|
|
111
|
+
nombre a una ruta absoluta para ejecutables fuera del `PATH`. Corre sin shell y con
|
|
112
|
+
`cwd` dentro del workspace.
|
|
106
113
|
|
|
107
114
|
## Decisiones
|
|
108
115
|
|
|
@@ -115,7 +122,8 @@ y los argumentos con una whitelist (`OC_ALLOWED`).
|
|
|
115
122
|
- **Sin dependencias de framework**: HTTP nativo de Node; la unica dependencia
|
|
116
123
|
es `web-push`. El QR se genera con codigo propio (`src/qr.js`).
|
|
117
124
|
- **Cabeceras de seguridad**: CSP restrictiva; permite scripts/estilos inline
|
|
118
|
-
porque los templates los usan
|
|
125
|
+
porque los templates los usan, y `frame-src` para embeber la vista previa
|
|
126
|
+
(dev server local/LAN o la URL del tunel).
|
|
119
127
|
- **Cola de comandos del puente**: un solo canal (poll) para fs, procesos,
|
|
120
128
|
tuneles y git, valido igual en local y remoto.
|
|
121
129
|
- **Proveedores de tunel detras de una interfaz**: `startTunnel(port, provider)`
|
package/package.json
CHANGED