@dotrino/identity 0.60.1 → 0.60.3

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/identity",
3
- "version": "0.60.1",
3
+ "version": "0.60.3",
4
4
  "description": "Identidad y rating de usuarios compartidos entre apps de Dotrino (vault iframe + postMessage)",
5
5
  "type": "module",
6
6
  "main": "src/index.js",
package/vault/core.js CHANGED
@@ -1709,11 +1709,34 @@ export async function createIdentityCore ({ kv: rawKv, peers, makeSync = null, k
1709
1709
  /**
1710
1710
  * Las actas que este master conserva desde `sinceSeq` (sin incluirla), para que un
1711
1711
  * miembro que volvió pueda comprobar el encadenamiento. Vacío si se salió de la ventana.
1712
+ *
1713
+ * SOLO SE MANDA CUANDO HACE FALTA, que es casi nunca. `canAdopt` adopta el acta actual
1714
+ * DE UN SALTO —sin mirar un solo eslabón— siempre que la haya sellado quien el que
1715
+ * pregunta tiene por sellador; el `prev` solo se comprueba cuando la nueva es contigua,
1716
+ * donde por definición no hay cadena que mandar. El único caso en que los eslabones
1717
+ * resuelven algo es un TRASPASO de master durante el hueco: ahí el acta actual la firmó
1718
+ * alguien que él no conoce, y el acta del traspaso —firmada por el sellador que sí
1719
+ * conocía— es el puente.
1720
+ *
1721
+ * No es una optimización cosmética: cada acta es un snapshot COMPLETO de los miembros
1722
+ * (~940 bytes por miembro), así que la ventana crece con cambios × miembros y llegó a
1723
+ * pesar 991 KB de una respuesta de 1,03 MB. El proxio corta el frame a 1 MB, cerraba la
1724
+ * conexión de la bóveda con un 1009 y la dejaba muda para TODO el ecosistema, sin un
1725
+ * solo log de su lado (2026-08-24: el bot social dejó de publicar y eco se quedó sin un
1726
+ * eco que mostrar).
1712
1727
  */
1713
1728
  async actaHistory ({ sinceSeq = 0 } = {}) {
1714
1729
  const cur = loadActa()
1715
- const hist = loadHistory().filter((a) => a.seq > sinceSeq)
1716
- const all = cur && cur.seq > sinceSeq ? [...hist, cur] : hist
1730
+ if (!cur || !(cur.seq > sinceSeq)) return { chain: [], window: ACTA_WINDOW }
1731
+ const hist = loadHistory()
1732
+ const mine = hist.find((a) => a.seq === sinceSeq) || null
1733
+ // Sin acta previa (`sinceSeq` 0, un agente headless) se adopta la actual por
1734
+ // «sin-acta-previa». Y si la suya se salió de la ventana, la cadena tampoco encadena
1735
+ // hasta ella: en los dos casos, mandarla es tirar cientos de KB por el transporte.
1736
+ if (!mine) return { chain: [], window: ACTA_WINDOW }
1737
+ // Puede dar el salto él solo: el sellador no cambió.
1738
+ if (cur.sealedBy === mine.sealer) return { chain: [], window: ACTA_WINDOW }
1739
+ const all = [...hist.filter((a) => a.seq > sinceSeq), cur]
1717
1740
  return { chain: all.sort((a, b) => a.seq - b.seq), window: ACTA_WINDOW }
1718
1741
  },
1719
1742
 
package/vault/remote.js CHANGED
@@ -38,6 +38,10 @@ const MSG = {
38
38
  // Renuncia: el miembro se quita capacidades a sí mismo y la bóveda la sella en el acta.
39
39
  RENOUNCE: 'vault.renounce',
40
40
  RENOUNCE_RESULT: 'vault.renounce.result',
41
+ // Pedidos de aprobación y llaves SSH del teléfono: van por el canal de secretos
42
+ // (`op: approvals | approve | deny | ssh.keys | ssh.key.add | ssh.key.rm`).
43
+ SECRETS: 'vault.secrets',
44
+ SECRETS_RESULT: 'vault.secrets.result',
41
45
  ERROR: 'vault.error'
42
46
  }
43
47
  export { MSG as VAULT_MSG }