Radish alpha
r
Radicle Job Collaborative Object
Radicle
Git (anonymous pull)
Log in to clone via SSH
chore: Update radicle to 0.24.0
Fintan Halpenny committed 13 days ago
commit 536de308967646831d81d2bc807f6cede24aaf99
parent 4d37a30cb38c5d818a2169f57d28b35a943dbe5e
5 files changed +784 -466
modified CHANGELOG.md
@@ -7,6 +7,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

+
### Breaking Changes
+

+
- Update to `radicle-0.24.0`. This update introduces the change of the
+
  `radicle::cob::store` API changes. The `Store` structure now requires an
+
  `Access` parameter. This is fulfilled by `access::ReadOnly` or
+
  `access::WriteAs`. `ReadOnly` is trivially constructed, and provides read
+
  access to `Jobs`. `WriteAs` is constructed with the signer of the node, and
+
  provides read and write access to `Jobs`. Since the signer is provided at
+
  construction, it is no longer needed to be passed into `Jobs` operations.
+
- The MSRV is updated to `1.86.0` due to transitive dependencies of
+
  `radicle-0.24.0`.
+

## 0.5.2

### Changes
modified Cargo.lock
@@ -39,13 +39,15 @@ dependencies = [

[[package]]
name = "amplify"
-
version = "4.8.1"
+
version = "4.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "3a9d7cb29f1d4c6ec8650abbee35948b8bdefb7f0750a26445ff593eb9bf7fcf"
+
checksum = "3f7fb4ac7c881e54a8e7015e399b6112a2a5bc958b6c89ac510840ff20273b31"
dependencies = [
 "amplify_derive",
 "amplify_num",
 "ascii",
+
 "getrandom 0.2.17",
+
 "getrandom 0.3.4",
 "wasm-bindgen",
]

@@ -83,9 +85,9 @@ dependencies = [

[[package]]
name = "anstream"
-
version = "0.6.19"
+
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933"
+
checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d"
dependencies = [
 "anstyle",
 "anstyle-parse",
@@ -98,33 +100,33 @@ dependencies = [

[[package]]
name = "anstyle"
-
version = "1.0.11"
+
version = "1.0.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd"
+
checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000"

[[package]]
name = "anstyle-parse"
-
version = "0.2.7"
+
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2"
+
checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e"
dependencies = [
 "utf8parse",
]

[[package]]
name = "anstyle-query"
-
version = "1.1.3"
+
version = "1.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9"
+
checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc"
dependencies = [
 "windows-sys",
]

[[package]]
name = "anstyle-wincon"
-
version = "3.0.9"
+
version = "3.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882"
+
checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d"
dependencies = [
 "anstyle",
 "once_cell_polyfill",
@@ -132,6 +134,12 @@ dependencies = [
]

[[package]]
+
name = "anyhow"
+
version = "1.0.102"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c"
+

+
[[package]]
name = "ascii"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -139,9 +147,9 @@ checksum = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16"

[[package]]
name = "autocfg"
-
version = "1.4.0"
+
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
+
checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"

[[package]]
name = "base-x"
@@ -156,10 +164,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf"

[[package]]
-
name = "base32"
-
version = "0.4.0"
+
name = "base256emoji"
+
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "23ce669cd6c8588f79e15cf450314f9638f967fc5770ff1c7c1deb0925ea7cfa"
+
checksum = "b5e9430d9a245a77c92176e649af6e275f20839a48389859d1661e9a128d077c"
+
dependencies = [
+
 "const-str",
+
 "match-lookup",
+
]

[[package]]
name = "base64"
@@ -169,9 +181,9 @@ checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"

[[package]]
name = "base64ct"
-
version = "1.7.3"
+
version = "1.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3"
+
checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06"

[[package]]
name = "bcrypt-pbkdf"
@@ -186,9 +198,9 @@ dependencies = [

[[package]]
name = "bitflags"
-
version = "2.9.0"
+
version = "2.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd"
+
checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3"

[[package]]
name = "block-buffer"
@@ -220,9 +232,9 @@ dependencies = [

[[package]]
name = "bumpalo"
-
version = "3.17.0"
+
version = "3.20.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf"
+
checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb"

[[package]]
name = "byteorder"
@@ -232,11 +244,11 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"

[[package]]
name = "bytesize"
-
version = "2.0.1"
+
version = "2.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "a3c8f83209414aacf0eeae3cf730b18d6981697fba62f200fcfb92b9f082acba"
+
checksum = "6bd91ee7b2422bcb158d90ef4d14f75ef67f340943fc4149891dcce8f8b972a3"
dependencies = [
-
 "serde",
+
 "serde_core",
]

[[package]]
@@ -250,10 +262,11 @@ dependencies = [

[[package]]
name = "cc"
-
version = "1.2.22"
+
version = "1.2.61"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "32db95edf998450acc7881c932f94cd9b05c87b4b2599e8bab064753da4acfd1"
+
checksum = "d16d90359e986641506914ba71350897565610e87ce0ad9e6f28569db3dd5c6d"
dependencies = [
+
 "find-msvc-tools",
 "jobserver",
 "libc",
 "shlex",
@@ -261,9 +274,9 @@ dependencies = [

[[package]]
name = "cfg-if"
-
version = "1.0.0"
+
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"

[[package]]
name = "chacha20"
@@ -278,9 +291,9 @@ dependencies = [

[[package]]
name = "chrono"
-
version = "0.4.42"
+
version = "0.4.44"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2"
+
checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0"
dependencies = [
 "num-traits",
]
@@ -297,9 +310,9 @@ dependencies = [

[[package]]
name = "clap"
-
version = "4.5.41"
+
version = "4.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "be92d32e80243a54711e5d7ce823c35c41c9d929dc4ab58e1276f625841aadf9"
+
checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51"
dependencies = [
 "clap_builder",
 "clap_derive",
@@ -307,9 +320,9 @@ dependencies = [

[[package]]
name = "clap_builder"
-
version = "4.5.41"
+
version = "4.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "707eab41e9622f9139419d573eca0900137718000c517d47da73045f54331c3d"
+
checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f"
dependencies = [
 "anstream",
 "anstyle",
@@ -320,27 +333,27 @@ dependencies = [

[[package]]
name = "clap_derive"
-
version = "4.5.41"
+
version = "4.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "ef4f52386a59ca4c860f7393bcf8abd8dfd91ecccc0f774635ff68e92eeef491"
+
checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9"
dependencies = [
 "heck",
 "proc-macro2",
 "quote",
-
 "syn 2.0.101",
+
 "syn 2.0.117",
]

[[package]]
name = "clap_lex"
-
version = "0.7.5"
+
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675"
+
checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9"

[[package]]
name = "colorchoice"
-
version = "1.0.4"
+
version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75"
+
checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570"

[[package]]
name = "const-oid"
@@ -349,6 +362,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8"

[[package]]
+
name = "const-str"
+
version = "0.4.3"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "2f421161cb492475f1661ddc9815a745a1c894592070661180fdec3d4872e9c3"
+

+
[[package]]
name = "cpufeatures"
version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -386,9 +405,9 @@ dependencies = [

[[package]]
name = "crypto-common"
-
version = "0.1.6"
+
version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
+
checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a"
dependencies = [
 "generic-array",
 "typenum",
@@ -396,9 +415,9 @@ dependencies = [

[[package]]
name = "ct-codecs"
-
version = "1.1.5"
+
version = "1.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "dd0d274c65cbc1c34703d2fc2ce0fb892ff68f4516b677671a2f238a30b9b2b2"
+
checksum = "9b10589d1a5e400d61f9f38f12f884cfd080ff345de8f17efda36fe0e4a02aa8"

[[package]]
name = "ctr"
@@ -410,22 +429,46 @@ dependencies = [
]

[[package]]
+
name = "curve25519-dalek"
+
version = "4.1.3"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be"
+
dependencies = [
+
 "cfg-if",
+
 "cpufeatures",
+
 "curve25519-dalek-derive",
+
 "digest",
+
 "fiat-crypto",
+
 "rustc_version",
+
 "subtle",
+
]
+

+
[[package]]
+
name = "curve25519-dalek-derive"
+
version = "0.1.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3"
+
dependencies = [
+
 "proc-macro2",
+
 "quote",
+
 "syn 2.0.117",
+
]
+

+
[[package]]
name = "cypheraddr"
-
version = "0.4.0"
+
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "ba5c54d2ad4ab9941383519471b75d12abc1a7b4779265e233168f2703a730d9"
+
checksum = "4204e8808fcdd40bed39e49371f13f56d6984c32bc03dcb577d2a40b989b9d68"
dependencies = [
 "amplify",
-
 "base32",
 "cyphergraphy",
-
 "sha3",
]

[[package]]
name = "cyphergraphy"
-
version = "0.3.0"
+
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "b67c16c8ef5ddcdab57aab83fd8e770540ea3682ccdae09642c63575b0da2184"
+
checksum = "f23b157ed1e424149e1af82c6ed8300d41941756f5e9841396fd987d946ab0fe"
dependencies = [
 "amplify",
 "ec25519",
@@ -433,9 +476,9 @@ dependencies = [

[[package]]
name = "cyphernet"
-
version = "0.5.2"
+
version = "0.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "ac949369884a7a1d802cc669821269c707be8cec4d65043382e253733d2e62e1"
+
checksum = "2de2031ff4b9fc77e4dad022047341b55d285398164cc698e4082f4754b2e684"
dependencies = [
 "cypheraddr",
 "cyphergraphy",
@@ -444,15 +487,15 @@ dependencies = [

[[package]]
name = "data-encoding"
-
version = "2.9.0"
+
version = "2.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476"
+
checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8"

[[package]]
name = "data-encoding-macro"
-
version = "0.1.18"
+
version = "0.1.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "47ce6c96ea0102f01122a185683611bd5ac8d99e62bc59dd12e6bda344ee673d"
+
checksum = "3259c913752a86488b501ed8680446a5ed2d5aeac6e596cb23ba3800768ea32c"
dependencies = [
 "data-encoding",
 "data-encoding-macro-internal",
@@ -460,12 +503,12 @@ dependencies = [

[[package]]
name = "data-encoding-macro-internal"
-
version = "0.1.16"
+
version = "0.1.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "8d162beedaa69905488a8da94f5ac3edb4dd4788b732fadb7bd120b2625c1976"
+
checksum = "ccc2776f0c61eca1ca32528f85548abd1a4be8fb53d1b21c013e4f18da1e7090"
dependencies = [
 "data-encoding",
-
 "syn 2.0.101",
+
 "syn 2.0.117",
]

[[package]]
@@ -504,7 +547,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
dependencies = [
 "proc-macro2",
 "quote",
-
 "syn 2.0.101",
+
 "syn 2.0.117",
]

[[package]]
@@ -526,8 +569,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bdfd533a2fc01178c738c99412ae1f7e1ad2cb37c2e14bfd87e9d4618171c825"
dependencies = [
 "ct-codecs",
-
 "ed25519",
-
 "getrandom 0.2.16",
+
 "ed25519 1.5.3",
+
 "getrandom 0.2.17",
]

[[package]]
@@ -554,6 +597,27 @@ dependencies = [
]

[[package]]
+
name = "ed25519"
+
version = "2.2.3"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53"
+
dependencies = [
+
 "signature 2.2.0",
+
]
+

+
[[package]]
+
name = "ed25519-dalek"
+
version = "2.2.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9"
+
dependencies = [
+
 "curve25519-dalek",
+
 "ed25519 2.2.3",
+
 "sha2",
+
 "subtle",
+
]
+

+
[[package]]
name = "elliptic-curve"
version = "0.13.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -580,19 +644,20 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"

[[package]]
name = "erased-serde"
-
version = "0.4.6"
+
version = "0.4.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "e004d887f51fcb9fef17317a2f3525c887d8aa3f4f50fed920816a688284a5b7"
+
checksum = "d2add8a07dd6a8d93ff627029c51de145e12686fbc36ecb298ac22e74cf02dec"
dependencies = [
 "serde",
+
 "serde_core",
 "typeid",
]

[[package]]
name = "errno"
-
version = "0.3.11"
+
version = "0.3.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e"
+
checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
dependencies = [
 "libc",
 "windows-sys",
@@ -606,9 +671,9 @@ checksum = "3afcf4effa2c44390b9912544582d5af29e10dc4c816c5dbebf748e1c7416faa"

[[package]]
name = "fastrand"
-
version = "2.3.0"
+
version = "2.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
+
checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6"

[[package]]
name = "ff"
@@ -621,10 +686,28 @@ dependencies = [
]

[[package]]
+
name = "fiat-crypto"
+
version = "0.2.9"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d"
+

+
[[package]]
+
name = "find-msvc-tools"
+
version = "0.1.9"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582"
+

+
[[package]]
+
name = "foldhash"
+
version = "0.1.5"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
+

+
[[package]]
name = "form_urlencoded"
-
version = "1.2.1"
+
version = "1.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456"
+
checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf"
dependencies = [
 "percent-encoding",
]
@@ -642,25 +725,42 @@ dependencies = [

[[package]]
name = "getrandom"
-
version = "0.2.16"
+
version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592"
+
checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0"
dependencies = [
 "cfg-if",
+
 "js-sys",
 "libc",
-
 "wasi 0.11.0+wasi-snapshot-preview1",
+
 "wasi",
+
 "wasm-bindgen",
]

[[package]]
name = "getrandom"
-
version = "0.3.3"
+
version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4"
+
checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd"
dependencies = [
 "cfg-if",
+
 "js-sys",
 "libc",
-
 "r-efi",
-
 "wasi 0.14.2+wasi-0.2.4",
+
 "r-efi 5.3.0",
+
 "wasip2",
+
 "wasm-bindgen",
+
]
+

+
[[package]]
+
name = "getrandom"
+
version = "0.4.2"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555"
+
dependencies = [
+
 "cfg-if",
+
 "libc",
+
 "r-efi 6.0.0",
+
 "wasip2",
+
 "wasip3",
]

[[package]]
@@ -709,9 +809,18 @@ dependencies = [

[[package]]
name = "hashbrown"
-
version = "0.15.3"
+
version = "0.15.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3"
+
checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1"
+
dependencies = [
+
 "foldhash",
+
]
+

+
[[package]]
+
name = "hashbrown"
+
version = "0.17.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51"

[[package]]
name = "heck"
@@ -730,12 +839,13 @@ dependencies = [

[[package]]
name = "icu_collections"
-
version = "2.0.0"
+
version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47"
+
checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c"
dependencies = [
 "displaydoc",
 "potential_utf",
+
 "utf8_iter",
 "yoke",
 "zerofrom",
 "zerovec",
@@ -743,9 +853,9 @@ dependencies = [

[[package]]
name = "icu_locale_core"
-
version = "2.0.0"
+
version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a"
+
checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29"
dependencies = [
 "displaydoc",
 "litemap",
@@ -756,11 +866,10 @@ dependencies = [

[[package]]
name = "icu_normalizer"
-
version = "2.0.0"
+
version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979"
+
checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4"
dependencies = [
-
 "displaydoc",
 "icu_collections",
 "icu_normalizer_data",
 "icu_properties",
@@ -771,42 +880,38 @@ dependencies = [

[[package]]
name = "icu_normalizer_data"
-
version = "2.0.0"
+
version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3"
+
checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38"

[[package]]
name = "icu_properties"
-
version = "2.0.0"
+
version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "2549ca8c7241c82f59c80ba2a6f415d931c5b58d24fb8412caa1a1f02c49139a"
+
checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de"
dependencies = [
-
 "displaydoc",
 "icu_collections",
 "icu_locale_core",
 "icu_properties_data",
 "icu_provider",
-
 "potential_utf",
 "zerotrie",
 "zerovec",
]

[[package]]
name = "icu_properties_data"
-
version = "2.0.0"
+
version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "8197e866e47b68f8f7d95249e172903bec06004b18b2937f1095d40a0c57de04"
+
checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14"

[[package]]
name = "icu_provider"
-
version = "2.0.0"
+
version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af"
+
checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421"
dependencies = [
 "displaydoc",
 "icu_locale_core",
-
 "stable_deref_trait",
-
 "tinystr",
 "writeable",
 "yoke",
 "zerofrom",
@@ -815,10 +920,16 @@ dependencies = [
]

[[package]]
+
name = "id-arena"
+
version = "2.3.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954"
+

+
[[package]]
name = "idna"
-
version = "1.0.3"
+
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e"
+
checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de"
dependencies = [
 "idna_adapter",
 "smallvec",
@@ -837,13 +948,14 @@ dependencies = [

[[package]]
name = "indexmap"
-
version = "2.9.0"
+
version = "2.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e"
+
checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9"
dependencies = [
 "equivalent",
-
 "hashbrown",
+
 "hashbrown 0.17.0",
 "serde",
+
 "serde_core",
]

[[package]]
@@ -858,33 +970,34 @@ dependencies = [

[[package]]
name = "is_terminal_polyfill"
-
version = "1.70.1"
+
version = "1.70.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf"
+
checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695"

[[package]]
name = "itoa"
-
version = "1.0.15"
+
version = "1.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
+
checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"

[[package]]
name = "jobserver"
-
version = "0.1.33"
+
version = "0.1.34"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a"
+
checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33"
dependencies = [
-
 "getrandom 0.3.3",
+
 "getrandom 0.3.4",
 "libc",
]

[[package]]
-
name = "keccak"
-
version = "0.1.5"
+
name = "js-sys"
+
version = "0.3.95"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654"
+
checksum = "2964e92d1d9dc3364cae4d718d93f227e3abb088e747d92e0395bfdedf1c12ca"
dependencies = [
-
 "cpufeatures",
+
 "once_cell",
+
 "wasm-bindgen",
]

[[package]]
@@ -897,10 +1010,16 @@ dependencies = [
]

[[package]]
+
name = "leb128fmt"
+
version = "0.1.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
+

+
[[package]]
name = "libc"
-
version = "0.2.172"
+
version = "0.2.186"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa"
+
checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66"

[[package]]
name = "libgit2-sys"
@@ -916,15 +1035,15 @@ dependencies = [

[[package]]
name = "libm"
-
version = "0.2.15"
+
version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de"
+
checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981"

[[package]]
name = "libz-sys"
-
version = "1.1.22"
+
version = "1.1.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "8b70e7a7df205e92a1a4cd9aaae7898dac0aa555503cc0a649494d0d60e7651d"
+
checksum = "fc3a226e576f50782b3305c5ccf458698f92798987f551c6a02efe8276721e22"
dependencies = [
 "cc",
 "libc",
@@ -934,27 +1053,38 @@ dependencies = [

[[package]]
name = "linux-raw-sys"
-
version = "0.9.4"
+
version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12"
+
checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53"

[[package]]
name = "litemap"
-
version = "0.8.0"
+
version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956"
+
checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0"

[[package]]
name = "log"
-
version = "0.4.27"
+
version = "0.4.29"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94"
+
checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
+

+
[[package]]
+
name = "match-lookup"
+
version = "0.1.2"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "757aee279b8bdbb9f9e676796fd459e4207a1f986e87886700abf589f5abf771"
+
dependencies = [
+
 "proc-macro2",
+
 "quote",
+
 "syn 2.0.117",
+
]

[[package]]
name = "memchr"
-
version = "2.7.4"
+
version = "2.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
+
checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79"

[[package]]
name = "memoffset"
@@ -967,11 +1097,12 @@ dependencies = [

[[package]]
name = "multibase"
-
version = "0.9.1"
+
version = "0.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "9b3539ec3c1f04ac9748a260728e855f261b4977f5c3406612c884564f329404"
+
checksum = "8694bb4835f452b0e3bb06dbebb1d6fc5385b6ca1caf2e55fd165c042390ec77"
dependencies = [
 "base-x",
+
 "base256emoji",
 "data-encoding",
 "data-encoding-macro",
]
@@ -993,11 +1124,10 @@ checksum = "549e471b99ccaf2f89101bec68f4d244457d5a95a9c3d0672e9564124397741d"

[[package]]
name = "num-bigint-dig"
-
version = "0.8.4"
+
version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151"
+
checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7"
dependencies = [
-
 "byteorder",
 "lazy_static",
 "libm",
 "num-integer",
@@ -1040,15 +1170,15 @@ dependencies = [

[[package]]
name = "once_cell"
-
version = "1.21.3"
+
version = "1.21.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
+
checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"

[[package]]
name = "once_cell_polyfill"
-
version = "1.70.1"
+
version = "1.70.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad"
+
checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"

[[package]]
name = "opaque-debug"
@@ -1114,9 +1244,9 @@ dependencies = [

[[package]]
name = "percent-encoding"
-
version = "2.3.1"
+
version = "2.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
+
checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"

[[package]]
name = "pkcs1"
@@ -1141,9 +1271,9 @@ dependencies = [

[[package]]
name = "pkg-config"
-
version = "0.3.32"
+
version = "0.3.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c"
+
checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e"

[[package]]
name = "poly1305"
@@ -1170,9 +1300,9 @@ dependencies = [

[[package]]
name = "potential_utf"
-
version = "0.1.2"
+
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585"
+
checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564"
dependencies = [
 "zerovec",
]
@@ -1187,6 +1317,16 @@ dependencies = [
]

[[package]]
+
name = "prettyplease"
+
version = "0.2.37"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b"
+
dependencies = [
+
 "proc-macro2",
+
 "syn 2.0.117",
+
]
+

+
[[package]]
name = "primeorder"
version = "0.13.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1197,9 +1337,9 @@ dependencies = [

[[package]]
name = "proc-macro2"
-
version = "1.0.95"
+
version = "1.0.106"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778"
+
checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
dependencies = [
 "unicode-ident",
]
@@ -1215,24 +1355,30 @@ dependencies = [

[[package]]
name = "quote"
-
version = "1.0.40"
+
version = "1.0.45"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d"
+
checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924"
dependencies = [
 "proc-macro2",
]

[[package]]
name = "r-efi"
-
version = "5.2.0"
+
version = "5.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5"
+
checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
+

+
[[package]]
+
name = "r-efi"
+
version = "6.0.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf"

[[package]]
name = "radicle"
-
version = "0.22.1"
+
version = "0.24.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "31fcfcac7b87b1a3677dccae9979046b949fb529d3061214c55b82d643c3b39a"
+
checksum = "0c07a8a270e9b1b8064a33f0aa78b4fd39924ce4d31e0715659a923917e07b46"
dependencies = [
 "amplify",
 "base64",
@@ -1246,33 +1392,31 @@ dependencies = [
 "indexmap",
 "libc",
 "log",
-
 "multibase",
 "nonempty 0.9.0",
 "qcheck",
 "radicle-cob",
 "radicle-core",
 "radicle-crypto",
-
 "radicle-git-metadata 0.2.0",
+
 "radicle-git-metadata",
 "radicle-git-ref-format",
 "radicle-localtime",
 "radicle-oid",
-
 "radicle-ssh",
 "serde",
 "serde-untagged",
 "serde_json",
 "siphasher",
 "sqlite",
 "tempfile",
-
 "thiserror 2.0.12",
+
 "thiserror 2.0.18",
 "uds_windows",
 "unicode-normalization",
]

[[package]]
name = "radicle-cob"
-
version = "0.19.0"
+
version = "0.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "cd49b584b0a61cba52cfd8ec873bb5f3cbc50763d020a4c333aeffa95a5c839e"
+
checksum = "59e5d3e54429dff785bee3f80b334d67b701f4bd66b7e825d1b4efa8435bba74"
dependencies = [
 "fastrand",
 "git-ref-format-core",
@@ -1281,19 +1425,19 @@ dependencies = [
 "nonempty 0.9.0",
 "radicle-crypto",
 "radicle-dag",
-
 "radicle-git-metadata 0.1.0",
+
 "radicle-git-metadata",
 "radicle-oid",
 "serde",
 "serde_json",
 "signature 2.2.0",
-
 "thiserror 2.0.12",
+
 "thiserror 2.0.18",
]

[[package]]
name = "radicle-core"
-
version = "0.2.0"
+
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "617b55b262b946470a355052a6d72c7f8efc724b8d8068021234cda74df7dd30"
+
checksum = "656cf8f177c04702ac4b4702e622c75a370da0634f925c56c10cab5cadf7487f"
dependencies = [
 "git2",
 "multibase",
@@ -1303,14 +1447,14 @@ dependencies = [
 "schemars",
 "serde",
 "sqlite",
-
 "thiserror 2.0.12",
+
 "thiserror 2.0.18",
]

[[package]]
name = "radicle-crypto"
-
version = "0.16.0"
+
version = "0.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "f77cf406d3e448de958e3a821bb09612bb2f97ac1dbb2ee314b59264cde8281d"
+
checksum = "514c5e0c63134b80da4cbcca9a22f7b5cdd741ec63c6acce16ad9389b0f0cd6e"
dependencies = [
 "amplify",
 "cyphernet",
@@ -1319,12 +1463,13 @@ dependencies = [
 "git-ref-format-core",
 "multibase",
 "qcheck",
-
 "radicle-ssh",
 "serde",
 "signature 2.2.0",
 "sqlite",
+
 "ssh-agent-lib",
 "ssh-key",
-
 "thiserror 2.0.12",
+
 "thiserror 2.0.18",
+
 "winpipe",
 "zeroize",
]

@@ -1339,20 +1484,11 @@ dependencies = [

[[package]]
name = "radicle-git-metadata"
-
version = "0.1.0"
-
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "522d7fa07dfe61981b5d96e9aeb2b7fb2f4a8d5804638e928eaedb33e423eccb"
-
dependencies = [
-
 "thiserror 2.0.12",
-
]
-

-
[[package]]
-
name = "radicle-git-metadata"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "db7817cae00f00f0e9a804b08e32d7846e97ae66fff8114d5a0d8c848de80ad5"
dependencies = [
-
 "thiserror 2.0.12",
+
 "thiserror 2.0.18",
]

[[package]]
@@ -1377,7 +1513,7 @@ dependencies = [
 "radicle",
 "serde",
 "serde_json",
-
 "thiserror 2.0.12",
+
 "thiserror 2.0.18",
 "url",
 "uuid",
]
@@ -1393,30 +1529,20 @@ dependencies = [

[[package]]
name = "radicle-oid"
-
version = "0.1.0"
+
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "d95c486f589d4f5ef7bd8fce56419854d90cc63a8bbcebe021e0a4f4cca75ac9"
+
checksum = "e60c3fab5115369bee5b757dab3ba9b93825236d3edde230742becb36ba0930a"
dependencies = [
 "git2",
+
 "qcheck",
 "serde",
]

[[package]]
-
name = "radicle-ssh"
-
version = "0.10.0"
-
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "216e9e1259d8c857cdb38b2f832fb117e8e26478f110b9a2690bca20b87ec9c5"
-
dependencies = [
-
 "thiserror 1.0.69",
-
 "winpipe",
-
 "zeroize",
-
]
-

-
[[package]]
name = "rand"
-
version = "0.8.5"
+
version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
+
checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a"
dependencies = [
 "libc",
 "rand_chacha",
@@ -1439,7 +1565,7 @@ version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
dependencies = [
-
 "getrandom 0.2.16",
+
 "getrandom 0.2.17",
]

[[package]]
@@ -1459,7 +1585,7 @@ checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da"
dependencies = [
 "proc-macro2",
 "quote",
-
 "syn 2.0.101",
+
 "syn 2.0.117",
]

[[package]]
@@ -1474,9 +1600,9 @@ dependencies = [

[[package]]
name = "rsa"
-
version = "0.9.8"
+
version = "0.9.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "78928ac1ed176a5ca1d17e578a1825f3d81ca54cf41053a592584b020cfd691b"
+
checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d"
dependencies = [
 "const-oid",
 "digest",
@@ -1494,10 +1620,19 @@ dependencies = [
]

[[package]]
+
name = "rustc_version"
+
version = "0.4.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92"
+
dependencies = [
+
 "semver",
+
]
+

+
[[package]]
name = "rustix"
-
version = "1.0.7"
+
version = "1.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266"
+
checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190"
dependencies = [
 "bitflags",
 "errno",
@@ -1508,15 +1643,9 @@ dependencies = [

[[package]]
name = "rustversion"
-
version = "1.0.20"
-
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2"
-

-
[[package]]
-
name = "ryu"
-
version = "1.0.20"
+
version = "1.0.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
+
checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"

[[package]]
name = "schemars"
@@ -1540,7 +1669,7 @@ dependencies = [
 "proc-macro2",
 "quote",
 "serde_derive_internals",
-
 "syn 2.0.101",
+
 "syn 2.0.117",
]

[[package]]
@@ -1558,34 +1687,60 @@ dependencies = [
]

[[package]]
+
name = "secrecy"
+
version = "0.10.3"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "e891af845473308773346dc847b2c23ee78fe442e0472ac50e22a18a93d3ae5a"
+
dependencies = [
+
 "zeroize",
+
]
+

+
[[package]]
+
name = "semver"
+
version = "1.0.28"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd"
+

+
[[package]]
name = "serde"
-
version = "1.0.219"
+
version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6"
+
checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
dependencies = [
+
 "serde_core",
 "serde_derive",
]

[[package]]
name = "serde-untagged"
-
version = "0.1.7"
+
version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "299d9c19d7d466db4ab10addd5703e4c615dec2a5a16dbbafe191045e87ee66e"
+
checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058"
dependencies = [
 "erased-serde",
 "serde",
+
 "serde_core",
 "typeid",
]

[[package]]
+
name = "serde_core"
+
version = "1.0.228"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
+
dependencies = [
+
 "serde_derive",
+
]
+

+
[[package]]
name = "serde_derive"
-
version = "1.0.219"
+
version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00"
+
checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
dependencies = [
 "proc-macro2",
 "quote",
-
 "syn 2.0.101",
+
 "syn 2.0.117",
]

[[package]]
@@ -1596,20 +1751,21 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711"
dependencies = [
 "proc-macro2",
 "quote",
-
 "syn 2.0.101",
+
 "syn 2.0.117",
]

[[package]]
name = "serde_json"
-
version = "1.0.140"
+
version = "1.0.149"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373"
+
checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86"
dependencies = [
 "indexmap",
 "itoa",
 "memchr",
-
 "ryu",
 "serde",
+
 "serde_core",
+
 "zmij",
]

[[package]]
@@ -1624,16 +1780,6 @@ dependencies = [
]

[[package]]
-
name = "sha3"
-
version = "0.10.8"
-
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60"
-
dependencies = [
-
 "digest",
-
 "keccak",
-
]
-

-
[[package]]
name = "shlex"
version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1657,21 +1803,21 @@ dependencies = [

[[package]]
name = "siphasher"
-
version = "1.0.1"
+
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d"
+
checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e"

[[package]]
name = "smallvec"
-
version = "1.15.0"
+
version = "1.15.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9"
+
checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"

[[package]]
name = "socks5-client"
-
version = "0.4.1"
+
version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "ffc7dcf6fab1d65d82d633006a4cc658d76ce436e01cf1a7c71873c0eeba324c"
+
checksum = "a87421b87207f5d39606da1ac9edd9a5333f4809d26a1fa9bbac58ca42913535"
dependencies = [
 "amplify",
 "cypheraddr",
@@ -1722,6 +1868,22 @@ dependencies = [
]

[[package]]
+
name = "ssh-agent-lib"
+
version = "0.5.2"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "f3d0582e6e5724c4a5d038472976e8fad64d824b3de37210aa60c35883e3e766"
+
dependencies = [
+
 "byteorder",
+
 "log",
+
 "secrecy",
+
 "signature 2.2.0",
+
 "ssh-encoding",
+
 "ssh-key",
+
 "subtle",
+
 "thiserror 2.0.18",
+
]
+

+
[[package]]
name = "ssh-cipher"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1756,6 +1918,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3b86f5297f0f04d08cabaa0f6bff7cb6aec4d9c3b49d87990d63da9d9156a8c3"
dependencies = [
 "bcrypt-pbkdf",
+
 "ed25519-dalek",
+
 "num-bigint-dig",
 "p256",
 "p384",
 "p521",
@@ -1772,9 +1936,9 @@ dependencies = [

[[package]]
name = "stable_deref_trait"
-
version = "1.2.0"
+
version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
+
checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"

[[package]]
name = "strsim"
@@ -1801,9 +1965,9 @@ dependencies = [

[[package]]
name = "syn"
-
version = "2.0.101"
+
version = "2.0.117"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf"
+
checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99"
dependencies = [
 "proc-macro2",
 "quote",
@@ -1824,17 +1988,17 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
dependencies = [
 "proc-macro2",
 "quote",
-
 "syn 2.0.101",
+
 "syn 2.0.117",
]

[[package]]
name = "tempfile"
-
version = "3.20.0"
+
version = "3.27.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1"
+
checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd"
dependencies = [
 "fastrand",
-
 "getrandom 0.3.3",
+
 "getrandom 0.4.2",
 "once_cell",
 "rustix",
 "windows-sys",
@@ -1842,9 +2006,9 @@ dependencies = [

[[package]]
name = "terminal_size"
-
version = "0.4.2"
+
version = "0.4.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "45c6481c4829e4cc63825e62c49186a34538b7b2750b73b266581ffb612fb5ed"
+
checksum = "230a1b821ccbd75b185820a1f1ff7b14d21da1e442e22c0863ea5f08771a8874"
dependencies = [
 "rustix",
 "windows-sys",
@@ -1861,11 +2025,11 @@ dependencies = [

[[package]]
name = "thiserror"
-
version = "2.0.12"
+
version = "2.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708"
+
checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4"
dependencies = [
-
 "thiserror-impl 2.0.12",
+
 "thiserror-impl 2.0.18",
]

[[package]]
@@ -1876,25 +2040,25 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
dependencies = [
 "proc-macro2",
 "quote",
-
 "syn 2.0.101",
+
 "syn 2.0.117",
]

[[package]]
name = "thiserror-impl"
-
version = "2.0.12"
+
version = "2.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d"
+
checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5"
dependencies = [
 "proc-macro2",
 "quote",
-
 "syn 2.0.101",
+
 "syn 2.0.117",
]

[[package]]
name = "tinystr"
-
version = "0.8.1"
+
version = "0.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b"
+
checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d"
dependencies = [
 "displaydoc",
 "zerovec",
@@ -1902,9 +2066,9 @@ dependencies = [

[[package]]
name = "tinyvec"
-
version = "1.9.0"
+
version = "1.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71"
+
checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3"
dependencies = [
 "tinyvec_macros",
]
@@ -1923,15 +2087,15 @@ checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c"

[[package]]
name = "typenum"
-
version = "1.18.0"
+
version = "1.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f"
+
checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de"

[[package]]
name = "uds_windows"
-
version = "1.2.0"
+
version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "51b70b87d15e91f553711b40df3048faf27a7a04e01e0ddc0cf9309f0af7c2ca"
+
checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e"
dependencies = [
 "memoffset",
 "tempfile",
@@ -1940,20 +2104,26 @@ dependencies = [

[[package]]
name = "unicode-ident"
-
version = "1.0.18"
+
version = "1.0.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"
+
checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"

[[package]]
name = "unicode-normalization"
-
version = "0.1.24"
+
version = "0.1.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956"
+
checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8"
dependencies = [
 "tinyvec",
]

[[package]]
+
name = "unicode-xid"
+
version = "0.2.6"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
+

+
[[package]]
name = "universal-hash"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1965,14 +2135,15 @@ dependencies = [

[[package]]
name = "url"
-
version = "2.5.4"
+
version = "2.5.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60"
+
checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed"
dependencies = [
 "form_urlencoded",
 "idna",
 "percent-encoding",
 "serde",
+
 "serde_derive",
]

[[package]]
@@ -1989,12 +2160,14 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"

[[package]]
name = "uuid"
-
version = "1.16.0"
+
version = "1.23.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9"
+
checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76"
dependencies = [
-
 "getrandom 0.3.3",
-
 "serde",
+
 "getrandom 0.4.2",
+
 "js-sys",
+
 "serde_core",
+
 "wasm-bindgen",
]

[[package]]
@@ -2011,50 +2184,46 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"

[[package]]
name = "wasi"
-
version = "0.11.0+wasi-snapshot-preview1"
+
version = "0.11.1+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+
checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"

[[package]]
-
name = "wasi"
-
version = "0.14.2+wasi-0.2.4"
+
name = "wasip2"
+
version = "1.0.3+wasi-0.2.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3"
+
checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6"
dependencies = [
-
 "wit-bindgen-rt",
+
 "wit-bindgen 0.57.1",
]

[[package]]
-
name = "wasm-bindgen"
-
version = "0.2.100"
+
name = "wasip3"
+
version = "0.4.0+wasi-0.3.0-rc-2026-01-06"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
+
checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5"
dependencies = [
-
 "cfg-if",
-
 "once_cell",
-
 "rustversion",
-
 "wasm-bindgen-macro",
+
 "wit-bindgen 0.51.0",
]

[[package]]
-
name = "wasm-bindgen-backend"
-
version = "0.2.100"
+
name = "wasm-bindgen"
+
version = "0.2.118"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
+
checksum = "0bf938a0bacb0469e83c1e148908bd7d5a6010354cf4fb73279b7447422e3a89"
dependencies = [
-
 "bumpalo",
-
 "log",
-
 "proc-macro2",
-
 "quote",
-
 "syn 2.0.101",
+
 "cfg-if",
+
 "once_cell",
+
 "rustversion",
+
 "wasm-bindgen-macro",
 "wasm-bindgen-shared",
]

[[package]]
name = "wasm-bindgen-macro"
-
version = "0.2.100"
+
version = "0.2.118"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
+
checksum = "eeff24f84126c0ec2db7a449f0c2ec963c6a49efe0698c4242929da037ca28ed"
dependencies = [
 "quote",
 "wasm-bindgen-macro-support",
@@ -2062,27 +2231,61 @@ dependencies = [

[[package]]
name = "wasm-bindgen-macro-support"
-
version = "0.2.100"
+
version = "0.2.118"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
+
checksum = "9d08065faf983b2b80a79fd87d8254c409281cf7de75fc4b773019824196c904"
dependencies = [
+
 "bumpalo",
 "proc-macro2",
 "quote",
-
 "syn 2.0.101",
-
 "wasm-bindgen-backend",
+
 "syn 2.0.117",
 "wasm-bindgen-shared",
]

[[package]]
name = "wasm-bindgen-shared"
-
version = "0.2.100"
+
version = "0.2.118"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
+
checksum = "5fd04d9e306f1907bd13c6361b5c6bfc7b3b3c095ed3f8a9246390f8dbdee129"
dependencies = [
 "unicode-ident",
]

[[package]]
+
name = "wasm-encoder"
+
version = "0.244.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319"
+
dependencies = [
+
 "leb128fmt",
+
 "wasmparser",
+
]
+

+
[[package]]
+
name = "wasm-metadata"
+
version = "0.244.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909"
+
dependencies = [
+
 "anyhow",
+
 "indexmap",
+
 "wasm-encoder",
+
 "wasmparser",
+
]
+

+
[[package]]
+
name = "wasmparser"
+
version = "0.244.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe"
+
dependencies = [
+
 "bitflags",
+
 "hashbrown 0.15.5",
+
 "indexmap",
+
 "semver",
+
]
+

+
[[package]]
name = "windows"
version = "0.58.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2113,7 +2316,7 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b"
dependencies = [
 "proc-macro2",
 "quote",
-
 "syn 2.0.101",
+
 "syn 2.0.117",
]

[[package]]
@@ -2124,10 +2327,16 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515"
dependencies = [
 "proc-macro2",
 "quote",
-
 "syn 2.0.101",
+
 "syn 2.0.117",
]

[[package]]
+
name = "windows-link"
+
version = "0.2.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
+

+
[[package]]
name = "windows-result"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2148,11 +2357,11 @@ dependencies = [

[[package]]
name = "windows-sys"
-
version = "0.59.0"
+
version = "0.61.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
+
checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
dependencies = [
-
 "windows-targets",
+
 "windows-link",
]

[[package]]
@@ -2233,27 +2442,111 @@ dependencies = [
]

[[package]]
-
name = "wit-bindgen-rt"
-
version = "0.39.0"
+
name = "wit-bindgen"
+
version = "0.51.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5"
+
dependencies = [
+
 "wit-bindgen-rust-macro",
+
]
+

+
[[package]]
+
name = "wit-bindgen"
+
version = "0.57.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e"
+

+
[[package]]
+
name = "wit-bindgen-core"
+
version = "0.51.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc"
+
dependencies = [
+
 "anyhow",
+
 "heck",
+
 "wit-parser",
+
]
+

+
[[package]]
+
name = "wit-bindgen-rust"
+
version = "0.51.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1"
+
checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21"
dependencies = [
+
 "anyhow",
+
 "heck",
+
 "indexmap",
+
 "prettyplease",
+
 "syn 2.0.117",
+
 "wasm-metadata",
+
 "wit-bindgen-core",
+
 "wit-component",
+
]
+

+
[[package]]
+
name = "wit-bindgen-rust-macro"
+
version = "0.51.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a"
+
dependencies = [
+
 "anyhow",
+
 "prettyplease",
+
 "proc-macro2",
+
 "quote",
+
 "syn 2.0.117",
+
 "wit-bindgen-core",
+
 "wit-bindgen-rust",
+
]
+

+
[[package]]
+
name = "wit-component"
+
version = "0.244.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2"
+
dependencies = [
+
 "anyhow",
 "bitflags",
+
 "indexmap",
+
 "log",
+
 "serde",
+
 "serde_derive",
+
 "serde_json",
+
 "wasm-encoder",
+
 "wasm-metadata",
+
 "wasmparser",
+
 "wit-parser",
+
]
+

+
[[package]]
+
name = "wit-parser"
+
version = "0.244.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736"
+
dependencies = [
+
 "anyhow",
+
 "id-arena",
+
 "indexmap",
+
 "log",
+
 "semver",
+
 "serde",
+
 "serde_derive",
+
 "serde_json",
+
 "unicode-xid",
+
 "wasmparser",
]

[[package]]
name = "writeable"
-
version = "0.6.1"
+
version = "0.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb"
+
checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4"

[[package]]
name = "yoke"
-
version = "0.8.0"
+
version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc"
+
checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca"
dependencies = [
-
 "serde",
 "stable_deref_trait",
 "yoke-derive",
 "zerofrom",
@@ -2261,68 +2554,68 @@ dependencies = [

[[package]]
name = "yoke-derive"
-
version = "0.8.0"
+
version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6"
+
checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e"
dependencies = [
 "proc-macro2",
 "quote",
-
 "syn 2.0.101",
+
 "syn 2.0.117",
 "synstructure",
]

[[package]]
name = "zerocopy"
-
version = "0.8.25"
+
version = "0.8.48"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb"
+
checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9"
dependencies = [
 "zerocopy-derive",
]

[[package]]
name = "zerocopy-derive"
-
version = "0.8.25"
+
version = "0.8.48"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef"
+
checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4"
dependencies = [
 "proc-macro2",
 "quote",
-
 "syn 2.0.101",
+
 "syn 2.0.117",
]

[[package]]
name = "zerofrom"
-
version = "0.1.6"
+
version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5"
+
checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df"
dependencies = [
 "zerofrom-derive",
]

[[package]]
name = "zerofrom-derive"
-
version = "0.1.6"
+
version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502"
+
checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1"
dependencies = [
 "proc-macro2",
 "quote",
-
 "syn 2.0.101",
+
 "syn 2.0.117",
 "synstructure",
]

[[package]]
name = "zeroize"
-
version = "1.8.1"
+
version = "1.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde"
+
checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0"

[[package]]
name = "zerotrie"
-
version = "0.2.2"
+
version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595"
+
checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf"
dependencies = [
 "displaydoc",
 "yoke",
@@ -2331,9 +2624,9 @@ dependencies = [

[[package]]
name = "zerovec"
-
version = "0.11.2"
+
version = "0.11.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428"
+
checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239"
dependencies = [
 "yoke",
 "zerofrom",
@@ -2342,11 +2635,17 @@ dependencies = [

[[package]]
name = "zerovec-derive"
-
version = "0.11.1"
+
version = "0.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f"
+
checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555"
dependencies = [
 "proc-macro2",
 "quote",
-
 "syn 2.0.101",
+
 "syn 2.0.117",
]
+

+
[[package]]
+
name = "zmij"
+
version = "1.0.21"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"
modified Cargo.toml
@@ -9,7 +9,7 @@ authors = ["Fintan Halpenny <fintan.halpenny@gmail.com>"]
edition = "2021"
# N.B. always use the full semver so that rust-overlay in `flake.nix` can select
# the correct version
-
rust-version = "1.85.1"
+
rust-version = "1.86.0"

[dependencies]
chrono = { version = "0.4.42", default-features = false }
@@ -18,13 +18,12 @@ indexmap = { version = "2.7.1", features = ["serde"] }
nonempty = "0.11.0"
once_cell = "1.20.3"
qcheck = "1.0.0"
-
radicle = { version = "0.22.0" }
+
radicle = { version = "0.24" }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0.140"
thiserror = "2.0.11"
url = { version = "2.5.4", features = ["serde"] }
uuid = { version = "1.13.1", features = ["serde", "v4"] }

-
[dev-dependencies.radicle]
-
version = "0.22.0"
-
features = ["test"]
+
[dev-dependencies]
+
radicle = { version = "0.24", features = ["test"] }
modified src/bin/rad-job.rs
@@ -8,9 +8,12 @@ use std::{collections::BTreeSet, error::Error as _, time::Duration};
use clap::Parser;
use uuid::Uuid;

+
use radicle::cob;
+
use radicle::cob::store::access;
+
use radicle::crypto;
use radicle::{
-
    cob, crypto,
-
    crypto::signature::Signer,
+
    cob::store::access::Access,
+
    crypto::signature,
    git::Oid,
    node::{
        device::Device,
@@ -89,12 +92,16 @@ fn profile() -> Result<Profile, error::Profile> {
    Profile::load().map_err(error::Profile)
}

-
fn jobs(repo: &Repository) -> Result<Jobs<'_, Repository>, error::Jobs> {
-
    Jobs::open(repo).map_err(|err| error::Jobs { rid: repo.id, err })
+
fn jobs<'a, S>(
+
    repo: &'a Repository,
+
    signer: &'a Device<S>,
+
) -> Result<Jobs<'a, Repository, access::WriteAs<'a, Device<S>>>, error::Jobs> {
+
    let write_as = access::WriteAs::new(signer);
+
    Jobs::open(repo, write_as).map_err(|err| error::Jobs { rid: repo.id, err })
}

fn announce(profile: &Profile, repo_id: RepoId) -> Result<(), error::Announce> {
-
    let mut node = Node::new(profile.home.socket());
+
    let mut node = Node::new(profile.socket_from_env());

    let (synced, unsynced) = node
        .seeds_for(repo_id, [*profile.id()])
@@ -132,34 +139,31 @@ fn run(args: Args) -> Result<(), RadJobError> {

    let profile = profile()?;
    let repo = args.repository(&profile)?;
-
    let mut jobs = jobs(&repo)?;
+
    let signer = profile.signer().map_err(error::Signer)?;
+
    let mut jobs = jobs(&repo, &signer)?;
    match args.command {
        Command::New(command) => {
-
            let signer = profile.signer().map_err(error::Signer)?;
-
            new_job(command, &mut jobs, &signer)?;
+
            new_job(command, &mut jobs)?;
            if !args.no_sync {
                announce(&profile, repo.id)?
            }
        }
        Command::List(command) => list_jobs(command, &jobs)?,
        Command::Run(command) => {
-
            let signer = profile.signer().map_err(error::Signer)?;
-
            run_job(command, &mut jobs, &signer)?;
+
            run_job(command, &mut jobs)?;
            if !args.no_sync {
                announce(&profile, repo.id)?
            }
        }
        Command::Show(command) => show_job(command, &jobs)?,
        Command::Failed(command) => {
-
            let signer = profile.signer().map_err(error::Signer)?;
-
            failed_job(command, &mut jobs, &signer)?;
+
            failed_job(command, &mut jobs)?;
            if !args.no_sync {
                announce(&profile, repo.id)?
            }
        }
        Command::Succeeded(command) => {
-
            let signer = profile.signer().map_err(error::Signer)?;
-
            succeeded_job(command, &mut jobs, &signer)?;
+
            succeeded_job(command, &mut jobs)?;
            if !args.no_sync {
                announce(&profile, repo.id)?
            }
@@ -169,57 +173,66 @@ fn run(args: Args) -> Result<(), RadJobError> {
    Ok(())
}

-
fn run_job<G>(
+
fn run_job<'a, S>(
    command::Run { oid, url }: command::Run,
-
    jobs: &mut Jobs<'_, Repository>,
-
    signer: &Device<G>,
+
    jobs: &mut Jobs<'a, Repository, access::WriteAs<'a, S>>,
) -> Result<(), error::Run>
where
-
    G: Signer<crypto::Signature>,
+
    S: signature::Signer<crypto::ssh::ExtendedSignature>
+
        + signature::Signer<crypto::Signature>
+
        + signature::Verifier<crypto::Signature>
+
        + crypto::signature::Keypair<VerifyingKey = crypto::PublicKey>,
{
    let uuid = Uuid::new_v4();
    let (id, job) = find_by_commit(oid, jobs)?;
    let mut job = JobMut::new(id, job, jobs);
-
    job.run(uuid, url, signer)
+
    job.run(uuid, url)
        .map_err(|err| error::Run::Store { id, err })?;
    println!("{uuid}");
    Ok(())
}

-
fn succeeded_job<G>(
+
fn succeeded_job<'a, S>(
    command::Succeeded { oid, run }: command::Succeeded,
-
    jobs: &mut Jobs<'_, Repository>,
-
    signer: &Device<G>,
+
    jobs: &mut Jobs<'a, Repository, access::WriteAs<'a, S>>,
) -> Result<(), error::Succeeded>
where
-
    G: Signer<crypto::Signature>,
+
    S: signature::Signer<crypto::ssh::ExtendedSignature>
+
        + signature::Signer<crypto::Signature>
+
        + signature::Verifier<crypto::Signature>
+
        + crypto::signature::Keypair<VerifyingKey = crypto::PublicKey>,
{
    let (id, job) = find_by_commit(oid, jobs)?;
    let mut job = JobMut::new(id, job, jobs);
-
    job.finish(run, Reason::Succeeded, signer)
+
    job.finish(run, Reason::Succeeded)
        .map_err(|err| error::Succeeded::Store { id, err })?;
    Ok(())
}

-
fn failed_job<G>(
+
fn failed_job<'a, S>(
    command::Failed { oid, run }: command::Failed,
-
    jobs: &mut Jobs<'_, Repository>,
-
    signer: &Device<G>,
+
    jobs: &mut Jobs<'a, Repository, access::WriteAs<'a, S>>,
) -> Result<(), error::Failed>
where
-
    G: Signer<crypto::Signature>,
+
    S: signature::Signer<crypto::ssh::ExtendedSignature>
+
        + signature::Signer<crypto::Signature>
+
        + signature::Verifier<crypto::Signature>
+
        + crypto::signature::Keypair<VerifyingKey = crypto::PublicKey>,
{
    let (id, job) = find_by_commit(oid, jobs)?;
    let mut job = JobMut::new(id, job, jobs);
-
    job.finish(run, Reason::Failed, signer)
+
    job.finish(run, Reason::Failed)
        .map_err(|err| error::Failed::Store { id, err })?;
    Ok(())
}

-
fn list_jobs(
+
fn list_jobs<A>(
    command::List { pretty, verbose }: command::List,
-
    jobs: &Jobs<'_, Repository>,
-
) -> Result<(), error::List> {
+
    jobs: &Jobs<'_, Repository, A>,
+
) -> Result<(), error::List>
+
where
+
    A: Access,
+
{
    let iter = jobs
        .all()
        .map_err(error::List::All)?
@@ -244,25 +257,28 @@ fn list_jobs(
    Ok(())
}

-
fn new_job<G>(
+
fn new_job<'a, S>(
    command::New { oid }: command::New,
-
    jobs: &mut Jobs<Repository>,
-
    signer: &Device<G>,
+
    jobs: &mut Jobs<'a, Repository, access::WriteAs<'a, S>>,
) -> Result<(), error::New>
where
-
    G: Signer<crypto::Signature>,
+
    S: signature::Signer<crypto::ssh::ExtendedSignature>
+
        + signature::Signer<crypto::Signature>
+
        + signature::Verifier<crypto::Signature>
+
        + crypto::signature::Keypair<VerifyingKey = crypto::PublicKey>,
{
-
    let job = jobs
-
        .create(oid, signer)
-
        .map_err(|err| error::New { oid, err })?;
+
    let job = jobs.create(oid).map_err(|err| error::New { oid, err })?;
    println!("{}", job.id());
    Ok(())
}

-
fn show_job(
+
fn show_job<A>(
    command::Show { pretty, oid }: command::Show,
-
    jobs: &Jobs<Repository>,
-
) -> Result<(), error::Show> {
+
    jobs: &Jobs<Repository, A>,
+
) -> Result<(), error::Show>
+
where
+
    A: Access,
+
{
    let (id, job) = find_by_commit(oid, jobs)?;
    let show = radicle_job::display::Job::new(id, &job);
    if pretty {
@@ -276,7 +292,10 @@ fn show_job(
    Ok(())
}

-
fn find_by_commit(oid: Oid, jobs: &Jobs<Repository>) -> Result<(JobId, Job), error::Find> {
+
fn find_by_commit<A>(oid: Oid, jobs: &Jobs<Repository, A>) -> Result<(JobId, Job), error::Find>
+
where
+
    A: Access,
+
{
    jobs.find_by_commit(oid)
        .map_err(|err| error::Find::FindCommit { oid, err })?
        .next()
modified src/lib.rs
@@ -12,6 +12,7 @@
//!
//! ```
//! # use radicle::crypto::Signer;
+
//! # use radicle::cob::store::access;
//! # use radicle::git::{raw::Repository, Oid};
//! # use radicle::test;
//! # use url::Url;
@@ -37,14 +38,14 @@
//! # } = test::setup::NodeWithRepo::default();
//! # let oid = commit(&repo.backend);
//! # let repo = (&*repo).clone();
-
//! let mut jobs = Jobs::open(repo).unwrap();
-
//! #
//! # let test::setup::NodeWithRepo { node: bob, .. } = test::setup::NodeWithRepo::default();
-
//! let mut job = jobs.create(oid, &alice.signer).unwrap();
+
//! let mut jobs = Jobs::open(repo, access::WriteAs::new(&bob.signer)).unwrap();
+
//! #
+
//! let mut job = jobs.create(oid).unwrap();
//! #
//! let uuid = Uuid::new_v4();
//! let log = Url::parse(&format!("https://example.com/ci/logs?run={}", uuid)).unwrap();
-
//! job.run(uuid, log, &alice.signer).unwrap();
+
//! job.run(uuid, log).unwrap();
//! ```

#![deny(missing_docs)]
@@ -56,11 +57,11 @@ use std::str::FromStr;

use indexmap::IndexMap;
use once_cell::sync::Lazy;
-
use radicle::cob::store::Cob;
-
use radicle::cob::{self, store, EntryId, Evaluate, ObjectId, Op, TypeName};
+
use radicle::cob;
+
use radicle::cob::store::{access, Cob};
+
use radicle::cob::{store, EntryId, Evaluate, ObjectId, Op, TypeName};
use radicle::crypto;
-
use radicle::crypto::signature::Signer;
-
use radicle::node::device::Device;
+
use radicle::crypto::signature;
use radicle::node::NodeId;
use radicle::prelude::ReadRepository;
use radicle::storage::{RepositoryError, SignRepository, WriteRepository};
@@ -590,26 +591,27 @@ pub enum Reason {
///
///   - [`Jobs::create`]
///   - [`Jobs::get_mut`]
-
pub struct Jobs<'a, R> {
-
    raw: store::Store<'a, Job, R>,
+
pub struct Jobs<'a, R, Access> {
+
    raw: store::Store<'a, Job, R, Access>,
}

-
impl<'a, R> Deref for Jobs<'a, R> {
-
    type Target = store::Store<'a, Job, R>;
+
impl<'a, R, A> Deref for Jobs<'a, R, A> {
+
    type Target = store::Store<'a, Job, R, A>;

    fn deref(&self) -> &Self::Target {
        &self.raw
    }
}

-
impl<'a, R> Jobs<'a, R>
+
impl<'a, R, A> Jobs<'a, R, A>
where
    R: ReadRepository + cob::Store<Namespace = NodeId>,
+
    A: access::Access + 'a,
{
    /// Open a jobs store.
-
    pub fn open(repository: &'a R) -> Result<Self, RepositoryError> {
+
    pub fn open(repository: &'a R, access: A) -> Result<Self, RepositoryError> {
        let identity = repository.identity_head()?;
-
        let raw = store::Store::open(repository)?.identity(identity);
+
        let raw = store::Store::open_for(&TYPENAME, repository, access)?.identity(identity);

        Ok(Self { raw })
    }
@@ -638,9 +640,10 @@ pub struct FindByCommit<'a> {
}

impl<'a> FindByCommit<'a> {
-
    fn new<R>(jobs: &Jobs<'a, R>, needle: Oid) -> Result<Self, cob::store::Error>
+
    fn new<R, A>(jobs: &Jobs<'a, R, A>, needle: Oid) -> Result<Self, cob::store::Error>
    where
        R: ReadRepository + cob::Store<Namespace = NodeId>,
+
        A: access::Access + 'a,
    {
        Ok(Self {
            jobs: Box::new(jobs.all()?),
@@ -668,12 +671,16 @@ impl Iterator for FindByCommit<'_> {
    }
}

-
impl<'a, R> Jobs<'a, R>
+
impl<'a, R, S> Jobs<'a, R, access::WriteAs<'a, S>>
where
    R: ReadRepository + SignRepository + cob::Store<Namespace = NodeId>,
+
    S: signature::Signer<crypto::ssh::ExtendedSignature>
+
        + signature::Signer<crypto::Signature>
+
        + signature::Verifier<crypto::Signature>
+
        + crypto::signature::Keypair<VerifyingKey = crypto::PublicKey>,
{
    /// Get a [`JobMut`], given its [`JobId`] identifier.
-
    pub fn get_mut<'g>(&'g mut self, id: &JobId) -> Result<JobMut<'a, 'g, R>, store::Error> {
+
    pub fn get_mut<'g>(&'g mut self, id: &JobId) -> Result<JobMut<'a, 'g, R, S>, store::Error> {
        let job = self
            .raw
            .get(id.as_object_id())?
@@ -687,19 +694,11 @@ where
    }

    /// Create a new [`Job`] in the repository.
-
    pub fn create<'g, G>(
-
        &'g mut self,
-
        oid: Oid,
-
        signer: &Device<G>,
-
    ) -> Result<JobMut<'a, 'g, R>, store::Error>
-
    where
-
        G: Signer<crypto::Signature>,
-
    {
-
        let (id, job) = store::Transaction::initial::<_, _, Transaction<R>>(
+
    pub fn create<'g>(&'g mut self, oid: Oid) -> Result<JobMut<'a, 'g, R, S>, store::Error> {
+
        let (id, job) = store::Transaction::initial(
            "Request job",
            &mut self.raw,
-
            signer,
-
            |tx, _| {
+
            |tx: &mut Transaction<R>, _| {
                tx.request(oid)?;
                Ok(())
            },
@@ -715,15 +714,15 @@ where

/// A `JobMut` is a [`Job`] where the underlying `Job` can be mutated by
/// applying actions to it.
-
pub struct JobMut<'a, 'g, R> {
+
pub struct JobMut<'a, 'g, R, Signer> {
    /// Git object that the [`Job`] applies to.
    pub id: JobId,

    job: Job,
-
    store: &'g mut Jobs<'a, R>,
+
    store: &'g mut Jobs<'a, R, access::WriteAs<'a, Signer>>,
}

-
impl<R> Deref for JobMut<'_, '_, R> {
+
impl<R, Signer> Deref for JobMut<'_, '_, R, Signer> {
    type Target = Job;

    fn deref(&self) -> &Self::Target {
@@ -731,12 +730,16 @@ impl<R> Deref for JobMut<'_, '_, R> {
    }
}

-
impl<'a, 'g, R> JobMut<'a, 'g, R>
+
impl<'a, 'g, R, S> JobMut<'a, 'g, R, S>
where
    R: WriteRepository + cob::Store<Namespace = NodeId>,
+
    S: signature::Signer<crypto::ssh::ExtendedSignature>
+
        + signature::Signer<crypto::Signature>
+
        + signature::Verifier<crypto::Signature>
+
        + crypto::signature::Keypair<VerifyingKey = crypto::PublicKey>,
{
    /// Create a new `JobMut`.
-
    pub fn new(id: JobId, job: Job, store: &'g mut Jobs<'a, R>) -> Self {
+
    pub fn new(id: JobId, job: Job, store: &'g mut Jobs<'a, R, access::WriteAs<'a, S>>) -> Self {
        Self { id, job, store }
    }

@@ -757,48 +760,25 @@ where

    /// Start a new [`Run`] for the node, where the run is identified by the
    /// given [`Uuid`].
-
    pub fn run<G>(
-
        &mut self,
-
        uuid: Uuid,
-
        log: Url,
-
        signer: &Device<G>,
-
    ) -> Result<EntryId, store::Error>
-
    where
-
        G: Signer<crypto::Signature>,
-
    {
-
        self.transaction("Run node job", signer, |tx| tx.run(uuid, log))
+
    pub fn run(&mut self, uuid: Uuid, log: Url) -> Result<EntryId, store::Error> {
+
        self.transaction("Run node job", |tx| tx.run(uuid, log))
    }

    /// Finish a [`Run`], identified by the given [`Uuid`], for the node, with
    /// the provided [`Reason`].
-
    pub fn finish<G>(
-
        &mut self,
-
        uuid: Uuid,
-
        reason: Reason,
-
        signer: &Device<G>,
-
    ) -> Result<EntryId, store::Error>
-
    where
-
        G: Signer<crypto::Signature>,
-
    {
-
        self.transaction("Finished node job", signer, |tx| tx.finish(uuid, reason))
+
    pub fn finish(&mut self, uuid: Uuid, reason: Reason) -> Result<EntryId, store::Error> {
+
        self.transaction("Finished node job", |tx| tx.finish(uuid, reason))
    }

    /// Apply COB operations to a `JobMut`.
-
    fn transaction<G, F>(
-
        &mut self,
-
        message: &str,
-
        signer: &Device<G>,
-
        operations: F,
-
    ) -> Result<EntryId, store::Error>
+
    fn transaction<F>(&mut self, message: &str, operations: F) -> Result<EntryId, store::Error>
    where
-
        G: Signer<crypto::Signature>,
        F: FnOnce(&mut Transaction<R>) -> Result<(), store::Error>,
    {
        let mut tx = Transaction::default();
        operations(&mut tx)?;

-
        let (job, commit) =
-
            tx.0.commit(message, self.id.into(), &mut self.store.raw, signer)?;
+
        let (job, commit) = tx.0.commit(message, self.id.into(), &mut self.store.raw)?;
        self.job = job;

        Ok(commit)
@@ -879,6 +859,7 @@ where
#[cfg(test)]
#[allow(clippy::unwrap_used)]
mod test {
+
    use radicle::cob::store::access;
    use radicle::git::{raw::Repository, Oid};
    use radicle::test;
    use url::Url;
@@ -911,47 +892,53 @@ mod test {
            node: alice, repo, ..
        } = test::setup::NodeWithRepo::default();
        let oid = commit(&repo.backend);
-
        let mut jobs = Jobs::open(&*repo).unwrap();
+
        let mut alice_jobs = Jobs::open(&*repo, access::WriteAs::new(&alice.signer)).unwrap();

        let test::setup::NodeWithRepo { node: bob, .. } = test::setup::NodeWithRepo::default();
-
        let mut job = jobs.create(oid, &alice.signer).unwrap();
+
        let mut bob_jobs = Jobs::open(&*repo, access::WriteAs::new(&bob.signer)).unwrap();
+

+
        let mut alice_job = alice_jobs.create(oid).unwrap();

        let (alice_uuid, alice_log) = node_run();
-
        job.run(alice_uuid, alice_log.clone(), &alice.signer)
-
            .unwrap();
+
        alice_job.run(alice_uuid, alice_log.clone()).unwrap();

        let (bob_uuid, bob_log) = node_run();
-
        job.run(bob_uuid, bob_log.clone(), &bob.signer).unwrap();
+
        let mut bob_job = bob_jobs.get_mut(&alice_job.id).unwrap();
+
        bob_job.run(bob_uuid, bob_log.clone()).unwrap();

-
        let alice_runs = job.runs_of(alice.signer.public_key()).unwrap();
+
        let alice_runs = bob_job.runs_of(alice.signer.public_key()).unwrap();
        assert!(alice_runs.contains_key(&alice_uuid));
        let run = alice_runs.get(&alice_uuid).unwrap();
        assert_eq!(run.status, Status::Started);
        assert_eq!(run.log, alice_log);

-
        let bob_runs = job.runs_of(bob.signer.public_key()).unwrap();
+
        let bob_runs = bob_job.runs_of(bob.signer.public_key()).unwrap();
        assert!(bob_runs.contains_key(&bob_uuid));
        let run = bob_runs.get(&bob_uuid).unwrap();
        assert_eq!(run.status, Status::Started);
        assert_eq!(run.log, bob_log);

-
        job.finish(alice_uuid, Reason::Succeeded, &alice.signer)
-
            .unwrap();
+
        alice_job.finish(alice_uuid, Reason::Succeeded).unwrap();

-
        let finished = job.finished();
+
        let finished = alice_job.finished();
        assert!(finished.contains_key(alice.signer.public_key()));
        assert!(!finished.contains_key(bob.signer.public_key()));

-
        job.finish(bob_uuid, Reason::Failed, &bob.signer).unwrap();
+
        bob_job.finish(bob_uuid, Reason::Failed).unwrap();

-
        let succeeded = job.succeeded();
+
        let succeeded = bob_job.succeeded();
        assert!(succeeded.contains_key(alice.signer.public_key()));
        assert!(!succeeded.contains_key(bob.signer.public_key()));
-
        let failed = job.failed();
+
        let failed = bob_job.failed();
        assert!(!failed.contains_key(alice.signer.public_key()));
        assert!(failed.contains_key(bob.signer.public_key()));
-
        let started = job.started();
+
        let started = bob_job.started();
        assert!(started.is_empty());
+

+
        // Check that we still have alice's initial log
+
        let alice_runs = alice_job.runs_of(alice.signer.public_key()).unwrap();
+
        let run = alice_runs.get(&alice_uuid).unwrap();
+
        assert_eq!(run.log, alice_log);
    }

    #[test]
@@ -959,9 +946,10 @@ mod test {
        let test::setup::NodeWithRepo {
            node: alice, repo, ..
        } = test::setup::NodeWithRepo::default();
-
        let mut jobs = Jobs::open(&*repo).unwrap();
+
        let access = access::WriteAs::new(&alice.signer);
+
        let mut jobs = Jobs::open(&*repo, access).unwrap();
        let oid = test::arbitrary::oid();
-
        let job = jobs.create(oid, &alice.signer);
+
        let job = jobs.create(oid);
        assert!(job.is_err())
    }

@@ -971,13 +959,14 @@ mod test {
            node: alice, repo, ..
        } = test::setup::NodeWithRepo::default();
        let oid = commit(&repo.backend);
-
        let mut jobs = Jobs::open(&*repo).unwrap();
+
        let access = access::WriteAs::new(&alice.signer);
+
        let mut jobs = Jobs::open(&*repo, access).unwrap();
        let job1 = {
-
            let job1 = jobs.create(oid, &alice.signer).unwrap();
+
            let job1 = jobs.create(oid).unwrap();
            job1.id
        };
        let job2 = {
-
            let job2 = jobs.create(oid, &alice.signer).unwrap();
+
            let job2 = jobs.create(oid).unwrap();
            job2.id
        };