holosphere 2.0.0-alpha7 → 2.0.0-alpha9

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 (327) hide show
  1. package/CHANGELOG.md +446 -0
  2. package/FEATURES.md +431 -0
  3. package/LICENSE +29 -166
  4. package/LICENSE-AGPL.md +180 -0
  5. package/dist/cdn/holosphere.min.js +55 -0
  6. package/dist/cdn/holosphere.min.js.map +1 -0
  7. package/dist/cjs/holosphere.cjs +1 -1
  8. package/dist/esm/holosphere.js +1 -1
  9. package/dist/{index-C-IlLYlk.cjs → index-DDGt_V9o.cjs} +2 -2
  10. package/dist/{index-C-IlLYlk.cjs.map → index-DDGt_V9o.cjs.map} +1 -1
  11. package/dist/{index-d6f4RJBM.js → index-DJXftyvB.js} +2253 -387
  12. package/dist/index-DJXftyvB.js.map +1 -0
  13. package/dist/index-DMbdcMtK.cjs +18 -0
  14. package/dist/index-DMbdcMtK.cjs.map +1 -0
  15. package/dist/{index-jmTHEbR2.js → index-DeZ1xz_s.js} +2 -2
  16. package/dist/{index-jmTHEbR2.js.map → index-DeZ1xz_s.js.map} +1 -1
  17. package/dist/{indexeddb-storage-D8kOl0oK.js → indexeddb-storage-BFt6hMeF.js} +48 -4
  18. package/dist/indexeddb-storage-BFt6hMeF.js.map +1 -0
  19. package/dist/{indexeddb-storage-a8GipaDr.cjs → indexeddb-storage-BK5tv4Sh.cjs} +2 -2
  20. package/dist/indexeddb-storage-BK5tv4Sh.cjs.map +1 -0
  21. package/dist/{memory-storage-DBQK622V.js → memory-storage-C9HuoL2E.js} +44 -4
  22. package/dist/memory-storage-C9HuoL2E.js.map +1 -0
  23. package/dist/{memory-storage-gfRovk2O.cjs → memory-storage-Dao7jfYG.cjs} +2 -2
  24. package/dist/memory-storage-Dao7jfYG.cjs.map +1 -0
  25. package/dist/{secp256k1-BCAPF45D.cjs → secp256k1-BbKzbLtD.cjs} +2 -2
  26. package/dist/{secp256k1-BCAPF45D.cjs.map → secp256k1-BbKzbLtD.cjs.map} +1 -1
  27. package/dist/{secp256k1-DYm_CMqW.js → secp256k1-CreY7Pcl.js} +2 -2
  28. package/dist/{secp256k1-DYm_CMqW.js.map → secp256k1-CreY7Pcl.js.map} +1 -1
  29. package/docs/api/ai_aggregation.js.html +333 -0
  30. package/docs/api/ai_breakdown.js.html +524 -0
  31. package/docs/api/ai_classifier.js.html +231 -0
  32. package/docs/api/ai_council.js.html +246 -0
  33. package/docs/api/ai_embeddings.js.html +304 -0
  34. package/docs/api/ai_federation-ai.js.html +338 -0
  35. package/docs/api/ai_h3-ai.js.html +970 -0
  36. package/docs/api/ai_index.js.html +124 -0
  37. package/docs/api/ai_json-ops.js.html +241 -0
  38. package/docs/api/ai_llm-service.js.html +239 -0
  39. package/docs/api/ai_nl-query.js.html +236 -0
  40. package/docs/api/ai_relationships.js.html +367 -0
  41. package/docs/api/ai_schema-extractor.js.html +235 -0
  42. package/docs/api/ai_spatial.js.html +307 -0
  43. package/docs/api/ai_tts.js.html +214 -0
  44. package/docs/api/content_social-protocols.js.html +180 -0
  45. package/docs/api/core_holosphere.js.html +757 -0
  46. package/docs/api/crypto_nostr-utils.js.html +306 -0
  47. package/docs/api/crypto_secp256k1.js.html +267 -0
  48. package/docs/api/data/search.json +1 -0
  49. package/docs/api/federation_discovery.js.html +337 -0
  50. package/docs/api/federation_handshake.js.html +478 -0
  51. package/docs/api/federation_hologram.js.html +1053 -0
  52. package/docs/api/federation_registry.js.html +389 -0
  53. package/docs/api/fonts/Inconsolata-Regular.ttf +0 -0
  54. package/docs/api/fonts/OpenSans-Regular.ttf +0 -0
  55. package/docs/api/fonts/WorkSans-Bold.ttf +0 -0
  56. package/docs/api/global.html +3 -0
  57. package/docs/api/hierarchical_upcast.js.html +128 -0
  58. package/docs/api/index.html +265 -0
  59. package/docs/api/index.js.html +1868 -0
  60. package/docs/api/lib_ai-methods.js.html +660 -0
  61. package/docs/api/lib_contract-methods.js.html +445 -0
  62. package/docs/api/lib_errors.js.html +56 -0
  63. package/docs/api/lib_federation-methods.js.html +348 -0
  64. package/docs/api/lib_index.js.html +33 -0
  65. package/docs/api/module-ai.html +5 -0
  66. package/docs/api/module-ai_aggregation-SmartAggregation.html +6 -0
  67. package/docs/api/module-ai_aggregation.SmartAggregation.html +3 -0
  68. package/docs/api/module-ai_aggregation.html +3 -0
  69. package/docs/api/module-ai_breakdown-TaskBreakdown.html +5 -0
  70. package/docs/api/module-ai_breakdown.TaskBreakdown.html +3 -0
  71. package/docs/api/module-ai_breakdown.html +3 -0
  72. package/docs/api/module-ai_classifier-Classifier.html +6 -0
  73. package/docs/api/module-ai_classifier.Classifier.html +3 -0
  74. package/docs/api/module-ai_classifier.html +3 -0
  75. package/docs/api/module-ai_council-Council.html +6 -0
  76. package/docs/api/module-ai_council.Council.html +3 -0
  77. package/docs/api/module-ai_council.html +3 -0
  78. package/docs/api/module-ai_embeddings-Embeddings.html +5 -0
  79. package/docs/api/module-ai_embeddings.Embeddings.html +3 -0
  80. package/docs/api/module-ai_embeddings.html +3 -0
  81. package/docs/api/module-ai_federation-ai-FederationAdvisor.html +6 -0
  82. package/docs/api/module-ai_federation-ai.FederationAdvisor.html +3 -0
  83. package/docs/api/module-ai_federation-ai.html +3 -0
  84. package/docs/api/module-ai_h3-ai-H3AI.html +6 -0
  85. package/docs/api/module-ai_h3-ai.H3AI.html +3 -0
  86. package/docs/api/module-ai_h3-ai.html +3 -0
  87. package/docs/api/module-ai_json-ops-JSONOps.html +5 -0
  88. package/docs/api/module-ai_json-ops.JSONOps.html +3 -0
  89. package/docs/api/module-ai_json-ops.html +3 -0
  90. package/docs/api/module-ai_llm-service-LLMService.html +5 -0
  91. package/docs/api/module-ai_llm-service.LLMService.html +3 -0
  92. package/docs/api/module-ai_llm-service.html +3 -0
  93. package/docs/api/module-ai_nl-query-NLQuery.html +5 -0
  94. package/docs/api/module-ai_nl-query.NLQuery.html +3 -0
  95. package/docs/api/module-ai_nl-query.html +3 -0
  96. package/docs/api/module-ai_relationships-RelationshipDiscovery.html +6 -0
  97. package/docs/api/module-ai_relationships.RelationshipDiscovery.html +3 -0
  98. package/docs/api/module-ai_relationships.html +3 -0
  99. package/docs/api/module-ai_schema-extractor-SchemaExtractor.html +5 -0
  100. package/docs/api/module-ai_schema-extractor.SchemaExtractor.html +3 -0
  101. package/docs/api/module-ai_schema-extractor.html +3 -0
  102. package/docs/api/module-ai_spatial-SpatialAnalysis.html +6 -0
  103. package/docs/api/module-ai_spatial.SpatialAnalysis.html +3 -0
  104. package/docs/api/module-ai_spatial.html +3 -0
  105. package/docs/api/module-ai_tts-TTS.html +5 -0
  106. package/docs/api/module-ai_tts.TTS.html +3 -0
  107. package/docs/api/module-ai_tts.html +3 -0
  108. package/docs/api/module-content_social-protocols.html +3 -0
  109. package/docs/api/module-core_holosphere-HoloSphere.html +6 -0
  110. package/docs/api/module-core_holosphere.HoloSphere.html +3 -0
  111. package/docs/api/module-core_holosphere.html +3 -0
  112. package/docs/api/module-crypto_nostr-utils.html +3 -0
  113. package/docs/api/module-crypto_secp256k1.html +3 -0
  114. package/docs/api/module-federation_hologram.html +3 -0
  115. package/docs/api/module-hierarchical_upcast.html +3 -0
  116. package/docs/api/module-holosphere-HoloSphereBase.html +3 -0
  117. package/docs/api/module-holosphere.html +3 -0
  118. package/docs/api/module-lib_ai-methods.html +3 -0
  119. package/docs/api/module-lib_contract-methods.html +3 -0
  120. package/docs/api/module-lib_errors-AuthorizationError.html +3 -0
  121. package/docs/api/module-lib_errors-ValidationError.html +3 -0
  122. package/docs/api/module-lib_errors.AuthorizationError.html +3 -0
  123. package/docs/api/module-lib_errors.ValidationError.html +3 -0
  124. package/docs/api/module-lib_errors.html +3 -0
  125. package/docs/api/module-lib_federation-methods.html +3 -0
  126. package/docs/api/module-lib_index.html +3 -0
  127. package/docs/api/module-schema_validator-ValidationError.html +3 -0
  128. package/docs/api/module-schema_validator.ValidationError.html +3 -0
  129. package/docs/api/module-schema_validator.html +3 -0
  130. package/docs/api/module-spatial_h3-operations.html +4 -0
  131. package/docs/api/module-storage_backend-factory.BackendFactory.html +3 -0
  132. package/docs/api/module-storage_backend-factory.html +3 -0
  133. package/docs/api/module-storage_backend-interface-StorageBackend.html +3 -0
  134. package/docs/api/module-storage_backend-interface.StorageBackend.html +3 -0
  135. package/docs/api/module-storage_backend-interface.html +3 -0
  136. package/docs/api/module-storage_backends_activitypub-backend-ActivityPubBackend.html +7 -0
  137. package/docs/api/module-storage_backends_activitypub-backend.ActivityPubBackend.html +3 -0
  138. package/docs/api/module-storage_backends_activitypub-backend.html +3 -0
  139. package/docs/api/module-storage_backends_activitypub_server-ActivityPubServer.html +8 -0
  140. package/docs/api/module-storage_backends_activitypub_server.ActivityPubServer.html +3 -0
  141. package/docs/api/module-storage_backends_activitypub_server.html +3 -0
  142. package/docs/api/module-storage_backends_gundb-backend-GunDBBackend.html +7 -0
  143. package/docs/api/module-storage_backends_gundb-backend.GunDBBackend.html +3 -0
  144. package/docs/api/module-storage_backends_gundb-backend.html +3 -0
  145. package/docs/api/module-storage_backends_nostr-backend-NostrBackend.html +8 -0
  146. package/docs/api/module-storage_backends_nostr-backend.NostrBackend.html +3 -0
  147. package/docs/api/module-storage_backends_nostr-backend.html +3 -0
  148. package/docs/api/module-storage_filesystem-storage-FileSystemStorage.html +5 -0
  149. package/docs/api/module-storage_filesystem-storage-browser-FileSystemStorage.html +3 -0
  150. package/docs/api/module-storage_filesystem-storage-browser.FileSystemStorage.html +3 -0
  151. package/docs/api/module-storage_filesystem-storage-browser.html +3 -0
  152. package/docs/api/module-storage_filesystem-storage.FileSystemStorage.html +3 -0
  153. package/docs/api/module-storage_filesystem-storage.html +3 -0
  154. package/docs/api/module-storage_global-tables.html +3 -0
  155. package/docs/api/module-storage_gun-async.html +3 -0
  156. package/docs/api/module-storage_gun-auth-GunAuth.html +5 -0
  157. package/docs/api/module-storage_gun-auth.GunAuth.html +3 -0
  158. package/docs/api/module-storage_gun-auth.html +3 -0
  159. package/docs/api/module-storage_gun-federation.html +3 -0
  160. package/docs/api/module-storage_gun-references-GunReferenceHandler.html +5 -0
  161. package/docs/api/module-storage_gun-references.GunReferenceHandler.html +3 -0
  162. package/docs/api/module-storage_gun-references.html +3 -0
  163. package/docs/api/module-storage_gun-schema-GunSchemaValidator.html +5 -0
  164. package/docs/api/module-storage_gun-schema.GunSchemaValidator.html +3 -0
  165. package/docs/api/module-storage_gun-schema.html +3 -0
  166. package/docs/api/module-storage_gun-wrapper.html +11 -0
  167. package/docs/api/module-storage_indexeddb-storage-IndexedDBStorage.html +5 -0
  168. package/docs/api/module-storage_indexeddb-storage.IndexedDBStorage.html +3 -0
  169. package/docs/api/module-storage_indexeddb-storage.html +3 -0
  170. package/docs/api/module-storage_key-storage-simple.html +3 -0
  171. package/docs/api/module-storage_key-storage.html +4 -0
  172. package/docs/api/module-storage_memory-storage-MemoryStorage.html +5 -0
  173. package/docs/api/module-storage_memory-storage.MemoryStorage.html +3 -0
  174. package/docs/api/module-storage_memory-storage.html +3 -0
  175. package/docs/api/module-storage_migration-MigrationTool.html +6 -0
  176. package/docs/api/module-storage_migration.MigrationTool.html +3 -0
  177. package/docs/api/module-storage_migration.html +3 -0
  178. package/docs/api/module-storage_nostr-async.html +18 -0
  179. package/docs/api/module-storage_nostr-client-LRUCache.html +3 -0
  180. package/docs/api/module-storage_nostr-client-NostrClient.html +7 -0
  181. package/docs/api/module-storage_nostr-client.NostrClient.html +15 -0
  182. package/docs/api/module-storage_nostr-client.html +6 -0
  183. package/docs/api/module-storage_nostr-wrapper.html +3 -0
  184. package/docs/api/module-storage_outbox-queue-OutboxQueue.html +4 -0
  185. package/docs/api/module-storage_outbox-queue.OutboxQueue.html +3 -0
  186. package/docs/api/module-storage_outbox-queue.html +3 -0
  187. package/docs/api/module-storage_persistent-storage-PersistentStorage.html +3 -0
  188. package/docs/api/module-storage_persistent-storage.html +4 -0
  189. package/docs/api/module-storage_sync-service-SyncService.html +5 -0
  190. package/docs/api/module-storage_sync-service.SyncService.html +3 -0
  191. package/docs/api/module-storage_sync-service.html +3 -0
  192. package/docs/api/module-storage_unified-storage.html +3 -0
  193. package/docs/api/module-subscriptions_manager.SubscriptionRegistry.html +3 -0
  194. package/docs/api/module-subscriptions_manager.html +3 -0
  195. package/docs/api/schema_validator.js.html +113 -0
  196. package/docs/api/scripts/core.js +726 -0
  197. package/docs/api/scripts/core.min.js +23 -0
  198. package/docs/api/scripts/resize.js +90 -0
  199. package/docs/api/scripts/search.js +265 -0
  200. package/docs/api/scripts/search.min.js +6 -0
  201. package/docs/api/scripts/third-party/Apache-License-2.0.txt +202 -0
  202. package/docs/api/scripts/third-party/fuse.js +9 -0
  203. package/docs/api/scripts/third-party/hljs-line-num-original.js +369 -0
  204. package/docs/api/scripts/third-party/hljs-line-num.js +1 -0
  205. package/docs/api/scripts/third-party/hljs-original.js +5171 -0
  206. package/docs/api/scripts/third-party/hljs.js +1 -0
  207. package/docs/api/scripts/third-party/popper.js +5 -0
  208. package/docs/api/scripts/third-party/tippy.js +1 -0
  209. package/docs/api/scripts/third-party/tocbot.js +672 -0
  210. package/docs/api/scripts/third-party/tocbot.min.js +1 -0
  211. package/docs/api/spatial_h3-operations.js.html +129 -0
  212. package/docs/api/storage_backend-factory.js.html +133 -0
  213. package/docs/api/storage_backend-interface.js.html +164 -0
  214. package/docs/api/storage_backends_activitypub-backend.js.html +298 -0
  215. package/docs/api/storage_backends_activitypub_server.js.html +678 -0
  216. package/docs/api/storage_backends_gundb-backend.js.html +878 -0
  217. package/docs/api/storage_backends_nostr-backend.js.html +254 -0
  218. package/docs/api/storage_filesystem-storage-browser.js.html +83 -0
  219. package/docs/api/storage_filesystem-storage.js.html +207 -0
  220. package/docs/api/storage_global-tables.js.html +116 -0
  221. package/docs/api/storage_gun-async.js.html +344 -0
  222. package/docs/api/storage_gun-auth.js.html +376 -0
  223. package/docs/api/storage_gun-federation.js.html +788 -0
  224. package/docs/api/storage_gun-references.js.html +212 -0
  225. package/docs/api/storage_gun-schema.js.html +309 -0
  226. package/docs/api/storage_gun-wrapper.js.html +645 -0
  227. package/docs/api/storage_indexeddb-storage.js.html +224 -0
  228. package/docs/api/storage_key-storage-simple.js.html +102 -0
  229. package/docs/api/storage_key-storage.js.html +171 -0
  230. package/docs/api/storage_memory-storage.js.html +128 -0
  231. package/docs/api/storage_migration.js.html +354 -0
  232. package/docs/api/storage_nostr-async.js.html +1076 -0
  233. package/docs/api/storage_nostr-client.js.html +1598 -0
  234. package/docs/api/storage_nostr-wrapper.js.html +218 -0
  235. package/docs/api/storage_outbox-queue.js.html +248 -0
  236. package/docs/api/storage_persistent-storage.js.html +160 -0
  237. package/docs/api/storage_sync-service.js.html +201 -0
  238. package/docs/api/storage_unified-storage.js.html +157 -0
  239. package/docs/api/styles/clean-jsdoc-theme-base.css +1159 -0
  240. package/docs/api/styles/clean-jsdoc-theme-dark.css +412 -0
  241. package/docs/api/styles/clean-jsdoc-theme-light.css +482 -0
  242. package/docs/api/styles/clean-jsdoc-theme-scrollbar.css +30 -0
  243. package/docs/api/styles/clean-jsdoc-theme-without-scrollbar.min.css +1 -0
  244. package/docs/api/styles/clean-jsdoc-theme.min.css +1 -0
  245. package/docs/api/subscriptions_manager.js.html +162 -0
  246. package/examples/holosphere-widget.js +1242 -0
  247. package/examples/widget-demo.html +274 -0
  248. package/examples/widget.html +703 -0
  249. package/jsdoc.json +26 -0
  250. package/package.json +16 -3
  251. package/src/ai/aggregation.js +13 -2
  252. package/src/ai/breakdown.js +12 -2
  253. package/src/ai/classifier.js +14 -3
  254. package/src/ai/council.js +22 -7
  255. package/src/ai/embeddings.js +37 -15
  256. package/src/ai/federation-ai.js +13 -2
  257. package/src/ai/h3-ai.js +14 -2
  258. package/src/ai/index.js +16 -7
  259. package/src/ai/json-ops.js +18 -5
  260. package/src/ai/llm-service.js +62 -31
  261. package/src/ai/nl-query.js +12 -2
  262. package/src/ai/relationships.js +13 -2
  263. package/src/ai/schema-extractor.js +24 -10
  264. package/src/ai/spatial.js +13 -2
  265. package/src/ai/tts.js +25 -8
  266. package/src/cdn-entry.js +22 -0
  267. package/src/content/social-protocols.js +34 -25
  268. package/src/contracts/chain-manager.js +68 -40
  269. package/src/contracts/deployer.js +70 -42
  270. package/src/contracts/event-listener.js +61 -29
  271. package/src/contracts/holon-contracts.js +46 -31
  272. package/src/contracts/index.js +5 -6
  273. package/src/contracts/networks.js +19 -14
  274. package/src/contracts/operations.js +58 -41
  275. package/src/contracts/queries.js +70 -21
  276. package/src/core/holosphere.js +37 -8
  277. package/src/crypto/nostr-utils.js +105 -65
  278. package/src/crypto/secp256k1.js +7 -2
  279. package/src/federation/handshake.js +23 -11
  280. package/src/federation/hologram.js +9 -1
  281. package/src/hierarchical/upcast.js +34 -20
  282. package/src/index.js +671 -7
  283. package/src/lib/ai-methods.js +352 -3
  284. package/src/lib/contract-methods.js +152 -3
  285. package/src/lib/errors.js +31 -1
  286. package/src/lib/federation-methods.js +110 -3
  287. package/src/lib/index.js +9 -5
  288. package/src/schema/validator.js +22 -3
  289. package/src/spatial/h3-operations.js +17 -1
  290. package/src/storage/backend-factory.js +7 -2
  291. package/src/storage/backend-interface.js +21 -2
  292. package/src/storage/backends/activitypub/server.js +25 -3
  293. package/src/storage/backends/activitypub-backend.js +25 -2
  294. package/src/storage/backends/gundb-backend.js +322 -11
  295. package/src/storage/backends/nostr-backend.js +116 -1
  296. package/src/storage/filesystem-storage-browser.js +42 -2
  297. package/src/storage/filesystem-storage.js +72 -5
  298. package/src/storage/global-tables.js +7 -2
  299. package/src/storage/gun-async.js +20 -11
  300. package/src/storage/gun-auth.js +15 -4
  301. package/src/storage/gun-federation.js +14 -5
  302. package/src/storage/gun-references.js +16 -5
  303. package/src/storage/gun-schema.js +25 -10
  304. package/src/storage/gun-wrapper.js +160 -49
  305. package/src/storage/indexeddb-storage.js +65 -4
  306. package/src/storage/key-storage-simple.js +32 -9
  307. package/src/storage/key-storage.js +45 -13
  308. package/src/storage/memory-storage.js +65 -4
  309. package/src/storage/migration.js +20 -7
  310. package/src/storage/nostr-async.js +195 -90
  311. package/src/storage/nostr-client.js +173 -49
  312. package/src/storage/nostr-wrapper.js +6 -2
  313. package/src/storage/outbox-queue.js +55 -18
  314. package/src/storage/persistent-storage.js +56 -13
  315. package/src/storage/sync-service.js +51 -17
  316. package/src/storage/unified-storage.js +38 -3
  317. package/src/subscriptions/manager.js +33 -16
  318. package/vite.config.cdn.js +60 -0
  319. package/dist/index-Bvwyvd0T.cjs +0 -5
  320. package/dist/index-Bvwyvd0T.cjs.map +0 -1
  321. package/dist/index-d6f4RJBM.js.map +0 -1
  322. package/dist/indexeddb-storage-D8kOl0oK.js.map +0 -1
  323. package/dist/indexeddb-storage-a8GipaDr.cjs.map +0 -1
  324. package/dist/memory-storage-DBQK622V.js.map +0 -1
  325. package/dist/memory-storage-gfRovk2O.cjs.map +0 -1
  326. /package/{cleanup-test-data.js → scripts/cleanup-test-data.js} +0 -0
  327. /package/{test-ai-real-api.js → scripts/test-ai-real-api.js} +0 -0
