field_ios

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

commit 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:
MCargo.lock | 32++++++++++++++++----------------
MCargo.toml | 24++++++++++++------------
MTeraFFI/provenance.json | 54+++++++++++++++++++++++++++---------------------------
MTeraFFI/source.lock | 6+++---
MTeraFFI/source/aarch64-apple-darwin.json | 196+++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------
MTeraFFI/source/aarch64-apple-ios-sim.json | 196+++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------
MTeraFFI/source/aarch64-apple-ios.json | 196+++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------
Mcore/crates/tera_core/src/runtime/product_surface.rs | 8+++++---
Mcore/crates/tera_core/src/runtime/product_surface/outbox.rs | 88++++++++++---------------------------------------------------------------------
Acore/crates/tera_core/src/runtime/product_surface/outbox/media.rs | 77+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acore/crates/tera_core/src/runtime/product_surface/outbox/native_upload.rs | 47+++++++++++++++++++++++++++++++++++++++++++++++
Mcore/crates/tera_core/src/runtime/product_surface/submission.rs | 14++++++++++++++
Mcore/crates/tera_core/src/runtime/product_surface/submission/intent.rs | 3+++
Acore/crates/tera_core/src/runtime/product_surface/submission/intent_media.rs | 90+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acore/crates/tera_core/src/runtime/product_surface/submission/inventory.rs | 240+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acore/crates/tera_core/src/runtime/product_surface/submission/inventory_tests.rs | 290+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acore/crates/tera_core/src/runtime/product_surface/submission/media.rs | 153+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acore/crates/tera_core/src/runtime/product_surface/submission/media_recovery_tests.rs | 133+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acore/crates/tera_core/src/runtime/product_surface/submission/media_runtime.rs | 117+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acore/crates/tera_core/src/runtime/product_surface/submission/media_test_support.rs | 78++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acore/crates/tera_core/src/runtime/product_surface/submission/media_tests.rs | 169+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mcore/crates/tera_core/src/runtime/product_surface/submission/operation.rs | 37++++++++++++++++++++++++++++++++++---
Mcore/crates/tera_core/src/runtime/product_surface/submission/operation_load.rs | 25++++++++-----------------
Mcore/crates/tera_core/src/runtime/product_surface/submission/operation_test_support.rs | 3+++
Mcore/crates/tera_core/src/runtime/product_surface/submission/record.rs | 26++++++++++++++++++++++++++
Mradroots.lib.source-lock.v1.toml | 6+++---
Mrelease/provenance.json | 12++++++------
Mrelease/sbom.cdx.json | 248++++++++++++++++++++++++++++++++++++++++----------------------------------------
Mtest-fixtures/legacy-identifiers.v1.json | 54+++++++++++++++++++++++++++++++++++++++++++++++++++++-
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(&current.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(&current)) + .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 },