@dotrino/vaultd 0.124.0 → 0.124.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dotrino/vaultd",
3
- "version": "0.124.0",
3
+ "version": "0.124.1",
4
4
  "type": "module",
5
5
  "description": "Certificador personal de Dotrino: daemon headless que custodia la clave maestra y delega capacidades a tus dispositivos por el proxy. Tu CA propia.",
6
6
  "bin": {
package/src/ctl.js CHANGED
@@ -612,7 +612,11 @@ async function cmdMembers () {
612
612
  // Un servicio SIN llave de cifrado no puede leer ninguna variable privada: van
613
613
  // selladas a esa llave. Se dice aquí, junto a él, porque es el único sitio donde
614
614
  // se mira quién es quién — y en la lista de variables ya seria tarde.
615
- if (m.cn && !m.canSeal) console.log(' %ssin llave de cifrado: NO puede leer sus variables%s', R, Z)
615
+ //
616
+ // Solo si LEE variables (`secrets`). La llave de comunicación de la bóveda entra con
617
+ // `cn: 'vault'` y solo `firma`, y no tiene llave de cifrado a propósito: salía marcada
618
+ // en rojo «NO puede leer sus variables» cuando no tiene ninguna que leer.
619
+ if (m.cn && !m.canSeal && m.caps.includes('secrets')) console.log(' %ssin llave de cifrado: NO puede leer sus variables%s', R, Z)
616
620
  // QUÉ CORRE, y si cuadra con esta bóveda (CONVENCIONES §14). Sin esto una
617
621
  // incompatibilidad de versiones se ve como que ese aparato «no responde», que es el
618
622
  // fallo más caro que ha tenido el ecosistema. No bloquea nada: se enseña.
package/src/vault.js CHANGED
@@ -27,7 +27,7 @@ import { startSealersPublisher } from './sealers.js'
27
27
  import { assertKeyOwnsDir } from './keyowner.js'
28
28
  import { openStore } from './store.js'
29
29
  import { openThreadStore, STORE_READ_METHODS, PROFILE_EDIT_METHODS } from './threadStore.js'
30
- import { openSecretsStore, assertVar, RECOVERY as RECOVERY_WRAP, PROFILE_OWNER } from './secretsStore.js'
30
+ import { openSecretsStore, assertVar, RECOVERY as RECOVERY_WRAP, PROFILE_NS, PROFILE_OWNER } from './secretsStore.js'
31
31
  import { openSubacta } from './subacta.js'
32
32
  import { makeEphemeralKey, openSealed } from '../lib/src/sealed.js'
33
33
  import { VERSION } from './version.js'
@@ -2785,8 +2785,8 @@ export async function startVault ({ dir = dataDir(), proxyUrl, log = console.log
2785
2785
  }
2786
2786
 
2787
2787
  /**
2788
- * TODO lo que está a deber, por cajón: las rotaciones anotadas y, CALCULADO, cada
2789
- * envoltura que falta. La falta de una envoltura no se anota nunca: se mira. Una nota
2788
+ * Lo que deben las VARIABLES, por cajón: las rotaciones anotadas y, CALCULADO, cada
2789
+ * envoltura que falta. El perfil no entra (ver el bucle). La falta de una envoltura no se anota nunca: se mira. Una nota
2790
2790
  * se desincroniza en cuanto alguien salda la deuda por un camino que no pasa por donde
2791
2791
  * se anotó (pasó dos veces: el reparto por el hermano y el rehacer al abrir), y
2792
2792
  * entonces la consola avisa de algo que ya no existe. Lo que se calcula no miente.
@@ -2796,6 +2796,11 @@ export async function startVault ({ dir = dataDir(), proxyUrl, log = console.log
2796
2796
  const out = rotationsDue()
2797
2797
  for (const m of await incompleteMembers()) {
2798
2798
  for (const [owner, keys] of Object.entries(m.owners)) {
2799
+ // El perfil tampoco va aquí: esto es lo que se enseña como «variables sin
2800
+ // entregar». Lo que un aparato no puede abrir del perfil sigue a la vista en SU
2801
+ // fila (`incomplete`), y `secret settle` y abrir la bóveda lo saldan igual, porque
2802
+ // leen `incompleteMembers` y no esto.
2803
+ if (owner === PROFILE_OWNER) continue
2799
2804
  if (out[owner]?.kind === 'rotate') continue
2800
2805
  out[owner] = out[owner] || { kind: 'rewrap', members: [] }
2801
2806
  out[owner].members.push({ pub: m.pub, keys })
@@ -3409,7 +3414,15 @@ export async function startVault ({ dir = dataDir(), proxyUrl, log = console.log
3409
3414
  // sobre, «pública» dejó de significar «en claro»: dice a quién se le despacha sin
3410
3415
  // aprobación, nada más. Para ver un valor hay que poder abrirlo, igual que cualquiera —
3411
3416
  // y en un cajón con dueño, quien administra deliberadamente no puede.
3412
- return secrets.list()
3417
+ //
3418
+ // EL PERFIL NO ES UN GRUPO DE VARIABLES (dueño, 2026-09-21). `@me` vive en este
3419
+ // almacén porque se guarda igual —mismo sobre, mismo llavero—, pero no es configuración
3420
+ // de nadie: salía en `secret list` como «scope vault:secrets:@me», un scope que por
3421
+ // diseño no puede existir, y en la pantalla de variables como un grupo más. El perfil
3422
+ // tiene su sitio (`dotrino-vault me`, profile.dotrino.com).
3423
+ const variables = secrets.list()
3424
+ delete variables[PROFILE_NS]
3425
+ return variables
3413
3426
  }
3414
3427
  /** Cambiar SOLO quién puede ver el valor (no toca el valor ni avisa: el servicio lee lo mismo). */
3415
3428
  async function setSecretVisibility (ns, key, isPublic, adminKey) {