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,304 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach } from 'vitest';
2
- import AI, {
3
- LLMService,
4
- LLM,
5
- SchemaExtractor,
6
- JSONOps,
7
- Embeddings,
8
- Council,
9
- TTS,
10
- VOICES,
11
- MODELS,
12
- NLQuery,
13
- Classifier,
14
- SpatialAnalysis,
15
- SmartAggregation,
16
- FederationAdvisor,
17
- RelationshipDiscovery,
18
- TaskBreakdown,
19
- H3AI,
20
- createAIServices
21
- } from '../../../src/ai/index.js';
22
-
23
- // Mock OpenAI
24
- vi.mock('openai', () => ({
25
- default: vi.fn().mockImplementation(() => ({
26
- chat: {
27
- completions: {
28
- create: vi.fn()
29
- }
30
- },
31
- embeddings: {
32
- create: vi.fn()
33
- },
34
- audio: {
35
- speech: {
36
- create: vi.fn()
37
- }
38
- }
39
- }))
40
- }));
41
-
42
- describe('Unit: AI Module Index', () => {
43
- describe('Named Exports', () => {
44
- it('should export LLMService', () => {
45
- expect(LLMService).toBeDefined();
46
- expect(typeof LLMService).toBe('function');
47
- });
48
-
49
- it('should export LLM as alias for LLMService', () => {
50
- expect(LLM).toBeDefined();
51
- });
52
-
53
- it('should export SchemaExtractor', () => {
54
- expect(SchemaExtractor).toBeDefined();
55
- expect(typeof SchemaExtractor).toBe('function');
56
- });
57
-
58
- it('should export JSONOps', () => {
59
- expect(JSONOps).toBeDefined();
60
- expect(typeof JSONOps).toBe('function');
61
- });
62
-
63
- it('should export Embeddings', () => {
64
- expect(Embeddings).toBeDefined();
65
- expect(typeof Embeddings).toBe('function');
66
- });
67
-
68
- it('should export Council', () => {
69
- expect(Council).toBeDefined();
70
- expect(typeof Council).toBe('function');
71
- });
72
-
73
- it('should export TTS', () => {
74
- expect(TTS).toBeDefined();
75
- expect(typeof TTS).toBe('function');
76
- });
77
-
78
- it('should export VOICES constant', () => {
79
- expect(VOICES).toBeDefined();
80
- expect(VOICES.ALLOY).toBe('alloy');
81
- expect(VOICES.ECHO).toBe('echo');
82
- expect(VOICES.FABLE).toBe('fable');
83
- expect(VOICES.ONYX).toBe('onyx');
84
- expect(VOICES.NOVA).toBe('nova');
85
- expect(VOICES.SHIMMER).toBe('shimmer');
86
- });
87
-
88
- it('should export MODELS constant', () => {
89
- expect(MODELS).toBeDefined();
90
- expect(MODELS.TTS_1).toBe('tts-1');
91
- expect(MODELS.TTS_1_HD).toBe('tts-1-hd');
92
- });
93
-
94
- it('should export NLQuery', () => {
95
- expect(NLQuery).toBeDefined();
96
- expect(typeof NLQuery).toBe('function');
97
- });
98
-
99
- it('should export Classifier', () => {
100
- expect(Classifier).toBeDefined();
101
- expect(typeof Classifier).toBe('function');
102
- });
103
-
104
- it('should export SpatialAnalysis', () => {
105
- expect(SpatialAnalysis).toBeDefined();
106
- expect(typeof SpatialAnalysis).toBe('function');
107
- });
108
-
109
- it('should export SmartAggregation', () => {
110
- expect(SmartAggregation).toBeDefined();
111
- expect(typeof SmartAggregation).toBe('function');
112
- });
113
-
114
- it('should export FederationAdvisor', () => {
115
- expect(FederationAdvisor).toBeDefined();
116
- expect(typeof FederationAdvisor).toBe('function');
117
- });
118
-
119
- it('should export RelationshipDiscovery', () => {
120
- expect(RelationshipDiscovery).toBeDefined();
121
- expect(typeof RelationshipDiscovery).toBe('function');
122
- });
123
-
124
- it('should export TaskBreakdown', () => {
125
- expect(TaskBreakdown).toBeDefined();
126
- expect(typeof TaskBreakdown).toBe('function');
127
- });
128
-
129
- it('should export H3AI', () => {
130
- expect(H3AI).toBeDefined();
131
- expect(typeof H3AI).toBe('function');
132
- });
133
-
134
- it('should export createAIServices function', () => {
135
- expect(createAIServices).toBeDefined();
136
- expect(typeof createAIServices).toBe('function');
137
- });
138
- });
139
-
140
- describe('Default Export', () => {
141
- it('should have all service classes', () => {
142
- expect(AI.LLMService).toBe(LLMService);
143
- expect(AI.SchemaExtractor).toBe(SchemaExtractor);
144
- expect(AI.JSONOps).toBe(JSONOps);
145
- expect(AI.Embeddings).toBe(Embeddings);
146
- expect(AI.Council).toBe(Council);
147
- expect(AI.TTS).toBe(TTS);
148
- expect(AI.NLQuery).toBe(NLQuery);
149
- expect(AI.Classifier).toBe(Classifier);
150
- expect(AI.SpatialAnalysis).toBe(SpatialAnalysis);
151
- expect(AI.SmartAggregation).toBe(SmartAggregation);
152
- expect(AI.FederationAdvisor).toBe(FederationAdvisor);
153
- expect(AI.RelationshipDiscovery).toBe(RelationshipDiscovery);
154
- expect(AI.TaskBreakdown).toBe(TaskBreakdown);
155
- expect(AI.H3AI).toBe(H3AI);
156
- });
157
-
158
- it('should have constants', () => {
159
- expect(AI.VOICES).toBe(VOICES);
160
- expect(AI.MODELS).toBe(MODELS);
161
- });
162
-
163
- it('should have createAIServices', () => {
164
- expect(AI.createAIServices).toBe(createAIServices);
165
- });
166
- });
167
-
168
- describe('createAIServices', () => {
169
- let services;
170
-
171
- beforeEach(() => {
172
- vi.clearAllMocks();
173
- services = createAIServices('test-api-key');
174
- });
175
-
176
- it('should create LLM service', () => {
177
- expect(services.llm).toBeInstanceOf(LLMService);
178
- });
179
-
180
- it('should create OpenAI client', () => {
181
- expect(services.openai).toBeDefined();
182
- });
183
-
184
- it('should create Embeddings service', () => {
185
- expect(services.embeddings).toBeInstanceOf(Embeddings);
186
- });
187
-
188
- it('should create SchemaExtractor service', () => {
189
- expect(services.schemaExtractor).toBeInstanceOf(SchemaExtractor);
190
- });
191
-
192
- it('should create JSONOps service', () => {
193
- expect(services.jsonOps).toBeInstanceOf(JSONOps);
194
- });
195
-
196
- it('should create Council service', () => {
197
- expect(services.council).toBeInstanceOf(Council);
198
- });
199
-
200
- it('should create TTS service', () => {
201
- expect(services.tts).toBeInstanceOf(TTS);
202
- });
203
-
204
- it('should create NLQuery service', () => {
205
- expect(services.nlQuery).toBeInstanceOf(NLQuery);
206
- });
207
-
208
- it('should create Classifier service', () => {
209
- expect(services.classifier).toBeInstanceOf(Classifier);
210
- });
211
-
212
- it('should create SpatialAnalysis service', () => {
213
- expect(services.spatial).toBeInstanceOf(SpatialAnalysis);
214
- });
215
-
216
- it('should create SmartAggregation service', () => {
217
- expect(services.aggregation).toBeInstanceOf(SmartAggregation);
218
- });
219
-
220
- it('should create FederationAdvisor service', () => {
221
- expect(services.federationAdvisor).toBeInstanceOf(FederationAdvisor);
222
- });
223
-
224
- it('should create RelationshipDiscovery service', () => {
225
- expect(services.relationships).toBeInstanceOf(RelationshipDiscovery);
226
- });
227
-
228
- it('should create TaskBreakdown service', () => {
229
- expect(services.taskBreakdown).toBeInstanceOf(TaskBreakdown);
230
- });
231
-
232
- it('should create H3AI service', () => {
233
- expect(services.h3ai).toBeInstanceOf(H3AI);
234
- });
235
-
236
- it('should share LLM instance across services', () => {
237
- const llm = services.llm;
238
-
239
- // Services that use LLM should have the same instance
240
- expect(services.schemaExtractor.llm).toBe(llm);
241
- expect(services.jsonOps.llm).toBe(llm);
242
- expect(services.council.llm).toBe(llm);
243
- expect(services.nlQuery.llm).toBe(llm);
244
- expect(services.classifier.llm).toBe(llm);
245
- expect(services.spatial.llm).toBe(llm);
246
- expect(services.aggregation.llm).toBe(llm);
247
- expect(services.federationAdvisor.llm).toBe(llm);
248
- expect(services.relationships.llm).toBe(llm);
249
- expect(services.taskBreakdown.llm).toBe(llm);
250
- expect(services.h3ai.llm).toBe(llm);
251
- });
252
-
253
- it('should accept HoloSphere instance', () => {
254
- const mockHolosphere = { put: vi.fn(), getAll: vi.fn() };
255
- const servicesWithHS = createAIServices('test-key', mockHolosphere);
256
-
257
- expect(servicesWithHS.embeddings.holosphere).toBe(mockHolosphere);
258
- expect(servicesWithHS.nlQuery.holosphere).toBe(mockHolosphere);
259
- expect(servicesWithHS.classifier.holosphere).toBe(mockHolosphere);
260
- expect(servicesWithHS.spatial.holosphere).toBe(mockHolosphere);
261
- expect(servicesWithHS.aggregation.holosphere).toBe(mockHolosphere);
262
- expect(servicesWithHS.federationAdvisor.holosphere).toBe(mockHolosphere);
263
- expect(servicesWithHS.relationships.holosphere).toBe(mockHolosphere);
264
- expect(servicesWithHS.taskBreakdown.holosphere).toBe(mockHolosphere);
265
- expect(servicesWithHS.h3ai.holosphere).toBe(mockHolosphere);
266
- });
267
-
268
- it('should pass LLM options', () => {
269
- const servicesWithOptions = createAIServices('test-key', null, {
270
- llm: { model: 'gpt-4', temperature: 0.5 }
271
- });
272
-
273
- expect(servicesWithOptions.llm.model).toBe('gpt-4');
274
- expect(servicesWithOptions.llm.temperature).toBe(0.5);
275
- });
276
-
277
- it('should share embeddings with federation and relationship services', () => {
278
- expect(services.federationAdvisor.embeddings).toBe(services.embeddings);
279
- expect(services.relationships.embeddings).toBe(services.embeddings);
280
- });
281
- });
282
-
283
- describe('Service Integration', () => {
284
- it('should allow instantiating services individually', () => {
285
- const llm = new LLMService('test-key');
286
- const schemaExtractor = new SchemaExtractor(llm);
287
- const council = new Council(llm);
288
-
289
- expect(schemaExtractor.llm).toBe(llm);
290
- expect(council.llm).toBe(llm);
291
- });
292
-
293
- it('should allow creating partial service sets', () => {
294
- const llm = new LLMService('test-key');
295
-
296
- // Only create needed services
297
- const jsonOps = new JSONOps(llm);
298
- const classifier = new Classifier(llm);
299
-
300
- expect(jsonOps).toBeInstanceOf(JSONOps);
301
- expect(classifier).toBeInstanceOf(Classifier);
302
- });
303
- });
304
- });
@@ -1,307 +0,0 @@
1
- import { describe, it, expect, beforeEach, vi } from 'vitest';
2
- import { JSONOps } from '../../../src/ai/json-ops.js';
3
-
4
- describe('Unit: JSONOps', () => {
5
- let jsonOps;
6
- let mockLLM;
7
-
8
- beforeEach(() => {
9
- vi.clearAllMocks();
10
-
11
- mockLLM = {
12
- getJSON: vi.fn()
13
- };
14
-
15
- jsonOps = new JSONOps(mockLLM);
16
- });
17
-
18
- describe('Constructor', () => {
19
- it('should initialize with LLM service', () => {
20
- expect(jsonOps.llm).toBe(mockLLM);
21
- });
22
- });
23
-
24
- describe('add', () => {
25
- it('should semantically merge two objects', async () => {
26
- mockLLM.getJSON.mockResolvedValue({
27
- name: 'Combined Name',
28
- description: 'Merged description from both',
29
- tags: ['tag1', 'tag2', 'tag3']
30
- });
31
-
32
- const obj1 = { name: 'Name 1', tags: ['tag1'] };
33
- const obj2 = { description: 'Description', tags: ['tag2', 'tag3'] };
34
-
35
- const result = await jsonOps.add(obj1, obj2);
36
-
37
- expect(result.name).toBe('Combined Name');
38
- expect(result.tags).toContain('tag1');
39
- expect(mockLLM.getJSON).toHaveBeenCalledWith(
40
- expect.stringContaining('merge'),
41
- expect.stringContaining('Object 1'),
42
- expect.objectContaining({ temperature: 0.2 })
43
- );
44
- });
45
-
46
- it('should prefer second object when option set', async () => {
47
- mockLLM.getJSON.mockResolvedValue({ value: 'from obj2' });
48
-
49
- await jsonOps.add({ value: 'from obj1' }, { value: 'from obj2' }, { preferSecond: true });
50
-
51
- const call = mockLLM.getJSON.mock.calls[0];
52
- expect(call[0]).toContain('prefer the second object');
53
- });
54
- });
55
-
56
- describe('subtract', () => {
57
- it('should remove concepts from first object based on second', async () => {
58
- mockLLM.getJSON.mockResolvedValue({
59
- name: 'Remaining',
60
- uniqueField: 'kept'
61
- });
62
-
63
- const obj1 = { name: 'Remaining', description: 'To remove', uniqueField: 'kept' };
64
- const obj2 = { description: 'Similar description' };
65
-
66
- const result = await jsonOps.subtract(obj1, obj2);
67
-
68
- expect(result.name).toBe('Remaining');
69
- expect(result.uniqueField).toBe('kept');
70
- expect(result.description).toBeUndefined();
71
- });
72
- });
73
-
74
- describe('union', () => {
75
- it('should create semantic union with deduplication', async () => {
76
- mockLLM.getJSON.mockResolvedValue({
77
- items: ['unique1', 'unique2', 'common'],
78
- field1: 'from obj1',
79
- field2: 'from obj2'
80
- });
81
-
82
- const obj1 = { items: ['unique1', 'common'], field1: 'from obj1' };
83
- const obj2 = { items: ['unique2', 'common'], field2: 'from obj2' };
84
-
85
- const result = await jsonOps.union(obj1, obj2);
86
-
87
- expect(result.items).toHaveLength(3);
88
- expect(result.field1).toBeDefined();
89
- expect(result.field2).toBeDefined();
90
- });
91
- });
92
-
93
- describe('difference', () => {
94
- it('should find differences between objects', async () => {
95
- mockLLM.getJSON.mockResolvedValue({
96
- added: { newField: 'new value' },
97
- removed: { oldField: 'old value' },
98
- changed: { status: { old: 'active', new: 'completed' } }
99
- });
100
-
101
- const obj1 = { oldField: 'old value', status: 'active' };
102
- const obj2 = { newField: 'new value', status: 'completed' };
103
-
104
- const result = await jsonOps.difference(obj1, obj2);
105
-
106
- expect(result.added.newField).toBe('new value');
107
- expect(result.removed.oldField).toBe('old value');
108
- expect(result.changed.status.old).toBe('active');
109
- expect(result.changed.status.new).toBe('completed');
110
- });
111
- });
112
-
113
- describe('concatenate', () => {
114
- it('should concatenate objects by field type', async () => {
115
- mockLLM.getJSON.mockResolvedValue({
116
- text: 'First part. Second part.',
117
- items: [1, 2, 3, 4],
118
- count: 15,
119
- active: true
120
- });
121
-
122
- const obj1 = { text: 'First part.', items: [1, 2], count: 5, active: false };
123
- const obj2 = { text: 'Second part.', items: [3, 4], count: 10, active: true };
124
-
125
- const result = await jsonOps.concatenate(obj1, obj2);
126
-
127
- expect(result.text).toContain('First');
128
- expect(result.text).toContain('Second');
129
- expect(result.items).toHaveLength(4);
130
- expect(result.count).toBe(15);
131
- expect(result.active).toBe(true);
132
- });
133
- });
134
-
135
- describe('intersection', () => {
136
- it('should find common elements between objects', async () => {
137
- mockLLM.getJSON.mockResolvedValue({
138
- commonField: 'shared value',
139
- sharedTags: ['common']
140
- });
141
-
142
- const obj1 = { commonField: 'shared value', unique1: 'only in 1', sharedTags: ['common', 'unique1'] };
143
- const obj2 = { commonField: 'shared value', unique2: 'only in 2', sharedTags: ['common', 'unique2'] };
144
-
145
- const result = await jsonOps.intersection(obj1, obj2);
146
-
147
- expect(result.commonField).toBe('shared value');
148
- expect(result.sharedTags).toContain('common');
149
- });
150
- });
151
-
152
- describe('transform', () => {
153
- it('should transform object to new structure', async () => {
154
- mockLLM.getJSON.mockResolvedValue({
155
- fullName: 'John Doe',
156
- contact: {
157
- email: 'john@example.com',
158
- phone: '555-1234'
159
- }
160
- });
161
-
162
- const obj = {
163
- firstName: 'John',
164
- lastName: 'Doe',
165
- email: 'john@example.com',
166
- phone: '555-1234'
167
- };
168
-
169
- const result = await jsonOps.transform(obj, 'Combine names into fullName, group contact info');
170
-
171
- expect(result.fullName).toBe('John Doe');
172
- expect(result.contact.email).toBe('john@example.com');
173
- });
174
-
175
- it('should include target structure in prompt', async () => {
176
- mockLLM.getJSON.mockResolvedValue({});
177
-
178
- await jsonOps.transform({ data: 'test' }, 'Convert to array format');
179
-
180
- const call = mockLLM.getJSON.mock.calls[0];
181
- expect(call[0]).toContain('Convert to array format');
182
- });
183
- });
184
-
185
- describe('simplify', () => {
186
- it('should simplify nested object structure', async () => {
187
- mockLLM.getJSON.mockResolvedValue({
188
- name: 'Simple Name',
189
- value: 42,
190
- tags: ['a', 'b']
191
- });
192
-
193
- const obj = {
194
- nested: {
195
- deeply: {
196
- name: 'Simple Name'
197
- }
198
- },
199
- meta: {
200
- data: {
201
- value: 42
202
- }
203
- },
204
- emptyField: null,
205
- tags: ['a', 'b', '']
206
- };
207
-
208
- const result = await jsonOps.simplify(obj);
209
-
210
- expect(result.name).toBe('Simple Name');
211
- expect(result.emptyField).toBeUndefined();
212
- });
213
-
214
- it('should keep empty values when option set', async () => {
215
- mockLLM.getJSON.mockResolvedValue({ emptyField: null });
216
-
217
- await jsonOps.simplify({ emptyField: null }, { keepEmpty: true });
218
-
219
- const call = mockLLM.getJSON.mock.calls[0];
220
- expect(call[0]).toContain('unless specified to keep');
221
- });
222
- });
223
-
224
- describe('apply', () => {
225
- it('should apply natural language operation to object', async () => {
226
- mockLLM.getJSON.mockResolvedValue({
227
- title: 'Uppercase Title',
228
- status: 'ACTIVE'
229
- });
230
-
231
- const obj = { title: 'uppercase title', status: 'active' };
232
- const result = await jsonOps.apply(obj, 'Convert all string values to uppercase');
233
-
234
- expect(result.title).toBe('Uppercase Title');
235
- expect(result.status).toBe('ACTIVE');
236
- });
237
-
238
- it('should include operation in prompt', async () => {
239
- mockLLM.getJSON.mockResolvedValue({});
240
-
241
- await jsonOps.apply({ data: 1 }, 'Double all numbers');
242
-
243
- const call = mockLLM.getJSON.mock.calls[0];
244
- expect(call[0]).toContain('Double all numbers');
245
- });
246
-
247
- it('should handle complex operations', async () => {
248
- mockLLM.getJSON.mockResolvedValue({
249
- items: [
250
- { name: 'Item 1', active: true },
251
- { name: 'Item 2', active: true }
252
- ]
253
- });
254
-
255
- const obj = {
256
- items: [
257
- { name: 'Item 1', active: false },
258
- { name: 'Item 2', active: false }
259
- ]
260
- };
261
-
262
- const result = await jsonOps.apply(obj, 'Set all items to active');
263
-
264
- expect(result.items[0].active).toBe(true);
265
- expect(result.items[1].active).toBe(true);
266
- });
267
- });
268
-
269
- describe('Integration scenarios', () => {
270
- it('should chain operations', async () => {
271
- // First merge
272
- mockLLM.getJSON.mockResolvedValueOnce({
273
- name: 'Merged',
274
- tags: ['a', 'b', 'c']
275
- });
276
-
277
- const merged = await jsonOps.add(
278
- { name: 'First', tags: ['a'] },
279
- { name: 'Second', tags: ['b', 'c'] }
280
- );
281
-
282
- // Then simplify
283
- mockLLM.getJSON.mockResolvedValueOnce({
284
- name: 'Merged',
285
- tagCount: 3
286
- });
287
-
288
- const simplified = await jsonOps.transform(merged, 'Replace tags array with tagCount');
289
-
290
- expect(simplified.tagCount).toBe(3);
291
- });
292
-
293
- it('should handle empty objects', async () => {
294
- mockLLM.getJSON.mockResolvedValue({});
295
-
296
- const result = await jsonOps.add({}, {});
297
- expect(result).toEqual({});
298
- });
299
-
300
- it('should handle arrays as root', async () => {
301
- mockLLM.getJSON.mockResolvedValue([1, 2, 3, 4, 5]);
302
-
303
- const result = await jsonOps.union([1, 2, 3], [3, 4, 5]);
304
- expect(result).toEqual([1, 2, 3, 4, 5]);
305
- });
306
- });
307
- });