commit dc235063d0933dbce74e10b497ce4ca6e3af4a81
parent 07b4112bb57f68c9aa54c3f3b5547304219f1736
Author: triesap <tyson@radroots.org>
Date: Mon, 21 Sep 2026 15:06:18 +0000
revision: gate retraction by target replacement evidence
- Gate each child destination on its replacement evidence
- Freeze child policy and reuse its exact signed payload
- Stop both partial branches and retain restart evidence
- Qualify native artifacts and standalone consumer checks
Diffstat:
19 files changed, 1521 insertions(+), 520 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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+source = "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+source = "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+source = "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+source = "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+source = "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+source = "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+source = "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
dependencies = [
"serde",
]
@@ -1967,7 +1967,7 @@ dependencies = [
[[package]]
name = "radroots_sdk"
version = "0.1.0-alpha"
-source = "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+source = "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+source = "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+source = "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+source = "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+source = "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+source = "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+source = "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+source = "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+source = "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
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 = "858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" }
-radroots_event = { package = "radroots_event", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" }
-radroots_event_codec = { package = "radroots_event_codec", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" }
-radroots_identity = { package = "radroots_identity", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" }
-radroots_nostr = { package = "radroots_nostr", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" }
-radroots_protocol = { package = "radroots_protocol", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" }
-radroots_sdk = { version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" }
-radroots_signing = { package = "radroots_signing", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" }
-radroots_storage = { package = "radroots_storage", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" }
-radroots_sync = { package = "radroots_sync", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" }
-radroots_transport = { package = "radroots_transport", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" }
-radroots_transport_nostr = { package = "radroots_transport_nostr", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" }
+radroots_blossom = { package = "radroots_blossom", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "77aa55c0894c0142dbae43e272a515fd093eac36" }
+radroots_event = { package = "radroots_event", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "77aa55c0894c0142dbae43e272a515fd093eac36" }
+radroots_event_codec = { package = "radroots_event_codec", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "77aa55c0894c0142dbae43e272a515fd093eac36" }
+radroots_identity = { package = "radroots_identity", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "77aa55c0894c0142dbae43e272a515fd093eac36" }
+radroots_nostr = { package = "radroots_nostr", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "77aa55c0894c0142dbae43e272a515fd093eac36" }
+radroots_protocol = { package = "radroots_protocol", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "77aa55c0894c0142dbae43e272a515fd093eac36" }
+radroots_sdk = { version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "77aa55c0894c0142dbae43e272a515fd093eac36" }
+radroots_signing = { package = "radroots_signing", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "77aa55c0894c0142dbae43e272a515fd093eac36" }
+radroots_storage = { package = "radroots_storage", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "77aa55c0894c0142dbae43e272a515fd093eac36" }
+radroots_sync = { package = "radroots_sync", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "77aa55c0894c0142dbae43e272a515fd093eac36" }
+radroots_transport = { package = "radroots_transport", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "77aa55c0894c0142dbae43e272a515fd093eac36" }
+radroots_transport_nostr = { package = "radroots_transport_nostr", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "77aa55c0894c0142dbae43e272a515fd093eac36" }
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/README.md b/README.md
@@ -279,3 +279,14 @@ retraction child. Current local card overlays also carry the exact source draft
key, so revision editing can recover the retained form from either a legacy
draft or a scoped submission. Missing forms and mismatched signed sources fail
closed; a displayed operation ID is never treated as proof of source ownership.
+
+Regular revision delivery retains the replacement's exact relay policy on its
+linked retraction child. Each deletion destination requires replacement evidence
+from that same destination; another relay's success or aggregate completion does
+not grant permission. Retries reuse the original signed child and full destination
+list, withholding ineligible and already-satisfied destinations. Cancelling a
+partial revision stops both pending branches and retains observed effects across
+reopen. Historical revision children without an exact parent link remain held;
+their signed bytes and operation identities are never rewritten or rebound to a
+guessed replacement. This restriction also holds historical independent deletions
+using the reserved revision reason. Other independent retractions remain separate.
diff --git a/TeraFFI/provenance.json b/TeraFFI/provenance.json
@@ -22,9 +22,9 @@
"sha256": "3ed9b7ece2f86e5b5d1ddc6ecbb97deb49c46ca2ea91a930eaec1b580232345c"
},
{
- "bytes": 77259512,
+ "bytes": 77372696,
"path": "TeraFFI.xcframework/ios-arm64-simulator/libtera_ffi.a",
- "sha256": "d24e6b280050d5a4df65a259ec566138da39fc8d3f34ed36dc372cad87b97006"
+ "sha256": "313fe5f37d4d6d287ff16111b2d78ddff6be9bbfddc91d00c900f13dc663abc3"
},
{
"bytes": 88720,
@@ -37,9 +37,9 @@
"sha256": "3ed9b7ece2f86e5b5d1ddc6ecbb97deb49c46ca2ea91a930eaec1b580232345c"
},
{
- "bytes": 77316536,
+ "bytes": 77464056,
"path": "TeraFFI.xcframework/ios-arm64/libtera_ffi.a",
- "sha256": "adf565cd04724e0cf7719089bba7d31d2f6e807d1a0e9a0507ddd775c5044035"
+ "sha256": "1dc05a22c3555a3cfbaf395100705603d8db72e26ed7fc56f261b6407cec8833"
},
{
"bytes": 55165,
@@ -77,34 +77,34 @@
"sha256": "3ed9b7ece2f86e5b5d1ddc6ecbb97deb49c46ca2ea91a930eaec1b580232345c"
},
{
- "bytes": 22403792,
+ "bytes": 22501008,
"path": "native/aarch64-apple-darwin/libtera_ffi.dylib",
- "sha256": "3c30d455748ceae47acce8e1806b058f44e30c62a9b46994bb03925c4effdd1e"
+ "sha256": "dbecd2c611b58ddfb4be48aa557e405feb00c3a65a106acfbfc5679c89673f8f"
},
{
- "bytes": 77259512,
+ "bytes": 77372696,
"path": "native/aarch64-apple-ios-sim/libtera_ffi.a",
- "sha256": "d24e6b280050d5a4df65a259ec566138da39fc8d3f34ed36dc372cad87b97006"
+ "sha256": "313fe5f37d4d6d287ff16111b2d78ddff6be9bbfddc91d00c900f13dc663abc3"
},
{
- "bytes": 77316536,
+ "bytes": 77464056,
"path": "native/aarch64-apple-ios/libtera_ffi.a",
- "sha256": "adf565cd04724e0cf7719089bba7d31d2f6e807d1a0e9a0507ddd775c5044035"
+ "sha256": "1dc05a22c3555a3cfbaf395100705603d8db72e26ed7fc56f261b6407cec8833"
},
{
- "bytes": 115737,
+ "bytes": 116951,
"path": "source/aarch64-apple-darwin.json",
- "sha256": "40c6fbbdf156048ced67281a8cdcc0810fdf506722410a9e1cb6624699fc0523"
+ "sha256": "0299d336cbc924f45ccf0abd04d19178cc5208b8bdfa9ea1c2885db47102ec23"
},
{
- "bytes": 115581,
+ "bytes": 116795,
"path": "source/aarch64-apple-ios-sim.json",
- "sha256": "0b6cd5afc0a0563e9d1474b733f3ea30c822ec916b890d3f59fc19aa3b2f7e27"
+ "sha256": "0c4ee663f23e810769e63f78d2f71516a4eba1d355bb2ce7796db60ec2db38ea"
},
{
- "bytes": 115577,
+ "bytes": 116791,
"path": "source/aarch64-apple-ios.json",
- "sha256": "aec7a86cbece53007b6de9181edb8f3c7c60364abcfb07d524e68eb81caaaab2"
+ "sha256": "179dfc0df05681cf5fd6e75ea70524c0a17a6dd6de8218bd6b4744ede3ddc370"
}
],
"language": "swift",
@@ -112,7 +112,7 @@
"schema": "radroots.artifact-manifest.v2",
"source": {
"repository": "https://github.com/radrootslabs/tera",
- "tree": "3fd45b713b327106c84b09a8ea06133019f86e43"
+ "tree": "3a880e433bbaa2f8e7bf09e7da296b32d2cac958"
},
"source_records": {
"aarch64-apple-darwin": "source/aarch64-apple-darwin.json",
@@ -139,9 +139,9 @@
"sha256": "3ed9b7ece2f86e5b5d1ddc6ecbb97deb49c46ca2ea91a930eaec1b580232345c"
},
{
- "bytes": 77259512,
+ "bytes": 77372696,
"path": "Tera/Frameworks/TeraFFI.xcframework/ios-arm64-simulator/libtera_ffi.a",
- "sha256": "d24e6b280050d5a4df65a259ec566138da39fc8d3f34ed36dc372cad87b97006"
+ "sha256": "313fe5f37d4d6d287ff16111b2d78ddff6be9bbfddc91d00c900f13dc663abc3"
},
{
"bytes": 88720,
@@ -154,9 +154,9 @@
"sha256": "3ed9b7ece2f86e5b5d1ddc6ecbb97deb49c46ca2ea91a930eaec1b580232345c"
},
{
- "bytes": 77316536,
+ "bytes": 77464056,
"path": "Tera/Frameworks/TeraFFI.xcframework/ios-arm64/libtera_ffi.a",
- "sha256": "adf565cd04724e0cf7719089bba7d31d2f6e807d1a0e9a0507ddd775c5044035"
+ "sha256": "1dc05a22c3555a3cfbaf395100705603d8db72e26ed7fc56f261b6407cec8833"
},
{
"bytes": 718266,
@@ -174,19 +174,19 @@
"sha256": "ac334ffc196a74bea9f23048cdab34ccb09925b60ffae9702d6bfabc1590e465"
},
{
- "bytes": 115737,
+ "bytes": 116951,
"path": "TeraFFI/source/aarch64-apple-darwin.json",
- "sha256": "40c6fbbdf156048ced67281a8cdcc0810fdf506722410a9e1cb6624699fc0523"
+ "sha256": "0299d336cbc924f45ccf0abd04d19178cc5208b8bdfa9ea1c2885db47102ec23"
},
{
- "bytes": 115581,
+ "bytes": 116795,
"path": "TeraFFI/source/aarch64-apple-ios-sim.json",
- "sha256": "0b6cd5afc0a0563e9d1474b733f3ea30c822ec916b890d3f59fc19aa3b2f7e27"
+ "sha256": "0c4ee663f23e810769e63f78d2f71516a4eba1d355bb2ce7796db60ec2db38ea"
},
{
- "bytes": 115577,
+ "bytes": 116791,
"path": "TeraFFI/source/aarch64-apple-ios.json",
- "sha256": "aec7a86cbece53007b6de9181edb8f3c7c60364abcfb07d524e68eb81caaaab2"
+ "sha256": "179dfc0df05681cf5fd6e75ea70524c0a17a6dd6de8218bd6b4744ede3ddc370"
}
],
"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 = "3fd45b713b327106c84b09a8ea06133019f86e43"
-manifest_sha256 = "f0e228bd1272bbd4bf29d8d2a11f241734a17b83575d7fca916dbfa16e70d847"
+source_tree = "3a880e433bbaa2f8e7bf09e7da296b32d2cac958"
+manifest_sha256 = "d21fc3a4670d86233045861a54bb802398a8e1296607436be83dd72aeac6fafc"
source_date_epoch = 1787871027
[foundation]
repository = "https://github.com/radrootslabs/lib"
-revision = "858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+revision = "77aa55c0894c0142dbae43e272a515fd093eac36"
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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std",
- "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std (*)",
- "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std",
- "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std (*)",
- "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std",
- "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std (*)",
- "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|json,serde,std",
- "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|json,serde,std (*)",
- "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std",
- "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std (*)",
- "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|blossom,events,std",
- "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|blossom,events,std (*)",
- "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std",
- "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std (*)",
- "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|blossom,nostr,sqlite,sync",
- "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|blossom,nostr,sqlite,sync (*)",
- "radroots_secrets v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|",
- "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std",
- "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std (*)",
- "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde",
- "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde (*)",
- "radroots_storage_sqlite v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|",
- "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|",
- "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)| (*)",
- "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|json,serde,std",
- "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|json,serde,std (*)",
- "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std",
- "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std (*)",
- "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|",
- "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)| (*)",
+ "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std",
+ "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std (*)",
+ "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std",
+ "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std (*)",
+ "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std",
+ "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std (*)",
+ "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|json,serde,std",
+ "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|json,serde,std (*)",
+ "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std",
+ "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std (*)",
+ "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|blossom,events,std",
+ "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|blossom,events,std (*)",
+ "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std",
+ "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std (*)",
+ "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|blossom,nostr,sqlite,sync",
+ "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|blossom,nostr,sqlite,sync (*)",
+ "radroots_secrets v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|",
+ "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std",
+ "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std (*)",
+ "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde",
+ "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde (*)",
+ "radroots_storage_sqlite v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|",
+ "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|",
+ "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)| (*)",
+ "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|json,serde,std",
+ "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|json,serde,std (*)",
+ "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std",
+ "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std (*)",
+ "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|",
+ "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)| (*)",
"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": "293c71b3d3a7dda121980b57e9033e97d55f8b917f5b1fd3af2231f84c37b258",
+ "cargo_lock_sha256": "6552dd4abf5d242e526d03f3a288c99384ac7a32db86b09e8980ed8a5b842ec0",
"disposition": "local_staged_source_only",
"foundation": {
"architecture": "radroots.crates.release.v2",
- "lockfile_sha256": "293c71b3d3a7dda121980b57e9033e97d55f8b917f5b1fd3af2231f84c37b258",
+ "lockfile_sha256": "6552dd4abf5d242e526d03f3a288c99384ac7a32db86b09e8980ed8a5b842ec0",
"repository": "https://github.com/radrootslabs/lib",
- "revision": "858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
+ "revision": "77aa55c0894c0142dbae43e272a515fd093eac36",
"schema": "radroots.lib.source-lock.v1",
- "source_archive_sha256": "0c0b852806a21f217c370ce69babaf19658aefbece6d63148d05260f10b2fee4",
+ "source_archive_sha256": "0aa57e84a408834686f476f1cb2d2d834d2668e541d45e40456c3de1f605d958",
"version": "0.1.0-alpha",
"workspace_catalog_sha256": "ee295f2352e2577a4052d980624415aec9871197d4fc9910a4c21c83a9179200"
},
@@ -502,15 +502,15 @@
"files": {
"Cargo.lock": {
"bytes": 94853,
- "git_blob": "e57658fc836cefb23d8f3a1d9f97a8943e009161",
+ "git_blob": "36bdf532942dfc1928bde1fd66d7f5b104a5f698",
"mode": "100644",
- "sha256": "293c71b3d3a7dda121980b57e9033e97d55f8b917f5b1fd3af2231f84c37b258"
+ "sha256": "6552dd4abf5d242e526d03f3a288c99384ac7a32db86b09e8980ed8a5b842ec0"
},
"Cargo.toml": {
"bytes": 4442,
- "git_blob": "e81101026bb570003a937760309f0fc25f77e83e",
+ "git_blob": "d9dac2b6a1c3d5836d96e7f4b8315d94a832671e",
"mode": "100644",
- "sha256": "fda4aae3af3af1cf33ed2b489c0da507ec49efb4beac517ceab84c8c56544cc1"
+ "sha256": "fe744a382442f85590d6bbfa66b2dbe33634c2b82dcdb95e3b385edd6957e9e3"
},
"Makefile": {
"bytes": 3934,
@@ -819,16 +819,16 @@
"sha256": "0dc99c1cc9cba832448368fe295a2a2b0ade4bc160d7f8f81c948b2460398794"
},
"core/crates/tera_core/src/runtime/product_surface/outbox.rs": {
- "bytes": 169119,
- "git_blob": "2558459c65b57699bdb55f69d852de087e0d89df",
+ "bytes": 165122,
+ "git_blob": "741a296cd1f0af49a275d44baef07ea691970e0b",
"mode": "100644",
- "sha256": "f959da91a304fce36fdd696663982d276a922ed853e67871f647c0096671dc39"
+ "sha256": "465c9ec4fd2b0412c60d6e956cc87bcda761fcf2190c9fd33afd6c0a9106fe5f"
},
"core/crates/tera_core/src/runtime/product_surface/outbox/advance.rs": {
- "bytes": 3226,
- "git_blob": "240483ba151c85a23635a94503f9317b1d6f1fec",
+ "bytes": 3981,
+ "git_blob": "d04f03090de9b0b61b11aa9b7792ac6898701391",
"mode": "100644",
- "sha256": "3ea5b554af27eb7d666a9cd4a2414a3c1cb59e0fa162632d1c77661fa7dfd579"
+ "sha256": "cb35de1bc4dc0f83a7b471af447cc2042527140b91a6ffcdac92e44d2b3d1e4d"
},
"core/crates/tera_core/src/runtime/product_surface/outbox/configuration.rs": {
"bytes": 5088,
@@ -878,6 +878,18 @@
"mode": "100644",
"sha256": "129522c664188effaacc3112f023cd3a5d044b574ab74e5e15917bae954de84f"
},
+ "core/crates/tera_core/src/runtime/product_surface/outbox/revision_coordinator.rs": {
+ "bytes": 7032,
+ "git_blob": "fc87aeebc4bdc2b021c8b3e1440a30eada5356d0",
+ "mode": "100644",
+ "sha256": "ac09cb352f40b44278db5bc193b77c60ef28bfe2489f9c88fba2b02d31a66973"
+ },
+ "core/crates/tera_core/src/runtime/product_surface/outbox/revision_delivery.rs": {
+ "bytes": 9051,
+ "git_blob": "d3b19c0a486df2baf0e9b6bedab0b97fa88adbc0",
+ "mode": "100644",
+ "sha256": "b61cb151d4fc6b5f5213c6a0736a745f56bcacd629b9cb9560b4bad9c61cf446"
+ },
"core/crates/tera_core/src/runtime/product_surface/outbox/revision_preparation.rs": {
"bytes": 3830,
"git_blob": "c07fd490205db0b537c427f9dda8d20b14e1dd25",
@@ -896,11 +908,23 @@
"mode": "100644",
"sha256": "f627f5c0461cdb233f58b24a25b2e9dc79c3f14c6418dec0e1ee05874a5284df"
},
+ "core/crates/tera_core/src/runtime/product_surface/outbox/tests/revision_delivery_support.rs": {
+ "bytes": 5533,
+ "git_blob": "9684b217aa4bf7443220156a8ed7a128ecbbbf96",
+ "mode": "100644",
+ "sha256": "bbde9a37966c44c2923d52748173ea6e34a54b53977e766a239460c58136cf80"
+ },
+ "core/crates/tera_core/src/runtime/product_surface/outbox/tests/revision_delivery_tests.rs": {
+ "bytes": 12417,
+ "git_blob": "6fc88e1e9916b0f9a534c1b215efbea743a2d74c",
+ "mode": "100644",
+ "sha256": "64115d7cbca899a6f4917a2fc637cf488475ed1b3049ec781d1f8a5a6e913f78"
+ },
"core/crates/tera_core/src/runtime/product_surface/outbox/tests/revision_preparation_tests.rs": {
- "bytes": 10605,
- "git_blob": "865abe9dc4efc1689f22780f2a8e588e943f1ec7",
+ "bytes": 10823,
+ "git_blob": "c73b288ac2a6229928e0d4e9159fed123145c597",
"mode": "100644",
- "sha256": "92a61fc686bc94cdfd84215d2b3108c839107c11aa9165d3e340d6b9281a45a3"
+ "sha256": "707a8e087f5ec9b43f71812f0ae2ff37edabe9b75d0b5031415d0f03e2cfd1a0"
},
"core/crates/tera_core/src/runtime/product_surface/outbox/upload_attempt.rs": {
"bytes": 6104,
@@ -2134,9 +2158,9 @@
},
"radroots.lib.source-lock.v1.toml": {
"bytes": 482,
- "git_blob": "64ee82bfefca72ade8c0be6b8e2c4689d0320313",
+ "git_blob": "37f3e153aca391daaff39885ee153540e0a5bee6",
"mode": "100644",
- "sha256": "6ca89e25c098bc3adc34f67a26713be23e8f9b2826273034b8cd71f2b6e22e6d"
+ "sha256": "d668f57c9b6ecbea1ccb90d058153b475161d9da43173bb2d6476507a033c193"
},
"rust-toolchain.toml": {
"bytes": 79,
@@ -2457,13 +2481,13 @@
"sha256": "b052a73a824e8f8b26af2646a4758f13655e04de9551a8271890d3cf2b63209d"
},
"test-fixtures/legacy-identifiers.v1.json": {
- "bytes": 163937,
- "git_blob": "f84e2e61c79e37841308bd9fdfc5fb65eeab15ff",
+ "bytes": 164555,
+ "git_blob": "c1c05c5f223b805486a68eb2e8769d085fddb908",
"mode": "100644",
- "sha256": "1280f3412487b43e977a090b14dca04cc19d3a9b1cd70249516c08cec973e351"
+ "sha256": "51d3624831e9ae1e1d235981fae688f1650da0b1d16e5a400ba627aa3b858868"
}
},
"policy": "staged_inputs",
- "tree": "3fd45b713b327106c84b09a8ea06133019f86e43"
+ "tree": "3a880e433bbaa2f8e7bf09e7da296b32d2cac958"
}
}
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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std",
- "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std (*)",
- "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std",
- "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std (*)",
- "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std",
- "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std (*)",
- "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|json,serde,std",
- "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|json,serde,std (*)",
- "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std",
- "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std (*)",
- "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|blossom,events,std",
- "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|blossom,events,std (*)",
- "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std",
- "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std (*)",
- "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|blossom,nostr,sqlite,sync",
- "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|blossom,nostr,sqlite,sync (*)",
- "radroots_secrets v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|",
- "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std",
- "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std (*)",
- "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde",
- "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde (*)",
- "radroots_storage_sqlite v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|",
- "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|",
- "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)| (*)",
- "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|json,serde,std",
- "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|json,serde,std (*)",
- "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std",
- "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std (*)",
- "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|",
- "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)| (*)",
+ "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std",
+ "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std (*)",
+ "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std",
+ "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std (*)",
+ "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std",
+ "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std (*)",
+ "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|json,serde,std",
+ "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|json,serde,std (*)",
+ "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std",
+ "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std (*)",
+ "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|blossom,events,std",
+ "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|blossom,events,std (*)",
+ "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std",
+ "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std (*)",
+ "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|blossom,nostr,sqlite,sync",
+ "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|blossom,nostr,sqlite,sync (*)",
+ "radroots_secrets v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|",
+ "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std",
+ "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std (*)",
+ "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde",
+ "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde (*)",
+ "radroots_storage_sqlite v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|",
+ "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|",
+ "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)| (*)",
+ "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|json,serde,std",
+ "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|json,serde,std (*)",
+ "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std",
+ "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std (*)",
+ "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|",
+ "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)| (*)",
"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": "293c71b3d3a7dda121980b57e9033e97d55f8b917f5b1fd3af2231f84c37b258",
+ "cargo_lock_sha256": "6552dd4abf5d242e526d03f3a288c99384ac7a32db86b09e8980ed8a5b842ec0",
"disposition": "local_staged_source_only",
"foundation": {
"architecture": "radroots.crates.release.v2",
- "lockfile_sha256": "293c71b3d3a7dda121980b57e9033e97d55f8b917f5b1fd3af2231f84c37b258",
+ "lockfile_sha256": "6552dd4abf5d242e526d03f3a288c99384ac7a32db86b09e8980ed8a5b842ec0",
"repository": "https://github.com/radrootslabs/lib",
- "revision": "858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
+ "revision": "77aa55c0894c0142dbae43e272a515fd093eac36",
"schema": "radroots.lib.source-lock.v1",
- "source_archive_sha256": "0c0b852806a21f217c370ce69babaf19658aefbece6d63148d05260f10b2fee4",
+ "source_archive_sha256": "0aa57e84a408834686f476f1cb2d2d834d2668e541d45e40456c3de1f605d958",
"version": "0.1.0-alpha",
"workspace_catalog_sha256": "ee295f2352e2577a4052d980624415aec9871197d4fc9910a4c21c83a9179200"
},
@@ -498,15 +498,15 @@
"files": {
"Cargo.lock": {
"bytes": 94853,
- "git_blob": "e57658fc836cefb23d8f3a1d9f97a8943e009161",
+ "git_blob": "36bdf532942dfc1928bde1fd66d7f5b104a5f698",
"mode": "100644",
- "sha256": "293c71b3d3a7dda121980b57e9033e97d55f8b917f5b1fd3af2231f84c37b258"
+ "sha256": "6552dd4abf5d242e526d03f3a288c99384ac7a32db86b09e8980ed8a5b842ec0"
},
"Cargo.toml": {
"bytes": 4442,
- "git_blob": "e81101026bb570003a937760309f0fc25f77e83e",
+ "git_blob": "d9dac2b6a1c3d5836d96e7f4b8315d94a832671e",
"mode": "100644",
- "sha256": "fda4aae3af3af1cf33ed2b489c0da507ec49efb4beac517ceab84c8c56544cc1"
+ "sha256": "fe744a382442f85590d6bbfa66b2dbe33634c2b82dcdb95e3b385edd6957e9e3"
},
"Makefile": {
"bytes": 3934,
@@ -815,16 +815,16 @@
"sha256": "0dc99c1cc9cba832448368fe295a2a2b0ade4bc160d7f8f81c948b2460398794"
},
"core/crates/tera_core/src/runtime/product_surface/outbox.rs": {
- "bytes": 169119,
- "git_blob": "2558459c65b57699bdb55f69d852de087e0d89df",
+ "bytes": 165122,
+ "git_blob": "741a296cd1f0af49a275d44baef07ea691970e0b",
"mode": "100644",
- "sha256": "f959da91a304fce36fdd696663982d276a922ed853e67871f647c0096671dc39"
+ "sha256": "465c9ec4fd2b0412c60d6e956cc87bcda761fcf2190c9fd33afd6c0a9106fe5f"
},
"core/crates/tera_core/src/runtime/product_surface/outbox/advance.rs": {
- "bytes": 3226,
- "git_blob": "240483ba151c85a23635a94503f9317b1d6f1fec",
+ "bytes": 3981,
+ "git_blob": "d04f03090de9b0b61b11aa9b7792ac6898701391",
"mode": "100644",
- "sha256": "3ea5b554af27eb7d666a9cd4a2414a3c1cb59e0fa162632d1c77661fa7dfd579"
+ "sha256": "cb35de1bc4dc0f83a7b471af447cc2042527140b91a6ffcdac92e44d2b3d1e4d"
},
"core/crates/tera_core/src/runtime/product_surface/outbox/configuration.rs": {
"bytes": 5088,
@@ -874,6 +874,18 @@
"mode": "100644",
"sha256": "129522c664188effaacc3112f023cd3a5d044b574ab74e5e15917bae954de84f"
},
+ "core/crates/tera_core/src/runtime/product_surface/outbox/revision_coordinator.rs": {
+ "bytes": 7032,
+ "git_blob": "fc87aeebc4bdc2b021c8b3e1440a30eada5356d0",
+ "mode": "100644",
+ "sha256": "ac09cb352f40b44278db5bc193b77c60ef28bfe2489f9c88fba2b02d31a66973"
+ },
+ "core/crates/tera_core/src/runtime/product_surface/outbox/revision_delivery.rs": {
+ "bytes": 9051,
+ "git_blob": "d3b19c0a486df2baf0e9b6bedab0b97fa88adbc0",
+ "mode": "100644",
+ "sha256": "b61cb151d4fc6b5f5213c6a0736a745f56bcacd629b9cb9560b4bad9c61cf446"
+ },
"core/crates/tera_core/src/runtime/product_surface/outbox/revision_preparation.rs": {
"bytes": 3830,
"git_blob": "c07fd490205db0b537c427f9dda8d20b14e1dd25",
@@ -892,11 +904,23 @@
"mode": "100644",
"sha256": "f627f5c0461cdb233f58b24a25b2e9dc79c3f14c6418dec0e1ee05874a5284df"
},
+ "core/crates/tera_core/src/runtime/product_surface/outbox/tests/revision_delivery_support.rs": {
+ "bytes": 5533,
+ "git_blob": "9684b217aa4bf7443220156a8ed7a128ecbbbf96",
+ "mode": "100644",
+ "sha256": "bbde9a37966c44c2923d52748173ea6e34a54b53977e766a239460c58136cf80"
+ },
+ "core/crates/tera_core/src/runtime/product_surface/outbox/tests/revision_delivery_tests.rs": {
+ "bytes": 12417,
+ "git_blob": "6fc88e1e9916b0f9a534c1b215efbea743a2d74c",
+ "mode": "100644",
+ "sha256": "64115d7cbca899a6f4917a2fc637cf488475ed1b3049ec781d1f8a5a6e913f78"
+ },
"core/crates/tera_core/src/runtime/product_surface/outbox/tests/revision_preparation_tests.rs": {
- "bytes": 10605,
- "git_blob": "865abe9dc4efc1689f22780f2a8e588e943f1ec7",
+ "bytes": 10823,
+ "git_blob": "c73b288ac2a6229928e0d4e9159fed123145c597",
"mode": "100644",
- "sha256": "92a61fc686bc94cdfd84215d2b3108c839107c11aa9165d3e340d6b9281a45a3"
+ "sha256": "707a8e087f5ec9b43f71812f0ae2ff37edabe9b75d0b5031415d0f03e2cfd1a0"
},
"core/crates/tera_core/src/runtime/product_surface/outbox/upload_attempt.rs": {
"bytes": 6104,
@@ -2130,9 +2154,9 @@
},
"radroots.lib.source-lock.v1.toml": {
"bytes": 482,
- "git_blob": "64ee82bfefca72ade8c0be6b8e2c4689d0320313",
+ "git_blob": "37f3e153aca391daaff39885ee153540e0a5bee6",
"mode": "100644",
- "sha256": "6ca89e25c098bc3adc34f67a26713be23e8f9b2826273034b8cd71f2b6e22e6d"
+ "sha256": "d668f57c9b6ecbea1ccb90d058153b475161d9da43173bb2d6476507a033c193"
},
"rust-toolchain.toml": {
"bytes": 79,
@@ -2453,13 +2477,13 @@
"sha256": "b052a73a824e8f8b26af2646a4758f13655e04de9551a8271890d3cf2b63209d"
},
"test-fixtures/legacy-identifiers.v1.json": {
- "bytes": 163937,
- "git_blob": "f84e2e61c79e37841308bd9fdfc5fb65eeab15ff",
+ "bytes": 164555,
+ "git_blob": "c1c05c5f223b805486a68eb2e8769d085fddb908",
"mode": "100644",
- "sha256": "1280f3412487b43e977a090b14dca04cc19d3a9b1cd70249516c08cec973e351"
+ "sha256": "51d3624831e9ae1e1d235981fae688f1650da0b1d16e5a400ba627aa3b858868"
}
},
"policy": "staged_inputs",
- "tree": "3fd45b713b327106c84b09a8ea06133019f86e43"
+ "tree": "3a880e433bbaa2f8e7bf09e7da296b32d2cac958"
}
}
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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std",
- "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std (*)",
- "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std",
- "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std (*)",
- "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std",
- "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std (*)",
- "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|json,serde,std",
- "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|json,serde,std (*)",
- "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std",
- "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std (*)",
- "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|blossom,events,std",
- "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|blossom,events,std (*)",
- "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std",
- "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std (*)",
- "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|blossom,nostr,sqlite,sync",
- "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|blossom,nostr,sqlite,sync (*)",
- "radroots_secrets v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|",
- "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std",
- "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std (*)",
- "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde",
- "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde (*)",
- "radroots_storage_sqlite v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|",
- "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|",
- "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)| (*)",
- "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|json,serde,std",
- "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|json,serde,std (*)",
- "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std",
- "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std (*)",
- "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|",
- "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)| (*)",
+ "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std",
+ "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std (*)",
+ "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std",
+ "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std (*)",
+ "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std",
+ "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std (*)",
+ "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|json,serde,std",
+ "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|json,serde,std (*)",
+ "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std",
+ "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std (*)",
+ "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|blossom,events,std",
+ "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|blossom,events,std (*)",
+ "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std",
+ "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std (*)",
+ "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|blossom,nostr,sqlite,sync",
+ "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|blossom,nostr,sqlite,sync (*)",
+ "radroots_secrets v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|",
+ "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std",
+ "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std (*)",
+ "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde",
+ "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde (*)",
+ "radroots_storage_sqlite v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|",
+ "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|",
+ "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)| (*)",
+ "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|json,serde,std",
+ "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|json,serde,std (*)",
+ "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std",
+ "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std (*)",
+ "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|",
+ "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)| (*)",
"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": "293c71b3d3a7dda121980b57e9033e97d55f8b917f5b1fd3af2231f84c37b258",
+ "cargo_lock_sha256": "6552dd4abf5d242e526d03f3a288c99384ac7a32db86b09e8980ed8a5b842ec0",
"disposition": "local_staged_source_only",
"foundation": {
"architecture": "radroots.crates.release.v2",
- "lockfile_sha256": "293c71b3d3a7dda121980b57e9033e97d55f8b917f5b1fd3af2231f84c37b258",
+ "lockfile_sha256": "6552dd4abf5d242e526d03f3a288c99384ac7a32db86b09e8980ed8a5b842ec0",
"repository": "https://github.com/radrootslabs/lib",
- "revision": "858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
+ "revision": "77aa55c0894c0142dbae43e272a515fd093eac36",
"schema": "radroots.lib.source-lock.v1",
- "source_archive_sha256": "0c0b852806a21f217c370ce69babaf19658aefbece6d63148d05260f10b2fee4",
+ "source_archive_sha256": "0aa57e84a408834686f476f1cb2d2d834d2668e541d45e40456c3de1f605d958",
"version": "0.1.0-alpha",
"workspace_catalog_sha256": "ee295f2352e2577a4052d980624415aec9871197d4fc9910a4c21c83a9179200"
},
@@ -498,15 +498,15 @@
"files": {
"Cargo.lock": {
"bytes": 94853,
- "git_blob": "e57658fc836cefb23d8f3a1d9f97a8943e009161",
+ "git_blob": "36bdf532942dfc1928bde1fd66d7f5b104a5f698",
"mode": "100644",
- "sha256": "293c71b3d3a7dda121980b57e9033e97d55f8b917f5b1fd3af2231f84c37b258"
+ "sha256": "6552dd4abf5d242e526d03f3a288c99384ac7a32db86b09e8980ed8a5b842ec0"
},
"Cargo.toml": {
"bytes": 4442,
- "git_blob": "e81101026bb570003a937760309f0fc25f77e83e",
+ "git_blob": "d9dac2b6a1c3d5836d96e7f4b8315d94a832671e",
"mode": "100644",
- "sha256": "fda4aae3af3af1cf33ed2b489c0da507ec49efb4beac517ceab84c8c56544cc1"
+ "sha256": "fe744a382442f85590d6bbfa66b2dbe33634c2b82dcdb95e3b385edd6957e9e3"
},
"Makefile": {
"bytes": 3934,
@@ -815,16 +815,16 @@
"sha256": "0dc99c1cc9cba832448368fe295a2a2b0ade4bc160d7f8f81c948b2460398794"
},
"core/crates/tera_core/src/runtime/product_surface/outbox.rs": {
- "bytes": 169119,
- "git_blob": "2558459c65b57699bdb55f69d852de087e0d89df",
+ "bytes": 165122,
+ "git_blob": "741a296cd1f0af49a275d44baef07ea691970e0b",
"mode": "100644",
- "sha256": "f959da91a304fce36fdd696663982d276a922ed853e67871f647c0096671dc39"
+ "sha256": "465c9ec4fd2b0412c60d6e956cc87bcda761fcf2190c9fd33afd6c0a9106fe5f"
},
"core/crates/tera_core/src/runtime/product_surface/outbox/advance.rs": {
- "bytes": 3226,
- "git_blob": "240483ba151c85a23635a94503f9317b1d6f1fec",
+ "bytes": 3981,
+ "git_blob": "d04f03090de9b0b61b11aa9b7792ac6898701391",
"mode": "100644",
- "sha256": "3ea5b554af27eb7d666a9cd4a2414a3c1cb59e0fa162632d1c77661fa7dfd579"
+ "sha256": "cb35de1bc4dc0f83a7b471af447cc2042527140b91a6ffcdac92e44d2b3d1e4d"
},
"core/crates/tera_core/src/runtime/product_surface/outbox/configuration.rs": {
"bytes": 5088,
@@ -874,6 +874,18 @@
"mode": "100644",
"sha256": "129522c664188effaacc3112f023cd3a5d044b574ab74e5e15917bae954de84f"
},
+ "core/crates/tera_core/src/runtime/product_surface/outbox/revision_coordinator.rs": {
+ "bytes": 7032,
+ "git_blob": "fc87aeebc4bdc2b021c8b3e1440a30eada5356d0",
+ "mode": "100644",
+ "sha256": "ac09cb352f40b44278db5bc193b77c60ef28bfe2489f9c88fba2b02d31a66973"
+ },
+ "core/crates/tera_core/src/runtime/product_surface/outbox/revision_delivery.rs": {
+ "bytes": 9051,
+ "git_blob": "d3b19c0a486df2baf0e9b6bedab0b97fa88adbc0",
+ "mode": "100644",
+ "sha256": "b61cb151d4fc6b5f5213c6a0736a745f56bcacd629b9cb9560b4bad9c61cf446"
+ },
"core/crates/tera_core/src/runtime/product_surface/outbox/revision_preparation.rs": {
"bytes": 3830,
"git_blob": "c07fd490205db0b537c427f9dda8d20b14e1dd25",
@@ -892,11 +904,23 @@
"mode": "100644",
"sha256": "f627f5c0461cdb233f58b24a25b2e9dc79c3f14c6418dec0e1ee05874a5284df"
},
+ "core/crates/tera_core/src/runtime/product_surface/outbox/tests/revision_delivery_support.rs": {
+ "bytes": 5533,
+ "git_blob": "9684b217aa4bf7443220156a8ed7a128ecbbbf96",
+ "mode": "100644",
+ "sha256": "bbde9a37966c44c2923d52748173ea6e34a54b53977e766a239460c58136cf80"
+ },
+ "core/crates/tera_core/src/runtime/product_surface/outbox/tests/revision_delivery_tests.rs": {
+ "bytes": 12417,
+ "git_blob": "6fc88e1e9916b0f9a534c1b215efbea743a2d74c",
+ "mode": "100644",
+ "sha256": "64115d7cbca899a6f4917a2fc637cf488475ed1b3049ec781d1f8a5a6e913f78"
+ },
"core/crates/tera_core/src/runtime/product_surface/outbox/tests/revision_preparation_tests.rs": {
- "bytes": 10605,
- "git_blob": "865abe9dc4efc1689f22780f2a8e588e943f1ec7",
+ "bytes": 10823,
+ "git_blob": "c73b288ac2a6229928e0d4e9159fed123145c597",
"mode": "100644",
- "sha256": "92a61fc686bc94cdfd84215d2b3108c839107c11aa9165d3e340d6b9281a45a3"
+ "sha256": "707a8e087f5ec9b43f71812f0ae2ff37edabe9b75d0b5031415d0f03e2cfd1a0"
},
"core/crates/tera_core/src/runtime/product_surface/outbox/upload_attempt.rs": {
"bytes": 6104,
@@ -2130,9 +2154,9 @@
},
"radroots.lib.source-lock.v1.toml": {
"bytes": 482,
- "git_blob": "64ee82bfefca72ade8c0be6b8e2c4689d0320313",
+ "git_blob": "37f3e153aca391daaff39885ee153540e0a5bee6",
"mode": "100644",
- "sha256": "6ca89e25c098bc3adc34f67a26713be23e8f9b2826273034b8cd71f2b6e22e6d"
+ "sha256": "d668f57c9b6ecbea1ccb90d058153b475161d9da43173bb2d6476507a033c193"
},
"rust-toolchain.toml": {
"bytes": 79,
@@ -2453,13 +2477,13 @@
"sha256": "b052a73a824e8f8b26af2646a4758f13655e04de9551a8271890d3cf2b63209d"
},
"test-fixtures/legacy-identifiers.v1.json": {
- "bytes": 163937,
- "git_blob": "f84e2e61c79e37841308bd9fdfc5fb65eeab15ff",
+ "bytes": 164555,
+ "git_blob": "c1c05c5f223b805486a68eb2e8769d085fddb908",
"mode": "100644",
- "sha256": "1280f3412487b43e977a090b14dca04cc19d3a9b1cd70249516c08cec973e351"
+ "sha256": "51d3624831e9ae1e1d235981fae688f1650da0b1d16e5a400ba627aa3b858868"
}
},
"policy": "staged_inputs",
- "tree": "3fd45b713b327106c84b09a8ea06133019f86e43"
+ "tree": "3a880e433bbaa2f8e7bf09e7da296b32d2cac958"
}
}
diff --git a/core/crates/tera_core/src/runtime/product_surface/outbox.rs b/core/crates/tera_core/src/runtime/product_surface/outbox.rs
@@ -46,6 +46,11 @@ use super::{
use crate::runtime::TeraRuntime;
mod advance;
+#[path = "outbox/revision_coordinator.rs"]
+mod revision_coordinator;
+#[path = "outbox/revision_delivery.rs"]
+mod revision_delivery;
+use revision_delivery::RevisionDelivery;
#[path = "outbox/configuration.rs"]
mod configuration;
#[path = "outbox/inventory.rs"]
@@ -1028,6 +1033,8 @@ struct Phase1DraftPayload {
queue: Option<Phase1QueuePolicy>,
#[serde(default)]
revision: Option<Phase1RevisionRecord>,
+ #[serde(default, skip_serializing_if = "Option::is_none")]
+ revision_parent_draft_id: Option<[u8; 16]>,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
@@ -1102,6 +1109,7 @@ impl Phase1DraftPayload {
media,
queue: None,
revision: None,
+ revision_parent_draft_id: None,
};
value.validate()?;
Ok(value)
@@ -1122,6 +1130,7 @@ impl Phase1DraftPayload {
media: Vec::new(),
queue: None,
revision: None,
+ revision_parent_draft_id: None,
};
value.validate()?;
Ok(value)
@@ -1133,7 +1142,7 @@ impl Phase1DraftPayload {
}
match self.kind {
Phase1DraftKind::Add => {
- if self.target_card_id.is_some() {
+ if self.target_card_id.is_some() || self.revision_parent_draft_id.is_some() {
return Err(Phase1DraftError::Corrupt);
}
if let Some(form) = &self.form {
@@ -1184,6 +1193,9 @@ impl Phase1DraftPayload {
return Err(Phase1DraftError::InvalidRevision);
}
}
+ if let Some(parent) = self.revision_parent_draft_id {
+ AuthoredDraftId::new(parent).map_err(|_| Phase1DraftError::Corrupt)?;
+ }
let expected_media = media_urls(plan.body().tags())?;
let actual_media = self
.media
@@ -1679,6 +1691,12 @@ impl TeraRuntime {
Some(id) => match self.phase1_draft_status(id).await {
Ok(status) => {
validate_revision_retraction(&status, &revision.target)?;
+ if Phase1DraftPayload::decode(status.draft())?
+ .revision_parent_draft_id
+ .is_some_and(|parent| parent != replacement_draft_id)
+ {
+ return Err(Phase1DraftError::Corrupt);
+ }
Some(status)
}
Err(Phase1DraftError::NotFound) => None,
@@ -1696,167 +1714,6 @@ impl TeraRuntime {
})
}
- /// Advances the replacement first and creates the NIP-09 child only after
- /// all configured replacement delivery targets accepted it.
- pub async fn phase1_advance_revision(
- &self,
- replacement_draft_id: [u8; 16],
- ) -> Result<Phase1RevisionStatus, Phase1DraftError> {
- let _command = self.lifecycle.enter()?;
- let admission = self.mutations.draft(replacement_draft_id)?;
- let mut status = self.phase1_revision_status(replacement_draft_id).await?;
- if matches!(
- status.replacement.state(),
- Phase1OutboxState::Draft | Phase1OutboxState::ReadyToSign
- ) {
- let now_unix_ms = phase1_operation_now_unix_ms()?;
- self.phase1_queue_draft_admitted(
- &admission,
- replacement_draft_id,
- status.replacement.draft().revision().get(),
- None,
- now_unix_ms,
- )
- .await?;
- status = self.phase1_revision_status(replacement_draft_id).await?;
- }
- if matches!(
- status.replacement.state(),
- Phase1OutboxState::Queued
- | Phase1OutboxState::Retryable
- | Phase1OutboxState::PartiallyDelivered
- ) {
- self.phase1_advance_draft_admitted(
- &admission,
- replacement_draft_id,
- status.replacement.draft().revision().get(),
- )
- .await?;
- status = self.phase1_revision_status(replacement_draft_id).await?;
- }
- if status.replacement.state() != Phase1OutboxState::Complete
- || status.policy != Phase1RevisionPolicy::ReplaceThenRetract
- {
- return Ok(status);
- }
-
- let child_id =
- revision_child_id(status.replacement.draft())?.ok_or(Phase1DraftError::Corrupt)?;
- if status.retraction.is_none() {
- self.phase1_create_revision_retraction(&status.target, child_id)
- .await?;
- status = self.phase1_revision_status(replacement_draft_id).await?;
- }
- let child = status
- .retraction
- .as_ref()
- .ok_or(Phase1DraftError::Corrupt)?;
- if matches!(
- child.state(),
- Phase1OutboxState::Draft | Phase1OutboxState::ReadyToSign
- ) {
- self.phase1_queue_add_intent(Phase1QueueIntent::new(
- child_id,
- child.draft().revision().get(),
- )?)
- .await?;
- status = self.phase1_revision_status(replacement_draft_id).await?;
- }
- let child = status
- .retraction
- .as_ref()
- .ok_or(Phase1DraftError::Corrupt)?;
- if matches!(
- child.state(),
- Phase1OutboxState::Queued
- | Phase1OutboxState::Retryable
- | Phase1OutboxState::PartiallyDelivered
- ) {
- self.phase1_advance_draft(child_id, child.draft().revision().get())
- .await?;
- }
- self.phase1_revision_status(replacement_draft_id).await
- }
-
- /// Cancels only still-pending work. If a kind-1 replacement is already
- /// visible, a cancelled child records the deliberate partial effect and
- /// prevents a later recovery from retracting the original unexpectedly.
- pub async fn phase1_cancel_revision(
- &self,
- replacement_draft_id: [u8; 16],
- ) -> Result<Phase1RevisionStatus, Phase1DraftError> {
- let _command = self.lifecycle.enter()?;
- let admission = self.mutations.draft(replacement_draft_id)?;
- let mut status = self.phase1_revision_status(replacement_draft_id).await?;
- if !matches!(
- status.replacement.state(),
- Phase1OutboxState::Complete
- | Phase1OutboxState::Terminal
- | Phase1OutboxState::Cancelled
- ) {
- self.phase1_cancel_draft_admitted(
- &admission,
- replacement_draft_id,
- status.replacement.draft().revision().get(),
- phase1_operation_now_unix_ms()?,
- )
- .await?;
- return self.phase1_revision_status(replacement_draft_id).await;
- }
- if status.replacement.state() == Phase1OutboxState::Complete
- && status.policy == Phase1RevisionPolicy::ReplaceThenRetract
- {
- let child_id =
- revision_child_id(status.replacement.draft())?.ok_or(Phase1DraftError::Corrupt)?;
- if status.retraction.is_none() {
- self.phase1_create_revision_retraction(&status.target, child_id)
- .await?;
- status = self.phase1_revision_status(replacement_draft_id).await?;
- }
- let child = status
- .retraction
- .as_ref()
- .ok_or(Phase1DraftError::Corrupt)?;
- if !matches!(
- child.state(),
- Phase1OutboxState::Complete
- | Phase1OutboxState::Terminal
- | Phase1OutboxState::Cancelled
- ) {
- self.phase1_cancel_add_intent(child_id, child.draft().revision().get())
- .await?;
- }
- }
- self.phase1_revision_status(replacement_draft_id).await
- }
-
- async fn phase1_create_revision_retraction(
- &self,
- target: &Phase1RevisionTarget,
- draft_id: [u8; 16],
- ) -> Result<Phase1DraftStatus, Phase1DraftError> {
- let admission = self.mutations.draft(draft_id)?;
- match self.phase1_draft_status(draft_id).await {
- Ok(existing) => return Ok(existing),
- Err(Phase1DraftError::NotFound) => {}
- Err(error) => return Err(error),
- }
- let now_unix_ms = phase1_operation_now_unix_ms()?;
- self.phase1_save_retraction_draft_admitted(
- &admission,
- draft_id,
- target.command_type,
- target.card_id,
- &target.source_event_id,
- target.source_kind,
- target.source_address.as_deref(),
- REVISION_RETRACTION_REASON,
- now_unix_ms / 1_000,
- now_unix_ms,
- )
- .await
- }
-
/// Creates or replaces the editable content of one immutable-revision draft.
#[allow(clippy::too_many_arguments)]
pub async fn phase1_save_draft(
@@ -1942,6 +1799,9 @@ impl TeraRuntime {
.ok_or(Phase1DraftError::NotFound)?;
if head.revision() != expected
|| Phase1DraftPayload::decode(&head)?.revision.is_some()
+ || Phase1DraftPayload::decode(&head)?
+ .revision_parent()?
+ .is_some()
|| head.stage().is_terminal()
|| matches!(
head.stage(),
@@ -2003,6 +1863,7 @@ impl TeraRuntime {
reason,
authored_at_unix_s,
persisted_at_unix_ms,
+ None,
)
.await
}
@@ -2020,6 +1881,7 @@ impl TeraRuntime {
reason: &str,
authored_at_unix_s: u64,
persisted_at_unix_ms: u64,
+ revision_parent_draft_id: Option<[u8; 16]>,
) -> Result<Phase1DraftStatus, Phase1DraftError> {
let target_shape_valid = match command_type {
AddCommandType::CreateUpdate
@@ -2054,7 +1916,8 @@ impl TeraRuntime {
let wire = PlanWireV1::from_plan(&plan)
.to_json()
.map_err(|_| Phase1DraftError::InvalidDraft)?;
- let payload = Phase1DraftPayload::retraction(command_type, target_card_id, wire)?;
+ let mut payload = Phase1DraftPayload::retraction(command_type, target_card_id, wire)?;
+ payload.revision_parent_draft_id = revision_parent_draft_id;
let bytes = payload.encode()?;
let draft = AuthoredDraft::initial(
draft_id,
@@ -2306,7 +2169,14 @@ impl TeraRuntime {
return Err(Phase1DraftError::RevisionConflict);
}
let mut payload = Phase1DraftPayload::decode(&head)?;
- let policy = match policy.or_else(|| payload.queue.clone()) {
+ let inherited = self.revision_child_queue_policy(&head).await?;
+ if inherited
+ .as_ref()
+ .is_some_and(|frozen| policy.as_ref().is_some_and(|policy| policy != frozen))
+ {
+ return Err(Phase1DraftError::InvalidQueuePolicy);
+ }
+ let policy = match inherited.or(policy).or_else(|| payload.queue.clone()) {
Some(policy) => policy,
None => self.active_queue_policy(queued_at_unix_ms)?,
};
@@ -2419,6 +2289,13 @@ impl TeraRuntime {
if head.revision() != expected || head.stage() != AuthoredDraftStage::Queued {
return Err(Phase1DraftError::RevisionConflict);
}
+ let _parent_admission = self.revision_parent_admission(&head)?;
+ if matches!(
+ self.revision_delivery_selection(&head).await?,
+ RevisionDelivery::Held
+ ) {
+ return self.draft_status_from(head).await;
+ }
self.require_legacy_publication_running(sync_id_for(&head)?)
.await?;
self.sync()?
@@ -2460,8 +2337,11 @@ impl TeraRuntime {
if head.revision() != expected || head.stage() != AuthoredDraftStage::Queued {
return Err(Phase1DraftError::RevisionConflict);
}
+ let _parent_admission = self.revision_parent_admission(&head)?;
let request = push_request(&head)?;
- self.advance_push_request(request).await?;
+ // Keep the effect pipeline off the caller's nested native async frame.
+ // This caller retains both mutation permits across the awaited pipeline.
+ Box::pin(self.advance_revision_child_request(&head, request)).await?;
self.draft_status_from(head).await
}
@@ -2901,6 +2781,11 @@ impl TeraRuntime {
ready: AuthoredDraft,
queued_at_unix_ms: u64,
) -> Result<Phase1DraftStatus, Phase1DraftError> {
+ if let Some(inherited) = self.revision_child_queue_policy(&ready).await?
+ && Phase1DraftPayload::decode(&ready)?.queue.as_ref() != Some(&inherited)
+ {
+ return Err(Phase1DraftError::InvalidQueuePolicy);
+ }
let request = push_request(&ready)?;
self.sync()?
.prepare_push(request)
@@ -3388,6 +3273,8 @@ fn phase1_random_id() -> Result<[u8; 16], Phase1DraftError> {
#[cfg(test)]
mod tests {
mod recovery_completion_tests;
+ mod revision_delivery_support;
+ mod revision_delivery_tests;
mod revision_preparation_tests;
use super::*;
use crate::runtime::product_surface::{
diff --git a/core/crates/tera_core/src/runtime/product_surface/outbox/advance.rs b/core/crates/tera_core/src/runtime/product_surface/outbox/advance.rs
@@ -16,6 +16,24 @@ impl TeraRuntime {
request: PushRequest,
clock: impl Fn() -> Result<u64, Phase1DraftError> + Send + Sync,
) -> Result<(), Phase1DraftError> {
+ self.advance_push_request_inner(request, None, clock).await
+ }
+
+ pub(in crate::runtime::product_surface) async fn advance_push_request_selected(
+ &self,
+ request: PushRequest,
+ selected: TargetSet,
+ ) -> Result<(), Phase1DraftError> {
+ self.advance_push_request_inner(request, Some(selected), phase1_operation_now_unix_ms)
+ .await
+ }
+
+ async fn advance_push_request_inner(
+ &self,
+ request: PushRequest,
+ selected: Option<TargetSet>,
+ clock: impl Fn() -> Result<u64, Phase1DraftError> + Send + Sync,
+ ) -> Result<(), Phase1DraftError> {
let operation_id = request.operation_id();
self.require_legacy_publication_running(operation_id)
.await?;
@@ -80,9 +98,11 @@ impl TeraRuntime {
AuthoredDeliveryState::Pending | AuthoredDeliveryState::Retryable
)
{
- sync.deliver_push(operation_id)
- .await
- .map_err(|_| Phase1DraftError::Operation)?;
+ match selected {
+ Some(targets) => sync.deliver_push_selected(operation_id, targets).await,
+ None => sync.deliver_push(operation_id).await,
+ }
+ .map_err(|_| Phase1DraftError::Operation)?;
}
Ok(())
}
diff --git a/core/crates/tera_core/src/runtime/product_surface/outbox/revision_coordinator.rs b/core/crates/tera_core/src/runtime/product_surface/outbox/revision_coordinator.rs
@@ -0,0 +1,184 @@
+//! Ordered revision coordination over durable replacement and child facts.
+
+use super::*;
+
+impl TeraRuntime {
+ /// Advances replacement and deletion independently per frozen target.
+ /// A deletion target requires its own replacement acceptance/read-back.
+ pub async fn phase1_advance_revision(
+ &self,
+ replacement_draft_id: [u8; 16],
+ ) -> Result<Phase1RevisionStatus, Phase1DraftError> {
+ let _command = self.lifecycle.enter()?;
+ let admission = self.mutations.draft(replacement_draft_id)?;
+ let mut status = self.phase1_revision_status(replacement_draft_id).await?;
+ if status.replacement.draft().stage() == AuthoredDraftStage::Cancelled
+ || status
+ .replacement
+ .push()
+ .is_some_and(|push| push.delivery_plan().stop_requested_at_unix_ms().is_some())
+ {
+ return Ok(status);
+ }
+ if matches!(
+ status.replacement.state(),
+ Phase1OutboxState::Draft | Phase1OutboxState::ReadyToSign
+ ) {
+ let now_unix_ms = phase1_operation_now_unix_ms()?;
+ self.phase1_queue_draft_admitted(
+ &admission,
+ replacement_draft_id,
+ status.replacement.draft().revision().get(),
+ None,
+ now_unix_ms,
+ )
+ .await?;
+ status = self.phase1_revision_status(replacement_draft_id).await?;
+ }
+ if matches!(
+ status.replacement.state(),
+ Phase1OutboxState::Queued
+ | Phase1OutboxState::Retryable
+ | Phase1OutboxState::PartiallyDelivered
+ ) {
+ self.phase1_advance_draft_admitted(
+ &admission,
+ replacement_draft_id,
+ status.replacement.draft().revision().get(),
+ )
+ .await?;
+ status = self.phase1_revision_status(replacement_draft_id).await?;
+ }
+ if status.policy != Phase1RevisionPolicy::ReplaceThenRetract
+ || !self
+ .revision_has_replacement_evidence(&status.replacement)
+ .await?
+ {
+ return Ok(status);
+ }
+
+ let child_id =
+ revision_child_id(status.replacement.draft())?.ok_or(Phase1DraftError::Corrupt)?;
+ if status.retraction.is_none() {
+ self.phase1_create_revision_retraction(&status.target, child_id, replacement_draft_id)
+ .await?;
+ status = self.phase1_revision_status(replacement_draft_id).await?;
+ }
+ let child = status
+ .retraction
+ .as_ref()
+ .ok_or(Phase1DraftError::Corrupt)?;
+ if matches!(
+ child.state(),
+ Phase1OutboxState::Draft | Phase1OutboxState::ReadyToSign
+ ) {
+ self.phase1_queue_add_intent(Phase1QueueIntent::new(
+ child_id,
+ child.draft().revision().get(),
+ )?)
+ .await?;
+ status = self.phase1_revision_status(replacement_draft_id).await?;
+ }
+ let child = status
+ .retraction
+ .as_ref()
+ .ok_or(Phase1DraftError::Corrupt)?;
+ if matches!(
+ child.state(),
+ Phase1OutboxState::Queued
+ | Phase1OutboxState::Retryable
+ | Phase1OutboxState::PartiallyDelivered
+ ) {
+ drop(admission);
+ self.phase1_advance_draft(child_id, child.draft().revision().get())
+ .await?;
+ }
+ self.phase1_revision_status(replacement_draft_id).await
+ }
+
+ /// Cancels only still-pending work. If a kind-1 replacement is already
+ /// visible, a cancelled child records the deliberate partial effect and
+ /// prevents a later recovery from retracting the original unexpectedly.
+ pub async fn phase1_cancel_revision(
+ &self,
+ replacement_draft_id: [u8; 16],
+ ) -> Result<Phase1RevisionStatus, Phase1DraftError> {
+ let _command = self.lifecycle.enter()?;
+ let admission = self.mutations.draft(replacement_draft_id)?;
+ let mut status = self.phase1_revision_status(replacement_draft_id).await?;
+ if !matches!(
+ status.replacement.state(),
+ Phase1OutboxState::Complete
+ | Phase1OutboxState::Terminal
+ | Phase1OutboxState::Cancelled
+ ) {
+ self.phase1_cancel_draft_admitted(
+ &admission,
+ replacement_draft_id,
+ status.replacement.draft().revision().get(),
+ phase1_operation_now_unix_ms()?,
+ )
+ .await?;
+ status = self.phase1_revision_status(replacement_draft_id).await?;
+ }
+ if (status.replacement.state() == Phase1OutboxState::Complete
+ || status.retraction.is_some())
+ && status.policy == Phase1RevisionPolicy::ReplaceThenRetract
+ {
+ let child_id =
+ revision_child_id(status.replacement.draft())?.ok_or(Phase1DraftError::Corrupt)?;
+ if status.retraction.is_none() {
+ self.phase1_create_revision_retraction(
+ &status.target,
+ child_id,
+ replacement_draft_id,
+ )
+ .await?;
+ status = self.phase1_revision_status(replacement_draft_id).await?;
+ }
+ let child = status
+ .retraction
+ .as_ref()
+ .ok_or(Phase1DraftError::Corrupt)?;
+ if !matches!(
+ child.state(),
+ Phase1OutboxState::Complete
+ | Phase1OutboxState::Terminal
+ | Phase1OutboxState::Cancelled
+ ) {
+ self.phase1_cancel_add_intent(child_id, child.draft().revision().get())
+ .await?;
+ }
+ }
+ self.phase1_revision_status(replacement_draft_id).await
+ }
+
+ pub(super) async fn phase1_create_revision_retraction(
+ &self,
+ target: &Phase1RevisionTarget,
+ draft_id: [u8; 16],
+ replacement_draft_id: [u8; 16],
+ ) -> Result<Phase1DraftStatus, Phase1DraftError> {
+ let admission = self.mutations.draft(draft_id)?;
+ match self.phase1_draft_status(draft_id).await {
+ Ok(existing) => return Ok(existing),
+ Err(Phase1DraftError::NotFound) => {}
+ Err(error) => return Err(error),
+ }
+ let now_unix_ms = phase1_operation_now_unix_ms()?;
+ self.phase1_save_retraction_draft_admitted(
+ &admission,
+ draft_id,
+ target.command_type,
+ target.card_id,
+ &target.source_event_id,
+ target.source_kind,
+ target.source_address.as_deref(),
+ REVISION_RETRACTION_REASON,
+ now_unix_ms / 1_000,
+ now_unix_ms,
+ Some(replacement_draft_id),
+ )
+ .await
+ }
+}
diff --git a/core/crates/tera_core/src/runtime/product_surface/outbox/revision_delivery.rs b/core/crates/tera_core/src/runtime/product_surface/outbox/revision_delivery.rs
@@ -0,0 +1,237 @@
+//! Revision children retain the full frozen destination policy and admit only
+//! targets with exact replacement evidence. No aggregate state grants admission.
+
+use super::*;
+use crate::runtime::{
+ mutation_admission::MutationPermit,
+ product_surface::publication_targets::{PublicationTargetDetails, PublicationTargetEvidence},
+};
+
+pub(super) enum RevisionDelivery {
+ Independent,
+ Held,
+ Selected(TargetSet),
+}
+
+impl Phase1DraftPayload {
+ pub(super) fn revision_parent(&self) -> Result<Option<[u8; 16]>, Phase1DraftError> {
+ if let Some(parent) = self.revision_parent_draft_id {
+ return Ok(Some(parent));
+ }
+ // Old revision children have no exact reverse key. Their recognizable
+ // reserved reason is held, never rebound to a guessed parent or policy.
+ if self.kind == Phase1DraftKind::Retraction {
+ let plan = PlanWireV1::from_json(&self.plan_wire_json)
+ .map_err(|_| Phase1DraftError::Corrupt)?;
+ if plan.plan().body().content() == REVISION_RETRACTION_REASON {
+ return Err(Phase1DraftError::InvalidRevision);
+ }
+ }
+ Ok(None)
+ }
+}
+
+impl TeraRuntime {
+ pub(super) async fn revision_has_replacement_evidence(
+ &self,
+ replacement: &Phase1DraftStatus,
+ ) -> Result<bool, Phase1DraftError> {
+ let Some(push) = replacement.push() else {
+ return Ok(false);
+ };
+ if replacement.draft().stage() == AuthoredDraftStage::Cancelled
+ || push.delivery_plan().stop_requested_at_unix_ms().is_some()
+ {
+ return Ok(false);
+ }
+ let storage = self
+ .client
+ .storage()
+ .map_err(|_| Phase1DraftError::Storage)?;
+ let evidence = PublicationTargetDetails::load(push, storage).await;
+ Ok(evidence
+ .targets
+ .iter()
+ .any(|target| meets_requirement(target, evidence.requires_delivery)))
+ }
+
+ pub(super) fn revision_parent_admission(
+ &self,
+ head: &AuthoredDraft,
+ ) -> Result<Option<MutationPermit<'_>>, Phase1DraftError> {
+ Phase1DraftPayload::decode(head)?
+ .revision_parent()?
+ .map(|parent| self.mutations.draft(parent))
+ .transpose()
+ }
+
+ /// Validates the exact relation independently of current relay configuration.
+ async fn revision_child_parent(
+ &self,
+ child: &AuthoredDraft,
+ ) -> Result<Option<Phase1DraftStatus>, Phase1DraftError> {
+ let payload = Phase1DraftPayload::decode(child)?;
+ let Some(parent_id) = payload.revision_parent()? else {
+ return Ok(None);
+ };
+ if parent_id == *child.draft_id().as_bytes() {
+ return Err(Phase1DraftError::Corrupt);
+ }
+ let parent = self.phase1_draft_status(parent_id).await?;
+ let parent_payload = Phase1DraftPayload::decode(parent.draft())?;
+ let revision = parent_payload.revision.ok_or(Phase1DraftError::Corrupt)?;
+ if revision.policy != Phase1RevisionPolicy::ReplaceThenRetract
+ || revision.retraction_draft_id != Some(*child.draft_id().as_bytes())
+ || child.author() != parent.draft().author()
+ || revision.target.author_public_key != hex::encode(parent.draft().author())
+ {
+ return Err(Phase1DraftError::Corrupt);
+ }
+ validate_revision_retraction(
+ &self.draft_status_from(child.clone()).await?,
+ &revision.target,
+ )?;
+ if parent.draft().stage() == AuthoredDraftStage::Cancelled
+ || parent
+ .push()
+ .is_some_and(|push| push.delivery_plan().stop_requested_at_unix_ms().is_some())
+ {
+ return Err(Phase1DraftError::Terminal);
+ }
+ Ok(Some(parent))
+ }
+
+ pub(super) async fn revision_child_queue_policy(
+ &self,
+ child: &AuthoredDraft,
+ ) -> Result<Option<Phase1QueuePolicy>, Phase1DraftError> {
+ let Some(parent) = Box::pin(self.revision_child_parent(child)).await? else {
+ return Ok(None);
+ };
+ Phase1DraftPayload::decode(parent.draft())?
+ .queue
+ .map(Some)
+ .ok_or(Phase1DraftError::InvalidRevision)
+ }
+
+ /// Called with parent mutation admission retained across signing/delivery.
+ pub(super) async fn revision_delivery_selection(
+ &self,
+ child: &AuthoredDraft,
+ ) -> Result<RevisionDelivery, Phase1DraftError> {
+ let Some(parent) = Box::pin(self.revision_child_parent(child)).await? else {
+ return Ok(RevisionDelivery::Independent);
+ };
+ let frozen = Phase1DraftPayload::decode(parent.draft())?
+ .queue
+ .ok_or(Phase1DraftError::InvalidRevision)?;
+ if Phase1DraftPayload::decode(child)?.queue.as_ref() != Some(&frozen) {
+ return Err(Phase1DraftError::InvalidRevision);
+ }
+ let Some(parent_push) = parent.push() else {
+ return Ok(RevisionDelivery::Held);
+ };
+ let storage = self
+ .client
+ .storage()
+ .map_err(|_| Phase1DraftError::Storage)?;
+ let replacement = PublicationTargetDetails::load(parent_push, storage).await;
+ let child_details = match self.push_status_for(child).await? {
+ Some(push) => Some(PublicationTargetDetails::load(&push, storage).await),
+ None => None,
+ };
+ let (targets, _, _) = frozen.materialize()?;
+ let eligible = targets
+ .targets()
+ .iter()
+ .filter(|target| {
+ let fingerprint = target.fingerprint().as_str();
+ replacement.targets.iter().any(|evidence| {
+ evidence.fingerprint == fingerprint
+ && meets_requirement(evidence, replacement.requires_delivery)
+ }) && !child_details.as_ref().is_some_and(|details| {
+ details.targets.iter().any(|evidence| {
+ evidence.fingerprint == fingerprint
+ && meets_requirement(evidence, details.requires_delivery)
+ })
+ })
+ })
+ .cloned()
+ .collect::<Vec<_>>();
+ if eligible.is_empty() {
+ Ok(RevisionDelivery::Held)
+ } else {
+ TargetSet::new(eligible)
+ .map(RevisionDelivery::Selected)
+ .map_err(|_| Phase1DraftError::Corrupt)
+ }
+ }
+
+ pub(super) async fn advance_revision_child_request(
+ &self,
+ head: &AuthoredDraft,
+ request: PushRequest,
+ ) -> Result<(), Phase1DraftError> {
+ match self.revision_delivery_selection(head).await? {
+ RevisionDelivery::Independent => self.advance_push_request(request).await,
+ RevisionDelivery::Selected(targets) => {
+ self.advance_push_request_selected(request, targets).await
+ }
+ RevisionDelivery::Held => {
+ // Reconciliation cannot initiate another effect in this call.
+ // Preserve it without claiming/consuming a held delivery attempt.
+ let push = self
+ .push_status_for(head)
+ .await?
+ .ok_or(Phase1DraftError::Corrupt)?;
+ if push
+ .delivery_plan()
+ .pending_delivery_facts()
+ .next()
+ .is_some()
+ {
+ self.sync()?
+ .deliver_push(request.operation_id())
+ .await
+ .map_err(|_| Phase1DraftError::Operation)?;
+ }
+ Ok(())
+ }
+ }
+ }
+}
+
+fn meets_requirement(evidence: &PublicationTargetEvidence, requires_delivery: bool) -> bool {
+ evidence.read_back_observed_at_unix_ms.is_some()
+ || evidence.delivered
+ || (!requires_delivery && evidence.accepted)
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn replacement_requirement_distinguishes_acceptance_delivery_and_positive_read_back() {
+ let mut evidence = PublicationTargetEvidence {
+ fingerprint: "one".into(),
+ endpoint: "wss://one.example".into(),
+ attempted: true,
+ accepted: true,
+ delivered: false,
+ rejected: false,
+ uncertain: true,
+ read_back_observed_at_unix_ms: None,
+ };
+ assert!(meets_requirement(&evidence, false));
+ assert!(!meets_requirement(&evidence, true));
+ evidence.delivered = true;
+ assert!(meets_requirement(&evidence, true));
+ evidence.delivered = false;
+ evidence.accepted = false;
+ assert!(!meets_requirement(&evidence, false));
+ evidence.read_back_observed_at_unix_ms = Some(1);
+ assert!(meets_requirement(&evidence, false));
+ assert!(meets_requirement(&evidence, true));
+ }
+}
diff --git a/core/crates/tera_core/src/runtime/product_surface/outbox/tests/revision_delivery_support.rs b/core/crates/tera_core/src/runtime/product_surface/outbox/tests/revision_delivery_support.rs
@@ -0,0 +1,173 @@
+use super::*;
+use futures_util::{SinkExt, StreamExt};
+use radroots_sdk::transport::{
+ RelayAccess, RelayEndpoint, RelayProfile, RelayProfileKind, RelayUrlPolicy,
+};
+use std::sync::{
+ Mutex,
+ atomic::{AtomicBool, Ordering},
+};
+use std::time::Duration;
+use tokio::net::TcpListener;
+use tokio_tungstenite::{accept_async, tungstenite::Message};
+
+pub(super) struct Relay {
+ pub(super) url: String,
+ pub(super) accept_replacement: Arc<AtomicBool>,
+ pub(super) events: Arc<Mutex<Vec<serde_json::Value>>>,
+ task: tokio::task::JoinHandle<()>,
+}
+
+impl Relay {
+ pub(super) async fn start(accept_replacement: bool) -> Self {
+ let listener = TcpListener::bind("127.0.0.1:0").await.unwrap();
+ let url = format!("ws://{}", listener.local_addr().unwrap());
+ let accept_replacement = Arc::new(AtomicBool::new(accept_replacement));
+ let events = Arc::new(Mutex::new(Vec::new()));
+ let accepted = accept_replacement.clone();
+ let captured = events.clone();
+ let task = tokio::spawn(async move {
+ loop {
+ let (stream, _) = listener.accept().await.unwrap();
+ let mut socket = accept_async(stream).await.unwrap();
+ while let Some(Ok(frame)) = socket.next().await {
+ let Message::Text(wire) = frame else {
+ continue;
+ };
+ let frame: serde_json::Value = serde_json::from_str(&wire).unwrap();
+ if frame[0] != "EVENT" {
+ continue;
+ }
+ captured.lock().unwrap().push(frame[1].clone());
+ // A received replacement without an OK is not acceptance.
+ if frame[1]["kind"] == 1 && !accepted.load(Ordering::SeqCst) {
+ break;
+ }
+ socket
+ .send(Message::Text(
+ serde_json::json!(["OK", frame[1]["id"], true, ""])
+ .to_string()
+ .into(),
+ ))
+ .await
+ .unwrap();
+ // Keep the connection alive for the next EVENT: the production
+ // client may reuse a relay socket across replacement and child.
+ }
+ }
+ });
+ Self {
+ url,
+ accept_replacement,
+ events,
+ task,
+ }
+ }
+
+ pub(super) fn kinds(&self) -> Vec<u64> {
+ self.events
+ .lock()
+ .unwrap()
+ .iter()
+ .map(|event| event["kind"].as_u64().unwrap())
+ .collect()
+ }
+}
+
+impl Drop for Relay {
+ fn drop(&mut self) {
+ self.task.abort();
+ }
+}
+
+pub(super) async fn persistent_runtime(root: &std::path::Path, urls: &[String]) -> TeraRuntime {
+ let store = MobileUserStoreConfig::from_encoded(
+ root,
+ AUTHOR,
+ &hex::encode([4; 32]),
+ 1_900_000_000_000,
+ ProtectedDataAvailability::Available,
+ )
+ .unwrap();
+ std::fs::create_dir_all(store.owner_directory()).unwrap();
+ let signer = radroots_nostr::signing::LocalSigner::new(
+ radroots_nostr::key::SecretKey::parse(SECRET).unwrap(),
+ )
+ .unwrap();
+ RuntimeBuilder::new(store)
+ .signer(Arc::new(signer))
+ .relay_profile(
+ RelayProfile::explicit(
+ RelayProfileKind::Simulator,
+ urls.iter().map(|url| {
+ RelayEndpoint::new(url, RelayUrlPolicy::Local, RelayAccess::ReadWrite).unwrap()
+ }),
+ )
+ .unwrap(),
+ )
+ .build()
+ .await
+ .unwrap()
+}
+
+pub(super) async fn saved_revision(runtime: &TeraRuntime) -> Phase1RevisionStatus {
+ let event = "b".repeat(64);
+ let target = Phase1RevisionTarget::new(
+ AddCommandType::CreateUpdate,
+ CardId::derive(
+ TodayCardType::Update,
+ &CardSourceIdentity::Event(radroots_event::EventId::parse(&event).unwrap()),
+ ),
+ event,
+ 1,
+ None,
+ AUTHOR,
+ )
+ .unwrap();
+ runtime
+ .prepare_revision_intent(
+ [102; 16],
+ Phase1ReviseIntent::new(
+ target,
+ Phase1AddCommand::CreateUpdate(CreateUpdate::new("Corrected harvest").unwrap()),
+ vec![],
+ Phase1DraftFormSnapshot {
+ content: "Corrected harvest".into(),
+ ..update_form()
+ },
+ )
+ .unwrap(),
+ )
+ .await
+ .unwrap()
+}
+
+pub(super) async fn wait_retry(runtime: &TeraRuntime, status: &Phase1DraftStatus) {
+ let Some(push) = status.push() else {
+ return;
+ };
+ let now = phase1_operation_now_unix_ms().unwrap();
+ if let crate::runtime::product_surface::PublicationRetryDecision::DeferredUntil(at) =
+ runtime.publication_retry_at(push, now).unwrap()
+ {
+ assert!(
+ at.saturating_sub(now) < 10_000,
+ "test must retain a bounded real wait"
+ );
+ tokio::time::sleep(Duration::from_millis(at.saturating_sub(now) + 10)).await;
+ }
+}
+
+pub(super) fn raw_child(status: &Phase1RevisionStatus) -> String {
+ status
+ .retraction()
+ .unwrap()
+ .push()
+ .unwrap()
+ .artifact()
+ .signed()
+ .unwrap()
+ .event()
+ .raw_json()
+ .to_owned()
+}
diff --git a/core/crates/tera_core/src/runtime/product_surface/outbox/tests/revision_delivery_tests.rs b/core/crates/tera_core/src/runtime/product_surface/outbox/tests/revision_delivery_tests.rs
@@ -0,0 +1,393 @@
+use super::revision_delivery_support::*;
+use super::*;
+use std::sync::atomic::Ordering;
+
+#[tokio::test]
+async fn aggregate_any_acceptance_never_authorizes_the_other_relay() {
+ let root = tempfile::tempdir().unwrap();
+ let a = Relay::start(true).await;
+ let b = Relay::start(false).await;
+ let urls = vec![a.url.clone(), b.url.clone()];
+ let runtime = persistent_runtime(root.path(), &urls).await;
+ let saved = saved_revision(&runtime).await;
+ let id = *saved.replacement().draft().draft_id().as_bytes();
+ let now = phase1_operation_now_unix_ms().unwrap();
+ let policy = Phase1QueuePolicy::new(
+ vec![a.url.clone(), b.url.clone()],
+ Phase1RelaySatisfaction::AnyAccepted,
+ now + 60_000,
+ Phase1CancellationPolicy::LocalCooperative,
+ )
+ .unwrap();
+ runtime
+ .phase1_queue_draft(
+ id,
+ saved.replacement().draft().revision().get(),
+ policy,
+ now,
+ )
+ .await
+ .unwrap();
+ let status = runtime.phase1_advance_revision(id).await.unwrap();
+ assert_eq!(status.replacement().state(), Phase1OutboxState::Complete);
+ assert_eq!(
+ status
+ .retraction()
+ .unwrap()
+ .push()
+ .unwrap()
+ .delivery_plan()
+ .request()
+ .unwrap()
+ .target_set()
+ .len(),
+ 2
+ );
+ assert_eq!(a.kinds(), vec![1, 5]);
+ assert_eq!(b.kinds(), vec![1]);
+ runtime.shutdown().await.unwrap();
+}
+
+#[tokio::test]
+async fn per_target_revision_freezes_policy_and_reopens_one_signed_child() {
+ let root = tempfile::tempdir().unwrap();
+ let a = Relay::start(true).await;
+ let b = Relay::start(false).await;
+ let c = Relay::start(true).await;
+ let mut urls = vec![a.url.clone(), b.url.clone()];
+ let runtime = persistent_runtime(root.path(), &urls).await;
+ let saved = saved_revision(&runtime).await;
+ let id = *saved.replacement().draft().draft_id().as_bytes();
+ let queued = runtime
+ .phase1_queue_add_intent(
+ Phase1QueueIntent::new(id, saved.replacement().draft().revision().get()).unwrap(),
+ )
+ .await
+ .unwrap();
+ runtime
+ .phase1_advance_draft(id, queued.draft().revision().get())
+ .await
+ .unwrap();
+ urls.push(c.url.clone());
+ runtime
+ .configure_simulator_relays(urls.clone())
+ .await
+ .unwrap();
+ let partial = runtime.phase1_advance_revision(id).await.unwrap();
+ let child = partial
+ .retraction()
+ .expect("A acceptance permits only A deletion");
+ let child_id = *child.draft().draft_id().as_bytes();
+ assert_eq!(a.kinds(), vec![1, 5]);
+ assert_eq!(b.kinds(), vec![1]);
+ assert!(c.kinds().is_empty());
+ let parent_policy = Phase1DraftPayload::decode(partial.replacement().draft())
+ .unwrap()
+ .queue;
+ assert_eq!(
+ Phase1DraftPayload::decode(child.draft()).unwrap().queue,
+ parent_policy
+ );
+ assert_eq!(
+ child
+ .push()
+ .unwrap()
+ .delivery_plan()
+ .request()
+ .unwrap()
+ .target_set()
+ .len(),
+ 2
+ );
+ let raw = raw_child(&partial);
+ let attempts = child.push().unwrap().delivery_plan().attempt_count();
+ wait_retry(&runtime, child).await;
+ let held = runtime
+ .phase1_advance_draft(child_id, child.draft().revision().get())
+ .await
+ .unwrap();
+ assert_eq!(
+ held.push().unwrap().delivery_plan().attempt_count(),
+ attempts
+ );
+ assert_eq!(a.kinds().iter().filter(|kind| **kind == 5).count(), 1);
+ assert_eq!(b.kinds(), vec![1]);
+ runtime.shutdown().await.unwrap();
+ drop(runtime);
+
+ b.accept_replacement.store(true, Ordering::SeqCst);
+ let runtime = persistent_runtime(root.path(), &urls).await;
+ let recovered = runtime.phase1_revision_status(id).await.unwrap();
+ assert_eq!(raw_child(&recovered), raw);
+ wait_retry(&runtime, recovered.replacement()).await;
+ wait_retry(&runtime, recovered.retraction().unwrap()).await;
+ let complete = runtime.phase1_advance_revision(id).await.unwrap();
+ assert_eq!(complete.replacement().state(), Phase1OutboxState::Complete);
+ assert_eq!(
+ complete.retraction().unwrap().state(),
+ Phase1OutboxState::Complete
+ );
+ assert_eq!(raw_child(&complete), raw);
+ assert_eq!(a.kinds().iter().filter(|kind| **kind == 5).count(), 1);
+ assert_eq!(b.kinds(), vec![1, 1, 5]);
+ assert!(c.kinds().is_empty());
+ let expected: serde_json::Value = serde_json::from_str(&raw).unwrap();
+ assert_eq!(
+ a.events
+ .lock()
+ .unwrap()
+ .iter()
+ .find(|event| event["kind"] == 5)
+ .unwrap(),
+ &expected
+ );
+ assert_eq!(b.events.lock().unwrap().last().unwrap(), &expected);
+ runtime.shutdown().await.unwrap();
+}
+
+#[tokio::test]
+async fn cancellation_stops_both_partial_branches_and_direct_child_after_reopen() {
+ let root = tempfile::tempdir().unwrap();
+ let a = Relay::start(true).await;
+ let b = Relay::start(false).await;
+ let urls = vec![a.url.clone(), b.url.clone()];
+ let runtime = persistent_runtime(root.path(), &urls).await;
+ let saved = saved_revision(&runtime).await;
+ let id = *saved.replacement().draft().draft_id().as_bytes();
+ let partial = runtime.phase1_advance_revision(id).await.unwrap();
+ let raw = raw_child(&partial);
+ let child_id = *partial.retraction().unwrap().draft().draft_id().as_bytes();
+ let stopped = runtime.phase1_cancel_revision(id).await.unwrap();
+ assert_eq!(
+ stopped.replacement().draft().stage(),
+ AuthoredDraftStage::Cancelled
+ );
+ assert_eq!(
+ stopped.retraction().unwrap().draft().stage(),
+ AuthoredDraftStage::Cancelled
+ );
+ assert_eq!(raw_child(&stopped), raw);
+ assert!(
+ !stopped
+ .retraction()
+ .unwrap()
+ .push()
+ .unwrap()
+ .delivery_plan()
+ .delivery_facts()
+ .is_empty()
+ );
+ runtime.shutdown().await.unwrap();
+ drop(runtime);
+ b.accept_replacement.store(true, Ordering::SeqCst);
+ let runtime = persistent_runtime(root.path(), &urls).await;
+ let reopened = runtime.phase1_advance_revision(id).await.unwrap();
+ assert_eq!(raw_child(&reopened), raw);
+ assert!(
+ runtime
+ .phase1_advance_draft(
+ child_id,
+ reopened.retraction().unwrap().draft().revision().get()
+ )
+ .await
+ .is_err()
+ );
+ assert_eq!(a.kinds(), vec![1, 5]);
+ assert_eq!(b.kinds(), vec![1]);
+ runtime.shutdown().await.unwrap();
+}
+
+#[tokio::test]
+async fn historical_unlinked_revision_reason_is_held_without_rewriting_old_payload() {
+ let runtime = signing_runtime();
+ let source = "b".repeat(64);
+ let card = CardId::derive(
+ TodayCardType::Update,
+ &CardSourceIdentity::Event(radroots_event::EventId::parse(&source).unwrap()),
+ );
+ let old = runtime
+ .phase1_save_retraction_draft(
+ [103; 16],
+ AddCommandType::CreateUpdate,
+ card,
+ &source,
+ 1,
+ None,
+ REVISION_RETRACTION_REASON,
+ 1_900_000_000,
+ 1_900_000_000_000,
+ )
+ .await
+ .unwrap();
+ let bytes = old.draft().payload().to_vec();
+ assert!(
+ !std::str::from_utf8(&bytes)
+ .unwrap()
+ .contains("revision_parent_draft_id")
+ );
+ assert_eq!(
+ Phase1DraftPayload::decode(old.draft())
+ .unwrap()
+ .encode()
+ .unwrap(),
+ bytes
+ );
+ assert_eq!(
+ runtime
+ .phase1_queue_draft(
+ [103; 16],
+ old.draft().revision().get(),
+ policy(),
+ 1_900_000_000_001,
+ )
+ .await
+ .unwrap_err(),
+ Phase1DraftError::InvalidRevision
+ );
+ assert_eq!(
+ runtime
+ .phase1_draft_status([103; 16])
+ .await
+ .unwrap()
+ .draft()
+ .payload(),
+ bytes
+ );
+ let independent = runtime
+ .phase1_save_retraction_draft(
+ [104; 16],
+ AddCommandType::CreateUpdate,
+ card,
+ &source,
+ 1,
+ None,
+ "I retract this post",
+ 1_900_000_000,
+ 1_900_000_000_000,
+ )
+ .await
+ .unwrap();
+ let queued = runtime
+ .phase1_queue_draft(
+ [104; 16],
+ independent.draft().revision().get(),
+ policy(),
+ 1_900_000_000_001,
+ )
+ .await
+ .unwrap();
+ assert_eq!(queued.state(), Phase1OutboxState::Queued);
+ assert!(matches!(
+ runtime
+ .revision_delivery_selection(queued.draft())
+ .await
+ .unwrap(),
+ RevisionDelivery::Independent
+ ));
+}
+
+#[tokio::test]
+async fn child_queue_rejects_changed_frozen_policy_and_foreign_parent_link() {
+ let root = tempfile::tempdir().unwrap();
+ let relay = Relay::start(true).await;
+ let runtime = persistent_runtime(root.path(), std::slice::from_ref(&relay.url)).await;
+ let saved = saved_revision(&runtime).await;
+ let id = *saved.replacement().draft().draft_id().as_bytes();
+ let parent = runtime
+ .phase1_queue_add_intent(
+ Phase1QueueIntent::new(id, saved.replacement().draft().revision().get()).unwrap(),
+ )
+ .await
+ .unwrap();
+ let child_id = revision_child_id(parent.draft()).unwrap().unwrap();
+ let child = runtime
+ .phase1_create_revision_retraction(saved.target(), child_id, id)
+ .await
+ .unwrap();
+ assert_eq!(
+ runtime
+ .phase1_queue_draft(
+ child_id,
+ child.draft().revision().get(),
+ policy(),
+ phase1_operation_now_unix_ms().unwrap(),
+ )
+ .await
+ .unwrap_err(),
+ Phase1DraftError::InvalidQueuePolicy
+ );
+ let queued = runtime
+ .phase1_queue_add_intent(
+ Phase1QueueIntent::new(child_id, child.draft().revision().get()).unwrap(),
+ )
+ .await
+ .unwrap();
+ let parent_admission = runtime.mutations.draft(id).unwrap();
+ assert_eq!(
+ runtime
+ .phase1_advance_draft(child_id, queued.draft().revision().get())
+ .await
+ .unwrap_err(),
+ Phase1DraftError::OperationInProgress
+ );
+ drop(parent_admission);
+ assert!(matches!(
+ runtime
+ .revision_delivery_selection(queued.draft())
+ .await
+ .unwrap(),
+ RevisionDelivery::Held
+ ));
+ runtime
+ .phase1_advance_draft(child_id, queued.draft().revision().get())
+ .await
+ .unwrap();
+ assert!(relay.kinds().is_empty());
+ assert!(
+ runtime
+ .phase1_draft_status(child_id)
+ .await
+ .unwrap()
+ .push()
+ .unwrap()
+ .artifact()
+ .signed()
+ .is_none()
+ );
+ let other = runtime
+ .phase1_save_revision_intent(
+ Phase1ReviseIntent::new(
+ saved.target().clone(),
+ Phase1AddCommand::CreateUpdate(CreateUpdate::new("Other").unwrap()),
+ vec![],
+ Phase1DraftFormSnapshot {
+ content: "Other".into(),
+ ..update_form()
+ },
+ )
+ .unwrap(),
+ )
+ .await
+ .unwrap();
+ let mut malformed = Phase1DraftPayload::decode(child.draft()).unwrap();
+ malformed.revision_parent_draft_id = Some(*other.replacement().draft().draft_id().as_bytes());
+ let invalid = AuthoredDraft::initial(
+ child.draft().draft_id(),
+ *child.draft().author(),
+ DRAFT_PAYLOAD_SCHEMA,
+ malformed.encode().unwrap(),
+ AuthoredDraftStage::Draft,
+ None,
+ child.draft().created_at_unix_ms(),
+ )
+ .unwrap();
+ assert_eq!(
+ runtime
+ .revision_child_queue_policy(&invalid)
+ .await
+ .unwrap_err(),
+ Phase1DraftError::Corrupt
+ );
+ assert!(relay.kinds().is_empty());
+ runtime.shutdown().await.unwrap();
+}
diff --git a/core/crates/tera_core/src/runtime/product_surface/outbox/tests/revision_preparation_tests.rs b/core/crates/tera_core/src/runtime/product_surface/outbox/tests/revision_preparation_tests.rs
@@ -264,7 +264,11 @@ async fn revision_child() {
// Exercise exactly the durable child creation boundary. Delivery eligibility
// is independently tested by the coordinator and belongs to C102.
runtime
- .phase1_create_revision_retraction(&captured.target, child)
+ .phase1_create_revision_retraction(
+ &captured.target,
+ child,
+ *saved.replacement().draft().draft_id().as_bytes(),
+ )
.await
.unwrap();
println!("{BARRIER}");
@@ -332,7 +336,11 @@ async fn revision_child_process_death_replays_one_graph() {
assert_eq!(retained.draft_id().as_bytes(), &child_id);
for _ in 0..3 {
let replay = runtime
- .phase1_create_revision_retraction(recovered.target(), child_id)
+ .phase1_create_revision_retraction(
+ recovered.target(),
+ child_id,
+ *recovered.replacement().draft().draft_id().as_bytes(),
+ )
.await
.unwrap();
assert_eq!(replay.draft(), &retained);
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 = "858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+revision = "77aa55c0894c0142dbae43e272a515fd093eac36"
architecture = "radroots.crates.release.v2"
workspace_catalog_sha256 = "ee295f2352e2577a4052d980624415aec9871197d4fc9910a4c21c83a9179200"
version = "0.1.0-alpha"
-source_archive_sha256 = "0c0b852806a21f217c370ce69babaf19658aefbece6d63148d05260f10b2fee4"
-lockfile_sha256 = "293c71b3d3a7dda121980b57e9033e97d55f8b917f5b1fd3af2231f84c37b258"
+source_archive_sha256 = "0aa57e84a408834686f476f1cb2d2d834d2668e541d45e40456c3de1f605d958"
+lockfile_sha256 = "6552dd4abf5d242e526d03f3a288c99384ac7a32db86b09e8980ed8a5b842ec0"
diff --git a/release/provenance.json b/release/provenance.json
@@ -2,10 +2,10 @@
"artifacts": {
"app_api_sha256": "020924097c0d7efc33128cb8fd3d3b2026d95f57c44da71880e585aff80f070b",
"ffi_api_sha256": "ac334ffc196a74bea9f23048cdab34ccb09925b60ffae9702d6bfabc1590e465",
- "ffi_provenance_sha256": "f0e228bd1272bbd4bf29d8d2a11f241734a17b83575d7fca916dbfa16e70d847",
+ "ffi_provenance_sha256": "d21fc3a4670d86233045861a54bb802398a8e1296607436be83dd72aeac6fafc",
"info_plist_sha256": "15ef08b1cdd1096cfb9eeaf5be5bf8f814807a7ca9350bbbb47860fa72ec13ef",
"privacy_manifest_sha256": "a331d51864743ebe4e00dd22360b4a538b6b3ac26a6b3eb54094e60a36959a12",
- "sbom_sha256": "d65b792e2be7b95ae70c95aa8f9710074004610f8f252f0fc7340533114f4cbb",
+ "sbom_sha256": "80b80b053b6da5d3d05e01ab9af68ab0fb2f7ed9cb8af0a561c1102702e69537",
"xcode_project_sha256": "561abfdf6f690c35bc3d07907b95d950b521de7860d22b469afc6d0ad9c405d4"
},
"disposition": "unsigned",
@@ -17,12 +17,12 @@
"repository": "https://github.com/radrootslabs/tera",
"schema": "tera.release-provenance.v1",
"source": {
- "cargo_lock_sha256": "293c71b3d3a7dda121980b57e9033e97d55f8b917f5b1fd3af2231f84c37b258",
- "consumer_source_lock_sha256": "6ca89e25c098bc3adc34f67a26713be23e8f9b2826273034b8cd71f2b6e22e6d",
- "lib_revision": "858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
+ "cargo_lock_sha256": "6552dd4abf5d242e526d03f3a288c99384ac7a32db86b09e8980ed8a5b842ec0",
+ "consumer_source_lock_sha256": "d668f57c9b6ecbea1ccb90d058153b475161d9da43173bb2d6476507a033c193",
+ "lib_revision": "77aa55c0894c0142dbae43e272a515fd093eac36",
"source_date_epoch": 1787871027,
"swift_package_lock_sha256": "a7e31d77d31ecbc1e0e5a78f2681e3fb0c6f367af0edf8b4ceef0af973a78681",
- "tera_ffi_source_tree": "3fd45b713b327106c84b09a8ea06133019f86e43",
+ "tera_ffi_source_tree": "3a880e433bbaa2f8e7bf09e7da296b32d2cac958",
"xcode_package_lock_sha256": "d98a614a38dce7b55c2925dee51c2d4bf8dcfc4e31779d0c5fe8561c45d6e3ba"
},
"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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
+ "bom-ref": "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4048,14 +4048,14 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+ "value": "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
}
],
"type": "library",
"version": "0.1.0-alpha"
},
{
- "bom-ref": "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
+ "bom-ref": "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4069,14 +4069,14 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+ "value": "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
}
],
"type": "library",
"version": "0.1.0-alpha"
},
{
- "bom-ref": "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
+ "bom-ref": "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4090,14 +4090,14 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+ "value": "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
}
],
"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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
+ "bom-ref": "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4111,14 +4111,14 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+ "value": "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
}
],
"type": "library",
"version": "0.1.0-alpha"
},
{
- "bom-ref": "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
+ "bom-ref": "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4132,14 +4132,14 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+ "value": "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
}
],
"type": "library",
"version": "0.1.0-alpha"
},
{
- "bom-ref": "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
+ "bom-ref": "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4153,14 +4153,14 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+ "value": "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
}
],
"type": "library",
"version": "0.1.0-alpha"
},
{
- "bom-ref": "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
+ "bom-ref": "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4174,14 +4174,14 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+ "value": "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
}
],
"type": "library",
"version": "0.1.0-alpha"
},
{
- "bom-ref": "cargo:radroots_sdk@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
+ "bom-ref": "cargo:radroots_sdk@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4195,14 +4195,14 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+ "value": "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
}
],
"type": "library",
"version": "0.1.0-alpha"
},
{
- "bom-ref": "cargo:radroots_secrets@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
+ "bom-ref": "cargo:radroots_secrets@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4216,14 +4216,14 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+ "value": "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
}
],
"type": "library",
"version": "0.1.0-alpha"
},
{
- "bom-ref": "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
+ "bom-ref": "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4237,14 +4237,14 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+ "value": "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
}
],
"type": "library",
"version": "0.1.0-alpha"
},
{
- "bom-ref": "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
+ "bom-ref": "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4258,14 +4258,14 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+ "value": "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
}
],
"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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
+ "bom-ref": "cargo:radroots_storage_sqlite@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4279,14 +4279,14 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+ "value": "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
}
],
"type": "library",
"version": "0.1.0-alpha"
},
{
- "bom-ref": "cargo:radroots_sync@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
+ "bom-ref": "cargo:radroots_sync@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4300,14 +4300,14 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+ "value": "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
}
],
"type": "library",
"version": "0.1.0-alpha"
},
{
- "bom-ref": "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
+ "bom-ref": "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4321,14 +4321,14 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+ "value": "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
}
],
"type": "library",
"version": "0.1.0-alpha"
},
{
- "bom-ref": "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
+ "bom-ref": "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4342,14 +4342,14 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+ "value": "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
}
],
"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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
+ "bom-ref": "cargo:radroots_transport_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4363,7 +4363,7 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+ "value": "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
}
],
"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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+ "ref": "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
},
{
"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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+ "ref": "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
},
{
"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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
+ "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
"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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+ "ref": "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
},
{
"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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
+ "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
"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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+ "ref": "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
},
{
"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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+ "ref": "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
},
{
"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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
+ "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
"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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+ "ref": "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
},
{
"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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+ "ref": "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
},
{
"dependsOn": [
- "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_storage_sqlite@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_sync@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_transport_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
+ "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_storage_sqlite@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_sync@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_transport_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
"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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+ "ref": "cargo:radroots_sdk@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
},
{
"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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+ "ref": "cargo:radroots_secrets@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
},
{
"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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
+ "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
"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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+ "ref": "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
},
{
"dependsOn": [
- "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
+ "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
"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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+ "ref": "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
},
{
"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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_secrets@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
+ "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_secrets@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
"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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+ "ref": "cargo:radroots_storage_sqlite@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
},
{
"dependsOn": [
- "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
+ "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
"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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+ "ref": "cargo:radroots_sync@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
},
{
"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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
+ "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
"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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+ "ref": "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
},
{
"dependsOn": [
- "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
+ "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
"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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+ "ref": "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
},
{
"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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
+ "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
"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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8"
+ "ref": "cargo:radroots_transport_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36"
},
{
"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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_sdk@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_sync@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_transport_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
+ "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_sdk@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_sync@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_transport_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
"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=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_sdk@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
- "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8",
+ "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_sdk@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
+ "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36",
"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",
diff --git a/test-fixtures/legacy-identifiers.v1.json b/test-fixtures/legacy-identifiers.v1.json
@@ -4879,6 +4879,14 @@
"count": 5
},
{
+ "path": "core/crates/tera_core/src/runtime/product_surface/outbox/tests/revision_delivery_support.rs",
+ "count": 1
+ },
+ {
+ "path": "core/crates/tera_core/src/runtime/product_surface/outbox/tests/revision_delivery_tests.rs",
+ "count": 1
+ },
+ {
"path": "core/crates/tera_core/src/runtime/product_surface/outbox/tests/revision_preparation_tests.rs",
"count": 1
},
@@ -5283,6 +5291,10 @@
"count": 2
},
{
+ "path": "core/crates/tera_core/src/runtime/product_surface/outbox/tests/revision_delivery_support.rs",
+ "count": 2
+ },
+ {
"path": "core/crates/tera_core/src/runtime/product_surface/submission/media_authorization_tests.rs",
"count": 1
},
@@ -5439,6 +5451,10 @@
"count": 4
},
{
+ "path": "core/crates/tera_core/src/runtime/product_surface/outbox/tests/revision_delivery_support.rs",
+ "count": 1
+ },
+ {
"path": "core/crates/tera_core/src/runtime/product_surface/outbox/upload_attempt.rs",
"count": 1
},