holosphere 2.0.0-alpha1 → 2.0.0-alpha10

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 (418) 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/cdn/holosphere.min.js +55 -0
  19. package/dist/cdn/holosphere.min.js.map +1 -0
  20. package/dist/cjs/holosphere.cjs +2 -0
  21. package/dist/cjs/holosphere.cjs.map +1 -0
  22. package/dist/esm/holosphere.js +53 -0
  23. package/dist/esm/holosphere.js.map +1 -0
  24. package/dist/index-DDGt_V9o.cjs +12 -0
  25. package/dist/index-DDGt_V9o.cjs.map +1 -0
  26. package/dist/index-DJXftyvB.js +39841 -0
  27. package/dist/index-DJXftyvB.js.map +1 -0
  28. package/dist/index-DMbdcMtK.cjs +18 -0
  29. package/dist/index-DMbdcMtK.cjs.map +1 -0
  30. package/dist/index-DeZ1xz_s.js +15104 -0
  31. package/dist/index-DeZ1xz_s.js.map +1 -0
  32. package/dist/indexeddb-storage-BFt6hMeF.js +176 -0
  33. package/dist/indexeddb-storage-BFt6hMeF.js.map +1 -0
  34. package/dist/indexeddb-storage-BK5tv4Sh.cjs +2 -0
  35. package/dist/indexeddb-storage-BK5tv4Sh.cjs.map +1 -0
  36. package/dist/memory-storage-C9HuoL2E.js +91 -0
  37. package/dist/memory-storage-C9HuoL2E.js.map +1 -0
  38. package/dist/memory-storage-Dao7jfYG.cjs +2 -0
  39. package/dist/memory-storage-Dao7jfYG.cjs.map +1 -0
  40. package/dist/secp256k1-BbKzbLtD.cjs +12 -0
  41. package/dist/secp256k1-BbKzbLtD.cjs.map +1 -0
  42. package/dist/secp256k1-CreY7Pcl.js +1890 -0
  43. package/dist/secp256k1-CreY7Pcl.js.map +1 -0
  44. package/docs/CONTRACTS.md +797 -0
  45. package/docs/FOSDEM_PROPOSAL.md +388 -0
  46. package/docs/LOCALFIRST.md +266 -0
  47. package/docs/api/ai_aggregation.js.html +333 -0
  48. package/docs/api/ai_breakdown.js.html +524 -0
  49. package/docs/api/ai_classifier.js.html +231 -0
  50. package/docs/api/ai_council.js.html +246 -0
  51. package/docs/api/ai_embeddings.js.html +304 -0
  52. package/docs/api/ai_federation-ai.js.html +338 -0
  53. package/docs/api/ai_h3-ai.js.html +970 -0
  54. package/docs/api/ai_index.js.html +124 -0
  55. package/docs/api/ai_json-ops.js.html +241 -0
  56. package/docs/api/ai_llm-service.js.html +239 -0
  57. package/docs/api/ai_nl-query.js.html +236 -0
  58. package/docs/api/ai_relationships.js.html +367 -0
  59. package/docs/api/ai_schema-extractor.js.html +235 -0
  60. package/docs/api/ai_spatial.js.html +307 -0
  61. package/docs/api/ai_tts.js.html +214 -0
  62. package/docs/api/content_social-protocols.js.html +180 -0
  63. package/docs/api/core_holosphere.js.html +757 -0
  64. package/docs/api/crypto_nostr-utils.js.html +306 -0
  65. package/docs/api/crypto_secp256k1.js.html +267 -0
  66. package/docs/api/data/search.json +1 -0
  67. package/docs/api/federation_discovery.js.html +337 -0
  68. package/docs/api/federation_handshake.js.html +478 -0
  69. package/docs/api/federation_hologram.js.html +1053 -0
  70. package/docs/api/federation_registry.js.html +389 -0
  71. package/docs/api/fonts/Inconsolata-Regular.ttf +0 -0
  72. package/docs/api/fonts/OpenSans-Regular.ttf +0 -0
  73. package/docs/api/fonts/WorkSans-Bold.ttf +0 -0
  74. package/docs/api/global.html +3 -0
  75. package/docs/api/hierarchical_upcast.js.html +128 -0
  76. package/docs/api/index.html +265 -0
  77. package/docs/api/index.js.html +1868 -0
  78. package/docs/api/lib_ai-methods.js.html +660 -0
  79. package/docs/api/lib_contract-methods.js.html +445 -0
  80. package/docs/api/lib_errors.js.html +56 -0
  81. package/docs/api/lib_federation-methods.js.html +348 -0
  82. package/docs/api/lib_index.js.html +33 -0
  83. package/docs/api/module-ai.html +5 -0
  84. package/docs/api/module-ai_aggregation-SmartAggregation.html +6 -0
  85. package/docs/api/module-ai_aggregation.SmartAggregation.html +3 -0
  86. package/docs/api/module-ai_aggregation.html +3 -0
  87. package/docs/api/module-ai_breakdown-TaskBreakdown.html +5 -0
  88. package/docs/api/module-ai_breakdown.TaskBreakdown.html +3 -0
  89. package/docs/api/module-ai_breakdown.html +3 -0
  90. package/docs/api/module-ai_classifier-Classifier.html +6 -0
  91. package/docs/api/module-ai_classifier.Classifier.html +3 -0
  92. package/docs/api/module-ai_classifier.html +3 -0
  93. package/docs/api/module-ai_council-Council.html +6 -0
  94. package/docs/api/module-ai_council.Council.html +3 -0
  95. package/docs/api/module-ai_council.html +3 -0
  96. package/docs/api/module-ai_embeddings-Embeddings.html +5 -0
  97. package/docs/api/module-ai_embeddings.Embeddings.html +3 -0
  98. package/docs/api/module-ai_embeddings.html +3 -0
  99. package/docs/api/module-ai_federation-ai-FederationAdvisor.html +6 -0
  100. package/docs/api/module-ai_federation-ai.FederationAdvisor.html +3 -0
  101. package/docs/api/module-ai_federation-ai.html +3 -0
  102. package/docs/api/module-ai_h3-ai-H3AI.html +6 -0
  103. package/docs/api/module-ai_h3-ai.H3AI.html +3 -0
  104. package/docs/api/module-ai_h3-ai.html +3 -0
  105. package/docs/api/module-ai_json-ops-JSONOps.html +5 -0
  106. package/docs/api/module-ai_json-ops.JSONOps.html +3 -0
  107. package/docs/api/module-ai_json-ops.html +3 -0
  108. package/docs/api/module-ai_llm-service-LLMService.html +5 -0
  109. package/docs/api/module-ai_llm-service.LLMService.html +3 -0
  110. package/docs/api/module-ai_llm-service.html +3 -0
  111. package/docs/api/module-ai_nl-query-NLQuery.html +5 -0
  112. package/docs/api/module-ai_nl-query.NLQuery.html +3 -0
  113. package/docs/api/module-ai_nl-query.html +3 -0
  114. package/docs/api/module-ai_relationships-RelationshipDiscovery.html +6 -0
  115. package/docs/api/module-ai_relationships.RelationshipDiscovery.html +3 -0
  116. package/docs/api/module-ai_relationships.html +3 -0
  117. package/docs/api/module-ai_schema-extractor-SchemaExtractor.html +5 -0
  118. package/docs/api/module-ai_schema-extractor.SchemaExtractor.html +3 -0
  119. package/docs/api/module-ai_schema-extractor.html +3 -0
  120. package/docs/api/module-ai_spatial-SpatialAnalysis.html +6 -0
  121. package/docs/api/module-ai_spatial.SpatialAnalysis.html +3 -0
  122. package/docs/api/module-ai_spatial.html +3 -0
  123. package/docs/api/module-ai_tts-TTS.html +5 -0
  124. package/docs/api/module-ai_tts.TTS.html +3 -0
  125. package/docs/api/module-ai_tts.html +3 -0
  126. package/docs/api/module-content_social-protocols.html +3 -0
  127. package/docs/api/module-core_holosphere-HoloSphere.html +6 -0
  128. package/docs/api/module-core_holosphere.HoloSphere.html +3 -0
  129. package/docs/api/module-core_holosphere.html +3 -0
  130. package/docs/api/module-crypto_nostr-utils.html +3 -0
  131. package/docs/api/module-crypto_secp256k1.html +3 -0
  132. package/docs/api/module-federation_hologram.html +3 -0
  133. package/docs/api/module-hierarchical_upcast.html +3 -0
  134. package/docs/api/module-holosphere-HoloSphereBase.html +3 -0
  135. package/docs/api/module-holosphere.html +3 -0
  136. package/docs/api/module-lib_ai-methods.html +3 -0
  137. package/docs/api/module-lib_contract-methods.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.AuthorizationError.html +3 -0
  141. package/docs/api/module-lib_errors.ValidationError.html +3 -0
  142. package/docs/api/module-lib_errors.html +3 -0
  143. package/docs/api/module-lib_federation-methods.html +3 -0
  144. package/docs/api/module-lib_index.html +3 -0
  145. package/docs/api/module-schema_validator-ValidationError.html +3 -0
  146. package/docs/api/module-schema_validator.ValidationError.html +3 -0
  147. package/docs/api/module-schema_validator.html +3 -0
  148. package/docs/api/module-spatial_h3-operations.html +4 -0
  149. package/docs/api/module-storage_backend-factory.BackendFactory.html +3 -0
  150. package/docs/api/module-storage_backend-factory.html +3 -0
  151. package/docs/api/module-storage_backend-interface-StorageBackend.html +3 -0
  152. package/docs/api/module-storage_backend-interface.StorageBackend.html +3 -0
  153. package/docs/api/module-storage_backend-interface.html +3 -0
  154. package/docs/api/module-storage_backends_activitypub-backend-ActivityPubBackend.html +7 -0
  155. package/docs/api/module-storage_backends_activitypub-backend.ActivityPubBackend.html +3 -0
  156. package/docs/api/module-storage_backends_activitypub-backend.html +3 -0
  157. package/docs/api/module-storage_backends_activitypub_server-ActivityPubServer.html +8 -0
  158. package/docs/api/module-storage_backends_activitypub_server.ActivityPubServer.html +3 -0
  159. package/docs/api/module-storage_backends_activitypub_server.html +3 -0
  160. package/docs/api/module-storage_backends_gundb-backend-GunDBBackend.html +7 -0
  161. package/docs/api/module-storage_backends_gundb-backend.GunDBBackend.html +3 -0
  162. package/docs/api/module-storage_backends_gundb-backend.html +3 -0
  163. package/docs/api/module-storage_backends_nostr-backend-NostrBackend.html +8 -0
  164. package/docs/api/module-storage_backends_nostr-backend.NostrBackend.html +3 -0
  165. package/docs/api/module-storage_backends_nostr-backend.html +3 -0
  166. package/docs/api/module-storage_filesystem-storage-FileSystemStorage.html +5 -0
  167. package/docs/api/module-storage_filesystem-storage-browser-FileSystemStorage.html +3 -0
  168. package/docs/api/module-storage_filesystem-storage-browser.FileSystemStorage.html +3 -0
  169. package/docs/api/module-storage_filesystem-storage-browser.html +3 -0
  170. package/docs/api/module-storage_filesystem-storage.FileSystemStorage.html +3 -0
  171. package/docs/api/module-storage_filesystem-storage.html +3 -0
  172. package/docs/api/module-storage_global-tables.html +3 -0
  173. package/docs/api/module-storage_gun-async.html +3 -0
  174. package/docs/api/module-storage_gun-auth-GunAuth.html +5 -0
  175. package/docs/api/module-storage_gun-auth.GunAuth.html +3 -0
  176. package/docs/api/module-storage_gun-auth.html +3 -0
  177. package/docs/api/module-storage_gun-federation.html +3 -0
  178. package/docs/api/module-storage_gun-references-GunReferenceHandler.html +5 -0
  179. package/docs/api/module-storage_gun-references.GunReferenceHandler.html +3 -0
  180. package/docs/api/module-storage_gun-references.html +3 -0
  181. package/docs/api/module-storage_gun-schema-GunSchemaValidator.html +5 -0
  182. package/docs/api/module-storage_gun-schema.GunSchemaValidator.html +3 -0
  183. package/docs/api/module-storage_gun-schema.html +3 -0
  184. package/docs/api/module-storage_gun-wrapper.html +11 -0
  185. package/docs/api/module-storage_indexeddb-storage-IndexedDBStorage.html +5 -0
  186. package/docs/api/module-storage_indexeddb-storage.IndexedDBStorage.html +3 -0
  187. package/docs/api/module-storage_indexeddb-storage.html +3 -0
  188. package/docs/api/module-storage_key-storage-simple.html +3 -0
  189. package/docs/api/module-storage_key-storage.html +4 -0
  190. package/docs/api/module-storage_memory-storage-MemoryStorage.html +5 -0
  191. package/docs/api/module-storage_memory-storage.MemoryStorage.html +3 -0
  192. package/docs/api/module-storage_memory-storage.html +3 -0
  193. package/docs/api/module-storage_migration-MigrationTool.html +6 -0
  194. package/docs/api/module-storage_migration.MigrationTool.html +3 -0
  195. package/docs/api/module-storage_migration.html +3 -0
  196. package/docs/api/module-storage_nostr-async.html +18 -0
  197. package/docs/api/module-storage_nostr-client-LRUCache.html +3 -0
  198. package/docs/api/module-storage_nostr-client-NostrClient.html +7 -0
  199. package/docs/api/module-storage_nostr-client.NostrClient.html +15 -0
  200. package/docs/api/module-storage_nostr-client.html +6 -0
  201. package/docs/api/module-storage_nostr-wrapper.html +3 -0
  202. package/docs/api/module-storage_outbox-queue-OutboxQueue.html +4 -0
  203. package/docs/api/module-storage_outbox-queue.OutboxQueue.html +3 -0
  204. package/docs/api/module-storage_outbox-queue.html +3 -0
  205. package/docs/api/module-storage_persistent-storage-PersistentStorage.html +3 -0
  206. package/docs/api/module-storage_persistent-storage.html +4 -0
  207. package/docs/api/module-storage_sync-service-SyncService.html +5 -0
  208. package/docs/api/module-storage_sync-service.SyncService.html +3 -0
  209. package/docs/api/module-storage_sync-service.html +3 -0
  210. package/docs/api/module-storage_unified-storage.html +3 -0
  211. package/docs/api/module-subscriptions_manager.SubscriptionRegistry.html +3 -0
  212. package/docs/api/module-subscriptions_manager.html +3 -0
  213. package/docs/api/schema_validator.js.html +113 -0
  214. package/docs/api/scripts/core.js +726 -0
  215. package/docs/api/scripts/core.min.js +23 -0
  216. package/docs/api/scripts/resize.js +90 -0
  217. package/docs/api/scripts/search.js +265 -0
  218. package/docs/api/scripts/search.min.js +6 -0
  219. package/docs/api/scripts/third-party/Apache-License-2.0.txt +202 -0
  220. package/docs/api/scripts/third-party/fuse.js +9 -0
  221. package/docs/api/scripts/third-party/hljs-line-num-original.js +369 -0
  222. package/docs/api/scripts/third-party/hljs-line-num.js +1 -0
  223. package/docs/api/scripts/third-party/hljs-original.js +5171 -0
  224. package/docs/api/scripts/third-party/hljs.js +1 -0
  225. package/docs/api/scripts/third-party/popper.js +5 -0
  226. package/docs/api/scripts/third-party/tippy.js +1 -0
  227. package/docs/api/scripts/third-party/tocbot.js +672 -0
  228. package/docs/api/scripts/third-party/tocbot.min.js +1 -0
  229. package/docs/api/spatial_h3-operations.js.html +129 -0
  230. package/docs/api/storage_backend-factory.js.html +133 -0
  231. package/docs/api/storage_backend-interface.js.html +164 -0
  232. package/docs/api/storage_backends_activitypub-backend.js.html +298 -0
  233. package/docs/api/storage_backends_activitypub_server.js.html +678 -0
  234. package/docs/api/storage_backends_gundb-backend.js.html +878 -0
  235. package/docs/api/storage_backends_nostr-backend.js.html +254 -0
  236. package/docs/api/storage_filesystem-storage-browser.js.html +83 -0
  237. package/docs/api/storage_filesystem-storage.js.html +207 -0
  238. package/docs/api/storage_global-tables.js.html +116 -0
  239. package/docs/api/storage_gun-async.js.html +344 -0
  240. package/docs/api/storage_gun-auth.js.html +376 -0
  241. package/docs/api/storage_gun-federation.js.html +788 -0
  242. package/docs/api/storage_gun-references.js.html +212 -0
  243. package/docs/api/storage_gun-schema.js.html +309 -0
  244. package/docs/api/storage_gun-wrapper.js.html +645 -0
  245. package/docs/api/storage_indexeddb-storage.js.html +224 -0
  246. package/docs/api/storage_key-storage-simple.js.html +102 -0
  247. package/docs/api/storage_key-storage.js.html +171 -0
  248. package/docs/api/storage_memory-storage.js.html +128 -0
  249. package/docs/api/storage_migration.js.html +354 -0
  250. package/docs/api/storage_nostr-async.js.html +1076 -0
  251. package/docs/api/storage_nostr-client.js.html +1598 -0
  252. package/docs/api/storage_nostr-wrapper.js.html +218 -0
  253. package/docs/api/storage_outbox-queue.js.html +248 -0
  254. package/docs/api/storage_persistent-storage.js.html +160 -0
  255. package/docs/api/storage_sync-service.js.html +201 -0
  256. package/docs/api/storage_unified-storage.js.html +157 -0
  257. package/docs/api/styles/clean-jsdoc-theme-base.css +1159 -0
  258. package/docs/api/styles/clean-jsdoc-theme-dark.css +412 -0
  259. package/docs/api/styles/clean-jsdoc-theme-light.css +482 -0
  260. package/docs/api/styles/clean-jsdoc-theme-scrollbar.css +30 -0
  261. package/docs/api/styles/clean-jsdoc-theme-without-scrollbar.min.css +1 -0
  262. package/docs/api/styles/clean-jsdoc-theme.min.css +1 -0
  263. package/docs/api/subscriptions_manager.js.html +162 -0
  264. package/docs/contracts/api-interface.md +793 -0
  265. package/docs/data-model.md +476 -0
  266. package/docs/gun-async-usage.md +338 -0
  267. package/docs/plan.md +349 -0
  268. package/docs/quickstart.md +674 -0
  269. package/docs/research.md +362 -0
  270. package/docs/spec.md +244 -0
  271. package/docs/storage-backends.md +326 -0
  272. package/docs/tasks.md +947 -0
  273. package/examples/demo.html +47 -0
  274. package/examples/holosphere-widget.js +1242 -0
  275. package/examples/widget-demo.html +274 -0
  276. package/examples/widget.html +703 -0
  277. package/jsdoc.json +26 -0
  278. package/package.json +25 -7
  279. package/src/ai/aggregation.js +13 -2
  280. package/src/ai/breakdown.js +12 -2
  281. package/src/ai/classifier.js +14 -3
  282. package/src/ai/council.js +22 -7
  283. package/src/ai/embeddings.js +37 -15
  284. package/src/ai/federation-ai.js +13 -2
  285. package/src/ai/h3-ai.js +14 -2
  286. package/src/ai/index.js +16 -7
  287. package/src/ai/json-ops.js +18 -5
  288. package/src/ai/llm-service.js +62 -31
  289. package/src/ai/nl-query.js +12 -2
  290. package/src/ai/relationships.js +13 -2
  291. package/src/ai/schema-extractor.js +24 -10
  292. package/src/ai/spatial.js +13 -2
  293. package/src/ai/tts.js +25 -8
  294. package/src/cdn-entry.js +22 -0
  295. package/src/content/social-protocols.js +34 -25
  296. package/src/contracts/abis/Appreciative.json +1280 -0
  297. package/src/contracts/abis/AppreciativeFactory.json +101 -0
  298. package/src/contracts/abis/Bundle.json +1438 -0
  299. package/src/contracts/abis/BundleFactory.json +106 -0
  300. package/src/contracts/abis/Holon.json +881 -0
  301. package/src/contracts/abis/Holons.json +330 -0
  302. package/src/contracts/abis/Managed.json +1262 -0
  303. package/src/contracts/abis/ManagedFactory.json +149 -0
  304. package/src/contracts/abis/Membrane.json +261 -0
  305. package/src/contracts/abis/Splitter.json +1624 -0
  306. package/src/contracts/abis/SplitterFactory.json +220 -0
  307. package/src/contracts/abis/TestToken.json +321 -0
  308. package/src/contracts/abis/Zoned.json +1461 -0
  309. package/src/contracts/abis/ZonedFactory.json +154 -0
  310. package/src/contracts/chain-manager.js +403 -0
  311. package/src/contracts/deployer.js +500 -0
  312. package/src/contracts/event-listener.js +539 -0
  313. package/src/contracts/holon-contracts.js +359 -0
  314. package/src/contracts/index.js +82 -0
  315. package/src/contracts/networks.js +229 -0
  316. package/src/contracts/operations.js +687 -0
  317. package/src/contracts/queries.js +638 -0
  318. package/src/core/holosphere.js +487 -6
  319. package/src/crypto/nostr-utils.js +303 -0
  320. package/src/crypto/secp256k1.js +7 -2
  321. package/src/federation/handshake.js +475 -0
  322. package/src/federation/hologram.js +117 -3
  323. package/src/hierarchical/upcast.js +40 -25
  324. package/src/index.js +1501 -1909
  325. package/src/lib/ai-methods.js +657 -0
  326. package/src/lib/contract-methods.js +442 -0
  327. package/src/lib/errors.js +53 -0
  328. package/src/lib/federation-methods.js +345 -0
  329. package/src/lib/index.js +30 -0
  330. package/src/schema/validator.js +22 -3
  331. package/src/spatial/h3-operations.js +19 -3
  332. package/src/storage/backend-factory.js +7 -2
  333. package/src/storage/backend-interface.js +21 -2
  334. package/src/storage/backends/activitypub/server.js +25 -3
  335. package/src/storage/backends/activitypub-backend.js +25 -2
  336. package/src/storage/backends/gundb-backend.js +692 -50
  337. package/src/storage/backends/nostr-backend.js +116 -1
  338. package/src/storage/filesystem-storage-browser.js +42 -2
  339. package/src/storage/filesystem-storage.js +72 -5
  340. package/src/storage/global-tables.js +35 -3
  341. package/src/storage/gun-async.js +75 -15
  342. package/src/storage/gun-auth.js +373 -0
  343. package/src/storage/gun-federation.js +785 -0
  344. package/src/storage/gun-references.js +209 -0
  345. package/src/storage/gun-schema.js +306 -0
  346. package/src/storage/gun-wrapper.js +475 -54
  347. package/src/storage/indexeddb-storage.js +112 -13
  348. package/src/storage/key-storage-simple.js +32 -9
  349. package/src/storage/key-storage.js +45 -13
  350. package/src/storage/memory-storage.js +68 -2
  351. package/src/storage/migration.js +20 -7
  352. package/src/storage/nostr-async.js +412 -122
  353. package/src/storage/nostr-client.js +749 -76
  354. package/src/storage/nostr-wrapper.js +6 -2
  355. package/src/storage/outbox-queue.js +55 -18
  356. package/src/storage/persistent-storage.js +62 -14
  357. package/src/storage/sync-service.js +51 -17
  358. package/src/storage/unified-storage.js +154 -0
  359. package/src/subscriptions/manager.js +34 -17
  360. package/types/index.d.ts +133 -0
  361. package/vite.config.cdn.js +60 -0
  362. package/tests/unit/ai/aggregation.test.js +0 -295
  363. package/tests/unit/ai/breakdown.test.js +0 -446
  364. package/tests/unit/ai/classifier.test.js +0 -294
  365. package/tests/unit/ai/council.test.js +0 -262
  366. package/tests/unit/ai/embeddings.test.js +0 -384
  367. package/tests/unit/ai/federation-ai.test.js +0 -344
  368. package/tests/unit/ai/h3-ai.test.js +0 -458
  369. package/tests/unit/ai/index.test.js +0 -304
  370. package/tests/unit/ai/json-ops.test.js +0 -307
  371. package/tests/unit/ai/llm-service.test.js +0 -390
  372. package/tests/unit/ai/nl-query.test.js +0 -383
  373. package/tests/unit/ai/relationships.test.js +0 -311
  374. package/tests/unit/ai/schema-extractor.test.js +0 -384
  375. package/tests/unit/ai/spatial.test.js +0 -279
  376. package/tests/unit/ai/tts.test.js +0 -279
  377. package/tests/unit/content.test.js +0 -332
  378. package/tests/unit/contract/core.test.js +0 -88
  379. package/tests/unit/contract/crypto.test.js +0 -198
  380. package/tests/unit/contract/data.test.js +0 -223
  381. package/tests/unit/contract/federation.test.js +0 -181
  382. package/tests/unit/contract/hierarchical.test.js +0 -113
  383. package/tests/unit/contract/schema.test.js +0 -114
  384. package/tests/unit/contract/social.test.js +0 -217
  385. package/tests/unit/contract/spatial.test.js +0 -110
  386. package/tests/unit/contract/subscriptions.test.js +0 -128
  387. package/tests/unit/contract/utils.test.js +0 -159
  388. package/tests/unit/core.test.js +0 -152
  389. package/tests/unit/crypto.test.js +0 -328
  390. package/tests/unit/federation.test.js +0 -234
  391. package/tests/unit/gun-async.test.js +0 -252
  392. package/tests/unit/hierarchical.test.js +0 -399
  393. package/tests/unit/integration/scenario-01-geographic-storage.test.js +0 -74
  394. package/tests/unit/integration/scenario-02-federation.test.js +0 -76
  395. package/tests/unit/integration/scenario-03-subscriptions.test.js +0 -102
  396. package/tests/unit/integration/scenario-04-validation.test.js +0 -129
  397. package/tests/unit/integration/scenario-05-hierarchy.test.js +0 -125
  398. package/tests/unit/integration/scenario-06-social.test.js +0 -135
  399. package/tests/unit/integration/scenario-07-persistence.test.js +0 -130
  400. package/tests/unit/integration/scenario-08-authorization.test.js +0 -161
  401. package/tests/unit/integration/scenario-09-cross-dimensional.test.js +0 -139
  402. package/tests/unit/integration/scenario-10-cross-holosphere-capabilities.test.js +0 -357
  403. package/tests/unit/integration/scenario-11-cross-holosphere-federation.test.js +0 -410
  404. package/tests/unit/integration/scenario-12-capability-federated-read.test.js +0 -719
  405. package/tests/unit/performance/benchmark.test.js +0 -85
  406. package/tests/unit/schema.test.js +0 -213
  407. package/tests/unit/spatial.test.js +0 -158
  408. package/tests/unit/storage.test.js +0 -195
  409. package/tests/unit/subscriptions.test.js +0 -328
  410. package/tests/unit/test-data-permanence-debug.js +0 -197
  411. package/tests/unit/test-data-permanence.js +0 -340
  412. package/tests/unit/test-key-persistence-fixed.js +0 -148
  413. package/tests/unit/test-key-persistence.js +0 -172
  414. package/tests/unit/test-relay-permanence.js +0 -376
  415. package/tests/unit/test-second-node.js +0 -95
  416. package/tests/unit/test-simple-write.js +0 -89
  417. /package/{cleanup-test-data.js → scripts/cleanup-test-data.js} +0 -0
  418. /package/{test-ai-real-api.js → scripts/test-ai-real-api.js} +0 -0
