@swal/edge-mesh 0.0.0-stage → 0.1.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.
Files changed (464) hide show
  1. package/LICENSE +128 -0
  2. package/NOTICE +37 -0
  3. package/README.md +470 -2
  4. package/dist/adapters/gpu-agent/index.d.ts +61 -0
  5. package/dist/adapters/gpu-agent/index.d.ts.map +1 -0
  6. package/dist/adapters/gpu-agent/index.js +364 -0
  7. package/dist/adapters/gpu-agent/index.js.map +1 -0
  8. package/dist/adapters/maloca-salud/citas-distribuidas.d.ts +19 -0
  9. package/dist/adapters/maloca-salud/citas-distribuidas.d.ts.map +1 -0
  10. package/dist/adapters/maloca-salud/citas-distribuidas.js +51 -0
  11. package/dist/adapters/maloca-salud/citas-distribuidas.js.map +1 -0
  12. package/dist/adapters/maloca-salud/eps-bridge.d.ts +15 -0
  13. package/dist/adapters/maloca-salud/eps-bridge.d.ts.map +1 -0
  14. package/dist/adapters/maloca-salud/eps-bridge.js +27 -0
  15. package/dist/adapters/maloca-salud/eps-bridge.js.map +1 -0
  16. package/dist/adapters/maloca-salud/patient-profile.d.ts +20 -0
  17. package/dist/adapters/maloca-salud/patient-profile.d.ts.map +1 -0
  18. package/dist/adapters/maloca-salud/patient-profile.js +36 -0
  19. package/dist/adapters/maloca-salud/patient-profile.js.map +1 -0
  20. package/dist/adapters/maloca-salud/types.d.ts +40 -0
  21. package/dist/adapters/maloca-salud/types.d.ts.map +1 -0
  22. package/dist/adapters/maloca-salud/types.js +2 -0
  23. package/dist/adapters/maloca-salud/types.js.map +1 -0
  24. package/dist/adapters/maloca-veeduria/contract-bridge.d.ts +31 -0
  25. package/dist/adapters/maloca-veeduria/contract-bridge.d.ts.map +1 -0
  26. package/dist/adapters/maloca-veeduria/contract-bridge.js +103 -0
  27. package/dist/adapters/maloca-veeduria/contract-bridge.js.map +1 -0
  28. package/dist/adapters/maloca-veeduria/evidentia-veeduria.d.ts +14 -0
  29. package/dist/adapters/maloca-veeduria/evidentia-veeduria.d.ts.map +1 -0
  30. package/dist/adapters/maloca-veeduria/evidentia-veeduria.js +40 -0
  31. package/dist/adapters/maloca-veeduria/evidentia-veeduria.js.map +1 -0
  32. package/dist/adapters/maloca-veeduria/licitante-profile.d.ts +21 -0
  33. package/dist/adapters/maloca-veeduria/licitante-profile.d.ts.map +1 -0
  34. package/dist/adapters/maloca-veeduria/licitante-profile.js +58 -0
  35. package/dist/adapters/maloca-veeduria/licitante-profile.js.map +1 -0
  36. package/dist/adapters/maloca-veeduria/types.d.ts +30 -0
  37. package/dist/adapters/maloca-veeduria/types.d.ts.map +1 -0
  38. package/dist/adapters/maloca-veeduria/types.js +2 -0
  39. package/dist/adapters/maloca-veeduria/types.js.map +1 -0
  40. package/dist/adapters/maloca-xavier/agent-profile.d.ts +32 -0
  41. package/dist/adapters/maloca-xavier/agent-profile.d.ts.map +1 -0
  42. package/dist/adapters/maloca-xavier/agent-profile.js +56 -0
  43. package/dist/adapters/maloca-xavier/agent-profile.js.map +1 -0
  44. package/dist/adapters/maloca-xavier/codegraph-bridge.d.ts +27 -0
  45. package/dist/adapters/maloca-xavier/codegraph-bridge.d.ts.map +1 -0
  46. package/dist/adapters/maloca-xavier/codegraph-bridge.js +58 -0
  47. package/dist/adapters/maloca-xavier/codegraph-bridge.js.map +1 -0
  48. package/dist/adapters/maloca-xavier/llm-router.d.ts +25 -0
  49. package/dist/adapters/maloca-xavier/llm-router.d.ts.map +1 -0
  50. package/dist/adapters/maloca-xavier/llm-router.js +58 -0
  51. package/dist/adapters/maloca-xavier/llm-router.js.map +1 -0
  52. package/dist/authz/index.d.ts +81 -0
  53. package/dist/authz/index.d.ts.map +1 -0
  54. package/dist/authz/index.js +271 -0
  55. package/dist/authz/index.js.map +1 -0
  56. package/dist/chat/index.d.ts +138 -0
  57. package/dist/chat/index.d.ts.map +1 -0
  58. package/dist/chat/index.js +394 -0
  59. package/dist/chat/index.js.map +1 -0
  60. package/dist/chat/offline-queue.d.ts +32 -0
  61. package/dist/chat/offline-queue.d.ts.map +1 -0
  62. package/dist/chat/offline-queue.js +93 -0
  63. package/dist/chat/offline-queue.js.map +1 -0
  64. package/dist/core/DefaultEdgeMeshNode.d.ts +17 -0
  65. package/dist/core/DefaultEdgeMeshNode.d.ts.map +1 -0
  66. package/dist/core/DefaultEdgeMeshNode.js +57 -0
  67. package/dist/core/DefaultEdgeMeshNode.js.map +1 -0
  68. package/dist/core/node.d.ts +26 -0
  69. package/dist/core/node.d.ts.map +1 -0
  70. package/dist/core/node.js +16 -0
  71. package/dist/core/node.js.map +1 -0
  72. package/dist/edge-mesh.d.ts +139 -0
  73. package/dist/edge-mesh.d.ts.map +1 -0
  74. package/dist/edge-mesh.js +1146 -0
  75. package/dist/edge-mesh.js.map +1 -0
  76. package/dist/gos/GosBridge.d.ts +49 -0
  77. package/dist/gos/GosBridge.d.ts.map +1 -0
  78. package/dist/gos/GosBridge.js +133 -0
  79. package/dist/gos/GosBridge.js.map +1 -0
  80. package/dist/governance/authority.d.ts +44 -0
  81. package/dist/governance/authority.d.ts.map +1 -0
  82. package/dist/governance/authority.js +123 -0
  83. package/dist/governance/authority.js.map +1 -0
  84. package/dist/governance/index.d.ts +66 -0
  85. package/dist/governance/index.d.ts.map +1 -0
  86. package/dist/governance/index.js +210 -0
  87. package/dist/governance/index.js.map +1 -0
  88. package/dist/governance/merge.d.ts +31 -0
  89. package/dist/governance/merge.d.ts.map +1 -0
  90. package/dist/governance/merge.js +167 -0
  91. package/dist/governance/merge.js.map +1 -0
  92. package/dist/identity/index.d.ts +199 -0
  93. package/dist/identity/index.d.ts.map +1 -0
  94. package/dist/identity/index.js +415 -0
  95. package/dist/identity/index.js.map +1 -0
  96. package/dist/index.d.ts +71 -0
  97. package/dist/index.d.ts.map +1 -0
  98. package/dist/index.js +56 -0
  99. package/dist/index.js.map +1 -0
  100. package/dist/maloca/backoffice.d.ts +31 -0
  101. package/dist/maloca/backoffice.d.ts.map +1 -0
  102. package/dist/maloca/backoffice.js +40 -0
  103. package/dist/maloca/backoffice.js.map +1 -0
  104. package/dist/maloca/event-bus.d.ts +60 -0
  105. package/dist/maloca/event-bus.d.ts.map +1 -0
  106. package/dist/maloca/event-bus.js +175 -0
  107. package/dist/maloca/event-bus.js.map +1 -0
  108. package/dist/maloca/evidentia.d.ts +136 -0
  109. package/dist/maloca/evidentia.d.ts.map +1 -0
  110. package/dist/maloca/evidentia.js +447 -0
  111. package/dist/maloca/evidentia.js.map +1 -0
  112. package/dist/maloca/gateway/api.d.ts +146 -0
  113. package/dist/maloca/gateway/api.d.ts.map +1 -0
  114. package/dist/maloca/gateway/api.js +228 -0
  115. package/dist/maloca/gateway/api.js.map +1 -0
  116. package/dist/maloca/gateway/auth.d.ts +20 -0
  117. package/dist/maloca/gateway/auth.d.ts.map +1 -0
  118. package/dist/maloca/gateway/auth.js +115 -0
  119. package/dist/maloca/gateway/auth.js.map +1 -0
  120. package/dist/maloca/gateway/dashboard.d.ts +42 -0
  121. package/dist/maloca/gateway/dashboard.d.ts.map +1 -0
  122. package/dist/maloca/gateway/dashboard.js +67 -0
  123. package/dist/maloca/gateway/dashboard.js.map +1 -0
  124. package/dist/maloca/gateway/websocket.d.ts +34 -0
  125. package/dist/maloca/gateway/websocket.d.ts.map +1 -0
  126. package/dist/maloca/gateway/websocket.js +71 -0
  127. package/dist/maloca/gateway/websocket.js.map +1 -0
  128. package/dist/maloca/karma.d.ts +165 -0
  129. package/dist/maloca/karma.d.ts.map +1 -0
  130. package/dist/maloca/karma.js +307 -0
  131. package/dist/maloca/karma.js.map +1 -0
  132. package/dist/maloca/kernel.d.ts +20 -0
  133. package/dist/maloca/kernel.d.ts.map +1 -0
  134. package/dist/maloca/kernel.js +76 -0
  135. package/dist/maloca/kernel.js.map +1 -0
  136. package/dist/maloca/metadata.d.ts +30 -0
  137. package/dist/maloca/metadata.d.ts.map +1 -0
  138. package/dist/maloca/metadata.js +80 -0
  139. package/dist/maloca/metadata.js.map +1 -0
  140. package/dist/maloca/perfil.d.ts +57 -0
  141. package/dist/maloca/perfil.d.ts.map +1 -0
  142. package/dist/maloca/perfil.js +113 -0
  143. package/dist/maloca/perfil.js.map +1 -0
  144. package/dist/maloca/plugin-registry.d.ts +27 -0
  145. package/dist/maloca/plugin-registry.d.ts.map +1 -0
  146. package/dist/maloca/plugin-registry.js +76 -0
  147. package/dist/maloca/plugin-registry.js.map +1 -0
  148. package/dist/maloca/polygon-bridge.d.ts +63 -0
  149. package/dist/maloca/polygon-bridge.d.ts.map +1 -0
  150. package/dist/maloca/polygon-bridge.js +198 -0
  151. package/dist/maloca/polygon-bridge.js.map +1 -0
  152. package/dist/maloca/types.d.ts +44 -0
  153. package/dist/maloca/types.d.ts.map +1 -0
  154. package/dist/maloca/types.js +2 -0
  155. package/dist/maloca/types.js.map +1 -0
  156. package/dist/medico/aval.d.ts +149 -0
  157. package/dist/medico/aval.d.ts.map +1 -0
  158. package/dist/medico/aval.js +281 -0
  159. package/dist/medico/aval.js.map +1 -0
  160. package/dist/medico/canonica.d.ts +96 -0
  161. package/dist/medico/canonica.d.ts.map +1 -0
  162. package/dist/medico/canonica.js +148 -0
  163. package/dist/medico/canonica.js.map +1 -0
  164. package/dist/medico/credencial.d.ts +160 -0
  165. package/dist/medico/credencial.d.ts.map +1 -0
  166. package/dist/medico/credencial.js +240 -0
  167. package/dist/medico/credencial.js.map +1 -0
  168. package/dist/medico/index.d.ts +36 -0
  169. package/dist/medico/index.d.ts.map +1 -0
  170. package/dist/medico/index.js +39 -0
  171. package/dist/medico/index.js.map +1 -0
  172. package/dist/medico/malla.d.ts +218 -0
  173. package/dist/medico/malla.d.ts.map +1 -0
  174. package/dist/medico/malla.js +347 -0
  175. package/dist/medico/malla.js.map +1 -0
  176. package/dist/medico/registro-profesional.d.ts +84 -0
  177. package/dist/medico/registro-profesional.d.ts.map +1 -0
  178. package/dist/medico/registro-profesional.js +135 -0
  179. package/dist/medico/registro-profesional.js.map +1 -0
  180. package/dist/medico/registro.d.ts +149 -0
  181. package/dist/medico/registro.d.ts.map +1 -0
  182. package/dist/medico/registro.js +173 -0
  183. package/dist/medico/registro.js.map +1 -0
  184. package/dist/medico/types.d.ts +287 -0
  185. package/dist/medico/types.d.ts.map +1 -0
  186. package/dist/medico/types.js +135 -0
  187. package/dist/medico/types.js.map +1 -0
  188. package/dist/medico/verificacion-registro.d.ts +300 -0
  189. package/dist/medico/verificacion-registro.d.ts.map +1 -0
  190. package/dist/medico/verificacion-registro.js +319 -0
  191. package/dist/medico/verificacion-registro.js.map +1 -0
  192. package/dist/mesh/index.d.ts +457 -0
  193. package/dist/mesh/index.d.ts.map +1 -0
  194. package/dist/mesh/index.js +929 -0
  195. package/dist/mesh/index.js.map +1 -0
  196. package/dist/namespaces/encrypted-plugin.d.ts +56 -0
  197. package/dist/namespaces/encrypted-plugin.d.ts.map +1 -0
  198. package/dist/namespaces/encrypted-plugin.js +173 -0
  199. package/dist/namespaces/encrypted-plugin.js.map +1 -0
  200. package/dist/namespaces/index.d.ts +52 -0
  201. package/dist/namespaces/index.d.ts.map +1 -0
  202. package/dist/namespaces/index.js +134 -0
  203. package/dist/namespaces/index.js.map +1 -0
  204. package/dist/namespaces/ivn-proofs.d.ts +54 -0
  205. package/dist/namespaces/ivn-proofs.d.ts.map +1 -0
  206. package/dist/namespaces/ivn-proofs.js +162 -0
  207. package/dist/namespaces/ivn-proofs.js.map +1 -0
  208. package/dist/namespaces/offers-gossip.d.ts +95 -0
  209. package/dist/namespaces/offers-gossip.d.ts.map +1 -0
  210. package/dist/namespaces/offers-gossip.js +213 -0
  211. package/dist/namespaces/offers-gossip.js.map +1 -0
  212. package/dist/node-memory/idb-store.d.ts +22 -0
  213. package/dist/node-memory/idb-store.d.ts.map +1 -0
  214. package/dist/node-memory/idb-store.js +154 -0
  215. package/dist/node-memory/idb-store.js.map +1 -0
  216. package/dist/node-memory/index.d.ts +14 -0
  217. package/dist/node-memory/index.d.ts.map +1 -0
  218. package/dist/node-memory/index.js +159 -0
  219. package/dist/node-memory/index.js.map +1 -0
  220. package/dist/node-memory/sync-flush.d.ts +11 -0
  221. package/dist/node-memory/sync-flush.d.ts.map +1 -0
  222. package/dist/node-memory/sync-flush.js +37 -0
  223. package/dist/node-memory/sync-flush.js.map +1 -0
  224. package/dist/node-memory/types.d.ts +34 -0
  225. package/dist/node-memory/types.d.ts.map +1 -0
  226. package/dist/node-memory/types.js +2 -0
  227. package/dist/node-memory/types.js.map +1 -0
  228. package/dist/node-memory/xavier-store.d.ts +12 -0
  229. package/dist/node-memory/xavier-store.d.ts.map +1 -0
  230. package/dist/node-memory/xavier-store.js +75 -0
  231. package/dist/node-memory/xavier-store.js.map +1 -0
  232. package/dist/op-log/index.d.ts +49 -0
  233. package/dist/op-log/index.d.ts.map +1 -0
  234. package/dist/op-log/index.js +190 -0
  235. package/dist/op-log/index.js.map +1 -0
  236. package/dist/presence/health.d.ts +54 -0
  237. package/dist/presence/health.d.ts.map +1 -0
  238. package/dist/presence/health.js +139 -0
  239. package/dist/presence/health.js.map +1 -0
  240. package/dist/presence/index.d.ts +85 -0
  241. package/dist/presence/index.d.ts.map +1 -0
  242. package/dist/presence/index.js +255 -0
  243. package/dist/presence/index.js.map +1 -0
  244. package/dist/presence/peer-health.d.ts +40 -0
  245. package/dist/presence/peer-health.d.ts.map +1 -0
  246. package/dist/presence/peer-health.js +118 -0
  247. package/dist/presence/peer-health.js.map +1 -0
  248. package/dist/protocol/canonical.d.ts +10 -0
  249. package/dist/protocol/canonical.d.ts.map +1 -0
  250. package/dist/protocol/canonical.js +32 -0
  251. package/dist/protocol/canonical.js.map +1 -0
  252. package/dist/protocol/crypto.d.ts +299 -0
  253. package/dist/protocol/crypto.d.ts.map +1 -0
  254. package/dist/protocol/crypto.js +739 -0
  255. package/dist/protocol/crypto.js.map +1 -0
  256. package/dist/protocol/index.d.ts +30 -0
  257. package/dist/protocol/index.d.ts.map +1 -0
  258. package/dist/protocol/index.js +116 -0
  259. package/dist/protocol/index.js.map +1 -0
  260. package/dist/protocol/utils.d.ts +5 -0
  261. package/dist/protocol/utils.d.ts.map +1 -0
  262. package/dist/protocol/utils.js +27 -0
  263. package/dist/protocol/utils.js.map +1 -0
  264. package/dist/salones/manager.d.ts +100 -0
  265. package/dist/salones/manager.d.ts.map +1 -0
  266. package/dist/salones/manager.js +240 -0
  267. package/dist/salones/manager.js.map +1 -0
  268. package/dist/security/rate-limiter.d.ts +13 -0
  269. package/dist/security/rate-limiter.d.ts.map +1 -0
  270. package/dist/security/rate-limiter.js +32 -0
  271. package/dist/security/rate-limiter.js.map +1 -0
  272. package/dist/snapshot/index.d.ts +90 -0
  273. package/dist/snapshot/index.d.ts.map +1 -0
  274. package/dist/snapshot/index.js +189 -0
  275. package/dist/snapshot/index.js.map +1 -0
  276. package/dist/storage/index.d.ts +49 -0
  277. package/dist/storage/index.d.ts.map +1 -0
  278. package/dist/storage/index.js +176 -0
  279. package/dist/storage/index.js.map +1 -0
  280. package/dist/storage/optimizer.d.ts +28 -0
  281. package/dist/storage/optimizer.d.ts.map +1 -0
  282. package/dist/storage/optimizer.js +50 -0
  283. package/dist/storage/optimizer.js.map +1 -0
  284. package/dist/storage/ydoc-persistence.d.ts +27 -0
  285. package/dist/storage/ydoc-persistence.d.ts.map +1 -0
  286. package/dist/storage/ydoc-persistence.js +128 -0
  287. package/dist/storage/ydoc-persistence.js.map +1 -0
  288. package/dist/sync/ChunkSyncManager.d.ts +41 -0
  289. package/dist/sync/ChunkSyncManager.d.ts.map +1 -0
  290. package/dist/sync/ChunkSyncManager.js +115 -0
  291. package/dist/sync/ChunkSyncManager.js.map +1 -0
  292. package/dist/sync/conflict-resolver.d.ts +33 -0
  293. package/dist/sync/conflict-resolver.d.ts.map +1 -0
  294. package/dist/sync/conflict-resolver.js +54 -0
  295. package/dist/sync/conflict-resolver.js.map +1 -0
  296. package/dist/sync/engine.d.ts +168 -0
  297. package/dist/sync/engine.d.ts.map +1 -0
  298. package/dist/sync/engine.js +315 -0
  299. package/dist/sync/engine.js.map +1 -0
  300. package/dist/sync/index.d.ts +3 -0
  301. package/dist/sync/index.d.ts.map +1 -0
  302. package/dist/sync/index.js +3 -0
  303. package/dist/sync/index.js.map +1 -0
  304. package/dist/transport/TorTransportAdapter.d.ts +70 -0
  305. package/dist/transport/TorTransportAdapter.d.ts.map +1 -0
  306. package/dist/transport/TorTransportAdapter.js +192 -0
  307. package/dist/transport/TorTransportAdapter.js.map +1 -0
  308. package/dist/transport/memory.d.ts +31 -0
  309. package/dist/transport/memory.d.ts.map +1 -0
  310. package/dist/transport/memory.js +114 -0
  311. package/dist/transport/memory.js.map +1 -0
  312. package/dist/transport/peerjs.d.ts +45 -0
  313. package/dist/transport/peerjs.d.ts.map +1 -0
  314. package/dist/transport/peerjs.js +301 -0
  315. package/dist/transport/peerjs.js.map +1 -0
  316. package/dist/transport/pqc-handshake.d.ts +72 -0
  317. package/dist/transport/pqc-handshake.d.ts.map +1 -0
  318. package/dist/transport/pqc-handshake.js +129 -0
  319. package/dist/transport/pqc-handshake.js.map +1 -0
  320. package/dist/transport/relay-config.d.ts +11 -0
  321. package/dist/transport/relay-config.d.ts.map +1 -0
  322. package/dist/transport/relay-config.js +48 -0
  323. package/dist/transport/relay-config.js.map +1 -0
  324. package/dist/transport/relay-server.d.ts +37 -0
  325. package/dist/transport/relay-server.d.ts.map +1 -0
  326. package/dist/transport/relay-server.js +230 -0
  327. package/dist/transport/relay-server.js.map +1 -0
  328. package/dist/transport/tor.d.ts +47 -0
  329. package/dist/transport/tor.d.ts.map +1 -0
  330. package/dist/transport/tor.js +158 -0
  331. package/dist/transport/tor.js.map +1 -0
  332. package/dist/transport/types.d.ts +34 -0
  333. package/dist/transport/types.d.ts.map +1 -0
  334. package/dist/transport/types.js +2 -0
  335. package/dist/transport/types.js.map +1 -0
  336. package/dist/types/index.d.ts +293 -0
  337. package/dist/types/index.d.ts.map +1 -0
  338. package/dist/types/index.js +73 -0
  339. package/dist/types/index.js.map +1 -0
  340. package/dist/web/admission.d.ts +24 -0
  341. package/dist/web/admission.d.ts.map +1 -0
  342. package/dist/web/admission.js +41 -0
  343. package/dist/web/admission.js.map +1 -0
  344. package/dist/web/crypto.d.ts +18 -0
  345. package/dist/web/crypto.d.ts.map +1 -0
  346. package/dist/web/crypto.js +78 -0
  347. package/dist/web/crypto.js.map +1 -0
  348. package/dist/web/exchange.d.ts +23 -0
  349. package/dist/web/exchange.d.ts.map +1 -0
  350. package/dist/web/exchange.js +54 -0
  351. package/dist/web/exchange.js.map +1 -0
  352. package/dist/web/fragment.d.ts +58 -0
  353. package/dist/web/fragment.d.ts.map +1 -0
  354. package/dist/web/fragment.js +198 -0
  355. package/dist/web/fragment.js.map +1 -0
  356. package/dist/web/index.d.ts +25 -0
  357. package/dist/web/index.d.ts.map +1 -0
  358. package/dist/web/index.js +14 -0
  359. package/dist/web/index.js.map +1 -0
  360. package/dist/web/merge/index.d.ts +104 -0
  361. package/dist/web/merge/index.d.ts.map +1 -0
  362. package/dist/web/merge/index.js +236 -0
  363. package/dist/web/merge/index.js.map +1 -0
  364. package/dist/web/oplog/hlc.d.ts +19 -0
  365. package/dist/web/oplog/hlc.d.ts.map +1 -0
  366. package/dist/web/oplog/hlc.js +39 -0
  367. package/dist/web/oplog/hlc.js.map +1 -0
  368. package/dist/web/oplog/index.d.ts +10 -0
  369. package/dist/web/oplog/index.d.ts.map +1 -0
  370. package/dist/web/oplog/index.js +6 -0
  371. package/dist/web/oplog/index.js.map +1 -0
  372. package/dist/web/oplog/log.d.ts +182 -0
  373. package/dist/web/oplog/log.d.ts.map +1 -0
  374. package/dist/web/oplog/log.js +693 -0
  375. package/dist/web/oplog/log.js.map +1 -0
  376. package/dist/web/oplog/store.d.ts +40 -0
  377. package/dist/web/oplog/store.d.ts.map +1 -0
  378. package/dist/web/oplog/store.js +85 -0
  379. package/dist/web/oplog/store.js.map +1 -0
  380. package/dist/web/oplog/sync.d.ts +54 -0
  381. package/dist/web/oplog/sync.d.ts.map +1 -0
  382. package/dist/web/oplog/sync.js +162 -0
  383. package/dist/web/oplog/sync.js.map +1 -0
  384. package/dist/web/oplog/types.d.ts +119 -0
  385. package/dist/web/oplog/types.d.ts.map +1 -0
  386. package/dist/web/oplog/types.js +2 -0
  387. package/dist/web/oplog/types.js.map +1 -0
  388. package/dist/web/pairing.d.ts +186 -0
  389. package/dist/web/pairing.d.ts.map +1 -0
  390. package/dist/web/pairing.js +395 -0
  391. package/dist/web/pairing.js.map +1 -0
  392. package/dist/web/pq.d.ts +36 -0
  393. package/dist/web/pq.d.ts.map +1 -0
  394. package/dist/web/pq.js +59 -0
  395. package/dist/web/pq.js.map +1 -0
  396. package/dist/web/provider.d.ts +188 -0
  397. package/dist/web/provider.d.ts.map +1 -0
  398. package/dist/web/provider.js +2042 -0
  399. package/dist/web/provider.js.map +1 -0
  400. package/dist/web/rooms.d.ts +20 -0
  401. package/dist/web/rooms.d.ts.map +1 -0
  402. package/dist/web/rooms.js +51 -0
  403. package/dist/web/rooms.js.map +1 -0
  404. package/dist/web/rotation.d.ts +73 -0
  405. package/dist/web/rotation.d.ts.map +1 -0
  406. package/dist/web/rotation.js +130 -0
  407. package/dist/web/rotation.js.map +1 -0
  408. package/dist/web/secstate.d.ts +213 -0
  409. package/dist/web/secstate.d.ts.map +1 -0
  410. package/dist/web/secstate.js +789 -0
  411. package/dist/web/secstate.js.map +1 -0
  412. package/dist/web/store.d.ts +9 -0
  413. package/dist/web/store.d.ts.map +1 -0
  414. package/dist/web/store.js +32 -0
  415. package/dist/web/store.js.map +1 -0
  416. package/dist/web/transports/loopback.d.ts +11 -0
  417. package/dist/web/transports/loopback.d.ts.map +1 -0
  418. package/dist/web/transports/loopback.js +97 -0
  419. package/dist/web/transports/loopback.js.map +1 -0
  420. package/dist/web/transports/qr-sdp.d.ts +27 -0
  421. package/dist/web/transports/qr-sdp.d.ts.map +1 -0
  422. package/dist/web/transports/qr-sdp.js +131 -0
  423. package/dist/web/transports/qr-sdp.js.map +1 -0
  424. package/dist/web/transports/ws.d.ts +12 -0
  425. package/dist/web/transports/ws.d.ts.map +1 -0
  426. package/dist/web/transports/ws.js +139 -0
  427. package/dist/web/transports/ws.js.map +1 -0
  428. package/dist/web/trust/canonical.d.ts +8 -0
  429. package/dist/web/trust/canonical.d.ts.map +1 -0
  430. package/dist/web/trust/canonical.js +27 -0
  431. package/dist/web/trust/canonical.js.map +1 -0
  432. package/dist/web/trust/docs.d.ts +51 -0
  433. package/dist/web/trust/docs.d.ts.map +1 -0
  434. package/dist/web/trust/docs.js +170 -0
  435. package/dist/web/trust/docs.js.map +1 -0
  436. package/dist/web/trust/index.d.ts +10 -0
  437. package/dist/web/trust/index.d.ts.map +1 -0
  438. package/dist/web/trust/index.js +7 -0
  439. package/dist/web/trust/index.js.map +1 -0
  440. package/dist/web/trust/keys.d.ts +37 -0
  441. package/dist/web/trust/keys.d.ts.map +1 -0
  442. package/dist/web/trust/keys.js +75 -0
  443. package/dist/web/trust/keys.js.map +1 -0
  444. package/dist/web/trust/store.d.ts +150 -0
  445. package/dist/web/trust/store.d.ts.map +1 -0
  446. package/dist/web/trust/store.js +587 -0
  447. package/dist/web/trust/store.js.map +1 -0
  448. package/dist/web/trust/types.d.ts +134 -0
  449. package/dist/web/trust/types.d.ts.map +1 -0
  450. package/dist/web/trust/types.js +4 -0
  451. package/dist/web/trust/types.js.map +1 -0
  452. package/dist/web/types.d.ts +115 -0
  453. package/dist/web/types.d.ts.map +1 -0
  454. package/dist/web/types.js +2 -0
  455. package/dist/web/types.js.map +1 -0
  456. package/dist/web/util.d.ts +12 -0
  457. package/dist/web/util.d.ts.map +1 -0
  458. package/dist/web/util.js +54 -0
  459. package/dist/web/util.js.map +1 -0
  460. package/dist/web/webrtc.d.ts +35 -0
  461. package/dist/web/webrtc.d.ts.map +1 -0
  462. package/dist/web/webrtc.js +304 -0
  463. package/dist/web/webrtc.js.map +1 -0
  464. package/package.json +138 -4
