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,383 +0,0 @@
1
- import { describe, it, expect, beforeEach, vi } from 'vitest';
2
- import { NLQuery } from '../../../src/ai/nl-query.js';
3
-
4
- describe('Unit: NLQuery', () => {
5
- let nlQuery;
6
- let mockLLM;
7
- let mockHolosphere;
8
-
9
- beforeEach(() => {
10
- vi.clearAllMocks();
11
-
12
- mockLLM = {
13
- getJSON: vi.fn(),
14
- sendMessage: vi.fn()
15
- };
16
-
17
- mockHolosphere = {
18
- getAll: vi.fn().mockResolvedValue([])
19
- };
20
-
21
- nlQuery = new NLQuery(mockLLM, mockHolosphere);
22
- });
23
-
24
- describe('Constructor', () => {
25
- it('should initialize with LLM service', () => {
26
- const nq = new NLQuery(mockLLM);
27
- expect(nq.llm).toBe(mockLLM);
28
- expect(nq.holosphere).toBeNull();
29
- });
30
-
31
- it('should accept optional HoloSphere instance', () => {
32
- expect(nlQuery.holosphere).toBe(mockHolosphere);
33
- });
34
- });
35
-
36
- describe('setHoloSphere', () => {
37
- it('should set HoloSphere instance', () => {
38
- const nq = new NLQuery(mockLLM);
39
- nq.setHoloSphere(mockHolosphere);
40
- expect(nq.holosphere).toBe(mockHolosphere);
41
- });
42
- });
43
-
44
- describe('parse', () => {
45
- it('should parse natural language query into structured format', async () => {
46
- mockLLM.getJSON.mockResolvedValue({
47
- holon: null,
48
- lens: 'projects',
49
- filters: { status: { op: 'eq', value: 'active' } },
50
- sort: { field: 'created_at', order: 'desc' },
51
- limit: 10,
52
- spatial: null,
53
- temporal: null
54
- });
55
-
56
- const result = await nlQuery.parse('Show me the 10 most recent active projects');
57
-
58
- expect(result.lens).toBe('projects');
59
- expect(result.filters.status.op).toBe('eq');
60
- expect(result.limit).toBe(10);
61
- });
62
-
63
- it('should include context in parsing', async () => {
64
- mockLLM.getJSON.mockResolvedValue({ holon: 'h1', lens: 'tasks' });
65
-
66
- await nlQuery.parse('Find tasks', {
67
- holons: ['h1', 'h2'],
68
- lenses: ['projects', 'tasks']
69
- });
70
-
71
- const call = mockLLM.getJSON.mock.calls[0];
72
- expect(call[0]).toContain('h1, h2');
73
- expect(call[0]).toContain('projects, tasks');
74
- });
75
-
76
- it('should parse spatial queries', async () => {
77
- mockLLM.getJSON.mockResolvedValue({
78
- lens: 'projects',
79
- spatial: { near: 'Rome', radius: '10km' }
80
- });
81
-
82
- const result = await nlQuery.parse('Show projects near Rome');
83
-
84
- expect(result.spatial.near).toBe('Rome');
85
- });
86
- });
87
-
88
- describe('execute', () => {
89
- it('should execute query and return results', async () => {
90
- mockLLM.getJSON.mockResolvedValue({
91
- holon: 'holon1',
92
- lens: 'projects',
93
- filters: null,
94
- sort: null,
95
- limit: null
96
- });
97
-
98
- mockHolosphere.getAll.mockResolvedValue([
99
- { id: 1, title: 'Project 1' },
100
- { id: 2, title: 'Project 2' }
101
- ]);
102
-
103
- const result = await nlQuery.execute('Show all projects');
104
-
105
- expect(result.query).toBe('Show all projects');
106
- expect(result.parsed.lens).toBe('projects');
107
- expect(result.results).toHaveLength(2);
108
- expect(result.count).toBe(2);
109
- });
110
-
111
- it('should throw error if HoloSphere not available', async () => {
112
- const nq = new NLQuery(mockLLM);
113
-
114
- await expect(nq.execute('query'))
115
- .rejects.toThrow('HoloSphere instance required for query execution');
116
- });
117
-
118
- it('should search across holons when only lens specified', async () => {
119
- mockLLM.getJSON.mockResolvedValue({
120
- holon: null,
121
- lens: 'tasks'
122
- });
123
-
124
- mockHolosphere.getAll
125
- .mockResolvedValueOnce([{ id: 1 }])
126
- .mockResolvedValueOnce([{ id: 2 }]);
127
-
128
- const result = await nlQuery.execute('Find all tasks', {
129
- holons: ['h1', 'h2']
130
- });
131
-
132
- expect(result.results).toHaveLength(2);
133
- expect(mockHolosphere.getAll).toHaveBeenCalledTimes(2);
134
- });
135
- });
136
-
137
- describe('_applyFilters', () => {
138
- it('should filter by equality', () => {
139
- const items = [
140
- { status: 'active' },
141
- { status: 'inactive' },
142
- { status: 'active' }
143
- ];
144
-
145
- const result = nlQuery._applyFilters(items, {
146
- status: { op: 'eq', value: 'active' }
147
- });
148
-
149
- expect(result).toHaveLength(2);
150
- });
151
-
152
- it('should filter by inequality', () => {
153
- const items = [
154
- { status: 'active' },
155
- { status: 'inactive' }
156
- ];
157
-
158
- const result = nlQuery._applyFilters(items, {
159
- status: { op: 'ne', value: 'inactive' }
160
- });
161
-
162
- expect(result).toHaveLength(1);
163
- expect(result[0].status).toBe('active');
164
- });
165
-
166
- it('should filter by greater than', () => {
167
- const items = [
168
- { priority: 1 },
169
- { priority: 5 },
170
- { priority: 10 }
171
- ];
172
-
173
- const result = nlQuery._applyFilters(items, {
174
- priority: { op: 'gt', value: 3 }
175
- });
176
-
177
- expect(result).toHaveLength(2);
178
- });
179
-
180
- it('should filter by greater than or equal', () => {
181
- const items = [
182
- { priority: 5 },
183
- { priority: 10 }
184
- ];
185
-
186
- const result = nlQuery._applyFilters(items, {
187
- priority: { op: 'gte', value: 5 }
188
- });
189
-
190
- expect(result).toHaveLength(2);
191
- });
192
-
193
- it('should filter by less than', () => {
194
- const items = [
195
- { priority: 1 },
196
- { priority: 5 }
197
- ];
198
-
199
- const result = nlQuery._applyFilters(items, {
200
- priority: { op: 'lt', value: 3 }
201
- });
202
-
203
- expect(result).toHaveLength(1);
204
- });
205
-
206
- it('should filter by less than or equal', () => {
207
- const items = [
208
- { priority: 1 },
209
- { priority: 3 }
210
- ];
211
-
212
- const result = nlQuery._applyFilters(items, {
213
- priority: { op: 'lte', value: 3 }
214
- });
215
-
216
- expect(result).toHaveLength(2);
217
- });
218
-
219
- it('should filter by contains (case insensitive)', () => {
220
- const items = [
221
- { title: 'Build Website' },
222
- { title: 'Write Documentation' },
223
- { title: 'Website Maintenance' }
224
- ];
225
-
226
- const result = nlQuery._applyFilters(items, {
227
- title: { op: 'contains', value: 'website' }
228
- });
229
-
230
- expect(result).toHaveLength(2);
231
- });
232
-
233
- it('should filter by in array', () => {
234
- const items = [
235
- { status: 'active' },
236
- { status: 'pending' },
237
- { status: 'completed' }
238
- ];
239
-
240
- const result = nlQuery._applyFilters(items, {
241
- status: { op: 'in', value: ['active', 'pending'] }
242
- });
243
-
244
- expect(result).toHaveLength(2);
245
- });
246
-
247
- it('should handle nested field paths', () => {
248
- const items = [
249
- { meta: { priority: 1 } },
250
- { meta: { priority: 5 } }
251
- ];
252
-
253
- const result = nlQuery._applyFilters(items, {
254
- 'meta.priority': { op: 'gt', value: 2 }
255
- });
256
-
257
- expect(result).toHaveLength(1);
258
- });
259
-
260
- it('should handle unknown operators', () => {
261
- const items = [{ value: 1 }];
262
-
263
- const result = nlQuery._applyFilters(items, {
264
- value: { op: 'unknown', value: 1 }
265
- });
266
-
267
- expect(result).toHaveLength(1);
268
- });
269
- });
270
-
271
- describe('_getNestedValue', () => {
272
- it('should get simple value', () => {
273
- const obj = { name: 'Test' };
274
- expect(nlQuery._getNestedValue(obj, 'name')).toBe('Test');
275
- });
276
-
277
- it('should get nested value', () => {
278
- const obj = { user: { profile: { name: 'Test' } } };
279
- expect(nlQuery._getNestedValue(obj, 'user.profile.name')).toBe('Test');
280
- });
281
-
282
- it('should return undefined for missing path', () => {
283
- const obj = { user: {} };
284
- expect(nlQuery._getNestedValue(obj, 'user.profile.name')).toBeUndefined();
285
- });
286
- });
287
-
288
- describe('_applySort', () => {
289
- it('should sort ascending', () => {
290
- const items = [
291
- { priority: 3 },
292
- { priority: 1 },
293
- { priority: 2 }
294
- ];
295
-
296
- const result = nlQuery._applySort(items, { field: 'priority', order: 'asc' });
297
-
298
- expect(result[0].priority).toBe(1);
299
- expect(result[2].priority).toBe(3);
300
- });
301
-
302
- it('should sort descending', () => {
303
- const items = [
304
- { priority: 1 },
305
- { priority: 3 },
306
- { priority: 2 }
307
- ];
308
-
309
- const result = nlQuery._applySort(items, { field: 'priority', order: 'desc' });
310
-
311
- expect(result[0].priority).toBe(3);
312
- expect(result[2].priority).toBe(1);
313
- });
314
-
315
- it('should handle string sorting', () => {
316
- const items = [
317
- { name: 'Charlie' },
318
- { name: 'Alice' },
319
- { name: 'Bob' }
320
- ];
321
-
322
- const result = nlQuery._applySort(items, { field: 'name', order: 'asc' });
323
-
324
- expect(result[0].name).toBe('Alice');
325
- expect(result[2].name).toBe('Charlie');
326
- });
327
-
328
- it('should not mutate original array', () => {
329
- const items = [{ v: 2 }, { v: 1 }];
330
- const original = [...items];
331
-
332
- nlQuery._applySort(items, { field: 'v', order: 'asc' });
333
-
334
- expect(items[0].v).toBe(original[0].v);
335
- });
336
- });
337
-
338
- describe('suggest', () => {
339
- it('should suggest queries based on context', async () => {
340
- mockLLM.getJSON.mockResolvedValue([
341
- 'Show all active projects',
342
- 'Find tasks due this week',
343
- 'List recent events'
344
- ]);
345
-
346
- const suggestions = await nlQuery.suggest({
347
- holons: ['region1'],
348
- lenses: ['projects', 'tasks', 'events']
349
- });
350
-
351
- expect(Array.isArray(suggestions)).toBe(true);
352
- expect(suggestions).toHaveLength(3);
353
- });
354
- });
355
-
356
- describe('explain', () => {
357
- it('should explain query results in natural language', async () => {
358
- mockLLM.sendMessage.mockResolvedValue('Found 5 active projects in the Rome region.');
359
-
360
- const result = await nlQuery.explain('Show projects near Rome', [
361
- { id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }, { id: 5 }
362
- ]);
363
-
364
- expect(result).toContain('5');
365
- expect(mockLLM.sendMessage).toHaveBeenCalledWith(
366
- expect.stringContaining('Show projects near Rome'),
367
- expect.any(String),
368
- expect.objectContaining({ temperature: 0.5 })
369
- );
370
- });
371
-
372
- it('should limit sample results to 5', async () => {
373
- mockLLM.sendMessage.mockResolvedValue('Summary');
374
-
375
- const manyResults = Array(20).fill({ id: 1 });
376
- await nlQuery.explain('Query', manyResults);
377
-
378
- const call = mockLLM.sendMessage.mock.calls[0];
379
- const resultSample = JSON.parse(call[1].replace('Results sample: ', ''));
380
- expect(resultSample).toHaveLength(5);
381
- });
382
- });
383
- });
@@ -1,311 +0,0 @@
1
- import { describe, it, expect, beforeEach, vi } from 'vitest';
2
- import { RelationshipDiscovery } from '../../../src/ai/relationships.js';
3
-
4
- describe('Unit: RelationshipDiscovery', () => {
5
- let relationships;
6
- let mockLLM;
7
- let mockHolosphere;
8
- let mockEmbeddings;
9
-
10
- beforeEach(() => {
11
- vi.clearAllMocks();
12
-
13
- mockLLM = {
14
- getJSON: vi.fn()
15
- };
16
-
17
- mockHolosphere = {
18
- getAll: vi.fn().mockResolvedValue([])
19
- };
20
-
21
- mockEmbeddings = {
22
- findSimilar: vi.fn().mockResolvedValue([])
23
- };
24
-
25
- relationships = new RelationshipDiscovery(mockLLM, mockHolosphere, mockEmbeddings);
26
- });
27
-
28
- describe('Constructor', () => {
29
- it('should initialize with LLM service', () => {
30
- const r = new RelationshipDiscovery(mockLLM);
31
- expect(r.llm).toBe(mockLLM);
32
- expect(r.holosphere).toBeNull();
33
- expect(r.embeddings).toBeNull();
34
- });
35
-
36
- it('should accept optional HoloSphere and Embeddings', () => {
37
- expect(relationships.holosphere).toBe(mockHolosphere);
38
- expect(relationships.embeddings).toBe(mockEmbeddings);
39
- });
40
- });
41
-
42
- describe('setHoloSphere', () => {
43
- it('should set HoloSphere instance', () => {
44
- const r = new RelationshipDiscovery(mockLLM);
45
- r.setHoloSphere(mockHolosphere);
46
- expect(r.holosphere).toBe(mockHolosphere);
47
- });
48
- });
49
-
50
- describe('setEmbeddings', () => {
51
- it('should set Embeddings instance', () => {
52
- const r = new RelationshipDiscovery(mockLLM);
53
- r.setEmbeddings(mockEmbeddings);
54
- expect(r.embeddings).toBe(mockEmbeddings);
55
- });
56
- });
57
-
58
- describe('discoverRelationships', () => {
59
- it('should discover relationships in holon data', async () => {
60
- mockHolosphere.getAll.mockResolvedValue([
61
- { id: 1, title: 'Project A', topic: 'sustainability' },
62
- { id: 2, title: 'Project B', topic: 'sustainability' },
63
- { id: 3, title: 'Project C', topic: 'tech' }
64
- ]);
65
-
66
- mockLLM.getJSON.mockResolvedValue({
67
- relationships: [
68
- {
69
- item1: { id: 1, title: 'Project A' },
70
- item2: { id: 2, title: 'Project B' },
71
- type: 'thematic',
72
- strength: 0.9,
73
- description: 'Both focus on sustainability'
74
- }
75
- ],
76
- clusters: [
77
- { theme: 'sustainability', items: [1, 2] }
78
- ],
79
- key_entities: ['sustainability', 'tech'],
80
- summary: 'Two sustainability projects are related'
81
- });
82
-
83
- const result = await relationships.discoverRelationships('holon1', 'projects');
84
-
85
- expect(result.holon).toBe('holon1');
86
- expect(result.lens).toBe('projects');
87
- expect(result.itemCount).toBe(3);
88
- expect(result.relationships.relationships).toHaveLength(1);
89
- });
90
-
91
- it('should throw error if HoloSphere not available', async () => {
92
- const r = new RelationshipDiscovery(mockLLM);
93
-
94
- await expect(r.discoverRelationships('holon', 'lens'))
95
- .rejects.toThrow('HoloSphere instance required');
96
- });
97
-
98
- it('should return message if not enough data', async () => {
99
- mockHolosphere.getAll.mockResolvedValue([{ id: 1 }]);
100
-
101
- const result = await relationships.discoverRelationships('holon1', 'lens');
102
-
103
- expect(result.relationships).toEqual([]);
104
- expect(result.message).toBe('Not enough data for relationship discovery');
105
- });
106
-
107
- it('should search multiple lenses when lens is null', async () => {
108
- mockHolosphere.getAll.mockResolvedValue([{ id: 1 }, { id: 2 }]);
109
- mockLLM.getJSON.mockResolvedValue({ relationships: [] });
110
-
111
- await relationships.discoverRelationships('holon1', null);
112
-
113
- expect(mockHolosphere.getAll.mock.calls.length).toBeGreaterThan(1);
114
- });
115
-
116
- it('should add _lens field to items', async () => {
117
- mockHolosphere.getAll.mockResolvedValue([{ id: 1 }, { id: 2 }]);
118
- mockLLM.getJSON.mockResolvedValue({ relationships: [] });
119
-
120
- await relationships.discoverRelationships('holon1', 'projects');
121
-
122
- const call = mockLLM.getJSON.mock.calls[0];
123
- expect(call[1]).toContain('projects');
124
- });
125
- });
126
-
127
- describe('findSimilar', () => {
128
- it('should use embeddings when available', async () => {
129
- mockEmbeddings.findSimilar.mockResolvedValue([
130
- { item: { id: 1 }, similarity: 0.9 }
131
- ]);
132
-
133
- const item = { title: 'Test' };
134
- const result = await relationships.findSimilar(item, 'holon1', 'lens1');
135
-
136
- expect(mockEmbeddings.findSimilar).toHaveBeenCalledWith(
137
- item,
138
- 'holon1',
139
- 'lens1',
140
- expect.objectContaining({ limit: 10, threshold: 0.5 })
141
- );
142
- expect(result).toHaveLength(1);
143
- });
144
-
145
- it('should fall back to LLM when embeddings not available', async () => {
146
- const r = new RelationshipDiscovery(mockLLM, mockHolosphere);
147
-
148
- mockHolosphere.getAll.mockResolvedValue([
149
- { id: 1, title: 'Similar' },
150
- { id: 2, title: 'Different' }
151
- ]);
152
-
153
- mockLLM.getJSON.mockResolvedValue([
154
- { item: { id: 1 }, similarity: 0.8, reasons: ['Same topic'] }
155
- ]);
156
-
157
- const result = await r.findSimilar({ title: 'Test' }, 'holon1', 'lens1');
158
-
159
- expect(result).toHaveLength(1);
160
- });
161
-
162
- it('should throw error if no holon for LLM-based similarity', async () => {
163
- const r = new RelationshipDiscovery(mockLLM, mockHolosphere);
164
-
165
- await expect(r.findSimilar({ title: 'Test' }, null))
166
- .rejects.toThrow('Holon required for LLM-based similarity');
167
- });
168
-
169
- it('should filter by threshold', async () => {
170
- const r = new RelationshipDiscovery(mockLLM, mockHolosphere);
171
-
172
- mockHolosphere.getAll.mockResolvedValue([{ id: 1 }]);
173
- mockLLM.getJSON.mockResolvedValue([
174
- { item: { id: 1 }, similarity: 0.8 },
175
- { item: { id: 2 }, similarity: 0.4 }
176
- ]);
177
-
178
- const result = await r.findSimilar({ title: 'Test' }, 'holon', 'lens', { threshold: 0.6 });
179
-
180
- expect(result).toHaveLength(1);
181
- });
182
-
183
- it('should skip embeddings when useEmbeddings is false', async () => {
184
- mockHolosphere.getAll.mockResolvedValue([{ id: 1 }]);
185
- mockLLM.getJSON.mockResolvedValue([]);
186
-
187
- await relationships.findSimilar({ title: 'Test' }, 'holon', 'lens', { useEmbeddings: false });
188
-
189
- expect(mockEmbeddings.findSimilar).not.toHaveBeenCalled();
190
- });
191
- });
192
-
193
- describe('buildGraph', () => {
194
- it('should build relationship graph structure', async () => {
195
- mockHolosphere.getAll.mockResolvedValue([{ id: 1 }, { id: 2 }]);
196
-
197
- mockLLM.getJSON.mockResolvedValue({
198
- relationships: [
199
- {
200
- item1: { id: 'a', title: 'A' },
201
- item2: { id: 'b', title: 'B' },
202
- type: 'thematic',
203
- strength: 0.8
204
- }
205
- ],
206
- clusters: [{ theme: 'test', items: ['a', 'b'] }]
207
- });
208
-
209
- const result = await relationships.buildGraph('holon1', 'lens1');
210
-
211
- expect(result.nodes).toHaveLength(2);
212
- expect(result.edges).toHaveLength(1);
213
- expect(result.edges[0].source).toBe('a');
214
- expect(result.edges[0].target).toBe('b');
215
- expect(result.clusters).toHaveLength(1);
216
- });
217
- });
218
-
219
- describe('findCrossHolonRelationships', () => {
220
- it('should find relationships across holons', async () => {
221
- mockHolosphere.getAll
222
- .mockResolvedValueOnce([{ id: 1, title: 'H1 Item' }])
223
- .mockResolvedValueOnce([{ id: 2, title: 'H2 Item' }]);
224
-
225
- mockLLM.getJSON.mockResolvedValue({
226
- cross_relationships: [
227
- {
228
- holon1: 'h1',
229
- item1: 1,
230
- holon2: 'h2',
231
- item2: 2,
232
- type: 'thematic',
233
- potential: 'collaboration'
234
- }
235
- ],
236
- shared_themes: [{ theme: 'innovation', holons: ['h1', 'h2'] }],
237
- opportunities: ['Joint project']
238
- });
239
-
240
- const result = await relationships.findCrossHolonRelationships(['h1', 'h2'], 'lens');
241
-
242
- expect(result.cross_relationships).toHaveLength(1);
243
- expect(result.shared_themes).toHaveLength(1);
244
- });
245
-
246
- it('should throw error if HoloSphere not available', async () => {
247
- const r = new RelationshipDiscovery(mockLLM);
248
-
249
- await expect(r.findCrossHolonRelationships(['h1', 'h2'], 'lens'))
250
- .rejects.toThrow('HoloSphere instance required');
251
- });
252
-
253
- it('should require at least 2 holons with data', async () => {
254
- mockHolosphere.getAll.mockResolvedValue([{ id: 1 }]);
255
-
256
- const result = await relationships.findCrossHolonRelationships(['h1'], 'lens');
257
-
258
- expect(result.message).toBe('Need at least 2 holons with data');
259
- });
260
- });
261
-
262
- describe('suggestConnections', () => {
263
- it('should suggest connections for an item', async () => {
264
- mockEmbeddings.findSimilar.mockResolvedValue([
265
- { item: { id: 2 }, similarity: 0.8 }
266
- ]);
267
-
268
- mockLLM.getJSON.mockResolvedValue({
269
- collaborations: [{ with: 2, action: 'Partner on project' }],
270
- resource_sharing: [{ items: [1, 2], resource: 'Equipment' }],
271
- initiatives: [{ description: 'Joint workshop', participants: [1, 2] }],
272
- knowledge_exchange: [{ from: 1, to: 2, topic: 'Best practices' }]
273
- });
274
-
275
- const result = await relationships.suggestConnections({ id: 1 }, 'holon', 'lens');
276
-
277
- expect(result.collaborations).toBeDefined();
278
- expect(result.resource_sharing).toBeDefined();
279
- });
280
- });
281
-
282
- describe('detectPatterns', () => {
283
- it('should detect relationship patterns', async () => {
284
- mockHolosphere.getAll.mockResolvedValue([{ id: 1 }, { id: 2 }, { id: 3 }]);
285
-
286
- mockLLM.getJSON
287
- .mockResolvedValueOnce({
288
- relationships: [
289
- { item1: { id: 'a' }, item2: { id: 'b' }, type: 'thematic', strength: 0.8 }
290
- ]
291
- })
292
- .mockResolvedValueOnce({
293
- patterns: [
294
- {
295
- type: 'hub',
296
- description: 'Central node connects multiple items',
297
- items: ['a'],
298
- significance: 'Key connector'
299
- }
300
- ],
301
- network_structure: 'Hub-spoke pattern',
302
- recommendations: ['Strengthen peripheral connections']
303
- });
304
-
305
- const result = await relationships.detectPatterns('holon', 'lens');
306
-
307
- expect(result.patterns).toBeDefined();
308
- expect(result.network_structure).toBeDefined();
309
- });
310
- });
311
- });