holosphere 2.0.0-alpha1 → 2.0.0-alpha11

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 (416) hide show
  1. package/CHANGELOG.md +473 -0
  2. package/FEATURES.md +431 -0
  3. package/LICENSE +29 -166
  4. package/LICENSE-AGPL.md +180 -0
  5. package/README.md +97 -16
  6. package/dist/2019-D2OG2idw.js +6680 -0
  7. package/dist/2019-D2OG2idw.js.map +1 -0
  8. package/dist/2019-EION3wKo.cjs +8 -0
  9. package/dist/2019-EION3wKo.cjs.map +1 -0
  10. package/dist/_commonjsHelpers-C37NGDzP.cjs +2 -0
  11. package/dist/_commonjsHelpers-C37NGDzP.cjs.map +1 -0
  12. package/dist/_commonjsHelpers-CUmg6egw.js +7 -0
  13. package/dist/_commonjsHelpers-CUmg6egw.js.map +1 -0
  14. package/dist/browser-BSniCNqO.js +3058 -0
  15. package/dist/browser-BSniCNqO.js.map +1 -0
  16. package/dist/browser-Cq59Ij19.cjs +2 -0
  17. package/dist/browser-Cq59Ij19.cjs.map +1 -0
  18. package/dist/cjs/holosphere.cjs +2 -0
  19. package/dist/cjs/holosphere.cjs.map +1 -0
  20. package/dist/esm/holosphere.js +53 -0
  21. package/dist/esm/holosphere.js.map +1 -0
  22. package/dist/index-Bl6rM1NW.js +15104 -0
  23. package/dist/index-Bl6rM1NW.js.map +1 -0
  24. package/dist/index-Bwg3OzRM.cjs +12 -0
  25. package/dist/index-Bwg3OzRM.cjs.map +1 -0
  26. package/dist/index-D-jZhliX.js +40274 -0
  27. package/dist/index-D-jZhliX.js.map +1 -0
  28. package/dist/index-Dc6Z8Aob.cjs +18 -0
  29. package/dist/index-Dc6Z8Aob.cjs.map +1 -0
  30. package/dist/indexeddb-storage-5eiUNsHC.js +176 -0
  31. package/dist/indexeddb-storage-5eiUNsHC.js.map +1 -0
  32. package/dist/indexeddb-storage-FNFUVvTJ.cjs +2 -0
  33. package/dist/indexeddb-storage-FNFUVvTJ.cjs.map +1 -0
  34. package/dist/memory-storage-CI-gfmuG.js +91 -0
  35. package/dist/memory-storage-CI-gfmuG.js.map +1 -0
  36. package/dist/memory-storage-DMt36uZO.cjs +2 -0
  37. package/dist/memory-storage-DMt36uZO.cjs.map +1 -0
  38. package/dist/secp256k1-CEwJNcfV.js +1890 -0
  39. package/dist/secp256k1-CEwJNcfV.js.map +1 -0
  40. package/dist/secp256k1-CiEONUnj.cjs +12 -0
  41. package/dist/secp256k1-CiEONUnj.cjs.map +1 -0
  42. package/docs/CONTRACTS.md +797 -0
  43. package/docs/FOSDEM_PROPOSAL.md +388 -0
  44. package/docs/LOCALFIRST.md +266 -0
  45. package/docs/api/ai_aggregation.js.html +333 -0
  46. package/docs/api/ai_breakdown.js.html +524 -0
  47. package/docs/api/ai_classifier.js.html +231 -0
  48. package/docs/api/ai_council.js.html +246 -0
  49. package/docs/api/ai_embeddings.js.html +304 -0
  50. package/docs/api/ai_federation-ai.js.html +338 -0
  51. package/docs/api/ai_h3-ai.js.html +970 -0
  52. package/docs/api/ai_index.js.html +124 -0
  53. package/docs/api/ai_json-ops.js.html +241 -0
  54. package/docs/api/ai_llm-service.js.html +239 -0
  55. package/docs/api/ai_nl-query.js.html +236 -0
  56. package/docs/api/ai_relationships.js.html +367 -0
  57. package/docs/api/ai_schema-extractor.js.html +235 -0
  58. package/docs/api/ai_spatial.js.html +307 -0
  59. package/docs/api/ai_tts.js.html +214 -0
  60. package/docs/api/content_social-protocols.js.html +180 -0
  61. package/docs/api/core_holosphere.js.html +757 -0
  62. package/docs/api/crypto_nostr-utils.js.html +306 -0
  63. package/docs/api/crypto_secp256k1.js.html +267 -0
  64. package/docs/api/data/search.json +1 -0
  65. package/docs/api/federation_discovery.js.html +337 -0
  66. package/docs/api/federation_handshake.js.html +478 -0
  67. package/docs/api/federation_hologram.js.html +1053 -0
  68. package/docs/api/federation_registry.js.html +389 -0
  69. package/docs/api/fonts/Inconsolata-Regular.ttf +0 -0
  70. package/docs/api/fonts/OpenSans-Regular.ttf +0 -0
  71. package/docs/api/fonts/WorkSans-Bold.ttf +0 -0
  72. package/docs/api/global.html +3 -0
  73. package/docs/api/hierarchical_upcast.js.html +128 -0
  74. package/docs/api/index.html +265 -0
  75. package/docs/api/index.js.html +1868 -0
  76. package/docs/api/lib_ai-methods.js.html +660 -0
  77. package/docs/api/lib_contract-methods.js.html +445 -0
  78. package/docs/api/lib_errors.js.html +56 -0
  79. package/docs/api/lib_federation-methods.js.html +348 -0
  80. package/docs/api/lib_index.js.html +33 -0
  81. package/docs/api/module-ai.html +5 -0
  82. package/docs/api/module-ai_aggregation-SmartAggregation.html +6 -0
  83. package/docs/api/module-ai_aggregation.SmartAggregation.html +3 -0
  84. package/docs/api/module-ai_aggregation.html +3 -0
  85. package/docs/api/module-ai_breakdown-TaskBreakdown.html +5 -0
  86. package/docs/api/module-ai_breakdown.TaskBreakdown.html +3 -0
  87. package/docs/api/module-ai_breakdown.html +3 -0
  88. package/docs/api/module-ai_classifier-Classifier.html +6 -0
  89. package/docs/api/module-ai_classifier.Classifier.html +3 -0
  90. package/docs/api/module-ai_classifier.html +3 -0
  91. package/docs/api/module-ai_council-Council.html +6 -0
  92. package/docs/api/module-ai_council.Council.html +3 -0
  93. package/docs/api/module-ai_council.html +3 -0
  94. package/docs/api/module-ai_embeddings-Embeddings.html +5 -0
  95. package/docs/api/module-ai_embeddings.Embeddings.html +3 -0
  96. package/docs/api/module-ai_embeddings.html +3 -0
  97. package/docs/api/module-ai_federation-ai-FederationAdvisor.html +6 -0
  98. package/docs/api/module-ai_federation-ai.FederationAdvisor.html +3 -0
  99. package/docs/api/module-ai_federation-ai.html +3 -0
  100. package/docs/api/module-ai_h3-ai-H3AI.html +6 -0
  101. package/docs/api/module-ai_h3-ai.H3AI.html +3 -0
  102. package/docs/api/module-ai_h3-ai.html +3 -0
  103. package/docs/api/module-ai_json-ops-JSONOps.html +5 -0
  104. package/docs/api/module-ai_json-ops.JSONOps.html +3 -0
  105. package/docs/api/module-ai_json-ops.html +3 -0
  106. package/docs/api/module-ai_llm-service-LLMService.html +5 -0
  107. package/docs/api/module-ai_llm-service.LLMService.html +3 -0
  108. package/docs/api/module-ai_llm-service.html +3 -0
  109. package/docs/api/module-ai_nl-query-NLQuery.html +5 -0
  110. package/docs/api/module-ai_nl-query.NLQuery.html +3 -0
  111. package/docs/api/module-ai_nl-query.html +3 -0
  112. package/docs/api/module-ai_relationships-RelationshipDiscovery.html +6 -0
  113. package/docs/api/module-ai_relationships.RelationshipDiscovery.html +3 -0
  114. package/docs/api/module-ai_relationships.html +3 -0
  115. package/docs/api/module-ai_schema-extractor-SchemaExtractor.html +5 -0
  116. package/docs/api/module-ai_schema-extractor.SchemaExtractor.html +3 -0
  117. package/docs/api/module-ai_schema-extractor.html +3 -0
  118. package/docs/api/module-ai_spatial-SpatialAnalysis.html +6 -0
  119. package/docs/api/module-ai_spatial.SpatialAnalysis.html +3 -0
  120. package/docs/api/module-ai_spatial.html +3 -0
  121. package/docs/api/module-ai_tts-TTS.html +5 -0
  122. package/docs/api/module-ai_tts.TTS.html +3 -0
  123. package/docs/api/module-ai_tts.html +3 -0
  124. package/docs/api/module-content_social-protocols.html +3 -0
  125. package/docs/api/module-core_holosphere-HoloSphere.html +6 -0
  126. package/docs/api/module-core_holosphere.HoloSphere.html +3 -0
  127. package/docs/api/module-core_holosphere.html +3 -0
  128. package/docs/api/module-crypto_nostr-utils.html +3 -0
  129. package/docs/api/module-crypto_secp256k1.html +3 -0
  130. package/docs/api/module-federation_hologram.html +3 -0
  131. package/docs/api/module-hierarchical_upcast.html +3 -0
  132. package/docs/api/module-holosphere-HoloSphereBase.html +3 -0
  133. package/docs/api/module-holosphere.html +3 -0
  134. package/docs/api/module-lib_ai-methods.html +3 -0
  135. package/docs/api/module-lib_contract-methods.html +3 -0
  136. package/docs/api/module-lib_errors-AuthorizationError.html +3 -0
  137. package/docs/api/module-lib_errors-ValidationError.html +3 -0
  138. package/docs/api/module-lib_errors.AuthorizationError.html +3 -0
  139. package/docs/api/module-lib_errors.ValidationError.html +3 -0
  140. package/docs/api/module-lib_errors.html +3 -0
  141. package/docs/api/module-lib_federation-methods.html +3 -0
  142. package/docs/api/module-lib_index.html +3 -0
  143. package/docs/api/module-schema_validator-ValidationError.html +3 -0
  144. package/docs/api/module-schema_validator.ValidationError.html +3 -0
  145. package/docs/api/module-schema_validator.html +3 -0
  146. package/docs/api/module-spatial_h3-operations.html +4 -0
  147. package/docs/api/module-storage_backend-factory.BackendFactory.html +3 -0
  148. package/docs/api/module-storage_backend-factory.html +3 -0
  149. package/docs/api/module-storage_backend-interface-StorageBackend.html +3 -0
  150. package/docs/api/module-storage_backend-interface.StorageBackend.html +3 -0
  151. package/docs/api/module-storage_backend-interface.html +3 -0
  152. package/docs/api/module-storage_backends_activitypub-backend-ActivityPubBackend.html +7 -0
  153. package/docs/api/module-storage_backends_activitypub-backend.ActivityPubBackend.html +3 -0
  154. package/docs/api/module-storage_backends_activitypub-backend.html +3 -0
  155. package/docs/api/module-storage_backends_activitypub_server-ActivityPubServer.html +8 -0
  156. package/docs/api/module-storage_backends_activitypub_server.ActivityPubServer.html +3 -0
  157. package/docs/api/module-storage_backends_activitypub_server.html +3 -0
  158. package/docs/api/module-storage_backends_gundb-backend-GunDBBackend.html +7 -0
  159. package/docs/api/module-storage_backends_gundb-backend.GunDBBackend.html +3 -0
  160. package/docs/api/module-storage_backends_gundb-backend.html +3 -0
  161. package/docs/api/module-storage_backends_nostr-backend-NostrBackend.html +8 -0
  162. package/docs/api/module-storage_backends_nostr-backend.NostrBackend.html +3 -0
  163. package/docs/api/module-storage_backends_nostr-backend.html +3 -0
  164. package/docs/api/module-storage_filesystem-storage-FileSystemStorage.html +5 -0
  165. package/docs/api/module-storage_filesystem-storage-browser-FileSystemStorage.html +3 -0
  166. package/docs/api/module-storage_filesystem-storage-browser.FileSystemStorage.html +3 -0
  167. package/docs/api/module-storage_filesystem-storage-browser.html +3 -0
  168. package/docs/api/module-storage_filesystem-storage.FileSystemStorage.html +3 -0
  169. package/docs/api/module-storage_filesystem-storage.html +3 -0
  170. package/docs/api/module-storage_global-tables.html +3 -0
  171. package/docs/api/module-storage_gun-async.html +3 -0
  172. package/docs/api/module-storage_gun-auth-GunAuth.html +5 -0
  173. package/docs/api/module-storage_gun-auth.GunAuth.html +3 -0
  174. package/docs/api/module-storage_gun-auth.html +3 -0
  175. package/docs/api/module-storage_gun-federation.html +3 -0
  176. package/docs/api/module-storage_gun-references-GunReferenceHandler.html +5 -0
  177. package/docs/api/module-storage_gun-references.GunReferenceHandler.html +3 -0
  178. package/docs/api/module-storage_gun-references.html +3 -0
  179. package/docs/api/module-storage_gun-schema-GunSchemaValidator.html +5 -0
  180. package/docs/api/module-storage_gun-schema.GunSchemaValidator.html +3 -0
  181. package/docs/api/module-storage_gun-schema.html +3 -0
  182. package/docs/api/module-storage_gun-wrapper.html +11 -0
  183. package/docs/api/module-storage_indexeddb-storage-IndexedDBStorage.html +5 -0
  184. package/docs/api/module-storage_indexeddb-storage.IndexedDBStorage.html +3 -0
  185. package/docs/api/module-storage_indexeddb-storage.html +3 -0
  186. package/docs/api/module-storage_key-storage-simple.html +3 -0
  187. package/docs/api/module-storage_key-storage.html +4 -0
  188. package/docs/api/module-storage_memory-storage-MemoryStorage.html +5 -0
  189. package/docs/api/module-storage_memory-storage.MemoryStorage.html +3 -0
  190. package/docs/api/module-storage_memory-storage.html +3 -0
  191. package/docs/api/module-storage_migration-MigrationTool.html +6 -0
  192. package/docs/api/module-storage_migration.MigrationTool.html +3 -0
  193. package/docs/api/module-storage_migration.html +3 -0
  194. package/docs/api/module-storage_nostr-async.html +18 -0
  195. package/docs/api/module-storage_nostr-client-LRUCache.html +3 -0
  196. package/docs/api/module-storage_nostr-client-NostrClient.html +7 -0
  197. package/docs/api/module-storage_nostr-client.NostrClient.html +15 -0
  198. package/docs/api/module-storage_nostr-client.html +6 -0
  199. package/docs/api/module-storage_nostr-wrapper.html +3 -0
  200. package/docs/api/module-storage_outbox-queue-OutboxQueue.html +4 -0
  201. package/docs/api/module-storage_outbox-queue.OutboxQueue.html +3 -0
  202. package/docs/api/module-storage_outbox-queue.html +3 -0
  203. package/docs/api/module-storage_persistent-storage-PersistentStorage.html +3 -0
  204. package/docs/api/module-storage_persistent-storage.html +4 -0
  205. package/docs/api/module-storage_sync-service-SyncService.html +5 -0
  206. package/docs/api/module-storage_sync-service.SyncService.html +3 -0
  207. package/docs/api/module-storage_sync-service.html +3 -0
  208. package/docs/api/module-storage_unified-storage.html +3 -0
  209. package/docs/api/module-subscriptions_manager.SubscriptionRegistry.html +3 -0
  210. package/docs/api/module-subscriptions_manager.html +3 -0
  211. package/docs/api/schema_validator.js.html +113 -0
  212. package/docs/api/scripts/core.js +726 -0
  213. package/docs/api/scripts/core.min.js +23 -0
  214. package/docs/api/scripts/resize.js +90 -0
  215. package/docs/api/scripts/search.js +265 -0
  216. package/docs/api/scripts/search.min.js +6 -0
  217. package/docs/api/scripts/third-party/Apache-License-2.0.txt +202 -0
  218. package/docs/api/scripts/third-party/fuse.js +9 -0
  219. package/docs/api/scripts/third-party/hljs-line-num-original.js +369 -0
  220. package/docs/api/scripts/third-party/hljs-line-num.js +1 -0
  221. package/docs/api/scripts/third-party/hljs-original.js +5171 -0
  222. package/docs/api/scripts/third-party/hljs.js +1 -0
  223. package/docs/api/scripts/third-party/popper.js +5 -0
  224. package/docs/api/scripts/third-party/tippy.js +1 -0
  225. package/docs/api/scripts/third-party/tocbot.js +672 -0
  226. package/docs/api/scripts/third-party/tocbot.min.js +1 -0
  227. package/docs/api/spatial_h3-operations.js.html +129 -0
  228. package/docs/api/storage_backend-factory.js.html +133 -0
  229. package/docs/api/storage_backend-interface.js.html +164 -0
  230. package/docs/api/storage_backends_activitypub-backend.js.html +298 -0
  231. package/docs/api/storage_backends_activitypub_server.js.html +678 -0
  232. package/docs/api/storage_backends_gundb-backend.js.html +878 -0
  233. package/docs/api/storage_backends_nostr-backend.js.html +254 -0
  234. package/docs/api/storage_filesystem-storage-browser.js.html +83 -0
  235. package/docs/api/storage_filesystem-storage.js.html +207 -0
  236. package/docs/api/storage_global-tables.js.html +116 -0
  237. package/docs/api/storage_gun-async.js.html +344 -0
  238. package/docs/api/storage_gun-auth.js.html +376 -0
  239. package/docs/api/storage_gun-federation.js.html +788 -0
  240. package/docs/api/storage_gun-references.js.html +212 -0
  241. package/docs/api/storage_gun-schema.js.html +309 -0
  242. package/docs/api/storage_gun-wrapper.js.html +645 -0
  243. package/docs/api/storage_indexeddb-storage.js.html +224 -0
  244. package/docs/api/storage_key-storage-simple.js.html +102 -0
  245. package/docs/api/storage_key-storage.js.html +171 -0
  246. package/docs/api/storage_memory-storage.js.html +128 -0
  247. package/docs/api/storage_migration.js.html +354 -0
  248. package/docs/api/storage_nostr-async.js.html +1076 -0
  249. package/docs/api/storage_nostr-client.js.html +1598 -0
  250. package/docs/api/storage_nostr-wrapper.js.html +218 -0
  251. package/docs/api/storage_outbox-queue.js.html +248 -0
  252. package/docs/api/storage_persistent-storage.js.html +160 -0
  253. package/docs/api/storage_sync-service.js.html +201 -0
  254. package/docs/api/storage_unified-storage.js.html +157 -0
  255. package/docs/api/styles/clean-jsdoc-theme-base.css +1159 -0
  256. package/docs/api/styles/clean-jsdoc-theme-dark.css +412 -0
  257. package/docs/api/styles/clean-jsdoc-theme-light.css +482 -0
  258. package/docs/api/styles/clean-jsdoc-theme-scrollbar.css +30 -0
  259. package/docs/api/styles/clean-jsdoc-theme-without-scrollbar.min.css +1 -0
  260. package/docs/api/styles/clean-jsdoc-theme.min.css +1 -0
  261. package/docs/api/subscriptions_manager.js.html +162 -0
  262. package/docs/contracts/api-interface.md +793 -0
  263. package/docs/data-model.md +476 -0
  264. package/docs/gun-async-usage.md +338 -0
  265. package/docs/plan.md +349 -0
  266. package/docs/quickstart.md +674 -0
  267. package/docs/research.md +362 -0
  268. package/docs/spec.md +244 -0
  269. package/docs/storage-backends.md +326 -0
  270. package/docs/tasks.md +947 -0
  271. package/examples/demo.html +47 -0
  272. package/examples/holosphere-widget.js +1242 -0
  273. package/examples/widget-demo.html +274 -0
  274. package/examples/widget.html +703 -0
  275. package/jsdoc.json +26 -0
  276. package/package.json +25 -7
  277. package/src/ai/aggregation.js +13 -2
  278. package/src/ai/breakdown.js +12 -2
  279. package/src/ai/classifier.js +14 -3
  280. package/src/ai/council.js +22 -7
  281. package/src/ai/embeddings.js +37 -15
  282. package/src/ai/federation-ai.js +13 -2
  283. package/src/ai/h3-ai.js +14 -2
  284. package/src/ai/index.js +16 -7
  285. package/src/ai/json-ops.js +18 -5
  286. package/src/ai/llm-service.js +62 -31
  287. package/src/ai/nl-query.js +12 -2
  288. package/src/ai/relationships.js +13 -2
  289. package/src/ai/schema-extractor.js +24 -10
  290. package/src/ai/spatial.js +13 -2
  291. package/src/ai/tts.js +25 -8
  292. package/src/cdn-entry.js +22 -0
  293. package/src/content/social-protocols.js +34 -25
  294. package/src/contracts/abis/Appreciative.json +1280 -0
  295. package/src/contracts/abis/AppreciativeFactory.json +101 -0
  296. package/src/contracts/abis/Bundle.json +1438 -0
  297. package/src/contracts/abis/BundleFactory.json +106 -0
  298. package/src/contracts/abis/Holon.json +881 -0
  299. package/src/contracts/abis/Holons.json +330 -0
  300. package/src/contracts/abis/Managed.json +1262 -0
  301. package/src/contracts/abis/ManagedFactory.json +149 -0
  302. package/src/contracts/abis/Membrane.json +261 -0
  303. package/src/contracts/abis/Splitter.json +1624 -0
  304. package/src/contracts/abis/SplitterFactory.json +220 -0
  305. package/src/contracts/abis/TestToken.json +321 -0
  306. package/src/contracts/abis/Zoned.json +1461 -0
  307. package/src/contracts/abis/ZonedFactory.json +154 -0
  308. package/src/contracts/chain-manager.js +403 -0
  309. package/src/contracts/deployer.js +500 -0
  310. package/src/contracts/event-listener.js +539 -0
  311. package/src/contracts/holon-contracts.js +359 -0
  312. package/src/contracts/index.js +82 -0
  313. package/src/contracts/networks.js +229 -0
  314. package/src/contracts/operations.js +687 -0
  315. package/src/contracts/queries.js +638 -0
  316. package/src/core/holosphere.js +487 -6
  317. package/src/crypto/nostr-utils.js +303 -0
  318. package/src/crypto/secp256k1.js +7 -2
  319. package/src/federation/handshake.js +475 -0
  320. package/src/federation/hologram.js +117 -3
  321. package/src/hierarchical/upcast.js +40 -25
  322. package/src/index.js +1547 -1912
  323. package/src/lib/ai-methods.js +657 -0
  324. package/src/lib/contract-methods.js +442 -0
  325. package/src/lib/errors.js +53 -0
  326. package/src/lib/federation-methods.js +345 -0
  327. package/src/lib/index.js +30 -0
  328. package/src/schema/validator.js +22 -3
  329. package/src/spatial/h3-operations.js +19 -3
  330. package/src/storage/backend-factory.js +7 -2
  331. package/src/storage/backend-interface.js +21 -2
  332. package/src/storage/backends/activitypub/server.js +25 -3
  333. package/src/storage/backends/activitypub-backend.js +25 -2
  334. package/src/storage/backends/gundb-backend.js +692 -50
  335. package/src/storage/backends/nostr-backend.js +116 -1
  336. package/src/storage/filesystem-storage-browser.js +42 -2
  337. package/src/storage/filesystem-storage.js +72 -5
  338. package/src/storage/global-tables.js +35 -3
  339. package/src/storage/gun-async.js +75 -15
  340. package/src/storage/gun-auth.js +373 -0
  341. package/src/storage/gun-federation.js +785 -0
  342. package/src/storage/gun-references.js +209 -0
  343. package/src/storage/gun-schema.js +306 -0
  344. package/src/storage/gun-wrapper.js +475 -54
  345. package/src/storage/indexeddb-storage.js +112 -13
  346. package/src/storage/key-storage-simple.js +32 -9
  347. package/src/storage/key-storage.js +45 -13
  348. package/src/storage/memory-storage.js +68 -2
  349. package/src/storage/migration.js +20 -7
  350. package/src/storage/nostr-async.js +412 -122
  351. package/src/storage/nostr-client.js +749 -76
  352. package/src/storage/nostr-wrapper.js +6 -2
  353. package/src/storage/outbox-queue.js +55 -18
  354. package/src/storage/persistent-storage.js +62 -14
  355. package/src/storage/sync-service.js +51 -17
  356. package/src/storage/unified-storage.js +154 -0
  357. package/src/subscriptions/manager.js +34 -17
  358. package/types/index.d.ts +133 -0
  359. package/vite.config.cdn.js +60 -0
  360. package/tests/unit/ai/aggregation.test.js +0 -295
  361. package/tests/unit/ai/breakdown.test.js +0 -446
  362. package/tests/unit/ai/classifier.test.js +0 -294
  363. package/tests/unit/ai/council.test.js +0 -262
  364. package/tests/unit/ai/embeddings.test.js +0 -384
  365. package/tests/unit/ai/federation-ai.test.js +0 -344
  366. package/tests/unit/ai/h3-ai.test.js +0 -458
  367. package/tests/unit/ai/index.test.js +0 -304
  368. package/tests/unit/ai/json-ops.test.js +0 -307
  369. package/tests/unit/ai/llm-service.test.js +0 -390
  370. package/tests/unit/ai/nl-query.test.js +0 -383
  371. package/tests/unit/ai/relationships.test.js +0 -311
  372. package/tests/unit/ai/schema-extractor.test.js +0 -384
  373. package/tests/unit/ai/spatial.test.js +0 -279
  374. package/tests/unit/ai/tts.test.js +0 -279
  375. package/tests/unit/content.test.js +0 -332
  376. package/tests/unit/contract/core.test.js +0 -88
  377. package/tests/unit/contract/crypto.test.js +0 -198
  378. package/tests/unit/contract/data.test.js +0 -223
  379. package/tests/unit/contract/federation.test.js +0 -181
  380. package/tests/unit/contract/hierarchical.test.js +0 -113
  381. package/tests/unit/contract/schema.test.js +0 -114
  382. package/tests/unit/contract/social.test.js +0 -217
  383. package/tests/unit/contract/spatial.test.js +0 -110
  384. package/tests/unit/contract/subscriptions.test.js +0 -128
  385. package/tests/unit/contract/utils.test.js +0 -159
  386. package/tests/unit/core.test.js +0 -152
  387. package/tests/unit/crypto.test.js +0 -328
  388. package/tests/unit/federation.test.js +0 -234
  389. package/tests/unit/gun-async.test.js +0 -252
  390. package/tests/unit/hierarchical.test.js +0 -399
  391. package/tests/unit/integration/scenario-01-geographic-storage.test.js +0 -74
  392. package/tests/unit/integration/scenario-02-federation.test.js +0 -76
  393. package/tests/unit/integration/scenario-03-subscriptions.test.js +0 -102
  394. package/tests/unit/integration/scenario-04-validation.test.js +0 -129
  395. package/tests/unit/integration/scenario-05-hierarchy.test.js +0 -125
  396. package/tests/unit/integration/scenario-06-social.test.js +0 -135
  397. package/tests/unit/integration/scenario-07-persistence.test.js +0 -130
  398. package/tests/unit/integration/scenario-08-authorization.test.js +0 -161
  399. package/tests/unit/integration/scenario-09-cross-dimensional.test.js +0 -139
  400. package/tests/unit/integration/scenario-10-cross-holosphere-capabilities.test.js +0 -357
  401. package/tests/unit/integration/scenario-11-cross-holosphere-federation.test.js +0 -410
  402. package/tests/unit/integration/scenario-12-capability-federated-read.test.js +0 -719
  403. package/tests/unit/performance/benchmark.test.js +0 -85
  404. package/tests/unit/schema.test.js +0 -213
  405. package/tests/unit/spatial.test.js +0 -158
  406. package/tests/unit/storage.test.js +0 -195
  407. package/tests/unit/subscriptions.test.js +0 -328
  408. package/tests/unit/test-data-permanence-debug.js +0 -197
  409. package/tests/unit/test-data-permanence.js +0 -340
  410. package/tests/unit/test-key-persistence-fixed.js +0 -148
  411. package/tests/unit/test-key-persistence.js +0 -172
  412. package/tests/unit/test-relay-permanence.js +0 -376
  413. package/tests/unit/test-second-node.js +0 -95
  414. package/tests/unit/test-simple-write.js +0 -89
  415. /package/{cleanup-test-data.js → scripts/cleanup-test-data.js} +0 -0
  416. /package/{test-ai-real-api.js → scripts/test-ai-real-api.js} +0 -0
