@dotrino/vaultd 0.141.0 → 0.141.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.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/src/ctl.js +33 -2
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dotrino/vaultd",
3
- "version": "0.141.0",
3
+ "version": "0.141.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
@@ -140,7 +140,7 @@ function cmdStatus () {
140
140
  // corriendo es más viejo que el CLI, avisar (nos mordió 3 veces).
141
141
  if (s.version && s.version !== VERSION) {
142
142
  console.log(' ⚠ el servicio corre la versión %s (binario instalado: %s).', s.version, VERSION)
143
- console.log(' Reinicia para actualizarlo: %s', RESTART_HINT)
143
+ console.log(' Si acabas de actualizar, se pone al día solo en uno o dos minutos. Si no: %s', RESTART_HINT)
144
144
  }
145
145
  console.log(' fingerprint : %s', s.fingerprint)
146
146
  console.log(' proxy : %s', s.proxy)
@@ -1732,6 +1732,30 @@ async function cmdLogins (rest) {
1732
1732
  * Instalar no reinicia nada a mano: el daemon vigila su propio binario y, al cambiar, se
1733
1733
  * va para que systemd lo levante con el nuevo (`src/selfupdate.js`).
1734
1734
  */
1735
+ /**
1736
+ * ESPERA A QUE EL SERVICIO CORRA LA VERSIÓN INSTALADA, y lo dice. El servicio se reinicia
1737
+ * solo cuando ve el binario nuevo (`selfupdate.js`), pero espera a verlo quieto dos minutos
1738
+ * seguidos: decir «se reinicia solo, compruébalo con status» y que `status` contestara un
1739
+ * minuto después «reinicia para actualizarlo» era mandar a hacer a mano lo que ya iba a pasar.
1740
+ */
1741
+ async function waitForService (version, { timeoutMs = 4 * 60_000 } = {}) {
1742
+ const s0 = ipcRead(stateFile, null)
1743
+ if (!s0 || !alive(s0.pid)) {
1744
+ console.log('El servicio no está corriendo: arráncalo y ya será la %s. %s', version, START_HINT)
1745
+ return false
1746
+ }
1747
+ process.stdout.write('El servicio la arranca solo en uno o dos minutos. Esperando… ')
1748
+ const t0 = Date.now()
1749
+ while (Date.now() - t0 < timeoutMs) {
1750
+ const s = ipcRead(stateFile, null)
1751
+ if (s?.version === version && alive(s.pid)) { console.log('✓ ya corre la %s', version); return true }
1752
+ await sleep(3000)
1753
+ }
1754
+ console.log('')
1755
+ console.error('El servicio sigue sin correr la %s después de %d min. Reinícialo: %s', version, Math.round(timeoutMs / 60000), RESTART_HINT)
1756
+ return false
1757
+ }
1758
+
1735
1759
  async function cmdUpdate (args = []) {
1736
1760
  const { latestRelease, assetFor, download, verifyArtifact, isNewer, isUserInstall, installUserRelease } = await import('./update.js')
1737
1761
  const soloMirar = args.includes('--check')
@@ -1763,7 +1787,8 @@ async function cmdUpdate (args = []) {
1763
1787
  process.exit(1)
1764
1788
  }
1765
1789
  console.log('firmada por el release de %s ✓', 'imdotrino/dotrino-vault')
1766
- console.log('Instalada la %s. El servicio se reinicia solo; compruébalo con: dotrino-vault status', res.version)
1790
+ console.log('Instalada la %s.', res.version)
1791
+ if (!args.includes('--no-wait')) await waitForService(res.version)
1767
1792
  return
1768
1793
  }
1769
1794
 
@@ -2110,6 +2135,8 @@ function help () {
2110
2135
 
2111
2136
  tui interfaz de terminal a pantalla completa (bóvedas, pares, secretos)
2112
2137
  status | info estado del servicio + fingerprint + el id de cada perfil
2138
+ update [--check] trae la versión nueva (verificando la firma) y espera a que el
2139
+ servicio la arranque · --check solo mira · --no-wait no espera
2113
2140
  pair [--save <f>] inicia un emparejamiento (QR + espera); --save escribe la invitación (.dpair)
2114
2141
  pair --kms <config.json>
2115
2142
  el sitio que se cree (--adopt o --new-account) NACE con su clave
@@ -2320,6 +2347,10 @@ async function cmdReplica (args) {
2320
2347
 
2321
2348
  export async function runCtl (argv) {
2322
2349
  const [cmd, ...rest] = takeProfileFlag(argv)
2350
+ // `--help` EN CUALQUIER COMANDO ENSEÑA LA AYUDA Y NO HACE NADA. Ningún subcomando lo miraba,
2351
+ // así que se ejecutaban igual: `pair --help` lanzaba una invitación real y `update --help`
2352
+ // instalaba la versión nueva (2026-10-05). Mirar cómo se usa algo no puede cambiar nada.
2353
+ if (rest.includes('--help') || rest.includes('-h')) return help()
2323
2354
  switch (cmd) {
2324
2355
  case 'tui': return cmdTui()
2325
2356
  case 'profile': return cmdProfile(rest)