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.
- package/CHANGELOG.md +473 -0
- package/FEATURES.md +431 -0
- package/LICENSE +29 -166
- package/LICENSE-AGPL.md +180 -0
- package/README.md +97 -16
- package/dist/2019-D2OG2idw.js +6680 -0
- package/dist/2019-D2OG2idw.js.map +1 -0
- package/dist/2019-EION3wKo.cjs +8 -0
- package/dist/2019-EION3wKo.cjs.map +1 -0
- package/dist/_commonjsHelpers-C37NGDzP.cjs +2 -0
- package/dist/_commonjsHelpers-C37NGDzP.cjs.map +1 -0
- package/dist/_commonjsHelpers-CUmg6egw.js +7 -0
- package/dist/_commonjsHelpers-CUmg6egw.js.map +1 -0
- package/dist/browser-BSniCNqO.js +3058 -0
- package/dist/browser-BSniCNqO.js.map +1 -0
- package/dist/browser-Cq59Ij19.cjs +2 -0
- package/dist/browser-Cq59Ij19.cjs.map +1 -0
- package/dist/cdn/holosphere.min.js +55 -0
- package/dist/cdn/holosphere.min.js.map +1 -0
- package/dist/cjs/holosphere.cjs +2 -0
- package/dist/cjs/holosphere.cjs.map +1 -0
- package/dist/esm/holosphere.js +53 -0
- package/dist/esm/holosphere.js.map +1 -0
- package/dist/index-DDGt_V9o.cjs +12 -0
- package/dist/index-DDGt_V9o.cjs.map +1 -0
- package/dist/index-DJXftyvB.js +39841 -0
- package/dist/index-DJXftyvB.js.map +1 -0
- package/dist/index-DMbdcMtK.cjs +18 -0
- package/dist/index-DMbdcMtK.cjs.map +1 -0
- package/dist/index-DeZ1xz_s.js +15104 -0
- package/dist/index-DeZ1xz_s.js.map +1 -0
- package/dist/indexeddb-storage-BFt6hMeF.js +176 -0
- package/dist/indexeddb-storage-BFt6hMeF.js.map +1 -0
- package/dist/indexeddb-storage-BK5tv4Sh.cjs +2 -0
- package/dist/indexeddb-storage-BK5tv4Sh.cjs.map +1 -0
- package/dist/memory-storage-C9HuoL2E.js +91 -0
- package/dist/memory-storage-C9HuoL2E.js.map +1 -0
- package/dist/memory-storage-Dao7jfYG.cjs +2 -0
- package/dist/memory-storage-Dao7jfYG.cjs.map +1 -0
- package/dist/secp256k1-BbKzbLtD.cjs +12 -0
- package/dist/secp256k1-BbKzbLtD.cjs.map +1 -0
- package/dist/secp256k1-CreY7Pcl.js +1890 -0
- package/dist/secp256k1-CreY7Pcl.js.map +1 -0
- package/docs/CONTRACTS.md +797 -0
- package/docs/FOSDEM_PROPOSAL.md +388 -0
- package/docs/LOCALFIRST.md +266 -0
- package/docs/api/ai_aggregation.js.html +333 -0
- package/docs/api/ai_breakdown.js.html +524 -0
- package/docs/api/ai_classifier.js.html +231 -0
- package/docs/api/ai_council.js.html +246 -0
- package/docs/api/ai_embeddings.js.html +304 -0
- package/docs/api/ai_federation-ai.js.html +338 -0
- package/docs/api/ai_h3-ai.js.html +970 -0
- package/docs/api/ai_index.js.html +124 -0
- package/docs/api/ai_json-ops.js.html +241 -0
- package/docs/api/ai_llm-service.js.html +239 -0
- package/docs/api/ai_nl-query.js.html +236 -0
- package/docs/api/ai_relationships.js.html +367 -0
- package/docs/api/ai_schema-extractor.js.html +235 -0
- package/docs/api/ai_spatial.js.html +307 -0
- package/docs/api/ai_tts.js.html +214 -0
- package/docs/api/content_social-protocols.js.html +180 -0
- package/docs/api/core_holosphere.js.html +757 -0
- package/docs/api/crypto_nostr-utils.js.html +306 -0
- package/docs/api/crypto_secp256k1.js.html +267 -0
- package/docs/api/data/search.json +1 -0
- package/docs/api/federation_discovery.js.html +337 -0
- package/docs/api/federation_handshake.js.html +478 -0
- package/docs/api/federation_hologram.js.html +1053 -0
- package/docs/api/federation_registry.js.html +389 -0
- package/docs/api/fonts/Inconsolata-Regular.ttf +0 -0
- package/docs/api/fonts/OpenSans-Regular.ttf +0 -0
- package/docs/api/fonts/WorkSans-Bold.ttf +0 -0
- package/docs/api/global.html +3 -0
- package/docs/api/hierarchical_upcast.js.html +128 -0
- package/docs/api/index.html +265 -0
- package/docs/api/index.js.html +1868 -0
- package/docs/api/lib_ai-methods.js.html +660 -0
- package/docs/api/lib_contract-methods.js.html +445 -0
- package/docs/api/lib_errors.js.html +56 -0
- package/docs/api/lib_federation-methods.js.html +348 -0
- package/docs/api/lib_index.js.html +33 -0
- package/docs/api/module-ai.html +5 -0
- package/docs/api/module-ai_aggregation-SmartAggregation.html +6 -0
- package/docs/api/module-ai_aggregation.SmartAggregation.html +3 -0
- package/docs/api/module-ai_aggregation.html +3 -0
- package/docs/api/module-ai_breakdown-TaskBreakdown.html +5 -0
- package/docs/api/module-ai_breakdown.TaskBreakdown.html +3 -0
- package/docs/api/module-ai_breakdown.html +3 -0
- package/docs/api/module-ai_classifier-Classifier.html +6 -0
- package/docs/api/module-ai_classifier.Classifier.html +3 -0
- package/docs/api/module-ai_classifier.html +3 -0
- package/docs/api/module-ai_council-Council.html +6 -0
- package/docs/api/module-ai_council.Council.html +3 -0
- package/docs/api/module-ai_council.html +3 -0
- package/docs/api/module-ai_embeddings-Embeddings.html +5 -0
- package/docs/api/module-ai_embeddings.Embeddings.html +3 -0
- package/docs/api/module-ai_embeddings.html +3 -0
- package/docs/api/module-ai_federation-ai-FederationAdvisor.html +6 -0
- package/docs/api/module-ai_federation-ai.FederationAdvisor.html +3 -0
- package/docs/api/module-ai_federation-ai.html +3 -0
- package/docs/api/module-ai_h3-ai-H3AI.html +6 -0
- package/docs/api/module-ai_h3-ai.H3AI.html +3 -0
- package/docs/api/module-ai_h3-ai.html +3 -0
- package/docs/api/module-ai_json-ops-JSONOps.html +5 -0
- package/docs/api/module-ai_json-ops.JSONOps.html +3 -0
- package/docs/api/module-ai_json-ops.html +3 -0
- package/docs/api/module-ai_llm-service-LLMService.html +5 -0
- package/docs/api/module-ai_llm-service.LLMService.html +3 -0
- package/docs/api/module-ai_llm-service.html +3 -0
- package/docs/api/module-ai_nl-query-NLQuery.html +5 -0
- package/docs/api/module-ai_nl-query.NLQuery.html +3 -0
- package/docs/api/module-ai_nl-query.html +3 -0
- package/docs/api/module-ai_relationships-RelationshipDiscovery.html +6 -0
- package/docs/api/module-ai_relationships.RelationshipDiscovery.html +3 -0
- package/docs/api/module-ai_relationships.html +3 -0
- package/docs/api/module-ai_schema-extractor-SchemaExtractor.html +5 -0
- package/docs/api/module-ai_schema-extractor.SchemaExtractor.html +3 -0
- package/docs/api/module-ai_schema-extractor.html +3 -0
- package/docs/api/module-ai_spatial-SpatialAnalysis.html +6 -0
- package/docs/api/module-ai_spatial.SpatialAnalysis.html +3 -0
- package/docs/api/module-ai_spatial.html +3 -0
- package/docs/api/module-ai_tts-TTS.html +5 -0
- package/docs/api/module-ai_tts.TTS.html +3 -0
- package/docs/api/module-ai_tts.html +3 -0
- package/docs/api/module-content_social-protocols.html +3 -0
- package/docs/api/module-core_holosphere-HoloSphere.html +6 -0
- package/docs/api/module-core_holosphere.HoloSphere.html +3 -0
- package/docs/api/module-core_holosphere.html +3 -0
- package/docs/api/module-crypto_nostr-utils.html +3 -0
- package/docs/api/module-crypto_secp256k1.html +3 -0
- package/docs/api/module-federation_hologram.html +3 -0
- package/docs/api/module-hierarchical_upcast.html +3 -0
- package/docs/api/module-holosphere-HoloSphereBase.html +3 -0
- package/docs/api/module-holosphere.html +3 -0
- package/docs/api/module-lib_ai-methods.html +3 -0
- package/docs/api/module-lib_contract-methods.html +3 -0
- package/docs/api/module-lib_errors-AuthorizationError.html +3 -0
- package/docs/api/module-lib_errors-ValidationError.html +3 -0
- package/docs/api/module-lib_errors.AuthorizationError.html +3 -0
- package/docs/api/module-lib_errors.ValidationError.html +3 -0
- package/docs/api/module-lib_errors.html +3 -0
- package/docs/api/module-lib_federation-methods.html +3 -0
- package/docs/api/module-lib_index.html +3 -0
- package/docs/api/module-schema_validator-ValidationError.html +3 -0
- package/docs/api/module-schema_validator.ValidationError.html +3 -0
- package/docs/api/module-schema_validator.html +3 -0
- package/docs/api/module-spatial_h3-operations.html +4 -0
- package/docs/api/module-storage_backend-factory.BackendFactory.html +3 -0
- package/docs/api/module-storage_backend-factory.html +3 -0
- package/docs/api/module-storage_backend-interface-StorageBackend.html +3 -0
- package/docs/api/module-storage_backend-interface.StorageBackend.html +3 -0
- package/docs/api/module-storage_backend-interface.html +3 -0
- package/docs/api/module-storage_backends_activitypub-backend-ActivityPubBackend.html +7 -0
- package/docs/api/module-storage_backends_activitypub-backend.ActivityPubBackend.html +3 -0
- package/docs/api/module-storage_backends_activitypub-backend.html +3 -0
- package/docs/api/module-storage_backends_activitypub_server-ActivityPubServer.html +8 -0
- package/docs/api/module-storage_backends_activitypub_server.ActivityPubServer.html +3 -0
- package/docs/api/module-storage_backends_activitypub_server.html +3 -0
- package/docs/api/module-storage_backends_gundb-backend-GunDBBackend.html +7 -0
- package/docs/api/module-storage_backends_gundb-backend.GunDBBackend.html +3 -0
- package/docs/api/module-storage_backends_gundb-backend.html +3 -0
- package/docs/api/module-storage_backends_nostr-backend-NostrBackend.html +8 -0
- package/docs/api/module-storage_backends_nostr-backend.NostrBackend.html +3 -0
- package/docs/api/module-storage_backends_nostr-backend.html +3 -0
- package/docs/api/module-storage_filesystem-storage-FileSystemStorage.html +5 -0
- package/docs/api/module-storage_filesystem-storage-browser-FileSystemStorage.html +3 -0
- package/docs/api/module-storage_filesystem-storage-browser.FileSystemStorage.html +3 -0
- package/docs/api/module-storage_filesystem-storage-browser.html +3 -0
- package/docs/api/module-storage_filesystem-storage.FileSystemStorage.html +3 -0
- package/docs/api/module-storage_filesystem-storage.html +3 -0
- package/docs/api/module-storage_global-tables.html +3 -0
- package/docs/api/module-storage_gun-async.html +3 -0
- package/docs/api/module-storage_gun-auth-GunAuth.html +5 -0
- package/docs/api/module-storage_gun-auth.GunAuth.html +3 -0
- package/docs/api/module-storage_gun-auth.html +3 -0
- package/docs/api/module-storage_gun-federation.html +3 -0
- package/docs/api/module-storage_gun-references-GunReferenceHandler.html +5 -0
- package/docs/api/module-storage_gun-references.GunReferenceHandler.html +3 -0
- package/docs/api/module-storage_gun-references.html +3 -0
- package/docs/api/module-storage_gun-schema-GunSchemaValidator.html +5 -0
- package/docs/api/module-storage_gun-schema.GunSchemaValidator.html +3 -0
- package/docs/api/module-storage_gun-schema.html +3 -0
- package/docs/api/module-storage_gun-wrapper.html +11 -0
- package/docs/api/module-storage_indexeddb-storage-IndexedDBStorage.html +5 -0
- package/docs/api/module-storage_indexeddb-storage.IndexedDBStorage.html +3 -0
- package/docs/api/module-storage_indexeddb-storage.html +3 -0
- package/docs/api/module-storage_key-storage-simple.html +3 -0
- package/docs/api/module-storage_key-storage.html +4 -0
- package/docs/api/module-storage_memory-storage-MemoryStorage.html +5 -0
- package/docs/api/module-storage_memory-storage.MemoryStorage.html +3 -0
- package/docs/api/module-storage_memory-storage.html +3 -0
- package/docs/api/module-storage_migration-MigrationTool.html +6 -0
- package/docs/api/module-storage_migration.MigrationTool.html +3 -0
- package/docs/api/module-storage_migration.html +3 -0
- package/docs/api/module-storage_nostr-async.html +18 -0
- package/docs/api/module-storage_nostr-client-LRUCache.html +3 -0
- package/docs/api/module-storage_nostr-client-NostrClient.html +7 -0
- package/docs/api/module-storage_nostr-client.NostrClient.html +15 -0
- package/docs/api/module-storage_nostr-client.html +6 -0
- package/docs/api/module-storage_nostr-wrapper.html +3 -0
- package/docs/api/module-storage_outbox-queue-OutboxQueue.html +4 -0
- package/docs/api/module-storage_outbox-queue.OutboxQueue.html +3 -0
- package/docs/api/module-storage_outbox-queue.html +3 -0
- package/docs/api/module-storage_persistent-storage-PersistentStorage.html +3 -0
- package/docs/api/module-storage_persistent-storage.html +4 -0
- package/docs/api/module-storage_sync-service-SyncService.html +5 -0
- package/docs/api/module-storage_sync-service.SyncService.html +3 -0
- package/docs/api/module-storage_sync-service.html +3 -0
- package/docs/api/module-storage_unified-storage.html +3 -0
- package/docs/api/module-subscriptions_manager.SubscriptionRegistry.html +3 -0
- package/docs/api/module-subscriptions_manager.html +3 -0
- package/docs/api/schema_validator.js.html +113 -0
- package/docs/api/scripts/core.js +726 -0
- package/docs/api/scripts/core.min.js +23 -0
- package/docs/api/scripts/resize.js +90 -0
- package/docs/api/scripts/search.js +265 -0
- package/docs/api/scripts/search.min.js +6 -0
- package/docs/api/scripts/third-party/Apache-License-2.0.txt +202 -0
- package/docs/api/scripts/third-party/fuse.js +9 -0
- package/docs/api/scripts/third-party/hljs-line-num-original.js +369 -0
- package/docs/api/scripts/third-party/hljs-line-num.js +1 -0
- package/docs/api/scripts/third-party/hljs-original.js +5171 -0
- package/docs/api/scripts/third-party/hljs.js +1 -0
- package/docs/api/scripts/third-party/popper.js +5 -0
- package/docs/api/scripts/third-party/tippy.js +1 -0
- package/docs/api/scripts/third-party/tocbot.js +672 -0
- package/docs/api/scripts/third-party/tocbot.min.js +1 -0
- package/docs/api/spatial_h3-operations.js.html +129 -0
- package/docs/api/storage_backend-factory.js.html +133 -0
- package/docs/api/storage_backend-interface.js.html +164 -0
- package/docs/api/storage_backends_activitypub-backend.js.html +298 -0
- package/docs/api/storage_backends_activitypub_server.js.html +678 -0
- package/docs/api/storage_backends_gundb-backend.js.html +878 -0
- package/docs/api/storage_backends_nostr-backend.js.html +254 -0
- package/docs/api/storage_filesystem-storage-browser.js.html +83 -0
- package/docs/api/storage_filesystem-storage.js.html +207 -0
- package/docs/api/storage_global-tables.js.html +116 -0
- package/docs/api/storage_gun-async.js.html +344 -0
- package/docs/api/storage_gun-auth.js.html +376 -0
- package/docs/api/storage_gun-federation.js.html +788 -0
- package/docs/api/storage_gun-references.js.html +212 -0
- package/docs/api/storage_gun-schema.js.html +309 -0
- package/docs/api/storage_gun-wrapper.js.html +645 -0
- package/docs/api/storage_indexeddb-storage.js.html +224 -0
- package/docs/api/storage_key-storage-simple.js.html +102 -0
- package/docs/api/storage_key-storage.js.html +171 -0
- package/docs/api/storage_memory-storage.js.html +128 -0
- package/docs/api/storage_migration.js.html +354 -0
- package/docs/api/storage_nostr-async.js.html +1076 -0
- package/docs/api/storage_nostr-client.js.html +1598 -0
- package/docs/api/storage_nostr-wrapper.js.html +218 -0
- package/docs/api/storage_outbox-queue.js.html +248 -0
- package/docs/api/storage_persistent-storage.js.html +160 -0
- package/docs/api/storage_sync-service.js.html +201 -0
- package/docs/api/storage_unified-storage.js.html +157 -0
- package/docs/api/styles/clean-jsdoc-theme-base.css +1159 -0
- package/docs/api/styles/clean-jsdoc-theme-dark.css +412 -0
- package/docs/api/styles/clean-jsdoc-theme-light.css +482 -0
- package/docs/api/styles/clean-jsdoc-theme-scrollbar.css +30 -0
- package/docs/api/styles/clean-jsdoc-theme-without-scrollbar.min.css +1 -0
- package/docs/api/styles/clean-jsdoc-theme.min.css +1 -0
- package/docs/api/subscriptions_manager.js.html +162 -0
- package/docs/contracts/api-interface.md +793 -0
- package/docs/data-model.md +476 -0
- package/docs/gun-async-usage.md +338 -0
- package/docs/plan.md +349 -0
- package/docs/quickstart.md +674 -0
- package/docs/research.md +362 -0
- package/docs/spec.md +244 -0
- package/docs/storage-backends.md +326 -0
- package/docs/tasks.md +947 -0
- package/examples/demo.html +47 -0
- package/examples/holosphere-widget.js +1242 -0
- package/examples/widget-demo.html +274 -0
- package/examples/widget.html +703 -0
- package/jsdoc.json +26 -0
- package/package.json +25 -7
- package/src/ai/aggregation.js +13 -2
- package/src/ai/breakdown.js +12 -2
- package/src/ai/classifier.js +14 -3
- package/src/ai/council.js +22 -7
- package/src/ai/embeddings.js +37 -15
- package/src/ai/federation-ai.js +13 -2
- package/src/ai/h3-ai.js +14 -2
- package/src/ai/index.js +16 -7
- package/src/ai/json-ops.js +18 -5
- package/src/ai/llm-service.js +62 -31
- package/src/ai/nl-query.js +12 -2
- package/src/ai/relationships.js +13 -2
- package/src/ai/schema-extractor.js +24 -10
- package/src/ai/spatial.js +13 -2
- package/src/ai/tts.js +25 -8
- package/src/cdn-entry.js +22 -0
- package/src/content/social-protocols.js +34 -25
- package/src/contracts/abis/Appreciative.json +1280 -0
- package/src/contracts/abis/AppreciativeFactory.json +101 -0
- package/src/contracts/abis/Bundle.json +1438 -0
- package/src/contracts/abis/BundleFactory.json +106 -0
- package/src/contracts/abis/Holon.json +881 -0
- package/src/contracts/abis/Holons.json +330 -0
- package/src/contracts/abis/Managed.json +1262 -0
- package/src/contracts/abis/ManagedFactory.json +149 -0
- package/src/contracts/abis/Membrane.json +261 -0
- package/src/contracts/abis/Splitter.json +1624 -0
- package/src/contracts/abis/SplitterFactory.json +220 -0
- package/src/contracts/abis/TestToken.json +321 -0
- package/src/contracts/abis/Zoned.json +1461 -0
- package/src/contracts/abis/ZonedFactory.json +154 -0
- package/src/contracts/chain-manager.js +403 -0
- package/src/contracts/deployer.js +500 -0
- package/src/contracts/event-listener.js +539 -0
- package/src/contracts/holon-contracts.js +359 -0
- package/src/contracts/index.js +82 -0
- package/src/contracts/networks.js +229 -0
- package/src/contracts/operations.js +687 -0
- package/src/contracts/queries.js +638 -0
- package/src/core/holosphere.js +487 -6
- package/src/crypto/nostr-utils.js +303 -0
- package/src/crypto/secp256k1.js +7 -2
- package/src/federation/handshake.js +475 -0
- package/src/federation/hologram.js +117 -3
- package/src/hierarchical/upcast.js +40 -25
- package/src/index.js +1501 -1909
- package/src/lib/ai-methods.js +657 -0
- package/src/lib/contract-methods.js +442 -0
- package/src/lib/errors.js +53 -0
- package/src/lib/federation-methods.js +345 -0
- package/src/lib/index.js +30 -0
- package/src/schema/validator.js +22 -3
- package/src/spatial/h3-operations.js +19 -3
- package/src/storage/backend-factory.js +7 -2
- package/src/storage/backend-interface.js +21 -2
- package/src/storage/backends/activitypub/server.js +25 -3
- package/src/storage/backends/activitypub-backend.js +25 -2
- package/src/storage/backends/gundb-backend.js +692 -50
- package/src/storage/backends/nostr-backend.js +116 -1
- package/src/storage/filesystem-storage-browser.js +42 -2
- package/src/storage/filesystem-storage.js +72 -5
- package/src/storage/global-tables.js +35 -3
- package/src/storage/gun-async.js +75 -15
- package/src/storage/gun-auth.js +373 -0
- package/src/storage/gun-federation.js +785 -0
- package/src/storage/gun-references.js +209 -0
- package/src/storage/gun-schema.js +306 -0
- package/src/storage/gun-wrapper.js +475 -54
- package/src/storage/indexeddb-storage.js +112 -13
- package/src/storage/key-storage-simple.js +32 -9
- package/src/storage/key-storage.js +45 -13
- package/src/storage/memory-storage.js +68 -2
- package/src/storage/migration.js +20 -7
- package/src/storage/nostr-async.js +412 -122
- package/src/storage/nostr-client.js +749 -76
- package/src/storage/nostr-wrapper.js +6 -2
- package/src/storage/outbox-queue.js +55 -18
- package/src/storage/persistent-storage.js +62 -14
- package/src/storage/sync-service.js +51 -17
- package/src/storage/unified-storage.js +154 -0
- package/src/subscriptions/manager.js +34 -17
- package/types/index.d.ts +133 -0
- package/vite.config.cdn.js +60 -0
- package/tests/unit/ai/aggregation.test.js +0 -295
- package/tests/unit/ai/breakdown.test.js +0 -446
- package/tests/unit/ai/classifier.test.js +0 -294
- package/tests/unit/ai/council.test.js +0 -262
- package/tests/unit/ai/embeddings.test.js +0 -384
- package/tests/unit/ai/federation-ai.test.js +0 -344
- package/tests/unit/ai/h3-ai.test.js +0 -458
- package/tests/unit/ai/index.test.js +0 -304
- package/tests/unit/ai/json-ops.test.js +0 -307
- package/tests/unit/ai/llm-service.test.js +0 -390
- package/tests/unit/ai/nl-query.test.js +0 -383
- package/tests/unit/ai/relationships.test.js +0 -311
- package/tests/unit/ai/schema-extractor.test.js +0 -384
- package/tests/unit/ai/spatial.test.js +0 -279
- package/tests/unit/ai/tts.test.js +0 -279
- package/tests/unit/content.test.js +0 -332
- package/tests/unit/contract/core.test.js +0 -88
- package/tests/unit/contract/crypto.test.js +0 -198
- package/tests/unit/contract/data.test.js +0 -223
- package/tests/unit/contract/federation.test.js +0 -181
- package/tests/unit/contract/hierarchical.test.js +0 -113
- package/tests/unit/contract/schema.test.js +0 -114
- package/tests/unit/contract/social.test.js +0 -217
- package/tests/unit/contract/spatial.test.js +0 -110
- package/tests/unit/contract/subscriptions.test.js +0 -128
- package/tests/unit/contract/utils.test.js +0 -159
- package/tests/unit/core.test.js +0 -152
- package/tests/unit/crypto.test.js +0 -328
- package/tests/unit/federation.test.js +0 -234
- package/tests/unit/gun-async.test.js +0 -252
- package/tests/unit/hierarchical.test.js +0 -399
- package/tests/unit/integration/scenario-01-geographic-storage.test.js +0 -74
- package/tests/unit/integration/scenario-02-federation.test.js +0 -76
- package/tests/unit/integration/scenario-03-subscriptions.test.js +0 -102
- package/tests/unit/integration/scenario-04-validation.test.js +0 -129
- package/tests/unit/integration/scenario-05-hierarchy.test.js +0 -125
- package/tests/unit/integration/scenario-06-social.test.js +0 -135
- package/tests/unit/integration/scenario-07-persistence.test.js +0 -130
- package/tests/unit/integration/scenario-08-authorization.test.js +0 -161
- package/tests/unit/integration/scenario-09-cross-dimensional.test.js +0 -139
- package/tests/unit/integration/scenario-10-cross-holosphere-capabilities.test.js +0 -357
- package/tests/unit/integration/scenario-11-cross-holosphere-federation.test.js +0 -410
- package/tests/unit/integration/scenario-12-capability-federated-read.test.js +0 -719
- package/tests/unit/performance/benchmark.test.js +0 -85
- package/tests/unit/schema.test.js +0 -213
- package/tests/unit/spatial.test.js +0 -158
- package/tests/unit/storage.test.js +0 -195
- package/tests/unit/subscriptions.test.js +0 -328
- package/tests/unit/test-data-permanence-debug.js +0 -197
- package/tests/unit/test-data-permanence.js +0 -340
- package/tests/unit/test-key-persistence-fixed.js +0 -148
- package/tests/unit/test-key-persistence.js +0 -172
- package/tests/unit/test-relay-permanence.js +0 -376
- package/tests/unit/test-second-node.js +0 -95
- package/tests/unit/test-simple-write.js +0 -89
- /package/{cleanup-test-data.js → scripts/cleanup-test-data.js} +0 -0
- /package/{test-ai-real-api.js → scripts/test-ai-real-api.js} +0 -0
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Browser-compatible Nostr utility functions for key handling, encryption, and event management.
|
|
3
|
+
* Provides NIP-04 (legacy) and NIP-44 (modern, audited) encryption support, key conversion utilities,
|
|
4
|
+
* and event creation helpers. Applications can use these utilities without directly importing nostr-tools.
|
|
5
|
+
* @module crypto/nostr-utils
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { nip04, nip44, nip19, getPublicKey as nostrGetPublicKey, finalizeEvent, verifyEvent as nostrVerifyEvent } from 'nostr-tools';
|
|
9
|
+
|
|
10
|
+
// ============================================================================
|
|
11
|
+
// Key Conversion Utilities
|
|
12
|
+
// ============================================================================
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Convert hex string to Uint8Array.
|
|
16
|
+
* @param {string} hex - Hexadecimal string (even length)
|
|
17
|
+
* @returns {Uint8Array} Byte array representation
|
|
18
|
+
*/
|
|
19
|
+
export function hexToBytes(hex) {
|
|
20
|
+
const bytes = new Uint8Array(hex.length / 2);
|
|
21
|
+
for (let i = 0; i < hex.length; i += 2) {
|
|
22
|
+
bytes[i / 2] = parseInt(hex.substr(i, 2), 16);
|
|
23
|
+
}
|
|
24
|
+
return bytes;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Convert Uint8Array to hex string.
|
|
29
|
+
* @param {Uint8Array} bytes - Byte array to convert
|
|
30
|
+
* @returns {string} Hexadecimal string representation
|
|
31
|
+
*/
|
|
32
|
+
export function bytesToHex(bytes) {
|
|
33
|
+
return Array.from(bytes)
|
|
34
|
+
.map((b) => b.toString(16).padStart(2, '0'))
|
|
35
|
+
.join('');
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Parse an npub or hex public key string into hex format.
|
|
40
|
+
* Handles nostr: URI prefix and validates both npub and hex formats.
|
|
41
|
+
* @param {string} input - npub string (npub1...) or 64-character hex public key
|
|
42
|
+
* @returns {Object} Validation result with valid, hexPubKey (if valid), error (if invalid)
|
|
43
|
+
*/
|
|
44
|
+
export function parseNpubOrHex(input) {
|
|
45
|
+
const trimmed = input?.trim();
|
|
46
|
+
|
|
47
|
+
if (!trimmed) {
|
|
48
|
+
return { valid: false, error: 'Public key is required' };
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Check if it's already hex (64 characters)
|
|
52
|
+
if (/^[0-9a-fA-F]{64}$/.test(trimmed)) {
|
|
53
|
+
return { valid: true, hexPubKey: trimmed.toLowerCase() };
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Handle nostr: URI prefix
|
|
57
|
+
let npubString = trimmed;
|
|
58
|
+
if (npubString.startsWith('nostr:')) {
|
|
59
|
+
npubString = npubString.slice(6);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Try to decode as npub
|
|
63
|
+
if (npubString.startsWith('npub1')) {
|
|
64
|
+
try {
|
|
65
|
+
const decoded = nip19.decode(npubString);
|
|
66
|
+
if (decoded.type === 'npub') {
|
|
67
|
+
return { valid: true, hexPubKey: decoded.data };
|
|
68
|
+
}
|
|
69
|
+
return { valid: false, error: 'Invalid npub format' };
|
|
70
|
+
} catch (e) {
|
|
71
|
+
return { valid: false, error: 'Invalid npub: unable to decode' };
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return { valid: false, error: 'Enter a valid npub (npub1...) or 64-character hex public key' };
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Convert a hex public key to npub format.
|
|
80
|
+
* @param {string} hexPubKey - Hex public key (64 characters)
|
|
81
|
+
* @returns {string} npub-encoded public key (npub1...)
|
|
82
|
+
*/
|
|
83
|
+
export function hexToNpub(hexPubKey) {
|
|
84
|
+
try {
|
|
85
|
+
return nip19.npubEncode(hexPubKey);
|
|
86
|
+
} catch (e) {
|
|
87
|
+
console.error('Failed to encode hex to npub:', e);
|
|
88
|
+
return hexPubKey; // Return original on error
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Convert npub to hex public key.
|
|
94
|
+
* @param {string} npub - npub-encoded public key string
|
|
95
|
+
* @returns {string|null} 64-character hex public key or null if invalid
|
|
96
|
+
*/
|
|
97
|
+
export function npubToHex(npub) {
|
|
98
|
+
try {
|
|
99
|
+
const decoded = nip19.decode(npub);
|
|
100
|
+
if (decoded.type === 'npub') {
|
|
101
|
+
return decoded.data;
|
|
102
|
+
}
|
|
103
|
+
return null;
|
|
104
|
+
} catch (e) {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Shorten a public key for display (first 8 and last 8 chars).
|
|
111
|
+
* @param {string} pubKey - Public key in hex or npub format
|
|
112
|
+
* @returns {string} Shortened key with ellipsis (e.g., 'abcd1234...wxyz9876')
|
|
113
|
+
*/
|
|
114
|
+
export function shortenPubKey(pubKey) {
|
|
115
|
+
if (!pubKey || pubKey.length <= 20) return pubKey || '';
|
|
116
|
+
return `${pubKey.slice(0, 8)}...${pubKey.slice(-8)}`;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Shorten an npub for display (first 12 and last 8 chars).
|
|
121
|
+
* @param {string} npub - npub-encoded public key
|
|
122
|
+
* @returns {string} Shortened npub with ellipsis
|
|
123
|
+
*/
|
|
124
|
+
export function shortenNpub(npub) {
|
|
125
|
+
if (!npub || npub.length <= 20) return npub || '';
|
|
126
|
+
return `${npub.slice(0, 12)}...${npub.slice(-8)}`;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Derive public key from private key using secp256k1.
|
|
131
|
+
* Matches nostr-tools getPublicKey API.
|
|
132
|
+
* @param {string} privateKey - 64-character hex private key
|
|
133
|
+
* @returns {string} Derived 64-character hex public key
|
|
134
|
+
*/
|
|
135
|
+
export function getPublicKey(privateKey) {
|
|
136
|
+
return nostrGetPublicKey(hexToBytes(privateKey));
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// ============================================================================
|
|
140
|
+
// NIP-04 Encryption
|
|
141
|
+
// ============================================================================
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Encrypt a message using NIP-04 (legacy DM encryption).
|
|
145
|
+
* Uses AES-256-CBC with base64 encoding. Consider using NIP-44 for new implementations.
|
|
146
|
+
* @param {string} privateKey - Sender's 64-character hex private key
|
|
147
|
+
* @param {string} recipientPubKey - Recipient's 64-character hex public key
|
|
148
|
+
* @param {string} content - Plain text message content
|
|
149
|
+
* @returns {Promise<string>} NIP-04 encrypted content string
|
|
150
|
+
*/
|
|
151
|
+
export async function encryptNIP04(privateKey, recipientPubKey, content) {
|
|
152
|
+
return await nip04.encrypt(privateKey, recipientPubKey, content);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Decrypt a NIP-04 encrypted message.
|
|
157
|
+
* @param {string} privateKey - Recipient's 64-character hex private key
|
|
158
|
+
* @param {string} senderPubKey - Sender's 64-character hex public key
|
|
159
|
+
* @param {string} encryptedContent - NIP-04 encrypted content string
|
|
160
|
+
* @returns {Promise<string>} Decrypted plain text content
|
|
161
|
+
*/
|
|
162
|
+
export async function decryptNIP04(privateKey, senderPubKey, encryptedContent) {
|
|
163
|
+
return await nip04.decrypt(privateKey, senderPubKey, encryptedContent);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// ============================================================================
|
|
167
|
+
// NIP-44 Encryption (Modern, Audited - Replaces NIP-04)
|
|
168
|
+
// ============================================================================
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Encrypt a message using NIP-44 (modern, audited encryption standard).
|
|
172
|
+
* Uses ChaCha20-Poly1305 + HMAC-SHA256, audited by Cure53. Recommended for new implementations.
|
|
173
|
+
* @param {string} privateKey - Sender's 64-character hex private key
|
|
174
|
+
* @param {string} recipientPubKey - Recipient's 64-character hex public key
|
|
175
|
+
* @param {string} content - Plain text message content
|
|
176
|
+
* @returns {string} NIP-44 encrypted content (base64-encoded)
|
|
177
|
+
*/
|
|
178
|
+
export function encryptNIP44(privateKey, recipientPubKey, content) {
|
|
179
|
+
const privKeyBytes = hexToBytes(privateKey);
|
|
180
|
+
// nostr-tools nip44 expects pubkey as hex string, not bytes
|
|
181
|
+
const conversationKey = nip44.v2.utils.getConversationKey(privKeyBytes, recipientPubKey);
|
|
182
|
+
return nip44.v2.encrypt(content, conversationKey);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Decrypt a NIP-44 encrypted message.
|
|
187
|
+
* @param {string} privateKey - Recipient's 64-character hex private key
|
|
188
|
+
* @param {string} senderPubKey - Sender's 64-character hex public key
|
|
189
|
+
* @param {string} encryptedContent - NIP-44 encrypted content (base64-encoded)
|
|
190
|
+
* @returns {string} Decrypted plain text content
|
|
191
|
+
*/
|
|
192
|
+
export function decryptNIP44(privateKey, senderPubKey, encryptedContent) {
|
|
193
|
+
const privKeyBytes = hexToBytes(privateKey);
|
|
194
|
+
// nostr-tools nip44 expects pubkey as hex string, not bytes
|
|
195
|
+
const conversationKey = nip44.v2.utils.getConversationKey(privKeyBytes, senderPubKey);
|
|
196
|
+
return nip44.v2.decrypt(encryptedContent, conversationKey);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// ============================================================================
|
|
200
|
+
// Event Creation
|
|
201
|
+
// ============================================================================
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Create and sign a Nostr event.
|
|
205
|
+
* Automatically adds created_at timestamp, computes event ID, and generates signature.
|
|
206
|
+
* @param {number} kind - Event kind (e.g., 1 for text note, 4 for DM)
|
|
207
|
+
* @param {string} content - Event content string
|
|
208
|
+
* @param {string[][]} tags - Array of tag arrays (e.g., [['p', 'pubkey'], ['e', 'eventId']])
|
|
209
|
+
* @param {string} privateKey - 64-character hex private key for signing
|
|
210
|
+
* @returns {Object} Signed Nostr event with id, pubkey, sig, and all fields
|
|
211
|
+
*/
|
|
212
|
+
export function createSignedEvent(kind, content, tags, privateKey) {
|
|
213
|
+
const event = {
|
|
214
|
+
kind,
|
|
215
|
+
content,
|
|
216
|
+
tags,
|
|
217
|
+
created_at: Math.floor(Date.now() / 1000),
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
return finalizeEvent(event, hexToBytes(privateKey));
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Create a NIP-04 encrypted DM event (kind 4).
|
|
225
|
+
* Creates and signs a direct message event with proper recipient tagging.
|
|
226
|
+
* @param {string} recipientPubKey - Recipient's 64-character hex public key
|
|
227
|
+
* @param {string} encryptedContent - NIP-04 encrypted message content
|
|
228
|
+
* @param {string} privateKey - Sender's 64-character hex private key
|
|
229
|
+
* @returns {Object} Signed Nostr DM event (kind 4) with ['p', recipientPubKey] tag
|
|
230
|
+
*/
|
|
231
|
+
export function createDMEvent(recipientPubKey, encryptedContent, privateKey) {
|
|
232
|
+
return createSignedEvent(
|
|
233
|
+
4, // NIP-04 encrypted DM
|
|
234
|
+
encryptedContent,
|
|
235
|
+
[['p', recipientPubKey]],
|
|
236
|
+
privateKey
|
|
237
|
+
);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// ============================================================================
|
|
241
|
+
// Validation
|
|
242
|
+
// ============================================================================
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Check if a string is a valid hex public key (64 hex characters).
|
|
246
|
+
* @param {string} str - String to validate
|
|
247
|
+
* @returns {boolean} True if valid 64-character hex string
|
|
248
|
+
*/
|
|
249
|
+
export function isValidHexPubKey(str) {
|
|
250
|
+
return typeof str === 'string' && /^[0-9a-fA-F]{64}$/.test(str);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* Check if a string is a valid npub (starts with npub1 and decodes correctly).
|
|
255
|
+
* @param {string} str - String to validate
|
|
256
|
+
* @returns {boolean} True if valid npub format
|
|
257
|
+
*/
|
|
258
|
+
export function isValidNpub(str) {
|
|
259
|
+
if (typeof str !== 'string' || !str.startsWith('npub1')) {
|
|
260
|
+
return false;
|
|
261
|
+
}
|
|
262
|
+
try {
|
|
263
|
+
const decoded = nip19.decode(str);
|
|
264
|
+
return decoded.type === 'npub';
|
|
265
|
+
} catch {
|
|
266
|
+
return false;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* Generate a unique nonce using timestamp and random value.
|
|
272
|
+
* @returns {string} Unique nonce string combining base36 timestamp and random suffix
|
|
273
|
+
*/
|
|
274
|
+
export function generateNonce() {
|
|
275
|
+
return Date.now().toString(36) + Math.random().toString(36).substring(2, 15);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
* Sign a Nostr event object.
|
|
280
|
+
* Accepts an event object instead of individual parameters. Adds created_at if missing.
|
|
281
|
+
* @param {Object} event - Unsigned event object with kind, content, and tags
|
|
282
|
+
* @param {string} privateKey - 64-character hex private key for signing
|
|
283
|
+
* @returns {Object} Signed Nostr event with id, pubkey, and sig fields added
|
|
284
|
+
*/
|
|
285
|
+
export function signEvent(event, privateKey) {
|
|
286
|
+
const eventToSign = {
|
|
287
|
+
kind: event.kind,
|
|
288
|
+
content: event.content,
|
|
289
|
+
tags: event.tags || [],
|
|
290
|
+
created_at: event.created_at || Math.floor(Date.now() / 1000),
|
|
291
|
+
};
|
|
292
|
+
return finalizeEvent(eventToSign, hexToBytes(privateKey));
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/**
|
|
296
|
+
* Verify a Nostr event signature using secp256k1.
|
|
297
|
+
* Validates that the event ID matches the event data and the signature is valid.
|
|
298
|
+
* @param {Object} event - Signed Nostr event with id, pubkey, and sig fields
|
|
299
|
+
* @returns {boolean} True if event signature is cryptographically valid
|
|
300
|
+
*/
|
|
301
|
+
export function verifyEvent(event) {
|
|
302
|
+
return nostrVerifyEvent(event);
|
|
303
|
+
}
|
package/src/crypto/secp256k1.js
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Cryptographic Operations
|
|
3
|
-
*
|
|
2
|
+
* @fileoverview Cryptographic Operations using secp256k1.
|
|
3
|
+
*
|
|
4
|
+
* Provides signing, verification, and capability token operations using
|
|
5
|
+
* the secp256k1 elliptic curve (same curve used by Bitcoin and Nostr).
|
|
6
|
+
* Uses lazy loading for the crypto module to improve startup performance.
|
|
7
|
+
*
|
|
8
|
+
* @module crypto/secp256k1
|
|
4
9
|
*/
|
|
5
10
|
|
|
6
11
|
import { sha256 } from '@noble/hashes/sha256';
|