diff --git a/crates/Cargo.lock b/crates/Cargo.lock index 1eb5e7838d..67677577c5 100644 --- a/crates/Cargo.lock +++ b/crates/Cargo.lock @@ -2289,9 +2289,9 @@ checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" [[package]] name = "rustls-webpki" -version = "0.103.10" +version = "0.103.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df33b2b81ac578cabaf06b89b0631153a3f416b0a886e8a7a1707fb51abbd1ef" +checksum = "8279bb85272c9f10811ae6a6c547ff594d6a7f3c6c6b02ee9726d1d0dcfcdd06" dependencies = [ "ring", "rustls-pki-types", diff --git a/crates/coglet/src/input_validation.rs b/crates/coglet/src/input_validation.rs index ea34068160..cf399f65f6 100644 --- a/crates/coglet/src/input_validation.rs +++ b/crates/coglet/src/input_validation.rs @@ -1,8 +1,8 @@ //! Input validation against the OpenAPI schema. //! -//! Validates prediction inputs before dispatching to the Python worker, -//! catching missing required fields and unknown fields early with clear -//! error messages (matching the format users expect from pydantic). +//! Validates prediction inputs before dispatching to the Python worker. +//! Strips unknown fields silently and catches missing required fields +//! with clear error messages (matching the format users expect from pydantic). use std::collections::HashSet; @@ -31,8 +31,9 @@ pub struct InputValidator { impl InputValidator { /// Build a validator from a full OpenAPI schema document. /// - /// Extracts `components.schemas.Input`, injects `additionalProperties: false` - /// (for pydantic parity), and compiles a JSON Schema validator. + /// Extracts `components.schemas.Input` and compiles a JSON Schema validator. + /// Unknown input fields should be stripped via `strip_unknown()` before + /// calling `validate()`. /// /// Returns None if the schema doesn't contain an Input component. pub fn from_openapi_schema(schema: &Value) -> Option { @@ -62,11 +63,7 @@ impl InputValidator { }) .unwrap_or_default(); - // Clone and inject additionalProperties: false for pydantic parity let mut resolved = input_schema.clone(); - if let Some(obj) = resolved.as_object_mut() { - obj.insert("additionalProperties".to_string(), Value::Bool(false)); - } // Inline $ref pointers so the validator can resolve them without // the full OpenAPI document context. cog-schema-gen emits $ref for @@ -91,6 +88,22 @@ impl InputValidator { self.required.len() } + /// Strip unknown input fields in place, returning the names of removed fields. + pub fn strip_unknown(&self, input: &mut Value) -> Vec { + let Some(obj) = input.as_object_mut() else { + return Vec::new(); + }; + let unknown_keys: Vec = obj + .keys() + .filter(|k| !self.properties.contains(*k)) + .cloned() + .collect(); + for key in &unknown_keys { + obj.remove(key); + } + unknown_keys + } + /// Validate an input value against the schema. /// /// Returns Ok(()) on success, or a list of per-field validation errors @@ -102,7 +115,6 @@ impl InputValidator { let mut errors = Vec::new(); let mut seen_required = false; - let mut seen_additional = false; for error in self.validator.iter_errors(input) { let msg = error.to_string(); @@ -126,30 +138,10 @@ impl InputValidator { continue; } - // "additionalProperties" errors: emit one entry per unknown field - if msg.contains("Additional properties") && !seen_additional { - seen_additional = true; - if let Some(input_obj) = input.as_object() { - for key in input_obj.keys() { - if !self.properties.contains(key) { - errors.push(ValidationError { - field: key.clone(), - msg: format!("Unexpected field '{key}'"), - error_type: "value_error.extra".to_string(), - }); - } - } - } - continue; - } - - // Skip duplicate required/additional messages + // Skip duplicate required messages if seen_required && msg.contains("is a required property") { continue; } - if seen_additional && msg.contains("Additional properties") { - continue; - } // Type/constraint errors on specific fields let path = error.instance_path.to_string(); @@ -250,7 +242,7 @@ mod tests { } #[test] - fn rejects_additional_properties() { + fn allows_additional_properties_in_validate() { let schema = make_schema(json!({ "type": "object", "properties": { @@ -261,17 +253,17 @@ mod tests { let validator = InputValidator::from_openapi_schema(&schema).unwrap(); - // Extra field should fail - let errs = validator - .validate(&json!({"s": "hello", "extra": "bad"})) - .unwrap_err(); - assert_eq!(errs.len(), 1); - assert_eq!(errs[0].field, "extra"); - assert!(errs[0].msg.contains("Unexpected")); + // Extra fields should NOT cause validation failure — they get stripped separately + assert!( + validator + .validate(&json!({"s": "hello", "extra": "bad"})) + .is_ok(), + "unknown inputs should not cause validation errors" + ); } #[test] - fn missing_and_extra_fields() { + fn strip_unknown_removes_extra_fields() { let schema = make_schema(json!({ "type": "object", "properties": { @@ -282,15 +274,77 @@ mod tests { let validator = InputValidator::from_openapi_schema(&schema).unwrap(); - // wrong=value with missing s - let errs = validator.validate(&json!({"wrong": "value"})).unwrap_err(); - assert!(errs.len() >= 2); - let fields: Vec<&str> = errs.iter().map(|e| e.field.as_str()).collect(); - assert!(fields.contains(&"s"), "should report missing s: {fields:?}"); - assert!( - fields.contains(&"wrong"), - "should report extra wrong: {fields:?}" - ); + let mut input = json!({"s": "hello", "guidance_scale": 7.5, "extra": "bad"}); + let stripped = validator.strip_unknown(&mut input); + + // Should have removed the unknown fields + assert_eq!(stripped.len(), 2); + assert!(stripped.contains(&"guidance_scale".to_string())); + assert!(stripped.contains(&"extra".to_string())); + + // Known field should remain + assert_eq!(input, json!({"s": "hello"})); + } + + #[test] + fn strip_unknown_preserves_known_fields() { + let schema = make_schema(json!({ + "type": "object", + "properties": { + "s": {"type": "string", "title": "S"}, + "n": {"type": "integer"} + }, + "required": ["s"] + })); + + let validator = InputValidator::from_openapi_schema(&schema).unwrap(); + + let mut input = json!({"s": "hello", "n": 42}); + let stripped = validator.strip_unknown(&mut input); + + assert!(stripped.is_empty()); + assert_eq!(input, json!({"s": "hello", "n": 42})); + } + + #[test] + fn strip_unknown_returns_empty_for_no_extra_fields() { + let schema = make_schema(json!({ + "type": "object", + "properties": { + "s": {"type": "string", "title": "S"} + }, + "required": ["s"] + })); + + let validator = InputValidator::from_openapi_schema(&schema).unwrap(); + + let mut input = json!({"s": "hello"}); + let stripped = validator.strip_unknown(&mut input); + assert!(stripped.is_empty()); + } + + #[test] + fn missing_required_with_extra_fields() { + let schema = make_schema(json!({ + "type": "object", + "properties": { + "s": {"type": "string", "title": "S"} + }, + "required": ["s"] + })); + + let validator = InputValidator::from_openapi_schema(&schema).unwrap(); + + // Strip unknowns first, then validate — only the missing required field + // should be an error, not the extra field + let mut input = json!({"wrong": "value"}); + let stripped = validator.strip_unknown(&mut input); + assert_eq!(stripped, vec!["wrong".to_string()]); + + let errs = validator.validate(&input).unwrap_err(); + assert_eq!(errs.len(), 1); + assert_eq!(errs[0].field, "s"); + assert_eq!(errs[0].msg, "Field required"); } #[test] diff --git a/crates/coglet/src/service.rs b/crates/coglet/src/service.rs index cf15113715..300ccab9e7 100644 --- a/crates/coglet/src/service.rs +++ b/crates/coglet/src/service.rs @@ -337,36 +337,52 @@ impl PredictionService { self.schema.read().await.clone() } - /// Validate prediction input against the OpenAPI schema. + /// Strip unknown fields from input and validate in one pass. /// - /// Returns Ok(()) if no schema is loaded or if validation passes. - /// Returns Err with per-field validation errors on failure. - pub async fn validate_input( + /// Unknown inputs are silently dropped to match Replicate's historical API + /// behavior. Returns the stripped field names and the validation result + /// under a single lock acquisition. + pub async fn strip_and_validate_input( &self, - input: &serde_json::Value, - ) -> Result<(), Vec> { + input: &mut serde_json::Value, + ) -> ( + Vec, + Result<(), Vec>, + ) { let guard = self.input_validator.read().await; if let Some(ref validator) = *guard { - validator.validate(input) + let stripped = validator.strip_unknown(input); + let result = validator.validate(input); + (stripped, result) } else { - Ok(()) + (Vec::new(), Ok(())) } } - /// Validate training input against the TrainingInput schema. + /// Strip unknown fields from training input and validate in one pass. /// /// Falls back to the predict validator if no training schema is present. - pub async fn validate_train_input( + pub async fn strip_and_validate_train_input( &self, - input: &serde_json::Value, - ) -> Result<(), Vec> { - let guard = self.train_validator.read().await; - if let Some(ref validator) = *guard { - return validator.validate(input); + input: &mut serde_json::Value, + ) -> ( + Vec, + Result<(), Vec>, + ) { + let train_guard = self.train_validator.read().await; + if let Some(ref validator) = *train_guard { + let stripped = validator.strip_unknown(input); + let result = validator.validate(input); + return (stripped, result); + } + drop(train_guard); + let predict_guard = self.input_validator.read().await; + if let Some(ref validator) = *predict_guard { + let stripped = validator.strip_unknown(input); + let result = validator.validate(input); + return (stripped, result); } - drop(guard); - // Fallback: no TrainingInput schema — use predict validator (legacy compat) - self.validate_input(input).await + (Vec::new(), Ok(())) } /// Run user-defined healthcheck via orchestrator. diff --git a/crates/coglet/src/transport/http/routes.rs b/crates/coglet/src/transport/http/routes.rs index 153722d2b0..aa9875340e 100644 --- a/crates/coglet/src/transport/http/routes.rs +++ b/crates/coglet/src/transport/http/routes.rs @@ -329,7 +329,7 @@ fn build_webhook_sender( async fn create_prediction_with_id( service: Arc, prediction_id: String, - input: serde_json::Value, + mut input: serde_json::Value, context: std::collections::HashMap, webhook: Option, webhook_events_filter: Vec, @@ -337,12 +337,20 @@ async fn create_prediction_with_id( trace_context: TraceContext, is_training: bool, ) -> (StatusCode, Json) { - // Validate input against the appropriate schema - let validation_result = if is_training { - service.validate_train_input(&input).await + // Strip unknown fields and validate in one pass. Unknown inputs are + // silently dropped to match Replicate's historical API behavior. + let (stripped, validation_result) = if is_training { + service.strip_and_validate_train_input(&mut input).await } else { - service.validate_input(&input).await + service.strip_and_validate_input(&mut input).await }; + if !stripped.is_empty() { + tracing::warn!( + prediction_id = %prediction_id, + fields = ?stripped, + "Stripped unknown input fields" + ); + } if let Err(errors) = validation_result { let detail: Vec = errors .into_iter() diff --git a/mise.lock b/mise.lock index 0f8870127e..3ba349bbe7 100644 --- a/mise.lock +++ b/mise.lock @@ -1,82 +1,228 @@ +# @generated - this file is auto-generated by `mise lock` https://mise.jdx.dev/dev-tools/mise-lock.html + [[tools."aqua:EmbarkStudios/cargo-deny"]] version = "0.19.0" backend = "aqua:EmbarkStudios/cargo-deny" -"platforms.linux-arm64" = { checksum = "sha256:2b3567a60b7491c159d1cef8b7d8479d1ad2a31e29ef49462634ad4552fcc77d", url = "https://github.com/EmbarkStudios/cargo-deny/releases/download/0.19.0/cargo-deny-0.19.0-aarch64-unknown-linux-musl.tar.gz"} -"platforms.linux-x64" = { checksum = "sha256:0e8c2aa59128612c90d9e09c02204e912f29a5b8d9a64671b94608cbe09e064f", url = "https://github.com/EmbarkStudios/cargo-deny/releases/download/0.19.0/cargo-deny-0.19.0-x86_64-unknown-linux-musl.tar.gz"} -"platforms.macos-arm64" = { checksum = "sha256:a22f2023c06f3eefd099a5d42dd828fd4fa74d1e1c167bd1dbc3cf59ad62ded0", url = "https://github.com/EmbarkStudios/cargo-deny/releases/download/0.19.0/cargo-deny-0.19.0-aarch64-apple-darwin.tar.gz"} -"platforms.macos-x64" = { checksum = "sha256:c42163655413f7e872638cd8c4345a327b512ef0ab99109e9cced691b95af5fb", url = "https://github.com/EmbarkStudios/cargo-deny/releases/download/0.19.0/cargo-deny-0.19.0-x86_64-apple-darwin.tar.gz"} -"platforms.windows-x64" = { checksum = "sha256:413f0e2ce780d0d14ba8e9339f9fb033419a8a971ec7714faec518e4a664bdb0", url = "https://github.com/EmbarkStudios/cargo-deny/releases/download/0.19.0/cargo-deny-0.19.0-x86_64-pc-windows-msvc.tar.gz"} + +[tools."aqua:EmbarkStudios/cargo-deny"."platforms.linux-arm64"] +checksum = "sha256:2b3567a60b7491c159d1cef8b7d8479d1ad2a31e29ef49462634ad4552fcc77d" +url = "https://github.com/EmbarkStudios/cargo-deny/releases/download/0.19.0/cargo-deny-0.19.0-aarch64-unknown-linux-musl.tar.gz" + +[tools."aqua:EmbarkStudios/cargo-deny"."platforms.linux-x64"] +checksum = "sha256:0e8c2aa59128612c90d9e09c02204e912f29a5b8d9a64671b94608cbe09e064f" +url = "https://github.com/EmbarkStudios/cargo-deny/releases/download/0.19.0/cargo-deny-0.19.0-x86_64-unknown-linux-musl.tar.gz" + +[tools."aqua:EmbarkStudios/cargo-deny"."platforms.macos-arm64"] +checksum = "sha256:a22f2023c06f3eefd099a5d42dd828fd4fa74d1e1c167bd1dbc3cf59ad62ded0" +url = "https://github.com/EmbarkStudios/cargo-deny/releases/download/0.19.0/cargo-deny-0.19.0-aarch64-apple-darwin.tar.gz" + +[tools."aqua:EmbarkStudios/cargo-deny"."platforms.macos-x64"] +checksum = "sha256:c42163655413f7e872638cd8c4345a327b512ef0ab99109e9cced691b95af5fb" +url = "https://github.com/EmbarkStudios/cargo-deny/releases/download/0.19.0/cargo-deny-0.19.0-x86_64-apple-darwin.tar.gz" + +[tools."aqua:EmbarkStudios/cargo-deny"."platforms.windows-x64"] +checksum = "sha256:413f0e2ce780d0d14ba8e9339f9fb033419a8a971ec7714faec518e4a664bdb0" +url = "https://github.com/EmbarkStudios/cargo-deny/releases/download/0.19.0/cargo-deny-0.19.0-x86_64-pc-windows-msvc.tar.gz" [[tools."aqua:golangci/golangci-lint"]] version = "2.10.1" backend = "aqua:golangci/golangci-lint" -"platforms.linux-arm64" = { checksum = "sha256:6652b42ae02915eb2f9cb2a2e0cac99514c8eded8388d88ae3e06e1a52c00de8", url = "https://github.com/golangci/golangci-lint/releases/download/v2.10.1/golangci-lint-2.10.1-linux-arm64.tar.gz"} -"platforms.linux-x64" = { checksum = "sha256:dfa775874cf0561b404a02a8f4481fc69b28091da95aa697259820d429b09c99", url = "https://github.com/golangci/golangci-lint/releases/download/v2.10.1/golangci-lint-2.10.1-linux-amd64.tar.gz"} -"platforms.macos-arm64" = { checksum = "sha256:03bfadf67e52b441b7ec21305e501c717df93c959836d66c7f97312654acb297", url = "https://github.com/golangci/golangci-lint/releases/download/v2.10.1/golangci-lint-2.10.1-darwin-arm64.tar.gz"} -"platforms.macos-x64" = { checksum = "sha256:66fb0da81b8033b477f97eea420d4b46b230ca172b8bb87c6610109f3772b6b6", url = "https://github.com/golangci/golangci-lint/releases/download/v2.10.1/golangci-lint-2.10.1-darwin-amd64.tar.gz"} -"platforms.windows-x64" = { checksum = "sha256:c60c87695e79db8e320f0e5be885059859de52bb5ee5f11be5577828570bc2a3", url = "https://github.com/golangci/golangci-lint/releases/download/v2.10.1/golangci-lint-2.10.1-windows-amd64.zip"} + +[tools."aqua:golangci/golangci-lint"."platforms.linux-arm64"] +checksum = "sha256:6652b42ae02915eb2f9cb2a2e0cac99514c8eded8388d88ae3e06e1a52c00de8" +url = "https://github.com/golangci/golangci-lint/releases/download/v2.10.1/golangci-lint-2.10.1-linux-arm64.tar.gz" + +[tools."aqua:golangci/golangci-lint"."platforms.linux-x64"] +checksum = "sha256:dfa775874cf0561b404a02a8f4481fc69b28091da95aa697259820d429b09c99" +url = "https://github.com/golangci/golangci-lint/releases/download/v2.10.1/golangci-lint-2.10.1-linux-amd64.tar.gz" + +[tools."aqua:golangci/golangci-lint"."platforms.macos-arm64"] +checksum = "sha256:03bfadf67e52b441b7ec21305e501c717df93c959836d66c7f97312654acb297" +url = "https://github.com/golangci/golangci-lint/releases/download/v2.10.1/golangci-lint-2.10.1-darwin-arm64.tar.gz" + +[tools."aqua:golangci/golangci-lint"."platforms.macos-x64"] +checksum = "sha256:66fb0da81b8033b477f97eea420d4b46b230ca172b8bb87c6610109f3772b6b6" +url = "https://github.com/golangci/golangci-lint/releases/download/v2.10.1/golangci-lint-2.10.1-darwin-amd64.tar.gz" + +[tools."aqua:golangci/golangci-lint"."platforms.windows-x64"] +checksum = "sha256:c60c87695e79db8e320f0e5be885059859de52bb5ee5f11be5577828570bc2a3" +url = "https://github.com/golangci/golangci-lint/releases/download/v2.10.1/golangci-lint-2.10.1-windows-amd64.zip" [[tools."aqua:gotestyourself/gotestsum"]] version = "1.13.0" backend = "aqua:gotestyourself/gotestsum" -"platforms.linux-arm64" = { checksum = "sha256:7644a4c5cd1bb978d56245aeab25a586ac5ac62adebed20a399548867c13499d", url = "https://github.com/gotestyourself/gotestsum/releases/download/v1.13.0/gotestsum_1.13.0_linux_arm64.tar.gz"} -"platforms.linux-x64" = { checksum = "sha256:11ccddeaf708ef228889f9fe2f68291a75b27013ddfc3b18156e094f5f40e8ee", url = "https://github.com/gotestyourself/gotestsum/releases/download/v1.13.0/gotestsum_1.13.0_linux_amd64.tar.gz"} -"platforms.macos-arm64" = { checksum = "sha256:509cb27aef747f48faf9bce424f59dcf79572c905204b990ee935bbfcc7fa0e9", url = "https://github.com/gotestyourself/gotestsum/releases/download/v1.13.0/gotestsum_1.13.0_darwin_arm64.tar.gz"} -"platforms.macos-x64" = { checksum = "sha256:99529350f4c7b780b1efc543ca0d9721b09f0a4228f0efa9281261f58fefa05a", url = "https://github.com/gotestyourself/gotestsum/releases/download/v1.13.0/gotestsum_1.13.0_darwin_amd64.tar.gz"} -"platforms.windows-x64" = { checksum = "sha256:fd5a6dc69e46a0970593e70d85a7e75f16714e9c61d6d72ccc324eb82df5bb8a", url = "https://github.com/gotestyourself/gotestsum/releases/download/v1.13.0/gotestsum_1.13.0_windows_amd64.tar.gz"} + +[tools."aqua:gotestyourself/gotestsum"."platforms.linux-arm64"] +checksum = "sha256:7644a4c5cd1bb978d56245aeab25a586ac5ac62adebed20a399548867c13499d" +url = "https://github.com/gotestyourself/gotestsum/releases/download/v1.13.0/gotestsum_1.13.0_linux_arm64.tar.gz" + +[tools."aqua:gotestyourself/gotestsum"."platforms.linux-x64"] +checksum = "sha256:11ccddeaf708ef228889f9fe2f68291a75b27013ddfc3b18156e094f5f40e8ee" +url = "https://github.com/gotestyourself/gotestsum/releases/download/v1.13.0/gotestsum_1.13.0_linux_amd64.tar.gz" + +[tools."aqua:gotestyourself/gotestsum"."platforms.macos-arm64"] +checksum = "sha256:509cb27aef747f48faf9bce424f59dcf79572c905204b990ee935bbfcc7fa0e9" +url = "https://github.com/gotestyourself/gotestsum/releases/download/v1.13.0/gotestsum_1.13.0_darwin_arm64.tar.gz" + +[tools."aqua:gotestyourself/gotestsum"."platforms.macos-x64"] +checksum = "sha256:99529350f4c7b780b1efc543ca0d9721b09f0a4228f0efa9281261f58fefa05a" +url = "https://github.com/gotestyourself/gotestsum/releases/download/v1.13.0/gotestsum_1.13.0_darwin_amd64.tar.gz" + +[tools."aqua:gotestyourself/gotestsum"."platforms.windows-x64"] +checksum = "sha256:fd5a6dc69e46a0970593e70d85a7e75f16714e9c61d6d72ccc324eb82df5bb8a" +url = "https://github.com/gotestyourself/gotestsum/releases/download/v1.13.0/gotestsum_1.13.0_windows_amd64.tar.gz" [[tools."aqua:mitsuhiko/insta"]] version = "1.46.0" backend = "aqua:mitsuhiko/insta" -"platforms.linux-x64" = { checksum = "sha256:592f7f8ddd465f0b8f2e7121bbe6bace97b475330b7f3c0ac62e504c1de6b967", url = "https://github.com/mitsuhiko/insta/releases/download/1.46.0/cargo-insta-x86_64-unknown-linux-musl.tar.xz"} -"platforms.macos-arm64" = { checksum = "sha256:c32a785806a7b329330fefced808c0ba7017416c8a7ea24c0a8363ad66d1aeed", url = "https://github.com/mitsuhiko/insta/releases/download/1.46.0/cargo-insta-aarch64-apple-darwin.tar.xz"} -"platforms.macos-x64" = { checksum = "sha256:4a2e8bc9b3e7591fd96580cbb4c79cae062060f9482719bb32bc3932eff08fba", url = "https://github.com/mitsuhiko/insta/releases/download/1.46.0/cargo-insta-x86_64-apple-darwin.tar.xz"} -"platforms.windows-x64" = { checksum = "sha256:d13a207264e10644d6995bdb332d7cc7353ffc53a0199f4e20376923016247ab", url = "https://github.com/mitsuhiko/insta/releases/download/1.46.0/cargo-insta-x86_64-pc-windows-msvc.zip"} + +[tools."aqua:mitsuhiko/insta"."platforms.linux-x64"] +checksum = "sha256:592f7f8ddd465f0b8f2e7121bbe6bace97b475330b7f3c0ac62e504c1de6b967" +url = "https://github.com/mitsuhiko/insta/releases/download/1.46.0/cargo-insta-x86_64-unknown-linux-musl.tar.xz" + +[tools."aqua:mitsuhiko/insta"."platforms.macos-arm64"] +checksum = "sha256:c32a785806a7b329330fefced808c0ba7017416c8a7ea24c0a8363ad66d1aeed" +url = "https://github.com/mitsuhiko/insta/releases/download/1.46.0/cargo-insta-aarch64-apple-darwin.tar.xz" + +[tools."aqua:mitsuhiko/insta"."platforms.macos-x64"] +checksum = "sha256:4a2e8bc9b3e7591fd96580cbb4c79cae062060f9482719bb32bc3932eff08fba" +url = "https://github.com/mitsuhiko/insta/releases/download/1.46.0/cargo-insta-x86_64-apple-darwin.tar.xz" + +[tools."aqua:mitsuhiko/insta"."platforms.windows-x64"] +checksum = "sha256:d13a207264e10644d6995bdb332d7cc7353ffc53a0199f4e20376923016247ab" +url = "https://github.com/mitsuhiko/insta/releases/download/1.46.0/cargo-insta-x86_64-pc-windows-msvc.zip" [[tools."aqua:rust-cross/cargo-zigbuild"]] version = "0.20.1" backend = "aqua:rust-cross/cargo-zigbuild" -"platforms.linux-arm64" = { checksum = "sha256:e9631045cc5f33ef0d6d9186196192d70b8018bf7633626c3a7c1384e81b7f67", url = "https://github.com/rust-cross/cargo-zigbuild/releases/download/v0.20.1/cargo-zigbuild-v0.20.1.aarch64-unknown-linux-musl.tar.gz"} -"platforms.linux-x64" = { checksum = "sha256:742ed281f15fef6eaf49535ac10ffe98fb57913d0c4c88d6888d794043c05618", url = "https://github.com/rust-cross/cargo-zigbuild/releases/download/v0.20.1/cargo-zigbuild-v0.20.1.x86_64-unknown-linux-musl.tar.gz"} -"platforms.macos-arm64" = { checksum = "sha256:d5c7ac2e6f25fb76083dff84640cdf679c5da858b9c97631555c3185be2fbf35", url = "https://github.com/rust-cross/cargo-zigbuild/releases/download/v0.20.1/cargo-zigbuild-v0.20.1.apple-darwin.tar.gz"} -"platforms.macos-x64" = { checksum = "sha256:d5c7ac2e6f25fb76083dff84640cdf679c5da858b9c97631555c3185be2fbf35", url = "https://github.com/rust-cross/cargo-zigbuild/releases/download/v0.20.1/cargo-zigbuild-v0.20.1.apple-darwin.tar.gz"} -"platforms.windows-x64" = { checksum = "sha256:b0bb728ba068ee61342f40a2124b3d8d234af8f716dd416b7c1f794dfeb4e478", url = "https://github.com/rust-cross/cargo-zigbuild/releases/download/v0.20.1/cargo-zigbuild-v0.20.1.windows-x64.zip"} + +[tools."aqua:rust-cross/cargo-zigbuild"."platforms.linux-arm64"] +checksum = "sha256:e9631045cc5f33ef0d6d9186196192d70b8018bf7633626c3a7c1384e81b7f67" +url = "https://github.com/rust-cross/cargo-zigbuild/releases/download/v0.20.1/cargo-zigbuild-v0.20.1.aarch64-unknown-linux-musl.tar.gz" + +[tools."aqua:rust-cross/cargo-zigbuild"."platforms.linux-x64"] +checksum = "sha256:742ed281f15fef6eaf49535ac10ffe98fb57913d0c4c88d6888d794043c05618" +url = "https://github.com/rust-cross/cargo-zigbuild/releases/download/v0.20.1/cargo-zigbuild-v0.20.1.x86_64-unknown-linux-musl.tar.gz" + +[tools."aqua:rust-cross/cargo-zigbuild"."platforms.macos-arm64"] +checksum = "sha256:d5c7ac2e6f25fb76083dff84640cdf679c5da858b9c97631555c3185be2fbf35" +url = "https://github.com/rust-cross/cargo-zigbuild/releases/download/v0.20.1/cargo-zigbuild-v0.20.1.apple-darwin.tar.gz" + +[tools."aqua:rust-cross/cargo-zigbuild"."platforms.macos-x64"] +checksum = "sha256:d5c7ac2e6f25fb76083dff84640cdf679c5da858b9c97631555c3185be2fbf35" +url = "https://github.com/rust-cross/cargo-zigbuild/releases/download/v0.20.1/cargo-zigbuild-v0.20.1.apple-darwin.tar.gz" + +[tools."aqua:rust-cross/cargo-zigbuild"."platforms.windows-x64"] +checksum = "sha256:b0bb728ba068ee61342f40a2124b3d8d234af8f716dd416b7c1f794dfeb4e478" +url = "https://github.com/rust-cross/cargo-zigbuild/releases/download/v0.20.1/cargo-zigbuild-v0.20.1.windows-x64.zip" [[tools."aqua:rust-lang/rustup"]] version = "1.28.2" backend = "aqua:rust-lang/rustup" -"platforms.linux-arm64" = { checksum = "sha256:e3853c5a252fca15252d07cb23a1bdd9377a8c6f3efa01531109281ae47f841c", url = "https://static.rust-lang.org/rustup/archive/1.28.2/aarch64-unknown-linux-gnu/rustup-init"} -"platforms.linux-x64" = { checksum = "sha256:20a06e644b0d9bd2fbdbfd52d42540bdde820ea7df86e92e533c073da0cdd43c", url = "https://static.rust-lang.org/rustup/archive/1.28.2/x86_64-unknown-linux-gnu/rustup-init"} -"platforms.macos-arm64" = { checksum = "sha256:20ef5516c31b1ac2290084199ba77dbbcaa1406c45c1d978ca68558ef5964ef5", url = "https://static.rust-lang.org/rustup/archive/1.28.2/aarch64-apple-darwin/rustup-init"} -"platforms.macos-x64" = { checksum = "sha256:9c331076f62b4d0edeae63d9d1c9442d5fe39b37b05025ec8d41c5ed35486496", url = "https://static.rust-lang.org/rustup/archive/1.28.2/x86_64-apple-darwin/rustup-init"} -"platforms.windows-x64" = { checksum = "sha256:88d8258dcf6ae4f7a80c7d1088e1f36fa7025a1cfd1343731b4ee6f385121fc0", url = "https://static.rust-lang.org/rustup/archive/1.28.2/x86_64-pc-windows-msvc/rustup-init.exe"} + +[tools."aqua:rust-lang/rustup"."platforms.linux-arm64"] +checksum = "sha256:e3853c5a252fca15252d07cb23a1bdd9377a8c6f3efa01531109281ae47f841c" +url = "https://static.rust-lang.org/rustup/archive/1.28.2/aarch64-unknown-linux-gnu/rustup-init" + +[tools."aqua:rust-lang/rustup"."platforms.linux-arm64-musl"] +checksum = "sha256:e3853c5a252fca15252d07cb23a1bdd9377a8c6f3efa01531109281ae47f841c" +url = "https://static.rust-lang.org/rustup/archive/1.28.2/aarch64-unknown-linux-gnu/rustup-init" + +[tools."aqua:rust-lang/rustup"."platforms.linux-x64"] +checksum = "sha256:20a06e644b0d9bd2fbdbfd52d42540bdde820ea7df86e92e533c073da0cdd43c" +url = "https://static.rust-lang.org/rustup/archive/1.28.2/x86_64-unknown-linux-gnu/rustup-init" + +[tools."aqua:rust-lang/rustup"."platforms.linux-x64-musl"] +checksum = "sha256:20a06e644b0d9bd2fbdbfd52d42540bdde820ea7df86e92e533c073da0cdd43c" +url = "https://static.rust-lang.org/rustup/archive/1.28.2/x86_64-unknown-linux-gnu/rustup-init" + +[tools."aqua:rust-lang/rustup"."platforms.macos-arm64"] +checksum = "sha256:20ef5516c31b1ac2290084199ba77dbbcaa1406c45c1d978ca68558ef5964ef5" +url = "https://static.rust-lang.org/rustup/archive/1.28.2/aarch64-apple-darwin/rustup-init" + +[tools."aqua:rust-lang/rustup"."platforms.macos-x64"] +checksum = "sha256:9c331076f62b4d0edeae63d9d1c9442d5fe39b37b05025ec8d41c5ed35486496" +url = "https://static.rust-lang.org/rustup/archive/1.28.2/x86_64-apple-darwin/rustup-init" + +[tools."aqua:rust-lang/rustup"."platforms.windows-x64"] +checksum = "sha256:88d8258dcf6ae4f7a80c7d1088e1f36fa7025a1cfd1343731b4ee6f385121fc0" +url = "https://static.rust-lang.org/rustup/archive/1.28.2/x86_64-pc-windows-msvc/rustup-init.exe" [[tools."aqua:rust-lang/rustup/rustup-init"]] version = "1.28.2" backend = "aqua:rust-lang/rustup/rustup-init" -"platforms.linux-arm64" = { checksum = "sha256:e3853c5a252fca15252d07cb23a1bdd9377a8c6f3efa01531109281ae47f841c", url = "https://static.rust-lang.org/rustup/archive/1.28.2/aarch64-unknown-linux-gnu/rustup-init"} -"platforms.linux-x64" = { checksum = "sha256:20a06e644b0d9bd2fbdbfd52d42540bdde820ea7df86e92e533c073da0cdd43c", url = "https://static.rust-lang.org/rustup/archive/1.28.2/x86_64-unknown-linux-gnu/rustup-init"} -"platforms.macos-arm64" = { checksum = "sha256:20ef5516c31b1ac2290084199ba77dbbcaa1406c45c1d978ca68558ef5964ef5", url = "https://static.rust-lang.org/rustup/archive/1.28.2/aarch64-apple-darwin/rustup-init"} -"platforms.macos-x64" = { checksum = "sha256:9c331076f62b4d0edeae63d9d1c9442d5fe39b37b05025ec8d41c5ed35486496", url = "https://static.rust-lang.org/rustup/archive/1.28.2/x86_64-apple-darwin/rustup-init"} -"platforms.windows-x64" = { checksum = "sha256:88d8258dcf6ae4f7a80c7d1088e1f36fa7025a1cfd1343731b4ee6f385121fc0", url = "https://static.rust-lang.org/rustup/archive/1.28.2/x86_64-pc-windows-msvc/rustup-init.exe"} + +[tools."aqua:rust-lang/rustup/rustup-init"."platforms.linux-arm64"] +checksum = "sha256:e3853c5a252fca15252d07cb23a1bdd9377a8c6f3efa01531109281ae47f841c" +url = "https://static.rust-lang.org/rustup/archive/1.28.2/aarch64-unknown-linux-gnu/rustup-init" + +[tools."aqua:rust-lang/rustup/rustup-init"."platforms.linux-arm64-musl"] +checksum = "sha256:e3853c5a252fca15252d07cb23a1bdd9377a8c6f3efa01531109281ae47f841c" +url = "https://static.rust-lang.org/rustup/archive/1.28.2/aarch64-unknown-linux-gnu/rustup-init" + +[tools."aqua:rust-lang/rustup/rustup-init"."platforms.linux-x64"] +checksum = "sha256:20a06e644b0d9bd2fbdbfd52d42540bdde820ea7df86e92e533c073da0cdd43c" +url = "https://static.rust-lang.org/rustup/archive/1.28.2/x86_64-unknown-linux-gnu/rustup-init" + +[tools."aqua:rust-lang/rustup/rustup-init"."platforms.linux-x64-musl"] +checksum = "sha256:20a06e644b0d9bd2fbdbfd52d42540bdde820ea7df86e92e533c073da0cdd43c" +url = "https://static.rust-lang.org/rustup/archive/1.28.2/x86_64-unknown-linux-gnu/rustup-init" + +[tools."aqua:rust-lang/rustup/rustup-init"."platforms.macos-arm64"] +checksum = "sha256:20ef5516c31b1ac2290084199ba77dbbcaa1406c45c1d978ca68558ef5964ef5" +url = "https://static.rust-lang.org/rustup/archive/1.28.2/aarch64-apple-darwin/rustup-init" + +[tools."aqua:rust-lang/rustup/rustup-init"."platforms.macos-x64"] +checksum = "sha256:9c331076f62b4d0edeae63d9d1c9442d5fe39b37b05025ec8d41c5ed35486496" +url = "https://static.rust-lang.org/rustup/archive/1.28.2/x86_64-apple-darwin/rustup-init" + +[tools."aqua:rust-lang/rustup/rustup-init"."platforms.windows-x64"] +checksum = "sha256:88d8258dcf6ae4f7a80c7d1088e1f36fa7025a1cfd1343731b4ee6f385121fc0" +url = "https://static.rust-lang.org/rustup/archive/1.28.2/x86_64-pc-windows-msvc/rustup-init.exe" [[tools."aqua:ziglang/zig"]] version = "0.15.2" backend = "aqua:ziglang/zig" -"platforms.linux-arm64" = { url = "https://ziglang.org/download/0.15.2/zig-aarch64-linux-0.15.2.tar.xz"} -"platforms.linux-x64" = { url = "https://ziglang.org/download/0.15.2/zig-x86_64-linux-0.15.2.tar.xz"} -"platforms.macos-arm64" = { checksum = "blake3:c7d2fb746701fea2c070f66c29a0300ba42a0d5d2c09c493462b8c0f4f0bd604", url = "https://ziglang.org/download/0.15.2/zig-aarch64-macos-0.15.2.tar.xz"} -"platforms.macos-x64" = { url = "https://ziglang.org/download/0.15.2/zig-x86_64-macos-0.15.2.tar.xz"} -"platforms.windows-x64" = { url = "https://ziglang.org/download/0.15.2/zig-x86_64-windows-0.15.2.zip"} + +[tools."aqua:ziglang/zig"."platforms.linux-arm64"] +url = "https://ziglang.org/download/0.15.2/zig-aarch64-linux-0.15.2.tar.xz" + +[tools."aqua:ziglang/zig"."platforms.linux-x64"] +url = "https://ziglang.org/download/0.15.2/zig-x86_64-linux-0.15.2.tar.xz" + +[tools."aqua:ziglang/zig"."platforms.macos-arm64"] +checksum = "blake3:c7d2fb746701fea2c070f66c29a0300ba42a0d5d2c09c493462b8c0f4f0bd604" +url = "https://ziglang.org/download/0.15.2/zig-aarch64-macos-0.15.2.tar.xz" + +[tools."aqua:ziglang/zig"."platforms.macos-x64"] +url = "https://ziglang.org/download/0.15.2/zig-x86_64-macos-0.15.2.tar.xz" + +[tools."aqua:ziglang/zig"."platforms.windows-x64"] +url = "https://ziglang.org/download/0.15.2/zig-x86_64-windows-0.15.2.zip" [[tools.cargo-binstall]] version = "1.16.6" backend = "aqua:cargo-bins/cargo-binstall" -"platforms.linux-arm64" = { checksum = "sha256:b556421835ba67fa98ca1570c85b5511457956b7836ce938b47d3f73899517a3", url = "https://github.com/cargo-bins/cargo-binstall/releases/download/v1.16.6/cargo-binstall-aarch64-unknown-linux-musl.tgz"} -"platforms.linux-x64" = { checksum = "sha256:3225eea8041c30d7462761a481883e3aa8fe31c58def4b6c8dd91b7c80973df0", url = "https://github.com/cargo-bins/cargo-binstall/releases/download/v1.16.6/cargo-binstall-x86_64-unknown-linux-musl.tgz"} -"platforms.macos-arm64" = { checksum = "sha256:30543b378b96fbddabee1edfaccde7914dd2f851f02c560de859f81a21ab665b", url = "https://github.com/cargo-bins/cargo-binstall/releases/download/v1.16.6/cargo-binstall-aarch64-apple-darwin.zip"} -"platforms.macos-x64" = { checksum = "sha256:633dc2f381f7000d8ba3c02eb24b2f290bf0154372bafe8d8094d777f129f21d", url = "https://github.com/cargo-bins/cargo-binstall/releases/download/v1.16.6/cargo-binstall-x86_64-apple-darwin.zip"} -"platforms.windows-x64" = { checksum = "sha256:fca962c3d12ae6192280111074db073c15abad3ba162a1a5a2af0f6f01872114", url = "https://github.com/cargo-bins/cargo-binstall/releases/download/v1.16.6/cargo-binstall-x86_64-pc-windows-msvc.zip"} + +[tools.cargo-binstall."platforms.linux-arm64"] +checksum = "sha256:b556421835ba67fa98ca1570c85b5511457956b7836ce938b47d3f73899517a3" +url = "https://github.com/cargo-bins/cargo-binstall/releases/download/v1.16.6/cargo-binstall-aarch64-unknown-linux-musl.tgz" + +[tools.cargo-binstall."platforms.linux-x64"] +checksum = "sha256:3225eea8041c30d7462761a481883e3aa8fe31c58def4b6c8dd91b7c80973df0" +url = "https://github.com/cargo-bins/cargo-binstall/releases/download/v1.16.6/cargo-binstall-x86_64-unknown-linux-musl.tgz" + +[tools.cargo-binstall."platforms.macos-arm64"] +checksum = "sha256:30543b378b96fbddabee1edfaccde7914dd2f851f02c560de859f81a21ab665b" +url = "https://github.com/cargo-bins/cargo-binstall/releases/download/v1.16.6/cargo-binstall-aarch64-apple-darwin.zip" + +[tools.cargo-binstall."platforms.macos-x64"] +checksum = "sha256:633dc2f381f7000d8ba3c02eb24b2f290bf0154372bafe8d8094d777f129f21d" +url = "https://github.com/cargo-bins/cargo-binstall/releases/download/v1.16.6/cargo-binstall-x86_64-apple-darwin.zip" + +[tools.cargo-binstall."platforms.windows-x64"] +checksum = "sha256:fca962c3d12ae6192280111074db073c15abad3ba162a1a5a2af0f6f01872114" +url = "https://github.com/cargo-bins/cargo-binstall/releases/download/v1.16.6/cargo-binstall-x86_64-pc-windows-msvc.zip" [[tools."cargo:cargo-deny"]] version = "0.19.0" @@ -101,11 +247,26 @@ backend = "cargo:maturin" [[tools.go]] version = "1.25.6" backend = "core:go" -"platforms.linux-arm64" = { checksum = "sha256:738ef87d79c34272424ccdf83302b7b0300b8b096ed443896089306117943dd5", url = "https://dl.google.com/go/go1.25.6.linux-arm64.tar.gz"} -"platforms.linux-x64" = { checksum = "sha256:f022b6aad78e362bcba9b0b94d09ad58c5a70c6ba3b7582905fababf5fe0181a", url = "https://dl.google.com/go/go1.25.6.linux-amd64.tar.gz"} -"platforms.macos-arm64" = { checksum = "sha256:984521ae978a5377c7d782fd2dd953291840d7d3d0bd95781a1f32f16d94a006", url = "https://dl.google.com/go/go1.25.6.darwin-arm64.tar.gz"} -"platforms.macos-x64" = { checksum = "sha256:e2b5b237f5c262931b8e280ac4b8363f156e19bfad5270c099998932819670b7", url = "https://dl.google.com/go/go1.25.6.darwin-amd64.tar.gz"} -"platforms.windows-x64" = { checksum = "sha256:19b4733b727ba5c611b5656187f3ac367d278d64c3d4199a845e39c0fdac5335", url = "https://dl.google.com/go/go1.25.6.windows-amd64.zip"} + +[tools.go."platforms.linux-arm64"] +checksum = "sha256:738ef87d79c34272424ccdf83302b7b0300b8b096ed443896089306117943dd5" +url = "https://dl.google.com/go/go1.25.6.linux-arm64.tar.gz" + +[tools.go."platforms.linux-x64"] +checksum = "sha256:f022b6aad78e362bcba9b0b94d09ad58c5a70c6ba3b7582905fababf5fe0181a" +url = "https://dl.google.com/go/go1.25.6.linux-amd64.tar.gz" + +[tools.go."platforms.macos-arm64"] +checksum = "sha256:984521ae978a5377c7d782fd2dd953291840d7d3d0bd95781a1f32f16d94a006" +url = "https://dl.google.com/go/go1.25.6.darwin-arm64.tar.gz" + +[tools.go."platforms.macos-x64"] +checksum = "sha256:e2b5b237f5c262931b8e280ac4b8363f156e19bfad5270c099998932819670b7" +url = "https://dl.google.com/go/go1.25.6.darwin-amd64.tar.gz" + +[tools.go."platforms.windows-x64"] +checksum = "sha256:19b4733b727ba5c611b5656187f3ac367d278d64c3d4199a845e39c0fdac5335" +url = "https://dl.google.com/go/go1.25.6.windows-amd64.zip" [[tools."npm:markdownlint-cli2"]] version = "0.22.0" @@ -126,11 +287,26 @@ backend = "core:python" [[tools.ruff]] version = "0.14.13" backend = "aqua:astral-sh/ruff" -"platforms.linux-arm64" = { checksum = "sha256:25941b777ff712f4d9473d26c1b875034214a3d5de20ea99b2add939dcd0b367", url = "https://github.com/astral-sh/ruff/releases/download/0.14.13/ruff-aarch64-unknown-linux-musl.tar.gz"} -"platforms.linux-x64" = { checksum = "sha256:2fe394f493318551f271277a2228e56b31ca69a4842483e5709af4548f342bc3", url = "https://github.com/astral-sh/ruff/releases/download/0.14.13/ruff-x86_64-unknown-linux-musl.tar.gz"} -"platforms.macos-arm64" = { checksum = "sha256:067d1a90da8add55614eff91990425883a092d8279d9e503258ff8be0f8e9c18", url = "https://github.com/astral-sh/ruff/releases/download/0.14.13/ruff-aarch64-apple-darwin.tar.gz"} -"platforms.macos-x64" = { checksum = "sha256:69e424a42ac3a7c6c7032ad96deb757c35c93c848b6ea329a3f4c605e6d89ef9", url = "https://github.com/astral-sh/ruff/releases/download/0.14.13/ruff-x86_64-apple-darwin.tar.gz"} -"platforms.windows-x64" = { checksum = "sha256:d2af4376053458f283d74980b49dc0d61d3ef9d9b8684c5b25bd64b73e11634a", url = "https://github.com/astral-sh/ruff/releases/download/0.14.13/ruff-x86_64-pc-windows-msvc.zip"} + +[tools.ruff."platforms.linux-arm64"] +checksum = "sha256:25941b777ff712f4d9473d26c1b875034214a3d5de20ea99b2add939dcd0b367" +url = "https://github.com/astral-sh/ruff/releases/download/0.14.13/ruff-aarch64-unknown-linux-musl.tar.gz" + +[tools.ruff."platforms.linux-x64"] +checksum = "sha256:2fe394f493318551f271277a2228e56b31ca69a4842483e5709af4548f342bc3" +url = "https://github.com/astral-sh/ruff/releases/download/0.14.13/ruff-x86_64-unknown-linux-musl.tar.gz" + +[tools.ruff."platforms.macos-arm64"] +checksum = "sha256:067d1a90da8add55614eff91990425883a092d8279d9e503258ff8be0f8e9c18" +url = "https://github.com/astral-sh/ruff/releases/download/0.14.13/ruff-aarch64-apple-darwin.tar.gz" + +[tools.ruff."platforms.macos-x64"] +checksum = "sha256:69e424a42ac3a7c6c7032ad96deb757c35c93c848b6ea329a3f4c605e6d89ef9" +url = "https://github.com/astral-sh/ruff/releases/download/0.14.13/ruff-x86_64-apple-darwin.tar.gz" + +[tools.ruff."platforms.windows-x64"] +checksum = "sha256:d2af4376053458f283d74980b49dc0d61d3ef9d9b8684c5b25bd64b73e11634a" +url = "https://github.com/astral-sh/ruff/releases/download/0.14.13/ruff-x86_64-pc-windows-msvc.zip" [[tools.rust]] version = "1.93.0" @@ -139,26 +315,71 @@ backend = "core:rust" [[tools.ty]] version = "0.0.10" backend = "aqua:astral-sh/ty" -"platforms.linux-arm64" = { checksum = "sha256:43b3ceb655a8f6362733c3e3097aadba21b0077cb8ccc4873b6e187c083bd605", url = "https://github.com/astral-sh/ty/releases/download/0.0.10/ty-aarch64-unknown-linux-musl.tar.gz"} -"platforms.linux-x64" = { checksum = "sha256:870e0f634d740df2a543dc977d68cae9bb073f1e70da93278b78622962a51189", url = "https://github.com/astral-sh/ty/releases/download/0.0.10/ty-x86_64-unknown-linux-musl.tar.gz"} -"platforms.macos-arm64" = { checksum = "sha256:5c256844da0401534908535d3c744ffb28db823e2e21ebc2aa45fa4b0599f6f5", url = "https://github.com/astral-sh/ty/releases/download/0.0.10/ty-aarch64-apple-darwin.tar.gz"} -"platforms.macos-x64" = { checksum = "sha256:eb839e72d317e381ad7c5804d61a6098b041b0b7bd0a207f429b8bfe9f445be0", url = "https://github.com/astral-sh/ty/releases/download/0.0.10/ty-x86_64-apple-darwin.tar.gz"} -"platforms.windows-x64" = { checksum = "sha256:d7cd33adf0113decee579fbf31f58b55e44195571043b22ed0e653bf60062d4a", url = "https://github.com/astral-sh/ty/releases/download/0.0.10/ty-x86_64-pc-windows-msvc.zip"} + +[tools.ty."platforms.linux-arm64"] +checksum = "sha256:43b3ceb655a8f6362733c3e3097aadba21b0077cb8ccc4873b6e187c083bd605" +url = "https://github.com/astral-sh/ty/releases/download/0.0.10/ty-aarch64-unknown-linux-musl.tar.gz" + +[tools.ty."platforms.linux-x64"] +checksum = "sha256:870e0f634d740df2a543dc977d68cae9bb073f1e70da93278b78622962a51189" +url = "https://github.com/astral-sh/ty/releases/download/0.0.10/ty-x86_64-unknown-linux-musl.tar.gz" + +[tools.ty."platforms.macos-arm64"] +checksum = "sha256:5c256844da0401534908535d3c744ffb28db823e2e21ebc2aa45fa4b0599f6f5" +url = "https://github.com/astral-sh/ty/releases/download/0.0.10/ty-aarch64-apple-darwin.tar.gz" + +[tools.ty."platforms.macos-x64"] +checksum = "sha256:eb839e72d317e381ad7c5804d61a6098b041b0b7bd0a207f429b8bfe9f445be0" +url = "https://github.com/astral-sh/ty/releases/download/0.0.10/ty-x86_64-apple-darwin.tar.gz" + +[tools.ty."platforms.windows-x64"] +checksum = "sha256:d7cd33adf0113decee579fbf31f58b55e44195571043b22ed0e653bf60062d4a" +url = "https://github.com/astral-sh/ty/releases/download/0.0.10/ty-x86_64-pc-windows-msvc.zip" [[tools.uv]] version = "0.9.26" backend = "aqua:astral-sh/uv" -"platforms.linux-arm64" = { checksum = "sha256:ba8698c36c00c22efed4bd3506339b03c95604d001f02eaf6fbc814c9224d801", url = "https://github.com/astral-sh/uv/releases/download/0.9.26/uv-aarch64-unknown-linux-musl.tar.gz"} -"platforms.linux-x64" = { checksum = "sha256:708b752876aeeb753257e1d55470569789e465684c1d3bc1760db26360b6c28b", url = "https://github.com/astral-sh/uv/releases/download/0.9.26/uv-x86_64-unknown-linux-musl.tar.gz"} -"platforms.macos-arm64" = { checksum = "sha256:fcf0a9ea6599c6ae28a4c854ac6da76f2c889354d7c36ce136ef071f7ab9721f", url = "https://github.com/astral-sh/uv/releases/download/0.9.26/uv-aarch64-apple-darwin.tar.gz"} -"platforms.macos-x64" = { checksum = "sha256:171eb8c518313e157c5b4cec7b4f743bc6bab1bd23e09b646679a02d096a047f", url = "https://github.com/astral-sh/uv/releases/download/0.9.26/uv-x86_64-apple-darwin.tar.gz"} -"platforms.windows-x64" = { checksum = "sha256:eb02fd95d8e0eed462b4a67ecdd320d865b38c560bffcda9a0b87ec944bdf036", url = "https://github.com/astral-sh/uv/releases/download/0.9.26/uv-x86_64-pc-windows-msvc.zip"} + +[tools.uv."platforms.linux-arm64"] +checksum = "sha256:ba8698c36c00c22efed4bd3506339b03c95604d001f02eaf6fbc814c9224d801" +url = "https://github.com/astral-sh/uv/releases/download/0.9.26/uv-aarch64-unknown-linux-musl.tar.gz" + +[tools.uv."platforms.linux-x64"] +checksum = "sha256:708b752876aeeb753257e1d55470569789e465684c1d3bc1760db26360b6c28b" +url = "https://github.com/astral-sh/uv/releases/download/0.9.26/uv-x86_64-unknown-linux-musl.tar.gz" + +[tools.uv."platforms.macos-arm64"] +checksum = "sha256:fcf0a9ea6599c6ae28a4c854ac6da76f2c889354d7c36ce136ef071f7ab9721f" +url = "https://github.com/astral-sh/uv/releases/download/0.9.26/uv-aarch64-apple-darwin.tar.gz" + +[tools.uv."platforms.macos-x64"] +checksum = "sha256:171eb8c518313e157c5b4cec7b4f743bc6bab1bd23e09b646679a02d096a047f" +url = "https://github.com/astral-sh/uv/releases/download/0.9.26/uv-x86_64-apple-darwin.tar.gz" + +[tools.uv."platforms.windows-x64"] +checksum = "sha256:eb02fd95d8e0eed462b4a67ecdd320d865b38c560bffcda9a0b87ec944bdf036" +url = "https://github.com/astral-sh/uv/releases/download/0.9.26/uv-x86_64-pc-windows-msvc.zip" [[tools.zig]] version = "0.15.2" backend = "core:zig" -"platforms.linux-arm64" = { checksum = "sha256:958ed7d1e00d0ea76590d27666efbf7a932281b3d7ba0c6b01b0ff26498f667f", url = "https://ziglang.org/download/0.15.2/zig-aarch64-linux-0.15.2.tar.xz"} -"platforms.linux-x64" = { checksum = "sha256:02aa270f183da276e5b5920b1dac44a63f1a49e55050ebde3aecc9eb82f93239", url = "https://ziglang.org/download/0.15.2/zig-x86_64-linux-0.15.2.tar.xz"} -"platforms.macos-arm64" = { checksum = "sha256:3cc2bab367e185cdfb27501c4b30b1b0653c28d9f73df8dc91488e66ece5fa6b", url = "https://ziglang.org/download/0.15.2/zig-aarch64-macos-0.15.2.tar.xz"} -"platforms.macos-x64" = { checksum = "sha256:375b6909fc1495d16fc2c7db9538f707456bfc3373b14ee83fdd3e22b3d43f7f", url = "https://ziglang.org/download/0.15.2/zig-x86_64-macos-0.15.2.tar.xz"} -"platforms.windows-x64" = { checksum = "sha256:3a0ed1e8799a2f8ce2a6e6290a9ff22e6906f8227865911fb7ddedc3cc14cb0c", url = "https://ziglang.org/download/0.15.2/zig-x86_64-windows-0.15.2.zip"} + +[tools.zig."platforms.linux-arm64"] +checksum = "sha256:958ed7d1e00d0ea76590d27666efbf7a932281b3d7ba0c6b01b0ff26498f667f" +url = "https://ziglang.org/download/0.15.2/zig-aarch64-linux-0.15.2.tar.xz" + +[tools.zig."platforms.linux-x64"] +checksum = "sha256:02aa270f183da276e5b5920b1dac44a63f1a49e55050ebde3aecc9eb82f93239" +url = "https://ziglang.org/download/0.15.2/zig-x86_64-linux-0.15.2.tar.xz" + +[tools.zig."platforms.macos-arm64"] +checksum = "sha256:3cc2bab367e185cdfb27501c4b30b1b0653c28d9f73df8dc91488e66ece5fa6b" +url = "https://ziglang.org/download/0.15.2/zig-aarch64-macos-0.15.2.tar.xz" + +[tools.zig."platforms.macos-x64"] +checksum = "sha256:375b6909fc1495d16fc2c7db9538f707456bfc3373b14ee83fdd3e22b3d43f7f" +url = "https://ziglang.org/download/0.15.2/zig-x86_64-macos-0.15.2.tar.xz" + +[tools.zig."platforms.windows-x64"] +checksum = "sha256:3a0ed1e8799a2f8ce2a6e6290a9ff22e6906f8227865911fb7ddedc3cc14cb0c" +url = "https://ziglang.org/download/0.15.2/zig-x86_64-windows-0.15.2.zip"