@@ -1,20 +1,20 @@
1
1
  /**
2
- * Nostr Utility Functions
3
- *
4
- * Provides browser-compatible utilities for Nostr key handling and NIP-04 encryption.
5
- * Apps can use these without directly importing nostr-tools.
2
+ * @fileoverview Browser-compatible Nostr utility functions for key handling, encryption, and event management.
3
+ * Provides NIP-04 (legacy) and NIP-44 (modern, audited) encryption support, key conversion utilities,
4
+ * and event creation helpers. Applications can use these utilities without directly importing nostr-tools.
5
+ * @module crypto/nostr-utils
6
6
  */
7
7
 
8
- import { nip04, nip19, getPublicKey as nostrGetPublicKey, finalizeEvent, verifyEvent as nostrVerifyEvent } from 'nostr-tools';
8
+ import { nip04, nip44, nip19, getPublicKey as nostrGetPublicKey, finalizeEvent, verifyEvent as nostrVerifyEvent } from 'nostr-tools';
9
9
 
10
10
  // ============================================================================
11
11
  // Key Conversion Utilities
12
12
  // ============================================================================
13
13
 
14
14
  /**
15
- * Convert hex string to Uint8Array
16
- * @param {string} hex - Hex string
17
- * @returns {Uint8Array} Byte array
15
+ * Convert hex string to Uint8Array.
16
+ * @param {string} hex - Hexadecimal string (even length)
17
+ * @returns {Uint8Array} Byte array representation
18
18
  */