@@ -0,0 +1,210 @@
1
+ import { hexABytes } from "../protocol/utils.js";
2
+ import { POLITICA_GOBERNANZA } from "../types/index.js";
3
+ // ─── CONSTANTS ─────────────────────────────────────────────────────────────
4
+ const POLITICA_POR_DEFECTO = {
5
+ politica: POLITICA_GOBERNANZA.DEMOCRATICA,
6
+ umbral: 0.51,
7
+ ventanaMs: 30_000,
8
+ pesoNodo: {},
9
+ reglas: [],
10
+ };
11
+ export const ESTADO_PROPUESTA = {
12
+ ABIERTA: "abierta",
13
+ APROBADA: "aprobada",
14
+ RECHAZADA: "rechazada",
15
+ EXPIRADA: "expirada",
16
+ };
17
+ export class GovernanceManager {
18
+ eventTarget;
19
+ politica;
20
+ propuestas;
21
+ timers;
22
+ verificador;
23
+ requireSignedVotes;
24
+ constructor(politica, verificador, options) {
25
+ this.eventTarget = new EventTarget();
26
+ this.politica = { ...POLITICA_POR_DEFECTO, ...politica };
27
+ this.propuestas = new Map();
28
+ this.timers = new Map();
29
+ this.verificador = verificador;
30
+ this.requireSignedVotes = options?.requireSignedVotes ?? false;
31
+ }
32
+ // ─── PROPUESTAS ───────────────────────────────────────────────────────
33
+ crearPropuesta(id, tipo, proponente, datos, expiracionMs) {
34
+ const expiracion = expiracionMs ?? this.politica.ventanaMs;
35
+ const propuesta = {
36
+ id,
37
+ tipo,
38
+ proponente,
39
+ datos,
40
+ timestamp: Date.now(),
41
+ expiracion: Date.now() + expiracion,
42
+ votos: [],
43
+ estado: ESTADO_PROPUESTA.ABIERTA,
44
+ };
45
+ this.propuestas.set(id, propuesta);
46
+ const timer = setTimeout(() => {
47
+ this.cerrarPropuesta(id);
48
+ }, expiracion);
49
+ this.timers.set(id, timer);
50
+ this.emit("propuestaCreada", { propuesta });
51
+ return propuesta;
52
+ }
53
+ votar(id, voto) {
54
+ const propuesta = this.propuestas.get(id);
55
+ if (propuesta === undefined)
56
+ return false;
57
+ if (propuesta.estado !== ESTADO_PROPUESTA.ABIERTA)
58
+ return false;
59
+ if (Date.now() > propuesta.expiracion)
60
+ return false;
61
+ // Requerir firma estricta si configurado
62
+ if (this.requireSignedVotes && !voto.firma) {
63
+ return false;
64
+ }
65
+ // Verificación criptográfica si hay verificador y firma
66
+ if (this.verificador && voto.firma) {
67
+ const clavePublica = this.verificador.obtenerClavePublica(voto.nodoId);
68
+ if (!clavePublica)
69
+ return false;
70
+ const mensajeBytes = new TextEncoder().encode(JSON.stringify({
71
+ propuestaId: id,
72
+ nodoId: voto.nodoId,
73
+ voto: voto.voto,
74
+ timestamp: voto.timestamp,
75
+ }));
76
+ const firmaBytes = typeof voto.firma === "string"
77
+ ? hexABytes(voto.firma)
78
+ : voto.firma instanceof Uint8Array
79
+ ? voto.firma
80
+ : new Uint8Array(voto.firma);
81
+ const valido = this.verificador.verificarFirma(mensajeBytes, firmaBytes, clavePublica);
82
+ if (!valido)
83
+ return false;
84
+ }
85
+ // Evitar voto duplicado del mismo nodo
86
+ const yaVoto = propuesta.votos.some((v) => v.nodoId === voto.nodoId);
87
+ if (yaVoto)
88
+ return false;
89
+ const nuevosVotos = [...propuesta.votos, voto];
90
+ propuesta.votos = nuevosVotos;
91
+ this.propuestas.set(id, propuesta);
92
+ this.emit("votoRecibido", { propuesta: id, voto });
93
+ // Verificar si ya se alcanzó el umbral
94
+ if (this.verificarUmbral(propuesta)) {
95
+ this.cerrarPropuesta(id, ESTADO_PROPUESTA.APROBADA);
96
+ }
97
+ return true;
98
+ }
99
+ cerrarPropuesta(id, forzar) {
100
+ const propuesta = this.propuestas.get(id);
101
+ if (propuesta === undefined)
102
+ return;
103
+ const timer = this.timers.get(id);
104
+ if (timer !== undefined) {
105
+ clearTimeout(timer);
106
+ this.timers.delete(id);
107
+ }
108
+ let resultado;
109
+ if (forzar !== undefined) {
110
+ resultado = forzar;
111
+ }
112
+ else {
113
+ resultado = this.verificarUmbral(propuesta)
114
+ ? ESTADO_PROPUESTA.APROBADA
115
+ : ESTADO_PROPUESTA.RECHAZADA;
116
+ }
117
+ propuesta.estado = resultado;
118
+ this.propuestas.set(id, propuesta);
119
+ this.emit("propuestaResultado", { propuesta: id, resultado });
120
+ }
121
+ verificarUmbral(propuesta) {
122
+ const pesoTotal = this.calcularPesoTotal(propuesta);
123
+ return pesoTotal >= this.politica.umbral;
124
+ }
125
+ calcularPesoTotal(propuesta) {
126
+ return propuesta.votos.reduce((total, voto) => {
127
+ const peso = this.politica.pesoNodo[voto.nodoId] ?? 1;
128
+ return voto.voto === "a_favor" ? total + peso : total;
129
+ }, 0);
130
+ }
131
+ // ─── POLITICA ─────────────────────────────────────────────────────────
132
+ actualizarPolitica(politica) {
133
+ this.politica = { ...this.politica, ...politica };
134
+ this.emit("politicaCambiada", { politica: this.politica });
135
+ }
136
+ obtenerPolitica() {
137
+ return { ...this.politica };
138
+ }
139
+ obtenerPropuestas(estado) {
140
+ const todas = Array.from(this.propuestas.values());
141
+ if (estado === undefined)
142
+ return todas;
143
+ return todas.filter((p) => p.estado === estado);
144
+ }
145
+ obtenerPropuesta(id) {
146
+ return this.propuestas.get(id) ?? null;
147
+ }
148
+ importarPropuestas(propuestas) {
149
+ for (const prop of propuestas) {
150
+ this.propuestas.set(prop.id, { ...prop });
151
+ if (prop.estado === ESTADO_PROPUESTA.ABIERTA) {
152
+ const expiracionRestante = prop.expiracion - Date.now();
153
+ const timerExistente = this.timers.get(prop.id);
154
+ if (timerExistente) {
155
+ clearTimeout(timerExistente);
156
+ }
157
+ if (expiracionRestante > 0) {
158
+ const timer = setTimeout(() => {
159
+ this.cerrarPropuesta(prop.id);
160
+ }, expiracionRestante);
161
+ this.timers.set(prop.id, timer);
162
+ }
163
+ else {
164
+ this.cerrarPropuesta(prop.id);
165
+ }
166
+ }
167
+ else {
168
+ const timerExistente = this.timers.get(prop.id);
169
+ if (timerExistente) {
170
+ clearTimeout(timerExistente);
171
+ this.timers.delete(prop.id);
172
+ }
173
+ }
174
+ }
175
+ }
176
+ // ─── EVENTOS ──────────────────────────────────────────────────────────
177
+ on(tipo, handler) {
178
+ this.eventTarget.addEventListener(tipo, handler);
179
+ }
180
+ off(tipo, handler) {
181
+ this.eventTarget.removeEventListener(tipo, handler);
182
+ }
183
+ emit(tipo, detalle) {
184
+ const evento = new CustomEvent(tipo, { detail: detalle });
185
+ this.eventTarget.dispatchEvent(evento);
186
+ }
187
+ // ─── LIMPIEZA ─────────────────────────────────────────────────────────
188
+ limpiarPropuestasExpiradas() {
189
+ const ahora = Date.now();
190
+ for (const [id, propuesta] of this.propuestas) {
191
+ if (propuesta.expiracion < ahora) {
192
+ this.cerrarPropuesta(id);
193
+ }
194
+ }
195
+ }
196
+ destruir() {
197
+ for (const timer of this.timers.values()) {
198
+ clearTimeout(timer);
199
+ }
200
+ this.timers.clear();
201
+ this.propuestas.clear();
202
+ }
203
+ }
204
+ // ─── FACTORY ───────────────────────────────────────────────────────────────
205
+ export function createGovernanceManager(politica, verificador, options) {
206
+ return new GovernanceManager(politica, verificador, options);
207
+ }
208
+ export * from "./authority.js";
209
+ export * from "./merge.js";
210
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/governance/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { ParPublico, PostQuantumIdentity } from "../identity/index.js";
2
+ import type { NodoId, PayloadVotacion } from "../types/index.js";
3
+ import { type Propuesta } from "./index.js";
4
+ export type Proposal = Propuesta;
5
+ export type Vote = PayloadVotacion;
6
+ export interface GovernanceEvent {
7
+ readonly id: string;
8
+ readonly tipo: string;
9
+ readonly timestamp: number;
10
+ readonly payload: unknown;
11
+ }
12
+ export interface GovernanceSnapshot {
13
+ readonly propuestas: Proposal[];
14
+ readonly timestamp: number;
15
+ readonly firma?: Uint8Array;
16
+ readonly publicNodeId?: NodoId;
17
+ }
18
+ export interface GovernanceMerge {
19
+ resolveProposalConflicts(local: Proposal[], remote: Proposal[]): Promise<Proposal[]>;
20
+ resolveVoteConflicts(local: Vote[], remote: Vote[]): Promise<Vote[]>;
21
+ detectGovernanceFork(localEvents: GovernanceEvent[], remoteEvents: GovernanceEvent[]): Promise<boolean>;
22
+ }
23
+ export declare function stableStringify(val: unknown): string;
24
+ export declare function signGovernanceSnapshot(snapshot: Omit<GovernanceSnapshot, "firma" | "publicNodeId">, identity: PostQuantumIdentity): Promise<GovernanceSnapshot>;
25
+ export declare function verifyGovernanceSnapshot(snapshot: GovernanceSnapshot, parPublico: ParPublico, identity: PostQuantumIdentity): Promise<boolean>;
26
+ export declare class GovernanceMerger implements GovernanceMerge {
27
+ resolveProposalConflicts(local: Proposal[], remote: Proposal[]): Promise<Proposal[]>;
28
+ resolveVoteConflicts(local: Vote[], remote: Vote[]): Promise<Vote[]>;
29
+ detectGovernanceFork(localEvents: GovernanceEvent[], remoteEvents: GovernanceEvent[]): Promise<boolean>;
30
+ }
31
+ //# sourceMappingURL=merge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/governance/merge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAoB,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAI9D,MAAM,MAAM,QAAQ,GAAG,SAAS,CAAC;AACjC,MAAM,MAAM,IAAI,GAAG,eAAe,CAAC;AAInC,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC1B;AAID,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,UAAU,EAAE,QAAQ,EAAE,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAC/B;AAID,MAAM,WAAW,eAAe;IAC/B,wBAAwB,CACvB,KAAK,EAAE,QAAQ,EAAE,EACjB,MAAM,EAAE,QAAQ,EAAE,GAChB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IACvB,oBAAoB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACrE,oBAAoB,CACnB,WAAW,EAAE,eAAe,EAAE,EAC9B,YAAY,EAAE,eAAe,EAAE,GAC7B,OAAO,CAAC,OAAO,CAAC,CAAC;CACpB;AAID,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAapD;AAID,wBAAsB,sBAAsB,CAC3C,QAAQ,EAAE,IAAI,CAAC,kBAAkB,EAAE,OAAO,GAAG,cAAc,CAAC,EAC5D,QAAQ,EAAE,mBAAmB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,CAS7B;AAED,wBAAsB,wBAAwB,CAC7C,QAAQ,EAAE,kBAAkB,EAC5B,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,mBAAmB,GAC3B,OAAO,CAAC,OAAO,CAAC,CAMlB;AAID,qBAAa,gBAAiB,YAAW,eAAe;IACjD,wBAAwB,CAC7B,KAAK,EAAE,QAAQ,EAAE,EACjB,MAAM,EAAE,QAAQ,EAAE,GAChB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAoDrB;IAEK,oBAAoB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAezE;IAEK,oBAAoB,CACzB,WAAW,EAAE,eAAe,EAAE,EAC9B,YAAY,EAAE,eAAe,EAAE,GAC7B,OAAO,CAAC,OAAO,CAAC,CAyElB;CACD"}
@@ -0,0 +1,167 @@
1
+ import { ESTADO_PROPUESTA } from "./index.js";
2
+ // ─── STABLE STRINGIFY ──────────────────────────────────────────────────────
3
+ export function stableStringify(val) {
4
+ if (typeof val !== "object" || val === null) {
5
+ return JSON.stringify(val);
6
+ }
7
+ if (Array.isArray(val)) {
8
+ return `[${val.map(stableStringify).join(",")}]`;
9
+ }
10
+ const keys = Object.keys(val).sort();
11
+ const parts = keys.map((k) => `${JSON.stringify(k)}:${stableStringify(val[k])}`);
12
+ return `{${parts.join(",")}}`;
13
+ }
14
+ // ─── SIGN & VERIFY SNAPSHOT ───────────────────────────────────────────────
15
+ export async function signGovernanceSnapshot(snapshot, identity) {
16
+ const encoder = new TextEncoder();
17
+ const serialized = encoder.encode(stableStringify(snapshot));
18
+ const firma = await identity.firmar(serialized);
19
+ return {
20
+ ...snapshot,
21
+ firma,
22
+ publicNodeId: identity.nodoId,
23
+ };
24
+ }
25
+ export async function verifyGovernanceSnapshot(snapshot, parPublico, identity) {
26
+ if (!snapshot.firma)
27
+ return false;
28
+ const { firma, publicNodeId, ...rest } = snapshot;
29
+ const encoder = new TextEncoder();
30
+ const serialized = encoder.encode(stableStringify(rest));
31
+ return identity.verificar(serialized, firma, parPublico);
32
+ }
33
+ // ─── GOVERNANCE MERGER IMPLEMENTATION ─────────────────────────────────────
34
+ export class GovernanceMerger {
35
+ async resolveProposalConflicts(local, remote) {
36
+ const merged = [];
37
+ const remoteMap = new Map();
38
+ for (const p of remote) {
39
+ remoteMap.set(p.id, p);
40
+ }
41
+ for (const localProp of local) {
42
+ const remoteProp = remoteMap.get(localProp.id);
43
+ if (!remoteProp) {
44
+ // Propuestas con id único: ambas sobreviven
45
+ merged.push({ ...localProp });
46
+ }
47
+ else {
48
+ // Propuestas con mismo id
49
+ if (localProp.tipo === "expulsion" || remoteProp.tipo === "expulsion") {
50
+ // Expulsiones: la expulsión más reciente gana (por timestamp)
51
+ if (localProp.timestamp >= remoteProp.timestamp) {
52
+ merged.push({ ...localProp });
53
+ }
54
+ else {
55
+ merged.push({ ...remoteProp });
56
+ }
57
+ }
58
+ else if (localProp.estado !== remoteProp.estado) {
59
+ // Propuestas con mismo id pero diferente resultado: se re-votan con todos los peers
60
+ merged.push({
61
+ ...localProp,
62
+ estado: ESTADO_PROPUESTA.ABIERTA,
63
+ votos: [], // Reset votos to re-vote
64
+ expiracion: Date.now() + 30_000, // Extend expiration
65
+ });
66
+ }
67
+ else {
68
+ // Same result: no conflict, merge votes cleanly
69
+ const allVotes = [...localProp.votos];
70
+ for (const rv of remoteProp.votos) {
71
+ if (!allVotes.some((lv) => lv.nodoId === rv.nodoId)) {
72
+ allVotes.push(rv);
73
+ }
74
+ }
75
+ merged.push({
76
+ ...localProp,
77
+ votos: allVotes,
78
+ });
79
+ }
80
+ remoteMap.delete(localProp.id);
81
+ }
82
+ }
83
+ // Add remaining remote proposals (id único)
84
+ for (const remoteProp of remoteMap.values()) {
85
+ merged.push({ ...remoteProp });
86
+ }
87
+ return merged;
88
+ }
89
+ async resolveVoteConflicts(local, remote) {
90
+ const merged = [...local];
91
+ for (const rVote of remote) {
92
+ const exists = merged.find((lVote) => lVote.propuesta === rVote.propuesta && lVote.nodoId === rVote.nodoId);
93
+ if (!exists) {
94
+ merged.push(rVote);
95
+ }
96
+ else {
97
+ // If they exist but differ, we can deterministically keep the local one.
98
+ // (No changes needed since it's already in merged)
99
+ }
100
+ }
101
+ return merged;
102
+ }
103
+ async detectGovernanceFork(localEvents, remoteEvents) {
104
+ const localProps = new Map();
105
+ const remoteProps = new Map();
106
+ const localExpulsions = new Map();
107
+ const remoteExpulsions = new Map();
108
+ // Helper to extract proposal
109
+ const extractProp = (ev) => {
110
+ const payload = ev.payload;
111
+ if (payload && typeof payload === "object") {
112
+ if (payload.propuesta && typeof payload.propuesta === "object") {
113
+ return payload.propuesta;
114
+ }
115
+ }
116
+ return null;
117
+ };
118
+ for (const ev of localEvents) {
119
+ const prop = extractProp(ev);
120
+ if (prop?.id) {
121
+ localProps.set(prop.id, prop);
122
+ }
123
+ if (ev.tipo === "expulsion") {
124
+ const pp = ev.payload;
125
+ const target = (pp?.target ?? pp?.nodoId ?? ev.id);
126
+ localExpulsions.set(target, ev);
127
+ }
128
+ }
129
+ for (const ev of remoteEvents) {
130
+ const prop = extractProp(ev);
131
+ if (prop?.id) {
132
+ remoteProps.set(prop.id, prop);
133
+ }
134
+ if (ev.tipo === "expulsion") {
135
+ const pp = ev.payload;
136
+ const target = (pp?.target ?? pp?.nodoId ?? ev.id);
137
+ remoteExpulsions.set(target, ev);
138
+ }
139
+ }
140
+ // Check proposal conflicts
141
+ for (const [id, localProp] of localProps) {
142
+ const remoteProp = remoteProps.get(id);
143
+ if (remoteProp) {
144
+ if (localProp.estado !== remoteProp.estado) {
145
+ return true;
146
+ }
147
+ // Check if vote sets are different
148
+ if (stableStringify(localProp.votos) !== stableStringify(remoteProp.votos)) {
149
+ return true;
150
+ }
151
+ }
152
+ }
153
+ // Check expulsion conflicts
154
+ for (const [target, localExp] of localExpulsions) {
155
+ const remoteExp = remoteExpulsions.get(target);
156
+ if (remoteExp) {
157
+ if (localExp.timestamp !== remoteExp.timestamp ||
158
+ localExp.payload?.resultado !==
159
+ remoteExp.payload?.resultado) {
160
+ return true;
161
+ }
162
+ }
163
+ }
164
+ return false;
165
+ }
166
+ }
167
+ //# sourceMappingURL=merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/governance/merge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,199 @@
1
+ import type { NodoId, ParPublico } from "../types/index.js";
2
+ export type { ParPublico };
3
+ /** Prefijo de un identificador de nodo derivado criptograficamente. */
4
+ export declare const PREFIJO_NODO_DERIVADO = "mlkem";
5
+ export declare const TIPO_IDENTIDAD: {
6
+ readonly MAESTRA: "maestra";
7
+ readonly EPHEMERA: "ephemera";
8
+ readonly SERVICIO: "servicio";
9
+ };
10
+ export type TipoIdentidad = (typeof TIPO_IDENTIDAD)[keyof typeof TIPO_IDENTIDAD];
11
+ /**
12
+ * QUE PRUEBA ML-DSA-65 Y QUE PROTEGE ML-KEM-768: son garantias distintas y
13
+ * ninguna sustituye a la otra.
14
+ *
15
+ * - ML-DSA-65 (firma, `firmar` / `verificar`): **autenticidad + integridad**.
16
+ * Prueba que el tenedor de la clave privada escribio esos bytes exactos y que
17
+ * no fueron alterados en transito. No revela nada: cualquiera puede verificar.
18
+ *
19
+ * - ML-KEM-768 (encapsulacion, `encapsular` / `decapsular`): **confidencialidad
20
+ * del secreto compartido**. Solo el dueno de la clave privada correspondiente
21
+ * puede recuperarlo; el ciphertext que viaja es inservible para cualquier otro.
22
+ * No dice NADA sobre quien envio el mensaje.
23
+ *
24
+ * Un envolvente correcto necesita ambos: ML-KEM para que solo el destinatario
25
+ * lea el payload, ML-DSA para que el destinatario pruebe quien lo envio.
26
+ */
27
+ export declare const ALGORITMOS: {
28
+ readonly FIRMA: "ML-DSA-65";
29
+ readonly KEM: "ML-KEM-768";
30
+ };
31
+ export interface PostQuantumKeypair {
32
+ readonly parPrivado: Uint8Array;
33
+ readonly parPublico: ParPublico;
34
+ /**
35
+ * Clave de desencapsulacion ML-KEM-768. Ausente solo para keypairs restaurados
36
+ * de la serializacion legacy (pre-KEM); en ese caso se genera una nueva.
37
+ */
38
+ readonly kemPrivado?: Uint8Array;
39
+ /** Clave de encapsulacion ML-KEM-768. Esto es lo que viaja por el cable. */
40
+ readonly kemPublico?: Uint8Array;
41
+ readonly algoritmo: string;
42
+ readonly tipo: TipoIdentidad;
43
+ readonly fechaCreacion: number;
44
+ }
45
+ export interface IdentityProvider {
46
+ sign(data: string): Promise<string>;
47
+ verify(data: string, signature: string, publicKey: Uint8Array): Promise<boolean>;
48
+ }
49
+ /** Resultado de `encapsular`: el ciphertext a enviar mas el secreto local. */
50
+ export interface SobreKem {
51
+ readonly cipherText: Uint8Array;
52
+ readonly claveCompartida: Uint8Array;
53
+ }
54
+ export interface PostQuantumIdentity extends IdentityProvider {
55
+ readonly nodoId: NodoId;
56
+ readonly keypair: PostQuantumKeypair;
57
+ firmar(datos: Uint8Array): Promise<Uint8Array>;
58
+ verificar(datos: Uint8Array, firma: Uint8Array, parPublico: ParPublico): Promise<boolean>;
59
+ exportarPublico(): ParPublico;
60
+ obtenerAlgoritmo(): string;
61
+ /** Clave publica ML-KEM-768 de este nodo. Segura para poner en el cable. */
62
+ exportarKemPublico(): ParPublico;
63
+ /**
64
+ * Clave publica ML-KEM del destinatario, recuperada de nuestra clave de
65
+ * desencapsulacion. Esto contrasta el par almacenado, de modo que una
66
+ * serializacion manipulada o incoherente se detecta antes de que alguien
67
+ * intente cifrar hacia nosotros.
68
+ */
69
+ obtenerKemPublico(): ParPublico;
70
+ /** Sella un secreto compartido para el dueno de `kemPublicoReceptor`. */
71
+ encapsular(kemPublicoReceptor: ParPublico): SobreKem;
72
+ /** Recupera el secreto compartido de un ciphertext dirigido a nosotros. */
73
+ decapsular(cipherText: Uint8Array): Uint8Array;
74
+ /** Deriva la clave simetrica de 32 bytes de un ciphertext dirigido a nosotros. */
75
+ derivarClaveSimetricaDesde(cipherText: Uint8Array): Promise<Uint8Array>;
76
+ }
77
+ /**
78
+ * Genera un keypair de nodo: un par de firma ML-DSA-65 **y** un par de
79
+ * encapsulacion ML-KEM-768. Ambos hacen falta para una identidad de malla
80
+ * utilizable: el par de firma prueba quien eres, el par KEM permite que otros
81
+ * te hablen en privado.
82
+ */
83
+ export declare function generateKeypair(tipo?: TipoIdentidad): PostQuantumKeypair;
84
+ /**
85
+ * Deriva un identificador de nodo de forma determinista desde una clave publica
86
+ * ML-KEM-768.
87
+ *
88
+ * Esta es la correccion anti-suplantacion: un nodo no puede elegir, heredar ni
89
+ * adivinar el id de otro, porque el id *es* el hash de la clave que ese nodo debe
90
+ * presentar para probar posesion. Dos claves distintas nunca producen el mismo id
91
+ * con probabilidad significativa, y ninguna clave produce el id de otro.
92
+ *
93
+ * Formato: `mlkem<32 hex>` (primeros 16 bytes de SHA-256, con separacion de
94
+ * dominio).
95
+ */
96
+ export declare function derivarNodoId(kemPublico: ParPublico): Promise<NodoId>;
97
+ /** True cuando `nodoId` tiene la forma de un id derivado. Filtro barato. */
98
+ export declare function esNodoIdDerivado(nodoId: string): boolean;
99
+ /**
100
+ * Verifica que `nodoId` sea realmente el id derivado de la clave ML-KEM de este
101
+ * nodo.
102
+ *
103
+ * Nodos legacy (ids asignados antes de esta correccion, p. ej. `'doctor-01'`)
104
+ * devuelven `false` aqui y los maneja la ruta de migracion de abajo, no un
105
+ * rechazo.
106
+ */
107
+ export declare function verificarNodoIdVinculado(nodoId: NodoId, kemPublico: ParPublico): Promise<boolean>;
108
+ export type EstadoVinculoNodoId =
109
+ /** el id es el hash de la clave ML-KEM: ligado criptograficamente, nada que hacer. */
110
+ {
111
+ readonly estado: "vinculado";
112
+ }
113
+ /** id libre legacy de antes de existir los ids derivados; se acepta y se fija. */
114
+ | {
115
+ readonly estado: "heredado";
116
+ readonly idEsperado: NodoId;
117
+ }
118
+ /** id legacy que no es el derivado, y el llamador no dio opt-in. */
119
+ | {
120
+ readonly estado: "conflicto";
121
+ idEsperado: NodoId;
122
+ };
123
+ /**
124
+ * Decide que hacer con un nodo id configurado antes de que existieran los ids
125
+ * derivados. **Nunca se sobrescribe nada en silencio.**
126
+ *
127
+ * - Id derivado que coincide con la clave → `vinculado`.
128
+ * - Id no derivado (libre) → `heredado`: el nodo sigue funcionando con su id
129
+ * configurado, y fijamos ese id en el almacen de confianza para que una
130
+ * rotacion posterior de identidad no pueda moverlo. `idEsperado` es el id
131
+ * derivado a adoptar cuando el nodo rote su clave.
132
+ * - Id con forma derivada que NO coincide con la clave → `conflicto`: eso es un
133
+ * intento de suplantacion (reclamar el id derivado de otro nodo), y el
134
+ * llamador debe negarse.
135
+ *
136
+ * @param permitirHeredado opt-in para nodos legacy. Los llamadores legacy que
137
+ * pasan un id configurado (la forma previa `createPostQuantumIdentity(nodoId)`)
138
+ * deben ponerlo en `true`; el default es `false`, es decir, fallar cerrado.
139
+ */
140
+ export declare function evaluarVinculoNodoId(nodoId: NodoId, kemPublico: ParPublico, permitirHeredado?: boolean): Promise<EstadoVinculoNodoId>;
141
+ /**
142
+ * Convierte un secreto compartido ML-KEM-768 en una clave simetrica de 32 bytes
143
+ * apta para AEAD (AES-GCM / ChaCha20-Poly1305).
144
+ *
145
+ * El secreto compartido crudo de ML-KEM son 32 bytes de material de clave;
146
+ * hashearlo con un separador de dominio evita que se use directamente como clave
147
+ * de AEAD sin este paso, y lo mantiene distinto de cualquier otro valor derivado.
148
+ *
149
+ * Exportado para la capa de cifrado: este es el unico lugar donde el secreto
150
+ * ML-KEM de un nodo se vuelve material de cifrado.
151
+ */
152
+ export declare function derivarClaveSimetrica(sharedSecret: Uint8Array): Promise<Uint8Array>;
153
+ /**
154
+ * Crea una identidad para un nodo.
155
+ *
156
+ * El argumento `nodoId` se conserva por compatibilidad de cable y almacen. Para
157
+ * nodos NUEVOS prefiere `crearIdentidadVinculada(keypair)`, que deriva el id de
158
+ * la clave ML-KEM para que no pueda suplantarse. Un `nodoId` pasado aqui es
159
+ * siempre un id legacy; llama a `evaluarVinculoNodoId` para comprobarlo y fija el
160
+ * resultado en el almacen de confianza.
161
+ */
162
+ export declare function createPostQuantumIdentity(nodoId: NodoId, keypair?: PostQuantumKeypair): PostQuantumIdentity;
163
+ /**
164
+ * Crea una identidad cuyo `nodoId` ES el hash de su propia clave publica
165
+ * ML-KEM-768. Este es el constructor recomendado: el nodo puede probar que posee
166
+ * el id y nadie mas puede acuñarlo.
167
+ *
168
+ * @throws si el `nodoId` del keypair (si lo hay) conflicto con el derivado — un
169
+ * id derivado reclamado que no coincide con la clave es un intento de
170
+ * suplantacion y no debe emparentarse.
171
+ */
172
+ export declare function crearIdentidadVinculada(keypair?: PostQuantumKeypair): Promise<PostQuantumIdentity>;
173
+ /**
174
+ * Restaura una identidad desde un **keypair serializado** producido por
175
+ * `serializeKeypair`. Pasar solo una clave privada cruda e incoherente es
176
+ * inseguro y ya no se soporta.
177
+ *
178
+ * Para una identidad aleatoria nueva usa `createPostQuantumIdentity(nodoId)`, o
179
+ * `crearIdentidadVinculada()` para obtener un id que no se pueda suplantar.
180
+ */
181
+ export declare function identityFromSecret(nodoId: NodoId, semilla: Uint8Array, tipo?: TipoIdentidad): PostQuantumIdentity;
182
+ declare function bytesToBase64(bytes: Uint8Array): string;
183
+ declare function base64ToBytes(b64: string): Uint8Array;
184
+ export { base64ToBytes, bytesToBase64 };
185
+ /**
186
+ * Serializa un keypair a un unico string. Layout v2:
187
+ *
188
+ * u32 privLen | u32 pubLen | u32 kemPrivLen | priv | pub | kemPriv
189
+ *
190
+ * La clave publica ML-KEM NO se almacena: se recupera de `kemPriv` via
191
+ * `ml_kem768.getPublicKey`, de modo que las dos nunca pueden discrepar en disco.
192
+ *
193
+ * El layout v1 (solo claves de firma, 8 bytes de cabecera) sigue siendo legible:
194
+ * `deserializeKeypair` lo detecta y genera un par KEM nuevo, igual que
195
+ * `conKem`. Un despliegue existente no pierde su identidad de firma al migrar.
196
+ */
197
+ export declare function serializeKeypair(keypair: PostQuantumKeypair): string;
198
+ export declare function deserializeKeypair(serializada: string): PostQuantumKeypair;
199
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/identity/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE5D,YAAY,EAAE,UAAU,EAAE,CAAC;AAsB3B,uEAAuE;AACvE,eAAO,MAAM,qBAAqB,UAAU,CAAC;AAK7C,eAAO,MAAM,cAAc;aAC1B,OAAO,EAAE,SAAS;aAClB,QAAQ,EAAE,UAAU;aACpB,QAAQ,EAAE,UAAU;CACX,CAAC;AAEX,MAAM,MAAM,aAAa,GACxB,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,OAAO,cAAc,CAAC,CAAC;AAEtD;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,UAAU;aACtB,KAAK;aACL,GAAG;CACM,CAAC;AAIX,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC;;;OAGG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;IACjC,4EAA4E;IAC5E,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAgB;IAChC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,CACL,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,UAAU,GACnB,OAAO,CAAC,OAAO,CAAC,CAAC;CACpB;AAED,8EAA8E;AAC9E,MAAM,WAAW,QAAQ;IACxB,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,eAAe,EAAE,UAAU,CAAC;CACrC;AAED,MAAM,WAAW,mBAAoB,SAAQ,gBAAgB;IAC5D,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC;IAErC,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/C,SAAS,CACR,KAAK,EAAE,UAAU,EACjB,KAAK,EAAE,UAAU,EACjB,UAAU,EAAE,UAAU,GACpB,OAAO,CAAC,OAAO,CAAC,CAAC;IACpB,eAAe,IAAI,UAAU,CAAC;IAC9B,gBAAgB,IAAI,MAAM,CAAC;IAI3B,4EAA4E;IAC5E,kBAAkB,IAAI,UAAU,CAAC;IACjC;;;;;OAKG;IACH,iBAAiB,IAAI,UAAU,CAAC;IAChC,yEAAyE;IACzE,UAAU,CAAC,kBAAkB,EAAE,UAAU,GAAG,QAAQ,CAAC;IACrD,2EAA2E;IAC3E,UAAU,CAAC,UAAU,EAAE,UAAU,GAAG,UAAU,CAAC;IAC/C,kFAAkF;IAClF,0BAA0B,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CACxE;AAyBD;;;;;GAKG;AACH,wBAAgB,eAAe,CAC9B,IAAI,GAAE,aAAuC,GAC3C,kBAAkB,CAapB;AAoBD;;;;;;;;;;;GAWG;AACH,wBAAsB,aAAa,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAS3E;AAED,4EAA4E;AAC5E,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAKxD;AAED;;;;;;;GAOG;AACH,wBAAsB,wBAAwB,CAC7C,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,UAAU,GACpB,OAAO,CAAC,OAAO,CAAC,CAGlB;AAID,MAAM,MAAM,mBAAmB;AAC9B,sFAAsF;AACpF;IAAE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;CAAE;AAClC,kFAAkF;GAChF;IAAE,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAAE;AAC9D,oEAAoE;GAClE;IAAE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAExD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,oBAAoB,CACzC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,UAAU,EACtB,gBAAgB,UAAQ,GACtB,OAAO,CAAC,mBAAmB,CAAC,CAM9B;AAID;;;;;;;;;;GAUG;AACH,wBAAsB,qBAAqB,CAC1C,YAAY,EAAE,UAAU,GACtB,OAAO,CAAC,UAAU,CAAC,CAGrB;AAqGD;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CACxC,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,kBAAkB,GAC1B,mBAAmB,CAGrB;AAED;;;;;;;;GAQG;AACH,wBAAsB,uBAAuB,CAC5C,OAAO,CAAC,EAAE,kBAAkB,GAC1B,OAAO,CAAC,mBAAmB,CAAC,CAI9B;AAID;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CACjC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,UAAU,EACnB,IAAI,GAAE,aAAuC,GAC3C,mBAAmB,CA2DrB;AAED,iBAAS,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAQhD;AAED,iBAAS,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAO9C;AAED,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC;AAExC;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,CAcpE;AAED,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,kBAAkB,CA0B1E"}