commit dae1a760bf2178ea5252278fa71a46d4f18d1f22
parent a3fc1df6044f802a67b88df2765df63749ab5b1d
Author: triesap <tyson@radroots.org>
Date: Sat, 12 Sep 2026 21:03:49 +0000
publication: Recover scoped media on the original operation
- Validate immutable media inputs and policy before effects
- Preserve upload failure evidence through shared SDK repair
- Page scoped submissions with isolated repair entries
- Verify memory SQLite loopback and exact native consumers
Diffstat:
29 files changed, 2126 insertions(+), 496 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=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+source = "git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
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=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+source = "git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
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=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+source = "git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
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=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+source = "git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
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=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+source = "git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
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=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+source = "git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
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=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+source = "git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
dependencies = [
"serde",
]
@@ -1967,7 +1967,7 @@ dependencies = [
[[package]]
name = "radroots_sdk"
version = "0.1.0-alpha"
-source = "git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+source = "git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
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=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+source = "git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
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=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+source = "git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
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=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+source = "git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
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=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+source = "git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
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=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+source = "git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
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=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+source = "git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
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=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+source = "git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
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=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+source = "git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
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 = "ac392da942896a6b676f063929af16971e201b0e" }
-radroots_event = { package = "radroots_event", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "ac392da942896a6b676f063929af16971e201b0e" }
-radroots_event_codec = { package = "radroots_event_codec", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "ac392da942896a6b676f063929af16971e201b0e" }
-radroots_identity = { package = "radroots_identity", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "ac392da942896a6b676f063929af16971e201b0e" }
-radroots_nostr = { package = "radroots_nostr", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "ac392da942896a6b676f063929af16971e201b0e" }
-radroots_protocol = { package = "radroots_protocol", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "ac392da942896a6b676f063929af16971e201b0e" }
-radroots_sdk = { version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "ac392da942896a6b676f063929af16971e201b0e" }
-radroots_signing = { package = "radroots_signing", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "ac392da942896a6b676f063929af16971e201b0e" }
-radroots_storage = { package = "radroots_storage", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "ac392da942896a6b676f063929af16971e201b0e" }
-radroots_sync = { package = "radroots_sync", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "ac392da942896a6b676f063929af16971e201b0e" }
-radroots_transport = { package = "radroots_transport", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "ac392da942896a6b676f063929af16971e201b0e" }
-radroots_transport_nostr = { package = "radroots_transport_nostr", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "ac392da942896a6b676f063929af16971e201b0e" }
+radroots_blossom = { package = "radroots_blossom", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "bb54297d208f8e3817485d1c1a63a386f457349a" }
+radroots_event = { package = "radroots_event", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "bb54297d208f8e3817485d1c1a63a386f457349a" }
+radroots_event_codec = { package = "radroots_event_codec", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "bb54297d208f8e3817485d1c1a63a386f457349a" }
+radroots_identity = { package = "radroots_identity", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "bb54297d208f8e3817485d1c1a63a386f457349a" }
+radroots_nostr = { package = "radroots_nostr", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "bb54297d208f8e3817485d1c1a63a386f457349a" }
+radroots_protocol = { package = "radroots_protocol", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "bb54297d208f8e3817485d1c1a63a386f457349a" }
+radroots_sdk = { version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "bb54297d208f8e3817485d1c1a63a386f457349a" }
+radroots_signing = { package = "radroots_signing", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "bb54297d208f8e3817485d1c1a63a386f457349a" }
+radroots_storage = { package = "radroots_storage", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "bb54297d208f8e3817485d1c1a63a386f457349a" }
+radroots_sync = { package = "radroots_sync", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "bb54297d208f8e3817485d1c1a63a386f457349a" }
+radroots_transport = { package = "radroots_transport", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "bb54297d208f8e3817485d1c1a63a386f457349a" }
+radroots_transport_nostr = { package = "radroots_transport_nostr", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "bb54297d208f8e3817485d1c1a63a386f457349a" }
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/TeraFFI/provenance.json b/TeraFFI/provenance.json
@@ -22,9 +22,9 @@
"sha256": "3ed9b7ece2f86e5b5d1ddc6ecbb97deb49c46ca2ea91a930eaec1b580232345c"
},
{
- "bytes": 74943480,
+ "bytes": 75030536,
"path": "TeraFFI.xcframework/ios-arm64-simulator/libtera_ffi.a",
- "sha256": "c4cf3b9883f8c6422c45daaeecd6009dc4f6ae5d04176fcd683bb9b7ebc04288"
+ "sha256": "6bfe15a6f7ff2c19d60af3f7359dcb2341061e6f946669474050df0d487224e4"
},
{
"bytes": 75137,
@@ -37,9 +37,9 @@
"sha256": "3ed9b7ece2f86e5b5d1ddc6ecbb97deb49c46ca2ea91a930eaec1b580232345c"
},
{
- "bytes": 75010008,
+ "bytes": 75083784,
"path": "TeraFFI.xcframework/ios-arm64/libtera_ffi.a",
- "sha256": "5084a5d56c57b49840feaadeba814eb44606328097ca0669e75aa22d5a290bd2"
+ "sha256": "f4ef2b352192419a6c9e41bedb065c8b01c5094575d7d7d45e5bdbe6ec02eb06"
},
{
"bytes": 45118,
@@ -77,34 +77,34 @@
"sha256": "3ed9b7ece2f86e5b5d1ddc6ecbb97deb49c46ca2ea91a930eaec1b580232345c"
},
{
- "bytes": 20953600,
+ "bytes": 20990992,
"path": "native/aarch64-apple-darwin/libtera_ffi.dylib",
- "sha256": "9e476f34d2d1b203c2e94d80929dc223035202f2d734b0b2428643001b526382"
+ "sha256": "5af71add508ca50bbd5d99fb9cbbf16a2f31d8f76d2ed8953ac2703de092bd8e"
},
{
- "bytes": 74943480,
+ "bytes": 75030536,
"path": "native/aarch64-apple-ios-sim/libtera_ffi.a",
- "sha256": "c4cf3b9883f8c6422c45daaeecd6009dc4f6ae5d04176fcd683bb9b7ebc04288"
+ "sha256": "6bfe15a6f7ff2c19d60af3f7359dcb2341061e6f946669474050df0d487224e4"
},
{
- "bytes": 75010008,
+ "bytes": 75083784,
"path": "native/aarch64-apple-ios/libtera_ffi.a",
- "sha256": "5084a5d56c57b49840feaadeba814eb44606328097ca0669e75aa22d5a290bd2"
+ "sha256": "f4ef2b352192419a6c9e41bedb065c8b01c5094575d7d7d45e5bdbe6ec02eb06"
},
{
- "bytes": 88816,
+ "bytes": 91760,
"path": "source/aarch64-apple-darwin.json",
- "sha256": "8c12071a51dc16bdb8cba0bd620a1d3fc7e886110305b44b06cad7da9283f427"
+ "sha256": "04779f61a25ee690aba95299e8a146ba1270bff67333d1a444af9ecd142f1b3e"
},
{
- "bytes": 88660,
+ "bytes": 91604,
"path": "source/aarch64-apple-ios-sim.json",
- "sha256": "a9c6f572a7cce6fcc8c0ce5b0c005a2d40a74bb80a9947072b3a5c382d356a94"
+ "sha256": "f46e6bf5c697a96ed096da3d7daf21753fbbd094d0575d07e6096525f519a201"
},
{
- "bytes": 88656,
+ "bytes": 91600,
"path": "source/aarch64-apple-ios.json",
- "sha256": "aa8891f70d4f87550a90481dc1c876bf1b75d3de6e050393c70750ad72027300"
+ "sha256": "59bf7cb4029a5e8ccb36adc39157d30552b644350f842fb0235f47a906144d0d"
}
],
"language": "swift",
@@ -112,7 +112,7 @@
"schema": "radroots.artifact-manifest.v2",
"source": {
"repository": "https://github.com/radrootslabs/tera",
- "tree": "18a7a18d56a4fb953cd53e12f99afee48c7e6e41"
+ "tree": "2debefe8f899f1f0441c77eb804b135905a43358"
},
"source_records": {
"aarch64-apple-darwin": "source/aarch64-apple-darwin.json",
@@ -139,9 +139,9 @@
"sha256": "3ed9b7ece2f86e5b5d1ddc6ecbb97deb49c46ca2ea91a930eaec1b580232345c"
},
{
- "bytes": 74943480,
+ "bytes": 75030536,
"path": "Tera/Frameworks/TeraFFI.xcframework/ios-arm64-simulator/libtera_ffi.a",
- "sha256": "c4cf3b9883f8c6422c45daaeecd6009dc4f6ae5d04176fcd683bb9b7ebc04288"
+ "sha256": "6bfe15a6f7ff2c19d60af3f7359dcb2341061e6f946669474050df0d487224e4"
},
{
"bytes": 75137,
@@ -154,9 +154,9 @@
"sha256": "3ed9b7ece2f86e5b5d1ddc6ecbb97deb49c46ca2ea91a930eaec1b580232345c"
},
{
- "bytes": 75010008,
+ "bytes": 75083784,
"path": "Tera/Frameworks/TeraFFI.xcframework/ios-arm64/libtera_ffi.a",
- "sha256": "5084a5d56c57b49840feaadeba814eb44606328097ca0669e75aa22d5a290bd2"
+ "sha256": "f4ef2b352192419a6c9e41bedb065c8b01c5094575d7d7d45e5bdbe6ec02eb06"
},
{
"bytes": 592248,
@@ -174,19 +174,19 @@
"sha256": "fa1cc3ee4d2ed28a8ff535e598de1b45dd2129a3260186f74c6b3d1a14069f83"
},
{
- "bytes": 88816,
+ "bytes": 91760,
"path": "TeraFFI/source/aarch64-apple-darwin.json",
- "sha256": "8c12071a51dc16bdb8cba0bd620a1d3fc7e886110305b44b06cad7da9283f427"
+ "sha256": "04779f61a25ee690aba95299e8a146ba1270bff67333d1a444af9ecd142f1b3e"
},
{
- "bytes": 88660,
+ "bytes": 91604,
"path": "TeraFFI/source/aarch64-apple-ios-sim.json",
- "sha256": "a9c6f572a7cce6fcc8c0ce5b0c005a2d40a74bb80a9947072b3a5c382d356a94"
+ "sha256": "f46e6bf5c697a96ed096da3d7daf21753fbbd094d0575d07e6096525f519a201"
},
{
- "bytes": 88656,
+ "bytes": 91600,
"path": "TeraFFI/source/aarch64-apple-ios.json",
- "sha256": "aa8891f70d4f87550a90481dc1c876bf1b75d3de6e050393c70750ad72027300"
+ "sha256": "59bf7cb4029a5e8ccb36adc39157d30552b644350f842fb0235f47a906144d0d"
}
],
"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 = "18a7a18d56a4fb953cd53e12f99afee48c7e6e41"
-manifest_sha256 = "d33dcc83c3ec328d8d8bc13ee92fbe5b553bbbeecb15fcd2eb7d0e34a17fede4"
+source_tree = "2debefe8f899f1f0441c77eb804b135905a43358"
+manifest_sha256 = "6c245d6ae5d9fbe1cc9baa83856842d0f98b31e4876483e87ef5ea776dc0a730"
source_date_epoch = 1787871027
[foundation]
repository = "https://github.com/radrootslabs/lib"
-revision = "ac392da942896a6b676f063929af16971e201b0e"
+revision = "bb54297d208f8e3817485d1c1a63a386f457349a"
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=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde,std",
- "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde,std (*)",
- "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde,std",
- "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde,std (*)",
- "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde,std",
- "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde,std (*)",
- "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|json,serde,std",
- "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|json,serde,std (*)",
- "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde,std",
- "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde,std (*)",
- "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|blossom,events,std",
- "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|blossom,events,std (*)",
- "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde,std",
- "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde,std (*)",
- "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|blossom,nostr,sqlite,sync",
- "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|blossom,nostr,sqlite,sync (*)",
- "radroots_secrets v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|",
- "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde,std",
- "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde,std (*)",
- "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde",
- "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde (*)",
- "radroots_storage_sqlite v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|",
- "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|",
- "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)| (*)",
- "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|json,serde,std",
- "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|json,serde,std (*)",
- "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde,std",
- "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde,std (*)",
- "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|",
- "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)| (*)",
+ "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde,std",
+ "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde,std (*)",
+ "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde,std",
+ "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde,std (*)",
+ "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde,std",
+ "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde,std (*)",
+ "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|json,serde,std",
+ "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|json,serde,std (*)",
+ "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde,std",
+ "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde,std (*)",
+ "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|blossom,events,std",
+ "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|blossom,events,std (*)",
+ "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde,std",
+ "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde,std (*)",
+ "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|blossom,nostr,sqlite,sync",
+ "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|blossom,nostr,sqlite,sync (*)",
+ "radroots_secrets v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|",
+ "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde,std",
+ "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde,std (*)",
+ "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde",
+ "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde (*)",
+ "radroots_storage_sqlite v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|",
+ "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|",
+ "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)| (*)",
+ "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|json,serde,std",
+ "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|json,serde,std (*)",
+ "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde,std",
+ "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde,std (*)",
+ "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|",
+ "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)| (*)",
"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": "694cbdae0b6de4918edc747207a9e372dfba8ce8e590f9dd15ea6ab864f842c4",
+ "cargo_lock_sha256": "4d1143601e90436115100eabcab9f098152ae7606976e906746cfe0bba78be8c",
"disposition": "local_staged_source_only",
"foundation": {
"architecture": "radroots.crates.release.v2",
- "lockfile_sha256": "694cbdae0b6de4918edc747207a9e372dfba8ce8e590f9dd15ea6ab864f842c4",
+ "lockfile_sha256": "4d1143601e90436115100eabcab9f098152ae7606976e906746cfe0bba78be8c",
"repository": "https://github.com/radrootslabs/lib",
- "revision": "ac392da942896a6b676f063929af16971e201b0e",
+ "revision": "bb54297d208f8e3817485d1c1a63a386f457349a",
"schema": "radroots.lib.source-lock.v1",
- "source_archive_sha256": "c7c5de435fa7965181d44ccc146cab4286b943e0fdc34d6be757d38a2961ed1c",
+ "source_archive_sha256": "30c02cb48df5864e53febe96b7ec3193e896ad9b94d05cfce0d051a4f539618a",
"version": "0.1.0-alpha",
"workspace_catalog_sha256": "ee295f2352e2577a4052d980624415aec9871197d4fc9910a4c21c83a9179200"
},
@@ -502,15 +502,15 @@
"files": {
"Cargo.lock": {
"bytes": 94853,
- "git_blob": "93daaf6d05fc4f6d7dfd7343b4e6d9cf11dbd5ba",
+ "git_blob": "bf6d9d493e562eecb389b1a75c38324b3e1f0190",
"mode": "100644",
- "sha256": "694cbdae0b6de4918edc747207a9e372dfba8ce8e590f9dd15ea6ab864f842c4"
+ "sha256": "4d1143601e90436115100eabcab9f098152ae7606976e906746cfe0bba78be8c"
},
"Cargo.toml": {
"bytes": 4442,
- "git_blob": "2e86fc8e74051e44b1acad6736543c30cb7c9b19",
+ "git_blob": "a76a43232f8e359b08368612ecc225ec8a8e9d87",
"mode": "100644",
- "sha256": "29004a91f6b5f6474439d39fb15f4bf8794bd0677a82eec1b7266191d23be5cc"
+ "sha256": "76563476c14d43ea9c7c1f5b78000676918619c501940b06a5f6159a615dc0d7"
},
"Makefile": {
"bytes": 3934,
@@ -645,10 +645,10 @@
"sha256": "dff55e46521c26f5f0ece024453b55c15f132fa94f78e2cba3d141f123d4eca0"
},
"core/crates/tera_core/src/runtime/product_surface.rs": {
- "bytes": 7824,
- "git_blob": "d47c550c5f18f5ef4d106004287ece34b8df4ad7",
+ "bytes": 7961,
+ "git_blob": "038219781276bedec4da0ad309be6784c7cc4252",
"mode": "100644",
- "sha256": "74cc8b81313265d09456dc0efe619e49fcd7a5d7962055215cf8e31618cb1f1b"
+ "sha256": "c47647330fb03412d9237b14c9ccb8b434d7bc796a1517ad96a7608840295b12"
},
"core/crates/tera_core/src/runtime/product_surface/authoring.rs": {
"bytes": 11282,
@@ -801,10 +801,10 @@
"sha256": "f5d9c1bac647bf745600c2edefffa1f25172221ac9d4913b81b2b5a8fcc8b590"
},
"core/crates/tera_core/src/runtime/product_surface/outbox.rs": {
- "bytes": 170329,
- "git_blob": "696260720ef6a54c2111d7b975fb85ac45abb41d",
+ "bytes": 167726,
+ "git_blob": "28341e9a2efd3fb6ed3d98ffeddf3cda11803a40",
"mode": "100644",
- "sha256": "48cc3be9a8a1356f2cde36816329955fd20bb930c01e75d2243d82dbe8ed3d0b"
+ "sha256": "db3d98be8e920a41c205bb58c6ac3bc873b3e17638dc78cf4d958dd9cc04310f"
},
"core/crates/tera_core/src/runtime/product_surface/outbox/advance.rs": {
"bytes": 2011,
@@ -824,12 +824,24 @@
"mode": "100644",
"sha256": "a77be347ffb219b07d15b79582dfc159f5728e1f5b8c9036b9c132a64f7a9ce8"
},
+ "core/crates/tera_core/src/runtime/product_surface/outbox/media.rs": {
+ "bytes": 2714,
+ "git_blob": "a24fb22dd3088d6609a403849203b18b8602aa05",
+ "mode": "100644",
+ "sha256": "b6878895dc35c38578cc8ee95874c019462fb4d2090c91d162b2a675f6f9584f"
+ },
"core/crates/tera_core/src/runtime/product_surface/outbox/mutation_admission_tests.rs": {
"bytes": 13316,
"git_blob": "9c63f04493eda38aa11cb77bec8173004ca70865",
"mode": "100644",
"sha256": "3c048e44551d04e607597761481c24e9bbe55f6b20358047d18c8013c093fb8f"
},
+ "core/crates/tera_core/src/runtime/product_surface/outbox/native_upload.rs": {
+ "bytes": 1856,
+ "git_blob": "6d0db606aa081418f2d221e6a6d31c7aecd7274b",
+ "mode": "100644",
+ "sha256": "2e1b1e65d461a73f6d5737297ded95cb683b9daea4b076a5625c36757808a70d"
+ },
"core/crates/tera_core/src/runtime/product_surface/projection.rs": {
"bytes": 23423,
"git_blob": "a0186bb29cafbaab4268af10acd5dc701cf4c228",
@@ -849,10 +861,10 @@
"sha256": "76e3bddfc237dac63293d264d68991b489585136fe377e39dbba72aa3a1181f4"
},
"core/crates/tera_core/src/runtime/product_surface/submission.rs": {
- "bytes": 5404,
- "git_blob": "aca536a36c4a9f5cebad5f206ecb66e17d7c392c",
+ "bytes": 5744,
+ "git_blob": "388bc937587f9a7f4c2ea4f33ca2b050a3f5dc2d",
"mode": "100644",
- "sha256": "70c51fbd3abb0c743df1e2840a59e484d8fdc3cf7dd08a2534c26d8e5e9e1bd7"
+ "sha256": "fde343558bab6cca019fd59e09ab693746e6ee721a371d30665f08a486d61b15"
},
"core/crates/tera_core/src/runtime/product_surface/submission/atomic_fault_store.rs": {
"bytes": 3189,
@@ -921,10 +933,16 @@
"sha256": "23fab4dd866cf8d4acf87c9091c8858312dc7789d5fe08c250694a69a02248ed"
},
"core/crates/tera_core/src/runtime/product_surface/submission/intent.rs": {
- "bytes": 9935,
- "git_blob": "8a8367a4d9df09700af6eb152dda91646886f6eb",
+ "bytes": 9975,
+ "git_blob": "cd873d3fcaadb22b7b58d2019e47500255e06fc3",
+ "mode": "100644",
+ "sha256": "add8efa48b69b51c81df8b384d8cd489d165459837275d23e18cf4aa490ebc0b"
+ },
+ "core/crates/tera_core/src/runtime/product_surface/submission/intent_media.rs": {
+ "bytes": 3230,
+ "git_blob": "b01b93b31cda3d507b30b6e092a96e316dd34c98",
"mode": "100644",
- "sha256": "44459a1fc1819d83dbf5355cfa01442e832a8607d9c4dd5a210fdf51b2d3757f"
+ "sha256": "3a1cbb65da28dd8cf84c494001c071df75449185deb4cd4fb11054feecca9d5f"
},
"core/crates/tera_core/src/runtime/product_surface/submission/intent_tests.rs": {
"bytes": 7768,
@@ -932,17 +950,59 @@
"mode": "100644",
"sha256": "513320bd503d0f747edc5b72e4039bd51344c03ab82f73c870e5346e785b66e4"
},
+ "core/crates/tera_core/src/runtime/product_surface/submission/inventory.rs": {
+ "bytes": 8116,
+ "git_blob": "e8c53467ebab66cd381aa8f177bdaca11a053b3b",
+ "mode": "100644",
+ "sha256": "889b35c7b852273999a3202a56495547e2ec147595029bad31c1122d05c2aa53"
+ },
+ "core/crates/tera_core/src/runtime/product_surface/submission/inventory_tests.rs": {
+ "bytes": 10786,
+ "git_blob": "8e297884db1b82738313adc12f0a72daccd47af1",
+ "mode": "100644",
+ "sha256": "91e8ea5db8bb9f969262978e7a2bc823823a58d24f39414ec33a10fe6b3fa5eb"
+ },
+ "core/crates/tera_core/src/runtime/product_surface/submission/media.rs": {
+ "bytes": 4702,
+ "git_blob": "f8899c770131df84d5ef4c04adc58303babca898",
+ "mode": "100644",
+ "sha256": "c1a495ecd8930805268a2536c692d428c1f1f3de08730cb60e6792324a268417"
+ },
+ "core/crates/tera_core/src/runtime/product_surface/submission/media_recovery_tests.rs": {
+ "bytes": 4696,
+ "git_blob": "49548e21af9da1c4ef03d86a32ae1a89987818b1",
+ "mode": "100644",
+ "sha256": "528d5829ac92c5a4d2e6a62fcc15f28b599efee184beaf764ddb5b80f9a9fa58"
+ },
+ "core/crates/tera_core/src/runtime/product_surface/submission/media_runtime.rs": {
+ "bytes": 5023,
+ "git_blob": "2ff692b844909ec444637f697b96fa102d747ff8",
+ "mode": "100644",
+ "sha256": "6c87773ff682aca31183d167a14b75a61a6a7318fd7c200c9be5f8cfb8b0896c"
+ },
+ "core/crates/tera_core/src/runtime/product_surface/submission/media_test_support.rs": {
+ "bytes": 2655,
+ "git_blob": "201ccb3ba7f6376ebe1151090ac34ea8a829e823",
+ "mode": "100644",
+ "sha256": "0e75609fd40ec2712841ca784ac4a55b0053fdf54f1fd42f59abd1bcc5721e93"
+ },
+ "core/crates/tera_core/src/runtime/product_surface/submission/media_tests.rs": {
+ "bytes": 6296,
+ "git_blob": "aea440f717ea461427118fb5082d9c13574e02ca",
+ "mode": "100644",
+ "sha256": "6ae1acbd4c0cbc4b8ad38861c7359e6f9bf98659551878c71ef76c4a2aa967ae"
+ },
"core/crates/tera_core/src/runtime/product_surface/submission/operation.rs": {
- "bytes": 5956,
- "git_blob": "025015f05b1674ac462f71a333e5781111704a5f",
+ "bytes": 7126,
+ "git_blob": "69292d1f696a9973533bf348d02cfb8b83c21133",
"mode": "100644",
- "sha256": "178be957fd0b899de4f3dbecb31fc5e41faeb2a83b9cec329747d628bc49d104"
+ "sha256": "511d21ba6b6614821cc05b40793943e79e5636a393b0250d6ba33043caa2ef81"
},
"core/crates/tera_core/src/runtime/product_surface/submission/operation_load.rs": {
- "bytes": 4726,
- "git_blob": "b0d9c843be0156d125f99900ec342a23d97dc70a",
+ "bytes": 4379,
+ "git_blob": "8dd7e15aa3c3883c024646c74bbc0bc424ab3c7c",
"mode": "100644",
- "sha256": "1d9f0935dd2b36d97b3d553754c6f12d2c536df9225c997cc416cb2bf6a84497"
+ "sha256": "4caea4f80c950b4897af6c818b4a52e3936d02a5a912d3e7db1946ff6c339052"
},
"core/crates/tera_core/src/runtime/product_surface/submission/operation_recovery_tests.rs": {
"bytes": 3771,
@@ -951,10 +1011,10 @@
"sha256": "34053a01079a939b54615f9c39e9f97314f9741bb1ff70fd309257c24ba00acc"
},
"core/crates/tera_core/src/runtime/product_surface/submission/operation_test_support.rs": {
- "bytes": 6267,
- "git_blob": "a4a3aa744a9b25ab693cc9cde426c086adbf023c",
+ "bytes": 6425,
+ "git_blob": "b035c31234de26dd50a9533b1103ff7caf501b24",
"mode": "100644",
- "sha256": "0c5e6561cb50ab0c05d5001a3e8e8d59cba0cb51961bd8efd8fc36b86f698d8a"
+ "sha256": "83ec90cbadc617260a9b23e492e2a6fabfbe789eee12a4f237c9390ed9767c4d"
},
"core/crates/tera_core/src/runtime/product_surface/submission/operation_tests.rs": {
"bytes": 10339,
@@ -963,10 +1023,10 @@
"sha256": "442655af58a6de128bb9a2f38be6b7173d12ea602d8565ea7dca1d15e681213e"
},
"core/crates/tera_core/src/runtime/product_surface/submission/record.rs": {
- "bytes": 5041,
- "git_blob": "0b1a1d54477249f2ccfa0ec7955de5378340a528",
+ "bytes": 6059,
+ "git_blob": "d9b3be0014e232421b7053837a8e02aa8d5b6f98",
"mode": "100644",
- "sha256": "5a450eaab5c699da2aa8e940aad1a5560aff48d3030859d3ba05ab9944c55334"
+ "sha256": "24c0b383433ad05338a611f733090902ac33257a59434ceed0c599c664097e69"
},
"core/crates/tera_core/src/runtime/product_surface/submission/record_tests.rs": {
"bytes": 4988,
@@ -1582,9 +1642,9 @@
},
"radroots.lib.source-lock.v1.toml": {
"bytes": 482,
- "git_blob": "c72ce8cf2a900d3464fe6ec2311fa5d21bc1bf57",
+ "git_blob": "a51c5b19b5417403b38651c73e973aff45762ba3",
"mode": "100644",
- "sha256": "a910d5d15d9c020172fb215bc8e2d27dd92c05cb1ab3b803791f13579e2932fa"
+ "sha256": "e952058c8b7e929c335fda72f85b5e28bcc9a63398ae97887b9bbba18a96ce52"
},
"rust-toolchain.toml": {
"bytes": 79,
@@ -1899,13 +1959,13 @@
"sha256": "b052a73a824e8f8b26af2646a4758f13655e04de9551a8271890d3cf2b63209d"
},
"test-fixtures/legacy-identifiers.v1.json": {
- "bytes": 131954,
- "git_blob": "32349030113731123547695834e580cf8d6b3b3c",
+ "bytes": 133764,
+ "git_blob": "2a245f8465a183c6263a41b46a0364e7dd4bb9a7",
"mode": "100644",
- "sha256": "e8f0034a49cddca52703bae646f2f88b06331195572902b9b728cde64e1a4ffa"
+ "sha256": "d6846c226536d724a7049c1404b8780feadcfd564c104e6ffb78e480a7625986"
}
},
"policy": "staged_inputs",
- "tree": "18a7a18d56a4fb953cd53e12f99afee48c7e6e41"
+ "tree": "2debefe8f899f1f0441c77eb804b135905a43358"
}
}
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=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde,std",
- "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde,std (*)",
- "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde,std",
- "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde,std (*)",
- "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde,std",
- "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde,std (*)",
- "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|json,serde,std",
- "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|json,serde,std (*)",
- "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde,std",
- "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde,std (*)",
- "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|blossom,events,std",
- "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|blossom,events,std (*)",
- "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde,std",
- "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde,std (*)",
- "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|blossom,nostr,sqlite,sync",
- "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|blossom,nostr,sqlite,sync (*)",
- "radroots_secrets v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|",
- "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde,std",
- "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde,std (*)",
- "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde",
- "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde (*)",
- "radroots_storage_sqlite v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|",
- "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|",
- "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)| (*)",
- "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|json,serde,std",
- "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|json,serde,std (*)",
- "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde,std",
- "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde,std (*)",
- "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|",
- "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)| (*)",
+ "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde,std",
+ "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde,std (*)",
+ "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde,std",
+ "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde,std (*)",
+ "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde,std",
+ "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde,std (*)",
+ "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|json,serde,std",
+ "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|json,serde,std (*)",
+ "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde,std",
+ "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde,std (*)",
+ "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|blossom,events,std",
+ "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|blossom,events,std (*)",
+ "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde,std",
+ "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde,std (*)",
+ "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|blossom,nostr,sqlite,sync",
+ "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|blossom,nostr,sqlite,sync (*)",
+ "radroots_secrets v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|",
+ "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde,std",
+ "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde,std (*)",
+ "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde",
+ "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde (*)",
+ "radroots_storage_sqlite v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|",
+ "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|",
+ "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)| (*)",
+ "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|json,serde,std",
+ "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|json,serde,std (*)",
+ "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde,std",
+ "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde,std (*)",
+ "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|",
+ "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)| (*)",
"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": "694cbdae0b6de4918edc747207a9e372dfba8ce8e590f9dd15ea6ab864f842c4",
+ "cargo_lock_sha256": "4d1143601e90436115100eabcab9f098152ae7606976e906746cfe0bba78be8c",
"disposition": "local_staged_source_only",
"foundation": {
"architecture": "radroots.crates.release.v2",
- "lockfile_sha256": "694cbdae0b6de4918edc747207a9e372dfba8ce8e590f9dd15ea6ab864f842c4",
+ "lockfile_sha256": "4d1143601e90436115100eabcab9f098152ae7606976e906746cfe0bba78be8c",
"repository": "https://github.com/radrootslabs/lib",
- "revision": "ac392da942896a6b676f063929af16971e201b0e",
+ "revision": "bb54297d208f8e3817485d1c1a63a386f457349a",
"schema": "radroots.lib.source-lock.v1",
- "source_archive_sha256": "c7c5de435fa7965181d44ccc146cab4286b943e0fdc34d6be757d38a2961ed1c",
+ "source_archive_sha256": "30c02cb48df5864e53febe96b7ec3193e896ad9b94d05cfce0d051a4f539618a",
"version": "0.1.0-alpha",
"workspace_catalog_sha256": "ee295f2352e2577a4052d980624415aec9871197d4fc9910a4c21c83a9179200"
},
@@ -498,15 +498,15 @@
"files": {
"Cargo.lock": {
"bytes": 94853,
- "git_blob": "93daaf6d05fc4f6d7dfd7343b4e6d9cf11dbd5ba",
+ "git_blob": "bf6d9d493e562eecb389b1a75c38324b3e1f0190",
"mode": "100644",
- "sha256": "694cbdae0b6de4918edc747207a9e372dfba8ce8e590f9dd15ea6ab864f842c4"
+ "sha256": "4d1143601e90436115100eabcab9f098152ae7606976e906746cfe0bba78be8c"
},
"Cargo.toml": {
"bytes": 4442,
- "git_blob": "2e86fc8e74051e44b1acad6736543c30cb7c9b19",
+ "git_blob": "a76a43232f8e359b08368612ecc225ec8a8e9d87",
"mode": "100644",
- "sha256": "29004a91f6b5f6474439d39fb15f4bf8794bd0677a82eec1b7266191d23be5cc"
+ "sha256": "76563476c14d43ea9c7c1f5b78000676918619c501940b06a5f6159a615dc0d7"
},
"Makefile": {
"bytes": 3934,
@@ -641,10 +641,10 @@
"sha256": "dff55e46521c26f5f0ece024453b55c15f132fa94f78e2cba3d141f123d4eca0"
},
"core/crates/tera_core/src/runtime/product_surface.rs": {
- "bytes": 7824,
- "git_blob": "d47c550c5f18f5ef4d106004287ece34b8df4ad7",
+ "bytes": 7961,
+ "git_blob": "038219781276bedec4da0ad309be6784c7cc4252",
"mode": "100644",
- "sha256": "74cc8b81313265d09456dc0efe619e49fcd7a5d7962055215cf8e31618cb1f1b"
+ "sha256": "c47647330fb03412d9237b14c9ccb8b434d7bc796a1517ad96a7608840295b12"
},
"core/crates/tera_core/src/runtime/product_surface/authoring.rs": {
"bytes": 11282,
@@ -797,10 +797,10 @@
"sha256": "f5d9c1bac647bf745600c2edefffa1f25172221ac9d4913b81b2b5a8fcc8b590"
},
"core/crates/tera_core/src/runtime/product_surface/outbox.rs": {
- "bytes": 170329,
- "git_blob": "696260720ef6a54c2111d7b975fb85ac45abb41d",
+ "bytes": 167726,
+ "git_blob": "28341e9a2efd3fb6ed3d98ffeddf3cda11803a40",
"mode": "100644",
- "sha256": "48cc3be9a8a1356f2cde36816329955fd20bb930c01e75d2243d82dbe8ed3d0b"
+ "sha256": "db3d98be8e920a41c205bb58c6ac3bc873b3e17638dc78cf4d958dd9cc04310f"
},
"core/crates/tera_core/src/runtime/product_surface/outbox/advance.rs": {
"bytes": 2011,
@@ -820,12 +820,24 @@
"mode": "100644",
"sha256": "a77be347ffb219b07d15b79582dfc159f5728e1f5b8c9036b9c132a64f7a9ce8"
},
+ "core/crates/tera_core/src/runtime/product_surface/outbox/media.rs": {
+ "bytes": 2714,
+ "git_blob": "a24fb22dd3088d6609a403849203b18b8602aa05",
+ "mode": "100644",
+ "sha256": "b6878895dc35c38578cc8ee95874c019462fb4d2090c91d162b2a675f6f9584f"
+ },
"core/crates/tera_core/src/runtime/product_surface/outbox/mutation_admission_tests.rs": {
"bytes": 13316,
"git_blob": "9c63f04493eda38aa11cb77bec8173004ca70865",
"mode": "100644",
"sha256": "3c048e44551d04e607597761481c24e9bbe55f6b20358047d18c8013c093fb8f"
},
+ "core/crates/tera_core/src/runtime/product_surface/outbox/native_upload.rs": {
+ "bytes": 1856,
+ "git_blob": "6d0db606aa081418f2d221e6a6d31c7aecd7274b",
+ "mode": "100644",
+ "sha256": "2e1b1e65d461a73f6d5737297ded95cb683b9daea4b076a5625c36757808a70d"
+ },
"core/crates/tera_core/src/runtime/product_surface/projection.rs": {
"bytes": 23423,
"git_blob": "a0186bb29cafbaab4268af10acd5dc701cf4c228",
@@ -845,10 +857,10 @@
"sha256": "76e3bddfc237dac63293d264d68991b489585136fe377e39dbba72aa3a1181f4"
},
"core/crates/tera_core/src/runtime/product_surface/submission.rs": {
- "bytes": 5404,
- "git_blob": "aca536a36c4a9f5cebad5f206ecb66e17d7c392c",
+ "bytes": 5744,
+ "git_blob": "388bc937587f9a7f4c2ea4f33ca2b050a3f5dc2d",
"mode": "100644",
- "sha256": "70c51fbd3abb0c743df1e2840a59e484d8fdc3cf7dd08a2534c26d8e5e9e1bd7"
+ "sha256": "fde343558bab6cca019fd59e09ab693746e6ee721a371d30665f08a486d61b15"
},
"core/crates/tera_core/src/runtime/product_surface/submission/atomic_fault_store.rs": {
"bytes": 3189,
@@ -917,10 +929,16 @@
"sha256": "23fab4dd866cf8d4acf87c9091c8858312dc7789d5fe08c250694a69a02248ed"
},
"core/crates/tera_core/src/runtime/product_surface/submission/intent.rs": {
- "bytes": 9935,
- "git_blob": "8a8367a4d9df09700af6eb152dda91646886f6eb",
+ "bytes": 9975,
+ "git_blob": "cd873d3fcaadb22b7b58d2019e47500255e06fc3",
+ "mode": "100644",
+ "sha256": "add8efa48b69b51c81df8b384d8cd489d165459837275d23e18cf4aa490ebc0b"
+ },
+ "core/crates/tera_core/src/runtime/product_surface/submission/intent_media.rs": {
+ "bytes": 3230,
+ "git_blob": "b01b93b31cda3d507b30b6e092a96e316dd34c98",
"mode": "100644",
- "sha256": "44459a1fc1819d83dbf5355cfa01442e832a8607d9c4dd5a210fdf51b2d3757f"
+ "sha256": "3a1cbb65da28dd8cf84c494001c071df75449185deb4cd4fb11054feecca9d5f"
},
"core/crates/tera_core/src/runtime/product_surface/submission/intent_tests.rs": {
"bytes": 7768,
@@ -928,17 +946,59 @@
"mode": "100644",
"sha256": "513320bd503d0f747edc5b72e4039bd51344c03ab82f73c870e5346e785b66e4"
},
+ "core/crates/tera_core/src/runtime/product_surface/submission/inventory.rs": {
+ "bytes": 8116,
+ "git_blob": "e8c53467ebab66cd381aa8f177bdaca11a053b3b",
+ "mode": "100644",
+ "sha256": "889b35c7b852273999a3202a56495547e2ec147595029bad31c1122d05c2aa53"
+ },
+ "core/crates/tera_core/src/runtime/product_surface/submission/inventory_tests.rs": {
+ "bytes": 10786,
+ "git_blob": "8e297884db1b82738313adc12f0a72daccd47af1",
+ "mode": "100644",
+ "sha256": "91e8ea5db8bb9f969262978e7a2bc823823a58d24f39414ec33a10fe6b3fa5eb"
+ },
+ "core/crates/tera_core/src/runtime/product_surface/submission/media.rs": {
+ "bytes": 4702,
+ "git_blob": "f8899c770131df84d5ef4c04adc58303babca898",
+ "mode": "100644",
+ "sha256": "c1a495ecd8930805268a2536c692d428c1f1f3de08730cb60e6792324a268417"
+ },
+ "core/crates/tera_core/src/runtime/product_surface/submission/media_recovery_tests.rs": {
+ "bytes": 4696,
+ "git_blob": "49548e21af9da1c4ef03d86a32ae1a89987818b1",
+ "mode": "100644",
+ "sha256": "528d5829ac92c5a4d2e6a62fcc15f28b599efee184beaf764ddb5b80f9a9fa58"
+ },
+ "core/crates/tera_core/src/runtime/product_surface/submission/media_runtime.rs": {
+ "bytes": 5023,
+ "git_blob": "2ff692b844909ec444637f697b96fa102d747ff8",
+ "mode": "100644",
+ "sha256": "6c87773ff682aca31183d167a14b75a61a6a7318fd7c200c9be5f8cfb8b0896c"
+ },
+ "core/crates/tera_core/src/runtime/product_surface/submission/media_test_support.rs": {
+ "bytes": 2655,
+ "git_blob": "201ccb3ba7f6376ebe1151090ac34ea8a829e823",
+ "mode": "100644",
+ "sha256": "0e75609fd40ec2712841ca784ac4a55b0053fdf54f1fd42f59abd1bcc5721e93"
+ },
+ "core/crates/tera_core/src/runtime/product_surface/submission/media_tests.rs": {
+ "bytes": 6296,
+ "git_blob": "aea440f717ea461427118fb5082d9c13574e02ca",
+ "mode": "100644",
+ "sha256": "6ae1acbd4c0cbc4b8ad38861c7359e6f9bf98659551878c71ef76c4a2aa967ae"
+ },
"core/crates/tera_core/src/runtime/product_surface/submission/operation.rs": {
- "bytes": 5956,
- "git_blob": "025015f05b1674ac462f71a333e5781111704a5f",
+ "bytes": 7126,
+ "git_blob": "69292d1f696a9973533bf348d02cfb8b83c21133",
"mode": "100644",
- "sha256": "178be957fd0b899de4f3dbecb31fc5e41faeb2a83b9cec329747d628bc49d104"
+ "sha256": "511d21ba6b6614821cc05b40793943e79e5636a393b0250d6ba33043caa2ef81"
},
"core/crates/tera_core/src/runtime/product_surface/submission/operation_load.rs": {
- "bytes": 4726,
- "git_blob": "b0d9c843be0156d125f99900ec342a23d97dc70a",
+ "bytes": 4379,
+ "git_blob": "8dd7e15aa3c3883c024646c74bbc0bc424ab3c7c",
"mode": "100644",
- "sha256": "1d9f0935dd2b36d97b3d553754c6f12d2c536df9225c997cc416cb2bf6a84497"
+ "sha256": "4caea4f80c950b4897af6c818b4a52e3936d02a5a912d3e7db1946ff6c339052"
},
"core/crates/tera_core/src/runtime/product_surface/submission/operation_recovery_tests.rs": {
"bytes": 3771,
@@ -947,10 +1007,10 @@
"sha256": "34053a01079a939b54615f9c39e9f97314f9741bb1ff70fd309257c24ba00acc"
},
"core/crates/tera_core/src/runtime/product_surface/submission/operation_test_support.rs": {
- "bytes": 6267,
- "git_blob": "a4a3aa744a9b25ab693cc9cde426c086adbf023c",
+ "bytes": 6425,
+ "git_blob": "b035c31234de26dd50a9533b1103ff7caf501b24",
"mode": "100644",
- "sha256": "0c5e6561cb50ab0c05d5001a3e8e8d59cba0cb51961bd8efd8fc36b86f698d8a"
+ "sha256": "83ec90cbadc617260a9b23e492e2a6fabfbe789eee12a4f237c9390ed9767c4d"
},
"core/crates/tera_core/src/runtime/product_surface/submission/operation_tests.rs": {
"bytes": 10339,
@@ -959,10 +1019,10 @@
"sha256": "442655af58a6de128bb9a2f38be6b7173d12ea602d8565ea7dca1d15e681213e"
},
"core/crates/tera_core/src/runtime/product_surface/submission/record.rs": {
- "bytes": 5041,
- "git_blob": "0b1a1d54477249f2ccfa0ec7955de5378340a528",
+ "bytes": 6059,
+ "git_blob": "d9b3be0014e232421b7053837a8e02aa8d5b6f98",
"mode": "100644",
- "sha256": "5a450eaab5c699da2aa8e940aad1a5560aff48d3030859d3ba05ab9944c55334"
+ "sha256": "24c0b383433ad05338a611f733090902ac33257a59434ceed0c599c664097e69"
},
"core/crates/tera_core/src/runtime/product_surface/submission/record_tests.rs": {
"bytes": 4988,
@@ -1578,9 +1638,9 @@
},
"radroots.lib.source-lock.v1.toml": {
"bytes": 482,
- "git_blob": "c72ce8cf2a900d3464fe6ec2311fa5d21bc1bf57",
+ "git_blob": "a51c5b19b5417403b38651c73e973aff45762ba3",
"mode": "100644",
- "sha256": "a910d5d15d9c020172fb215bc8e2d27dd92c05cb1ab3b803791f13579e2932fa"
+ "sha256": "e952058c8b7e929c335fda72f85b5e28bcc9a63398ae97887b9bbba18a96ce52"
},
"rust-toolchain.toml": {
"bytes": 79,
@@ -1895,13 +1955,13 @@
"sha256": "b052a73a824e8f8b26af2646a4758f13655e04de9551a8271890d3cf2b63209d"
},
"test-fixtures/legacy-identifiers.v1.json": {
- "bytes": 131954,
- "git_blob": "32349030113731123547695834e580cf8d6b3b3c",
+ "bytes": 133764,
+ "git_blob": "2a245f8465a183c6263a41b46a0364e7dd4bb9a7",
"mode": "100644",
- "sha256": "e8f0034a49cddca52703bae646f2f88b06331195572902b9b728cde64e1a4ffa"
+ "sha256": "d6846c226536d724a7049c1404b8780feadcfd564c104e6ffb78e480a7625986"
}
},
"policy": "staged_inputs",
- "tree": "18a7a18d56a4fb953cd53e12f99afee48c7e6e41"
+ "tree": "2debefe8f899f1f0441c77eb804b135905a43358"
}
}
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=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde,std",
- "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde,std (*)",
- "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde,std",
- "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde,std (*)",
- "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde,std",
- "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde,std (*)",
- "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|json,serde,std",
- "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|json,serde,std (*)",
- "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde,std",
- "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde,std (*)",
- "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|blossom,events,std",
- "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|blossom,events,std (*)",
- "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde,std",
- "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde,std (*)",
- "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|blossom,nostr,sqlite,sync",
- "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|blossom,nostr,sqlite,sync (*)",
- "radroots_secrets v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|",
- "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde,std",
- "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde,std (*)",
- "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde",
- "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde (*)",
- "radroots_storage_sqlite v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|",
- "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|",
- "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)| (*)",
- "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|json,serde,std",
- "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|json,serde,std (*)",
- "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde,std",
- "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|serde,std (*)",
- "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)|",
- "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da9)| (*)",
+ "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde,std",
+ "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde,std (*)",
+ "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde,std",
+ "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde,std (*)",
+ "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde,std",
+ "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde,std (*)",
+ "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|json,serde,std",
+ "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|json,serde,std (*)",
+ "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde,std",
+ "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde,std (*)",
+ "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|blossom,events,std",
+ "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|blossom,events,std (*)",
+ "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde,std",
+ "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde,std (*)",
+ "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|blossom,nostr,sqlite,sync",
+ "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|blossom,nostr,sqlite,sync (*)",
+ "radroots_secrets v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|",
+ "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde,std",
+ "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde,std (*)",
+ "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde",
+ "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde (*)",
+ "radroots_storage_sqlite v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|",
+ "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|",
+ "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)| (*)",
+ "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|json,serde,std",
+ "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|json,serde,std (*)",
+ "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde,std",
+ "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|serde,std (*)",
+ "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)|",
+ "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d)| (*)",
"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": "694cbdae0b6de4918edc747207a9e372dfba8ce8e590f9dd15ea6ab864f842c4",
+ "cargo_lock_sha256": "4d1143601e90436115100eabcab9f098152ae7606976e906746cfe0bba78be8c",
"disposition": "local_staged_source_only",
"foundation": {
"architecture": "radroots.crates.release.v2",
- "lockfile_sha256": "694cbdae0b6de4918edc747207a9e372dfba8ce8e590f9dd15ea6ab864f842c4",
+ "lockfile_sha256": "4d1143601e90436115100eabcab9f098152ae7606976e906746cfe0bba78be8c",
"repository": "https://github.com/radrootslabs/lib",
- "revision": "ac392da942896a6b676f063929af16971e201b0e",
+ "revision": "bb54297d208f8e3817485d1c1a63a386f457349a",
"schema": "radroots.lib.source-lock.v1",
- "source_archive_sha256": "c7c5de435fa7965181d44ccc146cab4286b943e0fdc34d6be757d38a2961ed1c",
+ "source_archive_sha256": "30c02cb48df5864e53febe96b7ec3193e896ad9b94d05cfce0d051a4f539618a",
"version": "0.1.0-alpha",
"workspace_catalog_sha256": "ee295f2352e2577a4052d980624415aec9871197d4fc9910a4c21c83a9179200"
},
@@ -498,15 +498,15 @@
"files": {
"Cargo.lock": {
"bytes": 94853,
- "git_blob": "93daaf6d05fc4f6d7dfd7343b4e6d9cf11dbd5ba",
+ "git_blob": "bf6d9d493e562eecb389b1a75c38324b3e1f0190",
"mode": "100644",
- "sha256": "694cbdae0b6de4918edc747207a9e372dfba8ce8e590f9dd15ea6ab864f842c4"
+ "sha256": "4d1143601e90436115100eabcab9f098152ae7606976e906746cfe0bba78be8c"
},
"Cargo.toml": {
"bytes": 4442,
- "git_blob": "2e86fc8e74051e44b1acad6736543c30cb7c9b19",
+ "git_blob": "a76a43232f8e359b08368612ecc225ec8a8e9d87",
"mode": "100644",
- "sha256": "29004a91f6b5f6474439d39fb15f4bf8794bd0677a82eec1b7266191d23be5cc"
+ "sha256": "76563476c14d43ea9c7c1f5b78000676918619c501940b06a5f6159a615dc0d7"
},
"Makefile": {
"bytes": 3934,
@@ -641,10 +641,10 @@
"sha256": "dff55e46521c26f5f0ece024453b55c15f132fa94f78e2cba3d141f123d4eca0"
},
"core/crates/tera_core/src/runtime/product_surface.rs": {
- "bytes": 7824,
- "git_blob": "d47c550c5f18f5ef4d106004287ece34b8df4ad7",
+ "bytes": 7961,
+ "git_blob": "038219781276bedec4da0ad309be6784c7cc4252",
"mode": "100644",
- "sha256": "74cc8b81313265d09456dc0efe619e49fcd7a5d7962055215cf8e31618cb1f1b"
+ "sha256": "c47647330fb03412d9237b14c9ccb8b434d7bc796a1517ad96a7608840295b12"
},
"core/crates/tera_core/src/runtime/product_surface/authoring.rs": {
"bytes": 11282,
@@ -797,10 +797,10 @@
"sha256": "f5d9c1bac647bf745600c2edefffa1f25172221ac9d4913b81b2b5a8fcc8b590"
},
"core/crates/tera_core/src/runtime/product_surface/outbox.rs": {
- "bytes": 170329,
- "git_blob": "696260720ef6a54c2111d7b975fb85ac45abb41d",
+ "bytes": 167726,
+ "git_blob": "28341e9a2efd3fb6ed3d98ffeddf3cda11803a40",
"mode": "100644",
- "sha256": "48cc3be9a8a1356f2cde36816329955fd20bb930c01e75d2243d82dbe8ed3d0b"
+ "sha256": "db3d98be8e920a41c205bb58c6ac3bc873b3e17638dc78cf4d958dd9cc04310f"
},
"core/crates/tera_core/src/runtime/product_surface/outbox/advance.rs": {
"bytes": 2011,
@@ -820,12 +820,24 @@
"mode": "100644",
"sha256": "a77be347ffb219b07d15b79582dfc159f5728e1f5b8c9036b9c132a64f7a9ce8"
},
+ "core/crates/tera_core/src/runtime/product_surface/outbox/media.rs": {
+ "bytes": 2714,
+ "git_blob": "a24fb22dd3088d6609a403849203b18b8602aa05",
+ "mode": "100644",
+ "sha256": "b6878895dc35c38578cc8ee95874c019462fb4d2090c91d162b2a675f6f9584f"
+ },
"core/crates/tera_core/src/runtime/product_surface/outbox/mutation_admission_tests.rs": {
"bytes": 13316,
"git_blob": "9c63f04493eda38aa11cb77bec8173004ca70865",
"mode": "100644",
"sha256": "3c048e44551d04e607597761481c24e9bbe55f6b20358047d18c8013c093fb8f"
},
+ "core/crates/tera_core/src/runtime/product_surface/outbox/native_upload.rs": {
+ "bytes": 1856,
+ "git_blob": "6d0db606aa081418f2d221e6a6d31c7aecd7274b",
+ "mode": "100644",
+ "sha256": "2e1b1e65d461a73f6d5737297ded95cb683b9daea4b076a5625c36757808a70d"
+ },
"core/crates/tera_core/src/runtime/product_surface/projection.rs": {
"bytes": 23423,
"git_blob": "a0186bb29cafbaab4268af10acd5dc701cf4c228",
@@ -845,10 +857,10 @@
"sha256": "76e3bddfc237dac63293d264d68991b489585136fe377e39dbba72aa3a1181f4"
},
"core/crates/tera_core/src/runtime/product_surface/submission.rs": {
- "bytes": 5404,
- "git_blob": "aca536a36c4a9f5cebad5f206ecb66e17d7c392c",
+ "bytes": 5744,
+ "git_blob": "388bc937587f9a7f4c2ea4f33ca2b050a3f5dc2d",
"mode": "100644",
- "sha256": "70c51fbd3abb0c743df1e2840a59e484d8fdc3cf7dd08a2534c26d8e5e9e1bd7"
+ "sha256": "fde343558bab6cca019fd59e09ab693746e6ee721a371d30665f08a486d61b15"
},
"core/crates/tera_core/src/runtime/product_surface/submission/atomic_fault_store.rs": {
"bytes": 3189,
@@ -917,10 +929,16 @@
"sha256": "23fab4dd866cf8d4acf87c9091c8858312dc7789d5fe08c250694a69a02248ed"
},
"core/crates/tera_core/src/runtime/product_surface/submission/intent.rs": {
- "bytes": 9935,
- "git_blob": "8a8367a4d9df09700af6eb152dda91646886f6eb",
+ "bytes": 9975,
+ "git_blob": "cd873d3fcaadb22b7b58d2019e47500255e06fc3",
+ "mode": "100644",
+ "sha256": "add8efa48b69b51c81df8b384d8cd489d165459837275d23e18cf4aa490ebc0b"
+ },
+ "core/crates/tera_core/src/runtime/product_surface/submission/intent_media.rs": {
+ "bytes": 3230,
+ "git_blob": "b01b93b31cda3d507b30b6e092a96e316dd34c98",
"mode": "100644",
- "sha256": "44459a1fc1819d83dbf5355cfa01442e832a8607d9c4dd5a210fdf51b2d3757f"
+ "sha256": "3a1cbb65da28dd8cf84c494001c071df75449185deb4cd4fb11054feecca9d5f"
},
"core/crates/tera_core/src/runtime/product_surface/submission/intent_tests.rs": {
"bytes": 7768,
@@ -928,17 +946,59 @@
"mode": "100644",
"sha256": "513320bd503d0f747edc5b72e4039bd51344c03ab82f73c870e5346e785b66e4"
},
+ "core/crates/tera_core/src/runtime/product_surface/submission/inventory.rs": {
+ "bytes": 8116,
+ "git_blob": "e8c53467ebab66cd381aa8f177bdaca11a053b3b",
+ "mode": "100644",
+ "sha256": "889b35c7b852273999a3202a56495547e2ec147595029bad31c1122d05c2aa53"
+ },
+ "core/crates/tera_core/src/runtime/product_surface/submission/inventory_tests.rs": {
+ "bytes": 10786,
+ "git_blob": "8e297884db1b82738313adc12f0a72daccd47af1",
+ "mode": "100644",
+ "sha256": "91e8ea5db8bb9f969262978e7a2bc823823a58d24f39414ec33a10fe6b3fa5eb"
+ },
+ "core/crates/tera_core/src/runtime/product_surface/submission/media.rs": {
+ "bytes": 4702,
+ "git_blob": "f8899c770131df84d5ef4c04adc58303babca898",
+ "mode": "100644",
+ "sha256": "c1a495ecd8930805268a2536c692d428c1f1f3de08730cb60e6792324a268417"
+ },
+ "core/crates/tera_core/src/runtime/product_surface/submission/media_recovery_tests.rs": {
+ "bytes": 4696,
+ "git_blob": "49548e21af9da1c4ef03d86a32ae1a89987818b1",
+ "mode": "100644",
+ "sha256": "528d5829ac92c5a4d2e6a62fcc15f28b599efee184beaf764ddb5b80f9a9fa58"
+ },
+ "core/crates/tera_core/src/runtime/product_surface/submission/media_runtime.rs": {
+ "bytes": 5023,
+ "git_blob": "2ff692b844909ec444637f697b96fa102d747ff8",
+ "mode": "100644",
+ "sha256": "6c87773ff682aca31183d167a14b75a61a6a7318fd7c200c9be5f8cfb8b0896c"
+ },
+ "core/crates/tera_core/src/runtime/product_surface/submission/media_test_support.rs": {
+ "bytes": 2655,
+ "git_blob": "201ccb3ba7f6376ebe1151090ac34ea8a829e823",
+ "mode": "100644",
+ "sha256": "0e75609fd40ec2712841ca784ac4a55b0053fdf54f1fd42f59abd1bcc5721e93"
+ },
+ "core/crates/tera_core/src/runtime/product_surface/submission/media_tests.rs": {
+ "bytes": 6296,
+ "git_blob": "aea440f717ea461427118fb5082d9c13574e02ca",
+ "mode": "100644",
+ "sha256": "6ae1acbd4c0cbc4b8ad38861c7359e6f9bf98659551878c71ef76c4a2aa967ae"
+ },
"core/crates/tera_core/src/runtime/product_surface/submission/operation.rs": {
- "bytes": 5956,
- "git_blob": "025015f05b1674ac462f71a333e5781111704a5f",
+ "bytes": 7126,
+ "git_blob": "69292d1f696a9973533bf348d02cfb8b83c21133",
"mode": "100644",
- "sha256": "178be957fd0b899de4f3dbecb31fc5e41faeb2a83b9cec329747d628bc49d104"
+ "sha256": "511d21ba6b6614821cc05b40793943e79e5636a393b0250d6ba33043caa2ef81"
},
"core/crates/tera_core/src/runtime/product_surface/submission/operation_load.rs": {
- "bytes": 4726,
- "git_blob": "b0d9c843be0156d125f99900ec342a23d97dc70a",
+ "bytes": 4379,
+ "git_blob": "8dd7e15aa3c3883c024646c74bbc0bc424ab3c7c",
"mode": "100644",
- "sha256": "1d9f0935dd2b36d97b3d553754c6f12d2c536df9225c997cc416cb2bf6a84497"
+ "sha256": "4caea4f80c950b4897af6c818b4a52e3936d02a5a912d3e7db1946ff6c339052"
},
"core/crates/tera_core/src/runtime/product_surface/submission/operation_recovery_tests.rs": {
"bytes": 3771,
@@ -947,10 +1007,10 @@
"sha256": "34053a01079a939b54615f9c39e9f97314f9741bb1ff70fd309257c24ba00acc"
},
"core/crates/tera_core/src/runtime/product_surface/submission/operation_test_support.rs": {
- "bytes": 6267,
- "git_blob": "a4a3aa744a9b25ab693cc9cde426c086adbf023c",
+ "bytes": 6425,
+ "git_blob": "b035c31234de26dd50a9533b1103ff7caf501b24",
"mode": "100644",
- "sha256": "0c5e6561cb50ab0c05d5001a3e8e8d59cba0cb51961bd8efd8fc36b86f698d8a"
+ "sha256": "83ec90cbadc617260a9b23e492e2a6fabfbe789eee12a4f237c9390ed9767c4d"
},
"core/crates/tera_core/src/runtime/product_surface/submission/operation_tests.rs": {
"bytes": 10339,
@@ -959,10 +1019,10 @@
"sha256": "442655af58a6de128bb9a2f38be6b7173d12ea602d8565ea7dca1d15e681213e"
},
"core/crates/tera_core/src/runtime/product_surface/submission/record.rs": {
- "bytes": 5041,
- "git_blob": "0b1a1d54477249f2ccfa0ec7955de5378340a528",
+ "bytes": 6059,
+ "git_blob": "d9b3be0014e232421b7053837a8e02aa8d5b6f98",
"mode": "100644",
- "sha256": "5a450eaab5c699da2aa8e940aad1a5560aff48d3030859d3ba05ab9944c55334"
+ "sha256": "24c0b383433ad05338a611f733090902ac33257a59434ceed0c599c664097e69"
},
"core/crates/tera_core/src/runtime/product_surface/submission/record_tests.rs": {
"bytes": 4988,
@@ -1578,9 +1638,9 @@
},
"radroots.lib.source-lock.v1.toml": {
"bytes": 482,
- "git_blob": "c72ce8cf2a900d3464fe6ec2311fa5d21bc1bf57",
+ "git_blob": "a51c5b19b5417403b38651c73e973aff45762ba3",
"mode": "100644",
- "sha256": "a910d5d15d9c020172fb215bc8e2d27dd92c05cb1ab3b803791f13579e2932fa"
+ "sha256": "e952058c8b7e929c335fda72f85b5e28bcc9a63398ae97887b9bbba18a96ce52"
},
"rust-toolchain.toml": {
"bytes": 79,
@@ -1895,13 +1955,13 @@
"sha256": "b052a73a824e8f8b26af2646a4758f13655e04de9551a8271890d3cf2b63209d"
},
"test-fixtures/legacy-identifiers.v1.json": {
- "bytes": 131954,
- "git_blob": "32349030113731123547695834e580cf8d6b3b3c",
+ "bytes": 133764,
+ "git_blob": "2a245f8465a183c6263a41b46a0364e7dd4bb9a7",
"mode": "100644",
- "sha256": "e8f0034a49cddca52703bae646f2f88b06331195572902b9b728cde64e1a4ffa"
+ "sha256": "d6846c226536d724a7049c1404b8780feadcfd564c104e6ffb78e480a7625986"
}
},
"policy": "staged_inputs",
- "tree": "18a7a18d56a4fb953cd53e12f99afee48c7e6e41"
+ "tree": "2debefe8f899f1f0441c77eb804b135905a43358"
}
}
diff --git a/core/crates/tera_core/src/runtime/product_surface.rs b/core/crates/tera_core/src/runtime/product_surface.rs
@@ -94,9 +94,11 @@ pub use submission::{
SUBMISSION_INTENT_SCHEMA_SHA256, SUBMISSION_INTENT_SCHEMA_VERSION,
SUBMISSION_RESERVATION_MAX_BYTES, SUBMISSION_RESERVATION_PAYLOAD_SCHEMA,
SUBMISSION_RESERVATION_SCHEMA_SHA256, SUBMISSION_RESERVATION_SCHEMA_VERSION,
- SubmissionCaptureError, SubmissionCommandId, SubmissionCommitError, SubmissionOperationError,
- SubmissionOperationStatus, SubmissionReceipt, SubmissionReservationError,
- SubmissionReservationReceipt, SubmissionReservationRequest,
+ SubmissionCaptureError, SubmissionCommandId, SubmissionCommitError, SubmissionListEntry,
+ SubmissionMediaRequest, SubmissionMediaResponse, SubmissionOperationError,
+ SubmissionOperationStatus, SubmissionPage, SubmissionReceipt, SubmissionReservationError,
+ SubmissionReservationReceipt, SubmissionReservationRequest, SubmissionSummary,
+ SubmissionSummaryState,
};
#[cfg(feature = "mobile-social")]
pub use today::{
diff --git a/core/crates/tera_core/src/runtime/product_surface/outbox.rs b/core/crates/tera_core/src/runtime/product_surface/outbox.rs
@@ -49,6 +49,8 @@ use crate::runtime::TeraRuntime;
mod advance;
#[path = "outbox/inventory.rs"]
mod inventory;
+mod media;
+mod native_upload;
pub use inventory::{
Phase1DraftListEntry, Phase1DraftPage, Phase1DraftRepairReason, Phase1DraftSummary,
};
@@ -340,7 +342,7 @@ impl Phase1MediaPrerequisite {
&& receipt.verified_at_unix_ms() > 0
}
- fn is_remote_verified(&self) -> bool {
+ pub(super) fn is_remote_verified(&self) -> bool {
self.stage == Phase1MediaStage::Verified
&& self.upload_attempts > 0
&& self.verified_at_unix_ms.is_some()
@@ -863,7 +865,7 @@ impl Phase1RevisionStatus {
}
impl Phase1UploadPlan {
- fn derive(
+ pub(super) fn derive(
now_unix_ms: u64,
operation_id: [u8; 16],
artifact_id: [u8; 16],
@@ -1559,50 +1561,20 @@ impl TeraRuntime {
let transaction = blossom
.prepare_upload(request)
.map_err(|_| Phase1DraftError::Operation)?;
- let remote_url = transaction.expected_url().as_str().to_owned();
- let content = radroots_blossom::authorization::AuthorizationContent::parse(
- &plan.authorization_content,
- )
- .map_err(|_| Phase1DraftError::InvalidMedia)?;
- let claim = blossom
- .authored_upload_claim(
- &transaction,
- content,
- plan.authorization_created_at_unix_s,
- plan.authorization_lifetime_seconds,
- )
- .map_err(|_| Phase1DraftError::Operation)?;
- let authorization = self
- .phase1_authorize_blossom_upload(
- *plan.operation_id.as_bytes(),
- *plan.artifact_id.as_bytes(),
- claim,
- plan.signing_deadline_unix_ms,
- plan.cancellation,
- )
- .await?;
+ let job = self.authorize_native_upload(&transaction, &plan).await?;
+ let remote_url = job.remote_url();
let uploading = self
.phase1_update_draft_media_admitted(
&admission,
*intent.draft_id.as_bytes(),
intent.expected_revision.get(),
- remote_url.as_str(),
+ remote_url,
Phase1MediaStage::Uploading,
None,
now_unix_ms,
)
.await?;
- Ok((
- uploading,
- Phase1NativeUploadJob {
- operation_id: *plan.operation_id.as_bytes(),
- remote_url,
- authorization_header: authorization.into_string(),
- expected_sha256: transaction.request().sha256().to_string(),
- media_type: transaction.request().media_type().as_str().to_owned(),
- byte_size: transaction.request().byte_size(),
- },
- ))
+ Ok((uploading, job))
}
/// Verifies a native BUD-02 response and canonical BUD-01 retrieval before
@@ -2214,20 +2186,7 @@ impl TeraRuntime {
.iter_mut()
.find(|media| media.url == url)
.ok_or(Phase1DraftError::InvalidMedia)?;
- if !valid_media_transition(media.stage, stage)
- || matches!(
- stage,
- Phase1MediaStage::Verified | Phase1MediaStage::Orphaned
- )
- {
- return Err(Phase1DraftError::InvalidMedia);
- }
- media.stage = stage;
- media.failure_code = failure_code;
- if stage != Phase1MediaStage::Failed {
- media.failure_code = None;
- }
- media.validate()?;
+ media.transition_requested(stage, failure_code)?;
let next_stage = draft_stage_for_media(&payload.media);
let next = head
.successor(payload.encode()?, next_stage, None, updated_at_unix_ms)
@@ -2295,15 +2254,7 @@ impl TeraRuntime {
.iter_mut()
.find(|media| media.url == url)
.ok_or(Phase1DraftError::InvalidMedia)?;
- if media.stage != Phase1MediaStage::Uploading || !media.matches_receipt(&receipt) {
- return Err(Phase1DraftError::InvalidMedia);
- }
- media.stage = Phase1MediaStage::Verified;
- media.failure_code = None;
- media.upload_attempts = receipt.attempts();
- media.verified_at_unix_ms = Some(receipt.verified_at_unix_ms());
- media.orphan = None;
- media.validate()?;
+ media.complete_transfer(&receipt)?;
let next_stage = draft_stage_for_media(&payload.media);
let next = head
.successor(payload.encode()?, next_stage, None, updated_at_unix_ms)
@@ -2374,24 +2325,7 @@ impl TeraRuntime {
.iter_mut()
.find(|media| media.url == url)
.ok_or(Phase1DraftError::InvalidMedia)?;
- if !matches!(
- media.stage,
- Phase1MediaStage::Pending
- | Phase1MediaStage::Preparing
- | Phase1MediaStage::Uploading
- | Phase1MediaStage::Failed
- ) {
- return Err(Phase1DraftError::InvalidMedia);
- }
- media.stage = Phase1MediaStage::Failed;
- media.failure_code = Some(error.code().to_owned());
- media.upload_attempts = error.attempts();
- media.verified_at_unix_ms = None;
- media.orphan = error.possible_orphan().then(|| Phase1MediaOrphanRecord {
- reason_code: error.code().to_owned(),
- recorded_at_unix_ms: updated_at_unix_ms,
- });
- media.validate()?;
+ media.fail_transfer(error, updated_at_unix_ms)?;
let next_stage = draft_stage_for_media(&payload.media);
let next = head
.successor(payload.encode()?, next_stage, None, updated_at_unix_ms)
diff --git a/core/crates/tera_core/src/runtime/product_surface/outbox/media.rs b/core/crates/tera_core/src/runtime/product_surface/outbox/media.rs
@@ -0,0 +1,77 @@
+//! Shared media transitions; only verified SDK receipts can satisfy a prerequisite.
+
+use super::*;
+
+impl Phase1MediaPrerequisite {
+ pub(in crate::runtime::product_surface) fn transition_requested(
+ &mut self,
+ stage: Phase1MediaStage,
+ failure_code: Option<String>,
+ ) -> Result<(), Phase1DraftError> {
+ if !valid_media_transition(self.stage, stage)
+ || matches!(
+ stage,
+ Phase1MediaStage::Verified | Phase1MediaStage::Orphaned
+ )
+ {
+ return Err(Phase1DraftError::InvalidMedia);
+ }
+ self.stage = stage;
+ self.failure_code = failure_code;
+ if stage != Phase1MediaStage::Failed {
+ self.failure_code = None;
+ }
+ self.validate()?;
+ Ok(())
+ }
+
+ pub(in crate::runtime::product_surface) fn complete_transfer(
+ &mut self,
+ receipt: &radroots_sdk::transport::BlossomUploadReceipt,
+ ) -> Result<(), Phase1DraftError> {
+ if self.stage != Phase1MediaStage::Uploading || !self.matches_receipt(receipt) {
+ return Err(Phase1DraftError::InvalidMedia);
+ }
+ self.stage = Phase1MediaStage::Verified;
+ self.failure_code = None;
+ self.upload_attempts = receipt.attempts();
+ self.verified_at_unix_ms = Some(receipt.verified_at_unix_ms());
+ self.orphan = None;
+ self.validate()?;
+ Ok(())
+ }
+
+ pub(in crate::runtime::product_surface) fn fail_transfer(
+ &mut self,
+ error: &radroots_sdk::transport::BlossomError,
+ updated_at_unix_ms: u64,
+ ) -> Result<(), Phase1DraftError> {
+ if !matches!(
+ self.stage,
+ Phase1MediaStage::Pending
+ | Phase1MediaStage::Preparing
+ | Phase1MediaStage::Uploading
+ | Phase1MediaStage::Failed
+ ) {
+ return Err(Phase1DraftError::InvalidMedia);
+ }
+ self.stage = Phase1MediaStage::Failed;
+ self.failure_code = Some(error.code().to_owned());
+ self.upload_attempts = error.attempts();
+ self.verified_at_unix_ms = None;
+ self.orphan = error.possible_orphan().then(|| Phase1MediaOrphanRecord {
+ reason_code: error.code().to_owned(),
+ recorded_at_unix_ms: updated_at_unix_ms,
+ });
+ self.validate()?;
+ Ok(())
+ }
+
+ pub(in crate::runtime::product_surface) fn same_input_as(&self, other: &Self) -> bool {
+ self.local_reference == other.local_reference
+ && self.url == other.url
+ && self.sha256 == other.sha256
+ && self.media_type == other.media_type
+ && self.byte_size == other.byte_size
+ }
+}
diff --git a/core/crates/tera_core/src/runtime/product_surface/outbox/native_upload.rs b/core/crates/tera_core/src/runtime/product_surface/outbox/native_upload.rs
@@ -0,0 +1,47 @@
+//! Existing opaque native upload authorization, shared after caller-owned validation.
+
+use super::*;
+
+impl TeraRuntime {
+ pub(in crate::runtime::product_surface) async fn authorize_native_upload(
+ &self,
+ transaction: &radroots_sdk::transport::BlossomUploadTransaction,
+ plan: &Phase1UploadPlan,
+ ) -> Result<Phase1NativeUploadJob, Phase1DraftError> {
+ let blossom = self
+ .client
+ .blossom()
+ .map_err(|_| Phase1DraftError::OperationUnavailable)?
+ .ok_or(Phase1DraftError::OperationUnavailable)?;
+ let remote_url = transaction.expected_url().as_str().to_owned();
+ let content = radroots_blossom::authorization::AuthorizationContent::parse(
+ &plan.authorization_content,
+ )
+ .map_err(|_| Phase1DraftError::InvalidMedia)?;
+ let claim = blossom
+ .authored_upload_claim(
+ transaction,
+ content,
+ plan.authorization_created_at_unix_s,
+ plan.authorization_lifetime_seconds,
+ )
+ .map_err(|_| Phase1DraftError::Operation)?;
+ let authorization = self
+ .phase1_authorize_blossom_upload(
+ *plan.operation_id.as_bytes(),
+ *plan.artifact_id.as_bytes(),
+ claim,
+ plan.signing_deadline_unix_ms,
+ plan.cancellation,
+ )
+ .await?;
+ Ok(Phase1NativeUploadJob {
+ operation_id: *plan.operation_id.as_bytes(),
+ remote_url,
+ authorization_header: authorization.into_string(),
+ expected_sha256: transaction.request().sha256().to_string(),
+ media_type: transaction.request().media_type().as_str().to_owned(),
+ byte_size: transaction.request().byte_size(),
+ })
+ }
+}
diff --git a/core/crates/tera_core/src/runtime/product_surface/submission.rs b/core/crates/tera_core/src/runtime/product_surface/submission.rs
@@ -4,6 +4,8 @@
mod capture;
mod commit;
mod intent;
+mod inventory;
+mod media;
mod operation;
mod operation_load;
mod record;
@@ -14,10 +16,22 @@ pub use intent::{
SUBMISSION_INTENT_MAX_BYTES, SUBMISSION_INTENT_PAYLOAD_SCHEMA, SUBMISSION_INTENT_SCHEMA_SHA256,
SUBMISSION_INTENT_SCHEMA_VERSION,
};
+pub use inventory::{
+ SubmissionListEntry, SubmissionPage, SubmissionSummary, SubmissionSummaryState,
+};
+pub use media::{SubmissionMediaRequest, SubmissionMediaResponse};
pub use operation::{SubmissionOperationError, SubmissionOperationStatus};
#[cfg(test)]
mod fault_store;
#[cfg(test)]
+mod inventory_tests;
+#[cfg(test)]
+mod media_recovery_tests;
+#[cfg(test)]
+mod media_test_support;
+#[cfg(test)]
+mod media_tests;
+#[cfg(test)]
mod operation_recovery_tests;
#[cfg(test)]
mod operation_test_support;
diff --git a/core/crates/tera_core/src/runtime/product_surface/submission/intent.rs b/core/crates/tera_core/src/runtime/product_surface/submission/intent.rs
@@ -25,6 +25,9 @@ use crate::runtime::product_surface::{
AddCommandType, ComposerScope, Phase1MediaPrerequisite, Phase1MediaStage, Phase1QueuePolicy,
};
+#[path = "intent_media.rs"]
+mod media;
+
pub const SUBMISSION_INTENT_PAYLOAD_SCHEMA: &str = "tera.publication_intent.v1";
pub const SUBMISSION_INTENT_SCHEMA_VERSION: u64 = 1;
pub const SUBMISSION_INTENT_SCHEMA_SHA256: &str =
diff --git a/core/crates/tera_core/src/runtime/product_surface/submission/intent_media.rs b/core/crates/tera_core/src/runtime/product_surface/submission/intent_media.rs
@@ -0,0 +1,90 @@
+//! Mutable prerequisite evidence cannot replace any field of the captured request.
+
+use super::*;
+use crate::runtime::product_surface::submission::SubmissionOperationError;
+
+type OperationError = SubmissionOperationError;
+
+impl IntentPayload {
+ pub(in crate::runtime::product_surface::submission) fn current(
+ &self,
+ head: &AuthoredDraft,
+ operation: OperationInstanceId,
+ ) -> Result<Self, OperationError> {
+ let current: Self =
+ serde_json::from_slice(head.payload()).map_err(|_| OperationError::Corrupt)?;
+ let mut immutable = current.clone();
+ immutable.media.clone_from(&self.media);
+ if immutable != *self || current.media.len() != self.media.len() {
+ return Err(OperationError::Corrupt);
+ }
+ for (original, media) in self.media.iter().zip(¤t.media) {
+ media.validate().map_err(|_| OperationError::Corrupt)?;
+ if !original.same_input_as(media) || media.stage() == Phase1MediaStage::Orphaned {
+ return Err(OperationError::Corrupt);
+ }
+ }
+ let stage = current.stage();
+ let valid_stage = head.stage() == stage
+ || (stage == AuthoredDraftStage::ReadyToSign
+ && head.stage() == AuthoredDraftStage::Queued);
+ let association = (stage == AuthoredDraftStage::ReadyToSign).then_some(operation);
+ if !valid_stage || head.operation_id() != association {
+ return Err(OperationError::Corrupt);
+ }
+ Ok(current)
+ }
+
+ pub(in crate::runtime::product_surface::submission) fn media(
+ &self,
+ ) -> &[Phase1MediaPrerequisite] {
+ &self.media
+ }
+
+ pub(in crate::runtime::product_surface::submission) fn media_mut(
+ &mut self,
+ reference: &str,
+ ) -> Result<&mut Phase1MediaPrerequisite, OperationError> {
+ let mut matches = self
+ .media
+ .iter_mut()
+ .filter(|media| media.local_reference() == reference);
+ let media = matches.next().ok_or(OperationError::InvalidMedia)?;
+ if matches.next().is_some() {
+ return Err(OperationError::InvalidMedia);
+ }
+ Ok(media)
+ }
+
+ pub(in crate::runtime::product_surface::submission) fn media_policy(&self) -> Option<[u8; 32]> {
+ self.media_policy
+ }
+
+ pub(in crate::runtime::product_surface::submission) fn encode(
+ &self,
+ ) -> Result<Vec<u8>, OperationError> {
+ let bytes = serde_json::to_vec(self).map_err(|_| OperationError::Corrupt)?;
+ if bytes.len() > SUBMISSION_INTENT_MAX_BYTES {
+ return Err(OperationError::Corrupt);
+ }
+ Ok(bytes)
+ }
+
+ pub(in crate::runtime::product_surface::submission) fn stage(&self) -> AuthoredDraftStage {
+ if self
+ .media
+ .iter()
+ .all(Phase1MediaPrerequisite::is_remote_verified)
+ {
+ AuthoredDraftStage::ReadyToSign
+ } else if self
+ .media
+ .iter()
+ .any(|media| media.stage() == Phase1MediaStage::Uploading)
+ {
+ AuthoredDraftStage::MediaUploading
+ } else {
+ AuthoredDraftStage::MediaPreparing
+ }
+ }
+}
diff --git a/core/crates/tera_core/src/runtime/product_surface/submission/inventory.rs b/core/crates/tera_core/src/runtime/product_surface/submission/inventory.rs
@@ -0,0 +1,240 @@
+//! Bounded reservation pages recover operations without a retained native handle.
+
+use super::{
+ SubmissionCommitError, SubmissionOperationError as E, SubmissionReservationError,
+ SubmissionReservationRequest, record, repository::SubmissionRepository,
+};
+use crate::{
+ TeraRuntime,
+ runtime::product_surface::{
+ ComposerScope, ComposerStorageRecord, Phase1DraftError, Phase1DraftRepairReason,
+ Phase1OutboxState,
+ },
+};
+use radroots_storage::{
+ Error,
+ authored_draft::{AUTHORED_DRAFT_QUERY_LIMIT_MAX, AuthoredDraftId},
+ authored_draft_query::{AuthoredDraftQuery, AuthoredDraftQueryRecord, AuthoredDraftScope},
+ journal::OperationInstanceId,
+};
+
+const CURSOR_PREFIX: &str = "tera_submission_cursor_v1:";
+
+#[derive(Clone, Copy, Debug, Eq, PartialEq)]
+pub enum SubmissionSummaryState {
+ Reserved,
+ Operation {
+ intent_id: AuthoredDraftId,
+ operation_id: OperationInstanceId,
+ revision: u64,
+ state: Phase1OutboxState,
+ },
+}
+
+#[derive(Clone, Debug, Eq, PartialEq)]
+pub struct SubmissionSummary {
+ request: SubmissionReservationRequest,
+ reservation_id: AuthoredDraftId,
+ reserved_at_unix_ms: u64,
+ state: SubmissionSummaryState,
+}
+
+impl SubmissionSummary {
+ pub fn request(&self) -> &SubmissionReservationRequest {
+ &self.request
+ }
+ pub const fn reservation_id(&self) -> AuthoredDraftId {
+ self.reservation_id
+ }
+ pub const fn reserved_at_unix_ms(&self) -> u64 {
+ self.reserved_at_unix_ms
+ }
+ pub const fn state(&self) -> SubmissionSummaryState {
+ self.state
+ }
+}
+
+#[derive(Clone, Debug, Eq, PartialEq)]
+pub enum SubmissionListEntry {
+ Submission(SubmissionSummary),
+ Repair {
+ reservation_key: [u8; 16],
+ revision: u64,
+ reason: Phase1DraftRepairReason,
+ },
+}
+
+#[derive(Clone, Debug, Eq, PartialEq)]
+pub struct SubmissionPage {
+ scope: ComposerScope,
+ entries: Vec<SubmissionListEntry>,
+ next_cursor: Option<String>,
+}
+
+impl SubmissionPage {
+ pub fn scope(&self) -> &ComposerScope {
+ &self.scope
+ }
+ pub fn entries(&self) -> &[SubmissionListEntry] {
+ &self.entries
+ }
+ pub fn next_cursor(&self) -> Option<&str> {
+ self.next_cursor.as_deref()
+ }
+}
+
+impl TeraRuntime {
+ /// Live stable-ID traversal; revisit the first page for new earlier IDs.
+ /// Captured forms are validated one at a time, never retained by the page.
+ pub async fn submission_page(
+ &self,
+ scope: &ComposerScope,
+ limit: u16,
+ cursor: Option<&str>,
+ ) -> Result<SubmissionPage, E> {
+ let _command = self.lifecycle.enter().map_err(Phase1DraftError::from)?;
+ if self.store_public_key != Some(scope.author()) {
+ return Err(
+ SubmissionCommitError::from(SubmissionReservationError::Source(
+ super::ComposerPersistenceError::ScopeMismatch,
+ ))
+ .into(),
+ );
+ }
+ if limit == 0 || limit > AUTHORED_DRAFT_QUERY_LIMIT_MAX {
+ return Err(Phase1DraftError::InvalidInventoryRequest.into());
+ }
+ let digest = ComposerStorageRecord::scope_digest(scope).map_err(|_| E::Corrupt)?;
+ let mut query = AuthoredDraftQuery::new(
+ scope.author().into_bytes(),
+ record::SUBMISSION_RESERVATION_PAYLOAD_SCHEMA,
+ Some(digest),
+ limit,
+ )?;
+ if let Some(cursor) = cursor {
+ let after = query.cursor_after(decode_cursor(digest, cursor)?);
+ query = query.with_cursor(&after)?;
+ }
+ let store = self
+ .client
+ .storage()
+ .map_err(|_| Error::BackendUnavailable)?;
+ let page = store.query_authored_drafts(query).await?;
+ let next_cursor = if page.next_cursor().is_some() {
+ let (key, _) = key(page.records().last().ok_or(E::Corrupt)?);
+ Some(format!(
+ "{CURSOR_PREFIX}{}{}",
+ hex::encode(digest.as_bytes()),
+ hex::encode(key)
+ ))
+ } else {
+ None
+ };
+ let mut entries = Vec::with_capacity(page.records().len());
+ for record in page.into_records() {
+ let (reservation_key, revision) = key(&record);
+ entries.push(match self.submission_inventory_entry(scope, record).await {
+ Ok(summary) => SubmissionListEntry::Submission(summary),
+ Err(error) => SubmissionListEntry::Repair {
+ reservation_key,
+ revision,
+ reason: repair_reason(error),
+ },
+ });
+ }
+ Ok(SubmissionPage {
+ scope: scope.clone(),
+ entries,
+ next_cursor,
+ })
+ }
+
+ async fn submission_inventory_entry(
+ &self,
+ scope: &ComposerScope,
+ record: AuthoredDraftQueryRecord,
+ ) -> Result<SubmissionSummary, E> {
+ let AuthoredDraftQueryRecord::Draft(draft) = record else {
+ return Err(E::Corrupt);
+ };
+ let request = record::request_from(&draft, scope).map_err(SubmissionCommitError::from)?;
+ let store = self
+ .client
+ .storage()
+ .map_err(|_| Error::BackendUnavailable)?;
+ let reservation = SubmissionRepository { store }
+ .replay(&request)
+ .await
+ .map_err(SubmissionCommitError::from)?
+ .ok_or(E::Corrupt)?;
+ let state = match self.submission_operation_status(&request).await {
+ Ok(status) => SubmissionSummaryState::Operation {
+ intent_id: status.receipt().intent_id(),
+ operation_id: status.receipt().operation_id(),
+ revision: status.intent().revision().get(),
+ state: status.state(),
+ },
+ Err(E::NotFound) => SubmissionSummaryState::Reserved,
+ Err(error) => return Err(error),
+ };
+ Ok(SubmissionSummary {
+ request,
+ reservation_id: reservation.reservation_id(),
+ reserved_at_unix_ms: reservation.reserved_at_unix_ms(),
+ state,
+ })
+ }
+}
+
+fn key(record: &AuthoredDraftQueryRecord) -> ([u8; 16], u64) {
+ match record {
+ AuthoredDraftQueryRecord::Draft(draft) => {
+ (*draft.draft_id().as_bytes(), draft.revision().get())
+ }
+ AuthoredDraftQueryRecord::Corrupt {
+ draft_key,
+ revision,
+ } => (*draft_key, revision.get()),
+ }
+}
+
+fn repair_reason(error: E) -> Phase1DraftRepairReason {
+ match error {
+ E::Submission(
+ SubmissionCommitError::UnsupportedSchema
+ | SubmissionCommitError::Reservation(SubmissionReservationError::UnsupportedSchema),
+ ) => Phase1DraftRepairReason::UnsupportedSchema,
+ E::Submission(
+ SubmissionCommitError::Storage(_)
+ | SubmissionCommitError::Reservation(SubmissionReservationError::Storage(_)),
+ )
+ | E::Operation(
+ Phase1DraftError::Storage
+ | Phase1DraftError::Operation
+ | Phase1DraftError::OperationUnavailable
+ | Phase1DraftError::OperationInProgress
+ | Phase1DraftError::Lifecycle(_),
+ ) => Phase1DraftRepairReason::NeedsAttention,
+ _ => Phase1DraftRepairReason::CorruptRecord,
+ }
+}
+
+fn decode_cursor(scope: AuthoredDraftScope, value: &str) -> Result<[u8; 16], E> {
+ let invalid = || E::Operation(Phase1DraftError::InvalidInventoryCursor);
+ if value.len() != CURSOR_PREFIX.len() + 96 {
+ return Err(invalid());
+ }
+ let encoded = value.strip_prefix(CURSOR_PREFIX).ok_or_else(invalid)?;
+ if !encoded
+ .bytes()
+ .all(|byte| byte.is_ascii_digit() || (b'a'..=b'f').contains(&byte))
+ {
+ return Err(invalid());
+ }
+ let mut bytes = [0; 48];
+ hex::decode_to_slice(encoded, &mut bytes).map_err(|_| invalid())?;
+ if &bytes[..32] != scope.as_bytes() {
+ return Err(invalid());
+ }
+ bytes[32..].try_into().map_err(|_| invalid())
+}
diff --git a/core/crates/tera_core/src/runtime/product_surface/submission/inventory_tests.rs b/core/crates/tera_core/src/runtime/product_surface/submission/inventory_tests.rs
@@ -0,0 +1,290 @@
+use std::collections::BTreeMap;
+
+use radroots_storage::authored_draft::{AuthoredDraft, AuthoredDraftId, AuthoredDraftStage};
+
+use super::{operation_test_support as operation, test_support::*, *};
+use crate::runtime::product_surface::{
+ AddCommandType, ComposerEditSequence, ComposerPartialForm, ComposerStorageRecord, CreateUpdate,
+ Phase1AddCommand, Phase1DraftError, Phase1DraftRepairReason, Phase1OutboxState,
+};
+
+fn numbered_request(value: u64) -> SubmissionReservationRequest {
+ let mut command = [0; 16];
+ command[8..].copy_from_slice(&value.to_be_bytes());
+ SubmissionReservationRequest::new(
+ SubmissionCommandId::new(command).unwrap(),
+ scope(AUTHOR, "nearby"),
+ ComposerId::new([3; 16]).unwrap(),
+ ComposerRevision::INITIAL,
+ )
+}
+
+fn key(entry: &SubmissionListEntry) -> [u8; 16] {
+ match entry {
+ SubmissionListEntry::Submission(value) => *value.reservation_id().as_bytes(),
+ SubmissionListEntry::Repair {
+ reservation_key, ..
+ } => *reservation_key,
+ }
+}
+
+#[tokio::test]
+async fn memory_and_sqlite_pages_recover_scoped_operations_and_isolate_bad_records() {
+ for sqlite in [false, true] {
+ let root = tempfile::tempdir().unwrap();
+ let signer = operation::CountingSigner::new();
+ let mut runtime = operation::runtime(
+ sqlite.then_some(root.path()),
+ signer.clone(),
+ "ws://127.0.0.1:19999",
+ )
+ .await;
+ let selected = scope(AUTHOR, "nearby");
+ let source = runtime
+ .composer_create(
+ &selected,
+ numbered_request(1).composer_id(),
+ ComposerEditSequence::INITIAL,
+ ComposerPartialForm::new(input(AddCommandType::CreateUpdate)).unwrap(),
+ )
+ .await
+ .unwrap();
+ let mut expected = BTreeMap::new();
+ for number in 1..=257 {
+ let request = numbered_request(number);
+ let reservation = runtime.submission_reserve(&request).await.unwrap();
+ let state = if number <= 2 {
+ let receipt = runtime.submission_prepare(&request, vec![]).await.unwrap();
+ SubmissionSummaryState::Operation {
+ intent_id: receipt.intent_id(),
+ operation_id: receipt.operation_id(),
+ revision: 1,
+ state: Phase1OutboxState::ReadyToSign,
+ }
+ } else {
+ SubmissionSummaryState::Reserved
+ };
+ expected.insert(*reservation.reservation_id().as_bytes(), (request, state));
+ }
+ // A reservation with an existing intent but no atomic receipt is repair
+ // evidence, not an unsubmitted draft that may be started again.
+ let dangling = numbered_request(258);
+ let reservation = runtime.submission_reserve(&dangling).await.unwrap();
+ let digest = ComposerStorageRecord::scope_digest(&selected).unwrap();
+ let store = runtime.client.storage().unwrap();
+ store
+ .append_authored_draft(
+ AuthoredDraft::initial(
+ intent::intent_id(&dangling).unwrap(),
+ selected.author().into_bytes(),
+ SUBMISSION_INTENT_PAYLOAD_SCHEMA,
+ b"unconfirmed intent".to_vec(),
+ AuthoredDraftStage::MediaPreparing,
+ None,
+ NOW,
+ )
+ .unwrap()
+ .with_scope(digest)
+ .unwrap(),
+ None,
+ )
+ .await
+ .unwrap();
+ assert_eq!(
+ runtime
+ .submission_operation_status(&dangling)
+ .await
+ .unwrap_err(),
+ SubmissionOperationError::Corrupt
+ );
+ let mut expected_repairs = BTreeMap::from([(
+ *reservation.reservation_id().as_bytes(),
+ Phase1DraftRepairReason::CorruptRecord,
+ )]);
+ for (id, author, record_scope, payload, included) in [
+ (
+ [0xef; 16],
+ selected.author(),
+ digest,
+ b"{PRIVATE malformed".to_vec(),
+ Some(Phase1DraftRepairReason::CorruptRecord),
+ ),
+ (
+ [0xf0; 16],
+ selected.author(),
+ digest,
+ br#"{"schema_version":2,"schema_sha256":"future"}"#.to_vec(),
+ Some(Phase1DraftRepairReason::UnsupportedSchema),
+ ),
+ (
+ [0xf1; 16],
+ selected.author(),
+ ComposerStorageRecord::scope_digest(&scope(AUTHOR, "other")).unwrap(),
+ b"PRIVATE other context".to_vec(),
+ None,
+ ),
+ (
+ [0xf2; 16],
+ scope(OTHER, "nearby").author(),
+ digest,
+ b"PRIVATE other author".to_vec(),
+ None,
+ ),
+ ] {
+ store
+ .append_authored_draft(
+ AuthoredDraft::initial(
+ AuthoredDraftId::new(id).unwrap(),
+ author.into_bytes(),
+ SUBMISSION_RESERVATION_PAYLOAD_SCHEMA,
+ payload,
+ AuthoredDraftStage::Draft,
+ None,
+ NOW,
+ )
+ .unwrap()
+ .with_scope(record_scope)
+ .unwrap(),
+ None,
+ )
+ .await
+ .unwrap();
+ if let Some(reason) = included {
+ expected_repairs.insert(id, reason);
+ }
+ }
+ let legacy = runtime
+ .phase1_save_draft(
+ [0xee; 16],
+ Phase1AddCommand::CreateUpdate(CreateUpdate::new("legacy fixture").unwrap()),
+ NOW / 1000,
+ vec![],
+ None,
+ NOW,
+ )
+ .await
+ .unwrap();
+ let maximum = runtime.submission_page(&selected, 256, None).await.unwrap();
+ assert_eq!(maximum.entries().len(), 256);
+ assert!(maximum.next_cursor().is_some());
+ let first = runtime.submission_page(&selected, 100, None).await.unwrap();
+ assert_eq!(first.entries().len(), 100);
+ let cursor = first.next_cursor().unwrap().to_owned();
+ assert_eq!(first.scope(), &selected);
+ let mut entries = first.entries().to_vec();
+ if sqlite {
+ runtime.shutdown().await.unwrap();
+ drop(runtime);
+ runtime =
+ operation::runtime(Some(root.path()), signer.clone(), "ws://127.0.0.1:19998").await;
+ }
+ let mut cursor = Some(cursor);
+ while let Some(current) = cursor {
+ let page = runtime
+ .submission_page(&selected, 37, Some(¤t))
+ .await
+ .unwrap();
+ assert!(page.entries().len() <= 37);
+ assert!(!format!("{page:?}").contains("PRIVATE"));
+ entries.extend_from_slice(page.entries());
+ cursor = page.next_cursor().map(str::to_owned);
+ }
+ let mut keys: Vec<_> = expected
+ .keys()
+ .chain(expected_repairs.keys())
+ .copied()
+ .collect();
+ keys.sort();
+ assert_eq!(entries.iter().map(key).collect::<Vec<_>>(), keys);
+ assert_eq!(entries.len(), 260);
+ for entry in entries {
+ match entry {
+ SubmissionListEntry::Submission(summary) => {
+ let (request, state) = &expected[summary.reservation_id().as_bytes()];
+ assert_eq!(summary.request(), request);
+ assert_eq!(summary.state(), *state);
+ assert!(summary.reserved_at_unix_ms() > 0);
+ }
+ SubmissionListEntry::Repair {
+ reservation_key,
+ revision,
+ reason,
+ } => {
+ assert_eq!(revision, 1);
+ assert_eq!(reason, expected_repairs[&reservation_key]);
+ }
+ }
+ }
+ assert_eq!(
+ runtime
+ .composer_load(&selected, numbered_request(1).composer_id())
+ .await
+ .unwrap(),
+ *source.draft()
+ );
+ let legacy_heads = runtime.phase1_draft_heads(100).await.unwrap();
+ assert_eq!(legacy_heads.len(), 1);
+ assert_eq!(legacy_heads[0].draft(), legacy.draft());
+ assert_eq!(signer.count(), 0);
+ runtime.shutdown().await.unwrap();
+ }
+}
+
+#[tokio::test]
+async fn inventory_limits_and_cursors_reject_noncanonical_and_foreign_requests() {
+ let signer = operation::CountingSigner::new();
+ let runtime = operation::runtime(None, signer.clone(), "ws://127.0.0.1:19999").await;
+ let selected = scope(AUTHOR, "nearby");
+ operation::prepare(&runtime, &numbered_request(1), false).await;
+ runtime
+ .submission_reserve(&numbered_request(2))
+ .await
+ .unwrap();
+ let first = runtime.submission_page(&selected, 1, None).await.unwrap();
+ let cursor = first.next_cursor().unwrap();
+ for invalid in [
+ String::new(),
+ cursor.to_uppercase(),
+ cursor.replace("_v1:", "_v2:"),
+ format!("{cursor}0"),
+ cursor[..cursor.len() - 1].to_owned(),
+ format!("{}g", &cursor[..cursor.len() - 1]),
+ "x".repeat(100_000),
+ ] {
+ assert_eq!(
+ runtime
+ .submission_page(&selected, 1, Some(&invalid))
+ .await
+ .unwrap_err(),
+ SubmissionOperationError::Operation(Phase1DraftError::InvalidInventoryCursor)
+ );
+ }
+ assert_eq!(
+ runtime
+ .submission_page(&scope(AUTHOR, "other"), 1, Some(cursor))
+ .await
+ .unwrap_err(),
+ SubmissionOperationError::Operation(Phase1DraftError::InvalidInventoryCursor)
+ );
+ assert!(
+ runtime
+ .submission_page(&scope(OTHER, "nearby"), 1, Some(cursor))
+ .await
+ .is_err()
+ );
+ for limit in [0, 257, u16::MAX] {
+ assert_eq!(
+ runtime
+ .submission_page(&selected, limit, None)
+ .await
+ .unwrap_err(),
+ SubmissionOperationError::Operation(Phase1DraftError::InvalidInventoryRequest)
+ );
+ }
+ assert_eq!(
+ runtime.submission_page(&selected, 1, None).await.unwrap(),
+ first
+ );
+ assert_eq!(signer.count(), 0);
+ runtime.shutdown().await.unwrap();
+}
diff --git a/core/crates/tera_core/src/runtime/product_surface/submission/media.rs b/core/crates/tera_core/src/runtime/product_surface/submission/media.rs
@@ -0,0 +1,153 @@
+//! Bounded byte materialization for the media already captured by one operation.
+
+use std::sync::Arc;
+
+use radroots_blossom::{MediaType, Sha256};
+use radroots_sdk::transport::{
+ BlossomImageDimensions, BlossomUploadRequest, BlossomUploadTransaction,
+};
+
+use super::{
+ SubmissionOperationError as E, SubmissionReservationRequest, operation_load::LoadedOperation,
+};
+use crate::{
+ TeraRuntime,
+ runtime::product_surface::{Phase1DraftError, Phase1MediaStage},
+};
+
+#[path = "media_runtime.rs"]
+mod runtime;
+
+#[derive(Clone)]
+pub struct SubmissionMediaRequest {
+ submission: SubmissionReservationRequest,
+ expected_revision: u64,
+ reference: String,
+ bytes: Arc<[u8]>,
+}
+
+impl SubmissionMediaRequest {
+ pub fn new(
+ submission: SubmissionReservationRequest,
+ expected_revision: u64,
+ reference: String,
+ bytes: Arc<[u8]>,
+ ) -> Result<Self, E> {
+ if expected_revision == 0
+ || reference.is_empty()
+ || reference.len() > 4096
+ || reference.trim() != reference
+ || reference.chars().any(char::is_control)
+ || bytes.is_empty()
+ {
+ return Err(E::InvalidMedia);
+ }
+ Ok(Self {
+ submission,
+ expected_revision,
+ reference,
+ bytes,
+ })
+ }
+}
+
+/// Native HTTP evidence is bounded before any verification or journal mutation.
+pub struct SubmissionMediaResponse {
+ status_code: u16,
+ media_type: Option<String>,
+ content_encoding: Option<String>,
+ body: Vec<u8>,
+}
+
+impl SubmissionMediaResponse {
+ pub fn new(
+ status_code: u16,
+ media_type: Option<String>,
+ content_encoding: Option<String>,
+ body: Vec<u8>,
+ ) -> Result<Self, E> {
+ let size = body
+ .len()
+ .saturating_add(media_type.as_ref().map_or(0, String::len))
+ .saturating_add(content_encoding.as_ref().map_or(0, String::len));
+ if size > 16_384 {
+ return Err(E::InvalidMedia);
+ }
+ Ok(Self {
+ status_code,
+ media_type,
+ content_encoding,
+ body,
+ })
+ }
+}
+
+impl TeraRuntime {
+ fn materialize_submission_media(
+ &self,
+ loaded: &LoadedOperation,
+ input: &SubmissionMediaRequest,
+ completing: bool,
+ ) -> Result<BlossomUploadTransaction, E> {
+ if loaded.head.revision().get() != input.expected_revision {
+ return Err(Phase1DraftError::RevisionConflict.into());
+ }
+ let media = loaded
+ .payload
+ .media()
+ .iter()
+ .find(|media| media.local_reference() == input.reference)
+ .ok_or(E::InvalidMedia)?;
+ if loaded.head.operation_id().is_some()
+ || if completing {
+ media.stage() != Phase1MediaStage::Uploading
+ } else {
+ !matches!(
+ media.stage(),
+ Phase1MediaStage::Pending
+ | Phase1MediaStage::Preparing
+ | Phase1MediaStage::Uploading
+ | Phase1MediaStage::Failed
+ )
+ }
+ {
+ return Err(E::InvalidMedia);
+ }
+ let source = loaded
+ .captured
+ .form()
+ .input()
+ .media
+ .iter()
+ .find(|media| media.opaque_reference == input.reference)
+ .ok_or(E::InvalidMedia)?;
+ if source.byte_size != input.bytes.len() as u64
+ || source.sha256 != Sha256::digest(&input.bytes).to_hex()
+ {
+ return Err(E::InvalidMedia);
+ }
+ let request = BlossomUploadRequest::new(
+ input.bytes.clone(),
+ MediaType::parse(&source.media_type).map_err(|_| E::InvalidMedia)?,
+ BlossomImageDimensions::new(source.width, source.height)
+ .map_err(|_| E::InvalidMedia)?,
+ crate::runtime::product_surface::phase1_operation_now_unix_ms()?,
+ )
+ .map_err(|_| E::InvalidMedia)?;
+ let blossom = self
+ .client
+ .blossom()
+ .map_err(|_| Phase1DraftError::OperationUnavailable)?
+ .ok_or(Phase1DraftError::OperationUnavailable)?;
+ let transaction = blossom
+ .prepare_upload(request)
+ .map_err(|_| E::InvalidMedia)?;
+ if Some(*transaction.config_fingerprint().as_bytes()) != loaded.payload.media_policy() {
+ return Err(E::MediaPolicyChanged);
+ }
+ if transaction.expected_url().as_str() != media.url() {
+ return Err(E::InvalidMedia);
+ }
+ Ok(transaction)
+ }
+}
diff --git a/core/crates/tera_core/src/runtime/product_surface/submission/media_recovery_tests.rs b/core/crates/tera_core/src/runtime/product_surface/submission/media_recovery_tests.rs
@@ -0,0 +1,133 @@
+use radroots_storage::{authored::SigningState, authored_draft::AuthoredDraftStage};
+
+use super::{media_test_support::*, operation_test_support::*, test_support::*, *};
+use crate::runtime::product_surface::{
+ AddCommandType, ComposerEditSequence, ComposerPartialForm, Phase1MediaStage,
+};
+
+#[tokio::test]
+async fn pending_native_upload_recovers_after_policy_refusal_edits_and_sqlite_restart() {
+ let root = tempfile::tempdir().unwrap();
+ let signer = CountingSigner::new();
+ let (origin, server) = blob_server(photo().1).await;
+ let runtime = runtime(Some(root.path()), signer.clone(), "ws://127.0.0.1:19999").await;
+ configure(&runtime, &origin).await;
+ let request = request();
+ prepare(&runtime, &request, true).await;
+ let (uploading, _) = runtime
+ .submission_prepare_native_upload(upload(&request, 1))
+ .await
+ .unwrap();
+ let later = runtime
+ .composer_save(
+ request.scope(),
+ request.composer_id(),
+ request.expected_revision(),
+ ComposerEditSequence::new(2).unwrap(),
+ ComposerPartialForm::new(input(AddCommandType::CreateAsk)).unwrap(),
+ )
+ .await
+ .unwrap();
+ configure(&runtime, "http://127.0.0.1:3001").await;
+ assert!(matches!(
+ runtime
+ .submission_complete_native_upload(upload(&request, 2), response(&origin))
+ .await,
+ Err(SubmissionOperationError::MediaPolicyChanged)
+ ));
+ assert_eq!(
+ runtime.submission_operation_status(&request).await.unwrap(),
+ uploading
+ );
+ assert_eq!(signer.count(), 1);
+ runtime.shutdown().await.unwrap();
+ drop(runtime);
+ let runtime = self::runtime(Some(root.path()), signer.clone(), "ws://127.0.0.1:19998").await;
+ configure(&runtime, &origin).await;
+ assert_eq!(
+ runtime.submission_operation_status(&request).await.unwrap(),
+ uploading
+ );
+ let ready = runtime
+ .submission_complete_native_upload(upload(&request, 2), response(&origin))
+ .await
+ .unwrap();
+ server.await.unwrap();
+ assert_eq!(ready.intent().stage(), AuthoredDraftStage::ReadyToSign);
+ assert_eq!(ready.captured(), uploading.captured());
+ assert_eq!(
+ ready.receipt().operation_id(),
+ uploading.receipt().operation_id()
+ );
+ assert_eq!(
+ ready.push().artifact().signing_state(),
+ SigningState::Planned
+ );
+ assert_eq!(
+ runtime
+ .composer_load(request.scope(), request.composer_id())
+ .await
+ .unwrap(),
+ *later.draft()
+ );
+ assert_eq!(signer.count(), 1);
+ runtime.shutdown().await.unwrap();
+}
+
+#[tokio::test]
+async fn mismatched_remote_bytes_retain_failed_media_and_never_sign_publication() {
+ for sqlite in [false, true] {
+ let root = tempfile::tempdir().unwrap();
+ let signer = CountingSigner::new();
+ let mut bytes = photo().1.to_vec();
+ bytes[19] = 3;
+ let (origin, server) = blob_server(bytes.into()).await;
+ let runtime = runtime(
+ sqlite.then_some(root.path()),
+ signer.clone(),
+ "ws://127.0.0.1:19999",
+ )
+ .await;
+ configure(&runtime, &origin).await;
+ let request = request();
+ prepare(&runtime, &request, true).await;
+ let (uploading, _) = runtime
+ .submission_prepare_native_upload(upload(&request, 1))
+ .await
+ .unwrap();
+ assert!(
+ runtime
+ .submission_complete_native_upload(upload(&request, 2), response(&origin))
+ .await
+ .is_err()
+ );
+ server.await.unwrap();
+ let failed = runtime.submission_operation_status(&request).await.unwrap();
+ assert_eq!(failed.media()[0].stage(), Phase1MediaStage::Failed);
+ assert!(failed.media()[0].orphan().is_some());
+ assert_eq!(failed.intent().operation_id(), None);
+ assert_eq!(
+ failed.receipt().operation_id(),
+ uploading.receipt().operation_id()
+ );
+ assert_eq!(
+ failed.push().artifact().signing_state(),
+ SigningState::Planned
+ );
+ assert!(matches!(
+ runtime
+ .submission_advance(&request, failed.intent().revision().get())
+ .await,
+ Err(SubmissionOperationError::PrerequisitesPending)
+ ));
+ assert_eq!(signer.count(), 1);
+ assert!(
+ runtime
+ .submission_prepare(&request, vec![])
+ .await
+ .unwrap()
+ .is_replay()
+ );
+ runtime.shutdown().await.unwrap();
+ }
+}
diff --git a/core/crates/tera_core/src/runtime/product_surface/submission/media_runtime.rs b/core/crates/tera_core/src/runtime/product_surface/submission/media_runtime.rs
@@ -0,0 +1,117 @@
+use radroots_storage::{Error, authored_draft::AuthoredDraftStage};
+
+use super::*;
+use crate::runtime::product_surface::submission::SubmissionOperationStatus;
+use crate::runtime::product_surface::{
+ Phase1NativeUploadJob, Phase1UploadPlan, phase1_new_operation_id, phase1_operation_now_unix_ms,
+};
+
+impl TeraRuntime {
+ /// Validates the committed parent before authorizing one immutable native upload job.
+ pub async fn submission_prepare_native_upload(
+ &self,
+ input: SubmissionMediaRequest,
+ ) -> Result<(SubmissionOperationStatus, Phase1NativeUploadJob), E> {
+ let _command = self.lifecycle.enter().map_err(Phase1DraftError::from)?;
+ self.validate_submission_owner(&input.submission)?;
+ let id = super::super::intent::intent_id(&input.submission)?;
+ let _admission = self.mutations.draft(*id.as_bytes())?;
+ let (mut loaded, _) = self.load_submission_operation(&input.submission).await?;
+ let transaction = self.materialize_submission_media(&loaded, &input, false)?;
+ // Validate the exact transition before invoking a potentially interactive signer.
+ loaded
+ .payload
+ .media_mut(&input.reference)?
+ .transition_requested(Phase1MediaStage::Uploading, None)?;
+ let plan = Phase1UploadPlan::derive(
+ phase1_operation_now_unix_ms()?,
+ phase1_new_operation_id()?,
+ phase1_new_operation_id()?,
+ )?;
+ let job = self.authorize_native_upload(&transaction, &plan).await?;
+ let blossom = self
+ .client
+ .blossom()
+ .map_err(|_| Phase1DraftError::OperationUnavailable)?
+ .ok_or(Phase1DraftError::OperationUnavailable)?;
+ if blossom.config_fingerprint() != Some(transaction.config_fingerprint()) {
+ return Err(E::MediaPolicyChanged);
+ }
+ self.save_submission_media(&mut loaded).await?;
+ Ok((
+ self.submission_operation_status(&input.submission).await?,
+ job,
+ ))
+ }
+
+ /// Verifies native HTTP evidence and canonical remote bytes through the existing SDK.
+ pub async fn submission_complete_native_upload(
+ &self,
+ input: SubmissionMediaRequest,
+ response: SubmissionMediaResponse,
+ ) -> Result<SubmissionOperationStatus, E> {
+ let _command = self.lifecycle.enter().map_err(Phase1DraftError::from)?;
+ self.validate_submission_owner(&input.submission)?;
+ let id = super::super::intent::intent_id(&input.submission)?;
+ let _admission = self.mutations.draft(*id.as_bytes())?;
+ let (mut loaded, _) = self.load_submission_operation(&input.submission).await?;
+ let transaction = self.materialize_submission_media(&loaded, &input, true)?;
+ let blossom = self
+ .client
+ .blossom()
+ .map_err(|_| Phase1DraftError::OperationUnavailable)?
+ .ok_or(Phase1DraftError::OperationUnavailable)?;
+ match blossom
+ .complete_native_upload(
+ transaction,
+ response.status_code,
+ response.media_type.as_deref(),
+ response.content_encoding.as_deref(),
+ &response.body,
+ radroots_sdk::transport::BlossomCancellation::default(),
+ )
+ .await
+ {
+ Ok(receipt) => {
+ // The SDK verifies this exact transaction and its configuration
+ // before returning the opaque remote-byte-verification receipt.
+ loaded
+ .payload
+ .media_mut(&input.reference)?
+ .complete_transfer(&receipt)?;
+ self.save_submission_media(&mut loaded).await?;
+ self.submission_operation_status(&input.submission).await
+ }
+ Err(error) => {
+ loaded
+ .payload
+ .media_mut(&input.reference)?
+ .fail_transfer(&error, phase1_operation_now_unix_ms()?)?;
+ self.save_submission_media(&mut loaded).await?;
+ Err(Phase1DraftError::Operation.into())
+ }
+ }
+ }
+
+ async fn save_submission_media(&self, loaded: &mut LoadedOperation) -> Result<(), E> {
+ let stage = loaded.payload.stage();
+ let next = loaded.head.successor(
+ loaded.payload.encode()?,
+ stage,
+ (stage == AuthoredDraftStage::ReadyToSign).then_some(loaded.receipt.operation_id()),
+ phase1_operation_now_unix_ms()?.max(loaded.head.updated_at_unix_ms()),
+ )?;
+ let store = self
+ .client
+ .storage()
+ .map_err(|_| Error::BackendUnavailable)?;
+ let receipt = store
+ .append_authored_draft(next.clone(), Some(loaded.head.revision()))
+ .await?;
+ if receipt.draft() != &next {
+ return Err(E::Corrupt);
+ }
+ loaded.head = next;
+ Ok(())
+ }
+}
diff --git a/core/crates/tera_core/src/runtime/product_surface/submission/media_test_support.rs b/core/crates/tera_core/src/runtime/product_surface/submission/media_test_support.rs
@@ -0,0 +1,78 @@
+use std::{sync::Arc, time::Duration};
+
+use radroots_blossom::{BlobDescriptor, BlobUrl, MediaType, Sha256};
+use tokio::{
+ io::{AsyncReadExt, AsyncWriteExt},
+ net::TcpListener,
+};
+
+use super::{
+ SubmissionMediaRequest, SubmissionMediaResponse, SubmissionReservationRequest, test_support::*,
+};
+use crate::TeraRuntime;
+
+pub(super) async fn configure(runtime: &TeraRuntime, origin: &str) {
+ runtime
+ .configure_blossom(
+ radroots_sdk::transport::BlossomHostKind::Simulator,
+ radroots_sdk::transport::BlossomEndpointAuthority::LoopbackDevelopment,
+ origin.into(),
+ vec![],
+ )
+ .unwrap();
+}
+
+pub(super) fn upload(
+ request: &SubmissionReservationRequest,
+ revision: u64,
+) -> SubmissionMediaRequest {
+ SubmissionMediaRequest::new(
+ request.clone(),
+ revision,
+ photo().0.opaque_reference,
+ photo().1,
+ )
+ .unwrap()
+}
+
+pub(super) fn response(origin: &str) -> SubmissionMediaResponse {
+ let (photo, bytes) = photo();
+ let sha = Sha256::digest(&bytes);
+ let descriptor = BlobDescriptor::new(
+ BlobUrl::parse(&format!("{origin}/{sha}.png")).unwrap(),
+ sha,
+ photo.byte_size,
+ MediaType::parse("image/png").unwrap(),
+ NOW / 1000,
+ )
+ .unwrap();
+ SubmissionMediaResponse::new(
+ 200,
+ Some("application/json".into()),
+ None,
+ serde_json::to_vec(&descriptor).unwrap(),
+ )
+ .unwrap()
+}
+
+pub(super) async fn blob_server(bytes: Arc<[u8]>) -> (String, tokio::task::JoinHandle<String>) {
+ let listener = TcpListener::bind("127.0.0.1:0").await.unwrap();
+ let origin = format!("http://{}", listener.local_addr().unwrap());
+ let task = tokio::spawn(async move {
+ tokio::time::timeout(Duration::from_secs(10),async move {
+ let (mut stream,_) = listener.accept().await.unwrap();
+ let mut request = Vec::new();
+ let mut byte = [0;1];
+ while !request.ends_with(b"\r\n\r\n") {
+ assert!(request.len()<16_384);
+ stream.read_exact(&mut byte).await.unwrap(); request.push(byte[0]);
+ }
+ let request = String::from_utf8(request).unwrap();
+ assert!(request.starts_with("GET /"));
+ let header = format!("HTTP/1.1 200 OK\r\nContent-Type: image/png\r\nContent-Length: {}\r\nConnection: close\r\n\r\n",bytes.len());
+ stream.write_all(header.as_bytes()).await.unwrap();stream.write_all(&bytes).await.unwrap();stream.shutdown().await.unwrap();
+ request
+ }).await.expect("bounded blob retrieval")
+ });
+ (origin, task)
+}
diff --git a/core/crates/tera_core/src/runtime/product_surface/submission/media_tests.rs b/core/crates/tera_core/src/runtime/product_surface/submission/media_tests.rs
@@ -0,0 +1,169 @@
+use std::sync::atomic::Ordering;
+
+use radroots_storage::{authored::SigningState, authored_draft::AuthoredDraftStage};
+
+use super::{media_test_support::*, operation_test_support::*, test_support::*, *};
+use crate::runtime::product_surface::{Phase1MediaStage, Phase1OutboxState};
+
+#[tokio::test]
+async fn scoped_media_memory_and_sqlite_verify_before_original_operation_can_sign() {
+ for sqlite in [false, true] {
+ let root = tempfile::tempdir().unwrap();
+ let signer = CountingSigner::new();
+ let (relay_url, relay_task) = relay().await;
+ let (origin, blob_task) = blob_server(photo().1).await;
+ let runtime = runtime(sqlite.then_some(root.path()), signer.clone(), &relay_url).await;
+ configure(&runtime, &origin).await;
+ let request = request();
+ prepare(&runtime, &request, true).await;
+ let original = runtime.submission_operation_status(&request).await.unwrap();
+ let (uploading, job) = runtime
+ .submission_prepare_native_upload(upload(&request, 1))
+ .await
+ .unwrap();
+ assert_eq!(
+ uploading.intent().stage(),
+ AuthoredDraftStage::MediaUploading
+ );
+ assert_eq!(uploading.media()[0].stage(), Phase1MediaStage::Uploading);
+ assert_eq!(
+ uploading.push().artifact().signing_state(),
+ SigningState::Planned
+ );
+ assert_eq!(signer.count(), 1); // Only the separate HTTP authorization.
+ assert_ne!(
+ job.operation_id(),
+ *original.receipt().operation_id().as_bytes()
+ );
+ assert!(job.authorization_header().starts_with("Nostr "));
+ assert_eq!(uploading.captured(), original.captured());
+ assert_eq!(
+ uploading.receipt().operation_id(),
+ original.receipt().operation_id()
+ );
+ let ready = runtime
+ .submission_complete_native_upload(
+ upload(&request, uploading.intent().revision().get()),
+ response(&origin),
+ )
+ .await
+ .unwrap();
+ let observed = blob_task.await.unwrap();
+ assert!(observed.starts_with(&format!("GET /{}.png ", photo().0.sha256)));
+ assert_eq!(ready.intent().stage(), AuthoredDraftStage::ReadyToSign);
+ assert_eq!(ready.media()[0].stage(), Phase1MediaStage::Verified);
+ assert_eq!(ready.media()[0].upload_attempts(), 2);
+ assert!(
+ ready.media()[0].verified_at_unix_ms().unwrap() <= ready.intent().updated_at_unix_ms()
+ );
+ assert_eq!(
+ ready.intent().operation_id(),
+ Some(original.receipt().operation_id())
+ );
+ assert_eq!(ready.push(), original.push());
+ assert!(
+ runtime
+ .submission_prepare(&request, vec![])
+ .await
+ .unwrap()
+ .is_replay()
+ );
+ let done = runtime
+ .submission_advance(&request, ready.intent().revision().get())
+ .await
+ .unwrap();
+ assert_eq!(done.state(), Phase1OutboxState::Complete);
+ assert_eq!(done.intent().payload(), ready.intent().payload());
+ assert_eq!(
+ done.receipt().operation_id(),
+ original.receipt().operation_id()
+ );
+ assert_eq!(signer.count(), 2);
+ assert_eq!(*signer.kinds.lock().unwrap(), vec![24242, 1]);
+ assert_eq!(
+ relay_task.await.unwrap()["content"],
+ format!("PRIVATE harvest café\n{}", job.remote_url())
+ );
+ assert_redacted(&done);
+ runtime.shutdown().await.unwrap();
+ drop(runtime);
+ if sqlite {
+ let reopened = self::runtime(Some(root.path()), signer.clone(), &relay_url).await;
+ let recovered = reopened
+ .submission_operation_status(&request)
+ .await
+ .unwrap();
+ assert_eq!(recovered, done);
+ assert_eq!(
+ reopened
+ .submission_advance(&request, recovered.intent().revision().get())
+ .await
+ .unwrap(),
+ done
+ );
+ assert_eq!(signer.count(), 2);
+ reopened.shutdown().await.unwrap();
+ }
+ }
+}
+
+#[tokio::test]
+async fn scoped_media_wrong_bytes_policy_revision_and_scope_never_invoke_signer() {
+ let signer = CountingSigner::new();
+ let runtime = runtime(None, signer.clone(), "ws://127.0.0.1:19999").await;
+ let request = request();
+ prepare(&runtime, &request, true).await;
+ let initial = runtime.submission_operation_status(&request).await.unwrap();
+ let wrong = SubmissionMediaRequest::new(
+ request.clone(),
+ 1,
+ photo().0.opaque_reference,
+ b"wrong".as_slice().into(),
+ )
+ .unwrap();
+ assert!(
+ runtime
+ .submission_prepare_native_upload(wrong)
+ .await
+ .is_err()
+ );
+ assert!(
+ runtime
+ .submission_prepare_native_upload(upload(&request, 2))
+ .await
+ .is_err()
+ );
+ let foreign = SubmissionReservationRequest::new(
+ request.command_id(),
+ scope(AUTHOR, "elsewhere"),
+ request.composer_id(),
+ request.expected_revision(),
+ );
+ assert!(
+ runtime
+ .submission_prepare_native_upload(upload(&foreign, 1))
+ .await
+ .is_err()
+ );
+ configure(&runtime, "http://127.0.0.1:3001").await;
+ assert!(matches!(
+ runtime
+ .submission_prepare_native_upload(upload(&request, 1))
+ .await,
+ Err(SubmissionOperationError::MediaPolicyChanged)
+ ));
+ assert_eq!(signer.count(), 0);
+ assert_eq!(signer.statuses.load(Ordering::SeqCst), 0);
+ assert_eq!(
+ runtime.submission_operation_status(&request).await.unwrap(),
+ initial
+ );
+ runtime.shutdown().await.unwrap();
+}
+
+#[test]
+fn native_media_response_bounds_include_body_and_headers() {
+ assert!(SubmissionMediaResponse::new(200, None, None, vec![0; 16_384]).is_ok());
+ assert!(SubmissionMediaResponse::new(200, Some("a".into()), None, vec![0; 16_384]).is_err());
+ assert!(SubmissionMediaResponse::new(200, None, None, vec![0; 16_385]).is_err());
+}
diff --git a/core/crates/tera_core/src/runtime/product_surface/submission/operation.rs b/core/crates/tera_core/src/runtime/product_surface/submission/operation.rs
@@ -29,6 +29,10 @@ pub enum SubmissionOperationError {
PrerequisitesPending,
#[error("submission operation requires repair")]
Corrupt,
+ #[error("submission media does not match its captured input")]
+ InvalidMedia,
+ #[error("submission media policy changed")]
+ MediaPolicyChanged,
}
impl From<Error> for SubmissionOperationError {
@@ -42,6 +46,8 @@ pub struct SubmissionOperationStatus {
receipt: SubmissionReceipt,
intent: AuthoredDraft,
push: PushStatus,
+ captured: crate::runtime::product_surface::ComposerDraft,
+ media: Vec<crate::runtime::product_surface::Phase1MediaPrerequisite>,
}
impl std::fmt::Debug for SubmissionOperationStatus {
@@ -63,6 +69,12 @@ impl SubmissionOperationStatus {
pub fn push(&self) -> &PushStatus {
&self.push
}
+ pub fn captured(&self) -> &crate::runtime::product_surface::ComposerDraft {
+ &self.captured
+ }
+ pub fn media(&self) -> &[crate::runtime::product_surface::Phase1MediaPrerequisite] {
+ &self.media
+ }
pub fn state(&self) -> Phase1OutboxState {
let push = (self.intent.stage() == AuthoredDraftStage::Queued).then_some(&self.push);
outbox::aggregate_state(&self.intent, push)
@@ -79,6 +91,8 @@ impl TeraRuntime {
let _command = self.lifecycle.enter().map_err(Phase1DraftError::from)?;
let (loaded, push) = self.load_submission_operation(request).await?;
Ok(SubmissionOperationStatus {
+ media: loaded.payload.media().to_vec(),
+ captured: loaded.captured,
receipt: loaded.receipt,
intent: loaded.head,
push,
@@ -120,7 +134,7 @@ impl TeraRuntime {
self.submission_operation_status(request).await
}
- async fn load_submission_operation(
+ pub(super) async fn load_submission_operation(
&self,
request: &SubmissionReservationRequest,
) -> Result<(LoadedOperation, PushStatus), E> {
@@ -129,9 +143,26 @@ impl TeraRuntime {
.client
.storage()
.map_err(|_| Error::BackendUnavailable)?;
- let loaded = SubmissionRepository { store }
+ let loaded = match (SubmissionRepository { store })
.load_operation(request)
- .await?;
+ .await
+ {
+ Err(E::NotFound) => {
+ if store
+ .authored_draft_head(intent::intent_id(request)?)
+ .await?
+ .is_some()
+ || store
+ .authored_operation(intent::operation_id(request)?)
+ .await?
+ .is_some()
+ {
+ return Err(E::Corrupt);
+ }
+ return Err(E::NotFound);
+ }
+ value => value?,
+ };
let push = self
.sync()?
.push_status(loaded.request.operation_id())
diff --git a/core/crates/tera_core/src/runtime/product_surface/submission/operation_load.rs b/core/crates/tera_core/src/runtime/product_surface/submission/operation_load.rs
@@ -2,7 +2,7 @@
use radroots_storage::{
authored_atomic::{AuthoredAtomicOutcome, AuthoredAtomicStorage, PrepareAuthoredOperation},
- authored_draft::{AuthoredDraft, AuthoredDraftStage, AuthoredDraftStore},
+ authored_draft::{AuthoredDraft, AuthoredDraftStore},
};
use radroots_sync::{PushRequest, PushStatus};
@@ -17,6 +17,8 @@ pub(super) struct LoadedOperation {
pub receipt: SubmissionReceipt,
pub head: AuthoredDraft,
pub request: PushRequest,
+ pub captured: crate::runtime::product_surface::ComposerDraft,
+ pub payload: IntentPayload,
preparation: PrepareAuthoredOperation,
}
@@ -50,10 +52,13 @@ impl<S: AuthoredDraftStore + AuthoredAtomicStorage + ?Sized> SubmissionRepositor
.await?
.ok_or(E::Corrupt)?;
validate_head(original.intent(), &head)?;
+ let current = payload.current(&head, receipt.operation_id())?;
Ok(LoadedOperation {
receipt,
head,
request: push,
+ captured: reservation.captured().clone(),
+ payload: current,
preparation: original.preparation().clone(),
})
}
@@ -65,29 +70,15 @@ fn validate_head(original: &AuthoredDraft, head: &AuthoredDraft) -> Result<(), E
|| head.author() != original.author()
|| head.scope() != original.scope()
|| head.payload_schema() != original.payload_schema()
- || head.payload() != original.payload()
- || head.operation_id() != original.operation_id()
|| head.created_at_unix_ms() != original.created_at_unix_ms()
|| head.updated_at_unix_ms() < original.updated_at_unix_ms()
+ || head.updated_at_unix_ms() > i64::MAX as u64
|| head.revision() < original.revision()
|| (head.revision() == original.revision() && head != original)
{
return Err(E::Corrupt);
}
- // Media progression is admitted separately by the scoped prerequisite adapter.
- // A forged stage cannot turn the immutable waiting snapshot into signing authority.
- match original.stage() {
- AuthoredDraftStage::ReadyToSign
- if matches!(
- head.stage(),
- AuthoredDraftStage::ReadyToSign | AuthoredDraftStage::Queued
- ) =>
- {
- Ok(())
- }
- AuthoredDraftStage::MediaPreparing if head == original => Ok(()),
- _ => Err(E::Corrupt),
- }
+ Ok(())
}
impl LoadedOperation {
diff --git a/core/crates/tera_core/src/runtime/product_surface/submission/operation_test_support.rs b/core/crates/tera_core/src/runtime/product_surface/submission/operation_test_support.rs
@@ -28,6 +28,7 @@ pub(super) struct CountingSigner {
inner: LocalSigner,
pub calls: AtomicUsize,
pub statuses: AtomicUsize,
+ pub kinds: std::sync::Mutex<Vec<u32>>,
pub pause: AtomicBool,
pub entered: Notify,
pub resume: Notify,
@@ -45,6 +46,7 @@ impl CountingSigner {
.unwrap(),
calls: AtomicUsize::new(0),
statuses: AtomicUsize::new(0),
+ kinds: std::sync::Mutex::new(Vec::new()),
pause: AtomicBool::new(false),
entered: Notify::new(),
resume: Notify::new(),
@@ -68,6 +70,7 @@ impl Signer for CountingSigner {
) -> BoxFuture<'_, Result<radroots_signing::SignReceipt, radroots_signing::Error>> {
Box::pin(async move {
self.calls.fetch_add(1, Ordering::SeqCst);
+ self.kinds.lock().unwrap().push(request.kind());
if self.pause.swap(false, Ordering::SeqCst) {
self.entered.notify_one();
self.resume.notified().await;
diff --git a/core/crates/tera_core/src/runtime/product_surface/submission/record.rs b/core/crates/tera_core/src/runtime/product_surface/submission/record.rs
@@ -133,3 +133,29 @@ pub(super) fn decode(
}
Ok(wire)
}
+
+pub(super) fn request_from(
+ stored: &AuthoredDraft,
+ scope: &ComposerScope,
+) -> Result<SubmissionReservationRequest, E> {
+ if stored.payload().len() > SUBMISSION_RESERVATION_MAX_BYTES {
+ return Err(E::CorruptRecord);
+ }
+ let header: SchemaHeader =
+ serde_json::from_slice(stored.payload()).map_err(|_| E::CorruptRecord)?;
+ if header.schema_version != SUBMISSION_RESERVATION_SCHEMA_VERSION
+ || header.schema_sha256 != SUBMISSION_RESERVATION_SCHEMA_SHA256
+ {
+ return Err(E::UnsupportedSchema);
+ }
+ let wire: ReservationWire =
+ serde_json::from_slice(stored.payload()).map_err(|_| E::CorruptRecord)?;
+ let request = SubmissionReservationRequest::new(
+ wire.command_id,
+ scope.clone(),
+ super::ComposerId::new(*wire.source.draft_id().as_bytes()).map_err(|_| E::CorruptRecord)?,
+ super::ComposerRevision::new(wire.source.revision().get()).map_err(|_| E::CorruptRecord)?,
+ );
+ decode(stored, &request)?;
+ Ok(request)
+}
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 = "ac392da942896a6b676f063929af16971e201b0e"
+revision = "bb54297d208f8e3817485d1c1a63a386f457349a"
architecture = "radroots.crates.release.v2"
workspace_catalog_sha256 = "ee295f2352e2577a4052d980624415aec9871197d4fc9910a4c21c83a9179200"
version = "0.1.0-alpha"
-source_archive_sha256 = "c7c5de435fa7965181d44ccc146cab4286b943e0fdc34d6be757d38a2961ed1c"
-lockfile_sha256 = "694cbdae0b6de4918edc747207a9e372dfba8ce8e590f9dd15ea6ab864f842c4"
+source_archive_sha256 = "30c02cb48df5864e53febe96b7ec3193e896ad9b94d05cfce0d051a4f539618a"
+lockfile_sha256 = "4d1143601e90436115100eabcab9f098152ae7606976e906746cfe0bba78be8c"
diff --git a/release/provenance.json b/release/provenance.json
@@ -2,10 +2,10 @@
"artifacts": {
"app_api_sha256": "020924097c0d7efc33128cb8fd3d3b2026d95f57c44da71880e585aff80f070b",
"ffi_api_sha256": "fa1cc3ee4d2ed28a8ff535e598de1b45dd2129a3260186f74c6b3d1a14069f83",
- "ffi_provenance_sha256": "d33dcc83c3ec328d8d8bc13ee92fbe5b553bbbeecb15fcd2eb7d0e34a17fede4",
+ "ffi_provenance_sha256": "6c245d6ae5d9fbe1cc9baa83856842d0f98b31e4876483e87ef5ea776dc0a730",
"info_plist_sha256": "15ef08b1cdd1096cfb9eeaf5be5bf8f814807a7ca9350bbbb47860fa72ec13ef",
"privacy_manifest_sha256": "a331d51864743ebe4e00dd22360b4a538b6b3ac26a6b3eb54094e60a36959a12",
- "sbom_sha256": "181465ab175193b361bf543db0b141c64fb03fa3439ce8142a69f5c56734bd3e",
+ "sbom_sha256": "05d212957636d01ff00e4652f7457daabd5f1f87b62a4d16cb0c27120061effd",
"xcode_project_sha256": "6c438f9668ac855e6288043c22db8319b73c6d836ec1b1236a1450b367413318"
},
"disposition": "unsigned",
@@ -17,12 +17,12 @@
"repository": "https://github.com/radrootslabs/tera",
"schema": "tera.release-provenance.v1",
"source": {
- "cargo_lock_sha256": "694cbdae0b6de4918edc747207a9e372dfba8ce8e590f9dd15ea6ab864f842c4",
- "consumer_source_lock_sha256": "a910d5d15d9c020172fb215bc8e2d27dd92c05cb1ab3b803791f13579e2932fa",
- "lib_revision": "ac392da942896a6b676f063929af16971e201b0e",
+ "cargo_lock_sha256": "4d1143601e90436115100eabcab9f098152ae7606976e906746cfe0bba78be8c",
+ "consumer_source_lock_sha256": "e952058c8b7e929c335fda72f85b5e28bcc9a63398ae97887b9bbba18a96ce52",
+ "lib_revision": "bb54297d208f8e3817485d1c1a63a386f457349a",
"source_date_epoch": 1787871027,
"swift_package_lock_sha256": "94ae067a374726cdaf6b4ca0a5e44663c57fcdc5334060c5ffef5e79cfbf04c0",
- "tera_ffi_source_tree": "18a7a18d56a4fb953cd53e12f99afee48c7e6e41",
+ "tera_ffi_source_tree": "2debefe8f899f1f0441c77eb804b135905a43358",
"xcode_package_lock_sha256": "c7f41934ea25f7a287bdc4f3a6ecabbf09a3a0bdd0f5a3e58183f355ca814096"
},
"version": "0.1.0-alpha"
diff --git a/release/sbom.cdx.json b/release/sbom.cdx.json
@@ -4034,7 +4034,7 @@
"version": "6.0.0"
},
{
- "bom-ref": "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
+ "bom-ref": "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4048,14 +4048,14 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+ "value": "git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
}
],
"type": "library",
"version": "0.1.0-alpha"
},
{
- "bom-ref": "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
+ "bom-ref": "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4069,14 +4069,14 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+ "value": "git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
}
],
"type": "library",
"version": "0.1.0-alpha"
},
{
- "bom-ref": "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
+ "bom-ref": "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4090,14 +4090,14 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+ "value": "git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
}
],
"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=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
+ "bom-ref": "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4111,14 +4111,14 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+ "value": "git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
}
],
"type": "library",
"version": "0.1.0-alpha"
},
{
- "bom-ref": "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
+ "bom-ref": "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4132,14 +4132,14 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+ "value": "git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
}
],
"type": "library",
"version": "0.1.0-alpha"
},
{
- "bom-ref": "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
+ "bom-ref": "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4153,14 +4153,14 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+ "value": "git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
}
],
"type": "library",
"version": "0.1.0-alpha"
},
{
- "bom-ref": "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
+ "bom-ref": "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4174,14 +4174,14 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+ "value": "git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
}
],
"type": "library",
"version": "0.1.0-alpha"
},
{
- "bom-ref": "cargo:radroots_sdk@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
+ "bom-ref": "cargo:radroots_sdk@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4195,14 +4195,14 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+ "value": "git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
}
],
"type": "library",
"version": "0.1.0-alpha"
},
{
- "bom-ref": "cargo:radroots_secrets@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
+ "bom-ref": "cargo:radroots_secrets@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4216,14 +4216,14 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+ "value": "git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
}
],
"type": "library",
"version": "0.1.0-alpha"
},
{
- "bom-ref": "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
+ "bom-ref": "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4237,14 +4237,14 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+ "value": "git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
}
],
"type": "library",
"version": "0.1.0-alpha"
},
{
- "bom-ref": "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
+ "bom-ref": "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4258,14 +4258,14 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+ "value": "git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
}
],
"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=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
+ "bom-ref": "cargo:radroots_storage_sqlite@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4279,14 +4279,14 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+ "value": "git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
}
],
"type": "library",
"version": "0.1.0-alpha"
},
{
- "bom-ref": "cargo:radroots_sync@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
+ "bom-ref": "cargo:radroots_sync@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4300,14 +4300,14 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+ "value": "git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
}
],
"type": "library",
"version": "0.1.0-alpha"
},
{
- "bom-ref": "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
+ "bom-ref": "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4321,14 +4321,14 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+ "value": "git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
}
],
"type": "library",
"version": "0.1.0-alpha"
},
{
- "bom-ref": "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
+ "bom-ref": "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4342,14 +4342,14 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+ "value": "git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
}
],
"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=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
+ "bom-ref": "cargo:radroots_transport_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4363,7 +4363,7 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+ "value": "git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
}
],
"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=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+ "ref": "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
},
{
"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=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+ "ref": "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
},
{
"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=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
+ "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
"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=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+ "ref": "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
},
{
"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=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
+ "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
"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=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+ "ref": "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
},
{
"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=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+ "ref": "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
},
{
"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=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
+ "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
"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=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+ "ref": "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
},
{
"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=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+ "ref": "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
},
{
"dependsOn": [
- "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_storage_sqlite@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_sync@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_transport_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
+ "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_storage_sqlite@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_sync@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_transport_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
"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=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+ "ref": "cargo:radroots_sdk@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
},
{
"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=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+ "ref": "cargo:radroots_secrets@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
},
{
"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=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
+ "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
"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=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+ "ref": "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
},
{
"dependsOn": [
- "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
+ "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
"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=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+ "ref": "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
},
{
"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=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_secrets@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
+ "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_secrets@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
"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=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+ "ref": "cargo:radroots_storage_sqlite@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
},
{
"dependsOn": [
- "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
+ "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
"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=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+ "ref": "cargo:radroots_sync@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
},
{
"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=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
+ "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
"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=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+ "ref": "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
},
{
"dependsOn": [
- "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
+ "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
"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=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+ "ref": "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
},
{
"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=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
+ "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
"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=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e"
+ "ref": "cargo:radroots_transport_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a"
},
{
"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=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_sdk@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_sync@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_transport_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
+ "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_sdk@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_sync@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_transport_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
"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=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_sdk@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
- "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=ac392da942896a6b676f063929af16971e201b0e#ac392da942896a6b676f063929af16971e201b0e",
+ "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_sdk@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
+ "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=bb54297d208f8e3817485d1c1a63a386f457349a#bb54297d208f8e3817485d1c1a63a386f457349a",
"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
@@ -4060,17 +4060,29 @@
},
{
"path": "core/crates/tera_core/src/runtime/product_surface/outbox.rs",
- "count": 6
+ "count": 5
},
{
"path": "core/crates/tera_core/src/runtime/product_surface/outbox/mutation_admission_tests.rs",
"count": 2
},
{
+ "path": "core/crates/tera_core/src/runtime/product_surface/outbox/native_upload.rs",
+ "count": 1
+ },
+ {
"path": "core/crates/tera_core/src/runtime/product_surface/submission/capture/media.rs",
"count": 1
},
{
+ "path": "core/crates/tera_core/src/runtime/product_surface/submission/media.rs",
+ "count": 1
+ },
+ {
+ "path": "core/crates/tera_core/src/runtime/product_surface/submission/media_test_support.rs",
+ "count": 1
+ },
+ {
"path": "core/crates/tera_core/src/runtime/product_surface/submission/test_support.rs",
"count": 1
},
@@ -4593,10 +4605,18 @@
"count": 43
},
{
+ "path": "core/crates/tera_core/src/runtime/product_surface/outbox/media.rs",
+ "count": 2
+ },
+ {
"path": "core/crates/tera_core/src/runtime/product_surface/outbox/mutation_admission_tests.rs",
"count": 1
},
{
+ "path": "core/crates/tera_core/src/runtime/product_surface/outbox/native_upload.rs",
+ "count": 1
+ },
+ {
"path": "core/crates/tera_core/src/runtime/product_surface/settings.rs",
"count": 23
},
@@ -4625,6 +4645,18 @@
"count": 3
},
{
+ "path": "core/crates/tera_core/src/runtime/product_surface/submission/media.rs",
+ "count": 1
+ },
+ {
+ "path": "core/crates/tera_core/src/runtime/product_surface/submission/media_runtime.rs",
+ "count": 1
+ },
+ {
+ "path": "core/crates/tera_core/src/runtime/product_surface/submission/media_test_support.rs",
+ "count": 2
+ },
+ {
"path": "core/crates/tera_core/src/runtime/product_surface/submission/operation_test_support.rs",
"count": 2
},
@@ -4841,6 +4873,26 @@
"count": 1
},
{
+ "path": "core/crates/tera_core/src/runtime/product_surface/submission/inventory.rs",
+ "count": 1
+ },
+ {
+ "path": "core/crates/tera_core/src/runtime/product_surface/submission/inventory_tests.rs",
+ "count": 1
+ },
+ {
+ "path": "core/crates/tera_core/src/runtime/product_surface/submission/media_recovery_tests.rs",
+ "count": 1
+ },
+ {
+ "path": "core/crates/tera_core/src/runtime/product_surface/submission/media_runtime.rs",
+ "count": 1
+ },
+ {
+ "path": "core/crates/tera_core/src/runtime/product_surface/submission/media_tests.rs",
+ "count": 1
+ },
+ {
"path": "core/crates/tera_core/src/runtime/product_surface/submission/operation.rs",
"count": 1
},