commit 2d008582eb1ae1f1282e33f0e6bf6b9782ae61a4
parent 2b5fe5d8321fd0e248a9d304651b1ba54ee6a180
Author: triesap <tyson@radroots.org>
Date: Thu, 6 Aug 2026 20:26:07 +0000
studio: cut product over to canonical source
- pin every Rust dependency to the canonical lib revision
- materialize native artifacts from the governed source lock
- update Kotlin hosts for the canonical FFI contract
- route Studio verification outputs through extbuild
Diffstat:
12 files changed, 692 insertions(+), 215 deletions(-)
diff --git a/.radroots-consumer-root b/.radroots-consumer-root
@@ -0,0 +1 @@
+studio
diff --git a/Makefile b/Makefile
@@ -3,6 +3,7 @@
GRADLE ?= ./gradlew
CARGO ?= cargo
CARGO_MANIFEST := core/Cargo.toml
+EXTBUILD := cargo extbuild run --
.PHONY: help doctor format format-fix lint test check build bindings dev run audit licenses package release-check clean
@@ -10,59 +11,60 @@ help:
@printf '%s\n' doctor format format-fix lint test check build bindings dev run audit licenses package release-check clean
doctor:
- java -version
- $(CARGO) --version
- $(GRADLE) --version
+ cargo extbuild doctor
+ $(EXTBUILD) java -version
+ $(EXTBUILD) $(CARGO) --version
+ $(EXTBUILD) $(GRADLE) --version
format: doctor
- $(CARGO) fmt --manifest-path $(CARGO_MANIFEST) --all -- --check
- $(GRADLE) --no-daemon :app:desktop:ktlintCheck
+ $(EXTBUILD) $(CARGO) fmt --manifest-path $(CARGO_MANIFEST) --all -- --check
+ $(EXTBUILD) $(GRADLE) --no-daemon :app:desktop:ktlintCheck
format-fix: doctor
- $(CARGO) fmt --manifest-path $(CARGO_MANIFEST) --all
- $(GRADLE) --no-daemon :app:desktop:ktlintFormat
+ $(EXTBUILD) $(CARGO) fmt --manifest-path $(CARGO_MANIFEST) --all
+ $(EXTBUILD) $(GRADLE) --no-daemon :app:desktop:ktlintFormat
lint: doctor
- $(CARGO) clippy --manifest-path $(CARGO_MANIFEST) --workspace --all-targets -- -D warnings
- $(GRADLE) --no-daemon :app:desktop:detekt
+ $(EXTBUILD) $(CARGO) clippy --manifest-path $(CARGO_MANIFEST) --workspace --all-targets --locked -- -D warnings
+ $(EXTBUILD) $(GRADLE) --no-daemon :app:desktop:detekt
test: doctor
- $(CARGO) test --manifest-path $(CARGO_MANIFEST) --workspace
- $(GRADLE) --no-daemon :app:desktop:test
+ $(EXTBUILD) $(CARGO) test --manifest-path $(CARGO_MANIFEST) --workspace --locked
+ $(EXTBUILD) $(GRADLE) --no-daemon :app:desktop:test
check: format lint test
- $(GRADLE) --no-daemon :app:desktop:check
+ $(EXTBUILD) $(GRADLE) --no-daemon :app:desktop:check
build: doctor
- $(CARGO) build --manifest-path $(CARGO_MANIFEST) --workspace
- $(GRADLE) --no-daemon :app:desktop:build
+ $(EXTBUILD) $(CARGO) build --manifest-path $(CARGO_MANIFEST) --workspace --locked
+ $(EXTBUILD) $(GRADLE) --no-daemon :app:desktop:build
bindings: doctor
- $(GRADLE) --no-daemon :app:desktop:verifyUniFfiBindings :app:desktop:verifyReleaseNativeLibrary
+ $(EXTBUILD) $(GRADLE) --no-daemon :app:desktop:verifyUniFfiBindings :app:desktop:verifyReleaseNativeLibrary
dev: doctor
- $(GRADLE) :app:desktop:hotRun --mainClass org.radroots.studio.desktop.MainKt
+ $(EXTBUILD) $(GRADLE) :app:desktop:hotRun --mainClass org.radroots.studio.desktop.MainKt
run: doctor
- $(GRADLE) :app:desktop:run
+ $(EXTBUILD) $(GRADLE) :app:desktop:run
audit: doctor
- $(CARGO) audit --file core/Cargo.lock
- $(CARGO) deny --manifest-path $(CARGO_MANIFEST) check --config core/deny.toml advisories
- $(GRADLE) --no-daemon --no-configuration-cache :app:desktop:dependencyCheckAnalyze
+ $(EXTBUILD) $(CARGO) audit --file core/Cargo.lock
+ $(EXTBUILD) $(CARGO) deny --manifest-path $(CARGO_MANIFEST) check --config core/deny.toml advisories
+ $(EXTBUILD) $(GRADLE) --no-daemon --no-configuration-cache :app:desktop:dependencyCheckAnalyze
licenses: doctor
- $(CARGO) deny --manifest-path $(CARGO_MANIFEST) check --config core/deny.toml licenses sources
- $(GRADLE) --no-daemon --no-parallel --no-configuration-cache :app:desktop:checkLicense
+ $(EXTBUILD) $(CARGO) deny --manifest-path $(CARGO_MANIFEST) check --config core/deny.toml licenses sources
+ $(EXTBUILD) $(GRADLE) --no-daemon --no-parallel --no-configuration-cache :app:desktop:checkLicense
package: check
- $(GRADLE) --no-daemon :app:desktop:verifyMacOsPackage
+ $(EXTBUILD) $(GRADLE) --no-daemon :app:desktop:verifyMacOsPackage
release-check: doctor
- $(CARGO) audit --file core/Cargo.lock
- $(CARGO) deny --manifest-path $(CARGO_MANIFEST) check --config core/deny.toml advisories licenses sources
- $(GRADLE) --no-daemon --no-parallel --no-configuration-cache :app:desktop:releaseReadiness
+ $(EXTBUILD) $(CARGO) audit --file core/Cargo.lock
+ $(EXTBUILD) $(CARGO) deny --manifest-path $(CARGO_MANIFEST) check --config core/deny.toml advisories licenses sources
+ $(EXTBUILD) $(GRADLE) --no-daemon --no-parallel --no-configuration-cache :app:desktop:releaseReadiness
clean: doctor
- $(CARGO) clean --manifest-path $(CARGO_MANIFEST)
- $(GRADLE) --no-daemon clean
+ $(EXTBUILD) $(CARGO) clean --manifest-path $(CARGO_MANIFEST)
+ $(EXTBUILD) $(GRADLE) --no-daemon clean
diff --git a/app/desktop/build.gradle.kts b/app/desktop/build.gradle.kts
@@ -18,6 +18,7 @@ import org.gradle.api.tasks.testing.Test
import org.gradle.jvm.tasks.Jar
import org.jetbrains.compose.desktop.application.dsl.TargetFormat
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import java.io.File
import java.util.Properties
import java.util.jar.JarFile
@@ -61,31 +62,48 @@ configure<org.jlleitschuh.gradle.ktlint.KtlintExtension> {
),
)
filter {
- exclude { it.file.path.contains("/build/generated/") }
+ exclude("**/generated/uniffi/**")
}
}
-tasks.withType<org.jlleitschuh.gradle.ktlint.tasks.BaseKtLintCheckTask>().configureEach {
- exclude { it.file.path.contains("/build/generated/") }
-}
+val extBuildGradleRoot =
+ providers.environmentVariable("EXT_BUILD_GRADLE_BUILD_DIR").orNull
+ ?: throw GradleException("EXT_BUILD_GRADLE_BUILD_DIR is required; run Gradle through cargo extbuild")
+val cargoTargetRoot =
+ providers.environmentVariable("CARGO_TARGET_DIR").orNull
+ ?: throw GradleException("CARGO_TARGET_DIR is required; run Gradle through cargo extbuild")
+layout.buildDirectory.set(file(extBuildGradleRoot).resolve("app-desktop"))
-val rustManifest = rootProject.layout.projectDirectory.file("core/Cargo.toml")
-val compatibilityBaseline = rootProject.layout.projectDirectory.file("core/compatibility/v5-baseline.properties")
+val radrootsOffline =
+ providers
+ .gradleProperty("radrootsOffline")
+ .map(String::toBooleanStrict)
+ .orElse(false)
+val immutableCargoArguments =
+ if (radrootsOffline.get()) {
+ listOf("--frozen", "--offline")
+ } else {
+ listOf("--locked")
+ }
+
+val sourceLockFile = rootProject.layout.projectDirectory.file("radroots.lib.source-lock.v1.toml")
-fun workspacePackageVersion(manifest: File): String {
- val packageSection =
- manifest
- .readText()
- .substringAfter("[workspace.package]", missingDelimiterValue = "")
- .substringBefore("\n[")
- return Regex("""(?m)^version\s*=\s*"([^"]+)"\s*$""")
- .find(packageSection)
+fun sourceLockValue(key: String): String {
+ val expression = Regex("""(?m)^${Regex.escape(key)}\s*=\s*"([^"]+)"\s*$""")
+ return expression
+ .find(sourceLockFile.asFile.readText())
?.groupValues
?.get(1)
- ?: throw GradleException("Cargo workspace package version is missing")
+ ?: throw GradleException("Source lock is missing $key")
}
-val appVersion = workspacePackageVersion(rustManifest.asFile)
+val radrootsLibRepository = sourceLockValue("repository")
+val radrootsLibRevision = sourceLockValue("revision")
+val radrootsLibVersion = sourceLockValue("version")
+val radrootsLibSource = file(extBuildGradleRoot).resolve("source/lib")
+val rustManifest = radrootsLibSource.resolve("Cargo.toml")
+val compatibilityBaseline = rootProject.layout.projectDirectory.file("core/compatibility/v5-baseline.properties")
+val appVersion = radrootsLibVersion
val macOsBuildVersion = "1"
val baseline =
Properties().apply {
@@ -109,19 +127,102 @@ val applicationNamespace = baselineValue("package.namespace")
version = appVersion
val rustSources =
- rootProject.fileTree("core") {
+ fileTree(radrootsLibSource) {
include(
- "**/Cargo.toml",
+ "Cargo.toml",
"Cargo.lock",
"rust-toolchain.toml",
- "**/*.rs",
- "**/*.sql",
- "**/uniffi.toml",
- "compatibility/**",
+ "contracts/crates/catalog.v1.toml",
+ "crates/studio_*/**",
+ "tools/xtask/**",
)
exclude("target/**")
}
+abstract class SyncRadrootsLibSource : DefaultTask() {
+ @get:Input
+ abstract val repository: Property<String>
+
+ @get:Input
+ abstract val revision: Property<String>
+
+ @get:Input
+ abstract val offline: Property<Boolean>
+
+ @get:OutputDirectory
+ abstract val sourceDirectory: DirectoryProperty
+
+ @TaskAction
+ fun sync() {
+ val source = sourceDirectory.get().asFile
+ if (!source.resolve(".git").isDirectory) {
+ require(!offline.get()) { "Canonical source is not cached and offline mode is enabled" }
+ source.parentFile.mkdirs()
+ command(source.parentFile, "git", "clone", "--filter=blob:none", "--no-checkout", repository.get(), source.absolutePath)
+ }
+ require(command(source, "git", "remote", "get-url", "origin").trim() == repository.get()) {
+ "Canonical source cache origin does not match the source lock"
+ }
+ if (!offline.get()) {
+ command(source, "git", "fetch", "--force", "--no-tags", "origin", revision.get())
+ }
+ command(source, "git", "cat-file", "-e", "${revision.get()}^{commit}")
+ command(source, "git", "checkout", "--detach", revision.get())
+ require(command(source, "git", "rev-parse", "HEAD").trim() == revision.get()) {
+ "Materialized source revision does not match the source lock"
+ }
+ require(command(source, "git", "status", "--porcelain", "--untracked-files=all").isBlank()) {
+ "Materialized source tree is not clean"
+ }
+ }
+
+ private fun command(
+ workingDirectory: File,
+ vararg command: String,
+ ): String {
+ val process =
+ ProcessBuilder(*command)
+ .directory(workingDirectory)
+ .redirectErrorStream(true)
+ .start()
+ val output = process.inputStream.bufferedReader().use { it.readText() }
+ require(process.waitFor() == 0) {
+ "${command.joinToString(" ")} failed: ${output.trim()}"
+ }
+ return output
+ }
+}
+
+val syncRadrootsLibSource by tasks.registering(SyncRadrootsLibSource::class) {
+ repository.set(radrootsLibRepository)
+ revision.set(radrootsLibRevision)
+ offline.set(
+ radrootsOffline,
+ )
+ sourceDirectory.set(radrootsLibSource)
+ outputs.upToDateWhen { false }
+}
+
+val validateRadrootsSourceLock by tasks.registering(Exec::class) {
+ dependsOn(syncRadrootsLibSource)
+ workingDir(rootProject.projectDir)
+ commandLine(
+ "cargo",
+ "run",
+ "--manifest-path",
+ rustManifest.absolutePath,
+ "-p",
+ "xtask",
+ *immutableCargoArguments.toTypedArray(),
+ "--",
+ "source-lock",
+ "--consumer-root",
+ rootProject.projectDir.absolutePath,
+ )
+ inputs.file(sourceLockFile)
+ inputs.file(rootProject.layout.projectDirectory.file("core/Cargo.lock"))
+}
+
data class NativeTarget(
val libraryName: String,
val jnaPrefix: String,
@@ -156,35 +257,41 @@ val nativeTarget =
providers.gradleProperty("nativeArch").getOrElse(System.getProperty("os.arch")),
)
val rustLibraryName = nativeTarget.libraryName
-val rustDebugLibrary = rootProject.layout.projectDirectory.file("core/target/debug/$rustLibraryName")
-val rustReleaseLibrary = rootProject.layout.projectDirectory.file("core/target/release/$rustLibraryName")
+val rustDebugLibrary = file(cargoTargetRoot).resolve("debug/$rustLibraryName")
+val rustReleaseLibrary = file(cargoTargetRoot).resolve("release/$rustLibraryName")
val jnaPlatformPrefix = nativeTarget.jnaPrefix
val buildRustCoreDebug by tasks.registering(Exec::class) {
+ dependsOn(validateRadrootsSourceLock)
workingDir(rootProject.projectDir)
commandLine(
"cargo",
"build",
"--manifest-path",
- rustManifest.asFile.absolutePath,
+ rustManifest.absolutePath,
"-p",
- "radroots-studio-ffi",
+ "radroots_studio_ffi",
+ *immutableCargoArguments.toTypedArray(),
)
+ environment("RADROOTS_SOURCE_SHA", radrootsLibRevision)
inputs.files(rustSources)
outputs.file(rustDebugLibrary)
}
val buildRustCoreRelease by tasks.registering(Exec::class) {
+ dependsOn(validateRadrootsSourceLock)
workingDir(rootProject.projectDir)
commandLine(
"cargo",
"build",
"--release",
"--manifest-path",
- rustManifest.asFile.absolutePath,
+ rustManifest.absolutePath,
"-p",
- "radroots-studio-ffi",
+ "radroots_studio_ffi",
+ *immutableCargoArguments.toTypedArray(),
)
+ environment("RADROOTS_SOURCE_SHA", radrootsLibRevision)
inputs.files(rustSources)
outputs.file(rustReleaseLibrary)
}
@@ -201,9 +308,10 @@ val generateUniFfiKotlin by tasks.registering(Exec::class) {
"cargo",
"run",
"--manifest-path",
- rustManifest.asFile.absolutePath,
+ rustManifest.absolutePath,
"-p",
- "radroots-studio-uniffi-bindgen",
+ "radroots_studio_uniffi_bindgen",
+ *immutableCargoArguments.toTypedArray(),
"--",
"generate",
"--library",
@@ -212,15 +320,13 @@ val generateUniFfiKotlin by tasks.registering(Exec::class) {
"--metadata-no-deps",
"--no-format",
"--config",
- rootProject.layout.projectDirectory
- .file("core/crates/ffi/uniffi.toml")
- .asFile.absolutePath,
+ radrootsLibSource.resolve("crates/studio_ffi/uniffi.toml").absolutePath,
"--out-dir",
generatedUniFfiKotlin.get().asFile.absolutePath,
- rustDebugLibrary.asFile.absolutePath,
+ rustDebugLibrary.absolutePath,
)
inputs.file(rustDebugLibrary)
- inputs.file(rootProject.layout.projectDirectory.file("core/crates/ffi/uniffi.toml"))
+ inputs.file(radrootsLibSource.resolve("crates/studio_ffi/uniffi.toml"))
outputs.dir(generatedUniFfiKotlin)
}
@@ -541,10 +647,6 @@ tasks.withType<Test>().configureEach {
}
kotlin {
- sourceSets.main {
- kotlin.srcDir(generatedUniFfiKotlin)
- }
-
compilerOptions {
jvmTarget.set(JvmTarget.JVM_21)
}
@@ -552,8 +654,9 @@ kotlin {
jvmToolchain(21)
}
-tasks.named("compileKotlin") {
+tasks.named<KotlinCompile>("compileKotlin") {
dependsOn(generateUniFfiKotlin)
+ source(generatedUniFfiKotlin)
}
tasks.named("runKtlintCheckOverMainSourceSet") {
dependsOn(generateUniFfiKotlin)
@@ -572,7 +675,7 @@ tasks.withType<Test>().configureEach {
)
systemProperty(
"jna.library.path",
- rustDebugLibrary.asFile.parentFile.absolutePath,
+ rustDebugLibrary.parentFile.absolutePath,
)
}
tasks.withType<JavaExec>().configureEach {
@@ -580,7 +683,7 @@ tasks.withType<JavaExec>().configureEach {
systemProperty("radroots.studio.development", "true")
systemProperty(
"jna.library.path",
- rustDebugLibrary.asFile.parentFile.absolutePath,
+ rustDebugLibrary.parentFile.absolutePath,
)
}
diff --git a/app/desktop/src/main/kotlin/org/radroots/studio/application/NativeCompatibility.kt b/app/desktop/src/main/kotlin/org/radroots/studio/application/NativeCompatibility.kt
@@ -3,11 +3,13 @@ package org.radroots.studio.application
import org.radroots.studio.ffi.CompatibilityDescriptor
import org.radroots.studio.ffi.CompatibilityExpectation
-internal const val EXPECTED_FFI_CONTRACT_HASH = "radroots-studio-native-v2-2026-08-03"
-internal val EXPECTED_FFI_CONTRACT_MAJOR: UShort = 2.toUShort()
+internal const val EXPECTED_PRODUCT_VERSION = "0.1.0-alpha"
+internal const val EXPECTED_CARGO_PACKAGE_VERSION = "0.1.0-alpha"
+internal const val EXPECTED_FFI_CONTRACT_HASH = "6804ed2b522cb033bf085d94cd4f9a358a60bd48fb52e73f7a308624eb85ab05"
+internal val EXPECTED_FFI_CONTRACT_MAJOR: UShort = 3.toUShort()
internal val MINIMUM_FFI_CONTRACT_MINOR: UShort = 0.toUShort()
internal const val MINIMUM_STORAGE_SCHEMA: UInt = 5U
-internal const val MAXIMUM_STORAGE_SCHEMA: UInt = 9U
+internal const val MAXIMUM_STORAGE_SCHEMA: UInt = 10U
internal class NativeCompatibilityException :
IllegalStateException(
@@ -16,7 +18,9 @@ internal class NativeCompatibilityException :
internal fun verifyNativeCompatibility(descriptor: CompatibilityDescriptor): CompatibilityExpectation {
val compatible =
- descriptor.contractMajor == EXPECTED_FFI_CONTRACT_MAJOR &&
+ descriptor.productVersion == EXPECTED_PRODUCT_VERSION &&
+ descriptor.cargoPackageVersion == EXPECTED_CARGO_PACKAGE_VERSION &&
+ descriptor.contractMajor == EXPECTED_FFI_CONTRACT_MAJOR &&
descriptor.contractMinor >= MINIMUM_FFI_CONTRACT_MINOR &&
descriptor.contractHash == EXPECTED_FFI_CONTRACT_HASH &&
descriptor.currentSchemaVersion >= MINIMUM_STORAGE_SCHEMA &&
diff --git a/app/desktop/src/main/kotlin/org/radroots/studio/application/StudioCoreGateway.kt b/app/desktop/src/main/kotlin/org/radroots/studio/application/StudioCoreGateway.kt
@@ -160,7 +160,7 @@ class NativeStudioCoreGateway(
return try {
val request = core.beginGeneratedAccountV2()
try {
- NativeGeneratedRecoveryTicket(core, request, requestId, request.account())
+ NativeGeneratedRecoveryTicket(core, request, ::requestContext, requestId, request.account())
} catch (error: Exception) {
request.close()
throw error
@@ -182,7 +182,7 @@ class NativeStudioCoreGateway(
override suspend fun confirmAccountRemoval(ticket: RemovalTicket): AppSnapshotDto {
require(ticket is NativeRemovalTicket) { "Removal ticket does not belong to native core" }
- return core.confirmAccountRemoval(ticket.request)
+ return core.confirmAccountRemoval(requestContext(), ticket.request)
}
override fun shutdown(): StudioShutdownReceipt =
@@ -234,8 +234,11 @@ private class NativeSubscription(
private val subscription: ObserverSubscription,
) : AutoCloseable {
override fun close() {
- subscription.unsubscribe()
- subscription.close()
+ try {
+ runBlocking { subscription.unsubscribe() }
+ } finally {
+ subscription.close()
+ }
}
}
@@ -255,6 +258,7 @@ private class NativeRemovalTicket(
private class NativeGeneratedRecoveryTicket(
private val core: StudioAppCore,
private val request: GeneratedRecoveryRequest,
+ private val requestContext: () -> RequestContextDto,
override val requestId: String,
override val account: AccountDto,
) : GeneratedRecoveryTicket {
@@ -270,10 +274,12 @@ private class NativeGeneratedRecoveryTicket(
)
}
- override suspend fun acknowledge(): AppSnapshotDto =
- call("The generated account could not be saved.") {
- core.acknowledgeGeneratedAccountV2(request)
+ override suspend fun acknowledge(): AppSnapshotDto {
+ val context = requestContext()
+ return call("The generated account could not be saved.", context.requestId) {
+ core.acknowledgeGeneratedAccountV2(context, request)
}
+ }
override suspend fun cancel(): Boolean =
call("The generated key could not be cancelled safely.") {
@@ -286,6 +292,7 @@ private class NativeGeneratedRecoveryTicket(
private suspend fun <T> call(
fallbackSafeMessage: String,
+ correlationId: String = requestId,
operation: suspend () -> T,
): T =
try {
@@ -294,7 +301,7 @@ private class NativeGeneratedRecoveryTicket(
throw error
} catch (error: Exception) {
throw StudioGatewayException(
- error.toStudioCommandFailure(requestId, fallbackSafeMessage),
+ error.toStudioCommandFailure(correlationId, fallbackSafeMessage),
)
}
}
diff --git a/app/desktop/src/test/kotlin/org/radroots/studio/application/NativeCompatibilityTest.kt b/app/desktop/src/test/kotlin/org/radroots/studio/application/NativeCompatibilityTest.kt
@@ -14,10 +14,12 @@ class NativeCompatibilityTest {
assertEquals(EXPECTED_FFI_CONTRACT_HASH, expectation.contractHash)
listOf(
- descriptor.copy(contractMajor = 3.toUShort()),
+ descriptor.copy(productVersion = "wrong"),
+ descriptor.copy(cargoPackageVersion = "wrong"),
+ descriptor.copy(contractMajor = 4.toUShort()),
descriptor.copy(contractHash = "wrong"),
descriptor.copy(currentSchemaVersion = 4U),
- descriptor.copy(minimumSchemaVersion = 10U),
+ descriptor.copy(minimumSchemaVersion = 11U),
).forEach { incompatible ->
assertFailsWith<NativeCompatibilityException> {
verifyNativeCompatibility(incompatible)
@@ -27,6 +29,8 @@ class NativeCompatibilityTest {
private fun compatibleDescriptor() =
CompatibilityDescriptor(
+ productVersion = EXPECTED_PRODUCT_VERSION,
+ cargoPackageVersion = EXPECTED_CARGO_PACKAGE_VERSION,
contractMajor = EXPECTED_FFI_CONTRACT_MAJOR,
contractMinor = MINIMUM_FFI_CONTRACT_MINOR,
contractHash = EXPECTED_FFI_CONTRACT_HASH,
diff --git a/build.gradle.kts b/build.gradle.kts
@@ -3,3 +3,8 @@ plugins {
alias(libs.plugins.compose.multiplatform) apply false
alias(libs.plugins.compose.compiler) apply false
}
+
+val extBuildGradleRoot =
+ providers.environmentVariable("EXT_BUILD_GRADLE_BUILD_DIR").orNull
+ ?: error("EXT_BUILD_GRADLE_BUILD_DIR is required; run Gradle through cargo extbuild")
+layout.buildDirectory.set(file(extBuildGradleRoot).resolve("root"))
diff --git a/core/Cargo.lock b/core/Cargo.lock
@@ -40,20 +40,14 @@ dependencies = [
[[package]]
name = "aho-corasick"
-version = "1.1.4"
+version = "1.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301"
+checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba"
dependencies = [
"memchr",
]
[[package]]
-name = "anstyle"
-version = "1.0.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000"
-
-[[package]]
name = "anyhow"
version = "1.0.104"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -61,9 +55,9 @@ checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470"
[[package]]
name = "apple-native-keyring-store"
-version = "1.0.1"
+version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "797f94b6a53d7d10b56dc18290e0d40a2158352f108bb4ff32350825081a9f29"
+checksum = "2b350bfd03649e07aa05c0a81b3e15934374e585c98204a57e20b9d49f49bb9a"
dependencies = [
"keyring-core",
"log",
@@ -325,6 +319,12 @@ dependencies = [
]
[[package]]
+name = "base16ct"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf"
+
+[[package]]
name = "base64"
version = "0.22.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -548,45 +548,6 @@ dependencies = [
]
[[package]]
-name = "clap"
-version = "4.6.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "301b56658598e48f3648647ac6fc887be7e7108eddfa4e9b63fcf3ec58c0cadf"
-dependencies = [
- "clap_builder",
- "clap_derive",
-]
-
-[[package]]
-name = "clap_builder"
-version = "4.6.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "94a65403d1a1bd28f7dc68eb8506e8874808ee5eecb59298de588e2e1407a078"
-dependencies = [
- "anstyle",
- "clap_lex",
- "strsim",
-]
-
-[[package]]
-name = "clap_derive"
-version = "4.6.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061"
-dependencies = [
- "heck",
- "proc-macro2",
- "quote",
- "syn 3.0.3",
-]
-
-[[package]]
-name = "clap_lex"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9"
-
-[[package]]
name = "concurrent-queue"
version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -596,6 +557,12 @@ dependencies = [
]
[[package]]
+name = "const-oid"
+version = "0.9.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8"
+
+[[package]]
name = "core-foundation"
version = "0.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -627,6 +594,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17"
[[package]]
+name = "crypto-bigint"
+version = "0.5.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76"
+dependencies = [
+ "generic-array",
+ "rand_core 0.6.4",
+ "subtle",
+ "zeroize",
+]
+
+[[package]]
name = "crypto-common"
version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -639,9 +618,19 @@ dependencies = [
[[package]]
name = "data-encoding"
-version = "2.11.0"
+version = "2.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8"
+checksum = "4583a4551df46e2792f82ceeac45e850d2e2d5debba0b91f102385cda5b11f06"
+
+[[package]]
+name = "der"
+version = "0.7.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb"
+dependencies = [
+ "const-oid",
+ "zeroize",
+]
[[package]]
name = "deranged"
@@ -699,6 +688,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9e5e8f6c15a24b9a3ee5efec809ccd006d3b30e8b3bb63c39af737c7f87daa1d"
[[package]]
+name = "elliptic-curve"
+version = "0.13.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47"
+dependencies = [
+ "base16ct",
+ "crypto-bigint",
+ "ff",
+ "generic-array",
+ "group",
+ "rand_core 0.6.4",
+ "sec1",
+ "subtle",
+ "zeroize",
+]
+
+[[package]]
name = "endi"
version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -780,6 +786,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223"
[[package]]
+name = "ff"
+version = "0.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393"
+dependencies = [
+ "rand_core 0.6.4",
+ "subtle",
+]
+
+[[package]]
name = "find-msvc-tools"
version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -916,6 +932,7 @@ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
dependencies = [
"typenum",
"version_check",
+ "zeroize",
]
[[package]]
@@ -939,11 +956,22 @@ checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd"
dependencies = [
"cfg-if",
"libc",
- "r-efi",
+ "r-efi 5.3.0",
"wasip2",
]
[[package]]
+name = "getrandom"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "r-efi 6.0.0",
+]
+
+[[package]]
name = "gimli"
version = "0.32.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -979,6 +1007,17 @@ dependencies = [
]
[[package]]
+name = "group"
+version = "0.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63"
+dependencies = [
+ "ff",
+ "rand_core 0.6.4",
+ "subtle",
+]
+
+[[package]]
name = "hashbrown"
version = "0.16.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1156,6 +1195,16 @@ dependencies = [
[[package]]
name = "idna"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6"
+dependencies = [
+ "unicode-bidi",
+ "unicode-normalization",
+]
+
+[[package]]
+name = "idna"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de"
@@ -1227,6 +1276,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
[[package]]
+name = "jiff-tzdb"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "142bd39932ad231f10513df9ab62661fead8719872150b7ad02a2df79f4e141e"
+
+[[package]]
name = "js-sys"
version = "0.3.103"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1238,6 +1293,16 @@ dependencies = [
]
[[package]]
+name = "k256"
+version = "0.13.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b"
+dependencies = [
+ "cfg-if",
+ "elliptic-curve",
+]
+
+[[package]]
name = "keyring"
version = "4.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1309,6 +1374,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f66e8d5d03f609abc3a39e6f08e4164ebf1447a732906d39eb9b99b7919ef39"
[[package]]
+name = "mediatype"
+version = "0.21.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "120fa187be19d9962f0926633453784691731018a2bf936ddb4e29101b79c4a7"
+
+[[package]]
name = "memchr"
version = "2.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1389,13 +1460,49 @@ dependencies = [
]
[[package]]
+name = "nostr"
+version = "0.44.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "40ff7b77ef428b40aa2834a6acbae38a0e104c98b306208ca4b87a420d579a4b"
+dependencies = [
+ "aes",
+ "base64",
+ "bech32",
+ "bip39",
+ "bitcoin_hashes",
+ "cbc",
+ "chacha20",
+ "chacha20poly1305",
+ "getrandom 0.2.17",
+ "hex",
+ "instant",
+ "scrypt",
+ "secp256k1",
+ "serde",
+ "serde_json",
+ "unicode-normalization",
+ "url",
+ "url-fork",
+]
+
+[[package]]
name = "nostr-database"
version = "0.44.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7462c9d8ae5ef6a28d66a192d399ad2530f1f2130b13186296dbb11bdef5b3d1"
dependencies = [
"lru",
- "nostr",
+ "nostr 0.44.8",
+ "tokio",
+]
+
+[[package]]
+name = "nostr-database"
+version = "0.44.0"
+source = "git+https://github.com/rust-nostr/nostr.git?rev=5bba5163eb77107f82c4a8262cf29d7f33a73219#5bba5163eb77107f82c4a8262cf29d7f33a73219"
+dependencies = [
+ "lru",
+ "nostr 0.44.1",
"tokio",
]
@@ -1405,22 +1512,30 @@ version = "0.44.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ade30de16869618919c6b5efc8258f47b654a98b51541eb77f85e8ec5e3c83a6"
dependencies = [
- "nostr",
+ "nostr 0.44.8",
]
[[package]]
-name = "nostr-relay-builder"
-version = "0.44.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "08ed09e8363503c6f464087b530a1f43cf68be6292bd4928b5ea1141b03dc11c"
+name = "nostr-gossip"
+version = "0.44.0"
+source = "git+https://github.com/rust-nostr/nostr.git?rev=5bba5163eb77107f82c4a8262cf29d7f33a73219#5bba5163eb77107f82c4a8262cf29d7f33a73219"
+dependencies = [
+ "nostr 0.44.1",
+]
+
+[[package]]
+name = "nostr-relay-pool"
+version = "0.44.0"
+source = "git+https://github.com/rust-nostr/nostr.git?rev=5bba5163eb77107f82c4a8262cf29d7f33a73219#5bba5163eb77107f82c4a8262cf29d7f33a73219"
dependencies = [
"async-utility",
"async-wsocket",
"atomic-destructor",
"hex",
+ "lru",
"negentropy",
- "nostr",
- "nostr-database",
+ "nostr 0.44.1",
+ "nostr-database 0.44.0 (git+https://github.com/rust-nostr/nostr.git?rev=5bba5163eb77107f82c4a8262cf29d7f33a73219)",
"tokio",
"tracing",
]
@@ -1437,8 +1552,22 @@ dependencies = [
"hex",
"lru",
"negentropy",
- "nostr",
- "nostr-database",
+ "nostr 0.44.8",
+ "nostr-database 0.44.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tokio",
+ "tracing",
+]
+
+[[package]]
+name = "nostr-sdk"
+version = "0.44.0"
+source = "git+https://github.com/rust-nostr/nostr.git?rev=5bba5163eb77107f82c4a8262cf29d7f33a73219#5bba5163eb77107f82c4a8262cf29d7f33a73219"
+dependencies = [
+ "async-utility",
+ "nostr 0.44.1",
+ "nostr-database 0.44.0 (git+https://github.com/rust-nostr/nostr.git?rev=5bba5163eb77107f82c4a8262cf29d7f33a73219)",
+ "nostr-gossip 0.44.0 (git+https://github.com/rust-nostr/nostr.git?rev=5bba5163eb77107f82c4a8262cf29d7f33a73219)",
+ "nostr-relay-pool 0.44.0",
"tokio",
"tracing",
]
@@ -1450,10 +1579,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "471732576710e779b64f04c55e3f8b5292f865fea228436daf19694f0bf70393"
dependencies = [
"async-utility",
- "nostr",
- "nostr-database",
- "nostr-gossip",
- "nostr-relay-pool",
+ "nostr 0.44.8",
+ "nostr-database 0.44.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "nostr-gossip 0.44.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "nostr-relay-pool 0.44.3",
"tokio",
"tracing",
]
@@ -1718,75 +1847,233 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
[[package]]
-name = "radroots-studio-application"
+name = "r-efi"
+version = "6.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf"
+
+[[package]]
+name = "radroots_blossom"
+version = "0.1.0-alpha"
+source = "git+https://github.com/radrootslabs/lib?rev=09065a610d95e57acdc895a14c07580fa099e7c3#09065a610d95e57acdc895a14c07580fa099e7c3"
+dependencies = [
+ "mediatype",
+ "serde",
+ "sha2",
+ "unicode-general-category",
+ "url",
+]
+
+[[package]]
+name = "radroots_core"
+version = "0.1.0-alpha"
+source = "git+https://github.com/radrootslabs/lib?rev=09065a610d95e57acdc895a14c07580fa099e7c3#09065a610d95e57acdc895a14c07580fa099e7c3"
+dependencies = [
+ "rust_decimal",
+ "serde",
+]
+
+[[package]]
+name = "radroots_event"
version = "0.1.0-alpha"
+source = "git+https://github.com/radrootslabs/lib?rev=09065a610d95e57acdc895a14c07580fa099e7c3#09065a610d95e57acdc895a14c07580fa099e7c3"
dependencies = [
- "nostr",
- "nostr-relay-builder",
- "nostr-sdk",
- "radroots-studio-domain",
- "radroots-studio-nostr",
+ "hex",
+ "jiff-tzdb",
+ "radroots_blossom",
+ "radroots_core",
+ "radroots_identity",
+ "radroots_protocol",
+ "serde",
+ "serde_json",
+ "sha2",
+ "unicode-general-category",
+ "url",
+]
+
+[[package]]
+name = "radroots_event_codec"
+version = "0.1.0-alpha"
+source = "git+https://github.com/radrootslabs/lib?rev=09065a610d95e57acdc895a14c07580fa099e7c3#09065a610d95e57acdc895a14c07580fa099e7c3"
+dependencies = [
+ "hex",
+ "radroots_blossom",
+ "radroots_core",
+ "radroots_event",
+ "radroots_identity",
+ "radroots_protocol",
+ "secp256k1",
+ "serde",
+ "serde_json",
+ "sha2",
+]
+
+[[package]]
+name = "radroots_identity"
+version = "0.1.0-alpha"
+source = "git+https://github.com/radrootslabs/lib?rev=09065a610d95e57acdc895a14c07580fa099e7c3#09065a610d95e57acdc895a14c07580fa099e7c3"
+dependencies = [
+ "k256",
+ "serde",
+ "thiserror 2.0.19",
+]
+
+[[package]]
+name = "radroots_nostr"
+version = "0.1.0-alpha"
+source = "git+https://github.com/radrootslabs/lib?rev=09065a610d95e57acdc895a14c07580fa099e7c3#09065a610d95e57acdc895a14c07580fa099e7c3"
+dependencies = [
+ "nostr 0.44.8",
+ "radroots_event",
+ "radroots_event_codec",
+ "radroots_identity",
+ "serde",
+ "serde_json",
+ "thiserror 2.0.19",
+]
+
+[[package]]
+name = "radroots_protocol"
+version = "0.1.0-alpha"
+source = "git+https://github.com/radrootslabs/lib?rev=09065a610d95e57acdc895a14c07580fa099e7c3#09065a610d95e57acdc895a14c07580fa099e7c3"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "radroots_studio_application"
+version = "0.1.0-alpha"
+source = "git+https://github.com/radrootslabs/lib?rev=09065a610d95e57acdc895a14c07580fa099e7c3#09065a610d95e57acdc895a14c07580fa099e7c3"
+dependencies = [
+ "radroots_studio_domain",
"secrecy",
"tokio",
]
[[package]]
-name = "radroots-studio-domain"
+name = "radroots_studio_domain"
version = "0.1.0-alpha"
+source = "git+https://github.com/radrootslabs/lib?rev=09065a610d95e57acdc895a14c07580fa099e7c3#09065a610d95e57acdc895a14c07580fa099e7c3"
dependencies = [
"bech32",
+ "radroots_identity",
"secrecy",
"url",
"zeroize",
]
[[package]]
-name = "radroots-studio-ffi"
+name = "radroots_studio_ffi"
version = "0.1.0-alpha"
+source = "git+https://github.com/radrootslabs/lib?rev=09065a610d95e57acdc895a14c07580fa099e7c3#09065a610d95e57acdc895a14c07580fa099e7c3"
dependencies = [
"directories",
- "nostr",
- "nostr-relay-builder",
- "nostr-sdk",
- "radroots-studio-application",
- "radroots-studio-domain",
- "radroots-studio-storage",
- "tempfile",
+ "quote",
+ "radroots_studio_application",
+ "radroots_studio_domain",
+ "radroots_studio_nostr",
+ "radroots_studio_runtime",
+ "radroots_studio_storage",
+ "sha2",
+ "syn 2.0.119",
"tokio",
"uniffi",
]
[[package]]
-name = "radroots-studio-nostr"
+name = "radroots_studio_nostr"
version = "0.1.0-alpha"
+source = "git+https://github.com/radrootslabs/lib?rev=09065a610d95e57acdc895a14c07580fa099e7c3#09065a610d95e57acdc895a14c07580fa099e7c3"
+dependencies = [
+ "nostr 0.44.1",
+ "nostr-sdk 0.44.0",
+ "radroots_identity",
+ "radroots_studio_application",
+ "radroots_studio_domain",
+ "radroots_transport",
+ "radroots_transport_nostr",
+ "tokio",
+]
+
+[[package]]
+name = "radroots_studio_preferences"
+version = "0.1.0-alpha"
+source = "git+https://github.com/radrootslabs/lib?rev=09065a610d95e57acdc895a14c07580fa099e7c3#09065a610d95e57acdc895a14c07580fa099e7c3"
dependencies = [
- "nostr",
- "radroots-studio-domain",
+ "url",
]
[[package]]
-name = "radroots-studio-storage"
+name = "radroots_studio_runtime"
version = "0.1.0-alpha"
+source = "git+https://github.com/radrootslabs/lib?rev=09065a610d95e57acdc895a14c07580fa099e7c3#09065a610d95e57acdc895a14c07580fa099e7c3"
+dependencies = [
+ "radroots_studio_application",
+ "radroots_studio_domain",
+ "radroots_studio_nostr",
+ "radroots_studio_storage",
+ "tokio",
+ "uuid",
+]
+
+[[package]]
+name = "radroots_studio_source_lock"
+version = "0.1.0-alpha"
+dependencies = [
+ "radroots_studio_application",
+ "radroots_studio_domain",
+ "radroots_studio_ffi",
+ "radroots_studio_nostr",
+ "radroots_studio_preferences",
+ "radroots_studio_runtime",
+ "radroots_studio_storage",
+]
+
+[[package]]
+name = "radroots_studio_storage"
+version = "0.1.0-alpha"
+source = "git+https://github.com/radrootslabs/lib?rev=09065a610d95e57acdc895a14c07580fa099e7c3#09065a610d95e57acdc895a14c07580fa099e7c3"
dependencies = [
"fs2",
+ "getrandom 0.2.17",
+ "hmac",
"keyring",
- "nostr",
- "nostr-relay-builder",
- "nostr-sdk",
- "radroots-studio-application",
- "radroots-studio-domain",
+ "radroots_studio_application",
+ "radroots_studio_domain",
"refinery",
"rusqlite",
- "tempfile",
- "tokio",
+ "rustix",
+ "sha2",
"zeroize",
]
[[package]]
-name = "radroots-studio-uniffi-bindgen"
+name = "radroots_transport"
version = "0.1.0-alpha"
+source = "git+https://github.com/radrootslabs/lib?rev=09065a610d95e57acdc895a14c07580fa099e7c3#09065a610d95e57acdc895a14c07580fa099e7c3"
dependencies = [
- "uniffi",
+ "radroots_event",
+ "radroots_identity",
+ "radroots_protocol",
+ "sha2",
+]
+
+[[package]]
+name = "radroots_transport_nostr"
+version = "0.1.0-alpha"
+source = "git+https://github.com/radrootslabs/lib?rev=09065a610d95e57acdc895a14c07580fa099e7c3#09065a610d95e57acdc895a14c07580fa099e7c3"
+dependencies = [
+ "async-wsocket",
+ "nostr-relay-pool 0.44.3",
+ "nostr-sdk 0.44.1",
+ "radroots_event_codec",
+ "radroots_nostr",
+ "radroots_protocol",
+ "radroots_transport",
+ "serde_json",
+ "tokio",
+ "tokio-tungstenite",
+ "url",
]
[[package]]
@@ -1914,9 +2201,9 @@ dependencies = [
[[package]]
name = "regex-automata"
-version = "0.4.16"
+version = "0.4.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad"
+checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2"
dependencies = [
"aho-corasick",
"memchr",
@@ -1969,6 +2256,18 @@ dependencies = [
]
[[package]]
+name = "rust_decimal"
+version = "1.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be2a24f50780bc85f09cc6ac299bdf1424302742d77221106859c9d8b102126a"
+dependencies = [
+ "arrayvec",
+ "num-traits",
+ "serde",
+ "wasm-bindgen",
+]
+
+[[package]]
name = "rustc-demangle"
version = "0.1.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2084,6 +2383,19 @@ dependencies = [
]
[[package]]
+name = "sec1"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc"
+dependencies = [
+ "base16ct",
+ "der",
+ "generic-array",
+ "subtle",
+ "zeroize",
+]
+
+[[package]]
name = "secp256k1"
version = "0.29.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2324,12 +2636,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
[[package]]
-name = "strsim"
-version = "0.11.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
-
-[[package]]
name = "subtle"
version = "2.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2370,12 +2676,12 @@ dependencies = [
[[package]]
name = "tempfile"
-version = "3.23.0"
+version = "3.27.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16"
+checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd"
dependencies = [
"fastrand",
- "getrandom 0.3.4",
+ "getrandom 0.4.3",
"once_cell",
"rustix",
"windows-sys 0.61.2",
@@ -2671,6 +2977,18 @@ dependencies = [
]
[[package]]
+name = "unicode-bidi"
+version = "0.3.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5"
+
+[[package]]
+name = "unicode-general-category"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b993bddc193ae5bd0d623b49ec06ac3e9312875fdae725a975c51db1cc1677f"
+
+[[package]]
name = "unicode-ident"
version = "1.0.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2692,9 +3010,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a782a48d72cfd7a2d65cfc7c691dbf5375c43104b3c195f7eccc716dcc3540c8"
dependencies = [
"anyhow",
- "camino",
"cargo_metadata",
- "clap",
"uniffi_bindgen",
"uniffi_core",
"uniffi_macros",
@@ -2829,13 +3145,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed"
dependencies = [
"form_urlencoded",
- "idna",
+ "idna 1.1.0",
"percent-encoding",
"serde",
"serde_derive",
]
[[package]]
+name = "url-fork"
+version = "3.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fa3323c39b8e786154d3000b70ae9af0e9bd746c9791456da0d4a1f68ad89d6"
+dependencies = [
+ "form_urlencoded",
+ "idna 0.5.0",
+ "percent-encoding",
+ "serde",
+]
+
+[[package]]
name = "utf-8"
version = "0.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2853,6 +3181,7 @@ version = "1.24.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239"
dependencies = [
+ "getrandom 0.4.3",
"js-sys",
"serde_core",
"wasm-bindgen",
@@ -2904,6 +3233,7 @@ dependencies = [
"cfg-if",
"once_cell",
"rustversion",
+ "serde",
"wasm-bindgen-macro",
"wasm-bindgen-shared",
]
@@ -3246,18 +3576,18 @@ dependencies = [
[[package]]
name = "zerocopy"
-version = "0.8.55"
+version = "0.8.56"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b5a105cd7b140f6eeec8acff2ea38135d3cab283ada58540f629fe51e46696eb"
+checksum = "556764e583adb45a9f8d413c2a147fa7e8d821e48e12b14fd560b607998b75eb"
dependencies = [
"zerocopy-derive",
]
[[package]]
name = "zerocopy-derive"
-version = "0.8.55"
+version = "0.8.56"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0fe976fb70c78cd64cccfe3a6fc142244e8a77b70959b30faf9d0ac37ee228eb"
+checksum = "f2ab42fc20575779bd240faa45f94a74256f755c0fa9e89f0ede20d91d0cdfc1"
dependencies = [
"proc-macro2",
"quote",
diff --git a/core/Cargo.toml b/core/Cargo.toml
@@ -1,5 +1,6 @@
[workspace]
-members = [
+members = ["crates/source_lock"]
+exclude = [
"crates/application",
"crates/domain",
"crates/ffi",
@@ -14,7 +15,7 @@ version = "0.1.0-alpha"
edition = "2024"
rust-version = "1.97.1"
license = "GPL-3.0-only"
-repository = "https://github.com/radroots/studio_app"
+repository = "https://github.com/radrootslabs/studio_app"
[workspace.lints.rust]
unsafe_code = "forbid"
@@ -24,20 +25,10 @@ all = "deny"
pedantic = "deny"
[workspace.dependencies]
-bech32 = "=0.11.1"
-keyring = "=4.1.6"
-directories = "=6.0.0"
-fs2 = "=0.4.3"
-nostr = { git = "https://github.com/rust-nostr/nostr.git", rev = "5bba5163eb77107f82c4a8262cf29d7f33a73219", package = "nostr" }
-nostr-sdk = "=0.44.1"
-nostr-relay-builder = "=0.44.1"
-refinery = { version = "=0.9.2", default-features = false, features = ["rusqlite"] }
-rusqlite = { version = "=0.39.0", features = ["bundled"] }
-secrecy = "=0.10.3"
-url = "=2.5.8"
-zeroize = "=1.9.0"
-tokio = { version = "=1.47.1", features = ["macros", "rt-multi-thread", "sync", "time"] }
-uniffi = "=0.32.0"
-
-[patch.crates-io]
-nostr = { git = "https://github.com/rust-nostr/nostr.git", rev = "5bba5163eb77107f82c4a8262cf29d7f33a73219" }
+radroots_studio_application = { git = "https://github.com/radrootslabs/lib", rev = "09065a610d95e57acdc895a14c07580fa099e7c3", version = "=0.1.0-alpha" }
+radroots_studio_domain = { git = "https://github.com/radrootslabs/lib", rev = "09065a610d95e57acdc895a14c07580fa099e7c3", version = "=0.1.0-alpha" }
+radroots_studio_ffi = { git = "https://github.com/radrootslabs/lib", rev = "09065a610d95e57acdc895a14c07580fa099e7c3", version = "=0.1.0-alpha" }
+radroots_studio_nostr = { git = "https://github.com/radrootslabs/lib", rev = "09065a610d95e57acdc895a14c07580fa099e7c3", version = "=0.1.0-alpha" }
+radroots_studio_preferences = { git = "https://github.com/radrootslabs/lib", rev = "09065a610d95e57acdc895a14c07580fa099e7c3", version = "=0.1.0-alpha" }
+radroots_studio_runtime = { git = "https://github.com/radrootslabs/lib", rev = "09065a610d95e57acdc895a14c07580fa099e7c3", version = "=0.1.0-alpha" }
+radroots_studio_storage = { git = "https://github.com/radrootslabs/lib", rev = "09065a610d95e57acdc895a14c07580fa099e7c3", version = "=0.1.0-alpha" }
diff --git a/core/crates/source_lock/Cargo.toml b/core/crates/source_lock/Cargo.toml
@@ -0,0 +1,20 @@
+[package]
+name = "radroots_studio_source_lock"
+version.workspace = true
+edition.workspace = true
+rust-version.workspace = true
+license.workspace = true
+repository.workspace = true
+publish = false
+
+[dependencies]
+radroots_studio_application.workspace = true
+radroots_studio_domain.workspace = true
+radroots_studio_ffi.workspace = true
+radroots_studio_nostr.workspace = true
+radroots_studio_preferences.workspace = true
+radroots_studio_runtime.workspace = true
+radroots_studio_storage.workspace = true
+
+[lints]
+workspace = true
diff --git a/core/crates/source_lock/src/lib.rs b/core/crates/source_lock/src/lib.rs
@@ -0,0 +1 @@
+#![no_std]
diff --git a/radroots.lib.source-lock.v1.toml b/radroots.lib.source-lock.v1.toml
@@ -0,0 +1,9 @@
+schema = "radroots.lib.source-lock.v1"
+repository = "https://github.com/radrootslabs/lib"
+revision = "09065a610d95e57acdc895a14c07580fa099e7c3"
+architecture = "radroots.crates.release.v2"
+workspace_catalog_sha256 = "8c27cebf6825f9ed74e122513c661f6dd31837dddb39d0988014121d8ab05e75"
+version = "0.1.0-alpha"
+source_archive_sha256 = "68badd1fb02d9396682d368e62dfe79969d8da48529760789c823fb4ab54aea3"
+lockfile = "core/Cargo.lock"
+lockfile_sha256 = "f84789b2a890ae3cd082dbce464adb582c4ebd4dcebedf52c2381476294f633a"