field_ios

In-the-field app for Radroots on iOS
git clone https://radroots.dev/git/field_ios.git
Log | Files | Refs | README | LICENSE

commit 0a37a2367da540346f240568bfc622b0d5ba2196
parent 7f642c39af0f265fbf4618fac14c893d21fbccef
Author: triesap <tyson@radroots.org>
Date:   Thu, 10 Sep 2026 20:29:14 +0000

tera: Apply qualified authored-write durability

- Adopt the exact shared durable connection policy and native artifacts
- Flush explicit Save without cancelling the active persistence worker
- Preserve typed failures and exact receipt reconciliation on retry
- Qualify durable reopen, latency and complete standalone consumers

Diffstat:
MCargo.lock | 32++++++++++++++++----------------
MCargo.toml | 24++++++++++++------------
MTera.xcodeproj/project.pbxproj | 12++++++++++++
MTera/State/TeraComposerAutosave.swift | 45++++++++++++++++++++++++++++++++++++++++++---
MTeraFFI/provenance.json | 42+++++++++++++++++++++---------------------
MTeraFFI/source.lock | 6+++---
MTeraFFI/source/aarch64-apple-darwin.json | 82++++++++++++++++++++++++++++++++++++++++----------------------------------------
MTeraFFI/source/aarch64-apple-ios-sim.json | 82++++++++++++++++++++++++++++++++++++++++----------------------------------------
MTeraFFI/source/aarch64-apple-ios.json | 82++++++++++++++++++++++++++++++++++++++++----------------------------------------
MTeraTests/TeraComposerAutosaveTests.swift | 4++++
ATeraTests/TeraComposerDurabilityBoundaryTests.swift | 104+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ATeraTests/TeraComposerSaveLatencyTests.swift | 89+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ATeraTests/TeraComposerSaveSchedulingTests.swift | 229+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mproject.yml | 3+++
Mradroots.lib.source-lock.v1.toml | 6+++---
Mrelease/provenance.json | 14+++++++-------
Mrelease/sbom.cdx.json | 248++++++++++++++++++++++++++++++++++++++++----------------------------------------
17 files changed, 792 insertions(+), 312 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock @@ -1876,7 +1876,7 @@ checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] name = "radroots_blossom" version = "0.1.0-alpha" -source = "git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" +source = "git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" dependencies = [ "mediatype", "serde", @@ -1888,7 +1888,7 @@ dependencies = [ [[package]] name = "radroots_core" version = "0.1.0-alpha" -source = "git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" +source = "git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" dependencies = [ "rust_decimal", "serde", @@ -1897,7 +1897,7 @@ dependencies = [ [[package]] name = "radroots_event" version = "0.1.0-alpha" -source = "git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" +source = "git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" dependencies = [ "hex", "jiff-tzdb", @@ -1915,7 +1915,7 @@ dependencies = [ [[package]] name = "radroots_event_codec" version = "0.1.0-alpha" -source = "git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" +source = "git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" dependencies = [ "hex", "radroots_blossom", @@ -1932,7 +1932,7 @@ dependencies = [ [[package]] name = "radroots_identity" version = "0.1.0-alpha" -source = "git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" +source = "git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" dependencies = [ "k256", "serde", @@ -1942,7 +1942,7 @@ dependencies = [ [[package]] name = "radroots_nostr" version = "0.1.0-alpha" -source = "git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" +source = "git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" dependencies = [ "base64", "nostr 0.44.8", @@ -1959,7 +1959,7 @@ dependencies = [ [[package]] name = "radroots_protocol" version = "0.1.0-alpha" -source = "git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" +source = "git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" dependencies = [ "serde", ] @@ -1967,7 +1967,7 @@ dependencies = [ [[package]] name = "radroots_sdk" version = "0.1.0-alpha" -source = "git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" +source = "git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" dependencies = [ "radroots_blossom", "radroots_core", @@ -1992,7 +1992,7 @@ dependencies = [ [[package]] name = "radroots_secrets" version = "0.1.0-alpha" -source = "git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" +source = "git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" dependencies = [ "chacha20poly1305", "sha2", @@ -2003,7 +2003,7 @@ dependencies = [ [[package]] name = "radroots_signing" version = "0.1.0-alpha" -source = "git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" +source = "git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" dependencies = [ "hex", "radroots_event", @@ -2017,7 +2017,7 @@ dependencies = [ [[package]] name = "radroots_storage" version = "0.1.0-alpha" -source = "git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" +source = "git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" dependencies = [ "radroots_event", "radroots_event_codec", @@ -2031,7 +2031,7 @@ dependencies = [ [[package]] name = "radroots_storage_sqlite" version = "0.1.0-alpha" -source = "git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" +source = "git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" dependencies = [ "fs2", "radroots_event", @@ -2048,7 +2048,7 @@ dependencies = [ [[package]] name = "radroots_sync" version = "0.1.0-alpha" -source = "git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" +source = "git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" dependencies = [ "radroots_event", "radroots_event_codec", @@ -2063,7 +2063,7 @@ dependencies = [ [[package]] name = "radroots_trade" version = "0.1.0-alpha" -source = "git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" +source = "git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" dependencies = [ "hex", "radroots_core", @@ -2077,7 +2077,7 @@ dependencies = [ [[package]] name = "radroots_transport" version = "0.1.0-alpha" -source = "git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" +source = "git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" dependencies = [ "radroots_event", "radroots_identity", @@ -2089,7 +2089,7 @@ dependencies = [ [[package]] name = "radroots_transport_nostr" version = "0.1.0-alpha" -source = "git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" +source = "git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" dependencies = [ "async-wsocket", "futures", diff --git a/Cargo.toml b/Cargo.toml @@ -31,18 +31,18 @@ jiff_tzdb = { package = "jiff-tzdb", version = "=0.1.8", default-features = fals futures-util = { version = "0.3", default-features = false, features = ["sink", "std"] } hex = { version = "0.4" } nostr = { version = "0.44.7", default-features = false } -radroots_blossom = { package = "radroots_blossom", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "363b9be18831be2fd6ef505d6154fb878ed8efd7" } -radroots_event = { package = "radroots_event", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "363b9be18831be2fd6ef505d6154fb878ed8efd7" } -radroots_event_codec = { package = "radroots_event_codec", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "363b9be18831be2fd6ef505d6154fb878ed8efd7" } -radroots_identity = { package = "radroots_identity", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "363b9be18831be2fd6ef505d6154fb878ed8efd7" } -radroots_nostr = { package = "radroots_nostr", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "363b9be18831be2fd6ef505d6154fb878ed8efd7" } -radroots_protocol = { package = "radroots_protocol", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "363b9be18831be2fd6ef505d6154fb878ed8efd7" } -radroots_sdk = { version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "363b9be18831be2fd6ef505d6154fb878ed8efd7" } -radroots_signing = { package = "radroots_signing", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "363b9be18831be2fd6ef505d6154fb878ed8efd7" } -radroots_storage = { package = "radroots_storage", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "363b9be18831be2fd6ef505d6154fb878ed8efd7" } -radroots_sync = { package = "radroots_sync", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "363b9be18831be2fd6ef505d6154fb878ed8efd7" } -radroots_transport = { package = "radroots_transport", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "363b9be18831be2fd6ef505d6154fb878ed8efd7" } -radroots_transport_nostr = { package = "radroots_transport_nostr", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "363b9be18831be2fd6ef505d6154fb878ed8efd7" } +radroots_blossom = { package = "radroots_blossom", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "d3332ff1c68245a232f093434ee35fe2a342ed38" } +radroots_event = { package = "radroots_event", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "d3332ff1c68245a232f093434ee35fe2a342ed38" } +radroots_event_codec = { package = "radroots_event_codec", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "d3332ff1c68245a232f093434ee35fe2a342ed38" } +radroots_identity = { package = "radroots_identity", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "d3332ff1c68245a232f093434ee35fe2a342ed38" } +radroots_nostr = { package = "radroots_nostr", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "d3332ff1c68245a232f093434ee35fe2a342ed38" } +radroots_protocol = { package = "radroots_protocol", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "d3332ff1c68245a232f093434ee35fe2a342ed38" } +radroots_sdk = { version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "d3332ff1c68245a232f093434ee35fe2a342ed38" } +radroots_signing = { package = "radroots_signing", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "d3332ff1c68245a232f093434ee35fe2a342ed38" } +radroots_storage = { package = "radroots_storage", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "d3332ff1c68245a232f093434ee35fe2a342ed38" } +radroots_sync = { package = "radroots_sync", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "d3332ff1c68245a232f093434ee35fe2a342ed38" } +radroots_transport = { package = "radroots_transport", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "d3332ff1c68245a232f093434ee35fe2a342ed38" } +radroots_transport_nostr = { package = "radroots_transport_nostr", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "d3332ff1c68245a232f093434ee35fe2a342ed38" } serde = { version = "1", default-features = false, features = ["derive", "alloc"] } serde_json = { version = "1", default-features = false, features = ["alloc"] } sha2 = { version = "0.10", default-features = false } diff --git a/Tera.xcodeproj/project.pbxproj b/Tera.xcodeproj/project.pbxproj @@ -51,6 +51,7 @@ 81AF9DDA0E64DC4EEFCEF25D /* TeraRemoteQualificationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E351F52E77C74A4E99095E45 /* TeraRemoteQualificationTests.swift */; }; 827D8CC5C0488F0D5D15CE99 /* TeraMediaOwnershipFFITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2521493B0CD2B82445974E81 /* TeraMediaOwnershipFFITests.swift */; }; 8422EAEECA73BB72974D002A /* TeraTodayBackfillTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4D3FEE2830E056E82AF05FD /* TeraTodayBackfillTests.swift */; }; + 84429B5DEB5BB41EFD25A8ED /* TeraComposerDurabilityBoundaryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D536D6625083ACB3DA4A674 /* TeraComposerDurabilityBoundaryTests.swift */; }; 852FF7514FF7F682A246FB47 /* TeraStateMigrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98E969BCFF7CED33A1D4A040 /* TeraStateMigrationTests.swift */; }; 85404A5125CF3E64E6009DC1 /* TeraMediaBudgetTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F596D3A9B9E236963DCE15D7 /* TeraMediaBudgetTests.swift */; }; 888B178679E012BB053FE31B /* TeraEditingReplacementFFITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B310FD8CCA9F9C2DA19BE8CF /* TeraEditingReplacementFFITests.swift */; }; @@ -83,11 +84,13 @@ DF97F408D7D32F72C5AF5939 /* TeraRootShellUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5238B5F236C392C82CEF9838 /* TeraRootShellUITests.swift */; }; E4E85524E39F13D6C76650F1 /* TeraTodaySyncFixtures.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5854504D0CAD5ABC29302292 /* TeraTodaySyncFixtures.swift */; }; E508A7061082B091B733D62B /* App.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67ACCE25979BA86C1EC5BFD6 /* App.swift */; }; + E892ED14E1F39D81128A8F0E /* TeraComposerSaveLatencyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C4A465852C5D5BDFC879D6E /* TeraComposerSaveLatencyTests.swift */; }; E98A5C885E3955D4DC4BB1EC /* TeraTodayCacheFirstTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53CB51FEF4CE772320B3264C /* TeraTodayCacheFirstTests.swift */; }; EF7293C553BF1DB45EEEBD49 /* local-social-personas.v1.json in Resources */ = {isa = PBXBuildFile; fileRef = 27D9D40699A01FFB02F30B11 /* local-social-personas.v1.json */; }; F14217EA66C2A9397E36E3FA /* TeraEditingOperationProtectionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC9B19425D3374B899485C17 /* TeraEditingOperationProtectionTests.swift */; }; F4AF91E71B691FE30C191852 /* TeraAddObservationStartupTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44A4460928B20A21A94BECCE /* TeraAddObservationStartupTests.swift */; }; F8C87782857DC930D47E6A90 /* TeraRuntimeResourceTaskTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4D01C023E258AC3B3B1C27D /* TeraRuntimeResourceTaskTests.swift */; }; + F8DB757CAC7AB2136483EC2B /* TeraComposerSaveSchedulingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C51E210CC4A6734CD302452 /* TeraComposerSaveSchedulingTests.swift */; }; FB585785DC906CB2AE4AE535 /* TeraBindingPortabilityTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58E711687008866790042792 /* TeraBindingPortabilityTests.swift */; }; FBA9C3463CD1827392AF9599 /* TeraAddSchemaFixtures.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8ED2718D5E9E8980ADF3423 /* TeraAddSchemaFixtures.swift */; }; /* End PBXBuildFile section */ @@ -111,6 +114,7 @@ /* Begin PBXFileReference section */ 02F322CF98F8BEB908B93215 /* TeraMutationAdmissionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TeraMutationAdmissionTests.swift; sourceTree = "<group>"; }; + 0C4A465852C5D5BDFC879D6E /* TeraComposerSaveLatencyTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TeraComposerSaveLatencyTests.swift; sourceTree = "<group>"; }; 0CDE3D76E1EDF909C19D0506 /* TeraUITests.xctest */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.cfbundle; path = TeraUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 0D243145C276EBF17915AB4E /* TeraEditingProtectionUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TeraEditingProtectionUITests.swift; sourceTree = "<group>"; }; 0F97ECE43BB7028B5A497720 /* TeraEditingReplacementTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TeraEditingReplacementTests.swift; sourceTree = "<group>"; }; @@ -127,6 +131,7 @@ 36AF0D194520F0F02EAD6B50 /* TeraCalendarTimingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TeraCalendarTimingTests.swift; sourceTree = "<group>"; }; 3A756C16ACFABBD36C48DF62 /* TeraScopedAddTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TeraScopedAddTests.swift; sourceTree = "<group>"; }; 3B808E67E85CD36E49C38B6F /* TeraCalendarFFICompatibilityTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TeraCalendarFFICompatibilityTests.swift; sourceTree = "<group>"; }; + 3C51E210CC4A6734CD302452 /* TeraComposerSaveSchedulingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TeraComposerSaveSchedulingTests.swift; sourceTree = "<group>"; }; 4383B870D20178E633610113 /* TeraSessionResourceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TeraSessionResourceTests.swift; sourceTree = "<group>"; }; 44A4460928B20A21A94BECCE /* TeraAddObservationStartupTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TeraAddObservationStartupTests.swift; sourceTree = "<group>"; }; 46DDEE781FDD92A292FD847B /* TeraUserMessagesTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TeraUserMessagesTests.swift; sourceTree = "<group>"; }; @@ -144,6 +149,7 @@ 6967B3EAC4CF1A410B26DD1A /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; path = PrivacyInfo.xcprivacy; sourceTree = "<group>"; }; 6B8677670E203FF68EC88983 /* TeraRootShellTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TeraRootShellTests.swift; sourceTree = "<group>"; }; 6D2BE93A0818202625CAF1F5 /* TeraTodayCalendarScopeTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TeraTodayCalendarScopeTests.swift; sourceTree = "<group>"; }; + 6D536D6625083ACB3DA4A674 /* TeraComposerDurabilityBoundaryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TeraComposerDurabilityBoundaryTests.swift; sourceTree = "<group>"; }; 714B4DD70B881D29A89812C9 /* TeraTodayReconciliationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TeraTodayReconciliationTests.swift; sourceTree = "<group>"; }; 7283D1C8F6E90A236BC84AF6 /* TeraTodayRenderingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TeraTodayRenderingTests.swift; sourceTree = "<group>"; }; 73EBD10E201ECA26DCED523F /* TeraRuntimeInvalidationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TeraRuntimeInvalidationTests.swift; sourceTree = "<group>"; }; @@ -273,7 +279,10 @@ 36AF0D194520F0F02EAD6B50 /* TeraCalendarTimingTests.swift */, 2A506546B0EC1792240C36F7 /* TeraClockTests.swift */, E55E47B15C42F13ABF2DFF27 /* TeraComposerAutosaveTests.swift */, + 6D536D6625083ACB3DA4A674 /* TeraComposerDurabilityBoundaryTests.swift */, A5938176A92F96A30CC39DFB /* TeraComposerPersistenceFFITests.swift */, + 0C4A465852C5D5BDFC879D6E /* TeraComposerSaveLatencyTests.swift */, + 3C51E210CC4A6734CD302452 /* TeraComposerSaveSchedulingTests.swift */, DE21EEF3B1A13F1B5A10A3BF /* TeraComposerStartupTests.swift */, ECE8A3704AB9582A5E461195 /* TeraDraftRecoveryTests.swift */, AC9B19425D3374B899485C17 /* TeraEditingOperationProtectionTests.swift */, @@ -551,7 +560,10 @@ 9309D7175535546A0C878F75 /* TeraCalendarTimingTests.swift in Sources */, 70417FB635F06CC9829FB38C /* TeraClockTests.swift in Sources */, 4B093458FAF4C6E4860E313A /* TeraComposerAutosaveTests.swift in Sources */, + 84429B5DEB5BB41EFD25A8ED /* TeraComposerDurabilityBoundaryTests.swift in Sources */, 295A19317FC58A73A68C98DC /* TeraComposerPersistenceFFITests.swift in Sources */, + E892ED14E1F39D81128A8F0E /* TeraComposerSaveLatencyTests.swift in Sources */, + F8DB757CAC7AB2136483EC2B /* TeraComposerSaveSchedulingTests.swift in Sources */, 3410EC660FF36CC77F5F50DD /* TeraComposerStartupTests.swift in Sources */, 64F5AD3749E090316C7D015E /* TeraDraftRecoveryTests.swift in Sources */, F14217EA66C2A9397E36E3FA /* TeraEditingOperationProtectionTests.swift in Sources */, diff --git a/Tera/State/TeraComposerAutosave.swift b/Tera/State/TeraComposerAutosave.swift @@ -23,6 +23,9 @@ final class TeraComposerAutosave { private var current: TeraComposerForm? private var attempted: TeraComposerSaveRequest? private var worker: Task<Void, Never>? + private var coalescingTask: Task<Void, Error>? + private var immediateSave = false + private var lastFailure: Error? private var paused = false private var exhausted = false @@ -34,7 +37,10 @@ final class TeraComposerAutosave { self.delay = delay } - deinit { worker?.cancel() } + deinit { + coalescingTask?.cancel() + worker?.cancel() + } var isDirty: Bool { current != nil && (exhausted || acknowledged?.editSequence != editSequence || acknowledged?.form != current) @@ -44,12 +50,15 @@ final class TeraComposerAutosave { /// worker slot occupied until it exits, preventing abandoned task fan-out. func reset(scope: TeraComposerScope?) { generation = generation.invalidated() + immediateSave = false + coalescingTask?.cancel() worker?.cancel() self.scope = scope id = nil current = nil acknowledged = nil attempted = nil + lastFailure = nil editSequence = 0 exhausted = false paused = false @@ -59,6 +68,8 @@ final class TeraComposerAutosave { func stop() { generation = generation.invalidated() paused = true + immediateSave = false + coalescingTask?.cancel() worker?.cancel() if isDirty { state = .unsaved @@ -121,12 +132,20 @@ final class TeraComposerAutosave { if state == .failed { state = .unsaved } + if isDirty { + immediateSave = true + coalescingTask?.cancel() + } startWorker() while let task = worker { + if isDirty { + immediateSave = true + coalescingTask?.cancel() + } await task.value try ensureCurrent(requested) } - guard !isDirty, let acknowledged else { throw TeraComposerAcknowledgment.unconfirmed } + guard !isDirty, let acknowledged else { throw lastFailure ?? TeraComposerAcknowledgment.unconfirmed } return acknowledged } @@ -134,6 +153,7 @@ final class TeraComposerAutosave { guard worker == nil, !paused, !exhausted, generation.isActive, scope != nil, isDirty, state != .failed else { return } let requested = generation + lastFailure = nil worker = Task { [weak self] in guard let self else { return } await run(requested) @@ -142,6 +162,9 @@ final class TeraComposerAutosave { private func run(_ requested: TeraSessionGeneration) async { defer { + if generation == requested { + immediateSave = false + } worker = nil startWorker() } @@ -149,7 +172,7 @@ final class TeraComposerAutosave { while isDirty { try ensureCurrent(requested) state = .saving - try await delay() + try await coalesce(requested) try ensureCurrent(requested) try await reconcileAttempt(requested) try await persistCurrent(requested) @@ -160,11 +183,27 @@ final class TeraComposerAutosave { // A write may have committed before cancellation or a lost callback. // Keep its exact request for a read before any retry in this lifetime. if generation == requested, !paused { + lastFailure = error state = .failed } } } + private func coalesce(_ requested: TeraSessionGeneration) async throws { + guard !immediateSave else { return } + let task = Task { [delay] in try await delay() } + coalescingTask = task + defer { coalescingTask = nil } + do { + try await task.value + } catch { + try ensureCurrent(requested) + // Explicit Save cancels only batching; an in-flight write still owns + // its slot until its receipt or unknown-write reconciliation completes. + guard immediateSave, error is CancellationError else { throw error } + } + } + private func persistCurrent(_ requested: TeraSessionGeneration) async throws { if id == nil { let reserved = try await persistence.reserve() diff --git a/TeraFFI/provenance.json b/TeraFFI/provenance.json @@ -22,9 +22,9 @@ "sha256": "3ed9b7ece2f86e5b5d1ddc6ecbb97deb49c46ca2ea91a930eaec1b580232345c" }, { - "bytes": 74566032, + "bytes": 74580864, "path": "TeraFFI.xcframework/ios-arm64-simulator/libtera_ffi.a", - "sha256": "ea772fb6ac62a0e5fd3a459bdc2afb8dce24c1dec278d56b5d72d16fcb83bfc0" + "sha256": "c61c3bacad23947610b95c7bd061e576744d70e2f29b45b9e0f8bf0428164326" }, { "bytes": 74130, @@ -37,9 +37,9 @@ "sha256": "3ed9b7ece2f86e5b5d1ddc6ecbb97deb49c46ca2ea91a930eaec1b580232345c" }, { - "bytes": 74631304, + "bytes": 74644816, "path": "TeraFFI.xcframework/ios-arm64/libtera_ffi.a", - "sha256": "435be2eb4695d932a56bab01103a21f926496c06b8634e4b134e017e286415a7" + "sha256": "e694a56e9d2efa2a473d42ca9a929c4102cd2d5d876da3144f0a31a5778479dd" }, { "bytes": 44380, @@ -77,34 +77,34 @@ "sha256": "3ed9b7ece2f86e5b5d1ddc6ecbb97deb49c46ca2ea91a930eaec1b580232345c" }, { - "bytes": 20889792, + "bytes": 20890864, "path": "native/aarch64-apple-darwin/libtera_ffi.dylib", - "sha256": "985e22036f4c32f75eae0437f016e13c36fbad4b88b55dd21aa5c7f43b41f208" + "sha256": "82d8f5db99b68cd41dceeac219a2ea5e9c65580d864c4481c9c6c04f7c07ff6a" }, { - "bytes": 74566032, + "bytes": 74580864, "path": "native/aarch64-apple-ios-sim/libtera_ffi.a", - "sha256": "ea772fb6ac62a0e5fd3a459bdc2afb8dce24c1dec278d56b5d72d16fcb83bfc0" + "sha256": "c61c3bacad23947610b95c7bd061e576744d70e2f29b45b9e0f8bf0428164326" }, { - "bytes": 74631304, + "bytes": 74644816, "path": "native/aarch64-apple-ios/libtera_ffi.a", - "sha256": "435be2eb4695d932a56bab01103a21f926496c06b8634e4b134e017e286415a7" + "sha256": "e694a56e9d2efa2a473d42ca9a929c4102cd2d5d876da3144f0a31a5778479dd" }, { "bytes": 78901, "path": "source/aarch64-apple-darwin.json", - "sha256": "3e35363c2f01b2af4a76ae9800381f28c15b415e4b975586bd5a6809a53b03ce" + "sha256": "9b012714199bd32b7e36315a7ad0ff53e38ac183205cc6de1866e85135889bb7" }, { "bytes": 78745, "path": "source/aarch64-apple-ios-sim.json", - "sha256": "857590f081e97b5445982b2155d88c9aeb2be3982904dc10c33fc491aa0f232f" + "sha256": "1a3205a8c343b1483014b7dc625470d819e008014192be0db8cdfafa99235958" }, { "bytes": 78741, "path": "source/aarch64-apple-ios.json", - "sha256": "c598b77069dd1fc2baf0a0f3bcc6d88c3c00243c6238610726d5b0fd9de2668c" + "sha256": "f24780bdcb07df2d5a942cca123d1375ca7d2c3a53471449b546921e2d4c4f11" } ], "language": "swift", @@ -112,7 +112,7 @@ "schema": "radroots.artifact-manifest.v2", "source": { "repository": "https://github.com/radrootslabs/tera", - "tree": "d2d70cf73831ad89f077bf5ff5158fa6bcf55638" + "tree": "57e99e1ced148e6e75bc0718272dad8faff1c366" }, "source_records": { "aarch64-apple-darwin": "source/aarch64-apple-darwin.json", @@ -139,9 +139,9 @@ "sha256": "3ed9b7ece2f86e5b5d1ddc6ecbb97deb49c46ca2ea91a930eaec1b580232345c" }, { - "bytes": 74566032, + "bytes": 74580864, "path": "Tera/Frameworks/TeraFFI.xcframework/ios-arm64-simulator/libtera_ffi.a", - "sha256": "ea772fb6ac62a0e5fd3a459bdc2afb8dce24c1dec278d56b5d72d16fcb83bfc0" + "sha256": "c61c3bacad23947610b95c7bd061e576744d70e2f29b45b9e0f8bf0428164326" }, { "bytes": 74130, @@ -154,9 +154,9 @@ "sha256": "3ed9b7ece2f86e5b5d1ddc6ecbb97deb49c46ca2ea91a930eaec1b580232345c" }, { - "bytes": 74631304, + "bytes": 74644816, "path": "Tera/Frameworks/TeraFFI.xcframework/ios-arm64/libtera_ffi.a", - "sha256": "435be2eb4695d932a56bab01103a21f926496c06b8634e4b134e017e286415a7" + "sha256": "e694a56e9d2efa2a473d42ca9a929c4102cd2d5d876da3144f0a31a5778479dd" }, { "bytes": 581356, @@ -176,17 +176,17 @@ { "bytes": 78901, "path": "TeraFFI/source/aarch64-apple-darwin.json", - "sha256": "3e35363c2f01b2af4a76ae9800381f28c15b415e4b975586bd5a6809a53b03ce" + "sha256": "9b012714199bd32b7e36315a7ad0ff53e38ac183205cc6de1866e85135889bb7" }, { "bytes": 78745, "path": "TeraFFI/source/aarch64-apple-ios-sim.json", - "sha256": "857590f081e97b5445982b2155d88c9aeb2be3982904dc10c33fc491aa0f232f" + "sha256": "1a3205a8c343b1483014b7dc625470d819e008014192be0db8cdfafa99235958" }, { "bytes": 78741, "path": "TeraFFI/source/aarch64-apple-ios.json", - "sha256": "c598b77069dd1fc2baf0a0f3bcc6d88c3c00243c6238610726d5b0fd9de2668c" + "sha256": "f24780bdcb07df2d5a942cca123d1375ca7d2c3a53471449b546921e2d4c4f11" } ], "schema": "tera.installed-native-artifacts.v1" diff --git a/TeraFFI/source.lock b/TeraFFI/source.lock @@ -1,10 +1,10 @@ schema = "tera.installed-source.v1" repository = "https://github.com/radrootslabs/tera" -source_tree = "d2d70cf73831ad89f077bf5ff5158fa6bcf55638" -manifest_sha256 = "3ec93a119b64fa97e6c6e293c34a7544e5286ee6a3cce24b90249cdf6f832101" +source_tree = "57e99e1ced148e6e75bc0718272dad8faff1c366" +manifest_sha256 = "d56aff8833d3125a11f91c5ab2a043b7beb95b164f28dc218563601365693499" source_date_epoch = 1787871027 [foundation] repository = "https://github.com/radrootslabs/lib" -revision = "363b9be18831be2fd6ef505d6154fb878ed8efd7" +revision = "d3332ff1c68245a232f093434ee35fe2a342ed38" version = "0.1.0-alpha" diff --git a/TeraFFI/source/aarch64-apple-darwin.json b/TeraFFI/source/aarch64-apple-darwin.json @@ -186,36 +186,36 @@ "proc-macro2 v1.0.107|default,proc-macro (*)", "quote v1.0.47|default,proc-macro", "quote v1.0.47|default,proc-macro (*)", - "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde,std", - "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde,std (*)", - "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde,std", - "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde,std (*)", - "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde,std", - "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde,std (*)", - "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|json,serde,std", - "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|json,serde,std (*)", - "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde,std", - "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde,std (*)", - "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|blossom,events,std", - "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|blossom,events,std (*)", - "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde,std", - "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde,std (*)", - "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|blossom,nostr,sqlite,sync", - "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|blossom,nostr,sqlite,sync (*)", - "radroots_secrets v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|", - "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde,std", - "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde,std (*)", - "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde", - "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde (*)", - "radroots_storage_sqlite v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|", - "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|", - "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)| (*)", - "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|json,serde,std", - "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|json,serde,std (*)", - "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde,std", - "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde,std (*)", - "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|", - "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)| (*)", + "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde,std", + "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde,std (*)", + "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde,std", + "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde,std (*)", + "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde,std", + "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde,std (*)", + "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|json,serde,std", + "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|json,serde,std (*)", + "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde,std", + "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde,std (*)", + "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|blossom,events,std", + "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|blossom,events,std (*)", + "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde,std", + "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde,std (*)", + "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|blossom,nostr,sqlite,sync", + "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|blossom,nostr,sqlite,sync (*)", + "radroots_secrets v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|", + "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde,std", + "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde,std (*)", + "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde", + "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde (*)", + "radroots_storage_sqlite v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|", + "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|", + "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)| (*)", + "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|json,serde,std", + "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|json,serde,std (*)", + "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde,std", + "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde,std (*)", + "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|", + "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)| (*)", "rand v0.8.7|alloc,getrandom,libc,rand_chacha,std,std_rng", "rand v0.9.5|alloc,default,os_rng,small_rng,std,std_rng,thread_rng", "rand_chacha v0.3.1|std", @@ -385,15 +385,15 @@ "symbol_reader": "llvm-nm, compatible with GNU nm\nLLVM (http://llvm.org/):\n LLVM version 22.1.6-rust-1.97.1-stable\n Optimized build.", "target": "aarch64-apple-darwin" }, - "cargo_lock_sha256": "e191ca1e3e73c6c1414169f3ae4ef8b6c2140c2598c10b09109d88c4260eb8d0", + "cargo_lock_sha256": "62a48bf3f3989c1fa0737a76a238f58104c55cf42711176ff361a5acb305fa02", "disposition": "local_staged_source_only", "foundation": { "architecture": "radroots.crates.release.v2", - "lockfile_sha256": "e191ca1e3e73c6c1414169f3ae4ef8b6c2140c2598c10b09109d88c4260eb8d0", + "lockfile_sha256": "62a48bf3f3989c1fa0737a76a238f58104c55cf42711176ff361a5acb305fa02", "repository": "https://github.com/radrootslabs/lib", - "revision": "363b9be18831be2fd6ef505d6154fb878ed8efd7", + "revision": "d3332ff1c68245a232f093434ee35fe2a342ed38", "schema": "radroots.lib.source-lock.v1", - "source_archive_sha256": "9c9af522b74a2b342c0202cc919189d5234a4de2bc7bbb7c96b4e3c3696e5a6a", + "source_archive_sha256": "fc3cc82de74e0db7a640f8dfddb6eb0c8402b38cfebe14a2dbb61856561f3856", "version": "0.1.0-alpha", "workspace_catalog_sha256": "ee295f2352e2577a4052d980624415aec9871197d4fc9910a4c21c83a9179200" }, @@ -502,15 +502,15 @@ "files": { "Cargo.lock": { "bytes": 94853, - "git_blob": "eb2f815db496f5a7651fe698e71f6766c8dc5674", + "git_blob": "4eaa9a35cc43f407a1da15aef6b30a50ce6ae336", "mode": "100644", - "sha256": "e191ca1e3e73c6c1414169f3ae4ef8b6c2140c2598c10b09109d88c4260eb8d0" + "sha256": "62a48bf3f3989c1fa0737a76a238f58104c55cf42711176ff361a5acb305fa02" }, "Cargo.toml": { "bytes": 4442, - "git_blob": "bee7a05c0fe55a2979f174a6bc839ddd0c5e5bf0", + "git_blob": "b76fa73c06a6178ff196fd733ace45a7ed5b337d", "mode": "100644", - "sha256": "e179e1251a94766787c8d76153c8c2f0fcab30ba2a29d369d02756f27b4b3983" + "sha256": "a598efa44c347ea8e07e9ba59ff78bb04f1ee272e86168b1a385767d0ebe5acd" }, "Makefile": { "bytes": 3934, @@ -1384,9 +1384,9 @@ }, "radroots.lib.source-lock.v1.toml": { "bytes": 482, - "git_blob": "d8d25e5b4f516bad46fccb2bf560bfd9c858c177", + "git_blob": "afef222c863e3456d0cc55ecda3705db8f34339a", "mode": "100644", - "sha256": "6820983b4309ce49a37bac587eb90b28d5cdecb9ce7ad3aab51477322efe9533" + "sha256": "64c993dcde1de74fae4a02ca0c1e53e75cb90de20f081913ca50b3f136edcd99" }, "rust-toolchain.toml": { "bytes": 79, @@ -1702,6 +1702,6 @@ } }, "policy": "staged_inputs", - "tree": "d2d70cf73831ad89f077bf5ff5158fa6bcf55638" + "tree": "57e99e1ced148e6e75bc0718272dad8faff1c366" } } diff --git a/TeraFFI/source/aarch64-apple-ios-sim.json b/TeraFFI/source/aarch64-apple-ios-sim.json @@ -186,36 +186,36 @@ "proc-macro2 v1.0.107|default,proc-macro (*)", "quote v1.0.47|default,proc-macro", "quote v1.0.47|default,proc-macro (*)", - "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde,std", - "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde,std (*)", - "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde,std", - "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde,std (*)", - "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde,std", - "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde,std (*)", - "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|json,serde,std", - "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|json,serde,std (*)", - "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde,std", - "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde,std (*)", - "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|blossom,events,std", - "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|blossom,events,std (*)", - "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde,std", - "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde,std (*)", - "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|blossom,nostr,sqlite,sync", - "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|blossom,nostr,sqlite,sync (*)", - "radroots_secrets v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|", - "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde,std", - "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde,std (*)", - "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde", - "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde (*)", - "radroots_storage_sqlite v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|", - "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|", - "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)| (*)", - "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|json,serde,std", - "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|json,serde,std (*)", - "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde,std", - "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde,std (*)", - "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|", - "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)| (*)", + "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde,std", + "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde,std (*)", + "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde,std", + "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde,std (*)", + "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde,std", + "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde,std (*)", + "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|json,serde,std", + "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|json,serde,std (*)", + "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde,std", + "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde,std (*)", + "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|blossom,events,std", + "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|blossom,events,std (*)", + "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde,std", + "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde,std (*)", + "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|blossom,nostr,sqlite,sync", + "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|blossom,nostr,sqlite,sync (*)", + "radroots_secrets v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|", + "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde,std", + "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde,std (*)", + "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde", + "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde (*)", + "radroots_storage_sqlite v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|", + "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|", + "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)| (*)", + "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|json,serde,std", + "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|json,serde,std (*)", + "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde,std", + "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde,std (*)", + "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|", + "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)| (*)", "rand v0.8.7|alloc,getrandom,libc,rand_chacha,std,std_rng", "rand v0.9.5|alloc,default,os_rng,small_rng,std,std_rng,thread_rng", "rand_chacha v0.3.1|std", @@ -381,15 +381,15 @@ "symbol_reader": "llvm-nm, compatible with GNU nm\nLLVM (http://llvm.org/):\n LLVM version 22.1.6-rust-1.97.1-stable\n Optimized build.", "target": "aarch64-apple-ios-sim" }, - "cargo_lock_sha256": "e191ca1e3e73c6c1414169f3ae4ef8b6c2140c2598c10b09109d88c4260eb8d0", + "cargo_lock_sha256": "62a48bf3f3989c1fa0737a76a238f58104c55cf42711176ff361a5acb305fa02", "disposition": "local_staged_source_only", "foundation": { "architecture": "radroots.crates.release.v2", - "lockfile_sha256": "e191ca1e3e73c6c1414169f3ae4ef8b6c2140c2598c10b09109d88c4260eb8d0", + "lockfile_sha256": "62a48bf3f3989c1fa0737a76a238f58104c55cf42711176ff361a5acb305fa02", "repository": "https://github.com/radrootslabs/lib", - "revision": "363b9be18831be2fd6ef505d6154fb878ed8efd7", + "revision": "d3332ff1c68245a232f093434ee35fe2a342ed38", "schema": "radroots.lib.source-lock.v1", - "source_archive_sha256": "9c9af522b74a2b342c0202cc919189d5234a4de2bc7bbb7c96b4e3c3696e5a6a", + "source_archive_sha256": "fc3cc82de74e0db7a640f8dfddb6eb0c8402b38cfebe14a2dbb61856561f3856", "version": "0.1.0-alpha", "workspace_catalog_sha256": "ee295f2352e2577a4052d980624415aec9871197d4fc9910a4c21c83a9179200" }, @@ -498,15 +498,15 @@ "files": { "Cargo.lock": { "bytes": 94853, - "git_blob": "eb2f815db496f5a7651fe698e71f6766c8dc5674", + "git_blob": "4eaa9a35cc43f407a1da15aef6b30a50ce6ae336", "mode": "100644", - "sha256": "e191ca1e3e73c6c1414169f3ae4ef8b6c2140c2598c10b09109d88c4260eb8d0" + "sha256": "62a48bf3f3989c1fa0737a76a238f58104c55cf42711176ff361a5acb305fa02" }, "Cargo.toml": { "bytes": 4442, - "git_blob": "bee7a05c0fe55a2979f174a6bc839ddd0c5e5bf0", + "git_blob": "b76fa73c06a6178ff196fd733ace45a7ed5b337d", "mode": "100644", - "sha256": "e179e1251a94766787c8d76153c8c2f0fcab30ba2a29d369d02756f27b4b3983" + "sha256": "a598efa44c347ea8e07e9ba59ff78bb04f1ee272e86168b1a385767d0ebe5acd" }, "Makefile": { "bytes": 3934, @@ -1380,9 +1380,9 @@ }, "radroots.lib.source-lock.v1.toml": { "bytes": 482, - "git_blob": "d8d25e5b4f516bad46fccb2bf560bfd9c858c177", + "git_blob": "afef222c863e3456d0cc55ecda3705db8f34339a", "mode": "100644", - "sha256": "6820983b4309ce49a37bac587eb90b28d5cdecb9ce7ad3aab51477322efe9533" + "sha256": "64c993dcde1de74fae4a02ca0c1e53e75cb90de20f081913ca50b3f136edcd99" }, "rust-toolchain.toml": { "bytes": 79, @@ -1698,6 +1698,6 @@ } }, "policy": "staged_inputs", - "tree": "d2d70cf73831ad89f077bf5ff5158fa6bcf55638" + "tree": "57e99e1ced148e6e75bc0718272dad8faff1c366" } } diff --git a/TeraFFI/source/aarch64-apple-ios.json b/TeraFFI/source/aarch64-apple-ios.json @@ -186,36 +186,36 @@ "proc-macro2 v1.0.107|default,proc-macro (*)", "quote v1.0.47|default,proc-macro", "quote v1.0.47|default,proc-macro (*)", - "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde,std", - "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde,std (*)", - "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde,std", - "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde,std (*)", - "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde,std", - "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde,std (*)", - "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|json,serde,std", - "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|json,serde,std (*)", - "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde,std", - "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde,std (*)", - "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|blossom,events,std", - "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|blossom,events,std (*)", - "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde,std", - "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde,std (*)", - "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|blossom,nostr,sqlite,sync", - "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|blossom,nostr,sqlite,sync (*)", - "radroots_secrets v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|", - "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde,std", - "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde,std (*)", - "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde", - "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde (*)", - "radroots_storage_sqlite v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|", - "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|", - "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)| (*)", - "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|json,serde,std", - "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|json,serde,std (*)", - "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde,std", - "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|serde,std (*)", - "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)|", - "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be1)| (*)", + "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde,std", + "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde,std (*)", + "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde,std", + "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde,std (*)", + "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde,std", + "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde,std (*)", + "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|json,serde,std", + "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|json,serde,std (*)", + "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde,std", + "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde,std (*)", + "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|blossom,events,std", + "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|blossom,events,std (*)", + "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde,std", + "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde,std (*)", + "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|blossom,nostr,sqlite,sync", + "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|blossom,nostr,sqlite,sync (*)", + "radroots_secrets v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|", + "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde,std", + "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde,std (*)", + "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde", + "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde (*)", + "radroots_storage_sqlite v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|", + "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|", + "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)| (*)", + "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|json,serde,std", + "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|json,serde,std (*)", + "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde,std", + "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|serde,std (*)", + "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)|", + "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1)| (*)", "rand v0.8.7|alloc,getrandom,libc,rand_chacha,std,std_rng", "rand v0.9.5|alloc,default,os_rng,small_rng,std,std_rng,thread_rng", "rand_chacha v0.3.1|std", @@ -381,15 +381,15 @@ "symbol_reader": "llvm-nm, compatible with GNU nm\nLLVM (http://llvm.org/):\n LLVM version 22.1.6-rust-1.97.1-stable\n Optimized build.", "target": "aarch64-apple-ios" }, - "cargo_lock_sha256": "e191ca1e3e73c6c1414169f3ae4ef8b6c2140c2598c10b09109d88c4260eb8d0", + "cargo_lock_sha256": "62a48bf3f3989c1fa0737a76a238f58104c55cf42711176ff361a5acb305fa02", "disposition": "local_staged_source_only", "foundation": { "architecture": "radroots.crates.release.v2", - "lockfile_sha256": "e191ca1e3e73c6c1414169f3ae4ef8b6c2140c2598c10b09109d88c4260eb8d0", + "lockfile_sha256": "62a48bf3f3989c1fa0737a76a238f58104c55cf42711176ff361a5acb305fa02", "repository": "https://github.com/radrootslabs/lib", - "revision": "363b9be18831be2fd6ef505d6154fb878ed8efd7", + "revision": "d3332ff1c68245a232f093434ee35fe2a342ed38", "schema": "radroots.lib.source-lock.v1", - "source_archive_sha256": "9c9af522b74a2b342c0202cc919189d5234a4de2bc7bbb7c96b4e3c3696e5a6a", + "source_archive_sha256": "fc3cc82de74e0db7a640f8dfddb6eb0c8402b38cfebe14a2dbb61856561f3856", "version": "0.1.0-alpha", "workspace_catalog_sha256": "ee295f2352e2577a4052d980624415aec9871197d4fc9910a4c21c83a9179200" }, @@ -498,15 +498,15 @@ "files": { "Cargo.lock": { "bytes": 94853, - "git_blob": "eb2f815db496f5a7651fe698e71f6766c8dc5674", + "git_blob": "4eaa9a35cc43f407a1da15aef6b30a50ce6ae336", "mode": "100644", - "sha256": "e191ca1e3e73c6c1414169f3ae4ef8b6c2140c2598c10b09109d88c4260eb8d0" + "sha256": "62a48bf3f3989c1fa0737a76a238f58104c55cf42711176ff361a5acb305fa02" }, "Cargo.toml": { "bytes": 4442, - "git_blob": "bee7a05c0fe55a2979f174a6bc839ddd0c5e5bf0", + "git_blob": "b76fa73c06a6178ff196fd733ace45a7ed5b337d", "mode": "100644", - "sha256": "e179e1251a94766787c8d76153c8c2f0fcab30ba2a29d369d02756f27b4b3983" + "sha256": "a598efa44c347ea8e07e9ba59ff78bb04f1ee272e86168b1a385767d0ebe5acd" }, "Makefile": { "bytes": 3934, @@ -1380,9 +1380,9 @@ }, "radroots.lib.source-lock.v1.toml": { "bytes": 482, - "git_blob": "d8d25e5b4f516bad46fccb2bf560bfd9c858c177", + "git_blob": "afef222c863e3456d0cc55ecda3705db8f34339a", "mode": "100644", - "sha256": "6820983b4309ce49a37bac587eb90b28d5cdecb9ce7ad3aab51477322efe9533" + "sha256": "64c993dcde1de74fae4a02ca0c1e53e75cb90de20f081913ca50b3f136edcd99" }, "rust-toolchain.toml": { "bytes": 79, @@ -1698,6 +1698,6 @@ } }, "policy": "staged_inputs", - "tree": "d2d70cf73831ad89f077bf5ff5158fa6bcf55638" + "tree": "57e99e1ced148e6e75bc0718272dad8faff1c366" } } diff --git a/TeraTests/TeraComposerAutosaveTests.swift b/TeraTests/TeraComposerAutosaveTests.swift @@ -234,6 +234,7 @@ actor ComposerTestStorage { private var failure: Failure? private(set) var requests: [TeraComposerSaveRequest] = [] private(set) var readCount = 0 + private(set) var cancelledWrites = 0 let completed = ResourceTestGate() nonisolated var port: TeraComposerPersistence { @@ -263,6 +264,9 @@ actor ComposerTestStorage { let failure = failure self.failure = nil await pause?.wait() + if Task.isCancelled { + cancelledWrites += 1 + } if failure == .beforeCommit { throw TeraComposerAcknowledgment.unconfirmed } diff --git a/TeraTests/TeraComposerDurabilityBoundaryTests.swift b/TeraTests/TeraComposerDurabilityBoundaryTests.swift @@ -0,0 +1,104 @@ +import Foundation +@testable import TeraApp +import XCTest + +@MainActor +final class TeraComposerDurabilityBoundaryTests: XCTestCase { + func testTypedStorageAndProtectedDataFailuresKeepEditingAndNeverClaimSaved() async throws { + // Actual SQLite COMMIT/capacity/busy faults are qualified by the owning + // storage crate. This fixture checks their typed host presentation boundary. + let cases: [(String, TeraUserMessageKey)] = [ + ("storage_space_insufficient", .storageFull), + ("database_busy", .secureStateUnavailable), + ("composer_storage_failed", .secureStateUnavailable), + ("protected_data_unavailable", .protectedDataUnavailable), + ] + for (code, message) in cases { + let backend = try TeraScopeBackend() + let client = try await TeraScopeFixtures.client(backend) + let store = TeraAddStore(runtimeClient: client) + store.configure(snapshot: TeraScopeFixtures.snapshot()) + await store.start() + store.updateForm(\.content, "acknowledged baseline") + await store.save() + let baseline = try XCTUnwrap(store.savedComposer) + let failure = TeraRuntimeFailure.local(operation: "test.composer", code: code, + safeMessage: "Controlled unavailable storage.") + let pause = await backend.pause(.composer, failure: failure) + store.updateForm(\.content, "preserve this incomplete edit") + let save = Task { await store.save() } + await pause.entered.wait() + XCTAssertEqual(store.savedComposer, baseline) + XCTAssertNil(store.message) + await pause.resume.open() + await save.value + XCTAssertEqual(store.composerState, .failed, code) + XCTAssertEqual(store.lastFailureCode, code) + XCTAssertEqual(store.message, TeraUserMessages.text(message)) + XCTAssertEqual(store.form.content, "preserve this incomplete edit") + XCTAssertEqual(store.savedComposer, baseline) + store.updateForm(\.content, "newest retained edit") + await store.save() + let retried = try XCTUnwrap(store.savedComposer) + XCTAssertEqual(retried.id, baseline.id) + XCTAssertEqual(retried.revision, baseline.revision + 1) + XCTAssertEqual(retried.form.content, "newest retained edit") + XCTAssertEqual(store.composerState, .saved) + XCTAssertEqual(store.message, "Draft saved on this device.") + store.stop() + _ = try await client.stop() + } + } + + func testUnavailableProtectedDataRejectsProductionStartupAndReopensBaselineAfterUnlock() async throws { + let fixture = try MediaOwnershipFixture() + defer { fixture.remove() } + let signer = ComposerForbiddenSigner() + let client = TeraRuntimeClient.production() + let available = configuration(fixture, signer: signer, protectedData: .available) + let snapshot = try await client.start(configuration: available) + let store = TeraAddStore(runtimeClient: client) + store.configure(snapshot: snapshot) + await store.start() + store.updateForm(\.content, "committed before protected data became unavailable") + await store.save() + let baseline = try XCTUnwrap(store.savedComposer) + store.stop() + _ = try await client.stop() + do { + _ = try await client.start(configuration: configuration(fixture, signer: signer, protectedData: .unavailable)) + XCTFail("Unavailable protected data must deny the actual runtime startup.") + } catch let TeraRuntimeClientError.startup(failure) { + XCTAssertEqual(failure.code, "protected_data_unavailable") + XCTAssertEqual(TeraUserMessages.key(for: failure, fallback: .startupFailed), .protectedDataUnavailable) + } + do { + _ = try await client.saveComposer(request: TeraComposerSaveRequest( + scope: baseline.scope, id: baseline.id, expectedRevision: baseline.revision, + editSequence: baseline.editSequence + 1, form: baseline.form + )) + XCTFail("A stopped runtime must never acknowledge a write.") + } catch { XCTAssertEqual(error as? TeraRuntimeClientError, .notRunning) } + _ = try await client.start(configuration: available) + let reopened = try await client.loadComposer(scope: baseline.scope, id: baseline.id) + XCTAssertEqual(reopened, baseline) + _ = try await client.stop() + let signingRequests = await signer.requests + XCTAssertEqual(signingRequests, 0) + } + + private func configuration( + _ fixture: MediaOwnershipFixture, signer: ComposerForbiddenSigner, protectedData: TeraProtectedDataState + ) -> TeraRuntimeLaunchConfiguration { + TeraRuntimeLaunchConfiguration( + applicationSupportDirectory: fixture.root.path, + publicKeyHex: "79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", + sourceGenerationHex: String(repeating: "04", count: 32), + sourceGenerationCreatedAtUnixMilliseconds: 1_800_000_000_000, + protectedData: protectedData, networkProfile: .publicNetwork, + writableRelays: ["wss://relay.example"], blossom: nil, + app: TeraRuntimeAppMetadata(bundleIdentifier: "test.composer-durability", version: "1", buildNumber: "1", buildSHA: nil), + signerGeneration: "composer-durability", signer: signer, adoptBootstrapSettings: false + ) + } +} diff --git a/TeraTests/TeraComposerSaveLatencyTests.swift b/TeraTests/TeraComposerSaveLatencyTests.swift @@ -0,0 +1,89 @@ +import Foundation +@testable import TeraApp +import XCTest + +@MainActor +final class TeraComposerSaveLatencyTests: XCTestCase { + func testTextOnlyExplicitSaveMeasuresActualDurableReceiptsAndReopen() async throws { + let fixture = try MediaOwnershipFixture() + defer { fixture.remove() } + let signer = ComposerForbiddenSigner() + let configuration = configuration(fixture, signer: signer) + let client = TeraRuntimeClient.production() + let snapshot = try await client.start(configuration: configuration) + let store = TeraAddStore(runtimeClient: client) + store.configure(snapshot: snapshot) + await store.start() + store.updateForm(\.content, "warm text-only save") + await store.save() + var previous = try XCTUnwrap(store.savedComposer) + var samples: [Double] = [] + let clock = ContinuousClock() + for index in 0 ..< 24 { + let content = "bounded text-only sample \(index)" + store.updateForm(\.content, content) + let started = clock.now + await store.save() + let duration = started.duration(to: clock.now).components + samples.append(Double(duration.seconds) * 1000 + Double(duration.attoseconds) / 1e15) + let saved = try XCTUnwrap(store.savedComposer) + XCTAssertEqual(store.composerState, .saved) + XCTAssertEqual(saved.form.content, content) + XCTAssertTrue(saved.form.media.isEmpty) + XCTAssertEqual(saved.id, previous.id) + XCTAssertEqual(saved.revision, previous.revision + 1) + previous = saved + } + store.stop() + _ = try await client.stop() + _ = try await client.start(configuration: configuration) + let reopened = try await client.loadComposer(scope: previous.scope, id: previous.id) + XCTAssertEqual(reopened, previous) + _ = try await client.stop() + let signingRequests = await signer.requests + XCTAssertEqual(signingRequests, 0) + try record(samples) + } + + private func record(_ samples: [Double]) throws { + XCTAssertEqual(samples.count, 24) + XCTAssertTrue(samples.allSatisfy { $0.isFinite && $0 >= 0 }) + let ordered = samples.sorted() + #if targetEnvironment(simulator) + let platform = "ios_simulator" + #else + let platform = "ios_physical_device" + #endif + let value: [String: Any] = try [ + "schema": "tera.explicit-save-latency.v1", + "platform": platform, + "os": ProcessInfo.processInfo.operatingSystemVersionString, + "sample_count": samples.count, + "warmup_count": 1, + "samples_ms": samples, + "p50_ms": ordered[ordered.count / 2], + "p95_ms": ordered[Int(ceil(Double(ordered.count) * 0.95)) - 1], + "max_ms": XCTUnwrap(ordered.last), + "measurement": "Explicit Add Save through production FFI to its acknowledged receipt; final revision reopened.", + ] + let data = try JSONSerialization.data(withJSONObject: value, options: [.sortedKeys]) + let attachment = XCTAttachment(data: data, uniformTypeIdentifier: "public.json") + attachment.name = "tera-explicit-save-latency.json" + attachment.lifetime = .keepAlways + add(attachment) + try print("TERA_EXPLICIT_SAVE_LATENCY \(XCTUnwrap(String(data: data, encoding: .utf8)))") + } + + private func configuration(_ fixture: MediaOwnershipFixture, signer: ComposerForbiddenSigner) -> TeraRuntimeLaunchConfiguration { + TeraRuntimeLaunchConfiguration( + applicationSupportDirectory: fixture.root.path, + publicKeyHex: "79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", + sourceGenerationHex: String(repeating: "04", count: 32), + sourceGenerationCreatedAtUnixMilliseconds: 1_800_000_000_000, + protectedData: .available, networkProfile: .publicNetwork, + writableRelays: ["wss://relay.example"], blossom: nil, + app: TeraRuntimeAppMetadata(bundleIdentifier: "test.composer-latency", version: "1", buildNumber: "1", buildSHA: nil), + signerGeneration: "composer-latency", signer: signer, adoptBootstrapSettings: false + ) + } +} diff --git a/TeraTests/TeraComposerSaveSchedulingTests.swift b/TeraTests/TeraComposerSaveSchedulingTests.swift @@ -0,0 +1,229 @@ +import Foundation +@testable import TeraApp +import XCTest + +@MainActor +final class TeraComposerSaveSchedulingTests: XCTestCase { + private let scope = TeraComposerScope(authorPublicKey: String(repeating: "a", count: 64), localNetworkID: "default") + + func testOrdinaryEditsCoalesceUntilDelayCompletes() async { + let storage = ComposerTestStorage() + let delay = ComposerCoalescingGate() + let composer = make(storage, delay: delay) + composer.change(form("first")) + await delay.entered.wait() + for index in 1 ... 1000 { + composer.change(form("edit \(index)")) + } + let before = await storage.requests + XCTAssertTrue(before.isEmpty) + XCTAssertTrue(composer.isDirty) + await delay.open() + await TeraScopeFixtures.eventually { composer.state == .saved } + let writes = await storage.requests + XCTAssertEqual(writes.count, 1) + XCTAssertEqual(writes.first?.form.content, "edit 1000") + XCTAssertEqual(writes.first?.editSequence, 1001) + } + + func testExplicitSaveCancelsOnlyPendingDelayAndWaitsForReceipt() async throws { + let storage = ComposerTestStorage() + let write = await storage.pauseNext() + let delay = ComposerCoalescingGate() + let composer = make(storage, delay: delay) + composer.change(form("pending")) + await delay.entered.wait() + let save = Task { try await composer.save(form("newest")) } + await write.entered.wait() + let cancelled = await delay.cancelled + XCTAssertTrue(cancelled) + XCTAssertNil(composer.acknowledged) + XCTAssertTrue(composer.isDirty) + await write.resume.open() + let receipt = try await save.value + XCTAssertEqual(receipt.form.content, "newest") + XCTAssertEqual(receipt.revision, 1) + let writes = await storage.requests + XCTAssertEqual(writes.count, 1) + } + + func testExplicitSaveDuringActiveWriteDrainsNewestWithoutCancellingWriter() async throws { + let storage = ComposerTestStorage() + let write = await storage.pauseNext() + let delay = ComposerCoalescingGate() + let composer = make(storage, delay: delay) + composer.change(form("first")) + await delay.entered.wait() + await delay.open() + await write.entered.wait() + let next = await storage.pauseNext() + let save = Task { try await composer.save(form("second")) } + await TeraScopeFixtures.eventually { composer.editSequence == 2 } + await write.resume.open() + await next.entered.wait() + XCTAssertEqual(composer.acknowledged?.form.content, "first") + XCTAssertTrue(composer.isDirty) + await next.resume.open() + let receipt = try await save.value + XCTAssertEqual(receipt.form.content, "second") + XCTAssertEqual(receipt.revision, 2) + let cancelledWrites = await storage.cancelledWrites + let waits = await delay.waitCount + XCTAssertEqual(cancelledWrites, 0) + XCTAssertEqual(waits, 1) + } + + func testNoOpExplicitSaveDoesNotDisableNextAutosaveDelay() async throws { + let storage = ComposerTestStorage() + let delay = ComposerCoalescingGate() + let composer = make(storage, delay: delay) + let first = try await composer.save(form("saved")) + let same = try await composer.save(form("saved")) + XCTAssertEqual(first, same) + composer.change(form("later edit")) + await delay.entered.wait() + let writes = await storage.requests + XCTAssertEqual(writes.count, 1) + XCTAssertEqual(composer.acknowledged, first) + await delay.open() + await TeraScopeFixtures.eventually { composer.state == .saved } + XCTAssertEqual(composer.acknowledged?.form.content, "later edit") + } + + func testStopCancelsDelayWithoutWritingAndResumeExplicitlySavesPendingEdit() async throws { + let storage = ComposerTestStorage() + let delay = ComposerCoalescingGate() + let composer = make(storage, delay: delay) + composer.change(form("pending")) + await delay.entered.wait() + composer.stop() + XCTAssertEqual(composer.state, .unsaved) + let writes = await storage.requests + XCTAssertTrue(writes.isEmpty) + XCTAssertNil(composer.acknowledged) + composer.resume() + let receipt = try await composer.save(form("pending")) + XCTAssertEqual(receipt.form.content, "pending") + XCTAssertEqual(receipt.revision, 1) + } + + func testReplacingScopeDuringDelaySavesOnlyTheNewScope() async throws { + let storage = ComposerTestStorage() + let delay = ComposerCoalescingGate() + let composer = make(storage, delay: delay) + composer.change(form("old scope")) + await delay.entered.wait() + let next = TeraComposerScope(authorPublicKey: scope.authorPublicKey, localNetworkID: "next") + composer.reset(scope: next) + let receipt = try await composer.save(form("new scope")) + XCTAssertEqual(receipt.scope, next) + XCTAssertEqual(receipt.form.content, "new scope") + let writes = await storage.requests + XCTAssertEqual(writes.count, 1) + XCTAssertEqual(writes.first?.scope, next) + } + + func testExplicitFlushDoesNotHideANonCancellationFailureAtDelayBoundary() async { + let storage = ComposerTestStorage() + let pause = ResourceTestPause() + let composer = TeraComposerAutosave(persistence: storage.port, delay: { + await pause.wait() + throw TeraRuntimeFailure.local(operation: "test.delay", code: "protected_data_unavailable", + safeMessage: "Protected data unavailable.") + }) + composer.reset(scope: scope) + composer.change(form("pending")) + await pause.entered.wait() + let save = Task { try await composer.save(form("newest")) } + await TeraScopeFixtures.eventually { composer.editSequence == 2 } + await pause.resume.open() + do { + _ = try await save.value + XCTFail("Only the coalescing cancellation may be bypassed.") + } catch { + XCTAssertEqual(TeraAddPresentation.failure(for: error)?.code, "protected_data_unavailable") + } + XCTAssertEqual(composer.state, .failed) + XCTAssertTrue(composer.isDirty) + XCTAssertNil(composer.acknowledged) + let writes = await storage.requests + XCTAssertTrue(writes.isEmpty) + } + + func testSaveKeepsFlushingWhenAcknowledgmentStartsASuccessorWorker() async throws { + let storage = ComposerTestStorage() + let delay = ComposerCoalescingGate() + let composer = make(storage, delay: delay) + var addedSuccessor = false + composer.stateChanged = { state in + guard state == .saved, !addedSuccessor else { return } + addedSuccessor = true + composer.change(self.form("successor edit")) + } + defer { composer.stateChanged = { _ in } } + let completed = expectation(description: "Explicit Save drains the successor without batching") + let save = Task { + defer { completed.fulfill() } + return try await composer.save(form("first edit")) + } + await fulfillment(of: [completed], timeout: 2) + // Release even on a failed expectation so a regression cannot strand work. + await delay.open() + let receipt = try await save.value + XCTAssertTrue(addedSuccessor) + XCTAssertEqual(receipt.form.content, "successor edit") + XCTAssertEqual(receipt.revision, 2) + XCTAssertEqual(composer.state, .saved) + XCTAssertFalse(composer.isDirty) + let writes = await storage.requests + let cancelledWrites = await storage.cancelledWrites + XCTAssertEqual(writes.count, 2) + XCTAssertEqual(writes.first?.id, writes.last?.id) + XCTAssertEqual(cancelledWrites, 0) + } + + private func make(_ storage: ComposerTestStorage, delay: ComposerCoalescingGate) -> TeraComposerAutosave { + let composer = TeraComposerAutosave(persistence: storage.port, delay: { try await delay.wait() }) + composer.reset(scope: scope) + return composer + } + + private func form(_ content: String) -> TeraComposerForm { + var form = TeraComposerForm(commandType: .createUpdate) + form.content = content + return form + } +} + +actor ComposerCoalescingGate { + let entered = ResourceTestGate() + private var continuation: CheckedContinuation<Void, Error>? + private var finished = false + private(set) var cancelled = false + private(set) var waitCount = 0 + + func wait() async throws { + waitCount += 1 + await entered.open() + try await withTaskCancellationHandler { + try Task.checkCancellation() + guard !finished else { return } + try await withCheckedThrowingContinuation { continuation = $0 } + } onCancel: { + Task { await self.cancel() } + } + } + + func open() { + finished = true + continuation?.resume() + continuation = nil + } + + private func cancel() { + cancelled = true + finished = true + continuation?.resume(throwing: CancellationError()) + continuation = nil + } +} diff --git a/project.yml b/project.yml @@ -48,6 +48,9 @@ targets: - path: TeraTests/TeraRuntimeClientTests.swift - path: TeraTests/TeraComposerPersistenceFFITests.swift - path: TeraTests/TeraComposerAutosaveTests.swift + - path: TeraTests/TeraComposerSaveLatencyTests.swift + - path: TeraTests/TeraComposerSaveSchedulingTests.swift + - path: TeraTests/TeraComposerDurabilityBoundaryTests.swift - path: TeraTests/TeraDraftRecoveryTests.swift - path: TeraTests/TeraEditingProtectionTests.swift - path: TeraTests/TeraEditingReplacementTests.swift diff --git a/radroots.lib.source-lock.v1.toml b/radroots.lib.source-lock.v1.toml @@ -1,8 +1,8 @@ schema = "radroots.lib.source-lock.v1" repository = "https://github.com/radrootslabs/lib" -revision = "363b9be18831be2fd6ef505d6154fb878ed8efd7" +revision = "d3332ff1c68245a232f093434ee35fe2a342ed38" architecture = "radroots.crates.release.v2" workspace_catalog_sha256 = "ee295f2352e2577a4052d980624415aec9871197d4fc9910a4c21c83a9179200" version = "0.1.0-alpha" -source_archive_sha256 = "9c9af522b74a2b342c0202cc919189d5234a4de2bc7bbb7c96b4e3c3696e5a6a" -lockfile_sha256 = "e191ca1e3e73c6c1414169f3ae4ef8b6c2140c2598c10b09109d88c4260eb8d0" +source_archive_sha256 = "fc3cc82de74e0db7a640f8dfddb6eb0c8402b38cfebe14a2dbb61856561f3856" +lockfile_sha256 = "62a48bf3f3989c1fa0737a76a238f58104c55cf42711176ff361a5acb305fa02" diff --git a/release/provenance.json b/release/provenance.json @@ -2,11 +2,11 @@ "artifacts": { "app_api_sha256": "020924097c0d7efc33128cb8fd3d3b2026d95f57c44da71880e585aff80f070b", "ffi_api_sha256": "472b6b7d854781438ff5f8dc526d22626996e3196bcb82697d195db83ec9802d", - "ffi_provenance_sha256": "3ec93a119b64fa97e6c6e293c34a7544e5286ee6a3cce24b90249cdf6f832101", + "ffi_provenance_sha256": "d56aff8833d3125a11f91c5ab2a043b7beb95b164f28dc218563601365693499", "info_plist_sha256": "15ef08b1cdd1096cfb9eeaf5be5bf8f814807a7ca9350bbbb47860fa72ec13ef", "privacy_manifest_sha256": "a331d51864743ebe4e00dd22360b4a538b6b3ac26a6b3eb54094e60a36959a12", - "sbom_sha256": "61e3d99a2c7f051a91d6a38b3b1f7974fb4c56da3a1c9758f5ad06fc66f1d856", - "xcode_project_sha256": "7ad75c2109f739287070d67bb6c2e331e25f2479d9f0aaab372321e9f8460e1f" + "sbom_sha256": "374a98323bf66c55bd2f3ec28027d3068e8dccb4eeae1dbd070f0ac95fec9510", + "xcode_project_sha256": "938e68ba32d14c9bd8f43c5049709881420d15699e1bb1ae4126cf1dca8fff0c" }, "disposition": "unsigned", "platforms": [ @@ -17,12 +17,12 @@ "repository": "https://github.com/radrootslabs/tera", "schema": "tera.release-provenance.v1", "source": { - "cargo_lock_sha256": "e191ca1e3e73c6c1414169f3ae4ef8b6c2140c2598c10b09109d88c4260eb8d0", - "consumer_source_lock_sha256": "6820983b4309ce49a37bac587eb90b28d5cdecb9ce7ad3aab51477322efe9533", - "lib_revision": "363b9be18831be2fd6ef505d6154fb878ed8efd7", + "cargo_lock_sha256": "62a48bf3f3989c1fa0737a76a238f58104c55cf42711176ff361a5acb305fa02", + "consumer_source_lock_sha256": "64c993dcde1de74fae4a02ca0c1e53e75cb90de20f081913ca50b3f136edcd99", + "lib_revision": "d3332ff1c68245a232f093434ee35fe2a342ed38", "source_date_epoch": 1787871027, "swift_package_lock_sha256": "94ae067a374726cdaf6b4ca0a5e44663c57fcdc5334060c5ffef5e79cfbf04c0", - "tera_ffi_source_tree": "d2d70cf73831ad89f077bf5ff5158fa6bcf55638", + "tera_ffi_source_tree": "57e99e1ced148e6e75bc0718272dad8faff1c366", "xcode_package_lock_sha256": "c7f41934ea25f7a287bdc4f3a6ecabbf09a3a0bdd0f5a3e58183f355ca814096" }, "version": "0.1.0-alpha" diff --git a/release/sbom.cdx.json b/release/sbom.cdx.json @@ -4034,7 +4034,7 @@ "version": "6.0.0" }, { - "bom-ref": "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", + "bom-ref": "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", "licenses": [ { "expression": "MIT OR Apache-2.0" @@ -4048,14 +4048,14 @@ }, { "name": "radroots.package.source", - "value": "git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" + "value": "git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" } ], "type": "library", "version": "0.1.0-alpha" }, { - "bom-ref": "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", + "bom-ref": "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", "licenses": [ { "expression": "MIT OR Apache-2.0" @@ -4069,14 +4069,14 @@ }, { "name": "radroots.package.source", - "value": "git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" + "value": "git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" } ], "type": "library", "version": "0.1.0-alpha" }, { - "bom-ref": "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", + "bom-ref": "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", "licenses": [ { "expression": "MIT OR Apache-2.0" @@ -4090,14 +4090,14 @@ }, { "name": "radroots.package.source", - "value": "git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" + "value": "git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" } ], "type": "library", "version": "0.1.0-alpha" }, { - "bom-ref": "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", + "bom-ref": "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", "licenses": [ { "expression": "MIT OR Apache-2.0" @@ -4111,14 +4111,14 @@ }, { "name": "radroots.package.source", - "value": "git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" + "value": "git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" } ], "type": "library", "version": "0.1.0-alpha" }, { - "bom-ref": "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", + "bom-ref": "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", "licenses": [ { "expression": "MIT OR Apache-2.0" @@ -4132,14 +4132,14 @@ }, { "name": "radroots.package.source", - "value": "git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" + "value": "git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" } ], "type": "library", "version": "0.1.0-alpha" }, { - "bom-ref": "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", + "bom-ref": "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", "licenses": [ { "expression": "MIT OR Apache-2.0" @@ -4153,14 +4153,14 @@ }, { "name": "radroots.package.source", - "value": "git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" + "value": "git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" } ], "type": "library", "version": "0.1.0-alpha" }, { - "bom-ref": "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", + "bom-ref": "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", "licenses": [ { "expression": "MIT OR Apache-2.0" @@ -4174,14 +4174,14 @@ }, { "name": "radroots.package.source", - "value": "git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" + "value": "git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" } ], "type": "library", "version": "0.1.0-alpha" }, { - "bom-ref": "cargo:radroots_sdk@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", + "bom-ref": "cargo:radroots_sdk@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", "licenses": [ { "expression": "MIT OR Apache-2.0" @@ -4195,14 +4195,14 @@ }, { "name": "radroots.package.source", - "value": "git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" + "value": "git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" } ], "type": "library", "version": "0.1.0-alpha" }, { - "bom-ref": "cargo:radroots_secrets@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", + "bom-ref": "cargo:radroots_secrets@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", "licenses": [ { "expression": "MIT OR Apache-2.0" @@ -4216,14 +4216,14 @@ }, { "name": "radroots.package.source", - "value": "git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" + "value": "git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" } ], "type": "library", "version": "0.1.0-alpha" }, { - "bom-ref": "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", + "bom-ref": "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", "licenses": [ { "expression": "MIT OR Apache-2.0" @@ -4237,14 +4237,14 @@ }, { "name": "radroots.package.source", - "value": "git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" + "value": "git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" } ], "type": "library", "version": "0.1.0-alpha" }, { - "bom-ref": "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", + "bom-ref": "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", "licenses": [ { "expression": "MIT OR Apache-2.0" @@ -4258,14 +4258,14 @@ }, { "name": "radroots.package.source", - "value": "git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" + "value": "git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" } ], "type": "library", "version": "0.1.0-alpha" }, { - "bom-ref": "cargo:radroots_storage_sqlite@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", + "bom-ref": "cargo:radroots_storage_sqlite@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", "licenses": [ { "expression": "MIT OR Apache-2.0" @@ -4279,14 +4279,14 @@ }, { "name": "radroots.package.source", - "value": "git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" + "value": "git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" } ], "type": "library", "version": "0.1.0-alpha" }, { - "bom-ref": "cargo:radroots_sync@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", + "bom-ref": "cargo:radroots_sync@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", "licenses": [ { "expression": "MIT OR Apache-2.0" @@ -4300,14 +4300,14 @@ }, { "name": "radroots.package.source", - "value": "git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" + "value": "git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" } ], "type": "library", "version": "0.1.0-alpha" }, { - "bom-ref": "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", + "bom-ref": "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", "licenses": [ { "expression": "MIT OR Apache-2.0" @@ -4321,14 +4321,14 @@ }, { "name": "radroots.package.source", - "value": "git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" + "value": "git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" } ], "type": "library", "version": "0.1.0-alpha" }, { - "bom-ref": "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", + "bom-ref": "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", "licenses": [ { "expression": "MIT OR Apache-2.0" @@ -4342,14 +4342,14 @@ }, { "name": "radroots.package.source", - "value": "git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" + "value": "git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" } ], "type": "library", "version": "0.1.0-alpha" }, { - "bom-ref": "cargo:radroots_transport_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", + "bom-ref": "cargo:radroots_transport_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", "licenses": [ { "expression": "MIT OR Apache-2.0" @@ -4363,7 +4363,7 @@ }, { "name": "radroots.package.source", - "value": "git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" + "value": "git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" } ], "type": "library", @@ -9273,45 +9273,45 @@ "cargo:unicode-general-category@1.1.0?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:url@2.5.8?source=registry+https://github.com/rust-lang/crates.io-index" ], - "ref": "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" + "ref": "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" }, { "dependsOn": [ "cargo:rust_decimal@1.42.1?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:serde@1.0.229?source=registry+https://github.com/rust-lang/crates.io-index" ], - "ref": "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" + "ref": "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" }, { "dependsOn": [ "cargo:hex@0.4.3?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:jiff-tzdb@0.1.8?source=registry+https://github.com/rust-lang/crates.io-index", - "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", + "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", "cargo:serde@1.0.229?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:serde_json@1.0.151?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:sha2@0.10.9?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:unicode-general-category@1.1.0?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:url@2.5.8?source=registry+https://github.com/rust-lang/crates.io-index" ], - "ref": "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" + "ref": "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" }, { "dependsOn": [ "cargo:hex@0.4.3?source=registry+https://github.com/rust-lang/crates.io-index", - "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", + "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", "cargo:secp256k1@0.29.1?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:serde@1.0.229?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:serde_json@1.0.151?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:sha2@0.10.9?source=registry+https://github.com/rust-lang/crates.io-index" ], - "ref": "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" + "ref": "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" }, { "dependsOn": [ @@ -9319,51 +9319,51 @@ "cargo:serde@1.0.229?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:thiserror@2.0.19?source=registry+https://github.com/rust-lang/crates.io-index" ], - "ref": "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" + "ref": "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" }, { "dependsOn": [ "cargo:base64@0.22.1?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:nostr@0.44.8?source=registry+https://github.com/rust-lang/crates.io-index", - "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", + "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", "cargo:serde@1.0.229?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:serde_json@1.0.151?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:thiserror@2.0.19?source=registry+https://github.com/rust-lang/crates.io-index" ], - "ref": "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" + "ref": "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" }, { "dependsOn": [ "cargo:serde@1.0.229?source=registry+https://github.com/rust-lang/crates.io-index" ], - "ref": "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" + "ref": "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" }, { "dependsOn": [ - "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_storage_sqlite@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_sync@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_transport_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", + "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_storage_sqlite@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_sync@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_transport_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", "cargo:reqwest@0.12.28?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:serde_json@1.0.151?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:tokio@1.53.1?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:uuid@1.24.0?source=registry+https://github.com/rust-lang/crates.io-index" ], - "ref": "cargo:radroots_sdk@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" + "ref": "cargo:radroots_sdk@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" }, { "dependsOn": [ @@ -9372,81 +9372,81 @@ "cargo:subtle@2.6.1?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:zeroize@1.9.0?source=registry+https://github.com/rust-lang/crates.io-index" ], - "ref": "cargo:radroots_secrets@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" + "ref": "cargo:radroots_secrets@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" }, { "dependsOn": [ "cargo:hex@0.4.3?source=registry+https://github.com/rust-lang/crates.io-index", - "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", + "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", "cargo:serde@1.0.229?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:sha2@0.10.9?source=registry+https://github.com/rust-lang/crates.io-index" ], - "ref": "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" + "ref": "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" }, { "dependsOn": [ - "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", + "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", "cargo:serde@1.0.229?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:sha2@0.10.9?source=registry+https://github.com/rust-lang/crates.io-index" ], - "ref": "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" + "ref": "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" }, { "dependsOn": [ "cargo:fs2@0.4.3?source=registry+https://github.com/rust-lang/crates.io-index", - "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_secrets@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", + "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_secrets@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", "cargo:serde@1.0.229?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:serde_json@1.0.151?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:sha2@0.10.9?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:sqlx@0.9.0?source=registry+https://github.com/rust-lang/crates.io-index" ], - "ref": "cargo:radroots_storage_sqlite@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" + "ref": "cargo:radroots_storage_sqlite@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" }, { "dependsOn": [ - "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", + "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", "cargo:sha2@0.10.9?source=registry+https://github.com/rust-lang/crates.io-index" ], - "ref": "cargo:radroots_sync@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" + "ref": "cargo:radroots_sync@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" }, { "dependsOn": [ "cargo:hex@0.4.3?source=registry+https://github.com/rust-lang/crates.io-index", - "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", + "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", "cargo:serde@1.0.229?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:serde_json@1.0.151?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:sha2@0.10.9?source=registry+https://github.com/rust-lang/crates.io-index" ], - "ref": "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" + "ref": "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" }, { "dependsOn": [ - "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", + "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", "cargo:serde@1.0.229?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:sha2@0.10.9?source=registry+https://github.com/rust-lang/crates.io-index" ], - "ref": "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" + "ref": "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" }, { "dependsOn": [ @@ -9454,17 +9454,17 @@ "cargo:futures@0.3.33?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:nostr-relay-pool@0.44.3?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:nostr-sdk@0.44.1?source=registry+https://github.com/rust-lang/crates.io-index", - "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", + "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", "cargo:serde_json@1.0.151?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:sha2@0.10.9?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:tokio-tungstenite@0.26.2?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:tokio@1.53.1?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:url@2.5.8?source=registry+https://github.com/rust-lang/crates.io-index" ], - "ref": "cargo:radroots_transport_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7" + "ref": "cargo:radroots_transport_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38" }, { "dependsOn": [ @@ -9959,18 +9959,18 @@ "cargo:jiff-tzdb@0.1.8?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:jiff@0.2.35?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:nostr@0.44.8?source=registry+https://github.com/rust-lang/crates.io-index", - "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_sdk@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_sync@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_transport_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", + "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_sdk@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_sync@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_transport_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", "cargo:serde@1.0.229?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:serde_json@1.0.151?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:sha2@0.10.9?source=registry+https://github.com/rust-lang/crates.io-index", @@ -9991,11 +9991,11 @@ "cargo:nostr-relay-builder@0.44.0?source=git+https://github.com/rust-nostr/nostr.git?rev=5bba5163eb77107f82c4a8262cf29d7f33a73219#5bba5163eb77107f82c4a8262cf29d7f33a73219", "cargo:nostr-sdk@0.44.0?source=git+https://github.com/rust-nostr/nostr.git?rev=5bba5163eb77107f82c4a8262cf29d7f33a73219#5bba5163eb77107f82c4a8262cf29d7f33a73219", "cargo:nostr@0.44.1?source=git+https://github.com/rust-nostr/nostr.git?rev=5bba5163eb77107f82c4a8262cf29d7f33a73219#5bba5163eb77107f82c4a8262cf29d7f33a73219", - "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_sdk@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", - "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=363b9be18831be2fd6ef505d6154fb878ed8efd7#363b9be18831be2fd6ef505d6154fb878ed8efd7", + "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_sdk@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", + "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=d3332ff1c68245a232f093434ee35fe2a342ed38#d3332ff1c68245a232f093434ee35fe2a342ed38", "cargo:rustix@1.1.4?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:secp256k1@0.29.1?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:serde_json@1.0.151?source=registry+https://github.com/rust-lang/crates.io-index",