@@ -1,18 +1,52 @@
1
1
  /**
2
- * Nostr Storage Backend
2
+ * @fileoverview Nostr Storage Backend.
3
+ *
3
4
  * Wraps existing nostr-wrapper.js and nostr-client.js as a StorageBackend
5
+ * implementation. Provides Nostr-based distributed storage with relay support.
6
+ *
7
+ * @module storage/backends/nostr-backend
4
8
  */
5
9
 
6
10
  import { StorageBackend } from '../backend-interface.js';
7
11
  import { createClient } from '../nostr-client.js';
8
12
  import * as wrapper from '../nostr-wrapper.js';
9
13
 
14
+ /**
15
+ * Nostr storage backend implementation.
16
+ *
17
+ * Provides distributed storage using Nostr relays with event-based data storage.
18
+ *
19
+ * @class NostrBackend
20
+ * @extends StorageBackend
21
+ * @example
22
+ * const backend = new NostrBackend({
23
+ * relays: ['wss://relay.example.com'],
24
+ * appName: 'myapp',
25
+ * persistence: true
26
+ * });
27
+ * await backend.init();
28
+ */
10
29
  export class NostrBackend extends StorageBackend {
30
+ /**
31
+ * Create a new NostrBackend.
32
+ *
33
+ * @param {Object} config - Backend configuration
34
+ * @param {string[]} [config.relays] - Relay URLs
35
+ * @param {string} [config.privateKey] - Private key for signing
36
+ * @param {string} [config.appName] - Application name
37
+ * @param {boolean} [config.persistence=true] - Enable persistent storage
38
+ * @param {boolean} [config.backgroundSync] - Enable background sync
39
+ */
11
40
  constructor(config) {
12
41
  super(config);
13
42
  this.client = null;
14
43
  }
15
44
 
45
+ /**
46
+ * Initialize the backend.
47
+ *
48
+ * @returns {Promise<void>}
49
+ */
16
50
  async init() {
17
51
  this.client = createClient({
18
52
  relays: this.config.relays || ['wss://relay.holons.io'],
@@ -32,38 +66,102 @@ export class NostrBackend extends StorageBackend {
32
66
  this.publicKey = this.client.publicKey;
33
67
  }
34
68
 
69
+ /**
70
+ * Build path from components.
71
+ *
72
+ * @param {string} appName - Application name
73
+ * @param {string} holonId - Holon ID
74
+ * @param {string} lensName - Lens name
75
+ * @param {string} [key=null] - Optional key
76
+ * @returns {string} Built path
77
+ */
35
78
  buildPath(appName, holonId, lensName, key = null) {
36
79
  return wrapper.buildPath(appName, holonId, lensName, key);
37
80
  }
38
81
 
82
+ /**
83
+ * Write data to path.
84
+ *
85
+ * @param {string} path - Storage path
86
+ * @param {Object} data - Data to write
87
+ * @param {Object} [options={}] - Write options
88
+ * @returns {Promise<Object>} Write result
89
+ */
39
90
  async write(path, data, options = {}) {
40
91
  return wrapper.write(this.client, path, data);
41
92
  }
42
93
 
94
+ /**
95
+ * Read data from path.
96
+ *
97
+ * @param {string} path - Storage path
98
+ * @param {Object} [options={}] - Read options
99
+ * @returns {Promise<Object|null>} Data or null
100
+ */
43
101
  async read(path, options = {}) {
44
102
  return wrapper.read(this.client, path, options);
45
103
  }
46
104
 
105
+ /**
106
+ * Read all data under path.
107
+ *
108
+ * @param {string} path - Storage path prefix
109
+ * @param {Object} [options={}] - Read options
110
+ * @returns {Promise<Object[]>} Array of data objects
111
+ */
47
112
  async readAll(path, options = {}) {
48
113
  return wrapper.readAll(this.client, path, options);
49
114
  }
50
115
 
116
+ /**
117
+ * Update data at path.
118
+ *
119
+ * @param {string} path - Storage path
120
+ * @param {Object} updates - Fields to update
121
+ * @returns {Promise<Object>} Update result
122
+ */
51
123
  async update(path, updates) {
52
124
  return wrapper.update(this.client, path, updates);
53
125
  }
54
126
 
127
+ /**
128
+ * Delete data at path.
129
+ *
130
+ * @param {string} path - Storage path
131
+ * @returns {Promise<boolean>} Success indicator
132
+ */
55
133
  async delete(path) {
56
134
  return wrapper.deleteData(this.client, path);
57
135
  }
58
136
 
137
+ /**
138
+ * Delete all data under path.
139
+ *
140
+ * @param {string} path - Storage path prefix
141
+ * @returns {Promise<Object>} Deletion results
142
+ */
59
143
  async deleteAll(path) {
60
144
  return wrapper.deleteAll(this.client, path);
61
145
  }
62
146
 
147
+ /**
148
+ * Subscribe to changes at path.
149
+ *
150
+ * @param {string} path - Storage path
151
+ * @param {Function} callback - Callback function
152
+ * @param {Object} [options={}] - Subscribe options
153
+ * @returns {Promise<Object>} Subscription object with unsubscribe method
154
+ */
63
155
  async subscribe(path, callback, options = {}) {
64
156
  return wrapper.subscribe(this.client, path, callback, options);
65
157
  }
66
158
 
159
+ /**
160
+ * Export all data for this user.
161
+ *
162
+ * @param {string} [pathPrefix=''] - Optional path prefix filter
163
+ * @returns {Promise<Object[]>} Array of exported records
164
+ */
67
165
  async exportData(pathPrefix = '') {
68
166
  // Wait for client to be ready
69
167
  await this.client._initReady;
@@ -101,6 +199,13 @@ export class NostrBackend extends StorageBackend {
101
199
  .filter(record => !record.data._deleted); // Filter out deleted items
102
200
  }
103
201
 
202
+ /**
203
+ * Import data records.
204
+ *
205
+ * @param {Object[]} records - Array of records to import
206
+ * @param {Object} [options={}] - Import options
207
+ * @returns {Promise<Object>} Import results with success/failed counts
208
+ */
104
209
  async importData(records, options = {}) {
105
210
  const results = { success: 0, failed: 0, errors: [] };
106
211
 
@@ -117,12 +222,22 @@ export class NostrBackend extends StorageBackend {
117
222
  return results;
118
223
  }
119
224
 
225
+ /**
226
+ * Close the backend and cleanup resources.
227
+ *
228
+ * @returns {void}
229
+ */
120
230
  close() {
121
231
  if (this.client) {
122
232
  this.client.close();
123
233
  }
124
234
  }
125
235
 
236
+ /**
237
+ * Get backend status.
238
+ *
239
+ * @returns {Object} Status object with type, publicKey, relays, connected
240
+ */
126
241
  getStatus() {
127
242
  return {
128
243
  type: 'nostr',
@@ -1,40 +1,80 @@
1
1
  /**
2
- * Browser stub for FileSystemStorage
3
- * Throws an error if used in browser environment
2
+ * @fileoverview Browser stub for FileSystemStorage.
3
+ *
4
+ * This stub throws errors if FileSystemStorage is used in browser environments.
5
+ * Browsers should use IndexedDBStorage or MemoryStorage instead.
6
+ *
7
+ * @module storage/filesystem-storage-browser
4
8
  */
5
9
 
6
10
  import { PersistentStorage } from './persistent-storage.js';
7
11
 
12
+ /**
13
+ * Browser stub for FileSystemStorage.
14
+ *
15
+ * All methods throw errors indicating filesystem storage is unavailable in browsers.
16
+ *
17
+ * @class FileSystemStorage
18
+ * @extends PersistentStorage
19
+ * @throws {Error} Always throws - not available in browser environments
20
+ */
8
21
  export class FileSystemStorage extends PersistentStorage {
22
+ /**
23
+ * Constructor throws error in browser.
24
+ *
25
+ * @param {string} [baseDir=null] - Ignored in browser
26
+ * @throws {Error} Always throws - not available in browser
27
+ */
9
28
  constructor(baseDir = null) {
10
29
  super();
11
30
  throw new Error('FileSystemStorage is not available in browser environments. Use IndexedDBStorage or MemoryStorage instead.');
12
31
  }
13
32
 
33
+ /**
34
+ * @throws {Error} Always throws - not available in browser
35
+ */
14
36
  async init(namespace) {
15
37
  throw new Error('FileSystemStorage is not available in browser environments');
16
38
  }
17
39
 
40
+ /**
41
+ * @throws {Error} Always throws - not available in browser
42
+ */
18
43
  async put(key, event) {
19
44
  throw new Error('FileSystemStorage is not available in browser environments');
20
45
  }
21
46
 
47
+ /**
48
+ * @throws {Error} Always throws - not available in browser
49
+ */
22
50
  async get(key) {
23
51
  throw new Error('FileSystemStorage is not available in browser environments');
24
52
  }
25
53
 
54
+ /**
55
+ * @throws {Error} Always throws - not available in browser
56
+ */
26
57
  async getAll(prefix) {
27
58
  throw new Error('FileSystemStorage is not available in browser environments');
28
59
  }
29
60
 
61
+ /**
62
+ * @throws {Error} Always throws - not available in browser
63
+ */
30
64
  async delete(key) {
31
65
  throw new Error('FileSystemStorage is not available in browser environments');
32
66
  }
33
67
 
68
+ /**
69
+ * @throws {Error} Always throws - not available in browser
70
+ */
34
71
  async clear() {
35
72
  throw new Error('FileSystemStorage is not available in browser environments');
36
73
  }
37
74
 
75
+ /**
76
+ * @throws {Error} Always throws - not available in browser
77
+ */
38
78
  async close() {
39
79
  throw new Error('FileSystemStorage is not available in browser environments');
40
80
  }
@@ -1,7 +1,10 @@
1
1
  /**
2
- * File system storage adapter for Node.js
3
- * Stores events as JSON files in a directory structure
4
- * This module is only loaded in Node.js environments
2
+ * @fileoverview File system storage adapter for Node.js.
3
+ *
4
+ * Stores events as JSON files in a directory structure.
5
+ * This module is only loaded in Node.js environments.
6
+ *
7
+ * @module storage/filesystem-storage
5
8
  */
6
9
 
7
10
  // Guard against browser environments
@@ -14,7 +17,24 @@ import { promises as fs } from 'fs';
14
17
  import path from 'path';
15
18
  import os from 'os';
16
19
 
20
+ /**
21
+ * File system storage adapter for Node.js.
22
+ *
23
+ * Stores events as JSON files in a directory structure for persistent storage.
24
+ *
25
+ * @class FileSystemStorage
26
+ * @extends PersistentStorage
27
+ * @example
28
+ * const storage = new FileSystemStorage('/custom/path');
29
+ * await storage.init('myapp');
30
+ * await storage.put('key1', { id: 'event1', data: 'test' });
31
+ */
17
32
  export class FileSystemStorage extends PersistentStorage {
33
+ /**
34
+ * Create a new FileSystemStorage instance.
35
+ *
36
+ * @param {string} [baseDir=null] - Base directory for storage (defaults to ~/.holosphere)
37
+ */
18
38
  constructor(baseDir = null) {
19
39
  super();
20
40
  this.baseDir = baseDir || path.join(os.homedir(), '.holosphere');
@@ -22,6 +42,12 @@ export class FileSystemStorage extends PersistentStorage {
22
42
  this.storageDir = null;
23
43
  }
24
44
 
45
+ /**
46
+ * Initialize storage with namespace.
47
+ *
48
+ * @param {string} namespace - Storage namespace (app name)
49
+ * @returns {Promise<void>}
50
+ */
25
51
  async init(namespace) {
26
52
  this.namespace = namespace;
27
53
  this.storageDir = path.join(this.baseDir, namespace);
@@ -37,8 +63,11 @@ export class FileSystemStorage extends PersistentStorage {
37
63
  }
38
64
 
39
65
  /**
40
- * Convert key to safe filename
66
+ * Convert key to safe filename.
67
+ *
41
68
  * @private
69
+ * @param {string} key - Storage key
70
+ * @returns {string} Safe filename
42
71
  */
43
72
  _keyToFilename(key) {
44
73
  // Replace unsafe characters
@@ -46,19 +75,35 @@ export class FileSystemStorage extends PersistentStorage {
46
75
  }
47
76
 
48
77
  /**
49
- * Get full file path for key
78
+ * Get full file path for key.
79
+ *
50
80
  * @private
81
+ * @param {string} key - Storage key
82
+ * @returns {string} Full file path
51
83
  */
52
84
  _getFilePath(key) {
53
85
  return path.join(this.storageDir, this._keyToFilename(key));
54
86
  }
55
87
 
88
+ /**
89
+ * Store an event.
90
+ *
91
+ * @param {string} key - Storage key
92
+ * @param {Object} event - Event data to store
93
+ * @returns {Promise<void>}
94
+ */
56
95
  async put(key, event) {
57
96
  const filePath = this._getFilePath(key);
58
97
  const data = JSON.stringify(event, null, 2);
59
98
  await fs.writeFile(filePath, data, 'utf8');
60
99
  }
61
100
 
101
+ /**
102
+ * Retrieve an event.
103
+ *
104
+ * @param {string} key - Storage key
105
+ * @returns {Promise<Object|null>} Event data or null if not found
106
+ */
62
107
  async get(key) {
63
108
  const filePath = this._getFilePath(key);
64
109
  try {
@@ -72,6 +117,12 @@ export class FileSystemStorage extends PersistentStorage {
72
117
  }
73
118
  }
74
119
 
120
+ /**
121
+ * Retrieve all events matching a prefix.
122
+ *
123
+ * @param {string} prefix - Key prefix to match
124
+ * @returns {Promise<Object[]>} Array of matching events
125
+ */
75
126
  async getAll(prefix) {
76
127
  const results = [];
77
128
 
@@ -108,6 +159,12 @@ export class FileSystemStorage extends PersistentStorage {
108
159
  return results;
109
160
  }
110
161
 
162
+ /**
163
+ * Delete an event.
164
+ *
165
+ * @param {string} key - Storage key
166
+ * @returns {Promise<void>}
167
+ */
111
168
  async delete(key) {
112
169
  const filePath = this._getFilePath(key);
113
170
  try {
@@ -119,6 +176,11 @@ export class FileSystemStorage extends PersistentStorage {
119
176
  }
120
177
  }
121
178
 
179
+ /**
180
+ * Clear all stored events.
181
+ *
182
+ * @returns {Promise<void>}
183
+ */
122
184
  async clear() {
123
185
  try {
124
186
  const files = await fs.readdir(this.storageDir);
@@ -132,6 +194,11 @@ export class FileSystemStorage extends PersistentStorage {
132
194
  }
133
195
  }
134
196
 
197
+ /**
198
+ * Close storage (no-op for filesystem).
199
+ *
200
+ * @returns {Promise<void>}
201
+ */
135
202
  async close() {
136
203
  // Nothing to close for file system storage
137
204
  }
@@ -1,9 +1,14 @@
1
1
  /**
2
- * Global Data Operations
3
- * Non-location-specific storage (FR-044, FR-045)
2
+ * @fileoverview Global Data Operations.
3
+ *
4
+ * Provides non-location-specific (non-holon) data storage operations.
5
+ * Used for storing application-wide data like federation configs, schemas,
6
+ * and user preferences that aren't tied to specific H3 cells.
7
+ *
8
+ * @module storage/global-tables
4
9
  */
5
10
 
6
- import { write, read, readAll, update, deleteData, deleteAll } from './nostr-wrapper.js';
11
+ import { write, read, readAll, update, deleteData, deleteAll, subscribe } from './unified-storage.js';
7
12
 
8
13
  /**
9
14
  * Write data to global table
@@ -79,3 +84,30 @@ export async function deleteAllGlobal(client, appname, table) {
79
84
  const path = `${appname}/${table}`;
80
85
  return deleteAll(client, path);
81
86
  }
87
+
88
+ /**
89
+ * Get all data from global table
90
+ * @param {Object} client - Nostr client instance
91
+ * @param {string} appname - Application namespace
92
+ * @param {string} table - Global table name
93
+ * @returns {Promise<Object[]>} Array of data objects
94
+ */
95
+ export async function getAllGlobal(client, appname, table) {
96
+ const path = `${appname}/${table}`;
97
+ return readAll(client, path);
98
+ }
99
+
100
+ /**
101
+ * Subscribe to global table changes
102
+ * @param {Object} client - Nostr client instance
103
+ * @param {string} appname - Application namespace
104
+ * @param {string} table - Global table name
105
+ * @param {string} key - Data key (optional, if not provided subscribes to all)
106
+ * @param {Function} callback - Called on data changes
107
+ * @param {Object} options - Subscription options
108
+ * @returns {Promise<Object>} Subscription object with unsubscribe method
109
+ */
110
+ export async function subscribeGlobal(client, appname, table, key, callback, options = {}) {
111
+ const path = key ? `${appname}/${table}/${key}` : `${appname}/${table}`;
112
+ return subscribe(client, path, callback, options);
113
+ }
@@ -1,13 +1,18 @@
1
1
  /**
2
- * Gun Async Utilities
3
- * Provides Promise-based wrappers and async patterns for Gun operations
2
+ * @fileoverview Gun Async Utilities.
3
+ *
4
+ * Provides Promise-based wrappers and async patterns for Gun operations.
5
+ * Includes utilities for promises, batch operations, retries, streams, and async iteration.
6
+ *
7
+ * @module storage/gun-async
4
8
  */
5
9
 
6
10
  /**
7
- * Get data from Gun using native .then() support
11
+ * Get data from Gun using native .then() support.
12
+ *
8
13
  * @param {Object} gunChain - Gun chain reference
9
- * @param {number} timeout - Timeout in ms (default 1000ms)
10
- * @returns {Promise<any>} Promise resolving to data
14
+ * @param {number} [timeout=1000] - Timeout in ms
15
+ * @returns {Promise<any>} Promise resolving to data or null on timeout
11
16
  */
12
17
  export function gunPromise(gunChain, timeout = 1000) {
13
18
  return new Promise((resolve, reject) => {
@@ -31,11 +36,13 @@ export function gunPromise(gunChain, timeout = 1000) {
31
36
  }
32
37
 
33
38
  /**
34
- * Wait for Gun write acknowledgement
39
+ * Wait for Gun write acknowledgement.
40
+ *
35
41
  * @param {Object} gunChain - Gun chain reference
36
42
  * @param {any} data - Data to write
37
- * @param {number} timeout - Timeout in ms (default 1000ms)
38
- * @returns {Promise<Object>} Promise resolving to ack object
43
+ * @param {number} [timeout=1000] - Timeout in ms
44
+ * @returns {Promise<Object>} Promise resolving to ack object { ok, timeout? }
45
+ * @throws {Error} If write fails with error
39
46
  */
40
47
  export function gunPut(gunChain, data, timeout = 1000) {
41
48
  return new Promise((resolve, reject) => {
@@ -63,23 +70,76 @@ export function gunPut(gunChain, data, timeout = 1000) {
63
70
  }
64
71
 
65
72
  /**
66
- * Get all items from a Gun map
73
+ * Get all items from a Gun map.
74
+ *
75
+ * First gets count of items, then collects until count is reached.
76
+ *
67
77
  * @param {Object} gunChain - Gun chain reference
68
- * @param {number} timeout - Timeout in ms (default 300ms)
78
+ * @param {number} [timeout=5000] - Timeout in ms (fallback)
69
79
  * @returns {Promise<Object>} Promise resolving to map of items
70
80
  */
71
- export async function gunMap(gunChain, timeout = 300) {
81
+ export async function gunMap(gunChain, timeout = 5000) {
72
82
  return new Promise((resolve) => {
73
83
  const items = {};
84
+ let settled = false;
85
+ let expectedCount = 0;
86
+ let receivedCount = 0;
74
87
 
75
- gunChain.map().once((data, key) => {
76
- if (data && !key.startsWith('_')) {
77
- items[key] = data;
88
+ const tryResolve = () => {
89
+ if (settled) return;
90
+ if (expectedCount > 0 && receivedCount >= expectedCount) {
91
+ settled = true;
92
+ resolve(items);
93
+ }
94
+ };
95
+
96
+ // Step 1: Get parent to count expected items
97
+ gunChain.once((parentData) => {
98
+ if (settled) return;
99
+
100
+ if (!parentData) {
101
+ settled = true;
102
+ resolve({});
103
+ return;
104
+ }
105
+
106
+ const keys = Object.keys(parentData).filter(k => k !== '_');
107
+ if (keys.length === 0) {
108
+ settled = true;
109
+ resolve({});
110
+ return;
78
111
  }
112
+
113
+ // Pre-collect inline items (not Gun references)
114
+ for (const key of keys) {
115
+ const rawItem = parentData[key];
116
+ if (!rawItem) continue;
117
+
118
+ // Skip Gun references - will be fetched via map().once()
119
+ if (typeof rawItem === 'object' && rawItem['#']) continue;
120
+
121
+ items[key] = rawItem;
122
+ }
123
+
124
+ // Expected count is ALL keys (map().once() fires for all)
125
+ expectedCount = keys.length;
126
+
127
+ // Step 2: Collect items via map().once(), counting as we go
128
+ gunChain.map().once((data, key) => {
129
+ if (settled || !data || key.startsWith('_')) return;
130
+ // Add/update the item (inline items may be updated by map().once())
131
+ items[key] = data;
132
+ receivedCount++;
133
+ tryResolve();
134
+ });
79
135
  });
80
136
 
137
+ // Fallback timeout
81
138
  setTimeout(() => {
82
- resolve(items);
139
+ if (!settled) {
140
+ settled = true;
141
+ resolve(items);
142
+ }
83
143
  }, timeout);
84
144
  });
85
145
  }