19
19
  export function hexToBytes(hex) {
20
20
  const bytes = new Uint8Array(hex.length / 2);
@@ -25,9 +25,9 @@ export function hexToBytes(hex) {
25
25
  }
26
26
 
27
27
  /**
28
- * Convert Uint8Array to hex string
29
- * @param {Uint8Array} bytes - Byte array
30
- * @returns {string} Hex string
28
+ * Convert Uint8Array to hex string.
29
+ * @param {Uint8Array} bytes - Byte array to convert
30
+ * @returns {string} Hexadecimal string representation
31
31
  */
32
32
  export function bytesToHex(bytes) {
33
33
  return Array.from(bytes)
@@ -36,9 +36,10 @@ export function bytesToHex(bytes) {
36
36
  }
37
37
 
38
38
  /**
39
- * Parse an npub or hex public key string into hex format
40
- * @param {string} input - npub (npub1...) or hex public key
41
- * @returns {{ valid: boolean, hexPubKey?: string, error?: string }}
39
+ * Parse an npub or hex public key string into hex format.
40
+ * Handles nostr: URI prefix and validates both npub and hex formats.
41
+ * @param {string} input - npub string (npub1...) or 64-character hex public key
42
+ * @returns {Object} Validation result with valid, hexPubKey (if valid), error (if invalid)
42
43
  */
43
44
  export function parseNpubOrHex(input) {
44
45
  const trimmed = input?.trim();
@@ -75,9 +76,9 @@ export function parseNpubOrHex(input) {
75
76
  }
76
77
 
77
78
  /**
78
- * Convert a hex public key to npub format
79
- * @param {string} hexPubKey - Hex public key (64 chars)
80
- * @returns {string} npub string
79
+ * Convert a hex public key to npub format.
80
+ * @param {string} hexPubKey - Hex public key (64 characters)
81
+ * @returns {string} npub-encoded public key (npub1...)
81
82
  */
82
83
  export function hexToNpub(hexPubKey) {
83
84
  try {
@@ -89,9 +90,9 @@ export function hexToNpub(hexPubKey) {
89
90
  }
90
91
 
91
92
  /**
92
- * Convert npub to hex public key
93
- * @param {string} npub - npub string
94
- * @returns {string|null} Hex public key or null if invalid
93
+ * Convert npub to hex public key.
94
+ * @param {string} npub - npub-encoded public key string
95
+ * @returns {string|null} 64-character hex public key or null if invalid
95
96
  */
96
97
  export function npubToHex(npub) {
97
98
  try {
@@ -106,9 +107,9 @@ export function npubToHex(npub) {
106
107
  }
107
108
 
108
109
  /**
109
- * Shorten a public key for display (first 8 and last 8 chars)
110
- * @param {string} pubKey - Public key (hex or npub)
111
- * @returns {string} Shortened key
110
+ * Shorten a public key for display (first 8 and last 8 chars).
111
+ * @param {string} pubKey - Public key in hex or npub format
112
+ * @returns {string} Shortened key with ellipsis (e.g., 'abcd1234...wxyz9876')
112
113
  */
113
114
  export function shortenPubKey(pubKey) {
114
115
  if (!pubKey || pubKey.length <= 20) return pubKey || '';
@@ -116,9 +117,9 @@ export function shortenPubKey(pubKey) {
116
117
  }
117
118
 
118
119
  /**
119
- * Shorten an npub for display
120
- * @param {string} npub - npub string
121
- * @returns {string} Shortened npub
120
+ * Shorten an npub for display (first 12 and last 8 chars).
121
+ * @param {string} npub - npub-encoded public key
122
+ * @returns {string} Shortened npub with ellipsis
122
123
  */
123
124
  export function shortenNpub(npub) {
124
125
  if (!npub || npub.length <= 20) return npub || '';
@@ -126,9 +127,10 @@ export function shortenNpub(npub) {
126
127
  }
127
128
 
128
129
  /**
129
- * Get public key from private key (matches nostr-tools API)
130
- * @param {string} privateKey - Hex private key
131
- * @returns {string} Hex public key
130
+ * Derive public key from private key using secp256k1.
131
+ * Matches nostr-tools getPublicKey API.
132
+ * @param {string} privateKey - 64-character hex private key
133
+ * @returns {string} Derived 64-character hex public key
132
134
  */
133
135
  export function getPublicKey(privateKey) {
134
136
  return nostrGetPublicKey(hexToBytes(privateKey));
@@ -139,38 +141,73 @@ export function getPublicKey(privateKey) {
139
141
  // ============================================================================
140
142
 
141
143
  /**
142
- * Encrypt a message using NIP-04 (for DMs)
143
- * @param {string} privateKey - Sender's hex private key
144
- * @param {string} recipientPubKey - Recipient's hex public key
145
- * @param {string} content - Plain text content
146
- * @returns {Promise<string>} Encrypted content
144
+ * Encrypt a message using NIP-04 (legacy DM encryption).
145
+ * Uses AES-256-CBC with base64 encoding. Consider using NIP-44 for new implementations.
146
+ * @param {string} privateKey - Sender's 64-character hex private key
147
+ * @param {string} recipientPubKey - Recipient's 64-character hex public key
148
+ * @param {string} content - Plain text message content
149
+ * @returns {Promise<string>} NIP-04 encrypted content string
147
150
  */
148
151
  export async function encryptNIP04(privateKey, recipientPubKey, content) {
149
152
  return await nip04.encrypt(privateKey, recipientPubKey, content);
150
153
  }
151
154
 
152
155
  /**
153
- * Decrypt a NIP-04 encrypted message
154
- * @param {string} privateKey - Recipient's hex private key
155
- * @param {string} senderPubKey - Sender's hex public key
156
- * @param {string} encryptedContent - Encrypted content
157
- * @returns {Promise<string>} Decrypted content
156
+ * Decrypt a NIP-04 encrypted message.
157
+ * @param {string} privateKey - Recipient's 64-character hex private key
158
+ * @param {string} senderPubKey - Sender's 64-character hex public key
159
+ * @param {string} encryptedContent - NIP-04 encrypted content string
160
+ * @returns {Promise<string>} Decrypted plain text content
158
161
  */
159
162
  export async function decryptNIP04(privateKey, senderPubKey, encryptedContent) {
160
163
  return await nip04.decrypt(privateKey, senderPubKey, encryptedContent);
161
164
  }
162
165
 
166
+ // ============================================================================
167
+ // NIP-44 Encryption (Modern, Audited - Replaces NIP-04)
168
+ // ============================================================================
169
+
170
+ /**
171
+ * Encrypt a message using NIP-44 (modern, audited encryption standard).
172
+ * Uses ChaCha20-Poly1305 + HMAC-SHA256, audited by Cure53. Recommended for new implementations.
173
+ * @param {string} privateKey - Sender's 64-character hex private key
174
+ * @param {string} recipientPubKey - Recipient's 64-character hex public key
175
+ * @param {string} content - Plain text message content
176
+ * @returns {string} NIP-44 encrypted content (base64-encoded)
177
+ */
178
+ export function encryptNIP44(privateKey, recipientPubKey, content) {
179
+ const privKeyBytes = hexToBytes(privateKey);
180
+ // nostr-tools nip44 expects pubkey as hex string, not bytes
181
+ const conversationKey = nip44.v2.utils.getConversationKey(privKeyBytes, recipientPubKey);
182
+ return nip44.v2.encrypt(content, conversationKey);
183
+ }
184
+
185
+ /**
186
+ * Decrypt a NIP-44 encrypted message.
187
+ * @param {string} privateKey - Recipient's 64-character hex private key
188
+ * @param {string} senderPubKey - Sender's 64-character hex public key
189
+ * @param {string} encryptedContent - NIP-44 encrypted content (base64-encoded)
190
+ * @returns {string} Decrypted plain text content
191
+ */
192
+ export function decryptNIP44(privateKey, senderPubKey, encryptedContent) {
193
+ const privKeyBytes = hexToBytes(privateKey);
194
+ // nostr-tools nip44 expects pubkey as hex string, not bytes
195
+ const conversationKey = nip44.v2.utils.getConversationKey(privKeyBytes, senderPubKey);
196
+ return nip44.v2.decrypt(encryptedContent, conversationKey);
197
+ }
198
+
163
199
  // ============================================================================
164
200
  // Event Creation
165
201
  // ============================================================================
166
202
 
167
203
  /**
168
- * Create and sign a Nostr event
169
- * @param {number} kind - Event kind
170
- * @param {string} content - Event content
171
- * @param {string[][]} tags - Event tags
172
- * @param {string} privateKey - Hex private key for signing
173
- * @returns {Object} Signed Nostr event
204
+ * Create and sign a Nostr event.
205
+ * Automatically adds created_at timestamp, computes event ID, and generates signature.
206
+ * @param {number} kind - Event kind (e.g., 1 for text note, 4 for DM)
207
+ * @param {string} content - Event content string
208
+ * @param {string[][]} tags - Array of tag arrays (e.g., [['p', 'pubkey'], ['e', 'eventId']])
209
+ * @param {string} privateKey - 64-character hex private key for signing
210
+ * @returns {Object} Signed Nostr event with id, pubkey, sig, and all fields
174
211
  */
175
212
  export function createSignedEvent(kind, content, tags, privateKey) {
176
213
  const event = {
@@ -184,11 +221,12 @@ export function createSignedEvent(kind, content, tags, privateKey) {
184
221
  }
185
222
 
186
223
  /**
187
- * Create a NIP-04 encrypted DM event (kind 4)
188
- * @param {string} recipientPubKey - Recipient's hex public key
189
- * @param {string} encryptedContent - NIP-04 encrypted content
190
- * @param {string} privateKey - Sender's hex private key
191
- * @returns {Object} Signed DM event
224
+ * Create a NIP-04 encrypted DM event (kind 4).
225
+ * Creates and signs a direct message event with proper recipient tagging.
226
+ * @param {string} recipientPubKey - Recipient's 64-character hex public key
227
+ * @param {string} encryptedContent - NIP-04 encrypted message content
228
+ * @param {string} privateKey - Sender's 64-character hex private key
229
+ * @returns {Object} Signed Nostr DM event (kind 4) with ['p', recipientPubKey] tag
192
230
  */
193
231
  export function createDMEvent(recipientPubKey, encryptedContent, privateKey) {
194
232
  return createSignedEvent(
@@ -204,18 +242,18 @@ export function createDMEvent(recipientPubKey, encryptedContent, privateKey) {
204
242
  // ============================================================================
205
243
 
206
244
  /**
207
- * Check if a string is a valid hex public key
208
- * @param {string} str - String to check
209
- * @returns {boolean}
245
+ * Check if a string is a valid hex public key (64 hex characters).
246
+ * @param {string} str - String to validate
247
+ * @returns {boolean} True if valid 64-character hex string
210
248
  */
211
249
  export function isValidHexPubKey(str) {
212
250
  return typeof str === 'string' && /^[0-9a-fA-F]{64}$/.test(str);
213
251
  }
214
252
 
215
253
  /**
216
- * Check if a string is a valid npub
217
- * @param {string} str - String to check
218
- * @returns {boolean}
254
+ * Check if a string is a valid npub (starts with npub1 and decodes correctly).
255
+ * @param {string} str - String to validate
256
+ * @returns {boolean} True if valid npub format
219
257
  */
220
258
  export function isValidNpub(str) {
221
259
  if (typeof str !== 'string' || !str.startsWith('npub1')) {
@@ -230,18 +268,19 @@ export function isValidNpub(str) {
230
268
  }
231
269
 
232
270
  /**
233
- * Generate a unique nonce
234
- * @returns {string} Unique nonce
271
+ * Generate a unique nonce using timestamp and random value.
272
+ * @returns {string} Unique nonce string combining base36 timestamp and random suffix
235
273
  */
236
274
  export function generateNonce() {
237
275
  return Date.now().toString(36) + Math.random().toString(36).substring(2, 15);
238
276
  }
239
277
 
240
278
  /**
241
- * Sign a Nostr event (alias for createSignedEvent that accepts event object)
242
- * @param {Object} event - Unsigned event object with kind, content, tags
243
- * @param {string} privateKey - Hex private key for signing
244
- * @returns {Object} Signed Nostr event
279
+ * Sign a Nostr event object.
280
+ * Accepts an event object instead of individual parameters. Adds created_at if missing.
281
+ * @param {Object} event - Unsigned event object with kind, content, and tags
282
+ * @param {string} privateKey - 64-character hex private key for signing
283
+ * @returns {Object} Signed Nostr event with id, pubkey, and sig fields added
245
284
  */
246
285
  export function signEvent(event, privateKey) {
247
286
  const eventToSign = {
@@ -254,9 +293,10 @@ export function signEvent(event, privateKey) {
254
293
  }
255
294
 
256
295
  /**
257
- * Verify a Nostr event signature
258
- * @param {Object} event - Signed Nostr event to verify
259
- * @returns {boolean} True if signature is valid
296
+ * Verify a Nostr event signature using secp256k1.
297
+ * Validates that the event ID matches the event data and the signature is valid.
298
+ * @param {Object} event - Signed Nostr event with id, pubkey, and sig fields
299
+ * @returns {boolean} True if event signature is cryptographically valid
260
300
  */
261
301
  export function verifyEvent(event) {
262
302
  return nostrVerifyEvent(event);
@@ -1,6 +1,11 @@
1
1
  /**
2
- * Cryptographic Operations (secp256k1)
3
- * Lazy-loaded for performance
2
+ * @fileoverview Cryptographic Operations using secp256k1.
3
+ *
4
+ * Provides signing, verification, and capability token operations using
5
+ * the secp256k1 elliptic curve (same curve used by Bitcoin and Nostr).
6
+ * Uses lazy loading for the crypto module to improve startup performance.
7
+ *
8
+ * @module crypto/secp256k1
4
9
  */
5
10
 
6
11
  import { sha256 } from '@noble/hashes/sha256';
@@ -1,12 +1,15 @@
1
1
  /**
2
2
  * Federation Handshake Protocol
3
3
  *
4
- * Uses NIP-04 encrypted DMs (kind 4) for bidirectional federation request/response.
4
+ * Uses NIP-44 encrypted DMs (kind 4) for bidirectional federation request/response.
5
+ * Falls back to NIP-04 for backward compatibility when receiving messages.
5
6
  * When user A federates with user B's pubkey, a DM is sent to B.
6
7
  * B can accept/reject, creating a matching federation on their side.
7
8
  */
8
9
 
9
10
  import {
11
+ encryptNIP44,
12
+ decryptNIP44,
10
13
  encryptNIP04,
11
14
  decryptNIP04,
12
15
  createDMEvent,
@@ -140,7 +143,7 @@ export function createFederationResponse({
140
143
  export async function sendFederationRequest(client, privateKey, recipientPubKey, request) {
141
144
  try {
142
145
  const content = JSON.stringify(request);
143
- const encrypted = await encryptNIP04(privateKey, recipientPubKey, content);
146
+ const encrypted = encryptNIP44(privateKey, recipientPubKey, content);
144
147
  const event = createDMEvent(recipientPubKey, encrypted, privateKey);
145
148
 
146
149
  if (client?.publish) {
@@ -168,7 +171,7 @@ export async function sendFederationRequest(client, privateKey, recipientPubKey,
168
171
  export async function sendFederationResponse(client, privateKey, recipientPubKey, response) {
169
172
  try {
170
173
  const content = JSON.stringify(response);
171
- const encrypted = await encryptNIP04(privateKey, recipientPubKey, content);
174
+ const encrypted = encryptNIP44(privateKey, recipientPubKey, content);
172
175
  const event = createDMEvent(recipientPubKey, encrypted, privateKey);
173
176
 
174
177
  if (client?.publish) {
@@ -218,7 +221,16 @@ export function subscribeToFederationDMs(client, privateKey, publicKey, handlers
218
221
  if (!pTag || pTag[1] !== publicKey) return;
219
222
 
220
223
  try {
221
- const decrypted = await decryptNIP04(privateKey, event.pubkey, event.content);
224
+ let decrypted;
225
+
226
+ // Try NIP-44 first (modern encryption)
227
+ try {
228
+ decrypted = decryptNIP44(privateKey, event.pubkey, event.content);
229
+ } catch (nip44Error) {
230
+ // Fall back to NIP-04 for backward compatibility with older clients
231
+ decrypted = await decryptNIP04(privateKey, event.pubkey, event.content);
232
+ }
233
+
222
234
  const payload = JSON.parse(decrypted);
223
235
 
224
236
  if (payload.type === 'federation_request' && payload.version === '1.0') {
@@ -288,7 +300,7 @@ export function subscribeToFederationDMs(client, privateKey, publicKey, handlers
288
300
  * @param {string} params.holonName - Current holon name
289
301
  * @param {Object} [params.lensConfig] - Lens configuration
290
302
  * @param {string} [params.message] - Optional message
291
- * @returns {Promise<{ success: boolean, requestId?: string, error?: string }>}
303
+ * @returns {Promise<Object>} Result with success, requestId (if successful), error (if failed)
292
304
  */
293
305
  export async function initiateFederationHandshake(holosphere, privateKey, params) {
294
306
  const {
@@ -347,7 +359,7 @@ export async function initiateFederationHandshake(holosphere, privateKey, params
347
359
  * @param {string} params.holonName - Current holon name
348
360
  * @param {Object} [params.lensConfig] - Our lens configuration
349
361
  * @param {string} [params.message] - Optional message
350
- * @returns {Promise<{ success: boolean, error?: string }>}
362
+ * @returns {Promise<Object>} Result with success and optional error
351
363
  */
352
364
  export async function acceptFederationRequest(holosphere, privateKey, params) {
353
365
  const {
@@ -420,7 +432,7 @@ export async function acceptFederationRequest(holosphere, privateKey, params) {
420
432
  * @param {string} params.requestId - Original request ID
421
433
  * @param {string} params.senderPubKey - Original sender's public key
422
434
  * @param {string} [params.message] - Optional rejection message
423
- * @returns {Promise<{ success: boolean, error?: string }>}
435
+ * @returns {Promise<Object>} Result with success and optional error
424
436
  */
425
437
  export async function rejectFederationRequest(holosphere, privateKey, params) {
426
438
  const { requestId, senderPubKey, message } = params;
@@ -446,8 +458,8 @@ export async function rejectFederationRequest(holosphere, privateKey, params) {
446
458
 
447
459
  /**
448
460
  * Check if payload is a federation request
449
- * @param {any} payload
450
- * @returns {payload is FederationRequestPayload}
461
+ * @param {*} payload - Payload to check
462
+ * @returns {boolean} True if payload is a FederationRequestPayload
451
463
  */
452
464
  export function isFederationRequest(payload) {
453
465
  return payload?.type === 'federation_request' && payload?.version === '1.0';
@@ -455,8 +467,8 @@ export function isFederationRequest(payload) {
455
467
 
456
468
  /**
457
469
  * Check if payload is a federation response
458
- * @param {any} payload
459
- * @returns {payload is FederationResponsePayload}
470
+ * @param {*} payload - Payload to check
471
+ * @returns {boolean} True if payload is a FederationResponsePayload
460
472
  */
461
473
  export function isFederationResponse(payload) {
462
474
  return payload?.type === 'federation_response' && payload?.version === '1.0';
@@ -1,11 +1,19 @@
1
1
  /**
2
- * Federation and Hologram (reference) Management
2
+ * @fileoverview Federation and Hologram (Reference) Management.
3
+ *
4
+ * Provides hologram (lightweight reference) creation, resolution, and management.
5
+ * Holograms enable data to appear in multiple holons while maintaining a single
6
+ * source of truth. Supports circular reference detection and cross-holosphere
7
+ * federation with capability-based access control.
8
+ *
9
+ * @module federation/hologram
3
10
  */
4
11
 
5
12
  import { buildPath, write, read, update } from '../storage/unified-storage.js';
6
13
  import { verifyCapability } from '../crypto/secp256k1.js';
7
14
  import { getCapabilityForAuthor } from './registry.js';
8
15
 
16
+ /** @constant {number} Maximum depth for hologram resolution chain */
9
17
  const MAX_RESOLUTION_DEPTH = 10;
10
18
 
11
19
  /**
@@ -1,6 +1,7 @@
1
1
  /**
2
- * Hierarchical Aggregation (Upcast Operations)
3
- * FR-025 to FR-027
2
+ * @fileoverview Hierarchical aggregation (upcast) operations for propagating data to parent holons.
3
+ * Implements upcast operations (FR-025 to FR-027) for H3-based geographic hierarchies.
4
+ * @module hierarchical/upcast
4
5
  */
5
6
 
6
7
  import { getParents, isValidH3 } from '../spatial/h3-operations.js';
@@ -8,15 +9,17 @@ import { createHologram } from '../federation/hologram.js';
8
9
  import { write } from '../storage/unified-storage.js';
9
10
 
10
11
  /**
11
- * Upcast data to parent holons in hierarchy
12
+ * Upcast data to parent holons in the H3 hierarchy.
13
+ * Creates holograms in parent holons referencing the source data.
12
14
  * @param {Object} hs - HoloSphere instance
13
- * @param {string} holonId - Source holon ID (must be H3)
14
- * @param {string} lensName - Lens name
15
- * @param {string} dataId - Data ID
16
- * @param {Object} options - Upcast options
17
- * @param {number} options.maxLevel - Maximum levels to propagate (default: 3)
18
- * @param {string} options.operation - 'summarize', 'aggregate', or 'concatenate'
19
- * @returns {Promise<boolean>} Success indicator
15
+ * @param {string} holonId - Source holon ID (must be valid H3 index)
16
+ * @param {string} lensName - Lens name for the data
17
+ * @param {string} dataId - Data identifier to upcast
18
+ * @param {Object} [options={}] - Upcast configuration options
19
+ * @param {number} [options.maxLevel=3] - Maximum levels to propagate upward
20
+ * @param {string} [options.operation='concatenate'] - Aggregation operation: 'summarize', 'aggregate', or 'concatenate'
21
+ * @returns {Promise<boolean>} True if upcast succeeded
22
+ * @throws {Error} If holonId is not a valid H3 index
20
23
  */
21
24
  export async function upcast(hs, holonId, lensName, dataId, options = {}) {
22
25
  const { maxLevel = 3, operation = 'concatenate' } = options;
@@ -46,8 +49,16 @@ export async function upcast(hs, holonId, lensName, dataId, options = {}) {
46
49
  }
47
50
 
48
51
  /**
49
- * Propagate data to parent holon
52
+ * Propagate data to a parent holon by creating a hologram reference.
50
53
  * @private
54
+ * @param {Object} client - Nostr client instance
55
+ * @param {string} appname - Application name
56
+ * @param {string} sourceHolon - Source holon ID
57
+ * @param {string} parentHolon - Parent holon ID to propagate to
58
+ * @param {string} lensName - Lens name
59
+ * @param {string} dataId - Data identifier
60
+ * @param {string} operation - Aggregation operation type
61
+ * @returns {Promise<Object>} Write operation result
51
62
  */
52
63
  async function propagateToParent(
53
64
  client,
@@ -71,9 +82,10 @@ async function propagateToParent(
71
82
  }
72
83
 
73
84
  /**
74
- * Summarize operation (count aggregation)
75
- * @param {Object[]} items - Data items
76
- * @returns {Object} Summary object
85
+ * Summarize operation for count-based aggregation.
86
+ * Returns a summary object with the count of items.
87
+ * @param {Object[]} items - Array of data items to summarize
88
+ * @returns {Object} Summary object with operation type, count, and summary flag
77
89
  */
78
90
  export function summarize(items) {
79
91
  return {
@@ -84,9 +96,10 @@ export function summarize(items) {
84
96
  }
85
97
 
86
98
  /**
87
- * Aggregate operation (merge objects)
88
- * @param {Object[]} items - Data items
89
- * @returns {Object} Aggregated object
99
+ * Aggregate operation for merging objects.
100
+ * Combines all items into a single object using Object.assign.
101
+ * @param {Object[]} items - Array of objects to merge
102
+ * @returns {Object} Aggregated object with all properties merged
90
103
  */
91
104
  export function aggregate(items) {
92
105
  const result = { operation: 'aggregate' };
@@ -99,9 +112,10 @@ export function aggregate(items) {
99
112
  }
100
113
 
101
114
  /**
102
- * Concatenate operation (array merge)
103
- * @param {Array[]} items - Array items
104
- * @returns {Array} Concatenated array
115
+ * Concatenate operation for flattening nested arrays.
116
+ * Flattens all input arrays into a single array.
117
+ * @param {Array[]} items - Array of arrays to concatenate
118
+ * @returns {Object} Object with operation type and flattened items array
105
119
  */
106
120
  export function concatenate(items) {
107
121
  return {