@@ -1,384 +0,0 @@
1
- import { describe, it, expect, beforeEach, vi } from 'vitest';
2
- import { SchemaExtractor } from '../../../src/ai/schema-extractor.js';
3
-
4
- describe('Unit: SchemaExtractor', () => {
5
- let extractor;
6
- let mockLLM;
7
-
8
- beforeEach(() => {
9
- vi.clearAllMocks();
10
-
11
- mockLLM = {
12
- getJSON: vi.fn()
13
- };
14
-
15
- extractor = new SchemaExtractor(mockLLM);
16
- });
17
-
18
- describe('Constructor', () => {
19
- it('should initialize with LLM service', () => {
20
- expect(extractor.llm).toBe(mockLLM);
21
- });
22
- });
23
-
24
- describe('extractToSchema', () => {
25
- it('should extract data from text based on schema', async () => {
26
- const schema = {
27
- type: 'object',
28
- properties: {
29
- name: { type: 'string', description: 'Person name' },
30
- age: { type: 'number', description: 'Person age' }
31
- },
32
- required: ['name']
33
- };
34
-
35
- mockLLM.getJSON.mockResolvedValue({ name: 'John', age: 30 });
36
-
37
- const result = await extractor.extractToSchema('John is 30 years old', schema);
38
-
39
- expect(result).toEqual({ name: 'John', age: 30 });
40
- expect(mockLLM.getJSON).toHaveBeenCalledWith(
41
- expect.stringContaining('data extraction'),
42
- 'John is 30 years old',
43
- expect.objectContaining({ temperature: 0.2 })
44
- );
45
- });
46
-
47
- it('should include schema in prompt', async () => {
48
- const schema = {
49
- type: 'object',
50
- properties: {
51
- title: { type: 'string' }
52
- }
53
- };
54
-
55
- mockLLM.getJSON.mockResolvedValue({ title: 'Test' });
56
-
57
- await extractor.extractToSchema('Test text', schema);
58
-
59
- const call = mockLLM.getJSON.mock.calls[0];
60
- expect(call[0]).toContain(JSON.stringify(schema, null, 2));
61
- });
62
-
63
- it('should respect maxTokens option', async () => {
64
- mockLLM.getJSON.mockResolvedValue({});
65
-
66
- await extractor.extractToSchema('Text', {}, { maxTokens: 1000 });
67
-
68
- expect(mockLLM.getJSON).toHaveBeenCalledWith(
69
- expect.any(String),
70
- expect.any(String),
71
- expect.objectContaining({ maxTokens: 1000 })
72
- );
73
- });
74
- });
75
-
76
- describe('_describeSchema', () => {
77
- it('should describe simple schema', () => {
78
- const schema = {
79
- description: 'A person object',
80
- properties: {
81
- name: { type: 'string', description: 'Full name' },
82
- age: { type: 'number', description: 'Age in years' }
83
- },
84
- required: ['name']
85
- };
86
-
87
- const description = extractor._describeSchema(schema);
88
-
89
- expect(description).toContain('root: A person object');
90
- expect(description).toContain('name [string] (required): Full name');
91
- expect(description).toContain('age [number]: Age in years');
92
- });
93
-
94
- it('should describe nested object properties', () => {
95
- const schema = {
96
- properties: {
97
- address: {
98
- type: 'object',
99
- properties: {
100
- street: { type: 'string' },
101
- city: { type: 'string' }
102
- }
103
- }
104
- }
105
- };
106
-
107
- const description = extractor._describeSchema(schema);
108
-
109
- expect(description).toContain('address.street');
110
- expect(description).toContain('address.city');
111
- });
112
-
113
- it('should describe array items', () => {
114
- const schema = {
115
- properties: {
116
- items: {
117
- type: 'array',
118
- items: {
119
- properties: {
120
- id: { type: 'string' }
121
- }
122
- }
123
- }
124
- }
125
- };
126
-
127
- const description = extractor._describeSchema(schema);
128
-
129
- expect(description).toContain('items[].id');
130
- });
131
- });
132
-
133
- describe('extractMultiple', () => {
134
- it('should extract multiple items from text', async () => {
135
- const itemSchema = {
136
- type: 'object',
137
- properties: {
138
- name: { type: 'string' },
139
- role: { type: 'string' }
140
- }
141
- };
142
-
143
- mockLLM.getJSON.mockResolvedValue([
144
- { name: 'Alice', role: 'Developer' },
145
- { name: 'Bob', role: 'Designer' }
146
- ]);
147
-
148
- const result = await extractor.extractMultiple(
149
- 'Alice is a developer. Bob is a designer.',
150
- itemSchema
151
- );
152
-
153
- expect(result).toHaveLength(2);
154
- expect(result[0].name).toBe('Alice');
155
- expect(result[1].name).toBe('Bob');
156
- });
157
-
158
- it('should wrap single result in array', async () => {
159
- mockLLM.getJSON.mockResolvedValue({ name: 'Single' });
160
-
161
- const result = await extractor.extractMultiple('Single item', {});
162
-
163
- expect(Array.isArray(result)).toBe(true);
164
- expect(result).toHaveLength(1);
165
- });
166
-
167
- it('should return empty array if no items found', async () => {
168
- mockLLM.getJSON.mockResolvedValue([]);
169
-
170
- const result = await extractor.extractMultiple('No items', {});
171
-
172
- expect(result).toEqual([]);
173
- });
174
- });
175
-
176
- describe('fillMissing', () => {
177
- it('should fill missing fields from text', async () => {
178
- const existingData = { name: 'John' };
179
- const schema = {
180
- properties: {
181
- name: { type: 'string' },
182
- age: { type: 'number' },
183
- email: { type: 'string' }
184
- }
185
- };
186
-
187
- mockLLM.getJSON.mockResolvedValue({ age: 30, email: 'john@test.com' });
188
-
189
- const result = await extractor.fillMissing(existingData, 'John is 30 and email is john@test.com', schema);
190
-
191
- expect(result).toEqual({
192
- name: 'John',
193
- age: 30,
194
- email: 'john@test.com'
195
- });
196
- });
197
-
198
- it('should return original data if no fields missing', async () => {
199
- const data = { name: 'John', age: 30 };
200
- const schema = {
201
- properties: {
202
- name: { type: 'string' },
203
- age: { type: 'number' }
204
- }
205
- };
206
-
207
- const result = await extractor.fillMissing(data, 'Some text', schema);
208
-
209
- expect(result).toEqual(data);
210
- expect(mockLLM.getJSON).not.toHaveBeenCalled();
211
- });
212
-
213
- it('should identify null values as missing', async () => {
214
- const data = { name: 'John', age: null };
215
- const schema = {
216
- properties: {
217
- name: { type: 'string' },
218
- age: { type: 'number' }
219
- }
220
- };
221
-
222
- mockLLM.getJSON.mockResolvedValue({ age: 25 });
223
-
224
- const result = await extractor.fillMissing(data, 'Age is 25', schema);
225
-
226
- expect(result.age).toBe(25);
227
- });
228
- });
229
-
230
- describe('_findMissingFields', () => {
231
- it('should find undefined fields', () => {
232
- const data = { name: 'John' };
233
- const schema = {
234
- properties: {
235
- name: { type: 'string' },
236
- age: { type: 'number' }
237
- }
238
- };
239
-
240
- const missing = extractor._findMissingFields(data, schema);
241
-
242
- expect(missing).toContain('age');
243
- expect(missing).not.toContain('name');
244
- });
245
-
246
- it('should find null fields', () => {
247
- const data = { name: null, age: 30 };
248
- const schema = {
249
- properties: {
250
- name: { type: 'string' },
251
- age: { type: 'number' }
252
- }
253
- };
254
-
255
- const missing = extractor._findMissingFields(data, schema);
256
-
257
- expect(missing).toContain('name');
258
- });
259
-
260
- it('should find nested missing fields', () => {
261
- const data = {
262
- person: {
263
- name: 'John'
264
- }
265
- };
266
- const schema = {
267
- properties: {
268
- person: {
269
- type: 'object',
270
- properties: {
271
- name: { type: 'string' },
272
- age: { type: 'number' }
273
- }
274
- }
275
- }
276
- };
277
-
278
- const missing = extractor._findMissingFields(data, schema);
279
-
280
- expect(missing).toContain('person.age');
281
- });
282
- });
283
-
284
- describe('validateExtraction', () => {
285
- it('should validate required fields', () => {
286
- const data = { name: 'John' };
287
- const schema = {
288
- required: ['name', 'age'],
289
- properties: {
290
- name: { type: 'string' },
291
- age: { type: 'number' }
292
- }
293
- };
294
-
295
- const result = extractor.validateExtraction(data, schema);
296
-
297
- expect(result.valid).toBe(false);
298
- expect(result.errors).toContain('Missing required field: age');
299
- });
300
-
301
- it('should validate field types', () => {
302
- const data = { name: 123, age: 'thirty' };
303
- const schema = {
304
- properties: {
305
- name: { type: 'string' },
306
- age: { type: 'number' }
307
- }
308
- };
309
-
310
- const result = extractor.validateExtraction(data, schema);
311
-
312
- expect(result.valid).toBe(false);
313
- expect(result.errors.some(e => e.includes('name'))).toBe(true);
314
- expect(result.errors.some(e => e.includes('age'))).toBe(true);
315
- });
316
-
317
- it('should return valid for correct data', () => {
318
- const data = { name: 'John', age: 30 };
319
- const schema = {
320
- required: ['name'],
321
- properties: {
322
- name: { type: 'string' },
323
- age: { type: 'number' }
324
- }
325
- };
326
-
327
- const result = extractor.validateExtraction(data, schema);
328
-
329
- expect(result.valid).toBe(true);
330
- expect(result.errors).toHaveLength(0);
331
- });
332
-
333
- it('should skip null/undefined values in type check', () => {
334
- const data = { name: 'John', age: null };
335
- const schema = {
336
- properties: {
337
- name: { type: 'string' },
338
- age: { type: 'number' }
339
- }
340
- };
341
-
342
- const result = extractor.validateExtraction(data, schema);
343
-
344
- expect(result.valid).toBe(true);
345
- });
346
- });
347
-
348
- describe('_validateType', () => {
349
- it('should validate string type', () => {
350
- expect(extractor._validateType('hello', 'string')).toBe(true);
351
- expect(extractor._validateType(123, 'string')).toBe(false);
352
- });
353
-
354
- it('should validate number type', () => {
355
- expect(extractor._validateType(123, 'number')).toBe(true);
356
- expect(extractor._validateType('123', 'number')).toBe(false);
357
- });
358
-
359
- it('should validate integer type', () => {
360
- expect(extractor._validateType(123, 'integer')).toBe(true);
361
- expect(extractor._validateType(123.5, 'integer')).toBe(true); // JS numbers
362
- });
363
-
364
- it('should validate boolean type', () => {
365
- expect(extractor._validateType(true, 'boolean')).toBe(true);
366
- expect(extractor._validateType(false, 'boolean')).toBe(true);
367
- expect(extractor._validateType('true', 'boolean')).toBe(false);
368
- });
369
-
370
- it('should validate array type', () => {
371
- expect(extractor._validateType([1, 2, 3], 'array')).toBe(true);
372
- expect(extractor._validateType('array', 'array')).toBe(false);
373
- });
374
-
375
- it('should validate object type', () => {
376
- expect(extractor._validateType({ key: 'value' }, 'object')).toBe(true);
377
- expect(extractor._validateType([1, 2], 'object')).toBe(false);
378
- });
379
-
380
- it('should return true for unknown types', () => {
381
- expect(extractor._validateType('anything', 'unknown')).toBe(true);
382
- });
383
- });
384
- });
@@ -1,279 +0,0 @@
1
- import { describe, it, expect, beforeEach, vi } from 'vitest';
2
- import { SpatialAnalysis } from '../../../src/ai/spatial.js';
3
-
4
- describe('Unit: SpatialAnalysis', () => {
5
- let spatial;
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
- spatial = new SpatialAnalysis(mockLLM, mockHolosphere);
22
- });
23
-
24
- describe('Constructor', () => {
25
- it('should initialize with LLM service', () => {
26
- const s = new SpatialAnalysis(mockLLM);
27
- expect(s.llm).toBe(mockLLM);
28
- expect(s.holosphere).toBeNull();
29
- });
30
-
31
- it('should accept optional HoloSphere instance', () => {
32
- expect(spatial.holosphere).toBe(mockHolosphere);
33
- });
34
- });
35
-
36
- describe('setHoloSphere', () => {
37
- it('should set HoloSphere instance', () => {
38
- const s = new SpatialAnalysis(mockLLM);
39
- s.setHoloSphere(mockHolosphere);
40
- expect(s.holosphere).toBe(mockHolosphere);
41
- });
42
- });
43
-
44
- describe('analyzeRegion', () => {
45
- it('should analyze data patterns in a region', async () => {
46
- mockHolosphere.getAll.mockResolvedValue([
47
- { id: 1, title: 'Project 1' },
48
- { id: 2, title: 'Project 2' }
49
- ]);
50
-
51
- mockLLM.getJSON.mockResolvedValue({
52
- summary: 'Active region with 2 projects',
53
- patterns: ['clustering near center'],
54
- insights: ['Growing activity'],
55
- metrics: { count: 2 },
56
- recommendations: ['Expand outreach'],
57
- confidence: 0.8
58
- });
59
-
60
- const result = await spatial.analyzeRegion('holon1', 'projects', 'activity');
61
-
62
- expect(result.holon).toBe('holon1');
63
- expect(result.lens).toBe('projects');
64
- expect(result.aspect).toBe('activity');
65
- expect(result.dataCount).toBe(2);
66
- expect(result.analysis.summary).toBeDefined();
67
- expect(result.timestamp).toBeDefined();
68
- });
69
-
70
- it('should throw error if HoloSphere not available', async () => {
71
- const s = new SpatialAnalysis(mockLLM);
72
-
73
- await expect(s.analyzeRegion('holon', 'lens'))
74
- .rejects.toThrow('HoloSphere instance required');
75
- });
76
-
77
- it('should analyze all lenses when lens is null', async () => {
78
- mockHolosphere.getAll.mockResolvedValue([{ id: 1 }]);
79
- mockLLM.getJSON.mockResolvedValue({ summary: 'Analysis' });
80
-
81
- await spatial.analyzeRegion('holon1', null, 'general');
82
-
83
- expect(mockHolosphere.getAll).toHaveBeenCalledWith('holon1', 'default');
84
- });
85
-
86
- it('should sample data for large datasets', async () => {
87
- const manyItems = Array(100).fill({ id: 1, data: 'test' });
88
- mockHolosphere.getAll.mockResolvedValue(manyItems);
89
- mockLLM.getJSON.mockResolvedValue({ summary: 'Analysis' });
90
-
91
- await spatial.analyzeRegion('holon1', 'lens1');
92
-
93
- const call = mockLLM.getJSON.mock.calls[0];
94
- // Should only send first 50 items
95
- expect(call[1]).toBeDefined();
96
- });
97
- });
98
-
99
- describe('compareRegions', () => {
100
- it('should compare data between two regions', async () => {
101
- mockHolosphere.getAll
102
- .mockResolvedValueOnce([{ id: 1, type: 'A' }])
103
- .mockResolvedValueOnce([{ id: 2, type: 'B' }]);
104
-
105
- mockLLM.getJSON.mockResolvedValue({
106
- summary: 'Region 1 focuses on A, Region 2 on B',
107
- similarities: ['Both active'],
108
- differences: ['Different focus areas'],
109
- region1_strengths: ['More projects'],
110
- region2_strengths: ['More events'],
111
- collaboration_opportunities: ['Knowledge sharing'],
112
- metrics_comparison: { count: { region1: 1, region2: 1 } }
113
- });
114
-
115
- const result = await spatial.compareRegions('holon1', 'holon2', 'projects');
116
-
117
- expect(result.regions).toEqual(['holon1', 'holon2']);
118
- expect(result.lens).toBe('projects');
119
- expect(result.dataCounts).toEqual({ holon1: 1, holon2: 1 });
120
- expect(result.comparison).toBeDefined();
121
- });
122
-
123
- it('should throw error if HoloSphere not available', async () => {
124
- const s = new SpatialAnalysis(mockLLM);
125
-
126
- await expect(s.compareRegions('h1', 'h2', 'lens'))
127
- .rejects.toThrow('HoloSphere instance required');
128
- });
129
- });
130
-
131
- describe('spatialTrends', () => {
132
- it('should identify spatial trends over time', async () => {
133
- mockHolosphere.getAll.mockResolvedValue([
134
- { id: 1, timestamp: '2024-01-01' },
135
- { id: 2, timestamp: '2024-06-01' }
136
- ]);
137
-
138
- mockLLM.getJSON.mockResolvedValue({
139
- trends: [{ trend: 'Growth', direction: 'up', strength: 0.8 }],
140
- patterns: ['Seasonal increase'],
141
- emerging_themes: ['Sustainability'],
142
- predictions: ['Continued growth'],
143
- summary: 'Positive trend'
144
- });
145
-
146
- const result = await spatial.spatialTrends('holon1', 'projects', {
147
- start: '2024-01-01',
148
- end: '2024-12-31'
149
- });
150
-
151
- expect(result.holon).toBe('holon1');
152
- expect(result.lens).toBe('projects');
153
- expect(result.trends).toBeDefined();
154
- });
155
-
156
- it('should filter by time range', async () => {
157
- mockHolosphere.getAll.mockResolvedValue([
158
- { id: 1, timestamp: '2024-01-15' },
159
- { id: 2, timestamp: '2024-06-15' },
160
- { id: 3, timestamp: '2025-01-15' }
161
- ]);
162
-
163
- mockLLM.getJSON.mockResolvedValue({ trends: [] });
164
-
165
- const result = await spatial.spatialTrends('holon1', 'lens', {
166
- start: '2024-01-01',
167
- end: '2024-12-31'
168
- });
169
-
170
- expect(result.dataCount).toBe(2);
171
- });
172
-
173
- it('should handle items without timestamps', async () => {
174
- mockHolosphere.getAll.mockResolvedValue([
175
- { id: 1 }, // No timestamp
176
- { id: 2, timestamp: '2024-06-15' }
177
- ]);
178
-
179
- mockLLM.getJSON.mockResolvedValue({ trends: [] });
180
-
181
- const result = await spatial.spatialTrends('holon1', 'lens', {
182
- start: '2024-01-01'
183
- });
184
-
185
- // Items without timestamps should be included
186
- expect(result.dataCount).toBe(2);
187
- });
188
- });
189
-
190
- describe('findHotspots', () => {
191
- it('should identify hotspots in geographic data', async () => {
192
- mockHolosphere.getAll.mockResolvedValue([
193
- { id: 1, location: 'center' },
194
- { id: 2, location: 'center' },
195
- { id: 3, location: 'edge' }
196
- ]);
197
-
198
- mockLLM.getJSON.mockResolvedValue({
199
- hotspots: [
200
- { location: 'center', intensity: 0.9, type: 'high_activity' }
201
- ],
202
- concentration_patterns: ['Central clustering'],
203
- recommendations: ['Expand to edges'],
204
- summary: 'Activity concentrated in center'
205
- });
206
-
207
- const result = await spatial.findHotspots('holon1', 'projects', 'count');
208
-
209
- expect(result.hotspots).toBeDefined();
210
- expect(result.hotspots[0].intensity).toBe(0.9);
211
- });
212
-
213
- it('should throw error if HoloSphere not available', async () => {
214
- const s = new SpatialAnalysis(mockLLM);
215
-
216
- await expect(s.findHotspots('holon', 'lens'))
217
- .rejects.toThrow('HoloSphere instance required');
218
- });
219
- });
220
-
221
- describe('generateReport', () => {
222
- it('should generate comprehensive spatial report', async () => {
223
- mockHolosphere.getAll
224
- .mockResolvedValueOnce([{ id: 1 }])
225
- .mockResolvedValueOnce([{ id: 2 }]);
226
-
227
- mockLLM.sendMessage.mockResolvedValue(`
228
- # Regional Report
229
-
230
- ## Executive Summary
231
- Active region with diverse activities.
232
-
233
- ## Key Statistics
234
- - 2 total items
235
- - Growing activity
236
-
237
- ## Recommendations
238
- 1. Expand outreach
239
- `);
240
-
241
- const result = await spatial.generateReport('holon1', {
242
- lenses: ['projects', 'events']
243
- });
244
-
245
- expect(result).toContain('Regional Report');
246
- expect(result).toContain('Executive Summary');
247
- });
248
-
249
- it('should throw error if HoloSphere not available', async () => {
250
- const s = new SpatialAnalysis(mockLLM);
251
-
252
- await expect(s.generateReport('holon'))
253
- .rejects.toThrow('HoloSphere instance required');
254
- });
255
-
256
- it('should use default lenses when not specified', async () => {
257
- mockHolosphere.getAll.mockResolvedValue([]);
258
- mockLLM.sendMessage.mockResolvedValue('Report');
259
-
260
- await spatial.generateReport('holon1');
261
-
262
- expect(mockHolosphere.getAll).toHaveBeenCalledWith('holon1', 'default');
263
- });
264
-
265
- it('should include lens data counts in prompt', async () => {
266
- mockHolosphere.getAll
267
- .mockResolvedValueOnce([{ id: 1 }, { id: 2 }])
268
- .mockResolvedValueOnce([{ id: 3 }]);
269
-
270
- mockLLM.sendMessage.mockResolvedValue('Report');
271
-
272
- await spatial.generateReport('holon1', { lenses: ['a', 'b'] });
273
-
274
- const call = mockLLM.sendMessage.mock.calls[0];
275
- expect(call[0]).toContain('a: 2 items');
276
- expect(call[0]).toContain('b: 1 items');
277
- });
278
- });
279
- });