From 5fd58e5da6d15ee9fb01902339f0bd48b43beaa2 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Tue, 11 Mar 2025 11:03:06 +0100 Subject: [PATCH 001/739] chore(main): release 1.475.1 (#5465) * chore(main): release 1.475.1 * Apply automatic changes --------- Co-authored-by: rubenfiszel <275584+rubenfiszel@users.noreply.github.com> --- CHANGELOG.md | 8 + backend/Cargo.lock | 503 ++++++++++-------- backend/Cargo.toml | 4 +- backend/windmill-api/openapi.yaml | 2 +- benchmarks/lib.ts | 2 +- cli/main.ts | 2 +- frontend/package-lock.json | 4 +- frontend/package.json | 2 +- lsp/Pipfile | 4 +- openflow.openapi.yaml | 2 +- .../WindmillClient/WindmillClient.psd1 | 2 +- python-client/wmill/pyproject.toml | 2 +- python-client/wmill_pg/pyproject.toml | 2 +- typescript-client/jsr.json | 2 +- typescript-client/package.json | 2 +- version.txt | 2 +- 16 files changed, 304 insertions(+), 241 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f65c9615e..977fed5c99 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [1.475.1](https://github.com/windmill-labs/windmill/compare/v1.475.0...v1.475.1) (2025-03-11) + + +### Bug Fixes + +* improve arginput sql and object viewer args change ([2a8a756](https://github.com/windmill-labs/windmill/commit/2a8a756b3f0a0e69145421eee87251956d85403b)) +* improve flow status viewer iteration picker behavior with very large forloops ([78d9664](https://github.com/windmill-labs/windmill/commit/78d9664ad89212196ef32c0a02114092331bfe63)) + ## [1.475.0](https://github.com/windmill-labs/windmill/compare/v1.474.0...v1.475.0) (2025-03-06) diff --git a/backend/Cargo.lock b/backend/Cargo.lock index 0128144432..48962599fb 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -421,7 +421,7 @@ dependencies = [ "arrow-schema", "chrono", "half", - "indexmap 2.7.1", + "indexmap 2.8.0", "lexical-core", "num", "serde", @@ -551,7 +551,7 @@ dependencies = [ "proc-macro2", "quote", "swc_macros_common", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -601,7 +601,7 @@ dependencies = [ "portable-atomic", "rand 0.8.5", "regex", - "ring 0.17.12", + "ring 0.17.13", "rustls-native-certs 0.7.3", "rustls-pemfile 2.2.0", "rustls-webpki 0.102.8", @@ -653,7 +653,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -675,7 +675,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -711,7 +711,7 @@ checksum = "d556ec1359574147ec0c4fc5eb525f3f23263a592b1a9c07e0a75b427de55c97" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -786,7 +786,7 @@ dependencies = [ "fastrand 2.3.0", "hex", "http 0.2.12", - "ring 0.17.12", + "ring 0.17.13", "time", "tokio", "tracing", @@ -945,9 +945,9 @@ dependencies = [ [[package]] name = "aws-smithy-async" -version = "1.2.4" +version = "1.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa59d1327d8b5053c54bf2eaae63bf629ba9e904434d0835a28ed3c0ed0a614e" +checksum = "1e190749ea56f8c42bf15dd76c65e14f8f765233e6df9b0506d9d934ebef867c" dependencies = [ "futures-util", "pin-project-lite", @@ -995,10 +995,51 @@ dependencies = [ ] [[package]] -name = "aws-smithy-json" -version = "0.61.2" +name = "aws-smithy-http" +version = "0.62.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "623a51127f24c30776c8b374295f2df78d92517386f77ba30773f15a30ce1422" +checksum = "c5949124d11e538ca21142d1fba61ab0a2a2c1bc3ed323cdb3e4b878bfb83166" +dependencies = [ + "aws-smithy-runtime-api", + "aws-smithy-types", + "bytes", + "bytes-utils", + "futures-core", + "http 0.2.12", + "http 1.2.0", + "http-body 0.4.6", + "once_cell", + "percent-encoding", + "pin-project-lite", + "pin-utils", + "tracing", +] + +[[package]] +name = "aws-smithy-http-client" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0497ef5d53065b7cd6a35e9c1654bd1fefeae5c52900d91d1b188b0af0f29324" +dependencies = [ + "aws-smithy-async", + "aws-smithy-runtime-api", + "aws-smithy-types", + "h2 0.4.8", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.32", + "hyper-rustls 0.24.2", + "pin-project-lite", + "rustls 0.21.12", + "tokio", + "tracing", +] + +[[package]] +name = "aws-smithy-json" +version = "0.61.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92144e45819cae7dc62af23eac5a038a58aa544432d2102609654376a900bd07" dependencies = [ "aws-smithy-types", ] @@ -1015,36 +1056,33 @@ dependencies = [ [[package]] name = "aws-smithy-runtime" -version = "1.7.8" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d526a12d9ed61fadefda24abe2e682892ba288c2018bcb38b1b4c111d13f6d92" +checksum = "f6328865e36c6fd970094ead6b05efd047d3a80ec5fc3be5e743910da9f2ebf8" dependencies = [ "aws-smithy-async", - "aws-smithy-http 0.60.12", + "aws-smithy-http 0.62.0", + "aws-smithy-http-client", "aws-smithy-runtime-api", "aws-smithy-types", "bytes", "fastrand 2.3.0", - "h2 0.3.26", "http 0.2.12", + "http 1.2.0", "http-body 0.4.6", "http-body 1.0.1", - "httparse", - "hyper 0.14.32", - "hyper-rustls 0.24.2", "once_cell", "pin-project-lite", "pin-utils", - "rustls 0.21.12", "tokio", "tracing", ] [[package]] name = "aws-smithy-runtime-api" -version = "1.7.3" +version = "1.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92165296a47a812b267b4f41032ff8069ab7ff783696d217f0994a0d7ab585cd" +checksum = "3da37cf5d57011cb1753456518ec76e31691f1f474b73934a284eb2a1c76510f" dependencies = [ "aws-smithy-async", "aws-smithy-types", @@ -1059,9 +1097,9 @@ dependencies = [ [[package]] name = "aws-smithy-types" -version = "1.2.13" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7b8a53819e42f10d0821f56da995e1470b199686a1809168db6ca485665f042" +checksum = "836155caafba616c0ff9b07944324785de2ab016141c3550bd1c07882f8cee8f" dependencies = [ "base64-simd 0.8.0", "bytes", @@ -1245,9 +1283,9 @@ dependencies = [ [[package]] name = "base64ct" -version = "1.6.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +checksum = "bb97d56060ee67d285efb8001fec9d2a4c710c32efd2e14b5cbb5ba71930fc2d" [[package]] name = "better_scoped_tls" @@ -1299,7 +1337,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.99", + "syn 2.0.100", "which 4.4.2", ] @@ -1320,7 +1358,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -1510,7 +1548,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -1520,7 +1558,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17d4f95e880cfd28c4ca5a006cf7f6af52b4bcb7b5866f573b2faa126fb7affb" dependencies = [ "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -1632,7 +1670,7 @@ checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -1778,7 +1816,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b4a6cae9efc04cc6cbb8faf338d2c497c165c83e74509cf4dbedea948bbf6e5" dependencies = [ "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -1936,9 +1974,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.31" +version = "4.5.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "027bb0d98429ae334a8698531da7077bdf906419543a35a55c2cb1b66437d767" +checksum = "6088f3ae8c3608d19260cd7445411865a485688711b78b5be70d78cd96136f83" dependencies = [ "clap_builder", "clap_derive", @@ -1946,9 +1984,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.31" +version = "4.5.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5589e0cba072e0f3d23791efac0fd8627b49c829c196a492e88168e6a669d863" +checksum = "22a7ef7f676155edfb82daa97f99441f3ebf4a58d5e32f295a56259f1b6facc8" dependencies = [ "anstream", "anstyle", @@ -1958,14 +1996,14 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.28" +version = "4.5.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf4ced95c6f4a675af3da73304b9ac4ed991640c36374e4b46795c49e17cf1ed" +checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -2020,7 +2058,7 @@ dependencies = [ "nom 7.1.3", "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -2406,7 +2444,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -2489,7 +2527,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -2522,7 +2560,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core 0.20.10", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -2584,7 +2622,7 @@ dependencies = [ "glob", "half", "hashbrown 0.14.5", - "indexmap 2.7.1", + "indexmap 2.8.0", "itertools 0.12.1", "log", "num_cpus", @@ -2753,7 +2791,7 @@ dependencies = [ "datafusion-expr", "datafusion-physical-expr", "hashbrown 0.14.5", - "indexmap 2.7.1", + "indexmap 2.8.0", "itertools 0.12.1", "log", "regex-syntax 0.8.5", @@ -2782,7 +2820,7 @@ dependencies = [ "half", "hashbrown 0.14.5", "hex", - "indexmap 2.7.1", + "indexmap 2.8.0", "itertools 0.12.1", "log", "paste", @@ -2826,7 +2864,7 @@ dependencies = [ "futures", "half", "hashbrown 0.14.5", - "indexmap 2.7.1", + "indexmap 2.8.0", "itertools 0.12.1", "log", "once_cell", @@ -2958,7 +2996,7 @@ dependencies = [ "deno_media_type", "deno_path_util", "http 1.2.0", - "indexmap 2.7.1", + "indexmap 2.8.0", "log", "once_cell", "parking_lot", @@ -2999,7 +3037,7 @@ dependencies = [ "glob", "ignore", "import_map", - "indexmap 2.7.1", + "indexmap 2.8.0", "jsonc-parser", "log", "percent-encoding", @@ -3040,7 +3078,7 @@ dependencies = [ "deno_path_util", "deno_unsync", "futures", - "indexmap 2.7.1", + "indexmap 2.8.0", "libc", "memoffset", "parking_lot", @@ -3106,7 +3144,7 @@ dependencies = [ "p384", "p521", "rand 0.8.5", - "ring 0.17.12", + "ring 0.17.13", "rsa", "sec1", "serde", @@ -3143,7 +3181,7 @@ checksum = "babccedee31ce7e57c3e6dff2cb3ab8d68c49d0df8222fe0d11d628e65192790" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -3264,7 +3302,7 @@ dependencies = [ "percent-encoding", "phf", "pin-project", - "ring 0.17.12", + "ring 0.17.13", "scopeguard", "serde", "smallvec", @@ -3451,7 +3489,7 @@ dependencies = [ "hyper 1.6.0", "hyper-util", "idna", - "indexmap 2.7.1", + "indexmap 2.8.0", "ipnetwork", "k256", "lazy-regex", @@ -3474,7 +3512,7 @@ dependencies = [ "pkcs8", "rand 0.8.5", "regex", - "ring 0.17.12", + "ring 0.17.13", "ripemd", "rsa", "scrypt", @@ -3527,14 +3565,14 @@ version = "0.212.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2d328067139909aa81522a5d90f119368b541fbddd73ab630e4d9f777865f0d" dependencies = [ - "indexmap 2.7.1", + "indexmap 2.8.0", "proc-macro-rules", "proc-macro2", "quote", "stringcase", "strum 0.25.0", "strum_macros 0.25.3", - "syn 2.0.99", + "syn 2.0.100", "thiserror 2.0.12", ] @@ -3571,7 +3609,7 @@ dependencies = [ "deno_error", "deno_path_util", "deno_semver", - "indexmap 2.7.1", + "indexmap 2.8.0", "serde", "serde_json", "sys_traits", @@ -4036,7 +4074,7 @@ checksum = "8034092389675178f570469e6c3b0465d3d30b4505c294a6550db47f3c17ad18" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -4090,7 +4128,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version 0.4.1", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -4195,7 +4233,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -4230,7 +4268,7 @@ checksum = "f2b99bf03862d7f545ebc28ddd33a665b50865f4dfd84031a393823879bd4c54" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -4478,7 +4516,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -4498,7 +4536,7 @@ checksum = "fc4caf64a58d7a6d65ab00639b046ff54399a39f5f2554728895ace4b297cd79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -4636,13 +4674,13 @@ dependencies = [ [[package]] name = "fd-lock" -version = "4.0.2" +version = "4.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e5768da2206272c81ef0b5e951a41862938a6070da63bcea197899942d3b947" +checksum = "0ce92ff622d6dadf7349484f42c93271a0d49b7cc4d466a936405bacbe10aa78" dependencies = [ "cfg-if", - "rustix", - "windows-sys 0.52.0", + "rustix 1.0.2", + "windows-sys 0.59.0", ] [[package]] @@ -4656,9 +4694,9 @@ dependencies = [ [[package]] name = "ff" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" dependencies = [ "rand_core 0.6.4", "subtle", @@ -4780,7 +4818,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -4818,7 +4856,7 @@ checksum = "32016f1242eb82af5474752d00fd8ebcd9004bd69b462b1c91de833972d08ed4" dependencies = [ "proc-macro2", "swc_macros_common", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -4838,7 +4876,7 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7e180ac76c23b45e767bd7ae9579bc0bb458618c4bc71835926e098e61d15f8" dependencies = [ - "rustix", + "rustix 0.38.44", "windows-sys 0.52.0", ] @@ -4962,7 +5000,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -5250,7 +5288,7 @@ checksum = "53010ccb100b96a67bc32c0175f0ed1426b31b655d562898e57325f81c023ac0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -5412,7 +5450,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.7.1", + "indexmap 2.8.0", "slab", "tokio", "tokio-util", @@ -5431,7 +5469,7 @@ dependencies = [ "futures-core", "futures-sink", "http 1.2.0", - "indexmap 2.7.1", + "indexmap 2.8.0", "slab", "tokio", "tokio-util", @@ -5509,7 +5547,7 @@ checksum = "f208758247e68e239acaa059e72e4ce1f30f2a4b6523f19c1b923d25b7e9cceb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -6112,7 +6150,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -6185,7 +6223,7 @@ checksum = "1215d4d92511fbbdaea50e750e91f2429598ef817f02b579158e92803b52c00a" dependencies = [ "boxed_error", "deno_error", - "indexmap 2.7.1", + "indexmap 2.8.0", "log", "percent-encoding", "serde", @@ -6207,9 +6245,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.7.1" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" +checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058" dependencies = [ "equivalent", "hashbrown 0.15.2", @@ -6319,7 +6357,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -6466,7 +6504,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ee7893dab2e44ae5f9d0173f26ff4aa327c10b01b06a72b52dd9405b628640d" dependencies = [ - "indexmap 2.7.1", + "indexmap 2.8.0", ] [[package]] @@ -6547,7 +6585,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -6755,6 +6793,12 @@ version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" +[[package]] +name = "linux-raw-sys" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db9c683daf087dc577b7506e9695b3d556a9f3849903fa28186283afd6809e9" + [[package]] name = "litemap" version = "0.7.5" @@ -7217,7 +7261,7 @@ checksum = "c402a4092d5e204f32c9e155431046831fa712637043c58cb73bc6bc6c9663b5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -7262,7 +7306,7 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", "termcolor", "thiserror 1.0.69", ] @@ -7342,7 +7386,7 @@ dependencies = [ "bitflags 2.9.0", "codespan-reporting", "hexf-parse", - "indexmap 2.7.1", + "indexmap 2.8.0", "log", "num-traits", "rustc-hash 1.1.0", @@ -7362,7 +7406,7 @@ dependencies = [ "quote", "serde", "serde_json", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -7664,7 +7708,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -7731,7 +7775,7 @@ dependencies = [ "quick-xml 0.36.2", "rand 0.8.5", "reqwest 0.12.12", - "ring 0.17.12", + "ring 0.17.13", "serde", "serde_json", "snafu", @@ -7761,9 +7805,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.20.3" +version = "1.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" +checksum = "cde51589ab56b20a6f686b2c68f7a0bd6add753d697abf720d63f8db3ab7b1ad" [[package]] name = "oneshot" @@ -7864,7 +7908,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -8278,7 +8322,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset 0.4.2", - "indexmap 2.7.1", + "indexmap 2.8.0", ] [[package]] @@ -8288,7 +8332,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772" dependencies = [ "fixedbitset 0.5.7", - "indexmap 2.7.1", + "indexmap 2.8.0", ] [[package]] @@ -8340,7 +8384,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -8381,7 +8425,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -8564,11 +8608,11 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ - "zerocopy 0.7.35", + "zerocopy 0.8.23", ] [[package]] @@ -8594,7 +8638,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1ccf34da56fc294e7d4ccf69a85992b7dfb826b7cf57bac6a70bba3494cc08a" dependencies = [ "proc-macro2", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -8658,7 +8702,7 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -8669,7 +8713,7 @@ checksum = "07c277e4e643ef00c1233393c673f655e3672cf7eb3ba08a00bdd0ea59139b5f" dependencies = [ "proc-macro-rules-macros", "proc-macro2", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -8681,7 +8725,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -8748,7 +8792,7 @@ dependencies = [ "schemars", "serde", "serde_json", - "syn 2.0.99", + "syn 2.0.100", "thiserror 1.0.69", "typify", "unicode-ident", @@ -8768,7 +8812,7 @@ dependencies = [ "serde_json", "serde_tokenstream", "serde_yaml", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -8817,7 +8861,7 @@ dependencies = [ "prost", "prost-types", "regex", - "syn 2.0.99", + "syn 2.0.100", "tempfile", ] @@ -8831,7 +8875,7 @@ dependencies = [ "itertools 0.14.0", "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -8961,7 +9005,7 @@ dependencies = [ "bytes", "getrandom 0.2.15", "rand 0.8.5", - "ring 0.17.12", + "ring 0.17.13", "rustc-hash 2.1.1", "rustls 0.23.23", "rustls-pki-types", @@ -9043,7 +9087,7 @@ checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.3", - "zerocopy 0.8.22", + "zerocopy 0.8.23", ] [[package]] @@ -9258,7 +9302,7 @@ checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -9474,9 +9518,9 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.12" +version = "0.17.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed9b823fa29b721a59671b41d6b06e66b29e0628e207e8b1c3ceeda701ec928d" +checksum = "70ac5d832aa16abd7d1def883a8545280c20a60f523a370aa3a9617c2b8550ee" dependencies = [ "cc", "cfg-if", @@ -9611,7 +9655,7 @@ dependencies = [ "quote", "rust-embed-utils", "shellexpand", - "syn 2.0.99", + "syn 2.0.100", "walkdir", ] @@ -9719,7 +9763,20 @@ dependencies = [ "bitflags 2.9.0", "errno", "libc", - "linux-raw-sys", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustix" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7178faa4b75a30e269c71e61c353ce2748cf3d76f0c44c393f4e60abf49b825" +dependencies = [ + "bitflags 2.9.0", + "errno", + "libc", + "linux-raw-sys 0.9.2", "windows-sys 0.59.0", ] @@ -9730,7 +9787,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" dependencies = [ "log", - "ring 0.17.12", + "ring 0.17.13", "rustls-webpki 0.101.7", "sct", ] @@ -9742,7 +9799,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" dependencies = [ "log", - "ring 0.17.12", + "ring 0.17.13", "rustls-pki-types", "rustls-webpki 0.102.8", "subtle", @@ -9757,7 +9814,7 @@ checksum = "47796c98c480fce5406ef69d1c76378375492c3b0a0de587be0c1d9feb12f395" dependencies = [ "log", "once_cell", - "ring 0.17.12", + "ring 0.17.13", "rustls-pki-types", "rustls-webpki 0.102.8", "subtle", @@ -9846,7 +9903,7 @@ version = "0.101.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ - "ring 0.17.12", + "ring 0.17.13", "untrusted 0.9.0", ] @@ -9856,7 +9913,7 @@ version = "0.102.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" dependencies = [ - "ring 0.17.12", + "ring 0.17.13", "rustls-pki-types", "untrusted 0.9.0", ] @@ -10061,7 +10118,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -10094,7 +10151,7 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ - "ring 0.17.12", + "ring 0.17.13", "untrusted 0.9.0", ] @@ -10187,9 +10244,9 @@ checksum = "1bc711410fbe7399f390ca1c3b60ad0f53f80e95c5eb935e52268a0e2cd49acc" [[package]] name = "serde" -version = "1.0.218" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ "serde_derive", ] @@ -10229,22 +10286,22 @@ dependencies = [ [[package]] name = "serde_bytes" -version = "0.11.16" +version = "0.11.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "364fec0df39c49a083c9a8a18a23a6bcfd9af130fe9fe321d18520a0d113e09e" +checksum = "8437fd221bde2d4ca316d61b90e337e9e702b3820b87d63caa9ba6c02bd06d96" dependencies = [ "serde", ] [[package]] name = "serde_derive" -version = "1.0.218" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -10255,7 +10312,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -10264,7 +10321,7 @@ version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ - "indexmap 2.7.1", + "indexmap 2.8.0", "itoa", "memchr", "ryu", @@ -10329,7 +10386,7 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -10350,7 +10407,7 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -10389,7 +10446,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.7.1", + "indexmap 2.8.0", "serde", "serde_derive", "serde_json", @@ -10406,7 +10463,7 @@ dependencies = [ "darling 0.20.10", "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -10415,7 +10472,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.7.1", + "indexmap 2.8.0", "itoa", "ryu", "serde", @@ -10840,7 +10897,7 @@ checksum = "01b2e185515564f15375f593fb966b5718bc624ba77fe49fa4616ad619690554" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -10875,7 +10932,7 @@ dependencies = [ "futures-util", "hashbrown 0.15.2", "hashlink 0.10.0", - "indexmap 2.7.1", + "indexmap 2.8.0", "log", "memchr", "once_cell", @@ -10905,7 +10962,7 @@ dependencies = [ "quote", "sqlx-core", "sqlx-macros-core", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -10928,7 +10985,7 @@ dependencies = [ "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn 2.0.99", + "syn 2.0.100", "tempfile", "tokio", "url", @@ -11079,7 +11136,7 @@ dependencies = [ "proc-macro2", "quote", "swc_macros_common", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -11139,7 +11196,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -11152,7 +11209,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -11244,7 +11301,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4740e53eaf68b101203c1df0937d5161a29f3c13bceed0836ddfe245b72dd000" dependencies = [ "anyhow", - "indexmap 2.7.1", + "indexmap 2.8.0", "serde", "serde_json", "swc_cached", @@ -11260,7 +11317,7 @@ dependencies = [ "proc-macro2", "quote", "swc_macros_common", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -11309,7 +11366,7 @@ dependencies = [ "proc-macro2", "quote", "swc_macros_common", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -11356,7 +11413,7 @@ checksum = "65f21494e75d0bd8ef42010b47cabab9caaed8f2207570e809f6f4eb51a710d1" dependencies = [ "better_scoped_tls", "bitflags 2.9.0", - "indexmap 2.7.1", + "indexmap 2.8.0", "once_cell", "phf", "rustc-hash 1.1.0", @@ -11394,7 +11451,7 @@ dependencies = [ "proc-macro2", "quote", "swc_macros_common", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -11425,7 +11482,7 @@ checksum = "76c76d8b9792ce51401d38da0fa62158d61f6d80d16d68fe5b03ce4bf5fba383" dependencies = [ "base64 0.21.7", "dashmap", - "indexmap 2.7.1", + "indexmap 2.8.0", "once_cell", "serde", "sha1", @@ -11465,7 +11522,7 @@ version = "0.134.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "029eec7dd485923a75b5a45befd04510288870250270292fc2c1b3a9e7547408" dependencies = [ - "indexmap 2.7.1", + "indexmap 2.8.0", "num_cpus", "once_cell", "rustc-hash 1.1.0", @@ -11501,7 +11558,7 @@ checksum = "63db0adcff29d220c3d151c5b25c0eabe7e32dd936212b84cdaa1392e3130497" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -11512,7 +11569,7 @@ checksum = "f486687bfb7b5c560868f69ed2d458b880cebc9babebcb67e49f31b55c5bf847" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -11535,7 +11592,7 @@ dependencies = [ "proc-macro2", "quote", "swc_macros_common", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -11551,9 +11608,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.99" +version = "2.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e02e925281e18ffd9d640e234264753c43edc62d64b2d4cf898f1bc5e75f3fc2" +checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" dependencies = [ "proc-macro2", "quote", @@ -11595,7 +11652,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -11830,15 +11887,15 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.17.1" +version = "3.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e5a0acb1f3f55f65cc4a866c361b2fb2a0ff6366785ae6fbb5f85df07ba230" +checksum = "2c317e0a526ee6120d8dabad239c8dadca62b24b6f168914bbbc8e2fb1f0e567" dependencies = [ "cfg-if", "fastrand 2.3.0", "getrandom 0.3.1", "once_cell", - "rustix", + "rustix 1.0.2", "windows-sys 0.59.0", ] @@ -11886,7 +11943,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -11897,7 +11954,7 @@ checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -12107,9 +12164,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.43.0" +version = "1.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" +checksum = "9975ea0f48b5aa3972bf2d888c238182458437cc2a19374b81b25cdf1023fb3a" dependencies = [ "backtrace", "bytes", @@ -12142,7 +12199,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -12331,7 +12388,7 @@ dependencies = [ "http 1.2.0", "httparse", "rand 0.8.5", - "ring 0.17.12", + "ring 0.17.13", "rustls-native-certs 0.8.1", "rustls-pki-types", "tokio", @@ -12378,7 +12435,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.7.1", + "indexmap 2.8.0", "serde", "serde_spanned", "toml_datetime", @@ -12391,7 +12448,7 @@ version = "0.22.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" dependencies = [ - "indexmap 2.7.1", + "indexmap 2.8.0", "serde", "serde_spanned", "toml_datetime", @@ -12562,7 +12619,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -12792,7 +12849,7 @@ dependencies = [ "regress", "schemars", "serde_json", - "syn 2.0.99", + "syn 2.0.100", "thiserror 1.0.69", "unicode-ident", ] @@ -12809,7 +12866,7 @@ dependencies = [ "serde", "serde_json", "serde_tokenstream", - "syn 2.0.99", + "syn 2.0.100", "typify-impl", ] @@ -13145,7 +13202,7 @@ checksum = "97599c400fc79925922b58303e98fcb8fa88f573379a08ddb652e72cbd2e70f6" dependencies = [ "bitflags 2.9.0", "encoding_rs", - "indexmap 2.7.1", + "indexmap 2.8.0", "num-bigint", "serde", "thiserror 1.0.69", @@ -13262,7 +13319,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", "wasm-bindgen-shared", ] @@ -13297,7 +13354,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -13332,7 +13389,7 @@ checksum = "17d5042cc5fa009658f9a7333ef24291b1291a25b6382dd68862a7f3b969f69b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -13417,7 +13474,7 @@ dependencies = [ "cfg_aliases 0.1.1", "codespan-reporting", "document-features", - "indexmap 2.7.1", + "indexmap 2.8.0", "log", "naga", "once_cell", @@ -13497,7 +13554,7 @@ dependencies = [ "either", "home", "once_cell", - "rustix", + "rustix 0.38.44", ] [[package]] @@ -13508,7 +13565,7 @@ checksum = "b4ee928febd44d98f2f459a4a79bd4d928591333a494a10a868418ac1b39cf1f" dependencies = [ "either", "home", - "rustix", + "rustix 0.38.44", "winsafe", ] @@ -13562,7 +13619,7 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windmill" -version = "1.475.0" +version = "1.475.1" dependencies = [ "anyhow", "axum", @@ -13605,7 +13662,7 @@ dependencies = [ [[package]] name = "windmill-api" -version = "1.475.0" +version = "1.475.1" dependencies = [ "anyhow", "argon2", @@ -13702,7 +13759,7 @@ dependencies = [ [[package]] name = "windmill-api-client" -version = "1.475.0" +version = "1.475.1" dependencies = [ "base64 0.22.1", "chrono", @@ -13720,7 +13777,7 @@ dependencies = [ [[package]] name = "windmill-audit" -version = "1.475.0" +version = "1.475.1" dependencies = [ "chrono", "serde", @@ -13733,7 +13790,7 @@ dependencies = [ [[package]] name = "windmill-autoscaling" -version = "1.475.0" +version = "1.475.1" dependencies = [ "anyhow", "serde", @@ -13747,7 +13804,7 @@ dependencies = [ [[package]] name = "windmill-common" -version = "1.475.0" +version = "1.475.1" dependencies = [ "anyhow", "async-stream", @@ -13769,7 +13826,7 @@ dependencies = [ "hex", "hmac", "hyper 1.6.0", - "indexmap 2.7.1", + "indexmap 2.8.0", "itertools 0.14.0", "jsonwebtoken", "lazy_static", @@ -13808,7 +13865,7 @@ dependencies = [ [[package]] name = "windmill-git-sync" -version = "1.475.0" +version = "1.475.1" dependencies = [ "regex", "serde", @@ -13822,7 +13879,7 @@ dependencies = [ [[package]] name = "windmill-indexer" -version = "1.475.0" +version = "1.475.1" dependencies = [ "anyhow", "bytes", @@ -13845,19 +13902,19 @@ dependencies = [ [[package]] name = "windmill-macros" -version = "1.475.0" +version = "1.475.1" dependencies = [ "itertools 0.14.0", "lazy_static", "proc-macro2", "quote", "regex", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] name = "windmill-parser" -version = "1.475.0" +version = "1.475.1" dependencies = [ "convert_case 0.6.0", "serde", @@ -13866,7 +13923,7 @@ dependencies = [ [[package]] name = "windmill-parser-bash" -version = "1.475.0" +version = "1.475.1" dependencies = [ "anyhow", "lazy_static", @@ -13878,7 +13935,7 @@ dependencies = [ [[package]] name = "windmill-parser-csharp" -version = "1.475.0" +version = "1.475.1" dependencies = [ "anyhow", "serde_json", @@ -13890,7 +13947,7 @@ dependencies = [ [[package]] name = "windmill-parser-go" -version = "1.475.0" +version = "1.475.1" dependencies = [ "anyhow", "gosyn", @@ -13902,7 +13959,7 @@ dependencies = [ [[package]] name = "windmill-parser-graphql" -version = "1.475.0" +version = "1.475.1" dependencies = [ "anyhow", "lazy_static", @@ -13914,7 +13971,7 @@ dependencies = [ [[package]] name = "windmill-parser-php" -version = "1.475.0" +version = "1.475.1" dependencies = [ "anyhow", "itertools 0.14.0", @@ -13925,7 +13982,7 @@ dependencies = [ [[package]] name = "windmill-parser-py" -version = "1.475.0" +version = "1.475.1" dependencies = [ "anyhow", "itertools 0.14.0", @@ -13936,7 +13993,7 @@ dependencies = [ [[package]] name = "windmill-parser-py-imports" -version = "1.475.0" +version = "1.475.1" dependencies = [ "anyhow", "async-recursion", @@ -13956,7 +14013,7 @@ dependencies = [ [[package]] name = "windmill-parser-rust" -version = "1.475.0" +version = "1.475.1" dependencies = [ "anyhow", "convert_case 0.6.0", @@ -13966,14 +14023,14 @@ dependencies = [ "quote", "regex", "serde_json", - "syn 2.0.99", + "syn 2.0.100", "toml 0.7.8", "windmill-parser", ] [[package]] name = "windmill-parser-sql" -version = "1.475.0" +version = "1.475.1" dependencies = [ "anyhow", "lazy_static", @@ -13985,7 +14042,7 @@ dependencies = [ [[package]] name = "windmill-parser-ts" -version = "1.475.0" +version = "1.475.1" dependencies = [ "anyhow", "lazy_static", @@ -14003,7 +14060,7 @@ dependencies = [ [[package]] name = "windmill-parser-wasm" -version = "1.475.0" +version = "1.475.1" dependencies = [ "anyhow", "getrandom 0.2.15", @@ -14025,7 +14082,7 @@ dependencies = [ [[package]] name = "windmill-parser-yaml" -version = "1.475.0" +version = "1.475.1" dependencies = [ "anyhow", "serde_json", @@ -14035,7 +14092,7 @@ dependencies = [ [[package]] name = "windmill-queue" -version = "1.475.0" +version = "1.475.1" dependencies = [ "anyhow", "async-recursion", @@ -14068,7 +14125,7 @@ dependencies = [ [[package]] name = "windmill-sql-datatype-parser-wasm" -version = "1.475.0" +version = "1.475.1" dependencies = [ "wasm-bindgen", "wasm-bindgen-test", @@ -14078,7 +14135,7 @@ dependencies = [ [[package]] name = "windmill-worker" -version = "1.475.0" +version = "1.475.1" dependencies = [ "anyhow", "async-recursion", @@ -14199,7 +14256,7 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -14210,7 +14267,7 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -14501,13 +14558,12 @@ dependencies = [ [[package]] name = "xattr" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e105d177a3871454f754b33bb0ee637ecaaac997446375fd3e5d43a2ed00c909" +checksum = "0d65cbf2f12c15564212d48f4e3dfb87923d25d611f2aed18f4cb23f0413d89e" dependencies = [ "libc", - "linux-raw-sys", - "rustix", + "rustix 1.0.2", ] [[package]] @@ -14566,7 +14622,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", "synstructure 0.13.1", ] @@ -14576,17 +14632,16 @@ version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ - "byteorder", "zerocopy-derive 0.7.35", ] [[package]] name = "zerocopy" -version = "0.8.22" +version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09612fda0b63f7cb9e0af7e5916fe5a1f8cdcb066829f10f36883207628a4872" +checksum = "fd97444d05a4328b90e75e503a34bad781f14e28a823ad3557f0750df1ebcbc6" dependencies = [ - "zerocopy-derive 0.8.22", + "zerocopy-derive 0.8.23", ] [[package]] @@ -14597,18 +14652,18 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] name = "zerocopy-derive" -version = "0.8.22" +version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79f81d38d7a2ed52d8f034e62c568e111df9bf8aba2f7cf19ddc5bf7bd89d520" +checksum = "6352c01d0edd5db859a63e2605f4ea3183ddbd15e2c4a9e7d32184df75e4f154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -14628,7 +14683,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", "synstructure 0.13.1", ] @@ -14649,7 +14704,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -14671,7 +14726,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] diff --git a/backend/Cargo.toml b/backend/Cargo.toml index f5d1be0897..ed532e19a6 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "windmill" -version = "1.475.0" +version = "1.475.1" authors.workspace = true edition.workspace = true @@ -30,7 +30,7 @@ members = [ ] [workspace.package] -version = "1.475.0" +version = "1.475.1" authors = ["Ruben Fiszel "] edition = "2021" diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index ad59bda610..c11360803e 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.475.0 + version: 1.475.1 title: Windmill API contact: diff --git a/benchmarks/lib.ts b/benchmarks/lib.ts index 21768c4827..d1484a7ce6 100644 --- a/benchmarks/lib.ts +++ b/benchmarks/lib.ts @@ -2,7 +2,7 @@ import { sleep } from "https://deno.land/x/sleep@v1.2.1/mod.ts"; import * as windmill from "https://deno.land/x/windmill@v1.174.0/mod.ts"; import * as api from "https://deno.land/x/windmill@v1.174.0/windmill-api/index.ts"; -export const VERSION = "v1.475.0"; +export const VERSION = "v1.475.1"; export async function login(email: string, password: string): Promise { return await windmill.UserService.login({ diff --git a/cli/main.ts b/cli/main.ts index 07f6b2fd31..4915b04d8c 100644 --- a/cli/main.ts +++ b/cli/main.ts @@ -62,7 +62,7 @@ export { // } // }); -export const VERSION = "1.475.0"; +export const VERSION = "1.475.1"; const command = new Command() .name("wmill") diff --git a/frontend/package-lock.json b/frontend/package-lock.json index e24c708849..d68276a2a3 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "windmill-components", - "version": "1.475.0", + "version": "1.475.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "windmill-components", - "version": "1.475.0", + "version": "1.475.1", "license": "AGPL-3.0", "dependencies": { "@anthropic-ai/sdk": "^0.37.0", diff --git a/frontend/package.json b/frontend/package.json index 2c65561532..6380abbcfe 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "windmill-components", - "version": "1.475.0", + "version": "1.475.1", "scripts": { "dev": "vite dev", "build": "vite build", diff --git a/lsp/Pipfile b/lsp/Pipfile index a3647d19a0..ff923cbf56 100644 --- a/lsp/Pipfile +++ b/lsp/Pipfile @@ -4,8 +4,8 @@ verify_ssl = true name = "pypi" [packages] -wmill = ">=1.475.0" -wmill_pg = ">=1.475.0" +wmill = ">=1.475.1" +wmill_pg = ">=1.475.1" sendgrid = "*" mysql-connector-python = "*" pymongo = "*" diff --git a/openflow.openapi.yaml b/openflow.openapi.yaml index b6d7f37e1a..a4eaad70cf 100644 --- a/openflow.openapi.yaml +++ b/openflow.openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.475.0 + version: 1.475.1 title: OpenFlow Spec contact: name: Ruben Fiszel diff --git a/powershell-client/WindmillClient/WindmillClient.psd1 b/powershell-client/WindmillClient/WindmillClient.psd1 index abe2aab3ed..6a2969879c 100644 --- a/powershell-client/WindmillClient/WindmillClient.psd1 +++ b/powershell-client/WindmillClient/WindmillClient.psd1 @@ -12,7 +12,7 @@ RootModule = 'WindmillClient.psm1' # Version number of this module. - ModuleVersion = '1.475.0' + ModuleVersion = '1.475.1' # Supported PSEditions # CompatiblePSEditions = @() diff --git a/python-client/wmill/pyproject.toml b/python-client/wmill/pyproject.toml index f3d959ffae..f347202006 100644 --- a/python-client/wmill/pyproject.toml +++ b/python-client/wmill/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "wmill" -version = "1.475.0" +version = "1.475.1" description = "A client library for accessing Windmill server wrapping the Windmill client API" license = "Apache-2.0" homepage = "https://windmill.dev" diff --git a/python-client/wmill_pg/pyproject.toml b/python-client/wmill_pg/pyproject.toml index f9bcb53da7..d73d4f0654 100644 --- a/python-client/wmill_pg/pyproject.toml +++ b/python-client/wmill_pg/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "wmill-pg" -version = "1.475.0" +version = "1.475.1" description = "An extension client for the wmill client library focused on pg" license = "Apache-2.0" homepage = "https://windmill.dev" diff --git a/typescript-client/jsr.json b/typescript-client/jsr.json index c25eb181cd..f57c8a7e12 100644 --- a/typescript-client/jsr.json +++ b/typescript-client/jsr.json @@ -1,6 +1,6 @@ { "name": "@windmill/windmill", - "version": "1.475.0", + "version": "1.475.1", "exports": "./src/index.ts", "publish": { "exclude": ["!src", "./s3Types.ts", "./client.ts"] diff --git a/typescript-client/package.json b/typescript-client/package.json index 3f6cce4844..a61ca10596 100644 --- a/typescript-client/package.json +++ b/typescript-client/package.json @@ -1,7 +1,7 @@ { "name": "windmill-client", "description": "Windmill SDK client for browsers and Node.js", - "version": "1.475.0", + "version": "1.475.1", "author": "Ruben Fiszel", "license": "Apache 2.0", "devDependencies": { diff --git a/version.txt b/version.txt index cdfbfac1be..48e924e4f8 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.475.0 +1.475.1 From f9c21b6812f629bc2e7c4c0bf00e018da117d1e8 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Tue, 11 Mar 2025 13:46:06 +0100 Subject: [PATCH 002/739] add hugo and alex to CODEOWNERS --- .github/CODEOWNERS | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index aba00bfed5..282cba946a 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,4 +1,4 @@ -* @rubenfiszel +* @rubenfiszel @HugoCasa @alpetric -/community/ @fatonramadani @rubenfiszel -/frontend/ @fatonramadani @rubenfiszel +/community/ @rubenfiszel @HugoCasa @alpetric +/frontend/ @rubenfiszel @HugoCasa @alpetric From 61a5ceaba38787dc146a36b443bbd3f78e26102b Mon Sep 17 00:00:00 2001 From: dieriba Date: Tue, 11 Mar 2025 16:24:22 +0100 Subject: [PATCH 003/739] feat: option to prefix http route with workspace id (#5461) * add new column * handled worskpaced route * update .sqlx * update: rename migration file, rewrite query for checking existing route path key, add copy button url for each route trigger * update .sqlx * update sql query * update .sqlx * fix: prevent precedence on query * nits * update .sqlx * update query * Update http_triggers.rs * nits --------- Co-authored-by: HugoCasa --- ...10394fe6c8abcc1fa93291fac6f929043d20.json} | 10 +- ...e67156408b08360d628300b28221ea995a58.json} | 4 +- ...33239d5806fc50bba2d3fe9d8a6e11627655.json} | 10 +- ...ae89c8d75034a9210233aed2f0414690e37d.json} | 30 +- ...64bd112977c995bf266680c54f58ad57fd4b6.json | 38 +++ ...6faded2cc63e8f16c201e99ab1725dcff294.json} | 4 +- ...942d4da686a65ab11eefdca16367d2db67963.json | 41 +++ ...4297af93b5b83ffdfb3ec91eba5df7ad3fd95.json | 38 --- ...ea74ffbb4c0ed7e694f8f03d92f2a7c118af9.json | 15 + ...6104a430a11d7c5cb9447025d11506585708.json} | 4 +- ...c662539d5e4af1dd0b5923d8ee17b772c5677.json | 39 --- ...3aeca9a14ac628c61a358e2c6612c57249b0f.json | 23 -- ...f2996dede4de49c5bd9cca2928209dc40b8f1.json | 40 --- ...7c08d8ed4984409b669162f0a1fc1aa48e188.json | 15 - ...34669464a56e470935ce2924723003f3f92b.json} | 36 ++- ...b45146478f70956919c01718623f0828e0383.json | 40 +++ ...26f787287c3cd181a6853056077edba10473d.json | 23 ++ ...ced_route_column_for_http_trigger.down.sql | 3 + ...paced_route_column_for_http_trigger.up.sql | 3 + backend/windmill-api/openapi.yaml | 8 + backend/windmill-api/src/http_triggers.rs | 289 +++++++++++++++--- backend/windmill-api/src/workspaces_export.rs | 38 ++- backend/windmill-common/src/s3_helpers.rs | 2 +- .../http/RouteEditorConfigSection.svelte | 49 +-- .../triggers/http/RouteEditorInner.svelte | 46 +-- .../src/lib/components/triggers/http/utils.ts | 8 + .../routes/(root)/(logged)/routes/+page.js | 2 +- .../(root)/(logged)/routes/+page.svelte | 28 +- 28 files changed, 592 insertions(+), 294 deletions(-) rename backend/.sqlx/{query-1961d15ae075072bd5f677c95f9b4dac7f747585d98aa8bcf60dcfb4c8124028.json => query-01b87cdd552c2d5a3cd475eb705110394fe6c8abcc1fa93291fac6f929043d20.json} (69%) rename backend/.sqlx/{query-63b5f03741be97d0e8763dd070649ebb6ec02aa083d7e175c1a02a38935a4024.json => query-0d8153986cea6166820f601f80d8e67156408b08360d628300b28221ea995a58.json} (52%) rename backend/.sqlx/{query-8ff25d890d3f7019c5c6f2b47f29f4c7b2c91094036d9b5037ef9a4ac986ee53.json => query-300b41622dbcdf908d9e173eee2133239d5806fc50bba2d3fe9d8a6e11627655.json} (68%) rename backend/.sqlx/{query-197321abfe4667256761884970334f58c1b3edfcc1e863ec4316c9742a1ac7c8.json => query-4353a7de6b4de1df6e19d95a4db8ae89c8d75034a9210233aed2f0414690e37d.json} (72%) create mode 100644 backend/.sqlx/query-5d3401f608b27937285e418f7bd64bd112977c995bf266680c54f58ad57fd4b6.json rename backend/.sqlx/{query-a96ff22bc78b74d7234550a12d9fb5c555c1187b276f1353dae1b2ac0670a92a.json => query-679a9159a5fca976a3de99fe26806faded2cc63e8f16c201e99ab1725dcff294.json} (58%) create mode 100644 backend/.sqlx/query-78e6342696052d0e1f79fd721f5942d4da686a65ab11eefdca16367d2db67963.json delete mode 100644 backend/.sqlx/query-89c08575afb31b70984f6b2b7dd4297af93b5b83ffdfb3ec91eba5df7ad3fd95.json create mode 100644 backend/.sqlx/query-a269c388056eabe4b045948f451ea74ffbb4c0ed7e694f8f03d92f2a7c118af9.json rename backend/.sqlx/{query-9a050ab74cfc13a4b855408e61ebcb0a9d27e5563fa7af5e00a4916b03a62ddb.json => query-adb0090afd3ce918d8b80ff51d9f6104a430a11d7c5cb9447025d11506585708.json} (57%) delete mode 100644 backend/.sqlx/query-b41cef713e822bbd89b49b1f35cc662539d5e4af1dd0b5923d8ee17b772c5677.json delete mode 100644 backend/.sqlx/query-b57a188ca137162a2848ebf81fa3aeca9a14ac628c61a358e2c6612c57249b0f.json delete mode 100644 backend/.sqlx/query-ccb7aea162fa8781675d547fb82f2996dede4de49c5bd9cca2928209dc40b8f1.json delete mode 100644 backend/.sqlx/query-dc9a906d6c6156a84fccf4e3a2a7c08d8ed4984409b669162f0a1fc1aa48e188.json rename backend/.sqlx/{query-d8aa1a5813fedbb22128112fcdf9d16769811cd5d5ad3b66362cc5bb1750ae6b.json => query-e44ea5870a8eba1fe3d22d4dfe7734669464a56e470935ce2924723003f3f92b.json} (69%) create mode 100644 backend/.sqlx/query-eb4779976677308e8ad7c6427bfb45146478f70956919c01718623f0828e0383.json create mode 100644 backend/.sqlx/query-f632d08a8d3df691fff9f57fdf926f787287c3cd181a6853056077edba10473d.json create mode 100644 backend/migrations/20250309165536_add_workspaced_route_column_for_http_trigger.down.sql create mode 100644 backend/migrations/20250309165536_add_workspaced_route_column_for_http_trigger.up.sql create mode 100644 frontend/src/lib/components/triggers/http/utils.ts diff --git a/backend/.sqlx/query-1961d15ae075072bd5f677c95f9b4dac7f747585d98aa8bcf60dcfb4c8124028.json b/backend/.sqlx/query-01b87cdd552c2d5a3cd475eb705110394fe6c8abcc1fa93291fac6f929043d20.json similarity index 69% rename from backend/.sqlx/query-1961d15ae075072bd5f677c95f9b4dac7f747585d98aa8bcf60dcfb4c8124028.json rename to backend/.sqlx/query-01b87cdd552c2d5a3cd475eb705110394fe6c8abcc1fa93291fac6f929043d20.json index 418be57757..cae9fdd79f 100644 --- a/backend/.sqlx/query-1961d15ae075072bd5f677c95f9b4dac7f747585d98aa8bcf60dcfb4c8124028.json +++ b/backend/.sqlx/query-01b87cdd552c2d5a3cd475eb705110394fe6c8abcc1fa93291fac6f929043d20.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT path, script_path, is_flow, route_path, workspace_id, is_async, requires_auth, edited_by, email, static_asset_config as \"static_asset_config: _\", is_static_website FROM http_trigger WHERE http_method = $1", + "query": "\n SELECT \n path, \n script_path, \n is_flow, \n route_path, \n workspace_id, \n is_async, \n requires_auth, \n edited_by, \n email, \n static_asset_config AS \"static_asset_config: _\",\n workspaced_route,\n is_static_website\n FROM \n http_trigger \n WHERE \n http_method = $1\n ", "describe": { "columns": [ { @@ -55,6 +55,11 @@ }, { "ordinal": 10, + "name": "workspaced_route", + "type_info": "Bool" + }, + { + "ordinal": 11, "name": "is_static_website", "type_info": "Bool" } @@ -88,8 +93,9 @@ false, false, true, + false, false ] }, - "hash": "1961d15ae075072bd5f677c95f9b4dac7f747585d98aa8bcf60dcfb4c8124028" + "hash": "01b87cdd552c2d5a3cd475eb705110394fe6c8abcc1fa93291fac6f929043d20" } diff --git a/backend/.sqlx/query-63b5f03741be97d0e8763dd070649ebb6ec02aa083d7e175c1a02a38935a4024.json b/backend/.sqlx/query-0d8153986cea6166820f601f80d8e67156408b08360d628300b28221ea995a58.json similarity index 52% rename from backend/.sqlx/query-63b5f03741be97d0e8763dd070649ebb6ec02aa083d7e175c1a02a38935a4024.json rename to backend/.sqlx/query-0d8153986cea6166820f601f80d8e67156408b08360d628300b28221ea995a58.json index 4d914355db..1d2f993f5d 100644 --- a/backend/.sqlx/query-63b5f03741be97d0e8763dd070649ebb6ec02aa083d7e175c1a02a38935a4024.json +++ b/backend/.sqlx/query-0d8153986cea6166820f601f80d8e67156408b08360d628300b28221ea995a58.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT EXISTS(SELECT 1 FROM http_trigger WHERE route_path_key = $1 AND http_method = $2 AND ($3::TEXT IS NULL OR path != $3))", + "query": "\n SELECT EXISTS(\n SELECT 1 \n FROM http_trigger \n WHERE \n ((workspaced_route IS TRUE AND workspace_id || '/' || route_path_key = $1) \n OR (workspaced_route IS FALSE AND route_path_key = $1))\n AND http_method = $2 \n AND ($3::TEXT IS NULL OR path != $3)\n )\n ", "describe": { "columns": [ { @@ -33,5 +33,5 @@ null ] }, - "hash": "63b5f03741be97d0e8763dd070649ebb6ec02aa083d7e175c1a02a38935a4024" + "hash": "0d8153986cea6166820f601f80d8e67156408b08360d628300b28221ea995a58" } diff --git a/backend/.sqlx/query-8ff25d890d3f7019c5c6f2b47f29f4c7b2c91094036d9b5037ef9a4ac986ee53.json b/backend/.sqlx/query-300b41622dbcdf908d9e173eee2133239d5806fc50bba2d3fe9d8a6e11627655.json similarity index 68% rename from backend/.sqlx/query-8ff25d890d3f7019c5c6f2b47f29f4c7b2c91094036d9b5037ef9a4ac986ee53.json rename to backend/.sqlx/query-300b41622dbcdf908d9e173eee2133239d5806fc50bba2d3fe9d8a6e11627655.json index de933d99e1..b2c551759d 100644 --- a/backend/.sqlx/query-8ff25d890d3f7019c5c6f2b47f29f4c7b2c91094036d9b5037ef9a4ac986ee53.json +++ b/backend/.sqlx/query-300b41622dbcdf908d9e173eee2133239d5806fc50bba2d3fe9d8a6e11627655.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT path, script_path, is_flow, route_path, workspace_id, is_async, requires_auth, edited_by, email, static_asset_config as \"static_asset_config: _\", is_static_website FROM http_trigger WHERE workspace_id = $1 AND http_method = $2", + "query": "\n SELECT \n path, \n script_path, \n is_flow, \n route_path, \n workspace_id, \n is_async, \n requires_auth, \n edited_by, \n email,\n static_asset_config AS \"static_asset_config: _\",\n workspaced_route,\n is_static_website \n FROM \n http_trigger \n WHERE \n workspace_id = $1 AND \n http_method = $2\n ", "describe": { "columns": [ { @@ -55,6 +55,11 @@ }, { "ordinal": 10, + "name": "workspaced_route", + "type_info": "Bool" + }, + { + "ordinal": 11, "name": "is_static_website", "type_info": "Bool" } @@ -89,8 +94,9 @@ false, false, true, + false, false ] }, - "hash": "8ff25d890d3f7019c5c6f2b47f29f4c7b2c91094036d9b5037ef9a4ac986ee53" + "hash": "300b41622dbcdf908d9e173eee2133239d5806fc50bba2d3fe9d8a6e11627655" } diff --git a/backend/.sqlx/query-197321abfe4667256761884970334f58c1b3edfcc1e863ec4316c9742a1ac7c8.json b/backend/.sqlx/query-4353a7de6b4de1df6e19d95a4db8ae89c8d75034a9210233aed2f0414690e37d.json similarity index 72% rename from backend/.sqlx/query-197321abfe4667256761884970334f58c1b3edfcc1e863ec4316c9742a1ac7c8.json rename to backend/.sqlx/query-4353a7de6b4de1df6e19d95a4db8ae89c8d75034a9210233aed2f0414690e37d.json index bfc823c911..49ede3a762 100644 --- a/backend/.sqlx/query-197321abfe4667256761884970334f58c1b3edfcc1e863ec4316c9742a1ac7c8.json +++ b/backend/.sqlx/query-4353a7de6b4de1df6e19d95a4db8ae89c8d75034a9210233aed2f0414690e37d.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT workspace_id, path, route_path, route_path_key, script_path, is_flow, http_method as \"http_method: _\", edited_by, email, edited_at, extra_perms, is_async, requires_auth, static_asset_config as \"static_asset_config: _\", is_static_website\n FROM http_trigger\n WHERE workspace_id = $1 AND path = $2", + "query": "\n SELECT \n workspace_id, \n path, \n route_path, \n route_path_key,\n workspaced_route,\n script_path, \n is_flow, \n http_method as \"http_method: _\", \n edited_by, \n email, \n edited_at, \n extra_perms, \n is_async, \n requires_auth, \n static_asset_config as \"static_asset_config: _\", \n is_static_website\n FROM \n http_trigger\n WHERE \n workspace_id = $1 AND \n path = $2\n ", "describe": { "columns": [ { @@ -25,16 +25,21 @@ }, { "ordinal": 4, + "name": "workspaced_route", + "type_info": "Bool" + }, + { + "ordinal": 5, "name": "script_path", "type_info": "Varchar" }, { - "ordinal": 5, + "ordinal": 6, "name": "is_flow", "type_info": "Bool" }, { - "ordinal": 6, + "ordinal": 7, "name": "http_method: _", "type_info": { "Custom": { @@ -52,42 +57,42 @@ } }, { - "ordinal": 7, + "ordinal": 8, "name": "edited_by", "type_info": "Varchar" }, { - "ordinal": 8, + "ordinal": 9, "name": "email", "type_info": "Varchar" }, { - "ordinal": 9, + "ordinal": 10, "name": "edited_at", "type_info": "Timestamptz" }, { - "ordinal": 10, + "ordinal": 11, "name": "extra_perms", "type_info": "Jsonb" }, { - "ordinal": 11, + "ordinal": 12, "name": "is_async", "type_info": "Bool" }, { - "ordinal": 12, + "ordinal": 13, "name": "requires_auth", "type_info": "Bool" }, { - "ordinal": 13, + "ordinal": 14, "name": "static_asset_config: _", "type_info": "Jsonb" }, { - "ordinal": 14, + "ordinal": 15, "name": "is_static_website", "type_info": "Bool" } @@ -112,9 +117,10 @@ false, false, false, + false, true, false ] }, - "hash": "197321abfe4667256761884970334f58c1b3edfcc1e863ec4316c9742a1ac7c8" + "hash": "4353a7de6b4de1df6e19d95a4db8ae89c8d75034a9210233aed2f0414690e37d" } diff --git a/backend/.sqlx/query-5d3401f608b27937285e418f7bd64bd112977c995bf266680c54f58ad57fd4b6.json b/backend/.sqlx/query-5d3401f608b27937285e418f7bd64bd112977c995bf266680c54f58ad57fd4b6.json new file mode 100644 index 0000000000..b962770bd9 --- /dev/null +++ b/backend/.sqlx/query-5d3401f608b27937285e418f7bd64bd112977c995bf266680c54f58ad57fd4b6.json @@ -0,0 +1,38 @@ +{ + "db_name": "PostgreSQL", + "query": "\n UPDATE \n http_trigger \n SET \n script_path = $1, \n path = $2, \n is_flow = $3, \n http_method = $4,\n static_asset_config = $5, \n edited_by = $6, \n email = $7, \n is_async = $8, \n requires_auth = $9, \n edited_at = now(), \n is_static_website = $10\n WHERE \n workspace_id = $11 AND \n path = $12\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Varchar", + "Bool", + { + "Custom": { + "name": "http_method", + "kind": { + "Enum": [ + "get", + "post", + "put", + "delete", + "patch" + ] + } + } + }, + "Jsonb", + "Varchar", + "Varchar", + "Bool", + "Bool", + "Bool", + "Text", + "Text" + ] + }, + "nullable": [] + }, + "hash": "5d3401f608b27937285e418f7bd64bd112977c995bf266680c54f58ad57fd4b6" +} diff --git a/backend/.sqlx/query-a96ff22bc78b74d7234550a12d9fb5c555c1187b276f1353dae1b2ac0670a92a.json b/backend/.sqlx/query-679a9159a5fca976a3de99fe26806faded2cc63e8f16c201e99ab1725dcff294.json similarity index 58% rename from backend/.sqlx/query-a96ff22bc78b74d7234550a12d9fb5c555c1187b276f1353dae1b2ac0670a92a.json rename to backend/.sqlx/query-679a9159a5fca976a3de99fe26806faded2cc63e8f16c201e99ab1725dcff294.json index 060d87a941..1ce9e58cd4 100644 --- a/backend/.sqlx/query-a96ff22bc78b74d7234550a12d9fb5c555c1187b276f1353dae1b2ac0670a92a.json +++ b/backend/.sqlx/query-679a9159a5fca976a3de99fe26806faded2cc63e8f16c201e99ab1725dcff294.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT EXISTS(SELECT 1 FROM http_trigger WHERE route_path_key = $1 AND workspace_id = $2 AND http_method = $3 AND ($4::TEXT IS NULL OR path != $4))", + "query": "\n SELECT EXISTS(\n SELECT 1 \n FROM http_trigger \n WHERE \n route_path_key = $1\n AND workspace_id = $2 \n AND http_method = $3 \n AND ($4::TEXT IS NULL OR path != $4)\n )\n ", "describe": { "columns": [ { @@ -34,5 +34,5 @@ null ] }, - "hash": "a96ff22bc78b74d7234550a12d9fb5c555c1187b276f1353dae1b2ac0670a92a" + "hash": "679a9159a5fca976a3de99fe26806faded2cc63e8f16c201e99ab1725dcff294" } diff --git a/backend/.sqlx/query-78e6342696052d0e1f79fd721f5942d4da686a65ab11eefdca16367d2db67963.json b/backend/.sqlx/query-78e6342696052d0e1f79fd721f5942d4da686a65ab11eefdca16367d2db67963.json new file mode 100644 index 0000000000..19b8c3e0d7 --- /dev/null +++ b/backend/.sqlx/query-78e6342696052d0e1f79fd721f5942d4da686a65ab11eefdca16367d2db67963.json @@ -0,0 +1,41 @@ +{ + "db_name": "PostgreSQL", + "query": "\n UPDATE \n http_trigger \n SET \n route_path = $1, \n route_path_key = $2, \n workspaced_route = $3, \n script_path = $4, \n path = $5, \n is_flow = $6, \n http_method = $7, \n static_asset_config = $8, \n edited_by = $9, \n email = $10, \n is_async = $11, \n requires_auth = $12, \n edited_at = now(), \n is_static_website = $13\n WHERE \n workspace_id = $14 AND \n path = $15\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Varchar", + "Bool", + "Varchar", + "Varchar", + "Bool", + { + "Custom": { + "name": "http_method", + "kind": { + "Enum": [ + "get", + "post", + "put", + "delete", + "patch" + ] + } + } + }, + "Jsonb", + "Varchar", + "Varchar", + "Bool", + "Bool", + "Bool", + "Text", + "Text" + ] + }, + "nullable": [] + }, + "hash": "78e6342696052d0e1f79fd721f5942d4da686a65ab11eefdca16367d2db67963" +} diff --git a/backend/.sqlx/query-89c08575afb31b70984f6b2b7dd4297af93b5b83ffdfb3ec91eba5df7ad3fd95.json b/backend/.sqlx/query-89c08575afb31b70984f6b2b7dd4297af93b5b83ffdfb3ec91eba5df7ad3fd95.json deleted file mode 100644 index a463eafdb7..0000000000 --- a/backend/.sqlx/query-89c08575afb31b70984f6b2b7dd4297af93b5b83ffdfb3ec91eba5df7ad3fd95.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE http_trigger SET script_path = $1, path = $2, is_flow = $3, http_method = $4, static_asset_config = $5, edited_by = $6, email = $7, is_async = $8, requires_auth = $9, edited_at = now(), is_static_website = $10\n WHERE workspace_id = $11 AND path = $12", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "Varchar", - "Bool", - { - "Custom": { - "name": "http_method", - "kind": { - "Enum": [ - "get", - "post", - "put", - "delete", - "patch" - ] - } - } - }, - "Jsonb", - "Varchar", - "Varchar", - "Bool", - "Bool", - "Bool", - "Text", - "Text" - ] - }, - "nullable": [] - }, - "hash": "89c08575afb31b70984f6b2b7dd4297af93b5b83ffdfb3ec91eba5df7ad3fd95" -} diff --git a/backend/.sqlx/query-a269c388056eabe4b045948f451ea74ffbb4c0ed7e694f8f03d92f2a7c118af9.json b/backend/.sqlx/query-a269c388056eabe4b045948f451ea74ffbb4c0ed7e694f8f03d92f2a7c118af9.json new file mode 100644 index 0000000000..e81acc3584 --- /dev/null +++ b/backend/.sqlx/query-a269c388056eabe4b045948f451ea74ffbb4c0ed7e694f8f03d92f2a7c118af9.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "DELETE FROM http_trigger \n WHERE workspace_id = $1 \n AND path = $2", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [] + }, + "hash": "a269c388056eabe4b045948f451ea74ffbb4c0ed7e694f8f03d92f2a7c118af9" +} diff --git a/backend/.sqlx/query-9a050ab74cfc13a4b855408e61ebcb0a9d27e5563fa7af5e00a4916b03a62ddb.json b/backend/.sqlx/query-adb0090afd3ce918d8b80ff51d9f6104a430a11d7c5cb9447025d11506585708.json similarity index 57% rename from backend/.sqlx/query-9a050ab74cfc13a4b855408e61ebcb0a9d27e5563fa7af5e00a4916b03a62ddb.json rename to backend/.sqlx/query-adb0090afd3ce918d8b80ff51d9f6104a430a11d7c5cb9447025d11506585708.json index a0c5bd7642..bbe9b8bb86 100644 --- a/backend/.sqlx/query-9a050ab74cfc13a4b855408e61ebcb0a9d27e5563fa7af5e00a4916b03a62ddb.json +++ b/backend/.sqlx/query-adb0090afd3ce918d8b80ff51d9f6104a430a11d7c5cb9447025d11506585708.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT EXISTS(SELECT 1 FROM http_trigger WHERE path = $1 AND workspace_id = $2)", + "query": "SELECT EXISTS(\n SELECT 1 FROM http_trigger \n WHERE path = $1 AND workspace_id = $2\n )", "describe": { "columns": [ { @@ -19,5 +19,5 @@ null ] }, - "hash": "9a050ab74cfc13a4b855408e61ebcb0a9d27e5563fa7af5e00a4916b03a62ddb" + "hash": "adb0090afd3ce918d8b80ff51d9f6104a430a11d7c5cb9447025d11506585708" } diff --git a/backend/.sqlx/query-b41cef713e822bbd89b49b1f35cc662539d5e4af1dd0b5923d8ee17b772c5677.json b/backend/.sqlx/query-b41cef713e822bbd89b49b1f35cc662539d5e4af1dd0b5923d8ee17b772c5677.json deleted file mode 100644 index 8475175c69..0000000000 --- a/backend/.sqlx/query-b41cef713e822bbd89b49b1f35cc662539d5e4af1dd0b5923d8ee17b772c5677.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO http_trigger (workspace_id, path, route_path, route_path_key, script_path, is_flow, is_async, requires_auth, http_method, static_asset_config, edited_by, email, edited_at, is_static_website) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, now(), $13)", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "Varchar", - "Varchar", - "Varchar", - "Varchar", - "Bool", - "Bool", - "Bool", - { - "Custom": { - "name": "http_method", - "kind": { - "Enum": [ - "get", - "post", - "put", - "delete", - "patch" - ] - } - } - }, - "Jsonb", - "Varchar", - "Varchar", - "Bool" - ] - }, - "nullable": [] - }, - "hash": "b41cef713e822bbd89b49b1f35cc662539d5e4af1dd0b5923d8ee17b772c5677" -} diff --git a/backend/.sqlx/query-b57a188ca137162a2848ebf81fa3aeca9a14ac628c61a358e2c6612c57249b0f.json b/backend/.sqlx/query-b57a188ca137162a2848ebf81fa3aeca9a14ac628c61a358e2c6612c57249b0f.json deleted file mode 100644 index a730d4b588..0000000000 --- a/backend/.sqlx/query-b57a188ca137162a2848ebf81fa3aeca9a14ac628c61a358e2c6612c57249b0f.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT EXISTS(SELECT 1 FROM http_trigger WHERE workspace_id = $1 AND path = $2)", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "exists", - "type_info": "Bool" - } - ], - "parameters": { - "Left": [ - "Text", - "Text" - ] - }, - "nullable": [ - null - ] - }, - "hash": "b57a188ca137162a2848ebf81fa3aeca9a14ac628c61a358e2c6612c57249b0f" -} diff --git a/backend/.sqlx/query-ccb7aea162fa8781675d547fb82f2996dede4de49c5bd9cca2928209dc40b8f1.json b/backend/.sqlx/query-ccb7aea162fa8781675d547fb82f2996dede4de49c5bd9cca2928209dc40b8f1.json deleted file mode 100644 index f4bc3f2174..0000000000 --- a/backend/.sqlx/query-ccb7aea162fa8781675d547fb82f2996dede4de49c5bd9cca2928209dc40b8f1.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE http_trigger \n SET route_path = $1, route_path_key = $2, script_path = $3, path = $4, is_flow = $5, http_method = $6, static_asset_config = $7, edited_by = $8, email = $9, is_async = $10, requires_auth = $11, edited_at = now(), is_static_website = $12\n WHERE workspace_id = $13 AND path = $14", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "Varchar", - "Varchar", - "Varchar", - "Bool", - { - "Custom": { - "name": "http_method", - "kind": { - "Enum": [ - "get", - "post", - "put", - "delete", - "patch" - ] - } - } - }, - "Jsonb", - "Varchar", - "Varchar", - "Bool", - "Bool", - "Bool", - "Text", - "Text" - ] - }, - "nullable": [] - }, - "hash": "ccb7aea162fa8781675d547fb82f2996dede4de49c5bd9cca2928209dc40b8f1" -} diff --git a/backend/.sqlx/query-dc9a906d6c6156a84fccf4e3a2a7c08d8ed4984409b669162f0a1fc1aa48e188.json b/backend/.sqlx/query-dc9a906d6c6156a84fccf4e3a2a7c08d8ed4984409b669162f0a1fc1aa48e188.json deleted file mode 100644 index 03b0c561e1..0000000000 --- a/backend/.sqlx/query-dc9a906d6c6156a84fccf4e3a2a7c08d8ed4984409b669162f0a1fc1aa48e188.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "DELETE FROM http_trigger WHERE workspace_id = $1 AND path = $2", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Text" - ] - }, - "nullable": [] - }, - "hash": "dc9a906d6c6156a84fccf4e3a2a7c08d8ed4984409b669162f0a1fc1aa48e188" -} diff --git a/backend/.sqlx/query-d8aa1a5813fedbb22128112fcdf9d16769811cd5d5ad3b66362cc5bb1750ae6b.json b/backend/.sqlx/query-e44ea5870a8eba1fe3d22d4dfe7734669464a56e470935ce2924723003f3f92b.json similarity index 69% rename from backend/.sqlx/query-d8aa1a5813fedbb22128112fcdf9d16769811cd5d5ad3b66362cc5bb1750ae6b.json rename to backend/.sqlx/query-e44ea5870a8eba1fe3d22d4dfe7734669464a56e470935ce2924723003f3f92b.json index 99c0212031..2a0c89ea25 100644 --- a/backend/.sqlx/query-d8aa1a5813fedbb22128112fcdf9d16769811cd5d5ad3b66362cc5bb1750ae6b.json +++ b/backend/.sqlx/query-e44ea5870a8eba1fe3d22d4dfe7734669464a56e470935ce2924723003f3f92b.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT workspace_id, path, route_path, route_path_key, script_path, is_flow, edited_by, edited_at, email, extra_perms, is_async, requires_auth, http_method as \"http_method: _\", static_asset_config as \"static_asset_config: _\", is_static_website FROM http_trigger\n WHERE workspace_id = $1", + "query": "\n SELECT \n workspace_id, \n workspaced_route,\n path, \n route_path, \n route_path_key, \n script_path, \n is_flow, \n edited_by, \n edited_at, \n email, \n extra_perms, \n is_async, \n requires_auth, \n http_method AS \"http_method: _\", \n static_asset_config AS \"static_asset_config: _\", \n is_static_website \n FROM http_trigger\n WHERE workspace_id = $1\n ", "describe": { "columns": [ { @@ -10,61 +10,66 @@ }, { "ordinal": 1, + "name": "workspaced_route", + "type_info": "Bool" + }, + { + "ordinal": 2, "name": "path", "type_info": "Varchar" }, { - "ordinal": 2, + "ordinal": 3, "name": "route_path", "type_info": "Varchar" }, { - "ordinal": 3, + "ordinal": 4, "name": "route_path_key", "type_info": "Varchar" }, { - "ordinal": 4, + "ordinal": 5, "name": "script_path", "type_info": "Varchar" }, { - "ordinal": 5, + "ordinal": 6, "name": "is_flow", "type_info": "Bool" }, { - "ordinal": 6, + "ordinal": 7, "name": "edited_by", "type_info": "Varchar" }, { - "ordinal": 7, + "ordinal": 8, "name": "edited_at", "type_info": "Timestamptz" }, { - "ordinal": 8, + "ordinal": 9, "name": "email", "type_info": "Varchar" }, { - "ordinal": 9, + "ordinal": 10, "name": "extra_perms", "type_info": "Jsonb" }, { - "ordinal": 10, + "ordinal": 11, "name": "is_async", "type_info": "Bool" }, { - "ordinal": 11, + "ordinal": 12, "name": "requires_auth", "type_info": "Bool" }, { - "ordinal": 12, + "ordinal": 13, "name": "http_method: _", "type_info": { "Custom": { @@ -82,12 +87,12 @@ } }, { - "ordinal": 13, + "ordinal": 14, "name": "static_asset_config: _", "type_info": "Jsonb" }, { - "ordinal": 14, + "ordinal": 15, "name": "is_static_website", "type_info": "Bool" } @@ -111,9 +116,10 @@ false, false, false, + false, true, false ] }, - "hash": "d8aa1a5813fedbb22128112fcdf9d16769811cd5d5ad3b66362cc5bb1750ae6b" + "hash": "e44ea5870a8eba1fe3d22d4dfe7734669464a56e470935ce2924723003f3f92b" } diff --git a/backend/.sqlx/query-eb4779976677308e8ad7c6427bfb45146478f70956919c01718623f0828e0383.json b/backend/.sqlx/query-eb4779976677308e8ad7c6427bfb45146478f70956919c01718623f0828e0383.json new file mode 100644 index 0000000000..f1b390b511 --- /dev/null +++ b/backend/.sqlx/query-eb4779976677308e8ad7c6427bfb45146478f70956919c01718623f0828e0383.json @@ -0,0 +1,40 @@ +{ + "db_name": "PostgreSQL", + "query": "\n INSERT INTO http_trigger (\n workspace_id, \n path, \n route_path, \n route_path_key,\n workspaced_route,\n script_path, \n is_flow, \n is_async, \n requires_auth, \n http_method, \n static_asset_config, \n edited_by, \n email, \n edited_at, \n is_static_website\n ) \n VALUES (\n $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, now(), $14\n )\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Varchar", + "Varchar", + "Varchar", + "Bool", + "Varchar", + "Bool", + "Bool", + "Bool", + { + "Custom": { + "name": "http_method", + "kind": { + "Enum": [ + "get", + "post", + "put", + "delete", + "patch" + ] + } + } + }, + "Jsonb", + "Varchar", + "Varchar", + "Bool" + ] + }, + "nullable": [] + }, + "hash": "eb4779976677308e8ad7c6427bfb45146478f70956919c01718623f0828e0383" +} diff --git a/backend/.sqlx/query-f632d08a8d3df691fff9f57fdf926f787287c3cd181a6853056077edba10473d.json b/backend/.sqlx/query-f632d08a8d3df691fff9f57fdf926f787287c3cd181a6853056077edba10473d.json new file mode 100644 index 0000000000..8fae751d85 --- /dev/null +++ b/backend/.sqlx/query-f632d08a8d3df691fff9f57fdf926f787287c3cd181a6853056077edba10473d.json @@ -0,0 +1,23 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT EXISTS(\n SELECT 1 \n FROM \n http_trigger \n WHERE \n workspace_id = $1 AND \n path = $2\n )\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "exists", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [ + null + ] + }, + "hash": "f632d08a8d3df691fff9f57fdf926f787287c3cd181a6853056077edba10473d" +} diff --git a/backend/migrations/20250309165536_add_workspaced_route_column_for_http_trigger.down.sql b/backend/migrations/20250309165536_add_workspaced_route_column_for_http_trigger.down.sql new file mode 100644 index 0000000000..937853bec6 --- /dev/null +++ b/backend/migrations/20250309165536_add_workspaced_route_column_for_http_trigger.down.sql @@ -0,0 +1,3 @@ +-- Add down migration script here +ALTER TABLE http_trigger +DROP COLUMN workspaced_route; \ No newline at end of file diff --git a/backend/migrations/20250309165536_add_workspaced_route_column_for_http_trigger.up.sql b/backend/migrations/20250309165536_add_workspaced_route_column_for_http_trigger.up.sql new file mode 100644 index 0000000000..8bb8c8e2ff --- /dev/null +++ b/backend/migrations/20250309165536_add_workspaced_route_column_for_http_trigger.up.sql @@ -0,0 +1,3 @@ +-- Add up migration script here +ALTER TABLE http_trigger +ADD COLUMN workspaced_route BOOLEAN NOT NULL DEFAULT false; \ No newline at end of file diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index c11360803e..260bb0b3fd 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -8116,6 +8116,8 @@ paths: enum: ["get", "post", "put", "delete", "patch"] trigger_path: type: string + workspaced_route: + type: boolean required: - route_path - http_method @@ -13767,6 +13769,8 @@ components: type: boolean is_static_website: type: boolean + workspaced_route: + type: boolean required: - route_path @@ -13784,6 +13788,8 @@ components: type: string route_path: type: string + workspaced_route: + type: boolean static_asset_config: type: object properties: @@ -13831,6 +13837,8 @@ components: type: string route_path: type: string + workspaced_route: + type: boolean static_asset_config: type: object properties: diff --git a/backend/windmill-api/src/http_triggers.rs b/backend/windmill-api/src/http_triggers.rs index 722a639842..9f7cb25425 100644 --- a/backend/windmill-api/src/http_triggers.rs +++ b/backend/windmill-api/src/http_triggers.rs @@ -34,6 +34,7 @@ use windmill_common::{ utils::{not_found_if_none, paginate, require_admin, Pagination, StripPath}, worker::{to_raw_value, CLOUD_HOSTED}, }; +use std::borrow::Cow; lazy_static::lazy_static! { static ref ROUTE_PATH_KEY_RE: regex::Regex = regex::Regex::new(r"/?:[-\w]+").unwrap(); @@ -100,7 +101,7 @@ impl TryFrom<&http::Method> for HttpMethod { } } -#[derive(Deserialize)] +#[derive(Debug, Deserialize)] struct NewTrigger { path: String, route_path: String, @@ -110,6 +111,7 @@ struct NewTrigger { requires_auth: bool, http_method: HttpMethod, static_asset_config: Option>, + workspaced_route: Option, is_static_website: bool, } @@ -131,6 +133,7 @@ pub struct HttpTrigger { #[serde(skip_serializing_if = "Option::is_none")] pub static_asset_config: Option>, pub is_static_website: bool, + pub workspaced_route: Option, } #[derive(Deserialize)] @@ -143,6 +146,7 @@ struct EditTrigger { requires_auth: bool, http_method: HttpMethod, static_asset_config: Option>, + workspaced_route: Option, is_static_website: bool, } @@ -164,7 +168,24 @@ async fn list_triggers( let mut tx = user_db.begin(&authed).await?; let (per_page, offset) = paginate(Pagination { per_page: lst.per_page, page: lst.page }); let mut sqlb = SqlBuilder::select_from("http_trigger") - .field("*") + .fields(&[ + "workspace_id", + "path", + "route_path", + "route_path_key", + "workspaced_route", + "script_path", + "is_flow", + "http_method", + "edited_by", + "email", + "edited_at", + "extra_perms", + "is_async", + "requires_auth", + "static_asset_config", + "is_static_website", + ]) .order_by("edited_at", true) .and_where("workspace_id = ?".bind(&w_id)) .offset(offset) @@ -199,9 +220,30 @@ async fn get_trigger( let path = path.to_path(); let trigger = sqlx::query_as!( HttpTrigger, - r#"SELECT workspace_id, path, route_path, route_path_key, script_path, is_flow, http_method as "http_method: _", edited_by, email, edited_at, extra_perms, is_async, requires_auth, static_asset_config as "static_asset_config: _", is_static_website - FROM http_trigger - WHERE workspace_id = $1 AND path = $2"#, + r#" + SELECT + workspace_id, + path, + route_path, + route_path_key, + workspaced_route, + script_path, + is_flow, + http_method as "http_method: _", + edited_by, + email, + edited_at, + extra_perms, + is_async, + requires_auth, + static_asset_config as "static_asset_config: _", + is_static_website + FROM + http_trigger + WHERE + workspace_id = $1 AND + path = $2 + "#, w_id, path, ) @@ -230,9 +272,16 @@ async fn create_trigger( // route path key is extracted from the route path to check for uniqueness // it replaces /?:{key} with :key // it will also remove the leading / if present, not an issue as we only allow : after slashes - let route_path_key = ROUTE_PATH_KEY_RE.replace_all(ct.route_path.as_str(), ":key"); - - let exists = route_path_key_exists(&route_path_key, &ct.http_method, &w_id, None, &db).await?; + let route_path_key = ROUTE_PATH_KEY_RE.replace_all(&ct.route_path, ":key"); + let exists = route_path_key_exists( + &route_path_key, + &ct.http_method, + &w_id, + None, + ct.workspaced_route, + &db, + ) + .await?; if exists { return Err(error::Error::BadRequest( "A route already exists with this path".to_string(), @@ -247,11 +296,33 @@ async fn create_trigger( let mut tx = user_db.begin(&authed).await?; sqlx::query!( - "INSERT INTO http_trigger (workspace_id, path, route_path, route_path_key, script_path, is_flow, is_async, requires_auth, http_method, static_asset_config, edited_by, email, edited_at, is_static_website) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, now(), $13)", + r#" + INSERT INTO http_trigger ( + workspace_id, + path, + route_path, + route_path_key, + workspaced_route, + script_path, + is_flow, + is_async, + requires_auth, + http_method, + static_asset_config, + edited_by, + email, + edited_at, + is_static_website + ) + VALUES ( + $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, now(), $14 + ) + "#, w_id, ct.path, ct.route_path, &route_path_key, + ct.workspaced_route, ct.script_path, ct.is_flow, ct.is_async, @@ -260,9 +331,10 @@ async fn create_trigger( ct.static_asset_config as _, &authed.username, &authed.email, - ct.is_static_website, + ct.is_static_website ) - .execute(&mut *tx).await?; + .execute(&mut *tx) + .await?; audit_log( &mut *tx, @@ -288,7 +360,6 @@ async fn update_trigger( Json(ct): Json, ) -> error::Result { let path = path.to_path(); - if *CLOUD_HOSTED && (ct.is_static_website || ct.static_asset_config.is_some()) { return Err(error::Error::BadRequest( "Static website and static asset are not supported on cloud".to_string(), @@ -309,9 +380,15 @@ async fn update_trigger( let route_path_key = ROUTE_PATH_KEY_RE.replace_all(&route_path, ":key"); - let exists = - route_path_key_exists(&route_path_key, &ct.http_method, &w_id, Some(&path), &db) - .await?; + let exists = route_path_key_exists( + &route_path_key, + &ct.http_method, + &w_id, + Some(&path), + ct.workspaced_route, + &db, + ) + .await?; if exists { return Err(error::Error::BadRequest( "A route already exists with this path".to_string(), @@ -319,13 +396,32 @@ async fn update_trigger( } tx = user_db.begin(&authed).await?; - sqlx::query!( - "UPDATE http_trigger - SET route_path = $1, route_path_key = $2, script_path = $3, path = $4, is_flow = $5, http_method = $6, static_asset_config = $7, edited_by = $8, email = $9, is_async = $10, requires_auth = $11, edited_at = now(), is_static_website = $12 - WHERE workspace_id = $13 AND path = $14", + r#" + UPDATE + http_trigger + SET + route_path = $1, + route_path_key = $2, + workspaced_route = $3, + script_path = $4, + path = $5, + is_flow = $6, + http_method = $7, + static_asset_config = $8, + edited_by = $9, + email = $10, + is_async = $11, + requires_auth = $12, + edited_at = now(), + is_static_website = $13 + WHERE + workspace_id = $14 AND + path = $15 + "#, route_path, &route_path_key, + ct.workspaced_route, ct.script_path, ct.path, ct.is_flow, @@ -339,12 +435,30 @@ async fn update_trigger( w_id, path, ) - .execute(&mut *tx).await?; + .execute(&mut *tx) + .await?; } else { tx = user_db.begin(&authed).await?; sqlx::query!( - "UPDATE http_trigger SET script_path = $1, path = $2, is_flow = $3, http_method = $4, static_asset_config = $5, edited_by = $6, email = $7, is_async = $8, requires_auth = $9, edited_at = now(), is_static_website = $10 - WHERE workspace_id = $11 AND path = $12", + r#" + UPDATE + http_trigger + SET + script_path = $1, + path = $2, + is_flow = $3, + http_method = $4, + static_asset_config = $5, + edited_by = $6, + email = $7, + is_async = $8, + requires_auth = $9, + edited_at = now(), + is_static_website = $10 + WHERE + workspace_id = $11 AND + path = $12 + "#, ct.script_path, ct.path, ct.is_flow, @@ -358,7 +472,8 @@ async fn update_trigger( w_id, path, ) - .execute(&mut *tx).await?; + .execute(&mut *tx) + .await?; } audit_log( @@ -386,9 +501,11 @@ async fn delete_trigger( let path = path.to_path(); let mut tx = user_db.begin(&authed).await?; sqlx::query!( - "DELETE FROM http_trigger WHERE workspace_id = $1 AND path = $2", + "DELETE FROM http_trigger + WHERE workspace_id = $1 + AND path = $2", w_id, - path, + path ) .execute(&mut *tx) .await?; @@ -415,13 +532,17 @@ async fn exists_trigger( ) -> JsonResult { let path = path.to_path(); let exists = sqlx::query_scalar!( - "SELECT EXISTS(SELECT 1 FROM http_trigger WHERE path = $1 AND workspace_id = $2)", + "SELECT EXISTS( + SELECT 1 FROM http_trigger + WHERE path = $1 AND workspace_id = $2 + )", path, - w_id, + w_id ) .fetch_one(&db) .await? .unwrap_or(false); + Ok(Json(exists)) } @@ -430,6 +551,7 @@ struct RouteExists { route_path: String, http_method: HttpMethod, trigger_path: Option, + workspaced_route: Option, } async fn route_path_key_exists( @@ -437,37 +559,65 @@ async fn route_path_key_exists( http_method: &HttpMethod, w_id: &str, trigger_path: Option<&str>, + workspaced_route: Option, db: &DB, ) -> error::Result { let exists = if *CLOUD_HOSTED { sqlx::query_scalar!( - "SELECT EXISTS(SELECT 1 FROM http_trigger WHERE route_path_key = $1 AND workspace_id = $2 AND http_method = $3 AND ($4::TEXT IS NULL OR path != $4))", - &route_path_key, - w_id, - http_method as &HttpMethod, - trigger_path - ) - .fetch_one(db) - .await? - .unwrap_or(false) - } else { - sqlx::query_scalar!( - "SELECT EXISTS(SELECT 1 FROM http_trigger WHERE route_path_key = $1 AND http_method = $2 AND ($3::TEXT IS NULL OR path != $3))", + r#" + SELECT EXISTS( + SELECT 1 + FROM http_trigger + WHERE + route_path_key = $1 + AND workspace_id = $2 + AND http_method = $3 + AND ($4::TEXT IS NULL OR path != $4) + ) + "#, &route_path_key, + w_id, http_method as &HttpMethod, trigger_path ) .fetch_one(db) .await? .unwrap_or(false) + } else { + let route_path_key = match workspaced_route { + Some(true) => Cow::Owned(format!("{}/{}", w_id, route_path_key.trim_matches('/'))), + _ => Cow::Borrowed(route_path_key), + }; + sqlx::query_scalar!( + r#" + SELECT EXISTS( + SELECT 1 + FROM http_trigger + WHERE + ((workspaced_route IS TRUE AND workspace_id || '/' || route_path_key = $1) + OR (workspaced_route IS FALSE AND route_path_key = $1)) + AND http_method = $2 + AND ($3::TEXT IS NULL OR path != $3) + ) + "#, + &route_path_key, + http_method as &HttpMethod, + trigger_path + ) + .fetch_one(db) + .await? + .unwrap_or(false) }; + Ok(exists) } async fn exists_route( Extension(db): Extension, Path(w_id): Path, - Json(RouteExists { route_path, http_method, trigger_path }): Json, + Json(RouteExists { route_path, http_method, trigger_path, workspaced_route }): Json< + RouteExists, + >, ) -> JsonResult { let route_path_key = ROUTE_PATH_KEY_RE.replace_all(route_path.as_str(), ":key"); @@ -476,6 +626,7 @@ async fn exists_route( &http_method, &w_id, trigger_path.as_deref(), + workspaced_route, &db, ) .await?; @@ -494,6 +645,7 @@ struct TriggerRoute { edited_by: String, email: String, static_asset_config: Option>, + workspaced_route: Option, is_static_website: bool, } @@ -514,7 +666,26 @@ async fn get_http_route_trigger( let route_path = StripPath(splitted.collect::>().join("/")); let triggers = sqlx::query_as!( TriggerRoute, - r#"SELECT path, script_path, is_flow, route_path, workspace_id, is_async, requires_auth, edited_by, email, static_asset_config as "static_asset_config: _", is_static_website FROM http_trigger WHERE workspace_id = $1 AND http_method = $2"#, + r#" + SELECT + path, + script_path, + is_flow, + route_path, + workspace_id, + is_async, + requires_auth, + edited_by, + email, + static_asset_config AS "static_asset_config: _", + workspaced_route, + is_static_website + FROM + http_trigger + WHERE + workspace_id = $1 AND + http_method = $2 + "#, w_id, http_method as HttpMethod ) @@ -524,7 +695,25 @@ async fn get_http_route_trigger( } else { let triggers = sqlx::query_as!( TriggerRoute, - r#"SELECT path, script_path, is_flow, route_path, workspace_id, is_async, requires_auth, edited_by, email, static_asset_config as "static_asset_config: _", is_static_website FROM http_trigger WHERE http_method = $1"#, + r#" + SELECT + path, + script_path, + is_flow, + route_path, + workspace_id, + is_async, + requires_auth, + edited_by, + email, + static_asset_config AS "static_asset_config: _", + workspaced_route, + is_static_website + FROM + http_trigger + WHERE + http_method = $1 + "#, http_method as HttpMethod ) .fetch_all(db) @@ -535,7 +724,10 @@ async fn get_http_route_trigger( let mut router = matchit::Router::new(); for (idx, trigger) in triggers.iter().enumerate() { - let route_path = trigger.route_path.clone(); + let route_path = match trigger.workspaced_route { + Some(true) => format!("{}/{}", &trigger.workspace_id, &trigger.route_path), + _ => trigger.route_path.clone(), + }; if trigger.is_static_website { router .insert(format!("/{}/*wm_subpath", route_path), idx) @@ -583,7 +775,16 @@ async fn get_http_route_trigger( // check that the user has access to the trigger let mut tx = user_db.begin(&authed).await?; let exists = sqlx::query_scalar!( - "SELECT EXISTS(SELECT 1 FROM http_trigger WHERE workspace_id = $1 AND path = $2)", + r#" + SELECT EXISTS( + SELECT 1 + FROM + http_trigger + WHERE + workspace_id = $1 AND + path = $2 + ) + "#, trigger.workspace_id, trigger.path ) diff --git a/backend/windmill-api/src/workspaces_export.rs b/backend/windmill-api/src/workspaces_export.rs index 8c6293bddb..f2c574de45 100644 --- a/backend/windmill-api/src/workspaces_export.rs +++ b/backend/windmill-api/src/workspaces_export.rs @@ -534,13 +534,32 @@ pub(crate) async fn tarball_workspace( #[cfg(feature = "http_trigger")] { let http_triggers = sqlx::query_as!( - crate::http_triggers::HttpTrigger, - "SELECT workspace_id, path, route_path, route_path_key, script_path, is_flow, edited_by, edited_at, email, extra_perms, is_async, requires_auth, http_method as \"http_method: _\", static_asset_config as \"static_asset_config: _\", is_static_website FROM http_trigger - WHERE workspace_id = $1", - &w_id - ) - .fetch_all(&mut *tx) - .await?; + crate::http_triggers::HttpTrigger, + r#" + SELECT + workspace_id, + workspaced_route, + path, + route_path, + route_path_key, + script_path, + is_flow, + edited_by, + edited_at, + email, + extra_perms, + is_async, + requires_auth, + http_method AS "http_method: _", + static_asset_config AS "static_asset_config: _", + is_static_website + FROM http_trigger + WHERE workspace_id = $1 + "#, + &w_id + ) + .fetch_all(&mut *tx) + .await?; for trigger in http_triggers { let trigger_str = &to_string_without_metadata(&trigger, false, None).unwrap(); @@ -608,10 +627,7 @@ pub(crate) async fn tarball_workspace( for trigger in sqs_triggers { let trigger_str = &to_string_without_metadata(&trigger, false, None).unwrap(); archive - .write_to_archive( - &trigger_str, - &format!("{}.sqs_trigger.json", trigger.path), - ) + .write_to_archive(&trigger_str, &format!("{}.sqs_trigger.json", trigger.path)) .await?; } } diff --git a/backend/windmill-common/src/s3_helpers.rs b/backend/windmill-common/src/s3_helpers.rs index 01507f5b6a..2c5a76a2e1 100644 --- a/backend/windmill-common/src/s3_helpers.rs +++ b/backend/windmill-common/src/s3_helpers.rs @@ -111,7 +111,7 @@ pub struct S3AwsOidcResource { pub audience: Option, } -#[derive(Serialize, Deserialize, Clone)] +#[derive(Debug, Serialize, Deserialize, Clone)] pub struct S3Object { pub s3: String, #[serde(skip_serializing_if = "Option::is_none")] diff --git a/frontend/src/lib/components/triggers/http/RouteEditorConfigSection.svelte b/frontend/src/lib/components/triggers/http/RouteEditorConfigSection.svelte index 4837d1d561..4e386d5b55 100644 --- a/frontend/src/lib/components/triggers/http/RouteEditorConfigSection.svelte +++ b/frontend/src/lib/components/triggers/http/RouteEditorConfigSection.svelte @@ -16,12 +16,14 @@ import CaptureTable from '../CaptureTable.svelte' import ClipboardPanel from '../../details/ClipboardPanel.svelte' import { isCloudHosted } from '$lib/cloud' + import Toggle from '$lib/components/Toggle.svelte' import { isObject } from '$lib/utils' + import { getHttpRoute } from './utils' export let initialTriggerPath: string | undefined = undefined export let dirtyRoutePath: boolean = false - export let route_path: string | undefined - export let http_method: 'get' | 'post' | 'put' | 'patch' | 'delete' | undefined + export let route_path: string = '' + export let http_method: 'get' | 'post' | 'put' | 'patch' | 'delete' = 'post' export let can_write: boolean = false export let static_asset_config: { s3: string; storage?: string; filename?: string } | undefined = undefined @@ -29,6 +31,7 @@ export let headless: boolean = false export let captureInfo: CaptureInfo | undefined = undefined export let captureTable: CaptureTable | undefined = undefined + export let workspaced_route: boolean = false export let isValid = false export let runnableArgs: any = {} let validateTimeout: NodeJS.Timeout | undefined = undefined @@ -36,7 +39,8 @@ let routeError: string = '' async function validateRoute( routePath: string | undefined, - method: typeof http_method + method: typeof http_method, + workspaced_route: boolean ): Promise { if (validateTimeout) { clearTimeout(validateTimeout) @@ -44,7 +48,7 @@ validateTimeout = setTimeout(async () => { if (!routePath || !method || !/^:?[-\w]+(\/:?[-\w]+)*$/.test(routePath)) { routeError = 'Endpoint not valid' - } else if (await routeExists(routePath, method)) { + } else if (await routeExists(routePath, method, workspaced_route)) { routeError = 'Endpoint already taken' } else { routeError = '' @@ -52,32 +56,23 @@ validateTimeout = undefined }, 500) } - - async function routeExists(route_path: string, method: Exclude) { + async function routeExists(route_path: string, method: Exclude, workspaced_route: boolean) { return await HttpTriggerService.existsRoute({ workspace: $workspaceStore!, requestBody: { route_path, http_method: method, - trigger_path: initialTriggerPath + trigger_path: initialTriggerPath, + workspaced_route: workspaced_route } }) } - $: validateRoute(route_path, http_method) + $: validateRoute(route_path, http_method, workspaced_route) $: isValid = routeError === '' - function getHttpRoute(route_path: string | undefined) { - return `${location.origin}${base}/api/r/${isCloudHosted() ? $workspaceStore + '/' : ''}${ - route_path ?? '' - }` - } - - $: fullRoute = getHttpRoute(route_path) - - $: !http_method && (http_method = 'post') - $: route_path === undefined && (route_path = '') + $: fullRoute = getHttpRoute(route_path, workspaced_route, $workspaceStore ?? '')
@@ -182,10 +177,26 @@ }} />
-
{dirtyRoutePath ? routeError : ''}
+ {#if !isCloudHosted()} +
+ { + workspaced_route = !workspaced_route + dirtyRoutePath = true + }} + options={{ + right: 'Prefix with workspace', + rightTooltip: + 'Prefixes the route with the workspace ID (e.g., {base_url}/api/r/{workspace_id}/{route}). Note: deploying the HTTP trigger to another workspace updates the route workspace prefix accordingly.' + }} + /> +
+ {/if} diff --git a/frontend/src/lib/components/triggers/http/RouteEditorInner.svelte b/frontend/src/lib/components/triggers/http/RouteEditorInner.svelte index 7199455250..918e6678fc 100644 --- a/frontend/src/lib/components/triggers/http/RouteEditorInner.svelte +++ b/frontend/src/lib/components/triggers/http/RouteEditorInner.svelte @@ -34,6 +34,22 @@ let script_path = '' let initialScriptPath = '' let fixedScriptPath = '' + let path: string = '' + let pathError = '' + let isValid = false + let dirtyRoutePath = false + let is_async = false + let requires_auth = false + let route_path = '' + let http_method: 'get' | 'post' | 'put' | 'patch' | 'delete' = 'post' + let static_asset_config: { s3: string; storage?: string; filename?: string } | undefined = + undefined + let is_static_website = false + + let s3FilePicker: S3FilePicker + let s3FileUploadRawMode = false + let s3Editor: SimpleEditor | undefined = undefined + let workspaced_route: boolean = false let drawerLoading = true export async function openEdit(ePath: string, isFlow: boolean) { @@ -78,27 +94,12 @@ initialPath = '' dirtyPath = false is_static_website = false + workspaced_route = false } finally { drawerLoading = false } } - let path: string = '' - let pathError = '' - let isValid = false - let dirtyRoutePath = false - let is_async = false - let requires_auth = false - let route_path = '' - let http_method: 'get' | 'post' | 'put' | 'patch' | 'delete' = 'post' - let static_asset_config: { s3: string; storage?: string; filename?: string } | undefined = - undefined - let is_static_website = false - - let s3FilePicker: S3FilePicker - let s3FileUploadRawMode = false - let s3Editor: SimpleEditor | undefined = undefined - const dispatch = createEventDispatcher() let can_write = true @@ -109,13 +110,13 @@ }) script_path = s.script_path initialScriptPath = s.script_path - is_flow = s.is_flow path = s.path route_path = s.route_path http_method = s.http_method ?? 'post' is_async = s.is_async requires_auth = s.requires_auth + workspaced_route = s.workspaced_route ?? false if (!isCloudHosted()) { static_asset_config = s.static_asset_config s3FileUploadRawMode = !!static_asset_config @@ -139,7 +140,8 @@ route_path: $userStore?.is_admin || $userStore?.is_super_admin ? route_path : undefined, http_method, static_asset_config, - is_static_website + is_static_website, + workspaced_route } }) sendUserToast(`Route ${path} updated`) @@ -155,7 +157,8 @@ route_path, http_method, static_asset_config, - is_static_website + is_static_website, + workspaced_route } }) sendUserToast(`Route ${path} created`) @@ -357,9 +360,7 @@ btnClasses="ml-4 mt-2" color="dark" size="xs" - href={itemKind === 'flow' - ? '/flows/add?hub=62' - : '/scripts/add?hub=hub%2F11627'} + href={itemKind === 'flow' ? '/flows/add?hub=62' : '/scripts/add?hub=hub%2F11627'} target="_blank">Create from template {/if} @@ -373,6 +374,7 @@ bind:isValid bind:dirtyRoutePath bind:http_method + bind:workspaced_route {can_write} bind:static_asset_config /> diff --git a/frontend/src/lib/components/triggers/http/utils.ts b/frontend/src/lib/components/triggers/http/utils.ts new file mode 100644 index 0000000000..bf0a244c0e --- /dev/null +++ b/frontend/src/lib/components/triggers/http/utils.ts @@ -0,0 +1,8 @@ +import { base } from "$lib/base"; +import { isCloudHosted } from "$lib/cloud"; + +export function getHttpRoute(route_path: string, workspaced_route: boolean, workspace_id: string) { + return `${location.origin}${base}/api/r/${ + isCloudHosted() || workspaced_route ? workspace_id + '/' : '' + }${route_path}` +} \ No newline at end of file diff --git a/frontend/src/routes/(root)/(logged)/routes/+page.js b/frontend/src/routes/(root)/(logged)/routes/+page.js index 919dd87a1e..f4fd63c8ba 100644 --- a/frontend/src/routes/(root)/(logged)/routes/+page.js +++ b/frontend/src/routes/(root)/(logged)/routes/+page.js @@ -1,5 +1,5 @@ export function load() { return { - stuff: { title: 'HTTP routes' } + stuff: { title: 'HTTP triggers' } } } diff --git a/frontend/src/routes/(root)/(logged)/routes/+page.svelte b/frontend/src/routes/(root)/(logged)/routes/+page.svelte index 03a87d7b86..a43cfdd86f 100644 --- a/frontend/src/routes/(root)/(logged)/routes/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/routes/+page.svelte @@ -5,7 +5,13 @@ type HttpTrigger, type WorkspaceDeployUISettings } from '$lib/gen' - import { canWrite, displayDate, getLocalSetting, storeLocalSetting } from '$lib/utils' + import { + canWrite, + copyToClipboard, + displayDate, + getLocalSetting, + storeLocalSetting + } from '$lib/utils' import { base } from '$app/paths' import CenteredPage from '$lib/components/CenteredPage.svelte' import { Button, Skeleton } from '$lib/components/common' @@ -15,7 +21,7 @@ import ShareModal from '$lib/components/ShareModal.svelte' import Toggle from '$lib/components/Toggle.svelte' import { userStore, workspaceStore, userWorkspaces, enterpriseLicense } from '$lib/stores' - import { Route, Code, Eye, Pen, Plus, Share, Trash, FileUp } from 'lucide-svelte' + import { Route, Code, Eye, Pen, Plus, Share, Trash, FileUp, ClipboardCopy } from 'lucide-svelte' import { goto } from '$lib/navigation' import SearchItems from '$lib/components/SearchItems.svelte' import NoItemFound from '$lib/components/home/NoItemFound.svelte' @@ -28,6 +34,8 @@ import RouteEditor from '$lib/components/triggers/http/RouteEditor.svelte' import DeployWorkspaceDrawer from '$lib/components/DeployWorkspaceDrawer.svelte' import { ALL_DEPLOYABLE, isDeployable } from '$lib/utils_deployable' + import { isCloudHosted } from '$lib/cloud' + import { getHttpRoute } from '$lib/components/triggers/http/utils' type TriggerW = HttpTrigger & { canWrite: boolean } @@ -229,7 +237,7 @@
No routes
{:else if items?.length}
- {#each items.slice(0, nbDisplayed) as { path, edited_by, edited_at, script_path, route_path, is_flow, extra_perms, canWrite, marked, http_method, static_asset_config } (path)} + {#each items.slice(0, nbDisplayed) as { workspace_id, workspaced_route, path, edited_by, edited_at, script_path, route_path, is_flow, extra_perms, canWrite, marked, http_method, static_asset_config } (path)} {@const href = `${is_flow ? '/flows/get' : '/scripts/get'}/${script_path}`}
{:else} - {http_method.toUpperCase()} /{route_path} + {http_method.toUpperCase()} + {isCloudHosted() || workspaced_route + ? workspace_id + '/' + route_path + : route_path} {/if}
@@ -270,6 +281,15 @@
+
diff --git a/frontend/src/lib/components/HistoricList.svelte b/frontend/src/lib/components/HistoricList.svelte index 598fc20353..2814806487 100644 --- a/frontend/src/lib/components/HistoricList.svelte +++ b/frontend/src/lib/components/HistoricList.svelte @@ -11,6 +11,7 @@ export let showAuthor = false export let placement: 'bottom-start' | 'top-start' | 'bottom-end' | 'top-end' = 'bottom-start' export let limitPayloadSize = false + export let searchArgs: Record | undefined = undefined let infiniteList: InfiniteList | undefined = undefined let loadInputsPageFn: ((page: number, perPage: number) => Promise) | undefined = undefined @@ -37,7 +38,8 @@ runnableType, page, perPage, - includePreview: true + includePreview: true, + args: searchArgs ? JSON.stringify(searchArgs) : undefined }) const inputsWithPayload = await Promise.all( diff --git a/frontend/src/lib/components/SavedInputsV2.svelte b/frontend/src/lib/components/SavedInputsV2.svelte index 5896f2776b..6ef125850d 100644 --- a/frontend/src/lib/components/SavedInputsV2.svelte +++ b/frontend/src/lib/components/SavedInputsV2.svelte @@ -1,13 +1,16 @@
@@ -92,17 +108,92 @@
- +
+ { + e.stopPropagation() + }} + floatingConfig={{ placement: 'top-end' }} + > + + + + + + diff --git a/frontend/src/lib/components/multiselect/MultiSelectWrapper.svelte b/frontend/src/lib/components/multiselect/MultiSelectWrapper.svelte index d4c6e6e87c..9d79526f3f 100644 --- a/frontend/src/lib/components/multiselect/MultiSelectWrapper.svelte +++ b/frontend/src/lib/components/multiselect/MultiSelectWrapper.svelte @@ -8,13 +8,17 @@ import MultiSelect from '$lib/components/multiselect/MultiSelect.svelte' import DarkModeObserver from '../DarkModeObserver.svelte' + export let items: any[] + export let value: string[] | undefined = [] as string[] + export let placeholder: string | undefined = undefined + export let target: string | HTMLElement | undefined = undefined + export let topPlacement = false const [floatingRef, floatingContent] = createFloatingActions({ strategy: 'absolute', + placement: topPlacement ? 'top-start' : 'bottom-start', middleware: [offset(5), flip(), shift()] }) - export let items: any[] - export let value: string[] | undefined = [] as string[] let outerDiv: HTMLDivElement | undefined = undefined let portalRef: HTMLDivElement | undefined = undefined @@ -56,6 +60,7 @@ --sms-selected-bg={darkMode ? '#c7d2fe' : '#e0e7ff'} --sms-selected-text-color={darkMode ? '#312e81' : '#3730a3'} bind:selected={value} + {placeholder} options={items} on:close={() => { open = false @@ -80,7 +85,7 @@
- +
From 8e0963eec8a86b6d8593995c803dfbdd2c96bfc1 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Wed, 12 Mar 2025 17:10:40 +0100 Subject: [PATCH 017/739] fix: update bun to 1.2.4 --- .github/DockerfileBackendTests | 2 +- Dockerfile | 2 +- docker/DockerfileSlim | 2 +- docker/DockerfileSlimEe | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/DockerfileBackendTests b/.github/DockerfileBackendTests index 0eb2149feb..dbfffc0c7b 100644 --- a/.github/DockerfileBackendTests +++ b/.github/DockerfileBackendTests @@ -40,7 +40,7 @@ RUN wget https://www.python.org/ftp/python/${PYTHON_VERSION}/Python-${PYTHON_VER RUN /usr/local/bin/python3 -m pip install pip-tools -COPY --from=oven/bun:1.2.3 /usr/local/bin/bun /usr/bin/bun +COPY --from=oven/bun:1.2.4 /usr/local/bin/bun /usr/bin/bun ARG TARGETPLATFORM diff --git a/Dockerfile b/Dockerfile index 3e670c37e8..43b750d957 100644 --- a/Dockerfile +++ b/Dockerfile @@ -191,7 +191,7 @@ COPY --from=builder /windmill/target/release/windmill ${APP}/windmill COPY --from=denoland/deno:2.2.1 --chmod=755 /usr/bin/deno /usr/bin/deno -COPY --from=oven/bun:1.2.3 /usr/local/bin/bun /usr/bin/bun +COPY --from=oven/bun:1.2.4 /usr/local/bin/bun /usr/bin/bun COPY --from=php:8.3.7-cli /usr/local/bin/php /usr/bin/php COPY --from=composer:2.7.6 /usr/bin/composer /usr/bin/composer diff --git a/docker/DockerfileSlim b/docker/DockerfileSlim index 57deacde11..3be8c6c5b8 100644 --- a/docker/DockerfileSlim +++ b/docker/DockerfileSlim @@ -20,7 +20,7 @@ RUN /usr/local/bin/python3 -m pip install pip-tools # Install UV RUN curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/uv/releases/download/0.5.15/uv-installer.sh | sh && mv /root/.local/bin/uv /usr/local/bin/uv -COPY --from=oven/bun:1.2.3 /usr/local/bin/bun /usr/bin/bun +COPY --from=oven/bun:1.2.4 /usr/local/bin/bun /usr/bin/bun # add the docker client to call docker from a worker if enabled COPY --from=docker:dind /usr/local/bin/docker /usr/local/bin/ diff --git a/docker/DockerfileSlimEe b/docker/DockerfileSlimEe index cc690c0939..f3f1e26cee 100644 --- a/docker/DockerfileSlimEe +++ b/docker/DockerfileSlimEe @@ -19,7 +19,7 @@ RUN /usr/local/bin/python3 -m pip install pip-tools # Install UV RUN curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/uv/releases/download/0.5.15/uv-installer.sh | sh && mv /root/.local/bin/uv /usr/local/bin/uv -COPY --from=oven/bun:1.2.3 /usr/local/bin/bun /usr/bin/bun +COPY --from=oven/bun:1.2.4 /usr/local/bin/bun /usr/bin/bun # add the docker client to call docker from a worker if enabled COPY --from=docker:dind /usr/local/bin/docker /usr/local/bin/ From c17d6854d8c560d5328c6b5886969a1c920e65dd Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Wed, 12 Mar 2025 17:18:45 +0100 Subject: [PATCH 018/739] fix runschart handling of empty started at --- frontend/src/lib/components/RunChart.svelte | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/frontend/src/lib/components/RunChart.svelte b/frontend/src/lib/components/RunChart.svelte index e976fd3351..9d1dbc16d1 100644 --- a/frontend/src/lib/components/RunChart.svelte +++ b/frontend/src/lib/components/RunChart.svelte @@ -176,8 +176,11 @@ function minJobTime(jobs: CompletedJob[]): Date { let min: Date = new Date(jobs[0].started_at) for (const job of jobs) { - if (new Date(job.started_at) < min) { - min = new Date(job.started_at) + if (job.started_at != undefined) { + const date = new Date(job.started_at) + if (date < min) { + min = date + } } } return min From 30f38c31af520bec3c2fb07b50d994b87ad7b0b4 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Wed, 12 Mar 2025 17:38:35 +0100 Subject: [PATCH 019/739] improve args bind --- backend/windmill-api/src/inputs.rs | 2 +- frontend/src/lib/components/RunChart.svelte | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/backend/windmill-api/src/inputs.rs b/backend/windmill-api/src/inputs.rs index 4e769bbc92..9897a58d4b 100644 --- a/backend/windmill-api/src/inputs.rs +++ b/backend/windmill-api/src/inputs.rs @@ -134,7 +134,7 @@ async fn get_input_history( let mut tx = user_db.begin(&authed).await?; let args_query = if let Some(args) = &g.args { - format!("and args @> '{}'", args) + sql_builder::bind::Bind::bind(&"args @> ?", &args.replace("'", "''")) } else { "".to_string() }; diff --git a/frontend/src/lib/components/RunChart.svelte b/frontend/src/lib/components/RunChart.svelte index 9d1dbc16d1..074fa46293 100644 --- a/frontend/src/lib/components/RunChart.svelte +++ b/frontend/src/lib/components/RunChart.svelte @@ -181,6 +181,8 @@ if (date < min) { min = date } + } else { + console.log(job) } } return min From f0b4918e5e68b8fd7ed6d82c21f060fbbc901ce7 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Wed, 12 Mar 2025 18:18:13 +0100 Subject: [PATCH 020/739] improve input history job loader UX --- backend/windmill-api/src/inputs.rs | 4 ++-- .../src/lib/components/HistoricInputs.svelte | 4 ++-- .../src/lib/components/HistoricList.svelte | 5 ++++- .../src/lib/components/InfiniteList.svelte | 20 ++++++++++++++++++- frontend/src/lib/components/RunChart.svelte | 2 -- .../src/lib/components/SavedInputsV2.svelte | 4 ++-- .../src/lib/components/table/DataTable.svelte | 12 +++++++++-- 7 files changed, 39 insertions(+), 12 deletions(-) diff --git a/backend/windmill-api/src/inputs.rs b/backend/windmill-api/src/inputs.rs index 9897a58d4b..c601c07ee2 100644 --- a/backend/windmill-api/src/inputs.rs +++ b/backend/windmill-api/src/inputs.rs @@ -134,14 +134,14 @@ async fn get_input_history( let mut tx = user_db.begin(&authed).await?; let args_query = if let Some(args) = &g.args { - sql_builder::bind::Bind::bind(&"args @> ?", &args.replace("'", "''")) + sql_builder::bind::Bind::bind(&"and args @> ?", &args.replace("'", "''")) } else { "".to_string() }; let sql = &format!( "select id, v2_job.created_at, created_by, 'null'::jsonb as args, status = 'success' as success from v2_job JOIN v2_job_completed USING (id) \ - where {} = $1 and kind = any($2) {args_query} and v2_job.workspace_id = $3 AND v2_job_completed.status != 'skipped' \ + where v2_job.workspace_id = $3 and {} = $1 and kind = any($2) {args_query} AND v2_job_completed.status != 'skipped' \ order by v2_job.created_at desc limit $4 offset $5", r.runnable_type.column_name(), diff --git a/frontend/src/lib/components/HistoricInputs.svelte b/frontend/src/lib/components/HistoricInputs.svelte index 83574a2d61..d7020b4f11 100644 --- a/frontend/src/lib/components/HistoricInputs.svelte +++ b/frontend/src/lib/components/HistoricInputs.svelte @@ -57,8 +57,8 @@ let jobHovered: string | undefined = undefined - export function refresh() { - historicList?.refresh() + export function refresh(clearCurrentRuns: boolean = false) { + historicList?.refresh(clearCurrentRuns) } export function resetSelected(dispatchEvent?: boolean) { diff --git a/frontend/src/lib/components/HistoricList.svelte b/frontend/src/lib/components/HistoricList.svelte index 2814806487..01dbcf4530 100644 --- a/frontend/src/lib/components/HistoricList.svelte +++ b/frontend/src/lib/components/HistoricList.svelte @@ -18,7 +18,10 @@ let viewerOpen = false let openStates: Record = {} // Track open state for each item - export function refresh() { + export function refresh(clearCurrentRuns: boolean = false) { + if (clearCurrentRuns) { + infiniteList?.reset() + } if (infiniteList) { infiniteList.loadData('refresh') } diff --git a/frontend/src/lib/components/InfiniteList.svelte b/frontend/src/lib/components/InfiniteList.svelte index e8caaefdb7..96220be937 100644 --- a/frontend/src/lib/components/InfiniteList.svelte +++ b/frontend/src/lib/components/InfiniteList.svelte @@ -12,19 +12,35 @@ export let isEmpty: boolean = true export let length: number = 0 + const perPage = 20 + let hasMore = false let page = 1 - let perPage = 10 let hasAlreadyFailed = false let hovered: any | undefined = undefined let initLoad = false let loadInputs: ((page: number, perPage: number) => Promise) | undefined = undefined let deleteItemFn: ((id: any) => Promise) | undefined = undefined + export function reset() { + items = undefined + loading = false + initLoad = false + length = 0 + hasMore = false + page = 1 + } + + let loadingMore = false + export async function loadData(loadOption: 'refresh' | 'forceRefresh' | 'loadMore' = 'loadMore') { // console.log('loadData', loadOption, length, items?.length) if (!loadInputs) return + if (loadOption == 'loadMore') { + if (loadingMore || loading) return + loadingMore = true + } loading = true hasMore = length === perPage * page @@ -76,6 +92,7 @@ dispatch('error', { type: 'load', error: err }) } finally { loading = false + loadingMore = false } } @@ -119,6 +136,7 @@ loadData() }} {loading} + {loadingMore} > diff --git a/frontend/src/lib/components/RunChart.svelte b/frontend/src/lib/components/RunChart.svelte index 074fa46293..9d1dbc16d1 100644 --- a/frontend/src/lib/components/RunChart.svelte +++ b/frontend/src/lib/components/RunChart.svelte @@ -181,8 +181,6 @@ if (date < min) { min = date } - } else { - console.log(job) } } return min diff --git a/frontend/src/lib/components/SavedInputsV2.svelte b/frontend/src/lib/components/SavedInputsV2.svelte index df4a4f5389..08eb4a7211 100644 --- a/frontend/src/lib/components/SavedInputsV2.svelte +++ b/frontend/src/lib/components/SavedInputsV2.svelte @@ -144,7 +144,7 @@ searchArgs = {} appliedSearchArgs = {} await tick() - historicInputs?.refresh() + historicInputs?.refresh(true) }} variant="contained" size="xs2" @@ -155,7 +155,7 @@ on:click={async () => { appliedSearchArgs = structuredClone(searchArgs) await tick() - historicInputs?.refresh() + historicInputs?.refresh(true) }} endIcon={{ icon: Search }} variant="contained" diff --git a/frontend/src/lib/components/table/DataTable.svelte b/frontend/src/lib/components/table/DataTable.svelte index cd439e0ff9..4418d5ba4f 100644 --- a/frontend/src/lib/components/table/DataTable.svelte +++ b/frontend/src/lib/components/table/DataTable.svelte @@ -7,7 +7,7 @@ From 23412980a200b93b2c3f746226d8b11967e7156e Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 13 Mar 2025 11:28:48 +0100 Subject: [PATCH 033/739] improve undefined schema handling for search --- frontend/src/lib/components/SavedInputsV2.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/lib/components/SavedInputsV2.svelte b/frontend/src/lib/components/SavedInputsV2.svelte index 2b9ebfddb3..db446550ac 100644 --- a/frontend/src/lib/components/SavedInputsV2.svelte +++ b/frontend/src/lib/components/SavedInputsV2.svelte @@ -169,7 +169,7 @@ topPlacement target="#multi-select-search" placeholder="arg fields to filter on" - items={Object.keys(schema.properties)} + items={Object.keys(schema?.properties ?? {})} bind:value={searchArgsFields} />
From fa9490886f8a022e8e4fa22f11f371f7a37495cd Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 13 Mar 2025 12:07:33 +0100 Subject: [PATCH 034/739] more transparent pg listener error --- backend/src/main.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/backend/src/main.rs b/backend/src/main.rs index 41d53b14af..54ea123fc3 100644 --- a/backend/src/main.rs +++ b/backend/src/main.rs @@ -665,9 +665,14 @@ Windmill Community Edition {GIT_VERSION} tracing::info!("received killpill for monitor job"); break; }, - notification = listener.recv() => { + notification = listener.try_recv() => { match notification { Ok(n) => { + if n.is_none() { + tracing::error!("Could not receive notification, attempting to reconnect to pg listener"); + continue; + } + let n = n.unwrap(); tracing::info!("Received new pg notification: {n:?}"); match n.channel() { "notify_config_change" => { From a3812585cf115823ef0f3277715d2f3ebb8d4783 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 13 Mar 2025 15:18:57 +0100 Subject: [PATCH 035/739] editable schema nit --- frontend/src/lib/components/schema/EditableSchemaDrawer.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/lib/components/schema/EditableSchemaDrawer.svelte b/frontend/src/lib/components/schema/EditableSchemaDrawer.svelte index cac361cf78..ee35240fee 100644 --- a/frontend/src/lib/components/schema/EditableSchemaDrawer.svelte +++ b/frontend/src/lib/components/schema/EditableSchemaDrawer.svelte @@ -25,7 +25,7 @@ let schemaFormDrawer: Drawer | undefined = undefined let editableSchemaForm: EditableSchemaForm | undefined = undefined - $: items = ((schema?.order ?? Object.keys(schema.properties ?? {}))?.map((item, index) => { + $: items = ((schema?.order ?? Object.keys(schema?.properties ?? {}))?.map((item, index) => { return { value: item, id: item } }) ?? []) as Array<{ value: string From 9dba57d546c984ff8cfb26c73d2ccdda4c18aaf3 Mon Sep 17 00:00:00 2001 From: dieriba Date: Thu, 13 Mar 2025 21:39:54 +0100 Subject: [PATCH 036/739] feat: add raw string option and wrap option for http trigger (#5467) * add new column * handled worskpaced route * update .sqlx * update: rename migration file, rewrite query for checking existing route path key, add copy button url for each route trigger * update .sqlx * update sql query * update .sqlx * fix: prevent precedence on query * nits * update .sqlx * update query * Update http_triggers.rs * nits * handling two new option in http route 'wrap_body' and 'raw_string' * update sqlx and add wrap_body and raw_string to http route * fix: undefined route path * nits: remove unnecessay ref as type implement copy * nits * fix: undefined protection --------- Co-authored-by: HugoCasa --- ...8234ca7d1efeee9661f3901f298da375e73f7.json | 30 +-- ...f9a8108c436cba1d2b770e9104d1c8590bcb.json} | 16 +- ...2079c7274ca0827dc2a26b29394c12b3f7fc.json} | 6 +- ...462df32172ad0d67321495c94bf2d59010f5.json} | 18 +- ...dcc40f463cbc52d94ed9315cf9a547d4c89f2.json | 30 +-- ...a6ff8553b9c196ca64ea2752df8cfe30c30c.json} | 16 +- ...c57cc51c7ea256058daf170a1ec8573ed102.json} | 18 +- ...05d394a7cbcf0038c72a78add5c7b02ef5927.json | 2 +- ...9b3abe9d04b86ad50c0f62903a1a79479a60.json} | 6 +- backend/.vscode/settings.json | 2 +- ...le_format_response_of_http_routes.down.sql | 4 + ...ndle_format_response_of_http_routes.up.sql | 4 + backend/windmill-api/openapi.yaml | 15 ++ backend/windmill-api/src/args.rs | 246 +++++++++--------- backend/windmill-api/src/http_triggers.rs | 92 +++++-- backend/windmill-api/src/lib.rs | 2 +- backend/windmill-api/src/workspaces_export.rs | 4 +- frontend/src/lib/components/ArgInput.svelte | 2 +- .../http/RouteEditorConfigSection.svelte | 15 +- .../triggers/http/RouteEditorInner.svelte | 50 +++- .../src/lib/components/triggers/http/utils.ts | 4 +- 21 files changed, 377 insertions(+), 205 deletions(-) rename backend/.sqlx/{query-4353a7de6b4de1df6e19d95a4db8ae89c8d75034a9210233aed2f0414690e37d.json => query-157090e958a907a09554c2491cabf9a8108c436cba1d2b770e9104d1c8590bcb.json} (83%) rename backend/.sqlx/{query-eb4779976677308e8ad7c6427bfb45146478f70956919c01718623f0828e0383.json => query-22888025706d457da65207ea9d592079c7274ca0827dc2a26b29394c12b3f7fc.json} (60%) rename backend/.sqlx/{query-01b87cdd552c2d5a3cd475eb705110394fe6c8abcc1fa93291fac6f929043d20.json => query-54798bea6f75ab6d3c680b1085f0462df32172ad0d67321495c94bf2d59010f5.json} (78%) rename backend/.sqlx/{query-e44ea5870a8eba1fe3d22d4dfe7734669464a56e470935ce2924723003f3f92b.json => query-5824982a58edd5bb2666daac49b2a6ff8553b9c196ca64ea2752df8cfe30c30c.json} (87%) rename backend/.sqlx/{query-300b41622dbcdf908d9e173eee2133239d5806fc50bba2d3fe9d8a6e11627655.json => query-6860deb7064e57b9e7646438145dc57cc51c7ea256058daf170a1ec8573ed102.json} (77%) rename backend/.sqlx/{query-78e6342696052d0e1f79fd721f5942d4da686a65ab11eefdca16367d2db67963.json => query-fd724083c4ef6ec0f1cede5813c89b3abe9d04b86ad50c0f62903a1a79479a60.json} (55%) create mode 100644 backend/migrations/20250311162140_add_columns_to_handle_format_response_of_http_routes.down.sql create mode 100644 backend/migrations/20250311162140_add_columns_to_handle_format_response_of_http_routes.up.sql diff --git a/backend/.sqlx/query-08f288d2781d823e109a9e5b8848234ca7d1efeee9661f3901f298da375e73f7.json b/backend/.sqlx/query-08f288d2781d823e109a9e5b8848234ca7d1efeee9661f3901f298da375e73f7.json index 4bcf3c6ce3..2be39fce26 100644 --- a/backend/.sqlx/query-08f288d2781d823e109a9e5b8848234ca7d1efeee9661f3901f298da375e73f7.json +++ b/backend/.sqlx/query-08f288d2781d823e109a9e5b8848234ca7d1efeee9661f3901f298da375e73f7.json @@ -130,28 +130,28 @@ }, { "ordinal": 25, - "name": "ai_models", - "type_info": "VarcharArray" - }, - { - "ordinal": 26, - "name": "code_completion_model", - "type_info": "Varchar" - }, - { - "ordinal": 27, "name": "teams_command_script", "type_info": "Text" }, { - "ordinal": 28, + "ordinal": 26, "name": "teams_team_id", "type_info": "Text" }, { - "ordinal": 29, + "ordinal": 27, "name": "teams_team_name", "type_info": "Text" + }, + { + "ordinal": 28, + "name": "ai_models", + "type_info": "VarcharArray" + }, + { + "ordinal": 29, + "name": "code_completion_model", + "type_info": "Varchar" } ], "parameters": { @@ -185,10 +185,10 @@ true, true, true, + true, + true, + true, false, - true, - true, - true, true ] }, diff --git a/backend/.sqlx/query-4353a7de6b4de1df6e19d95a4db8ae89c8d75034a9210233aed2f0414690e37d.json b/backend/.sqlx/query-157090e958a907a09554c2491cabf9a8108c436cba1d2b770e9104d1c8590bcb.json similarity index 83% rename from backend/.sqlx/query-4353a7de6b4de1df6e19d95a4db8ae89c8d75034a9210233aed2f0414690e37d.json rename to backend/.sqlx/query-157090e958a907a09554c2491cabf9a8108c436cba1d2b770e9104d1c8590bcb.json index 49ede3a762..df4a83bdb4 100644 --- a/backend/.sqlx/query-4353a7de6b4de1df6e19d95a4db8ae89c8d75034a9210233aed2f0414690e37d.json +++ b/backend/.sqlx/query-157090e958a907a09554c2491cabf9a8108c436cba1d2b770e9104d1c8590bcb.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT \n workspace_id, \n path, \n route_path, \n route_path_key,\n workspaced_route,\n script_path, \n is_flow, \n http_method as \"http_method: _\", \n edited_by, \n email, \n edited_at, \n extra_perms, \n is_async, \n requires_auth, \n static_asset_config as \"static_asset_config: _\", \n is_static_website\n FROM \n http_trigger\n WHERE \n workspace_id = $1 AND \n path = $2\n ", + "query": "\n SELECT \n workspace_id, \n path, \n route_path, \n route_path_key,\n workspaced_route,\n script_path, \n is_flow, \n http_method as \"http_method: _\", \n edited_by, \n email, \n edited_at, \n extra_perms, \n is_async, \n requires_auth, \n static_asset_config as \"static_asset_config: _\", \n is_static_website,\n wrap_body,\n raw_string\n FROM \n http_trigger\n WHERE \n workspace_id = $1 AND \n path = $2\n ", "describe": { "columns": [ { @@ -95,6 +95,16 @@ "ordinal": 15, "name": "is_static_website", "type_info": "Bool" + }, + { + "ordinal": 16, + "name": "wrap_body", + "type_info": "Bool" + }, + { + "ordinal": 17, + "name": "raw_string", + "type_info": "Bool" } ], "parameters": { @@ -119,8 +129,10 @@ false, false, true, + false, + false, false ] }, - "hash": "4353a7de6b4de1df6e19d95a4db8ae89c8d75034a9210233aed2f0414690e37d" + "hash": "157090e958a907a09554c2491cabf9a8108c436cba1d2b770e9104d1c8590bcb" } diff --git a/backend/.sqlx/query-eb4779976677308e8ad7c6427bfb45146478f70956919c01718623f0828e0383.json b/backend/.sqlx/query-22888025706d457da65207ea9d592079c7274ca0827dc2a26b29394c12b3f7fc.json similarity index 60% rename from backend/.sqlx/query-eb4779976677308e8ad7c6427bfb45146478f70956919c01718623f0828e0383.json rename to backend/.sqlx/query-22888025706d457da65207ea9d592079c7274ca0827dc2a26b29394c12b3f7fc.json index f1b390b511..f4e752cc71 100644 --- a/backend/.sqlx/query-eb4779976677308e8ad7c6427bfb45146478f70956919c01718623f0828e0383.json +++ b/backend/.sqlx/query-22888025706d457da65207ea9d592079c7274ca0827dc2a26b29394c12b3f7fc.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n INSERT INTO http_trigger (\n workspace_id, \n path, \n route_path, \n route_path_key,\n workspaced_route,\n script_path, \n is_flow, \n is_async, \n requires_auth, \n http_method, \n static_asset_config, \n edited_by, \n email, \n edited_at, \n is_static_website\n ) \n VALUES (\n $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, now(), $14\n )\n ", + "query": "\n INSERT INTO http_trigger (\n workspace_id, \n path, \n route_path, \n route_path_key,\n workspaced_route,\n wrap_body,\n raw_string,\n script_path, \n is_flow, \n is_async, \n requires_auth, \n http_method, \n static_asset_config, \n edited_by, \n email, \n edited_at, \n is_static_website\n ) \n VALUES (\n $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, now(), $16\n )\n ", "describe": { "columns": [], "parameters": { @@ -10,6 +10,8 @@ "Varchar", "Varchar", "Bool", + "Bool", + "Bool", "Varchar", "Bool", "Bool", @@ -36,5 +38,5 @@ }, "nullable": [] }, - "hash": "eb4779976677308e8ad7c6427bfb45146478f70956919c01718623f0828e0383" + "hash": "22888025706d457da65207ea9d592079c7274ca0827dc2a26b29394c12b3f7fc" } diff --git a/backend/.sqlx/query-01b87cdd552c2d5a3cd475eb705110394fe6c8abcc1fa93291fac6f929043d20.json b/backend/.sqlx/query-54798bea6f75ab6d3c680b1085f0462df32172ad0d67321495c94bf2d59010f5.json similarity index 78% rename from backend/.sqlx/query-01b87cdd552c2d5a3cd475eb705110394fe6c8abcc1fa93291fac6f929043d20.json rename to backend/.sqlx/query-54798bea6f75ab6d3c680b1085f0462df32172ad0d67321495c94bf2d59010f5.json index cae9fdd79f..cafdebb2c3 100644 --- a/backend/.sqlx/query-01b87cdd552c2d5a3cd475eb705110394fe6c8abcc1fa93291fac6f929043d20.json +++ b/backend/.sqlx/query-54798bea6f75ab6d3c680b1085f0462df32172ad0d67321495c94bf2d59010f5.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT \n path, \n script_path, \n is_flow, \n route_path, \n workspace_id, \n is_async, \n requires_auth, \n edited_by, \n email, \n static_asset_config AS \"static_asset_config: _\",\n workspaced_route,\n is_static_website\n FROM \n http_trigger \n WHERE \n http_method = $1\n ", + "query": "\n SELECT \n path, \n script_path, \n is_flow, \n route_path, \n workspace_id, \n is_async, \n requires_auth, \n edited_by, \n email, \n static_asset_config AS \"static_asset_config: _\",\n wrap_body,\n raw_string,\n workspaced_route,\n is_static_website\n FROM \n http_trigger \n WHERE \n http_method = $1\n ", "describe": { "columns": [ { @@ -55,11 +55,21 @@ }, { "ordinal": 10, - "name": "workspaced_route", + "name": "wrap_body", "type_info": "Bool" }, { "ordinal": 11, + "name": "raw_string", + "type_info": "Bool" + }, + { + "ordinal": 12, + "name": "workspaced_route", + "type_info": "Bool" + }, + { + "ordinal": 13, "name": "is_static_website", "type_info": "Bool" } @@ -94,8 +104,10 @@ false, true, false, + false, + false, false ] }, - "hash": "01b87cdd552c2d5a3cd475eb705110394fe6c8abcc1fa93291fac6f929043d20" + "hash": "54798bea6f75ab6d3c680b1085f0462df32172ad0d67321495c94bf2d59010f5" } diff --git a/backend/.sqlx/query-55cb03040bc2a8c53dd7fbb42bbdcc40f463cbc52d94ed9315cf9a547d4c89f2.json b/backend/.sqlx/query-55cb03040bc2a8c53dd7fbb42bbdcc40f463cbc52d94ed9315cf9a547d4c89f2.json index 14685a8bfa..9243288c9d 100644 --- a/backend/.sqlx/query-55cb03040bc2a8c53dd7fbb42bbdcc40f463cbc52d94ed9315cf9a547d4c89f2.json +++ b/backend/.sqlx/query-55cb03040bc2a8c53dd7fbb42bbdcc40f463cbc52d94ed9315cf9a547d4c89f2.json @@ -130,28 +130,28 @@ }, { "ordinal": 25, - "name": "ai_models", - "type_info": "VarcharArray" - }, - { - "ordinal": 26, - "name": "code_completion_model", - "type_info": "Varchar" - }, - { - "ordinal": 27, "name": "teams_command_script", "type_info": "Text" }, { - "ordinal": 28, + "ordinal": 26, "name": "teams_team_id", "type_info": "Text" }, { - "ordinal": 29, + "ordinal": 27, "name": "teams_team_name", "type_info": "Text" + }, + { + "ordinal": 28, + "name": "ai_models", + "type_info": "VarcharArray" + }, + { + "ordinal": 29, + "name": "code_completion_model", + "type_info": "Varchar" } ], "parameters": { @@ -185,10 +185,10 @@ true, true, true, + true, + true, + true, false, - true, - true, - true, true ] }, diff --git a/backend/.sqlx/query-e44ea5870a8eba1fe3d22d4dfe7734669464a56e470935ce2924723003f3f92b.json b/backend/.sqlx/query-5824982a58edd5bb2666daac49b2a6ff8553b9c196ca64ea2752df8cfe30c30c.json similarity index 87% rename from backend/.sqlx/query-e44ea5870a8eba1fe3d22d4dfe7734669464a56e470935ce2924723003f3f92b.json rename to backend/.sqlx/query-5824982a58edd5bb2666daac49b2a6ff8553b9c196ca64ea2752df8cfe30c30c.json index 2a0c89ea25..c54aa8f20d 100644 --- a/backend/.sqlx/query-e44ea5870a8eba1fe3d22d4dfe7734669464a56e470935ce2924723003f3f92b.json +++ b/backend/.sqlx/query-5824982a58edd5bb2666daac49b2a6ff8553b9c196ca64ea2752df8cfe30c30c.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT \n workspace_id, \n workspaced_route,\n path, \n route_path, \n route_path_key, \n script_path, \n is_flow, \n edited_by, \n edited_at, \n email, \n extra_perms, \n is_async, \n requires_auth, \n http_method AS \"http_method: _\", \n static_asset_config AS \"static_asset_config: _\", \n is_static_website \n FROM http_trigger\n WHERE workspace_id = $1\n ", + "query": "\n SELECT \n workspace_id, \n workspaced_route,\n path, \n route_path, \n route_path_key, \n script_path, \n is_flow, \n edited_by, \n edited_at, \n email, \n extra_perms, \n is_async, \n requires_auth, \n http_method AS \"http_method: _\", \n static_asset_config AS \"static_asset_config: _\", \n is_static_website,\n wrap_body,\n raw_string\n FROM http_trigger\n WHERE workspace_id = $1\n ", "describe": { "columns": [ { @@ -95,6 +95,16 @@ "ordinal": 15, "name": "is_static_website", "type_info": "Bool" + }, + { + "ordinal": 16, + "name": "wrap_body", + "type_info": "Bool" + }, + { + "ordinal": 17, + "name": "raw_string", + "type_info": "Bool" } ], "parameters": { @@ -118,8 +128,10 @@ false, false, true, + false, + false, false ] }, - "hash": "e44ea5870a8eba1fe3d22d4dfe7734669464a56e470935ce2924723003f3f92b" + "hash": "5824982a58edd5bb2666daac49b2a6ff8553b9c196ca64ea2752df8cfe30c30c" } diff --git a/backend/.sqlx/query-300b41622dbcdf908d9e173eee2133239d5806fc50bba2d3fe9d8a6e11627655.json b/backend/.sqlx/query-6860deb7064e57b9e7646438145dc57cc51c7ea256058daf170a1ec8573ed102.json similarity index 77% rename from backend/.sqlx/query-300b41622dbcdf908d9e173eee2133239d5806fc50bba2d3fe9d8a6e11627655.json rename to backend/.sqlx/query-6860deb7064e57b9e7646438145dc57cc51c7ea256058daf170a1ec8573ed102.json index b2c551759d..be5ab7a673 100644 --- a/backend/.sqlx/query-300b41622dbcdf908d9e173eee2133239d5806fc50bba2d3fe9d8a6e11627655.json +++ b/backend/.sqlx/query-6860deb7064e57b9e7646438145dc57cc51c7ea256058daf170a1ec8573ed102.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT \n path, \n script_path, \n is_flow, \n route_path, \n workspace_id, \n is_async, \n requires_auth, \n edited_by, \n email,\n static_asset_config AS \"static_asset_config: _\",\n workspaced_route,\n is_static_website \n FROM \n http_trigger \n WHERE \n workspace_id = $1 AND \n http_method = $2\n ", + "query": "\n SELECT \n path, \n script_path, \n is_flow, \n route_path, \n workspace_id, \n is_async, \n requires_auth, \n edited_by, \n email,\n static_asset_config AS \"static_asset_config: _\",\n wrap_body,\n raw_string,\n workspaced_route,\n is_static_website \n FROM \n http_trigger \n WHERE \n workspace_id = $1 AND \n http_method = $2\n ", "describe": { "columns": [ { @@ -55,11 +55,21 @@ }, { "ordinal": 10, - "name": "workspaced_route", + "name": "wrap_body", "type_info": "Bool" }, { "ordinal": 11, + "name": "raw_string", + "type_info": "Bool" + }, + { + "ordinal": 12, + "name": "workspaced_route", + "type_info": "Bool" + }, + { + "ordinal": 13, "name": "is_static_website", "type_info": "Bool" } @@ -95,8 +105,10 @@ false, true, false, + false, + false, false ] }, - "hash": "300b41622dbcdf908d9e173eee2133239d5806fc50bba2d3fe9d8a6e11627655" + "hash": "6860deb7064e57b9e7646438145dc57cc51c7ea256058daf170a1ec8573ed102" } diff --git a/backend/.sqlx/query-ddf2eccb78a310ed00c7d8b9c3f05d394a7cbcf0038c72a78add5c7b02ef5927.json b/backend/.sqlx/query-ddf2eccb78a310ed00c7d8b9c3f05d394a7cbcf0038c72a78add5c7b02ef5927.json index c2dfed73a2..5bfff47576 100644 --- a/backend/.sqlx/query-ddf2eccb78a310ed00c7d8b9c3f05d394a7cbcf0038c72a78add5c7b02ef5927.json +++ b/backend/.sqlx/query-ddf2eccb78a310ed00c7d8b9c3f05d394a7cbcf0038c72a78add5c7b02ef5927.json @@ -15,7 +15,7 @@ ] }, "nullable": [ - null + true ] }, "hash": "ddf2eccb78a310ed00c7d8b9c3f05d394a7cbcf0038c72a78add5c7b02ef5927" diff --git a/backend/.sqlx/query-78e6342696052d0e1f79fd721f5942d4da686a65ab11eefdca16367d2db67963.json b/backend/.sqlx/query-fd724083c4ef6ec0f1cede5813c89b3abe9d04b86ad50c0f62903a1a79479a60.json similarity index 55% rename from backend/.sqlx/query-78e6342696052d0e1f79fd721f5942d4da686a65ab11eefdca16367d2db67963.json rename to backend/.sqlx/query-fd724083c4ef6ec0f1cede5813c89b3abe9d04b86ad50c0f62903a1a79479a60.json index 19b8c3e0d7..a24ed36971 100644 --- a/backend/.sqlx/query-78e6342696052d0e1f79fd721f5942d4da686a65ab11eefdca16367d2db67963.json +++ b/backend/.sqlx/query-fd724083c4ef6ec0f1cede5813c89b3abe9d04b86ad50c0f62903a1a79479a60.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n UPDATE \n http_trigger \n SET \n route_path = $1, \n route_path_key = $2, \n workspaced_route = $3, \n script_path = $4, \n path = $5, \n is_flow = $6, \n http_method = $7, \n static_asset_config = $8, \n edited_by = $9, \n email = $10, \n is_async = $11, \n requires_auth = $12, \n edited_at = now(), \n is_static_website = $13\n WHERE \n workspace_id = $14 AND \n path = $15\n ", + "query": "\n UPDATE \n http_trigger \n SET \n route_path = $1, \n route_path_key = $2, \n workspaced_route = $3, \n wrap_body = $4,\n raw_string = $5,\n script_path = $6, \n path = $7, \n is_flow = $8, \n http_method = $9, \n static_asset_config = $10, \n edited_by = $11, \n email = $12, \n is_async = $13, \n requires_auth = $14, \n edited_at = now(), \n is_static_website = $15\n WHERE \n workspace_id = $16 AND \n path = $17\n ", "describe": { "columns": [], "parameters": { @@ -8,6 +8,8 @@ "Varchar", "Varchar", "Bool", + "Bool", + "Bool", "Varchar", "Varchar", "Bool", @@ -37,5 +39,5 @@ }, "nullable": [] }, - "hash": "78e6342696052d0e1f79fd721f5942d4da686a65ab11eefdca16367d2db67963" + "hash": "fd724083c4ef6ec0f1cede5813c89b3abe9d04b86ad50c0f62903a1a79479a60" } diff --git a/backend/.vscode/settings.json b/backend/.vscode/settings.json index ab8340f5c8..6ebd36cf07 100644 --- a/backend/.vscode/settings.json +++ b/backend/.vscode/settings.json @@ -11,5 +11,5 @@ "remote.autoForwardPorts": true, "conventionalCommits.scopes": [ "restructring triggers, decoding trigger message on work" - ], + ] } diff --git a/backend/migrations/20250311162140_add_columns_to_handle_format_response_of_http_routes.down.sql b/backend/migrations/20250311162140_add_columns_to_handle_format_response_of_http_routes.down.sql new file mode 100644 index 0000000000..8e428e5290 --- /dev/null +++ b/backend/migrations/20250311162140_add_columns_to_handle_format_response_of_http_routes.down.sql @@ -0,0 +1,4 @@ +-- Add down migration script here +ALTER TABLE http_trigger +DROP COLUMN wrap_body, +DROP COLUMN raw_string; \ No newline at end of file diff --git a/backend/migrations/20250311162140_add_columns_to_handle_format_response_of_http_routes.up.sql b/backend/migrations/20250311162140_add_columns_to_handle_format_response_of_http_routes.up.sql new file mode 100644 index 0000000000..13b1f4bd58 --- /dev/null +++ b/backend/migrations/20250311162140_add_columns_to_handle_format_response_of_http_routes.up.sql @@ -0,0 +1,4 @@ +-- Add up migration script here +ALTER TABLE http_trigger +ADD COLUMN wrap_body BOOLEAN NOT NULL DEFAULT false, +ADD COLUMN raw_string BOOLEAN NOT NULL DEFAULT false; \ No newline at end of file diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index 5a40693fc7..4716daeb12 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -13772,6 +13772,10 @@ components: type: boolean workspaced_route: type: boolean + wrap_body: + type: boolean + raw_string: + type: boolean required: - route_path @@ -13779,6 +13783,9 @@ components: - requires_auth - http_method - is_static_website + - workspaced_route + - wrap_body + - raw_string NewHttpTrigger: type: object @@ -13818,6 +13825,10 @@ components: type: boolean is_static_website: type: boolean + wrap_body: + type: boolean + raw_string: + type: boolean required: - path @@ -13867,6 +13878,10 @@ components: type: boolean is_static_website: type: boolean + wrap_body: + type: boolean + raw_string: + type: boolean required: - path - script_path diff --git a/backend/windmill-api/src/args.rs b/backend/windmill-api/src/args.rs index a482745f27..fd2ceefabe 100644 --- a/backend/windmill-api/src/args.rs +++ b/backend/windmill-api/src/args.rs @@ -23,7 +23,7 @@ use crate::db::ApiAuthed; #[cfg(feature = "parquet")] use crate::job_helpers_ee::{get_random_file_name, upload_file_internal}; -#[derive(Default)] +#[derive(Debug, Default)] pub struct WebhookArgs { pub args: PushArgsOwned, pub multipart: Option, @@ -163,6 +163,130 @@ async fn req_to_string( .map_err(|e| Error::BadRequest(format!("invalid utf8: {}", e)).into_response()) } +pub async fn try_from_request_body( + request: Request, + _state: &S, + use_raw: Option, + wrap_body: Option, +) -> Result +where + S: Send + Sync, +{ + let (content_type, mut extra, use_raw, wrap_body) = { + let headers_map = request.headers(); + let content_type_header = headers_map.get(CONTENT_TYPE); + let content_type = content_type_header.and_then(|value| value.to_str().ok()); + let uri = request.uri(); + let query = Query::::try_from_uri(uri).unwrap().0; + let mut extra = build_extra(&headers_map, query.include_header); + let query_decode = DecodeQueries::from_uri(uri); + if let Some(DecodeQueries(queries)) = query_decode { + extra.extend(queries); + } + let raw = query.raw.unwrap_or(use_raw.unwrap_or(false)); + let wrap_body = query.wrap_body.unwrap_or(wrap_body.unwrap_or(false)); + (content_type, extra, raw, wrap_body) + }; + + let no_content_type = content_type.is_none(); + if no_content_type || content_type.unwrap().starts_with("application/json") { + let bytes = Bytes::from_request(request, _state) + .await + .map_err(IntoResponse::into_response)?; + if no_content_type && bytes.is_empty() { + if use_raw { + extra.insert("raw_string".to_string(), to_raw_value(&"".to_string())); + } + let mut args = HashMap::new(); + if wrap_body { + args.insert("body".to_string(), to_raw_value(&serde_json::json!({}))); + } + return Ok(WebhookArgs { + args: PushArgsOwned { extra: Some(extra), args: args }, + ..Default::default() + }); + } + let str = String::from_utf8(bytes.to_vec()) + .map_err(|e| Error::BadRequest(format!("invalid utf8: {}", e)).into_response())?; + + PushArgsOwned::from_json(extra, use_raw, wrap_body, str) + .await + .map(|args| WebhookArgs { args, ..Default::default() }) + } else if content_type + .unwrap() + .starts_with("application/cloudevents+json") + { + let str = req_to_string(request, _state).await?; + + PushArgsOwned::from_ce_json(extra, use_raw, str) + .await + .map(|args| WebhookArgs { args, ..Default::default() }) + } else if content_type + .unwrap() + .starts_with("application/cloudevents-batch+json") + { + Err( + Error::BadRequest(format!("Cloud events batching is not supported yet")) + .into_response(), + ) + } else if content_type.unwrap().starts_with("text/plain") { + let str = req_to_string(request, _state).await?; + extra.insert("raw_string".to_string(), to_raw_value(&str)); + Ok(WebhookArgs { + args: PushArgsOwned { extra: Some(extra), args: HashMap::new() }, + ..Default::default() + }) + } else if content_type + .unwrap() + .starts_with("application/x-www-form-urlencoded") + { + let bytes = Bytes::from_request(request, _state) + .await + .map_err(IntoResponse::into_response)?; + + if use_raw { + let raw_string = String::from_utf8(bytes.to_vec()) + .map_err(|e| Error::BadRequest(format!("invalid utf8: {}", e)).into_response())?; + extra.insert("raw_string".to_string(), to_raw_value(&raw_string)); + } + + let payload: HashMap> = serde_urlencoded::from_bytes(&bytes) + .map_err(|e| { + Error::BadRequest(format!("invalid urlencoded data: {}", e)).into_response() + })?; + let payload = payload + .into_iter() + .map(|(k, v)| (k, to_raw_value(&v))) + .collect::>(); + + return Ok(WebhookArgs { + args: PushArgsOwned { extra: Some(extra), args: payload }, + ..Default::default() + }); + } else if content_type.unwrap().starts_with("application/xml") + || content_type.unwrap().starts_with("text/xml") + { + let str = req_to_string(request, _state).await?; + extra.insert("raw_string".to_string(), to_raw_value(&str)); + Ok(WebhookArgs { + args: PushArgsOwned { extra: Some(extra), args: HashMap::new() }, + ..Default::default() + }) + } else if content_type.unwrap().starts_with("multipart/form-data") { + let multipart = Multipart::from_request(request, _state) + .await + .map_err(IntoResponse::into_response)?; + + Ok(WebhookArgs { + args: PushArgsOwned { extra: Some(extra), args: HashMap::new() }, + multipart: Some(multipart), + wrap_body: Some(wrap_body), + }) + } else { + Err(StatusCode::UNSUPPORTED_MEDIA_TYPE.into_response()) + } +} + #[axum::async_trait] impl FromRequest for WebhookArgs where @@ -170,124 +294,10 @@ where { type Rejection = Response; - async fn from_request( - req: Request, - _state: &S, - ) -> Result { - let (content_type, mut extra, use_raw, wrap_body) = { - let headers_map = req.headers(); - let content_type_header = headers_map.get(CONTENT_TYPE); - let content_type = content_type_header.and_then(|value| value.to_str().ok()); - let uri = req.uri(); - let query = Query::::try_from_uri(uri).unwrap().0; - let mut extra = build_extra(&headers_map, query.include_header); - let query_decode = DecodeQueries::from_uri(uri); - if let Some(DecodeQueries(queries)) = query_decode { - extra.extend(queries); - } - let raw = query.raw.as_ref().is_some_and(|x| *x); - let wrap_body = query.wrap_body.as_ref().is_some_and(|x| *x); - (content_type, extra, raw, wrap_body) - }; + async fn from_request(request: Request, _state: &S) -> Result { + let args = try_from_request_body(request, _state, None, None).await?; - let no_content_type = content_type.is_none(); - if no_content_type || content_type.unwrap().starts_with("application/json") { - let bytes = Bytes::from_request(req, _state) - .await - .map_err(IntoResponse::into_response)?; - if no_content_type && bytes.is_empty() { - if use_raw { - extra.insert("raw_string".to_string(), to_raw_value(&"".to_string())); - } - let mut args = HashMap::new(); - if wrap_body { - args.insert("body".to_string(), to_raw_value(&serde_json::json!({}))); - } - return Ok(Self { - args: PushArgsOwned { extra: Some(extra), args: args }, - ..Default::default() - }); - } - let str = String::from_utf8(bytes.to_vec()) - .map_err(|e| Error::BadRequest(format!("invalid utf8: {}", e)).into_response())?; - - PushArgsOwned::from_json(extra, use_raw, wrap_body, str) - .await - .map(|args| Self { args, ..Default::default() }) - } else if content_type - .unwrap() - .starts_with("application/cloudevents+json") - { - let str = req_to_string(req, _state).await?; - - PushArgsOwned::from_ce_json(extra, use_raw, str) - .await - .map(|args| Self { args, ..Default::default() }) - } else if content_type - .unwrap() - .starts_with("application/cloudevents-batch+json") - { - Err( - Error::BadRequest(format!("Cloud events batching is not supported yet")) - .into_response(), - ) - } else if content_type.unwrap().starts_with("text/plain") { - let str = req_to_string(req, _state).await?; - extra.insert("raw_string".to_string(), to_raw_value(&str)); - Ok(Self { - args: PushArgsOwned { extra: Some(extra), args: HashMap::new() }, - ..Default::default() - }) - } else if content_type - .unwrap() - .starts_with("application/x-www-form-urlencoded") - { - let bytes = Bytes::from_request(req, _state) - .await - .map_err(IntoResponse::into_response)?; - - if use_raw { - let raw_string = String::from_utf8(bytes.to_vec()).map_err(|e| { - Error::BadRequest(format!("invalid utf8: {}", e)).into_response() - })?; - extra.insert("raw_string".to_string(), to_raw_value(&raw_string)); - } - - let payload: HashMap> = serde_urlencoded::from_bytes(&bytes) - .map_err(|e| { - Error::BadRequest(format!("invalid urlencoded data: {}", e)).into_response() - })?; - let payload = payload - .into_iter() - .map(|(k, v)| (k, to_raw_value(&v))) - .collect::>(); - - return Ok(Self { - args: PushArgsOwned { extra: Some(extra), args: payload }, - ..Default::default() - }); - } else if content_type.unwrap().starts_with("application/xml") - || content_type.unwrap().starts_with("text/xml") - { - let str = req_to_string(req, _state).await?; - extra.insert("raw_string".to_string(), to_raw_value(&str)); - Ok(Self { - args: PushArgsOwned { extra: Some(extra), args: HashMap::new() }, - ..Default::default() - }) - } else if content_type.unwrap().starts_with("multipart/form-data") { - let multipart = Multipart::from_request(req, _state) - .await - .map_err(IntoResponse::into_response)?; - - Ok(Self { - args: PushArgsOwned { extra: Some(extra), args: HashMap::new() }, - multipart: Some(multipart), - wrap_body: Some(wrap_body), - }) - } else { - Err(StatusCode::UNSUPPORTED_MEDIA_TYPE.into_response()) - } + Ok(args) } } diff --git a/backend/windmill-api/src/http_triggers.rs b/backend/windmill-api/src/http_triggers.rs index 9f7cb25425..9432fb0e7e 100644 --- a/backend/windmill-api/src/http_triggers.rs +++ b/backend/windmill-api/src/http_triggers.rs @@ -1,7 +1,7 @@ #[cfg(feature = "parquet")] use crate::job_helpers_ee::get_workspace_s3_resource; use crate::{ - args::WebhookArgs, + args::try_from_request_body, auth::{AuthCache, OptTokened}, db::{ApiAuthed, DB}, jobs::{ @@ -11,7 +11,7 @@ use crate::{ users::fetch_api_authed, }; use axum::{ - extract::{Path, Query}, + extract::{Path, Query, Request}, response::IntoResponse, routing::{delete, get, post}, Extension, Json, Router, @@ -22,6 +22,7 @@ use http::{HeaderMap, StatusCode}; use serde::{Deserialize, Serialize}; use sql_builder::{bind::Bind, SqlBuilder}; use sqlx::prelude::FromRow; +use std::borrow::Cow; use std::{collections::HashMap, sync::Arc}; use tower_http::cors::CorsLayer; use windmill_audit::{audit_ee::audit_log, ActionKind}; @@ -34,7 +35,6 @@ use windmill_common::{ utils::{not_found_if_none, paginate, require_admin, Pagination, StripPath}, worker::{to_raw_value, CLOUD_HOSTED}, }; -use std::borrow::Cow; lazy_static::lazy_static! { static ref ROUTE_PATH_KEY_RE: regex::Regex = regex::Regex::new(r"/?:[-\w]+").unwrap(); @@ -113,6 +113,8 @@ struct NewTrigger { static_asset_config: Option>, workspaced_route: Option, is_static_website: bool, + wrap_body: Option, + raw_string: Option, } #[derive(FromRow, Serialize)] @@ -133,7 +135,9 @@ pub struct HttpTrigger { #[serde(skip_serializing_if = "Option::is_none")] pub static_asset_config: Option>, pub is_static_website: bool, - pub workspaced_route: Option, + pub workspaced_route: bool, + pub wrap_body: bool, + pub raw_string: bool, } #[derive(Deserialize)] @@ -148,6 +152,8 @@ struct EditTrigger { static_asset_config: Option>, workspaced_route: Option, is_static_website: bool, + wrap_body: Option, + raw_string: Option, } #[derive(Deserialize)] @@ -174,6 +180,8 @@ async fn list_triggers( "route_path", "route_path_key", "workspaced_route", + "wrap_body", + "raw_string", "script_path", "is_flow", "http_method", @@ -237,7 +245,9 @@ async fn get_trigger( is_async, requires_auth, static_asset_config as "static_asset_config: _", - is_static_website + is_static_website, + wrap_body, + raw_string FROM http_trigger WHERE @@ -303,6 +313,8 @@ async fn create_trigger( route_path, route_path_key, workspaced_route, + wrap_body, + raw_string, script_path, is_flow, is_async, @@ -315,14 +327,16 @@ async fn create_trigger( is_static_website ) VALUES ( - $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, now(), $14 + $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, now(), $16 ) "#, w_id, ct.path, ct.route_path, &route_path_key, - ct.workspaced_route, + ct.workspaced_route.unwrap_or(false), + ct.wrap_body.unwrap_or(false), + ct.raw_string.unwrap_or(false), ct.script_path, ct.is_flow, ct.is_async, @@ -404,24 +418,28 @@ async fn update_trigger( route_path = $1, route_path_key = $2, workspaced_route = $3, - script_path = $4, - path = $5, - is_flow = $6, - http_method = $7, - static_asset_config = $8, - edited_by = $9, - email = $10, - is_async = $11, - requires_auth = $12, + wrap_body = $4, + raw_string = $5, + script_path = $6, + path = $7, + is_flow = $8, + http_method = $9, + static_asset_config = $10, + edited_by = $11, + email = $12, + is_async = $13, + requires_auth = $14, edited_at = now(), - is_static_website = $13 + is_static_website = $15 WHERE - workspace_id = $14 AND - path = $15 + workspace_id = $16 AND + path = $17 "#, route_path, &route_path_key, ct.workspaced_route, + ct.wrap_body, + ct.raw_string, ct.script_path, ct.path, ct.is_flow, @@ -606,7 +624,7 @@ async fn route_path_key_exists( ) .fetch_one(db) .await? - .unwrap_or(false) + .unwrap_or(false) }; Ok(exists) @@ -645,8 +663,10 @@ struct TriggerRoute { edited_by: String, email: String, static_asset_config: Option>, - workspaced_route: Option, is_static_website: bool, + workspaced_route: bool, + wrap_body: bool, + raw_string: bool, } async fn get_http_route_trigger( @@ -678,6 +698,8 @@ async fn get_http_route_trigger( edited_by, email, static_asset_config AS "static_asset_config: _", + wrap_body, + raw_string, workspaced_route, is_static_website FROM @@ -707,6 +729,8 @@ async fn get_http_route_trigger( edited_by, email, static_asset_config AS "static_asset_config: _", + wrap_body, + raw_string, workspaced_route, is_static_website FROM @@ -725,7 +749,7 @@ async fn get_http_route_trigger( for (idx, trigger) in triggers.iter().enumerate() { let route_path = match trigger.workspaced_route { - Some(true) => format!("{}/{}", &trigger.workspace_id, &trigger.route_path), + true => format!("{}/{}", &trigger.workspace_id, &trigger.route_path), _ => trigger.route_path.clone(), }; if trigger.is_static_website { @@ -853,7 +877,7 @@ async fn route_job( Query(query): Query>, method: http::Method, headers: HeaderMap, - args: WebhookArgs, + request: Request, ) -> impl IntoResponse { let route_path = route_path.to_path().trim_end_matches("/"); let (trigger, called_path, params, authed) = match get_http_route_trigger( @@ -870,11 +894,22 @@ async fn route_job( Err(e) => return e.into_response(), }; - let mut args = match args - .to_push_args_owned(&authed, &db, &trigger.workspace_id) - .await - { - Ok(args) => args, + let result = try_from_request_body( + request, + &db, + Some(trigger.raw_string), + Some(trigger.wrap_body), + ) + .await; + + let mut args = match result { + Ok(args) => match args + .to_push_args_owned(&authed, &db, &trigger.workspace_id) + .await + { + Ok(args) => args, + Err(e) => return e.into_response(), + }, Err(e) => return e.into_response(), }; @@ -990,6 +1025,7 @@ async fn route_job( } let extra = args.extra.get_or_insert_with(HashMap::new); + extra.insert( "wm_trigger".to_string(), build_http_trigger_extra( diff --git a/backend/windmill-api/src/lib.rs b/backend/windmill-api/src/lib.rs index 10a1189db9..86a42aa8ba 100644 --- a/backend/windmill-api/src/lib.rs +++ b/backend/windmill-api/src/lib.rs @@ -58,7 +58,7 @@ use windmill_common::error::AppError; mod ai; mod apps; -mod args; +pub mod args; mod audit; mod auth; mod capture; diff --git a/backend/windmill-api/src/workspaces_export.rs b/backend/windmill-api/src/workspaces_export.rs index 9cb02fc567..449b5e3256 100644 --- a/backend/windmill-api/src/workspaces_export.rs +++ b/backend/windmill-api/src/workspaces_export.rs @@ -554,7 +554,9 @@ pub(crate) async fn tarball_workspace( requires_auth, http_method AS "http_method: _", static_asset_config AS "static_asset_config: _", - is_static_website + is_static_website, + wrap_body, + raw_string FROM http_trigger WHERE workspace_id = $1 "#, diff --git a/frontend/src/lib/components/ArgInput.svelte b/frontend/src/lib/components/ArgInput.svelte index dbce58f111..8bf6c53f1a 100644 --- a/frontend/src/lib/components/ArgInput.svelte +++ b/frontend/src/lib/components/ArgInput.svelte @@ -796,7 +796,7 @@ on:selected={({ detail }) => { oneOfSelected = detail const prevValueKeys = Object.keys( - oneOf.find((o) => o.title == detail)?.properties ?? {} + oneOf?.find((o) => o.title == detail)?.properties ?? {} ) const toKeep = {} for (const key of prevValueKeys) { diff --git a/frontend/src/lib/components/triggers/http/RouteEditorConfigSection.svelte b/frontend/src/lib/components/triggers/http/RouteEditorConfigSection.svelte index 4e386d5b55..2a5c42df4a 100644 --- a/frontend/src/lib/components/triggers/http/RouteEditorConfigSection.svelte +++ b/frontend/src/lib/components/triggers/http/RouteEditorConfigSection.svelte @@ -22,8 +22,8 @@ export let initialTriggerPath: string | undefined = undefined export let dirtyRoutePath: boolean = false - export let route_path: string = '' - export let http_method: 'get' | 'post' | 'put' | 'patch' | 'delete' = 'post' + export let route_path: string | undefined + export let http_method: 'get' | 'post' | 'put' | 'patch' | 'delete' | undefined export let can_write: boolean = false export let static_asset_config: { s3: string; storage?: string; filename?: string } | undefined = undefined @@ -56,7 +56,11 @@ validateTimeout = undefined }, 500) } - async function routeExists(route_path: string, method: Exclude, workspaced_route: boolean) { + async function routeExists( + route_path: string, + method: Exclude, + workspaced_route: boolean + ) { return await HttpTriggerService.existsRoute({ workspace: $workspaceStore!, requestBody: { @@ -73,6 +77,9 @@ $: isValid = routeError === '' $: fullRoute = getHttpRoute(route_path, workspaced_route, $workspaceStore ?? '') + + $: !http_method && (http_method = 'post') + $: route_path === undefined && (route_path = '')
@@ -185,7 +192,7 @@ { + on:change={() => { workspaced_route = !workspaced_route dirtyRoutePath = true }} diff --git a/frontend/src/lib/components/triggers/http/RouteEditorInner.svelte b/frontend/src/lib/components/triggers/http/RouteEditorInner.svelte index 918e6678fc..e32991a29a 100644 --- a/frontend/src/lib/components/triggers/http/RouteEditorInner.svelte +++ b/frontend/src/lib/components/triggers/http/RouteEditorInner.svelte @@ -23,6 +23,7 @@ import RouteEditorConfigSection from './RouteEditorConfigSection.svelte' import SimpleEditor from '$lib/components/SimpleEditor.svelte' import { isCloudHosted } from '$lib/cloud' + import Tooltip from '$lib/components/Tooltip.svelte' let is_flow: boolean = false let initialPath = '' let edit = true @@ -50,7 +51,8 @@ let s3FileUploadRawMode = false let s3Editor: SimpleEditor | undefined = undefined let workspaced_route: boolean = false - + let raw_string = false + let wrap_body = false let drawerLoading = true export async function openEdit(ePath: string, isFlow: boolean) { drawerLoading = true @@ -108,6 +110,7 @@ workspace: $workspaceStore!, path: initialPath }) + script_path = s.script_path initialScriptPath = s.script_path is_flow = s.is_flow @@ -116,7 +119,10 @@ http_method = s.http_method ?? 'post' is_async = s.is_async requires_auth = s.requires_auth - workspaced_route = s.workspaced_route ?? false + workspaced_route = s.workspaced_route + wrap_body = s.wrap_body + raw_string = s.raw_string + if (!isCloudHosted()) { static_asset_config = s.static_asset_config s3FileUploadRawMode = !!static_asset_config @@ -141,7 +147,9 @@ http_method, static_asset_config, is_static_website, - workspaced_route + workspaced_route, + wrap_body, + raw_string } }) sendUserToast(`Route ${path} updated`) @@ -158,7 +166,9 @@ http_method, static_asset_config, is_static_website, - workspaced_route + workspaced_route, + wrap_body, + raw_string } }) sendUserToast(`Route ${path} created`) @@ -433,6 +443,38 @@ + +
{/if} diff --git a/frontend/src/lib/components/triggers/http/utils.ts b/frontend/src/lib/components/triggers/http/utils.ts index bf0a244c0e..fbcaa55114 100644 --- a/frontend/src/lib/components/triggers/http/utils.ts +++ b/frontend/src/lib/components/triggers/http/utils.ts @@ -1,8 +1,8 @@ import { base } from "$lib/base"; import { isCloudHosted } from "$lib/cloud"; -export function getHttpRoute(route_path: string, workspaced_route: boolean, workspace_id: string) { +export function getHttpRoute(route_path: string | undefined, workspaced_route: boolean, workspace_id: string) { return `${location.origin}${base}/api/r/${ isCloudHosted() || workspaced_route ? workspace_id + '/' : '' - }${route_path}` + }${route_path ?? ''}` } \ No newline at end of file From 09a2791e2edf0b7f2ee7217fe22e8efbab8adc16 Mon Sep 17 00:00:00 2001 From: HugoCasa Date: Fri, 14 Mar 2025 09:42:23 +0100 Subject: [PATCH 037/739] chore: update powershell to 7.5.0 (#5480) --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 43b750d957..2b323ba243 100644 --- a/Dockerfile +++ b/Dockerfile @@ -83,8 +83,8 @@ RUN --mount=type=cache,target=/usr/local/cargo/registry \ FROM ${DEBIAN_IMAGE} ARG TARGETPLATFORM -ARG POWERSHELL_VERSION=7.3.5 -ARG POWERSHELL_DEB_VERSION=7.3.5-1 +ARG POWERSHELL_VERSION=7.5.0 +ARG POWERSHELL_DEB_VERSION=7.5.0-1 ARG KUBECTL_VERSION=1.28.7 ARG HELM_VERSION=3.14.3 ARG GO_VERSION=1.22.5 From 8e95bc397284607188f861f27288bcc0ab368023 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Fri, 14 Mar 2025 11:58:03 +0100 Subject: [PATCH 038/739] fix: avoid lock contention for native workers on cached connection (#5481) --- backend/windmill-worker/src/pg_executor.rs | 144 +++++++++++++-------- 1 file changed, 92 insertions(+), 52 deletions(-) diff --git a/backend/windmill-worker/src/pg_executor.rs b/backend/windmill-worker/src/pg_executor.rs index 2ad6eb4038..5a61121a1e 100644 --- a/backend/windmill-worker/src/pg_executor.rs +++ b/backend/windmill-worker/src/pg_executor.rs @@ -1,6 +1,6 @@ use std::collections::HashMap; use std::net::IpAddr; -use std::sync::atomic::{AtomicBool, AtomicU64, AtomicUsize, Ordering}; +use std::sync::atomic::{AtomicU64, AtomicUsize, Ordering}; use std::sync::Arc; use std::time::Duration; @@ -17,7 +17,7 @@ use serde::Deserialize; use serde_json::value::RawValue; use serde_json::Map; use serde_json::Value; -use tokio::sync::Mutex; +use tokio::sync::{Mutex, RwLock}; use tokio_postgres::Client; use tokio_postgres::{types::ToSql, NoTls, Row}; use tokio_postgres::{ @@ -55,8 +55,9 @@ struct PgDatabase { lazy_static! { pub static ref CONNECTION_CACHE: Arc>> = Arc::new(Mutex::new(None)); + pub static ref CONNECTION_COUNTER: Arc>> = + Arc::new(RwLock::new(HashMap::new())); pub static ref LAST_QUERY: AtomicU64 = AtomicU64::new(0); - pub static ref RUNNING: AtomicBool = AtomicBool::new(false); } fn do_postgresql_inner<'a>( @@ -211,14 +212,10 @@ pub async fn do_postgresql( ); let database_string_clone = database_string.clone(); - RUNNING.store(true, std::sync::atomic::Ordering::Relaxed); - LAST_QUERY.store( - chrono::Utc::now().timestamp().try_into().unwrap_or(0), - std::sync::atomic::Ordering::Relaxed, - ); let mtex; if !*CLOUD_HOSTED { - mtex = Some(CONNECTION_CACHE.lock().await); + mtex = CONNECTION_CACHE.try_lock().ok(); + increment_connection_counter(&database_string).await; } else { mtex = None; } @@ -226,9 +223,15 @@ pub async fn do_postgresql( let has_cached_con = mtex .as_ref() .is_some_and(|x| x.as_ref().is_some_and(|y| y.0 == database_string)); - let new_client = if has_cached_con { + + // tracing::error!("HAS CACHED CON: {}", has_cached_con); + let (new_client, mtex) = if has_cached_con { tracing::info!("Using cached connection"); - None + LAST_QUERY.store( + chrono::Utc::now().timestamp().try_into().unwrap_or(0), + std::sync::atomic::Ordering::Relaxed, + ); + (None, mtex) } else if sslmode == "require" { tracing::info!("Creating new connection"); let mut connector = TlsConnector::builder(); @@ -266,7 +269,7 @@ pub async fn do_postgresql( tracing::error!("connection error: {}", e); } }); - Some((client, handle)) + (Some((client, handle)), None) } else { tracing::info!("Creating new connection"); let (client, connection) = tokio::time::timeout( @@ -284,7 +287,7 @@ pub async fn do_postgresql( tracing::error!("connection error: {}", e); } }); - Some((client, handle)) + (Some((client, handle)), None) }; let queries = parse_sql_blocks(query); @@ -359,53 +362,77 @@ pub async fn do_postgresql( ) .await?; + // drop the mtex to avoid holding the lock for too long, result has been returned + drop(mtex); + *mem_peak = size.load(Ordering::Relaxed) as i32; - RUNNING.store(false, std::sync::atomic::Ordering::Relaxed); - if let Some(handle) = handle { - if let Some(mut mtex) = mtex { - let abort_handler = handle.abort_handle(); + if !*CLOUD_HOSTED { + // tracing::error!("Found handle"); + if let Ok(mut mtex) = CONNECTION_CACHE.try_lock() { + if mtex.as_ref().is_none_or(|x| x.0 != database_string) { + // tracing::error!("Locked conn cached"); + let abort_handler = handle.abort_handle(); - if let Some(new_client) = new_client { - *mtex = Some((database_string, new_client.0)); - } - drop(mtex); - LAST_QUERY.store( - chrono::Utc::now().timestamp().try_into().unwrap_or(0), - std::sync::atomic::Ordering::Relaxed, - ); - - tokio::spawn(async move { - loop { - tokio::time::sleep(Duration::from_secs(5)).await; - let last_query = LAST_QUERY.load(std::sync::atomic::Ordering::Relaxed); - let now = chrono::Utc::now().timestamp().try_into().unwrap_or(0); - - //we cache connection for 5 minutes at most - if last_query + 60 * 5 < now - && !RUNNING.load(std::sync::atomic::Ordering::Relaxed) - { - tracing::info!("Closing cache connection due to inactivity"); - break; - } - let mtex = CONNECTION_CACHE.lock().await; - if mtex.is_none() { - // connection is not in the mutex anymore - break; - } else if let Some(mtex) = mtex.as_ref() { - if mtex.0.as_str() != &database_string_clone { - // connection is not the latest one - break; + let mut cache_new_con = false; + if let Some(new_client) = new_client { + cache_new_con = is_most_used_conn(&database_string).await; + if cache_new_con { + *mtex = Some((database_string, new_client.0)); + } else { + new_client.1.abort(); } + } else { + handle.abort(); } - tracing::debug!("Keeping cached connection alive due to activity") + LAST_QUERY.store( + chrono::Utc::now().timestamp().try_into().unwrap_or(0), + std::sync::atomic::Ordering::Relaxed, + ); + if cache_new_con { + tokio::spawn(async move { + loop { + tokio::time::sleep(Duration::from_secs(5)).await; + let last_query = + LAST_QUERY.load(std::sync::atomic::Ordering::Relaxed); + let now = chrono::Utc::now().timestamp().try_into().unwrap_or(0); + + //we cache connection for 5 minutes at most + if last_query + 60 * 1 < now { + // tracing::error!("Closing cache connection due to inactivity"); + tracing::info!( + "Closing cache pg executor connection due to inactivity" + ); + break; + } + let mtex = CONNECTION_CACHE.lock().await; + if mtex.is_none() { + // connection is not in the mutex anymore + break; + } else if let Some(mtex) = mtex.as_ref() { + if mtex.0.as_str() != &database_string_clone { + // connection is not the latest one + break; + } + } + + tracing::debug!( + "Keeping cached pg executor connection alive due to activity" + ) + } + let mut mtex = CONNECTION_CACHE.lock().await; + *mtex = None; + abort_handler.abort(); + }); + } + } else { + handle.abort(); } - let mut mtex = CONNECTION_CACHE.lock().await; - *mtex = None; - abort_handler.abort(); - }); + } else { + handle.abort(); + } } else { handle.abort(); } @@ -416,6 +443,18 @@ pub async fn do_postgresql( return Ok(raw_result); } +async fn is_most_used_conn(database_string: &str) -> bool { + let counter_map = CONNECTION_COUNTER.read().await; + let current_count = counter_map.get(database_string).copied().unwrap_or(0); + let max_count = counter_map.values().copied().max().unwrap_or(0); + current_count >= max_count +} + +async fn increment_connection_counter(database_string: &str) { + let mut counter_map = CONNECTION_COUNTER.write().await; + *counter_map.entry(database_string.to_string()).or_insert(0) += 1; +} + fn map_as_single_type( vec: Option<&Vec>, f: impl Fn(&Value) -> Option, @@ -766,6 +805,7 @@ pub fn pg_cell_to_json_value( Type::BYTEA_ARRAY => get_array(row, column, column_i, |a: Vec| { Ok(JSONValue::String(format!("\\x{}", hex::encode(a)))) })?, + Type::VOID => JSONValue::Null, _ => get_basic(row, column, column_i, |a: String| Ok(JSONValue::String(a)))?, }) } From eb2ffee4ec6ae39a7759c176b5a02c4aa537adcf Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Fri, 14 Mar 2025 12:13:12 +0100 Subject: [PATCH 039/739] pg nits --- backend/windmill-worker/src/pg_executor.rs | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/backend/windmill-worker/src/pg_executor.rs b/backend/windmill-worker/src/pg_executor.rs index 5a61121a1e..40d1103af0 100644 --- a/backend/windmill-worker/src/pg_executor.rs +++ b/backend/windmill-worker/src/pg_executor.rs @@ -387,11 +387,11 @@ pub async fn do_postgresql( handle.abort(); } - LAST_QUERY.store( - chrono::Utc::now().timestamp().try_into().unwrap_or(0), - std::sync::atomic::Ordering::Relaxed, - ); if cache_new_con { + LAST_QUERY.store( + chrono::Utc::now().timestamp().try_into().unwrap_or(0), + std::sync::atomic::Ordering::Relaxed, + ); tokio::spawn(async move { loop { tokio::time::sleep(Duration::from_secs(5)).await; @@ -437,10 +437,9 @@ pub async fn do_postgresql( handle.abort(); } } - let raw_result = to_raw_value(&result); - *mem_peak = (raw_result.get().len() / 1000) as i32; + *mem_peak = (result.get().len() / 1000) as i32; // And then check that we got back the same string we sent over. - return Ok(raw_result); + return Ok(result); } async fn is_most_used_conn(database_string: &str) -> bool { From 8b52b8fe65bcf104f0d0ff3d65cb8f44ebaf0949 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Fri, 14 Mar 2025 12:44:52 +0100 Subject: [PATCH 040/739] update es6.d.ts with es2015 --- frontend/src/lib/es6.d.ts.txt | 581 ++++++++++++++++++++++++++++++++++ 1 file changed, 581 insertions(+) diff --git a/frontend/src/lib/es6.d.ts.txt b/frontend/src/lib/es6.d.ts.txt index f7aecb5eea..22e4f4fa87 100644 --- a/frontend/src/lib/es6.d.ts.txt +++ b/frontend/src/lib/es6.d.ts.txt @@ -9737,3 +9737,584 @@ interface Float32ArrayConstructor { interface Float64ArrayConstructor { new (): Float64Array; } + + +interface Array { + /** + * Returns the value of the first element in the array where predicate is true, and undefined + * otherwise. + * @param predicate find calls predicate once for each element of the array, in ascending + * order, until it finds one where predicate returns true. If such an element is found, find + * immediately returns that element value. Otherwise, find returns undefined. + * @param thisArg If provided, it will be used as the this value for each invocation of + * predicate. If it is not provided, undefined is used instead. + */ + find(predicate: (value: T, index: number, obj: T[]) => value is S, thisArg?: any): S | undefined; + find(predicate: (value: T, index: number, obj: T[]) => unknown, thisArg?: any): T | undefined; + + /** + * Returns the index of the first element in the array where predicate is true, and -1 + * otherwise. + * @param predicate find calls predicate once for each element of the array, in ascending + * order, until it finds one where predicate returns true. If such an element is found, + * findIndex immediately returns that element index. Otherwise, findIndex returns -1. + * @param thisArg If provided, it will be used as the this value for each invocation of + * predicate. If it is not provided, undefined is used instead. + */ + findIndex(predicate: (value: T, index: number, obj: T[]) => unknown, thisArg?: any): number; + + /** + * Changes all array elements from `start` to `end` index to a static `value` and returns the modified array + * @param value value to fill array section with + * @param start index to start filling the array at. If start is negative, it is treated as + * length+start where length is the length of the array. + * @param end index to stop filling the array at. If end is negative, it is treated as + * length+end. + */ + fill(value: T, start?: number, end?: number): this; + + /** + * Returns the this object after copying a section of the array identified by start and end + * to the same array starting at position target + * @param target If target is negative, it is treated as length+target where length is the + * length of the array. + * @param start If start is negative, it is treated as length+start. If end is negative, it + * is treated as length+end. + * @param end If not specified, length of the this object is used as its default value. + */ + copyWithin(target: number, start: number, end?: number): this; + + toLocaleString(locales: string | string[], options?: Intl.NumberFormatOptions & Intl.DateTimeFormatOptions): string; +} + +interface ArrayConstructor { + /** + * Creates an array from an array-like object. + * @param arrayLike An array-like object to convert to an array. + */ + from(arrayLike: ArrayLike): T[]; + + /** + * Creates an array from an iterable object. + * @param arrayLike An array-like object to convert to an array. + * @param mapfn A mapping function to call on every element of the array. + * @param thisArg Value of 'this' used to invoke the mapfn. + */ + from(arrayLike: ArrayLike, mapfn: (v: T, k: number) => U, thisArg?: any): U[]; + + /** + * Returns a new array from a set of elements. + * @param items A set of elements to include in the new array object. + */ + of(...items: T[]): T[]; +} + +interface DateConstructor { + new (value: number | string | Date): Date; +} + +interface Function { + /** + * Returns the name of the function. Function names are read-only and can not be changed. + */ + readonly name: string; +} + +interface Math { + /** + * Returns the number of leading zero bits in the 32-bit binary representation of a number. + * @param x A numeric expression. + */ + clz32(x: number): number; + + /** + * Returns the result of 32-bit multiplication of two numbers. + * @param x First number + * @param y Second number + */ + imul(x: number, y: number): number; + + /** + * Returns the sign of the x, indicating whether x is positive, negative or zero. + * @param x The numeric expression to test + */ + sign(x: number): number; + + /** + * Returns the base 10 logarithm of a number. + * @param x A numeric expression. + */ + log10(x: number): number; + + /** + * Returns the base 2 logarithm of a number. + * @param x A numeric expression. + */ + log2(x: number): number; + + /** + * Returns the natural logarithm of 1 + x. + * @param x A numeric expression. + */ + log1p(x: number): number; + + /** + * Returns the result of (e^x - 1), which is an implementation-dependent approximation to + * subtracting 1 from the exponential function of x (e raised to the power of x, where e + * is the base of the natural logarithms). + * @param x A numeric expression. + */ + expm1(x: number): number; + + /** + * Returns the hyperbolic cosine of a number. + * @param x A numeric expression that contains an angle measured in radians. + */ + cosh(x: number): number; + + /** + * Returns the hyperbolic sine of a number. + * @param x A numeric expression that contains an angle measured in radians. + */ + sinh(x: number): number; + + /** + * Returns the hyperbolic tangent of a number. + * @param x A numeric expression that contains an angle measured in radians. + */ + tanh(x: number): number; + + /** + * Returns the inverse hyperbolic cosine of a number. + * @param x A numeric expression that contains an angle measured in radians. + */ + acosh(x: number): number; + + /** + * Returns the inverse hyperbolic sine of a number. + * @param x A numeric expression that contains an angle measured in radians. + */ + asinh(x: number): number; + + /** + * Returns the inverse hyperbolic tangent of a number. + * @param x A numeric expression that contains an angle measured in radians. + */ + atanh(x: number): number; + + /** + * Returns the square root of the sum of squares of its arguments. + * @param values Values to compute the square root for. + * If no arguments are passed, the result is +0. + * If there is only one argument, the result is the absolute value. + * If any argument is +Infinity or -Infinity, the result is +Infinity. + * If any argument is NaN, the result is NaN. + * If all arguments are either +0 or −0, the result is +0. + */ + hypot(...values: number[]): number; + + /** + * Returns the integral part of the a numeric expression, x, removing any fractional digits. + * If x is already an integer, the result is x. + * @param x A numeric expression. + */ + trunc(x: number): number; + + /** + * Returns the nearest single precision float representation of a number. + * @param x A numeric expression. + */ + fround(x: number): number; + + /** + * Returns an implementation-dependent approximation to the cube root of number. + * @param x A numeric expression. + */ + cbrt(x: number): number; +} + +interface NumberConstructor { + /** + * The value of Number.EPSILON is the difference between 1 and the smallest value greater than 1 + * that is representable as a Number value, which is approximately: + * 2.2204460492503130808472633361816 x 10‍−‍16. + */ + readonly EPSILON: number; + + /** + * Returns true if passed value is finite. + * Unlike the global isFinite, Number.isFinite doesn't forcibly convert the parameter to a + * number. Only finite values of the type number, result in true. + * @param number A numeric value. + */ + isFinite(number: unknown): boolean; + + /** + * Returns true if the value passed is an integer, false otherwise. + * @param number A numeric value. + */ + isInteger(number: unknown): boolean; + + /** + * Returns a Boolean value that indicates whether a value is the reserved value NaN (not a + * number). Unlike the global isNaN(), Number.isNaN() doesn't forcefully convert the parameter + * to a number. Only values of the type number, that are also NaN, result in true. + * @param number A numeric value. + */ + isNaN(number: unknown): boolean; + + /** + * Returns true if the value passed is a safe integer. + * @param number A numeric value. + */ + isSafeInteger(number: unknown): boolean; + + /** + * The value of the largest integer n such that n and n + 1 are both exactly representable as + * a Number value. + * The value of Number.MAX_SAFE_INTEGER is 9007199254740991 2^53 − 1. + */ + readonly MAX_SAFE_INTEGER: number; + + /** + * The value of the smallest integer n such that n and n − 1 are both exactly representable as + * a Number value. + * The value of Number.MIN_SAFE_INTEGER is −9007199254740991 (−(2^53 − 1)). + */ + readonly MIN_SAFE_INTEGER: number; + + /** + * Converts a string to a floating-point number. + * @param string A string that contains a floating-point number. + */ + parseFloat(string: string): number; + + /** + * Converts A string to an integer. + * @param string A string to convert into a number. + * @param radix A value between 2 and 36 that specifies the base of the number in `string`. + * If this argument is not supplied, strings with a prefix of '0x' are considered hexadecimal. + * All other strings are considered decimal. + */ + parseInt(string: string, radix?: number): number; +} + +interface ObjectConstructor { + /** + * Copy the values of all of the enumerable own properties from one or more source objects to a + * target object. Returns the target object. + * @param target The target object to copy to. + * @param source The source object from which to copy properties. + */ + assign(target: T, source: U): T & U; + + /** + * Copy the values of all of the enumerable own properties from one or more source objects to a + * target object. Returns the target object. + * @param target The target object to copy to. + * @param source1 The first source object from which to copy properties. + * @param source2 The second source object from which to copy properties. + */ + assign(target: T, source1: U, source2: V): T & U & V; + + /** + * Copy the values of all of the enumerable own properties from one or more source objects to a + * target object. Returns the target object. + * @param target The target object to copy to. + * @param source1 The first source object from which to copy properties. + * @param source2 The second source object from which to copy properties. + * @param source3 The third source object from which to copy properties. + */ + assign(target: T, source1: U, source2: V, source3: W): T & U & V & W; + + /** + * Copy the values of all of the enumerable own properties from one or more source objects to a + * target object. Returns the target object. + * @param target The target object to copy to. + * @param sources One or more source objects from which to copy properties + */ + assign(target: object, ...sources: any[]): any; + + /** + * Returns an array of all symbol properties found directly on object o. + * @param o Object to retrieve the symbols from. + */ + getOwnPropertySymbols(o: any): symbol[]; + + /** + * Returns the names of the enumerable string properties and methods of an object. + * @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object. + */ + keys(o: {}): string[]; + + /** + * Returns true if the values are the same value, false otherwise. + * @param value1 The first value. + * @param value2 The second value. + */ + is(value1: any, value2: any): boolean; + + /** + * Sets the prototype of a specified object o to object proto or null. Returns the object o. + * @param o The object to change its prototype. + * @param proto The value of the new prototype or null. + */ + setPrototypeOf(o: any, proto: object | null): any; +} + +interface ReadonlyArray { + /** + * Returns the value of the first element in the array where predicate is true, and undefined + * otherwise. + * @param predicate find calls predicate once for each element of the array, in ascending + * order, until it finds one where predicate returns true. If such an element is found, find + * immediately returns that element value. Otherwise, find returns undefined. + * @param thisArg If provided, it will be used as the this value for each invocation of + * predicate. If it is not provided, undefined is used instead. + */ + find(predicate: (value: T, index: number, obj: readonly T[]) => value is S, thisArg?: any): S | undefined; + find(predicate: (value: T, index: number, obj: readonly T[]) => unknown, thisArg?: any): T | undefined; + + /** + * Returns the index of the first element in the array where predicate is true, and -1 + * otherwise. + * @param predicate find calls predicate once for each element of the array, in ascending + * order, until it finds one where predicate returns true. If such an element is found, + * findIndex immediately returns that element index. Otherwise, findIndex returns -1. + * @param thisArg If provided, it will be used as the this value for each invocation of + * predicate. If it is not provided, undefined is used instead. + */ + findIndex(predicate: (value: T, index: number, obj: readonly T[]) => unknown, thisArg?: any): number; + + toLocaleString(locales: string | string[], options?: Intl.NumberFormatOptions & Intl.DateTimeFormatOptions): string; +} + +interface RegExp { + /** + * Returns a string indicating the flags of the regular expression in question. This field is read-only. + * The characters in this string are sequenced and concatenated in the following order: + * + * - "g" for global + * - "i" for ignoreCase + * - "m" for multiline + * - "u" for unicode + * - "y" for sticky + * + * If no flags are set, the value is the empty string. + */ + readonly flags: string; + + /** + * Returns a Boolean value indicating the state of the sticky flag (y) used with a regular + * expression. Default is false. Read-only. + */ + readonly sticky: boolean; + + /** + * Returns a Boolean value indicating the state of the Unicode flag (u) used with a regular + * expression. Default is false. Read-only. + */ + readonly unicode: boolean; +} + +interface RegExpConstructor { + new (pattern: RegExp | string, flags?: string): RegExp; + (pattern: RegExp | string, flags?: string): RegExp; +} + +interface String { + /** + * Returns a nonnegative integer Number less than 1114112 (0x110000) that is the code point + * value of the UTF-16 encoded code point starting at the string element at position pos in + * the String resulting from converting this object to a String. + * If there is no element at that position, the result is undefined. + * If a valid UTF-16 surrogate pair does not begin at pos, the result is the code unit at pos. + */ + codePointAt(pos: number): number | undefined; + + /** + * Returns true if searchString appears as a substring of the result of converting this + * object to a String, at one or more positions that are + * greater than or equal to position; otherwise, returns false. + * @param searchString search string + * @param position If position is undefined, 0 is assumed, so as to search all of the String. + */ + includes(searchString: string, position?: number): boolean; + + /** + * Returns true if the sequence of elements of searchString converted to a String is the + * same as the corresponding elements of this object (converted to a String) starting at + * endPosition – length(this). Otherwise returns false. + */ + endsWith(searchString: string, endPosition?: number): boolean; + + /** + * Returns the String value result of normalizing the string into the normalization form + * named by form as specified in Unicode Standard Annex #15, Unicode Normalization Forms. + * @param form Applicable values: "NFC", "NFD", "NFKC", or "NFKD", If not specified default + * is "NFC" + */ + normalize(form: "NFC" | "NFD" | "NFKC" | "NFKD"): string; + + /** + * Returns the String value result of normalizing the string into the normalization form + * named by form as specified in Unicode Standard Annex #15, Unicode Normalization Forms. + * @param form Applicable values: "NFC", "NFD", "NFKC", or "NFKD", If not specified default + * is "NFC" + */ + normalize(form?: string): string; + + /** + * Returns a String value that is made from count copies appended together. If count is 0, + * the empty string is returned. + * @param count number of copies to append + */ + repeat(count: number): string; + + /** + * Returns true if the sequence of elements of searchString converted to a String is the + * same as the corresponding elements of this object (converted to a String) starting at + * position. Otherwise returns false. + */ + startsWith(searchString: string, position?: number): boolean; + + /** + * Returns an `` HTML anchor element and sets the name attribute to the text value + * @deprecated A legacy feature for browser compatibility + * @param name + */ + anchor(name: string): string; + + /** + * Returns a `` HTML element + * @deprecated A legacy feature for browser compatibility + */ + big(): string; + + /** + * Returns a `` HTML element + * @deprecated A legacy feature for browser compatibility + */ + blink(): string; + + /** + * Returns a `` HTML element + * @deprecated A legacy feature for browser compatibility + */ + bold(): string; + + /** + * Returns a `` HTML element + * @deprecated A legacy feature for browser compatibility + */ + fixed(): string; + + /** + * Returns a `` HTML element and sets the color attribute value + * @deprecated A legacy feature for browser compatibility + */ + fontcolor(color: string): string; + + /** + * Returns a `` HTML element and sets the size attribute value + * @deprecated A legacy feature for browser compatibility + */ + fontsize(size: number): string; + + /** + * Returns a `` HTML element and sets the size attribute value + * @deprecated A legacy feature for browser compatibility + */ + fontsize(size: string): string; + + /** + * Returns an `` HTML element + * @deprecated A legacy feature for browser compatibility + */ + italics(): string; + + /** + * Returns an `` HTML element and sets the href attribute value + * @deprecated A legacy feature for browser compatibility + */ + link(url: string): string; + + /** + * Returns a `` HTML element + * @deprecated A legacy feature for browser compatibility + */ + small(): string; + + /** + * Returns a `` HTML element + * @deprecated A legacy feature for browser compatibility + */ + strike(): string; + + /** + * Returns a `` HTML element + * @deprecated A legacy feature for browser compatibility + */ + sub(): string; + + /** + * Returns a `` HTML element + * @deprecated A legacy feature for browser compatibility + */ + sup(): string; +} + +interface StringConstructor { + /** + * Return the String value whose elements are, in order, the elements in the List elements. + * If length is 0, the empty string is returned. + */ + fromCodePoint(...codePoints: number[]): string; + + /** + * String.raw is usually used as a tag function of a Tagged Template String. When called as + * such, the first argument will be a well formed template call site object and the rest + * parameter will contain the substitution values. It can also be called directly, for example, + * to interleave strings and values from your own tag function, and in this case the only thing + * it needs from the first argument is the raw property. + * @param template A well-formed template string call site representation. + * @param substitutions A set of substitution values. + */ + raw(template: { raw: readonly string[] | ArrayLike; }, ...substitutions: any[]): string; +} + +interface Int8Array { + toLocaleString(locales: string | string[], options?: Intl.NumberFormatOptions): string; +} + +interface Uint8Array { + toLocaleString(locales: string | string[], options?: Intl.NumberFormatOptions): string; +} + +interface Uint8ClampedArray { + toLocaleString(locales: string | string[], options?: Intl.NumberFormatOptions): string; +} + +interface Int16Array { + toLocaleString(locales: string | string[], options?: Intl.NumberFormatOptions): string; +} + +interface Uint16Array { + toLocaleString(locales: string | string[], options?: Intl.NumberFormatOptions): string; +} + +interface Int32Array { + toLocaleString(locales: string | string[], options?: Intl.NumberFormatOptions): string; +} + +interface Uint32Array { + toLocaleString(locales: string | string[], options?: Intl.NumberFormatOptions): string; +} + +interface Float32Array { + toLocaleString(locales: string | string[], options?: Intl.NumberFormatOptions): string; +} + +interface Float64Array { + toLocaleString(locales: string | string[], options?: Intl.NumberFormatOptions): string; +} From 2da10ae32fed0682f9ed6a349879b8415f90d36a Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Fri, 14 Mar 2025 13:26:52 +0100 Subject: [PATCH 041/739] add PG_LISTENER_REFRESH_PERIOD_SECS --- backend/src/main.rs | 26 ++++++++++++++++++- .../windmill-common/src/global_settings.rs | 3 ++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/backend/src/main.rs b/backend/src/main.rs index 54ea123fc3..4ca0a89913 100644 --- a/backend/src/main.rs +++ b/backend/src/main.rs @@ -19,7 +19,7 @@ use std::{ collections::HashMap, fs::{create_dir_all, DirBuilder}, net::{IpAddr, Ipv4Addr, SocketAddr}, - time::Duration, + time::{Duration, Instant}, }; use tokio::{fs::File, io::AsyncReadExt, task::JoinHandle}; use uuid::Uuid; @@ -115,6 +115,12 @@ where rt.block_on(future) } +lazy_static::lazy_static! { + static ref PG_LISTENER_REFRESH_PERIOD_SECS: Option = std::env::var("PG_LISTENER_REFRESH_PERIOD_SECS") + .ok() + .and_then(|x| x.parse::().ok()); +} + pub fn main() -> anyhow::Result<()> { // https://github.com/denoland/deno/blob/main/cli/main.rs#L477 #[cfg(feature = "deno_core")] @@ -650,6 +656,7 @@ Windmill Community Edition {GIT_VERSION} let h = tokio::spawn(async move { let mut listener = retry_listen_pg(&db_url).await; + let mut last_listener_refresh = Instant::now(); loop { tokio::select! { biased; @@ -859,6 +866,23 @@ Windmill Community Edition {GIT_VERSION} }; }, _ = tokio::time::sleep(Duration::from_secs(30)) => { + if PG_LISTENER_REFRESH_PERIOD_SECS.is_some_and(|x| last_listener_refresh.elapsed() > Duration::from_secs(x)) { + tracing::info!("Refreshing pg listener"); + if let Err(e) = listener.unlisten_all().await { + tracing::error!(error = %e, "Could not unlisten to database"); + } + monitor_db( + &db, + &base_internal_url, + server_mode, + worker_mode, + true, + tx.clone(), + ).await; + listener = retry_listen_pg(&db_url).await; + last_listener_refresh = Instant::now(); + } + tracing::info!("monitor task started"); monitor_db( &db, diff --git a/backend/windmill-common/src/global_settings.rs b/backend/windmill-common/src/global_settings.rs index 816a99486e..41ccccdebd 100644 --- a/backend/windmill-common/src/global_settings.rs +++ b/backend/windmill-common/src/global_settings.rs @@ -40,7 +40,7 @@ pub const JWT_SECRET_SETTING: &str = "jwt_secret"; pub const EMAIL_DOMAIN_SETTING: &str = "email_domain"; pub const OTEL_SETTING: &str = "otel"; -pub const ENV_SETTINGS: [&str; 57] = [ +pub const ENV_SETTINGS: [&str; 58] = [ "DISABLE_NSJAIL", "MODE", "NUM_WORKERS", @@ -98,6 +98,7 @@ pub const ENV_SETTINGS: [&str; 57] = [ "OTEL_LOGS", "DISABLE_S3_STORE", "PG_SCHEMA", + "PG_LISTENER_REFRESH_PERIOD_SECS", ]; use crate::error; From c691b7be32edfe6490f278c7efaff3236b9c42cd Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Fri, 14 Mar 2025 13:28:32 +0100 Subject: [PATCH 042/739] nit --- backend/src/main.rs | 8 -------- 1 file changed, 8 deletions(-) diff --git a/backend/src/main.rs b/backend/src/main.rs index 4ca0a89913..afec50c6a9 100644 --- a/backend/src/main.rs +++ b/backend/src/main.rs @@ -871,14 +871,6 @@ Windmill Community Edition {GIT_VERSION} if let Err(e) = listener.unlisten_all().await { tracing::error!(error = %e, "Could not unlisten to database"); } - monitor_db( - &db, - &base_internal_url, - server_mode, - worker_mode, - true, - tx.clone(), - ).await; listener = retry_listen_pg(&db_url).await; last_listener_refresh = Instant::now(); } From 4f43b1984f4ea9a87b0489d4b40c1ecdcfdbdecd Mon Sep 17 00:00:00 2001 From: HugoCasa Date: Fri, 14 Mar 2025 15:17:48 +0100 Subject: [PATCH 043/739] feat: keep captures across drafts and deploys (#5482) --- ...39319a854f761a300970e2fd909f8058ec566.json | 17 ++++++++ ...6874ee8b277a2914dff6f9c33a1f5a2351114.json | 17 ++++++++ backend/windmill-api/openapi.yaml | 39 +++++++++++++++++++ backend/windmill-api/src/capture.rs | 39 +++++++++++++++++++ backend/windmill-api/src/flows.rs | 36 ++++++++++------- backend/windmill-api/src/scripts.rs | 36 ++++++++++------- frontend/src/lib/components/Dev.svelte | 3 +- .../src/lib/components/FlowBuilder.svelte | 32 +++++++++++++-- .../lib/components/FlowPreviewContent.svelte | 9 +++-- .../src/lib/components/ScriptBuilder.svelte | 27 ++++++++++++- .../flows/content/FlowEditorPanel.svelte | 6 ++- .../components/flows/content/FlowInput.svelte | 6 +-- .../flows/content/FlowSettings.svelte | 6 +-- frontend/src/lib/components/flows/types.ts | 3 +- .../components/triggers/TriggersEditor.svelte | 19 ++++----- frontend/src/routes/flows/dev/+page.svelte | 3 +- 16 files changed, 241 insertions(+), 57 deletions(-) create mode 100644 backend/.sqlx/query-7e891e053b8545c800d629421f239319a854f761a300970e2fd909f8058ec566.json create mode 100644 backend/.sqlx/query-e70c3da5864b7946735b7ad6c416874ee8b277a2914dff6f9c33a1f5a2351114.json diff --git a/backend/.sqlx/query-7e891e053b8545c800d629421f239319a854f761a300970e2fd909f8058ec566.json b/backend/.sqlx/query-7e891e053b8545c800d629421f239319a854f761a300970e2fd909f8058ec566.json new file mode 100644 index 0000000000..4e6d8e9ba2 --- /dev/null +++ b/backend/.sqlx/query-7e891e053b8545c800d629421f239319a854f761a300970e2fd909f8058ec566.json @@ -0,0 +1,17 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE capture_config SET path = $1 WHERE path = $2 AND workspace_id = $3 AND is_flow = $4", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Text", + "Text", + "Bool" + ] + }, + "nullable": [] + }, + "hash": "7e891e053b8545c800d629421f239319a854f761a300970e2fd909f8058ec566" +} diff --git a/backend/.sqlx/query-e70c3da5864b7946735b7ad6c416874ee8b277a2914dff6f9c33a1f5a2351114.json b/backend/.sqlx/query-e70c3da5864b7946735b7ad6c416874ee8b277a2914dff6f9c33a1f5a2351114.json new file mode 100644 index 0000000000..461721c4c2 --- /dev/null +++ b/backend/.sqlx/query-e70c3da5864b7946735b7ad6c416874ee8b277a2914dff6f9c33a1f5a2351114.json @@ -0,0 +1,17 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE capture SET path = $1 WHERE path = $2 AND workspace_id = $3 AND is_flow = $4", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Text", + "Text", + "Bool" + ] + }, + "nullable": [] + }, + "hash": "e70c3da5864b7946735b7ad6c416874ee8b277a2914dff6f9c33a1f5a2351114" +} diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index 4716daeb12..2b4bd94f9c 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -4668,6 +4668,11 @@ paths: parameters: - $ref: "#/components/parameters/WorkspaceId" - $ref: "#/components/parameters/ScriptPath" + - name: keep_captures + description: keep captures + in: query + schema: + type: boolean responses: "200": description: script path @@ -5613,6 +5618,11 @@ paths: parameters: - $ref: "#/components/parameters/WorkspaceId" - $ref: "#/components/parameters/ScriptPath" + - name: keep_captures + description: keep captures + in: query + schema: + type: boolean responses: "200": description: flow delete @@ -10602,6 +10612,35 @@ paths: type: array items: $ref: "#/components/schemas/Capture" + + + /w/{workspace}/capture/move/{runnable_kind}/{path}: + post: + summary: move captures and configs for a script or flow + operationId: moveCapturesAndConfigs + tags: + - capture + parameters: + - $ref: "#/components/parameters/WorkspaceId" + - $ref: "#/components/parameters/RunnableKind" + - $ref: "#/components/parameters/Path" + requestBody: + description: move captures and configs to a new path + required: true + content: + application/json: + schema: + type: object + properties: + new_path: + type: string + responses: + "200": + description: captures and configs moved + content: + text/plain: + schema: + type: string /w/{workspace}/capture/{id}: get: diff --git a/backend/windmill-api/src/capture.rs b/backend/windmill-api/src/capture.rs index f52cee3fab..402d504a2c 100644 --- a/backend/windmill-api/src/capture.rs +++ b/backend/windmill-api/src/capture.rs @@ -67,6 +67,10 @@ pub fn workspaced_service() -> Router { ) .route("/get_configs/:runnable_kind/*path", get(get_configs)) .route("/list/:runnable_kind/*path", get(list_captures)) + .route( + "/move/:runnable_kind/*path", + post(move_captures_and_configs), + ) .route("/:id", delete(delete_capture)) .route("/:id", get(get_capture)) } @@ -450,6 +454,41 @@ async fn delete_capture( Ok(()) } +#[derive(Deserialize)] +struct MoveCapturesAndConfigsBody { + new_path: String, +} + +async fn move_captures_and_configs( + authed: ApiAuthed, + Extension(user_db): Extension, + Path((w_id, runnable_kind, old_path)): Path<(String, RunnableKind, StripPath)>, + Json(body): Json, +) -> Result<()> { + let mut tx = user_db.begin(&authed).await?; + let old_path = old_path.to_path(); + sqlx::query!( + "UPDATE capture_config SET path = $1 WHERE path = $2 AND workspace_id = $3 AND is_flow = $4", + body.new_path, + old_path, + &w_id, + matches!(runnable_kind, RunnableKind::Flow), + ) + .execute(&mut *tx) + .await?; + sqlx::query!( + "UPDATE capture SET path = $1 WHERE path = $2 AND workspace_id = $3 AND is_flow = $4", + body.new_path, + old_path, + &w_id, + matches!(runnable_kind, RunnableKind::Flow), + ) + .execute(&mut *tx) + .await?; + tx.commit().await?; + Ok(()) +} + #[derive(Serialize, Deserialize)] struct ActiveCaptureOwner { owner: String, diff --git a/backend/windmill-api/src/flows.rs b/backend/windmill-api/src/flows.rs index 8cd65dd55a..beaec364f6 100644 --- a/backend/windmill-api/src/flows.rs +++ b/backend/windmill-api/src/flows.rs @@ -1183,12 +1183,18 @@ async fn archive_flow_by_path( Ok(format!("Flow {path} archived")) } +#[derive(Deserialize)] +struct DeleteFlowQuery { + keep_captures: Option, +} + async fn delete_flow_by_path( authed: ApiAuthed, Extension(db): Extension, Extension(user_db): Extension, Extension(webhook): Extension, Path((w_id, path)): Path<(String, StripPath)>, + Query(query): Query, ) -> Result { let path = path.to_path(); let mut tx = user_db.begin(&authed).await?; @@ -1209,21 +1215,23 @@ async fn delete_flow_by_path( .execute(&mut *tx) .await?; - sqlx::query!( - "DELETE FROM capture_config WHERE path = $1 AND workspace_id = $2 AND is_flow IS TRUE", - path, - &w_id - ) - .execute(&mut *tx) - .await?; + if !query.keep_captures.unwrap_or(false) { + sqlx::query!( + "DELETE FROM capture_config WHERE path = $1 AND workspace_id = $2 AND is_flow IS TRUE", + path, + &w_id + ) + .execute(&mut *tx) + .await?; - sqlx::query!( - "DELETE FROM capture WHERE path = $1 AND workspace_id = $2 AND is_flow IS TRUE", - path, - &w_id - ) - .execute(&mut *tx) - .await?; + sqlx::query!( + "DELETE FROM capture WHERE path = $1 AND workspace_id = $2 AND is_flow IS TRUE", + path, + &w_id + ) + .execute(&mut *tx) + .await?; + } audit_log( &mut *tx, diff --git a/backend/windmill-api/src/scripts.rs b/backend/windmill-api/src/scripts.rs index d1c6e43902..e72ec6f167 100644 --- a/backend/windmill-api/src/scripts.rs +++ b/backend/windmill-api/src/scripts.rs @@ -1481,12 +1481,18 @@ async fn delete_script_by_hash( Ok(Json(script)) } +#[derive(Deserialize)] +struct DeleteScriptQuery { + keep_captures: Option, +} + async fn delete_script_by_path( authed: ApiAuthed, Extension(user_db): Extension, Extension(webhook): Extension, Extension(db): Extension, Path((w_id, path)): Path<(String, StripPath)>, + Query(query): Query, ) -> JsonResult { let path = path.to_path(); @@ -1540,21 +1546,23 @@ async fn delete_script_by_path( .execute(&db) .await?; - sqlx::query!( - "DELETE FROM capture_config WHERE path = $1 AND workspace_id = $2 AND is_flow IS FALSE", - path, - w_id - ) - .execute(&db) - .await?; + if !query.keep_captures.unwrap_or(false) { + sqlx::query!( + "DELETE FROM capture_config WHERE path = $1 AND workspace_id = $2 AND is_flow IS FALSE", + path, + w_id + ) + .execute(&db) + .await?; - sqlx::query!( - "DELETE FROM capture WHERE path = $1 AND workspace_id = $2 AND is_flow IS FALSE", - path, - w_id - ) - .execute(&db) - .await?; + sqlx::query!( + "DELETE FROM capture WHERE path = $1 AND workspace_id = $2 AND is_flow IS FALSE", + path, + w_id + ) + .execute(&db) + .await?; + } audit_log( &mut *tx, diff --git a/frontend/src/lib/components/Dev.svelte b/frontend/src/lib/components/Dev.svelte index 84b0d3049a..8e96e68e7c 100644 --- a/frontend/src/lib/components/Dev.svelte +++ b/frontend/src/lib/components/Dev.svelte @@ -528,7 +528,8 @@ flowStore, testStepStore, saveDraft: () => {}, - initialPath: '', + initialPathStore: writable(''), + fakeInitialPath: '', flowInputsStore: writable({}), customUi: {}, insertButtonOpen: writable(false), diff --git a/frontend/src/lib/components/FlowBuilder.svelte b/frontend/src/lib/components/FlowBuilder.svelte index ca43689495..d09f34ce7d 100644 --- a/frontend/src/lib/components/FlowBuilder.svelte +++ b/frontend/src/lib/components/FlowBuilder.svelte @@ -10,7 +10,8 @@ type OpenFlow, type RawScript, type InputTransform, - type TriggersCount + type TriggersCount, + CaptureService } from '$lib/gen' import { initHistory, push, redo, undo } from '$lib/history' import { @@ -24,6 +25,7 @@ cleanValueProperties, encodeState, formatCron, + generateRandomString, orderedJsonStringify, replaceFalseWithUndefined, sleep, @@ -105,6 +107,18 @@ export let version: number | undefined = undefined export let setSavedraftCb: ((cb: () => void) => void) | undefined = undefined + let initialPathStore = writable(initialPath) + $: initialPathStore.set(initialPath) + + // used for new flows for captures + let fakeInitialPath = + 'u/' + + ($userStore?.username?.includes('@') + ? $userStore!.username.split('@')[0].replace(/[^a-zA-Z0-9_]/g, '') + : $userStore!.username!) + + '/' + + generateRandomString(12) + // Used by multiplayer deploy collision warning let deployedValue: Value | undefined = undefined // Value to diff against let deployedBy: string | undefined = undefined // Author @@ -216,7 +230,18 @@ if (savedFlow?.draft_only) { await FlowService.deleteFlowByPath({ workspace: $workspaceStore!, - path: initialPath + path: initialPath, + keepCaptures: true + }) + } + if (!initialPath || $pathStore != initialPath) { + await CaptureService.moveCapturesAndConfigs({ + workspace: $workspaceStore!, + path: initialPath || fakeInitialPath, + requestBody: { + new_path: $pathStore + }, + runnableKind: 'flow' }) } await FlowService.createFlow({ @@ -544,7 +569,8 @@ pathStore, testStepStore, saveDraft, - initialPath, + initialPathStore, + fakeInitialPath, flowInputsStore: writable({}), customUi, insertButtonOpen, diff --git a/frontend/src/lib/components/FlowPreviewContent.svelte b/frontend/src/lib/components/FlowPreviewContent.svelte index d541a46397..e9cba15af9 100644 --- a/frontend/src/lib/components/FlowPreviewContent.svelte +++ b/frontend/src/lib/components/FlowPreviewContent.svelte @@ -51,7 +51,7 @@ flowStateStore, flowStore, pathStore, - initialPath, + initialPathStore, customUi, executionCount } = getContext('FlowEditorContext') @@ -182,7 +182,8 @@ } const previousJobId = await JobService.listJobs({ workspace: $workspaceStore!, - scriptPathExact: (initialPath == '' ? $pathStore : initialPath) + '/' + module.id, + scriptPathExact: + ($initialPathStore == '' ? $pathStore : $initialPathStore) + '/' + module.id, jobKinds: ['preview', 'script', 'flowpreview', 'flow'].join(','), page: 1, perPage: 1 @@ -372,7 +373,7 @@
{#if jobId} diff --git a/frontend/src/lib/components/ScriptBuilder.svelte b/frontend/src/lib/components/ScriptBuilder.svelte index d112455e72..4fc5481ac8 100644 --- a/frontend/src/lib/components/ScriptBuilder.svelte +++ b/frontend/src/lib/components/ScriptBuilder.svelte @@ -7,7 +7,8 @@ ScheduleService, type Script, type TriggersCount, - PostgresTriggerService + PostgresTriggerService, + CaptureService } from '$lib/gen' import { inferArgs } from '$lib/infer' import { initialCode } from '$lib/script_helpers' @@ -18,6 +19,7 @@ emptyString, encodeState, formatCron, + generateRandomString, orderedJsonStringify, replaceFalseWithUndefined, type Value @@ -106,6 +108,15 @@ } } + // used for new scripts for captures + let fakeInitialPath = + 'u/' + + ($userStore?.username?.includes('@') + ? $userStore!.username.split('@')[0].replace(/[^a-zA-Z0-9_]/g, '') + : $userStore!.username!) + + '/' + + generateRandomString(12) + let deployedValue: Value | undefined = undefined // Value to diff against let deployedBy: string | undefined = undefined // Author let confirmCallback: () => void = () => {} // What happens when user clicks `override` in warning @@ -565,10 +576,21 @@ if (savedScript?.draft_only) { await ScriptService.deleteScriptByPath({ workspace: $workspaceStore!, - path: initialPath + path: initialPath, + keepCaptures: true }) script.parent_hash = undefined } + if (!initialPath || script.path != initialPath) { + await CaptureService.moveCapturesAndConfigs({ + workspace: $workspaceStore!, + path: initialPath || fakeInitialPath, + requestBody: { + new_path: script.path + }, + runnableKind: 'script' + }) + } await ScriptService.createScript({ workspace: $workspaceStore!, requestBody: { @@ -1394,6 +1416,7 @@ }} args={hasPreprocessor && selectedInputTab !== 'preprocessor' ? {} : args} {initialPath} + {fakeInitialPath} schema={script.schema} noEditor={true} isFlow={false} diff --git a/frontend/src/lib/components/flows/content/FlowEditorPanel.svelte b/frontend/src/lib/components/flows/content/FlowEditorPanel.svelte index 77be332ad5..dd710eac9e 100644 --- a/frontend/src/lib/components/flows/content/FlowEditorPanel.svelte +++ b/frontend/src/lib/components/flows/content/FlowEditorPanel.svelte @@ -25,7 +25,8 @@ flowStateStore, flowInputsStore, pathStore, - initialPath, + initialPathStore, + fakeInitialPath, previewArgs, flowInputEditorState } = getContext('FlowEditorContext') @@ -114,7 +115,8 @@ on:testWithArgs args={$previewArgs} currentPath={$pathStore} - {initialPath} + initialPath={$initialPathStore} + {fakeInitialPath} schema={$flowStore.schema} {noEditor} newItem={newFlow} diff --git a/frontend/src/lib/components/flows/content/FlowInput.svelte b/frontend/src/lib/components/flows/content/FlowInput.svelte index 3466551844..7748bd9613 100644 --- a/frontend/src/lib/components/flows/content/FlowInput.svelte +++ b/frontend/src/lib/components/flows/content/FlowInput.svelte @@ -47,7 +47,7 @@ export let noEditor: boolean export let disabled: boolean - const { flowStore, previewArgs, pathStore, initialPath, flowInputEditorState } = + const { flowStore, previewArgs, pathStore, initialPathStore, flowInputEditorState } = getContext('FlowEditorContext') let addProperty: AddPropertyV2 | undefined = undefined @@ -483,7 +483,7 @@ > { updatePreviewSchemaAndArgs(e.detail?.args ?? undefined) @@ -525,7 +525,7 @@ title="Saved inputs" > { updatePreviewSchemaAndArgs(e.detail ?? undefined) diff --git a/frontend/src/lib/components/flows/content/FlowSettings.svelte b/frontend/src/lib/components/flows/content/FlowSettings.svelte index 4737d0446b..2c46210a1e 100644 --- a/frontend/src/lib/components/flows/content/FlowSettings.svelte +++ b/frontend/src/lib/components/flows/content/FlowSettings.svelte @@ -21,7 +21,7 @@ export let noEditor: boolean - const { flowStore, initialPath, previewArgs, pathStore, customUi } = + const { flowStore, initialPathStore, previewArgs, pathStore, customUi } = getContext('FlowEditorContext') function asSchema(x: any) { @@ -67,7 +67,7 @@ promptConfigName="flowSummary" flow={$flowStore.value} on:change={() => { - if (initialPath == '' && $flowStore.summary?.length > 0 && !dirtyPath) { + if ($initialPathStore == '' && $flowStore.summary?.length > 0 && !dirtyPath) { path?.setName( $flowStore.summary .toLowerCase() @@ -92,7 +92,7 @@ bind:this={path} bind:dirty={dirtyPath} bind:path={$pathStore} - {initialPath} + initialPath={$initialPathStore} namePlaceholder="flow" kind="flow" /> diff --git a/frontend/src/lib/components/flows/types.ts b/frontend/src/lib/components/flows/types.ts index 76f8064ffb..b72c321615 100644 --- a/frontend/src/lib/components/flows/types.ts +++ b/frontend/src/lib/components/flows/types.ts @@ -51,7 +51,8 @@ export type FlowEditorContext = { flowStateStore: Writable testStepStore: Writable> saveDraft: () => void - initialPath: string + initialPathStore: Writable + fakeInitialPath: string flowInputsStore: Writable customUi: FlowBuilderWhitelabelCustomUi insertButtonOpen: Writable diff --git a/frontend/src/lib/components/triggers/TriggersEditor.svelte b/frontend/src/lib/components/triggers/TriggersEditor.svelte index ce5a4f24ce..9e3bcb9db9 100644 --- a/frontend/src/lib/components/triggers/TriggersEditor.svelte +++ b/frontend/src/lib/components/triggers/TriggersEditor.svelte @@ -24,6 +24,7 @@ export let noEditor: boolean export let newItem = false export let currentPath: string + export let fakeInitialPath: string export let hash: string | undefined = undefined export let initialPath: string export let schema: any @@ -85,7 +86,7 @@ on:updateSchema on:testWithArgs scopes={isFlow ? [`run:flow/${currentPath}`] : [`run:script/${currentPath}`]} - path={currentPath} + path={initialPath || fakeInitialPath} {hash} {isFlow} {args} @@ -105,7 +106,7 @@ on:testWithArgs token="" scopes={isFlow ? [`run:flow/${currentPath}`] : [`run:script/${currentPath}`]} - path={currentPath} + path={initialPath || fakeInitialPath} {isFlow} isEditor={true} {canHavePreprocessor} @@ -122,7 +123,7 @@ on:testWithArgs {newItem} {args} - path={currentPath} + path={initialPath || fakeInitialPath} {isFlow} isEditor={true} {canHavePreprocessor} @@ -137,7 +138,7 @@ on:updateSchema on:testWithArgs {newItem} - path={currentPath} + path={initialPath || fakeInitialPath} {isFlow} isEditor={true} {canHavePreprocessor} @@ -152,7 +153,7 @@ on:updateSchema on:testWithArgs {newItem} - path={currentPath} + path={initialPath || fakeInitialPath} {isFlow} {canHavePreprocessor} {hasPreprocessor} @@ -174,7 +175,7 @@ on:updateSchema on:testWithArgs {newItem} - path={currentPath} + path={initialPath || fakeInitialPath} {isFlow} isEditor={true} {canHavePreprocessor} @@ -185,7 +186,7 @@ on:applyArgs on:addPreprocessor {newItem} - path={currentPath} + path={initialPath || fakeInitialPath} {isFlow} isEditor={true} {canHavePreprocessor} @@ -198,7 +199,7 @@ on:updateSchema on:testWithArgs {newItem} - path={currentPath} + path={initialPath || fakeInitialPath} {isFlow} isEditor={true} {canHavePreprocessor} @@ -211,7 +212,7 @@ on:updateSchema on:testWithArgs {newItem} - path={currentPath} + path={initialPath || fakeInitialPath} {isFlow} isEditor={true} {canHavePreprocessor} diff --git a/frontend/src/routes/flows/dev/+page.svelte b/frontend/src/routes/flows/dev/+page.svelte index db36f81d93..cffef6240c 100644 --- a/frontend/src/routes/flows/dev/+page.svelte +++ b/frontend/src/routes/flows/dev/+page.svelte @@ -103,7 +103,8 @@ flowStore, testStepStore, saveDraft: () => {}, - initialPath: '', + initialPathStore: writable(''), + fakeInitialPath: '', flowInputsStore: writable({}), customUi: {}, insertButtonOpen: writable(false), From 47ccbeab0171f4ed7c4f20295ffa922defc6e858 Mon Sep 17 00:00:00 2001 From: Diego Imbert <70353967+diegoimbert@users.noreply.github.com> Date: Fri, 14 Mar 2025 15:18:25 +0100 Subject: [PATCH 044/739] Re-added padding affecting subgrid dotted borders (#5479) * remove !p-0 in preset components * removed extra padding on accordion tabs subgrid --- .../components/apps/components/layout/AppTabs.svelte | 6 +++--- .../apps/editor/componentsPanel/ComponentList.svelte | 11 +++-------- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/frontend/src/lib/components/apps/components/layout/AppTabs.svelte b/frontend/src/lib/components/apps/components/layout/AppTabs.svelte index f57d7c46f0..06b11db63a 100644 --- a/frontend/src/lib/components/apps/components/layout/AppTabs.svelte +++ b/frontend/src/lib/components/apps/components/layout/AppTabs.svelte @@ -164,7 +164,7 @@ 'border-r border-primary border-l bg-surface text-primary', css?.selectedTab?.class, 'wm-tabs-selectedTab' - ) + ) : '' )} style={selected == res @@ -192,7 +192,7 @@ 'bg-surface text-primary ', css?.selectedTab?.class, 'wm-tabs-selectedTab' - ) + ) : 'text-secondary' )} > @@ -200,7 +200,7 @@ {res} {#if selected == res} -
{/key} + {:else if filterBy === 'worker'} + {#key worker} +
+ {#if worker} + + {/if} + Worker + + + { + if (workerTimeout) { + clearTimeout(workerTimeout) + } + + workerTimeout = setTimeout(() => { + worker = displayedWorker + }, 1000) + }} + /> +
+ {/key} {/if}
@@ -549,6 +592,7 @@ + @@ -745,6 +789,41 @@
{/key} + {:else if filterBy === 'worker'} + {#key worker} + + {/key} {/if}
+ {/if} {/if} diff --git a/frontend/src/routes/(root)/(logged)/runs/[...path]/+page.svelte b/frontend/src/routes/(root)/(logged)/runs/[...path]/+page.svelte index 3b8ef2aa29..d58d2e8c91 100644 --- a/frontend/src/routes/(root)/(logged)/runs/[...path]/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/runs/[...path]/+page.svelte @@ -47,6 +47,7 @@ // All Filters // Filter by let path: string | null = $page.params.path + let worker: string | null = $page.url.searchParams.get('worker') let user: string | null = $page.url.searchParams.get('user') let folder: string | null = $page.url.searchParams.get('folder') let label: string | null = $page.url.searchParams.get('label') @@ -99,6 +100,7 @@ label = $page.url.searchParams.get('label') concurrencyKey = $page.url.searchParams.get('concurrency_key') tag = $page.url.searchParams.get('tag') + worker = $page.url.searchParams.get('worker') // Rest of filters handled by RunsFilter success = ($page.url.searchParams.get('success') ?? undefined) as | 'running' @@ -179,6 +181,7 @@ let runsTable: RunsTable $: (user || + worker || label || folder || path || @@ -209,6 +212,12 @@ searchParams.delete('user') } + if (worker) { + searchParams.set('worker', worker) + } else { + searchParams.delete('worker') + } + if (folder) { searchParams.set('folder', folder) } else { @@ -369,6 +378,7 @@ concurrencyKey = null tag = null schedulePath = undefined + worker = null } function filterByUser(e: CustomEvent) { @@ -389,6 +399,7 @@ concurrencyKey = null tag = null schedulePath = undefined + worker = null } function filterByLabel(e: CustomEvent) { @@ -399,6 +410,7 @@ concurrencyKey = null tag = null schedulePath = undefined + worker = null } function filterByConcurrencyKey(e: CustomEvent) { @@ -409,6 +421,7 @@ concurrencyKey = e.detail tag = null schedulePath = undefined + worker = null } function filterByTag(e: CustomEvent) { @@ -419,6 +432,7 @@ concurrencyKey = null tag = e.detail schedulePath = undefined + worker = null } function filterBySchedule(e: CustomEvent) { @@ -429,6 +443,18 @@ concurrencyKey = null tag = null schedulePath = e.detail + worker = null + } + + function filterByWorker(e: CustomEvent) { + path = null + user = null + folder = null + label = null + concurrencyKey = null + tag = null + schedulePath = undefined + worker = e.detail } let calendarChangeTimeout: NodeJS.Timeout | undefined = undefined @@ -538,6 +564,7 @@ schedulePath = undefined path = null tag = null + worker = null if (success == f) { success = undefined } else { @@ -555,6 +582,7 @@ {user} {folder} {path} + {worker} {label} {success} {isSkipped} @@ -683,6 +711,7 @@ bind:label bind:concurrencyKey bind:tag + bind:worker bind:path bind:success bind:argFilter @@ -1011,6 +1040,7 @@ on:filterByConcurrencyKey={filterByConcurrencyKey} on:filterByTag={filterByTag} on:filterBySchedule={filterBySchedule} + on:filterByWorker={filterByWorker} bind:this={runsTable} /> {:else} @@ -1028,6 +1058,7 @@ {:else} @@ -1070,6 +1101,7 @@ bind:path bind:user bind:label + bind:worker bind:concurrencyKey bind:tag bind:success @@ -1390,6 +1422,7 @@ on:filterByFolder={filterByFolder} on:filterByLabel={filterByLabel} on:filterByConcurrencyKey={filterByConcurrencyKey} + on:filterByWorker={filterByWorker} on:filterByTag={filterByTag} bind:this={runsTable} /> From ead1592399d832039e3e866c554529dfd25a7af9 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Wed, 19 Mar 2025 10:09:41 +0100 Subject: [PATCH 052/739] fix: fix delete completed job --- ...a2aa1e4c11d4860894e9e661b6ee3bccd8522.json | 24 +++++++++++++++++++ backend/windmill-api/src/jobs.rs | 22 +++++++---------- 2 files changed, 33 insertions(+), 13 deletions(-) create mode 100644 backend/.sqlx/query-51ef2ee9dc252f7accc41b89d13a2aa1e4c11d4860894e9e661b6ee3bccd8522.json diff --git a/backend/.sqlx/query-51ef2ee9dc252f7accc41b89d13a2aa1e4c11d4860894e9e661b6ee3bccd8522.json b/backend/.sqlx/query-51ef2ee9dc252f7accc41b89d13a2aa1e4c11d4860894e9e661b6ee3bccd8522.json new file mode 100644 index 0000000000..7cd9c5ce22 --- /dev/null +++ b/backend/.sqlx/query-51ef2ee9dc252f7accc41b89d13a2aa1e4c11d4860894e9e661b6ee3bccd8522.json @@ -0,0 +1,24 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE v2_job_completed c SET\n result = NULL,\n deleted = TRUE\n FROM v2_job j\n WHERE c.id = $1\n AND j.id = c.id\n AND c.workspace_id = $2\n AND ($3::TEXT[] IS NULL OR tag = ANY($3))\n RETURNING c.id\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Uuid" + } + ], + "parameters": { + "Left": [ + "Uuid", + "Text", + "TextArray" + ] + }, + "nullable": [ + false + ] + }, + "hash": "51ef2ee9dc252f7accc41b89d13a2aa1e4c11d4860894e9e661b6ee3bccd8522" +} diff --git a/backend/windmill-api/src/jobs.rs b/backend/windmill-api/src/jobs.rs index 4b5a4f3daf..15da4f29c8 100644 --- a/backend/windmill-api/src/jobs.rs +++ b/backend/windmill-api/src/jobs.rs @@ -5929,6 +5929,7 @@ async fn get_completed_job_result_maybe( async fn delete_completed_job<'a>( authed: ApiAuthed, Extension(user_db): Extension, + Extension(db): Extension, Path((w_id, id)): Path<(String, Uuid)>, ) -> error::Result { check_scopes(&authed, || format!("jobs:deletejob"))?; @@ -5937,9 +5938,8 @@ async fn delete_completed_job<'a>( require_admin(authed.is_admin, &authed.username)?; let tags = get_scope_tags(&authed); - let job_o = sqlx::query_as::<_, CompletedJob>( - "WITH mark_as_deleted AS ( - UPDATE v2_job_completed c SET + let job_o = sqlx::query_scalar!( + "UPDATE v2_job_completed c SET result = NULL, deleted = TRUE FROM v2_job j @@ -5948,15 +5948,15 @@ async fn delete_completed_job<'a>( AND c.workspace_id = $2 AND ($3::TEXT[] IS NULL OR tag = ANY($3)) RETURNING c.id - ) SELECT * FROM v2_as_completed_job WHERE id = (SELECT id FROM mark_as_deleted)", + ", + id, + &w_id, + tags.as_ref().map(|v| v.as_slice()) as Option<&[&str]>, ) - .bind(id) - .bind(&w_id) - .bind(tags.as_ref().map(|v| v.as_slice())) .fetch_optional(&mut *tx) .await?; - let cj = not_found_if_none(job_o, "Completed Job", id.to_string())?; + not_found_if_none(job_o, "Completed Job", id.to_string())?; sqlx::query!("UPDATE v2_job SET args = NULL WHERE id = $1", id) .execute(&mut *tx) @@ -5977,9 +5977,5 @@ async fn delete_completed_job<'a>( .await?; tx.commit().await?; - - let cj = format_completed_job_result(cj); - - let response = Json(cj).into_response(); - Ok(response) + return get_completed_job(OptAuthed(Some(authed)), Extension(db), Path((w_id, id))).await; } From fb532e0b85f58b40253d3251a937709de1e54a89 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Wed, 19 Mar 2025 10:48:43 +0100 Subject: [PATCH 053/739] nit move away from using views --- ...707522e01c4a05104969889b7bb41d6aa509.json} | 6 ++-- ...cacf4b258877375ceff2da640fe65d270794.json} | 6 ++-- ...850e02ffbef25fbfd29cbedc041b0e439e580.json | 29 ------------------- ...9d60e3a3a40b90421aaf589c4c3bcc5a45ec8.json | 29 +++++++++++++++++++ backend/windmill-queue/src/jobs.rs | 20 ++++++------- backend/windmill-worker/src/worker_flow.rs | 2 +- 6 files changed, 46 insertions(+), 46 deletions(-) rename backend/.sqlx/{query-33351de09c72ccc0a39eb977d26f867595813bfa1ae0b26bc4181780801294bf.json => query-05c65ba8a56b3b5f8bd37c30c0c6707522e01c4a05104969889b7bb41d6aa509.json} (56%) rename backend/.sqlx/{query-05d6405b2cc6aabf564a10f05402878e9f2a13e0ce0dad42723f95ac7fb15d4b.json => query-34d22638730d62e8bf7020ae0f7ccacf4b258877375ceff2da640fe65d270794.json} (53%) delete mode 100644 backend/.sqlx/query-74dbd5a09255c30991078492ba3850e02ffbef25fbfd29cbedc041b0e439e580.json create mode 100644 backend/.sqlx/query-7e93c924e3fc51f8c26df26e5d09d60e3a3a40b90421aaf589c4c3bcc5a45ec8.json diff --git a/backend/.sqlx/query-33351de09c72ccc0a39eb977d26f867595813bfa1ae0b26bc4181780801294bf.json b/backend/.sqlx/query-05c65ba8a56b3b5f8bd37c30c0c6707522e01c4a05104969889b7bb41d6aa509.json similarity index 56% rename from backend/.sqlx/query-33351de09c72ccc0a39eb977d26f867595813bfa1ae0b26bc4181780801294bf.json rename to backend/.sqlx/query-05c65ba8a56b3b5f8bd37c30c0c6707522e01c4a05104969889b7bb41d6aa509.json index a3d39e0b59..3a4f5e1b82 100644 --- a/backend/.sqlx/query-33351de09c72ccc0a39eb977d26f867595813bfa1ae0b26bc4181780801294bf.json +++ b/backend/.sqlx/query-05c65ba8a56b3b5f8bd37c30c0c6707522e01c4a05104969889b7bb41d6aa509.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT success AS \"success!\" FROM v2_as_completed_job WHERE id = ANY($1)", + "query": "SELECT status = 'success' OR status = 'skipped' AS \"success!\" FROM v2_job_completed WHERE id = ANY($1)", "describe": { "columns": [ { @@ -15,8 +15,8 @@ ] }, "nullable": [ - true + null ] }, - "hash": "33351de09c72ccc0a39eb977d26f867595813bfa1ae0b26bc4181780801294bf" + "hash": "05c65ba8a56b3b5f8bd37c30c0c6707522e01c4a05104969889b7bb41d6aa509" } diff --git a/backend/.sqlx/query-05d6405b2cc6aabf564a10f05402878e9f2a13e0ce0dad42723f95ac7fb15d4b.json b/backend/.sqlx/query-34d22638730d62e8bf7020ae0f7ccacf4b258877375ceff2da640fe65d270794.json similarity index 53% rename from backend/.sqlx/query-05d6405b2cc6aabf564a10f05402878e9f2a13e0ce0dad42723f95ac7fb15d4b.json rename to backend/.sqlx/query-34d22638730d62e8bf7020ae0f7ccacf4b258877375ceff2da640fe65d270794.json index 195c9bfe92..c0dbe95a6e 100644 --- a/backend/.sqlx/query-05d6405b2cc6aabf564a10f05402878e9f2a13e0ce0dad42723f95ac7fb15d4b.json +++ b/backend/.sqlx/query-34d22638730d62e8bf7020ae0f7ccacf4b258877375ceff2da640fe65d270794.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT success AS \"success!\"\n FROM v2_as_completed_job WHERE id = $1 AND workspace_id = $2", + "query": "SELECT status = 'success' OR status = 'skipped' AS \"success!\"\n FROM v2_job_completed WHERE id = $1 AND workspace_id = $2", "describe": { "columns": [ { @@ -16,8 +16,8 @@ ] }, "nullable": [ - true + null ] }, - "hash": "05d6405b2cc6aabf564a10f05402878e9f2a13e0ce0dad42723f95ac7fb15d4b" + "hash": "34d22638730d62e8bf7020ae0f7ccacf4b258877375ceff2da640fe65d270794" } diff --git a/backend/.sqlx/query-74dbd5a09255c30991078492ba3850e02ffbef25fbfd29cbedc041b0e439e580.json b/backend/.sqlx/query-74dbd5a09255c30991078492ba3850e02ffbef25fbfd29cbedc041b0e439e580.json deleted file mode 100644 index 77515a838f..0000000000 --- a/backend/.sqlx/query-74dbd5a09255c30991078492ba3850e02ffbef25fbfd29cbedc041b0e439e580.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT id AS \"id!\", flow_status AS \"flow_status!: Json\"\n FROM v2_as_completed_job\n WHERE parent_job = $1 AND workspace_id = $2 AND flow_status IS NOT NULL", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id!", - "type_info": "Uuid" - }, - { - "ordinal": 1, - "name": "flow_status!: Json", - "type_info": "Jsonb" - } - ], - "parameters": { - "Left": [ - "Uuid", - "Text" - ] - }, - "nullable": [ - true, - true - ] - }, - "hash": "74dbd5a09255c30991078492ba3850e02ffbef25fbfd29cbedc041b0e439e580" -} diff --git a/backend/.sqlx/query-7e93c924e3fc51f8c26df26e5d09d60e3a3a40b90421aaf589c4c3bcc5a45ec8.json b/backend/.sqlx/query-7e93c924e3fc51f8c26df26e5d09d60e3a3a40b90421aaf589c4c3bcc5a45ec8.json new file mode 100644 index 0000000000..044c752555 --- /dev/null +++ b/backend/.sqlx/query-7e93c924e3fc51f8c26df26e5d09d60e3a3a40b90421aaf589c4c3bcc5a45ec8.json @@ -0,0 +1,29 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT v2_job_completed.id AS \"id!\", flow_status AS \"flow_status!: Json\"\n FROM v2_job_completed\n INNER JOIN v2_job ON (v2_job_completed.id = v2_job.id)\n WHERE parent_job = $1 AND v2_job_completed.workspace_id = $2 AND flow_status IS NOT NULL", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id!", + "type_info": "Uuid" + }, + { + "ordinal": 1, + "name": "flow_status!: Json", + "type_info": "Jsonb" + } + ], + "parameters": { + "Left": [ + "Uuid", + "Text" + ] + }, + "nullable": [ + false, + true + ] + }, + "hash": "7e93c924e3fc51f8c26df26e5d09d60e3a3a40b90421aaf589c4c3bcc5a45ec8" +} diff --git a/backend/windmill-queue/src/jobs.rs b/backend/windmill-queue/src/jobs.rs index 2adaa99772..a8f883367e 100644 --- a/backend/windmill-queue/src/jobs.rs +++ b/backend/windmill-queue/src/jobs.rs @@ -2482,8 +2482,8 @@ pub async fn get_result_and_success_by_id_from_flow( let success = match &job_result { JobResult::SingleJob(job_id) => { sqlx::query_scalar!( - "SELECT success AS \"success!\" - FROM v2_as_completed_job WHERE id = $1 AND workspace_id = $2", + "SELECT status = 'success' OR status = 'skipped' AS \"success!\" + FROM v2_job_completed WHERE id = $1 AND workspace_id = $2", job_id, w_id ) @@ -2495,20 +2495,19 @@ pub async fn get_result_and_success_by_id_from_flow( r#"WITH modules AS ( SELECT jsonb_array_elements(flow_status->'modules') AS module FROM {} - WHERE id = $1 AND workspace_id = $2 + WHERE id = $1 ) SELECT module->>'type' = 'Success' FROM modules - WHERE module->>'id' = $3"#, + WHERE module->>'id' = $2"#, if completed { - "v2_as_completed_job" + "v2_job_completed" } else { - "v2_as_queue" + "v2_job_status" } ); sqlx::query_scalar(&query) .bind(flow_id) - .bind(w_id) .bind(node_id) .fetch_optional(db) .await? @@ -2612,9 +2611,10 @@ async fn get_completed_flow_node_result_rec( }; } else { let subflows = sqlx::query!( - "SELECT id AS \"id!\", flow_status AS \"flow_status!: Json\" - FROM v2_as_completed_job - WHERE parent_job = $1 AND workspace_id = $2 AND flow_status IS NOT NULL", + "SELECT v2_job_completed.id AS \"id!\", flow_status AS \"flow_status!: Json\" + FROM v2_job_completed + INNER JOIN v2_job ON (v2_job_completed.id = v2_job.id) + WHERE parent_job = $1 AND v2_job_completed.workspace_id = $2 AND flow_status IS NOT NULL", id, w_id ) diff --git a/backend/windmill-worker/src/worker_flow.rs b/backend/windmill-worker/src/worker_flow.rs index 6a8544d722..0b1b049f4c 100644 --- a/backend/windmill-worker/src/worker_flow.rs +++ b/backend/windmill-worker/src/worker_flow.rs @@ -573,7 +573,7 @@ pub async fn update_flow_status_after_job_completion_internal( let new_status = if skip_loop_failures || sqlx::query_scalar!( - "SELECT success AS \"success!\" FROM v2_as_completed_job WHERE id = ANY($1)", + "SELECT status = 'success' OR status = 'skipped' AS \"success!\" FROM v2_job_completed WHERE id = ANY($1)", jobs.as_slice() ) .fetch_all(&mut *tx) From 90ccc3aae5f79e701e2c9241ce2cf009674ff356 Mon Sep 17 00:00:00 2001 From: HugoCasa Date: Wed, 19 Mar 2025 10:49:34 +0100 Subject: [PATCH 054/739] feat: add support for python list[x] (#5486) --- backend/parsers/windmill-parser-py/src/lib.rs | 2 +- frontend/package-lock.json | 8 ++++---- frontend/package.json | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/backend/parsers/windmill-parser-py/src/lib.rs b/backend/parsers/windmill-parser-py/src/lib.rs index f5f9574888..7319deb2a7 100644 --- a/backend/parsers/windmill-parser-py/src/lib.rs +++ b/backend/parsers/windmill-parser-py/src/lib.rs @@ -205,7 +205,7 @@ fn parse_expr(e: &Box) -> (Typ, bool) { }; (Typ::Str(values), false) } - "List" => (Typ::List(Box::new(parse_expr(&x.slice).0)), false), + "List" | "list" => (Typ::List(Box::new(parse_expr(&x.slice).0)), false), "Optional" => (parse_expr(&x.slice).0, true), _ => (Typ::Unknown, false), }, diff --git a/frontend/package-lock.json b/frontend/package-lock.json index e411c3f536..a28bf05c57 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -70,7 +70,7 @@ "windmill-parser-wasm-csharp": "^1.437.1", "windmill-parser-wasm-go": "^1.429.0", "windmill-parser-wasm-php": "^1.429.0", - "windmill-parser-wasm-py": "^1.467.1", + "windmill-parser-wasm-py": "^1.477.1", "windmill-parser-wasm-regex": "^1.439.0", "windmill-parser-wasm-rust": "^1.429.0", "windmill-parser-wasm-ts": "^1.429.0", @@ -12594,9 +12594,9 @@ "integrity": "sha512-SGJAtNpfdRZftkGboxWsm/yQDnJBJodwPQUbX2cWk/aoNook6ULesZwsYtBC9WN1VH6TIskLiVPohMmu6jtXmw==" }, "node_modules/windmill-parser-wasm-py": { - "version": "1.467.1", - "resolved": "https://registry.npmjs.org/windmill-parser-wasm-py/-/windmill-parser-wasm-py-1.467.1.tgz", - "integrity": "sha512-Px/UvNjCCScf5V7B90PirxYe7Mn/zMnhk++cLuvlg08j45GR/mzFOIfC7Xk9e555ppX3gTlCk+auH4aIlG2tVw==" + "version": "1.477.1", + "resolved": "https://registry.npmjs.org/windmill-parser-wasm-py/-/windmill-parser-wasm-py-1.477.1.tgz", + "integrity": "sha512-EY3mSMWpqFPzd7fsLg2/hSfQFU8HpW9nplFwm4JHHCDbcTpBzlvzjPJoHAAGO5kMzowAxjqi5ai/mXjeUWuiSg==" }, "node_modules/windmill-parser-wasm-regex": { "version": "1.439.0", diff --git a/frontend/package.json b/frontend/package.json index a7896e2a44..103af06906 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -145,7 +145,7 @@ "windmill-parser-wasm-csharp": "^1.437.1", "windmill-parser-wasm-go": "^1.429.0", "windmill-parser-wasm-php": "^1.429.0", - "windmill-parser-wasm-py": "^1.467.1", + "windmill-parser-wasm-py": "^1.477.1", "windmill-parser-wasm-regex": "^1.439.0", "windmill-parser-wasm-rust": "^1.429.0", "windmill-parser-wasm-ts": "^1.429.0", From 551c0ecd6a83671d60ede5a81f656c27ddbdbe4c Mon Sep 17 00:00:00 2001 From: HugoCasa Date: Wed, 19 Mar 2025 10:51:30 +0100 Subject: [PATCH 055/739] perf: improve perf of get completed flow node (#5418) * perf: improve perf of get completed flow node * better * nit * nits --------- Co-authored-by: Ruben Fiszel --- ...79e9bd7e1b8348e91b33030df7181a55798a6.json | 30 ++++++++++++++++ ...fab3b6f26ccbd822fc05b7a0fb3d6a17c5435.json | 35 +++++++++++++++++++ ...0c36c3726b2da9ff3592589ac7e83df1c537c.json | 29 --------------- backend/windmill-queue/src/jobs.rs | 33 +++++++++-------- 4 files changed, 84 insertions(+), 43 deletions(-) create mode 100644 backend/.sqlx/query-433da02be85347333323480f7f279e9bd7e1b8348e91b33030df7181a55798a6.json create mode 100644 backend/.sqlx/query-77f12f22d7c9da1799e5720c9a8fab3b6f26ccbd822fc05b7a0fb3d6a17c5435.json delete mode 100644 backend/.sqlx/query-8123ba05f6e7b9bd395175ee4ec0c36c3726b2da9ff3592589ac7e83df1c537c.json diff --git a/backend/.sqlx/query-433da02be85347333323480f7f279e9bd7e1b8348e91b33030df7181a55798a6.json b/backend/.sqlx/query-433da02be85347333323480f7f279e9bd7e1b8348e91b33030df7181a55798a6.json new file mode 100644 index 0000000000..bee9c556b2 --- /dev/null +++ b/backend/.sqlx/query-433da02be85347333323480f7f279e9bd7e1b8348e91b33030df7181a55798a6.json @@ -0,0 +1,30 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT j.id, jc.flow_status AS \"flow_status!: Json\"\n FROM v2_job j\n JOIN v2_job_completed jc ON j.id = jc.id\n WHERE j.parent_job = $1 AND j.workspace_id = $2 AND j.created_at >= $3 AND jc.flow_status IS NOT NULL", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Uuid" + }, + { + "ordinal": 1, + "name": "flow_status!: Json", + "type_info": "Jsonb" + } + ], + "parameters": { + "Left": [ + "Uuid", + "Text", + "Timestamptz" + ] + }, + "nullable": [ + false, + true + ] + }, + "hash": "433da02be85347333323480f7f279e9bd7e1b8348e91b33030df7181a55798a6" +} diff --git a/backend/.sqlx/query-77f12f22d7c9da1799e5720c9a8fab3b6f26ccbd822fc05b7a0fb3d6a17c5435.json b/backend/.sqlx/query-77f12f22d7c9da1799e5720c9a8fab3b6f26ccbd822fc05b7a0fb3d6a17c5435.json new file mode 100644 index 0000000000..42289a7791 --- /dev/null +++ b/backend/.sqlx/query-77f12f22d7c9da1799e5720c9a8fab3b6f26ccbd822fc05b7a0fb3d6a17c5435.json @@ -0,0 +1,35 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT jc.id, jc.flow_status AS \"flow_status!: Json\", j.created_at\n FROM v2_job_completed jc\n JOIN v2_job j ON j.id = jc.id\n WHERE jc.id = $1 AND jc.workspace_id = $2 AND jc.flow_status IS NOT NULL", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Uuid" + }, + { + "ordinal": 1, + "name": "flow_status!: Json", + "type_info": "Jsonb" + }, + { + "ordinal": 2, + "name": "created_at", + "type_info": "Timestamptz" + } + ], + "parameters": { + "Left": [ + "Uuid", + "Text" + ] + }, + "nullable": [ + false, + true, + false + ] + }, + "hash": "77f12f22d7c9da1799e5720c9a8fab3b6f26ccbd822fc05b7a0fb3d6a17c5435" +} diff --git a/backend/.sqlx/query-8123ba05f6e7b9bd395175ee4ec0c36c3726b2da9ff3592589ac7e83df1c537c.json b/backend/.sqlx/query-8123ba05f6e7b9bd395175ee4ec0c36c3726b2da9ff3592589ac7e83df1c537c.json deleted file mode 100644 index 1126431b46..0000000000 --- a/backend/.sqlx/query-8123ba05f6e7b9bd395175ee4ec0c36c3726b2da9ff3592589ac7e83df1c537c.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT id, flow_status AS \"flow_status!: Json\"\n FROM v2_job_completed WHERE id = $1 AND workspace_id = $2", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Uuid" - }, - { - "ordinal": 1, - "name": "flow_status!: Json", - "type_info": "Jsonb" - } - ], - "parameters": { - "Left": [ - "Uuid", - "Text" - ] - }, - "nullable": [ - false, - true - ] - }, - "hash": "8123ba05f6e7b9bd395175ee4ec0c36c3726b2da9ff3592589ac7e83df1c537c" -} diff --git a/backend/windmill-queue/src/jobs.rs b/backend/windmill-queue/src/jobs.rs index a8f883367e..7f1473055a 100644 --- a/backend/windmill-queue/src/jobs.rs +++ b/backend/windmill-queue/src/jobs.rs @@ -2591,7 +2591,8 @@ pub async fn get_result_by_id_from_running_flow_inner( async fn get_completed_flow_node_result_rec( db: &Pool, w_id: &str, - subflows: impl std::iter::Iterator, + created_at: DateTime, + subflows: Vec<(Uuid, FlowStatus)>, node_id: &str, ) -> error::Result> { for (id, flow_status) in subflows { @@ -2611,19 +2612,19 @@ async fn get_completed_flow_node_result_rec( }; } else { let subflows = sqlx::query!( - "SELECT v2_job_completed.id AS \"id!\", flow_status AS \"flow_status!: Json\" - FROM v2_job_completed - INNER JOIN v2_job ON (v2_job_completed.id = v2_job.id) - WHERE parent_job = $1 AND v2_job_completed.workspace_id = $2 AND flow_status IS NOT NULL", + "SELECT j.id, jc.flow_status AS \"flow_status!: Json\" + FROM v2_job j + JOIN v2_job_completed jc ON j.id = jc.id + WHERE j.parent_job = $1 AND j.workspace_id = $2 AND j.created_at >= $3 AND jc.flow_status IS NOT NULL", id, - w_id + w_id, + created_at ) .map(|record| (record.id, record.flow_status.0)) .fetch_all(db) - .await? - .into_iter(); + .await?; match Box::pin(get_completed_flow_node_result_rec( - db, w_id, subflows, node_id, + db, w_id, created_at, subflows, node_id, )) .await? { @@ -2643,22 +2644,26 @@ async fn get_result_by_id_from_original_flow_inner( node_id: &str, ) -> error::Result { let flow_job = sqlx::query!( - "SELECT id, flow_status AS \"flow_status!: Json\" - FROM v2_job_completed WHERE id = $1 AND workspace_id = $2", + "SELECT jc.id, jc.flow_status AS \"flow_status!: Json\", j.created_at + FROM v2_job_completed jc + JOIN v2_job j ON j.id = jc.id + WHERE jc.id = $1 AND jc.workspace_id = $2 AND jc.flow_status IS NOT NULL", completed_flow_id, w_id ) - .map(|record| (record.id, record.flow_status.0)) + .map(|record| (record.id, record.flow_status.0, record.created_at)) .fetch_optional(db) .await?; - let flow_job = not_found_if_none( + let (id, flow_status, created_at) = not_found_if_none( flow_job, "Root completed job", format!("root: {}, id: {}", completed_flow_id, node_id), )?; - match get_completed_flow_node_result_rec(db, w_id, [flow_job].into_iter(), node_id).await? { + match get_completed_flow_node_result_rec(db, w_id, created_at, vec![(id, flow_status)], node_id) + .await? + { Some(res) => Ok(res), None => Err(Error::NotFound(format!( "Flow result by id not found going top-down from {}, (id: {})", From 4bc5c04cd40e23ef9d13ba48d28612d5a865796e Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Wed, 19 Mar 2025 11:03:09 +0100 Subject: [PATCH 056/739] fix: label not part of default variant arg --- frontend/src/lib/components/ArgInput.svelte | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frontend/src/lib/components/ArgInput.svelte b/frontend/src/lib/components/ArgInput.svelte index 8bf6c53f1a..d9c5726638 100644 --- a/frontend/src/lib/components/ArgInput.svelte +++ b/frontend/src/lib/components/ArgInput.svelte @@ -131,7 +131,9 @@ await tick() value = existingValue } else { - oneOfSelected = oneOf[0]['title'] + const label = oneOf[0]['title'] + oneOfSelected = label + value = { ...(typeof value === 'object' ? value ?? {} : {}), label } } } } From 7878652827d9b167896563e85e1ee254ff6e22c1 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Wed, 19 Mar 2025 11:28:15 +0100 Subject: [PATCH 057/739] improve oneOf default behavior --- frontend/src/lib/components/ArgInput.svelte | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/frontend/src/lib/components/ArgInput.svelte b/frontend/src/lib/components/ArgInput.svelte index d9c5726638..3f59696638 100644 --- a/frontend/src/lib/components/ArgInput.svelte +++ b/frontend/src/lib/components/ArgInput.svelte @@ -123,7 +123,7 @@ if ( oneOf && oneOf.length >= 2 && - (!oneOfSelected || !oneOf.some((o) => o.title === oneOfSelected)) + (!oneOfSelected || !oneOf.some((o) => o.title === oneOfSelected) || !value) ) { if (value && value['label'] && oneOf.some((o) => o.title === value['label'])) { const existingValue = JSON.parse(JSON.stringify(value)) @@ -173,6 +173,7 @@ } if ((value == undefined || value == null) && !ignoreValueUndefined) { value = structuredClone(defaultValue) + console.log('computeDefaultValue', value, defaultValue) if (defaultValue === undefined || defaultValue === null) { if (inputCat === 'string') { value = nullable ? null : '' @@ -184,6 +185,7 @@ value = [] } } else if (inputCat === 'object') { + console.log('computeDefaultValue object', value) evalValueToRaw() } } @@ -275,11 +277,13 @@ rawValue = newRawValue rawValue != undefined && editor?.getCode() != rawValue && editor?.setCode(rawValue) } - // console.log('evalValueToRaw', value, rawValue, inputCat, label) } let setCodeDisabled = false - $: (inputCat && (isObjectCat(inputCat) || isRawStringEditor(inputCat)) && evalValueToRaw()) || + $: (inputCat && + (isObjectCat(inputCat) || isRawStringEditor(inputCat)) && + !oneOf && + evalValueToRaw()) || value let timeout: NodeJS.Timeout | undefined = undefined @@ -296,7 +300,6 @@ onMount(() => { computeDefaultValue() - // console.log('onMount', value, rawValue, inputCat) evalValueToRaw() }) From 6ed2c6c9088fb2c0ba9b3e2a5884b5267e356dc2 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Wed, 19 Mar 2025 11:59:31 +0100 Subject: [PATCH 058/739] improve apptextinput initialization --- .../apps/components/inputs/AppTextInput.svelte | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/frontend/src/lib/components/apps/components/inputs/AppTextInput.svelte b/frontend/src/lib/components/apps/components/inputs/AppTextInput.svelte index 546125c410..5aaa2a5534 100644 --- a/frontend/src/lib/components/apps/components/inputs/AppTextInput.svelte +++ b/frontend/src/lib/components/apps/components/inputs/AppTextInput.svelte @@ -40,12 +40,14 @@ const iterContext = getContext('ListWrapperContext') const listInputs: ListInputs | undefined = getContext('ListInputs') - let value: string | undefined = resolvedConfig.defaultValue - let outputs = initOutput($worldStore, id, { - result: value ?? '' + result: undefined as string | undefined }) + let initValue = outputs?.result.peak() + let value: string | undefined = + initValue && initValue != '' ? initValue : resolvedConfig.defaultValue + onDestroy(() => { listInputs?.remove(id) }) @@ -53,12 +55,16 @@ $componentControl[id] = { setValue(nvalue: string) { value = nvalue + outputs?.result.set(value) } } + let initialHandleDefault = true $: handleDefault(resolvedConfig.defaultValue) - $: { + $: value && onValueChange() + + function onValueChange() { let val = value ?? '' outputs?.result.set(val) if (iterContext && listInputs) { @@ -67,6 +73,10 @@ } function handleDefault(defaultValue: string | undefined) { + if (initialHandleDefault) { + initialHandleDefault = false + return + } value = defaultValue } From a6fe26af3ddaad00b60d6dfcb19ac9980a80f6d6 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Wed, 19 Mar 2025 13:03:39 +0100 Subject: [PATCH 059/739] handle better appschemaform initialization --- frontend/src/lib/components/ArgInput.svelte | 2 -- .../components/apps/components/buttons/AppSchemaForm.svelte | 3 ++- .../components/apps/components/inputs/AppTextInput.svelte | 4 +++- package-lock.json | 6 ++++++ 4 files changed, 11 insertions(+), 4 deletions(-) create mode 100644 package-lock.json diff --git a/frontend/src/lib/components/ArgInput.svelte b/frontend/src/lib/components/ArgInput.svelte index 3f59696638..a9ff37ec82 100644 --- a/frontend/src/lib/components/ArgInput.svelte +++ b/frontend/src/lib/components/ArgInput.svelte @@ -173,7 +173,6 @@ } if ((value == undefined || value == null) && !ignoreValueUndefined) { value = structuredClone(defaultValue) - console.log('computeDefaultValue', value, defaultValue) if (defaultValue === undefined || defaultValue === null) { if (inputCat === 'string') { value = nullable ? null : '' @@ -185,7 +184,6 @@ value = [] } } else if (inputCat === 'object') { - console.log('computeDefaultValue object', value) evalValueToRaw() } } diff --git a/frontend/src/lib/components/apps/components/buttons/AppSchemaForm.svelte b/frontend/src/lib/components/apps/components/buttons/AppSchemaForm.svelte index ee1b5a622d..50bc493ccf 100644 --- a/frontend/src/lib/components/apps/components/buttons/AppSchemaForm.svelte +++ b/frontend/src/lib/components/apps/components/buttons/AppSchemaForm.svelte @@ -50,7 +50,7 @@ }) let result: Schema | undefined = undefined - let args: Record = {} + let args: Record = outputs?.values?.peak() ?? {} function handleArgsChange() { const newArgs: Record = {} @@ -76,6 +76,7 @@ $componentControl[id] = { setValue(nvalue: any) { args = nvalue + outputs.values.set(nvalue, false) }, invalidate(key: string, error: string) { schemaForm?.invalidate(key, error) diff --git a/frontend/src/lib/components/apps/components/inputs/AppTextInput.svelte b/frontend/src/lib/components/apps/components/inputs/AppTextInput.svelte index 5aaa2a5534..c2ffafa7ea 100644 --- a/frontend/src/lib/components/apps/components/inputs/AppTextInput.svelte +++ b/frontend/src/lib/components/apps/components/inputs/AppTextInput.svelte @@ -75,7 +75,9 @@ function handleDefault(defaultValue: string | undefined) { if (initialHandleDefault) { initialHandleDefault = false - return + if (value != undefined && value != '') { + return + } } value = defaultValue } diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000000..d564b314a4 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "windmill", + "lockfileVersion": 3, + "requires": true, + "packages": {} +} From 93c2172279ef015db4d3a71793248635b60d6272 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Wed, 19 Mar 2025 14:23:19 +0100 Subject: [PATCH 060/739] improve text default input behavior in lists --- .../lib/components/apps/components/buttons/AppSchemaForm.svelte | 2 +- .../lib/components/apps/components/inputs/AppTextInput.svelte | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/lib/components/apps/components/buttons/AppSchemaForm.svelte b/frontend/src/lib/components/apps/components/buttons/AppSchemaForm.svelte index 50bc493ccf..7ab70a7669 100644 --- a/frontend/src/lib/components/apps/components/buttons/AppSchemaForm.svelte +++ b/frontend/src/lib/components/apps/components/buttons/AppSchemaForm.svelte @@ -50,7 +50,7 @@ }) let result: Schema | undefined = undefined - let args: Record = outputs?.values?.peak() ?? {} + let args: Record = !iterContext ? outputs?.values?.peak() ?? {} : {} function handleArgsChange() { const newArgs: Record = {} diff --git a/frontend/src/lib/components/apps/components/inputs/AppTextInput.svelte b/frontend/src/lib/components/apps/components/inputs/AppTextInput.svelte index c2ffafa7ea..57a1e24fd8 100644 --- a/frontend/src/lib/components/apps/components/inputs/AppTextInput.svelte +++ b/frontend/src/lib/components/apps/components/inputs/AppTextInput.svelte @@ -46,7 +46,7 @@ let initValue = outputs?.result.peak() let value: string | undefined = - initValue && initValue != '' ? initValue : resolvedConfig.defaultValue + !iterContext && initValue && initValue != '' ? initValue : resolvedConfig.defaultValue onDestroy(() => { listInputs?.remove(id) From f7edbd106f3db3de9e178acafb9e1f91dd923ca6 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Wed, 19 Mar 2025 15:13:46 +0100 Subject: [PATCH 061/739] improve default behavior of number and currency input --- .../components/inputs/AppNumberInput.svelte | 30 +++++++++++++------ .../inputs/currency/AppCurrencyInput.svelte | 17 +++++++++-- 2 files changed, 35 insertions(+), 12 deletions(-) diff --git a/frontend/src/lib/components/apps/components/inputs/AppNumberInput.svelte b/frontend/src/lib/components/apps/components/inputs/AppNumberInput.svelte index e4496c9849..29dccf3b88 100644 --- a/frontend/src/lib/components/apps/components/inputs/AppNumberInput.svelte +++ b/frontend/src/lib/components/apps/components/inputs/AppNumberInput.svelte @@ -32,14 +32,6 @@ configuration ) - let value: number | undefined = resolvedConfig.defaultValue - - $componentControl[id] = { - setValue(nvalue: number | undefined) { - value = nvalue - } - } - onDestroy(() => { listInputs?.remove(id) }) @@ -48,9 +40,23 @@ result: undefined as number | undefined }) + let initValue = outputs?.result.peak() + let value: number | undefined = + !iterContext && initValue != undefined ? initValue : resolvedConfig.defaultValue + + $componentControl[id] = { + setValue(nvalue: number | undefined) { + value = nvalue + outputs?.result.set(value) + } + } + let initialHandleDefault = true + $: handleDefault(resolvedConfig.defaultValue) - $: { + $: value && onChangeValue() + + function onChangeValue() { outputs?.result.set(value) if (iterContext && listInputs) { listInputs.set(id, value) @@ -58,6 +64,12 @@ } function handleDefault(defaultValue: number | undefined) { + if (initialHandleDefault) { + initialHandleDefault = false + if (value != undefined) { + return + } + } value = defaultValue } diff --git a/frontend/src/lib/components/apps/components/inputs/currency/AppCurrencyInput.svelte b/frontend/src/lib/components/apps/components/inputs/currency/AppCurrencyInput.svelte index 143a6a9858..4448cfa4d3 100644 --- a/frontend/src/lib/components/apps/components/inputs/currency/AppCurrencyInput.svelte +++ b/frontend/src/lib/components/apps/components/inputs/currency/AppCurrencyInput.svelte @@ -41,11 +41,14 @@ configuration ) - let value: number | undefined = resolvedConfig.defaultValue + let initValue = outputs?.result.peak() + let value: number | undefined = + !iterContext && initValue != undefined ? initValue : resolvedConfig.defaultValue $componentControl[id] = { setValue(nvalue: number) { value = nvalue + outputs?.result.set(value ?? null) } } @@ -56,15 +59,23 @@ } } + let initialHandleDefault = true + + $: handleDefault(resolvedConfig.defaultValue) + function handleDefault(dflt: number | undefined) { + if (initialHandleDefault) { + initialHandleDefault = false + if (value != undefined) { + return + } + } value = dflt handleInput() } $: value != undefined && handleInput() - $: handleDefault(resolvedConfig.defaultValue) - let css = initCss($app.css?.currencycomponent, customCss) From fe20e3374f24fc644036a6d19e34421aeb839a73 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Wed, 19 Mar 2025 17:02:32 +0100 Subject: [PATCH 062/739] feat: eager app mode --- .../components/inputs/AppDateTimeInput.svelte | 49 ++++++++++--- .../apps/editor/RecomputeAllComponents.svelte | 2 +- .../apps/editor/SubGridEditor.svelte | 2 +- .../editor/contextPanel/LazyModePanel.svelte | 70 +++++++++++++------ frontend/src/lib/components/apps/types.ts | 1 + 5 files changed, 89 insertions(+), 35 deletions(-) diff --git a/frontend/src/lib/components/apps/components/inputs/AppDateTimeInput.svelte b/frontend/src/lib/components/apps/components/inputs/AppDateTimeInput.svelte index 7dc67ad5a6..276d542b79 100644 --- a/frontend/src/lib/components/apps/components/inputs/AppDateTimeInput.svelte +++ b/frontend/src/lib/components/apps/components/inputs/AppDateTimeInput.svelte @@ -1,11 +1,13 @@ -{#if everVisible} +{#if everVisible || $app.eagerRendering}
@@ -19,32 +26,51 @@ When lazy mode is enabled, components are not rendered until they are needed. This can significantly improve the performance of your app, especially on mobile devices.
- You can enable lazy mode below, but you will need to declare the list of components whose initialization - is expected to see initialized before the initial refresh of the app happens. + Semi-Lazy mode is enabled by default, where components are initialized but are in a hidden state. + Lazy mode is when components are not initialized at all. - { - $app.lazyInitRequire = e.detail ? [] : undefined - code = JSON.stringify($app.lazyInitRequire) + { + if (e.detail == 'eager') { + $app.eagerRendering = true + $app.lazyInitRequire = undefined + } else if (e.detail == 'semi-lazy') { + $app.eagerRendering = undefined + $app.lazyInitRequire = undefined + } else { + $app.eagerRendering = undefined + $app.lazyInitRequire = [] + code = JSON.stringify($app.lazyInitRequire) + } }} - options={{ - right: 'Lazy mode' - }} - /> - -
- {#if $app.lazyInitRequire != undefined} + let:item + > + + + + + {#if selectedRendering == 'eager'} +
+ In eager mode, all components will be fully initialized, even when they are not visible. +
+ {:else if selectedRendering == 'semi-lazy'} +
+ In semi-lazy mode, components will be semi-initialized when hidden. That is the default + mode. +
+ {:else if selectedRendering == 'lazy'} +
{'e.g: ["a", "b"]'}, no need to put background runnables ids - {:else} - Without lazy mode, all components' initialization will be waited on the initial refresh. - {/if} -
+
+ {/if}
diff --git a/frontend/src/lib/components/apps/types.ts b/frontend/src/lib/components/apps/types.ts index 3317709ce0..e58618f99b 100644 --- a/frontend/src/lib/components/apps/types.ts +++ b/frontend/src/lib/components/apps/types.ts @@ -165,6 +165,7 @@ export type App = { subgrids?: Record theme: AppTheme | undefined lazyInitRequire?: string[] | undefined + eagerRendering?: boolean | undefined hideLegacyTopBar?: boolean | undefined mobileViewOnSmallerScreens?: boolean | undefined version?: number From beb4be8fec124534451d6f109a00e3c14bb4aea1 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Wed, 19 Mar 2025 17:34:07 +0100 Subject: [PATCH 063/739] rm package-logkc --- package-lock.json | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index d564b314a4..0000000000 --- a/package-lock.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "windmill", - "lockfileVersion": 3, - "requires": true, - "packages": {} -} From 278b17181d4c98bc38266023b70c2bc97a6600f0 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Wed, 19 Mar 2025 17:47:20 +0100 Subject: [PATCH 064/739] improve eager mode --- .../lib/components/apps/editor/component/Component.svelte | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/frontend/src/lib/components/apps/editor/component/Component.svelte b/frontend/src/lib/components/apps/editor/component/Component.svelte index 748a04991b..129f1e2329 100644 --- a/frontend/src/lib/components/apps/editor/component/Component.svelte +++ b/frontend/src/lib/components/apps/editor/component/Component.svelte @@ -1,7 +1,9 @@ -{#if everRender} +{#if everRender || $app.eagerRendering} Date: Wed, 19 Mar 2025 18:14:21 +0100 Subject: [PATCH 065/739] small init fix --- frontend/src/lib/components/apps/svelte-grid/Grid.svelte | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frontend/src/lib/components/apps/svelte-grid/Grid.svelte b/frontend/src/lib/components/apps/svelte-grid/Grid.svelte index fa74b33d9a..a9ad1e1ee5 100644 --- a/frontend/src/lib/components/apps/svelte-grid/Grid.svelte +++ b/frontend/src/lib/components/apps/svelte-grid/Grid.svelte @@ -84,7 +84,9 @@ const sizeObserver = new ResizeObserver((entries) => { requestAnimationFrame(() => { let width = entries[0].contentRect.width - + if (width === 0) { + width = 1 + } if (width === containerWidth) { mounted = true return From 409167ea79616b5b24f9412ab3a2150777147ea2 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Wed, 19 Mar 2025 18:58:54 +0100 Subject: [PATCH 066/739] app frontend fix for 0 width containers --- frontend/src/lib/components/apps/editor/GridViewer.svelte | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frontend/src/lib/components/apps/editor/GridViewer.svelte b/frontend/src/lib/components/apps/editor/GridViewer.svelte index c38f440181..a4e2c2847e 100644 --- a/frontend/src/lib/components/apps/editor/GridViewer.svelte +++ b/frontend/src/lib/components/apps/editor/GridViewer.svelte @@ -64,7 +64,9 @@ const sizeObserver = new ResizeObserver((entries) => { requestAnimationFrame(() => { let width = entries[0].contentRect.width - + if (width === 0) { + width = 1 + } if (width === containerWidth) return if ($app.mobileViewOnSmallerScreens != false || !getComputedCols) { getComputedCols = getColumn(parentWidth ?? width, cols) From 6b4c25d0d808a841dbfeaf91d29437071128266a Mon Sep 17 00:00:00 2001 From: Guilhem Date: Wed, 19 Mar 2025 18:40:53 +0000 Subject: [PATCH 067/739] Fix: set proper slot for MobileFitlers popover (#5491) --- .../src/lib/components/auditLogs/AuditLogMobileFilters.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/lib/components/auditLogs/AuditLogMobileFilters.svelte b/frontend/src/lib/components/auditLogs/AuditLogMobileFilters.svelte index d9c0f5dd49..2bb9ed0756 100644 --- a/frontend/src/lib/components/auditLogs/AuditLogMobileFilters.svelte +++ b/frontend/src/lib/components/auditLogs/AuditLogMobileFilters.svelte @@ -8,7 +8,7 @@ floatingConfig={{ strategy: 'absolute', placement: 'bottom-end' }} contentClasses="border rounded-lg shadow-lg p-4 flex flex-col w-80 pt-8 bg-surface" > - + From 6634c82e209a36021e5b0c392de433f48f3d8b80 Mon Sep 17 00:00:00 2001 From: wendrul <53628737+wendrul@users.noreply.github.com> Date: Wed, 19 Mar 2025 19:41:10 +0100 Subject: [PATCH 068/739] feat: backend arg schema validation (#5455) * Make schema validation struct Schema Validation rules that are constructed from the schema or from the MainArgSig(TODO). * Make other validator builder * Fail dependency job like with lockfile failing for schema validator * Add last types + tests * Remove unused dependency * fix typos * Migration ID was colliding with another, changed it manually * Add Oneof + other fixes * fix: cache for querying scripts correclty handles ScriptMetadata * Add cache for schema validation from main arg sig * Prepare sqlx * Remove default features * Feature flags * Fix down migration table name * cleanup: put validation logic inside a function * Refactor to cache the should_validate boolean Changed the schemavalidators cache to take in an Option, effectively storing the `should_validate_schema` information. Also pass the schema when avaialble to construct the schema validator * Add other job kinds to u8 cache key just in case * Only cache if not preview --- ...84a2ea952e782fd52eb3088454690bd13dd1.json} | 16 +- ...8234ca7d1efeee9661f3901f298da375e73f7.json | 30 +- ...dcc40f463cbc52d94ed9315cf9a547d4c89f2.json | 30 +- ...867540ab6bb02ac6bf82decc220dce0ab048.json} | 7 +- backend/Cargo.toml | 2 +- ...5141517_backend_schema_validation.down.sql | 3 + ...205141517_backend_schema_validation.up.sql | 3 + backend/parsers/windmill-parser-py/src/lib.rs | 2 + backend/parsers/windmill-parser-ts/src/lib.rs | 2 + backend/windmill-api/src/scripts.rs | 23 +- backend/windmill-common/src/cache.rs | 58 +- backend/windmill-common/src/error.rs | 2 + backend/windmill-common/src/lib.rs | 1 + backend/windmill-common/src/schema.rs | 653 ++++++++++++++++++ backend/windmill-worker/src/lib.rs | 1 + backend/windmill-worker/src/schema.rs | 94 +++ backend/windmill-worker/src/worker.rs | 204 +++++- .../windmill-worker/src/worker_lockfiles.rs | 30 +- 18 files changed, 1081 insertions(+), 80 deletions(-) rename backend/.sqlx/{query-d55eabd42559893bdf91c5fdab1ae58006013be26fcb9367b3c6830f38749799.json => query-03ae5b1c912b13a8a7aadf50cb4984a2ea952e782fd52eb3088454690bd13dd1.json} (74%) rename backend/.sqlx/{query-bc00efe12901bc7b49c7892d2d9da675e0eaf5e6cc013149740bc778987a1006.json => query-d15f02f090b8d1a7e816fe11b2e0867540ab6bb02ac6bf82decc220dce0ab048.json} (86%) create mode 100644 backend/migrations/20250205141517_backend_schema_validation.down.sql create mode 100644 backend/migrations/20250205141517_backend_schema_validation.up.sql create mode 100644 backend/windmill-common/src/schema.rs create mode 100644 backend/windmill-worker/src/schema.rs diff --git a/backend/.sqlx/query-d55eabd42559893bdf91c5fdab1ae58006013be26fcb9367b3c6830f38749799.json b/backend/.sqlx/query-03ae5b1c912b13a8a7aadf50cb4984a2ea952e782fd52eb3088454690bd13dd1.json similarity index 74% rename from backend/.sqlx/query-d55eabd42559893bdf91c5fdab1ae58006013be26fcb9367b3c6830f38749799.json rename to backend/.sqlx/query-03ae5b1c912b13a8a7aadf50cb4984a2ea952e782fd52eb3088454690bd13dd1.json index 93a338c13f..60404da57c 100644 --- a/backend/.sqlx/query-d55eabd42559893bdf91c5fdab1ae58006013be26fcb9367b3c6830f38749799.json +++ b/backend/.sqlx/query-03ae5b1c912b13a8a7aadf50cb4984a2ea952e782fd52eb3088454690bd13dd1.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT content AS \"content!: String\",\n lock AS \"lock: String\", language AS \"language: Option\", envs AS \"envs: Vec\", codebase LIKE '%.tar' as use_tar FROM script WHERE hash = $1 LIMIT 1", + "query": "SELECT content AS \"content!: String\",\n lock AS \"lock: String\", language AS \"language: Option\", envs AS \"envs: Vec\", schema AS \"schema: String\", schema_validation AS \"schema_validation: bool\", codebase LIKE '%.tar' as use_tar FROM script WHERE hash = $1 LIMIT 1", "describe": { "columns": [ { @@ -52,6 +52,16 @@ }, { "ordinal": 4, + "name": "schema: String", + "type_info": "Json" + }, + { + "ordinal": 5, + "name": "schema_validation: bool", + "type_info": "Bool" + }, + { + "ordinal": 6, "name": "use_tar", "type_info": "Bool" } @@ -66,8 +76,10 @@ true, false, true, + true, + false, null ] }, - "hash": "d55eabd42559893bdf91c5fdab1ae58006013be26fcb9367b3c6830f38749799" + "hash": "03ae5b1c912b13a8a7aadf50cb4984a2ea952e782fd52eb3088454690bd13dd1" } diff --git a/backend/.sqlx/query-08f288d2781d823e109a9e5b8848234ca7d1efeee9661f3901f298da375e73f7.json b/backend/.sqlx/query-08f288d2781d823e109a9e5b8848234ca7d1efeee9661f3901f298da375e73f7.json index 4bcf3c6ce3..2be39fce26 100644 --- a/backend/.sqlx/query-08f288d2781d823e109a9e5b8848234ca7d1efeee9661f3901f298da375e73f7.json +++ b/backend/.sqlx/query-08f288d2781d823e109a9e5b8848234ca7d1efeee9661f3901f298da375e73f7.json @@ -130,28 +130,28 @@ }, { "ordinal": 25, - "name": "ai_models", - "type_info": "VarcharArray" - }, - { - "ordinal": 26, - "name": "code_completion_model", - "type_info": "Varchar" - }, - { - "ordinal": 27, "name": "teams_command_script", "type_info": "Text" }, { - "ordinal": 28, + "ordinal": 26, "name": "teams_team_id", "type_info": "Text" }, { - "ordinal": 29, + "ordinal": 27, "name": "teams_team_name", "type_info": "Text" + }, + { + "ordinal": 28, + "name": "ai_models", + "type_info": "VarcharArray" + }, + { + "ordinal": 29, + "name": "code_completion_model", + "type_info": "Varchar" } ], "parameters": { @@ -185,10 +185,10 @@ true, true, true, + true, + true, + true, false, - true, - true, - true, true ] }, diff --git a/backend/.sqlx/query-55cb03040bc2a8c53dd7fbb42bbdcc40f463cbc52d94ed9315cf9a547d4c89f2.json b/backend/.sqlx/query-55cb03040bc2a8c53dd7fbb42bbdcc40f463cbc52d94ed9315cf9a547d4c89f2.json index 14685a8bfa..9243288c9d 100644 --- a/backend/.sqlx/query-55cb03040bc2a8c53dd7fbb42bbdcc40f463cbc52d94ed9315cf9a547d4c89f2.json +++ b/backend/.sqlx/query-55cb03040bc2a8c53dd7fbb42bbdcc40f463cbc52d94ed9315cf9a547d4c89f2.json @@ -130,28 +130,28 @@ }, { "ordinal": 25, - "name": "ai_models", - "type_info": "VarcharArray" - }, - { - "ordinal": 26, - "name": "code_completion_model", - "type_info": "Varchar" - }, - { - "ordinal": 27, "name": "teams_command_script", "type_info": "Text" }, { - "ordinal": 28, + "ordinal": 26, "name": "teams_team_id", "type_info": "Text" }, { - "ordinal": 29, + "ordinal": 27, "name": "teams_team_name", "type_info": "Text" + }, + { + "ordinal": 28, + "name": "ai_models", + "type_info": "VarcharArray" + }, + { + "ordinal": 29, + "name": "code_completion_model", + "type_info": "Varchar" } ], "parameters": { @@ -185,10 +185,10 @@ true, true, true, + true, + true, + true, false, - true, - true, - true, true ] }, diff --git a/backend/.sqlx/query-bc00efe12901bc7b49c7892d2d9da675e0eaf5e6cc013149740bc778987a1006.json b/backend/.sqlx/query-d15f02f090b8d1a7e816fe11b2e0867540ab6bb02ac6bf82decc220dce0ab048.json similarity index 86% rename from backend/.sqlx/query-bc00efe12901bc7b49c7892d2d9da675e0eaf5e6cc013149740bc778987a1006.json rename to backend/.sqlx/query-d15f02f090b8d1a7e816fe11b2e0867540ab6bb02ac6bf82decc220dce0ab048.json index 67611f00dc..ba3589bf24 100644 --- a/backend/.sqlx/query-bc00efe12901bc7b49c7892d2d9da675e0eaf5e6cc013149740bc778987a1006.json +++ b/backend/.sqlx/query-d15f02f090b8d1a7e816fe11b2e0867540ab6bb02ac6bf82decc220dce0ab048.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "INSERT INTO script (workspace_id, hash, path, parent_hashes, summary, description, content, created_by, schema, is_template, extra_perms, lock, language, kind, tag, draft_only, envs, concurrent_limit, concurrency_time_window_s, cache_ttl, dedicated_worker, ws_error_handler_muted, priority, restart_unless_cancelled, delete_after_use, timeout, concurrency_key, visible_to_runner_only, no_main_func, codebase, has_preprocessor, on_behalf_of_email) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9::text::json, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32)", + "query": "INSERT INTO script (workspace_id, hash, path, parent_hashes, summary, description, content, created_by, schema, is_template, extra_perms, lock, language, kind, tag, draft_only, envs, concurrent_limit, concurrency_time_window_s, cache_ttl, dedicated_worker, ws_error_handler_muted, priority, restart_unless_cancelled, delete_after_use, timeout, concurrency_key, visible_to_runner_only, no_main_func, codebase, has_preprocessor, on_behalf_of_email, schema_validation) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9::text::json, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33)", "describe": { "columns": [], "parameters": { @@ -77,10 +77,11 @@ "Bool", "Varchar", "Bool", - "Text" + "Text", + "Bool" ] }, "nullable": [] }, - "hash": "bc00efe12901bc7b49c7892d2d9da675e0eaf5e6cc013149740bc778987a1006" + "hash": "d15f02f090b8d1a7e816fe11b2e0867540ab6bb02ac6bf82decc220dce0ab048" } diff --git a/backend/Cargo.toml b/backend/Cargo.toml index baeb9ecee1..180e78340a 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -357,4 +357,4 @@ tokio-tungstenite = { version = "0.24.0", features = ["native-tls"] } tree-sitter = {version = "0.23.0", features = []} tree-sitter-c-sharp = "0.23.0" oracle = { version = "0.6.3", features = ["chrono"] } -rumqttc = { version = "0.24.0", features = ["use-native-tls"]} \ No newline at end of file +rumqttc = { version = "0.24.0", features = ["use-native-tls"]} diff --git a/backend/migrations/20250205141517_backend_schema_validation.down.sql b/backend/migrations/20250205141517_backend_schema_validation.down.sql new file mode 100644 index 0000000000..0c2b95e5c6 --- /dev/null +++ b/backend/migrations/20250205141517_backend_schema_validation.down.sql @@ -0,0 +1,3 @@ +-- Add down migration script here +ALTER TABLE script +DROP COLUMN schema_validation; diff --git a/backend/migrations/20250205141517_backend_schema_validation.up.sql b/backend/migrations/20250205141517_backend_schema_validation.up.sql new file mode 100644 index 0000000000..61546be0e8 --- /dev/null +++ b/backend/migrations/20250205141517_backend_schema_validation.up.sql @@ -0,0 +1,3 @@ +-- Add up migration script here +ALTER TABLE script +ADD COLUMN schema_validation BOOLEAN NOT NULL DEFAULT FALSE; diff --git a/backend/parsers/windmill-parser-py/src/lib.rs b/backend/parsers/windmill-parser-py/src/lib.rs index 7319deb2a7..dbac8498ec 100644 --- a/backend/parsers/windmill-parser-py/src/lib.rs +++ b/backend/parsers/windmill-parser-py/src/lib.rs @@ -57,6 +57,8 @@ fn filter_non_main(code: &str, main_name: &str) -> String { return filtered_code; } +/// skip_params is a micro optimization for when we just want to find the main +/// function without parsing all the params. pub fn parse_python_signature( code: &str, override_main: Option, diff --git a/backend/parsers/windmill-parser-ts/src/lib.rs b/backend/parsers/windmill-parser-ts/src/lib.rs index 78a83cd929..24c9eefab3 100644 --- a/backend/parsers/windmill-parser-ts/src/lib.rs +++ b/backend/parsers/windmill-parser-ts/src/lib.rs @@ -131,6 +131,8 @@ pub fn parse_expr_for_ids(code: &str) -> anyhow::Result> { Ok(visitor.idents.into_iter().collect()) } +/// skip_params is a micro optimization for when we just want to find the main +/// function without parsing all the params. pub fn parse_deno_signature( code: &str, skip_dflt: bool, diff --git a/backend/windmill-api/src/scripts.rs b/backend/windmill-api/src/scripts.rs index e72ec6f167..6b6003b329 100644 --- a/backend/windmill-api/src/scripts.rs +++ b/backend/windmill-api/src/scripts.rs @@ -44,20 +44,12 @@ use windmill_audit::ActionKind; use windmill_common::error::to_anyhow; use windmill_common::{ - db::UserDB, - error::{Error, JsonResult, Result}, - jobs::JobPayload, - schedule::Schedule, - scripts::{ + db::UserDB, error::{Error, JsonResult, Result}, jobs::JobPayload, schedule::Schedule, schema::should_validate_schema, scripts::{ to_i64, HubScript, ListScriptQuery, ListableScript, NewScript, Schema, Script, ScriptHash, ScriptHistory, ScriptHistoryUpdate, ScriptKind, ScriptLang, ScriptWithStarred, - }, - users::username_to_permissioned_as, - utils::{ + }, users::username_to_permissioned_as, utils::{ not_found_if_none, paginate, query_elems_from_hub, require_admin, Pagination, StripPath, - }, - worker::to_raw_value, - HUB_BASE_URL, + }, worker::to_raw_value, HUB_BASE_URL }; use windmill_git_sync::{handle_deployment_metadata, DeployedObject}; use windmill_parser_ts::remove_pinned_imports; @@ -645,6 +637,8 @@ async fn create_script_internal<'c>( ns.language.clone() }; + let validate_schema = should_validate_schema(&ns.content, &ns.language); + let (no_main_func, has_preprocessor) = match lang { ScriptLang::Bun | ScriptLang::Bunnative | ScriptLang::Deno | ScriptLang::Nativets => { let args = windmill_parser_ts::parse_deno_signature(&ns.content, true, true, None)?; @@ -662,8 +656,8 @@ async fn create_script_internal<'c>( content, created_by, schema, is_template, extra_perms, lock, language, kind, tag, \ draft_only, envs, concurrent_limit, concurrency_time_window_s, cache_ttl, \ dedicated_worker, ws_error_handler_muted, priority, restart_unless_cancelled, \ - delete_after_use, timeout, concurrency_key, visible_to_runner_only, no_main_func, codebase, has_preprocessor, on_behalf_of_email) \ - VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9::text::json, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32)", + delete_after_use, timeout, concurrency_key, visible_to_runner_only, no_main_func, codebase, has_preprocessor, on_behalf_of_email, schema_validation) \ + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9::text::json, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33)", &w_id, &hash.0, ns.path, @@ -699,7 +693,8 @@ async fn create_script_internal<'c>( Some(&authed.email) } else { None - } + }, + validate_schema, ) .execute(&mut *tx) .await?; diff --git a/backend/windmill-common/src/cache.rs b/backend/windmill-common/src/cache.rs index d38ca38019..9374445f22 100644 --- a/backend/windmill-common/src/cache.rs +++ b/backend/windmill-common/src/cache.rs @@ -7,9 +7,13 @@ //! This shall only be used for testing, e.g. [`sqlx::test`] spawn a database per test, //! and there is only one test per thread, so using thread-local cache avoid unexpected results. +use anyhow::anyhow; use crate::{ - apps::AppScriptId, error, flows::FlowNodeId, flows::FlowValue, scripts::ScriptHash, - scripts::ScriptLang, + apps::AppScriptId, + error, + flows::{FlowNodeId, FlowValue}, + schema::SchemaValidator, + scripts::{ScriptHash, ScriptLang}, }; #[cfg(feature = "scoped_cache")] @@ -307,6 +311,8 @@ pub struct ScriptMetadata { pub language: Option, pub envs: Option>, pub codebase: Option, + pub schema: Option, + pub schema_validator: Option, } #[derive(Debug)] @@ -529,6 +535,8 @@ pub mod script { lock AS \"lock: String\", \ language AS \"language: Option\", \ envs AS \"envs: Vec\", \ + schema AS \"schema: String\", \ + schema_validation AS \"schema_validation: bool\", \ codebase LIKE '%.tar' as use_tar \ FROM script WHERE hash = $1 LIMIT 1", hash.0 @@ -537,23 +545,36 @@ pub mod script { .await .map_err(Into::into) .and_then(unwrap_or_error(&loc, "Script", hash)) - .map(|r| RawScript { - content: r.content, - lock: r.lock, - meta: Some(ScriptMetadata { - language: r.language, - envs: r.envs, - codebase: if let Some(use_tar) = r.use_tar { - let sh = hash.to_string(); - if use_tar { - Some(format!("{sh}.tar")) + .and_then(|r| { + Ok(RawScript { + content: r.content, + lock: r.lock, + meta: Some(ScriptMetadata { + language: r.language, + envs: r.envs, + codebase: if let Some(use_tar) = r.use_tar { + let sh = hash.to_string(); + if use_tar { + Some(format!("{sh}.tar")) + } else { + Some(sh) + } } else { - Some(sh) - } - } else { - None - }, - }), + None + }, + schema_validator: if r.schema_validation { + r.schema + .as_ref() + .map(|schema_str| { + SchemaValidator::from_schema(schema_str).map_err(|e| anyhow!("Couldn't create schema validator for script requiring schema validation: {e}")) + }) + .transpose()? + } else { + None + }, + schema: r.schema, + }), + }) }) }); fut.map_ok(|ScriptFull { data, meta }| (data, meta)) @@ -939,6 +960,7 @@ const _: () = { (u64, |x| format!("{:016x}", x)), (Uuid, |x| format!("{:032x}", x.as_u128())), (ScriptHash, |x| format!("{:016x}", x.0)), + ((u8, ScriptHash), |x| format!("{:02x}-{:016x}", x.0, x.1.0)), (FlowNodeId, |x| format!("{:016x}", x.0)), (AppScriptId, |x| format!("{:016x}", x.0)) } diff --git a/backend/windmill-common/src/error.rs b/backend/windmill-common/src/error.rs index faf1a72d1b..59c3ca6420 100644 --- a/backend/windmill-common/src/error.rs +++ b/backend/windmill-common/src/error.rs @@ -74,6 +74,8 @@ pub enum Error { AlreadyCompleted(String), #[error("Find python error: {0}")] FindPythonError(String), + #[error("Problem with arguments: {0}")] + ArgumentErr(String), } fn prettify_location(location: &'static Location<'static>) -> String { diff --git a/backend/windmill-common/src/lib.rs b/backend/windmill-common/src/lib.rs index c4387cb8c3..ca00da879a 100644 --- a/backend/windmill-common/src/lib.rs +++ b/backend/windmill-common/src/lib.rs @@ -55,6 +55,7 @@ pub mod utils; pub mod variables; pub mod worker; pub mod workspaces; +pub mod schema; pub const DEFAULT_MAX_CONNECTIONS_SERVER: u32 = 50; pub const DEFAULT_MAX_CONNECTIONS_WORKER: u32 = 5; diff --git a/backend/windmill-common/src/schema.rs b/backend/windmill-common/src/schema.rs new file mode 100644 index 0000000000..d3ef869c6c --- /dev/null +++ b/backend/windmill-common/src/schema.rs @@ -0,0 +1,653 @@ +use anyhow::anyhow; +use itertools::Itertools; +use serde::{Deserialize, Serialize}; +use std::{collections::HashMap, str::FromStr}; + +use serde_json::{value::RawValue, Value}; + +use crate::{error::Error, scripts::ScriptLang}; + +#[derive(PartialEq, Serialize, Deserialize, Debug, Clone)] +pub enum JsonPrimitiveType { + String, + Number, + Integer, + Object, + Array, + Boolean, + Null, +} + +#[derive(PartialEq, Serialize, Deserialize, Debug, Clone)] +pub enum SchemaValidationRule { + StrictEnum(Vec), + IsNull, + IsInteger, + IsString, + IsBool, + IsDatetime, + IsNumber, + IsEmail, + IsObject(Vec<(String, Vec)>), + IsArray(Vec), + IsUnionType(Vec>), + IsOneOf(HashMap>), + IsBytes, +} + +impl SchemaValidationRule { + fn from_primitive(p: &JsonPrimitiveType, val: &Value) -> Result, anyhow::Error> { + let mut schema_rules = vec![]; + + match p { + JsonPrimitiveType::String => { + schema_rules.push(SchemaValidationRule::IsString); + + if let Some(format) = val.get("format").and_then(|f| f.as_str()) { + if format == "date" || format == "date-time" { + schema_rules.push(SchemaValidationRule::IsDatetime); + } + + if format == "email" { + schema_rules.push(SchemaValidationRule::IsEmail); + } + } + + if let Some(encoding) = val.get("contentEncoding").and_then(|e| e.as_str()) { + if encoding == "base64" { + schema_rules.push(SchemaValidationRule::IsBytes); + } + } + } + + JsonPrimitiveType::Number => { + schema_rules.push(SchemaValidationRule::IsNumber); + } + JsonPrimitiveType::Integer => { + schema_rules.push(SchemaValidationRule::IsInteger); + } + JsonPrimitiveType::Object => { + let mut obj_rules = vec![]; + + if let Some(properties) = val.get("properties") { + let properties = properties + .as_object() + .ok_or(anyhow!("Field properties should be an object"))?; + + for (key, v) in properties { + obj_rules.push((key.clone(), SchemaValidationRule::from_value(v)?)) + } + + schema_rules.push(SchemaValidationRule::IsObject(obj_rules)); + } else if let Some(one_of) = val.get("oneOf") { + let one_of = one_of + .as_array() + .ok_or(anyhow!("`oneOf` needs to be an array"))?; + let mut rules_map: HashMap> = HashMap::new(); + + for variant in one_of { + let variant_label = variant + .get("title") + .ok_or(anyhow!( + "oneOf variant definition should have a `title` field" + ))? + .as_str() + .ok_or(anyhow!( + "oneOf variant definition `title` field should be a string" + ))?; + if !rules_map.contains_key(variant_label) { + rules_map.insert( + variant_label.to_string(), + SchemaValidationRule::from_value(variant)?, + ); + } else { + return Err(anyhow!( + "oneOf definition has a duplicate variant `{variant_label}`" + )); + } + } + + schema_rules.push(SchemaValidationRule::IsOneOf(rules_map)) + } else { + let is_resource = val + .get("format") + .and_then(|f| f.as_str()) + .map(|f| f.starts_with("resource")) + .unwrap_or(false); + if !is_resource { + return Err(anyhow!( + "Object type should have a `properties` or `anyOf` field, or be a resource" + )); + } + } + } + JsonPrimitiveType::Array => { + let items = val + .get("items") + .ok_or(anyhow!("Array type should have field `items`"))?; + + let arr_rules = SchemaValidationRule::from_value(items)?; + + schema_rules.push(SchemaValidationRule::IsArray(arr_rules)); + } + JsonPrimitiveType::Boolean => { + schema_rules.push(SchemaValidationRule::IsBool); + } + JsonPrimitiveType::Null => { + schema_rules.push(SchemaValidationRule::IsNull); + } + } + + Ok(schema_rules) + } + + fn from_value(val: &Value) -> Result, Error> { + if let Some(any_of) = val.get("anyOf").and_then(|any_of| any_of.as_array()) { + let mut r = vec![]; + + for variant in any_of { + r.push(SchemaValidationRule::from_value(variant)?); + } + return Ok(vec![SchemaValidationRule::IsUnionType(r)]); + } + + let mut schema_rules = vec![]; + + let typ = val.get("type").ok_or(anyhow!("Missing `type` field"))?; + + if let Some(typ) = typ.as_str() { + schema_rules.append(&mut SchemaValidationRule::from_primitive( + &JsonPrimitiveType::from_str(typ)?, + val, + )?); + } else if let Some(typ_arr) = typ.as_array() { + let typ_arr = typ_arr + .into_iter() + .map(|v| { + SchemaValidationRule::from_primitive( + &JsonPrimitiveType::from_str( + v.as_str() + .ok_or(anyhow!("Expected array of strings for `type` field"))?, + )?, + v, + ) + }) + .collect::>, anyhow::Error>>()?; + + schema_rules.push(SchemaValidationRule::IsUnionType(typ_arr)); + } else { + return Err(anyhow!( + "Unsupported value for type field, expected string or string array" + ) + .into()); + } + + if let Some(enum_variants) = val.get("enum") { + let variants = enum_variants + .as_array() + .ok_or(anyhow!("enum variants are not in an array"))? + .clone(); + schema_rules.push(SchemaValidationRule::StrictEnum(variants)); + } + + Ok(schema_rules) + } + + fn apply_rule(&self, key: &str, val: &Value, required: bool) -> Result<(), Error> { + if val.is_null() { + if !required { + return Ok(()); + } + return Err(Error::ArgumentErr(format!("Argument {key} cannot be null"))); + } + match self { + SchemaValidationRule::IsNull => { + if !val.is_null() { + return Err(Error::ArgumentErr(format!( + "Argument `{key}` should be null" + ))); + } + } + SchemaValidationRule::StrictEnum(vec) => { + if !vec.contains(val) { + let options = vec.iter().map(|s| s.to_string()).join(", "); + return Err(Error::ArgumentErr(format!( + "Enum type argument `{key}` expected one of `[{options}]` but received {}", + val.to_string() + ))); + } + } + SchemaValidationRule::IsNumber => { + if !val.is_number() { + return Err(Error::ArgumentErr(format!( + "Argument `{key}` should be a numeric value" + ))); + } + } + SchemaValidationRule::IsInteger => { + if !val.is_i64() && !val.is_u64() { + return Err(Error::ArgumentErr(format!( + "Argument `{key}` should be an integer" + ))); + } + } + SchemaValidationRule::IsString => { + if !val.is_string() { + return Err(Error::ArgumentErr(format!( + "Argument `{key}` should be a string" + ))); + } + } + SchemaValidationRule::IsBool => { + if !val.is_boolean() { + return Err(Error::ArgumentErr(format!( + "Argument `{key}` should be a boolean" + ))); + } + } + SchemaValidationRule::IsObject(o) => { + if !val.is_object() { + return Err(Error::ArgumentErr(format!( + "Argument `{key}` should be an object" + ))); + } + + for (s, rules) in o { + let v = val + .get(&s) + .ok_or(Error::ArgumentErr(format!("Missing field {s} in {key}")))?; + for r in rules { + r.apply_rule(&format!("{key}.{s}"), v, true)?; + } + } + } + SchemaValidationRule::IsArray(vec) => { + if let Some(arr) = val.as_array() { + for (i, el) in arr.iter().enumerate() { + for r in vec { + r.apply_rule(&format!("{key}[{i}]"), el, true)?; + } + } + } else { + return Err(Error::ArgumentErr(format!( + "Argument `{key}` should be an array" + ))); + } + } + // TODO: For better error messages on OneOf, make a dedicated OneOf type that matches the label instead of trying the whole type. + SchemaValidationRule::IsUnionType(vec) => { + let mut match_count = 0; + + let mut errors = String::new(); + for typ in vec { + if let Some(e) = typ + .iter() + .map(|r| r.apply_rule(key, val, true)) + .find_map(Result::err) + { + errors.push_str(&format!("- {e}\n")); + } else { + match_count += 1; + } + } + + if match_count == 0 { + return Err(Error::ArgumentErr(format!( + "Argument `{key}` is not valid, failed matching to one of the expected types. Here is a list of possible errors:\n{errors}" + ))); + } + } + SchemaValidationRule::IsOneOf(vec) => { + let variant_label = val + .get("label") + .ok_or(Error::ArgumentErr(format!( + "oneOf Variant for argument `{key}` should have a label field" + )))? + .as_str() + .ok_or(Error::ArgumentErr(format!( + "Argument `{key}` of type oneOf expected the label to be a string" + )))?; + + let variant_rules = vec + .get(variant_label) + .ok_or_else(|| Error::ArgumentErr(format!( + "Argument `{key}` of type oneOf expected one of the following variants {}, but received `{variant_label}`", vec.keys().join(", ") + )))?; + + for r in variant_rules { + r.apply_rule(key, val, true).map_err(|e| Error::ArgumentErr(format!("Argument `{key}`: The schema for the selected oneOf variant `{variant_label}` was not respected: {e}")))?; + } + } + // TODO: Implement validation on these + SchemaValidationRule::IsDatetime => (), + SchemaValidationRule::IsEmail => (), + SchemaValidationRule::IsBytes => (), + } + + Ok(()) + } +} + +fn find_annotation(comm_lit: &str, annotation: &str, code: &str) -> bool { + let a = format!("{comm_lit} {annotation}"); + for l in code.lines() { + if !l.starts_with(comm_lit) { + break; + } + + if l.trim_end() == a { + return true; + } + } + + false +} + +pub fn should_validate_schema(code: &str, lang: &ScriptLang) -> bool { + let annotation = "schema_validation"; + match lang { + ScriptLang::Nativets | ScriptLang::Bun | ScriptLang::Bunnative | ScriptLang::Deno => { + find_annotation("//", annotation, code) + } + ScriptLang::Python3 => find_annotation("#", annotation, code), + ScriptLang::Go => find_annotation("#", annotation, code), + ScriptLang::Bash => find_annotation("#", annotation, code), + ScriptLang::Powershell => find_annotation("#", annotation, code), + ScriptLang::Postgresql => find_annotation("--", annotation, code), + ScriptLang::Mysql => find_annotation("--", annotation, code), + ScriptLang::Bigquery => find_annotation("--", annotation, code), + ScriptLang::Snowflake => find_annotation("--", annotation, code), + ScriptLang::Graphql => find_annotation("#", annotation, code), + ScriptLang::Mssql => find_annotation("--", annotation, code), + ScriptLang::OracleDB => find_annotation("--", annotation, code), + ScriptLang::Php => find_annotation("//", annotation, code), + ScriptLang::Rust => find_annotation("//!", annotation, code), + ScriptLang::Ansible => find_annotation("#", annotation, code), + ScriptLang::CSharp => find_annotation("//", annotation, code), + } +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct SchemaValidator { + pub required: Vec, + pub rules: Vec<(String, Vec)>, +} + +impl SchemaValidator { + pub fn validate(&self, args: &HashMap>) -> Result<(), Error> { + for key in &self.required { + if !args.contains_key(key) { + return Err(Error::ArgumentErr(format!("Argument {key} is required"))); + } + } + + for (key, rules) in &self.rules { + if let Some(raw_val) = args.get(key) { + let parsed_val = Value::from_str(raw_val.get()).map_err(|e| { + Error::ArgumentErr(format!("Failed to parse `{key}` argument: {e}")) + })?; + for rule in rules { + rule.apply_rule(key, &parsed_val, self.required.contains(key))?; + } + } + } + + Ok(()) + } + + pub fn from_schema(schema: &str) -> Result { + let schema: Value = serde_json::from_str(schema)?; + + if let Some(draft_version) = schema.get("$schema") { + match draft_version.as_str() { + Some("https://json-schema.org/draft/2020-12/schema") => (), + _ => return Err(anyhow!("Supplied schema draft version is unsuported").into()), + } + } else { + return Err(anyhow!("No draft version supplied").into()); + } + + let required: Vec = schema + .get("required") + .ok_or(anyhow!("Missing `required` field on schema"))? + .as_array() + .ok_or(anyhow!("`required` field should be an array of strings"))? + .into_iter() + .map(|v| { + v.as_str() + .map(|s| s.to_string()) + .ok_or(anyhow!("required field key is not a string")) + }) + .collect::, anyhow::Error>>()?; + + let properties = schema + .get("properties") + .ok_or(anyhow!("Missing `properties` field on schema"))? + .as_object() + .ok_or(anyhow!("`properties` field should be an object"))?; + + let mut rules = vec![]; + + for (key, val) in properties { + rules.push(( + key.clone(), + SchemaValidationRule::from_value(val) + .map_err(|e| anyhow!("Problem making rule for {key}: {e}"))?, + )); + } + + Ok(Self { required, rules }) + } +} + +impl JsonPrimitiveType { + fn from_str(typ: &str) -> Result { + match typ { + "string" => { + return Ok(JsonPrimitiveType::String); + } + "number" => { + return Ok(JsonPrimitiveType::Number); + } + "integer" => { + return Ok(JsonPrimitiveType::Integer); + } + "object" => { + return Ok(JsonPrimitiveType::Object); + } + "array" => { + return Ok(JsonPrimitiveType::Array); + } + "boolean" => { + return Ok(JsonPrimitiveType::Boolean); + } + "null" => { + return Ok(JsonPrimitiveType::Null); + } + other => return Err(anyhow!("Received unsupported type `{other}`").into()), + } + } +} + +#[cfg(test)] +mod tests { + use serde_json::json; + + use super::*; + + fn value_to_rawvalue_map( + value: Value, + ) -> Result>, anyhow::Error> { + match value { + Value::Object(map) => { + let mut result = HashMap::new(); + for (key, val) in map { + let raw = serde_json::to_string(&val)?; // Serialize the Value to a string + let raw_value: Box = serde_json::from_str(&raw)?; // Convert string to Box + result.insert(key, raw_value); + } + Ok(result) + } + _ => Err(anyhow!("Expected a JSON object")), + } + } + #[test] + fn test_parse_and_validate_schema() { + let schema = r#"{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "properties": { + "a": { + "contentEncoding": "base64", + "default": null, + "description": "", + "originalType": "bytes", + "type": "string" + }, + "b": { + "default": null, + "description": "", + "enum": [ + "my", + "enum" + ], + "originalType": "enum", + "type": "string" + }, + "e": { + "default": "inferred type string from default arg", + "description": "", + "originalType": "string", + "type": "string" + }, + "f": { + "default": { + "nested": "object" + }, + "description": "", + "properties": { + "nested": { + "description": "", + "type": "string", + "originalType": "string" + } + }, + "type": "object" + }, + "g": { + "default": null, + "description": "", + "oneOf": [ + { + "type": "object", + "title": "Variant 1", + "properties": { + "label": { + "description": "", + "type": "string", + "originalType": "enum", + "enum": [ + "Variant 1" + ] + }, + "foo": { + "description": "", + "type": "string", + "originalType": "string" + } + } + }, + { + "type": "object", + "title": "Variant 2", + "properties": { + "label": { + "description": "", + "type": "string", + "originalType": "enum", + "enum": [ + "Variant 2" + ] + }, + "bar": { + "description": "", + "type": "number" + } + } + } + ], + "type": "object" + } + }, + "required": [ + "a", + "b", + "g" + ], + "type": "object" +} +"#; + + let validator = SchemaValidator::from_schema(schema) + .expect("Schema couldn't be built from a valid schema"); + + let args = json!( + { + "g": { + "label": "Variant 1", + "foo": "" + }, + "f": { + "nested": "object" + }, + "e": "inferred type string from default arg", + "b": "my", + "a": null + } + ); + + validator + .validate(&value_to_rawvalue_map(args).unwrap()) + .err() + .expect("Validation should not work for this"); + + let args = json!( + { + "g": { + "label": "Variant 1", + "foo": "" + }, + "f": { + "nested": "object" + }, + "e": "inferred type string from default arg", + "b": "not_enum", + "a": "123" + } + ); + + validator + .validate(&value_to_rawvalue_map(args).unwrap()) + .err() + .expect("Validation should not work for this"); + + let args = json!( + { + "g": { + "label": "Variant 1", + "foo": "" + }, + "f": { + "nested": "object" + }, + "e": "inferred type string from default arg", + "b": "my", + "a": "123" + } + ); + + validator + .validate(&value_to_rawvalue_map(args).unwrap()) + .expect("Validation should work for this"); + } +} + diff --git a/backend/windmill-worker/src/lib.rs b/backend/windmill-worker/src/lib.rs index 4c5aa1c908..40c19beea6 100644 --- a/backend/windmill-worker/src/lib.rs +++ b/backend/windmill-worker/src/lib.rs @@ -41,6 +41,7 @@ mod rust_executor; mod worker; mod worker_flow; mod worker_lockfiles; +mod schema; pub use worker::*; diff --git a/backend/windmill-worker/src/schema.rs b/backend/windmill-worker/src/schema.rs new file mode 100644 index 0000000000..f5cce5cd90 --- /dev/null +++ b/backend/windmill-worker/src/schema.rs @@ -0,0 +1,94 @@ +use std::collections::HashMap; +use windmill_common::schema::{SchemaValidationRule, SchemaValidator}; +use windmill_parser::{MainArgSignature, Typ}; + + +fn make_rules_for_arg_typ(typ: &Typ) -> Vec { + let mut rules = vec![]; + + match typ { + Typ::Str(enum_variants) => { + rules.push(SchemaValidationRule::IsString); + + if let Some(enum_variants) = enum_variants { + rules.push(SchemaValidationRule::StrictEnum( + enum_variants + .iter() + .map(|v| serde_json::Value::String(v.to_string())) + .collect(), + )); + } + } + Typ::Int => { + rules.push(SchemaValidationRule::IsInteger); + } + Typ::Float => { + rules.push(SchemaValidationRule::IsNumber); + } + Typ::Bool => { + rules.push(SchemaValidationRule::IsBool); + } + Typ::List(typ) => { + rules.push(SchemaValidationRule::IsArray(make_rules_for_arg_typ(typ))); + } + Typ::Bytes => { + rules.push(SchemaValidationRule::IsString); + rules.push(SchemaValidationRule::IsBytes); + } + Typ::Datetime => { + rules.push(SchemaValidationRule::IsString); + rules.push(SchemaValidationRule::IsDatetime); + } + Typ::Email => { + rules.push(SchemaValidationRule::IsString); + rules.push(SchemaValidationRule::IsEmail); + } + Typ::Sql => { + rules.push(SchemaValidationRule::IsString); + } + Typ::Object(props) => { + let mut obj_rules = vec![]; + + for prop in props { + obj_rules.push((prop.key.to_string(), make_rules_for_arg_typ(&prop.typ))); + } + + rules.push(SchemaValidationRule::IsObject(obj_rules)) + } + Typ::OneOf(variants) => { + let mut rules_map = HashMap::new(); + + for variant in variants { + let mut obj_rules = vec![]; + + for prop in &variant.properties { + obj_rules.push((prop.key.to_string(), make_rules_for_arg_typ(&prop.typ))); + } + rules_map.insert(variant.label.to_string(), vec![SchemaValidationRule::IsObject(obj_rules)]); + } + + rules.push(SchemaValidationRule::IsOneOf(rules_map)) + } + Typ::Resource(_) => (), + Typ::DynSelect(_) => (), + Typ::Unknown => (), + } + + rules +} + +pub fn schema_validator_from_main_arg_sig(sig: &MainArgSignature) -> SchemaValidator { + let mut rules = vec![]; + let mut required = vec![]; + + for arg in &sig.args { + if !arg.has_default { + required.push(arg.name.to_string()); + } + + rules.push((arg.name.to_string(), make_rules_for_arg_typ(&arg.typ))); + } + + SchemaValidator { required, rules } +} + diff --git a/backend/windmill-worker/src/worker.rs b/backend/windmill-worker/src/worker.rs index 3ae9a1e683..ea2ddca55f 100644 --- a/backend/windmill-worker/src/worker.rs +++ b/backend/windmill-worker/src/worker.rs @@ -9,11 +9,14 @@ // #[cfg(feature = "otel")] // use opentelemetry::{global, KeyValue}; +use anyhow::anyhow; +use futures::TryFutureExt; use windmill_common::{ apps::AppScriptId, auth::{fetch_authed_from_permissioned_as, JWTAuthClaims, JobPerms}, - cache::{ScriptData, ScriptMetadata}, + cache::{future::FutureCachedExt, ScriptData, ScriptMetadata}, jwt, + schema::{should_validate_schema, SchemaValidator}, scripts::PREVIEW_IS_TAR_CODEBASE_HASH, utils::WarnAfterExt, worker::{ @@ -49,6 +52,7 @@ use std::{ }, time::Duration, }; +use windmill_parser::MainArgSignature; use uuid::Uuid; @@ -108,6 +112,7 @@ use crate::{ js_eval::{eval_fetch_timeout, transpile_ts}, pg_executor::do_postgresql, result_processor::{process_result, start_background_processor}, + schema::schema_validator_from_main_arg_sig, worker_flow::{handle_flow, update_flow_status_in_progress}, worker_lockfiles::{ handle_app_dependency_job, handle_dependency_job, handle_flow_dependency_job, @@ -2317,6 +2322,7 @@ pub struct ContentReqLangEnvs { pub language: Option, pub envs: Option>, pub codebase: Option, + pub schema: Option, } pub async fn get_hub_script_content_and_requirements( @@ -2335,6 +2341,7 @@ pub async fn get_hub_script_content_and_requirements( language: Some(script.language), envs: None, codebase: None, + schema: Some(script.schema.get().to_string()), }) } @@ -2354,9 +2361,100 @@ pub async fn get_script_content_by_hash( Some(x) if x.ends_with(".tar") => Some(format!("{}.tar", script_hash)), Some(_) => Some(script_hash.to_string()), }, + schema: None, }) } +async fn try_validate_schema( + job: &MiniPulledJob, + db: &Pool, + schema_validator: Option<&SchemaValidator>, + code: &str, + language: Option<&ScriptLang>, + schema: Option<&String>, +) -> Result<(), Error> { + if let Some(args) = job.args.as_ref() { + if let Some(sv) = schema_validator { + sv.validate(args)?; + } else { + let validators_cache = cache::anon!({ (u8, ScriptHash) => Arc> } in "schemavalidators" <= 1000); + + let sv_fut = async move { + if language.map(|l| should_validate_schema(code, l)).unwrap_or(false) { + if let Some(schema) = schema { + Ok(Some(SchemaValidator::from_schema(schema)?)) + } else { + if let Some(sig) = parse_sig_of_lang( + code, + language, + job.script_entrypoint_override.clone(), + )? { + Ok(Some(schema_validator_from_main_arg_sig(&sig))) + } else { + Err(anyhow!("Job was expected to validate the arguments schema, but no schema was provided and couldn't be inferred from the script for language `{language:?}`. Try removing schema validation for this job").into()) + } + } + } else { Ok(None) } + } + .map_ok(Arc::new); + + let sub_key: u8 = match job.kind { + JobKind::Script => 0, + JobKind::FlowScript => 1, + JobKind::AppScript => 2, + JobKind::Script_Hub => 3, + JobKind::Preview => 4, + JobKind::DeploymentCallback => 5, + JobKind::SingleScriptFlow => 6, + JobKind::Dependencies => 7, + JobKind::Flow => 8, + JobKind::FlowPreview => 9, + JobKind::Identity => 10, + JobKind::FlowDependencies => 11, + JobKind::AppDependencies => 12, + JobKind::Noop => 13, + JobKind::FlowNode => 14, + }; + + let sv = match job.runnable_id { + Some(hash) + if job.kind != JobKind::Preview && job.kind != JobKind::FlowPreview => + { + sv_fut.cached(validators_cache, (sub_key, hash)).await? + } + _ => sv_fut.await?, + }; + + if sv.is_some() && job.kind == JobKind::Preview { + append_logs( + &job.id, + &job.workspace_id, + "\n--- ARGS VALIDATION ---\nScript contains `schema_validation` annotation, running schema validation for the script arguments...\n", + db, + ) + .await; + } + + sv.as_ref() + .as_ref() + .map(|sv| sv.validate(args)) + .transpose()?; + + if sv.is_some() { + append_logs( + &job.id, + &job.workspace_id, + "Script arguments were validated!\n\n", + db, + ) + .await; + } + } + } + + Ok(()) +} + #[tracing::instrument(level = "trace", skip_all)] async fn handle_code_execution_job( job: &MiniPulledJob, @@ -2384,7 +2482,10 @@ async fn handle_code_execution_job( ScriptData, ScriptMetadata, ); - let (ScriptData { code, lock }, ScriptMetadata { language, envs, codebase }) = match job.kind { + let ( + ScriptData { code, lock }, + ScriptMetadata { language, envs, codebase, schema_validator, schema }, + ) = match job.kind { JobKind::Preview => { let codebase = match job.runnable_id.map(|x| x.0) { Some(PREVIEW_IS_CODEBASE_HASH) => Some(job.id.to_string()), @@ -2394,15 +2495,22 @@ async fn handle_code_execution_job( arc_data = preview.ok_or_else(|| Error::internal_err("expected preview".to_string()))?; - metadata = ScriptMetadata { language: job.script_lang, codebase, envs: None }; + metadata = ScriptMetadata { + language: job.script_lang, + codebase, + envs: None, + schema: None, + schema_validator: None, + }; (arc_data.as_ref(), &metadata) } JobKind::Script_Hub => { - let ContentReqLangEnvs { content, lockfile, language, envs, codebase } = + let ContentReqLangEnvs { content, lockfile, language, envs, codebase, schema } = get_hub_script_content_and_requirements(job.runnable_path.as_ref(), Some(db)) .await?; + data = ScriptData { code: content, lock: lockfile }; - metadata = ScriptMetadata { language, envs, codebase }; + metadata = ScriptMetadata { language, envs, codebase, schema, schema_validator: None }; (&data, &metadata) } JobKind::Script => { @@ -2411,12 +2519,24 @@ async fn handle_code_execution_job( } JobKind::FlowScript => { arc_data = cache::flow::fetch_script(db, FlowNodeId(script_hash()?.0)).await?; - metadata = ScriptMetadata { language: job.script_lang, envs: None, codebase: None }; + metadata = ScriptMetadata { + language: job.script_lang, + envs: None, + codebase: None, + schema: None, + schema_validator: None, + }; (arc_data.as_ref(), &metadata) } JobKind::AppScript => { arc_data = cache::app::fetch_script(db, AppScriptId(script_hash()?.0)).await?; - metadata = ScriptMetadata { language: job.script_lang, envs: None, codebase: None }; + metadata = ScriptMetadata { + language: job.script_lang, + envs: None, + codebase: None, + schema: None, + schema_validator: None, + }; (arc_data.as_ref(), &metadata) } JobKind::DeploymentCallback => { @@ -2425,10 +2545,11 @@ async fn handle_code_execution_job( .as_ref() .ok_or_else(|| Error::internal_err("expected script path".to_string()))?; if script_path.starts_with("hub/") { - let ContentReqLangEnvs { content, lockfile, language, envs, codebase } = + let ContentReqLangEnvs { content, lockfile, language, envs, codebase, schema } = get_hub_script_content_and_requirements(Some(script_path), Some(db)).await?; data = ScriptData { code: content, lock: lockfile }; - metadata = ScriptMetadata { language, envs, codebase }; + metadata = + ScriptMetadata { language, envs, codebase, schema, schema_validator: None }; (&data, &metadata) } else { let hash = sqlx::query_scalar!( @@ -2450,6 +2571,16 @@ async fn handle_code_execution_job( ), }; + try_validate_schema( + job, + db, + schema_validator.as_ref(), + code, + language.as_ref(), + schema.as_ref(), + ) + .await?; + let language = language.clone(); if language == Some(ScriptLang::Postgresql) { return do_postgresql( @@ -2908,3 +3039,58 @@ mount {{ result } + +fn parse_sig_of_lang( + code: &str, + language: Option<&ScriptLang>, + main_override: Option, +) -> Result> { + Ok(if let Some(lang) = language { + match lang { + ScriptLang::Nativets | ScriptLang::Deno | ScriptLang::Bun | ScriptLang::Bunnative => { + Some(windmill_parser_ts::parse_deno_signature( + code, + true, + false, + main_override, + )?) + } + #[cfg(feature = "python")] + ScriptLang::Python3 => Some(windmill_parser_py::parse_python_signature( + code, + main_override, + false, + )?), + #[cfg(not(feature = "python"))] + ScriptLang::Python3 => None, + ScriptLang::Go => Some(windmill_parser_go::parse_go_sig(code)?), + ScriptLang::Bash => Some(windmill_parser_bash::parse_bash_sig(code)?), + ScriptLang::Powershell => Some(windmill_parser_bash::parse_powershell_sig(code)?), + ScriptLang::Postgresql => Some(windmill_parser_sql::parse_pgsql_sig(code)?), + ScriptLang::Mysql => Some(windmill_parser_sql::parse_mysql_sig(code)?), + ScriptLang::Bigquery => Some(windmill_parser_sql::parse_bigquery_sig(code)?), + ScriptLang::Snowflake => Some(windmill_parser_sql::parse_snowflake_sig(code)?), + ScriptLang::Graphql => None, + ScriptLang::Mssql => Some(windmill_parser_sql::parse_mssql_sig(code)?), + ScriptLang::OracleDB => Some(windmill_parser_sql::parse_oracledb_sig(code)?), + #[cfg(feature = "php")] + ScriptLang::Php => Some(windmill_parser_php::parse_php_signature( + code, + main_override, + )?), + #[cfg(not(feature = "php"))] + ScriptLang::Php => None, + #[cfg(feature = "rust")] + ScriptLang::Rust => Some(windmill_parser_rust::parse_rust_signature(code)?), + #[cfg(not(feature = "rust"))] + ScriptLang::Rust => None, + ScriptLang::Ansible => Some(windmill_parser_yaml::parse_ansible_sig(code)?), + #[cfg(feature = "csharp")] + ScriptLang::CSharp => Some(windmill_parser_csharp::parse_csharp_signature(code)?), + #[cfg(not(feature = "csharp"))] + ScriptLang::CSharp => None, + } + } else { + None + }) +} diff --git a/backend/windmill-worker/src/worker_lockfiles.rs b/backend/windmill-worker/src/worker_lockfiles.rs index a2679913da..c0b0826664 100644 --- a/backend/windmill-worker/src/worker_lockfiles.rs +++ b/backend/windmill-worker/src/worker_lockfiles.rs @@ -1,3 +1,4 @@ +use std::borrow::Cow; use std::collections::HashMap; use std::path::{Component, Path, PathBuf}; @@ -259,13 +260,36 @@ pub async fn handle_dependency_job( // `JobKind::Dependencies` job store either: // - A saved script `hash` in the `script_hash` column. // - Preview raw lock and code in the `queue` or `job` table. - let script_data = match job.runnable_id { - Some(hash) => &cache::script::fetch(db, hash).await?.0, + let script_data = &match job.runnable_id { + Some(hash) => match cache::script::fetch(db, hash).await { + Ok(d) => Cow::Owned(d.0), + Err(e) => { + let logs2 = sqlx::query_scalar!( + "SELECT logs FROM job_logs WHERE job_id = $1 AND workspace_id = $2", + &job.id, + &job.workspace_id + ) + .fetch_optional(db) + .await? + .flatten() + .unwrap_or_else(|| "no logs".to_string()); + sqlx::query!( + "UPDATE script SET lock_error_logs = $1 WHERE hash = $2 AND workspace_id = $3", + &format!("{logs2}\n{e}"), + &job.runnable_id.unwrap_or(ScriptHash(0)).0, + &job.workspace_id + ) + .execute(db) + .await?; + return Err(Error::ExecutionErr(format!("Error creating schema validator: {e}"))) + } + }, _ => match preview_data { - Some(RawData::Script(data)) => data, + Some(RawData::Script(data)) => Cow::Borrowed(data), _ => return Err(Error::internal_err("expected script hash")), }, }; + let content = capture_dependency_job( &job.id, job.script_lang.as_ref().map(|v| Ok(v)).unwrap_or_else(|| { From a6cf327f74ae84d58181280995f8d8e2d909ee05 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 20 Mar 2025 09:54:49 +0100 Subject: [PATCH 069/739] fix: improve memory metrics graph --- .../20250320081915_longer_variable_description.down.sql | 1 + .../20250320081915_longer_variable_description.up.sql | 3 +++ backend/windmill-common/src/job_metrics.rs | 5 +---- backend/windmill-worker/src/bash_executor.rs | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) create mode 100644 backend/migrations/20250320081915_longer_variable_description.down.sql create mode 100644 backend/migrations/20250320081915_longer_variable_description.up.sql diff --git a/backend/migrations/20250320081915_longer_variable_description.down.sql b/backend/migrations/20250320081915_longer_variable_description.down.sql new file mode 100644 index 0000000000..d2f607c5b8 --- /dev/null +++ b/backend/migrations/20250320081915_longer_variable_description.down.sql @@ -0,0 +1 @@ +-- Add down migration script here diff --git a/backend/migrations/20250320081915_longer_variable_description.up.sql b/backend/migrations/20250320081915_longer_variable_description.up.sql new file mode 100644 index 0000000000..d7c5ba06f5 --- /dev/null +++ b/backend/migrations/20250320081915_longer_variable_description.up.sql @@ -0,0 +1,3 @@ +-- Add up migration script here +ALTER TABLE variable +ALTER COLUMN description TYPE VARCHAR(10000); \ No newline at end of file diff --git a/backend/windmill-common/src/job_metrics.rs b/backend/windmill-common/src/job_metrics.rs index 6577e34d6e..d416e4d44b 100644 --- a/backend/windmill-common/src/job_metrics.rs +++ b/backend/windmill-common/src/job_metrics.rs @@ -49,10 +49,7 @@ pub async fn register_metric_for_job( .await? .flatten(); if exists.unwrap_or(false) { - return Err(error::Error::BadRequest(format!( - "Metric {} is already registered for job {}", - metric_id, job_id - ))); + return Ok(metric_id); } let (scalar_int, scalar_float, timestamps, timeseries_int, timeseries_float) = match metric_kind diff --git a/backend/windmill-worker/src/bash_executor.rs b/backend/windmill-worker/src/bash_executor.rs index 86f472705c..412014eb73 100644 --- a/backend/windmill-worker/src/bash_executor.rs +++ b/backend/windmill-worker/src/bash_executor.rs @@ -341,7 +341,7 @@ async fn handle_docker_job( tracing::error!("Error getting logs: {:?}", e); } _ => { - tracing::error!("End of stream"); + tracing::info!("End of docker logs stream"); return } }; From 41410c7246632ee1d9145f6d9ec5519fc3774ce8 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 20 Mar 2025 10:11:14 +0100 Subject: [PATCH 070/739] chore(main): release 1.478.0 (#5478) * chore(main): release 1.478.0 * Apply automatic changes --------- Co-authored-by: rubenfiszel <275584+rubenfiszel@users.noreply.github.com> --- CHANGELOG.md | 29 ++ backend/Cargo.lock | 413 ++++++++++-------- backend/Cargo.toml | 4 +- backend/windmill-api/openapi.yaml | 2 +- benchmarks/lib.ts | 2 +- cli/main.ts | 2 +- frontend/package-lock.json | 4 +- frontend/package.json | 2 +- lsp/Pipfile | 4 +- openflow.openapi.yaml | 2 +- .../WindmillClient/WindmillClient.psd1 | 2 +- python-client/wmill/pyproject.toml | 2 +- python-client/wmill_pg/pyproject.toml | 2 +- typescript-client/jsr.json | 2 +- typescript-client/package.json | 2 +- version.txt | 2 +- 16 files changed, 266 insertions(+), 210 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ad84d227ae..f02efe4dc4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,34 @@ # Changelog +## [1.478.0](https://github.com/windmill-labs/windmill/compare/v1.477.1...v1.478.0) (2025-03-20) + + +### Features + +* add raw string option and wrap option for http trigger ([#5467](https://github.com/windmill-labs/windmill/issues/5467)) ([9dba57d](https://github.com/windmill-labs/windmill/commit/9dba57d546c984ff8cfb26c73d2ccdda4c18aaf3)) +* add support for python list[x] ([#5486](https://github.com/windmill-labs/windmill/issues/5486)) ([90ccc3a](https://github.com/windmill-labs/windmill/commit/90ccc3aae5f79e701e2c9241ce2cf009674ff356)) +* backend arg schema validation ([#5455](https://github.com/windmill-labs/windmill/issues/5455)) ([6634c82](https://github.com/windmill-labs/windmill/commit/6634c82e209a36021e5b0c392de433f48f3d8b80)) +* eager app mode ([fe20e33](https://github.com/windmill-labs/windmill/commit/fe20e3374f24fc644036a6d19e34421aeb839a73)) +* filter by worker + backend perf opt ([#5489](https://github.com/windmill-labs/windmill/issues/5489)) ([880db31](https://github.com/windmill-labs/windmill/commit/880db319e8e2479fdf12abcac526f7fd5064a00f)) +* keep captures across drafts and deploys ([#5482](https://github.com/windmill-labs/windmill/issues/5482)) ([4f43b19](https://github.com/windmill-labs/windmill/commit/4f43b1984f4ea9a87b0489d4b40c1ecdcfdbdecd)) + + +### Bug Fixes + +* avoid lock contention for native workers on cached connection ([#5481](https://github.com/windmill-labs/windmill/issues/5481)) ([8e95bc3](https://github.com/windmill-labs/windmill/commit/8e95bc397284607188f861f27288bcc0ab368023)) +* fix delete completed job ([ead1592](https://github.com/windmill-labs/windmill/commit/ead1592399d832039e3e866c554529dfd25a7af9)) +* fix empty schema on flow page error ([86121ed](https://github.com/windmill-labs/windmill/commit/86121ed4ab68ec17b9481b8d74bb2ccaae8c3b60)) +* improve concurrency limit check performances ([eee7d33](https://github.com/windmill-labs/windmill/commit/eee7d33bd8811be75d319956133bd8d6292aea90)) +* improve memory metrics graph ([a6cf327](https://github.com/windmill-labs/windmill/commit/a6cf327f74ae84d58181280995f8d8e2d909ee05)) +* improve row lock contention on concurrency counter ([e8bb307](https://github.com/windmill-labs/windmill/commit/e8bb3075020ca44978f503a81a7997ba1bcd671b)) +* label not part of default variant arg ([4bc5c04](https://github.com/windmill-labs/windmill/commit/4bc5c04cd40e23ef9d13ba48d28612d5a865796e)) +* set proper slot for MobileFitlers popover ([#5491](https://github.com/windmill-labs/windmill/issues/5491)) ([6b4c25d](https://github.com/windmill-labs/windmill/commit/6b4c25d0d808a841dbfeaf91d29437071128266a)) + + +### Performance Improvements + +* improve perf of get completed flow node ([#5418](https://github.com/windmill-labs/windmill/issues/5418)) ([551c0ec](https://github.com/windmill-labs/windmill/commit/551c0ecd6a83671d60ede5a81f656c27ddbdbe4c)) + ## [1.477.1](https://github.com/windmill-labs/windmill/compare/v1.477.0...v1.477.1) (2025-03-13) diff --git a/backend/Cargo.lock b/backend/Cargo.lock index 087a0ef3f2..fe6e284da1 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -630,7 +630,7 @@ dependencies = [ "bytes", "http 1.3.1", "rand 0.8.5", - "reqwest 0.12.14", + "reqwest 0.12.15", "serde", "serde-aux", "serde_json", @@ -705,9 +705,9 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.87" +version = "0.1.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d556ec1359574147ec0c4fc5eb525f3f23263a592b1a9c07e0a75b427de55c97" +checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" dependencies = [ "proc-macro2", "quote", @@ -818,9 +818,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.27.0" +version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bbe221bbf523b625a4dd8585c7f38166e31167ec2ca98051dbcb4c3b6e825d2" +checksum = "77926887776171ced7d662120a75998e444d3750c951abfe07f90da130514b1f" dependencies = [ "bindgen 0.69.5", "cc", @@ -851,7 +851,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "tracing", - "uuid 1.15.1", + "uuid 1.16.0", ] [[package]] @@ -1018,7 +1018,7 @@ dependencies = [ "hyper-util", "pin-project-lite", "rustls 0.21.12", - "rustls 0.23.23", + "rustls 0.23.25", "rustls-native-certs 0.8.1", "rustls-pki-types", "tokio", @@ -1199,9 +1199,9 @@ checksum = "7b7e4c2464d97fe331d41de9d5db0def0a96f4d823b8b32a2efd503578988973" [[package]] name = "backon" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49fef586913a57ff189f25c9b3d034356a5bf6b3fa9a7f067588fe1698ba1f5d" +checksum = "970d91570c01a8a5959b36ad7dd1c30642df24b6b3068710066f6809f7033bb7" dependencies = [ "fastrand 2.3.0", "gloo-timers", @@ -1274,9 +1274,9 @@ dependencies = [ [[package]] name = "base64ct" -version = "1.7.1" +version = "1.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb97d56060ee67d285efb8001fec9d2a4c710c32efd2e14b5cbb5ba71930fc2d" +checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" [[package]] name = "better_scoped_tls" @@ -1322,7 +1322,7 @@ dependencies = [ "lazy_static", "lazycell", "log", - "prettyplease 0.2.30", + "prettyplease 0.2.31", "proc-macro2", "quote", "regex", @@ -1343,7 +1343,7 @@ dependencies = [ "clang-sys", "itertools 0.13.0", "log", - "prettyplease 0.2.30", + "prettyplease 0.2.31", "proc-macro2", "quote", "regex", @@ -1414,9 +1414,9 @@ dependencies = [ [[package]] name = "blake3" -version = "1.6.1" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "675f87afced0413c9bb02843499dbbd3882a237645883f71a2b59644a6d2f753" +checksum = "b17679a8d69b6d7fd9cd9801a536cec9fa5e5970b69f9d4747f70b39b031f5e7" dependencies = [ "arrayref", "arrayvec", @@ -1521,9 +1521,9 @@ dependencies = [ [[package]] name = "borsh" -version = "1.5.5" +version = "1.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5430e3be710b68d984d1391c854eb431a9d548640711faa54eecb1df93db91cc" +checksum = "b2b74d67a0fc0af8e9823b79fd1c43a0900e5a8f0e0f4cc9210796bf3a820126" dependencies = [ "borsh-derive", "cfg_aliases 0.2.1", @@ -1531,9 +1531,9 @@ dependencies = [ [[package]] name = "borsh-derive" -version = "1.5.5" +version = "1.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8b668d39970baad5356d7c83a86fee3a539e6f93bf6764c97368243e17a0487" +checksum = "2d37ed1b2c9b78421218a0b4f6d8349132d6ec2cfeba1cfb0118b0a8e268df9e" dependencies = [ "once_cell", "proc-macro-crate", @@ -1655,9 +1655,9 @@ dependencies = [ [[package]] name = "bytemuck_derive" -version = "1.8.1" +version = "1.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" +checksum = "2ff22c2722516255d1823ce3cc4bc0b154dbc9364be5c905d6baa6eccbbc8774" dependencies = [ "proc-macro2", "quote", @@ -1737,7 +1737,7 @@ dependencies = [ "num-traits", "num_cpus", "rand 0.8.5", - "rand_distr", + "rand_distr 0.4.3", "rayon", "safetensors", "thiserror 1.0.69", @@ -2628,7 +2628,7 @@ dependencies = [ "tokio", "tokio-util", "url", - "uuid 1.15.1", + "uuid 1.16.0", "xz2", "zstd", ] @@ -2728,7 +2728,7 @@ dependencies = [ "regex", "sha2 0.10.8", "unicode-segmentation", - "uuid 1.15.1", + "uuid 1.16.0", ] [[package]] @@ -2895,7 +2895,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef552e6f588e446098f6ba40d89ac146c8c7b64aade83c051ee00bb5d2bc18d" dependencies = [ "serde", - "uuid 1.15.1", + "uuid 1.16.0", ] [[package]] @@ -2951,7 +2951,7 @@ dependencies = [ "deno_error", "thiserror 2.0.12", "tokio", - "uuid 1.15.1", + "uuid 1.16.0", ] [[package]] @@ -3146,7 +3146,7 @@ dependencies = [ "spki", "thiserror 2.0.12", "tokio", - "uuid 1.15.1", + "uuid 1.16.0", "x25519-dalek", ] @@ -3321,7 +3321,7 @@ dependencies = [ "pin-project", "rand 0.8.5", "tokio", - "uuid 1.15.1", + "uuid 1.16.0", "winapi", "windows-sys 0.59.0", ] @@ -3768,7 +3768,7 @@ dependencies = [ "tokio", "tokio-metrics", "twox-hash 1.6.3", - "uuid 1.15.1", + "uuid 1.16.0", "which 6.0.3", "winapi", "windows-sys 0.59.0", @@ -3820,9 +3820,9 @@ dependencies = [ [[package]] name = "deno_terminal" -version = "0.2.0" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daef12499e89ee99e51ad6000a91f600d3937fb028ad4918af76810c5bc9e0d5" +checksum = "23f71c27009e0141dedd315f1dfa3ebb0a6ca4acce7c080fac576ea415a465f6" dependencies = [ "once_cell", "termcolor", @@ -3837,7 +3837,7 @@ dependencies = [ "deno_core", "deno_error", "deno_native_certs", - "rustls 0.23.23", + "rustls 0.23.25", "rustls-pemfile 2.2.0", "rustls-tokio-stream", "rustls-webpki 0.102.8", @@ -3888,7 +3888,7 @@ dependencies = [ "serde", "thiserror 2.0.12", "tokio", - "uuid 1.15.1", + "uuid 1.16.0", ] [[package]] @@ -3977,7 +3977,7 @@ dependencies = [ "num-bigint", "prost", "serde", - "uuid 1.15.1", + "uuid 1.16.0", ] [[package]] @@ -4003,7 +4003,7 @@ dependencies = [ "tokio", "tokio-util", "url", - "uuid 1.15.1", + "uuid 1.16.0", ] [[package]] @@ -4027,7 +4027,7 @@ dependencies = [ "thiserror 2.0.12", "tokio", "tokio-stream", - "uuid 1.15.1", + "uuid 1.16.0", "v8_valueserializer", ] @@ -4070,9 +4070,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.3.11" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" dependencies = [ "powerfmt", "serde", @@ -4676,7 +4676,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ce92ff622d6dadf7349484f42c93271a0d49b7cc4d466a936405bacbe10aa78" dependencies = [ "cfg-if", - "rustix 1.0.2", + "rustix 1.0.3", "windows-sys 0.59.0", ] @@ -4784,9 +4784,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "foldhash" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" [[package]] name = "foreign-types" @@ -5189,7 +5189,7 @@ dependencies = [ "libc", "log", "rustversion", - "windows", + "windows 0.58.0", ] [[package]] @@ -5248,14 +5248,16 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" dependencies = [ "cfg-if", + "js-sys", "libc", - "wasi 0.13.3+wasi-0.2.2", - "windows-targets 0.52.6", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", + "wasm-bindgen", ] [[package]] @@ -5481,16 +5483,16 @@ dependencies = [ [[package]] name = "half" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +checksum = "7db2ff139bba50379da6aa0766b52fdcb62cb5b263009b09ed58ba604e14bbd1" dependencies = [ "bytemuck", "cfg-if", "crunchy", "num-traits", - "rand 0.8.5", - "rand_distr", + "rand 0.9.0", + "rand_distr 0.5.1", ] [[package]] @@ -5720,13 +5722,13 @@ dependencies = [ [[package]] name = "hostname" -version = "0.3.1" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" +checksum = "f9c7c7c8ac16c798734b8a24560c1362120597c40d5e1459f09498f8f6c8f2ba" dependencies = [ + "cfg-if", "libc", - "match_cfg", - "winapi", + "windows 0.52.0", ] [[package]] @@ -5930,7 +5932,7 @@ dependencies = [ "http 1.3.1", "hyper 1.6.0", "hyper-util", - "rustls 0.23.23", + "rustls 0.23.25", "rustls-native-certs 0.8.1", "rustls-pki-types", "tokio", @@ -6774,9 +6776,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.21" +version = "1.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df9b68e50e6e0b26f672573834882eb57759f6db9b3be2ea3c35c91188bb4eaa" +checksum = "8b70e7a7df205e92a1a4cd9aaae7898dac0aa555503cc0a649494d0d60e7651d" dependencies = [ "cc", "libc", @@ -6798,9 +6800,9 @@ checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "linux-raw-sys" -version = "0.9.2" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db9c683daf087dc577b7506e9695b3d556a9f3849903fa28186283afd6809e9" +checksum = "fe7db12097d22ec582439daf8618b8fdd1a7bef6270e9af3b1ebcd30893cf413" [[package]] name = "litemap" @@ -6944,7 +6946,7 @@ dependencies = [ "base64 0.22.1", "gethostname", "mail-builder", - "rustls 0.23.23", + "rustls 0.23.25", "rustls-pki-types", "smtp-proto", "tokio", @@ -7025,12 +7027,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "204651f31b0a6a7b2128d2b92c372cd94607b210c3a6b6e542c57a8cfd4db996" -[[package]] -name = "match_cfg" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" - [[package]] name = "matchers" version = "0.1.0" @@ -7237,7 +7233,7 @@ dependencies = [ "smallvec", "tagptr", "thiserror 1.0.69", - "uuid 1.15.1", + "uuid 1.16.0", ] [[package]] @@ -7374,7 +7370,7 @@ dependencies = [ "sha2 0.10.8", "subprocess", "thiserror 1.0.69", - "uuid 1.15.1", + "uuid 1.16.0", "zstd", ] @@ -7731,7 +7727,7 @@ dependencies = [ "getrandom 0.2.15", "http 1.3.1", "rand 0.8.5", - "reqwest 0.12.14", + "reqwest 0.12.15", "serde", "serde_json", "serde_path_to_error", @@ -7777,7 +7773,7 @@ dependencies = [ "percent-encoding", "quick-xml 0.36.2", "rand 0.8.5", - "reqwest 0.12.14", + "reqwest 0.12.15", "ring 0.17.14", "serde", "serde_json", @@ -7808,9 +7804,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.21.0" +version = "1.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cde51589ab56b20a6f686b2c68f7a0bd6add753d697abf720d63f8db3ab7b1ad" +checksum = "d75b0bedcc4fe52caa0e03d9f1151a323e4aa5e2d78ba3580400cd3c9e2bc4bc" [[package]] name = "oneshot" @@ -8600,7 +8596,7 @@ dependencies = [ "postgres-protocol 0.6.8", "serde", "serde_json", - "uuid 1.15.1", + "uuid 1.16.0", ] [[package]] @@ -8636,9 +8632,9 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.30" +version = "0.2.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1ccf34da56fc294e7d4ccf69a85992b7dfb826b7cf57bac6a70bba3494cc08a" +checksum = "5316f57387668042f561aae71480de936257848f9c43ce528e311d89a07cadeb" dependencies = [ "proc-macro2", "syn 2.0.100", @@ -8860,7 +8856,7 @@ dependencies = [ "multimap", "once_cell", "petgraph 0.7.1", - "prettyplease 0.2.30", + "prettyplease 0.2.31", "prost", "prost-types", "regex", @@ -8943,12 +8939,6 @@ dependencies = [ "reborrow", ] -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - [[package]] name = "quick-xml" version = "0.30.0" @@ -8983,34 +8973,36 @@ dependencies = [ [[package]] name = "quinn" -version = "0.11.6" +version = "0.11.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef" +checksum = "c3bd15a6f2967aef83887dcb9fec0014580467e33720d073560cf015a5683012" dependencies = [ "bytes", + "cfg_aliases 0.2.1", "pin-project-lite", "quinn-proto", "quinn-udp", "rustc-hash 2.1.1", - "rustls 0.23.23", + "rustls 0.23.25", "socket2", "thiserror 2.0.12", "tokio", "tracing", + "web-time", ] [[package]] name = "quinn-proto" -version = "0.11.9" +version = "0.11.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" +checksum = "b820744eb4dc9b57a3398183639c511b5a26d2ed702cedd3febaa1393caa22cc" dependencies = [ "bytes", - "getrandom 0.2.15", - "rand 0.8.5", + "getrandom 0.3.2", + "rand 0.9.0", "ring 0.17.14", "rustc-hash 2.1.1", - "rustls 0.23.23", + "rustls 0.23.25", "rustls-pki-types", "slab", "thiserror 2.0.12", @@ -9042,6 +9034,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + [[package]] name = "radium" version = "0.7.0" @@ -9147,7 +9145,7 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom 0.3.1", + "getrandom 0.3.2", ] [[package]] @@ -9160,6 +9158,16 @@ dependencies = [ "rand 0.8.5", ] +[[package]] +name = "rand_distr" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8615d50dcf34fa31f7ab52692afec947c4dd0ab803cc87cb3b0b4570ff7463" +dependencies = [ + "num-traits", + "rand 0.9.0", +] + [[package]] name = "rand_hc" version = "0.2.0" @@ -9427,9 +9435,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.14" +version = "0.12.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "989e327e510263980e231de548a33e63d34962d29ae61b467389a1a09627a254" +checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" dependencies = [ "async-compression", "base64 0.22.1", @@ -9454,7 +9462,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.23", + "rustls 0.23.25", "rustls-native-certs 0.8.1", "rustls-pemfile 2.2.0", "rustls-pki-types", @@ -9480,12 +9488,11 @@ dependencies = [ [[package]] name = "resolv-conf" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00" +checksum = "48375394603e3dd4b2d64371f7148fd8c7baa2680e28741f2cb8d23b59e3d4c4" dependencies = [ "hostname", - "quick-error", ] [[package]] @@ -9557,7 +9564,7 @@ dependencies = [ "rkyv_derive", "seahash", "tinyvec", - "uuid 1.15.1", + "uuid 1.16.0", ] [[package]] @@ -9684,9 +9691,9 @@ dependencies = [ [[package]] name = "rust_decimal" -version = "1.36.0" +version = "1.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b082d80e3e3cc52b2ed634388d436fe1f4de6af5786cc2de9ba9737527bdf555" +checksum = "5c24af6e7ac43c88a8a458d1139d0246fdce2f6cd2f1ac6cb51eb88b29c978af" dependencies = [ "arrayvec", "borsh", @@ -9772,14 +9779,14 @@ dependencies = [ [[package]] name = "rustix" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7178faa4b75a30e269c71e61c353ce2748cf3d76f0c44c393f4e60abf49b825" +checksum = "e56a18552996ac8d29ecc3b190b4fdbb2d91ca4ec396de7bbffaf43f3d637e96" dependencies = [ "bitflags 2.9.0", "errno", "libc", - "linux-raw-sys 0.9.2", + "linux-raw-sys 0.9.3", "windows-sys 0.59.0", ] @@ -9811,16 +9818,16 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.23" +version = "0.23.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47796c98c480fce5406ef69d1c76378375492c3b0a0de587be0c1d9feb12f395" +checksum = "822ee9188ac4ec04a2f0531e55d035fb2de73f18b41a63c70c2712503b6fb13c" dependencies = [ "aws-lc-rs", "log", "once_cell", "ring 0.17.14", "rustls-pki-types", - "rustls-webpki 0.102.8", + "rustls-webpki 0.103.0", "subtle", "zeroize", ] @@ -9896,7 +9903,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22557157d7395bc30727745b365d923f1ecc230c4c80b176545f3f4f08c46e33" dependencies = [ "futures", - "rustls 0.23.23", + "rustls 0.23.25", "socket2", "tokio", ] @@ -9916,6 +9923,17 @@ name = "rustls-webpki" version = "0.102.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +dependencies = [ + "ring 0.17.14", + "rustls-pki-types", + "untrusted 0.9.0", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0aa4eeac2588ffff23e9d7a7e9b3f971c5fb5b7ebc9452745e0c232c64f83b2f" dependencies = [ "aws-lc-rs", "ring 0.17.14", @@ -10073,7 +10091,7 @@ dependencies = [ "serde", "thiserror 1.0.69", "url", - "uuid 1.15.1", + "uuid 1.16.0", ] [[package]] @@ -10111,7 +10129,7 @@ dependencies = [ "schemars_derive", "serde", "serde_json", - "uuid 1.15.1", + "uuid 1.16.0", ] [[package]] @@ -10942,7 +10960,7 @@ dependencies = [ "memchr", "once_cell", "percent-encoding", - "rustls 0.23.23", + "rustls 0.23.25", "rustls-pemfile 2.2.0", "serde", "serde_json", @@ -10953,7 +10971,7 @@ dependencies = [ "tokio-stream", "tracing", "url", - "uuid 1.15.1", + "uuid 1.16.0", "webpki-roots", ] @@ -11037,7 +11055,7 @@ dependencies = [ "stringprep", "thiserror 2.0.12", "tracing", - "uuid 1.15.1", + "uuid 1.16.0", "whoami", ] @@ -11078,7 +11096,7 @@ dependencies = [ "stringprep", "thiserror 2.0.12", "tracing", - "uuid 1.15.1", + "uuid 1.16.0", "whoami", ] @@ -11104,7 +11122,7 @@ dependencies = [ "sqlx-core", "tracing", "url", - "uuid 1.15.1", + "uuid 1.16.0", ] [[package]] @@ -11115,9 +11133,9 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "stacker" -version = "0.1.19" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9156ebd5870ef293bfb43f91c7a74528d363ec0d424afe24160ed5a4343d08a" +checksum = "601f9201feb9b09c00266478bf459952b9ef9a6b94edb2f21eba14ab681a60a9" dependencies = [ "cc", "cfg-if", @@ -11779,7 +11797,7 @@ dependencies = [ "tempfile", "thiserror 1.0.69", "time", - "uuid 1.15.1", + "uuid 1.16.0", "winapi", ] @@ -11860,7 +11878,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c56d6ff5591fc332739b3ce7035b57995a3ce29a93ffd6012660e0949c956ea8" dependencies = [ "murmurhash32", - "rand_distr", + "rand_distr 0.4.3", "tantivy-common", ] @@ -11892,15 +11910,14 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.18.0" +version = "3.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c317e0a526ee6120d8dabad239c8dadca62b24b6f168914bbbc8e2fb1f0e567" +checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" dependencies = [ - "cfg-if", "fastrand 2.3.0", - "getrandom 0.3.1", + "getrandom 0.3.2", "once_cell", - "rustix 1.0.2", + "rustix 1.0.3", "windows-sys 0.59.0", ] @@ -12009,7 +12026,7 @@ dependencies = [ "tokio-rustls 0.24.1", "tokio-util", "tracing", - "uuid 1.15.1", + "uuid 1.16.0", ] [[package]] @@ -12056,9 +12073,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.39" +version = "0.3.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dad298b01a40a23aac4580b67e3dbedb7cc8402f3592d7f49469de2ea4aecdd8" +checksum = "9d9c75b47bdff86fa3334a3db91356b8d7d86a9b839dab7d0bdc5c3d3a077618" dependencies = [ "deranged", "itoa", @@ -12071,15 +12088,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "765c97a5b985b7c11d7bc27fa927dc4fe6af3a6dfb021d28deb60d3bf51e76ef" +checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" [[package]] name = "time-macros" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8093bc3e81c3bc5f7879de09619d06c9a5a5e45ca44dfeeb7225bae38005c5c" +checksum = "29aa485584182073ed57fd5004aa09c371f021325014694e432313345865fd04" dependencies = [ "num-conv", "time-core", @@ -12307,7 +12324,7 @@ version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" dependencies = [ - "rustls 0.23.23", + "rustls 0.23.25", "tokio", ] @@ -12365,9 +12382,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.13" +version = "0.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" +checksum = "6b9590b93e6fcc1739458317cccd391ad3955e2bde8913edf6f95f9e65a8f034" dependencies = [ "bytes", "futures-core", @@ -12665,7 +12682,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba3beec919fbdf99d719de8eda6adae3281f8a5b71ae40431f44dc7423053d34" dependencies = [ "loki-api", - "reqwest 0.12.14", + "reqwest 0.12.15", "serde", "serde_json", "snap", @@ -12877,12 +12894,12 @@ dependencies = [ [[package]] name = "ulid" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab82fc73182c29b02e2926a6df32f2241dbadb5cfc111fd595515b3598f46bb3" +checksum = "470dbf6591da1b39d43c14523b2b469c86879a53e8b758c8e090a470fe7b1fbe" dependencies = [ "rand 0.9.0", - "uuid 1.15.1", + "uuid 1.16.0", "web-time", ] @@ -13095,7 +13112,7 @@ dependencies = [ "log", "native-tls", "once_cell", - "rustls 0.23.23", + "rustls 0.23.25", "rustls-pki-types", "serde", "serde_json", @@ -13174,11 +13191,11 @@ dependencies = [ [[package]] name = "uuid" -version = "1.15.1" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0f540e3240398cce6128b64ba83fdbdd86129c16a3aa1a3a252efd66eb3d587" +checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" dependencies = [ - "getrandom 0.3.1", + "getrandom 0.3.2", "serde", ] @@ -13289,9 +13306,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasi" -version = "0.13.3+wasi-0.2.2" +version = "0.14.2+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" dependencies = [ "wit-bindgen-rt", ] @@ -13587,9 +13604,9 @@ dependencies = [ [[package]] name = "widestring" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" +checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d" [[package]] name = "winapi" @@ -13624,7 +13641,7 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windmill" -version = "1.477.1" +version = "1.478.0" dependencies = [ "anyhow", "axum", @@ -13642,8 +13659,8 @@ dependencies = [ "prometheus", "quote", "rand 0.9.0", - "reqwest 0.12.14", - "rustls 0.23.23", + "reqwest 0.12.15", + "rustls 0.23.25", "serde", "serde_json", "sha2 0.10.8", @@ -13654,7 +13671,7 @@ dependencies = [ "tokio", "tracing", "url", - "uuid 1.15.1", + "uuid 1.16.0", "v8", "windmill-api", "windmill-api-client", @@ -13668,7 +13685,7 @@ dependencies = [ [[package]] name = "windmill-api" -version = "1.477.1" +version = "1.478.0" dependencies = [ "anyhow", "argon2", @@ -13721,7 +13738,7 @@ dependencies = [ "rand 0.9.0", "rdkafka", "regex", - "reqwest 0.12.14", + "reqwest 0.12.15", "rsa", "rumqttc", "rust-embed", @@ -13752,7 +13769,7 @@ dependencies = [ "ulid", "url", "urlencoding", - "uuid 1.15.1", + "uuid 1.16.0", "windmill-audit", "windmill-common", "windmill-git-sync", @@ -13765,7 +13782,7 @@ dependencies = [ [[package]] name = "windmill-api-client" -version = "1.477.1" +version = "1.478.0" dependencies = [ "base64 0.22.1", "chrono", @@ -13778,12 +13795,12 @@ dependencies = [ "serde", "serde_json", "syn 1.0.109", - "uuid 1.15.1", + "uuid 1.16.0", ] [[package]] name = "windmill-audit" -version = "1.477.1" +version = "1.478.0" dependencies = [ "chrono", "serde", @@ -13796,21 +13813,21 @@ dependencies = [ [[package]] name = "windmill-autoscaling" -version = "1.477.1" +version = "1.478.0" dependencies = [ "anyhow", "serde", "serde_json", "sqlx", "tracing", - "uuid 1.15.1", + "uuid 1.16.0", "windmill-common", "windmill-queue", ] [[package]] name = "windmill-common" -version = "1.477.1" +version = "1.478.0" dependencies = [ "anyhow", "async-stream", @@ -13849,7 +13866,7 @@ dependencies = [ "quick_cache", "rand 0.9.0", "regex", - "reqwest 0.12.14", + "reqwest 0.12.15", "semver 1.0.26", "serde", "serde_json", @@ -13865,27 +13882,27 @@ dependencies = [ "tracing-loki", "tracing-opentelemetry", "tracing-subscriber", - "uuid 1.15.1", + "uuid 1.16.0", "windmill-macros", ] [[package]] name = "windmill-git-sync" -version = "1.477.1" +version = "1.478.0" dependencies = [ "regex", "serde", "serde_json", "sqlx", "tracing", - "uuid 1.15.1", + "uuid 1.16.0", "windmill-common", "windmill-queue", ] [[package]] name = "windmill-indexer" -version = "1.477.1" +version = "1.478.0" dependencies = [ "anyhow", "bytes", @@ -13902,13 +13919,13 @@ dependencies = [ "tokio", "tokio-tar", "tracing", - "uuid 1.15.1", + "uuid 1.16.0", "windmill-common", ] [[package]] name = "windmill-macros" -version = "1.477.1" +version = "1.478.0" dependencies = [ "itertools 0.14.0", "lazy_static", @@ -13920,7 +13937,7 @@ dependencies = [ [[package]] name = "windmill-parser" -version = "1.477.1" +version = "1.478.0" dependencies = [ "convert_case 0.6.0", "serde", @@ -13929,7 +13946,7 @@ dependencies = [ [[package]] name = "windmill-parser-bash" -version = "1.477.1" +version = "1.478.0" dependencies = [ "anyhow", "lazy_static", @@ -13941,7 +13958,7 @@ dependencies = [ [[package]] name = "windmill-parser-csharp" -version = "1.477.1" +version = "1.478.0" dependencies = [ "anyhow", "serde_json", @@ -13953,7 +13970,7 @@ dependencies = [ [[package]] name = "windmill-parser-go" -version = "1.477.1" +version = "1.478.0" dependencies = [ "anyhow", "gosyn", @@ -13965,7 +13982,7 @@ dependencies = [ [[package]] name = "windmill-parser-graphql" -version = "1.477.1" +version = "1.478.0" dependencies = [ "anyhow", "lazy_static", @@ -13977,7 +13994,7 @@ dependencies = [ [[package]] name = "windmill-parser-php" -version = "1.477.1" +version = "1.478.0" dependencies = [ "anyhow", "itertools 0.14.0", @@ -13988,7 +14005,7 @@ dependencies = [ [[package]] name = "windmill-parser-py" -version = "1.477.1" +version = "1.478.0" dependencies = [ "anyhow", "itertools 0.14.0", @@ -13999,7 +14016,7 @@ dependencies = [ [[package]] name = "windmill-parser-py-imports" -version = "1.477.1" +version = "1.478.0" dependencies = [ "anyhow", "async-recursion", @@ -14019,7 +14036,7 @@ dependencies = [ [[package]] name = "windmill-parser-rust" -version = "1.477.1" +version = "1.478.0" dependencies = [ "anyhow", "convert_case 0.6.0", @@ -14036,7 +14053,7 @@ dependencies = [ [[package]] name = "windmill-parser-sql" -version = "1.477.1" +version = "1.478.0" dependencies = [ "anyhow", "lazy_static", @@ -14048,7 +14065,7 @@ dependencies = [ [[package]] name = "windmill-parser-ts" -version = "1.477.1" +version = "1.478.0" dependencies = [ "anyhow", "lazy_static", @@ -14066,7 +14083,7 @@ dependencies = [ [[package]] name = "windmill-parser-wasm" -version = "1.477.1" +version = "1.478.0" dependencies = [ "anyhow", "getrandom 0.2.15", @@ -14088,7 +14105,7 @@ dependencies = [ [[package]] name = "windmill-parser-yaml" -version = "1.477.1" +version = "1.478.0" dependencies = [ "anyhow", "serde_json", @@ -14098,7 +14115,7 @@ dependencies = [ [[package]] name = "windmill-queue" -version = "1.477.1" +version = "1.478.0" dependencies = [ "anyhow", "async-recursion", @@ -14115,7 +14132,7 @@ dependencies = [ "lazy_static", "prometheus", "regex", - "reqwest 0.12.14", + "reqwest 0.12.15", "serde", "serde_json", "serde_urlencoded", @@ -14124,14 +14141,14 @@ dependencies = [ "tokio", "tracing", "ulid", - "uuid 1.15.1", + "uuid 1.16.0", "windmill-audit", "windmill-common", ] [[package]] name = "windmill-sql-datatype-parser-wasm" -version = "1.477.1" +version = "1.478.0" dependencies = [ "wasm-bindgen", "wasm-bindgen-test", @@ -14141,7 +14158,7 @@ dependencies = [ [[package]] name = "windmill-worker" -version = "1.477.1" +version = "1.478.0" dependencies = [ "anyhow", "async-recursion", @@ -14189,7 +14206,7 @@ dependencies = [ "prometheus", "rand 0.9.0", "regex", - "reqwest 0.12.14", + "reqwest 0.12.15", "rust_decimal", "serde", "serde_json", @@ -14202,7 +14219,7 @@ dependencies = [ "tokio-util", "tracing", "urlencoding", - "uuid 1.15.1", + "uuid 1.16.0", "windmill-audit", "windmill-common", "windmill-git-sync", @@ -14222,6 +14239,16 @@ dependencies = [ "yaml-rust", ] +[[package]] +name = "windows" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" +dependencies = [ + "windows-core 0.52.0", + "windows-targets 0.52.6", +] + [[package]] name = "windows" version = "0.58.0" @@ -14278,9 +14305,9 @@ dependencies = [ [[package]] name = "windows-link" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dccfd733ce2b1753b03b6d3c65edf020262ea35e20ccdf3e288043e6dd620e3" +checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" [[package]] name = "windows-registry" @@ -14288,7 +14315,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" dependencies = [ - "windows-result 0.3.1", + "windows-result 0.3.2", "windows-strings 0.3.1", "windows-targets 0.53.0", ] @@ -14304,9 +14331,9 @@ dependencies = [ [[package]] name = "windows-result" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06374efe858fab7e4f881500e6e86ec8bc28f9462c47e5a9941a0142ad86b189" +checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" dependencies = [ "windows-link", ] @@ -14587,9 +14614,9 @@ checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904" [[package]] name = "wit-bindgen-rt" -version = "0.33.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" dependencies = [ "bitflags 2.9.0", ] @@ -14657,7 +14684,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d65cbf2f12c15564212d48f4e3dfb87923d25d611f2aed18f4cb23f0413d89e" dependencies = [ "libc", - "rustix 1.0.2", + "rustix 1.0.3", ] [[package]] diff --git a/backend/Cargo.toml b/backend/Cargo.toml index 180e78340a..cd2327c733 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "windmill" -version = "1.477.1" +version = "1.478.0" authors.workspace = true edition.workspace = true @@ -30,7 +30,7 @@ members = [ ] [workspace.package] -version = "1.477.1" +version = "1.478.0" authors = ["Ruben Fiszel "] edition = "2021" diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index 6a49031517..45506679cf 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.477.1 + version: 1.478.0 title: Windmill API contact: diff --git a/benchmarks/lib.ts b/benchmarks/lib.ts index 28b51c614d..e11360a1eb 100644 --- a/benchmarks/lib.ts +++ b/benchmarks/lib.ts @@ -2,7 +2,7 @@ import { sleep } from "https://deno.land/x/sleep@v1.2.1/mod.ts"; import * as windmill from "https://deno.land/x/windmill@v1.174.0/mod.ts"; import * as api from "https://deno.land/x/windmill@v1.174.0/windmill-api/index.ts"; -export const VERSION = "v1.477.1"; +export const VERSION = "v1.478.0"; export async function login(email: string, password: string): Promise { return await windmill.UserService.login({ diff --git a/cli/main.ts b/cli/main.ts index 4af62b2e78..5396f0c5fe 100644 --- a/cli/main.ts +++ b/cli/main.ts @@ -62,7 +62,7 @@ export { // } // }); -export const VERSION = "1.477.1"; +export const VERSION = "1.478.0"; const command = new Command() .name("wmill") diff --git a/frontend/package-lock.json b/frontend/package-lock.json index a28bf05c57..e95a0ad1c4 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "windmill-components", - "version": "1.477.1", + "version": "1.478.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "windmill-components", - "version": "1.477.1", + "version": "1.478.0", "license": "AGPL-3.0", "dependencies": { "@anthropic-ai/sdk": "^0.37.0", diff --git a/frontend/package.json b/frontend/package.json index 103af06906..7f963ed49e 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "windmill-components", - "version": "1.477.1", + "version": "1.478.0", "scripts": { "dev": "vite dev", "build": "vite build", diff --git a/lsp/Pipfile b/lsp/Pipfile index 12dd12b534..3008d239f4 100644 --- a/lsp/Pipfile +++ b/lsp/Pipfile @@ -4,8 +4,8 @@ verify_ssl = true name = "pypi" [packages] -wmill = ">=1.477.1" -wmill_pg = ">=1.477.1" +wmill = ">=1.478.0" +wmill_pg = ">=1.478.0" sendgrid = "*" mysql-connector-python = "*" pymongo = "*" diff --git a/openflow.openapi.yaml b/openflow.openapi.yaml index 85ef7bf22a..822fad8585 100644 --- a/openflow.openapi.yaml +++ b/openflow.openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.477.1 + version: 1.478.0 title: OpenFlow Spec contact: name: Ruben Fiszel diff --git a/powershell-client/WindmillClient/WindmillClient.psd1 b/powershell-client/WindmillClient/WindmillClient.psd1 index 0ffdb92130..b2b391c85a 100644 --- a/powershell-client/WindmillClient/WindmillClient.psd1 +++ b/powershell-client/WindmillClient/WindmillClient.psd1 @@ -12,7 +12,7 @@ RootModule = 'WindmillClient.psm1' # Version number of this module. - ModuleVersion = '1.477.1' + ModuleVersion = '1.478.0' # Supported PSEditions # CompatiblePSEditions = @() diff --git a/python-client/wmill/pyproject.toml b/python-client/wmill/pyproject.toml index ffc8624d3c..3b48f36b91 100644 --- a/python-client/wmill/pyproject.toml +++ b/python-client/wmill/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "wmill" -version = "1.477.1" +version = "1.478.0" description = "A client library for accessing Windmill server wrapping the Windmill client API" license = "Apache-2.0" homepage = "https://windmill.dev" diff --git a/python-client/wmill_pg/pyproject.toml b/python-client/wmill_pg/pyproject.toml index 6503bcb684..123c82e22b 100644 --- a/python-client/wmill_pg/pyproject.toml +++ b/python-client/wmill_pg/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "wmill-pg" -version = "1.477.1" +version = "1.478.0" description = "An extension client for the wmill client library focused on pg" license = "Apache-2.0" homepage = "https://windmill.dev" diff --git a/typescript-client/jsr.json b/typescript-client/jsr.json index 06978a3e09..e84fe51f7b 100644 --- a/typescript-client/jsr.json +++ b/typescript-client/jsr.json @@ -1,6 +1,6 @@ { "name": "@windmill/windmill", - "version": "1.477.1", + "version": "1.478.0", "exports": "./src/index.ts", "publish": { "exclude": ["!src", "./s3Types.ts", "./client.ts"] diff --git a/typescript-client/package.json b/typescript-client/package.json index 13cb7445ad..6cdb8e71da 100644 --- a/typescript-client/package.json +++ b/typescript-client/package.json @@ -1,7 +1,7 @@ { "name": "windmill-client", "description": "Windmill SDK client for browsers and Node.js", - "version": "1.477.1", + "version": "1.478.0", "author": "Ruben Fiszel", "license": "Apache 2.0", "devDependencies": { diff --git a/version.txt b/version.txt index 6f7a1be84e..71fcd94115 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.477.1 +1.478.0 From 2fe4c69af345470129ed713298ac84ea5b738615 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 20 Mar 2025 10:48:18 +0100 Subject: [PATCH 071/739] minor ci checks --- .github/workflows/backend-check.yml | 4 ++++ .github/workflows/frontend-check.yml | 8 +++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.github/workflows/backend-check.yml b/.github/workflows/backend-check.yml index 38f6f6df21..db832ff361 100644 --- a/.github/workflows/backend-check.yml +++ b/.github/workflows/backend-check.yml @@ -1,5 +1,9 @@ name: Backend check on: + pull_request: + types: [opened, synchronize, reopened] + - "backend/**" + - ".github/workflows/backend-check.yml" push: paths: - "backend/**" diff --git a/.github/workflows/frontend-check.yml b/.github/workflows/frontend-check.yml index 64883cb303..4245949f33 100644 --- a/.github/workflows/frontend-check.yml +++ b/.github/workflows/frontend-check.yml @@ -1,10 +1,16 @@ name: check frontend build on: pull_request: - types: [opened, synchronize, reopened, closed] + types: [opened, synchronize, reopened] paths: - "frontend/**" + - ".github/workflows/frontend-check.yml" + merge_group: + push: + paths: + - "frontend/**" + - ".github/workflows/frontend-check.yml" jobs: npm_check: From 0463c10a84ab09f66b99c331d3860fa750606f51 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 20 Mar 2025 11:51:37 +0100 Subject: [PATCH 072/739] fix: update deps versions --- backend/Cargo.lock | 23 +++++++---------------- backend/Cargo.toml | 3 ++- backend/windmill-api/Cargo.toml | 3 ++- 3 files changed, 11 insertions(+), 18 deletions(-) diff --git a/backend/Cargo.lock b/backend/Cargo.lock index fe6e284da1..8b7d593daf 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -1737,7 +1737,7 @@ dependencies = [ "num-traits", "num_cpus", "rand 0.8.5", - "rand_distr 0.4.3", + "rand_distr", "rayon", "safetensors", "thiserror 1.0.69", @@ -5483,16 +5483,16 @@ dependencies = [ [[package]] name = "half" -version = "2.5.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7db2ff139bba50379da6aa0766b52fdcb62cb5b263009b09ed58ba604e14bbd1" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" dependencies = [ "bytemuck", "cfg-if", "crunchy", "num-traits", - "rand 0.9.0", - "rand_distr 0.5.1", + "rand 0.8.5", + "rand_distr", ] [[package]] @@ -9158,16 +9158,6 @@ dependencies = [ "rand 0.8.5", ] -[[package]] -name = "rand_distr" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8615d50dcf34fa31f7ab52692afec947c4dd0ab803cc87cb3b0b4570ff7463" -dependencies = [ - "num-traits", - "rand 0.9.0", -] - [[package]] name = "rand_hc" version = "0.2.0" @@ -11878,7 +11868,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c56d6ff5591fc332739b3ce7035b57995a3ce29a93ffd6012660e0949c956ea8" dependencies = [ "murmurhash32", - "rand_distr 0.4.3", + "rand_distr", "tantivy-common", ] @@ -13713,6 +13703,7 @@ dependencies = [ "datafusion", "futures", "git-version", + "half", "hex", "hf-hub", "hmac", diff --git a/backend/Cargo.toml b/backend/Cargo.toml index cd2327c733..ccd68f80d7 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -236,7 +236,8 @@ swc_ecma_visit = "=0.104.8" async-recursion = "^1" - +# remove when async-strip is removed, needed to pin rand +half = "=2.4.1" base64 = "^0" base32 = "^0" hmac = "0.12.1" diff --git a/backend/windmill-api/Cargo.toml b/backend/windmill-api/Cargo.toml index 253a125df7..20fe893517 100644 --- a/backend/windmill-api/Cargo.toml +++ b/backend/windmill-api/Cargo.toml @@ -14,7 +14,7 @@ enterprise = ["windmill-queue/enterprise", "windmill-audit/enterprise", "windmil stripe = ["dep:async-stripe"] enterprise_saml = ["dep:samael"] benchmark = [] -embedding = ["dep:tinyvector", "dep:hf-hub", "dep:tokenizers", "dep:candle-core", "dep:candle-transformers", "dep:candle-nn"] +embedding = ["dep:tinyvector", "dep:hf-hub", "dep:tokenizers", "dep:candle-core", "dep:candle-transformers", "dep:candle-nn", "dep:half"] parquet = ["dep:datafusion", "dep:object_store", "dep:url", "windmill-common/parquet"] prometheus = ["windmill-common/prometheus", "windmill-queue/prometheus", "dep:prometheus"] openidconnect = ["dep:openidconnect"] @@ -45,6 +45,7 @@ tokio.workspace = true anyhow.workspace = true argon2.workspace = true axum.workspace = true +half = { workspace = true, optional = true} futures.workspace = true git-version.workspace = true tower.workspace = true From b0a18e35f75d1671a10a74bf82f9e79f993849da Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 20 Mar 2025 11:57:14 +0100 Subject: [PATCH 073/739] fix ci check --- .github/workflows/backend-check.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/backend-check.yml b/.github/workflows/backend-check.yml index db832ff361..309fa4d994 100644 --- a/.github/workflows/backend-check.yml +++ b/.github/workflows/backend-check.yml @@ -2,6 +2,7 @@ name: Backend check on: pull_request: types: [opened, synchronize, reopened] + paths: - "backend/**" - ".github/workflows/backend-check.yml" push: From 18e505746490e75db571c27154a7442b1f0ee5d9 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 20 Mar 2025 12:01:55 +0100 Subject: [PATCH 074/739] chore(main): release 1.478.1 (#5492) * chore(main): release 1.478.1 * Apply automatic changes --------- Co-authored-by: rubenfiszel <275584+rubenfiszel@users.noreply.github.com> --- CHANGELOG.md | 7 +++ backend/Cargo.lock | 50 +++++++++---------- backend/Cargo.toml | 4 +- backend/windmill-api/openapi.yaml | 2 +- benchmarks/lib.ts | 2 +- cli/main.ts | 2 +- frontend/package-lock.json | 4 +- frontend/package.json | 2 +- lsp/Pipfile | 4 +- openflow.openapi.yaml | 2 +- .../WindmillClient/WindmillClient.psd1 | 2 +- python-client/wmill/pyproject.toml | 2 +- python-client/wmill_pg/pyproject.toml | 2 +- typescript-client/jsr.json | 2 +- typescript-client/package.json | 2 +- version.txt | 2 +- 16 files changed, 49 insertions(+), 42 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f02efe4dc4..88026c4f38 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [1.478.1](https://github.com/windmill-labs/windmill/compare/v1.478.0...v1.478.1) (2025-03-20) + + +### Bug Fixes + +* update deps versions ([0463c10](https://github.com/windmill-labs/windmill/commit/0463c10a84ab09f66b99c331d3860fa750606f51)) + ## [1.478.0](https://github.com/windmill-labs/windmill/compare/v1.477.1...v1.478.0) (2025-03-20) diff --git a/backend/Cargo.lock b/backend/Cargo.lock index 8b7d593daf..8d400bb62a 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -13631,7 +13631,7 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windmill" -version = "1.478.0" +version = "1.478.1" dependencies = [ "anyhow", "axum", @@ -13675,7 +13675,7 @@ dependencies = [ [[package]] name = "windmill-api" -version = "1.478.0" +version = "1.478.1" dependencies = [ "anyhow", "argon2", @@ -13773,7 +13773,7 @@ dependencies = [ [[package]] name = "windmill-api-client" -version = "1.478.0" +version = "1.478.1" dependencies = [ "base64 0.22.1", "chrono", @@ -13791,7 +13791,7 @@ dependencies = [ [[package]] name = "windmill-audit" -version = "1.478.0" +version = "1.478.1" dependencies = [ "chrono", "serde", @@ -13804,7 +13804,7 @@ dependencies = [ [[package]] name = "windmill-autoscaling" -version = "1.478.0" +version = "1.478.1" dependencies = [ "anyhow", "serde", @@ -13818,7 +13818,7 @@ dependencies = [ [[package]] name = "windmill-common" -version = "1.478.0" +version = "1.478.1" dependencies = [ "anyhow", "async-stream", @@ -13879,7 +13879,7 @@ dependencies = [ [[package]] name = "windmill-git-sync" -version = "1.478.0" +version = "1.478.1" dependencies = [ "regex", "serde", @@ -13893,7 +13893,7 @@ dependencies = [ [[package]] name = "windmill-indexer" -version = "1.478.0" +version = "1.478.1" dependencies = [ "anyhow", "bytes", @@ -13916,7 +13916,7 @@ dependencies = [ [[package]] name = "windmill-macros" -version = "1.478.0" +version = "1.478.1" dependencies = [ "itertools 0.14.0", "lazy_static", @@ -13928,7 +13928,7 @@ dependencies = [ [[package]] name = "windmill-parser" -version = "1.478.0" +version = "1.478.1" dependencies = [ "convert_case 0.6.0", "serde", @@ -13937,7 +13937,7 @@ dependencies = [ [[package]] name = "windmill-parser-bash" -version = "1.478.0" +version = "1.478.1" dependencies = [ "anyhow", "lazy_static", @@ -13949,7 +13949,7 @@ dependencies = [ [[package]] name = "windmill-parser-csharp" -version = "1.478.0" +version = "1.478.1" dependencies = [ "anyhow", "serde_json", @@ -13961,7 +13961,7 @@ dependencies = [ [[package]] name = "windmill-parser-go" -version = "1.478.0" +version = "1.478.1" dependencies = [ "anyhow", "gosyn", @@ -13973,7 +13973,7 @@ dependencies = [ [[package]] name = "windmill-parser-graphql" -version = "1.478.0" +version = "1.478.1" dependencies = [ "anyhow", "lazy_static", @@ -13985,7 +13985,7 @@ dependencies = [ [[package]] name = "windmill-parser-php" -version = "1.478.0" +version = "1.478.1" dependencies = [ "anyhow", "itertools 0.14.0", @@ -13996,7 +13996,7 @@ dependencies = [ [[package]] name = "windmill-parser-py" -version = "1.478.0" +version = "1.478.1" dependencies = [ "anyhow", "itertools 0.14.0", @@ -14007,7 +14007,7 @@ dependencies = [ [[package]] name = "windmill-parser-py-imports" -version = "1.478.0" +version = "1.478.1" dependencies = [ "anyhow", "async-recursion", @@ -14027,7 +14027,7 @@ dependencies = [ [[package]] name = "windmill-parser-rust" -version = "1.478.0" +version = "1.478.1" dependencies = [ "anyhow", "convert_case 0.6.0", @@ -14044,7 +14044,7 @@ dependencies = [ [[package]] name = "windmill-parser-sql" -version = "1.478.0" +version = "1.478.1" dependencies = [ "anyhow", "lazy_static", @@ -14056,7 +14056,7 @@ dependencies = [ [[package]] name = "windmill-parser-ts" -version = "1.478.0" +version = "1.478.1" dependencies = [ "anyhow", "lazy_static", @@ -14074,7 +14074,7 @@ dependencies = [ [[package]] name = "windmill-parser-wasm" -version = "1.478.0" +version = "1.478.1" dependencies = [ "anyhow", "getrandom 0.2.15", @@ -14096,7 +14096,7 @@ dependencies = [ [[package]] name = "windmill-parser-yaml" -version = "1.478.0" +version = "1.478.1" dependencies = [ "anyhow", "serde_json", @@ -14106,7 +14106,7 @@ dependencies = [ [[package]] name = "windmill-queue" -version = "1.478.0" +version = "1.478.1" dependencies = [ "anyhow", "async-recursion", @@ -14139,7 +14139,7 @@ dependencies = [ [[package]] name = "windmill-sql-datatype-parser-wasm" -version = "1.478.0" +version = "1.478.1" dependencies = [ "wasm-bindgen", "wasm-bindgen-test", @@ -14149,7 +14149,7 @@ dependencies = [ [[package]] name = "windmill-worker" -version = "1.478.0" +version = "1.478.1" dependencies = [ "anyhow", "async-recursion", diff --git a/backend/Cargo.toml b/backend/Cargo.toml index ccd68f80d7..82fc14974c 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "windmill" -version = "1.478.0" +version = "1.478.1" authors.workspace = true edition.workspace = true @@ -30,7 +30,7 @@ members = [ ] [workspace.package] -version = "1.478.0" +version = "1.478.1" authors = ["Ruben Fiszel "] edition = "2021" diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index 45506679cf..29b84c05b5 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.478.0 + version: 1.478.1 title: Windmill API contact: diff --git a/benchmarks/lib.ts b/benchmarks/lib.ts index e11360a1eb..b79c897c96 100644 --- a/benchmarks/lib.ts +++ b/benchmarks/lib.ts @@ -2,7 +2,7 @@ import { sleep } from "https://deno.land/x/sleep@v1.2.1/mod.ts"; import * as windmill from "https://deno.land/x/windmill@v1.174.0/mod.ts"; import * as api from "https://deno.land/x/windmill@v1.174.0/windmill-api/index.ts"; -export const VERSION = "v1.478.0"; +export const VERSION = "v1.478.1"; export async function login(email: string, password: string): Promise { return await windmill.UserService.login({ diff --git a/cli/main.ts b/cli/main.ts index 5396f0c5fe..969f2c2528 100644 --- a/cli/main.ts +++ b/cli/main.ts @@ -62,7 +62,7 @@ export { // } // }); -export const VERSION = "1.478.0"; +export const VERSION = "1.478.1"; const command = new Command() .name("wmill") diff --git a/frontend/package-lock.json b/frontend/package-lock.json index e95a0ad1c4..b307035fca 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "windmill-components", - "version": "1.478.0", + "version": "1.478.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "windmill-components", - "version": "1.478.0", + "version": "1.478.1", "license": "AGPL-3.0", "dependencies": { "@anthropic-ai/sdk": "^0.37.0", diff --git a/frontend/package.json b/frontend/package.json index 7f963ed49e..9032983fea 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "windmill-components", - "version": "1.478.0", + "version": "1.478.1", "scripts": { "dev": "vite dev", "build": "vite build", diff --git a/lsp/Pipfile b/lsp/Pipfile index 3008d239f4..4f48b2a74f 100644 --- a/lsp/Pipfile +++ b/lsp/Pipfile @@ -4,8 +4,8 @@ verify_ssl = true name = "pypi" [packages] -wmill = ">=1.478.0" -wmill_pg = ">=1.478.0" +wmill = ">=1.478.1" +wmill_pg = ">=1.478.1" sendgrid = "*" mysql-connector-python = "*" pymongo = "*" diff --git a/openflow.openapi.yaml b/openflow.openapi.yaml index 822fad8585..f8b69ef318 100644 --- a/openflow.openapi.yaml +++ b/openflow.openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.478.0 + version: 1.478.1 title: OpenFlow Spec contact: name: Ruben Fiszel diff --git a/powershell-client/WindmillClient/WindmillClient.psd1 b/powershell-client/WindmillClient/WindmillClient.psd1 index b2b391c85a..892b799607 100644 --- a/powershell-client/WindmillClient/WindmillClient.psd1 +++ b/powershell-client/WindmillClient/WindmillClient.psd1 @@ -12,7 +12,7 @@ RootModule = 'WindmillClient.psm1' # Version number of this module. - ModuleVersion = '1.478.0' + ModuleVersion = '1.478.1' # Supported PSEditions # CompatiblePSEditions = @() diff --git a/python-client/wmill/pyproject.toml b/python-client/wmill/pyproject.toml index 3b48f36b91..107ad24483 100644 --- a/python-client/wmill/pyproject.toml +++ b/python-client/wmill/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "wmill" -version = "1.478.0" +version = "1.478.1" description = "A client library for accessing Windmill server wrapping the Windmill client API" license = "Apache-2.0" homepage = "https://windmill.dev" diff --git a/python-client/wmill_pg/pyproject.toml b/python-client/wmill_pg/pyproject.toml index 123c82e22b..a7aaf3080b 100644 --- a/python-client/wmill_pg/pyproject.toml +++ b/python-client/wmill_pg/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "wmill-pg" -version = "1.478.0" +version = "1.478.1" description = "An extension client for the wmill client library focused on pg" license = "Apache-2.0" homepage = "https://windmill.dev" diff --git a/typescript-client/jsr.json b/typescript-client/jsr.json index e84fe51f7b..941ec84745 100644 --- a/typescript-client/jsr.json +++ b/typescript-client/jsr.json @@ -1,6 +1,6 @@ { "name": "@windmill/windmill", - "version": "1.478.0", + "version": "1.478.1", "exports": "./src/index.ts", "publish": { "exclude": ["!src", "./s3Types.ts", "./client.ts"] diff --git a/typescript-client/package.json b/typescript-client/package.json index 6cdb8e71da..32ce7225f8 100644 --- a/typescript-client/package.json +++ b/typescript-client/package.json @@ -1,7 +1,7 @@ { "name": "windmill-client", "description": "Windmill SDK client for browsers and Node.js", - "version": "1.478.0", + "version": "1.478.1", "author": "Ruben Fiszel", "license": "Apache 2.0", "devDependencies": { diff --git a/version.txt b/version.txt index 71fcd94115..76828ea7af 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.478.0 +1.478.1 From a3faea16e77796a1b989db4285b3fef722ac55b2 Mon Sep 17 00:00:00 2001 From: pyranota <92104930+pyranota@users.noreply.github.com> Date: Thu, 20 Mar 2025 18:45:21 +0300 Subject: [PATCH 075/739] feat: add nu-lang support (#5217) * feat: add nu (nushell) support * add worker tests * deactivate tables and non-any types below top-level full support will come in V1 for V0 it's better to keep things minimal and simple * add syntax highlighting used python's grammar, since nushell isn't supported by monaco nor svelte-highlights for V1 nu will get it`s own grammar * add logo * partially implement plugin support * change logo + ability to deploy + nsjail draft * static variables + get_resource + get_variable * lsp/dev.nu + initial nu lsp (not working yet) * make it work with nsjail * nullguard * Much more flexible signature parsing and better error-messages * add init script * rename nulsp to nu * install nu to dockerfile * fix merge * implement Default for MainArgSignature * stage NU_CACHE_DIR * improve dockerfiles * dev.nu for parser-wasm + flake.nix * update code for windows * add nushell to flake * upload Cargo.lock * make build.sh work on nixos * build wasm cli parsers * add docs to README_DEV.md * add helper script docker/dev.nu * improve docker/dev.nu * fix windows * commit frontend/package(lock).json * update cargo.lock * correctly update cargo.lock * remove lsp * update flake.nix to include svelte server and nushell * Revert base.sql to main * remove PLUGIN_USE_RE * make CARGO_PATH private * add nu to cli * Change flags to build wasm-nu-parser * remove flake.nix from parser-wasm * update wasm-build target * remove unused import * add cli support for nu * update github workflows * wasm-build 0.17 -> 0.19 * update build script * update cargo.lock * Fix typographical error * update Cargo.lock * update ENV_SETTINGS * use published nu parser * update package.lock * rewrite parser in tree-sitter * implement parser from scratch * polishing * change init script to match new parser * fix imports * fix cli build * fix cli build * merge * update wasm * use MiniPulledJob * update cli * change cli wasm schema * change cli * update deno.json * make wasm modules load lazily * regenerate parsers * remove leftover * update cargo.lock * clean up dnt.ts * add docs to cli/test.nu * add schema validation option * add Nu to try_validate_schema * reference frontend to new parser version --- .github/DockerfileBackendTests | 11 +- .github/workflows/build-publish-rh-image.yml | 4 +- .github/workflows/build_windows_worker_.yml | 2 +- .github/workflows/docker-image-rpi4.yml | 2 +- .github/workflows/docker-image.yml | 4 +- .github/workflows/publish_windows_worker.yml | 2 +- .gitignore | 1 + Dockerfile | 2 + backend/Cargo.lock | 625 ++- backend/Cargo.toml | 8 +- .../20250122094704_add_nu_lang.down.sql | 1 + .../20250122094704_add_nu_lang.up.sql | 2 + backend/parsers/windmill-parser-nu/Cargo.toml | 16 + backend/parsers/windmill-parser-nu/src/lib.rs | 261 + .../parsers/windmill-parser-nu/tests/tests.rs | 690 +++ .../tests/fixtures/base.sql | 2 +- backend/parsers/windmill-parser-wasm/.envrc | 1 + .../parsers/windmill-parser-wasm/Cargo.toml | 2 + .../windmill-parser-wasm/README_DEV.md | 28 +- .../windmill-parser-wasm/build-pkgs-cli.sh | 75 + .../windmill-parser-wasm/build-pkgs-mac.sh | 25 +- .../windmill-parser-wasm/build-pkgs.sh | 27 +- backend/parsers/windmill-parser-wasm/build.sh | 8 +- .../parsers/windmill-parser-wasm/deno.json | 2 +- backend/parsers/windmill-parser-wasm/dev.nu | 25 + .../parsers/windmill-parser-wasm/flake.lock | 95 - .../parsers/windmill-parser-wasm/flake.nix | 37 - .../windmill-parser-wasm/publish-pkgs.sh | 3 + .../parsers/windmill-parser-wasm/src/lib.rs | 6 + backend/parsers/windmill-parser/src/lib.rs | 2 +- backend/src/main.rs | 5 +- backend/tests/worker.rs | 103 + backend/windmill-api/openapi.yaml | 3 +- backend/windmill-api/src/scripts.rs | 1 + backend/windmill-api/src/workspaces_export.rs | 1 + .../windmill-common/src/global_settings.rs | 3 +- backend/windmill-common/src/schema.rs | 2 +- backend/windmill-common/src/scripts.rs | 2 + backend/windmill-common/src/worker.rs | 1 + backend/windmill-worker/Cargo.toml | 2 + .../nsjail/run.nu.config.proto | 106 + backend/windmill-worker/src/lib.rs | 2 + backend/windmill-worker/src/nu_executor.rs | 356 ++ backend/windmill-worker/src/worker.rs | 32 + .../windmill-worker/src/worker_lockfiles.rs | 1 + cli/bootstrap/script_bootstrap.ts | 5 + cli/deno.json | 2 +- cli/deno.lock | 4490 ++++++++--------- cli/dnt.ts | 32 +- cli/gen/core/OpenAPI.ts | 2 +- cli/gen/services.gen.ts | 40 +- cli/gen/types.gen.ts | 55 +- cli/metadata.ts | 53 +- cli/script.ts | 3 + cli/script_common.ts | 3 + cli/sync.ts | 2 + cli/test.nu | 88 + cli/types.ts | 1 + cli/wasm/csharp/windmill_parser_wasm.d.ts | 3 + cli/wasm/csharp/windmill_parser_wasm.js | 121 + cli/wasm/csharp/windmill_parser_wasm_bg.wasm | Bin 0 -> 3668819 bytes .../csharp/windmill_parser_wasm_bg.wasm.d.ts | 29 + cli/wasm/go/windmill_parser_wasm.d.ts | 3 + cli/wasm/go/windmill_parser_wasm.js | 121 + cli/wasm/go/windmill_parser_wasm_bg.wasm | Bin 0 -> 297631 bytes cli/wasm/go/windmill_parser_wasm_bg.wasm.d.ts | 9 + cli/wasm/nu/windmill_parser_wasm.d.ts | 3 + cli/wasm/nu/windmill_parser_wasm.js | 121 + cli/wasm/nu/windmill_parser_wasm_bg.wasm | Bin 0 -> 184528 bytes cli/wasm/nu/windmill_parser_wasm_bg.wasm.d.ts | 9 + cli/wasm/php/windmill_parser_wasm.d.ts | 3 + cli/wasm/php/windmill_parser_wasm.js | 121 + cli/wasm/php/windmill_parser_wasm_bg.wasm | Bin 0 -> 1053462 bytes .../php/windmill_parser_wasm_bg.wasm.d.ts | 9 + cli/wasm/python/windmill_parser_wasm.d.ts | 3 + cli/wasm/python/windmill_parser_wasm.js | 128 + cli/wasm/python/windmill_parser_wasm_bg.wasm | Bin 0 -> 2088454 bytes .../python/windmill_parser_wasm_bg.wasm.d.ts | 9 + cli/wasm/regex/windmill_parser_wasm.d.ts | 12 + cli/wasm/regex/windmill_parser_wasm.js | 289 ++ cli/wasm/regex/windmill_parser_wasm_bg.wasm | Bin 0 -> 282356 bytes .../regex/windmill_parser_wasm_bg.wasm.d.ts | 18 + cli/wasm/rust/windmill_parser_wasm.d.ts | 3 + cli/wasm/rust/windmill_parser_wasm.js | 121 + cli/wasm/rust/windmill_parser_wasm_bg.wasm | Bin 0 -> 1169193 bytes .../rust/windmill_parser_wasm_bg.wasm.d.ts | 9 + cli/wasm/ts/windmill_parser_wasm.d.ts | 5 + cli/wasm/ts/windmill_parser_wasm.js | 429 ++ cli/wasm/ts/windmill_parser_wasm_bg.wasm | Bin 0 -> 1846386 bytes cli/wasm/ts/windmill_parser_wasm_bg.wasm.d.ts | 13 + cli/wasm/windmill_parser_wasm.generated.d.ts | 146 - cli/wasm/windmill_parser_wasm.generated.js | 1268 ----- cli/wasm/windmill_parser_wasm_bg.wasm | Bin 9852108 -> 0 bytes cli/wasm/yaml/windmill_parser_wasm.d.ts | 3 + cli/wasm/yaml/windmill_parser_wasm.js | 121 + cli/wasm/yaml/windmill_parser_wasm_bg.wasm | Bin 0 -> 262484 bytes .../yaml/windmill_parser_wasm_bg.wasm.d.ts | 9 + docker/DockerfileFull | 6 + docker/DockerfileFullEe | 5 + docker/DockerfileNsjail | 5 + docker/dev.nu | 170 + flake.lock | 12 +- flake.nix | 375 +- frontend/package-lock.json | 6 + frontend/package.json | 3 +- frontend/src/lib/components/Editor.svelte | 9 +- frontend/src/lib/components/EditorBar.svelte | 17 +- .../src/lib/components/HighlightCode.svelte | 2 + .../src/lib/components/ScriptBuilder.svelte | 2 +- .../src/lib/components/ScriptEditor.svelte | 2 +- .../src/lib/components/WorkerGroup.svelte | 3 +- .../common/languageIcons/LanguageIcon.svelte | 7 +- .../src/lib/components/icons/NuIcon.svelte | 6 + frontend/src/lib/editorUtils.ts | 2 + frontend/src/lib/infer.ts | 8 + frontend/src/lib/script_helpers.ts | 51 + frontend/src/lib/scripts.ts | 7 +- .../(root)/(logged)/run/[...run]/+page.svelte | 2 +- lsp/dev.nu | 21 + lsp/pyls_launcher.py | 8 - 120 files changed, 7107 insertions(+), 4125 deletions(-) create mode 100644 backend/migrations/20250122094704_add_nu_lang.down.sql create mode 100644 backend/migrations/20250122094704_add_nu_lang.up.sql create mode 100644 backend/parsers/windmill-parser-nu/Cargo.toml create mode 100644 backend/parsers/windmill-parser-nu/src/lib.rs create mode 100644 backend/parsers/windmill-parser-nu/tests/tests.rs create mode 100644 backend/parsers/windmill-parser-wasm/.envrc create mode 100755 backend/parsers/windmill-parser-wasm/build-pkgs-cli.sh create mode 100755 backend/parsers/windmill-parser-wasm/dev.nu delete mode 100644 backend/parsers/windmill-parser-wasm/flake.lock delete mode 100644 backend/parsers/windmill-parser-wasm/flake.nix create mode 100644 backend/windmill-worker/nsjail/run.nu.config.proto create mode 100644 backend/windmill-worker/src/nu_executor.rs create mode 100755 cli/test.nu create mode 100644 cli/wasm/csharp/windmill_parser_wasm.d.ts create mode 100644 cli/wasm/csharp/windmill_parser_wasm.js create mode 100644 cli/wasm/csharp/windmill_parser_wasm_bg.wasm create mode 100644 cli/wasm/csharp/windmill_parser_wasm_bg.wasm.d.ts create mode 100644 cli/wasm/go/windmill_parser_wasm.d.ts create mode 100644 cli/wasm/go/windmill_parser_wasm.js create mode 100644 cli/wasm/go/windmill_parser_wasm_bg.wasm create mode 100644 cli/wasm/go/windmill_parser_wasm_bg.wasm.d.ts create mode 100644 cli/wasm/nu/windmill_parser_wasm.d.ts create mode 100644 cli/wasm/nu/windmill_parser_wasm.js create mode 100644 cli/wasm/nu/windmill_parser_wasm_bg.wasm create mode 100644 cli/wasm/nu/windmill_parser_wasm_bg.wasm.d.ts create mode 100644 cli/wasm/php/windmill_parser_wasm.d.ts create mode 100644 cli/wasm/php/windmill_parser_wasm.js create mode 100644 cli/wasm/php/windmill_parser_wasm_bg.wasm create mode 100644 cli/wasm/php/windmill_parser_wasm_bg.wasm.d.ts create mode 100644 cli/wasm/python/windmill_parser_wasm.d.ts create mode 100644 cli/wasm/python/windmill_parser_wasm.js create mode 100644 cli/wasm/python/windmill_parser_wasm_bg.wasm create mode 100644 cli/wasm/python/windmill_parser_wasm_bg.wasm.d.ts create mode 100644 cli/wasm/regex/windmill_parser_wasm.d.ts create mode 100644 cli/wasm/regex/windmill_parser_wasm.js create mode 100644 cli/wasm/regex/windmill_parser_wasm_bg.wasm create mode 100644 cli/wasm/regex/windmill_parser_wasm_bg.wasm.d.ts create mode 100644 cli/wasm/rust/windmill_parser_wasm.d.ts create mode 100644 cli/wasm/rust/windmill_parser_wasm.js create mode 100644 cli/wasm/rust/windmill_parser_wasm_bg.wasm create mode 100644 cli/wasm/rust/windmill_parser_wasm_bg.wasm.d.ts create mode 100644 cli/wasm/ts/windmill_parser_wasm.d.ts create mode 100644 cli/wasm/ts/windmill_parser_wasm.js create mode 100644 cli/wasm/ts/windmill_parser_wasm_bg.wasm create mode 100644 cli/wasm/ts/windmill_parser_wasm_bg.wasm.d.ts delete mode 100644 cli/wasm/windmill_parser_wasm.generated.d.ts delete mode 100644 cli/wasm/windmill_parser_wasm.generated.js delete mode 100644 cli/wasm/windmill_parser_wasm_bg.wasm create mode 100644 cli/wasm/yaml/windmill_parser_wasm.d.ts create mode 100644 cli/wasm/yaml/windmill_parser_wasm.js create mode 100644 cli/wasm/yaml/windmill_parser_wasm_bg.wasm create mode 100644 cli/wasm/yaml/windmill_parser_wasm_bg.wasm.d.ts create mode 100755 docker/dev.nu create mode 100644 frontend/src/lib/components/icons/NuIcon.svelte create mode 100755 lsp/dev.nu diff --git a/.github/DockerfileBackendTests b/.github/DockerfileBackendTests index dbfffc0c7b..7fda0e025f 100644 --- a/.github/DockerfileBackendTests +++ b/.github/DockerfileBackendTests @@ -27,31 +27,38 @@ RUN wget https://golang.org/dl/go1.21.5.linux-amd64.tar.gz && tar -C /usr/local ENV PATH="${PATH}:/usr/local/go/bin" ENV GO_PATH=/usr/local/go/bin/go -# Install UV +# UV RUN curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/uv/releases/download/0.4.18/uv-installer.sh | sh && mv /usr/local/cargo/bin/uv /usr/local/bin/uv ENV TZ=Etc/UTC ENV PYTHON_VERSION 3.11.4 +# Python RUN wget https://www.python.org/ftp/python/${PYTHON_VERSION}/Python-${PYTHON_VERSION}.tgz \ && tar -xf Python-${PYTHON_VERSION}.tgz && cd Python-${PYTHON_VERSION}/ && ./configure --enable-optimizations \ && make -j 4 && make install RUN /usr/local/bin/python3 -m pip install pip-tools +# Bun COPY --from=oven/bun:1.2.4 /usr/local/bin/bun /usr/bin/bun ARG TARGETPLATFORM +# Deno RUN curl -Lsf https://github.com/denoland/deno/releases/download/v2.0.2/deno-x86_64-unknown-linux-gnu.zip -o deno.zip # RUN [ "$TARGETPLATFORM" == "linux/arm64" ] && curl -Lsf https://github.com/denoland/deno/releases/download/v2.0.0/deno-aarch64-unknown-linux-gnu.zip -o deno.zip || true - RUN unzip deno.zip && rm deno.zip && mv deno /usr/bin/deno RUN apt-get update \ && apt-get install -y postgresql-client --allow-unauthenticated RUN rustup component add rustfmt + +# C# COPY --from=bitnami/dotnet-sdk:9.0.101-debian-12-r0 /opt/bitnami/dotnet-sdk /opt/dotnet-sdk RUN ln -s /opt/dotnet-sdk/bin/dotnet /usr/bin/dotnet + +# Nushell +COPY --from=ghcr.io/nushell/nushell:0.101.0-bookworm /usr/bin/nu /usr/bin/nu diff --git a/.github/workflows/build-publish-rh-image.yml b/.github/workflows/build-publish-rh-image.yml index 26b4bd6896..01a1f4fa97 100644 --- a/.github/workflows/build-publish-rh-image.yml +++ b/.github/workflows/build-publish-rh-image.yml @@ -64,7 +64,7 @@ jobs: platforms: linux/amd64 push: true build-args: | - features=enterprise,enterprise_saml,stripe,embedding,parquet,prometheus,openidconnect,cloud,jemalloc,deno_core,license,otel,http_trigger,zip,oauth2,kafka,sqs_trigger,nats,php,mysql,mssql,bigquery,oracledb,postgres_trigger,mqtt_trigger,websocket,python,smtp,csharp,static_frontend,rust + features=enterprise,enterprise_saml,stripe,embedding,parquet,prometheus,openidconnect,cloud,jemalloc,deno_core,license,otel,http_trigger,zip,oauth2,kafka,sqs_trigger,nats,php,mysql,mssql,bigquery,oracledb,postgres_trigger,mqtt_trigger,websocket,python,smtp,csharp,static_frontend,rust,nu secrets: | rh_username=${{ secrets.RH_USERNAME }} rh_password=${{ secrets.RH_PASSWORD }} @@ -81,7 +81,7 @@ jobs: platforms: linux/arm64 push: true build-args: | - features=enterprise,enterprise_saml,stripe,embedding,parquet,prometheus,openidconnect,cloud,jemalloc,deno_core,license,otel,http_trigger,zip,oauth2,kafka,sqs_trigger,nats,php,mysql,mssql,bigquery,oracledb,postgres_trigger,mqtt_trigger,websocket,python,smtp,csharp,static_frontend,rust + features=enterprise,enterprise_saml,stripe,embedding,parquet,prometheus,openidconnect,cloud,jemalloc,deno_core,license,otel,http_trigger,zip,oauth2,kafka,sqs_trigger,nats,php,mysql,mssql,bigquery,oracledb,postgres_trigger,mqtt_trigger,websocket,python,smtp,csharp,static_frontend,rust,nu secrets: | rh_username=${{ secrets.RH_USERNAME }} rh_password=${{ secrets.RH_PASSWORD }} diff --git a/.github/workflows/build_windows_worker_.yml b/.github/workflows/build_windows_worker_.yml index c108f8a0d1..7cc5a56902 100644 --- a/.github/workflows/build_windows_worker_.yml +++ b/.github/workflows/build_windows_worker_.yml @@ -51,7 +51,7 @@ jobs: $env:OPENSSL_DIR="${Env:VCPKG_INSTALLATION_ROOT}\installed\x64-windows-static" mkdir frontend/build && cd backend New-Item -Path . -Name "windmill-api/openapi-deref.yaml" -ItemType "File" -Force - cargo build --release --features=enterprise,stripe,embedding,parquet,prometheus,openidconnect,cloud,jemalloc,tantivy,deno_core,license,http_trigger,zip,oauth2,kafka,nats,sqs_trigger,php,mysql,mssql,bigquery,oracledb,postgres_trigger,mqtt_trigger,websocket,python,smtp,csharp,static_frontend,rust + cargo build --release --features=enterprise,stripe,embedding,parquet,prometheus,openidconnect,cloud,jemalloc,tantivy,deno_core,license,http_trigger,zip,oauth2,kafka,nats,sqs_trigger,php,mysql,mssql,bigquery,oracledb,postgres_trigger,mqtt_trigger,websocket,python,smtp,csharp,static_frontend,rust,nu - name: Rename binary with corresponding architecture run: | diff --git a/.github/workflows/docker-image-rpi4.yml b/.github/workflows/docker-image-rpi4.yml index c0fc7ad576..8dad6651f8 100644 --- a/.github/workflows/docker-image-rpi4.yml +++ b/.github/workflows/docker-image-rpi4.yml @@ -67,7 +67,7 @@ jobs: platforms: linux/amd64,linux/arm64 push: true build-args: | - features=embedding,parquet,openidconnect,deno_core,license,http_trigger,zip,oauth2,php,mysql,mssql,bigquery,oracledb,postgres_trigger,mqtt_trigger,websocket,python,smtp,csharp,static_frontend,rust + features=embedding,parquet,openidconnect,deno_core,license,http_trigger,zip,oauth2,php,mysql,mssql,bigquery,oracledb,postgres_trigger,mqtt_trigger,websocket,python,smtp,csharp,static_frontend,rust,nu tags: | ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:dev ${{ steps.meta-public.outputs.tags }} diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index 03457b4b79..cf95bcd108 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -95,7 +95,7 @@ jobs: platforms: linux/amd64,linux/arm64 push: true build-args: | - features=embedding,parquet,openidconnect,jemalloc,deno_core,license,http_trigger,zip,oauth2,dind,php,mysql,mssql,bigquery,oracledb,postgres_trigger,mqtt_trigger,websocket,python,smtp,csharp,static_frontend,rust + features=embedding,parquet,openidconnect,jemalloc,deno_core,license,http_trigger,zip,oauth2,dind,php,mysql,mssql,bigquery,oracledb,postgres_trigger,mqtt_trigger,websocket,python,smtp,csharp,static_frontend,rust,nu tags: | ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.DEV_SHA }} ${{ steps.meta-public.outputs.tags }} @@ -157,7 +157,7 @@ jobs: platforms: linux/amd64,linux/arm64 push: true build-args: | - features=enterprise,enterprise_saml,stripe,embedding,parquet,prometheus,openidconnect,cloud,jemalloc,tantivy,deno_core,license,http_trigger,zip,oauth2,kafka,sqs_trigger,nats,otel,dind,php,mysql,mssql,bigquery,oracledb,postgres_trigger,mqtt_trigger,websocket,python,smtp,csharp,static_frontend,rust + features=enterprise,enterprise_saml,stripe,embedding,parquet,prometheus,openidconnect,cloud,jemalloc,tantivy,deno_core,license,http_trigger,zip,oauth2,kafka,sqs_trigger,nats,otel,dind,php,mysql,mssql,bigquery,oracledb,postgres_trigger,mqtt_trigger,websocket,python,smtp,csharp,static_frontend,rust,nu tags: | ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}-ee:${{ env.DEV_SHA }} ${{ steps.meta-ee-public.outputs.tags }} diff --git a/.github/workflows/publish_windows_worker.yml b/.github/workflows/publish_windows_worker.yml index 50576fc519..1ef3d32b99 100644 --- a/.github/workflows/publish_windows_worker.yml +++ b/.github/workflows/publish_windows_worker.yml @@ -53,7 +53,7 @@ jobs: $env:OPENSSL_DIR="${Env:VCPKG_INSTALLATION_ROOT}\installed\x64-windows-static" mkdir frontend/build && cd backend New-Item -Path . -Name "windmill-api/openapi-deref.yaml" -ItemType "File" -Force - cargo build --release --features=enterprise,stripe,embedding,parquet,prometheus,openidconnect,cloud,jemalloc,tantivy,deno_core,license,http_trigger,zip,oauth2,kafka,sqs_trigger,nats,php,mysql,mssql,bigquery,oracledb,postgres_trigger,mqtt_trigger,websocket,python,smtp,csharp,static_frontend,rust + cargo build --release --features=enterprise,stripe,embedding,parquet,prometheus,openidconnect,cloud,jemalloc,tantivy,deno_core,license,http_trigger,zip,oauth2,kafka,sqs_trigger,nats,php,mysql,mssql,bigquery,oracledb,postgres_trigger,mqtt_trigger,websocket,python,smtp,csharp,static_frontend,rust,nu - name: Rename binary with corresponding architecture run: | diff --git a/.gitignore b/.gitignore index 3e6c2f3a75..60c80becbf 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ CaddyfileRemoteMalo **/.idea/ .direnv .vscode +.dev-docker-wrapper* diff --git a/Dockerfile b/Dockerfile index 2b323ba243..4d3e2655f2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -41,6 +41,8 @@ COPY /typescript-client/docs/ /frontend/static/tsdocs/ RUN npm run generate-backend-client ENV NODE_OPTIONS "--max-old-space-size=8192" ARG VITE_BASE_URL "" +# Read more about macro in docker/dev.nu +# -- MACRO-SPREAD-WASM-PARSER-DEV-ONLY -- # RUN npm run build diff --git a/backend/Cargo.lock b/backend/Cargo.lock index 8d400bb62a..eb243435c9 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -1358,7 +1358,16 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" dependencies = [ - "bit-vec", + "bit-vec 0.6.3", +] + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec 0.8.0", ] [[package]] @@ -1367,6 +1376,12 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + [[package]] name = "bitflags" version = "1.3.2" @@ -1622,6 +1637,17 @@ dependencies = [ "allocator-api2", ] +[[package]] +name = "byte-unit" +version = "5.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cd29c3c585209b0cbc7309bfe3ed7efd8c84c21b7af29c8bfae908f8777174" +dependencies = [ + "rust_decimal", + "serde", + "utf8-width", +] + [[package]] name = "bytecheck" version = "0.6.12" @@ -1689,6 +1715,12 @@ dependencies = [ "either", ] +[[package]] +name = "bytesize" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d2c12f985c78475a6b8d629afd0c360260ef34cfef52efccdcfd31972f81c2e" + [[package]] name = "bzip2" version = "0.4.4" @@ -1885,11 +1917,21 @@ dependencies = [ "iana-time-zone", "js-sys", "num-traits", + "pure-rust-locales", "serde", "wasm-bindgen", "windows-targets 0.52.6", ] +[[package]] +name = "chrono-humanize" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799627e6b4d27827a814e837b9d8a504832086081806d45b1afa34dc982b023b" +dependencies = [ + "chrono", +] + [[package]] name = "chrono-tz" version = "0.9.0" @@ -2352,6 +2394,15 @@ version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" +[[package]] +name = "crossterm_winapi" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" +dependencies = [ + "winapi", +] + [[package]] name = "crunchy" version = "0.2.3" @@ -3058,8 +3109,8 @@ dependencies = [ "anyhow", "az", "bincode", - "bit-set", - "bit-vec", + "bit-set 0.5.3", + "bit-vec 0.6.3", "bytes", "capacity_builder 0.1.3", "cooked-waker", @@ -3254,7 +3305,7 @@ dependencies = [ "filetime", "junction", "libc", - "nix", + "nix 0.27.1", "rand 0.8.5", "rayon", "serde", @@ -3659,7 +3710,7 @@ dependencies = [ "libc", "log", "memchr", - "nix", + "nix 0.27.1", "pin-project-lite", "rand 0.8.5", "serde", @@ -3752,7 +3803,7 @@ dependencies = [ "hyper-util", "libc", "log", - "nix", + "nix 0.27.1", "node_resolver", "notify", "ntapi", @@ -4542,6 +4593,16 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" +[[package]] +name = "erased-serde" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e004d887f51fcb9fef17317a2f3525c887d8aa3f4f50fed920816a688284a5b7" +dependencies = [ + "serde", + "typeid", +] + [[package]] name = "errno" version = "0.3.10" @@ -4619,6 +4680,17 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" +[[package]] +name = "fancy-regex" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e24cb5a94bcae1e5408b0effca5cd7172ea3c5755049c5f3af4cd283a165298" +dependencies = [ + "bit-set 0.8.0", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", +] + [[package]] name = "fastdivide" version = "0.4.2" @@ -6326,6 +6398,15 @@ version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8bb03732005da905c88227371639bf1ad885cc712789c011c31c5fb3ab3ccf02" +[[package]] +name = "inventory" +version = "0.3.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab08d7cd2c5897f2c949e5383ea7c7db03fb19130ffcfbf7eda795137ae3cb83" +dependencies = [ + "rustversion", +] + [[package]] name = "ipconfig" version = "0.3.2" @@ -6365,6 +6446,12 @@ dependencies = [ "syn 2.0.100", ] +[[package]] +name = "is_ci" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7655c9839580ee829dfacba1d1278c2b7883e50a277ff7541299489d6bdfdc45" + [[package]] name = "is_terminal_polyfill" version = "1.70.1" @@ -6741,6 +6828,17 @@ version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" +[[package]] +name = "libproc" +version = "0.14.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e78a09b56be5adbcad5aa1197371688dc6bb249a26da3bca2011ee2fb987ebfb" +dependencies = [ + "bindgen 0.70.1", + "errno", + "libc", +] + [[package]] name = "libredox" version = "0.1.3" @@ -6864,6 +6962,15 @@ dependencies = [ "hashbrown 0.15.2", ] +[[package]] +name = "lscolors" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53304fff6ab1e597661eee37e42ea8c47a146fca280af902bb76bff8a896e523" +dependencies = [ + "nu-ansi-term 0.50.1", +] + [[package]] name = "lz4_flex" version = "0.11.3" @@ -6884,6 +6991,15 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "mach2" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" +dependencies = [ + "libc", +] + [[package]] name = "macro_rules_attribute" version = "0.2.0" @@ -7143,6 +7259,35 @@ dependencies = [ "paste", ] +[[package]] +name = "miette" +version = "7.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a955165f87b37fd1862df2a59547ac542c77ef6d17c666f619d1ad22dd89484" +dependencies = [ + "cfg-if", + "miette-derive", + "owo-colors", + "supports-color", + "supports-hyperlinks", + "supports-unicode", + "terminal_size", + "textwrap", + "thiserror 1.0.69", + "unicode-width 0.1.14", +] + +[[package]] +name = "miette-derive" +version = "7.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf45bf44ab49be92fd1227a3be6fc6f617f1a337c06af54981048574d8783147" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + [[package]] name = "mime" version = "0.3.17" @@ -7381,7 +7526,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e536ae46fcab0876853bd4a632ede5df4b1c2527a58f6c5a4150fe86be858231" dependencies = [ "arrayvec", - "bit-set", + "bit-set 0.5.3", "bitflags 2.9.0", "codespan-reporting", "hexf-parse", @@ -7470,6 +7615,18 @@ dependencies = [ "libc", ] +[[package]] +name = "nix" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +dependencies = [ + "bitflags 2.9.0", + "cfg-if", + "cfg_aliases 0.2.1", + "libc", +] + [[package]] name = "nkeys" version = "0.4.4" @@ -7569,6 +7726,145 @@ dependencies = [ "winapi", ] +[[package]] +name = "nu-ansi-term" +version = "0.50.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "nu-derive-value" +version = "0.101.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71f7c8ed6ba88a567ec6f7c4cad4a7a8465ab93b8cdaf89d3dc72347a83c2d1f" +dependencies = [ + "heck 0.5.0", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "nu-engine" +version = "0.101.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c6619583ed281060a9ea0a3f4532eea918370c94e703b903065f35e5aa49b14" +dependencies = [ + "log", + "nu-glob", + "nu-path", + "nu-protocol", + "nu-utils", + "terminal_size", +] + +[[package]] +name = "nu-glob" +version = "0.101.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acd0a9fe69412acdc8501f5ef19031f9cac119d93823cb957b14ddfe1cb97660" + +[[package]] +name = "nu-parser" +version = "0.101.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2adc2876bd7bc83be15786cedf2cb08a81a9d70fa4b8df569b3f1cbec1e0b58d" +dependencies = [ + "bytesize", + "chrono", + "itertools 0.13.0", + "log", + "nu-engine", + "nu-path", + "nu-protocol", + "nu-utils", + "serde_json", +] + +[[package]] +name = "nu-path" +version = "0.101.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ccd1bbaf370d79118bd1a807abb07d8d1386751d0ae9266baafa91bd0b5523f" +dependencies = [ + "dirs 5.0.1", + "omnipath", + "pwd", +] + +[[package]] +name = "nu-protocol" +version = "0.101.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f49a395b632530d7f46fd24183c7f42423677f70afb3cb4726e3abfe92273b" +dependencies = [ + "byte-unit", + "bytes", + "chrono", + "chrono-humanize", + "dirs 5.0.1", + "dirs-sys 0.4.1", + "fancy-regex", + "heck 0.5.0", + "indexmap 2.8.0", + "log", + "lru", + "miette", + "nix 0.29.0", + "nu-derive-value", + "nu-path", + "nu-system", + "nu-utils", + "num-format", + "serde", + "serde_json", + "thiserror 2.0.12", + "typetag", + "windows-sys 0.48.0", +] + +[[package]] +name = "nu-system" +version = "0.101.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81182f7e64bd5dd16ab844d8e40f78e389d06d95f5a0c419f4701fb8fc163077" +dependencies = [ + "chrono", + "itertools 0.13.0", + "libc", + "libproc", + "log", + "mach2", + "nix 0.29.0", + "ntapi", + "procfs", + "sysinfo", + "windows 0.56.0", +] + +[[package]] +name = "nu-utils" +version = "0.101.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d1468fa8e6e12d9d53c90b44f3d11a37d87502d7a30d145f122341c5b33745" +dependencies = [ + "crossterm_winapi", + "fancy-regex", + "log", + "lscolors", + "nix 0.29.0", + "num-format", + "serde", + "serde_json", + "strip-ansi-escapes", + "sys-locale", + "unicase", +] + [[package]] name = "nuid" version = "0.5.0" @@ -7638,6 +7934,16 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +[[package]] +name = "num-format" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a652d9771a63711fd3c3deb670acfbe5c30a4072e664d7a3bf5a9e1056ac72c3" +dependencies = [ + "arrayvec", + "itoa", +] + [[package]] name = "num-integer" version = "0.1.46" @@ -7802,6 +8108,12 @@ dependencies = [ "asn1-rs", ] +[[package]] +name = "omnipath" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80adb31078122c880307e9cdfd4e3361e6545c319f9b9dcafcb03acd3b51a575" + [[package]] name = "once_cell" version = "1.21.1" @@ -8117,6 +8429,12 @@ dependencies = [ "stable_deref_trait", ] +[[package]] +name = "owo-colors" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1036865bb9422d3300cf723f657c2851d0e9ab12567854b1f4eba3d77decf564" + [[package]] name = "p224" version = "0.13.2" @@ -8589,7 +8907,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613283563cd90e1dfc3518d548caee47e0e725455ed619881f5cf21f36de4b48" dependencies = [ "array-init", - "bit-vec", + "bit-vec 0.6.3", "bytes", "chrono", "fallible-iterator 0.2.0", @@ -8736,6 +9054,31 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "procfs" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc5b72d8145275d844d4b5f6d4e1eef00c8cd889edb6035c21675d1bb1f45c9f" +dependencies = [ + "bitflags 2.9.0", + "chrono", + "flate2", + "hex", + "procfs-core", + "rustix 0.38.44", +] + +[[package]] +name = "procfs-core" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "239df02d8349b06fc07398a3a1697b06418223b1c7725085e801e7c0fc6a12ec" +dependencies = [ + "bitflags 2.9.0", + "chrono", + "hex", +] + [[package]] name = "profiling" version = "1.0.16" @@ -8939,6 +9282,22 @@ dependencies = [ "reborrow", ] +[[package]] +name = "pure-rust-locales" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1190fd18ae6ce9e137184f207593877e70f39b015040156b1e05081cdfe3733a" + +[[package]] +name = "pwd" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72c71c0c79b9701efe4e1e4b563b2016dd4ee789eb99badcb09d61ac4b92e4a2" +dependencies = [ + "libc", + "thiserror 1.0.69", +] + [[package]] name = "quick-xml" version = "0.30.0" @@ -10008,7 +10367,7 @@ dependencies = [ "libc", "log", "memchr", - "nix", + "nix 0.27.1", "radix_trie", "unicode-segmentation", "unicode-width 0.1.14", @@ -11169,6 +11528,15 @@ dependencies = [ "unicode-properties", ] +[[package]] +name = "strip-ansi-escapes" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a8f8038e7e7969abb3f1b7c2a811225e9296da208539e0f79c5251d6cac0025" +dependencies = [ + "vte", +] + [[package]] name = "strsim" version = "0.10.0" @@ -11241,6 +11609,27 @@ version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" +[[package]] +name = "supports-color" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c64fc7232dd8d2e4ac5ce4ef302b1d81e0b80d055b9d77c7c4f51f6aa4c867d6" +dependencies = [ + "is_ci", +] + +[[package]] +name = "supports-hyperlinks" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "804f44ed3c63152de6a9f90acbea1a110441de43006ea51bcce8f436196a288b" + +[[package]] +name = "supports-unicode" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7401a30af6cb5818bb64852270bb722533397edcfc7344954a38f420819ece2" + [[package]] name = "swc_allocator" version = "0.1.10" @@ -11668,6 +12057,15 @@ dependencies = [ "syn 2.0.100", ] +[[package]] +name = "sys-locale" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eab9a99a024a169fe8a903cf9d4a3b3601109bcc13bd9e3c6fff259138626c4" +dependencies = [ + "libc", +] + [[package]] name = "sys_traits" version = "0.1.7" @@ -11692,6 +12090,20 @@ dependencies = [ "walkdir", ] +[[package]] +name = "sysinfo" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c33cd241af0f2e9e3b5c32163b873b29956890b5342e6745b917ce9d490f4af" +dependencies = [ + "core-foundation-sys", + "libc", + "memchr", + "ntapi", + "rayon", + "windows 0.57.0", +] + [[package]] name = "system-configuration" version = "0.5.1" @@ -11920,6 +12332,16 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "terminal_size" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45c6481c4829e4cc63825e62c49186a34538b7b2750b73b266581ffb612fb5ed" +dependencies = [ + "rustix 1.0.3", + "windows-sys 0.59.0", +] + [[package]] name = "text_lines" version = "0.6.0" @@ -11929,6 +12351,16 @@ dependencies = [ "serde", ] +[[package]] +name = "textwrap" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" +dependencies = [ + "unicode-linebreak", + "unicode-width 0.2.0", +] + [[package]] name = "thiserror" version = "1.0.69" @@ -12721,7 +13153,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" dependencies = [ "matchers", - "nu-ansi-term", + "nu-ansi-term 0.46.0", "once_cell", "regex", "serde", @@ -12832,12 +13264,42 @@ version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a" +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + [[package]] name = "typenum" version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +[[package]] +name = "typetag" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f22b40dd7bfe8c14230cf9702081366421890435b2d625fa92b4acc4c3de6f" +dependencies = [ + "erased-serde", + "inventory", + "once_cell", + "serde", + "typetag-impl", +] + +[[package]] +name = "typetag-impl" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35f5380909ffc31b4de4f4bdf96b877175a016aa2ca98cee39fcfd8c4d53d952" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + [[package]] name = "typify" version = "0.0.12" @@ -12987,6 +13449,12 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +[[package]] +name = "unicode-linebreak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" + [[package]] name = "unicode-normalization" version = "0.1.24" @@ -13158,6 +13626,12 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fcfc827f90e53a02eaef5e535ee14266c1d569214c6aa70133a624d8a3164ba" +[[package]] +name = "utf8-width" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86bd8d4e895da8537e5315b8254664e6b769c4ff3db18321b297a1e7004392e3" + [[package]] name = "utf8_iter" version = "1.0.4" @@ -13257,6 +13731,15 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" +[[package]] +name = "vte" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "231fdcd7ef3037e8330d8e17e61011a2c244126acc0a982f4040ac3f9f0bc077" +dependencies = [ + "memchr", +] + [[package]] name = "waker-fn" version = "1.2.0" @@ -13481,7 +13964,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d50819ab545b867d8a454d1d756b90cd5f15da1f2943334ca314af10583c9d39" dependencies = [ "arrayvec", - "bit-vec", + "bit-vec 0.6.3", "bitflags 2.9.0", "cfg_aliases 0.1.1", "codespan-reporting", @@ -13512,7 +13995,7 @@ dependencies = [ "android_system_properties", "arrayvec", "ash", - "bit-set", + "bit-set 0.5.3", "bitflags 2.9.0", "block", "cfg_aliases 0.1.1", @@ -13983,6 +14466,17 @@ dependencies = [ "windmill-parser", ] +[[package]] +name = "windmill-parser-nu" +version = "1.478.1" +dependencies = [ + "anyhow", + "nu-parser", + "serde_json", + "wasm-bindgen", + "windmill-parser", +] + [[package]] name = "windmill-parser-php" version = "1.478.1" @@ -14086,6 +14580,7 @@ dependencies = [ "windmill-parser-csharp", "windmill-parser-go", "windmill-parser-graphql", + "windmill-parser-nu", "windmill-parser-php", "windmill-parser-py", "windmill-parser-rust", @@ -14155,7 +14650,7 @@ dependencies = [ "async-recursion", "backon", "base64 0.22.1", - "bit-vec", + "bit-vec 0.6.3", "bollard", "bytes", "chrono", @@ -14187,7 +14682,7 @@ dependencies = [ "mappable-rc", "mysql_async", "native-tls", - "nix", + "nix 0.27.1", "object_store", "once_cell", "opentelemetry", @@ -14219,6 +14714,7 @@ dependencies = [ "windmill-parser-csharp", "windmill-parser-go", "windmill-parser-graphql", + "windmill-parser-nu", "windmill-parser-php", "windmill-parser-py", "windmill-parser-py-imports", @@ -14240,6 +14736,26 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows" +version = "0.56.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1de69df01bdf1ead2f4ac895dc77c9351aefff65b2f3db429a343f9cbf05e132" +dependencies = [ + "windows-core 0.56.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143" +dependencies = [ + "windows-core 0.57.0", + "windows-targets 0.52.6", +] + [[package]] name = "windows" version = "0.58.0" @@ -14259,19 +14775,65 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-core" +version = "0.56.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4698e52ed2d08f8658ab0c39512a7c00ee5fe2688c65f8c0a4f06750d729f2a6" +dependencies = [ + "windows-implement 0.56.0", + "windows-interface 0.56.0", + "windows-result 0.1.2", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d" +dependencies = [ + "windows-implement 0.57.0", + "windows-interface 0.57.0", + "windows-result 0.1.2", + "windows-targets 0.52.6", +] + [[package]] name = "windows-core" version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" dependencies = [ - "windows-implement", - "windows-interface", + "windows-implement 0.58.0", + "windows-interface 0.58.0", "windows-result 0.2.0", "windows-strings 0.1.0", "windows-targets 0.52.6", ] +[[package]] +name = "windows-implement" +version = "0.56.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "windows-implement" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + [[package]] name = "windows-implement" version = "0.58.0" @@ -14283,6 +14845,28 @@ dependencies = [ "syn 2.0.100", ] +[[package]] +name = "windows-interface" +version = "0.56.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08990546bf4edef8f431fa6326e032865f27138718c587dc21bc0265bbcb57cc" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "windows-interface" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + [[package]] name = "windows-interface" version = "0.58.0" @@ -14311,6 +14895,15 @@ dependencies = [ "windows-targets 0.53.0", ] +[[package]] +name = "windows-result" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-result" version = "0.2.0" diff --git a/backend/Cargo.toml b/backend/Cargo.toml index 82fc14974c..d69ba61f7f 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -22,11 +22,12 @@ members = [ "./parsers/windmill-parser-go", "./parsers/windmill-parser-rust", "./parsers/windmill-parser-csharp", + "./parsers/windmill-parser-nu", "./parsers/windmill-parser-bash", "./parsers/windmill-parser-py", "./parsers/windmill-parser-py-imports", "./parsers/windmill-sql-datatype-parser-wasm", - "./parsers/windmill-parser-yaml", "windmill-macros", + "./parsers/windmill-parser-yaml", "windmill-macros", "parsers/windmill-parser-nu", ] [workspace.package] @@ -79,6 +80,7 @@ sqs_trigger = ["windmill-api/sqs_trigger"] python = ["windmill-worker/python"] smtp = ["windmill-api/smtp", "windmill-common/smtp"] csharp = ["windmill-worker/csharp"] +nu = ["windmill-worker/nu"] license = ["windmill-api/license"] oauth2 = ["windmill-api/oauth2"] http_trigger = ["windmill-api/http_trigger"] @@ -155,6 +157,7 @@ windmill-parser-go = { path = "./parsers/windmill-parser-go" } windmill-parser-rust = { path = "./parsers/windmill-parser-rust" } windmill-parser-yaml = { path = "./parsers/windmill-parser-yaml" } windmill-parser-csharp = { path = "./parsers/windmill-parser-csharp" } +windmill-parser-nu = { path = "./parsers/windmill-parser-nu" } windmill-parser-bash = { path = "./parsers/windmill-parser-bash" } windmill-parser-sql = { path = "./parsers/windmill-parser-sql" } windmill-parser-graphql = { path = "./parsers/windmill-parser-graphql" } @@ -310,6 +313,7 @@ rdkafka = { version = "0.36.2", features = ["cmake-build", "ssl-vendored"] } pg_escape = "0.1.1" async-nats = "0.38.0" nkeys = "0.4.4" +nu-parser = { version = "0.101.0", default-features = false } datafusion = "39.0.0" object_store = { version = "0.10.0", features = ["aws", "azure"] } @@ -355,7 +359,7 @@ quote = "1.0.36" regex-lite = "0.1.6" yaml-rust = "0.4.5" tokio-tungstenite = { version = "0.24.0", features = ["native-tls"] } -tree-sitter = {version = "0.23.0", features = []} +tree-sitter = { version = "0.23.0", features = [] } tree-sitter-c-sharp = "0.23.0" oracle = { version = "0.6.3", features = ["chrono"] } rumqttc = { version = "0.24.0", features = ["use-native-tls"]} diff --git a/backend/migrations/20250122094704_add_nu_lang.down.sql b/backend/migrations/20250122094704_add_nu_lang.down.sql new file mode 100644 index 0000000000..d2f607c5b8 --- /dev/null +++ b/backend/migrations/20250122094704_add_nu_lang.down.sql @@ -0,0 +1 @@ +-- Add down migration script here diff --git a/backend/migrations/20250122094704_add_nu_lang.up.sql b/backend/migrations/20250122094704_add_nu_lang.up.sql new file mode 100644 index 0000000000..5317efa87f --- /dev/null +++ b/backend/migrations/20250122094704_add_nu_lang.up.sql @@ -0,0 +1,2 @@ +ALTER TYPE SCRIPT_LANG ADD VALUE IF NOT EXISTS 'nu'; +UPDATE config set config = jsonb_set(config, '{worker_tags}', config->'worker_tags' || '["nu"]'::jsonb) where name = 'worker__default' and config @> '{"worker_tags": ["deno", "python3", "go", "bash", "powershell", "dependency", "flow", "hub", "other", "bun", "php", "rust", "ansible", "csharp"]}'::jsonb AND NOT config->'worker_tags' @> '"nu"'::jsonb; diff --git a/backend/parsers/windmill-parser-nu/Cargo.toml b/backend/parsers/windmill-parser-nu/Cargo.toml new file mode 100644 index 0000000000..c8c3e0d616 --- /dev/null +++ b/backend/parsers/windmill-parser-nu/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "windmill-parser-nu" +version.workspace = true +authors.workspace = true +edition.workspace = true + +[lib] +name = "windmill_parser_nu" +path = "./src/lib.rs" + +[dependencies] +windmill-parser.workspace = true +anyhow.workspace = true +nu-parser.workspace = true +wasm-bindgen.workspace = true +serde_json.workspace = true diff --git a/backend/parsers/windmill-parser-nu/src/lib.rs b/backend/parsers/windmill-parser-nu/src/lib.rs new file mode 100644 index 0000000000..ddd049f609 --- /dev/null +++ b/backend/parsers/windmill-parser-nu/src/lib.rs @@ -0,0 +1,261 @@ +#![cfg_attr(target_arch = "wasm32", feature(c_variadic))] + +use anyhow::{anyhow, bail}; +use nu_parser::lex; + +use serde_json::{json, Value}; +use windmill_parser::{Arg, MainArgSignature, Typ}; + +pub fn parse_nu_signature(code: &str) -> anyhow::Result { + let (tokens, ..) = lex(code.as_bytes(), 0, &[], &[], true); + let src = code.to_owned(); + #[derive(Debug)] + enum LastToken { + None, + Def, + Main, + Args(String), + } + let mut last_token = LastToken::None; + for token in tokens { + let s = token.span; + let cont = src.get(s.start..s.end).ok_or(anyhow!("Parsing error"))?; + last_token = match last_token { + LastToken::None if cont == "def" => LastToken::Def, + LastToken::Def if cont == "main" => LastToken::Main, + LastToken::Main => { + LastToken::Args(cont.get(1..(cont.len() - 1)).unwrap_or("Error").to_owned()) + } + LastToken::Args(_) => break, + _ => LastToken::None, + }; + } + + let LastToken::Args(args) = last_token else { + bail!("Cannot find main function."); + }; + + let mut sig = MainArgSignature::default(); + sig.no_main_func = Some(false); + + let batches = args + .lines() + .filter_map(|el| { + if el.trim_start().starts_with('#') { + None + } else { + Some( + el.split(',') + .map(|el| el.trim()) + .filter(|el| el != &"") + .collect::>(), + ) + } + }) + .flatten() + .collect::>(); + + let mut compensate_lookahead = 0; + for (i, batch) in batches.iter().enumerate() { + // parse_default can lookahead and if it does we need to compensate + // otherwise we would try to parse data already parsed but not yielded by parse_default + if compensate_lookahead > 0 { + compensate_lookahead -= 1; + continue; + } + + let type_start = batch.find(":"); + let default_start = batch.find("="); + + let (name, typ, default) = match (type_start, default_start) { + (None, None) => (batch.trim(), None, None), + (None, Some(d)) => ( + batch + .get(0..d) + .ok_or(anyhow!("Cannot parse argument ident"))? + .trim(), + None, + Some(parse_default( + &batch + .get(d..) + .ok_or(anyhow!("Cannot parse default value for argument"))?, + &batches, + i, + &mut compensate_lookahead, + )?), + ), + (Some(t), None) => ( + batch + .get(0..t) + .ok_or(anyhow!("Cannot parse argument ident"))? + .trim(), + Some(parse_type( + &batch + .get(t..) + .ok_or(anyhow!("Cannot parse type of argument"))?, + )?), + None, + ), + (Some(t), Some(d)) => { + if t < d { + ( + batch + .get(0..t) + .ok_or(anyhow!("Cannot parse argument ident"))? + .trim(), + Some(parse_type( + &batch + .get(t..d) + .ok_or(anyhow!("Cannot parse type of argument"))?, + )?), + Some(parse_default( + &batch + .get(d..) + .ok_or(anyhow!("Cannot parse default value of argument"))?, + &batches, + i, + &mut compensate_lookahead, + )?), + ) + } else { + bail!("Parsing error `:` should be before `=`\nit likely means you are trying to set default value to record or table which is not supported at the moment.") + } + } + }; + + // Check if it is optional + let optional = { + let Some(element) = name.chars().last() else { + bail!("Internal error, cannot check if argument is optional") + }; + element == '?' + }; + + // Rest parameters are not supported + if matches!(name.get(0..3), Some("...")) { + bail!("Rest (...) parameters are not supported") + } + + // Flags are not supported + if matches!(name.get(0..2), Some("--")) { + bail!("Flags are not supported") + } + + sig.args.push(Arg { + name: if optional { + name.get(..name.len() - 1).unwrap_or("Error").to_owned() + } else { + name.to_owned() + }, + typ: typ.unwrap_or(Typ::Unknown), + otyp: None, + has_default: default.is_some() || optional, + default: default.or_else(|| if optional { Some(json!(null)) } else { None }), + oidx: None, + }); + } + + fn parse_type(content: &str) -> anyhow::Result { + let c = content.replace(":", "").trim().to_owned(); + let typ = match c.as_str() { + "string" => Typ::Str(None), + "int" => Typ::Int, + "float" => Typ::Float, + "number" => Typ::Float, + "record" => Typ::Object(vec![]), + "table" => Typ::List(Box::new(Typ::Object(vec![]))), + "nothing" => Typ::Unknown, + // TODO: needs additional work on literal parsing + // "binary" => Typ::Bytes, + "datetime" => Typ::Datetime, + "any" => Typ::Unknown, + "bool" => Typ::Bool, + // Lists + "list" | "list" | "list" => Typ::List(Box::new(Typ::Unknown)), + "list" => Typ::List(Box::new(Typ::Float)), + "list" => Typ::List(Box::new(Typ::Bool)), + "list" => Typ::List(Box::new(Typ::Str(None))), + // list is not supported + // Records and Tables + // TODO: Support in V1? + s if s.contains("record<") => { + bail!("typed records are not supported, use `ident: record`") + } + s if s.contains("table<") => { + bail!("typed tables are not supported, use `ident: table`") + } + s => bail!("{s} is not supported"), + }; + Ok(typ) + } + fn parse_default( + content: &str, + ctx: &[&str], + i: usize, + skip: &mut usize, + ) -> anyhow::Result { + let mut c = content.replace("=", "").trim().to_owned(); + + fn parse_object_literal( + (open, close): (char, char), + mut c_2: String, + ctx: &[&str], + i: usize, + skip: &mut usize, + ) -> anyhow::Result { + // It is list + // if c.contains("[") { + let mut closed = false; + if c_2 != open.to_string() { + // [a ~ , ~ ... + // Add ^ + c_2 += ","; + } + // else { + // [ + // a < Do not add "," + // ... + // } + let remainder = &ctx + .iter() + .skip(i + 1) + .map_while(|el| { + let el = el.trim(); + + if closed { + None + } else { + if el.chars().last() == Some(close) { + closed = true; + } + *skip += 1; + Some(el) + } + }) + .collect::>() + .join(","); + + if remainder.contains(&['{', '[']) { + bail!("Nesting is not supported") + } + + Ok((c_2 + remainder) + // Remove trailing comma if there is any + .replace(&format!(",{close}"), &close.to_string())) + } + // It is list + if c.contains("[") { + if c.chars().last() != Some(']') { + c = parse_object_literal(('[', ']'), c.clone(), ctx, i, skip)?; + } + } + // It is record + if c.contains("{") { + if c.chars().last() != Some('}') { + c = parse_object_literal(('{', '}'), c.clone(), ctx, i, skip)?; + } + } + Ok(serde_json::from_str(&c)?) + } + Ok(sig) +} diff --git a/backend/parsers/windmill-parser-nu/tests/tests.rs b/backend/parsers/windmill-parser-nu/tests/tests.rs new file mode 100644 index 0000000000..13c54930d6 --- /dev/null +++ b/backend/parsers/windmill-parser-nu/tests/tests.rs @@ -0,0 +1,690 @@ +#[cfg(test)] +mod test { + use serde_json::json; + use windmill_parser::{Arg, MainArgSignature, Typ}; + use windmill_parser_nu::parse_nu_signature; + + #[test] + fn test_nu_no_main_sig() { + assert!(parse_nu_signature("").is_err()); + } + #[test] + fn test_nu_any_sig() { + let sig = parse_nu_signature( + r#" + def main [ a, b , c, d] {} + "#, + ) + .unwrap(); + assert_eq!( + MainArgSignature { + star_args: false, + star_kwargs: false, + args: vec![ + Arg { + name: "a".into(), + otyp: None, + typ: Typ::Unknown, + default: None, + has_default: false, + oidx: None + }, + Arg { + name: "b".into(), + otyp: None, + typ: Typ::Unknown, + default: None, + has_default: false, + oidx: None + }, + Arg { + name: "c".into(), + otyp: None, + typ: Typ::Unknown, + default: None, + has_default: false, + oidx: None + }, + Arg { + name: "d".into(), + otyp: None, + typ: Typ::Unknown, + default: None, + has_default: false, + oidx: None + } + ], + no_main_func: Some(false), + has_preprocessor: None, + }, + sig + ); + } + #[test] + fn test_nu_optional_sig() { + let sig = parse_nu_signature( + r#" + def main [foo?] {} + "#, + ) + .unwrap(); + + assert_eq!( + MainArgSignature { + star_args: false, + star_kwargs: false, + args: vec![Arg { + name: "foo".into(), + otyp: None, + typ: Typ::Unknown, + default: Some(serde_json::Value::Null), + has_default: true, + oidx: None + },], + no_main_func: Some(false), + has_preprocessor: None, + }, + sig + ); + } + #[test] + fn test_nu_simple_typed_sig() { + let sig = parse_nu_signature( + r#" + def main [ foo: string, bar: int] {} + "#, + ) + .unwrap(); + + assert_eq!( + MainArgSignature { + star_args: false, + star_kwargs: false, + args: vec![ + Arg { + name: "foo".into(), + otyp: None, + typ: Typ::Str(None), + default: None, + has_default: false, + oidx: None + }, + Arg { + name: "bar".into(), + otyp: None, + typ: Typ::Int, + default: None, + has_default: false, + oidx: None + }, + ], + no_main_func: Some(false), + has_preprocessor: None, + }, + sig + ); + } + #[test] + fn test_nu_complete_typed_sig() { + let sig = parse_nu_signature( + r#" + def main [ + a1: any, + a2: bool, + a3: int, + a4: float, + a5: datetime, + a6: string, + a7: record, + a8: list, + a9: table, + a10: nothing, + ] {} + "#, + ) + .unwrap(); + + assert_eq!( + MainArgSignature { + star_args: false, + star_kwargs: false, + args: vec![ + Arg { + name: "a1".into(), + otyp: None, + typ: Typ::Unknown, + default: None, + has_default: false, + oidx: None + }, + Arg { + name: "a2".into(), + otyp: None, + typ: Typ::Bool, + default: None, + has_default: false, + oidx: None + }, + Arg { + name: "a3".into(), + otyp: None, + typ: Typ::Int, + default: None, + has_default: false, + oidx: None + }, + Arg { + name: "a4".into(), + otyp: None, + typ: Typ::Float, + default: None, + has_default: false, + oidx: None + }, + Arg { + name: "a5".into(), + otyp: None, + typ: Typ::Datetime, + default: None, + has_default: false, + oidx: None + }, + Arg { + name: "a6".into(), + otyp: None, + typ: Typ::Str(None), + default: None, + has_default: false, + oidx: None + }, + Arg { + name: "a7".into(), + otyp: None, + typ: Typ::Object(vec![]), + default: None, + has_default: false, + oidx: None + }, + Arg { + name: "a8".into(), + otyp: None, + typ: Typ::List(Box::new(Typ::Unknown)), + default: None, + has_default: false, + oidx: None + }, + Arg { + name: "a9".into(), + otyp: None, + typ: Typ::List(Box::new(Typ::Object(vec![]))), + default: None, + has_default: false, + oidx: None + }, + Arg { + name: "a10".into(), + otyp: None, + typ: Typ::Unknown, + default: None, + has_default: false, + oidx: None + }, + ], + no_main_func: Some(false), + has_preprocessor: None, + }, + sig + ); + } + #[test] + fn test_nu_default_sig() { + let sig = parse_nu_signature( + r#" + def main [ foo = "Foo", bar: string = "Bar", bazz = 3 ] {} + "#, + ) + .unwrap(); + + println!("{}", serde_json::to_string_pretty(&sig).unwrap()); + + assert_eq!( + MainArgSignature { + star_args: false, + star_kwargs: false, + args: vec![ + Arg { + name: "foo".into(), + otyp: None, + typ: Typ::Unknown, + default: Some(json!("Foo")), + has_default: true, + oidx: None + }, + Arg { + name: "bar".into(), + otyp: None, + typ: Typ::Str(None), + default: Some(json!("Bar")), + has_default: true, + oidx: None + }, + Arg { + name: "bazz".into(), + otyp: None, + typ: Typ::Unknown, + default: Some(json!(3)), + has_default: true, + oidx: None + }, + ], + no_main_func: Some(false), + has_preprocessor: None, + }, + sig + ); + } + #[test] + fn test_nu_preprocessor_sig() {} + + #[test] + fn test_nu_flags_sig() { + assert!(parse_nu_signature( + r#" + def main [--flag] {} + "#, + ) + .is_err()); + } + #[test] + fn test_nu_rest_sig() { + assert!(parse_nu_signature( + r#" + def main [...foo: string] {} + "#, + ) + .is_err()) + } + + // #[test] + // fn test_nu_dynamically_sized_sig() { + // parse_nu_signature( + // r#" + // def main [] { + + // } + // "#, + // ); + // } + // #[test] + // fn test_nu_record_sig() { + // let sig = parse_nu_signature( + // r#" + // def main [ foo: record ] { } + // "#, + // ) + // .unwrap(); + + // assert_eq!( + // MainArgSignature { + // star_args: false, + // star_kwargs: false, + // args: vec![Arg { + // name: "foo".into(), + // otyp: None, + // typ: Typ::Object(vec![ + // ObjectProperty { key: "a".into(), typ: Box::new(Typ::Str(None)) }, + // ObjectProperty { key: "b".into(), typ: Box::new(Typ::Unknown) }, + // ObjectProperty { key: "c".into(), typ: Box::new(Typ::Float) }, + // ObjectProperty { key: "d".into(), typ: Box::new(Typ::Unknown) }, + // ]), + // default: None, + // has_default: false, + // oidx: None + // },], + // no_main_func: Some(false), + // has_preprocessor: None, + // }, + // sig + // ); + // } + + #[test] + fn test_nu_list_sig() { + let sig = parse_nu_signature( + r#" + def main [ foo: list ] { } + "#, + ) + .unwrap(); + + println!("{}", serde_json::to_string_pretty(&sig).unwrap()); + + assert_eq!( + MainArgSignature { + star_args: false, + star_kwargs: false, + args: vec![Arg { + name: "foo".into(), + otyp: None, + typ: Typ::List(Box::new(Typ::Float)), + default: None, + has_default: false, + oidx: None + },], + no_main_func: Some(false), + has_preprocessor: None, + }, + sig + ); + } + #[test] + fn test_nu_list_full_sig() { + let sig = parse_nu_signature( + r#" + def main [ a, foo: list = [ 2, 3, 4 ], b ] { } + "#, + ) + .unwrap(); + + println!("{}", serde_json::to_string_pretty(&sig).unwrap()); + + assert_eq!( + MainArgSignature { + star_args: false, + star_kwargs: false, + args: vec![ + Arg { + name: "a".into(), + otyp: None, + typ: Typ::Unknown, + default: None, + has_default: false, + oidx: None + }, + Arg { + name: "foo".into(), + otyp: None, + typ: Typ::List(Box::new(Typ::Float)), + default: Some(json!([2, 3, 4])), + has_default: true, + oidx: None + }, + Arg { + name: "b".into(), + otyp: None, + typ: Typ::Unknown, + default: None, + has_default: false, + oidx: None + }, + ], + no_main_func: Some(false), + has_preprocessor: None, + }, + sig + ); + } + + #[test] + fn test_nu_datetime_sig() { + let sig = parse_nu_signature( + r#" + def main [ foo: datetime ] { } + "#, + ) + .unwrap(); + + assert_eq!( + MainArgSignature { + star_args: false, + star_kwargs: false, + args: vec![Arg { + name: "foo".into(), + otyp: None, + typ: Typ::Datetime, + default: None, + has_default: false, + oidx: None + },], + no_main_func: Some(false), + has_preprocessor: None, + }, + sig + ); + } + // TODO: Re-enable for V1 + // #[test] + // fn test_nu_table_sig() { + // let sig = parse_nu_signature( + // r#" + // def main [ foo: table] { } + // "#, + // ) + // .unwrap(); + + // assert_eq!( + // MainArgSignature { + // star_args: false, + // star_kwargs: false, + // args: vec![Arg { + // name: "foo".into(), + // otyp: None, + // typ: Typ::List(Box::new(Typ::Object(vec![ + // ObjectProperty { key: "a".into(), typ: Box::new(Typ::Unknown) }, + // ObjectProperty { key: "b".into(), typ: Box::new(Typ::Float) }, + // ObjectProperty { key: "c".into(), typ: Box::new(Typ::Str(None)) }, + // ]))), + // default: None, + // has_default: false, + // oidx: None + // },], + // no_main_func: Some(false), + // has_preprocessor: None, + // }, + // sig + // ); + // } + + #[test] + fn test_nu_wrapup_sig() { + let sig = parse_nu_signature( + r#" + def main [a ,b :int,c? , d: string = "foo", bi?: any] {} + "#, + ) + .unwrap(); + + assert_eq!( + MainArgSignature { + star_args: false, + star_kwargs: false, + args: vec![ + Arg { + name: "a".into(), + otyp: None, + typ: Typ::Unknown, + default: None, + has_default: false, + oidx: None + }, + Arg { + name: "b".into(), + otyp: None, + typ: Typ::Int, + default: None, + has_default: false, + oidx: None + }, + Arg { + name: "c".into(), + otyp: None, + typ: Typ::Unknown, + default: Some(serde_json::Value::Null), + has_default: true, + oidx: None + }, + Arg { + name: "d".into(), + otyp: None, + typ: Typ::Str(None), + default: Some(json!("foo")), + has_default: true, + oidx: None + }, + Arg { + name: "bi".into(), + otyp: None, + typ: Typ::Unknown, + default: Some(serde_json::Value::Null), + has_default: true, + oidx: None + } + ], + no_main_func: Some(false), + has_preprocessor: None, + }, + sig + ); + } + // #[test] + // fn test_nu_wrapup_nested_sig() { + // let sig = parse_nu_signature( + // r#" + // def main [ + // baz: string, + // foo: record, + // d: record> + // = + // { + // a: "a", + // b: 3, + // c: [ 2, 3, 4 ], + // d: { + // a: true, + // b: false, + // c: true + // } + // } + // ] { } + // "#, + // ) + // .unwrap(); + + // println!("{}", serde_json::to_string_pretty(&sig).unwrap()); + + // assert_eq!( + // MainArgSignature { + // star_args: false, + // star_kwargs: false, + // args: vec![ + // Arg { + // name: "baz".into(), + // otyp: None, + // typ: Typ::Str(None), + // default: None, + // has_default: false, + // oidx: None + // }, + // Arg { + // name: "foo".into(), + // otyp: None, + // typ: Typ::Object(vec![ + // ObjectProperty { key: "a".into(), typ: Box::new(Typ::Str(None)) }, + // ObjectProperty { key: "b".into(), typ: Box::new(Typ::Unknown) }, + // ObjectProperty { + // key: "c".into(), + // typ: Box::new(Typ::List(Box::new(Typ::Float))) + // }, + // ObjectProperty { + // key: "d".into(), + // typ: Box::new(Typ::Object(vec![ + // ObjectProperty { + // key: "a1".into(), + // typ: Box::new(Typ::Unknown) + // }, + // ObjectProperty { + // key: "b1".into(), + // typ: Box::new(Typ::Unknown) + // }, + // ObjectProperty { + // key: "c1".into(), + // typ: Box::new(Typ::Unknown) + // } + // ])) + // }, + // ]), + // default: Some(json!({ + // "a": "a", + // "b": 3, + // "c": [ + // 2, + // 3, + // 4 + // ], + // "d": { + // "a": true, + // "b": false, + // "c": true + // } + // })), + // has_default: true, + // oidx: None + // }, + // ], + // no_main_func: Some(false), + // has_preprocessor: None, + // }, + // sig + // ); + // } + #[test] + fn test_nu_nested_extra_types() { + assert_eq!( + parse_nu_signature( + r#" + def main [a: list] {} + "#, + ) + .is_err(), + true + ); + assert_eq!( + parse_nu_signature( + r#" + def main [a: list] {} + "#, + ) + .is_err(), + true + ); + assert_eq!( + parse_nu_signature( + r#" + def main [a: list] {} + "#, + ) + .is_err(), + true + ); + assert_eq!( + parse_nu_signature( + r#" + def main [a: list] {} + "#, + ) + .is_err(), + true + ); + assert_eq!( + parse_nu_signature( + r#" + def main [a: list>] {} + "#, + ) + .is_err(), + true + ); + } +} diff --git a/backend/parsers/windmill-parser-py-imports/tests/fixtures/base.sql b/backend/parsers/windmill-parser-py-imports/tests/fixtures/base.sql index d75bf4396c..590ce1bd5f 100644 --- a/backend/parsers/windmill-parser-py-imports/tests/fixtures/base.sql +++ b/backend/parsers/windmill-parser-py-imports/tests/fixtures/base.sql @@ -2580,4 +2580,4 @@ import innerdifffolder '{}', '', '', -'f/foobar/bar', -28028598712388159, 'python3', ''); \ No newline at end of file +'f/foobar/bar', -28028598712388159, 'python3', ''); diff --git a/backend/parsers/windmill-parser-wasm/.envrc b/backend/parsers/windmill-parser-wasm/.envrc new file mode 100644 index 0000000000..f7604555f4 --- /dev/null +++ b/backend/parsers/windmill-parser-wasm/.envrc @@ -0,0 +1 @@ +use flake ../../#wasm diff --git a/backend/parsers/windmill-parser-wasm/Cargo.toml b/backend/parsers/windmill-parser-wasm/Cargo.toml index c78a9da69f..fe450c32b4 100644 --- a/backend/parsers/windmill-parser-wasm/Cargo.toml +++ b/backend/parsers/windmill-parser-wasm/Cargo.toml @@ -27,6 +27,7 @@ rust-parser = [ "dep:windmill-parser-rust"] graphql-parser = [ "dep:windmill-parser-graphql"] ansible-parser = [ "dep:windmill-parser-yaml"] csharp-parser = [ "dep:windmill-parser-csharp"] +nu-parser = [ "dep:windmill-parser-nu"] [dependencies] anyhow.workspace = true @@ -41,6 +42,7 @@ windmill-parser-graphql = { workspace = true, optional = true } windmill-parser-rust = { workspace = true, optional = true } windmill-parser-yaml = { workspace = true, optional = true } windmill-parser-csharp = { workspace = true, optional = true } +windmill-parser-nu = { workspace = true, optional = true } wasm-bindgen.workspace = true serde_json.workspace = true getrandom = { workspace = true, features = ["js"] } diff --git a/backend/parsers/windmill-parser-wasm/README_DEV.md b/backend/parsers/windmill-parser-wasm/README_DEV.md index ff3f866f4e..1de11be4bf 100644 --- a/backend/parsers/windmill-parser-wasm/README_DEV.md +++ b/backend/parsers/windmill-parser-wasm/README_DEV.md @@ -1,3 +1,4 @@ + ### Windmill parser wasm How to build @@ -14,7 +15,20 @@ Install wasm-pack cargo install wasm-pack ``` -#### To use it on a dev environment +Or enter nix devshell + +``` +nix develop ../../#wasm +``` + +#### Dev locally + +``` +./dev.nu +``` + + +#### Or how to use it on a dev environment manually Go to frontend and run: @@ -23,3 +37,15 @@ npm install ../backend/parsers/windmill-parser-wasm/pkg ``` Make sure to not reset the package.json before commiting + +#### Testing with docker + +Go to the root +``` +sudo docker/dev.nu up --features "," --wasm-pkg +``` + +For example to test `nu`: +``` +sudo docker/dev.nu up --features "static_frontend,nu" --wasm-pkg nu +``` diff --git a/backend/parsers/windmill-parser-wasm/build-pkgs-cli.sh b/backend/parsers/windmill-parser-wasm/build-pkgs-cli.sh new file mode 100755 index 0000000000..34c36e8820 --- /dev/null +++ b/backend/parsers/windmill-parser-wasm/build-pkgs-cli.sh @@ -0,0 +1,75 @@ +#!/usr/bin/env bash +set -eou pipefail + +#-# bun and deno +OUT_DIR="../../../cli/wasm/ts" +mkdir -p $OUT_DIR +wasm-pack build --release --target deno --out-dir $OUT_DIR --features "ts-parser" \ + -Z build-std=panic_abort,std -Z build-std-features=panic_immediate_abort +# sed -i 's/"windmill-parser-wasm"/"windmill-parser-wasm-ts"/' $OUT_DIR/package.json +rm $OUT_DIR/.gitignore + +#-# sql languages, graphql and bash/powershell, since they all use regex +OUT_DIR="../../../cli/wasm/regex" +mkdir -p $OUT_DIR +wasm-pack build --release --target deno --out-dir $OUT_DIR \ + --features "sql-parser,graphql-parser,bash-parser" \ + -Z build-std=panic_abort,std -Z build-std-features=panic_immediate_abort +# sed -i 's/"windmill-parser-wasm"/"windmill-parser-wasm-regex"/' $OUT_DIR/package.json +rm $OUT_DIR/.gitignore + +#-# python +OUT_DIR="../../../cli/wasm/python" +mkdir -p $OUT_DIR +wasm-pack build --release --target deno --out-dir $OUT_DIR --features "py-parser" \ + -Z build-std=panic_abort,std -Z build-std-features=panic_immediate_abort +# sed -i 's/"windmill-parser-wasm"/"windmill-parser-wasm-py"/' $OUT_DIR/package.json +rm $OUT_DIR/.gitignore + +#-# go +OUT_DIR="../../../cli/wasm/go" +mkdir -p $OUT_DIR +wasm-pack build --release --target deno --out-dir $OUT_DIR --features "go-parser" \ + -Z build-std=panic_abort,std -Z build-std-features=panic_immediate_abort +# sed -i 's/"windmill-parser-wasm"/"windmill-parser-wasm-go"/' $OUT_DIR/package.json +rm $OUT_DIR/.gitignore + +#-# php +OUT_DIR="../../../cli/wasm/php" +mkdir -p $OUT_DIR +wasm-pack build --release --target deno --out-dir $OUT_DIR --features "php-parser" \ + -Z build-std=panic_abort,std -Z build-std-features=panic_immediate_abort +# sed -i 's/"windmill-parser-wasm"/"windmill-parser-wasm-php"/' $OUT_DIR/package.json +rm $OUT_DIR/.gitignore + +#-# rust +OUT_DIR="../../../cli/wasm/rust" +mkdir -p $OUT_DIR +wasm-pack build --release --target deno --out-dir $OUT_DIR --features "rust-parser" \ + -Z build-std=panic_abort,std -Z build-std-features=panic_immediate_abort +# sed -i 's/"windmill-parser-wasm"/"windmill-parser-wasm-rust"/' $OUT_DIR/package.json +rm $OUT_DIR/.gitignore + +#-# ansible +OUT_DIR="../../../cli/wasm/yaml" +mkdir -p $OUT_DIR +wasm-pack build --release --target deno --out-dir $OUT_DIR --features "ansible-parser" \ + -Z build-std=panic_abort,std -Z build-std-features=panic_immediate_abort +# sed -i 's/"windmill-parser-wasm"/"windmill-parser-wasm-yaml"/' $OUT_DIR/package.json +rm $OUT_DIR/.gitignore + +#-# C# (needs some more stuff to compile C tree sitter into wasm) +OUT_DIR="../../../cli/wasm/csharp" +mkdir -p $OUT_DIR +CFLAGS_wasm32_unknown_unknown="-I$(pwd)/wasm-sysroot -Wbad-function-cast -Wcast-function-type -fno-builtin" RUSTFLAGS="-Zwasm-c-abi=spec" wasm-pack build --release --target deno --out-dir $OUT_DIR --features "csharp-parser" +# sed -i 's/"windmill-parser-wasm"/"windmill-parser-wasm-csharp"/' $OUT_DIR/package.json +rm $OUT_DIR/.gitignore + +#-# Nu +OUT_DIR="../../../cli/wasm/nu" +mkdir -p $OUT_DIR +wasm-pack build --release --target deno --out-dir $OUT_DIR --features "nu-parser" \ + -Z build-std=panic_abort,std -Z build-std-features=panic_immediate_abort +# sed -i 's/"windmill-parser-wasm"/"windmill-parser-wasm-nu"/' $OUT_DIR/package.json +rm $OUT_DIR/.gitignore + diff --git a/backend/parsers/windmill-parser-wasm/build-pkgs-mac.sh b/backend/parsers/windmill-parser-wasm/build-pkgs-mac.sh index dcd5a78275..85de323a90 100755 --- a/backend/parsers/windmill-parser-wasm/build-pkgs-mac.sh +++ b/backend/parsers/windmill-parser-wasm/build-pkgs-mac.sh @@ -1,56 +1,63 @@ #!/bin/bash set -eou pipefail -# full pkg +#-# full pkg OUT_DIR="pkg" wasm-pack build --release --target web --out-dir $OUT_DIR --all-features \ -Z build-std=panic_abort,std -Z build-std-features=panic_immediate_abort -# bun and deno +#-# bun and deno OUT_DIR="pkg-ts" wasm-pack build --release --target web --out-dir $OUT_DIR --features "ts-parser" \ -Z build-std=panic_abort,std -Z build-std-features=panic_immediate_abort sed -i '' 's/"windmill-parser-wasm"/"windmill-parser-wasm-ts"/' $OUT_DIR/package.json -# sql languages, graphql and bash/powershell, since they all use regex +#-# sql languages, graphql and bash/powershell, since they all use regex OUT_DIR="pkg-regex" wasm-pack build --release --target web --out-dir $OUT_DIR \ --features "sql-parser,graphql-parser,bash-parser" \ -Z build-std=panic_abort,std -Z build-std-features=panic_immediate_abort sed -i '' 's/"windmill-parser-wasm"/"windmill-parser-wasm-regex"/' $OUT_DIR/package.json -# python +#-# python OUT_DIR="pkg-py" wasm-pack build --release --target web --out-dir $OUT_DIR --features "py-parser" \ -Z build-std=panic_abort,std -Z build-std-features=panic_immediate_abort sed -i '' 's/"windmill-parser-wasm"/"windmill-parser-wasm-py"/' $OUT_DIR/package.json -# go +#-# go OUT_DIR="pkg-go" wasm-pack build --release --target web --out-dir $OUT_DIR --features "go-parser" \ -Z build-std=panic_abort,std -Z build-std-features=panic_immediate_abort sed -i '' 's/"windmill-parser-wasm"/"windmill-parser-wasm-go"/' $OUT_DIR/package.json -# php +#-# php OUT_DIR="pkg-php" wasm-pack build --release --target web --out-dir $OUT_DIR --features "php-parser" \ -Z build-std=panic_abort,std -Z build-std-features=panic_immediate_abort sed -i '' 's/"windmill-parser-wasm"/"windmill-parser-wasm-php"/' $OUT_DIR/package.json -# rust +#-# rust OUT_DIR="pkg-rust" wasm-pack build --release --target web --out-dir $OUT_DIR --features "rust-parser" \ -Z build-std=panic_abort,std -Z build-std-features=panic_immediate_abort sed -i '' 's/"windmill-parser-wasm"/"windmill-parser-wasm-rust"/' $OUT_DIR/package.json -# ansible +#-# ansible OUT_DIR="pkg-yaml" wasm-pack build --release --target web --out-dir $OUT_DIR --features "ansible-parser" \ -Z build-std=panic_abort,std -Z build-std-features=panic_immediate_abort sed -i '' 's/"windmill-parser-wasm"/"windmill-parser-wasm-yaml"/' $OUT_DIR/package.json -# C# (needs some more stuff to compile C tree sitter into wasm) +#-# C# (needs some more stuff to compile C tree sitter into wasm) # TODO: hasn't been tested on mac, might need fixing OUT_DIR="pkg-csharp" CFLAGS_wasm32_unknown_unknown="-I$(pwd)/wasm-sysroot -Wbad-function-cast -Wcast-function-type -fno-builtin" RUSTFLAGS="-Zwasm-c-abi=spec" wasm-pack build --release --target web --out-dir $OUT_DIR --features "csharp-parser" sed -i '' 's/"windmill-parser-wasm"/"windmill-parser-wasm-csharp"/' $OUT_DIR/package.json + +#-# nu +# TODO: hasn't been tested on mac, might need fixing +OUT_DIR="pkg-nu" +wasm-pack build --release --target web --out-dir $OUT_DIR --features "nu-parser" \ + -Z build-std=panic_abort,std -Z build-std-features=panic_immediate_abort +sed -i '' 's/"windmill-parser-wasm"/"windmill-parser-wasm-nu"/' $OUT_DIR/package.json diff --git a/backend/parsers/windmill-parser-wasm/build-pkgs.sh b/backend/parsers/windmill-parser-wasm/build-pkgs.sh index ec7a1f5ee4..e2f0b6b471 100755 --- a/backend/parsers/windmill-parser-wasm/build-pkgs.sh +++ b/backend/parsers/windmill-parser-wasm/build-pkgs.sh @@ -1,55 +1,62 @@ -#!/bin/bash +#!/usr/bin/env bash set -eou pipefail -# full pkg +#-# full pkg OUT_DIR="pkg" wasm-pack build --release --target web --out-dir $OUT_DIR --all-features \ -Z build-std=panic_abort,std -Z build-std-features=panic_immediate_abort -# bun and deno +#-# bun and deno OUT_DIR="pkg-ts" wasm-pack build --release --target web --out-dir $OUT_DIR --features "ts-parser" \ -Z build-std=panic_abort,std -Z build-std-features=panic_immediate_abort sed -i 's/"windmill-parser-wasm"/"windmill-parser-wasm-ts"/' $OUT_DIR/package.json -# sql languages, graphql and bash/powershell, since they all use regex +#-# sql languages, graphql and bash/powershell, since they all use regex OUT_DIR="pkg-regex" wasm-pack build --release --target web --out-dir $OUT_DIR \ --features "sql-parser,graphql-parser,bash-parser" \ -Z build-std=panic_abort,std -Z build-std-features=panic_immediate_abort sed -i 's/"windmill-parser-wasm"/"windmill-parser-wasm-regex"/' $OUT_DIR/package.json -# python +#-# python OUT_DIR="pkg-py" wasm-pack build --release --target web --out-dir $OUT_DIR --features "py-parser" \ -Z build-std=panic_abort,std -Z build-std-features=panic_immediate_abort sed -i 's/"windmill-parser-wasm"/"windmill-parser-wasm-py"/' $OUT_DIR/package.json -# go +#-# go OUT_DIR="pkg-go" wasm-pack build --release --target web --out-dir $OUT_DIR --features "go-parser" \ -Z build-std=panic_abort,std -Z build-std-features=panic_immediate_abort sed -i 's/"windmill-parser-wasm"/"windmill-parser-wasm-go"/' $OUT_DIR/package.json -# php +#-# php OUT_DIR="pkg-php" wasm-pack build --release --target web --out-dir $OUT_DIR --features "php-parser" \ -Z build-std=panic_abort,std -Z build-std-features=panic_immediate_abort sed -i 's/"windmill-parser-wasm"/"windmill-parser-wasm-php"/' $OUT_DIR/package.json -# rust +#-# rust OUT_DIR="pkg-rust" wasm-pack build --release --target web --out-dir $OUT_DIR --features "rust-parser" \ -Z build-std=panic_abort,std -Z build-std-features=panic_immediate_abort sed -i 's/"windmill-parser-wasm"/"windmill-parser-wasm-rust"/' $OUT_DIR/package.json -# ansible +#-# ansible OUT_DIR="pkg-yaml" wasm-pack build --release --target web --out-dir $OUT_DIR --features "ansible-parser" \ -Z build-std=panic_abort,std -Z build-std-features=panic_immediate_abort sed -i 's/"windmill-parser-wasm"/"windmill-parser-wasm-yaml"/' $OUT_DIR/package.json -# C# (needs some more stuff to compile C tree sitter into wasm) +#-# C# (needs some more stuff to compile C tree sitter into wasm) OUT_DIR="pkg-csharp" CFLAGS_wasm32_unknown_unknown="-I$(pwd)/wasm-sysroot -Wbad-function-cast -Wcast-function-type -fno-builtin" RUSTFLAGS="-Zwasm-c-abi=spec" wasm-pack build --release --target web --out-dir $OUT_DIR --features "csharp-parser" sed -i 's/"windmill-parser-wasm"/"windmill-parser-wasm-csharp"/' $OUT_DIR/package.json + +#-# Nu +OUT_DIR="pkg-nu" +wasm-pack build --release --target web --out-dir $OUT_DIR --features "nu-parser" \ + -Z build-std=panic_abort,std -Z build-std-features=panic_immediate_abort +sed -i 's/"windmill-parser-wasm"/"windmill-parser-wasm-nu"/' $OUT_DIR/package.json + diff --git a/backend/parsers/windmill-parser-wasm/build.sh b/backend/parsers/windmill-parser-wasm/build.sh index b872e2c912..c843d2b445 100755 --- a/backend/parsers/windmill-parser-wasm/build.sh +++ b/backend/parsers/windmill-parser-wasm/build.sh @@ -1,4 +1,8 @@ -#!/bin/bash +#!/usr/bin/env bash set -eou pipefail -deno task wasmbuild --out ../../../cli/wasm/ -p windmill-parser-wasm --all-features +# Flags are needed to build correctly with C# +# NOTE: Currently does not work with nix nor nixos +CFLAGS_wasm32_unknown_unknown="-I$(pwd)/wasm-sysroot -Wbad-function-cast -Wcast-function-type -fno-builtin" RUSTFLAGS="-Zwasm-c-abi=spec" deno task wasmbuild --inline --out ../../../cli/wasm/ -p windmill-parser-wasm --all-features + + diff --git a/backend/parsers/windmill-parser-wasm/deno.json b/backend/parsers/windmill-parser-wasm/deno.json index abdd5e39d1..1887a74f76 100644 --- a/backend/parsers/windmill-parser-wasm/deno.json +++ b/backend/parsers/windmill-parser-wasm/deno.json @@ -1,5 +1,5 @@ { "tasks": { - "wasmbuild": "deno run -A jsr:@deno/wasmbuild@0.17.2" + "wasmbuild": "deno run -A jsr:@deno/wasmbuild@0.19.0" } } diff --git a/backend/parsers/windmill-parser-wasm/dev.nu b/backend/parsers/windmill-parser-wasm/dev.nu new file mode 100755 index 0000000000..e80f3c302f --- /dev/null +++ b/backend/parsers/windmill-parser-wasm/dev.nu @@ -0,0 +1,25 @@ +#!/usr/bin/env nu + +# Build in debug mode specified lang parser to wasm +# and perform installation to frontend +def "main" [ + lang: string # Example: nu + --release(-r) +] { + let out_dir = $'pkg-($lang)' + if $release { + open build-pkgs.sh + | split row '#-' + | find $out_dir + | bash -c $"RUST_LOG=trace ($in.0)" + } else { + open build-pkgs.sh + | split row '#-' + | find $out_dir + | str replace "--release" "--no-opt" + | bash -c $"WASM_OPT=-Oz ($in.0)" + } + ( + cd ../../../frontend; npm install ../backend/parsers/windmill-parser-wasm/($out_dir) + ) +} diff --git a/backend/parsers/windmill-parser-wasm/flake.lock b/backend/parsers/windmill-parser-wasm/flake.lock deleted file mode 100644 index c8733c1921..0000000000 --- a/backend/parsers/windmill-parser-wasm/flake.lock +++ /dev/null @@ -1,95 +0,0 @@ -{ - "nodes": { - "flake-utils": { - "inputs": { - "systems": "systems" - }, - "locked": { - "lastModified": 1731533236, - "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "flake-utils", - "type": "github" - } - }, - "nixpkgs": { - "locked": { - "lastModified": 1737885589, - "narHash": "sha256-Zf0hSrtzaM1DEz8//+Xs51k/wdSajticVrATqDrfQjg=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "852ff1d9e153d8875a83602e03fdef8a63f0ecf8", - "type": "github" - }, - "original": { - "id": "nixpkgs", - "ref": "nixos-unstable", - "type": "indirect" - } - }, - "nixpkgs_2": { - "locked": { - "lastModified": 1736320768, - "narHash": "sha256-nIYdTAiKIGnFNugbomgBJR+Xv5F1ZQU+HfaBqJKroC0=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "4bc9c909d9ac828a039f288cf872d16d38185db8", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "root": { - "inputs": { - "flake-utils": "flake-utils", - "nixpkgs": "nixpkgs", - "rust-overlay": "rust-overlay" - } - }, - "rust-overlay": { - "inputs": { - "nixpkgs": "nixpkgs_2" - }, - "locked": { - "lastModified": 1738117527, - "narHash": "sha256-GFviGfaezjGLFUlxdv3zyC7rSZvTXqwcG/YsF6MDkOw=", - "owner": "oxalica", - "repo": "rust-overlay", - "rev": "6a3dc6ce4132bd57359214d986db376f2333c14d", - "type": "github" - }, - "original": { - "owner": "oxalica", - "repo": "rust-overlay", - "type": "github" - } - }, - "systems": { - "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", - "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default", - "type": "github" - } - } - }, - "root": "root", - "version": 7 -} diff --git a/backend/parsers/windmill-parser-wasm/flake.nix b/backend/parsers/windmill-parser-wasm/flake.nix deleted file mode 100644 index ac97d8c80a..0000000000 --- a/backend/parsers/windmill-parser-wasm/flake.nix +++ /dev/null @@ -1,37 +0,0 @@ -{ - inputs = { - nixpkgs.url = "nixpkgs/nixos-unstable"; - flake-utils.url = "github:numtide/flake-utils"; - rust-overlay.url = "github:oxalica/rust-overlay"; - }; - - outputs = { - nixpkgs, - flake-utils, - rust-overlay, - ... - }: - flake-utils.lib.eachDefaultSystem (system: let - pkgs = import nixpkgs { - inherit system; - overlays = [(import rust-overlay)]; - }; - rust = pkgs.rust-bin.nightly.latest.default.override { - extensions = [ - "rust-src" - ]; - targets = ["wasm32-unknown-unknown"]; - }; - in { - devShell = pkgs.mkShell { - buildInputs = with pkgs; [ - rust - nodejs - wasm-pack - sccache - ]; - RUSTC_WRAPPER = "${pkgs.sccache}/bin/sccache"; - CARGO_PATH = "${rust}/bin/cargo"; - }; - }); -} diff --git a/backend/parsers/windmill-parser-wasm/publish-pkgs.sh b/backend/parsers/windmill-parser-wasm/publish-pkgs.sh index a4af8bb684..4180853b8b 100755 --- a/backend/parsers/windmill-parser-wasm/publish-pkgs.sh +++ b/backend/parsers/windmill-parser-wasm/publish-pkgs.sh @@ -27,3 +27,6 @@ popd pushd "pkg-csharp" && npm publish ${args} popd + +pushd "pkg-nu" && npm publish ${args} +popd diff --git a/backend/parsers/windmill-parser-wasm/src/lib.rs b/backend/parsers/windmill-parser-wasm/src/lib.rs index 306d67751c..2ca8f2f2b0 100644 --- a/backend/parsers/windmill-parser-wasm/src/lib.rs +++ b/backend/parsers/windmill-parser-wasm/src/lib.rs @@ -149,3 +149,9 @@ pub fn parse_ansible(code: &str) -> String { pub fn parse_csharp(code: &str) -> String { wrap_sig(windmill_parser_csharp::parse_csharp_signature(code)) } + +#[cfg(feature = "nu-parser")] +#[wasm_bindgen] +pub fn parse_nu(code: &str) -> String { + wrap_sig(windmill_parser_nu::parse_nu_signature(code)) +} diff --git a/backend/parsers/windmill-parser/src/lib.rs b/backend/parsers/windmill-parser/src/lib.rs index 6f793d0cc7..617b906154 100644 --- a/backend/parsers/windmill-parser/src/lib.rs +++ b/backend/parsers/windmill-parser/src/lib.rs @@ -10,7 +10,7 @@ use convert_case::{Boundary, Case, Casing}; use serde::Serialize; use serde_json::Value; -#[derive(Serialize, Debug, PartialEq)] +#[derive(Serialize, Debug, PartialEq, Default)] pub struct MainArgSignature { pub star_args: bool, pub star_kwargs: bool, diff --git a/backend/src/main.rs b/backend/src/main.rs index 9c87afa8a2..235365926b 100644 --- a/backend/src/main.rs +++ b/backend/src/main.rs @@ -66,8 +66,8 @@ use windmill_common::global_settings::OBJECT_STORE_CACHE_CONFIG_SETTING; use windmill_worker::{ get_hub_script_content_and_requirements, BUN_BUNDLE_CACHE_DIR, BUN_CACHE_DIR, CSHARP_CACHE_DIR, DENO_CACHE_DIR, DENO_CACHE_DIR_DEPS, DENO_CACHE_DIR_NPM, GO_BIN_CACHE_DIR, GO_CACHE_DIR, - POWERSHELL_CACHE_DIR, PY310_CACHE_DIR, PY311_CACHE_DIR, PY312_CACHE_DIR, PY313_CACHE_DIR, - RUST_CACHE_DIR, TAR_PY310_CACHE_DIR, TAR_PY311_CACHE_DIR, TAR_PY312_CACHE_DIR, + NU_CACHE_DIR, POWERSHELL_CACHE_DIR, PY310_CACHE_DIR, PY311_CACHE_DIR, PY312_CACHE_DIR, + PY313_CACHE_DIR, RUST_CACHE_DIR, TAR_PY310_CACHE_DIR, TAR_PY311_CACHE_DIR, TAR_PY312_CACHE_DIR, TAR_PY313_CACHE_DIR, UV_CACHE_DIR, }; @@ -1080,6 +1080,7 @@ pub async fn run_workers( GO_BIN_CACHE_DIR, RUST_CACHE_DIR, CSHARP_CACHE_DIR, + NU_CACHE_DIR, HUB_CACHE_DIR, POWERSHELL_CACHE_DIR, ] { diff --git a/backend/tests/worker.rs b/backend/tests/worker.rs index 0e0e209a5b..17f210d05f 100644 --- a/backend/tests/worker.rs +++ b/backend/tests/worker.rs @@ -1886,6 +1886,109 @@ echo "hello $msg" assert_eq!(job.json_result(), Some(json!("hello world"))); } +#[cfg(feature = "nu")] +#[sqlx::test(fixtures("base"))] +async fn test_nu_job(db: Pool) { + initialize_tracing().await; + let server = ApiServer::start(db.clone()).await; + let port = server.addr.port(); + + let content = r#" +def main [ msg: string ] { + "hello " + $msg +} +"# + .to_owned(); + + let job = RunJob::from(JobPayload::Code(RawCode { + hash: None, + content, + path: None, + lock: None, + language: ScriptLang::Nu, + custom_concurrency_key: None, + concurrent_limit: None, + concurrency_time_window_s: None, + cache_ttl: None, + dedicated_worker: None, + })) + .arg("msg", json!("world")) + .run_until_complete(&db, port) + .await; + assert_eq!(job.json_result(), Some(json!("hello world"))); +} + +#[cfg(feature = "nu")] +#[sqlx::test(fixtures("base"))] +async fn test_nu_job_full(db: Pool) { + initialize_tracing().await; + let server = ApiServer::start(db.clone()).await; + let port = server.addr.port(); + + let content = r#" +def main [ + # Required + ## Primitive + a + b: any + c: bool + d: float + e: datetime + f: string + j: nothing + ## Nesting + g: record + h: list + i: table + # Optional + m? + n = "foo" + o: any = "foo" + p?: any + # TODO: ...x + ] { + 0 +} + "# + .to_owned(); + + let result = RunJob::from(JobPayload::Code(RawCode { + hash: None, + content, + path: None, + lock: None, + language: ScriptLang::Nu, + custom_concurrency_key: None, + concurrent_limit: None, + concurrency_time_window_s: None, + cache_ttl: None, + dedicated_worker: None, + })) + .arg("a", json!("3")) + .arg("b", json!("null")) + .arg("c", json!(true)) + .arg("d", json!(3.0)) + .arg("e", json!("2024-09-24T10:00:00.000Z")) + .arg("f", json!("str")) + .arg("j", json!(null)) + .arg("g", json!({"a": 32})) + .arg("h", json!(["foo"])) + .arg( + "i", + json!([ + {"a": 1, "b": "foo", "c": true}, + {"a": 2, "b": "baz", "c": false} + ]), + ) + .arg("n", json!("baz")) + .run_until_complete(&db, port) + .await + .json_result() + .unwrap(); + + assert_eq!(result, serde_json::json!(0)); +} + #[sqlx::test(fixtures("base"))] async fn test_python_job(db: Pool) { initialize_tracing().await; diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index 29b84c05b5..5339ed86af 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -13380,7 +13380,8 @@ components: php, rust, ansible, - csharp + csharp, + nu ] Preview: diff --git a/backend/windmill-api/src/scripts.rs b/backend/windmill-api/src/scripts.rs index 6b6003b329..3e0197fccc 100644 --- a/backend/windmill-api/src/scripts.rs +++ b/backend/windmill-api/src/scripts.rs @@ -610,6 +610,7 @@ async fn create_script_internal<'c>( || ns.language == ScriptLang::Rust || ns.language == ScriptLang::Ansible || ns.language == ScriptLang::CSharp + || ns.language == ScriptLang::Nu || ns.language == ScriptLang::Php) { Some(String::new()) diff --git a/backend/windmill-api/src/workspaces_export.rs b/backend/windmill-api/src/workspaces_export.rs index 449b5e3256..003a01c002 100644 --- a/backend/windmill-api/src/workspaces_export.rs +++ b/backend/windmill-api/src/workspaces_export.rs @@ -376,6 +376,7 @@ pub(crate) async fn tarball_workspace( ScriptLang::Rust => "rs", ScriptLang::Ansible => "playbook.yml", ScriptLang::CSharp => "cs", + ScriptLang::Nu => "nu", ScriptLang::OracleDB => "odb.sql", }; archive diff --git a/backend/windmill-common/src/global_settings.rs b/backend/windmill-common/src/global_settings.rs index 41ccccdebd..e0c091a0da 100644 --- a/backend/windmill-common/src/global_settings.rs +++ b/backend/windmill-common/src/global_settings.rs @@ -40,7 +40,7 @@ pub const JWT_SECRET_SETTING: &str = "jwt_secret"; pub const EMAIL_DOMAIN_SETTING: &str = "email_domain"; pub const OTEL_SETTING: &str = "otel"; -pub const ENV_SETTINGS: [&str; 58] = [ +pub const ENV_SETTINGS: &[&str] = &[ "DISABLE_NSJAIL", "MODE", "NUM_WORKERS", @@ -58,6 +58,7 @@ pub const ENV_SETTINGS: [&str; 58] = [ "S3_CACHE_BUCKET", "COOKIE_DOMAIN", "PYTHON_PATH", + "NU_PATH", "DENO_PATH", "GO_PATH", "GOPRIVATE", diff --git a/backend/windmill-common/src/schema.rs b/backend/windmill-common/src/schema.rs index d3ef869c6c..4b97f761ae 100644 --- a/backend/windmill-common/src/schema.rs +++ b/backend/windmill-common/src/schema.rs @@ -364,6 +364,7 @@ pub fn should_validate_schema(code: &str, lang: &ScriptLang) -> bool { ScriptLang::Rust => find_annotation("//!", annotation, code), ScriptLang::Ansible => find_annotation("#", annotation, code), ScriptLang::CSharp => find_annotation("//", annotation, code), + ScriptLang::Nu => find_annotation("#", annotation, code), } } @@ -650,4 +651,3 @@ mod tests { .expect("Validation should work for this"); } } - diff --git a/backend/windmill-common/src/scripts.rs b/backend/windmill-common/src/scripts.rs index 5658d505b6..b38598f0b8 100644 --- a/backend/windmill-common/src/scripts.rs +++ b/backend/windmill-common/src/scripts.rs @@ -50,6 +50,7 @@ pub enum ScriptLang { Rust, Ansible, CSharp, + Nu, } impl ScriptLang { @@ -74,6 +75,7 @@ impl ScriptLang { ScriptLang::Rust => "rust", ScriptLang::Ansible => "ansible", ScriptLang::CSharp => "csharp", + ScriptLang::Nu => "nu", } } } diff --git a/backend/windmill-common/src/worker.rs b/backend/windmill-common/src/worker.rs index 856555f29d..af5814aedc 100644 --- a/backend/windmill-common/src/worker.rs +++ b/backend/windmill-common/src/worker.rs @@ -50,6 +50,7 @@ lazy_static::lazy_static! { "rust".to_string(), "ansible".to_string(), "csharp".to_string(), + "nu".to_string(), "dependency".to_string(), "flow".to_string(), "other".to_string() diff --git a/backend/windmill-worker/Cargo.toml b/backend/windmill-worker/Cargo.toml index 73e91da388..f216dab35b 100644 --- a/backend/windmill-worker/Cargo.toml +++ b/backend/windmill-worker/Cargo.toml @@ -29,6 +29,7 @@ oracledb = ["dep:oracle"] python = ["dep:windmill-parser-py", "dep:windmill-parser-py-imports"] csharp = ["dep:windmill-parser-csharp"] rust = ["dep:windmill-parser-rust"] +nu = ["dep:windmill-parser-nu"] [dependencies] windmill-queue.workspace = true @@ -39,6 +40,7 @@ windmill-parser-ts.workspace = true windmill-parser-go.workspace = true windmill-parser-rust = { workspace = true, optional = true } windmill-parser-csharp = { workspace = true, optional = true } +windmill-parser-nu = { workspace = true, optional = true } windmill-parser-py = { workspace = true, optional = true } windmill-parser-yaml.workspace = true windmill-parser-py-imports = { workspace = true, optional = true } diff --git a/backend/windmill-worker/nsjail/run.nu.config.proto b/backend/windmill-worker/nsjail/run.nu.config.proto new file mode 100644 index 0000000000..8d27d92455 --- /dev/null +++ b/backend/windmill-worker/nsjail/run.nu.config.proto @@ -0,0 +1,106 @@ +name: "nu run script" + +mode: ONCE +hostname: "nu" +log_level: ERROR + +disable_rl: true + +cwd: "/tmp" + +clone_newnet: false +clone_newuser: {CLONE_NEWUSER} + +keep_caps: false +keep_env: true +mount_proc: true + +mount { + src: "/bin" + dst: "/bin" + is_bind: true +} + +mount { + src: "/lib" + dst: "/lib" + is_bind: true +} + + +mount { + src: "/lib64" + dst: "/lib64" + is_bind: true + mandatory: false +} + + +mount { + src: "/usr" + dst: "/usr" + is_bind: true +} + +mount { + src: "/dev/null" + dst: "/dev/null" + is_bind: true + rw: true +} + +mount { + dst: "/tmp" + fstype: "tmpfs" + rw: true + options: "size=800000000" +} + +mount { + src: "{NU_PATH}" + dst: "{NU_PATH}" + is_bind: true +} + +mount { + src: "{JOB_DIR}/main.nu" + dst: "/tmp/main.nu" + is_bind: true +} + +mount { + src: "{JOB_DIR}/result.json" + dst: "/tmp/result.json" + rw: true + is_bind: true +} + +mount { + src: "{JOB_DIR}/args.json" + dst: "/tmp/args.json" + rw: true + is_bind: true +} +mount { + src: "/etc" + dst: "/etc" + is_bind: true +} + +mount { + src: "/dev/random" + dst: "/dev/random" + is_bind: true +} + +mount { + src: "/dev/urandom" + dst: "/dev/urandom" + is_bind: true +} + +iface_no_lo: true + +{SHARED_MOUNT} + +envar: "HOME=/tmp" diff --git a/backend/windmill-worker/src/lib.rs b/backend/windmill-worker/src/lib.rs index 40c19beea6..4ae83309da 100644 --- a/backend/windmill-worker/src/lib.rs +++ b/backend/windmill-worker/src/lib.rs @@ -9,6 +9,8 @@ mod snowflake_executor; mod ansible_executor; mod bash_executor; +#[cfg(feature = "nu")] +mod nu_executor; #[cfg(feature = "benchmark")] pub mod bench; mod bun_executor; diff --git a/backend/windmill-worker/src/nu_executor.rs b/backend/windmill-worker/src/nu_executor.rs new file mode 100644 index 0000000000..2859e016b8 --- /dev/null +++ b/backend/windmill-worker/src/nu_executor.rs @@ -0,0 +1,356 @@ +use std::{collections::HashMap, process::Stdio}; + +use itertools::Itertools; +use serde_json::value::RawValue; +use tokio::{fs::File, io::AsyncWriteExt, process::Command}; +use windmill_common::{error::Error, worker::write_file}; +use windmill_parser::Arg; +use windmill_parser_nu::parse_nu_signature; +use windmill_queue::{append_logs, CanceledBy, MiniPulledJob}; + +use crate::{ + common::{ + create_args_and_out_file, get_reserved_variables, read_result, start_child_process, + OccupancyMetrics, + }, + handle_child, AuthedClientBackgroundTask, DISABLE_NSJAIL, DISABLE_NUSER, NSJAIL_PATH, PATH_ENV, + PROXY_ENVS, +}; + +const NSJAIL_CONFIG_RUN_NU_CONTENT: &str = include_str!("../nsjail/run.nu.config.proto"); +lazy_static::lazy_static! { + static ref NU_PATH: String = std::env::var("NU_PATH").unwrap_or_else(|_| "/usr/bin/nu".to_string()); + // TODO(v1): + // static ref PLUGIN_USE_RE: Regex = Regex::new(r#"(?:plugin use )(?.*)"#).unwrap(); +} + +// TODO: Can be generalized and used for other handlers +#[allow(dead_code)] +pub(crate) struct JobHandlerInput<'a> { + pub base_internal_url: &'a str, + pub canceled_by: &'a mut Option, + pub client: &'a AuthedClientBackgroundTask, + pub db: &'a sqlx::Pool, + pub envs: HashMap, + pub inner_content: &'a str, + pub job: &'a MiniPulledJob, + pub job_dir: &'a str, + pub mem_peak: &'a mut i32, + pub occupancy_metrics: &'a mut OccupancyMetrics, + pub requirements_o: Option<&'a String>, + pub shared_mount: &'a str, + pub worker_name: &'a str, +} + +pub async fn handle_nu_job<'a>(mut args: JobHandlerInput<'a>) -> Result, Error> { + // TODO(v1): + // --- Handle plugins --- + // let plugins = get_plugins(&mut args).await?; + // TODO(v1): + // --- Handle imports --- + // TODO(v1): + // --- Handle relative --- + // --- Wrap and write to fs --- + { + create_args_and_out_file(&args.client, args.job, args.job_dir, args.db).await?; + File::create(format!("{}/main.nu", args.job_dir)) + .await? + .write_all(&wrap(args.inner_content)?.into_bytes()) + .await?; + } + // --- Execute --- + { + run(&mut args).await?; + } + // --- Retrieve results --- + { + read_result(&args.job_dir).await + } +} + +// async fn get_plugins<'a>( +// JobHandlerInput { +// occupancy_metrics, +// mem_peak, +// canceled_by, +// worker_name, +// job, +// db, +// inner_content, +// .. +// }: &mut JobHandlerInput<'a>, +// ) -> Result, Error> { +// let plugins_dir = concatcp!(NU_CACHE_DIR, "/plugins"); +// let nu_version = from_utf8_mut( +// Command::new(NU_PATH.as_str()) +// .arg("--version") +// .output() +// .await? +// .stdout +// .as_mut_slice(), +// ) +// .map_err(|e| windmill_common::error::Error::ExecutionErr(e.to_string()))? +// .to_owned(); + +// let plugins = parse_plugin_use(inner_content); + +// for plugin in &plugins { +// let mut run_cmd = Command::new(CARGO_PATH.as_str()); +// // cargo install nu_plugin_query --version (nu --version); plugin add ~/.cargo/bin/nu_plugin_query +// run_cmd +// // TODO: make it work with env_clear +// // .env_clear() +// .args(&[ +// "install", +// "--root", +// plugins_dir, +// "--locked", +// &format!("nu_plugin_{plugin}"), +// "--version", +// &nu_version, +// ]) +// .stdout(Stdio::piped()) +// .stderr(Stdio::piped()); + +// #[cfg(windows)] +// nsjail_cmd.env("SystemRoot", SYSTEM_ROOT.as_str()); +// let child = start_child_process(run_cmd, "cargo").await?; +// // handle_child::handle_child( +// // &job.id, +// // db, +// // mem_peak, +// // canceled_by, +// // child, +// // !*DISABLE_NSJAIL, +// // worker_name, +// // &job.workspace_id, +// // "cargo", +// // job.timeout, +// // false, +// // &mut Some(occupancy_metrics), +// // ) +// // .await?; +// } +// Ok(plugins) +// } + +// fn parse_plugin_use(inner_content: &str) -> Vec<&str> { +// let mut plugins = vec![]; +// // TODO: Ignore plugins with # in the beginning +// for cap in PLUGIN_USE_RE.captures_iter(inner_content).into_iter() { +// if let Some(mat) = cap.name("plugin") { +// plugins.push(mat.as_str()); +// } +// } +// plugins +// } + +/// Wraps content script +/// that upon execution reads args.json (which are piped and transformed from previous flow step or top level inputs) +/// Also wrapper takes output of program and serializes to result.json (Which windmill will know how to use later) +fn wrap(inner_content: &str) -> Result { + let sig = parse_nu_signature(inner_content)?; + let spread = sig + .args + .clone() + .into_iter() + .map(|Arg { name, typ, has_default, .. }| { + // Apply additional input transformation + let transformation = format!( + "| if $in != null {{ {} }} else {{ $in }}", + match typ { + // JSON converts X.0 to X and nu can't coerce type automatically + windmill_parser::Typ::Datetime => "into datetime", + windmill_parser::Typ::Bytes => "into binary", + windmill_parser::Typ::Float => "into float", + // Ident + _ => "$in", + } + ); + let nullguard = if has_default || matches!(typ, windmill_parser::Typ::Unknown) { + "".to_owned() + } else { + format!("| nullguard {name}") + }; + format!("\n\t\t\t($parsed_args.{name}? {nullguard} {transformation}) ",) + }) + .collect_vec() + .join(" "); + Ok( + r#" +$env.config.table.mode = 'basic' + +def nullguard [ name: string ] { + if ($in == null) { + panic $"argument `($name)` of main function can't be null" + } + $in +} + +# TODO: Probably needs rework in order for LSP to work +def get_variable [ pat ] { + let addr = $"($env.BASE_INTERNAL_URL)/api/w/($env.WM_WORKSPACE)/variables/get_value/($pat)" ; + http get -H ["Authorization", $"Bearer ($env.WM_TOKEN)"] $addr | return $in +} +def get_resource [ pat ] { + let addr = $"($env.BASE_INTERNAL_URL)/api/w/($env.WM_WORKSPACE)/resources/get_value_interpolated/($pat)" ; + http get -H ["Authorization", $"Bearer ($env.WM_TOKEN)"] $addr | return $in +} + +def 'main --wrapped' [] { + let parsed_args = open args.json + (main SPREAD + ) | to json | save -f result.json +} + +INNER_CONTENT + "# + .replace("INNER_CONTENT", inner_content) + .replace("SPREAD", &spread), // .replace("TRANSFORM", transform) + ) +} + +async fn run<'a>( + JobHandlerInput { + occupancy_metrics, + mem_peak, + canceled_by, + worker_name, + job, + db, + job_dir, + shared_mount, + client, + envs, + base_internal_url, + .. + }: &mut JobHandlerInput<'a>, + // plugins: Vec<&'a str>, +) -> Result<(), Error> { + let client = &client.get_authed().await; + let reserved_variables = get_reserved_variables(job, &client.token, db).await?; + let child = if !cfg!(windows) && !*DISABLE_NSJAIL { + append_logs( + &job.id, + &job.workspace_id, + format!("\n\n--- ISOLATED NU CODE EXECUTION ---\n"), + db.clone(), + ) + .await; + + write_file( + job_dir, + "run.config.proto", + &NSJAIL_CONFIG_RUN_NU_CONTENT + .replace("{JOB_DIR}", job_dir) + .replace("{NU_PATH}", &NU_PATH) + .replace("{SHARED_MOUNT}", &shared_mount) + .replace("{CLONE_NEWUSER}", &(!*DISABLE_NUSER).to_string()), + )?; + let mut nsjail_cmd = Command::new(NSJAIL_PATH.as_str()); + nsjail_cmd + .env_clear() + .current_dir(job_dir) + .env("PATH", PATH_ENV.as_str()) + .env("BASE_INTERNAL_URL", base_internal_url) + .envs(envs) + .envs(reserved_variables) + .envs(PROXY_ENVS.clone()) + .args(vec![ + "--config", + "run.config.proto", + "--", + NU_PATH.as_str(), + "/tmp/main.nu", + "--wrapped", + ]) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()); + + start_child_process(nsjail_cmd, NSJAIL_PATH.as_str()).await? + } else { + append_logs( + &job.id, + &job.workspace_id, + format!("\n\n--- NU CODE EXECUTION ---\n"), + db.clone(), + ) + .await; + + // let plugin_registry = format!("{job_dir}/plugin-registry"); + // File::create(&plugin_registry).await?; + // + let mut cmd = Command::new(if cfg!(windows) { + "nu" + } else { + NU_PATH.as_str() + }); + cmd.env_clear() + .current_dir(job_dir.to_owned()) + .env("PATH", PATH_ENV.as_str()) + .env("BASE_INTERNAL_URL", base_internal_url) + .envs(envs) + .envs(reserved_variables) + .envs(PROXY_ENVS.clone()) + .args(&[ + "main.nu", + "--wrapped", + // TODO(v1): + // "--plugins", + // &format!( + // "[{}]", + // plugins + // .into_iter() + // .map(|pl| format!("{NU_CACHE_DIR}/plugins/bin/nu_plugin_{pl}")) + // .collect_vec() + // .join(",") + // ), + ]) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()); + + #[cfg(windows)] + { + cmd.env("SystemRoot", crate::SYSTEM_ROOT.as_str()) + .env("USERPROFILE", crate::USERPROFILE_ENV.as_str()) + .env( + "TMP", + std::env::var("TMP").unwrap_or_else(|_| String::from("/tmp")), + ); + } + start_child_process(cmd, "nu").await? + }; + handle_child::handle_child( + &job.id, + db, + mem_peak, + canceled_by, + child, + !*DISABLE_NSJAIL, + worker_name, + &job.workspace_id, + "nu", + job.timeout, + false, + &mut Some(occupancy_metrics), + ) + .await +} +// #[cfg(test)] +// mod test { +// use super::parse_plugin_use; + +// #[test] +// fn test_nu_plugin_use() { +// let content = r#" +// plugin use foo +// plugin use bar +// plugin use baz +// plugin use meh +// "#; +// assert_eq!( +// vec!["foo", "bar", "baz", "meh"], // +// parse_plugin_use(content) +// ); +// } +// } diff --git a/backend/windmill-worker/src/worker.rs b/backend/windmill-worker/src/worker.rs index ea2ddca55f..6f7bd1f16a 100644 --- a/backend/windmill-worker/src/worker.rs +++ b/backend/windmill-worker/src/worker.rs @@ -122,6 +122,9 @@ use crate::{ #[cfg(feature = "rust")] use crate::rust_executor::handle_rust_job; +#[cfg(feature = "nu")] +use crate::nu_executor::{handle_nu_job, JobHandlerInput}; + #[cfg(feature = "php")] use crate::php_executor::handle_php_job; @@ -275,6 +278,7 @@ pub const DENO_CACHE_DIR_NPM: &str = concatcp!(ROOT_CACHE_DIR, "deno/npm"); pub const GO_CACHE_DIR: &str = concatcp!(ROOT_CACHE_DIR, "go"); pub const RUST_CACHE_DIR: &str = concatcp!(ROOT_CACHE_DIR, "rust"); +pub const NU_CACHE_DIR: &str = concatcp!(ROOT_CACHE_DIR, "nu"); pub const CSHARP_CACHE_DIR: &str = concatcp!(ROOT_CACHE_DIR, "csharp"); pub const BUN_CACHE_DIR: &str = concatcp!(ROOT_CACHE_NOMOUNT_DIR, "bun"); pub const BUN_BUNDLE_CACHE_DIR: &str = concatcp!(ROOT_CACHE_DIR, "bun"); @@ -3026,6 +3030,30 @@ mount {{ ) .await } + Some(ScriptLang::Nu) => { + #[cfg(not(feature = "nu"))] + return Err( + anyhow::anyhow!("Nu is not available because the feature is not enabled").into(), + ); + + #[cfg(feature = "nu")] + handle_nu_job(JobHandlerInput { + mem_peak, + canceled_by, + job, + db, + client, + inner_content: &code, + job_dir, + requirements_o: lock.as_ref(), + shared_mount: &shared_mount, + base_internal_url, + worker_name, + envs, + occupancy_metrics, + }) + .await + } _ => panic!("unreachable, language is not supported: {language:#?}"), }; tracing::info!( @@ -3089,6 +3117,10 @@ fn parse_sig_of_lang( ScriptLang::CSharp => Some(windmill_parser_csharp::parse_csharp_signature(code)?), #[cfg(not(feature = "csharp"))] ScriptLang::CSharp => None, + #[cfg(feature = "nu")] + ScriptLang::Nu => Some(windmill_parser_nu::parse_nu_signature(code)?), + #[cfg(not(feature = "nu"))] + ScriptLang::Nu => None, } } else { None diff --git a/backend/windmill-worker/src/worker_lockfiles.rs b/backend/windmill-worker/src/worker_lockfiles.rs index c0b0826664..47a0d264cb 100644 --- a/backend/windmill-worker/src/worker_lockfiles.rs +++ b/backend/windmill-worker/src/worker_lockfiles.rs @@ -2050,6 +2050,7 @@ async fn capture_dependency_job( ScriptLang::Graphql => Ok("".to_owned()), ScriptLang::OracleDB => Ok("".to_owned()), ScriptLang::Bash => Ok("".to_owned()), + ScriptLang::Nu => Ok("".to_owned()), ScriptLang::Powershell => Ok("".to_owned()), ScriptLang::Nativets => Ok("".to_owned()), } diff --git a/cli/bootstrap/script_bootstrap.ts b/cli/bootstrap/script_bootstrap.ts index 79ca7d92b7..5c2247e66b 100644 --- a/cli/bootstrap/script_bootstrap.ts +++ b/cli/bootstrap/script_bootstrap.ts @@ -94,6 +94,11 @@ function main() { } } `, + nu: ` +def main [] { + print "Hello World" +} + `, rust: `fn main() -> Result<(), String> { println!("Hello World"); diff --git a/cli/deno.json b/cli/deno.json index 6276c18bbc..fae7e8f7dd 100644 --- a/cli/deno.json +++ b/cli/deno.json @@ -15,4 +15,4 @@ "@std/yaml": "jsr:@std/yaml@^1.0.5", "@types/diff": "npm:@types/diff@^5.2.2" } -} +} \ No newline at end of file diff --git a/cli/deno.lock b/cli/deno.lock index 4d4111261c..b1ff9b9a2b 100644 --- a/cli/deno.lock +++ b/cli/deno.lock @@ -1,2319 +1,2195 @@ { - "version": "3", - "packages": { - "specifiers": { - "jsr:@david/code-block-writer@^13.0.2": "jsr:@david/code-block-writer@13.0.2", - "jsr:@deno/cache-dir@^0.10.3": "jsr:@deno/cache-dir@0.10.3", - "jsr:@deno/dnt@0.41.3": "jsr:@deno/dnt@0.41.3", - "jsr:@deno/dnt@^0.41.3": "jsr:@deno/dnt@0.41.3", - "jsr:@std/assert@1.0.0-rc.2": "jsr:@std/assert@1.0.0-rc.2", - "jsr:@std/assert@^0.223.0": "jsr:@std/assert@0.223.0", - "jsr:@std/assert@^0.226.0": "jsr:@std/assert@0.226.0", - "jsr:@std/bytes@^0.223.0": "jsr:@std/bytes@0.223.0", - "jsr:@std/bytes@^1.0.2": "jsr:@std/bytes@1.0.2", - "jsr:@std/cli@1.0.0-rc.2": "jsr:@std/cli@1.0.0-rc.2", - "jsr:@std/encoding": "jsr:@std/encoding@1.0.4", - "jsr:@std/encoding@1.0.0-rc.2": "jsr:@std/encoding@1.0.0-rc.2", - "jsr:@std/encoding@^1.0.4": "jsr:@std/encoding@1.0.4", - "jsr:@std/fmt@1": "jsr:@std/fmt@1.0.2", - "jsr:@std/fmt@^0.223": "jsr:@std/fmt@0.223.0", - "jsr:@std/fmt@^1.0.2": "jsr:@std/fmt@1.0.2", - "jsr:@std/fmt@~0.225.4": "jsr:@std/fmt@0.225.6", - "jsr:@std/fs": "jsr:@std/fs@1.0.3", - "jsr:@std/fs@1": "jsr:@std/fs@1.0.3", - "jsr:@std/fs@^0.223": "jsr:@std/fs@0.223.0", - "jsr:@std/fs@^0.229.3": "jsr:@std/fs@0.229.3", - "jsr:@std/fs@^1.0.3": "jsr:@std/fs@1.0.3", - "jsr:@std/io": "jsr:@std/io@0.224.7", - "jsr:@std/io@^0.223": "jsr:@std/io@0.223.0", - "jsr:@std/io@^0.224.7": "jsr:@std/io@0.224.7", - "jsr:@std/io@~0.224.2": "jsr:@std/io@0.224.7", - "jsr:@std/log": "jsr:@std/log@0.224.7", - "jsr:@std/log@^0.224.7": "jsr:@std/log@0.224.7", - "jsr:@std/net": "jsr:@std/net@1.0.2", - "jsr:@std/net@^1.0.2": "jsr:@std/net@1.0.2", - "jsr:@std/path": "jsr:@std/path@1.0.4", - "jsr:@std/path@1": "jsr:@std/path@1.0.4", - "jsr:@std/path@1.0.0-rc.1": "jsr:@std/path@1.0.0-rc.1", - "jsr:@std/path@1.0.0-rc.2": "jsr:@std/path@1.0.0-rc.2", - "jsr:@std/path@^0.223": "jsr:@std/path@0.223.0", - "jsr:@std/path@^0.225.2": "jsr:@std/path@0.225.2", - "jsr:@std/path@^1.0.4": "jsr:@std/path@1.0.4", - "jsr:@std/streams@^1.0.4": "jsr:@std/streams@1.0.4", - "jsr:@std/text@1.0.0-rc.1": "jsr:@std/text@1.0.0-rc.1", - "jsr:@std/yaml": "jsr:@std/yaml@1.0.5", - "jsr:@std/yaml@^1.0.5": "jsr:@std/yaml@1.0.5", - "jsr:@ts-morph/bootstrap@^0.24.0": "jsr:@ts-morph/bootstrap@0.24.0", - "jsr:@ts-morph/common@^0.24.0": "jsr:@ts-morph/common@0.24.0", - "jsr:@windmill-labs/cliffy-ansi@1.0.0-rc.5": "jsr:@windmill-labs/cliffy-ansi@1.0.0-rc.5", - "jsr:@windmill-labs/cliffy-ansi@^1.0.0-rc.5": "jsr:@windmill-labs/cliffy-ansi@1.0.0-rc.5", - "jsr:@windmill-labs/cliffy-command@1.0.0-rc.5": "jsr:@windmill-labs/cliffy-command@1.0.0-rc.5", - "jsr:@windmill-labs/cliffy-command@^1.0.0-rc.5": "jsr:@windmill-labs/cliffy-command@1.0.0-rc.5", - "jsr:@windmill-labs/cliffy-flags@1.0.0-rc.5": "jsr:@windmill-labs/cliffy-flags@1.0.0-rc.5", - "jsr:@windmill-labs/cliffy-internal@1.0.0-rc.5": "jsr:@windmill-labs/cliffy-internal@1.0.0-rc.5", - "jsr:@windmill-labs/cliffy-keycode@1.0.0-rc.5": "jsr:@windmill-labs/cliffy-keycode@1.0.0-rc.5", - "jsr:@windmill-labs/cliffy-prompt@1.0.0-rc.5": "jsr:@windmill-labs/cliffy-prompt@1.0.0-rc.5", - "jsr:@windmill-labs/cliffy-prompt@1.0.0-rc.6": "jsr:@windmill-labs/cliffy-prompt@1.0.0-rc.6", - "jsr:@windmill-labs/cliffy-prompt@^1.0.0-rc.5": "jsr:@windmill-labs/cliffy-prompt@1.0.0-rc.5", - "jsr:@windmill-labs/cliffy-table@1.0.0-rc.5": "jsr:@windmill-labs/cliffy-table@1.0.0-rc.5", - "jsr:@windmill-labs/cliffy-table@^1.0.0-rc.5": "jsr:@windmill-labs/cliffy-table@1.0.0-rc.5", - "npm:@ayonli/jsext": "npm:@ayonli/jsext@0.9.58", - "npm:@oakserver/oak@12": "npm:@oakserver/oak@12.6.2", - "npm:@types/diff@^5.2.2": "npm:@types/diff@5.2.2", - "npm:@types/node": "npm:@types/node@18.16.19", - "npm:diff": "npm:diff@5.2.0", - "npm:es-main": "npm:es-main@1.3.0", - "npm:esbuild": "npm:esbuild@0.23.0", - "npm:eslint-plugin-import@^2.30.0": "npm:eslint-plugin-import@2.30.0_eslint@8.57.1", - "npm:eslint@^9.10.0": "npm:eslint@9.10.0", - "npm:express": "npm:express@4.19.2", - "npm:get-port": "npm:get-port@7.1.0", - "npm:get-port@7.1.0": "npm:get-port@7.1.0", - "npm:gitignore-parser": "npm:gitignore-parser@0.0.2", - "npm:jszip@3.7.1": "npm:jszip@3.7.1", - "npm:minimatch": "npm:minimatch@10.0.1", - "npm:open": "npm:open@10.1.0", - "npm:windmill-client@1.364.0": "npm:windmill-client@1.364.0", - "npm:ws": "npm:ws@8.18.0" + "version": "4", + "specifiers": { + "jsr:@david/code-block-writer@^13.0.2": "13.0.2", + "jsr:@deno/cache-dir@~0.10.3": "0.10.3", + "jsr:@deno/dnt@0.41.3": "0.41.3", + "jsr:@deno/dnt@~0.41.3": "0.41.3", + "jsr:@deno/graph@~0.73.1": "0.73.1", + "jsr:@std/assert@0.223": "0.223.0", + "jsr:@std/assert@0.226": "0.226.0", + "jsr:@std/assert@1.0.0-rc.2": "1.0.0-rc.2", + "jsr:@std/bytes@0.223": "0.223.0", + "jsr:@std/bytes@^1.0.2": "1.0.2", + "jsr:@std/cli@1.0.0-rc.2": "1.0.0-rc.2", + "jsr:@std/encoding@*": "1.0.4", + "jsr:@std/encoding@1.0.0-rc.2": "1.0.0-rc.2", + "jsr:@std/encoding@^1.0.4": "1.0.4", + "jsr:@std/fmt@0.223": "0.223.0", + "jsr:@std/fmt@1": "1.0.2", + "jsr:@std/fmt@^1.0.2": "1.0.2", + "jsr:@std/fmt@~0.225.4": "0.225.6", + "jsr:@std/fs@*": "1.0.3", + "jsr:@std/fs@0.223": "0.223.0", + "jsr:@std/fs@1": "1.0.3", + "jsr:@std/fs@^1.0.3": "1.0.3", + "jsr:@std/fs@~0.229.3": "0.229.3", + "jsr:@std/io@*": "0.224.7", + "jsr:@std/io@0.223": "0.223.0", + "jsr:@std/io@~0.224.2": "0.224.7", + "jsr:@std/io@~0.224.7": "0.224.7", + "jsr:@std/log@*": "0.224.7", + "jsr:@std/log@~0.224.7": "0.224.7", + "jsr:@std/net@*": "1.0.2", + "jsr:@std/net@^1.0.2": "1.0.2", + "jsr:@std/path@*": "1.0.4", + "jsr:@std/path@0.223": "0.223.0", + "jsr:@std/path@1": "1.0.4", + "jsr:@std/path@1.0.0-rc.1": "1.0.0-rc.1", + "jsr:@std/path@1.0.0-rc.2": "1.0.0-rc.2", + "jsr:@std/path@^1.0.4": "1.0.4", + "jsr:@std/path@~0.225.2": "0.225.2", + "jsr:@std/streams@^1.0.4": "1.0.4", + "jsr:@std/text@1.0.0-rc.1": "1.0.0-rc.1", + "jsr:@std/yaml@*": "1.0.5", + "jsr:@std/yaml@^1.0.5": "1.0.5", + "jsr:@ts-morph/bootstrap@0.24": "0.24.0", + "jsr:@ts-morph/common@0.24": "0.24.0", + "jsr:@windmill-labs/cliffy-ansi@1.0.0-rc.5": "1.0.0-rc.5", + "jsr:@windmill-labs/cliffy-ansi@^1.0.0-rc.5": "1.0.0-rc.5", + "jsr:@windmill-labs/cliffy-command@1.0.0-rc.5": "1.0.0-rc.5", + "jsr:@windmill-labs/cliffy-command@^1.0.0-rc.5": "1.0.0-rc.5", + "jsr:@windmill-labs/cliffy-flags@1.0.0-rc.5": "1.0.0-rc.5", + "jsr:@windmill-labs/cliffy-internal@1.0.0-rc.5": "1.0.0-rc.5", + "jsr:@windmill-labs/cliffy-keycode@1.0.0-rc.5": "1.0.0-rc.5", + "jsr:@windmill-labs/cliffy-prompt@1.0.0-rc.5": "1.0.0-rc.5", + "jsr:@windmill-labs/cliffy-prompt@1.0.0-rc.6": "1.0.0-rc.6", + "jsr:@windmill-labs/cliffy-prompt@^1.0.0-rc.5": "1.0.0-rc.6", + "jsr:@windmill-labs/cliffy-table@1.0.0-rc.5": "1.0.0-rc.5", + "jsr:@windmill-labs/cliffy-table@^1.0.0-rc.5": "1.0.0-rc.5", + "npm:@ayonli/jsext@*": "0.9.58", + "npm:@oakserver/oak@12": "12.6.2", + "npm:@types/diff@^5.2.2": "5.2.2", + "npm:@types/node@*": "18.16.19", + "npm:diff@*": "5.2.0", + "npm:es-main@*": "1.3.0", + "npm:esbuild@*": "0.23.0", + "npm:eslint-plugin-import@^2.30.0": "2.30.0_eslint@8.57.1", + "npm:eslint@^9.10.0": "9.10.0", + "npm:express@*": "4.19.2", + "npm:get-port@*": "7.1.0", + "npm:get-port@7.1.0": "7.1.0", + "npm:gitignore-parser@*": "0.0.2", + "npm:jszip@3.7.1": "3.7.1", + "npm:minimatch@*": "10.0.1", + "npm:open@*": "10.1.0", + "npm:windmill-client@1.364.0": "1.364.0", + "npm:windmill-parser-wasm-csharp@*": "1.437.1", + "npm:windmill-parser-wasm-go@*": "1.429.0", + "npm:windmill-parser-wasm-php@*": "1.429.0", + "npm:windmill-parser-wasm-py@*": "1.477.1", + "npm:windmill-parser-wasm-regex@*": "1.439.0", + "npm:windmill-parser-wasm-rust@*": "1.429.0", + "npm:windmill-parser-wasm-ts@*": "1.438.2", + "npm:windmill-parser-wasm-yaml@*": "1.429.0", + "npm:ws@*": "8.18.0" + }, + "jsr": { + "@david/code-block-writer@13.0.2": { + "integrity": "14dd3baaafa3a2dea8bf7dfbcddeccaa13e583da2d21d666c01dc6d681cd74ad" }, - "jsr": { - "@david/code-block-writer@13.0.2": { - "integrity": "14dd3baaafa3a2dea8bf7dfbcddeccaa13e583da2d21d666c01dc6d681cd74ad" - }, - "@deno/cache-dir@0.10.3": { - "integrity": "eb022f84ecc49c91d9d98131c6e6b118ff63a29e343624d058646b9d50404776", - "dependencies": [ - "jsr:@std/fmt@^0.223", - "jsr:@std/fs@^0.223", - "jsr:@std/io@^0.223", - "jsr:@std/path@^0.223" - ] - }, - "@deno/dnt@0.41.3": { - "integrity": "b2ef2c8a5111eef86cb5bfcae103d6a2938e8e649e2461634a7befb7fc59d6d2", - "dependencies": [ - "jsr:@david/code-block-writer@^13.0.2", - "jsr:@deno/cache-dir@^0.10.3", - "jsr:@std/fmt@1", - "jsr:@std/fs@1", - "jsr:@std/path@1", - "jsr:@ts-morph/bootstrap@^0.24.0" - ] - }, - "@std/assert@0.223.0": { - "integrity": "eb8d6d879d76e1cc431205bd346ed4d88dc051c6366365b1af47034b0670be24" - }, - "@std/assert@0.226.0": { - "integrity": "0dfb5f7c7723c18cec118e080fec76ce15b4c31154b15ad2bd74822603ef75b3" - }, - "@std/assert@1.0.0-rc.2": { - "integrity": "0484eab1d76b55fca1c3beaff485a274e67dd3b9f065edcbe70030dfc0b964d3" - }, - "@std/bytes@0.223.0": { - "integrity": "84b75052cd8680942c397c2631318772b295019098f40aac5c36cead4cba51a8" - }, - "@std/bytes@1.0.2": { - "integrity": "fbdee322bbd8c599a6af186a1603b3355e59a5fb1baa139f8f4c3c9a1b3e3d57" - }, - "@std/cli@1.0.0-rc.2": { - "integrity": "97dfae82b9f0e189768ebfa7a5da53375955b94bad0a1804f8e3b73563b03787" - }, - "@std/encoding@1.0.0-rc.2": { - "integrity": "160d7674a20ebfbccdf610b3801fee91cf6e42d1c106dd46bbaf46e395cd35ef" - }, - "@std/encoding@1.0.4": { - "integrity": "2266cd516b32369e3dc5695717c96bf88343a1f761d6e6187a02a2bbe2af86ae" - }, - "@std/fmt@0.223.0": { - "integrity": "6deb37794127dfc7d7bded2586b9fc6f5d50e62a8134846608baf71ffc1a5208" - }, - "@std/fmt@0.225.6": { - "integrity": "aba6aea27f66813cecfd9484e074a9e9845782ab0685c030e453a8a70b37afc8" - }, - "@std/fmt@1.0.2": { - "integrity": "87e9dfcdd3ca7c066e0c3c657c1f987c82888eb8103a3a3baa62684ffeb0f7a7" - }, - "@std/fs@0.223.0": { - "integrity": "3b4b0550b2c524cbaaa5a9170c90e96cbb7354e837ad1bdaf15fc9df1ae9c31c" - }, - "@std/fs@0.229.3": { - "integrity": "783bca21f24da92e04c3893c9e79653227ab016c48e96b3078377ebd5222e6eb", - "dependencies": [ - "jsr:@std/path@1.0.0-rc.1" - ] - }, - "@std/fs@1.0.3": { - "integrity": "3cb839b1360b0a42d8b367c3093bfe4071798e6694fa44cf1963e04a8edba4fe", - "dependencies": [ - "jsr:@std/path@^1.0.4" - ] - }, - "@std/io@0.223.0": { - "integrity": "2d8c3c2ab3a515619b90da2c6ff5ea7b75a94383259ef4d02116b228393f84f1", - "dependencies": [ - "jsr:@std/assert@^0.223.0", - "jsr:@std/bytes@^0.223.0" - ] - }, - "@std/io@0.224.7": { - "integrity": "a70848793c44a7c100926571a8c9be68ba85487bfcd4d0540d86deabe1123dc9", - "dependencies": [ - "jsr:@std/bytes@^1.0.2" - ] - }, - "@std/log@0.224.7": { - "integrity": "021941e5cd16de60cb11599c9b36f892aea95987fe66c753922808da27909e18", - "dependencies": [ - "jsr:@std/fmt@^1.0.2", - "jsr:@std/fs@^1.0.3", - "jsr:@std/io@^0.224.7" - ] - }, - "@std/net@1.0.2": { - "integrity": "520c18ddb7f67d3830a1adfef03a155d496fe9683a9cb63bb823b5afb86484dc" - }, - "@std/path@0.223.0": { - "integrity": "593963402d7e6597f5a6e620931661053572c982fc014000459edc1f93cc3989", - "dependencies": [ - "jsr:@std/assert@^0.223.0" - ] - }, - "@std/path@0.225.2": { - "integrity": "0f2db41d36b50ef048dcb0399aac720a5348638dd3cb5bf80685bf2a745aa506", - "dependencies": [ - "jsr:@std/assert@^0.226.0" - ] - }, - "@std/path@1.0.0-rc.1": { - "integrity": "b8c00ae2f19106a6bb7cbf1ab9be52aa70de1605daeb2dbdc4f87a7cbaf10ff6" - }, - "@std/path@1.0.0-rc.2": { - "integrity": "39f20d37a44d1867abac8d91c169359ea6e942237a45a99ee1e091b32b921c7d" - }, - "@std/path@1.0.4": { - "integrity": "48dd5d8389bcfcd619338a01bdf862cb7799933390146a54ae59356a0acc7105" - }, - "@std/streams@1.0.4": { - "integrity": "a1a5b01c74ca1d2dcaacfe1d4bbb91392e765946d82a3471bd95539adc6da83a", - "dependencies": [ - "jsr:@std/bytes@^1.0.2" - ] - }, - "@std/text@1.0.0-rc.1": { - "integrity": "34c722203e87ee12792c8d4a0cd2ee0e001341cbce75b860fc21be19d62232b0" - }, - "@std/yaml@1.0.5": { - "integrity": "71ba3d334305ee2149391931508b2c293a8490f94a337eef3a09cade1a2a2742" - }, - "@ts-morph/bootstrap@0.24.0": { - "integrity": "a826a2ef7fa8a7c3f1042df2c034d20744d94da2ee32bf29275bcd4dffd3c060", - "dependencies": [ - "jsr:@ts-morph/common@^0.24.0" - ] - }, - "@ts-morph/common@0.24.0": { - "integrity": "12b625b8e562446ba658cdbe9ad77774b4bd96b992ae8bd34c60dbf24d06c1f3", - "dependencies": [ - "jsr:@std/fs@^0.229.3", - "jsr:@std/path@^0.225.2" - ] - }, - "@windmill-labs/cliffy-ansi@1.0.0-rc.5": { - "integrity": "1109cbcb0c415b57779352f708f5969b8c645f56bc555cbafc6ea5e0c6a360a4", - "dependencies": [ - "jsr:@std/encoding@1.0.0-rc.2", - "jsr:@std/fmt@~0.225.4", - "jsr:@std/io@~0.224.2", - "jsr:@windmill-labs/cliffy-internal@1.0.0-rc.5" - ] - }, - "@windmill-labs/cliffy-command@1.0.0-rc.5": { - "integrity": "3eaa9def5f5afa1028f4a60ee4d9065ccc5f194d032824365c6ebcb9f46db66e", - "dependencies": [ - "jsr:@std/fmt@~0.225.4", - "jsr:@std/text@1.0.0-rc.1", - "jsr:@windmill-labs/cliffy-flags@1.0.0-rc.5", - "jsr:@windmill-labs/cliffy-internal@1.0.0-rc.5", - "jsr:@windmill-labs/cliffy-table@1.0.0-rc.5" - ] - }, - "@windmill-labs/cliffy-flags@1.0.0-rc.5": { - "integrity": "0e4b5b53a02295f8bf27d93b3bcca5d5d001a0286aea17404e6ef6347f69363c", - "dependencies": [ - "jsr:@std/text@1.0.0-rc.1" - ] - }, - "@windmill-labs/cliffy-internal@1.0.0-rc.5": { - "integrity": "876b989ad2d1b739cc4a4f1386dbb80f819d2851ad583c1f486fc6ebe9beadf6" - }, - "@windmill-labs/cliffy-keycode@1.0.0-rc.5": { - "integrity": "2bc1b1af363528e38ed47bce525f417cab278b829a423353ffd589622f5a746e" - }, - "@windmill-labs/cliffy-prompt@1.0.0-rc.5": { - "integrity": "329a097911f219b15ea643ae83b6b360a11df7fc4cafdac1bf6869259475033a", - "dependencies": [ - "jsr:@std/assert@1.0.0-rc.2", - "jsr:@std/fmt@~0.225.4", - "jsr:@std/io@~0.224.2", - "jsr:@std/path@1.0.0-rc.2", - "jsr:@std/text@1.0.0-rc.1", - "jsr:@windmill-labs/cliffy-ansi@1.0.0-rc.5", - "jsr:@windmill-labs/cliffy-internal@1.0.0-rc.5", - "jsr:@windmill-labs/cliffy-keycode@1.0.0-rc.5" - ] - }, - "@windmill-labs/cliffy-prompt@1.0.0-rc.6": { - "integrity": "ffe09bee0e1e07bc12b2147be509d10b47eb6a36cbfea80fc206b4ae86693205", - "dependencies": [ - "jsr:@std/assert@1.0.0-rc.2", - "jsr:@std/fmt@~0.225.4", - "jsr:@std/io@~0.224.2", - "jsr:@std/path@1.0.0-rc.2", - "jsr:@std/text@1.0.0-rc.1", - "jsr:@windmill-labs/cliffy-ansi@1.0.0-rc.5", - "jsr:@windmill-labs/cliffy-internal@1.0.0-rc.5", - "jsr:@windmill-labs/cliffy-keycode@1.0.0-rc.5" - ] - }, - "@windmill-labs/cliffy-table@1.0.0-rc.5": { - "integrity": "5f26cb6ccbc2fbf1b1f79f9062d166e32e11d34398c0deac7e6f9d8378970546", - "dependencies": [ - "jsr:@std/cli@1.0.0-rc.2", - "jsr:@std/fmt@~0.225.4" - ] - } + "@deno/cache-dir@0.10.3": { + "integrity": "eb022f84ecc49c91d9d98131c6e6b118ff63a29e343624d058646b9d50404776", + "dependencies": [ + "jsr:@deno/graph", + "jsr:@std/fmt@0.223", + "jsr:@std/fs@0.223", + "jsr:@std/io@0.223", + "jsr:@std/path@0.223" + ] }, - "npm": { - "@ayonli/jsext@0.9.58": { - "integrity": "sha512-AwGf64K6VqGyYLFA6rgyuU6jBbwUNJctENpW1bZayvXcIprhdfs7cn7S+EXi0pnNLupT9ptODYkKneB3/YuWww==", - "dependencies": { - "iconv-lite": "iconv-lite@0.6.3", - "sudo-prompt": "sudo-prompt@9.2.1", - "ws": "ws@8.18.0" - } - }, - "@deno/shim-crypto@0.3.1": { - "integrity": "sha512-ed4pNnfur6UbASEgF34gVxR9p7Mc3qF+Ygbmjiil8ws5IhNFhPDFy5vE5hQAUA9JmVsSxXPcVLM5Rf8LOZqQ5Q==", - "dependencies": {} - }, - "@deno/shim-deno-test@0.5.0": { - "integrity": "sha512-4nMhecpGlPi0cSzT67L+Tm+GOJqvuk8gqHBziqcUQOarnuIax1z96/gJHCSIz2Z0zhxE6Rzwb3IZXPtFh51j+w==", - "dependencies": {} - }, - "@deno/shim-deno@0.17.0": { - "integrity": "sha512-+FzsP65eehAgTQdzt1izLEV17ePCZqHxDQqRDbpRc1yJVYtDI2MvbRq5DvOj90uRt6zKn9qtWpEueDqG1QORhQ==", - "dependencies": { - "@deno/shim-deno-test": "@deno/shim-deno-test@0.5.0", - "which": "which@4.0.0" - } - }, - "@esbuild/aix-ppc64@0.23.0": { - "integrity": "sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==", - "dependencies": {} - }, - "@esbuild/android-arm64@0.23.0": { - "integrity": "sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==", - "dependencies": {} - }, - "@esbuild/android-arm@0.23.0": { - "integrity": "sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==", - "dependencies": {} - }, - "@esbuild/android-x64@0.23.0": { - "integrity": "sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==", - "dependencies": {} - }, - "@esbuild/darwin-arm64@0.23.0": { - "integrity": "sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==", - "dependencies": {} - }, - "@esbuild/darwin-x64@0.23.0": { - "integrity": "sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==", - "dependencies": {} - }, - "@esbuild/freebsd-arm64@0.23.0": { - "integrity": "sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==", - "dependencies": {} - }, - "@esbuild/freebsd-x64@0.23.0": { - "integrity": "sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==", - "dependencies": {} - }, - "@esbuild/linux-arm64@0.23.0": { - "integrity": "sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==", - "dependencies": {} - }, - "@esbuild/linux-arm@0.23.0": { - "integrity": "sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==", - "dependencies": {} - }, - "@esbuild/linux-ia32@0.23.0": { - "integrity": "sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==", - "dependencies": {} - }, - "@esbuild/linux-loong64@0.23.0": { - "integrity": "sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==", - "dependencies": {} - }, - "@esbuild/linux-mips64el@0.23.0": { - "integrity": "sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==", - "dependencies": {} - }, - "@esbuild/linux-ppc64@0.23.0": { - "integrity": "sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==", - "dependencies": {} - }, - "@esbuild/linux-riscv64@0.23.0": { - "integrity": "sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==", - "dependencies": {} - }, - "@esbuild/linux-s390x@0.23.0": { - "integrity": "sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==", - "dependencies": {} - }, - "@esbuild/linux-x64@0.23.0": { - "integrity": "sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==", - "dependencies": {} - }, - "@esbuild/netbsd-x64@0.23.0": { - "integrity": "sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==", - "dependencies": {} - }, - "@esbuild/openbsd-arm64@0.23.0": { - "integrity": "sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==", - "dependencies": {} - }, - "@esbuild/openbsd-x64@0.23.0": { - "integrity": "sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==", - "dependencies": {} - }, - "@esbuild/sunos-x64@0.23.0": { - "integrity": "sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==", - "dependencies": {} - }, - "@esbuild/win32-arm64@0.23.0": { - "integrity": "sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==", - "dependencies": {} - }, - "@esbuild/win32-ia32@0.23.0": { - "integrity": "sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==", - "dependencies": {} - }, - "@esbuild/win32-x64@0.23.0": { - "integrity": "sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==", - "dependencies": {} - }, - "@eslint-community/eslint-utils@4.4.0_eslint@8.57.1": { - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dependencies": { - "eslint": "eslint@8.57.1", - "eslint-visitor-keys": "eslint-visitor-keys@3.4.3" - } - }, - "@eslint-community/eslint-utils@4.4.0_eslint@9.10.0": { - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dependencies": { - "eslint": "eslint@9.10.0", - "eslint-visitor-keys": "eslint-visitor-keys@3.4.3" - } - }, - "@eslint-community/regexpp@4.11.1": { - "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", - "dependencies": {} - }, - "@eslint/config-array@0.18.0": { - "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", - "dependencies": { - "@eslint/object-schema": "@eslint/object-schema@2.1.4", - "debug": "debug@4.3.7", - "minimatch": "minimatch@3.1.2" - } - }, - "@eslint/eslintrc@2.1.4": { - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dependencies": { - "ajv": "ajv@6.12.6", - "debug": "debug@4.3.7", - "espree": "espree@9.6.1_acorn@8.12.1", - "globals": "globals@13.24.0", - "ignore": "ignore@5.3.2", - "import-fresh": "import-fresh@3.3.0", - "js-yaml": "js-yaml@4.1.0", - "minimatch": "minimatch@3.1.2", - "strip-json-comments": "strip-json-comments@3.1.1" - } - }, - "@eslint/eslintrc@3.1.0": { - "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", - "dependencies": { - "ajv": "ajv@6.12.6", - "debug": "debug@4.3.7", - "espree": "espree@10.1.0_acorn@8.12.1", - "globals": "globals@14.0.0", - "ignore": "ignore@5.3.2", - "import-fresh": "import-fresh@3.3.0", - "js-yaml": "js-yaml@4.1.0", - "minimatch": "minimatch@3.1.2", - "strip-json-comments": "strip-json-comments@3.1.1" - } - }, - "@eslint/js@8.57.1": { - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", - "dependencies": {} - }, - "@eslint/js@9.10.0": { - "integrity": "sha512-fuXtbiP5GWIn8Fz+LWoOMVf/Jxm+aajZYkhi6CuEm4SxymFM+eUWzbO9qXT+L0iCkL5+KGYMCSGxo686H19S1g==", - "dependencies": {} - }, - "@eslint/object-schema@2.1.4": { - "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", - "dependencies": {} - }, - "@eslint/plugin-kit@0.1.0": { - "integrity": "sha512-autAXT203ixhqei9xt+qkYOvY8l6LAFIdT2UXc/RPNeUVfqRF1BV94GTJyVPFKT8nFM6MyVJhjLj9E8JWvf5zQ==", - "dependencies": { - "levn": "levn@0.4.1" - } - }, - "@fastify/busboy@2.1.1": { - "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", - "dependencies": {} - }, - "@humanwhocodes/config-array@0.13.0": { - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "dependencies": { - "@humanwhocodes/object-schema": "@humanwhocodes/object-schema@2.0.3", - "debug": "debug@4.3.7", - "minimatch": "minimatch@3.1.2" - } - }, - "@humanwhocodes/module-importer@1.0.1": { - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dependencies": {} - }, - "@humanwhocodes/object-schema@2.0.3": { - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "dependencies": {} - }, - "@humanwhocodes/retry@0.3.0": { - "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==", - "dependencies": {} - }, - "@nodelib/fs.scandir@2.1.5": { - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dependencies": { - "@nodelib/fs.stat": "@nodelib/fs.stat@2.0.5", - "run-parallel": "run-parallel@1.2.0" - } - }, - "@nodelib/fs.stat@2.0.5": { - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dependencies": {} - }, - "@nodelib/fs.walk@1.2.8": { - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dependencies": { - "@nodelib/fs.scandir": "@nodelib/fs.scandir@2.1.5", - "fastq": "fastq@1.17.1" - } - }, - "@oakserver/oak@12.6.2": { - "integrity": "sha512-q9LfyC9tWV68me0GEUuA66qbwH8ep0bBdq9V02fePlPmPVUBCAzQQkomyaI/L4Uur+YALVXgLoTaC2rviZ7I4w==", - "dependencies": { - "@deno/shim-crypto": "@deno/shim-crypto@0.3.1", - "@deno/shim-deno": "@deno/shim-deno@0.17.0", - "tslib": "tslib@2.3.1", - "undici": "undici@5.28.4" - } - }, - "@rtsao/scc@1.1.0": { - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", - "dependencies": {} - }, - "@types/diff@5.2.2": { - "integrity": "sha512-qVqLpd49rmJA2nZzLVsmfS/aiiBpfVE95dHhPVwG0NmSBAt+riPxnj53wq2oBq5m4Q2RF1IWFEUpnZTgrQZfEQ==", - "dependencies": {} - }, - "@types/json5@0.0.29": { - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dependencies": {} - }, - "@types/node@18.16.19": { - "integrity": "sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA==", - "dependencies": {} - }, - "@ungap/structured-clone@1.2.0": { - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dependencies": {} - }, - "accepts@1.3.8": { - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "mime-types@2.1.35", - "negotiator": "negotiator@0.6.3" - } - }, - "acorn-jsx@5.3.2_acorn@8.12.1": { - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dependencies": { - "acorn": "acorn@8.12.1" - } - }, - "acorn@8.12.1": { - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", - "dependencies": {} - }, - "ajv@6.12.6": { - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "fast-deep-equal@3.1.3", - "fast-json-stable-stringify": "fast-json-stable-stringify@2.1.0", - "json-schema-traverse": "json-schema-traverse@0.4.1", - "uri-js": "uri-js@4.4.1" - } - }, - "ansi-regex@5.0.1": { - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dependencies": {} - }, - "ansi-styles@4.3.0": { - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "color-convert@2.0.1" - } - }, - "argparse@2.0.1": { - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dependencies": {} - }, - "array-buffer-byte-length@1.0.1": { - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", - "dependencies": { - "call-bind": "call-bind@1.0.7", - "is-array-buffer": "is-array-buffer@3.0.4" - } - }, - "array-flatten@1.1.1": { - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dependencies": {} - }, - "array-includes@3.1.8": { - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", - "dependencies": { - "call-bind": "call-bind@1.0.7", - "define-properties": "define-properties@1.2.1", - "es-abstract": "es-abstract@1.23.3", - "es-object-atoms": "es-object-atoms@1.0.0", - "get-intrinsic": "get-intrinsic@1.2.4", - "is-string": "is-string@1.0.7" - } - }, - "array.prototype.findlastindex@1.2.5": { - "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", - "dependencies": { - "call-bind": "call-bind@1.0.7", - "define-properties": "define-properties@1.2.1", - "es-abstract": "es-abstract@1.23.3", - "es-errors": "es-errors@1.3.0", - "es-object-atoms": "es-object-atoms@1.0.0", - "es-shim-unscopables": "es-shim-unscopables@1.0.2" - } - }, - "array.prototype.flat@1.3.2": { - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dependencies": { - "call-bind": "call-bind@1.0.7", - "define-properties": "define-properties@1.2.1", - "es-abstract": "es-abstract@1.23.3", - "es-shim-unscopables": "es-shim-unscopables@1.0.2" - } - }, - "array.prototype.flatmap@1.3.2": { - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dependencies": { - "call-bind": "call-bind@1.0.7", - "define-properties": "define-properties@1.2.1", - "es-abstract": "es-abstract@1.23.3", - "es-shim-unscopables": "es-shim-unscopables@1.0.2" - } - }, - "arraybuffer.prototype.slice@1.0.3": { - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", - "dependencies": { - "array-buffer-byte-length": "array-buffer-byte-length@1.0.1", - "call-bind": "call-bind@1.0.7", - "define-properties": "define-properties@1.2.1", - "es-abstract": "es-abstract@1.23.3", - "es-errors": "es-errors@1.3.0", - "get-intrinsic": "get-intrinsic@1.2.4", - "is-array-buffer": "is-array-buffer@3.0.4", - "is-shared-array-buffer": "is-shared-array-buffer@1.0.3" - } - }, - "available-typed-arrays@1.0.7": { - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dependencies": { - "possible-typed-array-names": "possible-typed-array-names@1.0.0" - } - }, - "balanced-match@1.0.2": { - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dependencies": {} - }, - "body-parser@1.20.2": { - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", - "dependencies": { - "bytes": "bytes@3.1.2", - "content-type": "content-type@1.0.5", - "debug": "debug@2.6.9", - "depd": "depd@2.0.0", - "destroy": "destroy@1.2.0", - "http-errors": "http-errors@2.0.0", - "iconv-lite": "iconv-lite@0.4.24", - "on-finished": "on-finished@2.4.1", - "qs": "qs@6.11.0", - "raw-body": "raw-body@2.5.2", - "type-is": "type-is@1.6.18", - "unpipe": "unpipe@1.0.0" - } - }, - "brace-expansion@1.1.11": { - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "balanced-match@1.0.2", - "concat-map": "concat-map@0.0.1" - } - }, - "brace-expansion@2.0.1": { - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "balanced-match@1.0.2" - } - }, - "bundle-name@4.1.0": { - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", - "dependencies": { - "run-applescript": "run-applescript@7.0.0" - } - }, - "bytes@3.1.2": { - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dependencies": {} - }, - "call-bind@1.0.7": { - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dependencies": { - "es-define-property": "es-define-property@1.0.0", - "es-errors": "es-errors@1.3.0", - "function-bind": "function-bind@1.1.2", - "get-intrinsic": "get-intrinsic@1.2.4", - "set-function-length": "set-function-length@1.2.2" - } - }, - "callsites@3.1.0": { - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dependencies": {} - }, - "chalk@4.1.2": { - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "ansi-styles@4.3.0", - "supports-color": "supports-color@7.2.0" - } - }, - "color-convert@2.0.1": { - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "color-name@1.1.4" - } - }, - "color-name@1.1.4": { - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dependencies": {} - }, - "concat-map@0.0.1": { - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dependencies": {} - }, - "content-disposition@0.5.4": { - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "safe-buffer@5.2.1" - } - }, - "content-type@1.0.5": { - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dependencies": {} - }, - "cookie-signature@1.0.6": { - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dependencies": {} - }, - "cookie@0.6.0": { - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "dependencies": {} - }, - "core-util-is@1.0.3": { - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dependencies": {} - }, - "cross-spawn@7.0.3": { - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dependencies": { - "path-key": "path-key@3.1.1", - "shebang-command": "shebang-command@2.0.0", - "which": "which@2.0.2" - } - }, - "data-view-buffer@1.0.1": { - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", - "dependencies": { - "call-bind": "call-bind@1.0.7", - "es-errors": "es-errors@1.3.0", - "is-data-view": "is-data-view@1.0.1" - } - }, - "data-view-byte-length@1.0.1": { - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", - "dependencies": { - "call-bind": "call-bind@1.0.7", - "es-errors": "es-errors@1.3.0", - "is-data-view": "is-data-view@1.0.1" - } - }, - "data-view-byte-offset@1.0.0": { - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", - "dependencies": { - "call-bind": "call-bind@1.0.7", - "es-errors": "es-errors@1.3.0", - "is-data-view": "is-data-view@1.0.1" - } - }, - "debug@2.6.9": { - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "ms@2.0.0" - } - }, - "debug@3.2.7": { - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "ms@2.1.3" - } - }, - "debug@4.3.7": { - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dependencies": { - "ms": "ms@2.1.3" - } - }, - "deep-is@0.1.4": { - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dependencies": {} - }, - "default-browser-id@5.0.0": { - "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", - "dependencies": {} - }, - "default-browser@5.2.1": { - "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", - "dependencies": { - "bundle-name": "bundle-name@4.1.0", - "default-browser-id": "default-browser-id@5.0.0" - } - }, - "define-data-property@1.1.4": { - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dependencies": { - "es-define-property": "es-define-property@1.0.0", - "es-errors": "es-errors@1.3.0", - "gopd": "gopd@1.0.1" - } - }, - "define-lazy-prop@3.0.0": { - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "dependencies": {} - }, - "define-properties@1.2.1": { - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dependencies": { - "define-data-property": "define-data-property@1.1.4", - "has-property-descriptors": "has-property-descriptors@1.0.2", - "object-keys": "object-keys@1.1.1" - } - }, - "depd@2.0.0": { - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dependencies": {} - }, - "destroy@1.2.0": { - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dependencies": {} - }, - "diff@5.2.0": { - "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", - "dependencies": {} - }, - "doctrine@2.1.0": { - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dependencies": { - "esutils": "esutils@2.0.3" - } - }, - "doctrine@3.0.0": { - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dependencies": { - "esutils": "esutils@2.0.3" - } - }, - "ee-first@1.1.1": { - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dependencies": {} - }, - "encodeurl@1.0.2": { - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dependencies": {} - }, - "es-abstract@1.23.3": { - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", - "dependencies": { - "array-buffer-byte-length": "array-buffer-byte-length@1.0.1", - "arraybuffer.prototype.slice": "arraybuffer.prototype.slice@1.0.3", - "available-typed-arrays": "available-typed-arrays@1.0.7", - "call-bind": "call-bind@1.0.7", - "data-view-buffer": "data-view-buffer@1.0.1", - "data-view-byte-length": "data-view-byte-length@1.0.1", - "data-view-byte-offset": "data-view-byte-offset@1.0.0", - "es-define-property": "es-define-property@1.0.0", - "es-errors": "es-errors@1.3.0", - "es-object-atoms": "es-object-atoms@1.0.0", - "es-set-tostringtag": "es-set-tostringtag@2.0.3", - "es-to-primitive": "es-to-primitive@1.2.1", - "function.prototype.name": "function.prototype.name@1.1.6", - "get-intrinsic": "get-intrinsic@1.2.4", - "get-symbol-description": "get-symbol-description@1.0.2", - "globalthis": "globalthis@1.0.4", - "gopd": "gopd@1.0.1", - "has-property-descriptors": "has-property-descriptors@1.0.2", - "has-proto": "has-proto@1.0.3", - "has-symbols": "has-symbols@1.0.3", - "hasown": "hasown@2.0.2", - "internal-slot": "internal-slot@1.0.7", - "is-array-buffer": "is-array-buffer@3.0.4", - "is-callable": "is-callable@1.2.7", - "is-data-view": "is-data-view@1.0.1", - "is-negative-zero": "is-negative-zero@2.0.3", - "is-regex": "is-regex@1.1.4", - "is-shared-array-buffer": "is-shared-array-buffer@1.0.3", - "is-string": "is-string@1.0.7", - "is-typed-array": "is-typed-array@1.1.13", - "is-weakref": "is-weakref@1.0.2", - "object-inspect": "object-inspect@1.13.2", - "object-keys": "object-keys@1.1.1", - "object.assign": "object.assign@4.1.5", - "regexp.prototype.flags": "regexp.prototype.flags@1.5.2", - "safe-array-concat": "safe-array-concat@1.1.2", - "safe-regex-test": "safe-regex-test@1.0.3", - "string.prototype.trim": "string.prototype.trim@1.2.9", - "string.prototype.trimend": "string.prototype.trimend@1.0.8", - "string.prototype.trimstart": "string.prototype.trimstart@1.0.8", - "typed-array-buffer": "typed-array-buffer@1.0.2", - "typed-array-byte-length": "typed-array-byte-length@1.0.1", - "typed-array-byte-offset": "typed-array-byte-offset@1.0.2", - "typed-array-length": "typed-array-length@1.0.6", - "unbox-primitive": "unbox-primitive@1.0.2", - "which-typed-array": "which-typed-array@1.1.15" - } - }, - "es-define-property@1.0.0": { - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dependencies": { - "get-intrinsic": "get-intrinsic@1.2.4" - } - }, - "es-errors@1.3.0": { - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dependencies": {} - }, - "es-main@1.3.0": { - "integrity": "sha512-AzORKdz1Zt97TzbYQnIrI3ZiibWpRXUfpo/w0xOJ20GpNYd2bd3MU9m31zS/aJ1TJl6JfLTok83Y8HjNunYT0A==", - "dependencies": {} - }, - "es-object-atoms@1.0.0": { - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", - "dependencies": { - "es-errors": "es-errors@1.3.0" - } - }, - "es-set-tostringtag@2.0.3": { - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "dependencies": { - "get-intrinsic": "get-intrinsic@1.2.4", - "has-tostringtag": "has-tostringtag@1.0.2", - "hasown": "hasown@2.0.2" - } - }, - "es-shim-unscopables@1.0.2": { - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dependencies": { - "hasown": "hasown@2.0.2" - } - }, - "es-to-primitive@1.2.1": { - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dependencies": { - "is-callable": "is-callable@1.2.7", - "is-date-object": "is-date-object@1.0.5", - "is-symbol": "is-symbol@1.0.4" - } - }, - "esbuild@0.23.0": { - "integrity": "sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==", - "dependencies": { - "@esbuild/aix-ppc64": "@esbuild/aix-ppc64@0.23.0", - "@esbuild/android-arm": "@esbuild/android-arm@0.23.0", - "@esbuild/android-arm64": "@esbuild/android-arm64@0.23.0", - "@esbuild/android-x64": "@esbuild/android-x64@0.23.0", - "@esbuild/darwin-arm64": "@esbuild/darwin-arm64@0.23.0", - "@esbuild/darwin-x64": "@esbuild/darwin-x64@0.23.0", - "@esbuild/freebsd-arm64": "@esbuild/freebsd-arm64@0.23.0", - "@esbuild/freebsd-x64": "@esbuild/freebsd-x64@0.23.0", - "@esbuild/linux-arm": "@esbuild/linux-arm@0.23.0", - "@esbuild/linux-arm64": "@esbuild/linux-arm64@0.23.0", - "@esbuild/linux-ia32": "@esbuild/linux-ia32@0.23.0", - "@esbuild/linux-loong64": "@esbuild/linux-loong64@0.23.0", - "@esbuild/linux-mips64el": "@esbuild/linux-mips64el@0.23.0", - "@esbuild/linux-ppc64": "@esbuild/linux-ppc64@0.23.0", - "@esbuild/linux-riscv64": "@esbuild/linux-riscv64@0.23.0", - "@esbuild/linux-s390x": "@esbuild/linux-s390x@0.23.0", - "@esbuild/linux-x64": "@esbuild/linux-x64@0.23.0", - "@esbuild/netbsd-x64": "@esbuild/netbsd-x64@0.23.0", - "@esbuild/openbsd-arm64": "@esbuild/openbsd-arm64@0.23.0", - "@esbuild/openbsd-x64": "@esbuild/openbsd-x64@0.23.0", - "@esbuild/sunos-x64": "@esbuild/sunos-x64@0.23.0", - "@esbuild/win32-arm64": "@esbuild/win32-arm64@0.23.0", - "@esbuild/win32-ia32": "@esbuild/win32-ia32@0.23.0", - "@esbuild/win32-x64": "@esbuild/win32-x64@0.23.0" - } - }, - "escape-html@1.0.3": { - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dependencies": {} - }, - "escape-string-regexp@4.0.0": { - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dependencies": {} - }, - "eslint-import-resolver-node@0.3.9": { - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dependencies": { - "debug": "debug@3.2.7", - "is-core-module": "is-core-module@2.15.1", - "resolve": "resolve@1.22.8" - } - }, - "eslint-module-utils@2.11.0": { - "integrity": "sha512-gbBE5Hitek/oG6MUVj6sFuzEjA/ClzNflVrLovHi/JgLdC7fiN5gLAY1WIPW1a0V5I999MnsrvVrCOGmmVqDBQ==", - "dependencies": { - "debug": "debug@3.2.7" - } - }, - "eslint-plugin-import@2.30.0_eslint@8.57.1": { - "integrity": "sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw==", - "dependencies": { - "@rtsao/scc": "@rtsao/scc@1.1.0", - "array-includes": "array-includes@3.1.8", - "array.prototype.findlastindex": "array.prototype.findlastindex@1.2.5", - "array.prototype.flat": "array.prototype.flat@1.3.2", - "array.prototype.flatmap": "array.prototype.flatmap@1.3.2", - "debug": "debug@3.2.7", - "doctrine": "doctrine@2.1.0", - "eslint": "eslint@8.57.1", - "eslint-import-resolver-node": "eslint-import-resolver-node@0.3.9", - "eslint-module-utils": "eslint-module-utils@2.11.0", - "hasown": "hasown@2.0.2", - "is-core-module": "is-core-module@2.15.1", - "is-glob": "is-glob@4.0.3", - "minimatch": "minimatch@3.1.2", - "object.fromentries": "object.fromentries@2.0.8", - "object.groupby": "object.groupby@1.0.3", - "object.values": "object.values@1.2.0", - "semver": "semver@6.3.1", - "tsconfig-paths": "tsconfig-paths@3.15.0" - } - }, - "eslint-scope@7.2.2": { - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dependencies": { - "esrecurse": "esrecurse@4.3.0", - "estraverse": "estraverse@5.3.0" - } - }, - "eslint-scope@8.0.2": { - "integrity": "sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==", - "dependencies": { - "esrecurse": "esrecurse@4.3.0", - "estraverse": "estraverse@5.3.0" - } - }, - "eslint-visitor-keys@3.4.3": { - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dependencies": {} - }, - "eslint-visitor-keys@4.0.0": { - "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", - "dependencies": {} - }, - "eslint@8.57.1": { - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "dependencies": { - "@eslint-community/eslint-utils": "@eslint-community/eslint-utils@4.4.0_eslint@8.57.1", - "@eslint-community/regexpp": "@eslint-community/regexpp@4.11.1", - "@eslint/eslintrc": "@eslint/eslintrc@2.1.4", - "@eslint/js": "@eslint/js@8.57.1", - "@humanwhocodes/config-array": "@humanwhocodes/config-array@0.13.0", - "@humanwhocodes/module-importer": "@humanwhocodes/module-importer@1.0.1", - "@nodelib/fs.walk": "@nodelib/fs.walk@1.2.8", - "@ungap/structured-clone": "@ungap/structured-clone@1.2.0", - "ajv": "ajv@6.12.6", - "chalk": "chalk@4.1.2", - "cross-spawn": "cross-spawn@7.0.3", - "debug": "debug@4.3.7", - "doctrine": "doctrine@3.0.0", - "escape-string-regexp": "escape-string-regexp@4.0.0", - "eslint-scope": "eslint-scope@7.2.2", - "eslint-visitor-keys": "eslint-visitor-keys@3.4.3", - "espree": "espree@9.6.1_acorn@8.12.1", - "esquery": "esquery@1.6.0", - "esutils": "esutils@2.0.3", - "fast-deep-equal": "fast-deep-equal@3.1.3", - "file-entry-cache": "file-entry-cache@6.0.1", - "find-up": "find-up@5.0.0", - "glob-parent": "glob-parent@6.0.2", - "globals": "globals@13.24.0", - "graphemer": "graphemer@1.4.0", - "ignore": "ignore@5.3.2", - "imurmurhash": "imurmurhash@0.1.4", - "is-glob": "is-glob@4.0.3", - "is-path-inside": "is-path-inside@3.0.3", - "js-yaml": "js-yaml@4.1.0", - "json-stable-stringify-without-jsonify": "json-stable-stringify-without-jsonify@1.0.1", - "levn": "levn@0.4.1", - "lodash.merge": "lodash.merge@4.6.2", - "minimatch": "minimatch@3.1.2", - "natural-compare": "natural-compare@1.4.0", - "optionator": "optionator@0.9.4", - "strip-ansi": "strip-ansi@6.0.1", - "text-table": "text-table@0.2.0" - } - }, - "eslint@9.10.0": { - "integrity": "sha512-Y4D0IgtBZfOcOUAIQTSXBKoNGfY0REGqHJG6+Q81vNippW5YlKjHFj4soMxamKK1NXHUWuBZTLdU3Km+L/pcHw==", - "dependencies": { - "@eslint-community/eslint-utils": "@eslint-community/eslint-utils@4.4.0_eslint@9.10.0", - "@eslint-community/regexpp": "@eslint-community/regexpp@4.11.1", - "@eslint/config-array": "@eslint/config-array@0.18.0", - "@eslint/eslintrc": "@eslint/eslintrc@3.1.0", - "@eslint/js": "@eslint/js@9.10.0", - "@eslint/plugin-kit": "@eslint/plugin-kit@0.1.0", - "@humanwhocodes/module-importer": "@humanwhocodes/module-importer@1.0.1", - "@humanwhocodes/retry": "@humanwhocodes/retry@0.3.0", - "@nodelib/fs.walk": "@nodelib/fs.walk@1.2.8", - "ajv": "ajv@6.12.6", - "chalk": "chalk@4.1.2", - "cross-spawn": "cross-spawn@7.0.3", - "debug": "debug@4.3.7", - "escape-string-regexp": "escape-string-regexp@4.0.0", - "eslint-scope": "eslint-scope@8.0.2", - "eslint-visitor-keys": "eslint-visitor-keys@4.0.0", - "espree": "espree@10.1.0_acorn@8.12.1", - "esquery": "esquery@1.6.0", - "esutils": "esutils@2.0.3", - "fast-deep-equal": "fast-deep-equal@3.1.3", - "file-entry-cache": "file-entry-cache@8.0.0", - "find-up": "find-up@5.0.0", - "glob-parent": "glob-parent@6.0.2", - "ignore": "ignore@5.3.2", - "imurmurhash": "imurmurhash@0.1.4", - "is-glob": "is-glob@4.0.3", - "is-path-inside": "is-path-inside@3.0.3", - "json-stable-stringify-without-jsonify": "json-stable-stringify-without-jsonify@1.0.1", - "lodash.merge": "lodash.merge@4.6.2", - "minimatch": "minimatch@3.1.2", - "natural-compare": "natural-compare@1.4.0", - "optionator": "optionator@0.9.4", - "strip-ansi": "strip-ansi@6.0.1", - "text-table": "text-table@0.2.0" - } - }, - "espree@10.1.0_acorn@8.12.1": { - "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==", - "dependencies": { - "acorn": "acorn@8.12.1", - "acorn-jsx": "acorn-jsx@5.3.2_acorn@8.12.1", - "eslint-visitor-keys": "eslint-visitor-keys@4.0.0" - } - }, - "espree@9.6.1_acorn@8.12.1": { - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dependencies": { - "acorn": "acorn@8.12.1", - "acorn-jsx": "acorn-jsx@5.3.2_acorn@8.12.1", - "eslint-visitor-keys": "eslint-visitor-keys@3.4.3" - } - }, - "esquery@1.6.0": { - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dependencies": { - "estraverse": "estraverse@5.3.0" - } - }, - "esrecurse@4.3.0": { - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dependencies": { - "estraverse": "estraverse@5.3.0" - } - }, - "estraverse@5.3.0": { - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dependencies": {} - }, - "esutils@2.0.3": { - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dependencies": {} - }, - "etag@1.8.1": { - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dependencies": {} - }, - "express@4.19.2": { - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", - "dependencies": { - "accepts": "accepts@1.3.8", - "array-flatten": "array-flatten@1.1.1", - "body-parser": "body-parser@1.20.2", - "content-disposition": "content-disposition@0.5.4", - "content-type": "content-type@1.0.5", - "cookie": "cookie@0.6.0", - "cookie-signature": "cookie-signature@1.0.6", - "debug": "debug@2.6.9", - "depd": "depd@2.0.0", - "encodeurl": "encodeurl@1.0.2", - "escape-html": "escape-html@1.0.3", - "etag": "etag@1.8.1", - "finalhandler": "finalhandler@1.2.0", - "fresh": "fresh@0.5.2", - "http-errors": "http-errors@2.0.0", - "merge-descriptors": "merge-descriptors@1.0.1", - "methods": "methods@1.1.2", - "on-finished": "on-finished@2.4.1", - "parseurl": "parseurl@1.3.3", - "path-to-regexp": "path-to-regexp@0.1.7", - "proxy-addr": "proxy-addr@2.0.7", - "qs": "qs@6.11.0", - "range-parser": "range-parser@1.2.1", - "safe-buffer": "safe-buffer@5.2.1", - "send": "send@0.18.0", - "serve-static": "serve-static@1.15.0", - "setprototypeof": "setprototypeof@1.2.0", - "statuses": "statuses@2.0.1", - "type-is": "type-is@1.6.18", - "utils-merge": "utils-merge@1.0.1", - "vary": "vary@1.1.2" - } - }, - "fast-deep-equal@3.1.3": { - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dependencies": {} - }, - "fast-json-stable-stringify@2.1.0": { - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dependencies": {} - }, - "fast-levenshtein@2.0.6": { - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dependencies": {} - }, - "fastq@1.17.1": { - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dependencies": { - "reusify": "reusify@1.0.4" - } - }, - "file-entry-cache@6.0.1": { - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dependencies": { - "flat-cache": "flat-cache@3.2.0" - } - }, - "file-entry-cache@8.0.0": { - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dependencies": { - "flat-cache": "flat-cache@4.0.1" - } - }, - "finalhandler@1.2.0": { - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dependencies": { - "debug": "debug@2.6.9", - "encodeurl": "encodeurl@1.0.2", - "escape-html": "escape-html@1.0.3", - "on-finished": "on-finished@2.4.1", - "parseurl": "parseurl@1.3.3", - "statuses": "statuses@2.0.1", - "unpipe": "unpipe@1.0.0" - } - }, - "find-up@5.0.0": { - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dependencies": { - "locate-path": "locate-path@6.0.0", - "path-exists": "path-exists@4.0.0" - } - }, - "flat-cache@3.2.0": { - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dependencies": { - "flatted": "flatted@3.3.1", - "keyv": "keyv@4.5.4", - "rimraf": "rimraf@3.0.2" - } - }, - "flat-cache@4.0.1": { - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dependencies": { - "flatted": "flatted@3.3.1", - "keyv": "keyv@4.5.4" - } - }, - "flatted@3.3.1": { - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dependencies": {} - }, - "for-each@0.3.3": { - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dependencies": { - "is-callable": "is-callable@1.2.7" - } - }, - "forwarded@0.2.0": { - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dependencies": {} - }, - "fresh@0.5.2": { - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dependencies": {} - }, - "fs.realpath@1.0.0": { - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dependencies": {} - }, - "function-bind@1.1.2": { - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dependencies": {} - }, - "function.prototype.name@1.1.6": { - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dependencies": { - "call-bind": "call-bind@1.0.7", - "define-properties": "define-properties@1.2.1", - "es-abstract": "es-abstract@1.23.3", - "functions-have-names": "functions-have-names@1.2.3" - } - }, - "functions-have-names@1.2.3": { - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dependencies": {} - }, - "get-intrinsic@1.2.4": { - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dependencies": { - "es-errors": "es-errors@1.3.0", - "function-bind": "function-bind@1.1.2", - "has-proto": "has-proto@1.0.3", - "has-symbols": "has-symbols@1.0.3", - "hasown": "hasown@2.0.2" - } - }, - "get-port@7.1.0": { - "integrity": "sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==", - "dependencies": {} - }, - "get-symbol-description@1.0.2": { - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", - "dependencies": { - "call-bind": "call-bind@1.0.7", - "es-errors": "es-errors@1.3.0", - "get-intrinsic": "get-intrinsic@1.2.4" - } - }, - "gitignore-parser@0.0.2": { - "integrity": "sha512-X6mpqUv59uWLGD4n3hZ8Cu8KbF2PMWPSFYmxZjdkpm3yOU7hSUYnzTkZI1mcWqchphvqyuz3/BhgBR4E/JtkCg==", - "dependencies": {} - }, - "glob-parent@6.0.2": { - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dependencies": { - "is-glob": "is-glob@4.0.3" - } - }, - "glob@7.2.3": { - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dependencies": { - "fs.realpath": "fs.realpath@1.0.0", - "inflight": "inflight@1.0.6", - "inherits": "inherits@2.0.4", - "minimatch": "minimatch@3.1.2", - "once": "once@1.4.0", - "path-is-absolute": "path-is-absolute@1.0.1" - } - }, - "globals@13.24.0": { - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dependencies": { - "type-fest": "type-fest@0.20.2" - } - }, - "globals@14.0.0": { - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dependencies": {} - }, - "globalthis@1.0.4": { - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dependencies": { - "define-properties": "define-properties@1.2.1", - "gopd": "gopd@1.0.1" - } - }, - "gopd@1.0.1": { - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "get-intrinsic@1.2.4" - } - }, - "graphemer@1.4.0": { - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dependencies": {} - }, - "has-bigints@1.0.2": { - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dependencies": {} - }, - "has-flag@4.0.0": { - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dependencies": {} - }, - "has-property-descriptors@1.0.2": { - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dependencies": { - "es-define-property": "es-define-property@1.0.0" - } - }, - "has-proto@1.0.3": { - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "dependencies": {} - }, - "has-symbols@1.0.3": { - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dependencies": {} - }, - "has-tostringtag@1.0.2": { - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dependencies": { - "has-symbols": "has-symbols@1.0.3" - } - }, - "hasown@2.0.2": { - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dependencies": { - "function-bind": "function-bind@1.1.2" - } - }, - "http-errors@2.0.0": { - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "depd@2.0.0", - "inherits": "inherits@2.0.4", - "setprototypeof": "setprototypeof@1.2.0", - "statuses": "statuses@2.0.1", - "toidentifier": "toidentifier@1.0.1" - } - }, - "iconv-lite@0.4.24": { - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": "safer-buffer@2.1.2" - } - }, - "iconv-lite@0.6.3": { - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dependencies": { - "safer-buffer": "safer-buffer@2.1.2" - } - }, - "ignore@5.3.2": { - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dependencies": {} - }, - "immediate@3.0.6": { - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "dependencies": {} - }, - "import-fresh@3.3.0": { - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dependencies": { - "parent-module": "parent-module@1.0.1", - "resolve-from": "resolve-from@4.0.0" - } - }, - "imurmurhash@0.1.4": { - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dependencies": {} - }, - "inflight@1.0.6": { - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dependencies": { - "once": "once@1.4.0", - "wrappy": "wrappy@1.0.2" - } - }, - "inherits@2.0.4": { - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dependencies": {} - }, - "internal-slot@1.0.7": { - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", - "dependencies": { - "es-errors": "es-errors@1.3.0", - "hasown": "hasown@2.0.2", - "side-channel": "side-channel@1.0.6" - } - }, - "ipaddr.js@1.9.1": { - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dependencies": {} - }, - "is-array-buffer@3.0.4": { - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", - "dependencies": { - "call-bind": "call-bind@1.0.7", - "get-intrinsic": "get-intrinsic@1.2.4" - } - }, - "is-bigint@1.0.4": { - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dependencies": { - "has-bigints": "has-bigints@1.0.2" - } - }, - "is-boolean-object@1.1.2": { - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dependencies": { - "call-bind": "call-bind@1.0.7", - "has-tostringtag": "has-tostringtag@1.0.2" - } - }, - "is-callable@1.2.7": { - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dependencies": {} - }, - "is-core-module@2.15.1": { - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", - "dependencies": { - "hasown": "hasown@2.0.2" - } - }, - "is-data-view@1.0.1": { - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", - "dependencies": { - "is-typed-array": "is-typed-array@1.1.13" - } - }, - "is-date-object@1.0.5": { - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dependencies": { - "has-tostringtag": "has-tostringtag@1.0.2" - } - }, - "is-docker@3.0.0": { - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "dependencies": {} - }, - "is-extglob@2.1.1": { - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dependencies": {} - }, - "is-glob@4.0.3": { - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dependencies": { - "is-extglob": "is-extglob@2.1.1" - } - }, - "is-inside-container@1.0.0": { - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "dependencies": { - "is-docker": "is-docker@3.0.0" - } - }, - "is-negative-zero@2.0.3": { - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dependencies": {} - }, - "is-number-object@1.0.7": { - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dependencies": { - "has-tostringtag": "has-tostringtag@1.0.2" - } - }, - "is-path-inside@3.0.3": { - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dependencies": {} - }, - "is-regex@1.1.4": { - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dependencies": { - "call-bind": "call-bind@1.0.7", - "has-tostringtag": "has-tostringtag@1.0.2" - } - }, - "is-shared-array-buffer@1.0.3": { - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", - "dependencies": { - "call-bind": "call-bind@1.0.7" - } - }, - "is-string@1.0.7": { - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dependencies": { - "has-tostringtag": "has-tostringtag@1.0.2" - } - }, - "is-symbol@1.0.4": { - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dependencies": { - "has-symbols": "has-symbols@1.0.3" - } - }, - "is-typed-array@1.1.13": { - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", - "dependencies": { - "which-typed-array": "which-typed-array@1.1.15" - } - }, - "is-weakref@1.0.2": { - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dependencies": { - "call-bind": "call-bind@1.0.7" - } - }, - "is-wsl@3.1.0": { - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", - "dependencies": { - "is-inside-container": "is-inside-container@1.0.0" - } - }, - "isarray@1.0.0": { - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dependencies": {} - }, - "isarray@2.0.5": { - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dependencies": {} - }, - "isexe@2.0.0": { - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dependencies": {} - }, - "isexe@3.1.1": { - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dependencies": {} - }, - "js-yaml@4.1.0": { - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "argparse@2.0.1" - } - }, - "json-buffer@3.0.1": { - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dependencies": {} - }, - "json-schema-traverse@0.4.1": { - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dependencies": {} - }, - "json-stable-stringify-without-jsonify@1.0.1": { - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dependencies": {} - }, - "json5@1.0.2": { - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dependencies": { - "minimist": "minimist@1.2.8" - } - }, - "jszip@3.7.1": { - "integrity": "sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg==", - "dependencies": { - "lie": "lie@3.3.0", - "pako": "pako@1.0.11", - "readable-stream": "readable-stream@2.3.8", - "set-immediate-shim": "set-immediate-shim@1.0.1" - } - }, - "keyv@4.5.4": { - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dependencies": { - "json-buffer": "json-buffer@3.0.1" - } - }, - "levn@0.4.1": { - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dependencies": { - "prelude-ls": "prelude-ls@1.2.1", - "type-check": "type-check@0.4.0" - } - }, - "lie@3.3.0": { - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "dependencies": { - "immediate": "immediate@3.0.6" - } - }, - "locate-path@6.0.0": { - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dependencies": { - "p-locate": "p-locate@5.0.0" - } - }, - "lodash.merge@4.6.2": { - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dependencies": {} - }, - "media-typer@0.3.0": { - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dependencies": {} - }, - "merge-descriptors@1.0.1": { - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dependencies": {} - }, - "methods@1.1.2": { - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dependencies": {} - }, - "mime-db@1.52.0": { - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dependencies": {} - }, - "mime-types@2.1.35": { - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "mime-db@1.52.0" - } - }, - "mime@1.6.0": { - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dependencies": {} - }, - "minimatch@10.0.1": { - "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", - "dependencies": { - "brace-expansion": "brace-expansion@2.0.1" - } - }, - "minimatch@3.1.2": { - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "brace-expansion@1.1.11" - } - }, - "minimist@1.2.8": { - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dependencies": {} - }, - "ms@2.0.0": { - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dependencies": {} - }, - "ms@2.1.3": { - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dependencies": {} - }, - "natural-compare@1.4.0": { - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dependencies": {} - }, - "negotiator@0.6.3": { - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dependencies": {} - }, - "object-inspect@1.13.2": { - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", - "dependencies": {} - }, - "object-keys@1.1.1": { - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dependencies": {} - }, - "object.assign@4.1.5": { - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dependencies": { - "call-bind": "call-bind@1.0.7", - "define-properties": "define-properties@1.2.1", - "has-symbols": "has-symbols@1.0.3", - "object-keys": "object-keys@1.1.1" - } - }, - "object.fromentries@2.0.8": { - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", - "dependencies": { - "call-bind": "call-bind@1.0.7", - "define-properties": "define-properties@1.2.1", - "es-abstract": "es-abstract@1.23.3", - "es-object-atoms": "es-object-atoms@1.0.0" - } - }, - "object.groupby@1.0.3": { - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", - "dependencies": { - "call-bind": "call-bind@1.0.7", - "define-properties": "define-properties@1.2.1", - "es-abstract": "es-abstract@1.23.3" - } - }, - "object.values@1.2.0": { - "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", - "dependencies": { - "call-bind": "call-bind@1.0.7", - "define-properties": "define-properties@1.2.1", - "es-object-atoms": "es-object-atoms@1.0.0" - } - }, - "on-finished@2.4.1": { - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "ee-first@1.1.1" - } - }, - "once@1.4.0": { - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "wrappy@1.0.2" - } - }, - "open@10.1.0": { - "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", - "dependencies": { - "default-browser": "default-browser@5.2.1", - "define-lazy-prop": "define-lazy-prop@3.0.0", - "is-inside-container": "is-inside-container@1.0.0", - "is-wsl": "is-wsl@3.1.0" - } - }, - "optionator@0.9.4": { - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dependencies": { - "deep-is": "deep-is@0.1.4", - "fast-levenshtein": "fast-levenshtein@2.0.6", - "levn": "levn@0.4.1", - "prelude-ls": "prelude-ls@1.2.1", - "type-check": "type-check@0.4.0", - "word-wrap": "word-wrap@1.2.5" - } - }, - "p-limit@3.1.0": { - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dependencies": { - "yocto-queue": "yocto-queue@0.1.0" - } - }, - "p-locate@5.0.0": { - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dependencies": { - "p-limit": "p-limit@3.1.0" - } - }, - "pako@1.0.11": { - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dependencies": {} - }, - "parent-module@1.0.1": { - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dependencies": { - "callsites": "callsites@3.1.0" - } - }, - "parseurl@1.3.3": { - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dependencies": {} - }, - "path-exists@4.0.0": { - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dependencies": {} - }, - "path-is-absolute@1.0.1": { - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dependencies": {} - }, - "path-key@3.1.1": { - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dependencies": {} - }, - "path-parse@1.0.7": { - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dependencies": {} - }, - "path-to-regexp@0.1.7": { - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dependencies": {} - }, - "possible-typed-array-names@1.0.0": { - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "dependencies": {} - }, - "prelude-ls@1.2.1": { - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dependencies": {} - }, - "process-nextick-args@2.0.1": { - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dependencies": {} - }, - "proxy-addr@2.0.7": { - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "forwarded@0.2.0", - "ipaddr.js": "ipaddr.js@1.9.1" - } - }, - "punycode@2.3.1": { - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dependencies": {} - }, - "qs@6.11.0": { - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "side-channel@1.0.6" - } - }, - "queue-microtask@1.2.3": { - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dependencies": {} - }, - "range-parser@1.2.1": { - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dependencies": {} - }, - "raw-body@2.5.2": { - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dependencies": { - "bytes": "bytes@3.1.2", - "http-errors": "http-errors@2.0.0", - "iconv-lite": "iconv-lite@0.4.24", - "unpipe": "unpipe@1.0.0" - } - }, - "readable-stream@2.3.8": { - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dependencies": { - "core-util-is": "core-util-is@1.0.3", - "inherits": "inherits@2.0.4", - "isarray": "isarray@1.0.0", - "process-nextick-args": "process-nextick-args@2.0.1", - "safe-buffer": "safe-buffer@5.1.2", - "string_decoder": "string_decoder@1.1.1", - "util-deprecate": "util-deprecate@1.0.2" - } - }, - "regexp.prototype.flags@1.5.2": { - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", - "dependencies": { - "call-bind": "call-bind@1.0.7", - "define-properties": "define-properties@1.2.1", - "es-errors": "es-errors@1.3.0", - "set-function-name": "set-function-name@2.0.2" - } - }, - "resolve-from@4.0.0": { - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dependencies": {} - }, - "resolve@1.22.8": { - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dependencies": { - "is-core-module": "is-core-module@2.15.1", - "path-parse": "path-parse@1.0.7", - "supports-preserve-symlinks-flag": "supports-preserve-symlinks-flag@1.0.0" - } - }, - "reusify@1.0.4": { - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dependencies": {} - }, - "rimraf@3.0.2": { - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "glob@7.2.3" - } - }, - "run-applescript@7.0.0": { - "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", - "dependencies": {} - }, - "run-parallel@1.2.0": { - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dependencies": { - "queue-microtask": "queue-microtask@1.2.3" - } - }, - "safe-array-concat@1.1.2": { - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", - "dependencies": { - "call-bind": "call-bind@1.0.7", - "get-intrinsic": "get-intrinsic@1.2.4", - "has-symbols": "has-symbols@1.0.3", - "isarray": "isarray@2.0.5" - } - }, - "safe-buffer@5.1.2": { - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dependencies": {} - }, - "safe-buffer@5.2.1": { - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dependencies": {} - }, - "safe-regex-test@1.0.3": { - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", - "dependencies": { - "call-bind": "call-bind@1.0.7", - "es-errors": "es-errors@1.3.0", - "is-regex": "is-regex@1.1.4" - } - }, - "safer-buffer@2.1.2": { - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dependencies": {} - }, - "semver@6.3.1": { - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dependencies": {} - }, - "send@0.18.0": { - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dependencies": { - "debug": "debug@2.6.9", - "depd": "depd@2.0.0", - "destroy": "destroy@1.2.0", - "encodeurl": "encodeurl@1.0.2", - "escape-html": "escape-html@1.0.3", - "etag": "etag@1.8.1", - "fresh": "fresh@0.5.2", - "http-errors": "http-errors@2.0.0", - "mime": "mime@1.6.0", - "ms": "ms@2.1.3", - "on-finished": "on-finished@2.4.1", - "range-parser": "range-parser@1.2.1", - "statuses": "statuses@2.0.1" - } - }, - "serve-static@1.15.0": { - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dependencies": { - "encodeurl": "encodeurl@1.0.2", - "escape-html": "escape-html@1.0.3", - "parseurl": "parseurl@1.3.3", - "send": "send@0.18.0" - } - }, - "set-function-length@1.2.2": { - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dependencies": { - "define-data-property": "define-data-property@1.1.4", - "es-errors": "es-errors@1.3.0", - "function-bind": "function-bind@1.1.2", - "get-intrinsic": "get-intrinsic@1.2.4", - "gopd": "gopd@1.0.1", - "has-property-descriptors": "has-property-descriptors@1.0.2" - } - }, - "set-function-name@2.0.2": { - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dependencies": { - "define-data-property": "define-data-property@1.1.4", - "es-errors": "es-errors@1.3.0", - "functions-have-names": "functions-have-names@1.2.3", - "has-property-descriptors": "has-property-descriptors@1.0.2" - } - }, - "set-immediate-shim@1.0.1": { - "integrity": "sha512-Li5AOqrZWCVA2n5kryzEmqai6bKSIvpz5oUJHPVj6+dsbD3X1ixtsY5tEnsaNpH3pFAHmG8eIHUrtEtohrg+UQ==", - "dependencies": {} - }, - "setprototypeof@1.2.0": { - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dependencies": {} - }, - "shebang-command@2.0.0": { - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "shebang-regex@3.0.0" - } - }, - "shebang-regex@3.0.0": { - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dependencies": {} - }, - "side-channel@1.0.6": { - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "dependencies": { - "call-bind": "call-bind@1.0.7", - "es-errors": "es-errors@1.3.0", - "get-intrinsic": "get-intrinsic@1.2.4", - "object-inspect": "object-inspect@1.13.2" - } - }, - "statuses@2.0.1": { - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dependencies": {} - }, - "string.prototype.trim@1.2.9": { - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", - "dependencies": { - "call-bind": "call-bind@1.0.7", - "define-properties": "define-properties@1.2.1", - "es-abstract": "es-abstract@1.23.3", - "es-object-atoms": "es-object-atoms@1.0.0" - } - }, - "string.prototype.trimend@1.0.8": { - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", - "dependencies": { - "call-bind": "call-bind@1.0.7", - "define-properties": "define-properties@1.2.1", - "es-object-atoms": "es-object-atoms@1.0.0" - } - }, - "string.prototype.trimstart@1.0.8": { - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dependencies": { - "call-bind": "call-bind@1.0.7", - "define-properties": "define-properties@1.2.1", - "es-object-atoms": "es-object-atoms@1.0.0" - } - }, - "string_decoder@1.1.1": { - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "safe-buffer@5.1.2" - } - }, - "strip-ansi@6.0.1": { - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "ansi-regex@5.0.1" - } - }, - "strip-bom@3.0.0": { - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dependencies": {} - }, - "strip-json-comments@3.1.1": { - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dependencies": {} - }, - "sudo-prompt@9.2.1": { - "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==", - "dependencies": {} - }, - "supports-color@7.2.0": { - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "has-flag@4.0.0" - } - }, - "supports-preserve-symlinks-flag@1.0.0": { - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dependencies": {} - }, - "text-table@0.2.0": { - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dependencies": {} - }, - "toidentifier@1.0.1": { - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dependencies": {} - }, - "tsconfig-paths@3.15.0": { - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dependencies": { - "@types/json5": "@types/json5@0.0.29", - "json5": "json5@1.0.2", - "minimist": "minimist@1.2.8", - "strip-bom": "strip-bom@3.0.0" - } - }, - "tslib@2.3.1": { - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", - "dependencies": {} - }, - "type-check@0.4.0": { - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dependencies": { - "prelude-ls": "prelude-ls@1.2.1" - } - }, - "type-fest@0.20.2": { - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dependencies": {} - }, - "type-is@1.6.18": { - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "media-typer@0.3.0", - "mime-types": "mime-types@2.1.35" - } - }, - "typed-array-buffer@1.0.2": { - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", - "dependencies": { - "call-bind": "call-bind@1.0.7", - "es-errors": "es-errors@1.3.0", - "is-typed-array": "is-typed-array@1.1.13" - } - }, - "typed-array-byte-length@1.0.1": { - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", - "dependencies": { - "call-bind": "call-bind@1.0.7", - "for-each": "for-each@0.3.3", - "gopd": "gopd@1.0.1", - "has-proto": "has-proto@1.0.3", - "is-typed-array": "is-typed-array@1.1.13" - } - }, - "typed-array-byte-offset@1.0.2": { - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", - "dependencies": { - "available-typed-arrays": "available-typed-arrays@1.0.7", - "call-bind": "call-bind@1.0.7", - "for-each": "for-each@0.3.3", - "gopd": "gopd@1.0.1", - "has-proto": "has-proto@1.0.3", - "is-typed-array": "is-typed-array@1.1.13" - } - }, - "typed-array-length@1.0.6": { - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", - "dependencies": { - "call-bind": "call-bind@1.0.7", - "for-each": "for-each@0.3.3", - "gopd": "gopd@1.0.1", - "has-proto": "has-proto@1.0.3", - "is-typed-array": "is-typed-array@1.1.13", - "possible-typed-array-names": "possible-typed-array-names@1.0.0" - } - }, - "unbox-primitive@1.0.2": { - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dependencies": { - "call-bind": "call-bind@1.0.7", - "has-bigints": "has-bigints@1.0.2", - "has-symbols": "has-symbols@1.0.3", - "which-boxed-primitive": "which-boxed-primitive@1.0.2" - } - }, - "undici@5.28.4": { - "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", - "dependencies": { - "@fastify/busboy": "@fastify/busboy@2.1.1" - } - }, - "unpipe@1.0.0": { - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dependencies": {} - }, - "uri-js@4.4.1": { - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "punycode@2.3.1" - } - }, - "util-deprecate@1.0.2": { - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dependencies": {} - }, - "utils-merge@1.0.1": { - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dependencies": {} - }, - "vary@1.1.2": { - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dependencies": {} - }, - "which-boxed-primitive@1.0.2": { - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dependencies": { - "is-bigint": "is-bigint@1.0.4", - "is-boolean-object": "is-boolean-object@1.1.2", - "is-number-object": "is-number-object@1.0.7", - "is-string": "is-string@1.0.7", - "is-symbol": "is-symbol@1.0.4" - } - }, - "which-typed-array@1.1.15": { - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", - "dependencies": { - "available-typed-arrays": "available-typed-arrays@1.0.7", - "call-bind": "call-bind@1.0.7", - "for-each": "for-each@0.3.3", - "gopd": "gopd@1.0.1", - "has-tostringtag": "has-tostringtag@1.0.2" - } - }, - "which@2.0.2": { - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "isexe@2.0.0" - } - }, - "which@4.0.0": { - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", - "dependencies": { - "isexe": "isexe@3.1.1" - } - }, - "windmill-client@1.364.0": { - "integrity": "sha512-UjCbBB2IeyMVoDyO16boHEsTus2npVtXyER2pfP0zm7rmp6ko65HA3OXvMzhMVq3hW9RQ5esc3mrkTnb19PIaw==", - "dependencies": {} - }, - "word-wrap@1.2.5": { - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dependencies": {} - }, - "wrappy@1.0.2": { - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dependencies": {} - }, - "ws@8.18.0": { - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "dependencies": {} - }, - "yocto-queue@0.1.0": { - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dependencies": {} - } + "@deno/dnt@0.41.3": { + "integrity": "b2ef2c8a5111eef86cb5bfcae103d6a2938e8e649e2461634a7befb7fc59d6d2", + "dependencies": [ + "jsr:@david/code-block-writer", + "jsr:@deno/cache-dir", + "jsr:@std/fmt@1", + "jsr:@std/fs@1", + "jsr:@std/path@1", + "jsr:@ts-morph/bootstrap" + ] + }, + "@deno/graph@0.73.1": { + "integrity": "cd69639d2709d479037d5ce191a422eabe8d71bb68b0098344f6b07411c84d41" + }, + "@std/assert@0.223.0": { + "integrity": "eb8d6d879d76e1cc431205bd346ed4d88dc051c6366365b1af47034b0670be24" + }, + "@std/assert@0.226.0": { + "integrity": "0dfb5f7c7723c18cec118e080fec76ce15b4c31154b15ad2bd74822603ef75b3" + }, + "@std/assert@1.0.0-rc.2": { + "integrity": "0484eab1d76b55fca1c3beaff485a274e67dd3b9f065edcbe70030dfc0b964d3" + }, + "@std/bytes@0.223.0": { + "integrity": "84b75052cd8680942c397c2631318772b295019098f40aac5c36cead4cba51a8" + }, + "@std/bytes@1.0.2": { + "integrity": "fbdee322bbd8c599a6af186a1603b3355e59a5fb1baa139f8f4c3c9a1b3e3d57" + }, + "@std/cli@1.0.0-rc.2": { + "integrity": "97dfae82b9f0e189768ebfa7a5da53375955b94bad0a1804f8e3b73563b03787" + }, + "@std/encoding@1.0.0-rc.2": { + "integrity": "160d7674a20ebfbccdf610b3801fee91cf6e42d1c106dd46bbaf46e395cd35ef" + }, + "@std/encoding@1.0.4": { + "integrity": "2266cd516b32369e3dc5695717c96bf88343a1f761d6e6187a02a2bbe2af86ae" + }, + "@std/fmt@0.223.0": { + "integrity": "6deb37794127dfc7d7bded2586b9fc6f5d50e62a8134846608baf71ffc1a5208" + }, + "@std/fmt@0.225.6": { + "integrity": "aba6aea27f66813cecfd9484e074a9e9845782ab0685c030e453a8a70b37afc8" + }, + "@std/fmt@1.0.2": { + "integrity": "87e9dfcdd3ca7c066e0c3c657c1f987c82888eb8103a3a3baa62684ffeb0f7a7" + }, + "@std/fs@0.223.0": { + "integrity": "3b4b0550b2c524cbaaa5a9170c90e96cbb7354e837ad1bdaf15fc9df1ae9c31c" + }, + "@std/fs@0.229.3": { + "integrity": "783bca21f24da92e04c3893c9e79653227ab016c48e96b3078377ebd5222e6eb", + "dependencies": [ + "jsr:@std/path@1.0.0-rc.1" + ] + }, + "@std/fs@1.0.3": { + "integrity": "3cb839b1360b0a42d8b367c3093bfe4071798e6694fa44cf1963e04a8edba4fe", + "dependencies": [ + "jsr:@std/path@^1.0.4" + ] + }, + "@std/io@0.223.0": { + "integrity": "2d8c3c2ab3a515619b90da2c6ff5ea7b75a94383259ef4d02116b228393f84f1", + "dependencies": [ + "jsr:@std/assert@0.223", + "jsr:@std/bytes@0.223" + ] + }, + "@std/io@0.224.7": { + "integrity": "a70848793c44a7c100926571a8c9be68ba85487bfcd4d0540d86deabe1123dc9", + "dependencies": [ + "jsr:@std/bytes@^1.0.2" + ] + }, + "@std/log@0.224.7": { + "integrity": "021941e5cd16de60cb11599c9b36f892aea95987fe66c753922808da27909e18", + "dependencies": [ + "jsr:@std/fmt@^1.0.2", + "jsr:@std/fs@^1.0.3", + "jsr:@std/io@~0.224.7" + ] + }, + "@std/net@1.0.2": { + "integrity": "520c18ddb7f67d3830a1adfef03a155d496fe9683a9cb63bb823b5afb86484dc" + }, + "@std/path@0.223.0": { + "integrity": "593963402d7e6597f5a6e620931661053572c982fc014000459edc1f93cc3989", + "dependencies": [ + "jsr:@std/assert@0.223" + ] + }, + "@std/path@0.225.2": { + "integrity": "0f2db41d36b50ef048dcb0399aac720a5348638dd3cb5bf80685bf2a745aa506", + "dependencies": [ + "jsr:@std/assert@0.226" + ] + }, + "@std/path@1.0.0-rc.1": { + "integrity": "b8c00ae2f19106a6bb7cbf1ab9be52aa70de1605daeb2dbdc4f87a7cbaf10ff6" + }, + "@std/path@1.0.0-rc.2": { + "integrity": "39f20d37a44d1867abac8d91c169359ea6e942237a45a99ee1e091b32b921c7d" + }, + "@std/path@1.0.4": { + "integrity": "48dd5d8389bcfcd619338a01bdf862cb7799933390146a54ae59356a0acc7105" + }, + "@std/streams@1.0.4": { + "integrity": "a1a5b01c74ca1d2dcaacfe1d4bbb91392e765946d82a3471bd95539adc6da83a", + "dependencies": [ + "jsr:@std/bytes@^1.0.2" + ] + }, + "@std/text@1.0.0-rc.1": { + "integrity": "34c722203e87ee12792c8d4a0cd2ee0e001341cbce75b860fc21be19d62232b0" + }, + "@std/yaml@1.0.5": { + "integrity": "71ba3d334305ee2149391931508b2c293a8490f94a337eef3a09cade1a2a2742" + }, + "@ts-morph/bootstrap@0.24.0": { + "integrity": "a826a2ef7fa8a7c3f1042df2c034d20744d94da2ee32bf29275bcd4dffd3c060", + "dependencies": [ + "jsr:@ts-morph/common" + ] + }, + "@ts-morph/common@0.24.0": { + "integrity": "12b625b8e562446ba658cdbe9ad77774b4bd96b992ae8bd34c60dbf24d06c1f3", + "dependencies": [ + "jsr:@std/fs@~0.229.3", + "jsr:@std/path@~0.225.2" + ] + }, + "@windmill-labs/cliffy-ansi@1.0.0-rc.5": { + "integrity": "1109cbcb0c415b57779352f708f5969b8c645f56bc555cbafc6ea5e0c6a360a4", + "dependencies": [ + "jsr:@std/encoding@1.0.0-rc.2", + "jsr:@std/fmt@~0.225.4", + "jsr:@std/io@~0.224.2", + "jsr:@windmill-labs/cliffy-internal" + ] + }, + "@windmill-labs/cliffy-command@1.0.0-rc.5": { + "integrity": "3eaa9def5f5afa1028f4a60ee4d9065ccc5f194d032824365c6ebcb9f46db66e", + "dependencies": [ + "jsr:@std/fmt@~0.225.4", + "jsr:@std/text", + "jsr:@windmill-labs/cliffy-flags", + "jsr:@windmill-labs/cliffy-internal", + "jsr:@windmill-labs/cliffy-table@1.0.0-rc.5" + ] + }, + "@windmill-labs/cliffy-flags@1.0.0-rc.5": { + "integrity": "0e4b5b53a02295f8bf27d93b3bcca5d5d001a0286aea17404e6ef6347f69363c", + "dependencies": [ + "jsr:@std/text" + ] + }, + "@windmill-labs/cliffy-internal@1.0.0-rc.5": { + "integrity": "876b989ad2d1b739cc4a4f1386dbb80f819d2851ad583c1f486fc6ebe9beadf6" + }, + "@windmill-labs/cliffy-keycode@1.0.0-rc.5": { + "integrity": "2bc1b1af363528e38ed47bce525f417cab278b829a423353ffd589622f5a746e" + }, + "@windmill-labs/cliffy-prompt@1.0.0-rc.5": { + "integrity": "329a097911f219b15ea643ae83b6b360a11df7fc4cafdac1bf6869259475033a", + "dependencies": [ + "jsr:@std/assert@1.0.0-rc.2", + "jsr:@std/fmt@~0.225.4", + "jsr:@std/io@~0.224.2", + "jsr:@std/path@1.0.0-rc.2", + "jsr:@std/text", + "jsr:@windmill-labs/cliffy-ansi@1.0.0-rc.5", + "jsr:@windmill-labs/cliffy-internal", + "jsr:@windmill-labs/cliffy-keycode" + ] + }, + "@windmill-labs/cliffy-prompt@1.0.0-rc.6": { + "integrity": "ffe09bee0e1e07bc12b2147be509d10b47eb6a36cbfea80fc206b4ae86693205", + "dependencies": [ + "jsr:@std/assert@1.0.0-rc.2", + "jsr:@std/fmt@~0.225.4", + "jsr:@std/io@~0.224.2", + "jsr:@std/path@1.0.0-rc.2", + "jsr:@std/text", + "jsr:@windmill-labs/cliffy-ansi@1.0.0-rc.5", + "jsr:@windmill-labs/cliffy-internal", + "jsr:@windmill-labs/cliffy-keycode" + ] + }, + "@windmill-labs/cliffy-table@1.0.0-rc.5": { + "integrity": "5f26cb6ccbc2fbf1b1f79f9062d166e32e11d34398c0deac7e6f9d8378970546", + "dependencies": [ + "jsr:@std/cli", + "jsr:@std/fmt@~0.225.4" + ] + } + }, + "npm": { + "@ayonli/jsext@0.9.58": { + "integrity": "sha512-AwGf64K6VqGyYLFA6rgyuU6jBbwUNJctENpW1bZayvXcIprhdfs7cn7S+EXi0pnNLupT9ptODYkKneB3/YuWww==", + "dependencies": [ + "iconv-lite@0.6.3", + "sudo-prompt", + "ws" + ] + }, + "@deno/shim-crypto@0.3.1": { + "integrity": "sha512-ed4pNnfur6UbASEgF34gVxR9p7Mc3qF+Ygbmjiil8ws5IhNFhPDFy5vE5hQAUA9JmVsSxXPcVLM5Rf8LOZqQ5Q==" + }, + "@deno/shim-deno-test@0.5.0": { + "integrity": "sha512-4nMhecpGlPi0cSzT67L+Tm+GOJqvuk8gqHBziqcUQOarnuIax1z96/gJHCSIz2Z0zhxE6Rzwb3IZXPtFh51j+w==" + }, + "@deno/shim-deno@0.17.0": { + "integrity": "sha512-+FzsP65eehAgTQdzt1izLEV17ePCZqHxDQqRDbpRc1yJVYtDI2MvbRq5DvOj90uRt6zKn9qtWpEueDqG1QORhQ==", + "dependencies": [ + "@deno/shim-deno-test", + "which@4.0.0" + ] + }, + "@esbuild/aix-ppc64@0.23.0": { + "integrity": "sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==" + }, + "@esbuild/android-arm64@0.23.0": { + "integrity": "sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==" + }, + "@esbuild/android-arm@0.23.0": { + "integrity": "sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==" + }, + "@esbuild/android-x64@0.23.0": { + "integrity": "sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==" + }, + "@esbuild/darwin-arm64@0.23.0": { + "integrity": "sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==" + }, + "@esbuild/darwin-x64@0.23.0": { + "integrity": "sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==" + }, + "@esbuild/freebsd-arm64@0.23.0": { + "integrity": "sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==" + }, + "@esbuild/freebsd-x64@0.23.0": { + "integrity": "sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==" + }, + "@esbuild/linux-arm64@0.23.0": { + "integrity": "sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==" + }, + "@esbuild/linux-arm@0.23.0": { + "integrity": "sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==" + }, + "@esbuild/linux-ia32@0.23.0": { + "integrity": "sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==" + }, + "@esbuild/linux-loong64@0.23.0": { + "integrity": "sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==" + }, + "@esbuild/linux-mips64el@0.23.0": { + "integrity": "sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==" + }, + "@esbuild/linux-ppc64@0.23.0": { + "integrity": "sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==" + }, + "@esbuild/linux-riscv64@0.23.0": { + "integrity": "sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==" + }, + "@esbuild/linux-s390x@0.23.0": { + "integrity": "sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==" + }, + "@esbuild/linux-x64@0.23.0": { + "integrity": "sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==" + }, + "@esbuild/netbsd-x64@0.23.0": { + "integrity": "sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==" + }, + "@esbuild/openbsd-arm64@0.23.0": { + "integrity": "sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==" + }, + "@esbuild/openbsd-x64@0.23.0": { + "integrity": "sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==" + }, + "@esbuild/sunos-x64@0.23.0": { + "integrity": "sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==" + }, + "@esbuild/win32-arm64@0.23.0": { + "integrity": "sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==" + }, + "@esbuild/win32-ia32@0.23.0": { + "integrity": "sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==" + }, + "@esbuild/win32-x64@0.23.0": { + "integrity": "sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==" + }, + "@eslint-community/eslint-utils@4.4.0_eslint@8.57.1": { + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dependencies": [ + "eslint@8.57.1", + "eslint-visitor-keys@3.4.3" + ] + }, + "@eslint-community/eslint-utils@4.4.0_eslint@9.10.0": { + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dependencies": [ + "eslint@9.10.0", + "eslint-visitor-keys@3.4.3" + ] + }, + "@eslint-community/regexpp@4.11.1": { + "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==" + }, + "@eslint/config-array@0.18.0": { + "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", + "dependencies": [ + "@eslint/object-schema", + "debug@4.3.7", + "minimatch@3.1.2" + ] + }, + "@eslint/eslintrc@2.1.4": { + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dependencies": [ + "ajv", + "debug@4.3.7", + "espree@9.6.1_acorn@8.12.1", + "globals@13.24.0", + "ignore", + "import-fresh", + "js-yaml", + "minimatch@3.1.2", + "strip-json-comments" + ] + }, + "@eslint/eslintrc@3.1.0": { + "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", + "dependencies": [ + "ajv", + "debug@4.3.7", + "espree@10.1.0_acorn@8.12.1", + "globals@14.0.0", + "ignore", + "import-fresh", + "js-yaml", + "minimatch@3.1.2", + "strip-json-comments" + ] + }, + "@eslint/js@8.57.1": { + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==" + }, + "@eslint/js@9.10.0": { + "integrity": "sha512-fuXtbiP5GWIn8Fz+LWoOMVf/Jxm+aajZYkhi6CuEm4SxymFM+eUWzbO9qXT+L0iCkL5+KGYMCSGxo686H19S1g==" + }, + "@eslint/object-schema@2.1.4": { + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==" + }, + "@eslint/plugin-kit@0.1.0": { + "integrity": "sha512-autAXT203ixhqei9xt+qkYOvY8l6LAFIdT2UXc/RPNeUVfqRF1BV94GTJyVPFKT8nFM6MyVJhjLj9E8JWvf5zQ==", + "dependencies": [ + "levn" + ] + }, + "@fastify/busboy@2.1.1": { + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==" + }, + "@humanwhocodes/config-array@0.13.0": { + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "dependencies": [ + "@humanwhocodes/object-schema", + "debug@4.3.7", + "minimatch@3.1.2" + ] + }, + "@humanwhocodes/module-importer@1.0.1": { + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==" + }, + "@humanwhocodes/object-schema@2.0.3": { + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==" + }, + "@humanwhocodes/retry@0.3.0": { + "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==" + }, + "@nodelib/fs.scandir@2.1.5": { + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": [ + "@nodelib/fs.stat", + "run-parallel" + ] + }, + "@nodelib/fs.stat@2.0.5": { + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" + }, + "@nodelib/fs.walk@1.2.8": { + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": [ + "@nodelib/fs.scandir", + "fastq" + ] + }, + "@oakserver/oak@12.6.2": { + "integrity": "sha512-q9LfyC9tWV68me0GEUuA66qbwH8ep0bBdq9V02fePlPmPVUBCAzQQkomyaI/L4Uur+YALVXgLoTaC2rviZ7I4w==", + "dependencies": [ + "@deno/shim-crypto", + "@deno/shim-deno", + "tslib", + "undici" + ] + }, + "@rtsao/scc@1.1.0": { + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==" + }, + "@types/diff@5.2.2": { + "integrity": "sha512-qVqLpd49rmJA2nZzLVsmfS/aiiBpfVE95dHhPVwG0NmSBAt+riPxnj53wq2oBq5m4Q2RF1IWFEUpnZTgrQZfEQ==" + }, + "@types/json5@0.0.29": { + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" + }, + "@types/node@18.16.19": { + "integrity": "sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA==" + }, + "@ungap/structured-clone@1.2.0": { + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + }, + "accepts@1.3.8": { + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": [ + "mime-types", + "negotiator" + ] + }, + "acorn-jsx@5.3.2_acorn@8.12.1": { + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dependencies": [ + "acorn" + ] + }, + "acorn@8.12.1": { + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==" + }, + "ajv@6.12.6": { + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": [ + "fast-deep-equal", + "fast-json-stable-stringify", + "json-schema-traverse", + "uri-js" + ] + }, + "ansi-regex@5.0.1": { + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles@4.3.0": { + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": [ + "color-convert" + ] + }, + "argparse@2.0.1": { + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "array-buffer-byte-length@1.0.1": { + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dependencies": [ + "call-bind", + "is-array-buffer" + ] + }, + "array-flatten@1.1.1": { + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "array-includes@3.1.8": { + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dependencies": [ + "call-bind", + "define-properties", + "es-abstract", + "es-object-atoms", + "get-intrinsic", + "is-string" + ] + }, + "array.prototype.findlastindex@1.2.5": { + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dependencies": [ + "call-bind", + "define-properties", + "es-abstract", + "es-errors", + "es-object-atoms", + "es-shim-unscopables" + ] + }, + "array.prototype.flat@1.3.2": { + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dependencies": [ + "call-bind", + "define-properties", + "es-abstract", + "es-shim-unscopables" + ] + }, + "array.prototype.flatmap@1.3.2": { + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dependencies": [ + "call-bind", + "define-properties", + "es-abstract", + "es-shim-unscopables" + ] + }, + "arraybuffer.prototype.slice@1.0.3": { + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dependencies": [ + "array-buffer-byte-length", + "call-bind", + "define-properties", + "es-abstract", + "es-errors", + "get-intrinsic", + "is-array-buffer", + "is-shared-array-buffer" + ] + }, + "available-typed-arrays@1.0.7": { + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dependencies": [ + "possible-typed-array-names" + ] + }, + "balanced-match@1.0.2": { + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "body-parser@1.20.2": { + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dependencies": [ + "bytes", + "content-type", + "debug@2.6.9", + "depd", + "destroy", + "http-errors", + "iconv-lite@0.4.24", + "on-finished", + "qs", + "raw-body", + "type-is", + "unpipe" + ] + }, + "brace-expansion@1.1.11": { + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": [ + "balanced-match", + "concat-map" + ] + }, + "brace-expansion@2.0.1": { + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": [ + "balanced-match" + ] + }, + "bundle-name@4.1.0": { + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dependencies": [ + "run-applescript" + ] + }, + "bytes@3.1.2": { + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "call-bind@1.0.7": { + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": [ + "es-define-property", + "es-errors", + "function-bind", + "get-intrinsic", + "set-function-length" + ] + }, + "callsites@3.1.0": { + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "chalk@4.1.2": { + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": [ + "ansi-styles", + "supports-color" + ] + }, + "color-convert@2.0.1": { + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": [ + "color-name" + ] + }, + "color-name@1.1.4": { + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "concat-map@0.0.1": { + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "content-disposition@0.5.4": { + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": [ + "safe-buffer@5.2.1" + ] + }, + "content-type@1.0.5": { + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" + }, + "cookie-signature@1.0.6": { + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "cookie@0.6.0": { + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==" + }, + "core-util-is@1.0.3": { + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "cross-spawn@7.0.3": { + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": [ + "path-key", + "shebang-command", + "which@2.0.2" + ] + }, + "data-view-buffer@1.0.1": { + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dependencies": [ + "call-bind", + "es-errors", + "is-data-view" + ] + }, + "data-view-byte-length@1.0.1": { + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dependencies": [ + "call-bind", + "es-errors", + "is-data-view" + ] + }, + "data-view-byte-offset@1.0.0": { + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dependencies": [ + "call-bind", + "es-errors", + "is-data-view" + ] + }, + "debug@2.6.9": { + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": [ + "ms@2.0.0" + ] + }, + "debug@3.2.7": { + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": [ + "ms@2.1.3" + ] + }, + "debug@4.3.7": { + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": [ + "ms@2.1.3" + ] + }, + "deep-is@0.1.4": { + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "default-browser-id@5.0.0": { + "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==" + }, + "default-browser@5.2.1": { + "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "dependencies": [ + "bundle-name", + "default-browser-id" + ] + }, + "define-data-property@1.1.4": { + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": [ + "es-define-property", + "es-errors", + "gopd" + ] + }, + "define-lazy-prop@3.0.0": { + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==" + }, + "define-properties@1.2.1": { + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dependencies": [ + "define-data-property", + "has-property-descriptors", + "object-keys" + ] + }, + "depd@2.0.0": { + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "destroy@1.2.0": { + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + }, + "diff@5.2.0": { + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==" + }, + "doctrine@2.1.0": { + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dependencies": [ + "esutils" + ] + }, + "doctrine@3.0.0": { + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dependencies": [ + "esutils" + ] + }, + "ee-first@1.1.1": { + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "encodeurl@1.0.2": { + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, + "es-abstract@1.23.3": { + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dependencies": [ + "array-buffer-byte-length", + "arraybuffer.prototype.slice", + "available-typed-arrays", + "call-bind", + "data-view-buffer", + "data-view-byte-length", + "data-view-byte-offset", + "es-define-property", + "es-errors", + "es-object-atoms", + "es-set-tostringtag", + "es-to-primitive", + "function.prototype.name", + "get-intrinsic", + "get-symbol-description", + "globalthis", + "gopd", + "has-property-descriptors", + "has-proto", + "has-symbols", + "hasown", + "internal-slot", + "is-array-buffer", + "is-callable", + "is-data-view", + "is-negative-zero", + "is-regex", + "is-shared-array-buffer", + "is-string", + "is-typed-array", + "is-weakref", + "object-inspect", + "object-keys", + "object.assign", + "regexp.prototype.flags", + "safe-array-concat", + "safe-regex-test", + "string.prototype.trim", + "string.prototype.trimend", + "string.prototype.trimstart", + "typed-array-buffer", + "typed-array-byte-length", + "typed-array-byte-offset", + "typed-array-length", + "unbox-primitive", + "which-typed-array" + ] + }, + "es-define-property@1.0.0": { + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": [ + "get-intrinsic" + ] + }, + "es-errors@1.3.0": { + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" + }, + "es-main@1.3.0": { + "integrity": "sha512-AzORKdz1Zt97TzbYQnIrI3ZiibWpRXUfpo/w0xOJ20GpNYd2bd3MU9m31zS/aJ1TJl6JfLTok83Y8HjNunYT0A==" + }, + "es-object-atoms@1.0.0": { + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dependencies": [ + "es-errors" + ] + }, + "es-set-tostringtag@2.0.3": { + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dependencies": [ + "get-intrinsic", + "has-tostringtag", + "hasown" + ] + }, + "es-shim-unscopables@1.0.2": { + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dependencies": [ + "hasown" + ] + }, + "es-to-primitive@1.2.1": { + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dependencies": [ + "is-callable", + "is-date-object", + "is-symbol" + ] + }, + "esbuild@0.23.0": { + "integrity": "sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==", + "dependencies": [ + "@esbuild/aix-ppc64", + "@esbuild/android-arm", + "@esbuild/android-arm64", + "@esbuild/android-x64", + "@esbuild/darwin-arm64", + "@esbuild/darwin-x64", + "@esbuild/freebsd-arm64", + "@esbuild/freebsd-x64", + "@esbuild/linux-arm", + "@esbuild/linux-arm64", + "@esbuild/linux-ia32", + "@esbuild/linux-loong64", + "@esbuild/linux-mips64el", + "@esbuild/linux-ppc64", + "@esbuild/linux-riscv64", + "@esbuild/linux-s390x", + "@esbuild/linux-x64", + "@esbuild/netbsd-x64", + "@esbuild/openbsd-arm64", + "@esbuild/openbsd-x64", + "@esbuild/sunos-x64", + "@esbuild/win32-arm64", + "@esbuild/win32-ia32", + "@esbuild/win32-x64" + ] + }, + "escape-html@1.0.3": { + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "escape-string-regexp@4.0.0": { + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + }, + "eslint-import-resolver-node@0.3.9": { + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dependencies": [ + "debug@3.2.7", + "is-core-module", + "resolve" + ] + }, + "eslint-module-utils@2.11.0": { + "integrity": "sha512-gbBE5Hitek/oG6MUVj6sFuzEjA/ClzNflVrLovHi/JgLdC7fiN5gLAY1WIPW1a0V5I999MnsrvVrCOGmmVqDBQ==", + "dependencies": [ + "debug@3.2.7" + ] + }, + "eslint-plugin-import@2.30.0_eslint@8.57.1": { + "integrity": "sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw==", + "dependencies": [ + "@rtsao/scc", + "array-includes", + "array.prototype.findlastindex", + "array.prototype.flat", + "array.prototype.flatmap", + "debug@3.2.7", + "doctrine@2.1.0", + "eslint@8.57.1", + "eslint-import-resolver-node", + "eslint-module-utils", + "hasown", + "is-core-module", + "is-glob", + "minimatch@3.1.2", + "object.fromentries", + "object.groupby", + "object.values", + "semver", + "tsconfig-paths" + ] + }, + "eslint-scope@7.2.2": { + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dependencies": [ + "esrecurse", + "estraverse" + ] + }, + "eslint-scope@8.0.2": { + "integrity": "sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==", + "dependencies": [ + "esrecurse", + "estraverse" + ] + }, + "eslint-visitor-keys@3.4.3": { + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==" + }, + "eslint-visitor-keys@4.0.0": { + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==" + }, + "eslint@8.57.1": { + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "dependencies": [ + "@eslint-community/eslint-utils@4.4.0_eslint@8.57.1", + "@eslint-community/regexpp", + "@eslint/eslintrc@2.1.4", + "@eslint/js@8.57.1", + "@humanwhocodes/config-array", + "@humanwhocodes/module-importer", + "@nodelib/fs.walk", + "@ungap/structured-clone", + "ajv", + "chalk", + "cross-spawn", + "debug@4.3.7", + "doctrine@3.0.0", + "escape-string-regexp", + "eslint-scope@7.2.2", + "eslint-visitor-keys@3.4.3", + "espree@9.6.1_acorn@8.12.1", + "esquery", + "esutils", + "fast-deep-equal", + "file-entry-cache@6.0.1", + "find-up", + "glob-parent", + "globals@13.24.0", + "graphemer", + "ignore", + "imurmurhash", + "is-glob", + "is-path-inside", + "js-yaml", + "json-stable-stringify-without-jsonify", + "levn", + "lodash.merge", + "minimatch@3.1.2", + "natural-compare", + "optionator", + "strip-ansi", + "text-table" + ] + }, + "eslint@9.10.0": { + "integrity": "sha512-Y4D0IgtBZfOcOUAIQTSXBKoNGfY0REGqHJG6+Q81vNippW5YlKjHFj4soMxamKK1NXHUWuBZTLdU3Km+L/pcHw==", + "dependencies": [ + "@eslint-community/eslint-utils@4.4.0_eslint@9.10.0", + "@eslint-community/regexpp", + "@eslint/config-array", + "@eslint/eslintrc@3.1.0", + "@eslint/js@9.10.0", + "@eslint/plugin-kit", + "@humanwhocodes/module-importer", + "@humanwhocodes/retry", + "@nodelib/fs.walk", + "ajv", + "chalk", + "cross-spawn", + "debug@4.3.7", + "escape-string-regexp", + "eslint-scope@8.0.2", + "eslint-visitor-keys@4.0.0", + "espree@10.1.0_acorn@8.12.1", + "esquery", + "esutils", + "fast-deep-equal", + "file-entry-cache@8.0.0", + "find-up", + "glob-parent", + "ignore", + "imurmurhash", + "is-glob", + "is-path-inside", + "json-stable-stringify-without-jsonify", + "lodash.merge", + "minimatch@3.1.2", + "natural-compare", + "optionator", + "strip-ansi", + "text-table" + ] + }, + "espree@10.1.0_acorn@8.12.1": { + "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==", + "dependencies": [ + "acorn", + "acorn-jsx", + "eslint-visitor-keys@4.0.0" + ] + }, + "espree@9.6.1_acorn@8.12.1": { + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dependencies": [ + "acorn", + "acorn-jsx", + "eslint-visitor-keys@3.4.3" + ] + }, + "esquery@1.6.0": { + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dependencies": [ + "estraverse" + ] + }, + "esrecurse@4.3.0": { + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dependencies": [ + "estraverse" + ] + }, + "estraverse@5.3.0": { + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + }, + "esutils@2.0.3": { + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "etag@1.8.1": { + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + }, + "express@4.19.2": { + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "dependencies": [ + "accepts", + "array-flatten", + "body-parser", + "content-disposition", + "content-type", + "cookie", + "cookie-signature", + "debug@2.6.9", + "depd", + "encodeurl", + "escape-html", + "etag", + "finalhandler", + "fresh", + "http-errors", + "merge-descriptors", + "methods", + "on-finished", + "parseurl", + "path-to-regexp", + "proxy-addr", + "qs", + "range-parser", + "safe-buffer@5.2.1", + "send", + "serve-static", + "setprototypeof", + "statuses", + "type-is", + "utils-merge", + "vary" + ] + }, + "fast-deep-equal@3.1.3": { + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-json-stable-stringify@2.1.0": { + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "fast-levenshtein@2.0.6": { + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "fastq@1.17.1": { + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dependencies": [ + "reusify" + ] + }, + "file-entry-cache@6.0.1": { + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dependencies": [ + "flat-cache@3.2.0" + ] + }, + "file-entry-cache@8.0.0": { + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dependencies": [ + "flat-cache@4.0.1" + ] + }, + "finalhandler@1.2.0": { + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": [ + "debug@2.6.9", + "encodeurl", + "escape-html", + "on-finished", + "parseurl", + "statuses", + "unpipe" + ] + }, + "find-up@5.0.0": { + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": [ + "locate-path", + "path-exists" + ] + }, + "flat-cache@3.2.0": { + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dependencies": [ + "flatted", + "keyv", + "rimraf" + ] + }, + "flat-cache@4.0.1": { + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dependencies": [ + "flatted", + "keyv" + ] + }, + "flatted@3.3.1": { + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==" + }, + "for-each@0.3.3": { + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": [ + "is-callable" + ] + }, + "forwarded@0.2.0": { + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fresh@0.5.2": { + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + }, + "fs.realpath@1.0.0": { + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind@1.1.2": { + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + }, + "function.prototype.name@1.1.6": { + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dependencies": [ + "call-bind", + "define-properties", + "es-abstract", + "functions-have-names" + ] + }, + "functions-have-names@1.2.3": { + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" + }, + "get-intrinsic@1.2.4": { + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": [ + "es-errors", + "function-bind", + "has-proto", + "has-symbols", + "hasown" + ] + }, + "get-port@7.1.0": { + "integrity": "sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==" + }, + "get-symbol-description@1.0.2": { + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dependencies": [ + "call-bind", + "es-errors", + "get-intrinsic" + ] + }, + "gitignore-parser@0.0.2": { + "integrity": "sha512-X6mpqUv59uWLGD4n3hZ8Cu8KbF2PMWPSFYmxZjdkpm3yOU7hSUYnzTkZI1mcWqchphvqyuz3/BhgBR4E/JtkCg==" + }, + "glob-parent@6.0.2": { + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": [ + "is-glob" + ] + }, + "glob@7.2.3": { + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": [ + "fs.realpath", + "inflight", + "inherits", + "minimatch@3.1.2", + "once", + "path-is-absolute" + ] + }, + "globals@13.24.0": { + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dependencies": [ + "type-fest" + ] + }, + "globals@14.0.0": { + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==" + }, + "globalthis@1.0.4": { + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dependencies": [ + "define-properties", + "gopd" + ] + }, + "gopd@1.0.1": { + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": [ + "get-intrinsic" + ] + }, + "graphemer@1.4.0": { + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" + }, + "has-bigints@1.0.2": { + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" + }, + "has-flag@4.0.0": { + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "has-property-descriptors@1.0.2": { + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": [ + "es-define-property" + ] + }, + "has-proto@1.0.3": { + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==" + }, + "has-symbols@1.0.3": { + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "has-tostringtag@1.0.2": { + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": [ + "has-symbols" + ] + }, + "hasown@2.0.2": { + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": [ + "function-bind" + ] + }, + "http-errors@2.0.0": { + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": [ + "depd", + "inherits", + "setprototypeof", + "statuses", + "toidentifier" + ] + }, + "iconv-lite@0.4.24": { + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": [ + "safer-buffer" + ] + }, + "iconv-lite@0.6.3": { + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": [ + "safer-buffer" + ] + }, + "ignore@5.3.2": { + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==" + }, + "immediate@3.0.6": { + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, + "import-fresh@3.3.0": { + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": [ + "parent-module", + "resolve-from" + ] + }, + "imurmurhash@0.1.4": { + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" + }, + "inflight@1.0.6": { + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": [ + "once", + "wrappy" + ] + }, + "inherits@2.0.4": { + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "internal-slot@1.0.7": { + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dependencies": [ + "es-errors", + "hasown", + "side-channel" + ] + }, + "ipaddr.js@1.9.1": { + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "is-array-buffer@3.0.4": { + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dependencies": [ + "call-bind", + "get-intrinsic" + ] + }, + "is-bigint@1.0.4": { + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dependencies": [ + "has-bigints" + ] + }, + "is-boolean-object@1.1.2": { + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dependencies": [ + "call-bind", + "has-tostringtag" + ] + }, + "is-callable@1.2.7": { + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" + }, + "is-core-module@2.15.1": { + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "dependencies": [ + "hasown" + ] + }, + "is-data-view@1.0.1": { + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dependencies": [ + "is-typed-array" + ] + }, + "is-date-object@1.0.5": { + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dependencies": [ + "has-tostringtag" + ] + }, + "is-docker@3.0.0": { + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==" + }, + "is-extglob@2.1.1": { + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + }, + "is-glob@4.0.3": { + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": [ + "is-extglob" + ] + }, + "is-inside-container@1.0.0": { + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dependencies": [ + "is-docker" + ] + }, + "is-negative-zero@2.0.3": { + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==" + }, + "is-number-object@1.0.7": { + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dependencies": [ + "has-tostringtag" + ] + }, + "is-path-inside@3.0.3": { + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" + }, + "is-regex@1.1.4": { + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dependencies": [ + "call-bind", + "has-tostringtag" + ] + }, + "is-shared-array-buffer@1.0.3": { + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dependencies": [ + "call-bind" + ] + }, + "is-string@1.0.7": { + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dependencies": [ + "has-tostringtag" + ] + }, + "is-symbol@1.0.4": { + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dependencies": [ + "has-symbols" + ] + }, + "is-typed-array@1.1.13": { + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dependencies": [ + "which-typed-array" + ] + }, + "is-weakref@1.0.2": { + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dependencies": [ + "call-bind" + ] + }, + "is-wsl@3.1.0": { + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "dependencies": [ + "is-inside-container" + ] + }, + "isarray@1.0.0": { + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "isarray@2.0.5": { + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "isexe@2.0.0": { + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "isexe@3.1.1": { + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==" + }, + "js-yaml@4.1.0": { + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": [ + "argparse" + ] + }, + "json-buffer@3.0.1": { + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, + "json-schema-traverse@0.4.1": { + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stable-stringify-without-jsonify@1.0.1": { + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + }, + "json5@1.0.2": { + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dependencies": [ + "minimist" + ] + }, + "jszip@3.7.1": { + "integrity": "sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg==", + "dependencies": [ + "lie", + "pako", + "readable-stream", + "set-immediate-shim" + ] + }, + "keyv@4.5.4": { + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dependencies": [ + "json-buffer" + ] + }, + "levn@0.4.1": { + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dependencies": [ + "prelude-ls", + "type-check" + ] + }, + "lie@3.3.0": { + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dependencies": [ + "immediate" + ] + }, + "locate-path@6.0.0": { + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": [ + "p-locate" + ] + }, + "lodash.merge@4.6.2": { + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "media-typer@0.3.0": { + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + }, + "merge-descriptors@1.0.1": { + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "methods@1.1.2": { + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + }, + "mime-db@1.52.0": { + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types@2.1.35": { + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": [ + "mime-db" + ] + }, + "mime@1.6.0": { + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "minimatch@10.0.1": { + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "dependencies": [ + "brace-expansion@2.0.1" + ] + }, + "minimatch@3.1.2": { + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": [ + "brace-expansion@1.1.11" + ] + }, + "minimist@1.2.8": { + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + }, + "ms@2.0.0": { + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "ms@2.1.3": { + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "natural-compare@1.4.0": { + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + }, + "negotiator@0.6.3": { + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "object-inspect@1.13.2": { + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==" + }, + "object-keys@1.1.1": { + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object.assign@4.1.5": { + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dependencies": [ + "call-bind", + "define-properties", + "has-symbols", + "object-keys" + ] + }, + "object.fromentries@2.0.8": { + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dependencies": [ + "call-bind", + "define-properties", + "es-abstract", + "es-object-atoms" + ] + }, + "object.groupby@1.0.3": { + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dependencies": [ + "call-bind", + "define-properties", + "es-abstract" + ] + }, + "object.values@1.2.0": { + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "dependencies": [ + "call-bind", + "define-properties", + "es-object-atoms" + ] + }, + "on-finished@2.4.1": { + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": [ + "ee-first" + ] + }, + "once@1.4.0": { + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": [ + "wrappy" + ] + }, + "open@10.1.0": { + "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", + "dependencies": [ + "default-browser", + "define-lazy-prop", + "is-inside-container", + "is-wsl" + ] + }, + "optionator@0.9.4": { + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dependencies": [ + "deep-is", + "fast-levenshtein", + "levn", + "prelude-ls", + "type-check", + "word-wrap" + ] + }, + "p-limit@3.1.0": { + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": [ + "yocto-queue" + ] + }, + "p-locate@5.0.0": { + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": [ + "p-limit" + ] + }, + "pako@1.0.11": { + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "parent-module@1.0.1": { + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": [ + "callsites" + ] + }, + "parseurl@1.3.3": { + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-exists@4.0.0": { + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "path-is-absolute@1.0.1": { + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-key@3.1.1": { + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "path-parse@1.0.7": { + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-to-regexp@0.1.7": { + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "possible-typed-array-names@1.0.0": { + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==" + }, + "prelude-ls@1.2.1": { + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" + }, + "process-nextick-args@2.0.1": { + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "proxy-addr@2.0.7": { + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": [ + "forwarded", + "ipaddr.js" + ] + }, + "punycode@2.3.1": { + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==" + }, + "qs@6.11.0": { + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": [ + "side-channel" + ] + }, + "queue-microtask@1.2.3": { + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, + "range-parser@1.2.1": { + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body@2.5.2": { + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": [ + "bytes", + "http-errors", + "iconv-lite@0.4.24", + "unpipe" + ] + }, + "readable-stream@2.3.8": { + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": [ + "core-util-is", + "inherits", + "isarray@1.0.0", + "process-nextick-args", + "safe-buffer@5.1.2", + "string_decoder", + "util-deprecate" + ] + }, + "regexp.prototype.flags@1.5.2": { + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dependencies": [ + "call-bind", + "define-properties", + "es-errors", + "set-function-name" + ] + }, + "resolve-from@4.0.0": { + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + }, + "resolve@1.22.8": { + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": [ + "is-core-module", + "path-parse", + "supports-preserve-symlinks-flag" + ] + }, + "reusify@1.0.4": { + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, + "rimraf@3.0.2": { + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": [ + "glob" + ] + }, + "run-applescript@7.0.0": { + "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==" + }, + "run-parallel@1.2.0": { + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dependencies": [ + "queue-microtask" + ] + }, + "safe-array-concat@1.1.2": { + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dependencies": [ + "call-bind", + "get-intrinsic", + "has-symbols", + "isarray@2.0.5" + ] + }, + "safe-buffer@5.1.2": { + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-buffer@5.2.1": { + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safe-regex-test@1.0.3": { + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dependencies": [ + "call-bind", + "es-errors", + "is-regex" + ] + }, + "safer-buffer@2.1.2": { + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "semver@6.3.1": { + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + }, + "send@0.18.0": { + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": [ + "debug@2.6.9", + "depd", + "destroy", + "encodeurl", + "escape-html", + "etag", + "fresh", + "http-errors", + "mime", + "ms@2.1.3", + "on-finished", + "range-parser", + "statuses" + ] + }, + "serve-static@1.15.0": { + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": [ + "encodeurl", + "escape-html", + "parseurl", + "send" + ] + }, + "set-function-length@1.2.2": { + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": [ + "define-data-property", + "es-errors", + "function-bind", + "get-intrinsic", + "gopd", + "has-property-descriptors" + ] + }, + "set-function-name@2.0.2": { + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dependencies": [ + "define-data-property", + "es-errors", + "functions-have-names", + "has-property-descriptors" + ] + }, + "set-immediate-shim@1.0.1": { + "integrity": "sha512-Li5AOqrZWCVA2n5kryzEmqai6bKSIvpz5oUJHPVj6+dsbD3X1ixtsY5tEnsaNpH3pFAHmG8eIHUrtEtohrg+UQ==" + }, + "setprototypeof@1.2.0": { + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "shebang-command@2.0.0": { + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": [ + "shebang-regex" + ] + }, + "shebang-regex@3.0.0": { + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "side-channel@1.0.6": { + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dependencies": [ + "call-bind", + "es-errors", + "get-intrinsic", + "object-inspect" + ] + }, + "statuses@2.0.1": { + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, + "string.prototype.trim@1.2.9": { + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dependencies": [ + "call-bind", + "define-properties", + "es-abstract", + "es-object-atoms" + ] + }, + "string.prototype.trimend@1.0.8": { + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dependencies": [ + "call-bind", + "define-properties", + "es-object-atoms" + ] + }, + "string.prototype.trimstart@1.0.8": { + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dependencies": [ + "call-bind", + "define-properties", + "es-object-atoms" + ] + }, + "string_decoder@1.1.1": { + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": [ + "safe-buffer@5.1.2" + ] + }, + "strip-ansi@6.0.1": { + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": [ + "ansi-regex" + ] + }, + "strip-bom@3.0.0": { + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==" + }, + "strip-json-comments@3.1.1": { + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + }, + "sudo-prompt@9.2.1": { + "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==" + }, + "supports-color@7.2.0": { + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": [ + "has-flag" + ] + }, + "supports-preserve-symlinks-flag@1.0.0": { + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "text-table@0.2.0": { + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "toidentifier@1.0.1": { + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, + "tsconfig-paths@3.15.0": { + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dependencies": [ + "@types/json5", + "json5", + "minimist", + "strip-bom" + ] + }, + "tslib@2.3.1": { + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "type-check@0.4.0": { + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dependencies": [ + "prelude-ls" + ] + }, + "type-fest@0.20.2": { + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + }, + "type-is@1.6.18": { + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": [ + "media-typer", + "mime-types" + ] + }, + "typed-array-buffer@1.0.2": { + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dependencies": [ + "call-bind", + "es-errors", + "is-typed-array" + ] + }, + "typed-array-byte-length@1.0.1": { + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dependencies": [ + "call-bind", + "for-each", + "gopd", + "has-proto", + "is-typed-array" + ] + }, + "typed-array-byte-offset@1.0.2": { + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dependencies": [ + "available-typed-arrays", + "call-bind", + "for-each", + "gopd", + "has-proto", + "is-typed-array" + ] + }, + "typed-array-length@1.0.6": { + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dependencies": [ + "call-bind", + "for-each", + "gopd", + "has-proto", + "is-typed-array", + "possible-typed-array-names" + ] + }, + "unbox-primitive@1.0.2": { + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dependencies": [ + "call-bind", + "has-bigints", + "has-symbols", + "which-boxed-primitive" + ] + }, + "undici@5.28.4": { + "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", + "dependencies": [ + "@fastify/busboy" + ] + }, + "unpipe@1.0.0": { + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, + "uri-js@4.4.1": { + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": [ + "punycode" + ] + }, + "util-deprecate@1.0.2": { + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "utils-merge@1.0.1": { + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + }, + "vary@1.1.2": { + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + }, + "which-boxed-primitive@1.0.2": { + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dependencies": [ + "is-bigint", + "is-boolean-object", + "is-number-object", + "is-string", + "is-symbol" + ] + }, + "which-typed-array@1.1.15": { + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dependencies": [ + "available-typed-arrays", + "call-bind", + "for-each", + "gopd", + "has-tostringtag" + ] + }, + "which@2.0.2": { + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": [ + "isexe@2.0.0" + ] + }, + "which@4.0.0": { + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dependencies": [ + "isexe@3.1.1" + ] + }, + "windmill-client@1.364.0": { + "integrity": "sha512-UjCbBB2IeyMVoDyO16boHEsTus2npVtXyER2pfP0zm7rmp6ko65HA3OXvMzhMVq3hW9RQ5esc3mrkTnb19PIaw==" + }, + "windmill-parser-wasm-csharp@1.437.1": { + "integrity": "sha512-qzB/kUE9JCf1CYFDz+50AI+SUVaZYn3lSgqmJ11Iuibl41AC4EIvfH4zrsOU53lcTOb9b4ZH3D6z9FjCCfqWsw==" + }, + "windmill-parser-wasm-go@1.429.0": { + "integrity": "sha512-M3jeGDqeTyPj9HyyX3msdzMrqIIzlfMfxTMsXS8m7MJp4Cm60qifMxD29Ipxb2B4WdzyGwCSlaBjLsXu0b3c5g==" + }, + "windmill-parser-wasm-php@1.429.0": { + "integrity": "sha512-SGJAtNpfdRZftkGboxWsm/yQDnJBJodwPQUbX2cWk/aoNook6ULesZwsYtBC9WN1VH6TIskLiVPohMmu6jtXmw==" + }, + "windmill-parser-wasm-py@1.477.1": { + "integrity": "sha512-EY3mSMWpqFPzd7fsLg2/hSfQFU8HpW9nplFwm4JHHCDbcTpBzlvzjPJoHAAGO5kMzowAxjqi5ai/mXjeUWuiSg==" + }, + "windmill-parser-wasm-regex@1.439.0": { + "integrity": "sha512-v7vcEOWurGbqvoTdtQ8wauyUYeuQExRCmr7phPtwUwD+1cNbqDrS11kM8p2Na3DXjL9RqGAGjd6uRjNSccZjjQ==" + }, + "windmill-parser-wasm-rust@1.429.0": { + "integrity": "sha512-c8mjpiw8RxoaBDtecb+sKeWM/IOjNr4Y06nHudGu8sMM48MNO1LhgcISLv8wl6Z9zWd7OzQrECJ6RLorpii5Uw==" + }, + "windmill-parser-wasm-ts@1.438.2": { + "integrity": "sha512-PC1KzhJ47Y3fa4XV3uHtUQN52N2WZCA6OxVopwZIZtwaiRS+MY4zhPFUKqe3rc7uoSkzk3qhkIJoggygBBXLCw==" + }, + "windmill-parser-wasm-yaml@1.429.0": { + "integrity": "sha512-elQYkaWOvzB8LiwVV9NbNqrupSmdtRY3mMEl+qmKTJhGLvYrVOxA8zyBtwGK0MGiFhTOO3ZO96LWSlDfBnpN9g==" + }, + "word-wrap@1.2.5": { + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==" + }, + "wrappy@1.0.2": { + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "ws@8.18.0": { + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==" + }, + "yocto-queue@0.1.0": { + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" } }, - "remote": {}, "workspace": { "dependencies": [ - "jsr:@deno/dnt@^0.41.3", + "jsr:@deno/dnt@~0.41.3", "jsr:@std/encoding@^1.0.4", "jsr:@std/fs@^1.0.3", - "jsr:@std/io@^0.224.7", - "jsr:@std/log@^0.224.7", + "jsr:@std/io@~0.224.7", + "jsr:@std/log@~0.224.7", "jsr:@std/net@^1.0.2", "jsr:@std/path@^1.0.4", "jsr:@std/streams@^1.0.4", diff --git a/cli/dnt.ts b/cli/dnt.ts index d711434b88..64d9957499 100644 --- a/cli/dnt.ts +++ b/cli/dnt.ts @@ -13,9 +13,18 @@ await build({ }, ], outDir: "./npm", - shims: { + shims: { // see JS docs for overview and more options deno: true, + // shims to only use in the tests + customDev: [{ + // this is what `timers: "dev"` does internally + package: { + name: "@deno/shim-timers", + version: "~0.1.0", + }, + globalNames: ["setTimeout", "setInterval"], + }], }, scriptModule: false, filterDiagnostic(diagnostic) { @@ -50,12 +59,25 @@ await build({ postBuild() { // steps to run after building and before running the tests // add shebang to npm/esm/main.js + const dirs = [ + "nu", + "ts", + "regex", + "python", + "go", + "php", + "rust", + "yaml", + "csharp", + ]; + for (const l of dirs) { + Deno.copyFileSync( + "wasm/" + l + "/windmill_parser_wasm_bg.wasm", + "npm/esm/wasm/" + l + "/windmill_parser_wasm_bg.wasm" + ); + } Deno.copyFileSync("../LICENSE", "npm/LICENSE"); Deno.copyFileSync("README.md", "npm/README.md"); - Deno.copyFileSync( - "wasm/windmill_parser_wasm_bg.wasm", - "npm/esm/wasm/windmill_parser_wasm_bg.wasm" - ); }, }); diff --git a/cli/gen/core/OpenAPI.ts b/cli/gen/core/OpenAPI.ts index 50969d8252..3aa0d92808 100644 --- a/cli/gen/core/OpenAPI.ts +++ b/cli/gen/core/OpenAPI.ts @@ -54,7 +54,7 @@ export const OpenAPI: OpenAPIConfig = { PASSWORD: undefined, TOKEN: getEnv("WM_TOKEN"), USERNAME: undefined, - VERSION: '1.476.0', + VERSION: '1.477.1', WITH_CREDENTIALS: true, interceptors: { request: new Interceptors(), diff --git a/cli/gen/services.gen.ts b/cli/gen/services.gen.ts index 5e5944d3f4..b3fa22bf66 100644 --- a/cli/gen/services.gen.ts +++ b/cli/gen/services.gen.ts @@ -3,7 +3,7 @@ import type { CancelablePromise } from './core/CancelablePromise.ts'; import { OpenAPI } from './core/OpenAPI.ts'; import { request as __request } from './core/request.ts'; -import type { BackendVersionResponse, BackendUptodateResponse, GetLicenseIdResponse, GetOpenApiYamlResponse, GetAuditLogData, GetAuditLogResponse, ListAuditLogsData, ListAuditLogsResponse, LoginData, LoginResponse, LogoutResponse, GetUserData, GetUserResponse, UpdateUserData, UpdateUserResponse, IsOwnerOfPathData, IsOwnerOfPathResponse, SetPasswordData, SetPasswordResponse, SetPasswordForUserData, SetPasswordForUserResponse, SetLoginTypeForUserData, SetLoginTypeForUserResponse, CreateUserGloballyData, CreateUserGloballyResponse, GlobalUserUpdateData, GlobalUserUpdateResponse, GlobalUsernameInfoData, GlobalUsernameInfoResponse, GlobalUserRenameData, GlobalUserRenameResponse, GlobalUserDeleteData, GlobalUserDeleteResponse, GlobalUsersOverwriteData, GlobalUsersOverwriteResponse, GlobalUsersExportResponse, DeleteUserData, DeleteUserResponse, ListWorkspacesResponse, IsDomainAllowedResponse, ListUserWorkspacesResponse, ListWorkspacesAsSuperAdminData, ListWorkspacesAsSuperAdminResponse, CreateWorkspaceData, CreateWorkspaceResponse, ExistsWorkspaceData, ExistsWorkspaceResponse, ExistsUsernameData, ExistsUsernameResponse, GetGlobalData, GetGlobalResponse, SetGlobalData, SetGlobalResponse, GetLocalResponse, TestSmtpData, TestSmtpResponse, TestCriticalChannelsData, TestCriticalChannelsResponse, GetCriticalAlertsData, GetCriticalAlertsResponse, AcknowledgeCriticalAlertData, AcknowledgeCriticalAlertResponse, AcknowledgeAllCriticalAlertsResponse, TestLicenseKeyData, TestLicenseKeyResponse, TestObjectStorageConfigData, TestObjectStorageConfigResponse, SendStatsResponse, GetLatestKeyRenewalAttemptResponse, RenewLicenseKeyData, RenewLicenseKeyResponse, CreateCustomerPortalSessionData, CreateCustomerPortalSessionResponse, TestMetadataData, TestMetadataResponse, ListGlobalSettingsResponse, GetCurrentEmailResponse, RefreshUserTokenData, RefreshUserTokenResponse, GetTutorialProgressResponse, UpdateTutorialProgressData, UpdateTutorialProgressResponse, LeaveInstanceResponse, GetUsageResponse, GetRunnableResponse, GlobalWhoamiResponse, ListWorkspaceInvitesResponse, WhoamiData, WhoamiResponse, AcceptInviteData, AcceptInviteResponse, DeclineInviteData, DeclineInviteResponse, InviteUserData, InviteUserResponse, AddUserData, AddUserResponse, DeleteInviteData, DeleteInviteResponse, ArchiveWorkspaceData, ArchiveWorkspaceResponse, UnarchiveWorkspaceData, UnarchiveWorkspaceResponse, DeleteWorkspaceData, DeleteWorkspaceResponse, LeaveWorkspaceData, LeaveWorkspaceResponse, GetWorkspaceNameData, GetWorkspaceNameResponse, ChangeWorkspaceNameData, ChangeWorkspaceNameResponse, ChangeWorkspaceIdData, ChangeWorkspaceIdResponse, ChangeWorkspaceColorData, ChangeWorkspaceColorResponse, WhoisData, WhoisResponse, UpdateOperatorSettingsData, UpdateOperatorSettingsResponse, ExistsEmailData, ExistsEmailResponse, ListUsersAsSuperAdminData, ListUsersAsSuperAdminResponse, ListPendingInvitesData, ListPendingInvitesResponse, GetSettingsData, GetSettingsResponse, GetDeployToData, GetDeployToResponse, GetIsPremiumData, GetIsPremiumResponse, GetPremiumInfoData, GetPremiumInfoResponse, SetAutomaticBillingData, SetAutomaticBillingResponse, GetThresholdAlertData, GetThresholdAlertResponse, SetThresholdAlertData, SetThresholdAlertResponse, EditSlackCommandData, EditSlackCommandResponse, EditTeamsCommandData, EditTeamsCommandResponse, ListAvailableTeamsIdsData, ListAvailableTeamsIdsResponse, ListAvailableTeamsChannelsData, ListAvailableTeamsChannelsResponse, ConnectTeamsData, ConnectTeamsResponse, RunSlackMessageTestJobData, RunSlackMessageTestJobResponse, RunTeamsMessageTestJobData, RunTeamsMessageTestJobResponse, EditDeployToData, EditDeployToResponse, EditAutoInviteData, EditAutoInviteResponse, EditWebhookData, EditWebhookResponse, EditCopilotConfigData, EditCopilotConfigResponse, GetCopilotInfoData, GetCopilotInfoResponse, EditErrorHandlerData, EditErrorHandlerResponse, EditLargeFileStorageConfigData, EditLargeFileStorageConfigResponse, EditWorkspaceGitSyncConfigData, EditWorkspaceGitSyncConfigResponse, EditWorkspaceDeployUiSettingsData, EditWorkspaceDeployUiSettingsResponse, EditWorkspaceDefaultAppData, EditWorkspaceDefaultAppResponse, EditDefaultScriptsData, EditDefaultScriptsResponse, GetDefaultScriptsData, GetDefaultScriptsResponse, SetEnvironmentVariableData, SetEnvironmentVariableResponse, GetWorkspaceEncryptionKeyData, GetWorkspaceEncryptionKeyResponse, SetWorkspaceEncryptionKeyData, SetWorkspaceEncryptionKeyResponse, GetWorkspaceDefaultAppData, GetWorkspaceDefaultAppResponse, GetLargeFileStorageConfigData, GetLargeFileStorageConfigResponse, GetWorkspaceUsageData, GetWorkspaceUsageResponse, GetUsedTriggersData, GetUsedTriggersResponse, ListUsersData, ListUsersResponse, ListUsersUsageData, ListUsersUsageResponse, ListUsernamesData, ListUsernamesResponse, UsernameToEmailData, UsernameToEmailResponse, CreateTokenData, CreateTokenResponse, CreateTokenImpersonateData, CreateTokenImpersonateResponse, DeleteTokenData, DeleteTokenResponse, ListTokensData, ListTokensResponse, GetOidcTokenData, GetOidcTokenResponse, CreateVariableData, CreateVariableResponse, EncryptValueData, EncryptValueResponse, DeleteVariableData, DeleteVariableResponse, UpdateVariableData, UpdateVariableResponse, GetVariableData, GetVariableResponse, GetVariableValueData, GetVariableValueResponse, ExistsVariableData, ExistsVariableResponse, ListVariableData, ListVariableResponse, ListContextualVariablesData, ListContextualVariablesResponse, WorkspaceGetCriticalAlertsData, WorkspaceGetCriticalAlertsResponse, WorkspaceAcknowledgeCriticalAlertData, WorkspaceAcknowledgeCriticalAlertResponse, WorkspaceAcknowledgeAllCriticalAlertsData, WorkspaceAcknowledgeAllCriticalAlertsResponse, WorkspaceMuteCriticalAlertsUiData, WorkspaceMuteCriticalAlertsUiResponse, LoginWithOauthData, LoginWithOauthResponse, ConnectSlackCallbackData, ConnectSlackCallbackResponse, ConnectSlackCallbackInstanceData, ConnectSlackCallbackInstanceResponse, ConnectCallbackData, ConnectCallbackResponse, CreateAccountData, CreateAccountResponse, RefreshTokenData, RefreshTokenResponse, DisconnectAccountData, DisconnectAccountResponse, DisconnectSlackData, DisconnectSlackResponse, DisconnectTeamsData, DisconnectTeamsResponse, ListOauthLoginsResponse, ListOauthConnectsResponse, GetOauthConnectData, GetOauthConnectResponse, SyncTeamsResponse, SendMessageToConversationData, SendMessageToConversationResponse, CreateResourceData, CreateResourceResponse, DeleteResourceData, DeleteResourceResponse, UpdateResourceData, UpdateResourceResponse, UpdateResourceValueData, UpdateResourceValueResponse, GetResourceData, GetResourceResponse, GetResourceValueInterpolatedData, GetResourceValueInterpolatedResponse, GetResourceValueData, GetResourceValueResponse, ExistsResourceData, ExistsResourceResponse, ListResourceData, ListResourceResponse, ListSearchResourceData, ListSearchResourceResponse, ListResourceNamesData, ListResourceNamesResponse, CreateResourceTypeData, CreateResourceTypeResponse, FileResourceTypeToFileExtMapData, FileResourceTypeToFileExtMapResponse, DeleteResourceTypeData, DeleteResourceTypeResponse, UpdateResourceTypeData, UpdateResourceTypeResponse, GetResourceTypeData, GetResourceTypeResponse, ExistsResourceTypeData, ExistsResourceTypeResponse, ListResourceTypeData, ListResourceTypeResponse, ListResourceTypeNamesData, ListResourceTypeNamesResponse, QueryResourceTypesData, QueryResourceTypesResponse, ListHubIntegrationsData, ListHubIntegrationsResponse, ListHubFlowsResponse, GetHubFlowByIdData, GetHubFlowByIdResponse, ListHubAppsResponse, GetHubAppByIdData, GetHubAppByIdResponse, GetPublicAppByCustomPathData, GetPublicAppByCustomPathResponse, GetHubScriptContentByPathData, GetHubScriptContentByPathResponse, GetHubScriptByPathData, GetHubScriptByPathResponse, GetTopHubScriptsData, GetTopHubScriptsResponse, QueryHubScriptsData, QueryHubScriptsResponse, ListSearchScriptData, ListSearchScriptResponse, ListScriptsData, ListScriptsResponse, ListScriptPathsData, ListScriptPathsResponse, CreateDraftData, CreateDraftResponse, DeleteDraftData, DeleteDraftResponse, CreateScriptData, CreateScriptResponse, ToggleWorkspaceErrorHandlerForScriptData, ToggleWorkspaceErrorHandlerForScriptResponse, GetCustomTagsData, GetCustomTagsResponse, GeDefaultTagsResponse, IsDefaultTagsPerWorkspaceResponse, ArchiveScriptByPathData, ArchiveScriptByPathResponse, ArchiveScriptByHashData, ArchiveScriptByHashResponse, DeleteScriptByHashData, DeleteScriptByHashResponse, DeleteScriptByPathData, DeleteScriptByPathResponse, GetScriptByPathData, GetScriptByPathResponse, GetTriggersCountOfScriptData, GetTriggersCountOfScriptResponse, ListTokensOfScriptData, ListTokensOfScriptResponse, GetScriptByPathWithDraftData, GetScriptByPathWithDraftResponse, GetScriptHistoryByPathData, GetScriptHistoryByPathResponse, GetScriptLatestVersionData, GetScriptLatestVersionResponse, UpdateScriptHistoryData, UpdateScriptHistoryResponse, RawScriptByPathData, RawScriptByPathResponse, RawScriptByPathTokenedData, RawScriptByPathTokenedResponse, ExistsScriptByPathData, ExistsScriptByPathResponse, GetScriptByHashData, GetScriptByHashResponse, RawScriptByHashData, RawScriptByHashResponse, GetScriptDeploymentStatusData, GetScriptDeploymentStatusResponse, RunScriptByPathData, RunScriptByPathResponse, OpenaiSyncScriptByPathData, OpenaiSyncScriptByPathResponse, RunWaitResultScriptByPathData, RunWaitResultScriptByPathResponse, RunWaitResultScriptByPathGetData, RunWaitResultScriptByPathGetResponse, OpenaiSyncFlowByPathData, OpenaiSyncFlowByPathResponse, RunWaitResultFlowByPathData, RunWaitResultFlowByPathResponse, ResultByIdData, ResultByIdResponse, ListFlowPathsData, ListFlowPathsResponse, ListSearchFlowData, ListSearchFlowResponse, ListFlowsData, ListFlowsResponse, GetFlowHistoryData, GetFlowHistoryResponse, GetFlowLatestVersionData, GetFlowLatestVersionResponse, ListFlowPathsFromWorkspaceRunnableData, ListFlowPathsFromWorkspaceRunnableResponse, GetFlowVersionData, GetFlowVersionResponse, UpdateFlowHistoryData, UpdateFlowHistoryResponse, GetFlowByPathData, GetFlowByPathResponse, GetFlowDeploymentStatusData, GetFlowDeploymentStatusResponse, GetTriggersCountOfFlowData, GetTriggersCountOfFlowResponse, ListTokensOfFlowData, ListTokensOfFlowResponse, ToggleWorkspaceErrorHandlerForFlowData, ToggleWorkspaceErrorHandlerForFlowResponse, GetFlowByPathWithDraftData, GetFlowByPathWithDraftResponse, ExistsFlowByPathData, ExistsFlowByPathResponse, CreateFlowData, CreateFlowResponse, UpdateFlowData, UpdateFlowResponse, ArchiveFlowByPathData, ArchiveFlowByPathResponse, DeleteFlowByPathData, DeleteFlowByPathResponse, ListRawAppsData, ListRawAppsResponse, ExistsRawAppData, ExistsRawAppResponse, GetRawAppDataData, GetRawAppDataResponse, ListSearchAppData, ListSearchAppResponse, ListAppsData, ListAppsResponse, CreateAppData, CreateAppResponse, ExistsAppData, ExistsAppResponse, GetAppByPathData, GetAppByPathResponse, GetAppLiteByPathData, GetAppLiteByPathResponse, GetAppByPathWithDraftData, GetAppByPathWithDraftResponse, GetAppHistoryByPathData, GetAppHistoryByPathResponse, GetAppLatestVersionData, GetAppLatestVersionResponse, UpdateAppHistoryData, UpdateAppHistoryResponse, GetPublicAppBySecretData, GetPublicAppBySecretResponse, GetPublicResourceData, GetPublicResourceResponse, GetPublicSecretOfAppData, GetPublicSecretOfAppResponse, GetAppByVersionData, GetAppByVersionResponse, CreateRawAppData, CreateRawAppResponse, UpdateRawAppData, UpdateRawAppResponse, DeleteRawAppData, DeleteRawAppResponse, DeleteAppData, DeleteAppResponse, UpdateAppData, UpdateAppResponse, CustomPathExistsData, CustomPathExistsResponse, ExecuteComponentData, ExecuteComponentResponse, UploadS3FileFromAppData, UploadS3FileFromAppResponse, DeleteS3FileFromAppData, DeleteS3FileFromAppResponse, RunFlowByPathData, RunFlowByPathResponse, RestartFlowAtStepData, RestartFlowAtStepResponse, RunScriptByHashData, RunScriptByHashResponse, RunScriptPreviewData, RunScriptPreviewResponse, RunCodeWorkflowTaskData, RunCodeWorkflowTaskResponse, RunRawScriptDependenciesData, RunRawScriptDependenciesResponse, RunFlowPreviewData, RunFlowPreviewResponse, ListQueueData, ListQueueResponse, GetQueueCountData, GetQueueCountResponse, GetCompletedCountData, GetCompletedCountResponse, CountCompletedJobsData, CountCompletedJobsResponse, ListFilteredUuidsData, ListFilteredUuidsResponse, CancelSelectionData, CancelSelectionResponse, ListCompletedJobsData, ListCompletedJobsResponse, ListJobsData, ListJobsResponse, GetDbClockResponse, CountJobsByTagData, CountJobsByTagResponse, GetJobData, GetJobResponse, GetRootJobIdData, GetRootJobIdResponse, GetJobLogsData, GetJobLogsResponse, GetJobArgsData, GetJobArgsResponse, GetJobUpdatesData, GetJobUpdatesResponse, GetLogFileFromStoreData, GetLogFileFromStoreResponse, GetFlowDebugInfoData, GetFlowDebugInfoResponse, GetCompletedJobData, GetCompletedJobResponse, GetCompletedJobResultData, GetCompletedJobResultResponse, GetCompletedJobResultMaybeData, GetCompletedJobResultMaybeResponse, DeleteCompletedJobData, DeleteCompletedJobResponse, CancelQueuedJobData, CancelQueuedJobResponse, CancelPersistentQueuedJobsData, CancelPersistentQueuedJobsResponse, ForceCancelQueuedJobData, ForceCancelQueuedJobResponse, CreateJobSignatureData, CreateJobSignatureResponse, GetResumeUrlsData, GetResumeUrlsResponse, GetSlackApprovalPayloadData, GetSlackApprovalPayloadResponse, ResumeSuspendedJobGetData, ResumeSuspendedJobGetResponse, ResumeSuspendedJobPostData, ResumeSuspendedJobPostResponse, SetFlowUserStateData, SetFlowUserStateResponse, GetFlowUserStateData, GetFlowUserStateResponse, ResumeSuspendedFlowAsOwnerData, ResumeSuspendedFlowAsOwnerResponse, CancelSuspendedJobGetData, CancelSuspendedJobGetResponse, CancelSuspendedJobPostData, CancelSuspendedJobPostResponse, GetSuspendedJobFlowData, GetSuspendedJobFlowResponse, PreviewScheduleData, PreviewScheduleResponse, CreateScheduleData, CreateScheduleResponse, UpdateScheduleData, UpdateScheduleResponse, SetScheduleEnabledData, SetScheduleEnabledResponse, DeleteScheduleData, DeleteScheduleResponse, GetScheduleData, GetScheduleResponse, ExistsScheduleData, ExistsScheduleResponse, ListSchedulesData, ListSchedulesResponse, ListSchedulesWithJobsData, ListSchedulesWithJobsResponse, SetDefaultErrorOrRecoveryHandlerData, SetDefaultErrorOrRecoveryHandlerResponse, CreateHttpTriggerData, CreateHttpTriggerResponse, UpdateHttpTriggerData, UpdateHttpTriggerResponse, DeleteHttpTriggerData, DeleteHttpTriggerResponse, GetHttpTriggerData, GetHttpTriggerResponse, ListHttpTriggersData, ListHttpTriggersResponse, ExistsHttpTriggerData, ExistsHttpTriggerResponse, ExistsRouteData, ExistsRouteResponse, CreateWebsocketTriggerData, CreateWebsocketTriggerResponse, UpdateWebsocketTriggerData, UpdateWebsocketTriggerResponse, DeleteWebsocketTriggerData, DeleteWebsocketTriggerResponse, GetWebsocketTriggerData, GetWebsocketTriggerResponse, ListWebsocketTriggersData, ListWebsocketTriggersResponse, ExistsWebsocketTriggerData, ExistsWebsocketTriggerResponse, SetWebsocketTriggerEnabledData, SetWebsocketTriggerEnabledResponse, TestWebsocketConnectionData, TestWebsocketConnectionResponse, CreateKafkaTriggerData, CreateKafkaTriggerResponse, UpdateKafkaTriggerData, UpdateKafkaTriggerResponse, DeleteKafkaTriggerData, DeleteKafkaTriggerResponse, GetKafkaTriggerData, GetKafkaTriggerResponse, ListKafkaTriggersData, ListKafkaTriggersResponse, ExistsKafkaTriggerData, ExistsKafkaTriggerResponse, SetKafkaTriggerEnabledData, SetKafkaTriggerEnabledResponse, TestKafkaConnectionData, TestKafkaConnectionResponse, CreateNatsTriggerData, CreateNatsTriggerResponse, UpdateNatsTriggerData, UpdateNatsTriggerResponse, DeleteNatsTriggerData, DeleteNatsTriggerResponse, GetNatsTriggerData, GetNatsTriggerResponse, ListNatsTriggersData, ListNatsTriggersResponse, ExistsNatsTriggerData, ExistsNatsTriggerResponse, SetNatsTriggerEnabledData, SetNatsTriggerEnabledResponse, TestNatsConnectionData, TestNatsConnectionResponse, CreateSqsTriggerData, CreateSqsTriggerResponse, UpdateSqsTriggerData, UpdateSqsTriggerResponse, DeleteSqsTriggerData, DeleteSqsTriggerResponse, GetSqsTriggerData, GetSqsTriggerResponse, ListSqsTriggersData, ListSqsTriggersResponse, ExistsSqsTriggerData, ExistsSqsTriggerResponse, SetSqsTriggerEnabledData, SetSqsTriggerEnabledResponse, TestSqsConnectionData, TestSqsConnectionResponse, CreateMqttTriggerData, CreateMqttTriggerResponse, UpdateMqttTriggerData, UpdateMqttTriggerResponse, DeleteMqttTriggerData, DeleteMqttTriggerResponse, GetMqttTriggerData, GetMqttTriggerResponse, ListMqttTriggersData, ListMqttTriggersResponse, ExistsMqttTriggerData, ExistsMqttTriggerResponse, SetMqttTriggerEnabledData, SetMqttTriggerEnabledResponse, TestMqttConnectionData, TestMqttConnectionResponse, IsValidPostgresConfigurationData, IsValidPostgresConfigurationResponse, CreateTemplateScriptData, CreateTemplateScriptResponse, GetTemplateScriptData, GetTemplateScriptResponse, ListPostgresReplicationSlotData, ListPostgresReplicationSlotResponse, CreatePostgresReplicationSlotData, CreatePostgresReplicationSlotResponse, DeletePostgresReplicationSlotData, DeletePostgresReplicationSlotResponse, ListPostgresPublicationData, ListPostgresPublicationResponse, GetPostgresPublicationData, GetPostgresPublicationResponse, CreatePostgresPublicationData, CreatePostgresPublicationResponse, UpdatePostgresPublicationData, UpdatePostgresPublicationResponse, DeletePostgresPublicationData, DeletePostgresPublicationResponse, CreatePostgresTriggerData, CreatePostgresTriggerResponse, UpdatePostgresTriggerData, UpdatePostgresTriggerResponse, DeletePostgresTriggerData, DeletePostgresTriggerResponse, GetPostgresTriggerData, GetPostgresTriggerResponse, ListPostgresTriggersData, ListPostgresTriggersResponse, ExistsPostgresTriggerData, ExistsPostgresTriggerResponse, SetPostgresTriggerEnabledData, SetPostgresTriggerEnabledResponse, TestPostgresConnectionData, TestPostgresConnectionResponse, ListInstanceGroupsResponse, GetInstanceGroupData, GetInstanceGroupResponse, CreateInstanceGroupData, CreateInstanceGroupResponse, UpdateInstanceGroupData, UpdateInstanceGroupResponse, DeleteInstanceGroupData, DeleteInstanceGroupResponse, AddUserToInstanceGroupData, AddUserToInstanceGroupResponse, RemoveUserFromInstanceGroupData, RemoveUserFromInstanceGroupResponse, ExportInstanceGroupsResponse, OverwriteInstanceGroupsData, OverwriteInstanceGroupsResponse, ListGroupsData, ListGroupsResponse, ListGroupNamesData, ListGroupNamesResponse, CreateGroupData, CreateGroupResponse, UpdateGroupData, UpdateGroupResponse, DeleteGroupData, DeleteGroupResponse, GetGroupData, GetGroupResponse, AddUserToGroupData, AddUserToGroupResponse, RemoveUserToGroupData, RemoveUserToGroupResponse, ListFoldersData, ListFoldersResponse, ListFolderNamesData, ListFolderNamesResponse, CreateFolderData, CreateFolderResponse, UpdateFolderData, UpdateFolderResponse, DeleteFolderData, DeleteFolderResponse, GetFolderData, GetFolderResponse, ExistsFolderData, ExistsFolderResponse, GetFolderUsageData, GetFolderUsageResponse, AddOwnerToFolderData, AddOwnerToFolderResponse, RemoveOwnerToFolderData, RemoveOwnerToFolderResponse, ListWorkersData, ListWorkersResponse, ExistsWorkerWithTagData, ExistsWorkerWithTagResponse, GetQueueMetricsResponse, GetCountsOfJobsWaitingPerTagResponse, ListWorkerGroupsResponse, GetConfigData, GetConfigResponse, UpdateConfigData, UpdateConfigResponse, DeleteConfigData, DeleteConfigResponse, ListConfigsResponse, ListAutoscalingEventsData, ListAutoscalingEventsResponse, GetGranularAclsData, GetGranularAclsResponse, AddGranularAclsData, AddGranularAclsResponse, RemoveGranularAclsData, RemoveGranularAclsResponse, SetCaptureConfigData, SetCaptureConfigResponse, PingCaptureConfigData, PingCaptureConfigResponse, GetCaptureConfigsData, GetCaptureConfigsResponse, ListCapturesData, ListCapturesResponse, GetCaptureData, GetCaptureResponse, DeleteCaptureData, DeleteCaptureResponse, StarData, StarResponse, UnstarData, UnstarResponse, GetInputHistoryData, GetInputHistoryResponse, GetArgsFromHistoryOrSavedInputData, GetArgsFromHistoryOrSavedInputResponse, ListInputsData, ListInputsResponse, CreateInputData, CreateInputResponse, UpdateInputData, UpdateInputResponse, DeleteInputData, DeleteInputResponse, DuckdbConnectionSettingsData, DuckdbConnectionSettingsResponse, DuckdbConnectionSettingsV2Data, DuckdbConnectionSettingsV2Response, PolarsConnectionSettingsData, PolarsConnectionSettingsResponse, PolarsConnectionSettingsV2Data, PolarsConnectionSettingsV2Response, S3ResourceInfoData, S3ResourceInfoResponse, DatasetStorageTestConnectionData, DatasetStorageTestConnectionResponse, ListStoredFilesData, ListStoredFilesResponse, LoadFileMetadataData, LoadFileMetadataResponse, LoadFilePreviewData, LoadFilePreviewResponse, LoadParquetPreviewData, LoadParquetPreviewResponse, LoadTableRowCountData, LoadTableRowCountResponse, LoadCsvPreviewData, LoadCsvPreviewResponse, DeleteS3FileData, DeleteS3FileResponse, MoveS3FileData, MoveS3FileResponse, FileUploadData, FileUploadResponse, FileDownloadData, FileDownloadResponse, FileDownloadParquetAsCsvData, FileDownloadParquetAsCsvResponse, GetJobMetricsData, GetJobMetricsResponse, SetJobProgressData, SetJobProgressResponse, GetJobProgressData, GetJobProgressResponse, ListLogFilesData, ListLogFilesResponse, GetLogFileData, GetLogFileResponse, ListConcurrencyGroupsResponse, DeleteConcurrencyGroupData, DeleteConcurrencyGroupResponse, GetConcurrencyKeyData, GetConcurrencyKeyResponse, ListExtendedJobsData, ListExtendedJobsResponse, SearchJobsIndexData, SearchJobsIndexResponse, SearchLogsIndexData, SearchLogsIndexResponse, CountSearchLogsIndexData, CountSearchLogsIndexResponse, ClearIndexData, ClearIndexResponse } from './types.gen.ts'; +import type { BackendVersionResponse, BackendUptodateResponse, GetLicenseIdResponse, GetOpenApiYamlResponse, GetAuditLogData, GetAuditLogResponse, ListAuditLogsData, ListAuditLogsResponse, LoginData, LoginResponse, LogoutResponse, GetUserData, GetUserResponse, UpdateUserData, UpdateUserResponse, IsOwnerOfPathData, IsOwnerOfPathResponse, SetPasswordData, SetPasswordResponse, SetPasswordForUserData, SetPasswordForUserResponse, SetLoginTypeForUserData, SetLoginTypeForUserResponse, CreateUserGloballyData, CreateUserGloballyResponse, GlobalUserUpdateData, GlobalUserUpdateResponse, GlobalUsernameInfoData, GlobalUsernameInfoResponse, GlobalUserRenameData, GlobalUserRenameResponse, GlobalUserDeleteData, GlobalUserDeleteResponse, GlobalUsersOverwriteData, GlobalUsersOverwriteResponse, GlobalUsersExportResponse, DeleteUserData, DeleteUserResponse, ListWorkspacesResponse, IsDomainAllowedResponse, ListUserWorkspacesResponse, ListWorkspacesAsSuperAdminData, ListWorkspacesAsSuperAdminResponse, CreateWorkspaceData, CreateWorkspaceResponse, ExistsWorkspaceData, ExistsWorkspaceResponse, ExistsUsernameData, ExistsUsernameResponse, GetGlobalData, GetGlobalResponse, SetGlobalData, SetGlobalResponse, GetLocalResponse, TestSmtpData, TestSmtpResponse, TestCriticalChannelsData, TestCriticalChannelsResponse, GetCriticalAlertsData, GetCriticalAlertsResponse, AcknowledgeCriticalAlertData, AcknowledgeCriticalAlertResponse, AcknowledgeAllCriticalAlertsResponse, TestLicenseKeyData, TestLicenseKeyResponse, TestObjectStorageConfigData, TestObjectStorageConfigResponse, SendStatsResponse, GetLatestKeyRenewalAttemptResponse, RenewLicenseKeyData, RenewLicenseKeyResponse, CreateCustomerPortalSessionData, CreateCustomerPortalSessionResponse, TestMetadataData, TestMetadataResponse, ListGlobalSettingsResponse, GetCurrentEmailResponse, RefreshUserTokenData, RefreshUserTokenResponse, GetTutorialProgressResponse, UpdateTutorialProgressData, UpdateTutorialProgressResponse, LeaveInstanceResponse, GetUsageResponse, GetRunnableResponse, GlobalWhoamiResponse, ListWorkspaceInvitesResponse, WhoamiData, WhoamiResponse, AcceptInviteData, AcceptInviteResponse, DeclineInviteData, DeclineInviteResponse, InviteUserData, InviteUserResponse, AddUserData, AddUserResponse, DeleteInviteData, DeleteInviteResponse, ArchiveWorkspaceData, ArchiveWorkspaceResponse, UnarchiveWorkspaceData, UnarchiveWorkspaceResponse, DeleteWorkspaceData, DeleteWorkspaceResponse, LeaveWorkspaceData, LeaveWorkspaceResponse, GetWorkspaceNameData, GetWorkspaceNameResponse, ChangeWorkspaceNameData, ChangeWorkspaceNameResponse, ChangeWorkspaceIdData, ChangeWorkspaceIdResponse, ChangeWorkspaceColorData, ChangeWorkspaceColorResponse, WhoisData, WhoisResponse, UpdateOperatorSettingsData, UpdateOperatorSettingsResponse, ExistsEmailData, ExistsEmailResponse, ListUsersAsSuperAdminData, ListUsersAsSuperAdminResponse, ListPendingInvitesData, ListPendingInvitesResponse, GetSettingsData, GetSettingsResponse, GetDeployToData, GetDeployToResponse, GetIsPremiumData, GetIsPremiumResponse, GetPremiumInfoData, GetPremiumInfoResponse, SetAutomaticBillingData, SetAutomaticBillingResponse, GetThresholdAlertData, GetThresholdAlertResponse, SetThresholdAlertData, SetThresholdAlertResponse, EditSlackCommandData, EditSlackCommandResponse, EditTeamsCommandData, EditTeamsCommandResponse, ListAvailableTeamsIdsData, ListAvailableTeamsIdsResponse, ListAvailableTeamsChannelsData, ListAvailableTeamsChannelsResponse, ConnectTeamsData, ConnectTeamsResponse, RunSlackMessageTestJobData, RunSlackMessageTestJobResponse, RunTeamsMessageTestJobData, RunTeamsMessageTestJobResponse, EditDeployToData, EditDeployToResponse, EditAutoInviteData, EditAutoInviteResponse, EditWebhookData, EditWebhookResponse, EditCopilotConfigData, EditCopilotConfigResponse, GetCopilotInfoData, GetCopilotInfoResponse, EditErrorHandlerData, EditErrorHandlerResponse, EditLargeFileStorageConfigData, EditLargeFileStorageConfigResponse, EditWorkspaceGitSyncConfigData, EditWorkspaceGitSyncConfigResponse, EditWorkspaceDeployUiSettingsData, EditWorkspaceDeployUiSettingsResponse, EditWorkspaceDefaultAppData, EditWorkspaceDefaultAppResponse, EditDefaultScriptsData, EditDefaultScriptsResponse, GetDefaultScriptsData, GetDefaultScriptsResponse, SetEnvironmentVariableData, SetEnvironmentVariableResponse, GetWorkspaceEncryptionKeyData, GetWorkspaceEncryptionKeyResponse, SetWorkspaceEncryptionKeyData, SetWorkspaceEncryptionKeyResponse, GetWorkspaceDefaultAppData, GetWorkspaceDefaultAppResponse, GetLargeFileStorageConfigData, GetLargeFileStorageConfigResponse, GetWorkspaceUsageData, GetWorkspaceUsageResponse, GetUsedTriggersData, GetUsedTriggersResponse, ListUsersData, ListUsersResponse, ListUsersUsageData, ListUsersUsageResponse, ListUsernamesData, ListUsernamesResponse, UsernameToEmailData, UsernameToEmailResponse, CreateTokenData, CreateTokenResponse, CreateTokenImpersonateData, CreateTokenImpersonateResponse, DeleteTokenData, DeleteTokenResponse, ListTokensData, ListTokensResponse, GetOidcTokenData, GetOidcTokenResponse, CreateVariableData, CreateVariableResponse, EncryptValueData, EncryptValueResponse, DeleteVariableData, DeleteVariableResponse, UpdateVariableData, UpdateVariableResponse, GetVariableData, GetVariableResponse, GetVariableValueData, GetVariableValueResponse, ExistsVariableData, ExistsVariableResponse, ListVariableData, ListVariableResponse, ListContextualVariablesData, ListContextualVariablesResponse, WorkspaceGetCriticalAlertsData, WorkspaceGetCriticalAlertsResponse, WorkspaceAcknowledgeCriticalAlertData, WorkspaceAcknowledgeCriticalAlertResponse, WorkspaceAcknowledgeAllCriticalAlertsData, WorkspaceAcknowledgeAllCriticalAlertsResponse, WorkspaceMuteCriticalAlertsUiData, WorkspaceMuteCriticalAlertsUiResponse, LoginWithOauthData, LoginWithOauthResponse, ConnectSlackCallbackData, ConnectSlackCallbackResponse, ConnectSlackCallbackInstanceData, ConnectSlackCallbackInstanceResponse, ConnectCallbackData, ConnectCallbackResponse, CreateAccountData, CreateAccountResponse, RefreshTokenData, RefreshTokenResponse, DisconnectAccountData, DisconnectAccountResponse, DisconnectSlackData, DisconnectSlackResponse, DisconnectTeamsData, DisconnectTeamsResponse, ListOauthLoginsResponse, ListOauthConnectsResponse, GetOauthConnectData, GetOauthConnectResponse, SyncTeamsResponse, SendMessageToConversationData, SendMessageToConversationResponse, CreateResourceData, CreateResourceResponse, DeleteResourceData, DeleteResourceResponse, UpdateResourceData, UpdateResourceResponse, UpdateResourceValueData, UpdateResourceValueResponse, GetResourceData, GetResourceResponse, GetResourceValueInterpolatedData, GetResourceValueInterpolatedResponse, GetResourceValueData, GetResourceValueResponse, ExistsResourceData, ExistsResourceResponse, ListResourceData, ListResourceResponse, ListSearchResourceData, ListSearchResourceResponse, ListResourceNamesData, ListResourceNamesResponse, CreateResourceTypeData, CreateResourceTypeResponse, FileResourceTypeToFileExtMapData, FileResourceTypeToFileExtMapResponse, DeleteResourceTypeData, DeleteResourceTypeResponse, UpdateResourceTypeData, UpdateResourceTypeResponse, GetResourceTypeData, GetResourceTypeResponse, ExistsResourceTypeData, ExistsResourceTypeResponse, ListResourceTypeData, ListResourceTypeResponse, ListResourceTypeNamesData, ListResourceTypeNamesResponse, QueryResourceTypesData, QueryResourceTypesResponse, ListHubIntegrationsData, ListHubIntegrationsResponse, ListHubFlowsResponse, GetHubFlowByIdData, GetHubFlowByIdResponse, ListHubAppsResponse, GetHubAppByIdData, GetHubAppByIdResponse, GetPublicAppByCustomPathData, GetPublicAppByCustomPathResponse, GetHubScriptContentByPathData, GetHubScriptContentByPathResponse, GetHubScriptByPathData, GetHubScriptByPathResponse, GetTopHubScriptsData, GetTopHubScriptsResponse, QueryHubScriptsData, QueryHubScriptsResponse, ListSearchScriptData, ListSearchScriptResponse, ListScriptsData, ListScriptsResponse, ListScriptPathsData, ListScriptPathsResponse, CreateDraftData, CreateDraftResponse, DeleteDraftData, DeleteDraftResponse, CreateScriptData, CreateScriptResponse, ToggleWorkspaceErrorHandlerForScriptData, ToggleWorkspaceErrorHandlerForScriptResponse, GetCustomTagsData, GetCustomTagsResponse, GeDefaultTagsResponse, IsDefaultTagsPerWorkspaceResponse, ArchiveScriptByPathData, ArchiveScriptByPathResponse, ArchiveScriptByHashData, ArchiveScriptByHashResponse, DeleteScriptByHashData, DeleteScriptByHashResponse, DeleteScriptByPathData, DeleteScriptByPathResponse, GetScriptByPathData, GetScriptByPathResponse, GetTriggersCountOfScriptData, GetTriggersCountOfScriptResponse, ListTokensOfScriptData, ListTokensOfScriptResponse, GetScriptByPathWithDraftData, GetScriptByPathWithDraftResponse, GetScriptHistoryByPathData, GetScriptHistoryByPathResponse, GetScriptLatestVersionData, GetScriptLatestVersionResponse, UpdateScriptHistoryData, UpdateScriptHistoryResponse, RawScriptByPathData, RawScriptByPathResponse, RawScriptByPathTokenedData, RawScriptByPathTokenedResponse, ExistsScriptByPathData, ExistsScriptByPathResponse, GetScriptByHashData, GetScriptByHashResponse, RawScriptByHashData, RawScriptByHashResponse, GetScriptDeploymentStatusData, GetScriptDeploymentStatusResponse, RunScriptByPathData, RunScriptByPathResponse, OpenaiSyncScriptByPathData, OpenaiSyncScriptByPathResponse, RunWaitResultScriptByPathData, RunWaitResultScriptByPathResponse, RunWaitResultScriptByPathGetData, RunWaitResultScriptByPathGetResponse, OpenaiSyncFlowByPathData, OpenaiSyncFlowByPathResponse, RunWaitResultFlowByPathData, RunWaitResultFlowByPathResponse, ResultByIdData, ResultByIdResponse, ListFlowPathsData, ListFlowPathsResponse, ListSearchFlowData, ListSearchFlowResponse, ListFlowsData, ListFlowsResponse, GetFlowHistoryData, GetFlowHistoryResponse, GetFlowLatestVersionData, GetFlowLatestVersionResponse, ListFlowPathsFromWorkspaceRunnableData, ListFlowPathsFromWorkspaceRunnableResponse, GetFlowVersionData, GetFlowVersionResponse, UpdateFlowHistoryData, UpdateFlowHistoryResponse, GetFlowByPathData, GetFlowByPathResponse, GetFlowDeploymentStatusData, GetFlowDeploymentStatusResponse, GetTriggersCountOfFlowData, GetTriggersCountOfFlowResponse, ListTokensOfFlowData, ListTokensOfFlowResponse, ToggleWorkspaceErrorHandlerForFlowData, ToggleWorkspaceErrorHandlerForFlowResponse, GetFlowByPathWithDraftData, GetFlowByPathWithDraftResponse, ExistsFlowByPathData, ExistsFlowByPathResponse, CreateFlowData, CreateFlowResponse, UpdateFlowData, UpdateFlowResponse, ArchiveFlowByPathData, ArchiveFlowByPathResponse, DeleteFlowByPathData, DeleteFlowByPathResponse, ListRawAppsData, ListRawAppsResponse, ExistsRawAppData, ExistsRawAppResponse, GetRawAppDataData, GetRawAppDataResponse, ListSearchAppData, ListSearchAppResponse, ListAppsData, ListAppsResponse, CreateAppData, CreateAppResponse, ExistsAppData, ExistsAppResponse, GetAppByPathData, GetAppByPathResponse, GetAppLiteByPathData, GetAppLiteByPathResponse, GetAppByPathWithDraftData, GetAppByPathWithDraftResponse, GetAppHistoryByPathData, GetAppHistoryByPathResponse, GetAppLatestVersionData, GetAppLatestVersionResponse, UpdateAppHistoryData, UpdateAppHistoryResponse, GetPublicAppBySecretData, GetPublicAppBySecretResponse, GetPublicResourceData, GetPublicResourceResponse, GetPublicSecretOfAppData, GetPublicSecretOfAppResponse, GetAppByVersionData, GetAppByVersionResponse, CreateRawAppData, CreateRawAppResponse, UpdateRawAppData, UpdateRawAppResponse, DeleteRawAppData, DeleteRawAppResponse, DeleteAppData, DeleteAppResponse, UpdateAppData, UpdateAppResponse, CustomPathExistsData, CustomPathExistsResponse, ExecuteComponentData, ExecuteComponentResponse, UploadS3FileFromAppData, UploadS3FileFromAppResponse, DeleteS3FileFromAppData, DeleteS3FileFromAppResponse, RunFlowByPathData, RunFlowByPathResponse, RestartFlowAtStepData, RestartFlowAtStepResponse, RunScriptByHashData, RunScriptByHashResponse, RunScriptPreviewData, RunScriptPreviewResponse, RunCodeWorkflowTaskData, RunCodeWorkflowTaskResponse, RunRawScriptDependenciesData, RunRawScriptDependenciesResponse, RunFlowPreviewData, RunFlowPreviewResponse, ListQueueData, ListQueueResponse, GetQueueCountData, GetQueueCountResponse, GetCompletedCountData, GetCompletedCountResponse, CountCompletedJobsData, CountCompletedJobsResponse, ListFilteredUuidsData, ListFilteredUuidsResponse, CancelSelectionData, CancelSelectionResponse, ListCompletedJobsData, ListCompletedJobsResponse, ListJobsData, ListJobsResponse, GetDbClockResponse, CountJobsByTagData, CountJobsByTagResponse, GetJobData, GetJobResponse, GetRootJobIdData, GetRootJobIdResponse, GetJobLogsData, GetJobLogsResponse, GetJobArgsData, GetJobArgsResponse, GetJobUpdatesData, GetJobUpdatesResponse, GetLogFileFromStoreData, GetLogFileFromStoreResponse, GetFlowDebugInfoData, GetFlowDebugInfoResponse, GetCompletedJobData, GetCompletedJobResponse, GetCompletedJobResultData, GetCompletedJobResultResponse, GetCompletedJobResultMaybeData, GetCompletedJobResultMaybeResponse, DeleteCompletedJobData, DeleteCompletedJobResponse, CancelQueuedJobData, CancelQueuedJobResponse, CancelPersistentQueuedJobsData, CancelPersistentQueuedJobsResponse, ForceCancelQueuedJobData, ForceCancelQueuedJobResponse, CreateJobSignatureData, CreateJobSignatureResponse, GetResumeUrlsData, GetResumeUrlsResponse, GetSlackApprovalPayloadData, GetSlackApprovalPayloadResponse, ResumeSuspendedJobGetData, ResumeSuspendedJobGetResponse, ResumeSuspendedJobPostData, ResumeSuspendedJobPostResponse, SetFlowUserStateData, SetFlowUserStateResponse, GetFlowUserStateData, GetFlowUserStateResponse, ResumeSuspendedFlowAsOwnerData, ResumeSuspendedFlowAsOwnerResponse, CancelSuspendedJobGetData, CancelSuspendedJobGetResponse, CancelSuspendedJobPostData, CancelSuspendedJobPostResponse, GetSuspendedJobFlowData, GetSuspendedJobFlowResponse, PreviewScheduleData, PreviewScheduleResponse, CreateScheduleData, CreateScheduleResponse, UpdateScheduleData, UpdateScheduleResponse, SetScheduleEnabledData, SetScheduleEnabledResponse, DeleteScheduleData, DeleteScheduleResponse, GetScheduleData, GetScheduleResponse, ExistsScheduleData, ExistsScheduleResponse, ListSchedulesData, ListSchedulesResponse, ListSchedulesWithJobsData, ListSchedulesWithJobsResponse, SetDefaultErrorOrRecoveryHandlerData, SetDefaultErrorOrRecoveryHandlerResponse, CreateHttpTriggerData, CreateHttpTriggerResponse, UpdateHttpTriggerData, UpdateHttpTriggerResponse, DeleteHttpTriggerData, DeleteHttpTriggerResponse, GetHttpTriggerData, GetHttpTriggerResponse, ListHttpTriggersData, ListHttpTriggersResponse, ExistsHttpTriggerData, ExistsHttpTriggerResponse, ExistsRouteData, ExistsRouteResponse, CreateWebsocketTriggerData, CreateWebsocketTriggerResponse, UpdateWebsocketTriggerData, UpdateWebsocketTriggerResponse, DeleteWebsocketTriggerData, DeleteWebsocketTriggerResponse, GetWebsocketTriggerData, GetWebsocketTriggerResponse, ListWebsocketTriggersData, ListWebsocketTriggersResponse, ExistsWebsocketTriggerData, ExistsWebsocketTriggerResponse, SetWebsocketTriggerEnabledData, SetWebsocketTriggerEnabledResponse, TestWebsocketConnectionData, TestWebsocketConnectionResponse, CreateKafkaTriggerData, CreateKafkaTriggerResponse, UpdateKafkaTriggerData, UpdateKafkaTriggerResponse, DeleteKafkaTriggerData, DeleteKafkaTriggerResponse, GetKafkaTriggerData, GetKafkaTriggerResponse, ListKafkaTriggersData, ListKafkaTriggersResponse, ExistsKafkaTriggerData, ExistsKafkaTriggerResponse, SetKafkaTriggerEnabledData, SetKafkaTriggerEnabledResponse, TestKafkaConnectionData, TestKafkaConnectionResponse, CreateNatsTriggerData, CreateNatsTriggerResponse, UpdateNatsTriggerData, UpdateNatsTriggerResponse, DeleteNatsTriggerData, DeleteNatsTriggerResponse, GetNatsTriggerData, GetNatsTriggerResponse, ListNatsTriggersData, ListNatsTriggersResponse, ExistsNatsTriggerData, ExistsNatsTriggerResponse, SetNatsTriggerEnabledData, SetNatsTriggerEnabledResponse, TestNatsConnectionData, TestNatsConnectionResponse, CreateSqsTriggerData, CreateSqsTriggerResponse, UpdateSqsTriggerData, UpdateSqsTriggerResponse, DeleteSqsTriggerData, DeleteSqsTriggerResponse, GetSqsTriggerData, GetSqsTriggerResponse, ListSqsTriggersData, ListSqsTriggersResponse, ExistsSqsTriggerData, ExistsSqsTriggerResponse, SetSqsTriggerEnabledData, SetSqsTriggerEnabledResponse, TestSqsConnectionData, TestSqsConnectionResponse, CreateMqttTriggerData, CreateMqttTriggerResponse, UpdateMqttTriggerData, UpdateMqttTriggerResponse, DeleteMqttTriggerData, DeleteMqttTriggerResponse, GetMqttTriggerData, GetMqttTriggerResponse, ListMqttTriggersData, ListMqttTriggersResponse, ExistsMqttTriggerData, ExistsMqttTriggerResponse, SetMqttTriggerEnabledData, SetMqttTriggerEnabledResponse, TestMqttConnectionData, TestMqttConnectionResponse, IsValidPostgresConfigurationData, IsValidPostgresConfigurationResponse, CreateTemplateScriptData, CreateTemplateScriptResponse, GetTemplateScriptData, GetTemplateScriptResponse, ListPostgresReplicationSlotData, ListPostgresReplicationSlotResponse, CreatePostgresReplicationSlotData, CreatePostgresReplicationSlotResponse, DeletePostgresReplicationSlotData, DeletePostgresReplicationSlotResponse, ListPostgresPublicationData, ListPostgresPublicationResponse, GetPostgresPublicationData, GetPostgresPublicationResponse, CreatePostgresPublicationData, CreatePostgresPublicationResponse, UpdatePostgresPublicationData, UpdatePostgresPublicationResponse, DeletePostgresPublicationData, DeletePostgresPublicationResponse, CreatePostgresTriggerData, CreatePostgresTriggerResponse, UpdatePostgresTriggerData, UpdatePostgresTriggerResponse, DeletePostgresTriggerData, DeletePostgresTriggerResponse, GetPostgresTriggerData, GetPostgresTriggerResponse, ListPostgresTriggersData, ListPostgresTriggersResponse, ExistsPostgresTriggerData, ExistsPostgresTriggerResponse, SetPostgresTriggerEnabledData, SetPostgresTriggerEnabledResponse, TestPostgresConnectionData, TestPostgresConnectionResponse, ListInstanceGroupsResponse, GetInstanceGroupData, GetInstanceGroupResponse, CreateInstanceGroupData, CreateInstanceGroupResponse, UpdateInstanceGroupData, UpdateInstanceGroupResponse, DeleteInstanceGroupData, DeleteInstanceGroupResponse, AddUserToInstanceGroupData, AddUserToInstanceGroupResponse, RemoveUserFromInstanceGroupData, RemoveUserFromInstanceGroupResponse, ExportInstanceGroupsResponse, OverwriteInstanceGroupsData, OverwriteInstanceGroupsResponse, ListGroupsData, ListGroupsResponse, ListGroupNamesData, ListGroupNamesResponse, CreateGroupData, CreateGroupResponse, UpdateGroupData, UpdateGroupResponse, DeleteGroupData, DeleteGroupResponse, GetGroupData, GetGroupResponse, AddUserToGroupData, AddUserToGroupResponse, RemoveUserToGroupData, RemoveUserToGroupResponse, ListFoldersData, ListFoldersResponse, ListFolderNamesData, ListFolderNamesResponse, CreateFolderData, CreateFolderResponse, UpdateFolderData, UpdateFolderResponse, DeleteFolderData, DeleteFolderResponse, GetFolderData, GetFolderResponse, ExistsFolderData, ExistsFolderResponse, GetFolderUsageData, GetFolderUsageResponse, AddOwnerToFolderData, AddOwnerToFolderResponse, RemoveOwnerToFolderData, RemoveOwnerToFolderResponse, ListWorkersData, ListWorkersResponse, ExistsWorkerWithTagData, ExistsWorkerWithTagResponse, GetQueueMetricsResponse, GetCountsOfJobsWaitingPerTagResponse, ListWorkerGroupsResponse, GetConfigData, GetConfigResponse, UpdateConfigData, UpdateConfigResponse, DeleteConfigData, DeleteConfigResponse, ListConfigsResponse, ListAutoscalingEventsData, ListAutoscalingEventsResponse, GetGranularAclsData, GetGranularAclsResponse, AddGranularAclsData, AddGranularAclsResponse, RemoveGranularAclsData, RemoveGranularAclsResponse, SetCaptureConfigData, SetCaptureConfigResponse, PingCaptureConfigData, PingCaptureConfigResponse, GetCaptureConfigsData, GetCaptureConfigsResponse, ListCapturesData, ListCapturesResponse, MoveCapturesAndConfigsData, MoveCapturesAndConfigsResponse, GetCaptureData, GetCaptureResponse, DeleteCaptureData, DeleteCaptureResponse, StarData, StarResponse, UnstarData, UnstarResponse, GetInputHistoryData, GetInputHistoryResponse, GetArgsFromHistoryOrSavedInputData, GetArgsFromHistoryOrSavedInputResponse, ListInputsData, ListInputsResponse, CreateInputData, CreateInputResponse, UpdateInputData, UpdateInputResponse, DeleteInputData, DeleteInputResponse, DuckdbConnectionSettingsData, DuckdbConnectionSettingsResponse, DuckdbConnectionSettingsV2Data, DuckdbConnectionSettingsV2Response, PolarsConnectionSettingsData, PolarsConnectionSettingsResponse, PolarsConnectionSettingsV2Data, PolarsConnectionSettingsV2Response, S3ResourceInfoData, S3ResourceInfoResponse, DatasetStorageTestConnectionData, DatasetStorageTestConnectionResponse, ListStoredFilesData, ListStoredFilesResponse, LoadFileMetadataData, LoadFileMetadataResponse, LoadFilePreviewData, LoadFilePreviewResponse, LoadParquetPreviewData, LoadParquetPreviewResponse, LoadTableRowCountData, LoadTableRowCountResponse, LoadCsvPreviewData, LoadCsvPreviewResponse, DeleteS3FileData, DeleteS3FileResponse, MoveS3FileData, MoveS3FileResponse, FileUploadData, FileUploadResponse, FileDownloadData, FileDownloadResponse, FileDownloadParquetAsCsvData, FileDownloadParquetAsCsvResponse, GetJobMetricsData, GetJobMetricsResponse, SetJobProgressData, SetJobProgressResponse, GetJobProgressData, GetJobProgressResponse, ListLogFilesData, ListLogFilesResponse, GetLogFileData, GetLogFileResponse, ListConcurrencyGroupsResponse, DeleteConcurrencyGroupData, DeleteConcurrencyGroupResponse, GetConcurrencyKeyData, GetConcurrencyKeyResponse, ListExtendedJobsData, ListExtendedJobsResponse, SearchJobsIndexData, SearchJobsIndexResponse, SearchLogsIndexData, SearchLogsIndexResponse, CountSearchLogsIndexData, CountSearchLogsIndexResponse, ClearIndexData, ClearIndexResponse } from './types.gen.ts'; /** * get backend version @@ -3015,6 +3015,7 @@ export const deleteScriptByHash = (data: DeleteScriptByHashData): CancelableProm * @param data The data for the request. * @param data.workspace * @param data.path + * @param data.keepCaptures keep captures * @returns string script path * @throws ApiError */ @@ -3024,6 +3025,9 @@ export const deleteScriptByPath = (data: DeleteScriptByPathData): CancelableProm path: { workspace: data.workspace, path: data.path + }, + query: { + keep_captures: data.keepCaptures } }); }; @@ -3850,6 +3854,7 @@ export const archiveFlowByPath = (data: ArchiveFlowByPathData): CancelablePromis * @param data The data for the request. * @param data.workspace * @param data.path + * @param data.keepCaptures keep captures * @returns string flow delete * @throws ApiError */ @@ -3859,6 +3864,9 @@ export const deleteFlowByPath = (data: DeleteFlowByPathData): CancelablePromise< path: { workspace: data.workspace, path: data.path + }, + query: { + keep_captures: data.keepCaptures } }); }; @@ -4612,6 +4620,7 @@ export const runFlowPreview = (data: RunFlowPreviewData): CancelablePromise => { return __request(OpenAPI, { + method: 'POST', + url: '/w/{workspace}/capture/move/{runnable_kind}/{path}', + path: { + workspace: data.workspace, + runnable_kind: data.runnableKind, + path: data.path + }, + body: data.requestBody, + mediaType: 'application/json' +}); }; + /** * get a capture * @param data The data for the request. @@ -7801,6 +7837,7 @@ export const unstar = (data: UnstarData): CancelablePromise => { * @param data.runnableType * @param data.page which page to return (start at 1, default 1) * @param data.perPage number of items to return for a given page (default 30, max 100) + * @param data.args filter on jobs containing those args as a json subset (@> in postgres) * @param data.includePreview * @returns Input Input history for completed jobs * @throws ApiError @@ -7816,6 +7853,7 @@ export const getInputHistory = (data: GetInputHistoryData): CancelablePromise); +export type MoveCapturesAndConfigsData = { + path: string; + /** + * move captures and configs to a new path + */ + requestBody: { + new_path?: string; + }; + runnableKind: 'script' | 'flow'; + workspace: string; +}; + +export type MoveCapturesAndConfigsResponse = (string); + export type GetCaptureData = { id: number; workspace: string; @@ -6913,6 +6960,10 @@ export type UnstarData = { export type UnstarResponse = (unknown); export type GetInputHistoryData = { + /** + * filter on jobs containing those args as a json subset (@> in postgres) + */ + args?: string; includePreview?: boolean; /** * which page to return (start at 1, default 1) diff --git a/cli/metadata.ts b/cli/metadata.ts index ac0dde6bd5..2f5e536595 100644 --- a/cli/metadata.ts +++ b/cli/metadata.ts @@ -12,25 +12,8 @@ import { ScriptMetadata, defaultScriptMetadata, } from "./bootstrap/script_bootstrap.ts"; -import { - instantiate as instantiateWasm, - parse_ansible, - parse_bash, - parse_bigquery, - parse_deno, - parse_go, - parse_graphql, - parse_mssql, - parse_mysql, - parse_php, - parse_powershell, - parse_python, - parse_rust, - parse_csharp, - parse_snowflake, - parse_sql, - parse_oracledb, -} from "./wasm/windmill_parser_wasm.generated.js"; + + import { Workspace } from "./workspace.ts"; import { SchemaProperty } from "./bootstrap/common.ts"; import { ScriptLanguage } from "./script_common.ts"; @@ -312,8 +295,7 @@ export async function updateScriptSchema( path: string ): Promise { // infer schema from script content and update it inplace - await instantiateWasm(); - const result = inferSchema( + const result = await inferSchema( language, scriptContent, metadataContent.schema, @@ -471,80 +453,102 @@ export async function updateFlow( //////////////////////////////////////////////////////////////////////////////////////////// // below functions copied from Windmill's FE inferArgs function. TODO: refactor // //////////////////////////////////////////////////////////////////////////////////////////// -export function inferSchema( +export async function inferSchema( language: ScriptLanguage, content: string, currentSchema: any, path: string -): { +): Promise<{ schema: any; has_preprocessor: boolean | undefined; no_main_func: boolean | undefined; -} { +}> { let inferedSchema: any; if (language === "python3") { + const { parse_python } = await import('./wasm/python/windmill_parser_wasm.js') inferedSchema = JSON.parse(parse_python(content)); } else if (language === "nativets") { + const { parse_deno } = await import('./wasm/ts/windmill_parser_wasm.js') inferedSchema = JSON.parse(parse_deno(content)); } else if (language === "bun") { + const { parse_deno } = await import('./wasm/ts/windmill_parser_wasm.js') inferedSchema = JSON.parse(parse_deno(content)); } else if (language === "deno") { + const { parse_deno } = await import('./wasm/ts/windmill_parser_wasm.js') inferedSchema = JSON.parse(parse_deno(content)); } else if (language === "go") { + const { parse_go } = await import("./wasm/go/windmill_parser_wasm.js"); inferedSchema = JSON.parse(parse_go(content)); } else if (language === "mysql") { + const { parse_mysql } = await import("./wasm/regex/windmill_parser_wasm.js"); + inferedSchema = JSON.parse(parse_mysql(content)); inferedSchema.args = [ { name: "database", typ: { resource: "mysql" } }, ...inferedSchema.args, ]; } else if (language === "bigquery") { + const { parse_bigquery } = await import("./wasm/regex/windmill_parser_wasm.js"); inferedSchema = JSON.parse(parse_bigquery(content)); inferedSchema.args = [ { name: "database", typ: { resource: "bigquery" } }, ...inferedSchema.args, ]; } else if (language === "oracledb") { + const { parse_oracledb } = await import("./wasm/regex/windmill_parser_wasm.js"); inferedSchema = JSON.parse(parse_oracledb(content)); inferedSchema.args = [ { name: "database", typ: { resource: "oracledb" } }, ...inferedSchema.args, ]; } else if (language === "snowflake") { + const { parse_snowflake } = await import("./wasm/regex/windmill_parser_wasm.js"); inferedSchema = JSON.parse(parse_snowflake(content)); inferedSchema.args = [ { name: "database", typ: { resource: "snowflake" } }, ...inferedSchema.args, ]; } else if (language === "mssql") { + const { parse_mssql } = await import("./wasm/regex/windmill_parser_wasm.js"); inferedSchema = JSON.parse(parse_mssql(content)); inferedSchema.args = [ { name: "database", typ: { resource: "ms_sql_server" } }, ...inferedSchema.args, ]; } else if (language === "postgresql") { + const { parse_sql } = await import("./wasm/regex/windmill_parser_wasm.js"); inferedSchema = JSON.parse(parse_sql(content)); inferedSchema.args = [ { name: "database", typ: { resource: "postgresql" } }, ...inferedSchema.args, ]; } else if (language === "graphql") { + const { parse_graphql } = await import("./wasm/regex/windmill_parser_wasm.js"); inferedSchema = JSON.parse(parse_graphql(content)); inferedSchema.args = [ { name: "api", typ: { resource: "graphql" } }, ...inferedSchema.args, ]; } else if (language === "bash") { + const { parse_bash } = await import("./wasm/regex/windmill_parser_wasm.js"); inferedSchema = JSON.parse(parse_bash(content)); } else if (language === "powershell") { + const { parse_powershell } = await import("./wasm/regex/windmill_parser_wasm.js"); inferedSchema = JSON.parse(parse_powershell(content)); } else if (language === "php") { + const { parse_php } = await import("./wasm/php/windmill_parser_wasm.js"); inferedSchema = JSON.parse(parse_php(content)); } else if (language === "rust") { + const { parse_rust } = await import("./wasm/rust/windmill_parser_wasm.js"); inferedSchema = JSON.parse(parse_rust(content)); } else if (language === "csharp") { + const { parse_csharp } = await import("./wasm/csharp/windmill_parser_wasm.js"); inferedSchema = JSON.parse(parse_csharp(content)); + } else if (language === "nu") { + const { parse_nu } = await import("./wasm/nu/windmill_parser_wasm.js"); + inferedSchema = JSON.parse(parse_nu(content)); } else if (language === "ansible") { + const { parse_ansible } = await import("./wasm/yaml/windmill_parser_wasm.js"); inferedSchema = JSON.parse(parse_ansible(content)); } else { throw new Error("Invalid language: " + language); @@ -588,6 +592,7 @@ export function inferSchema( } } + return { schema: currentSchema, has_preprocessor: inferedSchema.has_preprocessor, diff --git a/cli/script.ts b/cli/script.ts index 2a46ad842b..7adbae0837 100644 --- a/cli/script.ts +++ b/cli/script.ts @@ -567,6 +567,8 @@ export function filePathExtensionFromContentType( return ".playbook.yml"; } else if (language === "csharp") { return ".cs"; + } else if (language === "nu") { + return ".nu"; } else { throw new Error("Invalid language: " + language); } @@ -592,6 +594,7 @@ export const exts = [ ".php", ".rs", ".cs", + ".nu", ".playbook.yml", ]; diff --git a/cli/script_common.ts b/cli/script_common.ts index 49fc491803..6fbd96ecf1 100644 --- a/cli/script_common.ts +++ b/cli/script_common.ts @@ -16,6 +16,7 @@ export type ScriptLanguage = | "php" | "rust" | "csharp" + | "nu" | "ansible"; export function inferContentTypeFromFilePath( @@ -60,6 +61,8 @@ export function inferContentTypeFromFilePath( return "csharp"; } else if (contentPath.endsWith(".playbook.yml")) { return "ansible"; + } else if (contentPath.endsWith(".nu")) { + return "nu"; } else { throw new Error( "Invalid language: " + contentPath.substring(contentPath.lastIndexOf(".")) diff --git a/cli/sync.ts b/cli/sync.ts index 622eaae2d2..6832136e06 100644 --- a/cli/sync.ts +++ b/cli/sync.ts @@ -340,6 +340,7 @@ export function newPathAssigner(defaultTs: "bun" | "deno"): PathAssigner { else if (language == "php") ext = "php"; else if (language == "rust") ext = "rs"; else if (language == "csharp") ext = "cs"; + else if (language == "nu") ext = "nu"; else if (language == "ansible") ext = "playbook.yml"; else ext = "no_ext"; @@ -687,6 +688,7 @@ export async function elementsToMap( "rs", "cs", "yml", + "nu", ].includes(path.split(".").pop() ?? "") && !isFileResource(path) ) diff --git a/cli/test.nu b/cli/test.nu new file mode 100755 index 0000000000..aa24760c6e --- /dev/null +++ b/cli/test.nu @@ -0,0 +1,88 @@ +#!/usr/bin/env nu +# NOTE: Not polished yet +# This script supposed to test wasm parsers in cli +# Currently you would need to create local dir in repo root (it is ignored by git) +# In there init windmill workspace +# +# Start instance with languages features on +# Invoke this script from local: ../cli/test.nu test deno + +const languages = [ + "python3", + "nativets", + "bun", + "deno", + "go", + "mysql", + "bigquery", + "oracledb", + "snowflake", + "mssql", + "postgresql", + "graphql", + "bash", + "powershell", + # "php", + "rust", + "csharp", + "nu", + "ansible", +]; + +def main [] { + main test deno; + main build; + main test node; +} + +def 'main test deno' [] { + main clean; + $languages | each { |l| + print $"+ ($l)" + deno run -A ../cli/main.ts script bootstrap $"f/tests/(random uuid)" $l + } + deno run -A ../cli/main.ts script generate-metadata +} + +def 'main test node' [] { + # TODO: Use node + main clean; + $languages | each { |l| + print $"+ ($l)" + node ../cli/npm/esm/main.js script bootstrap $"f/tests/(random uuid)" $l + } + node ../cli/npm/esm/main.js script generate-metadata +} + +def 'main clean' [] { + rm -rf f/tests/* +} + +def 'main build' [] { + ../cli/build.sh +} + +# def main [] { +# main clean; +# $languages | each { |l| +# print $"+ ($l)" +# # deno run -A ../cli/main.ts script bootstrap $"f/tests/(random uuid)" $l +# # +# let cmd = r#' +# import { inferSchema } from '../cli/metadata.ts'; + +# await inferSchema("LANG", "", undefined, "f/tests/NAME)") +# '# +# | str replace "LANG" $l +# | str replace "NAME" (random uuid); + +# deno eval $cmd +# } + +# # deno run -A ../cli/main.ts script generate-metadata +# } + +# def 'main clean' [] { +# rm -rf f/tests/* +# } + diff --git a/cli/types.ts b/cli/types.ts index 62f4f9bf53..4ee23508c1 100644 --- a/cli/types.ts +++ b/cli/types.ts @@ -226,6 +226,7 @@ export function getTypeStrFromPath( parsed.ext == ".php" || parsed.ext == ".rs" || parsed.ext == ".cs" || + parsed.ext == ".nu" || (parsed.ext == ".yml" && parsed.name.split(".").pop() == "playbook") ) { return "script"; diff --git a/cli/wasm/csharp/windmill_parser_wasm.d.ts b/cli/wasm/csharp/windmill_parser_wasm.d.ts new file mode 100644 index 0000000000..5bb156ad9e --- /dev/null +++ b/cli/wasm/csharp/windmill_parser_wasm.d.ts @@ -0,0 +1,3 @@ +/* tslint:disable */ +/* eslint-disable */ +export function parse_csharp(code: string): string; diff --git a/cli/wasm/csharp/windmill_parser_wasm.js b/cli/wasm/csharp/windmill_parser_wasm.js new file mode 100644 index 0000000000..5f0003a020 --- /dev/null +++ b/cli/wasm/csharp/windmill_parser_wasm.js @@ -0,0 +1,121 @@ + + +let WASM_VECTOR_LEN = 0; + +let cachedUint8ArrayMemory0 = null; + +function getUint8ArrayMemory0() { + if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { + cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8ArrayMemory0; +} + +const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } ); + +const encodeString = function (arg, view) { + return cachedTextEncoder.encodeInto(arg, view); +}; + +function passStringToWasm0(arg, malloc, realloc) { + + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8ArrayMemory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7F) break; + mem[ptr + offset] = code; + } + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; + const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len); + const ret = encodeString(arg, view); + + offset += ret.written; + ptr = realloc(ptr, len, offset, 1) >>> 0; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} + +const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } ); + +if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); +} +/** + * @param {string} code + * @returns {string} + */ +export function parse_csharp(code) { + let deferred2_0; + let deferred2_1; + try { + const ptr0 = passStringToWasm0(code, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.parse_csharp(ptr0, len0); + deferred2_0 = ret[0]; + deferred2_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); + } +} + +const imports = { + __wbindgen_placeholder__: { + __wbindgen_init_externref_table: function() { + const table = wasm.__wbindgen_export_0; + const offset = table.grow(4); + table.set(0, undefined); + table.set(offset + 0, undefined); + table.set(offset + 1, null); + table.set(offset + 2, true); + table.set(offset + 3, false); + ; + }, + }, + +}; + +const wasm_url = new URL('windmill_parser_wasm_bg.wasm', import.meta.url); +let wasmCode = ''; +switch (wasm_url.protocol) { + case 'file:': + wasmCode = await Deno.readFile(wasm_url); + break + case 'https:': + case 'http:': + wasmCode = await (await fetch(wasm_url)).arrayBuffer(); + break + default: + throw new Error(`Unsupported protocol: ${wasm_url.protocol}`); +} + +const wasmInstance = (await WebAssembly.instantiate(wasmCode, imports)).instance; +const wasm = wasmInstance.exports; +export const __wasm = wasm; + +wasm.__wbindgen_start(); + diff --git a/cli/wasm/csharp/windmill_parser_wasm_bg.wasm b/cli/wasm/csharp/windmill_parser_wasm_bg.wasm new file mode 100644 index 0000000000000000000000000000000000000000..a628388cf9d27606fa976fe99186c441ecfab83f GIT binary patch literal 3668819 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%0Dj5RK7?Pgt54&Xsw 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%0AhLZ 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 z�H_y9bx+uRE_m{I5EyFKlb|- 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 Q4`RHC)fj8juaT$@}qKA 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 nR}cKEtoZz@`Qi^Ehr`%;ajsw&QIGQy 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

CMn?Ahh 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

mPs#3dSP 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 literal 0 HcmV?d00001 diff --git a/cli/wasm/csharp/windmill_parser_wasm_bg.wasm.d.ts b/cli/wasm/csharp/windmill_parser_wasm_bg.wasm.d.ts new file mode 100644 index 0000000000..2de9fc9f0c --- /dev/null +++ b/cli/wasm/csharp/windmill_parser_wasm_bg.wasm.d.ts @@ -0,0 +1,29 @@ +/* tslint:disable */ +/* eslint-disable */ +export const memory: WebAssembly.Memory; +export const parse_csharp: (a: number, b: number) => [number, number]; +export const abort: () => void; +export const malloc: (a: number) => number; +export const calloc: (a: number, b: number) => number; +export const realloc: (a: number, b: number) => number; +export const free: (a: number) => void; +export const strncmp: (a: number, b: number, c: number) => number; +export const iswspace: (a: number) => number; +export const iswalnum: (a: number) => number; +export const clock: () => bigint; +export const isprint: (a: number) => number; +export const fprintf: (a: number, b: number, c: number) => number; +export const fputs: (a: number, b: number) => number; +export const fputc: (a: number, b: number) => number; +export const fdopen: (a: number, b: number) => number; +export const fclose: (a: number) => number; +export const fwrite: (a: number, b: number, c: number, d: number) => number; +export const vsnprintf: (a: number, b: number, c: number, d: number) => number; +export const clock_gettime: (a: number, b: number) => void; +export const snprintf: () => void; +export const __assert_fail: (a: number, b: number, c: number, d: number) => void; +export const __wbindgen_export_0: WebAssembly.Table; +export const __wbindgen_malloc: (a: number, b: number) => number; +export const __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; +export const __wbindgen_free: (a: number, b: number, c: number) => void; +export const __wbindgen_start: () => void; diff --git a/cli/wasm/go/windmill_parser_wasm.d.ts b/cli/wasm/go/windmill_parser_wasm.d.ts new file mode 100644 index 0000000000..f93ff83c68 --- /dev/null +++ b/cli/wasm/go/windmill_parser_wasm.d.ts @@ -0,0 +1,3 @@ +/* tslint:disable */ +/* eslint-disable */ +export function parse_go(code: string): string; diff --git a/cli/wasm/go/windmill_parser_wasm.js b/cli/wasm/go/windmill_parser_wasm.js new file mode 100644 index 0000000000..ce2eb507ea --- /dev/null +++ b/cli/wasm/go/windmill_parser_wasm.js @@ -0,0 +1,121 @@ + + +let WASM_VECTOR_LEN = 0; + +let cachedUint8ArrayMemory0 = null; + +function getUint8ArrayMemory0() { + if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { + cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8ArrayMemory0; +} + +const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } ); + +const encodeString = function (arg, view) { + return cachedTextEncoder.encodeInto(arg, view); +}; + +function passStringToWasm0(arg, malloc, realloc) { + + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8ArrayMemory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7F) break; + mem[ptr + offset] = code; + } + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; + const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len); + const ret = encodeString(arg, view); + + offset += ret.written; + ptr = realloc(ptr, len, offset, 1) >>> 0; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} + +const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } ); + +if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); +} +/** + * @param {string} code + * @returns {string} + */ +export function parse_go(code) { + let deferred2_0; + let deferred2_1; + try { + const ptr0 = passStringToWasm0(code, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.parse_go(ptr0, len0); + deferred2_0 = ret[0]; + deferred2_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); + } +} + +const imports = { + __wbindgen_placeholder__: { + __wbindgen_init_externref_table: function() { + const table = wasm.__wbindgen_export_0; + const offset = table.grow(4); + table.set(0, undefined); + table.set(offset + 0, undefined); + table.set(offset + 1, null); + table.set(offset + 2, true); + table.set(offset + 3, false); + ; + }, + }, + +}; + +const wasm_url = new URL('windmill_parser_wasm_bg.wasm', import.meta.url); +let wasmCode = ''; +switch (wasm_url.protocol) { + case 'file:': + wasmCode = await Deno.readFile(wasm_url); + break + case 'https:': + case 'http:': + wasmCode = await (await fetch(wasm_url)).arrayBuffer(); + break + default: + throw new Error(`Unsupported protocol: ${wasm_url.protocol}`); +} + +const wasmInstance = (await WebAssembly.instantiate(wasmCode, imports)).instance; +const wasm = wasmInstance.exports; +export const __wasm = wasm; + +wasm.__wbindgen_start(); + diff --git a/cli/wasm/go/windmill_parser_wasm_bg.wasm b/cli/wasm/go/windmill_parser_wasm_bg.wasm new file mode 100644 index 0000000000000000000000000000000000000000..160ed993261e590e0f532a1619f28cee7b3e926d GIT binary patch literal 297631 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 z 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%0D}=q%!qloaxlYNCtS^OKbL$pt$PqxPt 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

NJ6jR&D9 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%0D7yNJk~ONWo;#NpHB0q)oN=(j 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 A{{R30 literal 0 HcmV?d00001 diff --git a/cli/wasm/go/windmill_parser_wasm_bg.wasm.d.ts b/cli/wasm/go/windmill_parser_wasm_bg.wasm.d.ts new file mode 100644 index 0000000000..6b7eed66b0 --- /dev/null +++ b/cli/wasm/go/windmill_parser_wasm_bg.wasm.d.ts @@ -0,0 +1,9 @@ +/* tslint:disable */ +/* eslint-disable */ +export const memory: WebAssembly.Memory; +export const parse_go: (a: number, b: number) => [number, number]; +export const __wbindgen_export_0: WebAssembly.Table; +export const __wbindgen_malloc: (a: number, b: number) => number; +export const __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; +export const __wbindgen_free: (a: number, b: number, c: number) => void; +export const __wbindgen_start: () => void; diff --git a/cli/wasm/nu/windmill_parser_wasm.d.ts b/cli/wasm/nu/windmill_parser_wasm.d.ts new file mode 100644 index 0000000000..c854a7693d --- /dev/null +++ b/cli/wasm/nu/windmill_parser_wasm.d.ts @@ -0,0 +1,3 @@ +/* tslint:disable */ +/* eslint-disable */ +export function parse_nu(code: string): string; diff --git a/cli/wasm/nu/windmill_parser_wasm.js b/cli/wasm/nu/windmill_parser_wasm.js new file mode 100644 index 0000000000..fc00a9ee3e --- /dev/null +++ b/cli/wasm/nu/windmill_parser_wasm.js @@ -0,0 +1,121 @@ + + +let WASM_VECTOR_LEN = 0; + +let cachedUint8ArrayMemory0 = null; + +function getUint8ArrayMemory0() { + if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { + cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8ArrayMemory0; +} + +const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } ); + +const encodeString = function (arg, view) { + return cachedTextEncoder.encodeInto(arg, view); +}; + +function passStringToWasm0(arg, malloc, realloc) { + + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8ArrayMemory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7F) break; + mem[ptr + offset] = code; + } + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; + const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len); + const ret = encodeString(arg, view); + + offset += ret.written; + ptr = realloc(ptr, len, offset, 1) >>> 0; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} + +const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } ); + +if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); +} +/** + * @param {string} code + * @returns {string} + */ +export function parse_nu(code) { + let deferred2_0; + let deferred2_1; + try { + const ptr0 = passStringToWasm0(code, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.parse_nu(ptr0, len0); + deferred2_0 = ret[0]; + deferred2_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); + } +} + +const imports = { + __wbindgen_placeholder__: { + __wbindgen_init_externref_table: function() { + const table = wasm.__wbindgen_export_0; + const offset = table.grow(4); + table.set(0, undefined); + table.set(offset + 0, undefined); + table.set(offset + 1, null); + table.set(offset + 2, true); + table.set(offset + 3, false); + ; + }, + }, + +}; + +const wasm_url = new URL('windmill_parser_wasm_bg.wasm', import.meta.url); +let wasmCode = ''; +switch (wasm_url.protocol) { + case 'file:': + wasmCode = await Deno.readFile(wasm_url); + break + case 'https:': + case 'http:': + wasmCode = await (await fetch(wasm_url)).arrayBuffer(); + break + default: + throw new Error(`Unsupported protocol: ${wasm_url.protocol}`); +} + +const wasmInstance = (await WebAssembly.instantiate(wasmCode, imports)).instance; +const wasm = wasmInstance.exports; +export const __wasm = wasm; + +wasm.__wbindgen_start(); + diff --git a/cli/wasm/nu/windmill_parser_wasm_bg.wasm b/cli/wasm/nu/windmill_parser_wasm_bg.wasm new file mode 100644 index 0000000000000000000000000000000000000000..520acc48c420efca1d7a3d793a9f592a07fcbfc4 GIT binary patch literal 184528 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 z zDM*$CxeU(_Y;U=P=fh7rQqn9qc@Jm^PozPY=+Uz``RJ22xt?}$`v~jYuH~(4vYB-w z2iV{3Cun~84L8cho4@qU`eGeTSl0Om-z+A%(DNH_-i+BBcE)!|M)bom)_C(4-@w@B zZ&cQ7?XA8Ey5H5&PU4&I_07@<*#L^uT(~SPAgpwz!l6ij86(aifzqKOYnbzrgzQ3cr}LM>J|cmH=q(d+TQt^e)tC>N=<)**`_ z#>KWSn{-oarEn33o8U6O4;H{F)up?mKu%rP;wT8i?K%1}*-c3=MA{QSXcSr=K`qf0 z^h4<-m}25$Pt?BLlJ<*v`{lfSGSYSJJ6?r=CQd|tq{APf)l4JUTm(fakAsj?oFSY) zNasV@pPpRoBd z=#EoY3?nH*k!Vn%dKO#Drt`KD_T~vJ@5ti(U0k|hKfvD8W2RP5Pfe1|@B z`+-KFdh^6-_l5(&0vQM2n>fwh8rZIu@&?lHtE^mg5WS5yJP>gD)+x6d+X`j$JGP>e70b__6QkUb0 zM1oN#dsncJKD+`t{|Dug`cfrD1zM976)chepR`DhFJT6uk~~u8+*q?PP!+=Z*uhC~ zbs`no+a`F>5}Ai~5M*hnU{Wc)os_HEppTT%PTlk;O8eNqW;Y1}^N;43&VhGTYUWL+ zRaxiFNeRvvRzRnE1vH7Kc*FSSUrCcx!Hj@X%ks!q((ni z5+y_j^;fgn5Hf=_UN7oILw&e}6sFAW+Jho$nbQY-tl1u1KI>!RP*BUe!u+u0$Y7cYV{@^IKaM4{gDjD|R+NF!Yc$)HM`-~$h@5PQ{B3DF;}I5$S;{`0t8?}XdK(_=*UxJytL zy3O+TpFNW{ix2dR5P0+oK42imCJ}!`RaJ^B(+6Qbd^y5Un)sG>66KG#fA=$IfKuRl z4A~Y*s@bM4sOWzDf;13zXB18C&MO~bvy50P8Uh=zZMtP7G}^8NRQoOlY~1O5>qG!A zhn5SMjv_!OzYQt2&7v&uji76UN#N>Ei{o?3OVAdsb4+3=-{sK>9O4xFxD z$brxnbdwmIA8ZIwjh%R3`_TfVG~#a^S!et&Ce+Mf9M$Oi%kIc2qFO08sW#ATS!={| zMKR9>nU20beRTa+uW|}`tIsj5_U}-Iz{ZQFC73TVGQgydgfnefx$Qh0cGxLC zsvxVup) z*bx)Rg1%7Xrlv@dr$E;kLwOWK;}_J({>GSwV*9dYLF&S4bGzaow4~bu$YjeqVCW9W zr=&Y%mn)Q(Q>AFjB}`|NK5b0@S4efBID=+S`31r)^@}6daap{3o|b1~uUnjgp;^I? zQ^6imcq-V7f*aQeYpY3uA*N<5#fB!rV3q}8Mt?LXrG{l~(5Cq9Hp}J?);TbW1rfu5 z=;d4qQ5T8+vM&M^T*0%5OfW6e#pxag6_UZFx4{a8+(0D_wS+5x1umLV3u89Jh`7Ews*-Ny%m%_43_wTZ0CDwQ*U}*0t>Wwth92$?fX!q%!Law%!3NVClVgXUg zhB*e%U=DF{%J$t-^-4|#ZgUKYej)NhFHWqo2qjXNnSG7EF(VqB!u=DLD$zdni+_fT z2Q0!$#gd&3XjF?;bbmYYbkfFea}c^kyHyJi{?{5q93%K|J%$&RPaO_ln=Q419k%Po zI5IH#ZGEy*Yk-cki_>AJwMJS@eXl4DA@5>i@PefZ^Z&4IPI4D|92|>LxRuAR4FwLk z#IKi(ZdyE^l6H-xCg_NNmJlFz4I-@wkgj7;GM3)C!s~pLdDnnT?i#6nY@NL1-L4tk zm{djxT!(k#A42U#rn#aZcjY0dsX4NOBtH7E>?CN<<<&66XA!ND8zfO!K>}pTeUszf z-(1p^c5oe>8w<K;oc?ZMQv6^+>|tJt$c2r1ZST zl_am7J&)sPK$hof0_FJYC>-XC|9KJ2bjXsX7;vpSK#z>Ho(-cnAr>Yvi&%~y2lhIB zv4DjW`0}j0*#xxJqMKW0R-ho9v5GBMTe~pmB;cu8~^qL zAO5+&`qMx8bmY0Bx3O;|Yw}hpmXtQ&!$=&4yPp!wlJOj_4)5(rH=_4@vLFC8Nur5U zfLH#)`yMPNSR|5MB9o;p{|v{^jh8Vg|G;VwS~4cfVbam0Ol%OfQ>cLwQZ#alU79!n z&4er|6wK>l)ILKVx56-GsbOs!SPdT+r5wTPWf6LQQ8dR!Sc&FpWn(l&AB3?D?ZY^l z_U|7j7L4X_k@I_dCyAPB>hEP#3wSi;==YZCD`P;gl<0R@*9j$+LJ8A)L-5LqMGz%t z=FgrlvWSAgu^7KRfu#r*#C#Vw&*4xs5;toIpqv` zF)R>Kq7^SaKIusWP|j=T1c}Q5we&4G8Aq7Fus)}VzyNi=q&<$lB*wZVxN8Vw+zr;} zxez`@EL-qcY|jt{B=boB2b!EsJ=yH80!L2q!ratj$M*9q<_WUn_|ZOF$(6WD|#Y@Z*!$)2b_L7J&IfaQ3)((Jo> zat=FipOHN0q^uBol&r&i%Z0`YGQC#)((Gu{dQwK!@(fZsRU$bM6wwPOWsH;|7AF*a zvIoLD{~#`(BRb|r@}NhsIt(-=5+MH%X$eRXl&&%`oE-yKBn?U#;ph2+2mp=>)#kSbYBdGP#L=sL!GPFI zLg)zT;M&z=y9lB_eRS>C>G`2quP}UuMh!o_;O_kUruh5FMTc-YGX7GV&vLU%?FqhU zVU6LfU2h^yNhtD4SU01-w@0G~h;V&v>xJG^qQo)1Ot8f`WZAEi(pxj?0HeZCZ9)X> zzZqC|1VWwrGOnlGcQr=Dmw^msjQm7#^~u;7mlcdUu?A5ml>zosI1$HDjY2G1r#vjW|AvKnJd+mBoODbXaa>Zw!t-WxvI>d~ zn5LeniLhJsaO<#*sQ7_-AqiU*6&nySsLUZ@h^55EiO>QVa$v_4qL~=kOZ0VY{jPF!W@XSAK8Q0uPZD)V3fL1B zsunB4y7N!}Akr%m4nD5lwGWEHmlz1t0)!8{a|sq;nh|8FFdtV@jQ9K8%h(<|`$Po3 z_03EN{R8>!q$zik!@ppZJvYm5-s@@6_7iL^2sZ&u@$`M^>7Oh={f#$A**{)>`p~=M z>BpC!{z`iKvE`=^rFQ>l`RQ-mt7o|V!}L^9M=1TG9H{+hdWfD-wSUDEV#D0(dql}9 zP;yTYuy`3q7ePzolz|v)AvbPIXkyizhXUD=!7W=*Y+NLRt6(Er5VD-MpoFVgb=Oo| z$lz*hLCXgjT!qG^E!dI4-h2yoWH9PUo2re@w)VKCQ`unmVzdgxs zFA@XxObRXB}e=2U%!m17s@Dtrq({CNRVINehsXM z3%}+oPr;rHFbbaJQuEM&xeZ2T$?Jpbv;P(4vm5 z4x$`4kas*eCggyq-*QL#@^jUFt1>r=*i_J_+7ZfcMy#L;S)&Cuxr}$~bGgVXj*TnX zosM4ZRtb#o)7{W$EQ3I5cPMqEYl>>4DI@$K>k3Vo!w-N~XPA)}cNe7;T$Cc+;Vt7eH?MiNv zV+WpW2$Q+IG`AI}yI_y1B?SYB ze_cZY0(AzpuKnFNoKXVSL=?qrX7u8vIW1_LReQL7PMQwMdH5o+e5k+yxG z-*nX(lclU+TRJI-v#bu=%TQZ}4hlpjl);4GqtT0YfQvJ0b%n*edNHr$3hOOF<*ao@ zkcGMlL6+-Yxg92H1|3YYm5XsE!w;(xbHCDkQe{!x6-InaC6I!(xubO`g@u_FgR5^9 zyGP&p_4VYo3$Z@>1pmwlg+~(|z1Rmx-EnY*!jrw|&}R_Q_OPM%v=1Ot;Z#7m*drN9a-=5p~`MkUDYab^pqdGXfmUeSTTMgpyZEEUf&YfDQZ>EgXmu1p@!;f8`@yekANo4JBH<#dU3Q%s&Az67QQ7cu z$Xj*x>EA|`Yc4Tnf1laDrjlL%u?C!?UJXiKwLkFAGe!F@{xIM#yc=im!So2>@gRu_ zCtSh6Qt+jzHh|VDN6Tw&YvEqRs#2F8=`H1^^7h@dA*PSo3fsK|dG_kxF1>0?8%6fR zYFIJyRH4~x)BxmI<2Mq+i^_H1q_*FY8VKIe-q@1K=0U`f;u;`uJuxlqxyPrwSYW(u zTuS~tga@$fR(AB>P00JHQ`IXEPF82r-}SP%xqP~YU3YrPb#pkMYQFR&4&(OT+nTlK zmPFIyMTG37br`>zMZhXD-h`oDa=T<0VyL^mec(QFCj9F7e_@cnUg!WLnCM1+eB!NV3eV7h z$q6;5mooNCj^1`B3w{?fXzrd~b}Ojd+}#}V2k3a~&CMZ-r(0}SJ z|M8LfTF(%W6o)tI0T?aL4O%QU?Wxm$*vlnoB!2oHnYL~}R@f8*HQzt6l1qK8;Cm|4 zBJ1&L^%yCd*|%6d!N~UBZyDsGq;v2Wg+~jq^W?|hoI<|1CSZ57`rx$xa;ADtq*R!k zkGQeA`Czk)&;Dk!3*qw|1u&Ia6Qn{8UpLtg;&6wkR`y=A|9WUgqw3Y{$JZ~<OJ>LnW3 zKt3pInlp2`6~cN+^Q_w^mo(>qTWH69)Ln;%G{_?$>wuce#$S|fo0vbYoqTi2%?S$4 zAxZ!rIC0EN&zwfbm{-rV`?l(A6&CY1u33F>a$dF3>?0$Tg2z50FDFD{O;%+_7$;W3 z0h6f>+mdg?>7nb=xAF8+C{T0h&CMmRKIt%DZOF>n=adH~XxYsrFTpp6DBf1Agp>v% zQ5}4KbwAO0ZNW2wco5*EnJf72+M<11$#oX|_z460+PCLl$RH0`h0lkX(EYCKE&uA4 zqwo8k2S3rf_2{X0eCXbvsNB5wO{)hd7ciZyu&#uoV;ouNSK0?`6!q@G@im$QE=Xo$ z%kcPubkXAYT!9m10ny`VhvRekeVC4&Qu}r=HnntbX^e-Kg6CK7)o!tCx(2o~|03Pd zwbH%?dA$!TvAOa-!Xr#6O&XHW5FrrQ7`TZwWPqauD3Cfx)~FEowGl^+6QD*be_p|) zZP}U@k(Cj|>d%9~NYw9;pi4YXO%J_mur+1rfbr}`@b#GLnFEZ z9;sMGKsL)#4v@ba^ImcfK2CS6mn{A5ty^1Mm0{GA~2AL;? z#rb-P15rr1Zh>?GR+L$jvT-!MIse#6YFLtL*J1-%J9d&jOjR|35%|%A7LB2T)3M}f z#7glC2Au|C0D5$v1_WL227ygEM$q(+(fHulNqRt6j5y({J&a19mlL_}MpRP^Gif#m z+s+8Q_u@&Aj5VIM=nzHB=yfuY>#O+1EQwRj19GZbVPdm}4YQ9sT=Li_8e2}u)mm$a+F5x|TMhaZTLpuvZn!fPPP;bb0zI6j2F({=(74K7`gc zhi;xi6!U^$xBwr0%qBzd$Zs&Bp5@K@S>9MZFp=}|5)2X0MdIAa##y_kWUj|im$cd4 z?LnrE)~{WhG!eeDHcikJ(44*L+8{aKAJ(zmEQFHH1&FoHd58wrOegMy3!3vb6$$`( z5(>sZ9ONCh!GTuV4}(tjAYoo4r=LbN&>dDduzt&hfqYkhU>Il(F6|%@@4}aqPA@>% zi*FKvsCay`Un0*pmOXtj$ht_oEBa3D2i{S$$yCl?21j727bk85$us95Ip3*-haw=xR33vBX}7JoR`FW4Jn&&+ zTo47$!d;jhQ_gdEW}2AWEat%CEX)By!?WR%*tw5&m-mC5Q=n|TH^{rLuY^r49r{dBPv}56OCMc!aE~M9fK^%l33UH4l}_%xg&g^F^4ZrEy5SrEzBpl|2FtuybZnq&PDiMd^Y$#f%7KO1~iEQ7Ewz!!I|hp#ZB&EV^Ine_sE z(YwMMApS1E7yfh>_!1?s1-{_J|4rU|z*kjlZR5L~nw%sjAw2>1IRpq0Qb2so;CZN6u^7$ z`+o25{eIs+knBCPr>BpVIzSKtfo4hRedVL9Q;d4ykZR5lS3+GBH65%^j`C8yYI zl}$y|UBW@Gh-9Z+cdYYa+F&Z!noVGfHUHm+txX#m!(XhUPzk~Rn<1kj>K04;=e>M=+u5vSyQ1!MyxAAAugrfg$G zBmRHMT;gnL!b%2YZAC{h0r)=U5jJiMn?Io|iIsIK7Iai29n~eR ztj!SVsLvoTVsO!_U$%hYl)fRP2*Uwhk2D8*J0U$X>xHVSU42-yWXBw?L;#OKWf!x0 z#d$^c(%H-ePC2vuP_&?OFC{1$06)b)+r>=v7iogDqS+UrVz?Pl7oqy$zlK)}_wPwA zFnQ#1_!&Hj5xEG}&q-DQ{Tu-0RTrV6bx>se)2S7dC&@w1Cm=% z9n?)Cad`kProtAX)Kn{tI<`~`o537-c*!}qp)Z3i7V8YkNx;mLY$fFC`9bkngxW19NKZN{;IifXhfqEVsxm96fiZyjA&vT0&|6lB`9r;N*v_DQ zph?tC9Ny`-;=#`uU?`x>gg%%K^O7%96`C5!*Tg=-csf5|rSON$02UG}eh@6%@hBEc zj`J+Mql)rCJb6WFAj^Wpo`}b?`!}MaG=9K<;zNxH!LWitP^8@mNKi0};sOIJ9_?ox zRB1{PXro<3xS1S1Rvmy>ju=+5kpza7tPoB#InMebi#e?^Xb$Z;tED-z$?IQQWi;eM zcbn#owqSmvlQ~+%LNhIkz|XXxu%xAiJGLy{%Jg@JwQi#aLmx*A-ACxJA7A|RKZduf z9~(CV@p$0+@i^eWrmT3-tI~=G%~t3{Ry-w$W7cEu{0Xdh%D4e>sfiU2iqVEvyjBq_ zo|X}Wh3~4SRy<9tcv>$V>Vqa$JQ@UHRU_rWkFw&m?q&1>v)agthfZo@#RFGjVSFq+ z#ER!uRy?=WnpQk4lMStSAo@TH88xke6|a?8@thGWo)b2*i~yEa@GE%9w1Gn{C`V^f zRS502BEp0P3~kIqBO4wenAxaQlb8CJ9s>$O|)@{fTBaXuZ)ctsfeWj=@-kJ(oe6PGF6& z+HzY6jA|I}Q(+aJ4-;G41&E_95g8lX=M39E2Q?E8NU68ag{^Bea9{-scAOo|=CcHL zH$2)}h$w{-4qqwf$6Xa{Jv-Q*pSsKpBBU&am?4cUhDO9NL~JpE)bo zo&9UWG_6S#P4vz(D?x^}P&~N;n7_+mX*95o24k=WbLt`qRwbMv?_FzQz}t&D)oMd+ zCG>5l$ACDAU8EJrT6b(v}95(6-2vQ&Jo z)c`+&`BrDEc;-y2>&!rFwvzbP(JGn+<9Fv-R`Dz=e^#I^z{)~{9j$gl(S%$kYCrQr z@iAhlfmQ&%$yGQO25WFc1hq5aD&`fETbMaB0a|ot7V2$dbr=Sv zF0G~=&I_2*Qn1}{pD-|fh-gdoc9xZmZgsG-t#+KD0NJcS$6lH=kKfR7G!M;ZS94VJ zh!kuWBq_E_2C6N38O#OvF;d8KA;zGsm5pv%t`Yaz^l-Dj6anDuvpNv ziWhJzEBitm5Dto$Eq%f`^9{CR6g3p)Epj)ltnR(cS;HU#7#D)Q1xsv2k>hg+PLU08 z(APuKW(8VNB?&mgUybFq$2&TOa`DD;+pBVQmfNP+u-Pz}qG-G(&SvT0w8NzvXn2Ft zk;5StTUG$&u$XAwG|?sjJ~7}VmPLUJ78C7p>zNp7v9i%fEA%~!2-upl4(l0W;98g- zNV7C$u7yR9mI<^VgxBzLW`fySrXv;*2LW4&#h>jn=tdYe*J7pWVJv4NW{s?bOu3of zx?CN@SywR`gpLN8VT9YxWX!Di4e=!@HV#s)#yJ_z{2G(JffIZqHB*0$kTMjbh+^Yw zX2Nq3ru-U!_+*A+^Q8cRs;SKdAUpnk$he&1l)OR5&o^?RM(AtS!lh7Ij=_hjD;_i} zTA7W5nx9%wm7Q-YyBL!tyG7%qGA6^fZkZ0Vnh`pTJ(fn;@&Qc>^utkfy*p?^9ZJ^$ zS6D#<^4C;%K!uekRgi@x1vqxJOn6L^Lpa-Mpr0N*K;|q6sm;i?!gw38)g@XUrE6u3 z*NW|rKh3D95^)Aj8gRX^ys!lNkPsEXHJT3?_(3b6XpK>dR#Pcc=nil(Z8Y#cV3fWSj*cqae!mkmYSPNii)4&(qs zB2XKVXnZxW%|K~yTto_rt6?>StTQIn5FVt`lxYyl2}qo%Ak45`5N%hnYKS`9)<0YQ z5FVRwH1Iz11q^Gw6_GPB@`VtM*ca88hUy1y^Td#uGzyv|g1nNgY4wtU)gz^?et=^l zcBV*%@QlVFxs=|4n`5c85sCpwK$XV<0s@m(WMkUX@((c`R0`+`83#j+K~ATz|1ZGC zNhCnZBA6S3uKr7-_J?h%0=^h4<|N=d$rpg{gkK2B02t_h3BHEa1AKPA2H>NeRS5?Q z0HV23v;wzQg;ihFfOuVv`p&38| z0P|mg67x(z2{%^ZF2w%mRNkVZZ{|B-iCZ+Fc2uwg@#j2p&_ih_H0h=tyo(U@z=<^<;3W48{+SKgT!9iLoD`Ie zF!Lm!JPtDjlqa6$jY0WWvmC8zikY^Y(Rh|abmduN0!b|EfMg8yP1unKeFczJ*=rRG z3ukuxix|(4hMWLZ073{(AZQ4tDj@@0Yy-T7!HhzNtC5faKWioJ81)M>+6Ebij+ykt z3{MuLXG7@^2>y7&bc4){7>551 zDUdTDBL4yAVd{K>VToXUWBD&ap^qOLD{UZp0W)8}pb7gXXtM@$wTVR$TQHz`v1J-E z>e$!%FFExSbLsy|6a@56BFmiQ3uKw5U;Yn^g3gF~M|B*7ML&!toOv{TewXRM+E{Yl zvHuc25y|d2ak>5rxfh;HsvKq`;;(WY3r9B;j8EoA%L6azZq_Kz|6w?VMP?vQY#@fq zeJl~1d^mMPu|QT^k^yka1Kc)l#n{qcl+rSY!#BK){*}1=-x30wg28qo_`d;kK%A&B z%t$=Af53(rpwdwKYs>}ndU zNf3UE!T=QC@>Aq(w#Xp*g)t7V}O$I8LdKBJ8JcA95Ci!g^+p2Xywr1>4TIQ zTE`$BGY=t)ejFb7VPL`-V23#o3IYsaBV++A6Y$)CiwS8;Jc>Z#7$l~S93~#!lC9Ua z&W;Mo0L&2h#C?@X7Iqwa@BmZbz=OJb0ApEH#9_lthYfeV!v?%|!wwrzyywu>1YUS_ z(lFTpIB6gVKMpiV*_zQ{EhJtVIMj%>paObn#Hrn&IJJpR1UUA};>Kxgo|XgpiJBaSsCSea~Rf|X7H zyTd*b3Gk8d!!rWVjxN^q*^zSvV0kyR0M4Jo(RCVES)NzmLnCnzIT;X{OX*IB@kp53qjDpInh8@o$v11GjWc!HGgK%!K1UmZd$IP zYcXxyvn@Cm3|&iOJyXt`Ig{=RysIn#l;R5yn3X0mUhM|2V{7CdIJCx*MH*p-Hfq8t zh&zvgkuqgVAd1B|?jLn7n1>=kZWh3S1vm|jHscor^j=zk-oNNIY66SO7T|hz)dF=- zd!z;QCj%IR_UQy#5MOv3w^0Mc!t0zGD2*)LKP0*x^I#UDT%4UzjVmXVSPm_cePXbs zcCbfhqp--BsKLP8!+3|sBLp=Y%8LGCh7p`&*rSk{rC~U5fEbR0qbUk*LNG;PTHOFS zpt;zs&__L(gq;B-v+(XNHg3k7s6#hmq!*AP0e_bA`88giHc-$FAg<8@QzP^=?F`w* z$e`#%W5lN>k;h~VONV-XJDgAW#7#jNcyuohw8R7c9&}8~FAvbG2*$DmW*8pS15oCO z)2T_)b@G2^PfN!n2MIl_QIOQIuPwIF=kj`;-s66JUa$MONEPAmf{gJWFp}gkC}$|M z@yZ2Ry}^&)TaK?JD~HvwtvDQPA_xn<4-Ei2<&s+*F@aqOKA1uo#HXhj5Y%)s4tA2gEkBq7EXXJXkO8oXhZ z;K|U~x8}x(KqVh9uT*8+s8H>MoNwSpbs-YZD3kYS3A zI^9x-Huy`7X~0rjO9*VWYqR|x10j;KK#;1?@<1#015SC;4smF6p-9T3Y@8lITGhaS zE|`yNM`hoY9JCbV9XES%C|?XdO5@opWZ^hT52>WF3jh)zDOiA@TB_Jr*}R9@q%vS- z=T`1|%EiOjFj|JlwJkRh5f~~@l<7lTIN=JJYF@WJ6g@>mp+N6h~Dq_=h zO~d~a{BR_(51BmzRrR-z!Dc}z414P_w@^4Bjj{zEj8gOeWPedzup)MNGm?vDjuQ}< zlMt40wC2^3F&v6KBlO7dm_VrLY-1Wu)I*!2L%(U|{%I10ZR6!aABc?5(Z?~JM1uU{ zTp!%R$f*qm*6YKeCVx=~Pem3OijA*HF`6m{8g@v|;p2pG5RVKL%?@&pTH`O+ewGp* zyQt6+@^yeIE+OJL%4Vq)8AqHcig-*&A?(Pgg$wu;^VuZrA$%p5tI|qH(kd=g3iu33U}{GJ=tel@cZkG}TtrfE;J*g#(<0Y7 z>ca4t>M zyTOnumDMw(N|jJ_$Q{5fuk_r&I#1B`fc`+3M39|mR7!#kOn^yDC?`l1fU1!m#aJ$^v3Ay&E%~7?p%^0tI$i`dP@xlk{+OZ^P1Xb_RDSx&^yH9B>ji z$*ICWoUw*E=L@x>xJZ*d>$TJ|7V%icoq-d~9Gun|YO7`j*CVXoi?AM1H@g5&hUf8_ z1>b4Rb@G?sv|Yj#x~Y#tELXXBWm?CD4ffDmZuqr=k6(!nwx;hSeO}pj3X|BAgk+J) zYI#A1Fj=v>V_~2egH5|E74wU0C-dM7=p^V5|KZdxC^S9rX~4r5z{V!I#{P zHn0|Cb}M#DT1Qkzj(E!@C%aK1hW!`}A~hVsakxZKAT7(r(u7A2M65Z0={$(eI@>87 z!iRY}d4g;}9xNc9i*Shuw%oX-;n)y`a>ETL2}Wr;A5k(s{_A8x1!bXj)m@Hu0kZ-~ z6>1KocmS{gN6C`aG8_#~P_4_P;j;d6d1*lHgct+WCC(<$)Vj(V%h_fU-^6PXEx~Mn zbrNI^0}JZLJ?{wmEDdWhmK<z2FELo@x0|Y3j1E>L6Oo|uvDP6VJAp@WE&_z5A0JY zh5`naKL5!-u%UBmpeu;=8k%l;5)-4MxuIVDQ)m9Rsfazpo05`ZXeoM%nUWHP_y6$6 z6G`ueI{`UlQo2)4k4g454EIGC$FM}c_l-&NVTo)IPV_ZH7@5H}b~ru!g{u&lOUbeTN@Qn zB)0&8P#aXshN_OTt(@n&ERsCeL$xeY02dIl7^(!6oy5!8kIT&kBjNbmjOL*Uk=%)3 zkZ?O z&K+tEs6;n~yJ9|cfA~j(cz9gTx!%UH!0;&4a~bjVZKc@iR0}UK0#zE6t{N4_!=MQ- z9G}^=Fh=_u7UmB{hd^>7Md}pWGf+T}z8N4o{u2O?Fvc0YVc@aRF(IruCo2OK(M9D0 zfCzcwxF&HdC{RX*EatC^ixJ?Wg@VbtFZ_cOU+W7O$gos_Apu2$1)G7bnnVds8iadL zCPR}L6$XUL(gYCXr$O>$j;V^H!$05?>MOPfLM8!^L9HJ{hEyNHk}*)vJTX+yJTX+y zJTW8}=CBLo>yNLCgGv-ob%jHby7;M{{bQ(}{bMN1{;5JDbvbP`ZrJCj@Q;RbZveJ1 zrq(lz_3hw%XXpg&AO_X9Bi!KnKJ%O14kV1AgRqXEGmS9xM8Ic>l$+}T!ce3k4AcXJ zp?ZKYR1Xk_A`OZ9>xKX#tuXgp(ZVWxx_%>B1^jVhMFVFW@N(?DKsC3*KBn{`h&d5u zLlSaC$P<1CZve>y+1)`emP4ct1DxD}!%jwiK$YH5By}s1)MOTP!7LB$M|-k0tr%;r zGqg7n5cL7thEl+ifz5G)d-8xEfk1)^d3mQW5m8|_hvI24I#4epf>Qvqm?i8d)_E{` zSh2x*f!htM%%VfTzy&cnG+)q!%RUOv)8^^jU~X!x%COK?vQbC?K|cuhUSTkT@z4p< zm=lL%RfGNz&M2WMG9?%X=a%yRc!z!mt9 zdA;#~?-}Z_(u#3eC=T}G6``P4yh{`UOR+*Qr27}CI4rIS{x0$vYkn${M#9LNfv_aN7nKOEEa^-{u==}L7JggWpFlVwRY9ga zt||y^k?(M-MYSwd>X7=eSVq2MQ!(2j@lZB0zCHr1b|j)cJ6QQhcFb0G7!y_LKRIc_ znpF-N7<6f09w?5L>G5o$z_vM7&yZSmrUhQmMeeJ_hz|crh?HH+w#S0tO)rUR# zu!~Do;W#@{S6^Fx`(Ax>`MV;phk5WkAbH!=SK@2k;61Csd#eWT!3OVv`gglNX{l<7 z4`ed}xt8_sk(9m`;YdKDdH5Y*&TR0Goh*?;a5hQg9i%?|9w`tncGao%Unzzimy+7m za3tlj$U7ve@H<{2V77||l?#8R=n#I7q@-+fd?bjSiX_lkWLK)An?xaOR{}B^E`#z& z7;Po72zudjW@_Asa=0KBMk&Iv|;N@hL;%Mn=K* z>z}U&G&D#l!C<)N|9BHo;eR0^rb~5DPw7n!Xth@k2f($Crf%R~9&`ow$MFoM&8P$y ze!r?iTRc~w;8pr0+)0H61Nt5S5pDgdOBvcW4BZV#HLO=wK{E?PTwOE%eL*+bKuI(dj-_Fam5E@xT>I1RD$d zqB1hz0!J2#gSr`$E(*C&uW+Rrxl$ejM=X=JU}UBMm}rZJw!m4|ZVS|3{ ziKBB2`aE#QDZdM!hmxVaAbGQS{rcK6*490Cg6Cg zGCzfRdS2cKlt3Y+k>Yy7qqRYCE*3}JMscQ$14^EPqrp)e6%_o`usDSiz&;e(n}51j zgv`r0V5lU6e~b7hr#?12gZ6wLU5xWCp~NHeonwbx>Gse{Q>UF1cOG>hcI>I{y5g- z2@)Og;)4i>Yj(kxnx;hHfEqHM4qQP3G(?Kw{4><<5ncypFk&MAjFnhXs3SBoqnsdw znE(L`W)CzH_8DkV*hEOs6>KxwfhM8%u+wK@%;2B^)wVQNHI1fZ6rcs8IBhV12n<#O zh__+?)d2+NDttg8BO}F)|L+wCd~>ujGI?XRm(X=U{6N#uORDd|IpIVkk?v&PZN@yr z!O%K3YvH+35At$vACN$N;c@yZWOr-|s)m07SZB6N*&@`=BjAM(8S_)F2hXN&p#{)|cWg|=pbvxNWnx9b%c>qAS(c1YnT6yBN6O)a?w%QJbR$}Qye&8p{ z^>rYCK9eK;c|OVUEt~i9$y&yp zL9)PcKFDoF4mu(zP@*X$Qg{%;L2UX~P>G5_#r*F;1tuFp1^X;edIT!j_P}wJa@1gD zb5RLd&?_L7w1xdv>wi|j&y*H70~|LZ2e+N9-w+|`N!nyY_Q16Thl}}f;#9V=SLY@$ zZ1;n;HWbUvDOg?F86W9EtitQK^1!8M4WA$&t8hIa8W$kBtgQHkLm1E!&Etg^#bS(|KHwM!~J$V7F8#fAqmB68@b^`Ob1aXlB;5{7T zn(BrLzP1|o=GcGWooe6KY_Ft)(OwX!-gxYKg;cvIDq$;6{0|a~Oekze!6j0r4g#y^ zXr^4PNq#T10Ypw@Ot^E(H+AhMzvV#`TKhh9(D>jEol43cMG?LkS3X%p8Z_ph5X+t< zyhwXGyznqPno4zxk)^MO^-!0$RRu^T(Y zM1i{oD*_!gr9M(=o{H16f;9RBD>jDG=Cml&xYT5ApkjxJj04HY2i1TLcZHmTGGd)@ z$I{6i>i+Sp1(%?~X2UfRZw|_(A|EgG8vNR6W z0ox5wa}8SswjW%F?HNi2#6yb>1P^%iK+yv`2c)NdQWahXV1_7oh}Z`S0u|Zvo?IpG z20Y+h5)qXhsEYE}PykW@-#2_QJtARU`LC3Q`R`A}P@{xwlpuU9p<`m*4Cvu$g0Xgl z$C|=S!?9MGZ5b5f11AhvYdFI2t%55f*fA7G(UC_@|0it(A7l48KPW_-yqgYi>i$zv z4>ksXU**hjhz3HsfZBw%=YSS8P>g`Z2bCZK)(>WNe{#2dK==XTY8(hFCzcAzq7+b4 ztcguZX_%cu1RJ{S2$3Sn&x8vENkJH2g%LeLDX0(l+O#d;DF~@>QCR-m?7f%5B)qC@ zEej_UQ5D!OQ%T(zi4uWcjf=#DGJ!yLc^TY=f)cz;4IdK@v2|GAaI$a0X(KFUp(bDF0Qwuq6Mr7@2l`GJf|$WCYh3KD6N7bV#w9d&?{Luh$Ktn zd<%iQ5mG{yFPH#l!eAoqD07^Z5lmd$>!7C2ptM~et9(fkz7zTB#Tg9PQ?@EW9L^`}+{ZVXA}RC3KPMk_1p-95O>foB+lH2`%nOVw2av zG0>)BRK$=d3KIYkrX4!Vyg1PFlM<{vJFBL+j=l$ ziu*9J)yHZc32X)v-!hyDa#T9@I*mkGwtP7hH9&?Lj0d_pK!vF5=CRJaT1?F#(C1Xl z88AEcsUkSlq#ZPgWOsONE=OD!Q34VFodp3B4QDOp7Y`l&59XIC^DE2-Z0EcHkVOai zn=k@ovyM}rH|Co$93UHL{!%@36<1~+2^-cbM_Xblu-hamT1A3v-K>>_Ij@0Y=&(J6 zwSp<^4CaOzR`sYA!HUI*s3G9=j>TdjV6hh#||A3$lU}-db@Hlb*eY#?*B=x6EP4X0T z(uBqw)o!>kOASE>I9#f$ppe5cCcMWT?IpA@=^A#(Lw%$Uiigkj9Rg=4alm1_Luhmk z+#jfU!zL!GzffrCTei&MZ-ah`Hr~M+z>dkx;&otH-(ho5H(oWa_&hY2%9-I?AuSHZcxgQ5tYj%40P& z`oQ22syk{<0sY2yB{}UAq#Mol--KrHR6F3H@UyhcgAK=QwP43mJR=Ab!r1^d9$5h$ zrF!gnz>#%uhRaw7n+fjM`UPyT>phDwySn4b|m81(*Wf6~0d7UA21N6}8#CYm^OK zTM*I6yJDIH#X(&faKCG&tVTMR*SPY~yK^^c*~+mGhkd~b4dHg0R-$1_gtpfQfc%aih8!Tne<&qG z&A5tijcn0yjZ}Pb(>2m;utv5(%YaBAU2?TCX?|GHRfbR*xNr$xdzHn89($D)(@n^x z(f?6SblGzHb17nB;%Cw^k9QbgLFL++A6~PqO!Sa{@KK0EbW7csZQ=M}4cE6By-vL* zXkKlZv+$~20P*GQXadG2M|$Yq>o-Ev;BO7j3_Y}*0f)b}Y(R$*4b$A{_06+upM3r5 zT|a-Sot;4jqStR%-tqh`-)`OV%$&0`qT6y}*(pC?zxeZg&mUe?WhY$t$(Dz2`Rw+G zx*%P<2I)4x`NQvfuUq@-Tj3Iq-MZ}cuRgo>p%pB#CF%f+hbH<^v>HU48_Dort>b%W z+3uI@9>^>0zF0aj;{coJOx6T0#IN?i!)jk|rH%IUqodqkj7Mg<|H9~GM*Q?T)ki$| zK}ReLk?3_hP8j|5anWhWh}jgn^J!?1uzv&;88kZ{jY?GQM~{GrU>5xG`tgxIMxtdZ z5mS0F25c&amKiZ_@IbWR`8^yVSyVi-G{ajcTY3`OAbrwQ+^U_Cp0Ib4?!XD+mc7v^ zT>$0vTE6Yj<_~Y)esem{Hqd%~{@j~4fAagbg}2OsSSGmC>z;+1e_im{7h6{#ib)P$ z`}OaSJ$23IBb3}!lKLT6N$N+ONu-`1_P%}H>kqxKFJGltdi^V#c0Rpw!`1cmthsyb zceg&W<;Cahdgg!k;-hnS{jvS;l0*u5ckMMd{dw@=w{cbkTe55CkFUJ`>VYRVOG~(D z1EL|!EF7}H5GIL)&X!PU`PCaS3jTZ*+AzOisP0-j6oq^kDkGfi@G}jQZC>(HgCdqc zV~4!RBzUKaUcbwZKTS8e84zcbXl75DmO%_QW~X9>(K;-4z)Cz&C6^QfJdFXK223y% z|5$dTrEK7@7X4nS(Mla|!IKyua$-e+0}Sd$w}D3SKqpy*inu$qyL!(LLd{!h^yEKF z4>s$lK_2CK7$F^pt%3k72O=^G!JoL9W9_SboqF2-Ku)DcE(oLvPCrf*z zAxMFa1a4;cr(!Cn8YPhK5AcpHyh6$9QWha#A-B2F79W@f^P%Lk0 z4U#b0$zyljwfK?8Qc6q=Bs&!P=^ECKQHXZ{H|T~gavTu`Y%ie+>@&D^R!T+pWXN&y z00unthCpiptHh}eb$Ir&a3+CD%ML1(!3%oIjiF?PS#LmZ1u_mKb&6iZb_=klC)D#w z&rD=kuo*NJn_45tAX;O7xtm`S8h#;zO!O6KIR##_M;wP`K@vp+O7T((vzd+U8k80y z%3)%`LwZ^PD`y|Gh_`Ge4z}{=;S6)A1hdgXIr&aD%_56znsuN~KQQqPIDUCRE*Rg&s-g$4LjQ0yG*rbzwh%xDF@UgZKg1xPjfCII$H*0XW6r z(HrtL9z7u(;8BD#qSf(R+1%gD^YyWvWDqxf0@Z^!U9JMe3i~`rA#waln&oL{rUqI= zZk}VcwxA*?FVHkxh9akw#z4n{U!1BBJsv*#&&1_RmWD)uIJ6k|M^frFM8O^duvgtfpM{L<5fByI0+1CDgs=ItaSWQJ+vr#S!t9y?W|BVOQw`aCQNN+ zN~zBjTY+jY8?o~kC{7b^3<9dZa(oOV3iQ&UNE_Z7f`d+qXb2AZ3|#lHGmv0)f&vXsaYs21rPKc46dyh;x=i{X=V}t zrj{eEZlw@l((8=!Knp}DP}#k1A-z@$bb5@ALStCAf;$*_LV+%46)Xf!nsGY*k-Rtuj;Q1u zqOs{;Vu=sPt6M${Fo{-<2C2cmS%bT+fvZFoPBILu4g)S?4A^sl%SLDf9TdEfUvUPG zq%^`Q4Wz`#!FDU@C-+A}+R1zpf%QxhdP51dn9tv9Q&>9B)KYn>A&%45tG3uWfHpw) zP|xy^o34%d6}TM+77tPFPz#4a6C*n8A?!FFwzm=D5ej$y45bO@91p-`9q@%GH|D#E zj7HDUUh;C$VgyD(*tVsG-d~F8O+6RfFu2DaQTt!`;t;BUO%EP!GtoBK%t+azb2JCc z$!B1Quv-QvH-u)%N92UQIBaWH+s$$`WnBhQN4nX9b$mrxSZ$Hqt{dUbN@OI(&yT1aC|WZX_c4V^en?3Un4TU zIF)P)8m_7FrEQJl%am$-k+RYFY9V`k;h&80WkNN+dj0q!PlNH5G%~IR8?uG;1y42R zhUyZ>*-O7u_z{{I9DL`AWuYjJu}cUsW*I0Z~Fl!2L!R5F_52Q}pK(Sk}Wz(b! zmuszDTVyVQFr(?p zjK-{-y__wiK{9DT=0G_^ZvnXCfhkjH|8gq)Is16fJt-i!Yl7l?L$kS#*;yh}Tnnvw za$}eV04X_b?TkF_#AL=eHyJ$1ShPT#mDEwNpIymbrA^62bX=oo`fB+hlYR(GR^Nsc|cNM zKofw01@qW$>4ZE8N}fiBAg-LS^Ve2~Jh;{Xh|JT9xWF>Hz6UIfLI$$1&Qw$eQ!r!% z4m4YUk!1_uHr=2FkhP=*%-f)L@HZ!}-R1;r2m^#Xn}cWXW5g*cTOctUc02$s4kKGi zP;r1cID`Z^DMA8V9TNimfMAjkZ6oVR+b7BdLITC$$;6d}JASb;g!lmgK}p(0kiwx* z(ibf(JyJ=UTu^VkqG4V_Di_*N89p!~*#2w^o?5Pra27&)0R>q?c?SYW5srW%Vg%Dd z`{`g076%k5HnNhUAM#yR*2o$xl$W%N>C#}HR!eJqlchEOcoHScab#&la}0EWMjS<{ z&;?g$|FL7*6dCXI`lS}}fr?O^kRvAQS`ph;S3lZGf9&tV~bf8v+E2%k>Q!Eo{kRPHe zjc*bGQ9%lfL_p;rRfcP`S`}jlg3}7}U_-Ee5SE~WM(sp5G?k!mA|h4UrsshgNUA!@ zQqbE_R>hw>FzHFif|Rl+3s3Qs#Z%4a*u)wT~ozyZ@g|eZ=K0sA<1g#J~1|t0tQ;A)66IU3Nsnbu0<}COL@eFDK z0=J$49DoD;zBGY_z+ddu(ot}l(sRHaN*dN__u>RTaBwI>pEZd8VV^JQ3myAZ&uybU zdv2Q($Wv1BfE-1*om<&mfSBm~GVWg%;)OPvB6vd^BUe%o(V?wrXY_-*NgyLiwSx;c za&|OOs%i2OI-ijtKbEG@mq+8^K)YhSYZ+l#G^c94p9{F0&|1TUUPvW&|jhZ99?)nQVPUdYS5#G8;7fbR&c4} zz$;fjqk^|8!6_MogEBGq@y!zejfMw2Co+QK8>j|P_OiHzwsEGJAhuYcM8OMPk-fIF zD2R1zBRCsj5pe*9<*5kGJWE}Q1DiRr(%%6)y?||y@H(n<60qw@WJa#fEYS^~1_j9> zAS!G!EXRN_46__>z#y$x?q-~V;4h?9P#q9h>;Xpq04$7yArSEeQMC;RPf!f!gi}Dl zNlD7UVk#=weG7U$0bG3wv|hJ7lz-4oyQ!G*XnYVum52%nMm0uZaDeflnj8Ah5cU_K zB`ARq218L1Okf6d2hhaT$ZAY@r?-p=W!nUH3gUsZ2;&H_5O9`D+}A*0(L*0P&w7Iz z%f)B-BS?DbLAcH6&%fPf)XP>UC}NvH-(cXom7t{41VA)m*2Iwt26hp0IW%z4IZ_FP z$flqKPJJ?ij07H_gFs!*bUJvxA;jG>UI`ccsWe?#3Mf(N?gBS|9fv)KR|eD>%@ISnUd;IdxPyEs9KntaozC~*7$nXv9D}eB0^uG*4lOyJCp8F}+;6c~ z3@SGqXG7zv-N5vu7FThz!67TCnIlW5;FCGs)5{kFj|GLC&6!}HAcld}3c;*L9!Dy- zeTcX@2J9OR(fDWpXPJs=)IljYKoI13;hTB~4Gh*sEqYaKetv#Iey9Ax{G$BM`NjDq z`K9??3i1mI3OW@O78Dh9E+{T2DJU)I(kZ`FL8nfg3Of~b>fEWgQ%R@NPF)J~3wgpw zVPR2W=fdK`lETu$E=Bo81x1~T3X6)0Iu{iel@yg0b?KbnxuA2W&V`+eI(P0|+_|K4 zY3DA*`Najror(*Ki;6oJ7Z;Zlmlk&^$uB7==~Pl!QdH8pq`0J{q_m_KXU(b{HL0u$ z(fB{MY}}}+6Klthsu^LwR!tZ?t){kmLS^l^iB+R&M^{x%oH(JTcJ%bxvYN4@YRhUT zOe(7`tErk=J*KQ|(x?d&Yo<&bJH4`|Y+~7%+N#mz{99R8HEwEUMP=3Hl@mveE}J;H zx@vM+b?t<*nu@aNHMOIvM~tezv_@VkF6S$ME2~DJxXKa8Ifm_-TwR8IW6El3s;cwG zS4}F*tC?Dvms>rxrgrM&yjrvi$tG0RS$NoapHu^sna@M zS~)du;)Kz8%*JO;^%!|)Wc8@(>3KD^VP(Q~R zvtP!TZQ>a7_kXZ4CmdVN(Rgf$Z(*E^!8`FV?th_Ow>N1QnsCCgSw=tpTR-DQO{^)at)5z@|1bY&p)VI>!7McX@+W*yd-y3QpKGBtOSsm?5I=}3 zWAS?s#MR$c)0WNGwVu7=w7Oew*R+p+c51KO+3lsOL-Si9&D`(STzye!QpayGQT3MP zFOL1DwDOzVR=)q!@27rY4ocPZ9=GIr@7Ql1DNTyYJ5bx|>z{YN?b++t{QkPvH>Axe zTw%6p`Ncra`I))5Uv$meFI3V_tdT9h%dtAN&tKM|YQ@MLW7S7FE&lwdqjuCPzUSD;;v@RU#d=hrBrE3Q zlGU-Jy5yyP+$BHr<1>D2@$tZ(MfaW4V${b&zAqm&bWqjDL+{=&>RfH-sPoF+yze~i z{lNL!NB0eTNTzZ@i_&YMq=0*!J*1FrH8_{09Bg&f!U!%)RhvC&-<_Bm1TI*(shQ}3U==m)R z9QjcWvkf+}S`NciiVw)-EcF<;8VIiaZdPU*TYGByKOjzAuaC4e*91dz=+Gq$HgEzp z+MQ-N_1lc}gc!YzCoNjnbIg473{BLt^wR)&1F9d7o~IY0`-b5}zuOxg{ab=f2XVyt zi&zHrPxM=ynu%UIvQ3BnAnFJ?HDi#YZ*+lUhF%=k4n2)B3sA0GKgG;)>Yg6p;)}e1 znZwXWn1%yj(eK8Y*hvCgH4d?E(|MW>5D^_r2RavPoaTlm-z2v-5|(vsf1mVI%$@1~eCf~Ej)F93uWY?@TguVNtM~r7OTvTp zZg}DFW0xQM<wKiUgcm>Fx&5D)mOeiCNN)*uJ9X<@`*&@hS8-&3 zgr9x=?ew<2_iefQ$WRI2`f}^%cHCR>w`E6$OL*Rcqi1DJT=T)RN5)F{m-k1+3>&xl zfp?BflyI9L{_)}8e*5Id?~c?;`02W153gGL#1m0RXG-|GGiFY7ju?GS>!b4|JS6|6 zqLIfoynO1>MG`)@&9gTyx_aQP7aqM?!q3lcH#zI_-}l!ZT`J)vPk;9Gz0dDovE=A- z3Ew=ccEQdO5B>Jg(KQm@dDp5Xf1BL@^9yx^-y3*+2Y1?y+4Ge*31H33p^=J>37;UJ1v(qFr_9 ziEECGId(w8U!}+2G}iOkhS|rymhfu}23L7s+py@4V?Rkar!4K0VJT0&`S)Xok7=O~ zmtw(k_FTH-m;;BlGO*F*e{k2qgU86*@MrXzEniJrYYKm(Y4f}{|2D15sdHOsnez4T zN$!_t?6_@Xsg@<-$-}>#v7^)MB}1s3z|Z))FIF!vee0b`T9JhN1n*2~({|9k3$*SM zZu{rvT?O}#`R0DDw}e-%-M*-_?89}>YXc)YS5ODxy#rq;amUy>F^x4)XrXT(_%CyiYnLPI)@Up~Scna$+iiF}UL(pGZNxhKSUD1$ z%`y}9BqPO0i^+60_q4>4T<)ka9yK4s{?whuo5n8RJKo*KyT<$aN6wFp&m9MiZ>{eg zzZrix{?vVKyY(12XvsbI+&kmCzukKOk(gRsa^CrK9)9G} z=R1FtaLu)g?{UP$#wWBZDC*j$Z~rp}4jNmwaMATko_y&ao43BYd-#)2Wn{WNxUC|k zxJ%bn5AAu+TXMsVtK3oDdW@T} zRcoK!u-O&uOKRTr)IMjgSozxP%iL+{!PY%a{rv0ij&0fMuv)cllU-Qawci;71`j#+ zykQp(zhvZ?vT+qP(`L!bOM)|;rlX@d&eZdA>#l5W7Q|&b zvb-&v9h|)#vF+;~c4axT9NC_t=z(UDZ*GYui_q^qbD;3p_^i(JlIUqUu&$66_Nl<%((6)fMGR z%*=75)IHOE>=0i+Z&cqt8T~v%V*0zI>Yfb7M!EV%H8)T1Ut-3h)-LX-xy5PjZf5gy z^|($kSKT#kYINP^g#*UK%**#DM=iO_dFAPMKGSvn)+@WX+dGE4+C=q@%62xJyRK{9 z){Dx{baZjY_ax@r_M2zk?sif4e?GS`PH*mtb$I43y4F$Qj4{1#|B{h)f4JtZA8@+2 zwtL+#Q8k{)Nqw(K^dRxe4^9Hwcx$55O;Or65CwDZ{9md?AE#td7 z^|^1fuiM?hq0jxO?$>q$98nJAs`%amPO00}-K9Iub!HS9b7ONHV}0jE)jd+$JSNBC zbsMp+x;wAh15<2_dAVbR%jeMJe2!A|H`|lrFnY`#>T7OBIZNG{F0Z@pk9jUIrB0{I zWw>1)w>Lg2Gdj(e9^;So#X0n4yJn)$onI7FZKQ0+t zHt)u}?tXd4&Y1XiUAy(^fBr?oFM$^F`WqiYmMt&uKk(W2G4Xx+k1ea4_xOevUVP`> z?|-=J>g$%Tc;Uq@+jhSHLBHFde|_tYo&5(6I{$)8MqImi$zxAG_2Nrgx4j#moO03d zUw%D$tZvej5BJBmtgOmxK4RAFM;<-vxeduFEn4l{;GhdHa(m+ZZS%hUuCl7+lv8{4 zx#7kkmrmXO@*8jNdGGV1$24n1@XGy;D|>q~9Ip7eYhvqGJ6n3@W}0ap-I3=ga=1<1 z?Q+LQ4US82pX)XqnNeQTW4cXVVdirz->4i1ki#s9&T*u>qRqNB z_>@;r_mii)8E5u@P}9MA<+1owPhNaSGY}Vut6Su_^3LSwqy;xS^T3cBv8mp=7lO6E zy4~q>{m#0Ny@&2GOT2T3C)PdfsoR&-&5UxDdir{NuG;7p=7o+6ymeQlW=17@2RP~$ zx>hgur8o-ibIg6ejoasR)~)c*{n@Qs?OphKy`%00GsBFF$uHR15n z|Cn*5V~R(29^JWf$+*1AsU0Ves;()k?wFqo3r23fWSfXg&?#?B^J^CY#%u7KhTm}b zktX5inuN(-G5wgTNs~rZjvYC3WUghMQ#N)&HT3@zDlfI5Rd+qpZmjCYMicDo6s6AFqa6n2_WTr{De zQ|W}730IU&EuC6WJhiaX)Z(J4h?~l|afO}66&D3YZbo zR@Y3Zse{M1 zq1B^}H3`scKc=d(rq=3aW#_bm&Bd}hSf@>`tQj?~%qp8!TUK3ZVQ;+H?e@En5QOYLxfJTJ!YApDNOZw-D!8=gTmv-;xoLj3l^ zZ!LcLGXT$#_^rn8hzkdH?V8gryGQpn?R(}nB`uOXqH<0~Fa^J<_|2U-@v=#|?2r1H z!GUWsCg|(7XVHi^+go?u(dZ{F>5>SUjw>|Bu_&7hnI)6U%Mw6~ z{l?gHR$Oy_zehLRdFb8r1%uul_h9Jhd-r!)l>f=%=}GPt2`$goJO1AK2fA_upGc&&Iy7K;_Z+`f2#4Tf|e>~?%(sSFdKKRS`ZRe!Lf7x;F z9k<2*7PGtO3+sJlo915DfBdG_nSYz|Vd3pJO#V{8tHXWs@0yo<+Do(BeYE1oz+Fk_ zeSXiQWE-L;XYllpKER;5K@C(1JYk8@s*0^qO$CoZW{qHM| zUUFgDIm_C0u3DE>H2>aBUmZQOU*ZR8-`;TOg622eGiUs@WxKohN3>hFzWG1?9B^Bw zm8;%q^-J30&t7oxW1Vk3Wz9t`pS}Ex&57BgKc3b0lGV4J*MGpDH(hhLKj!Z7FYkGI z^`Y-$ulVh$2X9I5k@9TUEAHEH(S_By9sf43chakU{>r0|EWU1Gue;6oKHi%i zTk-4O$Im!0?cuxsEX{D-7kcTdn`Zr7c~!@AAIsa8WUjyT(rc%V-8^jR`IonCGco?H zuOHm=!GcMXe%jjlQ1mGuWqi=;tG>zZ7Z(1bv_TaP6vZ9(&`pZ8v?_;^|#yT=8vl_p|3O?iuy=2Zzr5o4@MMA5vV~_fOH@SvB+L zs<`)u9d6rfw{P4Rh0m@0verKM!uHWplLwBxOyfGu~z5CvN z=bZ~Cz54#^AD{PNVRGV(xqB~89aX|8Xkw{P|4%HaNevuge4xr-k7c*(vu=lb3(xb^Um z^ga`RIhbB^U}e!MD}U;JBrfTm^L`uhNp|xg7vFZy#pSoX=O2Ck_0O0ejQT3~(BNDA zFaDfsJNpgXFzllD_pKqJq;012-2UbZcix?x_QmTJeLgHLF1g%2;pihN2``0```$n1rSpaj ztB$?xu|t_VE?xcR+)RD{^kzR#Nm!hn^5EC!hIS+u%^9`#hL>XZ%ulF1{k+bzvaB*= z+vnpCELz^Yb(d+s<~OhVQlI#Y)%@KjQ|A4V^ZSqM?s%@K)u^*l*8G;x<=4}*hYTD( zVrc33q(f^iY>}Ju_A^tXXU#cnAU&g|FJu3SIgfrf7NAaBmeoa({G(!xh?9P7eCv1Nn-ld zbKmsUz5j!=D)x?f@15!YdDr+W6Sd8Qb|3ikr)57Uq<6Ud8~x!sCcGE_ROYXL|Mi2! z4OdY_xX^emO^)92P zUw(K~&x^iG9(s;pO`kIA^Nzp2JpT2h3lioJzWa{FPmF(X=0%s)CY^Ut^S4%<@o|qE zt+S6LZTV$i@0lsFE$>f1*7K~Duk

9IFnPB`P$3BQir@kn%h<*>nn*2lHz*8STp zgZEt5edQ0+Yfinvm-_O{Ka{*b-TTVbKW*F8spl!pKIrwui@$7I^-$HbzI&b;x4p%u zcRl-Bhn+(LZEl%7JLjBbsaN*DW%9Mv52Zi7uT9zawSRAR_tXXHar37Bx+t%Q=ksf> zZkck)vKiIIH;#yEbGz&7drQ*xA4t3PqThO^y)&<`^ZPkDi37eoef6VTwU7NJ&Nmm` z(aL}NzEk@QSbph_&$HfHfBKTQ(p-DTXl>BFby_8A&K^SS8vXWzOc>E@-kE!ydMHsiLu-HFHIS6qJCy8XMWC*>wjU-aQ= z$5x*G`;9+7KJDk{Ux;74_Q+dDPtDwv`Snv52FHxe+_P|OuTF*Q^px*MBt7xOlbD=W z-L-hr1^Su`{<-gl%^eaRFuROMas0Al&87zqr|(K=e$~>B1J+Eqr26^0GGFO;TCbF) zpDx^e?an=*;^8h?H+jP^%c*>G+XxjtZB8~&VDs(_MRCDBWAWZYt+%-+r1p)eX3yX;n18h zsZn!Zy*aS!-DO+aX1!AM+Lg^N-!X0I&Sze{w8}T>w7}YumcLKwxbMN6Uu${6+F5I=UnmQeW&(V^GCDjZ}VP0nES%9e>}ak(~;@Fw%ncd<1*{Tf^o%v zByT#h?WVM8&4;I_zt;BYOa5G~zdCVh;>ZItXFTE^^0(BNH(YxE_ZR!`Sa$Q4b-li7 z@l);1rs)8%`M%EUX!~J-|&-euC=|Pa)Z(}%M8F49ZmC;^;viC!(GkK z_eLW{MBa9a?yre|d{fQcahcsQegT0Vla=o3ML%aM``Aj~V(q6W;V*Jiwq#8vYiz_R zi@uvqc(B7b;OA=xj>bcJ8w7~5>>Oukc1rx0Pd_crvBG7(eX7+GElHFVP!>LS_=Bj< zV6l?cyoh0SxI=&9`I`c$UHk4dE1PuOe{d=Olyx(%wX(2P?>)w9)j9sBO-bj)&Sna4 zUAFdB@XG5wI+~}g1ufSYx3EgcXF+~*JJ zDW%(Am#IFod0Y@@vYN!R?BLdSvt!@%$aQ#LEzY>DIoj0W2YbHf5Ko{7&~8dKiiR7T^OW8?%qncDQx+!ChLOMZ2XrKM8X1EmRyn3P{VqV{*+Yj zd{bFyKT(>`_h>^q7tgSFx%*v0eq;?MCA94oeXCgVhIlVb&S7U^ow_)=A&=u*x3#?x zGGYxFsXkJz-F0mTb%A>)-!o@RT1IEa!(x{eyB-C$W2~Di`c3Qv4PMUC%*%!ogfD2$ z#IFk9$^I@|vgp9*6TX@s4c^b({GY^yCw`z!Y{SaTuH;Epix@mP-GMeCs)~qbZRYaN zRM^!gquI<=TCm*KTvp~s35ZNQdmrR5vflccVWea0$d0Y;~?hHiLxxPm*BoVUL_WW zCI}L?pM1F&FA_Na`Rmo$muP&bZzMiPpa0IhW22NpoANOxu-Ig^|!6>ZeiUU*^AwmcDC^Y|C!1z=^gt|73Yfh1zN5c?-7vMF}6IPf8Q1U z{ZlVbNmlgQ_@$mQ3qL)D4Yrzbr+;is4%@C6C6#R@>U`cMzD}I0qtUmnc^_6!VBm&{ z_ah-K-ZLo+n(aK^xB%&Jod`KMf#coB4$8W9dvFIX`hVj)ASPU z%(F9n?)G@@cbξ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 literal 0 HcmV?d00001 diff --git a/cli/wasm/nu/windmill_parser_wasm_bg.wasm.d.ts b/cli/wasm/nu/windmill_parser_wasm_bg.wasm.d.ts new file mode 100644 index 0000000000..b30073d3dc --- /dev/null +++ b/cli/wasm/nu/windmill_parser_wasm_bg.wasm.d.ts @@ -0,0 +1,9 @@ +/* tslint:disable */ +/* eslint-disable */ +export const memory: WebAssembly.Memory; +export const parse_nu: (a: number, b: number) => [number, number]; +export const __wbindgen_export_0: WebAssembly.Table; +export const __wbindgen_malloc: (a: number, b: number) => number; +export const __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; +export const __wbindgen_free: (a: number, b: number, c: number) => void; +export const __wbindgen_start: () => void; diff --git a/cli/wasm/php/windmill_parser_wasm.d.ts b/cli/wasm/php/windmill_parser_wasm.d.ts new file mode 100644 index 0000000000..7324082938 --- /dev/null +++ b/cli/wasm/php/windmill_parser_wasm.d.ts @@ -0,0 +1,3 @@ +/* tslint:disable */ +/* eslint-disable */ +export function parse_php(code: string): string; diff --git a/cli/wasm/php/windmill_parser_wasm.js b/cli/wasm/php/windmill_parser_wasm.js new file mode 100644 index 0000000000..c0cdf9229d --- /dev/null +++ b/cli/wasm/php/windmill_parser_wasm.js @@ -0,0 +1,121 @@ + + +let WASM_VECTOR_LEN = 0; + +let cachedUint8ArrayMemory0 = null; + +function getUint8ArrayMemory0() { + if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { + cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8ArrayMemory0; +} + +const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } ); + +const encodeString = function (arg, view) { + return cachedTextEncoder.encodeInto(arg, view); +}; + +function passStringToWasm0(arg, malloc, realloc) { + + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8ArrayMemory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7F) break; + mem[ptr + offset] = code; + } + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; + const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len); + const ret = encodeString(arg, view); + + offset += ret.written; + ptr = realloc(ptr, len, offset, 1) >>> 0; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} + +const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } ); + +if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); +} +/** + * @param {string} code + * @returns {string} + */ +export function parse_php(code) { + let deferred2_0; + let deferred2_1; + try { + const ptr0 = passStringToWasm0(code, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.parse_php(ptr0, len0); + deferred2_0 = ret[0]; + deferred2_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); + } +} + +const imports = { + __wbindgen_placeholder__: { + __wbindgen_init_externref_table: function() { + const table = wasm.__wbindgen_export_0; + const offset = table.grow(4); + table.set(0, undefined); + table.set(offset + 0, undefined); + table.set(offset + 1, null); + table.set(offset + 2, true); + table.set(offset + 3, false); + ; + }, + }, + +}; + +const wasm_url = new URL('windmill_parser_wasm_bg.wasm', import.meta.url); +let wasmCode = ''; +switch (wasm_url.protocol) { + case 'file:': + wasmCode = await Deno.readFile(wasm_url); + break + case 'https:': + case 'http:': + wasmCode = await (await fetch(wasm_url)).arrayBuffer(); + break + default: + throw new Error(`Unsupported protocol: ${wasm_url.protocol}`); +} + +const wasmInstance = (await WebAssembly.instantiate(wasmCode, imports)).instance; +const wasm = wasmInstance.exports; +export const __wasm = wasm; + +wasm.__wbindgen_start(); + diff --git a/cli/wasm/php/windmill_parser_wasm_bg.wasm b/cli/wasm/php/windmill_parser_wasm_bg.wasm new file mode 100644 index 0000000000000000000000000000000000000000..9ca97f73b740f22351e3a10e86b29a49b1a9ea11 GIT binary patch literal 1053462 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 z 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

d_9KbwPodN2(Pwf9$l#G9 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

yKSQgB}Zfhb)dfaBnifTf`4z~`q$8xMPr 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

wr@lKkSInKem% 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 literal 0 HcmV?d00001 diff --git a/cli/wasm/python/windmill_parser_wasm_bg.wasm.d.ts b/cli/wasm/python/windmill_parser_wasm_bg.wasm.d.ts new file mode 100644 index 0000000000..1dcef70fb0 --- /dev/null +++ b/cli/wasm/python/windmill_parser_wasm_bg.wasm.d.ts @@ -0,0 +1,9 @@ +/* tslint:disable */ +/* eslint-disable */ +export const memory: WebAssembly.Memory; +export const parse_python: (a: number, b: number, c: number, d: number) => [number, number]; +export const __wbindgen_export_0: WebAssembly.Table; +export const __wbindgen_malloc: (a: number, b: number) => number; +export const __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; +export const __wbindgen_free: (a: number, b: number, c: number) => void; +export const __wbindgen_start: () => void; diff --git a/cli/wasm/regex/windmill_parser_wasm.d.ts b/cli/wasm/regex/windmill_parser_wasm.d.ts new file mode 100644 index 0000000000..45f9ae539c --- /dev/null +++ b/cli/wasm/regex/windmill_parser_wasm.d.ts @@ -0,0 +1,12 @@ +/* tslint:disable */ +/* eslint-disable */ +export function parse_bash(code: string): string; +export function parse_powershell(code: string): string; +export function parse_sql(code: string): string; +export function parse_mysql(code: string): string; +export function parse_oracledb(code: string): string; +export function parse_bigquery(code: string): string; +export function parse_snowflake(code: string): string; +export function parse_mssql(code: string): string; +export function parse_db_resource(code: string): string | undefined; +export function parse_graphql(code: string): string; diff --git a/cli/wasm/regex/windmill_parser_wasm.js b/cli/wasm/regex/windmill_parser_wasm.js new file mode 100644 index 0000000000..5418fad879 --- /dev/null +++ b/cli/wasm/regex/windmill_parser_wasm.js @@ -0,0 +1,289 @@ + + +let WASM_VECTOR_LEN = 0; + +let cachedUint8ArrayMemory0 = null; + +function getUint8ArrayMemory0() { + if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { + cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8ArrayMemory0; +} + +const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } ); + +const encodeString = function (arg, view) { + return cachedTextEncoder.encodeInto(arg, view); +}; + +function passStringToWasm0(arg, malloc, realloc) { + + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8ArrayMemory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7F) break; + mem[ptr + offset] = code; + } + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; + const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len); + const ret = encodeString(arg, view); + + offset += ret.written; + ptr = realloc(ptr, len, offset, 1) >>> 0; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} + +const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } ); + +if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); +} +/** + * @param {string} code + * @returns {string} + */ +export function parse_bash(code) { + let deferred2_0; + let deferred2_1; + try { + const ptr0 = passStringToWasm0(code, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.parse_bash(ptr0, len0); + deferred2_0 = ret[0]; + deferred2_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); + } +} + +/** + * @param {string} code + * @returns {string} + */ +export function parse_powershell(code) { + let deferred2_0; + let deferred2_1; + try { + const ptr0 = passStringToWasm0(code, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.parse_powershell(ptr0, len0); + deferred2_0 = ret[0]; + deferred2_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); + } +} + +/** + * @param {string} code + * @returns {string} + */ +export function parse_sql(code) { + let deferred2_0; + let deferred2_1; + try { + const ptr0 = passStringToWasm0(code, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.parse_sql(ptr0, len0); + deferred2_0 = ret[0]; + deferred2_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); + } +} + +/** + * @param {string} code + * @returns {string} + */ +export function parse_mysql(code) { + let deferred2_0; + let deferred2_1; + try { + const ptr0 = passStringToWasm0(code, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.parse_mysql(ptr0, len0); + deferred2_0 = ret[0]; + deferred2_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); + } +} + +/** + * @param {string} code + * @returns {string} + */ +export function parse_oracledb(code) { + let deferred2_0; + let deferred2_1; + try { + const ptr0 = passStringToWasm0(code, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.parse_oracledb(ptr0, len0); + deferred2_0 = ret[0]; + deferred2_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); + } +} + +/** + * @param {string} code + * @returns {string} + */ +export function parse_bigquery(code) { + let deferred2_0; + let deferred2_1; + try { + const ptr0 = passStringToWasm0(code, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.parse_bigquery(ptr0, len0); + deferred2_0 = ret[0]; + deferred2_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); + } +} + +/** + * @param {string} code + * @returns {string} + */ +export function parse_snowflake(code) { + let deferred2_0; + let deferred2_1; + try { + const ptr0 = passStringToWasm0(code, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.parse_snowflake(ptr0, len0); + deferred2_0 = ret[0]; + deferred2_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); + } +} + +/** + * @param {string} code + * @returns {string} + */ +export function parse_mssql(code) { + let deferred2_0; + let deferred2_1; + try { + const ptr0 = passStringToWasm0(code, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.parse_mssql(ptr0, len0); + deferred2_0 = ret[0]; + deferred2_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); + } +} + +/** + * @param {string} code + * @returns {string | undefined} + */ +export function parse_db_resource(code) { + const ptr0 = passStringToWasm0(code, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.parse_db_resource(ptr0, len0); + let v2; + if (ret[0] !== 0) { + v2 = getStringFromWasm0(ret[0], ret[1]).slice(); + wasm.__wbindgen_free(ret[0], ret[1] * 1, 1); + } + return v2; +} + +/** + * @param {string} code + * @returns {string} + */ +export function parse_graphql(code) { + let deferred2_0; + let deferred2_1; + try { + const ptr0 = passStringToWasm0(code, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.parse_graphql(ptr0, len0); + deferred2_0 = ret[0]; + deferred2_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); + } +} + +const imports = { + __wbindgen_placeholder__: { + __wbindgen_init_externref_table: function() { + const table = wasm.__wbindgen_export_0; + const offset = table.grow(4); + table.set(0, undefined); + table.set(offset + 0, undefined); + table.set(offset + 1, null); + table.set(offset + 2, true); + table.set(offset + 3, false); + ; + }, + }, + +}; + +const wasm_url = new URL('windmill_parser_wasm_bg.wasm', import.meta.url); +let wasmCode = ''; +switch (wasm_url.protocol) { + case 'file:': + wasmCode = await Deno.readFile(wasm_url); + break + case 'https:': + case 'http:': + wasmCode = await (await fetch(wasm_url)).arrayBuffer(); + break + default: + throw new Error(`Unsupported protocol: ${wasm_url.protocol}`); +} + +const wasmInstance = (await WebAssembly.instantiate(wasmCode, imports)).instance; +const wasm = wasmInstance.exports; +export const __wasm = wasm; + +wasm.__wbindgen_start(); + diff --git a/cli/wasm/regex/windmill_parser_wasm_bg.wasm b/cli/wasm/regex/windmill_parser_wasm_bg.wasm new file mode 100644 index 0000000000000000000000000000000000000000..81d0ae1dedf589ff0b719e2c13975bb3daffb7be GIT binary patch literal 282356 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ó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

q^a%=# z)SY+vS(;qb!QI&EKjt$L1U0br&-G>ZtS@=}am($V^@BAA{`zq5{Kq6=03{g`Z@=#p zZxi+=8B@E(5|$Vh7iQ+_)Y#g@>MZFpSok6`_sQjI4n2y9iK*+Ur7RV-dAd(%fPA)(t%*F1>?uZ57d0|*3mjN-Z zQO*^KHyn}qvL;4RB*TfL8{Iy>G@QkgJp{O>!-5Ho8C{6fVI0RFNrOoK=vyD($RDgOSv&pN|MzeH@=yNT2To@v?)A)|=Pyu4cpT&W zKG47hCgVzluR`cq=m+lk0I@m!biP&LRl-2QE~7uN*Jat&xJ8vih!oh$@Z$&^)%I^T zywd=X)yJ8t@~*o78q_@B9NtShnx8(MzYMyn$x)pI(jft&330c!bU%YK$X!`oqEGrg z1}-UU9JSC#nMj7g^B+wZj{dLC#5oT(5+RfV9>u~j8-Ne7xK)Gj!3q`N4(ciIcH(;V z0v3e})0E)>7llb2aZ!Moc*}&XA$}lnyUWbU*=VQc_=AM$AULTwgP)-@c?kwsCzLMo zOn;ooqMyxu!`NnbuXIJtKX_=&PHbe)oy4-cf-vMyC>WAA&YdC>wJv+ulE-LSUL@c9c-WDM2KeH=d7{)8Aps#d5kgaQa&db1pzncz)7qbT zZY=8W=oApo2@t(M>$cCkFUi7>(;uGq+UIoG=+V@}f!zIBzkSXFgHOi~&*e>`{=rK! zetk{^hW(j`MC19wOELp0^PC{ogtu>>6S$vw_c>uh_QS+#bJogTu8a z0?rKB1P$hIWO^f(aGuzagQodeU&Nm#$s($fQ~`WIGCjd4U}ed}9xF zCw93{j2YGq8%of%a3VXCvJrwugr`=^R~092GOQrZE)SgDoktJb|9FH67k*)bkK4iax8ogJK_}wut@k4h~UkH)6DK8DC2$4H0sCVLo5~A+A;tU$F0GK z#JZf4P^HNSOXI6xGYNikf!~QjK4rkVO$R3#KfwnEzc}Ls-Jw0my<1%BL^$sXPk^Yx z@KOz57(5i=ySTlB(*V?e$6RxE({GH_J*rm^k4}ZCH^+?f-L1H4F;iRGXE(lU%8tr# zZemAiR!Nv~z}5nqu@tUhldHaQeRz5c;A=R=y#5f(Fv2%MTB=CA+8MnaaB+W-4z9W{ zQD1&n;&Wm995#E1^PGll()(Lx15alu`JQ>O`;fub(c&Uii$<{9ap@jx*p-`ISUz1-4 z`Y?}lQfwt6o<0qRnEP+s5`@l|oa6B273pptKj7A7O__>cf~Dll|L9P_9+2%0AQoxP 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 [number, number]; +export const parse_powershell: (a: number, b: number) => [number, number]; +export const parse_sql: (a: number, b: number) => [number, number]; +export const parse_mysql: (a: number, b: number) => [number, number]; +export const parse_oracledb: (a: number, b: number) => [number, number]; +export const parse_bigquery: (a: number, b: number) => [number, number]; +export const parse_snowflake: (a: number, b: number) => [number, number]; +export const parse_mssql: (a: number, b: number) => [number, number]; +export const parse_db_resource: (a: number, b: number) => [number, number]; +export const parse_graphql: (a: number, b: number) => [number, number]; +export const __wbindgen_export_0: WebAssembly.Table; +export const __wbindgen_malloc: (a: number, b: number) => number; +export const __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; +export const __wbindgen_free: (a: number, b: number, c: number) => void; +export const __wbindgen_start: () => void; diff --git a/cli/wasm/rust/windmill_parser_wasm.d.ts b/cli/wasm/rust/windmill_parser_wasm.d.ts new file mode 100644 index 0000000000..1887ec5186 --- /dev/null +++ b/cli/wasm/rust/windmill_parser_wasm.d.ts @@ -0,0 +1,3 @@ +/* tslint:disable */ +/* eslint-disable */ +export function parse_rust(code: string): string; diff --git a/cli/wasm/rust/windmill_parser_wasm.js b/cli/wasm/rust/windmill_parser_wasm.js new file mode 100644 index 0000000000..c0db59571d --- /dev/null +++ b/cli/wasm/rust/windmill_parser_wasm.js @@ -0,0 +1,121 @@ + + +let WASM_VECTOR_LEN = 0; + +let cachedUint8ArrayMemory0 = null; + +function getUint8ArrayMemory0() { + if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { + cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8ArrayMemory0; +} + +const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } ); + +const encodeString = function (arg, view) { + return cachedTextEncoder.encodeInto(arg, view); +}; + +function passStringToWasm0(arg, malloc, realloc) { + + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8ArrayMemory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7F) break; + mem[ptr + offset] = code; + } + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; + const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len); + const ret = encodeString(arg, view); + + offset += ret.written; + ptr = realloc(ptr, len, offset, 1) >>> 0; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} + +const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } ); + +if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); +} +/** + * @param {string} code + * @returns {string} + */ +export function parse_rust(code) { + let deferred2_0; + let deferred2_1; + try { + const ptr0 = passStringToWasm0(code, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.parse_rust(ptr0, len0); + deferred2_0 = ret[0]; + deferred2_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); + } +} + +const imports = { + __wbindgen_placeholder__: { + __wbindgen_init_externref_table: function() { + const table = wasm.__wbindgen_export_0; + const offset = table.grow(4); + table.set(0, undefined); + table.set(offset + 0, undefined); + table.set(offset + 1, null); + table.set(offset + 2, true); + table.set(offset + 3, false); + ; + }, + }, + +}; + +const wasm_url = new URL('windmill_parser_wasm_bg.wasm', import.meta.url); +let wasmCode = ''; +switch (wasm_url.protocol) { + case 'file:': + wasmCode = await Deno.readFile(wasm_url); + break + case 'https:': + case 'http:': + wasmCode = await (await fetch(wasm_url)).arrayBuffer(); + break + default: + throw new Error(`Unsupported protocol: ${wasm_url.protocol}`); +} + +const wasmInstance = (await WebAssembly.instantiate(wasmCode, imports)).instance; +const wasm = wasmInstance.exports; +export const __wasm = wasm; + +wasm.__wbindgen_start(); + diff --git a/cli/wasm/rust/windmill_parser_wasm_bg.wasm b/cli/wasm/rust/windmill_parser_wasm_bg.wasm new file mode 100644 index 0000000000000000000000000000000000000000..5448399f372503dd6e4004521cc7d31c6f5071a0 GIT binary patch literal 1169193 zcmd?Sf3#iaS>Ji~-skM|i%oolW;?UE)Cw|wq=hR_cV3&m$I0f2LBJ=bDKQ+(T_InX;Aq+ zjmAAQ_ObiZxF>Ztyyfrc#7C(!`KUD-KgyT<;dzrWm(ZZ;KY*|Nj5+Z++*7 zKlmN@e)#ZT45eNi_MoWM6Upv+hD~t5l{TD@1+G@4AL>Uj=Cmr_|f6Eu6R;w3N z(Bg(FBmatu?Bzxyj^ZflQ%^f;a!d7*dshv$sEGDc`V>XnRR5`e`c5TL+O8h>ic^2J z2W{V$ULC7NorqdAPD|=X8l{b@-@utD4ge<@^^%8WjI)@~E}h zf2k%?8;gdbAG|>yN~q|)Rx76RRx{?NMHRefV0PW%NzC|Y-1S$tU7*K*wAqcis)Aa# zbm(=QQf77N8$RV-H9+V1-#k^=_%uy4#1v>uQQV{l>VB&cQ;ES>7yZXzc-W45j6-k7 z(N^nX%&T4Xizcjn`(s^>G|HBNrPHSNw$*8Ew&)GB7p5epKWdYiPZ@K(O%tFttj?Gg z1&s1Pn=w7oTN(;)@RNJ6C5jVj=vrs|7pg6e+pWe-i@DTCJZJ)zILvHWb#*h)Z4~#? zbZ||YHsYCunRld3-BFi%<{-rV2L970O}&@u%H%N3Gx3Ab5A*N48poqn5;ZoZT?j~V z{P?-XO#9Jx`k{M2^j*jPUfk$C_<>{Jeee5^{oU_=xbZ{jmfFg__mKy`>)6BZ-xEcf zYNa3gzyl9_*WYgZMr(7e@Yubs^h?dTTIt_8cJIB7-)v>IqVInA1IHe2G`gPxltnai zGWtyG<<@^rzL2`>?<6PU3(c4Ouir?YO#hj`|Fih_TffP#|J2l*ZzdPgC(?i2`uWxq z{`rrkPo@8y``>MStod*3`WMMdtv_fz)%>^Ve`x-A`dagB^G}n1l76c7E9oCK|DyS+ z^vBabZT_qDSJTg@Kb`(s`l8kIX7Y0SLh^IzFQzY~pG$v>_I}j&;LYT3em4E3^n7|I z{fYEv(qBk_GW~S=Z2HUT-~aRIN77&SU;oek`tQ>pNPj2&h1UPp`rh;>TgO}fH2vZ9 zqK#CeeWm$$`seYN(od$R(l0>=FE+m?{q6Kp>l6IG)H>VxSo-nwe@RcK|97h&e_z!5 z+>?i1Nk8+kD4KaRKCrQWMUpp`;zkkQKZ^3G$lklXi0+@Ai<4$6ZFjo8nf_pQt`W`T zjiR}neX%*m-BSF(C}|$h&3#2@c^D;SV?~@tzPdP%i}=0UXF=1(Ode%Fn)G9?s^-&i zpBnADJ=?kbp6$m5S)OFSt8OpFhi!00{Ovr9?tJKwYAr4_ma|`sXJQ*g^U$E7H~XW= z-*qP1thbd%YqhpJfM#ifaQSyp376l2Yk0W)sNI~2r{S^~;IcH)M}~KXnHhu2u{Geb z$0~}lU(&=o04D-)Of|*xG1CEPlkM;3rU7(cW-4|`R|cC9Q$9f}vnCs%;pJJj&p^xir>j2EMcVN3yhQ#HK@+@wX>rGLMbuim%2!0Kr&qKh9OnF`uZSAKTWv)=GHSXd_wcY&G=?pfXeVzK&qog| zkK(2H*~peJcc&x2e*dXR!xVAmji)0c9`L!Nidx<5*EMbCffRmboTM|@;-V*fZ6oM!7y)ZTz&1I8 zt}gE_-gzeo5*K@yvvdZ`h?e2D%{v1}hN61>DWOwxWRPf_^GuQK+B*Blh$$b4*m|7f z?sW9_i4q=Lt(EDnpWbNK9n&*xr7DlD+<{Jk>10Lp?SfG;znuLV;to$eR2v?uV~pkb z2o?lxm5k+L$yjFlnSFjF@YKU^AAAmmi9LKJ(3!0m%hF1s)}F7Wq*ZHd0fdY1$fHBY z27LkAu;1=>*n~Jy^^&7%Jb&eF#ITEw9$G6`0>eQC!xtD8!uW)|iV!7vHE(3!rm=oG zLQ45wC%cEqtB7W~Dqmd}wabR<^3IMTuOsETMv!*;{aHiG`GAz!+lQ3>Fs|%M0NSqr zx?~kaw>0L9nLAjVLWArx2#IJaz)U4hxo{F+OI)mJ9H*s)+1j2b5VIEitBJ_y_}3th zO}(fK&V|5M6D}RtBwY4AjWs0gI2yWR2oDnvuIp)en|7Eqoe zLM2Uv>4?mM~#vxd141#?bx{cG>q-D|#r@C{qhU)%Sf$CIuwQ(gt4U#P1ub`;JHPxLr zOm*i9wJ4>?U@q7YRBNp{MTN>%Q{5-wa#^Z7^*YsE4NSwOQr$fUpt_IGf32shDJspC zRQKk%>TZ%Aq{S=lChj`LosO-kxbwVJ-1YACAS%UuH8M~egsCY=KTdJ43=mL);{2GJ z{_2F9?nUgo0)068_R)tUfj%6a9_{IpyRJ6cAoBt(WP1odH}ld$5GBQQgtB5s;y;GT z@DuxydUo6uf$bS#=!&p*x93erYZubm13iK=m3n5BEoc8Sp~eIE568@DG@FHiz`K3r zCG}1p1|MWiTLJZs$(mM1uRi zO_Lvj($!${t4VZ5IaoQ9CO_DP6j*27{j^iRP9T|I2CwYdV1>VrMI$e&9gkL()gDVO zPgZ*^4rJgf@#>g8$!9Lhbk16TH4cmYE3`Mc+AG{%jcnB!f9Exn@s*&TdB}oorllDojG=ayhWm1?V+vb`mb@bKn|WFnxn*)5h~PIk302 zK>XCf*HJl=$?9^{VSyv@zpi-?a6t(TntD575ss~tF$*clj~!6O$<4|g1(KA8MKk2 zzl_RFLvNG=d)>^VmEKk$#K6Ie&G(NquBP*$C2=CZnK*j(^O2xqw_kAXp3J*?s2x+A zSmT7JhZbLBkcS4axuy8^YLuqj%Ys>P({Uc9XO5dXw(SM~$4b(3{B0yXZ}7we?wEvr#0*&FO&3CUJ9`3wh7X6 zFpT}cI;7{e8tH*vO%7vy(oC%E)v668j zTSXf5oFV{Irv}u;V3Tg>_gxOjxjPC+_nv8o0+g+$3dT+^bgE#hzREgdvQ+G?Yzl*L z6u+Oh)=>p%)~SMOe|o&7D(Ht>4G2;me8?Y4^J}4^KEbk};fILqLA3Gx4~S!>pCJI2RAD zv`*eAaQ=y4e$ zTA4HG(UHL54zHzC@Zv$^aBhBAh(D-wiq!kTw?eCF+oAi1vAof=f1u!;yfT+V*SStC!CM#ZOAH!5C=FVCoWq15bO zidUDr-m1yvd}&mC>54RaA8Fu>Uu%VYZOCmG;ug@TaHcU|+$;*yR#;_|BfqRwM!mTq zgc>OEp>&;8t84||iLJ6)Pn`*1dX=qdG#r#1gC4+hs#V5s*1a1$j=43BhFCQ)Gx>L? zhf%Gv)ojA0>SyMI%QhPNQJ|>2D9v5dbulX5dB;G`q>DBC;RUx;dH&KG9A$D!FV}u} z-Ys%#Wf~fl8nGHQf-}M*G0Z$jh@JPSil`G^h}(ex9Sbc9Ry<-T#t6#Bta#3Uz)VtakBFsIYlsO2#eop!lyXBQI z-FHnV{iK7yk76aG`KpYU@yguo2vp75T@u=t8-ekzwkB)9f72=|-t>%@%I_*R-J#H4 zlU~1Z42Qwm!U&wzh?~`{Mpqs{(0|(vhvhidH5@((791KhC4xV-g5?m|h-INz1#j=b zK$R4%4`efE0!#Z+SVEu^H){ksP0HVw#YU+5gF#fhZ=A4iY>!e}=_M-!I(@D8DAiiK z%605oPgkR&Yw9IzGq@T87HW#XI2Aot>Lrf^CFx-=zOAa2JQy(T;b}~(NaJccNe!YO zIfTg7DBeU0`yJEgzY$hS>+8BwYOP)6E2Y-cD_SYgsjFe7)X;OamGU6A*1N#l+O9me zo3FNc!tLhMuDoX7?E!ostgow<2M|(j4jY)s*MSGrTD!_IyVlby!ffryxeE5F))we$ znElA8jnvEhKRirP;Zq_=UbYuNl>hS9eFEn+VZ`}D?0n%k#WBWZ4*o=94v-5y}c-GQXtwYsVAt%|irgRpT|3Bb!R zw*jM28!meYdiXhk{l8y_o-iL+|p=Vi?+3A z)IBuVmA7R_ONx^Of1$k=PqW>>ledS>gcY5qQdn{A??MsUAA_h&I1233kyi3P3c&Cu zqhU{PG=?{@aAV%c{t$z9e#8Fcgs#1P@u`@)y3165B3foM@0+~_i4tsAZ;LOqyEhiD z0}R{f$>0`7>2tTg-WVHPr#`rj8{CW^+IwQk? zhVbA%LhI<_%rfNX^@i`>>saR1JzeYF1G02*2hs9?w=q;Ai4v~GYYo~acw(1th0Uw9 z!uWZjdcm?h-WTuSlJ1KaxXkQ}=iRT2OM743=hEF5cib=3(1H(e2tg!rOnN|if1Fdg zv`mQw?(?|6b0wVEIffHE;|<}&($$C)6A*448tn8ChRs570WzTWKrUa_qXl-F+pK^L zJJ~-+(L8U9$+;;3vK==S%!sCFEbJ;WOLu%xR)0$Jsj^Uu12Mw1M3H;rPWIfsDf99cD zk+ZCm!E*Ll)})r=EWs$Y6l04@(Heq6wA@zkytz+{K&wY`v zbcnT-_xHtn#PPzCS`15Sk<#5`OX{YTmefsS(|l9Bp(S+eZgCoN3o9&;o4x@c2QgZ#6Qg`( zVpLM0MMs4eC#ewR2P72v5oUwS!ffDNVRpeQz?pz>NPiQ|h5j2q@W6*NH2XIi@E6B{ zf8!YNZ=42xz5?(UuS(#@LnZNG^i7kXwB5!yI-K@tl%0b3Z2sc$7Gx3$H-OE7wo%W{98Bjp5Po8vu{s$ax)))=&@T#Z8=+a56$l#q*cLpVRC^c?9O2bRuY} zBCw9vQxTZPM*jvW)8MhCxoToeIESj=bH)UlvMr{88?zg=Yi zXILxw4E@ZMCW>()*uo-A7I&*cL3O2VDx9d(hb1rn$F)QqbI8umIXJBfQQ15MAZh(c!EvN1(Ut zB^Rr?Z8`f&lYvrtc+_^fv`iJ{FpFnn#)**v8bIr$^=fDTJtIna;8f|}F0_yvRKs1+ z$)1!EN0Q$++^W(Y!)>}O46o5;ez>4ZHhhOJ{o%E`bcWk?X%0!)1B)GAhmB+R@^HY6 z9cNUV!i-Tkn&)*fM42UWv$-_#{F%|_`m}9!)3!y^#`{gwqH@|cGn_4&HnX|3&DJ`X zZ`M3*LZlmApZBv{@=bZ)ED|5d=khJf`SpSD%$Xr#E*B+Q9^x+-)Kh6g0FkEpBeVB3 zhW#-hn(9lax^H6+%)TY>=X0K>&g28BM13x>p$?ZVVqNyDLAQ=a%Zm*vbS9^JhA9>g zf-dEE?qmKa$A($rzG2RCVT=rqF*2ABVLQtA$M<2+RqY=vUw72rz+h8Lb{fozkX^nC z#J(em<}SVj3y*SvbspgYu{+G=hW(5h%hbO3HZF+FOI$K>SNoN7LE5>8%hrAI`?zcq zukGa5h}U**KyTQM6aR~=XeINVRuS8X^ zAET<*)6WeU;%>Masj6mWVO%ht7@Xc%8g{BNR`$4>eC)OV8>Z#sn)ZKL@-fIzvz_s4 zHO*9}9R#le9Cti&N051uykM9RqSAzRoz3Qi%zNF~Y+hH5G?-Oal6kMcT4z)8E|LO- zNfPg)jz5MdDp@5^t-BS(IL~U2>A`S|aVhpzcK4Jwc@1VPKvx4(u2M^NwjS zuVfs!?rH?{1d)S9@2HC+6UKqqG0Vka%8)fLj}MGn|phIVY7E z&Nc;PDux`k{RK2%@h=L*b&#Ij8?d3VuVsH;-_DRn?`mj8F}Hm#%z1~4Q)&w6aihQ8 z>YXq$Y#*D%?eP@lTgk|<~Dp#aV-?76@96{ySEJ-aE#i_l}K0@7k*#dNTJJ^ay2mN4Zp4 ze@m=CC9SGkD8?*_s{*8wlxix1mz1uZUVk-7X~6m;X-Dvr4AxkG5y7tLhQ{*u%1$Lu zjY31ouj|ZJ`(liLnsY5mR@`nbPG%AYY)r^1HW{DKQ?o^T!78l;tA&*?Wnm0c7UB)9 zvv*w8nBq_bj*o$`GGeV_d~h%0En9Gue99>aTY=~GaM#?h98V+`&||N(m?^g%VKsg=|`&!J4d(u8(5S-?kDIwv9ny+s2@9&D98n zig~lRv&x!f6(4PfWIxWv|#pucqt`dc>! z{cTqx^Z_oRGb3WOgmj58@o`1H@Kez*5)oOE1h4(KASR{=5EGKjgHvS;jWTsp@T7BC z*&F!xnx$V4f7J=1Z<_si1LcIwJwFD@`DswDBy(@Q8bMjCCv$%-9D4??QXHNaLp(6- z0ktWqxW<*eRJ?VXE7zpr%izl97<$|Md*b5A%>@=OBZK3T@|Ymp-(o0rWLyH?GKNxH z6hdZb<>ERHLn=za(uc9kUybIdv?|7KvmnzB_TJ4v#SGW0#Mrf+`Fe{BiJ6SC3n6K3*?+(8F?Q7yvI6qq zR!9BGJV0i?03HnJNVoIT((RLFT#x}|Qyn0ioB_O&ZnsrUZ2}-f0d1LHN47K08pdGW zKre0#=P<#a!f7(=P4IEPZF!VgGN(>`PRw<(stukGK2mqpmo|8dNuHH`8}Gnu@dR;? zb9rajChl?IZ1QtC{skBJIEO5Y5x9zb#MeOF92fk_V8+925_CZJRLd59}XZGXALv6`Q! z70_Jnxt2q7%}dVvx7LYbE6j@RTkRl^GtV6kxlxF1mj2Zsimnv$%>JqS-Kjk(=Tr=u&OM=IRqR=O%2Ey3PBL>=GLJ9G%;wWu*9>GBR;aGelJ5@@Row2>(!s z++B*#;{k@3#QCP>e4%(LAn;2D>MjN5gB8eIwx}`XNjd4|=*aj!^$U}hl6wZf8Y5lO zu}Ecqiu3ZK;o!xzpxIHZ0L^EtkMq`^_D6s%9Rx>j;KFaUEAA`WiQ4uINs`kR=gGW&IS^&Px=ewq)~5xh_Luvt2IF)3XSvu@ruW~NSWvM>tx znmIF(g}X#Q;ZXG9)m`&q3Q1jfb+z=tAo_P?WGjpbucMK}Tf(bZ1!_c_Fce)KtXCQ~ zYRVBV!1=Ifnv93`3tla9b{7}a=A&Gg$=kRxuAsNoP^AjGj0M$yZCYtIB-KYbk+{6 zcp}m#8xzGc!N$!?@II|%jNEiJN@Epv8`ol`k%-eI4YP$iD`be0&(}6T;;%Ky)Ar-d4wOFV}(sq6m|s+h6YX2=pWiu*e;ubc{?PCMQL7 z7C9&|Z1S)T11u(xL~Dv*viN{=(JQTZixnyleTyPv!_Z_gRGirYUM|ZvRGU`GX>pC(03PlJ~zIg=%YHtPv@D->9 zc=?L~e4h*61mUe0$Q4MVRJzk}Msuj)Z9m=+oC!_(hJy2su>S}ElhwumZ1md!Saw&V zz6Ri$s^gG&O~_s^$Z}LMke!elX2u}vw&fsUu41V0+zv_SDu%3+{V-^I-ECz4?^T>D zMlS;3v1!kM%ECWzdTis@`c`Z)LkLZALm(!IosO7*{!l2$RFM3X<#u{1h^DL|xlD~4 z5aAGHufD0!;4;^3OVXMY^11mMP_%;78K3 zPZ@Z+b={=vWMFBS3YI)rkB#jjC7@_V9Li|g?H(!J9c^S6_4Bc@rhK=m*w~gh{&Z|C z5vQ;X)K8{^H=Oc~eMhl|V9q(IfwPkRmrCV3DBaVsvFhp4Xlr57JtbMDP!3rxd(lWO zd=felS)C(};zL41

fQuiZ8zU{eN%ZMy6pvi$qIP-kz@&juQEN15NyF!2z7yeW;D z{}WcJNWNBG$&@$+lDVdwG}V?g)zJnTFZi@2O?7nKSy=$acM2ja$^xXR4yQepzY(T7 z#jVwIAlsqd@LY;2kz+_w9mR!pidS%-EO^z))YzBVoWqTVG28@-oIEowc7KoeWTco>gW}Zjyz#{N;f-z)n zDSiT3>?tYVIBDJy3|5)EHN%W3T3v~$mA-GWxPZte?lzzQ8N$Ly%51&s?`M~VX` zu)7uq+>_LK*hPIG=KJ^rQG?i9nGbU=z;y>-zs%dR zsg*C&65elOgQryN9%nQ--dYSreL5@AXJUzK^tr>JH$b0>tH1i_^TcFBN0g#Wz78lK zq}v3#4XW59&+g!v2-C`EHqF^Emee5E-WcSFsJ{9jr@>7GI!_EvZ)`Zw8ReNViuUF! zY;%5l1D$X56DPZCjy<_md6Q^F&&#tg`;j@9kj3B*&NFsVS_8(z8c(wzjvj5 zVwh0fH2x*zk033LU%6j{{1J-*C)UUx;SM97P=s4!I3WfzffFk!!bnY5-wH2jqs&i8 zOO7A1OtoXUB#}-f8z+&gYPrVm8pTcGEZ8Wf>0@&YdNOWJKyM}EEmG;#2fY>OlL1<5-RYPzt_Y(I-6V>cg>h!+%~w@Eec0$E|LdDQK0J=KEHTxj#r?fq5QqT(P~^ z*1XvS4j>jG(eltlMW%8hg5E$}@(zJ`f_Ln$XFBn*Ldi6W*J6b(E7OTHqsel7Uuh3k zu&znprgJax3n_b%3j(@~bo`PjX*_~{rI>ku8f??fE)Gn+WId4*0JK~J(9)--NnJFC zhEcpBQb)|e)rW=}+?5+Sb^#%oI9^kz!yLONzxbsnzUk3K>BP=-alK@43OQg6p-jfdv;kCE6NUktOYsg+9xZHUMmS*PT&0Y`i`9%P&P zzq}zrR{v+jYSg-=F+U<3-FpTNJw$m*?w^gL1~iRF{JL`>N4Z?(_&FZHc;XU*X*+LA z8l3Xw4SAKk1?bIKA)3Y6lvr~HD*t@UKuJUQt_B`ptOFx@#|^qQsz~;n77>o&1L)|K zVg?`qzcVQ$e5R0xqp|^ThjnMfh!yUDi@1og#Er#1FE(kXQ~;#2o&dLmes{ddMCeK- zhq19(T^&!(H97wtohY*GM!#Q9?%A*`JI&%;3zl147=Qgdub;K<9k%Qps_|9$iq$Xpv$TLLILsev zpvV>A>vNB2lmH~(1883h}l)fv6u?<=KP1hq>=9-C4uJ|;BRdT=fQOQT*NRU{?2>Qq?p2k4`?{QUFaYOXK{0>HB5?`N- zF*X>Grqx$FE3z5~wlBszY#Dbn*4`<;8a-4r?|{gP|HD9MtR&HrHVZjlr^fTS>|TcP zBR+IUOiN%_Ym`b{kV(JwZo83qF{BF8Yk7X{8@L}T##{Hh=H9)1w$+HESaE?G?J!l3 zj79EL)h3EW+!b+wwf>gI?xJtUxr0~)G zWm)svn+K3;{y#8u2^KbB6U~@dpb+G;m?0Ct_?mHKV?!?YERl6H(sK{wB!X!aJxO++ zzZQ+`{|Ovc*R?ooT*Tt8hQ{zx7kDwwXDz3d7<#~W*rn5CU_E=mPaa62;n!|1;4TV{ z3UhvW6y}+Q$gwg~7B()iy%j6IL=ieIXc^XDagicSDHuM>A{f7N$Y2;Pi&)7>rftxs zEMh5>IJ(U;4MlPSHfw8H5Mecwe6Nvx)u<2LzvqOe5){u?BMd9hU=0{JSX8j)Zjp@g z-^x%O^H+Xj96q>|kO1NO2^pv3qRJ=_kbN#}Tzg-_Y#^_H!_|~Q>s&2%z;TO8$$U-C zh!Eqal<1Mmd`&a1KH0uiPb2$}B2cyb_O})1po;2DZ0WBrHQvkmjmZV=JHv8q%qWOP z^Ka7{MoUGCv~jb}NA2vlT8dtxen6+U&w?!tersxJ1lJ={wBd*g;_`Z_!hn!|UA8+5 z-b%|Kav+vJkczwRhevDy{Br)81mZL!l9Zzvso-wg640F_kKOgjBMFy8!*JpT^4P7D zN93Z`d%gCR&bFdBj)V3kb5G%aQ4L=cerDsv}0$Q0#XJ=E6@NE{C zP{KqiL(~FAvZENID^VVvbUu|x`=AN1CQzFSvOl@l$=~^mllLATk(nG!&}?4Bbfusx zCXf&SX$tuMZ=Z8h%#JtW4>h;ilL}N1k}=bZqWoG%e8kWp;p7t~6JJSuj1SoK*_73! z)SEWm%#};2m(j?TOR1ON$VR19X$IH3S-FfxShkv#Qf&aGrbR0w0Q%FciNe>{N-LqY zURsHl_0mcZwB9;pp{B)N{uum}pBocJrSa8N6PX_lR=8FCytL*>S~FRGNSRxq@nMn~ zLq=-~P-Jl4v18$~vI?-2gf@*d}BBWx(#&#$dNjL;q~NpHXft2t>XVEn_5Zr13ZX@{9Rwa(>^TI_TY9`tlPa)x}7m; zLze8n+B{*bLoCxcF<}6Z@#f6w#dx3Q)$cI^1?X+wx)(H7KQS_nsWsC{P&SRPRj#;HRlCg z#kcmwXMIsF2S{;RlEMzVJ*(RV%ASoS=A+p!k9yfJ<4w^&sZY0q9|4yISXUy=mHQ>48TI=2oA)CpjOaMdr2vZ{7oDUHonHE9tZNOl&SdjU@C+OVviGPE)Q> zd44eJJ-iE95!UU&W>c<%*sq1kDC3sGxfn7VOEU$jZ-+2~;-YH^3R+$w%p zVmW$j5oZXfJnM)ew9GlfFXa!GoYZwD@^0}H=NxlZ)Uo8gOe2uqrXN<1GG$Y;fEbF* z=%Mm?3{?!NJ!S1MsE00+Ylh`n^}vtZR6b)Y;I=?g=;W?= z@BSorz3iL2o^G9k1&}QV2(8KjkOD-dJqyT77BEw10Z4mpa8I|uq$Z@qM?RZ*T$o7bwgrgnh8cGUSu39v}A+3l9rIsv_hDWOI3mn zuSQI9jrDngR1+Nlv;m%Q;|v1P0nGUpEE2z~@ohP@myUcJh$ZW#2)vA!&fXqBDzG+W zJm4kUoGi(JE-5%dT8)Vb5{t^;Fty6mNz5MOWW4s+OBJ=pk*QTeOa)Vz<Z5<{ieDn6;METI^bwVjU<8?DaRa&l7Ve27V5zL=SaGok z7PdiBoE|ToZ_8k7%3DBq_%wY1EB$g%vkE&%&eJSHpQ(Y*HjCdZO#@SLGAx3f0;5}G ze15(XwB!)7atT_5^DJQrWPVouKQ4WIvkn^K`6^)- z2fJVJhHAP@Xw=sG9A!udgOYDXtSVy0FMI_QiSpPuG;}lIc)f-k&{ZE%_LId%%+drB zCQO+iXO>c}*w*dp5GZ165c+P~k2b^tsGN%v`!qZXb}OEf(a9C4yB*x=j4ftFv9oLf z|7ADcFi;b2Z0IHqTVw1Bvc>>_Wr~o@ukkBDPimmnDkH}_XoeRbE96FwnP9cyBIU4d zvOfUv48e3=3&F}5B!TOB@%s|v-KveB1uF$v*6prmipax$S8@hf)wWeS*IG3VxBn2Z zR6L;aaN8X47wtdF{wuwa(T7pl_|Bo3>N_7OU}}}EqwEtkBh35a$kI4{GW^s7ZTX($LQxH8c%Awywc)TDkY1K zQH|7&>I%fhYP*zZim zzYqNtlS+%18Pxoc3T)Ji169SI0&O+0m_1gH5sI#U<5bgcvP(efT!sO-X;murMhreFW^;Ldz1dKLg4s))TcyE{-;0`R{FY%C{)Zi}xpso2lzehX6EavmZ z<}O;}4hCBAsmXau`PTA1Y)co}+j-Ui^*jv7Qr+7v@ zEy4fd8nOO`!8+x`ropLYqVH?p<49kgz?EDOx246eqXBW`%5Ed!uV{B3RC{hd#lBbJ4 z;YL9>6k_dd5$-2SM)LoJC52=`kS)mR18xvioJTnt#V+8c6+FtSbjas?>2LtCrzsmG zZ%hQ+H0h6sw53+EyTXEP)CGu-54Pc#3%1eQ>IgBwk#$Nwcx9l;$y^Af7vIEscS~bD z;-p=CvJ^gSL69)+_Z!)N(Kc7v;g~l@mJ;7U!Yninf-i@?+Z)4OT$TQB))|ly4c&P3 zm)9ls(09eGG+jhv^%IW-jMmP-p~KjiNy(A@xY@l3(HGfWavIYj)>?qOgq^wX@Ps$5 zzY;4bU&Lr;kLTRVzXOEGs5ABAJ?+06@Gw?;pa{skn#`%V{Q}G5e&c?_Y8i>)awnV-$4hksR2v;uOaD}D6H@p zW0Kc!?DTQr>gnhKuj2Sq$iZV^U&CW2R(--~91Do#iLo`8{hkbc?DiHms(#}o7Sp}O znd?m7!x-OiGiDIfA}wdA_=yT7Fw{}83QCxpqLYt2%oSO{VN3b<-X1+R+$9>o3|M?e z33C(ox6l_q0Zir{$CxUdMy8;C3lqMJ&+7A}O7mS*`SK#%;ELKfjK_^1}`IE7RQ^RVq^#LRm$F| zNU>NBfmS@Lm5IIdC__pxo&rgB4A7HoSePq$kdp-y#m6gQ@0r46pn0EO@ z2AUvdV+1l8N37>Od7WVNfeS4O@r@_x!8lLyZOWqS2$)fHvEZfn`RLf8;bsVz@|Thx zak!2DU&H?wywSgfz}Zq_D!zq^^~6x=&kH2-)b(scJ^`-JMxvpV~cpf}cznB{tb*x`xZit3A*0DhM)%-Zt zS56mV2Hn_Xl{e&D8=g$^~+%%w8#lXK~iP*|hEFRc9AHNP-c z>nbQA?;~JK=;zFy(uXkXh5i--HvKslEn^>W-fT==uBRZm#9HIha$yq!t^UkI;-h?< zbrJq8uLsLZUJnxQOsyXCaSKLZP?@%@tyX1wFhLN3QkxE22vwxwv`$zC+h;YEu*}oC z!ZV*Xm7vAGNDv=b^_`*&x2302J<2r*`bRWWuH*)CG*Gl6080rBX z=kB=j9!y~bG8;iLh7s3gpSREllfX5YaS7a@6grD>8Y1l~enI%WR>fv%P~{TdL#&o8 zF|1Z(S%ko*D2#%oB&+BjW$FF1Ni#~APhmOShZm%YlCQj&xpM$IsXm@{q&C=EXiA!N z3Q{0(2$(tLAgH z?Jmzp7=U=j3T@eTmy6MR8Gno5HWXJDr)ocLeJasN4!bpHdMSQ09!2y~CNRO5KZ{VGwH0vyQ*ux0O!%}R#BV}M?s_AJK%aiod?4$`({Y3#@daMk? zD=5q|J!&-rdBbs5oBTz(kB=x_yOo{*^B-}yPx8WHOrwv($gw~fQy|qD+AM}=x8sl% z-LXx}v{)-q!VI&!mtP$>?ekmHT4UG`ON4owCYlt}2I+F?7)N^hXBdZTZH7gx z-3*Hn8&wiH@+ZRE(H-77Rrb^9_}kx4yx+BciqrUhq6izIR6ikD%8= z-0`)3(r8#Q+#PQr;X0DE(byL=Cga)0T|N={A`iNRG4TdMY|Lw}s1A#&cvb`%cmDAf zOur-<6g)r2jTF(9v7)4GM7xLqh-%>johmwl;f%u@8lCesf<$1|iRhI&Y z!buHm;~622-mD=Vkw2%BbCMjxZP@!ePEGX4QIngjtNoi-4M_12)*-(xzJLhh?1b%B zAxMNMW;79TEgPnyL>vvGJ1;2XjO&ksT^(k*+@=m{fw0}=gY-if15%6aW3dcftHf3u zx4E=v6$o*wR7@26aGux);N%n(2%-yFiR{>Net{^*Vf5Y~qJ0(k+JjsLj}pae6a?5c zxbUc{4YPihm<6}dwWC8t87sSEm*R(umx5ahB3m1Vw>xYs3~8VM`JO&s8RgNqJ<8+a zAy8xr<$YgD7aJ$7fyObeFpl4~oIU3Vg(_nO&Q?$xgVs2n2_7#hf=YXqlp}4qblKTd zyG3QuYPQ;>Q1G(tKK=(Sw-#N;#4l|nTZSQRN{*8Qu43FkRyDCa&QjAXPAJ}+g;jz+ z1k)X-el(brFfic7Ia0+*UTuR@-hjf>7h8jyOOz-FcQcc3F`y0yh^lWg`A9VZvW5u+ zlQ?abhi>R$mSx-OA_oPR<@oqLTeuVVOEvxqMVuBv@&aTm!v`-|2_~L?0ivv`)MJ9&Ns2AWtLP_yb z^W9o@!-PiQEpL4FtKasJB0m&)Fib#sB^})M%R=4_=tD;lPzMWT76$wK)CkG=` z`5{Il)f3l>Q0pjq8s)ou>yj1Wb*+lXn#Ef$!AtyGNpY&R%%TK?xkBc_ar~2tG(qv5 z(}+9y+%lQMfs^eHnE$Gc zT%NO*JfdA{Iku6jXi;yEDteli1oJy~aa{Jx;q1=fzBk*#%MC;jS}Sb}Z-4@H>GNeb zKxn{&k=P>H@|N;<0nuSt4*k3@xh zKgT=AR7T&l#xBBoYr%Qq)bWidhNaQlqpNdo3*kFl&KSswaae>g9|>vI#g-VEnR^Af) zyZk{U2s*4GZCqfv3b|ooGi-%WkXZH_t;|Y=cv{0F84xtZCrp91Nd%r?nN6VYw{MG$ zP6wf*>+s(rcQTW)k6mgJZKT2nzh`D-(Y>1GrTFPC3~rE9AKkF_C1Podyn%5G30^k(>-NIO)7Z6~RGXl_ci07(=@Y z6m=IAfGZH%Fq)61YPLwE8aJbvbVQ*o1W!sQqz)MWWf=7^_dJ7>tpkBZH0qV_^KL|n!5lOLv zkU~UKY`eq)9)kIrdE^AIg}JUc8sfw{1HVI5o%1BpW7>Mn(4+pXi>M zC4BYe1_z~r3d?-FwlJL4-|!N<&RcRIF=5_s(nfXg@W3;p$I1vAhO+{(mUjLvkm{i# z=8a2Nkfpw)nyu+ zOzwqsmxzw0;*l&dp+>?CvC+)L;!%1(l;^_`P9#If03%A#n(>Dq1Y)z)h)8}Z6L)+- zUm%h*BF%AWCa~y7y^C0h5F-?9@ZJ9exGdBWin1+0HlcFL6w4S*pKtr++bbimZ6@)MRn7*Tse zafo0}Sz=`1MN=DL08#ei+`4@!PM0xlw^T2|!7)aa#sazHE6_Ysy~O~Y$v)<*WTK)X zQ1eT;0WtK}^=dpaNN)HMS-9xc?Lf^>Au)(_*QoiE6p3`#sQF2XM5k-i`~*cJ$~9_! zoT533YSjDkh??C;^N$gMlC;zv;wL&uot^C;wa zA)89drxF<#vv1XnWK6sUJpG6)j4_qVXRUQ?@>0VrJe=9;a#mLp5=?FiI36=1Aw)^{ zS>LGUTgTUj?&P}kgJ@lJ<*>S9ow^cZXU`cs0Z^zE+FYcz+0%heKENQ@HOSg>z@QWC zocgS*MT>;!S*eyGlfvIuT$%0G;SDSMa!q)?XeB<+j>$2XD1jTR3KH)jT)p#eFtLno zSNw7+KCP{Z`bFxV7@vU8Maj4xGX zYT`w(>@1DhzO*3psPW{%{cc+tn04A4)nCLeBvDlCUQ|WSy|hYtg{4s}Pt}Hew)l@g zA32S^r;#7KwPrjr%U#?ne_*qkDSsG$MUyEDOb@_%;R=NPaGc^7WzDi2=1Kf$iHr;g zgw{s>1#B-|=9O*RwnxSXEX|J@t}SbZl4rp7K?L|rm$aGa+D&L`EBgVgj0`u0Mrj2| zh{v_71snnk{JtRN=kfc3{H7q60*5*=GmziI_?296hGZyg(M0+u8JECw=&vUgf-|pW zZ)!0~QPXwpU4|AMWZ+jGRuZZz7#;(FLq?kjVDDu$nx#+ ziLnPL!4{HJml0#e@*-$Nx(1OLQsVt9Cl3j;R+k^0j5Q@cinvj+1YV;C^_ty8i;9vG z)fgt!iqJH`$IVn))JSPj5vLF_CcQZLBaXetY(p+-5TC!rw5Uc{S>l4Nsog;!x3#U6 z{vg8wuT3K^_h^>mJS?imgkG78CpD^P0K-8Xu-7!o-9xJto2S6ErYp<Bm}18{^9Zx5=34Y4$?-C%~2MosFrX#*Y{=NtsEw1rrX zQ)8wj^^zA`vhsaFTjT>w~1CQf*9ReWhwnG0JQzTFSeYNtXbDO zodOEeW?2c6MAEb)CW>7eH%1^6dSVj$X$R6;kr)>3C|nH?iIe?Sj6Rqf&b0(BXi!VE z$0W&MZou@|cIF0eiwd8awfra?s%_C-%++d^hIY-;&}Nlk9}#IRM@fEaj|mt*J!kpV zlD0=kcZAsl&joMtJG10~RSkbiUNuGIH8hG~dV{i;rZ+<=Sy`e|9)3;Q3@lheCjb{4 zU?#+3l2<{zAQ1~9JVB`Rx-W}1sHs-#8Os{oste1fDeA!~YQpj!t#?85piD^ zmQPYd7+PIeK0y)j_;q3VI7Mt6ste1`F7t-<8)3OyvO|aC%srN%ny~B!V{-EwjBCpD zQ5SDx*)b}~7tT_dJ3#zOKxRo)CK47)B}XHB2MId}%jM)%E8n*6O^LD+QZ)f!r-{X; zZ9_awN+_k{Deho=2NBXfofb+=r1H~lf(hI*2pCk3aALw#DS`wxSr)7#q!6J2mw0q9<7;)Z&xca}%qTf#$ET5F8d`!dMt&HLZ+o6>m))V3f38BFYMizMDs|$# zf*B)&LH2(d1wTC8Rgl(5tsTV9;O7MVmnrNVx@N%iwBlh^NC!d zT>P%KmM>BS*R8K*@hUT4M#0*PJDW+O9#kT@0LzvWu40mee`j8B<+^IK!C0jOCh;G)wdnWMMOyA*}o(iMR%N&5()07G>82pc6(5lZeHO zfNu#!xh{H?F%2athhl^SeiV8NS;x`?=(9f(3!#I`@b)nY_VP{|DI`2q??Adrvw;B` z!m~&@Knt)X3n%J}Zwp+YZM2ReoC?4Qyx65M_=aJSY7!l4@Y^QQHr>|gkT6OEgATcQ z5nkl#)AVG6& zlCGFK$4>Iy?yjR0j7#pmsVv!x$mwAA4ri5}r;jeV${E2774dl~>;yu%939q#N1*}- zBk!DOmup#^{&*XIG9%{6nHhBQQ$6mSedScoCsCx9^C1N7Ldzvlr0gX`S&wU-Y9A1X z+C4PtY|oWMu>&Sx5%AgydH958VuyS^Klm%OM2-t_0#XGs6lIE_D`Heg=$@gY9u$wr3bj7>_H@)M70g#7}P;H_VIOaOi|##XQ}u; zsY~Tie8Ov=kbWZwZM?f({O1iemi>&5HdedygFVd0als#gBm##;f`1-L)| zskIkp09^J9RV&}T@mBow{P9M|@-M1Z{`$sS@$+)VwSqVc_Jds7TQx~+%JH~^UoS@X^QoTZx7T1urc&Bj~ukbHg3rBsgZ z3x0f#2>TIoIEAsG`N3tt)wlZ->x|GCgHgZinQDCR+W7cY*0L z2f9X!9Vs8$+4Cnq8EE24t*KVu$iGalpb?w3PVuuPG}me5XRo9YgI%Zi!bThUU*AF_ zAKPFfmE~n+sF`jwi3~U-EaSAvl4N+Z!1?{jafwb<x-o>S=^^0*X;P&9ykPu-2yDKHnN4Bc7I#WG6daaR*CNwC4>< zK%zz=>9N00J)*YJCOZTA6#n9tWjw-)Xj1Mc2@%ohHTc`KgU|eNM~3E~uB#<_dRVfA zB;&)dwv)toNq!=#*sI!>wBZOj5G`lJVdZecl*KDpH(JG|>OF+`Qa`tk?v{R{JHC~{ zv!&EnN{EzLHquA<97Pv#)7*2?Z>->`zAdW;S|4GgTS!Epgz_wJ4c`f?8Z=Qf-o9b|KkNpr zUf)WNbJ?3+HhF7VZUb&kMk6~{o!iGFfa9dofuvKiBOsj)B%Kbn=WP@rQtc7`-1gEb zAh$}xNH|BPzZf)>*z#+{&NcRWtVJ` zw{vxr>(YoVt9G}jo|zE6Mcv$N-Q1#XZgF`Vw$RPZWde<+%iAE%*|R(iqR6g;8RuxU zT{q^1FC$A{ql=muKKOeX1bQ5#b`@9n_*amY>IeEpNQeN(5(@;`b?sko*Oqr*0Cg z^9FI>YmM(#oNE9a)2pn88W2Q9gHd{W)(YlwSLtr6RK#R6s};AnJS*lWnI;TNejR~T z<`fSAhBSoLq&Sy+P>15(er*ARB~sen-Wcwrnpu~QS8YB=w{gWP)QxH7-~lrr%eI$< zG=-d=#O8o~@jYCCu`<~LvjjyePZ z^EJiHR*4IS!Pys;p+c_;O4UO{6c0{T&Y`@`{|ZZvqwNkov)0L_CA%QtTd*iVZgvns z;#R)JQYg9%54{Tl^dS{Emz8K$kAhV&HLD<>FUoTZNy`3^y%@eC3v#xTOD)FPc^=)# zrSd#7UG}v$0YD&%@qEnHmu83r zl7ztNLkz}$*HoOx({cY6&-QbHRmrFQAiOaTr(`)*Ko3Yz+@<$BqRVL=O&1{?J#1 zpGsD-#EeIrno?SimPUuKH04c>Po&m+~nx=!O=pMC>&l2Gpsj~T%hW6e4?@3MHU?0lJn{X?Z-^AFC+*s zE43h41uvg*U^Wm;Rh*nwUq}d+ebI8pwu+~X7gy&2Ita5NFpOI%U<~3fmZ@M`I2V9E zHN7;>n(xBnWj)`eQP_Nl6}-T`H7xOQq3S)GPgRZi%!NK8v&t}|+~3>^#t*_B6jKzO zQ0zFd4zq2rWCqOgg72+mMBNsisFFt%8)mHFJ}&Tw4|0J&+~eB7HwfPlJ~Ns!C?a(@ zV7y8Q!4u(xc$2d0BBc;Ru`hmr3tUAU2QGMo3v5Un2NmHU7fvCN_yJF>xQp_ZsT#UQ zM*Ga&nG;SNK6^RR&Ii#0bqIV4)1VIo)6*tFIUw*7kDdDBfhQpY@ReH2m{62&%KljM z@7h6#F}SFUz(rj&(ZtI*1f`a;3D zy7M9Urn0(-Bjf4p8%O3QV~3&Zyd6NL9XBOMCc*1NqZwsBP?jn^3LIJdj&O&-*~b{N z4C93{WV4IU5DL^qO?xj@P#0>FXUO9)%ZtUpU*F9QER`TCoq8BK6MEieQTJA2;8+>Z zSnKQso8)qaYBYwN3<62y%f1HTk0L)#PsPszz-Oll4$W&CG72L4w9 zlj@*YNkvYn*X0kA4vLBl3%(nA&*d(1kaIaYnGV>rL>?RwlhRjg;nGL*?jx{AA6=u% zkdK=QusPE* zY|5IplNjzA+5rnkNx^CFUSAlS(tCTUOq6bpE7?l|X;S+~u|_~VT;-<5r>0D$ z6x-sgf|4nTsEu-pD#m4Lpcg!!N@WR{t2e_imsl;tJ}CJEqmd}QP>^z-i8wBFS!@Ie z0H##xxy292iPFlR(`f^aN3&HOOmC}CN%lW+vn2aOTLFE(MbkD9dR_AX%gINYkSkA9 z!>%PuIA~u66-3`8x#*uAX0?M03IzEai|Abq{F5{%Iffe;G`fhiTx1)R5$Zg^nrJHl z*hovJB-(9b6m5ZgbTgn4Db%X9i*@p-iXNmb7xH!wcNFBn@m z$uLox{YaybHl?g}^x$Q@e?zWt@?n+$&H`4+xeF{F=fL`b$!gA+({uS?0mK=io!raTaEKHXA;P@=on zbwcNPcYh+`{zdMKH;|kM`Br~s%^NXZLa#g8i04PvQHJn(%qbnvIth(i>8H=E$de54 zaj`@EG{u&AkAi-_)g|5|KuS;!pKRBt$+nm9T-L*k+8kBiDr)TV?rjx0zYcP|6~-!Z zd>!N!h(Y=c1O@Ci$>$2g3n;$sWFG=Twr7Tsou2c^MX1EPAeq8hgMy zvLp%}+*Bw|j)8IX591tlp>7(VJgUY@Gg*eV@)dao#iF3znfjmUkhYA@>zSk8WGpv! z#P{<$(3egtN8w1>2e>BctW4$bOfh{&L4L1O4t zxP|phbMtPxS>!kS9|P@-qDQ-B zb!ckAQ@ibO6opABQgEa;MiDC&dP)nf`)b8Eerw4pWEZVf3O$&tRFvLTihL?q8U1rI zuHzaa;(J`xvRKkGHne)P+AQOkf#(h*hTQOE-?0Gen3Ya_t#1(%zi3EUm-cAV?&Y!u-u6)VQ!NsDy_zJ8$V@Y*T@{iry(J9 z#BXeOER?B6H>eHm~ zdO=)WP0($W@shh-p@z9s9M+IKGRlAg0Cd_dqM-u;^J`;+URrTS6HKKh*CP#}!&og$ zbD6r1;VLDZX%Oy3?W(h8B?6USTVh8qE6wEBA0nZn6c|kKl>*~ZPzD8NlUHC`sDVL& z*$jmcCosTh@Bl{51DMc~dyJ%q3a>YOib3SC@(nO-W$1YYX4{kk)AtHYKPWKVWT2$$ zyxX3|G?og?xJePdR4Op;3`{*pvklGhaCQoDA7jc5zp6?lNSrWPya{lnRW`F^&Z?MY>s0fl*Rf zQ(zJl7}HJGQ(%I*&*bKF^s);z=oXJ5m&sp;0t0h6si+jLk4LC5Tu(&9Y+PzI$&n|I z*|8@25|z+CocAAE>Ks12M!z46f+Ev(icD7vyi{bm+E54q;A}MZ@5%1nE&k9nnWLg{ z{DL`1m2rL9;j0XUOJtiKpv<@~T&pX6-{jxl;@|fQjo#f$osz0IbA_~df@S@{v6vk7 zUyvqGj>)cRG!k48(8If;XWimiiX@tg0(PBN)0G8kG%O2|_X8d6O0U@*Y6zoVLcYQp zbX0l`URCrOuUvMRn~q{KS&6qBH-o+*h3M!TyCb!hBu%?-D4r9#6nNDRZaExoFgxkye<&1MmU-5-U_? z`pHNQ1E?1?s7~*NAE$#%F52tJ81LG|cHtTsm2hmVJG8|?9k!-7_HyZzOHndPn0&2q#I@Dt{y|keG543b$dMxbBDdAu zV0GIfcVm7li+r}6bdgFx0@OtVAuzzbzQ_&4l2fZ=lm`g*9thVA>5MGrfWelLpJK_ngV zl(K+*XqJAjEYPN(nyHQEy^ESnteQwQsxAI%t(sy<`Zn*9wzHqtc3t--Bv)@vf7 zQ3~--1Z0_S;X#ULnivN(4$_$YQ8TPuy=v5(8CqxMdKbW_Z3(G8Te%=jedU5YE3aG* z9~{&h!*Q?@jPO)j?AHn~l0~W3)YlqDnn2^bO5U&`)Ye`ELu}YhzzHp)Ni3H%?_~mf zbcV2~`725V2Uc7>ju|Mmf}wN8HWXrHtlyT4P?_~Z^RkVuwQz(gZp}#?g1l)tYTZfH z5KFgZL0#j>E-dDS5>o1HQzig|11EBNK|_HD5`!gZxCjOdKu9HMq|z0nZY(Ru0IpFf zOj66MK52QW;q?YlTgr6Fcg3*pO1gsk%gH=WNpLX>T}TcT4LSI%4#Bmc1&lB(JISw( zPqDoiZZ6@~DfC?nsgd036#A|iq&c0)mZ!v9!f!?r(FtGjWs;vc*CM|Q$(lZ`F*r1qO#qbKcu4+dQ)^d6DXi=J%uMw*^!^xyl6ACOTZ&sAQKOBLE(Ln3zmQfxDY>c zm#3EHM>AhBUkHY7qD^55H6IHT_6B6l(|a1s!=lwY`HwMz!qUS>&l>{*3B$nPzo)% z$EI<)4w_xSU{<~YC0QAI)_;x_yG*-4xll{HfM2LMHp_+THy~byT_CO51=6?KE|9HY z7s$-9Nj%k*V^gYvqdY`=YEB|WCUxacK}Vc&Z1&*6W*3;jE?_GEdUk=afS%i?Yg9;y z)!3y*dwIPYwb`pU&Q`V*Z8i_V#E=4Qy8D>2^|h;xJLj!Lm&ja@PoH$+rDYQC zkFX1mk|2NrEYq4-*76br!IXK&;3kcL-EwR})7=SP?Q;uv)?Qd+8ZPWv@mT#`zN^Y3 zQEuiNxDS!9T~(wiR{$6;RKkYz!6i#6wZdk;i)7WHqW?X7xygU&RpvW68Oe59o~0J? zG3|OY;TX@8za=jdt|$M4l)AI~0-P+axmuB<@HD?u~g5Z0y+SDvAy%~2vsXd))&Vu2`nk&vKstsyq zycDLPNL*P7UoN*R;B=#r725Ps@#klP{20RG&&>orV_QvSSv9kZ#iyN_L4ur$inmzz z5EL(@0UHz&FJaxyKm5CukuQA=4d5C&R+G`Psgt-nArP_>S5T^}D|o=p%sU1!INsHM zDdpH@URMbIvrVw}$rgR0l=n~CKF~8&oM3U%N=~~Sv~-jqTFI$e$?>pzR0FqnUIzuS zc$%Tbz`$P8_zilc3{xRO(#m3#?PQA^pgYxZ7#XIrN?R>`RxqA06=%4n& z@}VU;tB>HNmhFZOb-eSA!4_V6!uCOsiVYb=WQZc|m6)%6$sXGM%oAPPY58-Hqiw^0 z_AzI?t!{3kX@c4agrsTpo&0LG3h4a)3=cf`az^lFdJ#_l5Zu?Q*B($Jzxj zu-oHpLKn#!KqofCGGB89x%8O7=JOzZGZxd${;6tCmiY^@3Z2z?g_OKjralEaRsv3x zn03KQz__yHA|=<9zb@Hxu(m9D)k?tZ(2js`vAdtM+zcS#AgStf&zziQ8ibcm>x%Am zN>@TlpVAdt@uaSx*b`hO+$#fl8NqNu50T6WH$Y=GuRa?J_QkL1Hx*``ouPb!) zjINMS1;I*+QednEkEap;mDh}*Z$pqAZ+krimL*+|&ca^#+>;Mg;pRq$wr!a*j2BO_ ztNl+}`R43TqTH}#<`Ajl?63n7Y^7FEd!FQ!XSWDZM2_Hu9-;a-s5*G(7(+4!1R)}) zfDxj=R!A1_7RiOx7}9yikbXTZXd`Kmuwd#K5PHPWf6t!N0$64(7=ft2x7FUm(9Uy6 zqY)0?XMx%K6`_F6fz9rpDSG1!IXkmXUyOPW7w<>XBcX(DrM5kH@-kNAmy@%q2qaTF6@T zO~wmG@jq}c8=8U}(SbbLD{9enpa)f#q?Y4ye!P=fc#k=rsl6x*j>Y3sE6c}r1Oy64 z%rOmF6Xh3ZC9nBtRK9#&w+hmIE#g#-qLKY|v$`9-r~+w>EXY%(ema_gBw&Ko|I6OH z2T69_b)I=|KC3FTI@KykrS6h+GgXpGrZx1;D&$5qOkYix)V-FFhf&0O7e$O>*1HhZ ziW#d>5dMQ5HG>(5#l#wL4Dzmb!!tI6nB}3xo(RL*Ai%?VK!9Nln8Aw;7!a=+!PvmRMh-PN+|X5PGybAIRd{(a9m&W%DM8bq@AlQ>!T$F{hM)*0dQ zuJ4s@MdF>S37w2l7>Eq@j7F3szASvZo>S6!=7%|wW>o{ZVVoLq%n;VhFx#pT{XgSX z>HC~ufxQ4_(2Esul

G8*%GOH<3-UMXAa+(Oli6-UnZx@FwOz094ct5N#9OIYd`$ zuF8Zflgg?;U7OAz{JBdWBwE=m`P8`ZYGiI&8m4` zJaNo?0_V}$uwhbI=OcA%n`$;eW>&F@Li2f-0_vE+$euBc;8l%=C~#7oSF~$9HH@to zeN>eeW)rv>1WuK@Sp`a?lzLcTgD&jk$TOmxw|pYEIO_VTET)6YLn-ykN~~tI+@wiK z10->0a&s9}{-Hm~VC7V1?UiC#Xg zBPQizI?B1%5i=;wDhp<267y#k40CA~40CA~3_OBaFwTDted>ywq2iTyY80g1)-wrgmN!%sXvZ{Hx#3OL^-qn_O{8)4Ft%P0YC9<~W>Z z;+8FWVyKjHQ$M9hAs`boY?%v%XFSqWjtadz@dEW*y$!^Zivkh;T+3%GhJm4aLAPe> zgrUMN;Dp+(nSMfGS%-W9m$%8vj#|oEaItSpqv!g6lT(yC)e0G^(>KrmoBVvY3;(FU-5&k7JWr=T=Fjg)0+`kHks z!=W0g{b}9+%W5thoVm;aMwR0LzX|jYdkgq(z!sY?P}7dD)>NIRsZ?qlxR5{;VN=@5 z!upHuPCPbUffxv!uPclORQF|w`u{d|6Bv29p2y2|H7^fW`}vLVqPv2|>Ixp4U4f#p z7V5kye%}%ly^)V03fIyEjI|%i1z;Z7f5zeo&O7M6VXA=M11Ia+f`EMJ!zm8A(p4(C z$Hio*TtcU-nsryu`!1{kE=`iz^fmd_H-D?{a9kmbfZS%#`OcaEH~+=ldZ9E!14={56b&E7G~O;Oet?NV7K zx43Cc6`jbLCf~e;U6G!4_9VSYm{qbRrpkG-7Xwq@uaPB|8nxMQ_AdVxG%p&PiF$pK zX0q>cWx8+BgRnonv|H#^E+f^tr1{~CB8*I8-6@Oo)E zs~=gA5E{pPq(vN2oCVUpzv*GAv{J93mDp>i0o}bS_wqbw?yjK8x&qA{o-S9*`k)8U z2mMSR%0G|mhELSn3?yFm1g#x21E~q;QPApVixwmbTc(* zi+I^qblU6MujBglTqHFJBS;O-8P;X$%tA9P4M@ESqn@*W%k-HG@?jp25wrDjlESj*N47-c7`L8zQT4jAU6$wJk9*vT4ZD zZ?;bccEg}};2y_!N4R4gU({@4S^pu^i3(F2ZT<}=ToVq$^C(*ml7ZoWMZeo7Vj zTT}dn2HCRT^_gcJ49h&rZ_*>}i#-R2ifLGulCT^_@tqalh0~&UeaWvfv&Fl}o#<_Y zTj>Z&_I%}3LLC}5?q2z#`(O@j5|HLoD zqojmN4xgsZtiY130&+K#aI}cck75fe3zI@l|N}D zUz0bd{sX!IGbl!uMG+UnoC-)@(nlBUS~P&KWFZ7zf_dl0u$o~dMU{_%onY@G9wBv? zD!(k6W+#+_ZedNc6AIl${p^Gj7xpaj&rpN??e(F-l|*iJIG*5Gj9* zu~+V2gNaVWvy(bR`J4MilCSMG1F1h;G1_o4S&(MXyPRg=k@VeWhOAFhAi;wuzOXI?PDx=Fl`b zqRg}Hio5+?ERC;Ei73?V0h%t0ryD@T-j zlr#w&WiS}>k2sXYO~E*0GDp|3rCoJ4#CKfVf#o>VOfqeA48D?Pu)oKd$4=SfM#3B1dbn2{$Di4%CEEDYd0Kk7Yt9ZQo7|Hsn=;ANN^ zg6f$lTlS5bq?`OJosiF(HW7Yac7|uXZFsXQND92i_iGWopNF}JCuC#{jg)ZUB|=ug ze$Qx*-8?ANEYeYyEF_(H#PhNkdU96xRXaX~e$bp2uZY`*)zmEgAP=RN|^Y-zY6vpScO!2ACATES_oaphMtZ8_! zoN%~Oy8_>p6NOuZa0_c)U`33iJnhqZRnH#$A$@e~qkwv5jQ`3Nn3+>S>6pn3iuh;` zkrMOA1hOuUspYKPn36g%FqQzunIf>sS<-c`%?iKlM+Qf52y}yw^pvqEKA4w_S>(L( zgNqCqEC7NsDiU&M{C^jZLFhTgl8B77uEi`|z#iU-*eZ@2cpkyN@Oe>@wp9ZW~yq6KqgF*vdIK+)ghI6N0M)m06o`N9?Cj4FB3&zn@5>8d39b<=DhVQ zk1}20$L(XHOcBUMnbzES63Jd7>~ten4m)#l5`q@OPJ9~|b`nCknM`=Bw}myJ=2Bcb zL$g~xb)vJkzSMYL~n@XRFIH+gqv6YZN^J2Q&OiB3Y zgEx^)WXxUNj3QZKR}wOukyEci#3=bl>Q$Lc=jJwpo68yqswa}Sj_}p~8(P9Bf&9kH ztY^v>6-U{NU6x`6>QYIckB4)qe&fAuy$eL60<39)gBzYmxPP*fo)|`c(LpH zTKvh_+1k&=%!lN%PsKL%zwYx+C~+$yk*p~!V!(C8>Za_x8n6`L;wuDS^h7^=}nKa=K`Q3a(Pm-nlXs?&=Lx!<2I;nn)>ZO zsXN)v2=y+FfJ?Xl@wzOE1Ygd?S+=Y|ta54+E`j(;M6)NCll%il#I}$M|d9cK8 zF(W?YbAhb_A%U2H`88QF%rDfmH*kBH3v5wzu1gDZfk!dFion&pQ25wxE--Pw1hc-7 z1qK>m)&U`~jM$it-7O5J!8hXuH(%Y>Sao55`2%h$yF>sGIg^<*VWO?j#b2X3qv)S~ z$E{QJl6_}ANsUYP{k*?}0-^A? zyIEG)9BMnYX?=UGJqOnmeET`Y+;j5n=P)e#DO8ZA@a^XczCF*{v2Tx3$YZi?{CX)6 z=hyQokCHMcFn8{^@d8a}vhis^xsC5hrXRNsWP=f$n4 zE_mY!F7dvIfj;mC$mw^7HG0Q~zJebM`8*z>umzciBfu7N_S-zjvBmw~pmTfJ4j6BM z{fg{4GVjhCFpovvK;4IYngMiw;yBnS~7h4EPj&NNv?d^7B{hiy)A0%BLGAAzG8Ftgc5+W6O{XXKcI)N_J3AS zp8-2`ag*|5Hk$t`o9J-`aji_tZFrP&ipmrDa(PO zVrBAVad;ML6_0DK{{@my8YDPE_GmC~gE!!2slBdyO_!C_oiO=oKPCF-g#bwL6Q!#c zHGkGs`$G_bv*>t3zLZ$ObAe-kGQ%j_gmL7RXS5a^p}5gXO*JCT8A9w#wrp2UP4gW^ z`9LqjblKSeRC6Aw7BkM?fdR&$vkn&wFb(jlctI1t>@v|S%D^c*SelVDXGmjn7A=Hn zwzH*oiSL9p6Eonm8Zb_!O?k%tH|B8JvLjY48@#NQny@4ZIeLmPHq>Vyv;SL2JD8TOqeqjG9A-@ryxTTX3O642`rI!x+s<<+%+9Ht$`c7NyeXmxDcEg4688fbjAFG9Jfu}tQfWceurHcgHq1k z)7Mjo7)H-8`u8hJ4Hx4Xp#uFJy)JWRafirh5#y>8JXH^2N=rivgfp+%okwNryk!vz z)EaHRRbEgrdE4L?&CxL5i}_eJ!4UK!G^-vs;Y#Z>w9u7?DK3$u_)P11fjZQDN1iJ| zHkVIxCCXF?E+59jt`H2he1$<|onEyr*c{_)O5i%>5nTE0CO(i1P{?H-bz!Y=xg#Zv z39??2B!@9UxeI4F$MWEUZ)D`)$%@-XTfSf;iE4z<&K<1Pv%8{;PqiMEz*=_ zXBYW+t!=p&4CF%Zw&~t(($UWBqSX3?x99Ke|9qUkPk82HZ}Ia-dTVo~8H`|zTgsft zBY39=F5!$!dTHgk(gC}qoE2mkH&;6FS0O9r!b35En>76r00@YyAjA@AaN3U<@VPK0 zEX>*OH9Q|^`Lc9@MTni9X(_#Db|w_JT!e21#)tMv3y0AK_pQvtxZs{UVLRt|*0KWN zbdT^>z>LO9nm}rtRA)0@$!rFV#0EIU9;D#2@T$hoq~O#3i%EeJbCLp^YDkv?g)^_%8CF?Pn-P)#+-G_~cE&ZX zpcuulel9@EVj=5rEY1Sy#gc4L-`p}_z=Y_@GEqM`7Z7Xz-Hx&lZrgfJ1tk7f&-i-<}&ZJ zy!vcjaRN4I4r8I>^!vhX=DDhZcRISC6)AUjb4BlzM29pJ{k71X0c1>+yU`{PBm>gl z%2GjERt_&V-pX!tH28Y#a=A=Nre8auZrG z#Taz_Xj~iytfq~@DKn*E43wAC7@Q)Ya$^7}PGf-ZtC2Pbg$7yyDM4sSDjMEM>&Lpz zu*RYsc`g0s*67g`54y*p%d0Jys5}-xB}k9lk@Z(;P=F${R~=$uxXkppKxJGEqs-iCAh1UVO+ zCS_Njb(?GsMjBDY_a-9GHd-RY(*tc4ZvR008MRiJ1ZlC7|Jkxr2<}4vgNX84d|}YF zE#Y?bEU$+WD7l1GoRbyuwZ6)Z{R*DW7XBK3kSkkZ2tv>@ z*0Bp0a+zW-rMPUa>4z6G0G2N!DGlm#T%)sE>%K2+Wh$$SZnHjw6ba$5k^t~(7R|Tt zBQ1i*%*>l?i_x%w#(IS$1@X0Cgo^fM>-=abpyGNmaH~)^w)haR8+7ZsR+UkH9)1~F zRL0&bKU`f#jy~=`j>PTwO|S4vId10_7N6s*DeuHa_SRE^X02;g3}P){aSMKJ5wef& zX8#f27A+EjgYmNVR-u(@h^;V|ZD`LMwMfVB)zuxa?mQ>uDSYtUs-%dM-0ur7vjMQ zBn&ISf$HI(*lIso*NYJBZjt-ULww$k0~7|+i~`-U6>+xOnU>p7kfqzI(#=*mN}~mr z()j@3PUQ{IJFat?C9wQ=pn+J;Zp6uu?1=KXw&_W2KuyjAa+x)QWC1xr7UQK@AqmKA zdzRI9EdL(fVMF3@4QSC78L=`x0>cK@f#S`mVFMpwOBqX4RO}!qb4dnTq7@`H%`Y21 zYl*d^p{UT-R$!`#x7)aZKEEx6Aa~CO`b9uQS{e}+_zqG^8Jy7aOTdr$3AC*-U;n$f zL(1v{IL*3PpXob_U018(@eYn`0v3}Jcqw|8I3lKX`a|vNO47cJ1mXkXdyr9z`oG+; zp9YLeN52pqLThfMsYyreUPxj}w?iQ%+L$9*4c_uj-XdvWGUi{J(M2#+DRmdbmN+Z7 zziw?;Yuyr&v`~OsVdpl1{A2l4vH4WiSAV4&GV|Elw2D>^V;eJHog##*6T;~?H)b@| z#*9WoLXYARdHVx3Kd9@6agEydJ-ms=}UQM%9 ztrl0KuQg58ulZT3xBFSDhHLptvcPIre`xbWYDo=RiU>x~8qd7PFrA=eO%IQMXI4Pe z%dCL7iOosTl-PU|3@G4wM;o0JX$u&TIxHCp1;p)OK(Q|%PDKOpC@f?gt&Wc6AV)mo zATF#8-G#0bv4N8q2r-bOMy%9!Ec`_b1JMmX)FIS>?)3$i&@cSx(^2PzJg2xHpVB$UGGy)|rZTKOd3y1_D6Th}t#)T_exci2Jkh`DOE`sBH?gb*JO+jHtQy;Gg-m?m&WQX{0+t!@rrqJ94Utr z^%a;S0mj=)n8nOhO&2Jv1RX@;bX)~=p&$NcEX;paR%6jj< zBSWcsa!Nq}BTg=}(23cj@D#FI2f7fmdiRqOSD*{4kdn90(G|*^ga>-ba&{xS;#4dci3ICF0O>(UEaUpT?)gCj2C^1YT9j>cQKiY z^9LE{ui|r5=lp@z^JVl`18I`|Bh5-6O|lcx3><0jkZ3M8gfwLmS!TzW*Oq1AQwKsQ z%~R9-D<>dp5|E*8JF^o3No>tXN`8SvEBi+xWZ5YoSao{tNv0$b>z&Dj4!U}8tbeg=dfzQ$i^VnfTBi5IX0l~^@9?Bq z3(~c^f6|3Yb<%~ln_jx^$VqcPFXPoH>-2wyq!{Yu!O(}Z-mN<|!L2(J8gh1XL$-J8 z3Jp2ez(0r9Hc1SFp%>;Jz!t8OlI-%8ESj;#zt!3lF?5mUVww(R&8?}d$%>X(Hg)X% zs6!h@tc1bTDhU1yfb+J_W_$Y5 zwt0!A?x|Te)iL3YQj$yMQLOBPu~$=2uG5X;&E4CN2x)E(q>;e?11FY;->9B+t*&fT zM~vLf;`tq=8g8;>I<)4I_n$BAUoeC{cRYV-a}1J8=Oo2@Qy5s~AAMsjnGMlYC=l2( zqVcM_*km~@gngmNV;M?Yq{{)K{Nh};+L=~`2BYhf{cNpdm83}Q^P}>^FI?GFPe5}{ zv>+6^O8Ha@U3K1I|`V*;cXw^isTY}%b1P|q*t_m8>H1)ey+6XrgVQ}wB-sJduW^?E}hV5W9c zY7zn(?n4)X#nryy4X7=g_OJmjM}xS2fi}FNauDk{4z&0LCA5YrncO6VuMsi0T@BST zn|ATD>M-@QhLSA})iN6}ynb`_v&fogC}GV=x1|FAY2>P!W>j+B6(tg5HA_D)yR-e(qjI-hVy0Uc<$z~Fc~ ztdDI|?vH|74(Khk{7g{UWJG4FvI}i+72gPr9eKPP`T=-Dg-cT zNUH~cD>07sQHy)FIavOgNwjg9HOyN$S>d_N0C1yF7f3^hUsk>Wbk3}9E#06!SbW6t zRMu#NGb${}{pd-dS3x&D?aM!IJB}fN7u3_bA$)qL!Y?_JvHuSUmq2iWZ~+)CK)7NL z;lgnY5H9;D2$%4c@;?EtgZ%RTCr^j+(&6@=3`U!|p^6{3b3+YB3*~u)gp_K2Y}I_e zgN(8GQIrqZMfdEYYn#MloLh&^jU3^Fd+g9KkT!j_v(We`1zt z3hFyngXR`0x04ess&-Z{Pu0C^JCe`^uD`>CZk_qbLRQPN{(58Kgnco#wCGO}pAwI* zVnx?n2q+Jm(C`oc%j**`{y*k`@qd*A#{Z`y02rTb%M0-BO=`b|tEdgJ{!b4YFg|VH(eb;8<3|AF)rWUC zfbnU&xTk>e>YP8wvN!^aS0~MG0OQk=X7+$_Cm;t17@w9zM-DJPZ3lO!0SYi|0R*dy z#}xGqErOANtr+7peFkao7>;^DC?O^Uslav7C&P-T>_+S9z)AoILW@0}9% zV7$7v+DE|nv=rE#SF|(0cx5#)0vNAO;38nW;DsFwV0_vk*_~<`0gPAIp1T2z&$f#N zoVEbt)!Cv57|*n>v&nl082|rv0T`bx9Y+A;)#+FUj8|u|-2ldSK$?RBjPIbSyU0t7 z0LH5;*D_$d`Y7%OFg{z->=j^q+E(w*sO|(XUNCY80~nu{L>EIabW{N2KSnuce*xpa zya#~sX@_BVzQzb(yt)C|0xQvoh!1%{!1Q`GJEdk@|{PmNXeS(V&RC1B_4G@~y0@aJc06w^&ZG0Q4&Y#%HRs3vCF1 z@qdI1;kH;q2Tl(d|6X~do7SE@B7kwNCcKY;acm)Q@%|qJw}Q6220Bm6u6wA1rctxI z0XomNio_8n$oePP`y#_jqElWUW7p{*2o&VY6(L&{wu~Qp=o5mz7 z-+%Hn0NBM7H6*@*+de$Bk z^*^eC&rvJP5qmjKKg9I5^3<+RvP$_?mKIR-;pz4uFS8xk9(9W|usnogi*tUe;j653 zo_?&n_=WtW2M6k&zjkvsKDMo+oh>wCE3n!0w*LFY8Lwn(ExwJ)=*3dcQip>otaa@c z&eU4hc|!L2sb;#Iu-&%h`5ktNC}jL*AQ6SP9dd~%v~))j;W+2OC8D5$n58pDA}}2r z{WFq2B*Tf`^P5HQL)(g8fnMKiD=p}eKjbE`^64d;C|gbSO}p2@2cppOmw4awM!`4T zO?YBTs!eoaqO$*l{s?PG^wa1GvlB}j{hwn$2I;Ky4cc7D*2J?Fu?uq>KBP5x(KXqM zyr0TeB8#cT@jij?K+db`9vu{TbSgt z8Has(A35w(8Has(M;unjmw$v_ZT34bhN2?tt~{z9elEh=xCL`-fwvo*Sv#M8J82qw z_F^v;HswYej2D>FZ7{B7qPu?ah{L~hNFjL-)Cu{EY)g0Tuq!s`|2U$EX9dl4#@0vk z6tF4oY^R*B-jq#oC*1Q(7KHteiw;mKvK5>JM>aVLUFZBbCiV7y#k)HHHSKw=?CF@= zfVK{Uo&e0JOotCnarupe}GjI}1Fag67!v*O=(WE%KdRE%vD;{?%*t`HZop%GhO zUp~Fq&~8cE)yTz;+Uzju|3;(@>+IC6*;YrN$|Ilm)66J+M}2eT^UV^aIW^@PYO@rw z*c~DEnIuc|UA80U?zaY6dS?G*>FJ=&pV_RL-xeE6PMcpQsp|-HZlsMElkM}% zg_b&_I%R&DqD$^uqeM&j-}yW8o|ngi1@L%j);72*BW$adF1Vm;JMb7L8@z+;W{pu^4V@>y#iI=Z4V-qO}W51 z^zX}*|9c}(mv!#^?3miYi?n0C$NtT0@q5R((4Wo92i}FId=Sf_&l=M7iyJ)~T#Z9p z0Lto}76oli#3&-#J7ZIL+aWhLg_iEf*s%OlE}#cj04hktIAbFY&r>E|Dkh5O+k$kC zNr-=P+kIgR6#ZtlG{&&~6}s^OHKm0bJ9v1hTi47>c?T~YJp`|oy6I1AI>?y z>-oWa{X#NNYU`7>GO|z!{a#sIPCoQyLdIm(*u%btbL6sW?7w0# zm5%n0STL8qBZsbYI%(q4b?~GXlBRd*I!RkJ_-1ItDvzV|TG7X-o#Uh;x8`Mx;dx~9T9029ElDTXZ=PhmUwngazM_W-k zqQFK)w&q8~s$rju(oaRM%dvI&i&>F2R%#lT;Vr?feQN&#&o>8Wcs}XNC(M z?QiDWnuglSiz!LRkH@w|rdG_&`n?PM^Ac`L%mj~UD*5hS{>F`V}ldZGU-O+ERG-~ThU2Wqub=~Dl!U=Mn3 z?V*^hRvr-q>Xq6X*(|&E$hYvh|3c(-dN{* zGJk*Ed1HN(a49true!iZ}KTtcLHVnfcH`UtlpgWv(hchMy{Kyt~+}7C`wt40I z15E*tK-0FPsiq{>=-+}!r#JQgH@)h@mDO7Jj0sa?2*DNx>@o5{ZGHfu9;nR?dOCCl zl=mN~wFgk_fm&;DQitY%yB?@D2JDISK&?KYeGk-P282U2AXg3bcg+f7MiDjrXy{ZU z@Ck3P$|$l2U`dkx!?i~k5o9v0JzPsUT#LW5_P6=v<;HR zL=V^g4!_MM^HKoeu{d`@$ zexPHh|?a%~XkO?!Xn;)2fwVZ%8oMat(kpjb#o^Vpp zohVtIl4LDpk|p6O$dVVdui$J!q|POJ$7YdQ<$TvfYPEZhSnq_jN$vg` z8upwSr9k%|iMk9z(M+voqL}Q5D9SuwP^HF|EB#0_{TEJ^$<2d{Wb)LY2W9eF{hzFN z@0+SaugBect1=RRbm`_fr<>bwF1+5&`ah+a-YealU}Q>+#5Z(`)bqD^^*oM=WMfVB zwoDW27MO_5ROW(yhM9C$%KO|#((Atm-N$EGmIav-SeEsKbipkg^d?qcNq7^>ndmH# z4^}F(rtWVXOYKD)=m4Lc+3fWmrZDJ=%rZZ zCaS&FJyUzEgRhq@I}e5UKnk#3mxt0+JKOp{T|fuQLun@vMjpyGDo@1Qtn%j8d-p<> zIj8Gj7-!^IXebf#X7?fN|;Rk0Qqbl9V@X-Z>bXd0TP(QS8|YX)}vyj`sz`$yshlUHQ7+5ew$ z+GI#CX6*D6jqcEUQ#)2+)f`CIzcm}$Z_&`UGHRk!NsGOKL-f;rbc2a|!NbxseGLmU>T9=kRiSZ_*Y>+D3dagrhP*t$0i$uowL=~w?f+Yb(OM*V!*}%PYxQnYc18A?k0Ed|V(#o! z#M~K)n28bB<3-9Ay6bjl&8>^=9ffRpcr46kiKD| z;qB8m7U3p&R49REcxb7@Qi}+eLqxb_&VJ>HPyysN?vWSk%@N@pt{Ku;v__rg;3LA7 z%$^Yu-kB@%qs#%I=eH z*LIgEsD4r}WXkJfGUe@H_qkrKdRtny%YnN)a`pKvD_Fy#|FV;iCe{`~sVUUs0+P&q zb`Ql^>vmb3I^dFqaF(-S`~JyFhk`cp-R ztyF5fDQF5xjUO#)3f;JKhmDXAYZ0lYOJ+X`#zSYnGI~S?id-ffyqe|Fz7%(Fc1+B0 zpv>XT(U*NwN^jM-u z7~oX_J|ZhoIByM*M>vVMrdRMYaE~^3I9H!fOL%LaVQ9J4VmasKx1E=7ty?0pLQ?xK zz>=4*M@e912)&o@7pm~6215_E1|~%fSHjCs4N%|^7Nh&rO0r^f&)3Mx#b{WifE6N6 zkP4f!7`-r3jOI;aiqX8OP>kkHTNk4VJbb>3v57S{uhn6`B_+e1!`zyfUuB3YO&5OwGC@OB>H1~NP<-(2tjKtRhaj)F~A zvZ!Qvx~OC?tfcFOqS^sCjsRVfkmm)8lpg{paGan^9}2oOpDYBJNg+`kz$aXE4tCUA zM!`!;R4)QX`Sxa(s9yA?$n?Zxr9?F?8HHOnAH z{U2{IE!`QcIi-w@PBK_4nZW|!I%2R$+sR`1`-_7k}#~e!uoc0Tbt(=>plJ1eG;vi37f7 zpM#|+BWt%MsKi)8XQ`Zcp;%6&O2cnGDupyuD9yQ)lI{uzkf3^?Lw?Y0&!1AA{KNqqC%S!!S>WWU!dH? z7eM95*dAc=1=|Bm9^118Pn;;(o-7c|aIaz#b^}ZR$EY5_s}%;qnOI@Tj4I{`NTD8p zfD{4xg}lLU7=DqtudB6%4?Z2uYv#;n_iyG*I%npABE(P&1c#Y2YuikbX}6kyysS?kBytY9h(n3OiPII~y5^{57q2PwU`^unUb7RJ1 zOsVayak<&8?P`1GfkY^4Sil2G-)^ekdK2kr5t2_ zhcKp~0YPUlMqHN+gry+2tw6!gf*~llKVB1B+d53O&z$`Lrg%#RuQ$E(Q2b_^LPs8V zhf9h}YQ6hikO0B3#N9WrBohX#CM1)^SR5IB7!~w8@wh;iRH6UB=qGDIAv+(*wz6 z>6W4V_OyT}ZP=YoZ+M;Y7H&tiJq0CUIMJ0M7G0^nTrzts2CU1sv0*2NaUZuJY2qYC zk}7chQX+t8T>w$w>m&@7OamZ#FH|*vD7O{>qPhT<&b(97~PHpu9Ha`JTh?7Mz4dkwSu(SIl=ZN zZOqtF(L)KC28B%}V46IX4aO?RhZ>NoHE4uWX6*!|(pUw6sEyU#Zmd}Qaw9DO zL|dByqHi%t%EpW4X}oa6HC{Nl*?2Kp<3oKIZk0}$4rmnW`;C$MK3xl;zO(=n@r*B| z0pJTvQZhowQI*yIlyXsieqWFelg6fs|C5A7KL#Pu)eNj=0ZxA zk6Pn|U$cBPyT_?W&GKpVRE*|whw0i{4`F|mbl9wiR-pt`9IJ=!&RGyWwCXj>Ql{+t zTPpi~)-39|A#XqagBkLc&?}1vMNm`FlJINS&gC*5zmQ6Cn>t8p!Exw;lRcG2D1iDV z{4D#I8+bO2zHxy*$0+^MBhTrs;PZor6`ow}o4H*a?zvqA7-?8nXBmg>Dz>q`u6in1 zS6uxf)-{$2E#qBnTC9Y~Jb(=EYNiZ55J0a^+lYyY|0P)vH?h&(n(Z~tyJh>#{C4uW z9>M%}Ob6`3{4#;0=n(}SJyB0MzFISTnuA@+R#2mb|p3mYkLWXhcm2NpMR-NGdo`?YG$n zA!&f?!$WCD2C;}{=Q?+ z^mpGl9Olk2i#1RJ*tfb=7EH3lr#XFaR&r}SIx&p#nDDXggU5tpXBEZ(B;HJMlSL~- zfb*-b*2FTnk3&!@eJ4P|tDxx1F(s{@yzIhg*rEs0Zx^<+^gdriQhCiNYFl9C4%sEc-w5N_E3-43+A- zO90mu)-0oj&`S)O!WuBGa+6iN)UzS)f||Ajp_(=`N(ar8;?S0tFOW1)R;`3U>R2BZ zh5!U_ldq$aU0qX=Zs94#>|&7Gm>ngl2xuraIr4L!{lIYdzwj@;vBqfQj0pvxje`B&x@JF^}zikXfW?@7a$`{6@_ESKc6aL$k7 z;P*iW3hT_7fw!<1G7Ect?=38lKxbjQw;z-(K;&I~yXzd6vjtAuOGkKTXJXQ7qSw3( zryzD?wLQ2^&p*=k2K(G(Uu`@cll6i2-8L<0cjPQP$;vT(S@Nlf=?e}>Dfz^N`pf|- zfchHgCQ#pIxk8{OCZARy0jR#O;UH8W*J+@wF7TDn*Gj1i)hBz+XR&-AR3Fe(eMIvj zkCnYkkHN8=m?gKiPPk$vf%AdUG(n?QsxYhW-nlv)NtKMvIkiJPV;V(EL~ogMau#*W zvJzTS$}33ECCED(QlS4$SiVL$m6c+oCj*$z0-u}RSZ)IIjZZ~kTs3-Rq$;JNmaex{ z)Y*`VI%BG}aw_V<3fe_lVr)#V63Qg)0;aW~T?`WpZ|+xq1@;dx%A2RuQTrUdI#FCU zXCX&OD#>ZC!YD#=le=Iz!0(mGg=zbumF2nBNWME`r# zPh6`w-JEDqgi}nkfcwIg7yIZBLF&X}pbtv6pXe8BqF+`F#N?||bcTaU0W^x-qELT3 z422ohiRz2Z1`6t{@9Zlg1Mcs{zO(AMsp#ZgK~x=(f2j=mSPKBqY$6E(OBP7Dn2``H zA3u$z91FhEN){(9Zy6`dN+c)-!O(c6JIFhFOom)T?;OEI;NH5PiC8_>7vfj8?CaF} z&b-c5GdneEfjP|0Ob>O*aLPO|iMdRV;oO4OoA;6GD9&wbYf}tNLs&Y5eqeDP)fRR1 z|0B(=D}>REparYAs#!E)?+B^)O6AcUmS*MACL}4s(n5K(6iuL7r1h;lTEL~X?9OsJ z6E9Z*i7#iOE|gBG4+^Sm8k^z2m;D=#-*4esBGG35CNsqBE*e6&kQ8C?Jfd>=hftC67P zAf!15;m$eKsitwzJR1%zGP)e*2f}Z#3dmy#YyCf5dsLGCaBZD~mjC-ZoF!BGh&!9| zjfAQ4wOsSn?r@%y0r^ed^>6dFxp+S4o zNq6=p_olv{t%U~dg^PN$787xEpWER$z<@Y0Iy>{bF=KyC@PR^L+0B6`y`4!<6ix6iyxFrXVB59T` zE?}G+c9(PT+@!<_9xvRhSf4Q~CLIAe!^_BQRovCIhywTYv*z3T6}6cqon^`WDf8>) zly2%ajFfe|u*!C0^D5h$ExPYAhP~Kj_0})5EkqY8gk`p2QJ)VdGXTycK5S4|M;rVo z)vMG6D%ki`(KbF69+BWB^@2|o<{B5&r7-|+a9K3SMvcY+R$a9~@(L0J(D=_@j+(%% z_Vd5ga06&~wl~AV02*HmdniE$cO`@2-K+Q9 zON|%Gu!l#(cv`Cq4kCY=8?1b?WzwSP*cFkYezN_%Mzjh~GO{VPXTFhL~_1*wj^=u`C6|aNpo{sJA%-C*5 zD!D|>h@gA z7&@*+s;AdMARX03C!ptn|6jZI_D7v~UJQ-6;O+WH)#{fwZG@{B{bz{nDFa%TUcPky zzjtW%2g5VY`e&Tt5#xM=Gocq}H}_(D-@x}mZ8+D!Nrd3%w5|qP6{anitu5@dmaUed zCMfbVP~K{7iWt8reV12I+SP0tBfi2i__GynU^tFxgv8T4kPrnVm^y z5nlDAvPoWJv9Kw`sJEPT_~KMfO}KBw1pp(lLl1ipa>vgU=s4KQ}~{@2}e#p zXV+Br*a=O=)0!fhxz!JENxL`$M4&Qifbs}oQYc$!$b;)JPfa^o{(ci^!A$AF`c8o! z)0z5PGIp1#uO8jq(iIeV>LFk6-Kx8oj615wU)nYpTk`8F&yLH$z7?rj*%tS1-XT?Q z2G}h6%ubzxz*HA2tJ4wnW-y=~MK~vgMy9Ke2OD^4dtVWa>_qj_W>L-gXOgJ0+L;?o z$^LIydH`9ODErx#y8d}rFAJJOO(^nP>SoVVazW3D`X5#9h^N0MSM!{U3D*EOnO~~S zi|Fuqf9+3NLGr9t_ zm<8%QH5GME7eD;5qDH#?^oN=*) zap-sJdY8bn#NVq?`U#CdmiT);OZ;)A`jrP1xv2V=Ps)^TC8yg*Lj`)idA-L5u*$C= zfK6qk*)XotxkHOAk1YP39SZ`{3r$TtuSikM%xu$VJo+taC~cvj?!1Q2KRi6 zf|TMD@5L8bYK0&BP62+S6((W|6LHKcH4H3Gds#ItJ}xoD6gY`|x!WnY*@Z`}bCuE0 zt7j$1U#|rfPNEWQreD5yb{Xw%-Y(X=n!-I>5EvQC&#tM|x&jHOYwEnG>g?P);A5ew z(>cq4fVk0{rYS~a4m`2$nq3!xHHI$Y*RS{HwUQ|<$W{3ER&gsWzP-2A$y;zHs3bz8 zy;MnsSC|8aMv8Ekq=z_mhOz%dF}I|V_%YK+nnRsyBy--JMv8()${aZ}L;oCzk_zkI zZ+vRA!;rfulN`}PyPx*yzE9gWg+p5Qu1Gb1b>N+m#wex^8&ijktquz~Ufy6`tIW9W zen(`Ej$Kcg+nM$TH9a=O)IHCth16mjGVzVm8=TdNBfsN9%kFIi^AN^dr%eG>4(1Il0gAthjg1 zLy2c6Kkb}*r?dSnFKGMN)Sg!8_JIgP*vn+Sl+#%68K!JU8Pm?p>0JtOt+qfv& zMaC>RQI3q+>?=gZ`C@KaWL!sagvfYy=@XfjY0@Vy8(mh2TNHIbq&kmdB<*5e^^Vdm zbs(qadNY6d>lRMfXY*vt*Oi;X8VEkvqG!%;@uBE3h$+{)SG7)|hTdrnjMOoRDc*PB z*a(OTylgR-Q5nP}EY#_F)0UR)@cfO z@1X}VRaXVq35cn(7>$6KsuSw^12I+C5(f@qsy<9J0WtmG2MuDXPLDE(srr!Lh#;ow zN~8>8s!r8o5Yv_s&hE-;8R$s4*!=}D{ZWL^b=`uPs%w`U5yVuTItKw_`e)+IqX=S} zy-ghfF;&;%hX%y-`6B>g`d|)X`oqHnVv-miHV{*F7CdkeQ}w1EIEbmb!Y+fDs(0}i z#AE<&&F|Ptl~lwbsQ$f2ASS1g48$ajlsR(8ASTO$Ie^qOAf~c_9YqjRbx}VCF$oAa zb;h(H$~Pv6X&Mf5c&lR&Q)zn7Q35fQ72?5zn8bV~5R(hGjzLVvD=`(}vRAe1YXEK? zhLxDuFRGZ!s0?Ca*-n4o@k&hlu}Iknh^acc4;;i)oukSirs`ch1~F}!;=eILOx4-$ zMh7ufr&Jll^wnjRe?x$n{)fW?VnSC|v(uA7Okd3-${?odD)$(~w3Cqh(1Vz&tAgtU z#8g>~MnFu}33dH}n5t`u0|zlxAEudrnEs!G1~FBqM;XLaeaLS_5L0y}QU)9xZIVv-miHV{*F7CdkeQ}w1EIEbmb!Y+fDs(0}i#FT-U_EIGkkPmyg5|h(N z24a#%ItDRmS*YEt#8eirqX=TEF6zf1rehEjDr5VV>PA*#nuf!UK}<({C8n}MJa`b3 zn6Ct4a>3Rpi0Rvox07=VaoZAx$15=%_;zx=axSAXh^beuXdiDUw`n=_hAoQ6T6sIN z<|81c>f}Cf5L0!Iq8NaF)H-ZhiK%)Qk3mdZruc765L0!wyU{^R)hSg5F|i3o5x066 zK}^ymelt0jE@6wfKXXexJ{Y!@IItbz?y72PC*zPt0{ zhavsJVS*t^iVqtMsX7ZDI1H(JQx6=5R9#<}VMx`xcnm|zU`TtZlJ*IPc=po9ThGMqI_enr8EtP9m9~0I1H(*5Dy-PB<3r@kX*1e z3Pbv>|2#hNLi~^KuBFM9VSBaaws{_$NIQd@wEHs~iS}xIctKyv|0U4_wHliLFKY4x z;xu}cO$UdMX+P5FOf5=(>V?O9y`-Ji9*Vn3JBiq1bU6P|j9Os-(*YaOrP0Q)IhZ3m z)J~fEQhz9J@XDs1+ju3deGPkw>L+g0Px>KB|Mqi(1vWsv>$yRT!)Kx=czG*rJ)bOG z9a!9rzF?S>jTyWLydp)|$4GY}Tp~365=k&IEb}yGM(3ZBq zy9-G@X%Jg zb&;-_k*+S%>8FGrjCAu52huHYaHJDulKHDVlj^7*2I;~bM!I<;o$hm_o2OeMU3LSc zvl|w2((yJUo!!f&dNNy{UP&4oVuofq|5(pRZ=IlrN3Rp&Q^uQ-N>|?0tEFth`+WK> z*WNY%92`(jZx=)G(_?&Vr|i`DUG?=|+!ZDC?YCl>>|-^4?KZRvFci76cwep2;D4L{ zMLK1F+y~v!8pB(U^={HA7I}+p%{s6evLdz`bkf=YX5h?lZcs<^n(3FK=hEJz#+)Pr+TYuanl!Z` z31~P8;P6=QX0@_0Dgj>f(D=ImOjAG-S(Tg%fJhJJ&4gJk#InSlnZPBEXC&-oFOI*4geQunvk2Xm${ z3it9{=@WL0zA{`?U%FgDUz$9pVS`6EJJQWgXZC|0;&dzNOAST*))M_&N!MNpF;fJQ zx1MyPu&{y1hnKSD{Gz{N?lQ0LF%EV?GS~n0mbJwOh7r-owrr5}_&N7@G;jWFG$HgH zdAw=5{FmVzDy^<2O;mYvPUS6%lTmr-P=-bviWW9%z-;k`I@1|6lhy(w-b{==JacGV zzMNZr*91-j_=IDa*w|%$#6~rpje^{=Q7BL+Dd?!7B*NK=25lHft-*}l;k?c}bHE6h zF<3x3NCzx13Oblhu6NreyKX?tBp{fN_4;bPh#AHK{ceOZ0?Q<{Cez281a^mqAd+B& zN6j{SMmr=i+L3~uI04a z=NtNjbTST-)j_=*kL~Y?(f-=tqNZF|y_#~|W#ZZ`swq0jV0b1_XJPlEn&Nki4Zjb& zQd6yMW~-qZNCt=a_Y{$VDjng4TnPt7^Ua7Ftga zMdU}c-n>TAv|g@6h-GwUvet`DN7$`S>*X4gdrj-nS82Vz`Xa5z<0fgnUPA{Az!xXovxke^`DDJ-WAXk_kL@7!SqR*=8!NRkHwktipqz7@KydG>! zmUFKM=Xat9P5=Gg$7-^6(tn$n$TT5#x8$vNGffCrno1cgn73Ys=e#C_uG{+Sh{hOy zy;E?%NB#AVIi0%CIh`oL%Kp0DTlClQd`kYh^Vt^{TlK=f2!Y+?z;~>d($=_4&Vio` z<{Ewo+8S>04*UWUjYMSfD0*$pDAtp1!GTAgNW4sK<*|=B@cKzVcn98SDbhFxUfq=g z??V}L;KLmy2R_hpKIs%`S%<5Kc0*^P18=d9Iq*&Az?+AMjrC4E9oeZ9-@%BNJCX$! z+ead;NSK25kguQClzfA#Zi%S({>5+AN zWHTQf?y>O7?s3;NHWthy>!fF|r1O{I*iQP>wJVGF*6d$v;y?d8Uas{E$K!^ z-gVl^^~64V!Ed2S)3b!?dVs7g2GvJr!}>ZyrV#DXs|vEsnQ^X7*T#2Hm*SHbb>}uw zn^~T*dc>YoFX$0M9AbbC44zboS#5ZgGs9LMw1i+yT$p)5V}dnPE~ZW_SnC8Ys8h)c zGHr+N$kQanF*`Q&hXgFRF@tUc)5T-c`wAqd6m;;f!F(itxG#0!; zg0dT<=(S4lR>6(ICNL&h@Mcljh#S+{?8aDQeJ%$xYVLyz=nzzeW`RcBTXbU<$G9<# z;T$cXhfO?GJ`hitVQR^7?Jq7i;=(^!r!1cH@wAWU=FCeWo-=k5|De!AI~aq-#9h&G z@tnUP>4bPr>49OBL4%E%HTi(h6n-jt~T4wC?yT3%nr0fN6W}kK%NhkP(Bbg~B9Pxpjz`CF; zl0WIhPuYVAv5);tvW9TAY%z{_ow1R1m%CogRruByu^GNdLXknca^Vy|A}yMFasI|rD5mHZp@(? z%`$TB+c0zP!A-Ay3O1748rf}EWiZHJU15+Fm-iy;qNQUQH`4`S)Sb%AOrCjQVu;KG zlgEO|LvX#xYpC^jvzZ@4Kf@hn+k-b7Qm8WOqbXFop^@8onql4c-mEz;UDpFs6C|as zEdCdDB?RqH>4Uy(^Dnz8yH027jXLHmlD{Xm_GwDIyUaE!j~Q9$sjQkywIy{USA0rL zV}6e~&1h6F(x`bAzftPl;#%+cXzZaKH#mPlrcA`qm3Tfxzy+!VX0V&wHH{5gW5X%I z8(O-YEIXor5m#E;|p~& z63$e(zr0%)D9O|$;S#h9nHl;Y{L?H)A~)3r6Cct>N`{b;QrmM66=sGAriC@sTwCJf zI-EDow zuBZQo>I$#GT0XblYm+#)kG(pSp%jElCBZ6}jm~rtPbKAWLm8rplrWcXJ4%QlWsfRQ zLYD?gsQX4mb-GBG0#OK~eHkD$+&9|y&1}N_Iy{SyYC*dao0j&DlKG5h@rU^x69;F_ zZ;&T(v4FEOAyR3jwMz_I=&gvyxGS)J#s*VLj1roPY6xgy)I;s8^2m(Ul!!tUq@T~ZDlMv7Ri~Ir+6oMG@E51k;Ga^WqJnJu- zmeTdc`in`gNCYnI<*GXn!R`q}Fd_F6>$)39vG1;&pwKzk)jBr+WDi==ah^>Y;<;WM zqH<`68lsANEe5wfQw#BzSwwC(pgEiCL^X1x5F!42#ziyKd}?B*X8OvjKV4JGPb!@k zlfC~YMlXFYr};AXP3bGY#07l3_VMnMr@1g~KEIJ(`>eZ*^X=!p$r=?JLu(c9Y+_kc zvqhHWZ3UK9h0xbWT*??iy^x?~sRO$aG-pDzKp}g*<#S3_`|aeu0~eH(l}{bPdCp%L zQ{ir>$S5qCi?cgSAH?$H;Mm0_VO@i^ITP;dHHo5 zP1Klu{%z-U+UJkSP4|{l*=&peTGdRVjABB7oXitL$?c4ub4062K|rSzSrT(wYKCh? zVfvZ<$kim%P&#J7RlQV+TK=-D&%&E%JDpiT+;}s7FHOM0ply&myk>|?M5JQg}QWT)|Xf}PJ_@swQAiVe1a^71jOFwopONjj7)GLNm zwlbHiNbI()PLX-S91vs34zxDwl#rxjq$NvS?sUpruKZyxvw$u)w?GNX=@cqhrgXcb zI;C5bE(%sb>2@dRlx`+n6LgBhjpTiYs^a+ZIwf>D(27)0=p#Dz(+g*x)moUB!6|6tB#TrMP@mHhV8}a z7r*~!YLMtua-x4$`432TLRtZT>cn5o*I?;dLMEZh;e-+j#1M)IF_I6(wX{E=Y+g%l z+R%?m2qYV;wG&hTKm1tK90QzkT5oUurgK{9pe6+np#avNJiT~d6xSQgR=YDdztHV1 zp6K6n^5&&mZoO^!_EV=8hPWKFU-9Vvyah8tq!!-DMs@dg-!NmEujM`N52HSl)BM66 zar*Y>wgM^Mm#xUdSaDxz!H+H0cnX8M6xgc2JzI6d`bhoZ4z_H~mJUmoH~QaJ7b~;w z&3bQDpH_yU;p#BSfhc_~dUgmEQl$m!&kf_#8<+WnMDyEywiwyH-TP-eOojan`%{to zp6;48btRB{d3$m%1#%+;o*U{S4%)85Qj7QG9Ft1Sv8hFLUK&4|L?mu&dLqoa?mhvy=>I0}S}k1*jJKvA2fFOcP8jd* z?!DGkTJ3c5%JyB|-5O7Rak0u>U5nSGx|8nR*3j7*kKs<)ZjiCvj8uN1rKtS7W=^R= zPO0fsev(m2D*w%8mA}OrPk|ZM0@to?&$Xxy$Kgoz^g1ZXyEwYW(|^DVMEqv7##5mo z=girxrRO$q$54!@yK1I(@)}QX<`Lz+=BjJWy984=bu}yZ?yfK>K-s+=hX2-kD{2ND zRiH*iJA7w%Fk^LiXXu0Zx;bk^aEQ~4#~z7Z>ayGXSoD}K6r=Zr4I$PTwIR8a4;~J`Urv4DdK7H;30NnK6yRJek?UO@Ys=5o++oF$q3%*!mir zF%H{{+Y0*0?kzSr7sBA2-+pk;g~2($lfj|(5zNU`Q&Hz8qmJiaAJC5p?I8qp8}HgD zR3-!j1&bg}*np{`K}^Op?!Tf`>8nsw6Jki2HbTWh!GJvQ5DYYwX=&QU&#J?up(wAB ze36A}V4?Jzvrv&Wk%9(E2cA$*yBqy~8L9ZMVlQKq%Ye_@HhInGYn$`7TM5ADYatyr zNtqUC{O0wZLXc0?4#HI4l#lgvUQS;VZlTxg*s`BDH8K8iNut*+TZF#;ElX1(ZH%i4 z+a?F5^}J6~`cb)B@L#UJ>GaiJ;T0q~*O_Tu>%SKBo^vFnoRXSdlu}q$%SHB1QH`v% z)YY_Q*In1|ea{Uu87ioU<*Aa6y)JXTX4+I{tM06+fvU4JN!`4u)A_8Fw&|mz>oh6g zg)Z|08I9R>ky2t94J_e$uhSh>x!YT|t+ej;E-dqvLkrFX6+(ovmnx+23YRdCq(Sz6 zZKT3`p7y5n(>0eSTZ`Wn4eMwFc13$cl;7uaZkx`w2Eo`z(F9CV4BY|3dC4fH0zkTX#WEV8zP7F3 z+L}4NTcHmsR{9L>(l%b)R_?;~UR>dglqDKnCI-yZzTwvfeKwsb4o%%h4lD7O=6j82 zFubd=fzkF1X3!^Y7P#)(wYLka%{MooQU51_n~+x7z(e^pn7IE_=D(o~iD>@X%;lK1 zkrW+#p)u>YKX#<49QVuVo+fB@F^}_>T`k{As#ba3Q8E_tiS2~O5#GfTWu;}2T*{AY z94UQK_op5`EXbX;G0>e^BX{l#0%7dG-dmeFj->#Qn329Lyb*mFU@fy#LIs?KoNN}| zF4(oLkUKffLS%oudX>*e2vo^)4Ro&PHxcN5SIq%#l0Gd1R%$TXijQ;JdR`AEtn*D5dKr7QXUi%A|T^ z0o(y{XBlfpUi|lFj@-!r7?#MHB0wwe&Q^WMZ^Yf%sw06^0h@M&o#}UPwT%3MfE0wCsZO0Kw>XpE zz?8@X$IiU}0I)L!lm^(Dn;?X+GqX2V1%SqMe#W8M_v~|fh@C0GLJT_trm6q?2Zfy} z06&NmR0=my9Kp^k&K!_ZKzXQOSKXo>_&#OTn|k2;lvP){EXd|f(sXJ4<9*7k+Nu~~ zFI5P$hgDZ}l?o@dXpp_f&J^BrLttmh0w%vLOS3 zlwxrJN8;l#ZfhQlXLIF&*~C-~>+rf@${8|lcJwZY#3t{25(0X6*qOo`sRg&XZnLi0 z6-o;nHk~OBO`YA~OyV#WOR36XCH}g~0%i`Xw1?OknD+p%GagnnWg4}t5VtD)t5*tI zN7A8&TG~-MR7*DrYNFu%>kLAJpDgF91fX%j3~xRL(4cL{Pc}RT&>T2`h6z7A0?;UC zcOc_q0L^}^3N-?tsZQ<#2hddKs4{@2dKZrYG+XATZ%hD9b+)_F0W{SqRR+*}OLA00G+raC>!0GjGUej@^CswtGys~}8>Syw3odKR84H8j0dz1JG1wnF9yV zRB!5m18Ax%-7HXpmz7&2AT;DGS6=1kh9$&0_$K7BF(v z$tkvQD2U!B@BD@U&`iT&4(oFapowc*h>LB%S&OB2lmIkkg?R7)8Zlo9K;wd$V*riT zLOll1kmLvT}vD|fTsE|%>+R6X9o?SsZNhFfTsG8--rO3 z>Pn;xps7yPV*t&TLCPKiXg+(;0GjF|dLsg8s#E8P0%*Sf&;V#=Z>&ZDG}YDPp#jkR z`+Ww`{NW)2&`1;y8-S)d%N#g>rg~Ek96(cD>6QUB)w_5MpveFy@`~y186U{d_I`BD+Q&Z{akIwJWIB728t)O?7e~IDn=) zN0k9I)w_5MpxH7vePaS>s;e z&{Wr&#{in^5MV2M0GjGeJ#YX`b){Pd&{Xf@F@Pom(CnoO zDOB+TfCde644~O9fTk=EM-f0%T{MpYG{*oMRK`ouvurxQRsDTr3#Vx~>=;0E!~ryA zg?R7)8Zlo9K;wd$V*t%o0(`uM(}8c{w1lR0i=D;k+n?J?j>-UTGwT18AyKstlm{+Oo<&Dgc^4KP&*6 zwW_9eGJxi5c|;jNQ(bEw18A;G08MpizD@u%mBnZTKvSJi*B^kUx|TR_08RB_nhAjB z3kMCLsZNhFfTsG8--rO3>Pmz}QvpCzovOzGnk|ErJp|DF-a!Lss*C822%xD>og)gM zdFjvqXl8G$MgTO`)#IT7(EP`J2GIP;Ap+1y6b~DKraH?UIDn>lQx6+VEn%x3u$^vl|0W{S`^B6#L44^?}Obwu!hQp2lG)EjjQ&xyu z75=rZ&i@rr{8`)Re_LH^L#z#>^&WohT6|_0Hlh)HV92HEYZ-1UcI#;^JW{v?g#{il-+;eDGpdstJBLK}Up6R3Gvi5kOO2iIf2})v0<6pxH7=*+T%$=MEY`Q(Z)FL;y{7>Ksu3 z%?}1+G#qvepgH0InzBMX zcmR!swo6g^YqorNi(e_`su!_LLkLSY^~uruGky( z{~3;m=>BTsT!I4G%UyZskN8!nSGwL!n_VGRT z;pG^%W-y9NvphbYi(ihzietX1@J*~y=XsmB_$~H~sQ=MOZ@VITi)0Y}$Cm*1YRn{i=M|k3}PWXcmOf@gEfV7{EJ6Y0rny z*%*=ET=QvF5W;V8V-@w^FJx8Tex8zk9G1-o{k3Rh(8a&+ja*~j7Y(f~VW9jF$+M4y z7yQ*YeQ=;IENzHF?X>=A(oW+?uO{tv6Qy*;erO0!7^TbpssiuK=e)CcI%#ZN?ltX^ zi|fgJ(x78cK-Mlf2pjWX)l>TJDg9Ht$~~zeW_A#(hI%%C`f{(4F43|^`eJk$`p@?o z3rX9k1Gm@%;{HVj&OM;52e^VgeRyuzU|`$nhmAB1QwmZjyxTNYQ{2`JJ88W*L1|`M zY7DoTmMZAX51+vk&JC5IlD4!Y8d&%4xXNH#+?j9+TlG$xTMJ#Htb1_b#$_r z)5eei;8rxBYiDP>9=RRLxFvU1GYgQrZj*Y{$V~ti1YQX()-yb>*u8Cdr4Fw|wAArR zyH{WEcS8;1l?Yx5Vq^taLsxfFj-XqY!>o*`fSag3bhsB8Y?vap~v$3uigQ1RPKi1D{s$U)* ztd-0S?^SZ`P+vyaf*`Q9Nkg5hhHAZ~mF%>ds)QS@7OzBf&`Fej#_gLXj?#Vxpl!4W zlT|bx>4==nXdKdW@-fX6ZTp+6f^Bbl^8Lav1$^Ah4?3m#)A8z$dLu}1_396I zmHIO+^`~!gcUn?&+NnR&s6TzlINM*=8Ivy5Fj2bj&M80KY^40Cj-dRgXsHpn9?|ww zrAFX;hVnDouTeG#3^r0Hv+eBV9IAhDVsFlP**gG@$jR3k948q>^jL zTWLU(##)<~-I)!PuJ0o{h*IwBYsBp^GGUY9h9zu}$O- zqNZ+2* zzo`zytNeXCTHPHt_9t{HZ|$a~{mEHA=FORSbzl6BDmrT=--%bVV{}oqoQ-8wsb{fP zY3%lmcsT6=)sbD*HM^=KyQ;IOWg3jYMlPCkAnNAR0?|P_Ve9d(p#1dMJH7Z{E^qsvZMe`oJp_chUyIVwqu0gu(8aPZh+eP!R`*qLaOtX293H>I!iOeSF|J{`s}1XdYUm6j)}n4Bme(60F{i=mpoeB2AO69ZbcK=dD{B??gk^ z4`uJSil2@&E#HgO{o5NrHgA2P@fXn@jh~{DJiWc~q^|9K@ljo;_d!Nnr}o81prHXK z;$VvZ+r?GjcX4wUSXk-LxWbRQvX7E8MZIgRl1L@ZKGDbXoUf)J%2N z=rpal$?Leuo5o-5r>+yGPFO;{OkL9viz?Q{QKCL^aTKRa#Iz=^DT>#fCaz&!(8RI) z$;45in>e_Edax}>q@Low@tmi)I&ek^kGZ5En2e zm4YJ11G3XRGW2c7j|aw7MjbGXl+1p@xD2RnS5Up<@FJ8Gl8d@Q)jEYdW9ajarwl%) zL)H}ND@tLl-vu}Dd3Vs(r=21OcRbFkLR)WW6~|e7>4WBQvm^2T_-RijPwCp-huq)_ zi!?HVY(z!{d{Sg|m)bbp*dL2pm{d_qXJ7m%s1Iwi{u&t*ZD&NK_f++$qqDxKQ3T7Q zhg8_unsGM>l2-7E8DswAF*LzZ_xUsclu?PFUUDpfw>b9f=)k)BwI3eW~2B< zBRfGHlx}|n9xu6E+-^5(M+v$ZWBQYzF&gJ51mJRHOe3Sb!v?v|#I^j8es8^rd(WU> zn3z(Pf6q+JH-&zNbl-A!recq9j~9L(?lF~pSrMiQ;Y#*_A*bUe*$at_|8hTzZ;9K) za2xa$V_VW+2TfU3EI6fDRpLxY>bIZyW&=%im!oDATy3Y~JDE~s+1_DWw9&o`Vc+KR zIRt;UAHJ4KM?jm9hTY?W_)oc*WKRq9g=K>L)bo9D&fP1G)gh)AclqjYTFf3V$$i6) z+xn8W?*rX>sGd!eOJmHpIQVX%7{};6vU|_O}4pt!nUDTw>fhaK8L=CPJqCk7K z>|Ozz@|AQkb?)P$A>b;C!U<88pi3o`dd`EeW(0x~-Wj08&5>wzxgo>5Qa-*qs(g5! z@yjiVyr7|E|7`Te+e+vm#wDdHqJw2?Ri{T;ubsWz*2l!l|aP_ zkwI01&**8ar!%#uKP|vo=gha{0sD(B7LBVdXawkQPss6~fla zsrg!~@0?avD0`;WCwjMfU(>bw_zuHo#WSi*Qo#9*eD7X~`w(I%ls(gg6Ix}pCW>!K z;9Q-3QQrJD6-aWp|TU_!J*V@+;({!$uzZy^8f_;l)csc1bpt^T*oHFrc# zH>!i1en~vBS)5Mvd6fN4RgNDK>MCBg&|zaRs_eyNe}d}IXQvb7$Ia#=E1sp#;-;Y( zMfS%hG^!I=GSfX7NX6-txK*yN(Cr>uRo>||8vJ~Laa(ic_Ym|cXrAV*p65jWf(lOr zr6Ph#{xbK}J;Z`mXO2h6#+wgms*C5TA7@JqEcvtz_>{n#tq%LDhi_-AP9S;k({{@) z(DW%r`jG0TlK=_t6rV9d454Oe@!%W_T7kAT?Hx`Z1goaS(6B2tf``Okr^Rq*eC^Zp zA@7%Mi+^EcsUc=lO%1UcHD*n}0QX{o=K&$sG)s@lnJuQyc{IHzvmi_XxWHQL_=0KK zA~HCNn=o9tsPJr4i0R-*+MD8fOQWZqJ^B`*!Q-|#yS>JFXEF*QOysa{4j(5~WWR-b zHrZ9YgGyu_KM1|50bShI260uZ#@W)cq_MT-r|Y9asUb8Xn-a7Y!Dq08c>zhZ+u3c>+2}n*nNuj!vBcmnmlaXc!EP;xW!3;If zqM&c&H_aS6tXyH5haD9=5;+t<65*x>GCaZr?htzqOfvUj_>AyuTr_l5VM&H5bzRAa z>zn6#hPasyX8yf^WQMpIXMCvgfNdIYogRhN)1Xa7?0LV$Y8$=?fT2UQhP>1y)?l*& zHfmO<@{;ZtNGOFbyDX)?dk_Qcaf++xOz4S|VvPNG#)9jhSsaUP<)cLN;%y#ep*N~| zcXEtXfj4dTo{aiaYbgn+)F|mqyl$S9GT>wsCQ_Oy+gOj3aKv`yh89L7N0R+@>NwxLK2JpE5y{K4pr= zKb5D;$VR+dN^cEbqrgEWH-;_r3(%?$p@|MARPGIN6remyWy7C?EoB`w-eww@&5Lzd z#i2OuTQC9}q*B^hz)PVTBqmHnda?zVQ{V^-8=jK(7j_fvnCqS<6eeW_3D?Q$)W_gA+H#Q&?Vw)IEIHx;?^ZH7XHq z+gqGRB;$>#I?j@qa)4!|GL-#-?Ll+shc^FIjB;QG-7ziN89Sno(9jbFz<>%NWZdQ` za3}|D$q8De^|Ux1SJYBGX^&{C{1!w%LKj0FPgr-UU01sA6$4+dz|LZ>x`BO5pJ7*> zKo73VUJp`Na%(=SH4j~O>Me^T)On~w#v%6D91}TisR^ace0c&^6RZ=5P}YUe0Y}TQ z1dmYCsY+UQR+&&x#0+@0XVkoz2&d-jICZS$a4IcgQ#S#1)4@$_-kIUWiRK!0vr;Am z&f`sQr;jV1(3;@)d^0GX0#$sf=@d^h*U{+QXkq!xms2~XRHY_*@mZjDx>*utp%s?E zr>f^tQ#<+WR9azHUF|F<2UQ|9wX@x0QI^^nXe#Bi>6+VAgTCESN=~L|f7Wr=^yQi%ByA zKyp#ZvKO(VhE@U$?6H0#kA<0DA6YB6SY4tvujH6KLiee+XqqSB0~0*#SaCJz4e(l- zM%w4fa0Z0lJMCVa+B8#SqSH*OpV zplPPQx%D+uq&0N~)B?Cz1u_vBp%I|5GX!4hTtBi`1J#NG z+I8hL^~$NBXruSaDFfb}2+^^Q#4|K8usCte5#_WjWy+~91*AJ3%InZ(rJPC}NI4a* zm+CSqgsID>`HU&2__0hmt=ge|ubk5Tb(B-)ZmQA&DeaU~Qv!o>Y6@VfoUTi4rE*$4 z4>U*Ayh=3479JA~UNVTmX?EbK(rcSeudS?8%oC^AHt#~@O7E!YwJbIpm;#W3`!1+B zrp1r?34=t^oT9C@;ZEE=L9hfopozBDG;IwHRoYtHv^5H#tu;f@acxasgoFU&+FFR{ zk;_`znoWhgdf0DH_?q6=uF$&ec3a#-2b^uCJqZ{Xd|qO*Q*TGWX6kJTBh*`yLtec# zpn)MlLpP;0kVx^HC1+-YP91=MsH={Kia(QcXs4V*btmhb)nZ&zML|_AX^negIDV8G zxvXo~PuJ{vVeR>HPnN*fwd9OKtQ-6FuGd&+#S!TV4%BPs9OaYC$ED&+-ss zv-UM#?oZBuc@&)_Q1K)X-~(J7=UppqF*CI6gCQ;=Jp+*niqI5shSpDG5j9s3>}?r} zhRM!zK`E(G@b!*@O`Rx_u_FJ4Qu9Pt0s}|<;@+ZBFBliS@VMysitCKnfs|S~;H7X1 zBh7~n=E_hq3(l`JNS}5VoC-?;VqDHp^2TV;YY_kwnAcb)|~R1rB;Gw)C3%@^_W(RUOzF5W?y4m#3htqJpDR1Dg{d2jGr<4DCtpJ6-7?F<1nU6vG$o~hg& z&$EE%Af7QG%LO7{3iSm-Q?Y~~(LAT79925|d7HX<-~@!T;fV1`+1w~dAym0Dc^9~7 zNY0A`hz#~3vA)ASfKt>R>8nR~1f{$f0b8qMZz6;Icml>IHsoL^syDH|{=*AJ1hpx3MV`vnWq-v_(E5iLrgiF@+;VZFb?rvAKHKdPhwA7<-kURIeo7&?RPoX% z>28_IOT;&sD05cG7vX&@3fmnuvk6PAj0FYVLS}!TXiAYt@W5!nLL7ogbO;FbqozNB zNA)3bZgeiMayvg&t&lBAIIjz6Ngc~Xp>yjB5S^LaYjw3M)kTg~N`Fh;2q*Fic4d;Ki&HrxA|4g^1uuXx3Y5Kc? zR%^H~|CiBXS@Re*6bn|}`Ozayz~UZ)acFrb^ylY7f5v%7$ptP6@3`6qe6{-9>q;}X z{tiK`>~D=SJG{Tl*~^AN#VoP7M(U0q6nLvYq<&blXqob{IZrqwSd1beo41)nS)e! ztT_y)#GVksikYt1lauGYVbAmc*op^*DFSc9l%P$;U9;x8Q|?%8 z17N|mSv-N^9Tea(_JMj0b?37pUt3CTOF-LFYR^}1OR1%a-J~N5iF#3E!1#FG2582| zYyQzYxLJA0it0W_X7{h@9A{N${x1fKilW7FEn#b^d7Xg@ zlzyaG9BLLnV{N(D6oR1tH#NG))Q#QAOPB|ru{LZK39N6~DmRQ}*a4H*ZSAb}4!BMg zH%mKc7T*D&vt@f@AZ4Y40Cer@fU&C4v(St*Mii!whpDW9d^QM#c8-ii%M#z6clwh8 zuZ-!o9n-Beu!cyPnGW@ODW=xU?18tN*)yHpIHLD@r+8|xhukg|*0 z(@^Lg=2d!}sokX>XWW)%$Pa6OItrt%W#N>IzFjrmiS1 z=!&}XeWkAC$O@bFO)vu@s}$Kh=&@4KAW21$8Q*|epn8fGy0Fwt`m5<_sGLS=ez7q7 zIq8YmhFEs+`@mnMr)CQ7l)KDnd_6Qi(@@|LOKc%P4K#a9WoUG%rr3GMNDkA)=9U5o zD-eIdo9tPbv-zqTkafO*dgHp`R7jeeH}%mO&=&k4POC4ZE9MoQdIhRf-TY`;(!hb* zxte@MpSdx(Z!$MAOD1Tw82&Q!)a!>s4{*3-R-U<}Ngl4@luQ zIMXFbxgJei zHy0WQ4Ag%grD)r0tc^ZoU~ut8q7%tn`xK3+ zqA&lc3l`KGsD<1GtwOG%(g|7;GM#p->ry3g@OKa9(=Oz^gZTV+lI>b=pJj8a;VNFS zU^*MJ4m+$n+AgpP)#=g$Xc8Uc4O%VC(|Z<~9=}4V?O*k+ojB)a(zubNZn?o0A}wSM zNZ?Wwr3wQS)q=Td3t_fQDNTO^8S|}2Yh&hY7md{>Z$Vg@Y$!?&ryxt? zyQ~qmt>x@o`>7MGBg|*NE``LvPFKKW@O)jQDB0}@PJplhCBV=zq|gG|dS-lIN~2un z-i)`!S14X;7s^r3oj1PlmvTN`rl0n<}+pw=Cy`E=c}TzwIrX8;p2AlY1y&G!U>!^u^YW3*n-GzmB-RY zC(G>64sAWT$*Bjd5%Gw99e&)7Lt%c^o}9r!;ES_yL?O;%TbKX`_It}JUf!R4jA!5~ zJ8r4)HOkpar71BlSi(869BZB#ba84{$+9{J3d%qN3sEBi>toPN8WdSa~Vp^G1bA+{>C99Fz6vQ``UnL?`^FN8%hc%xJEJwy$$zahpfnea@ zV@M*peSq%KYZLu0#9dOlz&4PN&24%U2mzL&1+=}`{ilv(VQ%*dlnXX%VKz|sRx~dt zVEf`bxv~=7EbjEFANY7h`=+@19aP-yL7jA@-PPL2tdTZ)A}JsibL}(|r<`SO+^Ptx zACPuedO>P#Kx{nk1*H3XXw7w>Zm9cWex!bPP7cyF*Z}Ho4LFXtkE?6J*M(RoSCBn7 z*Cn6@tqc(k9AAKd`topXyDS37VSJT1?uGesVit7Sb79|Edxx!EeJGkO@8eGfu4X*QC zzrz*Gl|yxK1J@%M3Cjt+5hXEDR`=-GJ5nFHg3yGH7@!SMZ)(?Hm+72FuZAbFs=F_K zRfEP%ctuyp7|&Ozjp12k5T#XyymFP*$2j?3r6JQ!u~Xic8}j9#;ou!&@3y>3U=dy# zYxg_4cF3J#$t=8bT4}U%g=HVW?n2nkxvbt7QaoJ0< zPw_)*i@d0UWT&)oBl~t!p{4YZyfX@zlgIvcsY+>*lZqm3SK+M;ROfX0=(9TQ=rokc(GcS{KL}!{Fw_~&_Ouub{>yTf*wYyHf2xD8Cem|OP&A$1^Kvq%mY|doV1@H9$|x_5wU|R+ExV2p%hpxG(XPf(*5#MNHHvI7BX<_%QL;O_ zzE!U}yq|We-aCn0>J&Po!v5iRz?NB-$z~Zc4!pdHY>}sajpoXFEgl2YKZE9)cLw+{ z)PotV84K^^YahO!>un6!E0SvR*8W^Imaq+X4hwZoYnRhfx#ziMG#w^yWtT;4Z z`Ie@&aZ_$L+>-AvE0*bS>$>)h^msRStTC51m)pNOYI8A1-sr;qs99WY)|zYVuDfw0 zYDC(UW~%h-hDvfz-724Ii952C4cAt%-01_hthT4}txR3por-}Z+z6l8kRPJw0Gm$j zr7~w;kDn!_C0MzY!xAhT;Vi6 za7-7Wd~h-<+ex)F@V{t1!M6Ql+Cxo!g%l%VK=~W>9p4*J?R#6$#{~o3jXGionBd8Y znrr51dqQNgTvs?jri$bCWMmspNFli;s(3pFK~a_ z-z#SMnBmWp%G^o!k7;iS*QZivs69}aa+)rumRGf_m(#YUnP z_Ei2mxRb`;p_%bc+`)aGt^J&d>B(WHPr?7PS}7^(BaL<;$YEuDVYiyY9?g=L0qudq z9{G_rz@E@`*n>QRQR-KZN38e~fj99WNjr zc@k$pBtmIfI-Ek~VFA~8_SdxDG7U6qZMN#f$b}zI-4k_4eZs?x~;sP?LtJEn|B? zV%XXPTu^mB$ps$%2`Hf`m1KBNcf$SEzKxOk>pt6k1C{aN} z5J(OU;U$OF*?xC(le?gHA5PE85iR)@M$llRWhcMnM4^@Vp#gNxZWe_KlNi%h-tAiv zo(R!p;CWQ*D-=M(Xu)dPt`Hoxtr}mVEQsMgp}a`jR&~VR^H#Q~U+~fn*R{)Gi89;D zC5574v3SavO@Lr%h*i>Bk0?#FDh(oSACj(9+$24&nWJZs_lqag^=PTH@QU9@?0i)U z=*%X5KgQXbTs~tv@e&3i-omE}thogZ-p*|jLsHTcg`nv>D&QU)b0 zbXpT+Tv03wE(GJS07h5s03)fuZY`CBM}(s%%50`y4bkps)LhB}Cw^s$>bRzs_6KsB zlgkLst3>vFnJt_L03R$Ubyn6I(m^BV(zZd8$I1o?1N{`;k=uJ@C=}#GX^n?0QnoCt z%s5>FKIO4pH{ zc~fQ?M_vE}!^mk=AR#NY6W3~8ViLZq+qY37ydTnAO6&G$27(qY;Y0kZk- zn1TdKDkS_d3Rbv91a`APE_0BN2{5%}Fl;*z2pXbcMis)2-4wzMc*qL3a6)khKmx>j zR7<)r1N+DxH{6=8s|@&_6V5SP=YVo_!=&B_0C+eKfT#q3W1YnjMG18Opop(}Jo>EG zo3(x;(@U7k1eA#DAC0BEDgJ_$dZn>=o$C&+`Rd>*F3YUhh1IU)0Cyzh-uSX(eNd){)@l& zE2lNlN%lLfgZ6#O8QXx#3cm2CF=k!2_y<)XISj~Le=m91jig=4S5N*a;UifA8M!uI zZQM;Y^hRwwUHd#{bAI^dx2WCHiZ^l?j&k9*b9W*xM+OY1_ApF1#$Tgb%CP_N05O7z zEi9b6r4beX`NN{H;`)chCyM_{`+5`3K+WSvD9JhFp=3-+;M02a5i9?Y;}Gz59;jeq z1(RaOqv&RDHXc^(N%@T{ldh7Q--EhUbckkZ#Bl`MXD9E@obVd8&gJg@E!s>8KVKa- z7(ns$$3N2Fqc?|{j-5=0B*dy_jzQWy<7BIyjp$)oO3okk(+`E;>9qQ>>&d; zm20Y!0q+O4ce85$PzbAAgJPI}cCGGIUj6IwyF$uEKj`?H9RW)~@P;Jgh^}wEp z`ZTgvyj%QiHLaFE13%bdH;c@qSRH!oNBcK zb~~st7Yr8~5yzjt2L;=;FzphSvuPWD)@g80Xpa96k`uns(I)sd6q-H4?HL`{yGw5? z9HWe(7O(9zU((uEm_^ANW_773XT}PeZE{F)qOwO+rvT{SroTLGe;Ofs_2HStMjHMl z;l^KujeLH~A-6)$?U{z|c^o6S6U+Vn#xI<mQ+DAvR!cpF4TIb~rJoV!&dhX*hQQmDYV*c@Z?Uq?sKx5n4_)fkL& zp`Pl$*C9p%WL5tV9)Z4#=cZy|Dz_d|54Vcc%Uee38yMbXqy`5aQiK1-X<(i2cL0HJ z2JjB21C1{W{)eU1fXh@37;TW;0%Z@--cpaP@0mhp9TF;N>8xA<0!-PBQI>@yYl@sW|AedNlBvBz#UWAWx1 zYoCJ41^{uz!3)Rj;oQRygSSuE&E@X?O)emY@ck0}H-_(2LY#kEoF9+&>aZn#P7I;@ zyrs_}j#l0)Isc8Sp2Si!DybL4mN;U^ob{--vdJ(K4#O$wl%xWqjg1Hh-EtF3Up2WA z?iwv$_>u5rDtB>twf^5=AMt^EMZ%b}D?@t~0it|{!M7N^X^MV=A^SnBO8Gw$6iUkR zNP!o7eFDn2NI+Po->dPVDO(W5R{h{8fBO=&3IuF!iP+3~TL<(Z~?(3GrYcPM>;fLW081GTQ z5TDXQe*Bg&u_>Ku#m_!-et_8S8Pa)iLrnDHVOALAxJQywMhX)96itoMqnv#ahCY_O zC@dpZhyckl4yD+NjZzkDvvPquSEuN6jlqd+4qVB`Jpj zY+0@q&n5x3MwHly01+|s{NmA|&)7%;gB8JL#=(G64pzbvz;rkB$VY-=DRl&EC657~ zZA$6gaK;dY)V@qDhyiov{k_DicDtn01!f_cE;jIWW&rlDv!$*!s+t@svWC*^C&3wh z$!#(JAj*5uy1kJx)8vuHD!JGCi=S^7pyQ-?#nB2P2hNYu}h1`8pwp$w#drCBu|Te4=-BiRa^dR-#Oa3WhOI+VnQ9ocu$M7PJDAH;G$g{a zQ{EoWr8Y3}X3Ck)2@Umtq~^EhH32X|{7^cjnQ}7N@`g+{*33dl6ZuRHj8EmwltVTc z-%~+n%EcAmqjr<{_KmAd62E8Eg@a0*0PPqV$y%CJ8N4>dFFt=-Ditmlt^Kd*e680* z*K70^83gLN>;W3BI!Y1ipLJJnC-#nc|K9f+4;On64I7Je^p0pp-XX*}VvkVq`q}7?s4X3H?W^zD zE4r}u)$8_Z-3ni9s6teZ7+(u4NU|m_z9+T>NdBc+&01Cv{WhrjeX{i8V)o(Up8-~J z9QT}R6rBOlf4cVOT6>g!dbIp?_Ow0rRBIc|@YvHudzy_s)$B))e5!~)4GZlQSIbI; zKL6Z01I!N>f9(1NwqW~nzeDr5${1aD|AOoFe2K%o`GJVeYiym{8#`&Pvpc$)T@_~V zWq&UgvH##gfH~1BBRCboz(ula(d&7kR~N2DlB+&kivtXumj$h=UretuSXE=Kp@k<`bMbqNUVeN@DJ}l1zmI*H5CqZvEWif}Ksg>tdANMMp zBXLR`UMsvEUBw3CJwn)bA~j%6b2)1*U{l?T-*#3~l(;7(DyYoym9VP@Jc31I zd1T4br2Jcb=#L-?(!R(xqQETw&j}cPmFvOXc$dkdRB9Nri2K~`_%znkBeyqtbh=x# zK8@>xDtIts55V>CfI$uL&kE;Mls9MA{g9oclruk#uky4jhX<>OyVxG;W~kLMC&#F| zhw~}N>rggJUZ?OFL07!4t2_{Rs;5TS-IUm!U{W8pvA!vNW>UY#`e2w{kr+y)XMGK2 z&tWHwIEucr;Hth;bC@I5k$1-!C|w~DuxerDmS8HW3RIzcn?7km0=_bbNl)py2c5!p zM5BH@G(@Pb#1B;U^6Nn{W-o6E(USftEkybV`$!+ypX{wxYwtv0qv$MA27!&oS_1oH zbb=*FitFM1`ri5X!AP&;5FDb1A6M)5<6XA&{HfMP(Twb&97DYPm{X0GsRUj`J9qsR zm$?~w`#89*Qy!_S`tV}|gClVwd)ec{XH&N~ZsP*DZ)M+tTPk1)S_=e*yb8t=SJazw zU~a4&I`ja$HBBd3%9CoZG|Sw(lLr(^l885Iox=bmX}O`6#|f>10J8?9q~ib^2(i-i zrlG2+pMpi^BZ2;&i(JUq&~7Z-AYB!2bkYD?lF7-du}I3oFsP-rdFvC*ugC`f{8Y-OyWs&#mC${E+T zFb1+bjMDVTJ$wyg=9OC*+v(O)cL>1B2LNDO%n-j?j$_Jkv~qYRj^v9r_~DsXpj510 zfYL1R&@?~ON1;5}%`l|s!9{Go7pMc-0G?g5-%bZ($^U*v*Ag9!V+*@;+}wa+CTs$p zijddN4tDb_)^M1eT5bT#(4%lWVR@YIuvsvSS55cR7x?})U&`&g-kNcv>5$Mdw8uae z+T&7kUna&@+6p6b1kC)>g=s1phyApsbp-ZI>nQ9wqe#oXEF56$0*Nk;;^H5Rj5u{yaN7{o<)u(Oy#Sn%^cX_LTLx?e?( zSbwayDIlZKAU=jw@IV9n=BowtE-sm4Qf!C+S;y7p!A6^5K5krxm)-uPs36YfTW6=3($zngS5wBu;rDAE(VwG$h; zhj!?et<7q4`inr(YB9(e6#ja?Lnsf_?ET%@Z`;T|Znz;BLcSnWfpM+kI)I7$*y!Za_7@8yEgkwa?H6n*Hff{s+El@<1R7PcUk7C*Ggo-$jJ6EURu zyj%{^9vp_z!_JNu28T zf=ev|NL+})1gQnyso8PHxdovmgFzvCDe@ImH|E!n7&I`ZYirz;6|;mFNKV`8^VTf7 z?a}`%YHk{a;F#FC|1GACd&roLn5C6_7iVsYM)uy$W^+4s&R=!)H4E47T3ovBeb?uM z;SJ00zwst%jS5|nPlFrV-w-9pR6>*@f?}jA#3rRpSD;8bjC@%u@Sx>3;rYDK;HDmH zzZa;&h0v*auLw!L5rVa*M`$muNAp&o?9tM}{*4!~KQxnFOAAgt5*PNV-;4_<>^q44 zzJr9+Z#M$M{~bNc0K<1ErKVOz)pxAqNmaXtI^BMSSl{^`&xg@#H?s%8q$%kI0Ay4} zAd{OC#i0JT(7GrTyvCLwKNSVeS^)(jT$qW^hK+5EZ@G7qwY(I@r(JTJjBh@SZ=pWE zl{nwljNDMp$nv&&d_#}5LSVHVdYo_GG&0;jPVFrLF*oBkGdHc+`BMD8o$A~SrPv!*Ca^4$WFdW(5OaU}cI~RfnTz>(_ zu{|DeeK`)8V|K?V4|qyc&+L>u;Cb7#BpwiYyb@-7dGi?u!fwWws~H!5-RYElQ(=^{ zgdq!o)8WTcH4hR5c{*amBO zUvF@M5Dsm@Q;=DkaSjx99Io^mC%vt2 zw;t?Y0}bA~n*Dk6LW=Y4^!Az(|HR_9uI60R+jTDRJ=niWvx2DfQtd*GTO7mic6-CP zN(Uo1aLQ$W!}a9dBeYQ^VMp&8gXc#AU;ohNA_Ee2c=e$YoEi*}_+3*QNA&8}qk*YA z-6qQZNT%#<;pyI*oI&b%aiBdL4cyL90B6aY8xyXyLvwg5U(ZXN2yh@VMc9I&7eiBw z8s?#tY1&{jal{sk3pLj|gnm0XuGXC@zeXK-SrVL-nS*gF$>a_`Z`6M)5eABfEzHoJ zo6pc~VTSIc60gRo&il93f2;!f@6|sUxYS_M!R|`6ldj?iNe`$XOC>|gqlQr{r-HWQ zMS~c_FwRbEtS>WW9i*ekeOZQlBuA-@Etp7lDvZ{HUyj1=mGQk5VfPAPq>K2C=ow8V z+A#4?Be_SkltX_jyxznZ96@S!k_Y^}PhQ@JvhQ7BZn+(;pAh*e4NHBtT z%xu`4aM9{URj-8|`u8oYEpKT}L7Vsg&XCD=GIv~cw63?2r3{uZtInzkWidKPYf zDO$F3hm6cFgyOOtX4NT~)%GM=N4x1SP>*T(V85*(F)FMmcXNI>LcBG8wrfAHkN%2B-FQzDs!I&#P{Gg_GN{4q` zAY9p=T0Z5Gsux(+IXf)JOhh}I`zMwp!EXOYJX6wg*DBMg zTp4qQ3Ph|_{&y-iwb-wbkA^5_qjv z)_hMB*?blqnEZx}F6yi)!>^BnM2(aKPt&VfT~EC813k zj%o?3G1w@yD*L5`o*hu2L_D%=S~*kJ4x|+#to%5Luqye&BOgW!E5|{;l>ng${@0$ZzG@PjCkf<9^8p<2OO+oDe0W~R`hCrx~< zMQ4K|N4HLv6K$c309j<)c?b*wumfbJNN;_J)3)t&9Z$qX7-HqcT051S(=Y*mVTidm z1GPXIWgi6hDqWy(>uI&Mc(JU^0L1bVIYc}Y^C1N!|pqf+6{;xx8Z zFu9`QOygcu0j>VEbxb5eVU1hnB1}!SvVJa8!*-W)Y7C8|Or}n4Qr;rASmAx9?u-UV zNGoK@Qs@d?qxe#A8Nfd1)x;Ga^wHA#Rw6-ORf;E0;(6w&6czX4%K@{C~ zF3f-s=K$HIl24=VUE^PlO-rbh zokiQrzH19+cmbR&|KM5x?%7ObsrBU}=5k~$#A!?1gpi+gNMHL+&e^!8YBzATQFhw9 zE9;a$?yd|LtH*AvDQY12w2E!wx7n2V5;1U?S;d5KE0hqWtuH0gS{PkgLK!{J6*sZ4 zr%)`4cUDGtb%W$2m^I+feQr7OkkTxf-}kp;XS7`YEQ$?kVHBfI0AP4=SX8Y=V^O%s zx1mbLN(6x9ShJ|L4zixFC+PfC$+&{-xvG*lwI)u^Bo?)i{MeL5)%qM3-nY!6YMrfY z^-b)q4+b9gp^_c=EQE>=+l-0TdV8M~U)bU{Fv*Uid{4MTq6(9k-3|EJcv!GoPZ7Cj zdG3Rw`tAlHfy&7%hpT+1zms;w%Y=vT9EfjrIrNUDI0T70*G}!#!S!6p!8*vf-nKdz za3MP$X!Brvur|=9eaD9>M)m%@L{f6yb#dBPjxgOy; zTLOz$xGImyHu;yJ`BsAOD51+e5qsvvqPFF&eq9OY|_aIVo<7INcYPu z*r^@%?(EDn?FJ*h#LlNtnDtQGO>Hwo@e=tLckqZJ!&|h?YgfKg8=kmJir09V6fcF0 zjojn4&aGII@9>|Trd2&VuAN78o!zO;?8mfV$WikyONiTdVckgZWvFB1;ww`Zvt3C^ zY2&*%84pwIu4#3aS+f(snQ7(D%=2Ns%a6l$Vuj4HLpq=D;*TGao#aRp&ywQxU>}#2 zZ4-Qzn?lp~BN*>5%3DKq^B%BV+ZGBkOh5TD)p0WMP=z(pX}rkm{G>V<~oQYYNA{+A@I4gl%3cp8=c9 zfcLPgi!JdWt#c)kYum&NU#2dPHUnZ)*11*D3ssPR_MEElAK4iT%Y_afMC;;&1^9aV zAirK}kWkN-8-U8fz*4dIpD!| zOb-tZwKjOP2}lAB*fCw6w4pq?BW_xfEf&p3hhv$#wM$R4?vr)*wI9-|v^o85>gF%= zs4-3y4W=Ha?nyM97F~e9hMBh|@q?(B&TKvj`)k>_9QL0v65D@9P>}+(NOqN{ zZhL+@0I#}0j6)%AZ+uy-i0!8*b!F4n30*w_=Vah{R#Xf1=6Mnl)<_7PI3bdLMJy}1 zz3~#)yYl_REJO-?vNj=ZN*_2(Y4yU2 z?TcS>_hORtOAJN*Gj0Ok$o_}4&+-x=UK-2+OKx%|%#tlEy2O02vwV&tq7Q3t<_{ej zE*|c(r;CCMgL$@hk^Fg}9gQT4N(9E6lp7WjXTM(~5e;|w+7c%5?C`MX(nxX7PDnmW zLFCkBfuM3w$~N-TS7jDpZ=^AXevzyyjnuRfCrw%B#=awC3@EEH>O1A`Q5vb#r;*Z+ zLE5E%mPTq?lz&a}KfV6^e~d{Zb&XFW1$wWJzge3`Y8u85hD~u9(k9sz@F~)sOC#kI zS}+u_W@=!GB{&g4JtO0oOVg>04NA$Jr>$JgWyv5!Wb= ze)V)iDTuVSnf?@ZvOURzT;fH@lt)0(vJ?%-tVnwq#KcZs$Fa2#s-q3;#h)-Cw=`DZ zW+d+41Cnsqfyf3}f0Ny8^f0hrpNtO;#@`i=$%rNSuq zLwwDvR0}cd;80O`Z*;S-`eJNG7rtRK2MFCB#~m&_IJ|DPSU5a*UjZ{Uyrgku2~YFu zY_~Gmp7JK0ObyT5+G|^}13Tv4iNQ4@Zc66_>{WMl7SEKj-tXbkq{3n^#K@^3O29uP zy&BLNUYC6>Qtv+kD7k!yE^zta@O`D+%V+ZIvOhqf69_*toZ--KA(MO0;jIqP9Ga=m z$(Taw>Y3u%uYAJ-tN8tbzs>$N7-V(N|{^&)4m@)^+SOrpuXZpW=^Z!v}!l4x2rC)30iw$!A{A1pLGC*$YF^xdsES^LLfjl zE*+-i_8hB0kkzsBFqzcp?7(L?_tqFk8gQyRp+-Y%Q4w{h8Pe+jo(vd12E+N1xG5_aui;$5#kcyZ6cns?SZx)r) z#A$o1mIv)TE?z*q_+O<&Q=rS<;gmwe!Pv5FHix!*t*DO;`J%p9y;;g*6IVLcm*f$e zLKaFzm(rF$kAjA{5|e=a!1&h=mho$FBZFn|wZT&5n4bALqOld`=olt;euBrsue+?sj`3B7uQZtXk5e z(6U$!ZAp)6E#@gzwy4rF2-tB4J2-Q|RVh8h>8Yq0UhUxy)#DuMlX{X`a5y(gm%jZj zsS0=8%i=*ad{e6}iwKFLTy26`A??#3*2F=WqIljbkl`RiMPg+6;=z8Vlo}kVqT>N% zzd6zpe(na3_a_fIyfi(aG9!4XL^wUz1u}{Yc7}i_G;k*NJ17A)TE>-fAfYsZfo8kR)2N-F!CN>y;KFbm z+(IEsJETr$f24#qvUenxxqvawj%5%sGm}g?mh_x*;*j=BL**=hz7(M9&Ic9aXOn-;dQXRzfTr6I7ztE8PO7bvROhxts{QTI z#T>`DZ9=N&Qr{SLV_-A@lVddMiYpPJuSuscacr(TX7D?|Y~ged-Wi#VIJz;Y4c za~yjy_TIvIy+@<`#vN`^Ay*3f4|t^{D}LL(r6Y=92Mxb{K7t+e&ANlAF(o8J=^Y*q zJdrre1HX6T{*4Sz@ck5?jE4B!!fQ42+p7^$n{1!+krPMLrhuS?U--5y!(<|Q#U!7!mZ@?JkY>~e0AXA>P5PVkagRuFNz zrfC3e;4`tuKN-hbYFe~G^*34cF$uLY5+AC4tx?v8yv*yTJUvQLL8mX=w8FE zrFy_Tlul_`%{fMLGI2T;)<610-G^sMha9s-Az5G5!8d{TNBD~I=pC2l*jqr8LF4gy zP0b6~RR6+U;(Pct1RO}7$kGximc23a7mp&05t9|r`;$xNV)Q7TnuW zags!b__~tjr`?}Oqje70y)tE8ixq_AvnHJxc;*n^I-n%TRuF4x!nAT=2|34W8f?&B zX?%kA+BaXXn5UFjLr7C;Sr;y35Lt*tzH&!n8cw#yF~QkX%_A4?It6A_?IB5(3=fSe|g-z%YHqT}(7gG6%j9~a7jde|GfgY|o4SJUuN9u|i+(i!C|_pbX!zLYPN-u|QJ?SH;fD7CT@y#4aMOGrQ) zdW3>P2RKD@%DMX48cGt4vLV-r56Q@1%+Z`k2VcC)f$&y%@!j%PY;&#~B@ z9&v^2tUwHBx$3+=_m-6zo+;1T>7=X$pvIrrpWH_mxjUZhPoOdKpKgF~a2~(Za0;RA zlf2FOBlxb;T-a)ey+IS4E#E+Y^S<{3P3C?2dZ20U_{WwA?}NFLsN`M$ELYKEu!V-> zdLQEg*4&?8uTlzr@CC2Wmo!q!O?m155!vRjbkjB~3zjq zzD_4XhfE=!a-9zN8RO0k z;|kBvaS;|fSXDja)?tm^8&k(D4U{16b6o6OY`eu3!1EV~VMI5wzw9`-jtYt@v)G(N zXiU%~x}ZOA69hb0`q<9UU@#h*T3cbcVgT{Wk5;YMVo~VP%RpIjbRAK$W(OSEmNG=_ zWw)hlyD%mw(ZTpK-BPxMjCTg|W`XhNv!!giP)h^U&IvOw)RwaC_IjfTw<^?~HScw| zXqH>Cv`AkMAdj7nJQsXRnQ|Vkm&(pXIs>>W(s>)9jq7bG+d5gE&z7?7LiYT~a%@Z4)`xgL zTgtXO#Pf>-u5HiConHr}(3Ub~195ED(z~AHma@-X40^5gx!h9rw@0PI#o1D}-Kn|Y zTgq@w*C%D0TgupOvqi~yK3mGR3#9X7eq&q8woanwv!!giLxc+{Xu|Z?Fa__@ma=o` z>Un6`xH>S^aD$9%1Q_&_MA1f~d-Ev!T8rhDvaKV*`D`iME@Us#ma?t$>2jBrLL9uh zmia9Zllb&T#JTByjoLOYr*A~r-yUUPTijCiXXs=rY^w2w$@y+66M`!|Kl>&&F%_@b zAoXv~V}sOo(c=6xl-hQsQ5F265nQdsa)Z>?3GRG0NNpFg=cgFew(p#)VpQ96v}ST9 z5!^=Ha8rV-^*L;i+A_h_I=g0r)Fjruk@>he>#p^-+#t1eOgf(pQrpF(^P^F0)gTnL zK}x`^Db^e4a9GcBe8Qo$K}x5n)%+gY-yrqdx5O>CLF&x})0u#WxOkgI2Ca5~9bV&{wC_Q`lOOpkynVl6`Cppx4V{AR0|F4lsx2Q`t3wXpuX z;SppID^!F|$Hh69d*)`p4xWJuZa!bPkI62grCFrKkuv9!YJ0)&uv{^0b+7mmbEU5>Uv&vBHQA9sD z(I%!p=dG|%ry(ikp~-1t3Xh_C?WH25S@aMZI1Hjt=CEt-p2eAFqaC%UiHT+%giR9` zkI9{m-(rb}u5hehzg6JH(yu*5^Uxxt@E;pZLXi(S5JR042-3|45q}o^A< z%a4TB(ob-IWb#IM@2SHVNFJr2+IyR*fG714?9K3k za16in7Yo@nDb$=1js|9?#nj=MVI$!me;WEzUUXYN?%MiYW(RR=EDPh63wiwz)i}|F zi(I!nOtEHAW^9zpV}n$Xmmi}rhpiqK4pjjf@prRAF>Hn33mf&!N(eMQ2-8=RS_~6V zSa^`C5*cDpHIk^L?D zxi!S~B>EjAw$n8dWrH%6_@EUd$V*SOYy&8X)`c{fJO{q~8W((^rwNQx>j{k5bcRZ7 zFjbdaY_JbQLR?cD7|_p&rnWedj%qLcBwbybB(3a9pIS#B`4{U?OPCS`u3q{nA*{5f zSE2PXnCz>Z6pKw#+>xDN9bP;HMP!f?t-IIl?q^j>;RQ+Y$2LZ^O>r)?0B+hA;tD@x z(}4(I?x?U^l_66odqxo#Y(H1P#d46D78SN+s%z~NL5YZvm4UVd5aL3JEl1uetYMi8 zzm~WV5KCBdffh@taxV@+g!D?=AEXILXgw7W@hX_II~VV6|?Rs!1v0*L0kiWU;FA&`?ay z$PH9=eDqhW%|~FQN6W9ZM&iJ-XF$`aL{p7Z`f`+gK^VI=o>Cj~ngO22$ZSuh7o?*@ z;#cVAKfL7Kys?HrYov{JQwC~)KPuLk8R_Tc8SRag!D%6DTLt~ijsb32JHf0qy>@-9 z2|#^p%Ts?|?XM3laPKQyCpWK{l=7@3wRhW6fPI!qhZYbja*QCr3CeBK;2(da-P)a9 zbXz_iS8id$M=+^M2K}}Oz_|8@<&rogEuf|HlN4fW%L>BCeI`0UpbFHqgQIA;+)9oOvM5sT3A17WyK zJ6VM5%s4JWn!ZA=aBVmdd!H{fxkA0coQ5aY>~Famq_~Oz26kcpH1mony&0P!Gop;I z;LI+=j>KlbS=h{^c(ceQ`T`f;OnlhwKe=feXG#~0fqsvj_{&DKhXAlmKbGD9Y=p91TgaNcmfr^uJ}P8ywf_+^yVGzW%Iv@!l9~jnyA^X-08~H7 z@gomi@?m&}lmWMTlh`+$nz;7#j=kb9oNs5RP}DjoGlEkVH#xk+#SCw92IC9^3McDS zp%k0X`bNrs6JtWR$8lh`a0rvJxM^09>HfC5!BkvQDSi zX@j&D8wlsZD3FK@#xe96A1GqI%p6_+=uk|-QZUDnM5(%V$`bxGlw;%nl#8goiaj|_ zGlbBtN&UaUl$>9@Wi6~U_lyY;*Eonzwoprf{j{A^K6b8xkxBczxR%?(iD{8S_i`U*Proei`& ziPdftxwCmNOsz#DKB7gp!N00vM;oXl6_&Y*4UTnIgWiv)iCxo!Vo6wJk{VXOiKLP;3lWUpETRH z{vmann`*;{cMNPLwY|qqAW97gf+9YYM|Kh?zd?M72=2yG+rMuj_Z&}c@1TX@R|{~O znA#qHMIg@m=!&_|4-r)Xd-+(d6 z8wRlSZ?8zN2`IccY^m0wv8Cp=*pgepSLCkeq1!s=`&=|Y+@%3R=c-m=CU~}VVbrQx zm$qVDU0k+Q4z7L}@g_FJMz-qaf~_`ui}EBT#5M$5h!=kMXbcGuFbKv*S4SBB2GN>m zzI-U!RH4b>^M6REX9=!mG2@Y$2OlH0!zQwmvDB zk*jX&{HyY2UDmET$G*%}C-ybM5GLz9)!=?`U3J%w0;|S7uej>YDWg-(adrt^bz5gk zmyxS(>ujm?W?dlTs^+V@kgmFOV@u`WE~%?->lk#&U3HUr*!anlqpmvqZFSx6imR@B z#Z~7KVjF8SS6p>lanARkwAzxa6+7t#|b@ za@GBnQL6eraMgXKa@GCc?=e^1m}OowHpdmU^;~sh5ri9vkW22W+d8RSan(Vf?~bc( z>yvUBx$3sgzbbFmW$mhS?8{trVqaU-d8)zv;JWJaQDD`$=M`7od)QUCb+&XFx$3sg zmP&8d_oBUjyD9kp-14_tM> zQn~8RzQb6cQS6p@A#Jl6F+xnzjMy|T8^RLRA zby>UW9Q!g?o!Hk1LzuigSq<(7*Ht$d1y+rFUUAjEhh24BXG@ont8VLTsq|)D-mbcH zV@u`WE~%?->lk#&U3HUr*tiBb>Z<#zqq^S}S6%o2dm)M!9*;ju3hN{6Mre|}SqZHM zz4BCV{Z7e3$)!C=;sZsN?H#t2T%mneV?P;2+jo7AbO)IZu_gQ7l0fvXR5=ry`e>eqs&5}hG}v7_r09yfC!3a%ST{)}O}@&Mvr4!pxozL=LeCrV z$9{2s`Cga#qgm)I`DSsO9U_saZ_VBD-u(&Z$lHP1zY*~@N@bNrpzM943I?A12`H;?&wfhhosQcN^ zkZF})WaciCM@gSrbOe~B_{Oj4pc!?MnnhDH;6 z7!J&a8=YVTH{t}NcDJz8i=aEpkZ7lx=o|!hdJ!2*#RYn#JM=839axOG859ePLADr2 zr(!V|O4Ls-^30_t=8}lH=*}@0bwMW=Ip)GIcXAOK<<*02GnedFTjgn5CiZ9$mX3gW zfXnaN!499~t`tvBjv#l$vo?}DyyUc%eer|bylK+u4Gw%f#=r&f^A<$2P7q0+8Beq` zsF0?T7ae1TOj~FC@Ttz`GNMzL5zM5{oa%%LRP_TY@rO?_7T<&>ky7hSqDctzKW-`^ zu443M<`@&9=vX{}m)Tjh~G zLW^y-g$ks$er)5mqz^dNOb4x$IQqZVag=IIh1!y4^zLBjdgR5yB_gl?Q15!s{@xp1 z|FQQ#*GuHgUWxmrnr@2%JXW6gwGAmiSZN%n_@l3&rX|^zlfG&B{^|4KC@b=uRUP_T z;(l(cLu6zZnf%1YWKuQqOzYem`41b8+VOBt`M&`wxN&>R=XArZav2CgL;CK9t<~Um zsukGF_8a+68#hu;WcJHyr26?n!s$mkfN<~XU`HWqu`y_4LLQ3`4_nTJ^d_TZCx=(= zBjG+*!G)vabjv{$j=Y`JmrbWbB-&1jwu(17aIS^3M@Il+y|wbz?zp`_A;B}ZIvj)Z z3slcpEB8d~hUAzvGbVE#`ATipd62b0ws@vVQGr&9gzu^?MSedYeHC zf5G~Ynpy)XWU^tFQ_I%HEO`l-1u#o#%q|pWtphK&F>l0MAb2IfD=pzQl^eVy0v#G< zFBk&N59SP420Rx!b*#_Bet}l$ZCu=hChxsN0Gr=e!PB8(Ps))jxJ%q<<#R9;Ez(DF zJHD&<+AqPEX0mU_I@EIlB!;_;%65IpwcS*03n&>}-ill&-^3rF-)}^+yLGoDpAB7* z$ESg>K!=4D|0wWzb%bPAzt2mfSIhYH?Seqp&SAlc~*>l^c?#D74Qt~Jk%Fw!byZt($d*5{;bPZ zaV8?0T%OfFh3)K5UW-bf7}`5duR-L4;TUCEFbcYfp{=<^ZvoSOLo;5 zoxVzl$|UG;49g!KEt+#IGWHOhW0(N22aanY_nvi)Su&>h7BjBS?5Y|RN^&|G@&kcw z<`ikXo!5>|HFTm{6G(Q0ye8{*=*>ab0nMe}T;!~J4+`pnC!Y^>HEr(L&AkTch zK((N8DVU3Y6-Z7g6|2YpQjg7DmXtWGp6wZsx(%~vV5g-l54uIq;Wbz+d~0(7TZG=) z;naE*+DwxJd6xY|YuJ|G5%dPrONobJn0fSQ=h{?SR5ii_9e9X;XhIiz+UAm{0E9d4&~A(9`2xOOzE;DEw9%^P&V$Z(sb8yj60A57Gg6 zt2iicatfdzHgr_6b?gM~!6NleAMeyVXuXwRZV6N%>2eq&cQZdlKt!tV|1(A$k5-z z2kxe-rcjz+E;f>}$xC!@Uj4m!r8KSH;p;7l@>nj(0D+%#FZbA84Vr+igywC$1TrgJ zfXp%%AS0l{M;l!1XhTD3_j_!b)=cBbH23V(c#%$Mxl% zSU6Ez?y=ugBTTRXOJcrBza-62J$a$7Gr*`Qkwb@J@(ArE(-rL{s-4)%3e)eW8Z*v9 zk&%viLOIX5s0K-5d$5PsI>c4jqq`;Umbt>wrR*%P!g=D)YR!XVJ}TCuqgib&1Oo3O z{5WwyXwi0pFPxXUTS8=)dUrg*S7(gtZfJ-Hs2%R7<6~!{VaMIQZpW@gK(&6P4?gb0 z!%kn@(2ZYa-!_6nr{VWoQH2n|9Yq111>iCN--&wHcJsx%@}plu*<1Y5AnNVtjtGkv z@bIZa&qo7;=jmwB2#bMN*H;1kx}eD@^t@O~$}wHx@o4CUXH`Xk2oR0sc+ONA#ub?a)dno)$y1;=waQ*b22A~>QuX7F0@2m6O-S`$^D7=@jz zC+CMdtIKOLGQ$4x z&(|OlVc`fOQUU`+%);TBtnWHR+!!=96CeT+*x2htkO(sDju1@`>^#dc$T(xO2ATE+ zg^a8j8n5Guc@-RF=IXdI3K@A79Atu5;o5x8{Wxf<; zR`$un(aKSeFHac%z_*sT*b&WU)$)}r(ToeywZ{d7;4XIu`6$@eW+D`-=u> z8B0a*|M9$acqWPBCg!G&GQ~|vA(Ul)q|(o*q*rv^w_rSv+rndejiBT-a|&v?Y3Q44 z-qTNtM)q6HgZ*?@@y;{fBx`a*!@SA{sf$zggtbNAU~fBn3Vyi04*8w8#rY zcW6W>qW+j64Jd1nMemCA5|lO6h3!tsF~Y+FqiUGsS9#CHT9n!W0wB+8SOJcdSdmFB z3T_W7ADi|flA%q@P^t9-r048R!ia6v%feI7MtCViXmb zd{v_P5-I{#e#q~(BRk2*vr;0WJi-J{2cQeRc{S?W6;0822b!Yw4nJ4T_p^eD4FB$8 z65EieN>#%Qr4Z6vDUaZS$ce}u`EXdol)27=w8#llT7bi)B62eNf7RvzjJN9x(V;$@ z9E9(UBK@$2A$%7qgJg?FC)t0=#5#2?LtTSE4yKX=`4s1KPRXnoOhN1=4=&kmMK9DT zT1lg%Vev%*ml2d2HX8BmLCbAT7qAMn;kyQH@QKkzT+s#WZ}@M5u)=@y33~ho>uY9zP^!TG%JBF4v&Z~bQJ4?*r!>F#2!%AL zi^DcXVhHzgJa3l@&}}T zmH!b_oBT4^jdeF+QJ$M5FHnSw?q1;mZh|TE52`1@ZlmKcYU|v|*wNpKco2Ct?6uPG z3kvD8*FCMCiH1@}>}=c(2*EUdMVM$BOu<)-h_>fCPo`J&z3QfSPN^ltMXH;d#O%8^ z+b_`<$6a5JhHL8Fv*jwqc&KM4`+vn0O|@|H^u=fhF(pjM7!ynKtKnhBLuEZXKuR0H?>#f$E4243*W+4G6>bUx>`!&7Dh`cChF9}Ro?Oc5P=81XVD z>*mGk=Zi&+VP0*RpKji{k>;Hn2~Vt;zFs>Q)Vy?>1NnTZ(%eQBqt2xHF=x{Jn9p#2 z%o)||r^QvcTiOGRPq=#@Z^j(jUo0O!CO-tn8JDp98KN-3)E0--is`y2Aji9Z`>XhY zclq@nnf+SS=nbwm-C2CmO|yvEpp7GkCrA^h#mym}g4cnxf>h^lkK~TN;gBPBS&W+)-UQDmk)oi3?J6feXszJQvs&+NaYr z(Ap(1JC2EU@~hRQj$p2Zmt}V=7Pc2y>`~A0dib7qoa{ugtO8Ji5xNrIDSE)U zQxWWP4$iA*=8|2iIT7c1GvgepI1w8ZFt0wy?yBl_d}Uxe+}3$zxiJ5Vcj6Q0qBZrY zmGFZ?GBUGZ4LA~o;dr<*qx=RD_m`9IG&CE1>EH?begYx>#dZAlJo3;B$mj>K)|fvLPn zZ9+c%1g4KX9GKs*_Xz)#`tpMx(9i4QTxRe)@W@I1To(8Vi=A)>4*Nuk$yr+C=3@HV z+uvu`{;q_V!UD!RIai81OY+)eeo z++@QM!QVrMWMspEb0+DICR6qAptYpp_*sP0c=r*cq@8^JNOGp64GF0^V`p?^O`=Pg z9r(J+>OgcU9?2w;Vl>Cu2TSQD-}v=mI3zFK1BmIBcQgOc&d_b{87Y~jlalr-y~CuW z4~ZIBP+==?xx-drf)?HYvCWDz;A5NS3|MTFNnK*AF4LeZjaptcl$%Dag}}F@d~kVU zms_Uby%b4Vqbh?acN(?y=s=@Jj;#`#gZb(@#wysTU@TeSW(TR~%%&qff-|>@-ZqvJ ztG(tp&2yKAUrcAhsLELQiLruJOnX&zaZr^rvWP*J+4wxQyy!Uh4nGg^$U98%KOv$c zW_=Gq0vbMwH|69QZz2n`GK{RjE)B03>IYd}$u;M&-y~g(Q(rq`tVc^;JYq3le!;!R z-BnDz)9@g!Y@)6#nD3BI(6r)&??bXkoaxw9&I$K$zBuE1e(+RbIy~j($1z??*xP_xH8GfmIqL#=!O?;SjmDuP$u}h(FV=D1bJ7`vYZj@k`CksmvJf&( z&jTTiopg!`t{~>!-xK<1m1m40`GJ-AgxoVaTUX|Id2S zv~6VV8(3Y-|JJ5&k*0(%igvLEqAS?9_+?lMg44dQVXLu{4fw4z zoGF>gu^YxM))V43_T^S!acEItoLf$GoNu14Oq;~kjR7>Ev?z`XWI$BQj!MbioXZv$YQ8t%n!U;&YO$qwWDamMGHg_Od>h1Tv%(*OJ z1l$M|V0XnTmhsyumT(~LHV*^L$;zF}KX92`$gw%i+c~KLKTYTKj#Emcvh|@j#Vk(( zRG}9mB?;h+N=;$E7c;Y-Ps$PFxf6&pUUwXKdT(!DKgsR`1Lnt5{TY-hKaTcW1bX;! ztdAAuni8CEWh(~fJBcxn=Hy$yfNO25H|Lbvr6zbGJf}IN78JB21n331z%NkDS;k0) zOFf^(kdZ<`4V69v0b1zMLf!8%7rQ&`QUgrmdaEK~&?sGD&;)UWK_fARL4!{VgGSN_ zgJ$NpDU5T$IV676CAAmiQQNOf4)vrQ>bd+@(chC|4>in-z)7)>8s^(%AmS3ejVrZS z>U6TfF=xA%aS9l9OKXPl(p@IwM?z&o`OE3mM%>H0&vGD zDsGKU#Vq|6E4ZsJa%Kwe;oD2HQexu|wb(Ru%&8UvkyVOA5MT({n- z;pESI%C~mNjO#&W3p&Q}tC3*+IxDlNTm=;rL&0ZoHyjE!Et1XHl10a4Mi)ql9&*iB z3T`=}mh@-|Je|oug`6;1rkNk9#eZ*Okpr`JSSj(?y2F@jxfzG^ZZp zmXBic_$b$698O9Lx=`MX0eC4tkONA2BSuS2OS^S3FAPUXzmo0w%C~4}=b2ZKSKPFS zrPJ-oM8{H*Pl$Sw1#EJ%>12=?wKc5UfQv!7vptfah7$`lhRcN-W911ohS^J~vDH7} z>NgA-=uEr`YAkLPp@Gb4X~#v8$AVcEbRq)FryM8*YbggwZXsC1)@K=Kq&pcI`}233#yn`n$8jH zbyb)L>GpIoX&V!7tK|-5ib0v^H+yc6(sK9kAa;_$z*{}o;cmd(QvBHETDbVJ4A3He zOs|#W$6T}cF-Wp>xpFIfzmAR{Gr3*NLIq-os%56>VP+^YFXT_CVr1PFu^du^4A$w~ zfrX$ZcIrAMzrdO;-BrJFJr6Sp`SlhvRcDy7E^VAqe=Ej-w(&FLQNj*x;XBSjt9rUb17CNxT*&`sod&x()HiEg_*XgJ%i8!M^}rh-KK zdKDy$(BUE*sUWr_G3Mg=MSEi%bTFWHTQOL`>ZXMtQiDl(az%&L4l)EyB@hv&n3nld z(I-wqI-%*3+BFl+%`VSP$$INH_N|c&nm$kiEx;ew0Mm_ySd}+U^1fc=^aRH&Gnr%z zRB?sck>-J?RTMy`M@$GD5b zp?L)^K4a*D!P$0dftzOXyG$Hp_q-jfae(wCIZTSD&(!5t>SmVLf0oCs1cqCKAikvE za&lJ-%H$3cUorc;#=}e!d$r4rTmyj4WaF^DjVIFFz_S@!CpzN?2L%aT2a?nldJ%d& zOwDAb&MM~@Rp{O=+kqNx`_-ZR{CEHYn$=pdR&8}?4Y4D^Tulb(l3wNrCG~tJcZA+@ z4Y&5w6SC-e#XKz&*(Jl?B|#A^4J)?Halq(yOR{9e=n-Hdc@ek|7~;;d@^`q^qiySF z#;nheHXTmfX9mN}GpKb4p1ZYKuebcJ8M8lhW47XBM}^0Om?Fc;a$KjJww!`SL0{?t zj3V;ZjQ6J)U*w37UzwMIvr)_(k&Adqxrx8ylnA+l zb2#suJF3(z!&Dly(VKV%tJDRn*evV{Mv-Meo7>`l=^2+st`jmD>+n?@o^n$vYm=f| znM_=V5!$w{QBPkefK7bV1Ial6*q4i^j1{zmiyJ|4!$`KvgNzX*Ij5&}O>eSA{L+3X-=Vix`d!XJWN{zBa$j^IIKnwm zu?7{VrAZac?WjLyJ;!&X03(mVbePRqw>ZGWohlCCQkJ5~(V+sMn~>Pmk=@NXUQ;`+ z@wH#41(<0b>QBA2l*U?p3CoF|D*Wg?CN@fpNTq7h#Ez=$LkDD zQ9;T`a6LfN>PlsqLd*m-Ek+LH362VNzMim5h(|6a2vZ#^3L)pEhS$L$lX_w`U$oTQ zx_@Znn=mHZy2;WBItQa0gUY1-o^I7DjAmo(W0{;V|2)5F5<^`G0qTCiLy@6e)gciokDD{JA z`71C{U{|3J#?SDcC2TP$$P1132$t5^7$^HwEjXAKD>zs%!$o**RS8&belWrtR%WA% zr#i2kEe@3E$X`Dx#9ihV7gNH{V2E?xPY646)z0|oU}vt_89y29%p063lc}kZT=txH zk;Ra&o9X`y=~i_dPUfMI=f~9A3@)MQYOKV5#*FL@XIWL8N&8Au;>SGLFAvJFpTV!? z$6_Ds*GYlEr0XExjy&{>Nl2#}kE>t^5*s=ie9aM2Yg}g8RGKJzjIGJCh7d89gMiVT zWJDs^>O)$4uiU!5sxG5IFfUS|eHSR;vv~^Ry1nAaE=L9u?G?AyIkJqZy~fJ6j@5oT z2HYzE*e1GXlD)$mxmW02i6b=xPD)-tI&_F@!a+O~n9Q;@BGjj5oeeGqCDI;9Ih^a5G zFsWGaud0C7oF5BBvcM7W3ErxU)gw>E8(0#ONT_DS|{Heg7O z73C5QeA+THy8wk<0*qu>Zq_rume?iaXYrZ`pp(xzC?x<6at=ZQpv(?s^~SqUJl?lhv;6A zjVx6mY%1Fa2i4NlCG#XeyfexHGDqYU#K}}!GCF9fdIV)h%j&ypnVQQrAcZ|ZsR%jx zv#u!w(WzLFatSkB)KBJ@!~1$v`XSO=doE_hcOhP!^kC9A2Dct!1T_c zPD80It%vp<=6eqnLZbzfwYfB6@XIY(5)tqRuZ8_R9mW*oI3@EmH|H67QiBzEtm7fb zY8wc&Jc100W2eYOWsYcPgTrhfV81a(4>QF$dlOs3rlN7bl1=G1R;a|m`;Uzs36~gg zA~krr*6EqaBc568Ma-cneGJkC%Zftee;gu%3&o8EENjvW9nJltm4L1}xT@)4Sq<|# zSaz$lRN^uw`fO_B;!_E$(v)RDKhwRYr!;XQPPMcI2^Sw8vzM_+mOVjyNEcD-OB7i6 zL>oOA&V5A$N zOTiDU9@-+(oCssfSlg$%CBNB=$q<#440K}A@CSyDCdz>eBj_Mj#OHz~muMDCCCqKR^M+0FV%*2b@BGZfRzNmYAu1!R+8$1d@5tl z3*o9G$ZtqzDkj^=R|Ut+0Q~*ozez@VY@5!v&-QCeQP5r{gCg6amW3?!IH}dKn8*^u z)ltDl9V*%iwJ5B`u<4yT2k@kVMUPoDi)te}MB1X2gl-x-#!sgf;UJf7M%s=PJe84@ z!FqK1YejliXXr1y73OP&vN%xI5M_-(T5L3Bk)ukgnYuP2N?x5JS3P{|1GTi*)R8t= zV+6sgfq2dCB`)y^zw=L8E9u{BKoMg}vUJvzD6uUxcsp{!QLI!z8ZRF}-4jTGtv4fO z$&r#dQkESlhju^;i7Jupg0r3!^!jF`9CM@`b)+13q@3IVDGJBio(Ahlxe;wn%Na+@ zX-CWRj+Pg8Kub-u;G>KfA%MY6`{gA^%ZrYdmmMvy?SPiLXkj*vpoQtVDJ|z>N6c#M zs5u`ya)7<=oqHRi2Yq4mjF{uBt=M#qzgcrcv7*oB_~jbJ*c`t?%DScs6K80Si%q#O za*l`jj`sXCeg*9|-LbjeY_&V1=R0P`rrq|o@3yPH+urfrc5Nr!CNZTXiV?#o@GV9( zY$Sll|1b%3-P3c!(?c@Hy$_?!e9Z3=^sH?`&qtn~HBZkiPtWb0&|}kIi%Hf`e;~(A z`-fnp_0Jto&uZe>{Cu*5{xK0ST1c}?)~56TdmBBV&89LypG{|6-U&S>2DD$<`u@>^ z;LZ5wEl&@tvyGmso}PDhLXU|7Z9%i1o@-ms^PZ>Yny2Twr{~5_=xJ(xjTYHAx1i@k zPtQ$H&zh&_)=ubYiJsA7`}P*}eB$Z3?diGW=~HY*&pAmg#KDKkU$B z{LJ1T#y`a7jh`>=gr1J*!N4{C8KFk50@`h6D!wh)6hrJ<-KmkQ+P~V=$UA1uk5VI+ z@i$V9WQFpmn6TA;Vw;Ig`-!#dMiOh+t)H&>e!9Mseloo=ny+tcLC*)Co*SN?o1UJv zozP=?V>Dmi+Jc^sJw3NPJ-0nQcXmRL>5b8Ry(-)nt-6t3J?B|ym5`=P`}1{g9*LFi zb)K2t2z*`TpG#ZN^M+c57SE^O2`# z&C_$s({p<#^w=z%9!bxgE$F%H>ABut2PeRB(XKJ@h5^z^KGdT#B69<$y?Tids{pyv}$&uvf79Z%0{a|irv*4t=n`+ReA ze!kFj{CvLY`1xYfTT45k$E>%}*7oHs=y}uAbJ^2##nW?jC-j*0HrgtAXA64X_4K^s z>AB|VxxN#6CN{RVZ)`!&2cDiAo}QbYp0%CO!w!ubS=+a^pyy*x&n-{SZBNggozT-Q zTiaEuWEBHoQ!B|E0IOuMn3dG>R+0>Xd$p3LL{G3vs`Omif}S@#J(oN^mpwgKc0$jz z=m91lc(YaDdTk4$KJrA}HX>MeBjU^(x#g`Si$^$6*u%im31us(^zs4^zP`nK-}mpm z>EC<3c<+r3-z!^&mKvI-_*N}nZ3FX9{?-@c#=4!m2WDFJS571F{FO2jW5CUlERj~N zx0zIUw_yIHeq29nEn-~5-eWCdtTi6$BZZ?93!8BZ@&2z&vC@>A$vko~qC_j|lpt}X zh|wpC6(w4hnB;g|Tyt@=S$4p_hgW*?`iXy|ODV6s(N=d93n2&LmDwz@@QU`xQJw*m zr)mTH_F33%xDB_qY(v_ewKg0K-L_1~$u9!gsN0tMiV*R}<$GxZK?=12LtHdlP)M;R zS`q2Y!cd*%g`q?;J>e-^vf&xhBiTfg3A z_CRxbFRy148uxm|bp144^vpI`aa5h7E*!}l7uUaW5Zc~o!j#^)B=(@cx4|CWt{%9b z?9m*&;bZmXs4y4~kU5iXF1~YdHFC-D-^fatEkflC# z%w(wh__|9St1kD0QJ#6sP2CmOIbMu2SbY z*`>~#2%V>_4H}CQ=jlpYH<5fDtx~4H@89I_3>v$zE!J);c)k5usAZWvbx)eTr6Be8 zU%3Ol&?@(i7me!|V^&2Ys^7hF#9Y~0G?w0IlcljO(b!b%oE}1SI2w*_Jy~3qDi0mK zm&wA8O+nuHR8?xi6xoKnX@)7|Q&nw*eIJfcXj{sg5=l-?#S%A_32fq~G=H7A(fl0{ zqkY&+_#F=edSZPCv0X3~lghi1JT4J)%2w$Tt#DeFAB$Uzj#5nQ<+`_cxqaZVL4yXO z%<`t{vW4r2UR`sxu;(VMI%;S`YVr)(f#1TWC9S*pG1LXp7M))ZSlSdK^xlt zPMMjN_IJ(UMsyq> z|AtybTvW>1g_87#^+}~=GSGPLzuVt2a5GDCq!Okq?lyCez|E{E9ntK8vf8NKGxr_1 zskr?m;KslwxT|FI8~Ai>gkH8SNgiaixTRy9h)1dety~z!=Iu|M9|5_EbBsNx zGAa*cxjNT&FNX5J|Ab;F;}6gS$56&6br)eMf2L{}KVS^yU;cPuDD&0MD|r>e8h#Xp zGC#KLdEgkz_^ka9LxCsm4~8=SpzI zhH{`f*LE+4^3hKyhBE#DJ#Y+Vd{TE2hVo~thVcW&P(J?g!cg{BJFnzb3~TsN7|PzU zWzPf0P{wENhZqVxaepwB@dsrWVJPFvoBM#FAZ{LFC}U$N2dbS_l6DU0nV_Lij{Ho(+Jf%wG-D*TfC zq9M1oYzR9kvPn(XeSq?y?aE12_GO^WJCKb+T|<`Fzjo{XbFbBxfke1=KBlytvFsOX zoGVQ!k3|+0Uj_=J;cHVJPwBfrN&eJI`h>P61+Q93|D1OHG_xV27q-xL&Ek@Y(1?jeT1andfL8T7Eg5{@`rW*8GE|OQD~nj+I*n8 zp`QO6S6;Wuhab^2@*$x(Xal0H(D zwN-#%;?B;C?FnyiDm_m}|3GE%qxVVo}@WZ|+w0XZD4ZU#eUS1zQ2gJMl z{&M_UhC%+6SnjMCE#~WN{)_jo& zZ!ma#&=yXM(`!tJ{C)dsT|-)`AuXl)b*tlv&?^mnvyShHaQjQ@csQ-0Z`L*RosLEx zWxD3R)4`r>HpJB7ST;)k2hNqd_x(7(p?6b(T&Fm{9eOG_*qtgp3nC86s+fh3_DK7m9Jou+29@Sd4sZIM2Kzd_k_5wWIZ}l ztR%^tDJDsV?@zO|iSG3*u8#>4CC5EXH1x&jhaVmiGoXbZes~C>h52RQ&Q5@iqDFvHx~vgd&(+KkWI4-;+R ziTjgiGyb6LqC}hVGxnhJOtkOW6FUQ^8=qNHLlDBxRxON&=_ZrE)r;pq64XKM{vJtQl0SNL#NFny zsr>EurImhrIe9BKq?BJ*Vvj)m=ZckGAt+ag|8mEhvEk5mZ-E7yzy;7MMXRa;SJzxz z&QAttq6$NPDZzw=m-CBHqn3quy)3*f_aRY)ZhdVo9;q7A=_HELEc{&TPt#<6Ec9mb zsMn#{Gg&A9K+SF~C-2AolUF85Zn*>9te!VtUFm~(TiYD+tyc1D&`KB4EJre}l`fVU`fSF!QwR^8pvPXXj;2L!4fck3-CFd#kFx5C5LXzEvIff70@5&7 zo;QpXGheSNK@6oy*svh0^ROB?3G4tF9zG}r5U#iJ)3_K@vsvvcwDq0%IYPAhE;R35 zHs0mOl4spt5$h_RTwz^qaM4lSxxT3iC`0#%fO2RmUks^G%Ucw>t~9n3Q5L!SQ0wjZ zIgR-g$x^Ph^*kmPo=rX*lCioWurr85S!_kYq9P9ELo4LQ)R_RfXNN> zOXu1+H7k~wCIPFWW0*{Q2G7m@jntN--6qi%xm*GEpU^y?$Wk}YQ8Mp2&1vdpJq2=A zHYcI&1rQZ1m>$X#eQz*+_LZ;Do2@)sN&lOK#2G2HN|2Rf#!cPBFG3=f#&4lui1j*C;eAW|v|k(y>DoLmG;9i#9o@SKa#mBX#Zb6?dTsEa|ZAi$FelwM`Ky z{TD=FdY?sLN!pJq0wuA7x(?s3MBRRt>bgigWWMYQb?ph-g}hqQVcX}`nQil`^k3lB z>HEy9A;EbY>KZev;8pTye-!FE1VGT3i$8Aa+R^?%)pf|7yRYiHc0OK8W+1a!5&#bwR8S;UySl=qy$eaML|MsUXl!9sr4+EX=Y6=mm#BgI*pTBz0qv7I}?-L zsp*+i$zHfcJ-~!slXu+a9X0n3D6bnjKt{(8zI-MA#s0#Vv-97lsSDrlxAVK7e)?(a zt5cAZwK2Q$daolcW032;dVc4x|8DeT6g`%;(?k7^3?s_}R3>z)5aX{a26PUqaPLR8NDeg__j;Obg2~udUq<@4*ku4mlwJD|! zCzoTY>a0+Edj;g;?nFcyG(T2)P3~7&Cp9|cRcC|%4kzH@S?6#b2>QhU<@(?~kgC(<%2EUs zHp&U@(@G`S;$Xi~9??`IS`Q6LX+gcz0`6aiKZ+5pyB5sSOn6~}Zt8U?-i9=i(5*2L zuEx;0VMMhQi!L3ED6*6h#XWZ;+To%b(Fu*{LN<|29!{=mfa!q=ocS=KH5*B#=V?Tf za%Vtk%2-o$)vp-;P(%T1Cg0VMdHDyFi#$iM(5vO@9y`@f^5`VEik+A9kf;yhUX2?D zjZbJiivspQI91hP+C+Rdna7jj=O?4A*X3C%d8$993ZkC!vj!D#}!r z=WxPqm|0Vtz|0XRAm_yDkz;jouEYu$b`aC8vcgP-6=s;#twij=NON<$x1JBu-Ny&k zKWa6-rB>5hb;Mk{f=DCz_}`VtQxC|yH{pliyULWRmjz#EIXO8(@U_A;k>G2&Y0?%C zasP>4V=&My2Dlw2I`YQ^pUE^aik~JeC-@p+nwa2gl%`3;3qI~}g0JDHN!SbVnm?bDc$T%yp7rmXntcC+8*N7`rKQ2TWttEQvt!P00jh`9>e}zNLP1 zgj^{E%Cvh4&zV3;sscqq1J;+&VDKe0IFis{pd~a+eH7CNNuue~b<+od5@}%`Gzl|AzF(D7i7U`*@*fctvhx@quLih`I+P840rJjgn&2UEepq!s106V4xh>pYCsB zZa8_)v($-^XkuBb{3=$LEW1Wo_~8GrsH8mKHnh6B5wX*ICwGV_(%Y;sg`<>NQGFYH= zu|Jh3*t|stiu@%sHpOzUnO}^VMP?(Z&VCy#^XGX-n+tA+NQHKEcgDP=IM`#|RqX(J zenE#(4>==y1Ph4IF8^vBhUD}DirW;j7UC7}&X4jk^jmBVVBOj;O9&oPdycLkbY+g# z^JN_$8XRL9HaJ;aU(j(jI7Zbp(Cfu@I#z=ajx)r0o0_p6^z&_u-Y!3FE+(uHbEt4XPio|E+a!qU>fQ=YSIf z2d-CxNas5LH)OUi_M0Vkbn_YOHnyr@z-G!g!GOUyoOkK|)@&fQZ+JRw`s#fONNQ)~GGecUrQ<21-^^$m$R-V|Ul6XiV z6;oF2ZZmKcxSA@YgUzBw2+J42qNbzaToc0hK~A+6mNN6hD?RBqI$!4DgnAW0!gE9V ztzGF=d3a;!H{|VZ^N&XBw;cH(&4ijuk0hxUk*@E8R;3G^Pf#)UMyYt*!QIvcVv4G{ zXDuttJ+*Aez?&ao;GvUf*#-t4QhkJhH#x3>hcI$_N|EY<=^cM3T9@qkTLvDh&I<`s zaJM(hNX?GKyZt zJo&X6bfV0q2Ee)qL&)(=e(>dk!67lzui#Mmot{Gto#*xwz4oAM<$_F`?s6R3$`b3( zR%R}UNCuSqPkE~ry(!wb+@BF2w6bY620Ln5MvrVS?kS8O*)JRyMv?3rj*p-9I!pEs z$Je8vv}7PkuTE@0}hSiNECO5U(p$&p)*8d zXQ&PEm}}jnOBixWUSN+^rf^Q~xgE1t}h}wE@()0D1GGEU?^rZ54Oz;_B z@1s-1*YijV;bY?Mb~Yp4o)_mj-ku-L+m8g^-e=}Og|{E^ygjLIACI>WB;V*QOyZXy z6pm3~5*~F&Pf?_@A)DEpY{+IdD;u&YqjQO3k8H?hwpTU`3ylvXUGWH5+kxbpN0M&> zFBrGXhrw^UkysoY8@DV4K)0EH4D-eM>+#j5Cc!tT5=r$u1zPEhJ338)$#aSVr0XOF z)B1!v!m?-Uihx*XJw8J?q`vW1O7LcbAsj<}L&xsdUDmQfGN@%^=q^V8LFumMXQ;c( z@j;$$rn^{kYMxCU&qnHN*s~esV~^5dHrLTMM|-tGK$#9>uE#F2kvJWe*jz`5n~&{v z7*Kqe=Uq2X209GK)FK<);e2e_{+j3J*~p7yl9~=wxKKDK!@dxmrvCzk-n zDVE6rH63Q+Rdpivo9Hk>1m4Hywyc-x?t{Hq6@bdu6g$L{(_us^4kV|K zB&YF~Z!)!8`s=5*IjagwV0U*_*~xyhjJTPC>joJs1=n>l)@%pvKT+=YZm=CN_9GLj zO$#Hnv#uEoYR?>wyje$vv0aLt2{0E-u(n}qgpI7kH7lY*yqou(>YMQbepgXR=3;>U z%P-_5Em+`5w05g7!GJI%r-;x3v_WI9MAcgYG~FDEfWN^-I` zo}46ZwcF(6C}X#nw$6@*=9-g57A_K4Cy3nniN(F@qj~3HF7y&NXNcLi z31^`Qj-Ajex^_3?p8nU#WKXyRN;VrCu<|+3D49XiXLz>cz zogxq@V`mIa>5ZM;6bKx}0rUV9iH=Y=GccIs6Albhl>Ilp7bjo(ZlW;z<@(rR_S{eg zc5y+qFy&GgWSY`~n`Mi$ z<}6M`lBQu>T4>|d{^-I&d^htC>_j2IoB4-!q7dL_@4iYMOyt)ni2Bkv=gK3#gkG5`FMAy6{v8VJ z`z)fI#D!N9q#F&pCiy!p zVRj`cJo=F55wZeW;=`7C^b&fQi8!X>Lni+!nItYBK+;WTx-K7}P4FS)19V+J0Lhca zr*weN2WXZ}0+60Vz%^4Wz)(H_gHp-|zzTdaN->`%@^=!EFfUHz=xR+z7Yc+Qp?x4Z zM-bqOl+x?!G(?4hLX(B4xE*1onSS`em*1|+ib7z^a`FOuQS*uWNqrdburfE;+9-Aw zYiz@Um7!soWU`Wl&`JLh@dEM9Rru!JI7>5PUNZz!Eb@|CmIt%I$_`Q@^fGVeZC%1P zBV75b3h0=zX|KUl)N2$@x@z?jyphR+nJjKrHqWA%+K!YAR0>&4PB5Fj{WGDc$VI6}Y^@6_IXt13~vZ>hxhHKs$A zf{eOvfdsz0;CjU8QeYdyC#R}&Xu2|orq|D*lOyKP%x<1T%V7$gVOrDR)4jc4=JumB=nma3h%`3y5!{y!&hU2qKS znoR^Im{tM(Lo6vxiBv^2iT0t+r5?#V6ZwBz;-W}tO@F(@XLjPhw-b)7bV3$ZdL;S{ zOC@?9D=fh`ceeqNii3)^FS0GiDa_< zTRMU42q!c>p64;Vj58Eyn9~%n^C=3r`=mQMK{0V4x{@4;zCpUDKV<=#DehNb2J5~sFl3b5>@_^(BZc}oUZa$+1A^mcvuZPB=0n{= zhkS(0Wb%VM16m`ar z;$&|h8k-+N*i_Eb%M>X-rJ24u)t{6P)^O(~z9z*o*ozg@cM?`XWDy_KLfRICIa&B% zj|{k<3QzPtuewh49?Kd}Mhm?!I4FexVBJQ)pJkuN?V8H6fTz^+|BP1D^LG;yxRF@# zdv@k+^caCkJM$?6U(eqfoKb%Gn`pg1!P}K}(qP!X@N}evadhRpm_WcxSM1lNKv9Dl z%4w=o)DJ|T#7Ck>vu@r~#dqVNc)R%loj6zM&@O&9Cw_TwLjKihDtS!GxSQ>hGVV(0 zpP+zKk5hm@9CJrUd51Y)0C7*NcX}Oggc# zpLt%K=sNam_ofQ=>pJ!e%uDM%`w0ym@RisP4kF?s_CqL@*bk1Eu{gsJfrU1_<5f3L z+l^~T?2@bP1~#1e$j)4Fj0aw1a^__UM(-te^dbd}^eV;7)6qNy+?7%=+^~^jD_Hvg zTJ=bBiZitIRXOinKtJAx!1LLjU6+dukijiys%(%{*nrJ5dwYx(5X{_+?LFuWFSZHl z?m8Y2^FL1)(0ykpI8unf32A!6l8%)GcjAa<0I0OO1fVtqpn}08 zyaIsAZ%i>E_>q>;@Gfj+CuMA3rNhbVWZ7x#E+v9c71K5dRXKmJBVSs=P>smTT$V`S z2_@QfbLMwM0j5>Y-*6&F34C=lb_hSBq_NGq!8S|GHY;cFW>Gfp68H(S%2U8}&nPUc zYDe-Euu|nIV6@6p;HXRSsPh!eF=jUek7N>2_lX+^G4!93iCQFXge220R>fNFY=64I z5?Izl^6{$*!VJNVh0z)%h0*$`3*E>pT+%Zu z4w&jRByr^wh9SjCQfH?Py-P%h%PZylH$fr|^iY(r=poB1wNwBjn-%LMmQG4-Oy}oO zEKb}^VrX(=wR9rWi91CW#iS&d){6`t0nVDvZMY zCE3f?pSDZQ92e)|?o|-`Q8sg$eaUS*)0caM&77>anR#4GKW6;oARK!;33z;o`1vyN zT1JF4-lvJd10N^lgx7hf-)AvG_27&w=*K8zK|hiuy*52Rm(8mok4Wsf^p8hid!!LJ z`3^;r5f3wkEoZx-}iwomxnz=EE$`7p=*vY?f;O6%I@7@C=0 zvkm7k4I%s!$Wd9x$)SjPkD#3SA)ijA;1-H*kB;_jP5U@S!sqS$V~nIlO5@&KnfWa? zK4jnjj5G}=3#D<8)J9&~(F z&zKYiUr7piz6yJ!+=_?!YDU38!`P)k;U`oPqr5L8`*Ofn`v!cqZ!}*q9FDJGLC;rE zbEGC~hkhVlK9kK!(RpDz%v73A9&I4U*}G*}(dL$MT)1WAgE^3e_P6o2Da34|p3x+8 zKwetDisr4!y7nCjHylXrB2DfXpWU&JllNWfxFRKsjj^;j6=_*aH|qZ+?(G}M5+!62 z8FRgcxZp>xMprdl239@4l&tjW1*Va}6=Iny*&{)LH%x&u2h`k}%^_zowK!p90gNf=X(t=a^`}_;iNXlT1~3_5s5$cmF3PpCwCt4bMbCW zB&yKJ`)KJSk~_v9bCNszvpJJHtim<^n9ue}?jVkW+<8m`VZzCG{fx<-&*=`yo&8*N z3VF`SojFaS%Sv5)WQE!Xa%bM;%{=!@?(iYH0gLE1`cNBPI=OQ$0Ru5sAURHQ=doeA z1J)q9L(W_wcVC3iw4LGl7>l^xq)P9H1zS|u%`$OcH|sl$YU=bW-!6NuOf<->hTvDTO4PT_d z)c+>M^nu#(Be;xRITcif1?zG`FHoizZqEH;j_exOVR5IIAkb#{X#j2 z;WMV$c}d)F5g1U3dyHQ1bt~FON3Uu3we3Z(@kT7daH`+QeaI_8ShD+6h;^MN!YfRf zUN|FRX}Lgr&kbqo;$3Ym&qtd2c-Qm2y}F6mIU7SL2}vIKASQ~}dCnhW#!O^;pN_Dd zCgd|?J6Q+?3(I1qSYQO!Yzkt0DbbSH!bg6oO|Ds_MM{={*+%DG1lg{YeNZ-aI8hBR zL>jkIE37RMko%99K@TN?*dhW8FVvL!0&Z=oFGQEU3;L)u9x?5p@oW*ndaRnIj7$Oi zJ@PiZ#sh^@>WeMhx+bg|7qrHF2u9JPrs*E#erY_|P#Vv9pfYWk;+ZKt$bJF4gM#(L zDx%&jL&y)avnf+jb||{NMW^p{sz2@Yot=;2;AtuUxTkpLKyXjf1w`}_I@;fp_(e8d z=sN%@+1WELcMJ}psx$6DsqP$o14oC5#=x?Qr7|Xi$)UFz^u`)yaTZTJ-+OfMav^ZI z{|HXan`^-={8H{aL`+??o^8|u zn87H(XpzRF`Gbr}{!8b2k27H<2v1NTSB|@*V-%O#Bxp2;`$Zls^+u7-rXY z_)1%nsmn=&f|Ucr7#HGD=~NsS;;_x~2ab!(9OV2$PuWpOx#ua+&}S%EKe3=x8#5>l z1?eTaYFs)=4QPVF#vHW47M|Hm*(gcuSa3?6gtM8lS&~>~xy`Om62k|?G$ie$&Qzd? zz*;Cyvf$n_#%!i=f-r^7cR?v4v7}BRFha&yw|7q&V|bTgyBaDy&Sa%HCEUSHAOl3k zOcFc6${(ISjn7<865E5@Do4VvM6|Rpt-wI%X$1z1qZJq~No)ZziW;uuh{2cb0UtKS zm+b)`+A<9-jDU+zQ5c6?2RTkJyN@8Nxkf^5T z;O1(^m@SfIg`n|j;ysz+gvN_;STQ^%vtA&PV=x8+38(a~wLzX|%LE?ST|HwB0AItjKB93PW4q7xyX)(aGPnh3Lp~79&GeD{B_AyvS)3 zWQq1S+!7xPpQ_hl6tY6KCdaA2qYFwGi;%0+Ni3k+zB~))VVfD?DZ@>DoD>RgUCA)! z7=z#~UY^^&OD!&EfVBRA#DQ6fVZ^BN{;8xJEWehdZXKJ~oDoE5e;eDt~5gS846ADn;NW2-<+htT+D z(8N*T8N{Q+9uIt{yxoIX$JYFrB{YW?1B{*yNUL`Q#*=+1?=)CK0gDear=-p2#8inKT+JBhz6?C0vMV%HpwQ=4)WJw8 zqTUynP5e;2Q{@6S0>wOLhs`FP!a%XvWakSTCGIIsF%Tj$P6$vin-m_z!YG9Yvn+Ws zTI}@!E0D7Ze}q6%-}5~S5S-~PaY^HAqn!Ra9%%lS9rD+YHxLKGW)mt`S0AG9Gw8A#htL&%HDP ze8C5WYWZc-fZ6LHe;a>x4+dfa@HU(6RfG0qQ-Kfnz-4TIGr+#5Joe2UlH3bibbM$Q z`6ZwuK`K{k)P+E*3Bn7UIBT}}EKkTLXQ!P33I(+v5ZZyi)GgvKO5)BcKoA{&=@h$@ z7=PLMS!SN?<3-wAg}PsmZ?HoFJ#>(qb~59iPWx_*3@@X2)7Z8cdNws zpU)&^aiBhn*@e2zZuh=T8hgb7!rMCug1W@!Tdmm z2Ef1#l^{^>`{U~>LB54ZA?<`nAvlF$ElBoZoS6KUN&pimNp`=mw=jxrU2n-K*2XB@ zUtk2ksL)R3`qQ*ay5zz3B1hX(&2 z4Q=HL#DA#e@7D@QKsY;<-x$h(vdo@>iR%ogXX4qw#N>llnRr%+v4zr8?V$$~J5Yu& zi7_z?Va3Gr117fhyX%?Q*u2Wbsf6h*WmeO+RiOd1s95C$lz1ntT!=!bko3G2kC2B&$R?s6eaL3Pv(iWUd`8iaf>jqv@{kvsP#}f9w>NY0 zaF2@x?v-KXVu5=l4`)mAaMok;GQH>`15`8qSBo9ya zdaCwB@29v#nsPV)7+Lr0^?Viq$A#1Rte^@Lil)Jzg|4c@ZwAnA+9LgV1QRD#{h zUpkuQ6;3F^r3T@{krt?8dp8SI*)d!(CD0yZ()mZQx`g7CGz`2fp@>14!qwKb1!g}b z%R#YAZy!!M-^9Tu_d3C1to`(EJSp%DlVy1m_ntCDa^<*`i?t%je;;0 zZrnHcMTqON?z3dc8KL#cJ0RkPIjksyvKw5Ws_+75Y+Hx9f>`d5BQ=LW_d&nCv^2 zM+tm0HtZl^Y%JITi=+_TEX$H1iw-Ws4!m|%+wLSb*bWZCMKVwOMGA}K*wG6d5jgk` z1x&UYQ#K@QhrMr!Bu+Z-`vetBj0^bj!Y#3oX?q}U&7&OhzLmXX0i_}TTduuK!-8?N z6T~oN^`cgA47uN%!Kia^9*4Q{Kt2KQb8t1;H#2D`E3ey>}D`*N?o0bVsg zRI7MZiE*ks84Gl9YjA~E$qE@T4hX6kM?5mXs|JP<9P|<UPV}%v9fm;d(C2>+XrqbaC?J&UZxI&%BvL96{duX#LbrQiS|_5 zFW?UAg%xxi!b4%}u$#ir3R+9zF7heWi$gKUQ7dS1`^7>#j6p)Z)2DzZUY`;X-N_1C z1-Z*hXaQ`6%oB68L~hEBm(bRA8)ybSu-Ot?M0)}sfm4-M{;?gmOXQxAy){@ttNg=Q zd6ZtOSR8WIeL}uQA!Ht7sWXTd(y&;T{=QGiu)#3p;W@O9ltbTkKtC zv%O^>(?eOy)UoBQdssw62o*goUlcD@7&9A??cpmx=F*UdjxjFVK&4jGLSx6$i&)1l zEsIYj9<-x~TCrz+xQI@qH@_3s*;ZyGNWGhqTGOWZE~_X-35k?ka@O#Ka7;2fCrE5Y z%?owKB%jFNs25#n*(kQ)%}d`2)AAE?(2Fx4BcLa80G`1B7|c2$>*6)y!c2@;DL8tW zg4Zb_;tW5Ta#$e~icu_5U=wMxcWj?|3hcGi1T~ej6s=ffO9DvPA>;XK$k>wPiv^3a zS+&sCW)U5A24JUf$NX|Ml-j5{wi^~JTBMzxD@WRMR=mLLApWR+np7tQMl7_AC&MW%61B!e%AP<+MzDyWt#{wO*C{Dp|eN z{Ypp;bUde=h098rnPIn%zjQWPcHhLf-LcePpz517ZQl^5e@(cx?0juM{8241s4d6% zuy&-j24uY1KZUt(YR3(Ozilmn8mH%ZRymS-%X99wel7Q(ZKyxn`;yMB)fk_eb_C(i z*Z5U@m5gl1|CJeysO;CMogZl*SHiy2Jf-h6%Twbshk%AT!Ks|jhD`0}Gl#&D=%1SZ z%ppFDeK~~3+0dAJYUw}MRaZ}!dUE@iH497h{Bt-PYth%Kg1XqCq2?a;x7YMqa(?n9 zYT$l-ydJ^HGw(%T=l&Un>7RhkxZZ^W(qEzkZ$hVZzJ$2+k$dl*j3B zU_J1tCI{PFbG6?ha@*gN*S}UjUc-gWKaF3>>(8*XlM8KN#YsC;dqxA%>(<~18oi*@ zgf7VClTpOOZN9;xt57xd>{QHpiamLQ&lvJU)hl;iYEaMm7bwS^d(OJoJ-2_l5w+r0 zn|LY174^Cb1L;@(__F|vA_exC0;GJalH-q$mZ89#WP3Q5}w9cIKnqYQWyFSa&(&gUz%gWqQ&1=5qzPp8q zUev%|x$3Tkm*_U@!IpXu7SE=hQP1H8X3PdUGuH}mx(&eOEY{ucHietVFj@L$eM%vm zIR78@TeB|C|84!^ety0mrGJvZQgQx26~CSir~YSmO85OcRuP@@WrCAS6k^6}{AS~< zoE{_ZCOF~;-5HBu7+=G!PjPNjkx?*jA~jzZRz>Dtp)>2C+niXf2L)M&i8yhmHaM}Q z6Sqqz0F?Z2ns7;O)r{OQ@LEr%z9-rR3l=P&{&jhAgX8@D!4yzGsV6KfVQuSaBauVw zgt8Q=m*F1$sh1w2uA220FqehcG<*LU6H^Oj5#JewUZK4V?8HIFSHWMcW74lhel1aA z=flK=0n*<_1UTVlB0+P^$vrb|>}72AXfNZu#iMDe3cag|}AT`XT_Sm0jGD{elr?wTnfC*lhZXQ}|bggGac)hsS;0jR!o z5{CrqT#N9~fwW#+$nLUV{_}JIJBRR6**PaEAmDZ>agYN zb@Yi?`BrTuUkwJWmQfM}m27g2RMxKVO;-KMeJ8?Ov?cwGX8)%&a02N8u4@2^1dnT~ z7hE(>|24hYYnj)sw+A6)ajWW>YL#1fQ;*2$yv>piT&G*-54iVPYaGd7GzcDI z(;M2U#CsVwm=i3yuwPfgurLg)bGz$Sw20aisrZrgGg-`mg&Ro;dH*>%sJYVLp$35&C1&b(S$m zZZ;%cHDCqCZ)kec;Fcmfcr?#q4RG(vqF83&MeFf}!WPWW+lc~SLUfnL#CVwcUuQrx zQ^|M5zcWVlV}*gPdBp6J*~v@{^N69{$nMne+FY!;pa#moMyxWAG}Ia;H;7BdvETaiGRyji=Ft72jU;FO6+Qw zsL)UPNeC0;i)o*KY@SO;o=YO(+K(wQ9Xub9Uwa_AP2-=pextWPHuuD~UzJF;TDYn9 z{E-@Hf`~2e2QD4uiJcBaG9n|0#PeKsL>_cRE>S>vCNYPE!|O>H`W~lQtyj}3AJ$vd z1oN?MvPR&?i0gkYZ)gB)H#%h=Qm--(31Yz;wsu)6i~nny<77XI^x_(~NEW+>Nd+Xv zWcj(m+_E0IOONQ2C%kf5p#=NI_v{rgv)`H4f1k>dFN1TOpnw7Rii*C&bC;pW&zt1G zqn`|b@#wEGDCnQTn5x6=U(n4823Z@CEC^8>F8;#0UYHwc;?(CwM1H4@b#$8++Mc+4 zq@uZ!UKAEcCC>|mpnO3ns{Q&#f5JOv4LN4yPT>d=uzRK7*q_BK&+$7V3oFhaU->HD z*=#l;?@X35)f~fHOY-k(>T$%U%TyefsBfqLg}^o9tUOwK6*oC2^n>-0|C9exh8^#g z2!qm-uIG-~!Li&-G@e`P0V<#y`hanKa3pwDje%Fi1-z<8$*W>;YxJE={*|6`S)5lz znx-_(L`IT^^Qnk(IiE_E_o#v=eXp}j&%Hu^75A0>sw7Tog+-?5yBJ1(RV2vJ{HiEV z&@UW0zY5hLI^?dzMjHD&$z1`bkh>yqk$F;sST>KSx-1iBR(VG=^8F%C`UYL@7>V&V zK1!G;{L}*RYsQAm3*sl5v}NIBy=p_0K>|n1u8)uR=fqcx6`S@rpMF-nu#a$9?N!eb ztonMTKf51>n5AQM$uYzX$fMkKz#cav{A5@^4{|^f%ES))y~yUh4b&UkJQBOTv?lhq25p(Fg<_Ym>jVFZQC_K)in#| z|D;)Pf2tOBo$$0+@eG*!(nVZGS%WaQfO z`xr}C!-TVKB_+6%*8Y3Yk4e+B{YXBjF(e5I#GN`^MMOqkVNG#iLDcY=dQnPDxQ5HF zndH;ahA6WB+`5J@pcN>+weA)e+GX_?mP12n45YC6Cvc+KIm&kg)h`nar#~)ZL>x4| zra$%k4+f5q>R|{VT_@%DxOVyPJE&d2aH0?i$VD3sqn;pTK|MM~*R(hzoZ~T+kRKL( z5~n8hrPiA!C%d-#yfqi3-jbX8(5{R+Eh*|hVa>Jb>~zh6G``~yVJO0ZftmRA zn=C`_q(4wzf<|M)v5jk-Y^H`%0Q&pEM2l=HM}e_{*G1|)*gzEALa6ax>v%z}I3Cv( zqG*^Q_(=M$u?VbYn?%8C6P{HT+&l5rEKl%5`bh)-fiG`bNtFLe{L%{6Ds|#A=}*1C zaF*5WSK|M$|0u6vzn2MyHsepbKXdl0w1E%+>wlCpoc;m0v0_AQMLVx6Jnrix`*U90 zK^m{}cKE`cp5j%^kd$qnCbLJ<-&blET*gEkIr-Fh%{EMuM*a@{HZfo`ZBd);FPIJ{ z5Py`3amsN}9_}(rgU3(QF=L$(T=OGbSQw z&A5o9HDjaeDp|Pko=T<|ET}0a-;%1YLIMdt>{Jg4?BQn~AdzV!=o)s1JM&2T%T0Z} z$~q#jMIR;?A8Noo7Z@Mf=_((h9PM?qerOJqCa}~jTN}7}02fFKFeqWpcy@vk{aRj0 zzXx}xRVW-qtC+Nqa3+^S!ugT*C%v|tknCsq_W%i>kP4U(5^OWV4mA6fLq%7Sg^5Qmt8fTJ{M)Mpt5_}_sg`LkvJ)Z4%!Ec z(?qlI=q%n!x5NL9{AxqU82XgSBz1kR6Bx~`&b#Q|TbQ#_(imyAXF$qL`I%Mo{?02jaOw5rsJevMo)8rro7(z z+kbU4uc7pkzty~lm-wdr-{bb+-?^8U_+eUg{kK8im0I#QcJPvaJZ?*V?_OTwZP~xH zX-hQSF4~td0b;|1&k+fnC)LW^3ueu8#wV2mO`2RecBE!r@@=GrnZW6z5jwfRwyck_#{v?8m2drHOT{i0 zjs`j72z^X+ywLwZYMx`+GpjZLPS0cR-APaaiOfZ*s!tMp1Vbv^9wQCq=jIn&t|+D@ zsJ-0gKE|x<1X(``h5`r*S*QX}%sH`d>6UHEw=j{+7rCqjDZJ;+m?aXFEKo7SaV=q! zACAA_T$dNvV3(sato&-&hGdP>)?v0hq(Q1jU_2~#Q@PZn=M;=;D^TzqN+)o- zF?|OoXbT@E!vW&Gth8b&4%b-^$BUh_VXJ{SN$fOXe>cjTNncCF0023I+v?_7|kv?~t}@b^^%q z>@!#m85{dPYkNFkH?T*K@fx-h%#CGeA;1)9-R!JC79$*85g@zoD=h6WSr2+-sRgmj z4QFP6{=CwU_p?dibI>FMbFZfiL)6S0wkl!|10^m12tE4>k&6j$txd>UQ@i`I5 zsPZ;9legg7-qAZcvew{LmK)M`v(~Vp?F~H6_k^h@R^9^77?Co+oV8}wSI6=YoV7+> zkP*9wt8J3C=G){O8GlAS@n z$TP%jWzL6t6x3CR7soiP^7@No!onJe;uuNF2|khNUt)Q!HU+#8w(SQl0$A6SM&DUscVYYmQ(;SgA&29s7Pv>|;*Nh&Qev z_V{d=vrPqaIaJqR*Yn6b;jXKc^4;;BFZrK!Rr9((h_vU#RZpI9+Xe?J|_4HO1b@};8>R7|Sq3ywa*(91PI{Q~Zf%z9seS zl3Pqg&r^qNLHgG8vrWLz>EMXQUXF!rU~^?a!ZU0-5jF&oLC2{gMs4Fp?#L}F6@7>7 z7Qa@0kiy#3iXl>1&4MO)ZgIfpDTo8=ldfngZ8pN1 z#Zwe$v3Uv<04t!R;beLn#BBJ2Y;u{Wd4xc%rN7rGm|7!NWokdb4yG`$+UgZ=n?@*N zj|Nd#w~7s`m4ICe5b=>o)_~F|kwhC+k!`^2Dw4i|<0ZKm$yA@NF$d#o`a!p+|5BWX zP=f_s1Oe-;{grR=1c}jPKe+Y?RHI$GqrqEEb38)chJsOfQvt0ZXG@5?F)jX&V7)c( zY}xs$vt@E0PmNS?BzNH|n9re*GLKTZ4KZL4-&Qi~DAA&7=`Uk91(d@Zc|d$03&)pwypDhKCqug73=+b{6J>bQ9u-J5s7iBKLC1$5hqG3 zliL$uVqNP|Ysb(t+3TEPS+)+r>-{DV3=AYAM)WKSm|06B47bz!`qXD;XItj0FuMU1 zhn0jyD<}>dEYme-yAwe-6O>*#P_vva?M_AO$}?6T6)u+RL}ET>=tAI$!eDOdjUDJC znCA@Ure4_83)$NNCp9<=jK00_b5)aEmcKTy7J@n*Y;t}KZ1Un2g-z~XflXe#!fbMO zOS4z-c(BR;XhWO4S+dES*yK3I?%^?Q@L zHAP@7b+9s^t%IAM4DXTPMubdi?~%~K&LasU%B&GV2o~H6<(pD1E2*p9&FmZ9+e7ag z!vjJPZqnNtHRl1@XvqU=dc0a55W}**x0{An!%On&oCnk_@alW$ZNsYR&3STsC>*M; z1^eD5{yCUaD7V591rQ zOFER{8!SA3CF^Ei`qsAyVyN*qJM4r&S?X5aL$}@_6-&X%zOvx7;NH2`#c~@Z_}KzM zl9yS-;2rM>i&^9lcJuTpkBy!`!m1%lX}f_v|56s&x?z@8TN~^i)VJ4Nxs_~hVr|X|iEK5h zNxv>y!bSb6Ue)FU ziB{qBPt1B65ff5Ol`Za5Osx_C#&oqQ8o2Rg{dq0@$E>oDXnHLD3k{rLD$#BRTi53* zvHH+7!}Ud0pWc4_tlEU!)KuY3{N7*1fPL8UmG9X$$IK`(3qB`-s-_FJK5V@sXh{+d+2Hvw8d5Ki7}Wew+PnxfH*8 zHvbv+G*gtcaki&ea`I~a;otaOi)#2-YyK#w<8R9zZRcNjcK@rrdQI#j0j&1%$(ZNp zNebmQM_=c6O}XCvXi8oNrZv{8QbJIK+@M8Ch{*hN-_Gl=ASN)ho+TeCYwbr5)**?N zoQn6-75OK=HLQlPR$_9C?8)c$Dp4!Zp!r(zBL zrMS=VwEK~A4NX8umck3|@G=JF7qjF)dWFdc1JGTyZ)uuCFOyGIK%kuw6Ovs4itb4K z+LR^PWeN6VF$ge3GmBoV^eIzYz2>?*@kxE0MCa3S{Ft{Nbk;)8;2&Pj0jk@;xqP0k zu%3+fOUClm0Bm#T4scqVW+0fO|qSt+Aj3oNapprhkZM&k?ep2S!#(r=NOKvMEcvP$K*i9(4^%(9 zi$xef$?=@WUWEy`?d-Qy$E&Zr$RXA&3jw|lqr)096#CFl@2Lg$qEZ(c8yaUso-^>I zJ!h~rm}(&1M++1^Z*b0Xkppw|BWjJH*uAmW%Fq3}O;c?iP%wFt$J|u=Hq;6Pac`w< z@EfyBLrE@rdy;07f-i3j>7}8zbERcG*Nia(%VDiD&`j#*kl~s!CcorEY8J_nwzUme`>S{mG)lo* z#tZo-_N;{uDoGg?qN5*wjeD?d&wl+CCj!FEH*nq0{KU;olMil!l5r4bKJ$>w7>&Bv z7Tm&SK99(uuFiaDsLuS_VCLgcNTf*mmS;YaO@gU1^O>EnrkgDzX1=+YkmF`P+SQ1o zmGpEm^QqJ2{us%KH9zw?KQG)~RFBa2D;cwAo{suquPqnvCehXnE6eY^n_~qF2L;cd7`5j%AJkr7H z6%Ib}2P%sz=XK?-zoN3Z?V_%n2N(PmmBnqBb?~~sqO!Q{iVoiJS5y|a zUDd&x{))=tws&;!mcOF1xb5xom1{cC84>z!`QW+^bVgU+D<9m@fzIg4`{je1I?x$i z`JjBTrURYPl@H4Yw{)O0y7E!^;Ig;DW!RvbgQC4qo?HR2H{g(ZL)3ipt`)t2%hoUr|}y_KptT@>f(A zw_Vf0+y08m;fn8UMP+f@nhrkjS5y|a-O|B_{))=t zw%a=R$X`+U|FQS}!IGV4onQAk-F<)cz0>nUnvrH~celsZ9co-VsSMJr5zak|WJ$3c zYq#`={~%RL$|+nUrONWUQc9J}9N=0xY676n2-|zFjr%&JMd*|L6%hrN5rF*(hpY#5B-skuGJkMJ{_O<3O zqDoT|KFdzEiiRJ8%WT1tK=gUMT1B0!9u-xx-5^RwNr858kL*V*iylYqVhyHm7b@zN zIsdqIT&&J|f>fD8K{vzRd*JT#@00(TU;1KgrhWejt|1{kZ@z&j!)&2)PU^y)xb;@( zqf?DXdx*4nycEYnm2#t!(~>HDgS{0>_VCD10+ka^o@{geHDIP@Jqs)}THvaYM4tzK z^w2|gplWw27$069Mvi^X=@&Z2xOzFhMm8?C_xySeha6|Icq%xYp65*^@aTFVIl+|m z!CZ*RK#gKD*1Pd5q2q+H_c4@lZCdbuy{e(?FvRLak-#zd(T+CX;G|S0uwutTPV|sX zl`8?xAe3@twN&e71;qNRwkx39c`3B*z_PZ%Kb&JW?2IF8l3G&jI9>ygLyoY^?!)U; zOO1CU)Sz$hkEN9JOeV!xHViwJtSd5=*T==+U!%yP@95njkx6=NWPd?X1wbUmWxegpsCm016h3i|#U=jicdn}T={D@M7q88JvB_t{h zBiFz*tr)CacmXQ8RtRnAh1v!<9H$^P2zczkU^SRRV!kF)cS{T)zduU@)PqtP1I7$@ z)(D7)(jwNImjS zupk^P?!xN1TdkYUBNn2#Ss^C@>dXuvc|xf>tGg@U%NB zuWrFGdCN@<35IMlLV+5w%0lAt3^Rf!16TP?xGLOkkZ#!^U6~Lw>>|O2H8gaRU4)q) zxSH%DqbwZ=R{^5baX~i?EeNY&)bj)&Te>(dc7MG17=G*11aDEoc33Lq5j9kyH>Lsl zQ;`OcQRGW+!}yF#Th3{pt4PRS$FbN_SMxtvwXYHnCTUVCHNON5_Jfvmqw1&>?J19O zoA9&WY!^JWS{#$Pz;$ixGc)*fGfDKZ<7N*N4s@dAl4l7N3*V9iVfdEVXVqp0_8RZ@ zmz8}32bZ5kVc5(_dlUG^(Z|JvI*tJ18!?9%%BnHEXdYbs`A>d6QDFq)V7ce#F5Iq>NmF936aWI+{q`l+Q~0oNhjXH z=vBYB#ZIb!mD9X39&BT2pd{_;|Bp{?zBG=*009CEh^+mJ@#9q;=xanltT)lY2-(Cr zOw({GX+syrp(>?v1^-cvcyI$4^m@dr9wFMJtm=Y)c|_#0L2?ec=q0f_-%yQ$(Ck+IDN5K#OO)Qms;Gnwp4UOH{UI&`dvt`T zlqbYw>Qi@%J*xKNqWid8om|yn+ewU=usV);(e+jI@Sz>X@BT3G=fT?<`_kY)Van$` z^+qlqVYi0-Gl`>e0xIJbEIH0YzW@uBM`cI5&PhvW)5MzbyK)f~)@-~0=!eQ@$n9cG z5<1lX?NoDYHCA?Yb2omLVX zW%XEnu60}cbesf{+oLfy@_c+jnvZ?E)b#Y^Kr$-iu&mZ0Y4!wLX~~0_$EW}}u$Ee3 zzg__LKx*NnP%rRKVOGYd>L*fqXsn1?zkwR1UD%Wm$p^;uV(XU|k3rFLWxLQL3oh9s z8-t^5<|f3^Vsd$?2Q2I4;S)8MF_VLNnbfoF_? z?dR@f`UfOmBM<(0OeCeyMiDI=dd!i0ymtm)EXXRzCvgr)An;IZa6>d66Yb@}d zgl;}UVt0yqb`HU=`U_aOGksBG;*Qbh7g~3IIJU-B zlMaZA!oUC`So50mGgvD7vK3*?!t3G~yb7l5y7=JJP4OHb&oPPqGNq{xEQ;R1bbnCBdd%sbIxd+ z=F(C-X-cEU9A_n*1*mlse@0NmtW>Ym*?=^jwa%GiwaUp$0NE!JC878XFn4tg-k&I; zre2MEoWs5rWwVlSiV~WVOEHk{&XlQVJ2-{vSb3o z!VIw*Dz?gOpXb+R>U#k zvOfeY+DV2AsX`j8MW3E3QHeeRy&~E^q;@qf-OHkc2`G3X-tgXUP?@oK@E55g(wCy2 zT$YZgtQI`L$Y4D^(Q)^-VL_Ou98ba4w3mi8F7Sgd4~$#;hXvqofpBe%xUhQIz}1er z3op`7<`^_AWV1yR?I)o)c?52xN0?onP>{Mg1w|dCV~{Y8gK4c`Ee)%=YL3DVi!Jkn zBTOE#!2HKxI?$QE)M%fy z(9D%xVq@>SG)AK16xUidG8jqJ=iVasCV7rAmz&B}W(79hN@<=+j8f8FOrxp(LvS+@ zt*a8TBP85Nl^{ZGSxEBBO3h-%^$2{)Y#}p=#4-{CVWsv2&Uj-u!4N6E9T);~!O#Id zv@4E8FTwyA6YCSsHQ{*iA;(OKKMz?*Yh15Jl3YaV@W{=eHP6E3qbUo^glO!2C3$0O zO!YN*5C)bhw@8!=i*OqmX%j{=tc))abHsh!koS+KrC}3uV0J(lL4tujih7DY?}$N> zzmW}dD5ij7^ixm_ODjO2BPPMiHRSH3aS!WC8b@2FaW#EfhqdltcmDSd65nD^%Xw{| zhmMvEo)&e=7386?6DlM{siN{uviR;>DceQKe8pczj2;zBf98>@_LH)5`h|!|nE%*( zcRs|pD1;aI$4~wEX;8I?t)1vEfbX7>FZYIEzMIA~+6tq=2J;tWmslRIyw*Egx`U$* zx#{ZYEqv5d^N5N|mkioNv-{se(<-pr8^iKN!zwf^PYK4z;>sHwbEeN^Jk`Sj2NW@% zhb8<-09xOd@OHEA4lsTCS&i=Y847ea6l0#%9pzSXF>$TOCEdXdH|y?bbf;rt>GeqN z4skNOyF%T8NE^*gTyL}f?u!22AN}2t`@4Ii{!03zH)zGH%xc3ZF-F^iKZ9V>dVqfQ zUeSG3iTm0##6VysdaA}Y?j&rxIk4@Hz_w!^2uyNqY9Nq&!ZyNEg>6$ELeDrf>kfy3 z-WzpzFgiRE9S(Dcl<8?ey3yhMWjn<9*ldRV=x|?jIG;Nt+<$h5JvuaFlijd{MK&Uy zp`P$GEuTeg-;9=@Zb#?m+R^)2ISx$DvfF3&ufjo@p0#mdTuvwrQwbh&>N5R4mij%D z`XyUB^?Q1weuw>=Co3yvGR3suz?)9=q153cslyX>hbK4eaOsxSlZ`%svCucVuCYmZ zESs(F{Q=+y1HK>3(?mwjgzj+ZT~mAl4nH3>C|kyi&0Cz)%PgI1vt>qjnrCBMVcJL) z%i{Yr0=IJp13u87s=bj6j_g|ojPKiYHMO&!+J_lg4u{jpzBR8Ba&!!R(#^pNp3n59I`mKhzyI zKEIO2L-kp02W^Vawz+2E^JaW16B=m{n*!>^G_dn&V3cJvplxC@sV*vn~P7t+8kCP2M%)eG022`EaM zY)WyDCT-vmX#r5&sRXFg-K(IuMF7QUh7(;67yA}oVAlhpH}%e?`hKsJ(*a3TdkT-Os-2TkcI}vFsA!IcbWd5OZ}g>u0o1q-T(8`{fFydhDQSx z7+2R8!6i6>Qd4U`rKM_*UMzPbE%nhf-qQ(QkJRHmH9g)5yztTH_3g+717|+3$~jBF z^QK}~oM`n(8MTFpDyNQnEaqJ8v5Y}mcWu;baas4Msf-(!{kv{;p*a4O)w~OH4^jI> zhsdh9YlZ4fy>=BPQf)30AyvW42hpiG7bUQF;f&<8q|u;U8}_ulPc+V?l0C&l zTU_8+y^*S$QXsCU_*XO_SDO(A^?TslkD92cV07P%Bll!Zf|_Q?laP(7$caVN1o z1htX`{D4zISpBMhU)6mNyDu%(*a9B{-Uf2@13$s`#@l0i<2#riedU2quBvaUh)(KM z6WE%SoM_;w9KfP@C=q4cKAYngxQp8D!*;0h;iv*m>+4o}&jmGni!!lYZeA?Fm*?a2 ziIUIH@ma~Ox;%#oKBu4s0D6Q_fwZg5Pt>oFp{X>slK7S%@hzKE{PbKq2RLxBM~!0a zz_6naHYtp>$OTHsK~WeB{<_F*vU24jPvpSdLPjY5+R?m1S|>C8be^fQqS7dtF!iof zC5tGJmDqF;@=zYY`v6BYW(G!}hKk9s7c3{gqCes(igO*gsT_Jnkk8;Jyn)S($Z_(E zlg*@cGh!c*-M!|FH$e(t|!j-=e^>riBh`}DE zgV;x<@4#@OhfRkl%;iHA<|c4Kl4EhrZ>)F&OG039$Cl_Dsr0>3`r;s}NLOAt|qA%TcZlvh-H zhSqw7W*rhnLo=F?PGjhKjtZjzd6|%~v8Uh+*gezDhsXIibjk{KtFJnIfXYI~3~-23 z`ull{8(Z$Oz5%*Qmkhr~$C*1Zi9heziDR)|mWIxjj@~u2C5Y zwNU-qr$65sEhc5WlN`j~Xe8)wfCMWH;7Jc4LMS#cloIp?P?A}J8MVWh0paov}s;h)qVL=Kb zqxMk;4yd032MEE@-m#-Cka90g#}`VX0xqP@f2sKlsskJ(mS$-F5HnN=+0+bGj>t32 z8~Uy=1+!-)sj}3tWFLE8+?Y|vSQzDHW{3wn&Ctbl5Ga!wmf9UJRdKbXRs9sL;{4VO zt^8^#xde-=6H1dqiBOh0yqhd`r3^@uTa+fZh-Asrh9B@zyQ*9cjOUo4>aU1vvlg+i z3)~c|AfPF3%!oHysN;e? z8QS75i69=ew#b39S@TT0rq|fBWIZ586YZJ1K{k(;SSdV5z3Jcm}%C` zD%1^(#4rv8S8Uy8n;X>_i8hPDP64s`0;JXgs_IRHfEn?%9t03c#sY6ukCZZNU%R!q zAtEMpWKQQ`3-P1ZJ;KK6z2HwPtQJSA+yd104O_M5P3)a+p=k)p-sS<%Z8;qTMHt8j zxact88;g76#!2viPY03pD8Bm0F1W2KYQ`Xdgj$j-5$S!tJuaG|EChAG=$$4e6{lsg}c$^&F*Ko#yAa zay`R$P3;ul-^TS}z7KVu?;|MBgVzqeP9CBT6I%NUsw>G|`7o2t@LDTC2nS+-Pee5* z;*$5NY@DDdpiuV`^?o1ofc%NM6_n{#qsO+;A%1-7=peOY@!0`ll!1jb%E8If8m5~E zehR*0eG#FwZ51kiM1{&6+STa@kb#0zSvrTp;VD3NO+w+KFdePz!%e~E0B#B{L->TJ zJ}Pl7EE6pK2#8o54BXS%iv|e3laJzr_lY*~G#;fFx z4~-AqRNg&2^n^~@lnSSt_lyp~tLXcCWHOe+LlM1f1VmluhkI4qRMpkrq|5t9zIjg^ z==A}%IorDZLDf`d{lYgR$H%8KB5LME5L8hkFr+owA!#9`(gDCcBg&H0*PFr^-*`}C z$A5GqA(eb0q>`_W<>UGa)rlY}`o9}9C2TR+IP+m*qF{UIFx(w2C#@I;9rJ|0>St%r zq@M|Kqop+*TE(TqZR5|u*Ay0Qk1EN6BJJy5m4%hO6%eS2V|6DvBVx&c&kc3CRo@_xsBFT-hf0NSi1h7RUq8llaJ4kpOv@|q-7B|XggtO9KJ<+F>X3#RI) ztcNL2!vxGRPYkd*ZY^Gp%O_QfTDY3;9$$CeHe7O%+8{ldd~lLYYJYm>EZR z?R0`c7f3At7C{OT^}RfH2A8+gKqN)i>LsNQQ0LN&+&W1tJa)gPiC{{-q&{%Tq$#0h zO0_JcNO^^kma9CCJFG}}>-B@79pnKR+K>wjjr>Ao(kKg%)3a0{27jXp$WQ}WES{V( zvA#G{Znz695V}wY48hh>STrus^>Q5@Kw{lN?{HWibSR!YE)o@7K&V{1SLT@fS)&4| z6hNggR1o8WN?23Z$j0N;MN>dTtaCnupi&qrDRLdCw17O+o1n5d+$pGF05YJ1j(R6c z7cD}*Xq03kGf}T8nWs}o`F5B$l`IMJO1hNQ_x(yp7fBk0EFMACP*eWmc8==%F%ATf zU8&}^)k z4k*y?T9TAVdUH^?7PK>bvqcE!rSm)*D_&hRuHjHCzfYWQ$iu^Z(5)ZGI9~2g{3% znCKGc&^e_U?1}uR)WI}rdWNY@p{FQlGxWq`bX=7ZvDghYtA!1HP`Y3z>w@1ABV`8< zw{KPnAJe`fZ0%GLN+J7qQ=3!z?GgKe3Pq?R%F+=+AHp*wd`Gz%FQ)T@czI{B7XRW! zD6#fEt5cFzXpl~Q&?=n*U=ErnZ~?j_>ct}ZX*cOxC!|&(T_2YM6B^fPedN|De&W*! zc`hG~&ln0EnZZFPjBF{XTpyYw6!DPqL(rTUN`1%ydAGoWvsmj?U!EgplgwWAuIbYR zj&Sv>IL@LvT^#3ADhsZ>n(Ps$YpZ^evkG1ONJAdhJ6{xal=G9=FwuK0;zv*NPx;!31&nLS%*g_|>rMCEgpl``0}Y@ZwU-OuYd6*B#% zrUHsH6-0riVzj6yVFf24kJtk8P0q-{lcq_?!m5H1Ft#t5?iA7_A=v6}odQ4ZK0Y{U{88gkENh?Wb^aKpzaa~z+X-llRw53_p>O^IuK_|2&`Ml>Y z(UvY)XeM=u6~@6s=;t8>nMCf}@(4P%+z%!{mITcnHjTLu>T7BJco+7~_tV`F+m9*O zhwlXcEUc5Y=)6LNq|+kW%C-my%+f3$*;qNm8Iw{BJIYZK>* zc!$)Y0T(fZoI z?)OJ_O>Znd$UW3MaW3YaB)$%M4W)x&@w%#nxL0d<$&2DaL30gB2VK>J3cHyAX!Mkg zCI(;I*^uwGy^GmtrR_vw1YGmG!&W7x6lR-${oXrr=02AhhFZ> z3&WY`=Fp;yF{kwqwU8YvIw4|wfLol%R(R{zeyQ=BxW%Du`IgM7z1-qlw|tA#;qmwYVNJSpoqV{{z5L*4fPi|>uUO9Z6Dte zUFi?zWOh~%uLJ=LYh*rTe1NZ5?&V4q7P1hGT!MJgjkJ&H8XlmG$APqXw=>cje}%MQ z?>ekyb3LK0meOeZFrgKqmL}dxx@(6IP{OpR>QUkYE93~$1tI{5=WEeD0C9N8>4~D0 z!T%D7-KWUJi!D4t5UgIxuMFe`yBh?H8WdWQV1qkggS-JY@e_WN0Y__4?xgiTl&gWg zKjM82fY#I??~k|+CqLBCu8|$aQ|+YUIfXnW)k?4tk7j z4m`E}63iK7XJG5FJ&oJ=Miwtf$#nb4h4e?tt0JF#+J_`m%kHs0fC=33=`%b1eD;qm z2!|Gwyv({2N0j|zFoUc*?~(g%d2k+Y*)_Kf`*wa&>t&+p$9_rH^!v4As-MJhk&ab>%+fLi?R(B6-FAOIYJ5O-aOVzErCBCP$ zE#wQ@mbI?$NLtrhv$BJ-Kr6lBTPEDKGklA=>%D4dkK8@01t|p9;z%v9&P8g$44n%P zWHv1A->_nIcW@UpFQFDE+=5fm-6skd$g)lWtE4v3H1Y z6ZlD0GWbs`6^QSTl_*@S=%Zd)Y%9WYCqmHfCRAWCb%wg;1rW%yOR`=io4D4BMs1aHmfiLlsHf zgC&wO4_46>M=MZkT%TT(yQ~x9*8VmiFu;=P*fw)Z@ zwfPm|QEx1sWQ_bSC$FS&gTwWBsd`#Qje}XjmC++!N&7A6^^&-B$3z8d9UL~jp}h5Z z;tzvD^rurzR?yZ^UPFA&c?tEz`X$_YOhG%v6tIGw?<8*EP%I<@Pv?VJad*7Ka4dZs z9axeq9dT3(vexj>EyEwUrTq{jBn!ep0sO7cEb?hZ+=xSsN^r$GS3dPfH-tV19U$gN zcQ2=oj!h;T03Bw?9uUvy!83ZZO~%YKlI>SxC1cObNT?)?HR0x)^o3sOP=(-7+7t7V zdMnFonghj>CAwh=5Y?K^+dfgH!zlQFDeT8m>8z6~{{Det@5g%|!)82JdxpvD19P*@ z_~nvKWJEdHdmto1aOG$h3S9c9JLkRUP>2k$@@k7ub`Ok;;Jl*x^wYwT3-VV;H@ZMP z={fGZwQjT(E#&~acZ0*6tyn1PNnZ95MyR4+rPfmC6kD`s)-OHXD{8xM?TbRk}G>uv@>jh)?_%0~q?>jUanqsx^ zPq4+s)7jZCPu||)K5Q*}au`s4N|F0x7)RYM*1>sM1?PxFSvDL5=_L%i*5E(Y^v|^+ zSzK=rbM*`lb=*_^ei&1zgo?mU{W$^~!~nX|oap>4k^s=l!LcUK_Tba%Gh9BoL=Vc4 z=g5M1{c5NahfUXjgdmQ(UmC?PQ^I}f=qYsG3+3oK{4UsWh_D3~wqQ>?J7T<(oO@&G z7?vStB)OTR&lr+eI-b45mgmYXroM{H4VgQ)w>Q5n?VO@E%NR^IOon^VkP^0 z1Z0hbhQt}2d+NxE&(%q2~y)O0VSaKTN2pdrBR!|XLFG`S~%y3I6gezj_qtdKG)t1oT@Vy;LMxK z{Q#$ff3!f_p3tVFrpj^Z)Y#MYWrrd4@>%D=1G|DvR5ts?cNeRFo+{4j2g%p3@w#5T zQ247_GXS_H_^bjlTrLDD^D*%__byjzvv(%Gu6L80qCH_V8bUvc-u9~#Plyi+8L|2{ z7{Wz6-8m;O6QDR4UBbUiw7f0EMyXD|86ma^6y{>lI}%m8({^$a}JJin2#`rV}J|mBeT-BG~28s14@PAnWY>hm7e62I5yJ=$m}l4|7l@t_qG-3h*IT!r%r z&9g-hd(4r?U3tal=omd3ofFnbm9GcJU0L*ab6~~UqQ^)TW2E^@G=qeR{4}i{1ocfM z6#k=`e9=VS${M4KDFD1f;BAhW`7QQ5%(;ngLR|_YA%tHDBp_fakzC2cfrPrvSU1%~t>gP~Zh>1)!jOfFL>7 zB1NI&gZ6+SWtMm{lNhi?cs*ziRa}m(1%hQH9B`saI1m@pd=-CAv8Hj&$05RIJB~^w zy55H~7@eRe&`DYZ83Bfq5>p`GGBl`HxPp%roXL8aG%9Ica3O14H^GCJ`I_wGS~pis-`%^ck-cH=y?zDOmP+U<*ovc25b&f8)#p8KL0 zlG{vPec9NV`SgZw)?)Rfx4%im=cKFy@rfe1`{NV5>-zX~m;k%@1PcRYMI0$q9yaDJ z7Oxc?P$DAMN-K!rb;&B-Zj+232hx&dn08Paq|1)l9o^MlyLNZQ6$8dtY(O>g!uGR zOb0MS#rEJ!=N?M8HzCBlq;rq2L-}n78HV|(HEhxuP@N1$mWy<*Y^iO1ENzcvX}E(X z2D4TXKm2{;9bR<~X>IdRD5WVBZC7LY)`z0y<%3mdzBU5U*R&(N^p&buh!liZXuo@~ zRjh6P&;9}Mgsk*_tLy*TMVGQnN^5YOGl7=XLlG0B4OS(_oNEtmoXF)tgj&HyltGKR zFNUKBL7B9`+zECjI@x?cSMqDMpi$k;B*x-}MkI={#dyBkzafAAYN!A9{P}0P{kNshfC<;nm(Vv9 zsqYKN?g>dot+D~Sd){6zd5`U0i(b;Wc+YuT z9u?7Au@*nl>5nF(La+K#5olq!;@~UZP2z=LmO!+bN6(~gB)GV;diXd~O59K-h&%8L zIU%w)CGswK^Pr)+opH0oQhx%RvRZ{i<1%3f%0q%*RwCBJLGa6P2>7Wzt?+<#_d*M^ zTFIfUQL|GepLC59da7?nR_-LG?MHJQYnuLy$$R{2W8c+H{w;a(t%N*`>57qu61jtW zL?d;K24^0CF3c&pO65;^AM3atdETsHz_7r9VJ6a>Lk04_D_Zd2iwX{qT4M+wHSJ~y zlVoxUgiQgwaQGVlI)=&(|!g? zV)0Fhzn;aF>_>&?R=|&*wV*oq5PvR3rVa0v%?E>VGL=bqe)ub6K5mTaRX0z22~yC@KwI zgHo#rpRt;gx^edv&LLFF%$cs1M@4Ith?2_z#2p6zI5^=Suq3>e94xy|xz*FCObx}h zM)MbH#dae!$C;Tq1)F1Rd^S+(A11Pva2 z*VPdkCpd-%4C7kKpMR~Z^Qhwf>29B3?fCqqt`3E&Ka+M4pCMAh>*F(44ZB+Yj6}lM z6q>X|_iE*!Pd?-J@a&xS~4cnjK=GwNHzC zq&-%_1nlUCDO<&ly}>_HT?;ug@GeQ4UC7Rlla%Pn&yI8MLrTKa8~3Mb2?TQJ{}S@r==Xje=ZV>W zxmw(1?Qq)kFbl|Zy&i8SbX^-D?`PTy!aF|rx7un}_?eJ#I~;M!B2oDco3$Vk_GElU zi?dlTa~BgAWjOAGNOW31!+v&r{#|Es`ZHSfH%Y_USOokv)Knro1K`U2vfTH7^WFa9 z0z{5$8k2T#W79*kxa9v>x`lbuK2ElF_+7_KI_4{4YqhI_4l2Kw!)x1Vi@*;Y(<`+T zH>&D|UvJEzi+TeWsg8k>@214!|MVAH?`XBIXJZzB9gf_6a<&{E;o_}x?6e=nrowRP z2~|(P7ho39W4{cKXa{=i^8-?$qqxu(2MfcVm5#ZFxyA$9MVQiw2h|?v42w@|-hmo> z)ltR9;8nGijElZivH6+n2k(K;1FZq9h)W-zvZ04B6F-4YR8xVy4}VxzMy69c+QOTk z9Bj5qT69)hCG-~*sy&9ZO7jc;uUjlE_RMDOB=btupmGrsyb_Dy5+iaAkc3MN5*J*# zfq5iQ@rztzjUMKr7-XkC-(!{YM4@P&83xnl(<(B5V{&57EF+V-*06P;n^~5 zsXy;(lLSH(&cpjH7t*;%!4V)?#jm!$s|A(;5bZTzwBM`b#W-WzEpO*_O+-t; z81QVv_6Pr@SY8ln=+qYBXRC*9+~@f~GP3PrqDji!i&m z5?ftLaJIcyarX2VT2*)OyGRoSCVVb`UG{FJpZQy@R`vB)I6@q^jXwYBE3Mm?b>w$y z;urKz=_Uk+XQsdY^Xac&oc{W&(_epm`s@FmzY^|FnNW{rRipW%=RaTSNb^G9{&ecw zAN}EHzuHsvyK*FrD8_#N-6 zc}J$`blS3bM>=ge9km?1gNDUB)Ie)VkuDxJ>%fQuLB`q|fj<7bdiccbMpTUYB=RiW z;5@e8|4nmx1pl{*-5a;mbes^of_UIIKp0V5R4)j2J!3$7N$}LPTH&tJgRK!v5l$oy zLE4hoM`M40QL+z`*_LWewP0IlKS^T&FRc=T!bgK)@Ja52tuu_d#4vQYr4+pee=0lv zuhs1oZAQs2oozKe*(BZetMGLuCJ>sD{a{zYceKLUS=*Q!YO658O$Z&P3BUQRQrL6a zRoKCf20QmTl{U_$*^Y`qiZ`xMC}V z6i^0|c~7;3Dk`0E;tB5~tfmC2@FfY<8J=*&wef{Ea8F6^40(4YO{9M9?>V8g>q_8i|)q9m+yRyN-}tyuZ0!C~ppDg)_(rZb*vgNm8H1BohrJ z{Ltf$j-7)D!T49EYyQ6eTA@!dc}a6ThSkp4lpjc-?;NZw_m>tI=I46d7V)a1 zg64i?x$ z^gCKU`m*I0(f54{Ls@a&4*6g@7E`H53|Og#7<)=J#FQgA+ieg2H(BOH_n<2eep!4# z;fleocWwwB%u(?;P2&>ipnS?atbW6}xIh8#cm*;KzGC~UWy`PnZ2py5#E&xV9wU$k zzzu$1`tW8jRM*iGXs$&vG=G!0axAS3O_I5)bgK!?vI$Kf9MGgz#(7?^p{W0{v7wuK%WpJ;2^S33Ljxi5W9+9TU#K(vsT`kt&V_y;fs>r1-c?!05 z2N!PLD$ks9VNgY*UMu)RK)IWOZDEAL^*&$!Dh-U9<31{i&+v2Iq91#* zT0 zD_0Tmsda7|?BbSBux2BvXc2d!b4!R0nfy5yy$lX9p2TT!@Eb_2_3?p zVK5!2u7xxc8PW>CyT=%SY(!7b@y)b*NS<=)BjZ-Dgd$+ezbJuh=N+x1Rp<5~Y_MAx zL)~FrR^xI|s$6SXWp{iayz&~sNe#1ua?hU#?l1YC(i)oxza-|MVMbL3pcBlYBhfm| z9AdqDZwL%!rOD@OBQLZ8kaW0@&suX5OyGX8=IzFsx7V$?z*uU?K=pAJzqen@J%{@hONBIGZh%4Iz+6U$kuFp%$ucjQZ|CFHYizG@Pht|p z;FI?@TnZLqpm4WW$44;6*uo1FNpC-ZUOV2dBs!oyvl)Q!ykBPBtCukxX_yn zMigP)9Z3rZsRGH__giJ-4Xjhc{PD8A776*R*OF43(z=mb=?4a{bribFGJ(6Q)WJyZ zP6Bh>+7Ii6DcRP&6ib<&u#^ip$EU#3)d`j|J6RG?kFZo9EM~|GY9&JoPR?9qNYOKj zR2Wi4Nv||0#-B_DCF!WOu5pgvrc4DJJn^HzBppqrzDxyrXmd+CT6A$AJX|_j6$ceT zzF1M1A0DIgP=xUtQ&O6gDG8WCOUG(j0`IltnTX=ss@4o3Nc=q4GR)hu7?I779(4?`dN~X2cHj>Fs$Dvy8QkISoLD24h1>m;Q0oTGg|K8CIMy7 z<>^xdJd-|?@idb@rLJFrDy+AVFX1G7>hBhBiY%x{=I$FWCk0bNc1>Pe)I4Ea*hd_q zAaS>BbAd~i^*YCfQ$*h)Cbz6ScvfC-4E~D3ovW1f8Vz+l+a@Jk?>s2Yab_!|rIKU0 z%$AnU8;w?rwbDb$N2HC^38?oGEw3c-k8m#A*)9Da9Jc~fV(I>~sJmF1R{zUATa zA;v<{lQvoZ%Tm<{eCYA%grEFcFCF_vD<_=C&j-To2-jeu-p8SMzJ0O-rMprYot+5I z`BX)?p=xjqsup>jxdzt)XYmke$JTAzQH*$u#H(TKqQq$R3j6CXq;2Pth)z=7UH^iHlItTnu{EFZu&fH4 zuCGy})DEDx4y8y)G&%*4V@u`@gG@4yjPsjgkSZ}wh>%HMLWGjNEX+KuK}db@uFq<@ zs0$Cz(>xa+q_OO}iG1r&ry|u&^bqp%17*eD4M`D814Yf#Qc#JChwujI$xl$p4t6f6 zRp1@&9qe52q;`ueHq_lSwnZtj7}?z{7AlGhUTZT78ce7Y_xK6C5tT4doB?t_EPp4B zj8=KJ@iO0rPYqXPDyU$R9uuz`g9(FIVN|X)C+0(aw`fZ2;SlWWrt)6#L-Rz&2Ory& z0(iv7l;a6cT7-NCzk|)Ebl@Qu?9n4!8120}J82Qyq&{J3S?6QJbF`7LT)}Y|!&B5} z5#t-bX~a!+W1_yOA0e_lBo$ZW!RM#>*}3+3HE}eqFvLh0E-$DL^Eft% zc`oy#-2pWR`I(irLv~Dj5?~ya94RXk9*89sbOghqqV`ht47F_9B=3F-mS|=MidN6n zbvl-YONWYQsnc;sbTs{UxI-S!%l}j9`e!WKmZU}Z6R6dAd564J8UZ+~r^frE&MaTf zm7{(B=?56_D#I8>K1V#4YYG5EL#VwDLU2Ms=sLq@<+kPVa3x@~Qrpdd;W{0-KoLH9 z!JtiHmLYW@zOBW#o4N4htr)PBA3w?k_s(G;b()Qi8;g^w+Jmj}u&yT;z^CABOR(_K zbp?$e;1+_#Emg08a7)!A3t1Q##wQnUDlhivh6d)L?x*=&2{o6hr?b4Im5bi6=ff+# zsJ+0)uk|?4AUMGu$;)dkFZYNO?AbqTBQN(LFRum3BV^)jQL|F!Aa5UDek*+(Q8xdQ z>d!DMohA$#u>T@GqV3W*d^-xmDG8&cGojE*_2)mX$-{K`K^*CrhEI$BBIux2w+8o{SG~H&Koj2bYROoci>qas==zNL7)6e z9#|WBkT;{yus4~Y|9}5{y&zhMm8`L(K1FfgxD~L*Ld&cGWmxV5tpPqOu-7YatybXL z&{(cz1@;1_Sb?`v-UE%LUV#x~+9K#(&wi!)txZ867zfee9Z>xz{%hB6)eXShb0MDVy2o(=>S{a|#ZesdS7WM0DhTA6bxUORDa!1!B zWlmA~!|UrWR2F%2{RO|}Tk9{c0{*wv->`Cq2lKGo!y72DiGe?SJI6gHS2+RC6JPnu zd{GhpJGiXggf_(4QKD|j-3Z;N4U+T==5({chcb;#}R z+=WB5fQopSUf(xv3lM{UBk%?r)F`W)t8*xb@&28BxL}Qxwor@$0{PG@7mA@CPIZtL z=ubtFu+Mnsxt4M*3ZHZZduT2@>%4y1DOD89E?}Ne6%w@GmZilrrDe+$YkaoE;xuO* zZ=C}#250=`AKP5`5#${F_vf_XvfWM+`~8be*}Pg!o&3U;bdqGriPKx0$v?e{PJVZ* zGx^o+cLLG{`}mPfXVRyHfYmcAyg!ZdQEO#v)FI!JF7l$yGwC7Lg!%jELbeXLcL+&E z-So2RflzF$g~lgkXYlJ?wfXP@Qpasi>RxgDoNhfriFL~22iKd{X~+}5e0P{<*2fWV zZtuCIBf(5-<%r@4{3gY^zK7m~376DvRZrj_(H>M+w8p8RTQuJ%)0YEdwBa*+k*<4M zSLF98uGM2bq_U*0^{Pxgr+SEgD=>P9a@D=i9v|yXsgJaj^~ViJ=y6_G1E&b3MxBh- zG!R0sdz{-AbhQ2M0Frc>v+F4KlJ0^x)E)jr!bCcJ%l77%2w_)7M>tQSb?RFAV3qDncmRIE8R^mX3T<=tAdNq|fU3&%k%h2sU?#hwQ~aQqOpB1-V1NZGGje?G%#LhG zYMdA%yrK!bY)kT)2_LJz>^o<}3Y8I8z34k<8h2js9RMmN)X$vb&b1Bmy*LFge9m-x zh;DBxp3!HHeZ_v&Kz}-OL`LcnU6XwyXyQqa7Z4s{qgZC#rBEwnT&Gt#14G`gS3N9N zb$mT8Wvk3f)n9TGg(?}OoJ?^sjp`&iF`gg*O&`}VrXOWYF!6bqs2ZNfptaNd_T`o8 zJ1{0!Z}|`Wx8v`R58cxKJ191K=l{b4QJruD46=3>8FwBgz~NO6r%r8AX<5trn33)j zF?Xq^^7X@O>fynjU!A)tOduR)C*Q?l(U#m0GJ`zS>**G^8Qn5b!)8Xe0h@VFP5OlW z{xYdypz{*ZeCElbjg0R6X3)3y?0`y@4cx@1vUXwV0o}VtqW!wUQ5q z>%>W?AF)ZEqiNY4=XAw3eOBB+#_BWDV1L!p|12J~-KZ2Z-DYP{w5y(KZ!c;0fWOak zeCPQn<`3E@GgtBPI5T9L+MB@veIk3A9mCxjlIr&kx(9jAP-pV4;eo3Cz->e9?{_~y zc4uQT_-rd@ztsO7QvWIO7wZ2$G=cFB82~#5pYQ5ahkaue2HY|DV;#tI%m)E;{Iahs z33d;fkz!|6B@mUI=I*OHckW;5sHh#h%*uukNE!%gMj}GhjNrYy686vq-`<}rh0nn# zcMg81%b#B+W&=fvx+&p*Y!Ch&uv8LO-x`ZdE>@tWr-uFI-N60p9pf5!UV7|2{is7b z1|_~g%2N&;Y=OUAFGpd+Hq}@|zTcs3CU;6^E{QqS?OG{<{tC*j@o962m3=E#|%o}*k7c?QoGY4}*Z16#dQ zP{c9A#6M>i@tjgOKzeRGpdcWl$zyFDRAl}q!1amBW)6?FbNi>{Y2OS&{eaLP8bZWz zXCDt_Wb{J_8vXbN2DaM!pvaYx!-M)68H$RRxy_J|)@J*P zdfX-3Ih*Y(>TpFJuF#==${mK;ZvEr`=>$ov2Aa$;r?10>!V=2trbByMa3rrcyRTLC zCG!C>rfi7>I}nKE)gdW$hgho2ALv;wT^MTpthlL4$hZ|L67?@;DoN*1F&Uni7*a5D zwS>6O&nrF5jY#h2o70@h9_Cd!m3G7-fyu4Ro}b^8Xr6vENp5YAMfa%Onh5elja*On zOI42zDIFQo{<~r@)x!(02w*2K{@}g(fHVurL(_utV1c*k%qe+gcHvDC3$jqD@V1(6 zSZT$MUExx9?V%A#z^|;0;0w&cBq_x=PwT`>g#1bbmrOw7_3#X>nAQ+^nvQpg!sF(r zpDndVb_UTRIbcuR4*B^qEHx0c-mPNYPUgOZc$;!z0a}SL2{2?A2nq1`F!5m3q)>aX z5-H%ps!3tWgJl^Q9xP^u)FO|Z#b))RZ?E)Z&T+N9r0y`}Qp7fbNBB|+8%&lV)kGd3WJS{yG8-vm=in6u2D zzcA!<+CxPzK)>nm=p!hDzz={ApDea^guhgJoM4c#ToUZ{wm$;9 zBwCsh_=Bfzxlnv;ET#AfCXM%V=cERHd$@}l`22+%-mfC~?6bjmr;6YUptQdec#-4$ z&yc0a0JI-)NgN!UL9?o(B+P=^IQS3pBV&C?-d7q&4o3}YW_gIY3W-&RMhj;XLrJ$W z=X%DxDYwPR<_52Q#YBBtuYGVxDJOp#vZ=0M7)kWhpu%j~!;WAN_(+Sr3BFIt7Ax6f z5xL+7^!wUj0G|{S)5$TvyZZsf5!Vx!WQR(e+p*josQ3bIRVLc=~ z%o_tAzXt0g}QFN1Vie|=O8gJNhkfH(NXeHeSS10Y% zaTI|$EeBUb<0h#Dogk7HEX=4kYL{zJ>}~XS0RuqrM1O4whwO9k?x&TuX)67XY2oOxFo2Th0bN+tKk&TEn9Wo$iXH%=rU4Hnn3^ae{QO;5F{%Cy0vlDiow89n0Mi0YCJ z77p)B8!VAeP3(QF8y^5VNa&^eURDlCFuig-;#3hw>`x$BA0c)I?KhUrbvFtrqXkO` zXlhJMOIJNI2M68(hyLU>?e1k`N-9t|!=91V)lgQtE0by{JkgmLpI(Fz@-ja8+K=3G zNe5ypnI}ksj6MF27FoLQk-*jboWEEO^o|4y5GX{HMKE?zAS&95+5>KBjS~cTK9k~l z0Ax~J#=-#__?2w-Mk_HlQNH;KE-#zB`0@B1{eJMbHO~7qI#)K?q$sr%N^;g2*zv)l zj43sN5uT0CmcHMc0r5R)wLgpAz^Q;!ll62RW13^L-Y(i`eRO6Y)+a7?Qu18SweNkJCU_GPEBS_E(31|Wlf^T@( zo)m?)H-ujpvP}^mBJ{VJMJ%&82+?!I`7$Lqj>;oY70C6^RUU!t8qF_IEERlVuE#QR z9i7EZ8WZH%Fl_m7w4Pp#T$AZ-1mFg89cWID_6`O@@oAVQ$H#}-5(6wT^pq*rlMH%l zOfpK>X_AXFV|f?3yN$P~py;Kb5p|5u&6t;_GJ=Oo=tzkq#@d>ZaHbg})gHkK-4On@~ z4d$hx*b`?K250cnGdLedoHOG?^VtTQR%Cl?NwlX%zW-3MG%4;=gySNRRI1|ae-%B7pmABLSPhD){M4@0 z*A2~-<9{fQF*7#`RdW|Fq4iM(r{0P}qo@NXgDhmT6}Mm{tD*qUFR22iYdR_`&^jY} zBA|F@^;JzU4YLe@OCP%mD|00p|i*i{5&<^j{E%QWbZ7>XLGg4?S?kW>v@ z)nd)JngcDGkOTsPqx^( z4#6biKt6b#$N<(l8J+GLTbaMxRUN7P03hxe&)0eH9FDB0(9TnINAgM}zAy8I#1Ro* zBlDfy4l+0wM1CZCfXKoJ)_<%NZrWhRgMU}2zH^hrQf`s`N;|?e|L)v(jRKunJBkLN7ada)pHR$)6-r=XCW zSgDRjMGFusE!qW&06#^E=IVIw>4T2uUri`CjNDh~-YX{Tba30taYW}J-Y#F2qQz?;DO#Ty&xS%1`;ZKh(O4h#&9wXux&Dt_GS~ImR4gT z>|tHyL{w;_dPg6yaY;ackV*rgoB*K|5XuP<+)t9QNid1gVE9TD{mUSo zmhyL@9cRBw7k{T(p3Fk!%r;V2&{Mua>Wb{YcWQ9*t6oMUQ382JnkkJ$M}=;rk)YOH zkw&tdq#}h1EWSI{6OxJ@NkwJaTLnwEEESoF^ox$9A|BFIOpH%!ob~*tzyJBK_FMvy zfGO1yD?%n(eOqJrs1Z6nnpMwg(YUK>9fAxhB^Tu)z}Mk#s@sBZS|&iNRLvH!MG~ZZ zDi$!yu2OLv;=HKucq(1BMY5|k?5IixIg3)lmY?8N4ILEt8M5Akyq8nK7GVda_Whe` zO-qMW*Bo;QSY}jLEAvgNs~I4!u9g9^EYPft8`aeWwwVxNLDxYfx3J6D{{d` z7DlwF(Gn`KA>InZtxH_Bn!O#o6=KiCTTpXDyro3Q72&Ol0iziVkIO=az6YPuK?~Kt zie+uoVMB}vtF&{$D0o(C2kIJX1{=2M;31M3#W68kpXbcO*3($}Trw&&03NU+U;&A` zsBF9_AZl9aPHvf2q!X?$APUoxbqjV+6%dWeqpM9_yiq_DdQkyUsAmA8OEL;IyNqu# z0{IOtDPcNm1hxh!o4jrWF`JD>K-U@p10m+a+NQFXG(C}T$wDNlpz)=`gd&|^5jSyB z&`u?>k#A(OacPlEHaPY~HYi0?rA0c^rA5lhrA0QNCq`JGPhT5e@}un0@{VK#PwJu| zor0Qz^GHEerLf7eW3ytQYT3j4bU+NH>IG{f1zSi(_&q&VH%xe%IhxcU75WS(h(&6y zxw37*xO~;?1(;z1jA~SEBneeX>zmI}Hnh!gzHP`+@H$-)N10kEGYupXs31%6hbCAo z94<#?zLhLRi-0Ly?ly4whk2cCHwtZ{E32(Az%|gBGGQYemQ8CRxhD%r_nYP9zOBni zY{YMvoSaqG3c8VA_>DoCS~I{yCe6SqfhtJCk7VdTu!wH?gJiJcGg4Bd9%6UXgbhbg zAwiGmc1Zqq$D|e0MFAPIk48Dc zfD?ACCVN-fc=X*yP>^EkEVjD`Z`N<-D2GuO27$fxxikKAIfJ8wNox0-A{^4mVsHXn%J zMYgsFGxo650UL5Kb40El^)}c25l4(+aJATk(s+ahKV^qe1Cch~D@CEtyJ&wsH`TXJ9J4pow=Qp9 z_f2*7D*xPO`-DSmys*tp@U6q(3O2#F-gt8peCuz0D>uQt1&%{^5IhUliK!GFWqxD6 z5H_xfR1ekyvJP*$vc2uCLu`6)`?GtC-LbcQfx0^EZNuwGeN!BZ3V{_Wi!(Py1t)V- zdcL=BwJm)AP4E~Ps{c)eY08@WAbug5J{f?Vzf8M)k%25^0> z5rz7_MvPkx*N)*rr7DgL3vDe5{5(ZI0ZWDG8`&SoY23fw8}BrRB3XTU1EsKdSkYXb z*DVHCT<)jvKhjA9b}pgfPGT4tK^7upd8=>`TLWm(uX{EBA~ zM4>LhbXECEU4oV@eWObe9ouFtB)IzJNMrTeseV3{tzcHO`;A1BHA#S22^BDuEt&CB zII817C*d8C~#ST!vaLC#6Obs#BL&Y7Fqy{!jv2E=d(AKuJ7Y-&L{HlQ$ zQG!gVuQ<;Z3Q~(e)?D?Rk(2!6nCXJw$?;Tra4;R#bnq#bUg;fUas>pJ#7UkvmJz#B zPmO&kz))`|vI2*SkKR^`;_rcELDeZDWSx6X!!LEl z3~jYIZ>Nko#NbEdjax0?HVf2|aM}?$lHdRnE8j2JJL@RtfII8RE!XYxqOei3sV7ip z9jPAJ%|k6@xlaT_K@G9TmU4eoy^~|B4{}*l*~6BIXCL3}%0^fAc>~&&?{gD!QnC;U zkNB4&HL6AKfH20cAPu@DpGE-(&w#0(^#Z~y>N{sSz>LXNEN#B0H9QafKFt&~(sP{a zeMY?uZY=JlQRU5ZFmdO2Dm$k52e2T2(<^6qoyGGa{ezxEJ`0j#1%~!cfgLK8Utfv9`MOn9;T?7n%TxM3I=bX4lm@8 zuXs&Di|=e0>JmpowvyU{=NjX(Yj9T28P}hrfP$RXmCQB5Je4V0JS;i5U61tPTXP*g*4OH&6Nq2G-wt5%!rBpr0wMJwE z0dmyOsgN%;TK^1RF@Ag~o`95uACPwag#C=-YX3l$t{BpAr{ZDEhrSP;Zh`k@89OQydejs0F2d@jAh&#yK*0o9G%f=!~U0hQ1B=ejkXc*l`|=ms7Vo z|B*2atAn(F^3~$`7SF1LqH547#zmb$bXym8QugsYn0OUK95d{xD;&uR(MnV7smq=S zsi*PrTWEXqU(*q?MJ$EM)-8a&og68me+xL*8!t!dAJ!qIX2?cC zTL9nAk&>_~EUd6iA8%Wn@afDq%?>kPc{ilLygKhl{&V1TB>dbc1Ze0Mp?oQeeDPDSe z|D0*bCyYBSeF1J1YlL8OYqQL!pH~DEWJu=Izd?DMqQ|W{eYXzND{%U5z44~gck6Gx zA)LPE5Yk#x_SHAv=eu=)P5XR*;oC~%WtGNvO>^HZ1`@bR*&9)5{Go3vji`b0DzrG;HD0_jt#Ruxy#lRq>y0N z;YNItMLQi4N#ra3O3yP{u@M1iCvGZB;~nh|K29ZKhmR8nvpuW4>3kv^%H!!E!mT!u z`jrp4Qgxp)yC_NyBa!P@)ga)P>M$mCFipx~SUCO_ca`G`UCAjnWtIEr+$8jR-sF(@iFH3s!*_4M5OP%`oYr}PreOYZR0{V6D6dbdZvc zscf9KxU3mt~WNPdXO>dv*x4=w-j0BMC zD4=ElDq&QS}e+K}s`ML5RG^xv+oOJAUVK*DWpF#`ai` zF5U|-Q5hE+36}sLvP)pY8O4sLo~(P@#*Ekw&PzNP7lQ*#X0oY7ycVk&(3snQ=Q4Te zOuUD$_D+anPN$m2+dxB`-Bbv=2UtY|=9!_RH@N1+u^Y(27H^wCmEnA3QnTU-XHJrkcx^2}4;J8BP zw=gTBUY%s`kN<@Hr7dIFHUihvdRz{};D56)tg(yU+du4pVI8*wLXuk_40hQX+!Ttv ze!!T4oZA3KgBwmGr`kx!Y2MWZIVms)a&{7Oc9qw^F>KIz7Gn+u20` zanqe-wA=*P^*AWN5}4#=5n#o9z(LmG_+WX1?4tiOtDV!?MM;xZaGD%e-!69ft=Pz& z)_wn)7Q0;AkWWNK&p_w(#V)u0)*Hen_o;8WPws3v%{Kl9@8oVBcV_$Kw$6b6WAVxT z+{7pMCs*c^+d53Iz$dr$#+yF5t-tk#@W};>$aWh_K(^a%g>b()r75=#v1y;&Pu@`M z{dn;)DzscE>k=(ChxDgY{i2J!41T&)7;cGvO%O7w^}m;T%pujfJYL7tyGYbyKBO8G zL(U3}W9f)0Qgwz?0ag(hZf!@^llKJH?Jg7MH1H4k`P$aB;?kjQ>9ys{d zWPY5YlZw#LCsBJnI?fl>M{b>FG<-T$62tyjd_Gg~ndl-_%wpi4z~Gl{J*gmE9skVu z`lIWkJH@SE?^Fe6nz(ajQ;x2Q_c2%r+9oMOo#BhaXq*XzGetHq3%s7mebbARqEi_! zoD@|$bxb}wt{DQrts<3ECy*#0@O%_W?u5y^v{&4q{vsG^ei=N(lFX$K7^YdvA+2LsLbPm^JFCHGoZeyIIGVL;Y^{rItzROqlL){xxEBn zGHY2@PeXb>9k7Yqtc;SR5_+?4V=%=C&dQB(R`DV*8g~+wbF5uTX_Gy`49@GQ_~>s; zkoSw~oU3~dEGk_>F!jtWlU43BdQ(4*9&$#2deBtQ7vt-1Dxarm<$=7Ut0?UpU+4#K zF&yN-W}uJZGoEXZMtExMx^u~q>LRn9$4gWv>6Fzg+*;&T9NnS{c-5=iQZ2+d&&Ib- z0E|Aj;z%3c;(WyMGI&|%+CVSPW4a&^%=zO0GSD$6 zs|tF-8=js#CB%J_22F2I0yPe`(u2=)ii7IuuEF*Xw#3`G`8dBrvv@4!u%>(E2q?7( zTr4K*)&?TVSeh&w(eYYa)pRlFb~1Hx-bS?-=fF8KYez*!(fDq_GU$<^lZKEY)r%_p z8!n`!6Mlj~X;JA$NmQCzI5Cxp8My;a#O&d&!mWB6{a$F@i3$%#VOUhzT*F(PD@n-6LrS?1A~JjIo!8-upEOHM1`ACxcYe z?sB|Z{T-z3QeLwD4#2vT+K^flzSjjb@irbRNW2o|1_%~v5Rd}-z<3D|@Q?;MN6uN~ zQ7rA(J$teWWs$9sECQ7&FO!Q(-?;296yoK>J?K)TEa{EKtpMBUQE-J=hC9o|RA@3>L{~L2Hr`GD9Gq zS$+nRq0Y^OWJCc$GNzTeS+p`|TIsQp(#OEppp~9zg>$aVzj~sT%)fd7wO7<06|hIu?k(7I;6|Zhy6t$hH6BzSdqA?irB^zfLFzRT zLu#x5YohLJrsXveLu#x5Yoh#Ia4W9>YeJfNa|K{pr0LBI01uEV#n)q*cWtsBh0g62 z=97cPFw^S5YGQRX(wbknT2@{VjjvuR4Xs{8jcT}(ma1Nma!rsLwukf5b)@Cc3u zo0K?~O?o`A5~(m<=Dd36S}c1U^Dn+Z{RC>7<24pqEo;xq8Rtbkv4aTk!WMSI3~d-&$NfTEtk3$&=vxSU1?(bG$IyHYH#s) zDJ^WcmjZYyoyVQW%F*?}&b97Nl}qrS8fet)IilSfcs^}$&g3JJ+-=))V*l!R@jXM< zBQmHtoVL%mlp2|g8SA1g?6OA9Ut6@l^ zV@&J}4;eLNVq-KdubB44@@m@B?8{lf4vm@tzEqAVOd-=0$;J-3msr%mmzpEk%7X89 zCL9B;hgbUCsyPaJ6Sq`fzveh7t=wAS){)#WS~4(@%HQ$Y$#x<|yFk?1I%2H&6Gpg1NVdgg7|YUZ zky&d+UmIKApX39D>C*7(-Q0S6enx0ZqM+E0^?`<8)J}S9Ne5dd8o2~nFgL^NvjH+; zv8uu?qt=>$KH(OKhU3A3Kh6yp|LfKSgBbrx*|XYq2KC%ishiX>Xk z1g>IU!28e9l3H&K{L8E&jdPp+&gZk4Mob+Oa+TZ*uRr^7Bob2lYlSqT+)(ISR>ElPo zdAHkZ8o?@QF^Bm8JXv%R3bUBDoauFbBoUa$K_;?Bg8Shl<~6+v5mDBtvAPIh$q4*#38#f60rCsu4H#` zyyC!ZyTR&{a$}Z*r|ia@3^#skQC%eDIW} z&FQb2KJz4a%Zfl(bwFV(<6WVjpXXuO!LgV;11pH1WF(zz>$z2i&1D~#uw@C6lJ+l4 zp7KPp#GIE7-vPGOh1w;%tkXeoBXOHz+Qd(aGT+--lZIRUhxP*%)j>W!{{Wc5!a;+ zVd{q51^#RGZln}LiL+GhR*Sxw}^6t&TH=$mAY%^mU?&rlvw6U zr5V<)WW7fVtVgM;LI>j&`Zaz_Wy|z(BNbKrxh01l$24fFj39_QO)4l@^vgJXD0cq% zP`h@>&dVXoK@vop&CA%H4~OhL3nd8~1RM@o;WzCZa1~z42{AB5tfIP522c}Sa0Mg2 z9pp__5<=q10O?iV_bY-RoQof1!l^ozn(`O7!yJgs8$4TrQu<{(oh(KtU;W~yorrY= z1^*uu*Qz>@ck~rq+kuLk{-;aTN4|6fhGBD>csN{=9@>w&x>{4OdbFM^UjG?$^{z-c z@qf4$Fe_M}AX4gFjHGV}WJtXOHfvcP0X=k}hfW2^ zaW&TXCZD7jrB=?LsMaO<;m@rxP~5{y7myK)6#7~(9YmM+swP%Q1qYFEiyCORi3_Y2 z9}pTj4sS^~wZk|?MQ%B8hV#TBErC-zz_J`4xoFX5*3Hn|vDRq3=v5joNhqk(5DGfV zMnYkp(Jf62g^r3_DHacFXb~LLTYZLV$vzBIslaA33oVD+$(cWMNoL| zV#}@a8md*t#g06pdN3+>K8gL-9WgiB5|X7S zZ`G5-=-+pHNHPz|qvuTz@&k=QQkpBqQOj0jAs!F0Hezt_ zv_;|HqKca=f_?fau#d7*U|%RyIxvYLPmLB0B=w{jrg78P-6LjqsJI6QQcrG2R&}^r z`b9kxK%1tv^#8N>{?T$>SDokmQB|+rd-dMClAi2mOLlHm6e2lt;(#Iv$27Vc%RjIk z8_1evm@w@>vKC%add5*Qto)I|$|McyA)Pi%W^ll3S_@2DJvbf1II9hv1O*&0jhmPd zLTJ+9Fri@2yN4V$2wlaO@1s)ym|D z#lAN1qH%dB9WK?{Qnl{-kp#A_0=4SQ537}q1{3@eoJ1AsLkw=XEV{>K5kfVvko)`& z-R)rZCcigXbg!l`98eVf!0b-YSq-96D$uEC#$oT&Kv$y7xQAk6eDp_aKI+6uNV^K( zX7pwC+^gSjY8bbJFAAL(L1!&q9i4TS80d^%#Qd20az8zR-My2G za?T&j-r)~|`U36O`U{$>DKNS6;DOI3O2T4Y`!8IPL5UDjW)DcQ27|=I@ny%n;C#p~&F&We9Tm>Q&S+JR}=fl(KZ-Sha)Y0%^}*k+dLS;mdK(F$-1Q zKV%sq$!eB?+HzphceDm1>#S(G1SfbeLdRT#;H4+)5E_?(aMsRN`Dflh0mI)Qdmcuc zeSGSy09smy)vzoZTe`1BtO-Iw;NdNe-)Al`gv0sY_N*j{pR$2dx+=pmp#h+dCKkI4d-@FlH*3)2Q!PVwI~Wmw;{Stn*lZp6b2}X4o=3=p@!Me z)Vl7PaiIm9mT5azJd`BRjCL_VKkZNw<|~ZL3k7?H2rbwve7Dzv6B^>2&ylSlwwW0b z+^pAGF`9ki6w6utekUNZ^?xriM|+L1WnHh8mNL~!8nMj4e??P|vo@&?6~Cd}bh1{J z3%uoXEv%Vu3H4Fp^No>6COx0;tcD1X*R%>K(g#(5mj)MmL2)1Al=+rPMgl{gC+D_< zU|5okluoy7-aU0JRAq_jq+Bw~v=8?V`RS-Hp+2*D+h#O$cAw>AD{>@rBHZMNc+j3; ze%b_cZ6?@u27xb@p1$1&(2^OONRDT$5mB!hAqFl zNzCIPoZN0mKafyEG*ua-Gq*7m9jo`9oIUm-p7IlYJlrucUl^ONk~J- zYw#500!PY4xk0i3_nRo1J6nHki0 zgeV4#)t9xbey81HU6X2Ko^360%q(Q#OxY1(#9p{)ZHVFbmyLo&g8TVaN3_WpfjW#i z{G8e5-Wg1EAiNdCuvK9&Ds!mP$XRyHheXc1A!o@hy3Wi>0vhl;vQzR*>bxTxK-N2{ zOl~8TZLnATAcSI_l-U!i>w322>YO8&O%Zw;&v9P3IN@IF^R6Ny>nA9mJUQEXqJ>*m zUXuD7>|Z>2xb-Ardi+F#IF0^7go|?RVr9fc!Jp?EV&Ief89v!x4pvePQFhwr5@i_< zV^&IJqbTsZE2Eavk-ZfwwAh!l_*(;|A)yp_hqFQ8b1Y~7%Iv5t$7F&BjCYy^o|}8d z4e;_u%rL;~l^fut4@>-XrK1;5Gc_yXuQHexe`DNwkIeF78}eF6?iuAL_R*f>#o4a+ z-ncepg_YxF1&WEX`pCx`-foDm%QBM8hae{fd$Lv?w9bY}T)nN|Kk zU0!oEv%C_XGonqP7`(PFuSuU-{`y(vUtO0M7R@Yw-K_Gjs>=&4XO@5Etnz#1(;=qF zaYDF0qYg>5Nf=bSDGEwRJ|Yckq-cODYMN2uEh{hIRG})Xb`SQ{gA#cb{~09R$6-mh zv4o;&K+%;U<-0DYg^L0C2j5(m7PZeT{j%w$n+X;3m|6Oo>7{R|+ZHdHS$fy>(yysY zi?z)xebw~R4JwIK&MbZ9^wQVYZHw{FEWLAj>HT$S@$s3ZrGZYFu?C4HHfEOIHof$9 zb=#6cGfS^cFTJlWEul8E^vd+od+XAYkuyu10=XGeUs;!y$emewaeCX|RF{?npILfg zdg)ixrKJ$eEDcq)XAI&*sR`Uds>RHL(!i!n^~>whQV5Da(D4>nSQG<>tnw9-rHSX@ zX8F)X@hsNc3ngkbTCdpKvJ0*=zycV0B&Fig>LeV=>KukCQ%l>`2+jr@P^a1<`8T*W z{^kQ6v@y7*^?*RFWU#ySfH*;#y0T#Ptu%q>Wr9m>--g-b(Su)txdZ1v_L4mWcE%sNJtE~Nd zfMc-zn}gIl?ce?7YN7qRw~PUZiW$GD5uN2~vHhD+gO%2AO|Z_rUjFR1v~NkIW@*BD zUZKrM_a{y!MbTNid)Mk}n&q9p#;Ou-BfCv1Z#Td~R~NnCtptBky{Dz$)`4KFhD49Ar1{==f1PAe+yR&J?tMg-mC9Be5 z%4D#t%Fdf9-K=?vUq72hi(;_q1)HAUx$TN*X)Wn8YYrArWw(?m8FesL$i@_%5KZ8j z*KPKzXem^dCs_(N)oQj|rdB?u5$nS`*9^Ac0DuuT$|m0o))7HLOH=G)mNX-mgC?hT zz4JbUkhTm3fNxa38FjS{GkBW77O}K4gQ#I7zPYg+GY>a8X8vW9W99?cAua;ibtql~ z?O+b2=N)?9t$U8ma4u+<;Z#YiJb*98hgp2vlPMMqD#WqjJN-Xf=M%xq8fphJ>&zsx zs7;^6r;rB(VYFwL-+O#^xhq3^+!D>g3Ldhg-Dm{0cIV9cIe)3kBE!J%WzIqTR8Ypx zYD}18>v$Q`qOZVn;8`{F~G2C$2clQGSrSUW*j z9N9QQ)DfP69>V!4Mh_Mj$tDD+2jqD1o08Ye`DZ#lGNsd;e^RDz-M^Vm&&Qm5V3I6E z3~3ysJU{hfj6GxqbNmK#dtmPWFpjyiBSPCJY0eL$Eo{Y~zw-80{P{~=7F+QnEqMwx zFyL#y6@Pw+$;g^;PK>*5zOpUtO=vd4D9OY01RNZ(NW2swmK~`wjRNB&#-3YAAqqU3 z&6YhV))y&zaIzAOX_B70pCM#Awlaz$Ap}piCH<^iRm1=^(g8|AHq;WHJ5qMGXgqkR zLR~mPl_IGvgF|hqgFKtwuRSxQ?&QcnrC1@cl;g$k*?w8O{QztuCfFPwc^L=3XQGex zebg2vqsF7Q(CX=at0*l#DgoM3JF@DDta_3NX-QS3gUT5zM`4nVPVoZ9(vS&^m3<@8 z0Albv9LIh@W9Q3fGiV`eRIy}h4rW! z7$zH@N#m40OM7E@$A}s|Y8EgsdOe!89)*5B-RFVxWa(=9=V(5{BkaSR)#4r*<$KLPPJ z+D)PKP@90fKVtjdIq~9RDIJy6S;=JXUS{LM`E*-7g-)sHA}JkoY2bEXg3@n_V?V61 zpNG=n1U03@9ww3d!jxVk_ulNt7AQT8Li6>N8eMVKdawUTN|@)Y9Vf{z)kyc{DM;7k zter)YE#Uv1O=9(TaFySa`<7)IDTL+aRLjN9PD{RY3)(7LW(^?;F8c4l9 zm?8ngzNyG9$JPgEKgsgxZ7(GTzW@V7qDC~Bni$-)i6_X=F=m?qv2Ql)+caMnW@N1v zo5bLs&w@>hh~F_CWNKn?Qw>}X$r^)^1qB8|2zziZIx)C(kFY?FiNW!Onwa4_@bl0u z0xg<$+(2Sb4u+9Z=b?8X1C+Cx415u*pt-^lgTrJ0#4IuMX*lR~ahfhMiS(C(PMyU1YUwhy88Sf2R!F|Ee7H6`x7co-#CobeSTK!4f3?mzUm1BmQTAEo)0#wZIqNVeCJo$NCFV?HbBPEs;y{|B2 zjIsZfm}9HTY|Ls2CmbEnO1$`M1wkTR`QiYh_HZCN%I}-ZDa6fTjf8K}I}%n!V;#1F zLm8+XActjDuz9R|EcF8*G^U1dF3Dt<4T8P^nc_)dP1&|)k@7FI{vr4u$)wPGAHSc^ zqTQIs0CC@1d8B#(E|P_A|X>77G0n7n}$RhTi0Yv02Gx$6KP#XXxc z!4abJq{-N!RXyD)mTLplXWi{XMgn)b@##~xv_F6UpTv})1*X2&6+|Xj)Ugz)H;JVej76>MGou_5Z6+>E%#Wdd zz^gI|=AH(#g4h^G`8qW3ZKE3T^As`zQts#AW<5-gxSul5ws2nG5lMlA&XI<|)%Jj; z1-~Cd6ibDMEa_QRwKZg7NeqJ2wL47Cx6xEX-qb-DS@k75A0=Ob@&l+s0imboHZ$Cm3`;7{ZKf3Ix#6aG0$2$(8iyVTOp#Z&8Xlh| z!ywI5!#-g$;`msBsI3t}f*4r!po=v;3JU6T(KHNxz{mn$kP8E8x2_+|oYV{y`ZDBZdfa1-~?i=K~ z0hue{VUW$ZA|G&3Fh;7foa9Cj(Q@K|1|(s2d_`-!TS7XikWI?>BMFJ*n~c^OLkd4d z$*@94i|E{)yJ;i^E0DT;FC)pjw`Xe)_LZsmAt?rXlE@tb&k<>KEOn~|do!=<+UIep zD9;4Cwo**s{ZX7`7E-*5JMiE>UT64gwegp`gW0|OJaVEGW-G{^gvmr<9RcY)upf-b z_T@JWw^wXNCJ@4Nvt)H%0#%EJf7q`M4+#Sr4stqU+tKMG1ldavVPW;@X{ z=ppXIq0N2Sz1oMaz7)Ti`u9g<uj14|n*gt+emWb<{E;(}voo#sy&5-C&s#q2q;x9a)t|Gn+GGI;zwgL%M~chBy* z99!o_Y~H?T*b?>zlO@m)y$_-{G)N$nsE`agqQjaJwHMkp6c9@Fiy!)UQmraW6YQ!r zijigYQ(&eM=xCcrblYRt1C{DYpOV>-R2?obw5lM18heuTA^Y`O8|AiXI|6GGXybkl z?S9Kpd$E+MA(YoXKCjX5>Y7TJ6Z_&AMrr$aNC2to(HFc$e!;}x?Hqy?b4yt&XJTle zXb)CbRC#`{f=L5s(~d&z1-Fb!UJ> z1yA9RR7RpYJ6>j+=SiMUf9kL3Gy!7D3qX4YLN;6qFESD-3!<>|<#M?k948~_VV#)f zFvOcc9y@jzDxDo^Sd|Z%jQPreN5XL>7#&_&uIaK-7EBiNs;qqFhTk#gSNdIfyu8Bi zz@wdh$99!K))TxAQ1J0GR*lJ;G_<&EfAu>!B1B`n? zEw6}Sx(mUAobW(WqE9-odhsR?X|_!}Ux?W#M0wJ}gnz^})=2mpzY1xVkfvUPZ`7dG z3{_&K&{T=E$Fvv?qh8H~bw?e-6?fL9VRb}t*E_Q#rYB0`q9&o6g}Ww9!%Sf$Ye7AW zR`qz?W)p~6dlD3U_H$C)e7-ECuL+EDvy3amIs%JEU4>#T zh&RH1A`5EhXsJfNQIlVQUS^t;2pZZ3UNttr(U%z@6jI+GuL7upV6rhu-t z6)VfGF$2qT3femlVWD$lavwefQ8?NQQ}IFFV(Xz7-nOPh`;Lv^BBg28Po<-!Lpf@h zzI(gnyvF8IE+&e8ZqlAcV5AL+Hg|l=KFi5Z z3 zo|1LUQCq*-okUY-!D|Sn@r0HXC_^V@Hqq<^u;ObyI7S4@6DU zAPoa-L;8ULW@EwyrC~jp@bRHAOE(C-fBHEg5V6+_es!gi39Jp6mX%d#Fo0?8SFIo!)^x3ssj&d(dN*?DI#3%M_gvcr{FTlj5ZvXIq*|Lbe)UkQp}X=5WZ}XA(bNt@5sztGZosR z5i@H)puLb{b&TIcy<-w={5(hwYA|s@wivYcShb+Wnk64J%ppiDyi}ktsd2I3T8j0SNM&0rFvaS$tK9c-Cwy!c z3-e)P=yyQJ7qRQW9WzMr;ht1d1zYQ9^|KHYt3}dcl3dD0Fzm3vWP`HjUqrSj&5Ay= z1UgcUGDt|tapWRB$7IT=gz_Po5l$Kr^8yeUqu`n>bz|Nw)7Nr}lY@iibv!1Q2jYf) zB?@KVesLR3u<(**p#+=oJHsvU%eNoO@9{FqaBCPSbx3_b9k-@)Pr`fTQM({{d~)W9 zI`VtO2}FJn{|~ovYVY=Z%#fC+(&7`=xZ+)QN1ioho8TFuUUwiZ5?`BFlnNlI3T{Og zm}1T?S$|9A>C_V#P8v*))VNc-9(+eSx`+`PpkED&*z|DSdPyp-*e!0IHjU2t!joKa}gu z%ZI5v*@v*yT086`h5wTG>n87cdr(?kSnd{V#JW3`DivMH59IS6Jvr<+bpVVcv78~| zF-(X$TN@n393R#jHz~vGW*pF2FDN-F@5I5eESteY%L2m+Rsx!7R2y4-)a;kc5m9*% zLXc{zV!kI+gE|UqMj@XZmDq$K3>bO|f_?var1O5uYhbwv46|Joz(i|S)=4P~zn7E+ z1w!@N5kZg8RLMSuACwG7XHzn)0euhI#L8!Vt;&U6U{TbcRgx4JsBphsqzhwV&el0p zi6+Rom5+_N zl;+{V%@_m4a9rS8?oT^^|M91V{^L*ELjMtp;DTmYy$$^jA+J1vYk2?7pBDOsKg~NeJtmT3 z=jvWPJ*8JoOysQXUZGd&6aF*}FfG0VmP-_|8 zX<|K&Si&5em^Q}aD{vBg+ema~c%RFi21Gp4k{gS(r1Z^v;RiX^D6j8|=;hX@n^)X& zrzP#a1@A%AGcYSD#izaw8TVBfpu=bKr1yqHUkY5Eio%lG~XjM24*dxGX#LFuRf%$`O?;Kj(zGSr9#0vFDVt5q*R#T9#<+>UQ#MX9qoP} zSJkE|6?eekrYjXkUQ#NMdS6ea;>aZ_6}Ff%X=&jK9^q3j2f)i*IZjP>iORJ`dW zo#G{(;swwt{=CQr?rYL{OC5}s9k-@;T7fPsy~!6ZO*tu!!X(e3HH1~c9h z;lLbUdT2p|Vz$7sH!FFLnba(u{c@$Y3G#?z0#`ZRp!WH8+~T@~=_R-{bR5HIz&EwW zSH4uv4_)HZ`WwukU7pnbULCkG;%rqut-m3S=xCWohwDdvQXqC#%<%S^4iR9vPfGP@ z)3gI4MtwgvG6yc^)L1nSu$?XNC!g7GynFQ3jH~vW zyr%Tja;@t(iQ8qjJtG4#w}p(kifiK_q1w5R=(%CEEZ+z@%4JH!^1P2CGOgOJS#XzS zU5#nmmp$mnOuBrpkf(SU+p_$1@qpiDAXcBAxvcmE`MTv9Tn63_2K#|^Hy(6KqcUL1 z@MO-Js!1z}&sQr_ok{e#j7(VB-pEBC$cbSONUy?BtH+fM_esCUJ8%$m;wkQMUBJ9i zSHW3;f~_yXNXE)Xpc!%S8Hw|ilm^=p(p$aZ%&d^!Rd2=**8Fiyc05$VUyKTx4r?KP z&+J&|lv$d7^r^`gPzt)D1c*$;Uq}d}q`h~e+AFTHhpiE}JAlC13jUiZuB*eU@Wk8! zF?5F(V!{Q2=r!k7Wp-{Ad7^ZZm7Sr%`NdjoDJ8Me5XW!;$e{~_U!Tg(o45@^4>V!STHOG0)xctc)%m+2f;j6e| zG$21Vr;y0nBlz}|J6Gz?etO7wXkN*Y)lRj3fn#RtcErTE}DuM{5~=ao56#(AYU<2bKOc{0H(bpXvAyb@jryv2o_SGIW}u9Pue zs8F3YFBGrDuPqK!^Gd84^>6V?R?78n@ygWs&Utxd6Zs%D{RSQLglo=uCGN7wEA7^J zr8caTt6?0RWzn#`zSv$o`MEEK7+GastTHlD;y-a+1y&ZiY;75-OyNfeO0RInnmsQ4L2L3p}ztYh+PgowC@S{Q)&Fp^TaZ>hwY zq)m)5KnPPz&uO*52+LLhoZVtBxCRz1?+G7Z{s>>zhGFv&Fc0FE!LDg4aiY~yBId_C zw`-stKpw_kVHaZEgX6_>q8C^NYj(>I{by@wcg!ymHHP-JO5Lw;{={|+C4{k=u@>;4R4nk}Rfz!NhcIWmVPpCyZ%ShTnu5 zrvzm@R@LWv^FC(3Ht6*KWk2TzO4pW+az_c@*OVeM*8s%5 z9ZtGS5gFC8c(&qOieCu9C~@0CQlo%x1hjF+=qCk;cbI%dtoY=UXx=7&tmnI{k`L-F z66Z`>D(K1kEks2#E6!jkR;aU(kDEI;+tgpMM0LQc@$0l^8aMuB->cX9UshpffHMBnc3m9dfgkJa=(>n$0#Aa^-saWBdc{ ziELsTeIA=lKJ8?0^UvcJlD*Aec{|zL{G~37WN(IATI&Q-|Jvtzn;&4~x!zt9_9k#y zqtua~n}q!vwj}Jg%@Foqd`Z|VUgG?+@arV(-|&qf?B6ghBjyzL^Ow3Tg#F1V?EkPO z?B^fDbYVX~Blubf`~SElVLv|%wjk{1ue>en=Pz|x2zx`VudA@1A7C#Ddj!q-q9Hd4 z`@6R!?6=Pl_J8q`u)l1D{oUUP!v5|p3H$j=T^7RrZBf`i-xBuok72s7pPvzYErk7_ zY)RP94}&cT`}r$x3;X#?T^7RLQ0wa|?B@sAOTzwQh5bES6838|g#CYdN!VYu!v3Cb z1Ys{nZ83VgLD-u%CYn(}n%~jNoe_?EiF2!hU`jY(d!1UwK>D&tK}Y z5cY;zUsqv2KfuO?{hz<&vzJ5dyk`9G+>)^0F+d0X1gU+S`u_KsU$S8+c- z#Ky(_OJ4g6d+on#OX7ZghPeOBm&E;LEAGGR8$sNE*OtWn{G~1nasNNXwf+ColJ@hD zVY;-RpAmd5r2U_5N!rg3gDpt=`73Wr`}s><7Si5O>+34)=LgtJ!v10n`QN=IVZU>R zu>a353H!@d*njsog0TPYEeZSiOI;Si{s*G4|3XXH&p(Fg!hU{6@U;;3U)++gpC1NW z5ccy|-WK-rm%1#3y`k3ERoKrDuyJAkTWe|m1=@TktJ!DTo7UdAB_Y|HAtZmL6H*9X zj+@pvM|ac>d)0KS;{9l7&rK|62-tJe^?HY%rV^iEgQ} zlv@03z3puLV8|xz_{yBy&gwm1UiVnqEhRH&D>&O^>y3*c=Uq+)$wJ%q*?rq7ZLhNJ z(0buE>j{q9j9UCf9;SSqM624V$R69`x8ZRYz2WSQTM}^dmzpWyzK{bzZLCe%_BgSN z)bWM0d4dzY&Q{iJtev&>jt%;@w-QJc$JnlKo4o#g=A`3iV)1I$amlvBm92}Oi7m7~ z*BLTo_y~JC*;MxP8XIQ{Ob+dmwwZ;qL#hJ<1tEd3xGxZ$z$M%Rps^e=5o zmu84`_NBAOn^c9>;DoY^z`)t7e)ldo(`rA>@=mw6&`(;4KC~fzNbU~L^4urgqtc3y z?|j*kkfZYW`89oIhQB`9sZ1oWBqhYqmArg0o5*08vJblB*+ja0&}0+oP&+3#kWEA> zeo2d4c08F#XIZ>On}01U39LcgQ7)B`l|=bdntGI#gq$9WWF?^|BWB6E_)D5*=XOxh%5REC8Fzz=Rr27|>`<>Qc8*cv2k1Q&(`BRD@K z49XXV1Ucw09TF>oM1LkEdRv2pjo`wNP!|33;)La|xiBOaUI<963K9!5A<^9$By0p1 zh6E!xKO{)JFb{Q*+y2sVVoi`BK~c;>Wr;HyKGE44By0p1h6E!xKO|s9^FV^^7MBi* zLXhZghC~T3THrJqhs5sDQq3_@%GAF?jPv^B8qVS2*GAx&8zT;nyiEz&rM>A0oUU_B zmn6NWJqTg`Le5@XEOq4lT?z*fbD z0ZbJyG=R6a0gTMs;lI%kIyWXHU@@v@E-ZI{?g$L@JD?bsJ_zh{A)R7nXj!oI932e2 zVR5TZCG<1L8znAkP&fl`lpz{L0lcBcG7A~RhM+ZV-kyhqeiH43MAawhIIGu_!%mfm?9$gH zN%f&WNNyp~*{M@cC!CQ+udEQckob(0NLGl`a#V$X|LNqGb?CWA1dG0 z;O%<iqyUP>u(r?BcVz z4T{SxoQ;gKL}SMRe0Aiu6%+=44jA-!w4@mkQ>DaGmY5_H<%qD?|qlfe7MW)k?+Cc!>EDL8aB-^;`0Dh0t-s`RaJ|05(yw8^P59&%qW znH3p+bbqRI`!0~3kI+T25-9~!Gqzh-7FBB;+b=zMXFWKMxAGBRtt@c>=FZV7Dm-Tp za(^3XIJw+BT+`*qkh39`A-h{W2()y+pCoKMXs%qln}f)BP>!~#v`+Qfc7me|Er;9Q z(G@2&3;Xho;gz|l=}KBHj=wfZPCv%rIuG()x7?=x-?3|ylPHw(opSZAUC;cw=z?*JF;B8`{W8)qsq?lP=&rZG0d+|5Ci+RW4X{1S^&Zg4H79=KptSm<}C1pr2wjiyGnz;1V;q5^y-cj;8Ov zM-W(`OG`toel%Ko#vRZBCR$GA<)Q$AIVUeyG)B@KDj6IgK)`Dx4m1bIz{Zq9sbJ~K zf`h~RYD4h>?4_DQHEe@}aM|fyynHUH!3L@&kO1Vuv@aY3tNq@{tsl!X$ zbp?8Xw>4)q*qJU3)@IDdsA*>&x1WEEu>t{X#Q-M2wFa3l8)1pzL7+xh#`Hv36skCA zKqpp$0)6AgF!W(pV>e!OT$r+Oi=`zMri^mZX)Z5USBT+Mr~a4sz=o@Lap5o==0WUB zCbPGVx+lu+N&lczeJ(sM^Y8+`N+FVi+QrUd@;PU%jqr)(o^O>~I#Djw6@H=hB0o{) zCpTBv9hx*<1qaEBdJ@{Zf?<#`vh1F)XV%wx*x-;4TLTu?jD!I^JlUTh>`F*hc7@4Y zZe20{&Ox)rUB!WD0`W^DE{OF?0+@#+eMNgD!6HW;Nj87__UxM<%yeq^muMp218b|4 zun|dL{0M}}89V9lmAXEX4&hVrpPoESLQdG@sZ;L|`l-a}SYlr&aozZLeuP?D{BZp4 zRpGmG@;lV6V`XWl&PzWbSD~#H=pD+%o4Nd_|4Z3u?-NmCl;Hqu>rjOO8n&wpw0U(V zjY)%fw2$r{%7xFlj=?;bofdS-;+X4bHb0S%D$Hxa6%&>5c`4X2lk75?WJhaee_vK^ zyyab`(&>S|0(BXO%sUEEl*Rz=hboqUu1e&Cygi?K0&om!aBm&JV@?nRR zp1IP5=A?;l9*{(o^MzUubbKy&$W#cA_7M$nNQbE@hbS3IO(p_Y7}+8Ob%ee_Pniy_ z{B~vA2XLiZX;MDR1cH3g&iLNqs<{F@i(34Nomf9wBtBv?^ zK>IuxtnTtuOq&7Psf^FVK)STiRTlDsi&(=s?)#1^)K7lzMXE3P1AF7sinD}=H*h82 zD_%8 z8nMXLn954IW|+f(g;W<9jt*G9=-~hZm?dUQ^b2^#JGsE#-@yel@7sMGQm}NG?{FJK z+|K_C{=a@S8NQC|75x8N{y*aXFX#VzczzJtdx8YC3*e$=p9N%X02AVoOq&bG&^G90 z2htkD&xE|#e~-Qk7(tIH9u5?4^pr4p_!4;hb_hWY2|gs-13O7`tTqJ)%l}SBzWfTbcVQkr`{w3LI1w&p-f|06=>1;{hV;PJRhIVh9fUcFaEi5O}{S_D_yF7 zIF-7kV|Ho!HOW6tU!T60=hr9iNjWv0qNh>-$n~9Qg(9kXni0JlVfL!Ua2dF`=z-1ojU3=}9 zR|;?X#-2#v{)tSpBo;^~s-@v8=*2gwgED<*^lhWk$zVLWvfR$_Hnc3pP$BbI%Sk0~ zSltavosY|2sq^`^D7OcbD`UEHxm+J!+kDH>@AMgskNFe=mrNaebhi{k8B>>QL0E9l zd9k>yhOa1lK>X#*!ibsa0H~J@uaJH>Mz~bd(Q?e-HGG-gzD%l>k+djCA4Ib09V<8Z zUzOf*QhM|DHaqsSHz#xU>l|FyT07--F=Cop6?E0Y6;7kb0MyFBJX#R)QSVT?@EzqI z9dEls(^GP>!S5)q)!=uO-y}=&j2eLULvY2%F!3DBD}^kZNWa z9a6LJP@Z;SWxz*z2O}xDz({s;fst%**-%rfSQ3{r==?9e&qaO#8E4drS* zBYS!Cy7J(AoKFHwQJ|nVQgq3l+y__SQ3=xiDKuyR@P0%?4s0kfY6Z-Z|ORR$S zrX~2f;Nx0?-uY~D-mtl;5m&|ofbO7t-5~%lD7PW{1Ox6&r`*fo4k#}Rk#*=>(f>kA z@f|3){z6MN9w@*5LWPoMbtE88;KU{oM{6VLwMKT*aQ8E6E;o!sOMQ*GgKE@a%yx1M zFzRW{JsUG0?v*)!4}IVk_JlLZ2JVPF9#W-uK5*;@8n}3r%#aw9Z{b~b%Sk-i*nahN zx6Ijgx1j?*EW34I3%g}o*!8ur>+iy1ayuPhz1*tXfl3_*M*ZUMx_?sN+Ns_<9AwEX z9%DkonN!GIN}+M+G6+!MfM0_`=)*E2wnY9#c(ATcU16PCSEtr@mCJN$olac=Yl(DQ z*i7pPo=srvXbqdy{j`kexG}5l+tCzI=@=UIc6Ob_CPROLir!N33PM+abPQi>^vrOm zwn@f-@lxX#Y+YNU5Nm~nfO+{tDQ`IuqWDd@7%20Q9m>p&R=#SJ+xMsEn+mP5eJYwY zwoQdfn?mQB@W^5wm{aT`pcgl{VEyD_A9a!iI}!ph1ElhS&y;ACfI#H$ERR~4> z+Rp(?yM{1U^J#sq}5>X!9EVC6&>)^kHX*AXq&DLy^{F#dI02|2Hh8#P-hovzuQ zWrCz2KCUb5^if?=o6d06#PJs$S1a=cEs>m$p+@lA)CetNZCW89JAiW;#6NaYYudOV zF!FM{NhGg0r;Xi&Mh%m_xxWe35|3$!NdSz1DaI&S0e6JOafo*#u*KH^9hVMt#zh*+ zmvoLu5AOrcXqch&APF}z;!C&uD|78U~Rs9>FDYF>+|wn<%yYZe!@G{Q7t zBYr5AMke&4aaO!G509p!qH^t5v^$U_-tb|rb75KwhG`>+d|%_nT(Avp46NugArpK` zrH_xp2*F*$s8_twke?E;5ZK0)k8 zR_e&^Z8eM~-`G8r2A`UgbB)$wT#CuH$s1t{EJoaOKv|E)j3KNK&KZ(c@rC2-nG{Wb zht>)Uuuj(cChxEe3c3yK4S|4t7uX{sEU{Phv(QTw`F3X~NFLqI9%PM9vzF6HKHK6@w*X^&eui8rLc4RXPauO6>Dn zowPX?>1cvsPW7v@930Jsg%Ka13K_t{xBP(jG|0hc*$2!12U!WAD-j@2{77#AlQe`m z8xRHniKyroj4e=A2F4(4Ow39E1&lGt)7y1BJi;-i2gU$o7domoKsi)n;}Ab(9L!al z_TZr+4L>rQWL4vfx7k1Wiehmb>Ew< zd69JjUc|JGk-N`UHHFl%4N+A?>P(xHx~Y&2smniL@Q(xw;06CS!M4FKJt~0T^rt@H z?*;Jp0Y6wA33mAcdg&TihQ4I8dJ*)Rvf$M@Lu2zNac7dU;jvotFwLy^oQ*Lsu`&49 zh1uA6{I7>IW7wlsin3%si<1&9L(ud2Bzk3^+K z`C1-@C3&~J%I?sKy5(!_7OJJ9kEHUj>4Y;x7uP4n*10~>s2u1oVpf<)_n}jXaIu;? zl_%vjv{4@#c!PcvVdd1-(&&ve2PE&|0toNqg220t3vj)e3oC=0xF9nQGpm@()A9f! zjSdu00+)4Ns?VYfbY*97GUWa_dx8-@4p8=Wp5tE$Pp&Gjso!B)SDE@4-;3 z2-dLH$x-C7nbx@m#gUyPX{J#A~5yq4ft-sgFoF&ye@bm9WpXY6wQOT~kELM?nMfpcLmfK4xT)~&6$nQaSR02ox% z`AsU!=hHy9H>rTt4jaBo@?D~$5m=`nW0Mn+eF}A9<@tsN+7)uj?bLp|S1+--Vb^4=;)Q*&k`*!a zy__waKVMM&c)UpDw=N`%Ju^=;|xx9lO0WXL2C{U`iP6!n#qJGJIY%Ke(cq}(M; z4X<@_o|-yi8e~#l@1HQB`V%a$N%?B8;c9=qyY<={aQAC0;++Y~qE@B87@R?cNwe1-RtX`G!o)xrH7&&`UmSiMVr z5BbGy)=*M%xZ9{x{Emt;!HS*mIRh*9(iw2%Fc;wV939?YezTUai7ybd;`ikcejdlt zf6&w;u!|qklOrck`pef8e<8Y{>fy2SYG3H@F0Zze@phFvi+|S{*pz_oKrpz4N^&%7&$K-gw#wRomLj4o%>od{A0WWaRAxukDheMgZ)>0*@K4%YH<}gjR zWwG|JC)Km|+J%+9e%c;r%(>_dY%ZJjt(<6=VmqPm4Y zFyNzB=6Zs{RzKmMCqZFTJ%ZtVhqC*rktL?y)f8aU@I2^&MJP!cHF_K?ciM5nJL>~1cS@$~0Lz`&ZAJ;anj89M=(IC1TAgHC=|oDf=dGg@ z37f!m?}k^Wwrtr6mj)wXvW!;TYx&F$woBuYeV#bu?w%wI`>bHy+D#>6^J*_m_%EeU zPm#LIqlLSPOd~G0d2om9b>hD~FBf(#<3Ug8ojZ<@C4RYAaj#P`tEgZl^qgH#_ zs?|NQI?7W1<4>kPToSwJwtfsA6Rl{rK_NAj;#E9}hw2#Bt>0>Pw8deMci9oWwdhkG z#O9XpM#SdAh!|A3vx|nQf!bqhp~E(Z^j7L0j@O@A3thRglI#e-`c-*ibt&-)E;<3I8V?a!Xy0UPq7NEdlk6*Cb z%WxWpuG%l~Z^m9am5RV3XxV_p^uIC}K-Q9^NWy#mh+tK}i4-J$Jvrqd@@uU=YO@-2D`i}qi?{*U2XY0jlpRfB6Z zsj9~mC#q#}YA>#pAb!`iuTPh_;`>C+EthXhScPeu2AYlhSgc8f5p3TevP0qS3$ITW z1VWVPN;I1m_gY`m6IFJ5mA>6tl_={o1$14z21&41|p8nvQM8MR`U88s0_ z8a2z7FzTJUvr+HhjzL{n|-Co#Slj#w4vGksJ0wA(OEau6S*HSuCERXd-UdGD|JWj9re|Zg2d$611DJT!o!#Dn z4TB$q0vP*@p34Gzco4)U%Q%D{q!pKhw*Zd2S29CJqN4#|_y(rbSxVC-x-|Z9F-aC- z1u72dfg|fCf^D(`@}ghM9wTxTzX1Zbs$(}Mw|M_B9O>6l?|a3?=lhuMY`*^+pB%os z>3GFlMxLRmfl*+eGbUvmiXo)8>V>vZ>T&1=KdtSTQw!TWM^k}PE{TA7A0+SY`^#t4j93#2H-qHEHYm;!d1?PbXC(Y{Xz4{xyLTrnw{va1f0%K>W{#)zn4_WmX z30bmE)-KeaHmgDGa?y5)iKIJ{HSW@$UX=V ze`OHV(~`;9)=5^jTLF~qQ!?N)xx##wMnmH^`4I@Ecf9&4E05*Jsx|cY>V}g5>c45F%uwy__`*!`a?D|q4k=7x6DPv zWj@S&P#FG&AoR|@MXCP7MBI3(y5R)QMQMpkiUe7zKA(7;z}3RnrRwAHr}hvnRo9$A z9ddzf=0$usM<4u7gw)_@`c83&C4j{@!WyvJQ4=;ZIQkEYA10P{U*12Od>38_?h@7? zc#_~7@ha2cBBTCfL&(HnL3sxRkv$e4g0 zgeGC-1C4c^-ZO z&-7c7wpvi2JV|q{=@`|}q?UJ5WUe}DV&bPppp_G_K{Hl|=?gqjoEX#xAG4Kh1J6st zC^IC)^~nKh(ky#xt?E)RMvn!sx)b~~?M@=0W+}0%*UqjAjc{63Qn$RSWm7xL-rZXB zz;+bei?uv3n5=~;bT%_IvYoFkF|TI9YE>2A(>W59IQZP6*+zns6Q&i6nqK;FmOEwI$C}XbaP$QB$UYLr-a>C+5=tA@aIf`%Bwk(qKeSw#hj& zvM~@5QinZEBVr?=lMUR}$OdleWRteZ#`o*Vj4y+~Nb!HZ*PtDSyD&Z^BnCrr9SYbw z27>QIr+$wRjZS0I0ZqZmEXbLx`eox-k_oJpO!O2#nQFgY_3w<4IBY4NR==W8JNi_O zs9MU@z!zEmTC9vb0a|v!-Rt*=?`Cqmc}+j{C&E093B>7AaYNji7g#y_AY3jn5t2-d z2BsJ7DXM|~Nm9X9^kFTXkVUqEWQuswoC%M$>jzPGv;N$9l3?4q!%OWBZE||HRx9p2{&R+cr%85cM(y9=0vR;r$ z530^WVH`(!@fgdfOc*VOVlVRQ!)kfKTei*5&Z}fm{m9s4(jFMoh6D1A*|2)D>Rg=H zm4$j}f^Fz^cnUpBf~c+wvN%;NT%E$3?3ED9`O`#|vsqm%H>*k^n^y@rM&(SDTMw>5 zR>GyKlo|PKE@l+wO3K|YNQIK}CSYSuFbp?VFUjFw+Eg`kMOf;CE)pc|+4z%#z528- ztVY_4^CECe)_($o1bt}9Xuk5OR&}>QD!qMNopv@ye`LrI;y;tGfN`M33DLhbhw!DB z%ZO6%oGNM&D!Vizl|p^gq0f-OCy<>k^%%d_A9gW`X6|!DT4(vki>&Zm3Qu$hifgMj z6~I#a$P+YcP$hFaLWThnB2{?p;s=kOO@DB-{b+gmF*y46$5^)h-B-W*)rC83GrXm3 zB9vcpmGAcqv)Z>!jElv(6XK-dbgGAP?E>#qkFud{sa*8^tIo=oWaZa3MogOWJ7ukX zdbno@B1G7s8Yq04mso=TSp0uGE*XH|_{ErS1Hn|j^_C2V7kj6P@^G4Kw;CU_7^gjA?X zHn?0JV7`|bDrJ@bfXl{kRqLaIARp@}lf3_U@kJ3LZx5S-AS`TGUafnKfc2pm7T#yu z3h13uQ6*`JeeQe88CbcVvowh*XBOJkmP$E8LK_IKOP^V*gp@Ptvu70>rU-nC#s^Qd ztpW&2#G#YP!{BjlqF1&Ro+du9RW~5?dA4$h?GaJLrEMpp&R&6s0Q%T6oX5?gHe)%Ei zBvztA2>Xa^4nrA0v0!DuR$-;mF;q~=*bFZ)!??=Py;!|ye#?b%tb8UNbw7CY(@CUn zgW(|3w=oC9SkcOwBW^)s0|)F%=*`n(fF022iY++-EV#_tbJ#;^%gcc&ZKBW7HvHpX z5d}ls_Z-YVi-VDb0z?sh+M+5UTxHl4;p)nwPK0Yg|1=LUo+S)iouK;mi19$uI-&)p zVC`so1MR4y=d9-CY8%y2Ln#ZH=yIUT9*eH4X>!l;;vXrn<8;o)1RYfGg{QpNc#6;+ zEEE!hnnGgGR(`pF#Oza%UydwNLSpDdNR0Qr&m|x+D{*Rc4rO@$tT;N9^^C62#M9yT zIb9)~kLU{JJQaS+gXm6kXHsXfaZ*UfNFmKOk-{U{6jC6)UPB6s_}>zrhDkV|RxHmX zp9WN0;M0$iX$6u%bABsxuIcLg9I`*NCW(-w$mX_VnoUSjG|s4%qzFch7JzaMqXsj^ zN#bmVjDkfE;DMSYnI6a<`H!mWTsR;!)PutL`PsC(P7C?S%n>&Q7-N_t9DF3RxdwZ_ z=;+5p1~$h$3q!CZ3PV6CVF)PI;R2#0OfhCb>q3a+<^@dgtR`O`SgSqM%PUarEb4>s z=uut4n=`tCH|!U+-w&gub*d*iEOpmdUwm#QW!D3m1n|-YO^2c6%$nORS`pYNI%u~N zoY@h5O6aS7>Txou;$*a*I$KA+lDR|vS0Z1r42aI_$k$wfGSZnR|5X6s`h--sF_opF z8c1bX=dqLlIwNTnD@eM4WY$`eyCz4d+`l0&r#XO=T_|j~V>(HWl`Fz!X z0`kqhEM*Qx)YsC+?j-fwL$lEGFr+f62bF|Dk>16kf2hMf)7+p#ZmEi?j_jO$LJSpG z_U&5qt;k#U!VZCq6PG%Kx{8@YU|C{AKs#a!j_){8b2_EdWrI;>S30j7=JM26zr^7_26 zPyjtH6$-5?whD#1ikVPAwiy%1}CmQ=ms>f-XTuu;7(*poe_vrV7GH z0v6dOGGj|-LgsEVpSz(?$opI>tv*XcL|huA0Si?1!Dl1pxz|!!B9rR&4AUGfrZ|^U zgfPM(t1OAv%+{rRP?{Xpm&igFLv`}&XOXbyPdts@W%EY){W7;EH1#H0@``LL*0U+` z_%!Nx#Lbs%D^^a36uM6=eI$1HrqJO(V!dJd_+*D!xBAd-+T7s_XTA^c5@>E7$(+?F z2DTw%lmHzdoG@n0-#H3z^QA0@@_!0d`&>dO3_q1W)_ zztVYAb)?0qW{*)#MNP$D+ZKA>A81v~lD7DB8KZE`7r&3fsEG+Qy;qZAdt1T`C5jbJ z+89Eta8B>VvOHE8dw_wMdTgzdfhj~|n(o0hXd&EDM8RzijtX9fs^k57+sMEH?q*pE zC~|@hwO61sq#;$&6(GX2-OQ|ce)Gosp*k&c-DfV0!43>yS;XfN%eq36uJkzE$LPxu z$y55K{W-Meq@5JB80rz14cnYeX=0l*1)nk`V-GP5%L=n{6VYk-SV5#R`TT9IA}vO9 z+&DAga4w}2PH%Gqq9M0=00GcD#1R$$ES1ecRwlwrLwGu~4QDar17P6}oldWXToI1k z^fht7#cWg3BW<%R+AfP5kl1ufnU!rP0QjdTsxYPP@RIK^aoMjJ%I?*-8f9E zRAa@lFNHXEt$Bt_ljtKczNG#~tY@JxiS-+A8OQpXD@Gj|i&DgT^YkRm03mFxp%{a$ z-i!d^=mONBRfk$VE~gE~ylw%Ykx^Oz=%*86Zt1)&L2l>fD|HAcfi83-oIQbQL|kVe zHfeV>9R_Bb5|Gy{O2U>>%#$#Y>bBQT( z1WqG}Q5AhGDmGg&CKCz*mMj>c2~cg}bv7nPb~|xPpo}-n02;*3T@2I{76-?g%_fYN z;Bpr$M*xzS7WV`)K8j10t%&RfCSQBm8m2_h--2ufy8}$vqqAa4%3ofUExT?03o(VmIA=W3;HQk^%q8$$#3QWC1`++0Ki ztMmwd$iqjUF!LEuW#18O$@R+ggpvM+Wn8q8QoYt(@9VVY+xboGSRFTHU?y%zC_-fh z4+Ee8VxaQ;m$~Kpqqsc$mcoMMGW~7QvPv;@vhg87ac{&eu$U^ojcyq}wPv;>=k-9`WkKDRvSr)A?V)HtYtL$1< z;F!*Xk4fiIJke8ZL0WxV@u<`Z+4GoCvXylzpHQP+sC*I9#=tH_Ro*h@;{g1F1(A^^ z9wNt8s9LO=d}(}fSO}sIoqmC^eMG2-`Yxv>@fpRhhmX(|OoNSBp9<@##7*9qFwt(r zgcM^i_9|Gz;Yf-c0LpTG4s&jLhPXoa3w9}~2vC*gWERhXH>DP3Le+Dl8WH>Val4mL zsFA?2iPx1`fXHIBDLD zLOGKzn6QaLiiWeLOq~W6B^Qjh@*%*5w6{k z^*g?7mYhOHvks#;HYyc5M+P(6 z;R_^9#;Z*Do^p%!5Tx4OJM8k{2vUyUxiYE{3o3z$a1ol#dpRpMY%DRYINgbfNmSkA2**0F0K69}|YeB3MNmlmejo zvr*MTPIWF2RO9u6*w`WI9SQJw5gSkqLpVQg1|xP&h|HF&k6K%pUfm_jTEUvE+o(mR zw}J4szBg@TQ`-QUE&ZxDv`$06XbmwMwX8w;U?hce;-~}S=b~M4uOO9kD34%67tsJ> zU)E8~sfJn}FMd4pJ(mhQt<+OxL1BD*8~|iykGutDsTX^Nxp*-JNAk6T3|iT%E-DZ> zXI7wqoaq(d3JMiyj%QS$^~rfE2;5Z2N$-^U1RN7D+x+5aN>&tOP*dJzdS_Eiu(7y? zP4;3SBugqytYnqH9b^+7fd7mC7)8V;qdlOq@507@(UNqKxGqlBQu&BQ3ltZ$UJnNfBlqeQyP zdrG!K1%mX&L=_DZaEn}!LL`C-0jzzaGc}Cn$Q7kVmZTzB5=`IBZLX{oUX{YDrku>l z_m~0=&TU?WGCPx3>7BzEdyK=FPQwZhO8S|c3*J|=mLUs!WuAubBt6r0oQ zpe_OJ`Ze)`**-==K)nslKO|LH{l$V-+_^^7)mEQGaDyAMN34@(8Cxv%(lk?4C1bj{ zn_U~_=Zg59DWRs9@@bt`E)z#ji{D_X!U8g5i63wsP}4129T<3{mWjZY^^`wHWGoe} zT6z-LoBvR`!-tT@s=?MZOqbTI%#-5w=qXgsJTN~>)yG_+=aWdqbbO|%QKBW6JyjpP zL#`mEQO7_imBvy`)Ms;@H;~EY1aP>hYE!I5GZzPxXD?fR+FVMwnsN; z607%UrM%y6Efe)#o`vN%7{sC(d;~{WHn)uU8cMxvrj;6<)iSA#Ga{7(0{$1>$$|l~ zpAP{oJj22X`R;I(RNSNH8!!wR0|@hnEh*Owhz5=hy&MCrl+>+w3PRd;jKCRfNhSfA zxdNs{AuJ-IlS*Q6F^CTmt{JCZlP3zQzl-mJ$l!rHxhSHehSzY0dkLn8k zkmx~yH82n5djN}W;4+QXmfM_Iv_lVF!=)a>Lz|2Vij0_Gco`4t_o%$eUKnF~$UpdE zO<}YcPEMhm3d$Hc-`se%IVi{_@ETg-KUqx+Wj$c8Q>PseY~uBZ{jGhc7S^1hL?H!O z4_q(C#d2NB0rW0uo9<6i=8nU<2olsXMKqZb-K;M%?Yy8Yt9vNNgys#bIa)1o&sb!! z`6IT;UCHrB&3|xh|4-f&DkJJx7i?^Uo$Uv=vRRIR+-!(^ufMu=MSIjd?wcJpbW=t; zoqDs4erCRGM7k7Z=cp_lY%P+xKcnZlI+bfXiT7+tTfK11l*FRh$T5}hGdqGz%B#3* zt7p#mdNWSX4mH!r(ARy(*FyE`TUSUJ&CYM%%?AK6s%Ujc_vGvWirUl;__RuDI=~hl zv<89j5F6mshun6p09BR(DD4=9e*xe?h(9571k=D;NfSgkvdu=74wuTlxAIF5euvZ$ zHk|i$^hXOcicFq_i2+NKD$rDRxQx1HbH>IsDKidb_E|7ASaXS$AZ3-=m64+3b_=2b zKbPy70aBPmAQLOvP3@7HeX$}6d7(j)WOUJ73+mfJxg0QyqpB5QF6Hf}C=UG6O6xGy~q`;vGOt@KxBp z3J#eAdsQy#)H9m}@(XJgfIPEc0B;E57MA$xu8PMNzk^vVnAHV~CKB*iVU(bz1CO4v z4up=ZJ+kgv1&|L_v(f|~mx$qE$*A`uj`c#3rfS1+idt_+9OSj;D4@g$OyM??Ine~i zrP)axen6{~ycY0Ybz(IqaR5V1`L}kfPA_9)G-=(K8jJ(lk)!rknQo~L4L&e4(9WVx zr_*v+pJS&5t`EMAfpIVzs86+v1pM+!y#?jjY_@793N~a>n`#ap0L#S_#a|K_VC^)$ zSuD5R0vPP5HjW%o?~u!;T5m!)kPRfz#QVhgG}6$LR6R#t>3e;-W_!BBDcD|q`FcCL z0u=%X9RT3y-o(z1{1dWcX|Uc>Z@U{vIPl%~A3CittF*J5FcdE9GQ-&SV2J(|pJY}Q zF~Z9Y*azAQ(`m7)_NcmEyJ4jSX$#73t82sJUR9e{x_h+1NtAw6UtCO1Nnjo`EQ_D| z+7=y}(EwcI@)uQhJVrXlm?}!gFyEv*iWwFg0o}I&agekEQJ+klwu65p2$%VxuPKG zD5i!R$u9GRHiGc7FN4=Jxv2-3NX*D}E)R*rNYLr#vg#bDpEIrB$KSK4ty-o$YiT#6 zgjlJkaiyKHFpqN?Jm)&0M6S>cjnmdi`ixHwW$#tD2u@~umKng#(NpqoWwn0G)-l5D z#lO^;ateAgXhlzGib6e4a;F4Qqa{7lfQ4#RQhW=)tbPskG}{E|4x*R*XjHe16Hwf) zuGL*{xE^w?4nyj)Xw}KJ@X?0F8 z2!;uJ@RU99OkMUs`9Wpomy%`=Fii8nwKjWzzHi-T$2nG?HUH`%9?I5VyAknxSQV$O zN2FR?f$ZS2%-mOz_WsYOKiDR1l33!GV*T@g0Ua8UNNsvx^9fX=bUxrK1=I~M; zK9eJN=*PJnmI+9$#^>_mVPk~mK?nyC;-@%Xa-`E^x6YEgdKUU+y0o1juUSci>nwQ+Sh;$8(%|MAJLSK(FZZ)E%1>Oh@rh$P6_N{l$@SJ@!Yf8agdAyCX z_!2Po20r507Af3Dj9QxU83z%B7RhWlCMr~Gy*LXE5(JhZFRVdJ7};v@3^i%TN>cns z#WGsJ5FC*ij(}@t*{G`lJ+sumc!`cFQEU=LX zvG|1PDQy&L`>ln}J`@}I#m~N$-iXWUiXZR0qZ_9V&cC=X>Zy&(kIK#2aFq1pE{Fy}{+{PUO z0;h5vfRGuV)$sNNT11v;4)#a>YPh)PP=2qlQkZVuJIkeMGxt!Q9Z~sv16thYXG8Gh zO$az&Hd_D!W(e3q3_#FPE($=9G9Rt{3&ITT?3^40mIaN%&kGwH#pT}f0RMMyhX3W> zbCfB;{ICE1^*mt9?{4n7WBX-<^Q77{oEJkBX~x4=<&lAc_Pcj>FN~oBhFBpx^;9Blk|CXXX#|-H`zenFyWoqcV>#$gPV9Qux`H2e@MMOt}!ONjMv(_7V*;1pn|{N5-Q9vzXKQ>f|Yswio;}T7pV=6#vvxsqk}O zwnv6E#xHo21CZfqZ5fW0g_Vz_z}5+@jhU0c8fI?ct?Wh= zHV$<`RPfIk)cuh)N6@2b&QL89||uXW3{Z~MKBmCGTZWT zCk_cJm^FhQilABBm%VAYM9V@$_sRjQ*p|#5w4~ju4MCV(Wa@(SGZ;(|g<|cxEut{O zoGKA(q5$f0dC?9|^jxWq8DSLs>ZQI^L{TI6CpyXq4oF%nEKExfFr==>0B2SEosC;H zl7rBrGg!$BxH#kMW*pkW9l^tp%k&zfNA;AH!>A8`I$&3-bHmBMNNRS7$}%%B+apfn z%{xTXdWR_E4Ld}MTn|FuwrLOzO;sWAxnu_qCfNKK2rb|K*bdQTM1$+Tr3}r7z<2Ql z?wTE)I!aI5K0FI=zMy^r@9iJ49`Hi+o8H<&7cegdNyO$V}crg+YiMFFw=p-9yjg^7Lu@ zoEfOn9QDlqRkR3yr#N zbtDe!reM~25k}S8FuH{?)p)O5o>PXj$3~PHNezO$Uauv$!XDdTY=du#6;^>+&?kEx$vZ>qP^K|(_o6}P-x;n zowkkZqJY|JZGQyKUYQW*z_m~Lx>98Gd$!_m3X*CqWBO1_i#7%AiEts``q;$V_Y?F} z+i4^Hw0eqxj!8_5kEWD#90=Ov6Iu17RC?lKgatXggTzIUy|5tc`9hn9_Dt(l$ONQ) zQylr>U_5e4?!Ou7;12iK!-OE;%Thg=Vt<~K^&32kmie@mJ;5=oJ^ zXz@5XIHqirm4}qYuesl&htv;z(oT=!Lz1&cPPFF@hHCnS&)TGV!RL4g#>UacJo6CL zqM{3hIl1vA3OB-f9vXZ;8BA0&Y19H`zl4X`9a^mIm?HK^5Br}|hO<;SoQO7^-H z``3P|gGh07{j8W(^KEUz0C8;n8tVAz__Y99*Zj%xr;4D}OPPeKpE2VX*{jSpK{l(* zEVg2?aqk%n2J6GUZUV@_F}`7?8{BG0(|y^!a*#=`;%>9tSh|;o!Hm9?2E+Nl)TwYs z&hGZ)x-)-r7qk|+(dcWzY%=<0ZgtO&nhV9`I`OzzR}79L?2+q!pD1Z8MiKaujw4|0 zmlwZiE@Jfv8p^cs!urM9QQaeu^@xIX)C!#y|KOOqPG!FCPW3xaecbFBVk{ack+AxX z3F1fMaH2hQ*Wx3n3-%6nGj}sfZk&1MU!SiT)#{Bj=B6#Q1!!al`mOU0snu3}X!RD_ zVoKE3Z_e3P@$3FU^5ndY{EU+O zIYx_bG=u}o7$+P!#0V1=9B7<+K3F$}uDgkPs8i=#$q-6eBTF51#RCrm6@ziBbDQzt znZH*;Q{Q2(X8RJqWag5U+F4mzC?HxUXeiNbf&99+k^JHV3QZsrWy94fViR~mm*kNn zkH4Bn!U0lOdEx)(QF4Hq-iFTL0;;PV}#pn{TMXl6e@FzP#7=9fk5BVgRRXl^-~|MbM- zVfHj5k*wu$z01V*Mw-t~ur(VY)$JY)RJ#08AizHD|) zXiqlW*wewsh5^z@59JwDz1A)3ggqse!>c!QWS5aHP%>y>-_M}6qY>++bjYr)!pMr4 z@lm5IjdW$>*ho7vyG9_`|ogjrbH(RnyZnZx@q zAA>S)q7Q~SGUSRD3?DKbEEuuC(c)Bt7K**e6txqPR-5rM1rWs|YTzw3y1e61Zcc!G z*?WjIDb?QnM0|leY^Cz8>$rrqb=@O{9fzly=PUXxt&`s6C0yh}LoG9^=17#mqUnjj~km$r%#Z&-3@5GG~G;0|G@Qa{2= z*>^BqhrlS;tF<4AT0N8hd1z4m6LlHIwLx<~ps8}mhvhgmHTHX-r9kZT!d@!KyagtH znPZ9C_vN=8vMiw7v8$!z6?dg4$la}mX+AWZ_^j3YV$9i*DUwMrNZ>FWDwx&I5+YZN zU$qEi7!l(You9LV>>j-)yEdeG&OMa`xg!bk(bg!y^l&!Zq3ioI0y()plnv`WuKLZ+ z{GEP8kRq=jzei(026#)Pz#{~wVP>$XTgxCGYyTl$TeVk&YAv3T>K0n7o$?9?CPXK{ zmkFK3{4b)9q}<`J*#f24c0z6Q8WwagdkbCqis_H{bH~6&*owJ>ZHN8sjOa?Su<8H8 z7~_s4(LJDHa~PcmHXC6Ogn}DvwuSGn!WF}MN#DY4#G>(FauWSGa2^6UbjzUFQwge- zzly&fX};7Sv zY+f8|lb5j8>BZE$Qe%ltwrKZr!Y|PjFhTyLl|I$}SDJedfo~2+{W?Xq-7uL`E1?Er zWC+3S>TpyGHYR(>t{jp_TFd{+0EUW2M_Rs_%l}GCI_uP1CjP?oe{V|QBi_sew4IC| zxS5?;a|%XvKQ7{~r1Qb-o!m%ncXb4->;H83erf$&A5f-OyL*fF^_kVi_Ry{x-wvB+ z37q!rv#W%Dxc=WOm$ZbWaFvo$*)l;O4;h3FsI_`BZ+3XvtbEizKss6is8mrL*YAr{{0*!_|sRJMh*tYVe`ZXZ)L(D`2&+^>4Ae@pN zCtNtqfoLQ>;I5QYSeuv1<$$j}i$QA+)kcrm9oU*3oqbLH13`6d{R1)fvib+;U)Dbe z#2tnob|gI_qJ?0>+ zt01D*vQSG|*SCgG&x{c%G_{F5<(yP5dY}Q34agqRW9}4hrjPqzC6`2t&u;PK2z!2Y z2yi7)pHS2=H-67P>x0=n&>PNw$W4J#K2}AMQvzgVqXc7J!tB)#X||Ry88JK3eYEFt zK@FTnk|F>LnCy10=aK+MX$=bP;)~gU0PGA41TQ*pjM9 z<57?}w(9_~$<_>o(?nj+QP7=oB%RIoPNmYMB#t=rxg#!!9GohT?hW#Y(?PL1a^|z8 zZ6PJlB1bU)jzlNqxDY7SG*qe6Xw^4c+lrAmjOr>;YiTsj0K$b$;-%h1s$MbBk=6}* zC_zH)>omuuU}Lu1KKag;7O+J=kPfMnJ?jJ#3neE*S+0RlYMXOK^uq;M8*J4PSul;! z&t1w$S%Mf!(yucXkH$21YbEI&&%5ClBZxysn>2zvS^i04a+vat>v`T_yuq7&sc$yOgWrlyB6YiTy&~d_ zMKN_C1?LldfFRT|xc-fl)B?Hw%|=wgqW%p*D?da1o48mWwBx4K-;P!vL5f<(Sgf#} zJ28#R6l#`?Mr9~AwyirU!Ls-BiS+dQxS*%Mi3@r<29a{-!R(D(VA?&UK7niB$xjea zvCAN!7D^!CfXh{mj;scNqs2=LY3N0R&@?H;lNpaUK_XPJ0lpH*in}#y3~j`ERS8eI z;5Y|AlCX-0@y9&1jVnmntUhIq^=Xh}=D>lQ8sB$&JZ4zAap3zod|&Tea;N46VZ8<4 zrv}^p{kE9rQ`2Op-8*V7mscGt3)>XFEwnUcQ+Poe32mfh5!%SgZ6;fG$_2;R@8Z30 z3Lk*C+IcXLbWdoX8^RYt<>nBUi(tmS1HJO(v)HYz1&VK2JxTE=n)}AOQQbt~1fvED zS!+{xRy%^0CpWs6)gEf#`^in=Y1re=nFBcjZw)E=ldIVv?6&I0>>nIR02}c1AKFPZ zlFjcU=9Cd-n`!Gw@&=vDeMvIwucqb+JIf~%*9NDIGpIaewS0A7gei^1X>uj8G_f*R z-DPC~L(H|wv!`&OXz{@9lcbLb@R=)Qoa9Ib;!GzkFsy%J*8Y!lSa(~+a)qc?7DQa1 zkZ-~yKDL>2ogo_`@#S*{h)nrEWeeVOx)qREZE(k4FT!WfF)XWPCDanwjgH;pyW-vd zAA9c~Y}a+&_nlw&$Gi8whXdddga}YN_Xdd`U2p_742e)22M0q^WJ!i}%r>k?Gv*(f zn#F@VB*jrVQ`Q7!$YLzjVp`VbG_-@rw1wED4A-oSv~&b2R6;wPhDwx#cIldqr4H?= z4y)3&TuD|x-?jEW=iK)LKS=P$WI#yooO^!lwbx#I{oZT$cvQ&L%Nrsyythzq*Mf&k z+=h=AhfpeP_Gj|IMfS?(ARhK`Tq?~}Q`4aQp-@!7BU1igq5%cE~{DdLw~aR zg=X!Kjq`Ji6ARSn+Nm70+Zs4rSg@@qC2cshe2AiVc)QR}a_t~!pz~KNnwk#K@0o73 z3yg@SumX}xv(+!8P_r(L2Uw2CD}e+b zr^7+L;MOCCl1K^6PR0=5poA%QVz(P6?jIFac;;J~*84pS7YysvB)}w&@GD8yV3kN5 zq3a|Zws_9*UK);460T0`kFm%zIOQ}OZs1w;{A)QtQ^*ua%WJ^wr~9^vs9J{Yn8v^Z zd|J9k;7Yc;rbbWj)3|OKIs=;Fr@Z3AaU)>;wsywUNS&l3>JQ*V*(r{!FPPG{AtX@? zVo~(mN9fwxkH{r#pHnAIy$B$OK)M=2nX&K(8<}~(Y@X(aK#|TE>C!flvS}43 zl`COPR2tIqBqml@2Mf!S^m%=QWm@k;A-Ikzi)SLku98szq{=an(vux9Z-N9? z7?ByP2=rrv)Q0)!cT8>2Oph*#vq){A&!PQBI5t^nXH0DWG!aoDxA=fSAd)Wby#}}G<`3(ZI)X0XcjbAm3kB3MMqA#4pof&>g zPrqPspjLs@168DtJx#A2GJ8H|rpym{3tvpUrE-Ku^)CsC#Wa;AVsqLe}Z7o;gK-QADB#KIuI0%=^6XYs&aZLP3Afn~i zdy42z#mMj)dNMQSlvHi!b)o7P1y4wg?aF6ntxM;;Ve0Ck<^v*mmTLbN!8D^G$woeJ zYH5Pmld^wH+-cy7*eCf7cyhmY!gDV1(d6o&Wpb{|8P&4(2&Z@~0v!W3JIog)&_lSN zd_7DV1bS2>P`Z66Rx)CSQh2a z<0@q3sB8p~bPji6Y$kxh`kPI~Ehtf$15>JQ6HwaTQ2tkp5mdD;((#nwR=#AZ>pVc+ zg#iCaDIRBl|LHWsf3i(xKL_{&2Y2|Rd5$I`vI7{##^I;fMFZD!X#ncqKp++ln4?Nw zJJmq-+y+p!`xkA7)s9?YTT-7ochMH{GQ*};v77r!26cJcyZ~nyJ$pEiRiLVnJUc6|zJk!XnNtnw=*_G;2d2p&20* zx)l9=acqpCF~RHIAPmbSH5VV#r@lt%>M&PfK%Tk_VuUfcAVwO~75z8R)VYX}A6PF& zwqFnPBMZKL_U;6o8w3doufo4O!$bd!k2%ZFIzBKh~UKV2Yz0Q&n2t8g>KS1j}p@gUsfn{F~fpD@&tbUmQ=acabmIJggcEWh9 zwo~BnVFHJ&EY!+}M|kld>23Oe{A@%kkA+hLBy7PDe%K1c$M~UWl9_<1c4BP1Ngz8X zH;lk`PJcMEu1X&z_a+CC96#e*=EXIMw2ae(@IbF728nfC|Ju*R)q-+^lN7}3dXZ!b z{q(O11{_*>`I~VW7wwY#FxOtXu04zH3K!sAjncFlWlzRqu~B@O8#h{?q|0=?O(v*M z*cHWW6`hA3>f>DTSbd-lkenZ56IWbXdbt;tbXgLewpf9-wAaOV6pbgg`=oHDT(2v$ z<2vQialC$QskC@#ysN)~{^t$a)|RcqUV zqv_R&H7qK}b>*!9(Nk(r6loYd)-$i_V?3n7Gi_Fa6)z^D+-v%8(dOQ4a24bT)Ew1| zkTviK!85+AoC81)DFeqy2Ijx}tv)Zlk>9i?pJZb~4c_sdXRP zk1z?3^mzZ%LL`X^{A~dhwKG5`)%#PgCVTVO+~%A z7ctmGp)D=l(Fs-wuE%J%hs-ZyggS9|C$;pZ5|jm1 zl}+=ElAZuFa32-pDJrudHmH6WaV0S9asu+((Ke4O3?mMo=Coe5>Y_ec-UD5pdleGZ zoOS3peI%DJ%KTkHBH*20vmJTkpNfHKaZq2TcG|J|D?Sa@jgWH8HA2mj5+i-hrB8;8 zq-jc0Alsf%&tD|3L5|~Vy`h>h5&Nr{2^_%>)Tx;PMO;M{V9-V+me-&gA0xkegz zcfV$LA-Zt4L5UIR8$yXDJ}4o3H6xL%d{{wO#T?|@<%B4}nUVt%jfu?`+=gq1M5-}7 zhgiZ|pJ5ym@E`zErInK#F;H^A&+N_?TmrIbM}JR}9a#I%$kR7z6tw13q|&1Hq=0a( z*bzOezx~Bi342BS9n~4E)2Y>1wEKX}JgT2K#r>4~-16)ZMLZ!&^3|%ILO#rU3#v?X z193DV;o^0|KKg$*$e|51)=KdQkBumMb_EO#-B*P@h@+`^ulO`Ov%byr= zW&e!%u57Wc>}c;V>jKaGsk*D~T*nq6>=^>TC?Dd-c6(u&#h2CKRyG77ZOXz~f6R6f zDH~%{=@duqH1)NQMHk_Y=pivpGz$G_kezCq5N&<|me_}aFEM~s%D?Q!UF3j=$Wyhz zZUjOOH|$v?tnUxP5*^a)EFFYSH6)ce}Qrs`{z zZYJ?ff7AKapc?PKh1t>;y#U^PsLH^f79N~c&xHl{SJCEdq32RFN(heLOG7%5e+A;i@?<;5~_{EgQURWzixc_jBRKcjYzF+CyD4RL9)vG6An0ECOFc(`t=X|Bk>LSbzY-s%eJWI( zvAPa*ejv#t2h5CT zjRAWTyv~?CsqbgTlNdW#c%4=n#KYQZJkv}u9fszZ8bH9VV-+TZEG42PnguWt7DE_1 z1NeGGDw^$`444rcFSUKKZcfqexXo@SMq0leZ)=;O;hB*&1Xe)@wEyYiK#U{))7LS@ znOlY%^nSxlA8h1~jRs5q0$nK2vr%Mf2^?5>w&dWBtYjT-7#k*!oU0uf)|+TOR~R>1 zXva*~ArKh4^5g9hMgX2re@gQxH@rJ{Z|F=KU|x5SA<9utVW%i2g=<0jSfUMzla>ZB zqv_{tC@LV&-xQ!o1<my-~MBZB0>5*-GqI zSXylG|AFin6qFuR5z|=Nii?fY!~udzCR_S2ELdXSFKDONqMb{0{$MhN8sOu6 zNtFP?m!iU!9pDu(Gm0vkzTK#7+W&1%Ws?sDm2D)Y!!fy4&g`1msH>St zJzz{5iW(pMuh~6kju09eVc8u-CHs?F8}czoen_*oLJvuK!j>qOA`R`J!=GlsxUGc4 z8CEp|#Itf@<>gT^X!ZyaDftwp88B!m>x`yvMP(b%O0Qt5k-66rE=1`QP`tY%3&KYb zgBlHI2A1goUR&tdJq(PYPeTU~hI0qaXl(|M)<*r~24bXQ{gW+}n%#ac2%;8G17mV) z@YEMCF!J0?aA^TsE&Y)((Nu|0BkDwqqHJEx>{eR;gH~0{#POK!YEeTXjV~A{d=NIk zhK6>VPTC~V$58%O(T}BRd7+c>D?74XZWx{*8?M(iRN^FCd#qDS*i&ZtfJLoaZr#OK zmzGrKwAUXD7e?dB;!-khR&!_r9NVdDixi)g?7s3xbvWu{q*YGJ3e(JE(jC&{!q0Ax_L5eqQ)zCPcPDXjAD8* zlPnuf->dPX-i$6$qy}K8QW`mtwrae2r)Dk}Ces}{Fl!PzkCWib#S{~POSjDyo;vt+ z`eU<84^|IO_=Y@80JvQX;G5R! z6B^tw|3Ovwc*)mJ*w?IE%UYNohGG8PU6?if-RVG)8F+ zY&hXg%!d7_sDT2!IkdoP@M%VO+3nrgEql*Dj*nE#1`DcRKhaPTa{jTDRdqa(OfRie zzk}6IUx$rVm#VM^TkPVS5^BccYPc1TN9-uOQrOYayt|kR#ziu?4iN9wqC9#_78-KF zO678O5ASfOrdcRPq;x#01Kc3}Ue|N_K2+bs?2WZESYcw*2YVc^0Yix}(KtbG(rI{i zFGxr)PgbVL1K|XsYS-;T-!qV+c>b$_h$cf1BWopH)H`Uh1<^~RBgI~1Hblhps>hZ4x_7+ z6%P28_HclUR2<+fyE!nZJ2|k{X_>>N1V+SgSiEJ7$Nd4<(4yDhiKQaI>ZuIb0H!dr z7Q5(@O2Gz6fyJ?&QfMwT+J3t+w$hZ&Wk3ZxL&YpVVhoB25y|5>}Y0DxRQS`H=iS$|}x+8^&mO z`U;;F`>;m&wMSx@VIMLh`KjtZy$D13GevelSEhR4JVuHlQwB?93W`OhjFHF`!W5Z;aFHqeSY!%eigZE&g^@;+LPA|Mqaz6!6S)OM zgBa#Qn4xj!bl40o3`%#FjUpiiQ9l5P`e_+p1;>O#Sh**Hq6aF6CVv8cT)n=>KRlUH zG9~cw-P0iq4ihLcI92Q5Q2=Wg+%g0LgEJ7>#wsqJ3^iT+=+d??FQ13yp5Kgz% zd$@#lUu&9du!+ya+Ojj~#^dPo+fF*l}t4Svv) zos>H|%_54Y4nEpQ&P92QgxkP#l(aUcsjh&>wCu$v1IaWd!*Z8JJDj%Y=ilvuz5 zH*AQ(0s|p3gc>yvjE)9^UqTJi1>AzNWt`78XBkN6oG}PUb7-inS+RlXXnb%)C*D%- z|bDA0)Cq6oykyRf8aA&oM6t9qvj=r*7TQNG$)~yjm<$f#Hh)%-NSeo2x zT|sb_Kf%~=;Xqt#b4{Ru?}`(Bl`5}uM8K22zXB($cbe~_h;Jpgil$gY09yxxiu~{a#slgK<6&pS%H{&1-9TtFTOg_c zjMxodLv!Y}L*=!i7dunTT^u6}c$kiAa!sGReYFM(0Bw7Vf1n-kvKeqz_-Zmqt50*y zh)oCFr;MIl(=dI2X3v1^kW8obvFLo%=n^;G=CI1)3pyUyBJlCQIF zSP~4DmDUP0WvWtT9PQo8`ERGA66AA}{`_%%eg2Je{`T#EZ#n<-&=V7T%>dZ^m+a)^ z4OIu&kn?|P6VCtVZy)FX+Pj4F-`;Tk{@cv?Hy!Y|fb-jci}T<9_H+JC`{|tcjS}{T zoZtHi=f`{g)^dL9l{2(+;rzcdiG|8e6*1wMDrTsiu~1nicL=q$n!Ge6JCZC&p)xGF zjsJ-|obX*i^_=n_ zKWq80r*sN>s+1#swpl+GD9fj&2hxE&7sKibp8uc}!4s6nd|XXF4m-|$8wSrWeX(1Diy@NPTA%DRf?q~;#^P6=77&l2 zfskv%nMNANZYTt1Ul%ZssSq|R;&HcO{mNCoK_Re*^#PnzwrIX?YLQV)ZLxu!*0qO> z620+ltC$)ABrGia%M}oKk}s*H2zeU-OP)GTu`My0Nq6s`eN)crEg0`Q!IFy&gn2cj2oEyTKC7PbX_sy(MCxMk=GsP$K5?wCVs z9e7^Ut0~zPJTAb|@wli_Grx>H0=>*-6;o9Uim=8VLSZDrE60f;mC`C(fO<^}d)t1{qk@2Ro1v8o93O z@jtkc)%k+YS+=tnd$6-irB8N|hjJsIVQlbKJJVBbLYW0n>^oNH>r{bDY5djknvEw7 zYcr7uiNWbAU?;?8>rR;#g(+Ld7{90`fU@buR``j(gP)uXp{Qw+AIP|g!F+iFLKJt@ zxZvN@fOugS6=(rH8Y@EikfoZ?C=&FS*Cbl$!H-0I<8a7YUh76m0)pjYb5mUz(rlLa zU65~|63&e(++T+TNT}5!g^v5NJh0%G=JRhEqXIvx3SMw~k9CxjmGvMslZd#SPL!%Lv0oI&Y<(pV|NOvDT{>mNQmqpH9< zKQ^-g)V80we0bdRBv4M4H8^ztTD~PKt}_Jo4a-Y%Gh$izHu|8KONvVX*u8j|+1wF-UB50ttaC*cNsfi;IdPV*$WwyW0BwG~jZZU@CGEK|l4egcv~ z1k8<2w*88%$ricHPgRwr%RzMO-*ZHRk}x{vNFqo`1(e`Ga{o~}R{;eMaS#T)pLf z7q~iX_X1acSLo`0e1WTyR-OV)h}@M3tau( z$JM`ifvcZiuKt5>imRXY?ROnl|Hl`&`US53&T#erW;?qSd6A}KPZAR;Ha^Crq9rQK zbt)8)S)p}cGi8P;J&f4&_3#2^@{!g;WtM-&a#b!*3EA646(P|TvO*5k-=-P{!P_b& zFkc+1zx&WB;=ASFrCxw?W(qBlRQU_lrqogy^5Z_)pC&5J@+KO+nl?jb&df5UY|)ya zwvXzPI!jN;{<($A%AcZ`jdwIo#Bdg=8ymASO1`YWun#1j?*4hFzj(#R#lM5 zxwZi{st+}&>VBPcKN7>pDGT5K--Rr#&;xiaH6Xms%cNf^&w!()CJ1>wM;`GR*3Aot z1LYa%*W_?LS)KNC5^y}U?#ZQE@voN2Y~)}Cw;0SdP-%^rF1CH9hU8w2UjT%)k)6gt ziL#)qRca;11tnm$)5fMf@Amt5)o&$foHKOxCdDoEGPO?w9ch6fbTpm4 z8X%1lNl8W!$f0Izba^Uz*G0nuS4h}{ZUteTK$)sZ#REpoM?P`NsabadMPE-1-i;`l zoWRLy(8r1!)^=Rg6F4L~8mHLai03kz#OVX~h;`uKG< z(Fdk8(8rr=)aXNVlNE};NMIKBcU}ktUVr{j@k|`nGoa$lHR@9ZL`c3hrMgJf)07v7 zx8a^yq4Co&dadjZ;s;jm;s>#VKvCA;|D1zk%97O(M2Ty_}lqb^_){zInlG_)_99L_6Psz))rEEL$R(Vam166NKq-cil z4f=3i=tMSPWC+h{m5E}p4I2%2f{+J3esVD$~DbvbgZRHU*u)ot6 zhkV4v_8rrOsH-XE^Y$5aCM533Z2u@FdFWL!^`$IYOHz|m|3u2sSBo6ea(tB%`KiKI z{p$nabxIB?A^v4A?-3U<+)k}>Ugrk+=U1}pAZL{B;qNo-OZZ66u=9=MaV_u(_VEiD zzE5h!hG+8G${2QrCM`2&L2AD=t&CBQsi)6s#RKWHs-?EJ4=6;|htJt|_w>Oq6#F64 zdl&U%w0S=$&tUyHu~9$XjeXE86EWIcv0-5b`_2ZpQ;Wpdt}grH6Mx{hfBxB|o|a$A ztXQkRUH%$lwvv5hYKJ?ZPYoCgtHg{X0W+;1VS9wQ#({Hc$z=7>v?-#mRa;c^YRMCY zjtj517c>P9v;3wW_<}_Py!_8LYuQ%zP~*ndFu|v^=ppmvL!^hRUWO(?16Xt6O#l}5 z@pQoc?xr|V!t;4;cZYQ0Fp}lnn<7Nh+?G$#{{|s(V9rPXSH{zRrukYdePbLk zukNhMM38VVK2asrL>qP3Vx9Gsc)S*kY5*bjRP#i=SJ4!aMzg?&g-3`wRqsJ6)!)a% zVF}JkcBijUVkwNCfCFh^kUdh3ucLyR@{bofnaXPx!3^MU3H*(vFM+?Yh|Az+@lLF6 z^5hcLOlCeHXJEvI?ALQ7&1CT;?+mmQ#V{61eckx+YBa24TjCGQhe22s_e76f-h8H`9FzT61m z*}D&rB~UCiJlVzi6GwMkbL4AZLoJNA0^)_!L9A^++bs5(mO`BoVlNY6^)@gLKmsE$ z6vtHcGo{S`yI*>i(Pj0bctc9c_fPpKX@#hU_rNNDRvOMFc354N?}rS;O;sH(qv8X9 zsOi;+?)^brA8^W|&9#+F49#H+-b%|U3P!F6x_#tAbqo89AiahL98y{qq@p|iu;Ta> zkaVa@<&*gRRt(PYbb}-1_gn`ja-F6}<)_w75f@`&rj@5`l2ks?Y(|*GWJ;@$6f?xu zR!D)OM%QvZR@r8WQdgijn~1`FN@DKY{%)4!JFdaOKG=sPGA@A-|zdgqO6+ zquyOtv_biyf&xM?mh1R+DzO4Ws0YTIphW|hnQyy~V-7SZ7CVreuu%pF>I|HdxjWEj z2fNVxZ{!?)+OPxaYZ^Pq#SZA1*g+A!NtBtDKo6HPMBHHqD0rkiP!VF#%U8oD$SO-~!~YO-lUo#SNlx0!6# zqD?kCJIBdJ=_SE0z3i=-IFxnXoDYMHbDlWJAbn8y)BL~*_ooOTfzKj4F%AAf9vWcN zz!GC+%W>W6i-}xyw#w)De~|5PL+M0r)pns4gx-Y1Pufy=Sr@Nin_%Op9k@+zC3`)c zZu2=vtNeaVJB>H8t|viSR=tC|a>|6NO&c?yiW&O{=wnB+L)5)xgAEqaZHKnK86!(+ z!}e7XB>m8zqW*c{K~w(aeD10?uv&lhbMdNXPxFO;q^lWUfLXXJ!oU1fe3~yC7}Guq z#ED+C9NCAf{R(9aV%K#P(vPVcKqzMrEw$rZ3sT?-RXcE|v%x$S)A4y4nGU;`7`dp| zQ?~+UY_6cvg~cu4Za{4Sh_!RuH%;L>cwDg3-Np6AgH?WcGVE1UJZFCdvkIzQdpH2J z)u|P(_i9NkA6A_r-DPHSn&J^ysC!IxPWTFi6je(&C^@l-RdJWP=Nq^bH&VMS$%tqG zns}2J{nJ_fe)~AU*d`fuR#WTe@?>w_yPiEI}X+4Nt`(heHBbnow0tc^tPO zgd;C4u8e9}H$yy+2;m&e1ir(-QG+QAnGY4b2BOGBe|2#$jq^bL*%MI4R@qlJp&ny_ zes>u=*Zv_LS#Ba4z zYtj2P^=M5y=FTJ8lycO1Vv5Si9&{PC4LR~IG@!3M$}0S%k_$)MxTyw$_H28JdxnfF zGq#+vOUL24oSi7pPoD7eugcMIOuU$W>vJ_kU4Ajk0tp|dZ$x+PuedY(~9jZ*^vQ z_i8)KyH^_$nEOIIo9$Uqf=~9D{Vrx>=t12$#-tT3pw;5`7_Wax;vu6^PyEF_c|?R^=F0G!-V|Bn&jDI7Ued`3bGEG8)XGYAIB@kejd?$5wbp zlLJzYg4mRwv8|~MT951JV_#E?dky|Ye$}4DTyXh zK0;k~#-M8W;tb$kz56P{YIGfiYPC)*8i2kdo@r)rUH<}-B!?$cCbdytrFckK7+l(% z5kBPh1KV~AtJWx0u2*=3+NR4KC?HyLz0xA6@gQpn+ny7j*Us>o0Dht6V88(>aLeL(NZm|l?$@#}AFhY?J&C73@ruCynzBZYvpRqbXdf%Yxw%sPm}KotqyI6Yg;x#n-OP;v76q zOI&1A$7aIWkp1*KtsuaEU2y*66M z<7|W(wGMN3uVl}dZEDKUqdlTAndAZ>8d<>cUNj%1#{DEa_V_$-*}&{5f5v44l5B{# z65%lN7vpOqq5U?d7(~ttW1d7YFqEb4wGxIhsz=mH7=~I2BNpv4WNYPsbZ6MD^V=|r z#@&r%efYfis|SYQSfUJL^>{FWtYyo*VprG^w0Y)5y8^chl)!*cdkG5hc#`kGdr~td zY#=QyH`KOAlOw)lW$ybbEB=fXwKc);G+&5FkE$L*NB4|TMg1>Gs?d1Dv>8|lUk{}r zpS4?*8zXu78xpH0&;h08Hx36?RgcwpMM&g0|uC@QgE(#%RKz1T$le4;um?! z=2$9UG}8fum)}ok+!_{FeS1*D1|(h7h?_fVBr@4NI&2kzeamHp+IH7Q#BqAnc4JS7 zLbv6MdYk4Wf#^fka@aM6Ul1SCF-kMb0(yyxXwTbg%j`JS=%lB#%>r5;Bo|dtQih(l z0$iq!Qq$c;qO?70r)fn(d%44X8VRG}R`^!755k%#_m$ZhpSN2qVImz#g~xo+LYv9jH~?otS|zfcq}J4~~UScgwEX@Tr5( zQA&Sj*k{Kq$Y!4%ltdZy(CTyPVfoOoTQRa|yDor%>AVv<9b(c}BTjJj{5ph7`!cyx zJahUnp(;7nuEu=eJ2~V?H!64uQt?&3E!wc&#J=Rxj!p@anK4KSPIqRQC-b=!Hbsl( zbkux()k>)k;E(Rdu(9N$ZWD?>TE2mD$e^A%6oYLPVWUu|4{5H9$x8Mu27AIOT5*gV zb%(|uW0wwbQXB>Phzn%>wq0MOhug47KUH_9Df2rme;!dszt@z%<$>WW2~W-!a}rH} zrwxla>7G0ArPnF+!iU@?mqA^0s@@7g__?tS^YL1|jx#iz^0y%~PAl^^bFy1-@`5xY z^KJON^;(%qjuRb4R%*q7+@~Fi0a@X=td?aFgE-n(L7-`8k*S6bu53FJs$DParFN0b zKFnqfNh_u@5)HPl;1IRYE$=j<)4t5>RKOy&qzkt&Y928W0uQRAIJP-5G>(yDY0EbG z#&PDRCgn=@L>fj5X_A^WnTK0>6y=wCdh|(0rZ!+gE`Uq8F_$TI8NT&s{1%*jgL3mc z`$#%Vz1>H}9oAq09pVgVaDTE5U$b^;Ejk zcWroSoQ@UOJjQTYLJP$5e<1(mAj`_{;K|YUsH!|R6f4W>hahSSp4NZy&{Qf9LH_Aj zq!jWSmpq6{ zC^TJU`Kp{yxHeopLLY3*b?|&8v(xeKA?9@vH5p*9PGI-4P?AdSKJn_I_vHxGMpy81 z7yKWkMzZt)*x;B=FnU!A(|eSw;=qsasBP`4NA8}bHeL9Zw(|}w9G@ba6Wd<5u+4|{ zIhe|4fRax<%=r9Q;K3kHSJ|xwoK$$k$?;vV4pioDNURHj9h8};!8?G-Eong$Vy?oc z^@A^~2&+`pBdyM6wN~+~OXJQRZ~5I+76s}mztMNn)*u;)L2mtciK^mV3)#(H;rIJRp;IhPaO(ov_~1Kuus1TiJNT|zadZy01}^(#%o zVQ$8T?>M^--{B1pIt{;ihKAK_;5;qgQ83XcmszOYUo{({NF5NTtM&4KG1Yv_P1j-w zr%7&f4wb@0I+Z<*U_``lQJR_BjEa>#`I?1!jUSMn8c5Xa2ni!9d%B!5tt4kh1j{Vs!CWl0aCmvbcIOJGs9td6e;W(eiepR;J!MXwBk55&i-`qaoqW_k zaA!3*SY5?tc!S0bbenkimDvp(V1?KCue}^zeOxN_ieJA1YsM&=V&rGe2phVy>= zfj*0ubsv{k4wb)=$xRsmO#`5z)nnKTrM*%FNKf=n2kAp--=yMf3g~wlKoO zhT#^!UF@2=B!2BNJy8M#Z$nf+uI`Y}-|dcae6z8Q`ip)1d+M7JOwA;>M;nO_BjG~h z-Wt?wNXmuAxi!FRq6>|~9=f)dZ}4%(6^TRNV1J5ntvH1OujPQug+xVxkc>JlYT*!w zjP2t^gA)#pTM;i8#0Z`ELYItqR!|al+F8XJ1O-4wcN$s9_bu*LfK8*<5(2i&6&nIO z1VnY#rv?D}fT3d7zo5}dC3CAld8Pv0bDj80LfA+ie-=NmF&x-)nv~eG$q%k=Ov9Y& zfO39lawEhe;Wnem(5*m+zo?$E!Dp8aook^ZAq{Y+4CGcpiZu1#VPGOP=bXo2JY`4y+8nHDw!Eagm2D=AF_iT;T~FJxX#cTzZ}(7jdhylY^flV9j%p z)ohcq{Orl)%_Oo`s)g5^$BSS{H8{!sY@ zro0S`nie5!JvnW+YBVfNx9KpPZnu2X9v_s~MP?65bDMFBUruy~3r4&!m*+xZ04yEQ zEAS0#f)`|&UInrY{!{6UH4BO}lS!LjcdtP11v5Lo`A;=yC!rG^Uzi`a=NPvW;Kf{k~UV|ffgUUaX z?eXb;U1GPX#B+RCdKYp5B}h7cXh!-q6W^Ucm|AiIjf5M2Hf&TNs`W>hd3pp8;v->r zw5tKB@#H!CgEq}=_ucrQf)2Kc@Pq@rNZ;|j6bvl60R=04bT?tA4L3e)lx$g!(9F7y z&Co5hS4odR~#SFXQY?cui*Lr zjzvZS>Rw0z9NaNe40+5FLpn|~>>?S%S8xC?dpLlXiUWGnZVv1Rs$EMhK5R(oFi({x9DQ=`_*$yjoE^eZDfslm_wX472UMS*Ex0G<_Tz+2 z6@p4lv>q1uYEtj@RdpUO!&nY2Qi8Z)Dtc8`_*cR*>C%KBRuaJ-i@$ zVKrdgGKdR&LZ7Od@sP=#SgCG0#BRa2nvclSIkg2h30!7OVO;zOPeXK=O!$6RXG2Ty z9H9g9ki!x3y+=G211_NfEP6*-47flrZqdW7ASwBx#*ggGwm+D4)>dT)=KpnA|A&Mio;G6tK{>G`O zXYUfz6l&NGC$QFdTfvhI!jHcreERKaS&$FxB25sx;S~np?4qksr>seFW)jK8756u>8nK|8LBsf7mIP=V>#Q1A7k!=p zIUADRcc?ya2oleCRpVW=5wpTk@-f~Zd+Jtm7G}v19B^|5dB|a}3q$J@y*K&C)Un~DKLj;SDibb$Vyz!P0iIG(Bbxp7r^)ha?B6QAnNc}T5;XJ6? z(Xx+*rw9dNQ|kqcjH>LwMxZsMD{b*f=uMHK;~e#sy&TjD88UXkiI@p^CEL%7Ze**7 zh|x^eP_fqaHDoLz0%OwwF5Xvg1LU{?@*2mg#-Z|!oGe;qyD8-m+|-6kh^Qp&Eh%8O z4HdRgsB@#M+*2PQ1e}eE5mkPstg3ywdYkkOv*P%Q-<(W)!0{q{vH*@kdJ1tLGdC=u zSGa2b*=Mbt*%JI$jjeS7~&Knjl7~3PD}!89xVYk-V^C; zK>{)7QKHz(gerqHETmwe?!#V9_rT$LS$>kewH|}X6KLs%AZ@4jzVtcEWP-=*Vc!GD zV!=z{BWNIsa>gbk`Ieo!h+bNk_&AyK4>N6^20)3p7j*QvOKL+o)Q?lt72SpTl z0E73ZQAM~gfw8lZif6fi==jPOiEZ=&rGtqa$>|CLU_pruz6bJxB+C+#WdR0vD>Hq` z0(X)u?Wp2!BBg;ft|7uE5(9)7VbgTAo6nd^)br3{&>=Nv;SRd5p!zBoQ64<`OxyLCm&s}{Hwg#`nv;)%-=l(Mg4%Hp$T7iO&3ycV{9FA*^3FoVFja! z!ye61om4E`^6>^@QaoXY|4JMb`UcNrVFzO5+GW`u`N;GV!i{+QWjP)&{3AL$pm}Hx z0X!wbGp-2Na${Uql1Thjde}fRXj}ZW_O{}y<~qg9v!{elW0xr@w7ImP<2~i4Y}|x* zL0`_hAA_N<{h0dZAA>exA7sfJ5*#)ubO0E@)0p={lFOTu)J9*7g)>5PFJ< z;tV%%U`MR8R%f#Vk-MRL0GnkhwD@3-pkn2)ey9mifVQDn#A!5vAUebiBrDDCnip+> z3_Lc0@r4~>VLaotYUE+AN&7&lX|9RGLLFgLq&G;(IRY%95qM~;Jd9uhpLT(7vka;TaFJ76S3!QxA8VqI%l``{CwxQNaJ~69N!Zi&VpkW07rXIIXdm?F z>x0u67MK{us224^r!9tc(Ndk9Jq69XS!x;AZo(Fkoztqw!>M zX-k4yrsvovOe4qHU6ifJWxDWxE0Q6yNYH@le`>}CP+@4+Db~jCL9=Q?q1*a5;@u+N zR0jymGpDoiceD;gMv__Vp$R@eNetg+q^9L}bBE^sS;iOt-(NF7(D9tdNQv%Evv}z% zSuJ1Ii207A=x=id-vx}ttva(P|E9(Qv<``f8GC0(GI zVYno;MnK;#f7OgjdQg5n4+~-#c_RI>`{3(t?p|GcIxRPkw7B8secW8AJztlbN1L0I zEvmf5X!bOk+#-$)F7NVT;OwJQX6W27@VV|VB;8@qy}4n~2Lq6ha~OuC9foMbs)=S8 zNKk@?eHcVo8r=sp1xXLc>z|fet|%FfzJ{ZiCh?LDhtirDjzYts{2vVmSxu&U)n9-4 zU;bMa979oYWw4<_rsXR}Zu?q6pNYMt7uYaVTg^e9kH(dG%ye#bZq6SsRdefXGM-A= z<24n=Ld=*0`0g1jf`LXUXNeW`y^`HO&Csi`%OpD>WV&JclasAdF6tIycO)BWVPIK_4`y zon2VR&l8=}f}nO^i<(%SX3j1OQ^Jf}7?}db%|@pGgFBQVQTf5^J|r408Hqw)BGJA` zRGONTC}+zv)~g??e~#Cid>p+PIR;4~;uyITEsWJ{7%>hMN$H0oTGLa0H3Lh)bDP2Q zFXRSxr=@m@*AfH}N-w^@zj071Z$J9#8|A`s2!V(uo(3Y~EiQ_=Z@Gj>#S%>3f zr{g$0KSm8AI^!G%-Z+G~X!y+7U})D!YvTvK(}`@|j3Qf4pIK@P1y;8!=Kd8nG_R(I zEx9|ey`%Ji)H{{KQub<0hCE09N6+UtARpg|1H!UNFCal`4Nrp|Bx4I>FwwQpR(M2F z2t-xB12n}XbeZkIP;Qb@dq~W>ugPdSPamBpTnb#nbROeiQRi9e=scg~^}xY$dogmb z)9XBeV+5T?3WKcN^3P@O>^(%F5@GLxb#OYtdM;!>FrOEKHFGj2A}KP*mTkz~a_tfg z)MUfqSx@B3Q$}D7=>T1n0ZhkElQo~L6Mqgk$ z%NgPOYaDdW_P+y=59NRn-~ru$ajjOz)W0XeYtzVd)&8`ImuwozOBEG?b-F4T`~zMO z)2MGR#%Z)xd&O8_ae^F0(q0MvO~7~5UX|T|^2zk(jP=^U1+mm$7HoMVZ*yP^m%6a! zT|L^CI^e@38Myu@ydD&TzP;#xuGg$j2OCK;BL1Xf*9>KY1=+F7qPySGhm3a>hZr3A#_bK;xa}R7 zdrA3gW{+KKD_|nz=FkX)0(zO3RDl+-tl8zi`#p7DB3KtowrP&_8HTvUoSzZBkc$O| zrK$n;ntsF3h=IGe4X@Z2GU~GFV)?TwKp+u@;KG~qzhDlIL3Q*RZ=`%oAi}8}xENmp zo(=9f5-)@CHE`og9$t(ux-jUPUrHJ?^UDq-pXt|L`WuxGy)J`lUdAL9)zsrwpB z>TUpfn=L7^%~pu`d0~dZ!AcVO!9JEQWS^7~YiiVX8y?Hfhy`dLu7BloZYEm|*CY=*_4%EY_z{c6L`tuEI zX*?w1k|8ZvQpQ@=n0)>E4}a%bE6IM&wp4VDfU9d~7;>Kb-F3+kDQm1NX$A6JrsWYS z!Mt==gVYemk4ViyYPi%La}!Jv{06BArYGoq5KJVG@goYRb3&>>I+_CC)jI2NNi8Sm zvYb7IYHm)KTq7NxFO76Kr;(E0;TkEfa@R-!hx`=DHO}rv6_jtn-5%1@U}vI(HD;H@ z?96mE-Jf&O86`$t%{`?il-*fs>YCVr7p9kZ3+fuJA2FH}91j>ANAts0Dqrs-&ywkY z|4&?BTi8r31sbWPkjz@O)L%?oq*Hw=n+<|~`i+bz;h^dFfPN#(y83A^=%=QI>)u?S z@ySb#a4o!N`YGN*(@$wajz4wSn^>jll6i-%_8;%KnrDcPOhJNWMwBu#CunydsXmzY z;w7Wq3Ef1h8^4l0!Ta(7N~)7VJ;$#GbNmYTjXXbz%Xw59$$12a`3^nFO-7QrE0J~r z?sZZhjUh~;yE;PE1FGQE?m}fA>pewwK13OAt%meTJH&PGwf{0gBB$`IlCrJ-tp>JJc zi9T#27Tud87C9RmVsRffxHe)To(!UlSiFhVX)hAX^9Heu8EGA2gbvxz7+ovav@Q}t znHOvW0`-wl76PH5)@ewn0zF44PGM27QK(CVvfzZWAf}-N1L&pX0KLd*tZ$AgMl|+`5*O1QsbEMqbAG#)`%G^YqIDXZDSQ9im!E9;~JyQa$(?2x4i@0u{f>KCN>QIH#gcaP}Ul4 zN#FrwKgdX9H*Q!+VGQz`z5m5j6v>1qjT0M(`}&@Dlo;Px$8eiS%=|? zNy;k&b3>VK!`5^o5h<8%LpR;z8*=(XeFT`=cx{pM%*L|LVjP?CP2G%qQ>vlD<}7|_Wt|*&tCW5;#fWBu z#PmE*To*`81x@u8?h@qDVOfc$auLXdnFAW}s9aJJRn}sZYQbZz=#6=Wx7P-`e#lIA zqK(`pXhU(RZ`rbE#XxXq;PzCmfGq1~*{(At8Vm5uH*wU5L{DsS~^9Le0`F3G&j|Ft<01_JTeIB1DGW3`@?{yZLBu z5={V}A4{{A%K_a{mH_h7d>ORAw`Bu;sD%f)xIg+bINvuj*9e1yJ6h8MAcU?kE%y2s z_i0-6L67+|#G3ZXAI-F|cK3@Ad#{_koLw;^UG7lb@qy)YKCn!d4C@$V z$xsd7r6rCYaSdDCuorHjZ_AQ#fbKNYDnV`ghtlLMxMA_j9P=t%GK)6=Wj>?`6d!Y- z(4J1UKBU}Uj6S4u0ScZ9+mwWI=x%S=^~Mqci%QJbB*dBWfwCwecwW(YLl4$l3|pE3 z&=O1nu^@eX9RnD9soz>tG4hcCEj2_=6VB63dA(#!>1p&%DF(pZMnFVGlC4oO_=p89 zA(lH3=8C&}&=OI`2g(QO@2l9IeybCbzky4cXfJE!3$m=4olukpKTc38; z;8MiGA*fc!@rG!S|E7u%8$;ZErB^&yf9DszB$Y_+HRKy-CN538AXALxH+$OvgMlD@ zL8d}8sdq;$LdJC~!G@aOq}egQAqJb_c+DtaAN+Xx4F$)8i$c25`BK|9pWDjlYUVaj z0niOLf!e5L2>vH?QA^ed%M7yMKT{@{L7atz$4=BTpNm@BjcX=$H)`v4&pNm?a3v8MLVP?l{O!H<# zlBPcbIyz|U%3|?A!|K(qYq{BEW6tFqiR7cwGYBM8v?K#fP_)WuhSSfyGZ{$VNam;p zKq#N3oRP4M8ZTp$GZHQZzkSh=4M+%N!&xAkKWtp}@Cm)Rl6amh+rP-Ag)XdAP0K@C z=3r!lF(J)Z{Kv_rV-kSnSF#KWVl;sA=0;oBuZ~CGma)1=KdE0)@0g&BSovaZE7az$ zeZ}~~CT}yeVkX5|GLuPU8-^Gs9$Ji7ZOLq)DXHk2L%nIc%rP-B4sIej6Wg%eY~yxq zy+Yw+*mEbBnO9!HkTa+#TC7G%MPq2tqe6YM)nvDxUPUp= zRE8{+DUx*KPLwGxE0n2<{`$656sZ?Y6p`~uP*&iP%6y#9XbzWb;-KvbJaap(0k2>G z{vUni+nx%r2{1N4Y_@cPVM+kPu^2P#*RM%ovJ_F9yrg%=OU>j31`82H80cDqqSw0$ zlfE@KdCw9>NCt}{V$x@l{XTyM=x0bx(ox)x1+0mKZ`M{>uVBpjJx zvLU&>Tr~}{Dl<$r8!E+9(cn}{nE1Yrz`gPVXDBUI-@=7%&FJJ4#Ed5FWAuigTXy6=`ySgK)j44!M+W#0PgbJH#@04bY9B{!6k)&wAF{c$5; z!SR^tWWc^Nk3cp_aTD~eO_JgS2np8~ePm7V#?ePt*mzWxMATE2w2sRJug^9~QK!#EP#fReI^SW#ew!T88s6 zJyX(b!h)Wzl4ilrPE5~(fpNmFRfNbPl9FZtq%4-xh)NnL?*#N%7H6JkALfw#bhTi9 zDXqVc852F*R9bEl`VjUnVNWC_Th9b7I#+>=fFR=pQ6<9I5V1^$j)@mT%t%8bU1)wt z=yf;77ncheaJn})BpU?5A@6obVgy`G#37N-R-rSENvvqf)aIwx*cs2O0c52PM5&1m zUCxxmeyduLz+)MEyp-3^HJH+}3RVt68kCF?1})W?32tkO2a>lkKg0u|S4J=|m}rmsmR(&zg!{`)Ze- zoE1s{h^A$)F)a;~hLS5BGyD8tre!AYr6PjnkKowaelbdC86rl&GoX$EPfiJVzU{;t z_zA6l$F+BPP1eP~2+>O~K*nZuN+?l@9j=Hl{-!6TqJ(nRjeiZLukYkp(~2y8rDU#H zB_5cXv?9e#Oe<1gMlSpXNq*%dLS?{243?OU>Os$XLEiJrl~nG)==z0F{6F7LJESRK80x@hvA8~th#J^fT zI&>Z0)*qmZijRV8nAPo#T)XYK*t<>oCJ(TD z!MKn@9&IFWE`1Z8X6c(Mvtc2R9(kJ8jCia zG=5`lCHa%g3NyEo3?F?P@1`6}XwPsQ+Z;+3Mx14kmWkTv!nqs$AK34UCIIw?{;x~- z`xbU*X9%z$uVD-*u+pfr4r35p0JNSl2#nScunqC%ycTU9V$>Cix?R^xe_Jw%OD5)> zkMBM*0plnSTI1Uaq9%j2D~Mzt;(;`a7y{`kxBX5c##&Vt14gPW7I8x#B8=c~TtgNb z=ni-7pgXLwF0_3*JSx)5Va}R`3MBKlH@jmIm4SErScG)qPy;dg^yC%@mx5bhQ!7L4 zxjuq%dwE>@t`|46GQ!Yo;tD?7psK~D3n@aL6mcTg~kh+8g21{020@zX)Lt4UwA_(%Nna?xI=!E-Z z>*PvHu-jzo1kjbOGctC!g~gReN7;xP6{I?#u_bbOT!TEP8EO#9oKfZhi{{BZki1yp z@KE-lG$vP6O1;RFEtq0c*vfQ4ouXSLaLRr~2j>4uH)f~2Ln_pCE1KV6D&vTSHMYqr ztGlZO-){9rKwujVxP*4p8Lje3Vi=||Rtx?;shU`F1Kp^G(-Ajo`JL>IK{dI4*4xD$ z?pM8C6=~I!t<)ze@>1ML;$Z|y?+ac7ZEQQ5Z4BC?fwp+l9B5;$tbiAvp7+DW~%n+fTaz#I@2`eCNSk?^5*!n%zkf=@;jkD*2HR9tj zmWFR*p%#V95#urGbXwAQbp32WV;M6or##% zK)qy8FX?4IFQ^yhpkCS#YFkkjs3<@^j!=)+LJf=yHY}5yc0r*4Fc1gyo z*K5IJUN_)Te6a;jC8hvx;NZ#SAUfR?Iw&am8rYJQGXL0i{QoAF+iI3SI2~7uK=hy% zjU|f6Z^oUZrmXM?LFYXj;9QlnGgbj8k6V?1FsZc)0Pjr6!K_V~DjaqEkMGKMhRV?t z8Jv(+LaC>Mjkr0$WyI5*VP^-d2-K{vy+`m2-a-di?OpXeL9g9pnh^UC*4Ei%I_qvS z%>=~tfvlh9zR5Iq(Y2OsVjyJ0CewUnxgMw@%Uj%t6|1WmHEU^%u1?dFS;1~4^bk=_ za<3VRh$rqWPR%!GG|f%+@Tij;2>#oHeUPNu(9Cc1wSJ2%0eX4~(rBNIXZhv$DC=*l zT;+WE$?)cq8%j}_YO77djbmmB6E)xk;<`HdkC}bN)yeG~81vgWV1?ey0iksRE(yM{ zJxs?D-s~3{P!`j`#Y|~hFn2!rgQ^es!asPHi~BjF9RI#*L3Q|7{K?7>JNY2Xux4Ap z2E)9-Rh3`8!YKkk$4a1FP-?&ykfcAu^6%jKQZ;iP=eLPe&aTX^)ddy&*JrNbGdJ7W zPR?%N%7NALrwjST@Mze6Y5~ae8So4&$KU{emGlF*Ln1l_K`ID%8cime6IMyqx%PMhMars{9m`sJ1Up zD4Yr(=Arl9V~XqVr8hy|8CkVe?_P$dPF2*J2QwZ-MD_2x7lDC>ejodv*RQ3>-%I$p z?LIWE*OGhmWZpb^?-(GCq_-}@L{&!>ZmT+0YL>YHPrp?_?B(0)={E6J{2^FVL{1P6 zBj(Wn=vS96T`1T7H{n9B9QDg`3=!FvNrF{}5S*%4Isfsk8+?3%Y{1h(k({^Ae99ezw zEp<{uLHE`F-H{{3J-bZqS4wdQN>wSLd#LEwEox)kKF}XAQl4~)Y%xq75!okNUJl)@Ce$3 zAj^Mdn`V^L5y;X#=p8d7;KU`1ZB~K%g8gm9Xc(vkg^Qp>Nj!FA6)qPzh_os7Ea67A zFFgRMJDD==r@3^wtlo!)V)QVQa-P+{pZKn0K6Lf7%})zjU8S{<8p--!C!FdNxjvD# zpUCGwkITV(O!>lU#! zs#5HbX%4Soa$m1E;m9s*`^6Ui>wzYdj~5{yi8GG&B$8oTMUdD#dLya-Ao(x`obLF) z<~!nv86xw;RA;slppuq)akcz2Y337ATPpFZ@KIF_uCs$~(!hX(CbFbjQFG|bR z14%nuMnMq-%g{8qp%CDY zYfBJsw=jLiQR2b)CEKaj7-c&dKghn>#SjOa@X+i%(=2b05Rsvy%|Qsb5%JO-a#RYu z9v8!*MWH}U;G(+tM*7GBSSE&O$<$%yFK7Ps3QZjQJ!`ElPh~ zLOP+tRu?l8Ev+s3roBA5$N=g7d$7Bmy^K`0b>y4-h@u#e%QE(xsB8eqF@Tr2vNS*i zwZg-4z09^k(-Oc&s{?i>&v2tq!dR>uiEUWu*8|OSOXwh~$_QprdRmD_8$~*30+o>@ z3TqT-|*hUl9(l(LS1qj1a9mai(v zRQ@@#kOCn&8+xdyP4Jp&ITP361GtoY02n_LFJW*PPucQ{3)pn?HxbSn<140@R2TU+ z1sBQi81m~9N>HMFI2EFqtff64*Y>aIJe>_)3+$z9|6Ah1AT9DV6(B?DGwrgFY9G?uKnPu+WvguW?x26~LexI9CEAc}@j6pi@ZNHccZm{^~E=#eicFeVy6?-A%@(D7X7gww5*^S*)7d|42nW(PtRH#idG8s zMl>TPr=2hE$aCMdVt1j|;D<2D1(_!tvyN5u?YtnAa|jUd&hi)!6wUryw2 zLjW?q(iz8;pY1pX07L}>;KR@dHaMAF(lS81`SX-W1#hi(qCJy!YAYfIbZHC`DoYFhy`j9CHNGd_S`Jeq^B^S?I^M zYO6H>FQXsTRyws|SH#XxsCGgEQ1{k244LRt;99iuLz5H42(GnPiCpKCh1vBa(2Q`?cv zOv#@5gLbYsg6W$*S85EsxC?Z1wX5R#>CBo0wV#T zOWA6bZJ@wtSsUrte6dwvq{j#teXj$LW}?jo;EAidM!asrBSnV(%MHn4=oNEJn~|`L z+6m->4K1z4)D!6?=r{!j@I?PcZKj=@W|`u8=4ssHW?RJ&nDvIHC*il5;Z`)BqPUY7 z+Z9@Iely(gg#!5*4L6*@w>$S zhO@ZM#)%n!@;S3|t#OXd8-M@CjK2*`J`w|EsLq*unC2w{fWxu|U8NE*X%+7^ua{YR ziW$n76`wF0j1Wk)!KBZ^(8w)}HW+S1*%geO_^!+< zkh;GOt2o$SGIq7W1}Zps(fFu<1hdhtF)*f50g_b)n`XCJgbq>LXFoH@@$krX*iTdb zxBkCEm+X&DaDAv-a2xaG=E>Us#$4zp8Gln|A6k6$n8>h0AR>-~dXAzh#SG-h-2~T0 zuWX!6Qpy@GE7f{VJ=fE4*#Z4DMVju)wS`(ON0;O-WYm|@JP1No`gGs*>3*wEn~fly z17smu#ZCE!^l8|!i3Rz`Q4Vb{vTV_=yIS3Pw;KKK^pZiI$*B0cWQYd5xS0t8F&}u+ zRKea16Wu>LQ7Ri$wIH&*Hj33;JkS5rTRD_r)V$s%9YONBQNLtKzb4SMCD@)&xc*~8IF`K<9a%i@rN%Nh)C?uEd}AN#`{hFA+hDbiD1m|$WlJJ0i&vq;#h78d>_<45&k6M6>+$bup5RKw z#ij8_c;@yoxRFthLaGVc z1s0};0__T5iYNcDd2|)O94LOt6}c@kbQfYznz%dBy%_o6svR^M%5%%Tlr@?g04lxKE!kA2q(P)+< zxFD;Zk(HVPVtB?Bovp{D zEvY7_YfFkmD~90O5)N2-D)EL&;Wp=|Wc2yq4^Zh@h&D9na-Kmb7I0by!H3<+>}vc# z?0#JTZRzJd>E}q5F%xrpy*+&R>ZFj$4k^{-_$Y}bL#y8_#yzvbV(IdaD_){8SNy1F#Blm9Gu3g% zM=)>_+EkA|ky{rbCnbwi3~~9x;^_y>zUAa*XYMyZP5inRz0`R8pfOtVq>XE|F|-Pr zp-HLM5XgiBrWoWQtr}qFBWeW1lWr(RK^DO(JSEV--+>VP>J%razCe zAG10nRo^;fk;FIAAw=Q&4$;emetC#+U5B>4`3}JX)Fth*lFSIUA(<@I*ObjP4FARy z1NAWdom^~3&D8WvzGPceruxosMyBv)QOgv&+{ri<$?=VZWkbK4qW&b(gni>aTNf4e zf=RWkS~nAIjk+RTUx6Tas~q_~)JLU*(Gvw*l~CP4Qn^Q0Dwhkz{lYRX1>gi;yUR3UbqC;ZpOa#@#-t%hG;lkf)L6*v%Y8Cz{QY7 zG2@15sPVGey!xW_MsFaTwcqRMdq`BihXTW={d4sn8i==uh=VZ3%&O|h>_vs$jl4Qx8#>%Ng$du zhr4Pj3U6iQvvIiFuFUSz*=6|+SLJv5wFB}))1t&K&P6_etB|b|xx0i;J%h8d@wqq4 z;ZFAbZd+VIp3)-z(@k33-?X@|X>p}#ac|S&xYHu=(4w4*ARTE=+q9y#tr`8f%LcaT z7x)bQ+S#eLJtrV=S630~C{#?DT%V4XXfVq8yk9f`73;{brVv0F-g>q zhcQESq$GPow=9lih%?OyX-ZBym*sa{mESL<Sc5(sk~8#${yV;MVtCsV3T^Atj~PNyrQ{1 z;B#3q6&n9Q@)tjpELKUqMNPjy4kpj9pf*^=W>}{&Tb{OTv7|~pr;B;eUh6)p>nuf~ zSuu}2$@r0RXUFei4-8l<#DIox@5WUy(@8a3lq_A^DpiPksiaaeHR;Dra}}BPas=k6 zSMT+LgWuK&*h77O&+ za3LiFMD=chv*I@VCLstp4F6b1q6K&r6~@Ak*q5xz%l}oGlEAQZ$V1{qooJ;ioV{ND zc>VGdrvf)8yPr$N$LlTkbgpi9Bf*cY5ZDx4b*~P;S`}`ap-eZ^6;^9)ex)u-AqXfFOc-UoE*W!VN zVqHA!I5#}J&%QZ_hxb;)@l2_mTIZc6c=Cnc(bW)&p#h{2TW4C8($mV%o8RMzqCA>E zeS$aSoJxPtB4)^G0I6EV;Iy(7T@D1hB`$fY@iJSkjKzGIlA1&0aId1N;1DL!G0{qe ztn+Z?Z^P{dJVl1FIM&tW+d`(#QIpR?9B`X zy@r4DrY$;=V$$)I^TT}Q4$71e?pZ!PLvcF9g5NDHuT@w}9)z(Vp@Bn06j-QiOLNyD z$yA&!lJri8{h`o0rVLHGIZZ)Tizg;(z!OMcH6#f|34Yy~p=3%Zq(CA_;AnmOZywCv z=PNr;70ekf_a%7fL0W!JJP2!3!3tE;!2StBUY6ZX4!1L<_*b=$Zv#}GMdcoK9?mO~ zjXwA($Vn#NZXIr)Udq5F7SqwYv#?@cW7x0pOYY&I?aEF2ggW|wU7o_-s&`qdVlJha z*OM|uN4EAHhrpckDt6zv`PSMJcPPO9B9>yzqIX@^jsw8Ny9-lyyc zUcCdoQ4gR@>H+RF55PX)KUXJTq<;~6oPCj4QCdDl`>NzPdoN=p5NNqyKc;(ND&k3k zye|tWh-rGRgbzOCy_v5`+uRe7p zm#wm-#P_`}nli|s89cVfHc+?P@&~q&052xZ>Rv0WhgmR^NZXDV<5^>@3UP>LVL&vd zalmwxkVGP}i316kCc!co5Wys(Nr(yQM1TVx2(-E}jcE*?-+%9O?z`_*mA-7tikGbA zy7%3C?)lhff1SPe*{7d!{ZtlVL6N3msP_w+HHqhPZ%)n3IAf2MbC=Vm=5 ztrNCEi-O;v$2#0MLRaKKJ4dq~Ve7ivs-3uYx1j#t==bwVwsBpVEw!#>*LfxYUkOUP6CojlyVLz zIR;v002;c86o1J&zP_A&O_|Jb3{`%ZRF|v7vZjll^!dD&Pjd^~1nVW$|N5QcVf2F+ zGB_|QtIB=|Wbk&=(uCF)t7;R8KNsvNt_~ekzfu5GL?}VfIs5u$gXzCN$MD#f7th z_LjWBdXJVX7miu)39ZXPMBs<@UNq$o8?&JxJ1Xc#8-F{6bCJ3~BmKUDK57{U@GE&ex3Jx%@!WfQo6xZHh|6CQ{R zfnM%a9qgFqh%2332Pw_}LV#jXK-D&btzP=JdQ%k(nAAI!17aT}dtrP`pFU248 z(F-D8_{x*IDrak;XCCdt(Z|CVMC14QJ@kDA{o*Nbd5<8szRTlK9ieg3 zISsR={T&Hxfld+|rlh*XkUpwU1Z_Q7721YB1JID;cC0@pAR%Ea`!LwaSicLz^xVbR z?1+DKp&(EczrmP|)q0b^4T)FJuifPFFu_{WnK(EOwA{od;h-68At+p+nRvj=;WKSR z`oWH3k+SNznke3eu2mdX4>a5#)bs#k{szbj*jgm;zO}2^2Q!7k7QYFVu=j{fJ`D4P zF_y}L&y!^OdMu*YLxy#rb8K7&yN3l%`f`YCt>_%!hom^_k?9@x>x#~{Pgl;cR|;2+ z>`~;^11*$aAGQs2Xq*9~T~1P=q&v7MOrpAoNf7;*DzSOx?|s4+SLpiDrii*05W)ax zkB2k`@sd%vXziM_Ta=kjZ@7aX;S||i{1N;|D;_Bc+!XT5nTOlFpR;=M;)`1G3`}a(wbkJSSRe~qn{VRgSh7RB%s$S=cqL{92V#AwL zU1;;8oFnEficy}T;GggoAO8>5;u@`~*3ih$Gtkp+Bn<1nomAR~Mm};Tje!1w-Lk{( zRd5+pK*_!s%;Md}LYifAIS_ zzhwqo&LcixOS&|Bp5^JYSq3-rf3i7oLN?)+(mrH0#MGo?J~=(rl%&8`ku76QP)E$K<9ca>k&+&lRC-5 zfJ?52*--`(?45SnWUG20t-CJYy&W?jFu5haq$PT-A8gYD(q7gN7W9DJr1b;V;g%3H zJ`g;rAbo9H%6tDi?&#IxW~XSlPJNT_@qQPHWwDNGiSawJutp$tx=PoSaciNw%wa zvw`e+YOU5^k5@th7PVeMz2nfu-=jcOw#|z7K9QU$UhI&VUf5OqwGiQ|UB#!<@0Akv8S-yQvQGa(K)(Vql(%+$TQzMDdCiqDOap`7i4$6@5}Z3s=@DT z^?Px5U7zwy8_5J-H&zm-MkskXr|<@h0&>ZZ)#~PV@&>xy$z`L+cTA4s8@XI8%NOA) z;!a~F#7;bM$&MRAhLs5B=OJh$E1`k;!J#3%+uz1ki~X4IV0uTgNz8B;Rq2~S2a=4C z3q?7&&Q!>-8fvTG4HegV>S{kscuY$E5W8i}Vz(wv!% zBm7)MN%_x*+LcMbL<#vuntWeNWR?40XEoqD-;?S0gjpS!6O*~h`#itVYy+25x_;drQf9+VPzQx>)KEF zI@ldSoz*2gRo4)RD90ckiIa&ZIZStBm=~0r@7yk3#5n!vs?v#giU=5c+@`twV=LY>d*%6j%0T|uK`x`Ica(-lN|T35Kwr*s7ikLn5jM#ja$mBp3J;IWEn zAH_G5AA-L+gQ*Cb$);xx)bQ=Q!TDS$`KUiSu);6}?k}8g0Gp#&H zWxB|uN)a_+lt40VZV^-xzu7J~mFvMrUd)?)1=pc|kfaPlj7F=VBSq5dj)Ophz_&mdc>waL zID{~0R1<<6;D%9QlD$_8{7u8Ei41k?C5=FU^-(wBW}utYP1L$cXae1&Zo&)@ps6*% z=TSGo0I`N{(r)M`ZFCa~`p3ii)|$FW3cNHP1K2C;jsZl`8gm-n7`)!r!7y={#kDi#aVfvvZBN3hPWgJ%%@<3#8?h8wF0xMb82qV> zw8pCi(40%@9#@>JKMvpH!8|zqEJ)14$CY6`zWJiOMPdf(pE3K?T#%}@u9FYt;lTe` zdmK%br%$G5$#IJJxRgp~&-P=CTi_Op$vhW)t0fm)vG`WyicLyOa4(;7Xf=`IC%1I{ zn-z=sQ^Ny!Mg>N?u%%B3fZEhP6D=&P--+#%-D2t{qT2dlqjPsJEiy<0YphYAk}fUS z^pbp${UZN6#h!(4h(St^wPCu4+LTzUm2pNNvDZ4`HA;z4fy`WRp*;=^4DES8XjgT)otZ*WkQb((w05c8w466w3CM#Cc$Ic$c>6uv;z zh>;O<(~Xma6_lB=dHOC2%V0h{PwJDRLo}nf2Acz%un+cV2hj>ws@}ydL*hoRmUm>c zAh_+1#2CA+kXN&&u}KXeHe@Rt}2qSRF0!qz%k(eXe9b1OJDh+U(0+gxkk zkR=#3^GWh|Wt460ngsahqF95Zof}8NB^S~tXr~O(DT>8I9U*mv>^@Kw_6zityEF~E zdQ%h`-=#^_nAwtgQT5SwZx;Io@_L2{hGkYN*&-7@QL)LEkL1?dq}`|!Y*w{j;|hqM zs4m*wgVnM%l+EecVzmiF&wNSb17KsM^S5q>C&I+Sb<+<0w(4xdEM;@{yQ^V9j-0;W zdKS&v%ue)*S~jq+Y*`5_X&F_d^GJUq4bZ=S=aGB+b2_J!D&`KN6VMcgFet$f-D1de zt3|hv(sToBkabH}b<5H%`8ep{yfAzt-D~Zp){O@>Z(znos^5ux=>S|Wt0=6NI)XUg z)lbUx%5ODB8vvbXx;N1d4xO=^ne9dfsO9}1-FwrWdZu}$?2F0GcOsKBkdis=>>&w5 znJKyvryd(c?&wcg%q9i`r$bp-gw@W`nZblWE(R3x5lXSM)Kg@yKzE`BB~DRpxs0R% z37|IarPxwQHqnjMSpO(gBQ`}sSjz6rAd|*PGD8wjqx6YR_(fe(kfmQ;AnT5$U6`nn zo`^FqXWt}w_$ETM`dM{EdH+kyR#aro8-z*J^+Iwp4gE99_A*0SOA5ChIDkHTsuy0& z@8IsA@2Xzp?oCRUhc!irJLQ;M2=xk7@!8V1mIX4_AjboYa9xd8_XD!DILJ0E5ZB0n zkS&dHO2bq5ZjfR1g-Y?g z!}0SvT^7h7ngRWVA0ZZXf$q>ly7nn=c7CiM0X&+D1$FTdj}yDC3+9_-i^9z>SuC2H?K@#Na;E05|q! zt&LwXa6dc@Zn05=_#t0{CuY5c)J_%fhE69ZR7sq35AZh*&>XnG-{}Z=KtMHGzg&2J z%MhB^a6jU9w4{<`(jxG<_M)wWz5mL1+8GX#b2ckE+J_CG!iv{QUxC-oL`Dn4;iW~s zah-BSo;&d+_X4bvctDDLR!Npe4ObQ+*3VuW{t9!|+nSMSq`J5eIxL~`lxf)TMY>}` zkpiWu|0+4su$7Mrb|z&ZlmBM8c?I@ZyaDV^8gB}}DSp7Y(_)N*xVD$%z$E@N>51$% zlMt$d)QHV9IRXg4ikTOGU>PQp;vJbRKY9chwGNPaA&3$+tRKFFigAKw;qcTIqnpUZ z8GJ>6I^!z>Z|NZr-VSi@A%uqDa#e)Oz)Is2V&zW;moP1wf$KE2$U3>t7>YTHWPiYu zhO?1Y4YFFGJ#VX}jMY+y;;dVcI#d9Tn3OUcvAfg65rnR4gQ=SAyiT?@yVDXF%&|2j z4RvcIY>nW8EwTa**lKbZ3uJVxkr1URAR!p#NLUI17}8-)+G);LFqP3}%1OF%DMia(WBM+I-tE5}Gj z=74kutRn}#pi=<$<-@#=tc5qP0P}kL%f-BY@-@Z0o;gRD*KIZPQm_n^c-ENLnn?Hx zFfT(wF|XUsKJ!|0oG*>oR%Kp3PM8;#*3)NR?}(b0G>SQKey*jR^9o|*wV@Ob6*fn` zw=KZ3KS+tNkW4%R*bif>EA1<2!6b2@)rL|}2F#aOAQ4h>ccHwTNfqHEg=?6h)PglK zcyk&Ir4s$Y!6VE@CkunxS|47Eg*#NUih7vW`dJ>jp9XhKqPV!?FU3a*;3+<(8?q@B zZ$*<_$o8iuskwU~9jPC+q>fk(3IGnH3>eAD=D{p=BMaF>R+BV61C%d`0U4RO9Clk} z9!zuOabxF9Ce6#uG?aBCJ~vxO;0&A&;ll#}gDG1vVL0Wa3{;o*fTUbB^!j=_oUyl9 znT(L(GR2@&*&Q3r8`Gk2UFx=p=@0_N$vG{nsk0rNP=aU@teYl9C8T8YF=aHI0gEQ0}WG8_a1#fp+YxELhRdf0SF4hP?pjX!gspB3enjCmF`yb%dAif7} zxDDb{S07DHCrtp>kk;&jYaB$04nKQhL?9ULTzd2QUSauZe>Du~;$)?We;T zjnf?jtRAWZ7I}IpAqQ9H2ePr5`<0H2kBHWf-aUQA7q)d%F>&uvrN3;OyAH^X z&wNw|)RwknQpE!~yD6fug2 zN-)zM)nEjsn_tH-tKY_vlC0#bl!rf8fB+flGr&{VNgOOzvt?C4JS3eV-m&h4Jd|}w z*7eF71vHnjaLrPd4JP|>ThY2^?GXX?fgD12@J*|G`|t*Ex@x0E+cC=Y=Cb4UH~PFV z*`?oVjt}H|&i;oy>=a$rEsvP63H6aFpb>2vwTX(;l;W~Fj3r?VY_d2v0@s!_h1x&b zinyZH0kny@lI@%%pu6zVjLGw`9zP6!wzTkxEk>bQY$i&ig{h#qH+V=0(rKTNDG5Rqr)SXPRK}1nl4`gim*E z3!{1^{v&JA^SN4iwly%W(w$>;=eVMGGNBm}I^0*st>m$MusiX%WkP0<&y!JF@|fG_ zat7cmaU2fX$9I6(7#9bf+FW+vO3J1uSFc+g6txOx@L&)+`kb2bzN-gv%@s1$@?hhJm9_6dLMPH&8Cr4d^8^3RR+w znnE!xM+&875PzIf4I*WjJhY7I#$~Ks2sA&&q=wDJBxb?Oz|>H)`z-+rBZL>>^O8@A zC|mp5c4LnROp|p5r>yMUq#=-rq^=r8wk1UxPq4XfXj8lb6?H{DA6ls5>Joml9sUn%RD*4_ShlLEiAxu|2CE zwT*a@0G_2g01))0xZgW!b8o0EBom>x*^U=EhOPl$!ntC$w?;TZ6eq-1ypFFRAvq6M zqiLaVz|%0#gyXBhCMG=%VJTSC0RYgBgQ!Q9)6UX>km;*hz!lZrJ=0G!{^L)oKlMeo z^3A5z#GdA@c8lwkW zDWN?o@?hw03wQHeVXuS-RYap{!o^sN{zWcPG|T*+Vo2CLxSJ(Wj@=Nhi0GbFSfaQX zQH+Y{+-5FD69wZHh}2|F*H3ph4U-EWb!ELZ0%5M}337}NsGt(U0F4E{_5pY;f+LL8 z5S_8X*0V5LLv$XUDx!y7r^X6R+cDJsU*PpiB}diY*W0KdANA33N%sv3r`=^%Nq-5e zFxKBGlmdKB-J7AgF6ohQ9aFor;u1e|aR#>M$3wC7QT(A|D>$-+gG|gAPsoV2APj1U zy|1$s&(I<@taxB`LAc->rXlPi38z3RP=RUOcyJPgHTEVRBmQ;|7x>%VG%fuRuIW2o zN+S0GE3A?TS6yLr`*ejG?$gz#-@rlxL_8|e9YuoVejI8sVC6&SKbG)(WG`Mt^y6LS zg>Zgrjf|M22P?VQ20m@+D1H>^@<6Nb2Nlj{Oio;qRKX-4E4hs!8zmskc>q#X~=hlKVj1HjOsG==_}r2sZw;Ym!U&tg?yp( z)zil^e=TcHgOXev<+p((DMK?{R84C z$>_D@1`o_rI;yP`m^9N5(Qwd25t9~TZv!H1fM(i6T@k2QuF>@P&!_M-L zd9-0t5))&=A_^>&Zy7!}2M-`*79niSvch2+6K7nSCJQuy1*uI>L6gS-VsNMlYqzK^L<%T9}?I@7@9Hip%Xm=fu>k*UZ3Bz20k^ zQ16}vf<6baBUIcMic0l#k zLwjuSZ4Quj%_as~b0db(OTg>|#)#hpHUl>~UX%Fe^llSMN5hekXV2-0N%oXMxseEr-EpSraC*#mtnJ+xz)I znnl3@^AIr;&QSf52}vRv^x$rY0mbPqT>zst3?Ww`I?qk8bEqx`-GkpPvA7~UqF!hf z11?j2I7%&B$!KR>SN#%?u$~W=Q}@8?>G<6+W$Qm-aQdeow>M%`_&~6>ORGO#>@&^k z_KFM$DH;ZGPb@NiL@5N~Bfo5U!;_ zsA>Px_JGJlEzv;`g7Rar6dp4nhz$n}Gk;bhM|4twRS<@=PBQIC2ts+vT~qf@F+$#B zzpHz?O`v}xA&aR-`JG}vq$AY`2+6aL^vhPOTc#UpjfXSV8kS*?QwaoX0;yD7l&2*s zlO&9Z*=V&iCmpRg+5#6QX`Ty{RC>8Nej#sVZh$$~GEQCCvMQntv?E3!oW72WYl4gZ zz>pkeE#mp&Zp-_t?GzfUlhhg*zePhcoYS$~nWW~H3ValbYN!u~+_S)L4!Y!0m_j9< z^kXnh9_W1RM>CQL5Fn|~B;BCm`cvCQ^)R>zR=PFdXK2qWR))WWGhLo}i@D6=S(uN(Cx`lh#Om(jLToiR{p( zlSoMFfFUql@!Y&r;gpaSPdEFSYLb7E6<)NMc?qKhKlO>bc^Fw+ z^vM4l_W~iabyr6!RKH`)kcmTGshFhV3(O+#*k8`ukHxn#5!g#qZ8IQ>|9%!WMFKu< zsa9&Sn$VFpiA@z-WgGx9X(bl#R(!05_s@8!3riZwcqttWK2!boUw}!ri$l2`+Nt~{ z@zL)=HpCO@?K%`!y7)i%{4zh3p=}>7Bne5$C9m68C%14RSLKaP z*w;B>BTA)0lUK^>EF-shXp(}!o=y}3sBaN1b+INMCnYYBQf(~MK$ zIda(_S@+sLxvf>8*Qx&M^MCk(&WWayIn-3bs+&_;{i-8yqCIaBy_sIZTQ$p<<5e)8 z$Ng2kj>v+e(F`R!;H(sZD`n3ql}LwVrgd!y;zn)XiC;=6uI!6C?7RA1wW_dIQVw!; zqT+J3mFXLOk+l<*8PfC%_9Kj*lUn_$QD0d@SYpDFER`sL20V!iyT*R6-P&89aA2Aq zT}Yru>FnIGL2R=4bSv9SNzr<3dYeTWDsv`iXq>HG>q*!{mfpgWn-yH*#4A2z!m(t= zRAWzK6F8HTyX0$0g5RK%hSo-4H(2@P>v@4O{#p}3Bw!Tj;?Vev5$u#|LEQ0&UFIGm zt5pYQjOGjQTu~$8Kp)RFtCuCWRAv`vjC`$DMZH`!#2*& zk}g6IIR9k{r%upM-Hl(JY}eh_CS%tm|HAJ`Rx4ZxwS5MjkV_K7XrJF0_1~jtKQihg zajQUl2b=X7!xW8MGgx+1XBBfP5#wI3Nbm~3UxPbfs$WX0ipj!jLEV7Lbn*c^wIDi{~ zwSHo7(}$j_1{u_%wq(H}T^VS<^;Q9^2*QMK=h^a$~ z!I#=Sl--nlMAF~zvbk%I-fIbkx(*=$gB}^!dlOPbi~p!VMPAAr^%jjsZcttK)kXwH zacQ=U&022I%aZ$Zypg1V=SOvsn9q;oF&Vq9?@dYdg#kw<{7`;PijFU12rg2LE@A_i zZ1{_|!~lIE>VqZ%_;|o*;CMO-VfLEjZFI7vIMZS)d0W?C--lc7 z(;JdQ-x8We-dW>!}uli+IRUqWL?+Pj9qlMAyu% z4?4gj|8AREAoupXy0FJry%bTG@qf#lD7M_|4tN$({186}A=W%Am0b;kT%7n> zWQwGC3;)ys9q_DfBq?f{?NJGDZGfQxZ8N7#GpS=MZM7BqYIr1mq&p>bq}o7wS(R0( zetA+yTUnzbVrRqdB)1YkmoG_6JvR<%@@%ahr$aLvCeD0L_PoQ~3_euT8Y5gYweebp zHF^P6GQ~Zxx13b$Y}QK|guoLrt%bo!4DkK#R}P{WC~Ia4P-(& z%tUT%MW4e-i+>|*L-2}`85Rl|#lZwyVIwwexDYV#;unNu)=1^Lwxv2~IY;%0@~%TnB@kjR z!g{%*#iZaLq2G~57&pjifRXyNa+U>r8|sGicP3|l+#1C%+z^+$I5vDWsXIo?-fK~V zq%I5b7i8=@V&?wA`;zmNEN|UmW93kTT0-qHb!1HDI4O%l29?YYWA`tCzE3V>;(==1 z6tz>r_Daat&g8mJVmKRwUU_gIwkz{V@VQMcK0-o$%s8e{@KXjISyRv%088|x@OxCb+Nu%O$e73wsid%uYntSv+B7tId|S4~ zE#F7cuR5R(G;P||aU}{sazO0CaxG^O4^TREs`zpFx$gJ-F1P!*H865PA~h5%*%C3) z4YVnKA5S?WrXxKGqN*2aa}uA~qD_S@K^kUlAu_5^Z!aar;b{T!y}|VDOxco~=7+f_Dw)1E+uFEV=p92;vhmnzk?Mftt;%?c$yEgSFbI zX}?4n6E8XFj$-NFIPCa4E2{O>ysVUY1oH*E~#M(|#mZISUaFL|*n zpEHDNpN;VZ{cTKiPIfvO8^AXFg#$D+Fc?T!1!xiFa1h?uQxudh1bASe)R+NNpJt2i zH<1sR5cuNTs5-K;xSv~jGm|NfPz=?fJER5mm`_#G9a5qRjm-vipOyuo9VlYGsx-a8 zpo!LP)e1b)r|R$c258tShX&umh=(7NON% zu(GvTLJKpFmDvJ;pk63ITFUa6z)SC7kd`a3*>jkiMoA7-m7*_R%0aKCW#}qrp}TpP zE>OK;d{N0dboVzAI+IJ}@mEI$AqV5|s>3`bDyX*VSSUfaVdkkGwGy@Q-I8weiOYXO zKXfo2xB{RD<^Z}fC*Ij768A*$(~MhV>|G)l8AqxYp_d#q3#93D?;#X~$UQGZW=CKB z2}g+n9-huena(3t^x;g$?2!mG^T6BpWPaA%fsC~+&mYPN*WmhK)+0(5Rg&|Iblsoz zOvSuE>)8zM%WziloNj_t*}aU)bPeEs#15aHWc@J3y9vs*_y#smZlJDl>Yb*I8QLpo zd!6^=NUna7;WnSVGCNFH6&&(WUGa%OrYkWcAJ!Fx=uus9cRj2t3Dpki3NgJ$S6110 z_sx$*<}@HG!RCM_731B^Gt)4%ozsVHxuxLPtns4WJ$|t>sdntqGxe8Hm3C$ zkH?$S`m{Z0OsnssKT51qk8IzUSQyN-Q~Bvr_@``2X(MQfoWo^L=tlkI8GAy1;}gM8 zQ!Yw4isSz&?u?~6r>LGstz)KFBYea@GYjHbprq-5wpw6?6c;RG+Q3ogATx41P9xVk zeI9}GlzkJ0#F(b(E@(UmY90{cRzE;R$*W_H2c{4cOB$$dOw)acE@*nM;==4IPbN-E z<;i4j#ZH-8u>(xymYXfFUS^2Z-15|bW=UWjLPP9wOo?=3-nJTM8Wo5ym`TSpi3JhY zATpWOgc(}sFwD%_JOZ;P1I#X`c3>u8S;VNp3}Bf+G6S0sL~|zy4p?RECd`oF;~&OA zvb~&QzX~RSa*C{drbD0Jr;6Rvr|?^6w$~f8JwW{*$`$u!_}OcFlp&drg1+Q(@7+;j zkWh5HKG|L^{|Bps5R6D5pfu?5N~N_*vjC@s;PH)|LFro+;X+7@2h`!itD5!8M zmMX$8Z;Y@sYmDcl)DXB(b3i!Rtt}LBRh}(L)|C1Y$PAa!iJPkg)Yg@xOnr-j6ra2r zV(%MHoxK~IhP|W1koP&TY1ljPHTG`o9QHn;->`QR2e5ZLauoJ%>>u`S`!Znfhy~dD zh7tBY4I3|bH%_@3zFEij6V%nFUhM0}`n$&Ztsk&=`qgCbz|Pn^C}->)P#b%Pq>a5p z@5bIiUSsdDGh^?tePi#41!M2<2V?Ju0b}ooi32G5`Ui8LiOgN@fSS3tow*y!Bv=eB zq(1D@D2uWUZV&D8pdrL1VilxRYmlx>y4*vwi17k#t!$o#mDWp}qqblk@c%)WsaZ^5 zucWcctNXZKoUgtDih6>Q9O23?mMH%`BY0hTF&zp_GcPZ;t{sQv8y|nYGP6su;Y5u7 zWO;!S8b^irQ65e4Xxre?As(&cQA5=sMyfx-qk&IL@o4=nj~bBL&m*!VHDRSKDJ>o~ zpml+@y=-{;xpcZcaNiwOl9LDrGyH&VfVVNb%*M-5Zw|wQ3LF}y; zi{+qEK+o4&@y7F=*UO|aQNMwScIzLo*mnH`2256JtAK1*WJpaLGghx#P`;f{wOKDq zYa5A%RzWc!wAvF!L(5e;-;9QCvLF~x&vH_sxGIa!MbcnB8k&16F7;4U(1<3?=UH;;_SJ%(V(uG_VT*HX?&k4tU4wG&Mhn^5*kXg1hdzXe zrgqpe==&=}htv~HvFex&j++7QR~09Yr+;_0YPOpp#)2``hjUy zk2M~cW_7snz%(mXgMruN719Wshb^wn5aDK39>`WFb;^tj{B^s5(Wq2#w-T5!0Q|GZ zrWSx55U|bmVau7;F~z)F&JEakr<`+kZiy$cMiI2A1cFN3*)Ph?%%82sIS3LA#xxOn ztHU6r+2zOV!};m%fYTmH;j}Z_qckJUTKU{4e9Y9q87AM1K=xc(Qc*XdRoHxkhYUha zwHM5};Fp5c@IF}sJrUBYS;}?c7oyXI4nx#6g#dBL9!VhPn&G4Q^8X)#Iqj| zixzBmhNZfX9Rw?9u@AwNOLj0wc|-w_lZ=f4pdb5Ls`M_PqjTLh_uG#wJ(b?uw}ly$ zh24kaD_(r@#WDG`&}xWf;4jHx_K1m33xS!m*{Y>L5ygf~Ge11~`WFDy4o^Ei_3_A$qy1ly8M=Vm%d{yn->g#FRZd(K7mq1W=2IAZf4%Hdo^(@9Idrq_Ik%G}2 z9IU@KbHVz{+^uH*b+d2gN*MaBelN?CfJ1^=mQ$wIS~~K!)pFR77X|+T(7^Vk%F2d) znV1P}Upr9SH_QxfX5m2B7Jx|fs|hZqR_pZVM%6-4d|{QWt*MEy{RZ} z_6`f4UIj}$7oKWT?Sdx@c8yb6TAI=bks%(4YdFY;)L|?Uq8<53m^|C8j-gIS6`UNl z={r^Qa9Ys~-nm?8TfQayPl$a5z;=XV@3*An&CWIZ4eQaXu#)q^&@_~69K~6J)wqQ* z%&y*jFm88$Hg?|+y+4EQGfT$x>Ha(jS8k#2G+m)Ldyca2kC`$=r14*sD~OEH1N^*w z87oH8lkw6l@?7me5N1^%#xrL2_*L>xD1Am|fWTttWJ|=@0-FFb1M_?IXsK_!VC1_EW8Hxvsu@Bd} zH$H+TI+rkxf{wtZnVw9pp^%;|4e81B2rw#oHTbIfng1|KgX0W%3Fn|oJvo*1WY&_> zlf@%ft>=yIfC1|Y`5JTaqdAt2gQL_kYTrj1jMfR>uf z#;8GwYPlK^&xFo!MGS^{_USA@Swk41GggFTCR>Mo{g!b8%OjD+Yt4hih+v{@1Ok>L zj0kV90f_6A?~vkdkVwUo`P(!^EQ<-x<M}8+ z%oq^`%6N=ICJV>i%TrBAalHZ$y5Mw4S>>2U>Jb%3R6Lt6M_E> zs32-Nsd&n?1fvVq(QJpxs1>svDya{6#Gu83&UrQHh;#^Pwr4>NQtmbQ^-EWSJkjB6 zMGbmJ{L~TaRaAp+i)v8k?5aU)BH$~a1{ng1!7*5I{IjSAtvSq>w%k}%4f0`HjzjUF zzw4ez4O&A3S_3x2a%o87N)vV!B}YbeAtB1d~B&Ossf3L2aXkbYzsGfj0zMNNy9yEERt6A zc(6!XtH)6VqQ~_j>6_MM4xYzxG==lY*GRT%V`)2BMAWMo4QsVE(*GKn!^E1*VR*PF z!Hj{b#88`SqyXnt)=0x}ZZL=8hEEAIqN+sWq<%DQ?{qK&C^=?`l>nNxS;=tUP6CvH zszkreKDk6yiN?=_Ts-bpYibzJgss2+tUHva9$zhW6GVjljA_DEJCmg{jPrDh+tD!b z2A=RHN-VPN0NSkAL;_1(8xOK*h9yQLYCMn^u8Nu;nX95P?Z#PL#f{oN%ez|dkA|OB z61HZrxmINk!J1Tj#jRaV#Ro+~4F)raLiZ(>N1@B4(W^#cLiX9unYF_s;L{-i`3R#pb?`P2XkH7D)akHmnLT#XjK!A zSr;268+c;C*KEJbW;y|%?UKh7W@nR8WP5*F zpP&PT;*xEuQ5!Fk>ay$m?OT!bgraDlX5*;BghtcdMB=r39see`FT?lU?F4_}2EW6O ztZus&VKuX*Lsj8Y`0Cv=*Cb;}du-MJx~o3b!_?k%Ii-AJnk0gXE~KN{p&-`^j_mYi z!W+klGs2;J>-0=T>dNY}UQW@j9J1CM1|0kGg~S3Q)t}9iB)* z<&AN^qykwCLj;!z!GkW@34%6PSi5ci18IEA{OSa)P0isG*Elg-+pxRadj>)fY6S=w z?Ii!RKSomz-jMf~Vq@C7A?@TBGi~6TWze=SMNwF|yV?9ZjgKwlv^C^pM~1?xK-{7< z1l2yDn1P87%LQ#{tr!dQ$$G*pTiJv}S*0{&N@;$A?g^+^Fu9qXr#gO<3*gnTg%Dc- z>*9?{9MAKcr!%7jIc0$w;8G~^prbnBkB(B9J@~fKUK$7v1Dh$uis%i|I$O99oiXRX zW~r3u1fAYUHXebovt18vHBup7!Fuud-dnt8BFzh}?6gmxaJ%Ba%EhV&hBwTS(Qkl) zIsS=xVo4nw{sslP{N<_hB{iWWK!M?y;D`V`rB4B1*(p9uz@Lp9d{dwtgVrq47sZ~y zEu7!PDbn;8zfATk)(%{S4~kBaN$AhV(+%Qe%j^bh5#89TjuDvy?AaRK(!O5Mu2p@h zj*6n|B-19&=ym|Wma$`Lf4urCkuUp?z*Vr%+1X^+J)i(^63FzYLv@_&EpEs#2)w-g z%KVKyU*^LNT$LGShU+u@UdQ!I79@+sUU|3uxY{CH%oZWb8d-VU>M{K&pq#o|fDx>W za7ij47oXVDTiEcSJTQVAxm#hY0@;^zB^BB;x&pgnT&tsmq%eN=GX9HdGOz$z8~&$3 zAI(_0&TMYC+ew<`txm@|Ww-usd_tLla#&!Mb0Jkgm&@2>HO{3oS&eZa!wzR#g7?(~ z7czWwxMbSCr!6&pwqBxfwFZecT&@5Qf35_~Rc1L9(oK^rhy*Hs_1^f3bSn0whnnbs zY*kN_7KudQ8Z*@YysnycA@>irz*L*pN&yobDbGvoH1QB(n|>n4$WF&?^_=3lUeNd2 zVop>Qu-i}CE60u7MUB*Tw=Y(?yQ@z$opB4xOzLzJGLn{BsS@<1NWXfeIwtc+&jK|OT6-*I z*9M~($$3V5-DzfEh&ID=)qfrL&t^&;r=-C3_cJ!bq65-Gil(*0%&KE6S6!WL8ynCs zdCnnV;Z?tFIWlUxq*+K2i<+b}eFH5+&s#9YDIp77A+)ZQpL!V2IfP`F$$yuWd<8?3 z=mwEItvU}ia2tbv4$;8pt-$RT|E2d~_n!c;Y`Nt=e%|(7+a&%ylM;yIp;gRfT+dkDA?tzvh0=^JA~4Lcok_SdUcx&AR9WQ(hY{0y7FtoC45G-G)V8xcyo zWUnn$>f^a#&OVLF9vGl7X9F4_!Z6J9A3+ZJnW-m$e3fvBm1eth(42i5Kp9&9O`4hM zch2*YnwR{D$?3a_7d_!a=Q?FTOavHNe#7qFqYnPdv22h5W$&@jZPtE5O zd&llg?_m{I?Cwv>o;3WgLIz5jm|FB^3zu&D*7bJUVf}&jV=7qG{*j0T4&RCW8@#A6NbLUwr6Km6uc-t5ivkB3Ln`OAgi9igjXlVL#$Xoo&_v zta`mpgz}dT9ZnV!rLMIGtKBX0xot5n6EzxX;W8W9w`+ z$o}|0(qPOkfI(>w%g^Pkm*i9++Y3!p%m0+$!9y*N1;{=-+bAyqssyd5_6A4?r5-CK ziaj(?@pCKn=QL z`Cl;G*+bI5t2&;sHs4kKgLMXwjtLRja0KwY0#;{nELH(%i!CPf#y;=ts{S#Ih1%)M z9Q)TWq;WTEQ)EUPI&udI))_B-(p*Wow23-1@L7|>F{@ZGw>(=^FJCy_2k*S0CQ@kk zz4o66q|lDRdU$#)q_BquY@Rfb!U;fHXN~$owlz@ylyPuufLYkj>WPjBd9~2KQ!UCg znc!?B-JOPrdk4~Cp*(3zGWZ!NIe}40?e@A&rlyGiBX_&s-%gE8F3r3Bsipm&NN!^U zQ@v>b2`x=%HHY<6YIr$ST7l*Mw94K4eFytkgwiq2_X&qWuu3P%XxA&*sR!)82aPP8L zsdtzwldlF;7kq4qJ#7A8@>bh-j(~Xn#pF8xpSA_+53cqg3S^J0MSN4?-v^R#7C)-vCwdeKa`wmtw zuDgREfO2}LSurqJ-BeC5CEt1{#4sJZ-Mx=}cgbd|&wcZ$)r zZy?hfX{x2YWYvMcJ`ARnS@pJef7_mF_ItV8djr8FaFD8X7ZL@=&u+a?Dtk4OTCo?X=vpT$mgwu zx{i5WUd2(XV#a?Q_9~tYRUC~~kab|F3MJu_^^}}QX%Fk2wuzCOL18w)Z)Rz4nLhFZ zOMBn;)}0u=t8d&v{E0;ARJq~%D7Il|ncso8#)9q5G7D^n}q6bFuya-=lPcI=oMdyESiq&+cEoeuIC#7{0!7`0Gpa zZ4TMQ0sBS()~PPqAsIsM&)oo`y?n6xfA%1zs=ac#0by*}BnDmj-FN)LpFPF@x7^#G zS@PSb-tl#BFo9ima6`$;wP7csZuraT=9kk;AGS*P@-}_RwDRpEOq{;XA7NU{nR|LO z!&RK9ad|&bD0aa;k33i>_J>G!RUhZK>ub>CH$uocyB>uq@|{eJ+{dd#7Hi}u=IW`X zXA&55x!$hD8$h=87@yMUFb6P z?JZnyHSGH9cnDVrMW*_pkRU*f)b+ho)w&r6*(B&ue9N6?M<>U-bq!&nN@wU97j=xs zDV5rL7a#xl-`w{z znf;cKc=4SNy!VG*XFnyuU;N}B{rYqM7AP#e_*)-5@D=uQLcf0OFF%*tuW|j7TvogI zb(daz_)l8)gY-sAkKgz8cHiOtoj=sEdos~1{m3U0yXP#qr9U6D+nn1!^{43Y{22fC z&69mh;GJsyjV6@L+)s`mGNwb&Ee_|n3F|k7Z$R4)gUDeMWvx5gj zc90lJ2UG`2DcSPSe5@kX3HEg$s{{s%FzC30lV`iCuc1S7e_LPE>e0`szKWK2%a6sF zl5d7$iL^pU<+pA|F$#N|MCc?Vwf@9L@x*weTBl_u+XV}{2J||+nagUYr16HnAinH9oE=B3u=G5^X}2~ z$fVbAZ646RQPMDTFp^q{^VBwxhZkg43V=ezRiLuTlC95v-_)RcQAMm+%DTBB~1 z@KG~1hT9z5U^=0d#@K*RJ+^u}8)JhmG&ZT}$_IoHV{Rw$qzPdrKh`BeNvo_6r&@XG z4&`&AwTQgYY0-yt+NBaQ^jdLU2D@OPwn|jCjtMRvl)rZi@yS9Ve1voTNhY5ga?a9r zCtsu$sY9K+;2zAJ9Hv^Gd$6xoP@Lr&UyGz@-18W4Gam+gn95de;G;m<591x=G4L6%@+TW_%ws@Bw!b=yc?@K5 z;kZE35K9RG6FgIfP{LO0-~jN&_pbP*I+449g~518zFv9uAmm-}l!IiSu&koW!{&Im zO^FXIrb&4$NuH+`LFq?R8(PdUWcyiI#tOT`EE*g$W!=cYF1>T?f}yH8r;HN?rd!~@ zI~7A_C&Y#a{v+M%+Pw30>9E;C7P2Q(N60Wa{|IqePN@bu+7LeKLx^5RZ_dibAq*#! zTD8$5UP;)F)IcUrq+md3*~V_)B;@IzYR_(2Sr*HrDoKK1M(LNGef(5lADu53_Hi3? zaF*DInmTj#G5GqWv5zBXk$q@i;w#8LJ~?0?hIe27?Bk!#4*OsOazsT#rqgF1w;B6* zVpG=Lo85~AI7UcEB_m$Ny*Wk!Im`_QR_ns~^E>1=LD4|65c#7x-WVhN$EbuItzi4z z>f)QL$N%ncURQQmY}`S%JQlZ-J_$jr@?8-9>c3@7i4Usx96pSyS^QMyD=ZnXwKygw zEvcS=0$Y}}&7|5NZoQzK2da!vV)IT&!Ff)uwJ?qqNk#M=iT^~hduBH4Ot+_7)8W4~ zO_D4pcYyUx#|cVOkP|HSYx+XH0w~+3F?|9K;?TI5p_UYWJEqr{DXU8Px1LIF;8((A zxd+Cw&L_ox!M$)9<2$!ccc#{d7Sn0Md9}8*_R$Ee{j~bIy8R0jd)6PwIRN%+xkp=J*z;2# zRYoi%AnWndT9Y18B?>Hrz7#skN=A_G!In>JS z)9b?PKa8(=#1v?hPy_zmd_D=dvls^rE~pB&9qQ8RV+~Y?e8j)Sh(!}wO%tracd+sS-Mo$zjtrvY2oK2vlc3 zH_0-BAvpfrK^~^8dfjdUvRMu!2367P_|o@%J0_FyrSu*`>9I*>)n^h)#WGIS7)qAD zL1tG{I(BgdFhK5-J}LAbS$a`cCzQPJU~*Ks)in_`HCHhwc53|9`vl__=xF$5A>@f5 zs9bt>1np8<{Jj&Jy`1n9442aHgES&$1E!og)9BtmKpTbU0w4pVp;tPBRO~h&fLGtG z(xkb-7<^Lv3MC9eb{EQ)69;$GKlJ#KCjQ}Z22?O0!&|;|+a#oh?FklX0rxBmeUV4M zW{5NiofLLfpN$ZiUT3sCK)d!zwA1R60Y)c>=U+8QNjK@-mKg!b?Lt z^8W_3Qzl^0uCpfEMHB$VAmP(sO)3t-F~f#GhDo+(H?KagS;`yJ%+e+)KG8s9Sxkgl zkx5x)nJNSIHKbA07qY4Ns;JM)RZ(Ao@)ZcmbTv?4zJD6B4zGp!1g-14Rhl%^r>8pG z!@JLuP3nKPcv{eddC-fsVP~f=0W{+TqtFuJr1C0w4__+5wFALTudB!8qPcH#)Y<{d z1B$h1=4H(hM?^CgUl+~O_&ej0IUS$`gv-a{@U89B)12WV$hjJ|ir~N)oZSnQsHhem z=}nL|hTnRFlB@;v4hF{_DKsiykm}UbP7nfCc9s01?vJei>l(5uQr zP@j~s%onI*Q>C2Aq(u?i`FdO(#NLY04LlyLQGG2P0)mPj!6mmZ8avHmPb=T zwG^dE4P1`~04h+L$#1rss$`(-L2s>@jDBdhir4;$SbL}$f}(1jAsloeRs2a6>R1<2 zowXAx{f2lU-TcAhuI*k)vwT>{k13#&){TplaTZ?F#AuM;-d*`en3<|=Kl>ujH96(nVW zb6SIGUCecm%D?24y15?H!rG&kRr7o_roesdyZBfTO2tDc(F}|y3vthf9e&c{p@<7I zGd>xQVzA$~%cDL{kv%_`W;z4}xN&OG92fR);VIC(Lz{6UoQ06#oU@H^p5_;MM$iMA zwb6s%VbCKAumO)u@PLg+c!+qQ16dO4O)a)F5~(S-81Rsz%C|%c9twqGHx)#xuE^u! zoAK(C{eTWV6~gSr)a~ctT65N$R%3Qx=IRYJVynPxk*F%`&G77K6EU*`gHvxbJA>ZX zj<`}D?8}m=-h>072mqLKgqURxBSK(4ubbp-Tbex4j!T*pLU2$_10ghIcKVcD0DvZl zNzepw>W3zX1Azq`+ix0yqdC-!(#tJZCtHjXE87gkGX}5SKL{{xr}|@$EG^vIpVaY6 zP|xH+3;`jFcbehU5QJJ`|E?yHy#H}SYZpLqs$W)umY|Jo7vp44ww*eT=0Z?{+veHH z%mJTBf*RQ};cz?93M z#~E9}_A*m2O=QGw8zI5jWh9^zZFRD)7vdM>bZT+4`IX%p>3$rT*d#Ndd0`4PFHD_g zkY8G9fV(y??5^uW-jJvcp|nFMpH?`9>7 za|T4@Vn<#}S~Kp^e|jIbo23QTdVMtGA6e*UL6n7x^b4JDBIi63TPLH;@9M`rr99Pf ze28#0{dShWYIB1w1*fgp=ec{3STobzMYh4wTPHJJk{ zF?+Ce@Zf14tPiwIQg?n`*ldLa@;lKBfz%=w^3gAoZT>oLA*y@0z!UD~!eIh;ap72n zIWCacEEmo?D!AC0DC^6M8r4e4+`=o)Nx7dfh^y|?H2}2axB$im`qFu}P6LSx$_=IV z^mogRJX_pdT%}XcAxH0#2pgh@u(bm-j$oEOrWjF8y6dnnTQ$>hF$Fp^=nhW7@=MVS7Md{Mfg6Rjoe93*R!w=D&ac0jc9wo%YO4#h*ZgtD5a253C7#IejJxsG>G z9xI)dAE&<-hnwV!RPkMuK7;`ib}bn)ZjMmpc%YE?!z(5b;840pdBGS^XaE+H&>P7- z_kl9Kv=N9H)(tP8d{;M}SjDIUZdQ z+ZUUBYtB$$F5*&jDQ-%@lsvtP3@A zD*8?9VWZY1+o2nIYi|Y7!;%npL-8LltcMD00%xl^iurt?fAJX^e{Z_e({eB@5|-JP zRK|(!-DsJiHAX?=3mI+s8Zxv-eG_x2fQnC{0#K$=fv4PPz}NP<58x|sNBG7#3-^ax z&w?Kuy8yCPI0+yfzVP@OzBW+;N~}TDQ3)tU6v{K%s;&}FD*+kujW21n(8P2#F!GAuV|M=H=L9_3OsCv@^~pY0EhOWFrfBa)@ga72n(H-tzS z0K_)KKrwCFK>2dk&L`pq^FEbJ@b||~4S-`c0LMbT$kHxsJ;X^W!2~E{r#qw-F9U@mo1L|lW11ZGv(1z&^BDHmBg|WYN(WF z`qScU=qlql8GQjvqkKW+UAMS3e(ZZr!hL62inGSIxphbpV13jsDpJ^HY z3T<7ry3TQ%>l{0&nXDLe;nM7lJvb1vpyV=H^{DAKNOe`hf?RZuVW}JRo7-4eShvTc z_NlqT_OO7kR$0`;w0HzKg%}YPhHYh*frUjJdSnER6dhimv!IXkr=;y>T5b59bxlu~ zsa6YfHo)D^9Z!_~1~rSSioZ3zYG>>Wt8>C(ep?;crrxhMcMCQEpQ%N~4dN9GOAx6; zAnIV|7Ou>%Le|hJ&1!f)!xSc)!*x`%71%_B8%i2= z9$G`R>IW>?I()aYayM3CFovg zVzGl_ji%^EgwTdL;A->SpR`H$V}Pt>*-7H3sO;N0R~z=7U4N(Y(hsqKA(mXrV2J_e zCrC+Sadgf-aNKYfJ$eY-v#FKHaS_f$qDa@0e+qG?YJDqY5tSOVCn#LG1a7Vvt=za6 z3YQ(=1KHE+uzvE?tY=<3N;|=)WgNoTLA~O~5Wr%}SN$m%V5=PI+2hsUeEdVdpuMg< zMTON_U)*}B(ff{V-K9OH$8OS47)XB>;;TBYmQG9m{<1B$e5 z8Igm(Muh^omJvC~P(KjM$yrv{4?u0K4?0q=ezdro-&6H(EiYRlFpM`>WS55%Yq3Ia z<;nf;{52jfa7X&El6R#D&Po=3(Mf7;`qYPW&1-6Gn{WHFQZblieKF^O!ljKTfQPhes%n=6FI8zA?Aue|n_qF3sOR{sz71>i#_0+6lB#U2c zE4i0O*t5$vEEN3O%8njQIN#S*D`Q-o@3pU$NRy?9c=&n}8W*y}wmV~8azRZ^&#WsH z&#RvOel}Hv+rMnde;fLXvnLkdO623ek)7UN9&X7Cpj$#~Ck!cLZ7pRKfonmDs zej-m0n>XmUPi)7WNS$E_C4?*C7*6gu zrKh-Uct{@9+klS;^)}#x68U}+K8yDMf%>+PEgGb`xvth{ENPa+^VWE%T*y1cjA7eH zibn;IMV>KiKEH)I&t|Wqw2B?V4x)I*Ri&yqOlk$z6W@u7_p?CQAJ){VfAr~@p7IE zdUVMJqoWS$W@|OpuD>0}+BFnjVamG_f)xEOpc$6;dO6i^;mDKbx|^{kRoesP@|(>6 znrCSO>!iq3H7TtSz5vV6pRW1Has7DwDN_mjrRmde8H5cVn0&zs3Nc)9sG$q|d*wZ| zPZ3Ad-tB3*pB4w}=g1~iC<&?7MQqT?mg@P352KgqzNGW(TezMxtB5p|bj7>s!Hp{Z zvyY7wm$P$p5Vp4u2ng}ji|6TuS4vFW&rk!tOzN)Qty`8t_!-F!5Mik%TYcFtXYvFs zX|j5sf09w|J@$!|!9)J=pg%C*xvEih$hsbI(D;~9bJ~W%u{KwS-jz<{s*#OU;i7^I z6S|#S1IfFnvPv5ukqgx-BRZ$~*nE#RQ8p)94>1?Ns9ccrB174vBj|OQzU2MyLYdX< z?w+D7DWILDDz;Xm!jp1ByB?LnGD63%e2-r%gI0~~Dwd6-m}a1p&T4b6)i$LquwspA zcl;Tb&oPvC@EA;1%zGT8!YwFoUKOrew7M}&_UdE=<{?e@Y$h5Q$qdDI0x7IkO>U5s zl4WBVA_xroA_y+45=3U7f}etuV0(j4*1EG=XNx4{DeN(hN#xrsyCKWqre4AYh&q$cge2q~gdWn%<8 zaTBpy>5losw-)en6zO|1X-6h){+CsSnWX>Tycr=mL;=41F-j!MG@48ucm7HcRC&uE8v$dd*c^7$ZyWl+_lx zC%wPceTVLAj9R&5rnj**IR?=j4h$Qk~h^Da%ii8a*6a{!O|n)lgTXZ@W`mnOC$*-qw?z zlY6U-YjEXVMF9s9BQq$8i^aPE7dxc}Sk(xxsfuofY`NTFT7XiyDaA^Fz+pi^$2AGX z;o_Nj87c7cos;VmPK1n2xWvG%FgEWQfCL)?Anoon0U7AmYkPH%z8ywvSvoOBMp0{w z!Vjo2MzQv3w&xjz^99=xZ;awSuRf!A_#9yr-&`|_^{-(@VG}M!@y)MoM&aXxQLvHp zJfmQhB=eUR9Vb7C9evXDHe|u{wwg~|_!{OD zHs9hC-}c((6FyG(#D!`x=Kir>D)D)lfa-0SQ?viB*-`pQw1&Y!TPgluLY)*!saP&v%=ZJ(delubluup&2m&fO5Bc=#}6&8Wf}_z_S^d;ZqX!#aZ}Q z&ZH286vpb=1iZ3g^l;oDHpviz-F_CMtKchwk36EP4!#lsh2Se~t``O=CQLy}sr`x( z->c;7Z-wA1(lXT{X&&sI5>Giip&GFPeg(|yZO5Z=SA&7pFh6PBRU@jb31S{M;;!QQ zV3qh3#ghrl3bA*Ticw#2ZfpZK@%E!}S7df+#9b+n>O2o%($5hd@Pn@~5BM_$HV)WT zHAn(-o(I&yTIYEH5*r{S1fQPQ1G2NN2i*S(^MF4;&jZfu0ca1Sdcg0_q%+Megkk}6 zWc!nz&K^Cs>a~>!f&a;AowJ)t`WV}We&-`kuwMb)>OszAMN2NefTGJg+ihQcEWT~U zmuw}f9wILYpA?^E0|a~j^tJCu?RfQ535p4ODqEG3ccvua8(O6h(LVIgxmAbd%FHIx zK8;V5s}f9?7|cD*o=Ej>b=E=v-|!-YLDx@1cFcUh7v_X#_`ltSgQq|>wQIuj&} zBRSsH$=9--W$fzYYovKyoseRoTF$OXzM7|#S0`WPPcPLTAmvK2GXLB!YMya!l)s5~BHm0wL+UV9ro%)L`h-)#HB*lkpH?y7#^ zNWyv2Y>J{{3?*EsihWK1AtB2EmsAN31t)e)3Qi%;Cf^ffEf)T(8!y zzq3z5QDvn7fPxs~J_*E>az-0VIr-8cHSK_#DrfBH6o9j{7)Tqi1^|<49dE_~-*mc( z{Sd&IoGb6Je9_8*%A{PKT*QU0UC3)1)D|v!cmWrBsDmY#>Gk|#PPMO#POS5X9PL`t zhiU(%oso=uqtFsuW_MO65%#4vF-l;S-=s?WCDhWgWE|5ulnhG-k9jb6|- zHLtD-(bOprZDpqzMWa*nJ9bKhqm6r=n|-+Su&;^rdS6d{3`=`mSr%(kCsR5p1pQ~a z|JtN`OR|4|n9| zw|q}`u4LTC!M@C9bPgcJ&@@Q(Z`uUMZ@Uah%)HN|# z{q{(y@yY6!M;?*v`|~4@#wM#j8hHdE{pQFcnB;+xN6_L!Bahf2`}oKs80UY|BgldO zZ93T8` z3-*Ysyf2(%piF1mxRCT_D+?gi*UyU&K?Jz3RrreZf9CR*?3$EfvNCMd<(l*gEtiVV zh+0_gr(9UV{|af4G6T&vY*9Xjtu}^#r!lk|V+ar87+TFSuvYUieDUeu{eZHkni=u* zMiIuatuH$!?(X#hO;U~FpvHcZkTQ;&7dW!TUMqKj?sOr?33p1ga zyR?zms^FzZWOIWkx!GzH_iVbSC&CpxNqTyp2LG%jfylX%lh3k1Q2cTOdB`>$asWb! zIxdQ&*G7>dq`6(i$8*MxMebV97G)5%=^4zDCTptwUReu{*&KvFr);fp8D zX-*<*%{de5cbdvKhV<4L@N9;a)10@;Y3`ZUxts%u%_m;|#OB>*dhv0n!AY);yTZw$ z04LIm%NL`R<}WGjxw5ti;HQ`N93mR+mnPo(B}TAnu6Iv+ZnUMO_Ax@Knbdq@MN)G> zEKZ=L?&2q}g{0=68&A`q%8Z3Xql=Q;gMSQI7JUrq6KNJK=^Fo-=Kv)cs3;IsW?X>2W+O zb2spZT<^*Ws_e?A*(P05o8F~UX%i2`aGRi{wW)zvE@G^W%d-NxlL!cH35XEK1~1x)cWaDMlCt*hENM}`$_;PbnKlk z2|)6?4gm-tmP+});iKs z>q=>(Qc_U}6syWfUpnfHyH+2h*ZF83!7BbG(e4>ialGc$d(ER%d_X5u@@}sV$Y>Wo zsTI`}A<8f@R$CB|%0B+HPe21wCm@u9TG2vSf0000nuyM0$ULX17t(nQBv_7zEo3@s zBxoGeA-TxW3ya1hDMx_uPaygHlu^qTMw7+i&We61cUZ22@YJPWKS7t&c>_Xq&>UiM zkZ4kWY=HSrdI5ai$TCt6G>{uj$RKh>w#OgbsE+FFi7T?}?Dk8#6{McmV7Sun$1@g# zz~XM=(JYCzk`<#nywQ^D0zRq04EG*<`t*pNd+x%rNc4y59aRE*77Yf~oT*>54_x{d@+>fmNebqR|KJ>ZOm;U4T+vj+e#p0YYR zx0?V~oY__3$8=Zk2NRfa?pA}I&GU-M4bTg7+=QPHIs$M2K9IVyleZk>?L0xoR~Oi$ z0<8Cia{!;e)FS{uW(k7;a~1`FyL}4mX`BL^5C9kEfZ}I12PvRZ&eP0~s#BQtXU8}V zMvCVxy)GEe&CdQrYY_@1Mn%>i*nxP5SwS-NDFpz~4nj+8n_12yF=dHHrr>m)yD&O2d>I;STqO6jJ7_fE)+#acX&o~k!`l(? z8j^ZueWNa&OlSo8W)9Kflq>ZxvuF?XM+;;M&4vvW*D;0%SQ5)o9#+J9&8cQAT|?24 z9@!UrL;`I3AP4>({kArJD3Pjk2M>HF=*U5>6pN}TE!5N?cO`Mr$p#X6boT0<$bfun+<S_gOXBH4$9D=C8$-&dUPQx zF{5kIo?iLr;MK9cxqvip;-v%0rrjdrt-CrNQ!;9Ydd#ddt^Tb5{|D?Mdf93Frvhy& zmG_qgZQlm$&Jt~_sR1sZE^QCKerdFQo z`BEe|jkCehM=>7;jO6CvY$SJM#3(6vX=1kL6_Q)!Pd45txv6N7>E;}f+)t)MqT3`X z`e#FQ2T_XXmMGP`6{4F{%h6SJo;4eXZqS(`lH{m6#m}m|Ppns6mDM~Ip^{0wT8;H- z(k5PAMdr|fD!aZ+IrBSFU8ppo0h9bO-M*h+a5&cssLe{C&6N0-=(Cr5G5z5D?wPEc z5I>%8qTr&(7;7;6uNtPiJ0MyLRSw29ekB`XBX zI5U5?e;s9H;`{y)T9>uT5X*;DY9Te$Xnks8Mn*0>n_8YC*AeAmUCP!fzA{x~KH-34 zTYuT8L}9ELjYhtJ@#oyca2%RA!F>{HD8hGbKZ3<_2{4(|d^dszZOy3d=V23I)*@Qe zNCwWzVH@@903mRVISae8MNY8YAjaVGp-;)QrWhRd0=$rWg|^YPCl~#|eoltr2?;+7V0^Qw$4bv{zX_7RJQJul3z!-Obo-o9rJKM`rO<4kwI#Tt)O#5IS!x?+^ zWqhX13p1FA!9y61Q>09Ad#aS#YT{%mvu@%!QDz*h8QPdqAtTY?)7o(hT6{7>nOh_f z3;dvP;i!OL{TyD=C4?e^h%rrV@2tOwVC^y{Tuh{dX$Tq64+cXG{AEx{_3WQS+N!u9 zu`xve*%CCogh!oa7T>|?b|tOj&a&1&r`D}y?dh!D%(C*EM~;M-WAlDQ`Mq$O>`+0Y zzrwaN<%)KUmJBi-($-N)`Ge0KAzsTihy&~)j@C%=ZIU!1f5PP?VND_8O-SSlP@q02 z_HN>J)Lp$E+I=TbmFL#&nwW-XTkS&I^xV8KZGiqpFZSve5!;GEng;vt^_1_>D6pAz z`1~tkjGpqu0;r(hrHhKyi_35D^FqJ5&2K7Lk4Kj{z&eZJnS!ID@d#$g|IzaJgvwyY z^`X;+&5{*>7TX@;vdV=prntnu&*hz!M=Ca-Rm_%|^%L@0#rQ?43-VVLJJP*eWM5Pp zM856QgZfT)suiZCrZPW4uo~;|Sfq(CA?lFHjCxCN=A5#WGT+k!X+1)fIlSTz3l9`AYf?>j`^$Y~p_oOi0#HWGpAW?B z?!7)eP*20sCikeow7k0kM4aFwN!8*d8Qt~PsIdJbk0a9E*?-OcWFa+NZo`SoooAn&2&~|m1UTT+#q+_$0BH>JU+vl!$UUe`fVjE`Yq9rWkdianDr2_H%X!S&%-}OD zOJ_>4q-Fd!VV^rWm8bT89hK(3J-IJj8uAd^F&ZN6^gf+tTqDaJ zBEUkf`cybJ@%}6&hhsFBS_S38od~xA=FFc_gZCmzbu`%3JsP)w!NXjY6h>E4=_GD! zN#=JDq!Gb{ys+8$j29wI)rE#YZ|kx2aJ&P?k0dItXhmpV%v}>A43X_YTfW3zk($s_ z474F4zw@U3p?>%4-|}!w?*%GG2gxN?`X5)rmye45%LK#iQKzGTuhUy>dRLc(JFZ)2352YINPPvPNVhq{P zH{CzpI6}Bp|B8;yvZ&|}*$hLW1s>UCqAQG=c5>#`$J0u7vRUVrPI`T|bi8GK}~BPysFf2_Bf`_@zYh^P)(us_xH3UnI2rVMh3Z zh;}!Gc2Oj)UHjgVWW2tlvpiIG_ZPFRw|VmwG458wi(w@MI7=iI>k(IG!U9dk??==G z{4S@e0-+^u?81XYzi@U$Jbu*A`d4=^i>;gf*K_lswgn01Cqpd5q*petA!P)98EwxinhPVR1C8LoqsAhs~pNbyyh93yb-v(61ph!D094933tmou|Xz z(MyE6p0)^AaN#FkY{3CS)Lz0cnqorFR|rq9e2MUF>j1HSuV7ZXhQoPmd(YvV?a5U< z^bpFW4RIiu9u{R?feN%@R6`;jO??V%umZ14JqmwW2uF3`Lq;}Vj~}| z=9gll5wqqJO+(|fOvFT+ia#P%*`ky)fjj|t!o z1$hMRPm9Yjj}ONrXiVm$^fWE^073^>aYh8u(g|DoGyjA3TO9ye=o4?C?@FY^`MW_L zzcQrdZ3>{lR=^9@;}GKZRyk@pPjLJ^8VQCBT8#f z<3rTMMxx#tBT}hYBuO`0eFz?RU>W)v#Q+)RTJ-AS9GWK3W6a|qBLoMcbimn?ruBtN zlGv<{$)&JKscInG%|yTgbRLUgCSwZ+T4jYgKsRaralMO8GEO=Sve2aZnbD9$5MgP! zj^hQ<5ObZq3rt+@4~OA4+OYMQ^d1Ex`R6*9%`p`*X3RF{)j3bhJ#+Q}9emV=Oh)z< zLi?ehKH=9D&^TuVGzb51Rs+p70i4C!x7z_$ub2)iKn1^#a$mF1G=M}Znr+npOeX;J z2Gz*`AOh0>ge@U*CuK!iNL+G&(u^-a8y66S;-fO7DC~K9uRoANOff30u{-4lOaqX9 z$AvGWZgEyXWDoo4E>0hk*7qdFXWc^!BsUH<0NgxDiP1*i=K_ICnx#1_j3xkpvOEAD z2%j6Q!*xFw;ftM&_PIdCBBy=g&GnJ$737-{ze?(e_!nrcWg+bb;%Dh_V63>Nl-_m& z@q1j8K39?OI294kST!Nk&ZiIpZ29f7%@HV}0#px}wb}5<2fd0b(jf|(Y0y>;*>*XT zgs%p{aSm-aIM*)dk4wGf_!vhGmJp!0T3I>lLO}mx+3NTogBl(LIkw```zyv^OZr%5 zx~!?kfD6B9O(m>K*Xfi`n8fUq&sfTVcgaz~tD(i7>pC3|#dSi`x7GR%gIh67nqy7V z=I^0St@CusM_4J?hw3*GV4|X`1re9l5urOl=jnK46d>4FJ{x%Jg3hx%P0X8$(48!Y+4P!X=7FoU8V8x^t z??^SpW-PM_ckbDu@Irq2@=#nyZR4uHSY>{MuGXT7`nhi0JxkS1xN8JKJ^L6xEFhmf&W|jzU`I45|-R5)| zMMCr%%i4;+HMx0VSDV>n$mlUn`!u^@$v~_Gg@E}T375Y{QqCaIq8j;uXrM9VLYG(L z5G~m?FNTL6c1ZJbE+YQUR=y^?rL2HHNQQPh>g!=7_se7~T)pSjce|R7(Uh8=Q!h=Q zr{_2hq(s$=`8xP)T_doGN$TmQn!KIQ^chIG&2FO20sLZ2Cf3@f-?dE! z9<)14EN8zD#L~u|b?`cvGf-*F#8Fy(Zj3D|(Dof)r$yz60hgj{#;3l-MBB*I7_G!U zeQDIpV=V^mLvPMf0qnllhHUzQD^oOuVUj0cG``T6u1+h~*D>~ES!R?l5KK_xkuE8z zyckJaHFFgrfXCcEq7_VJuCE{@BGUh8qfzh8V%CQfDlrnVjO2-0xu+?Z{!KK)NbGKz z&~~byN2CZ2{40vm!*?X+vf%7?bwVqFO0DBHX-0ZYmft20JkD=R zg?fm0KM^*s2Wu76UHpvAJ(K!aW zd>&OmpI1LEWZCAV5BP=M6%4ypO5{lxc2=_rrS!w3;(MBy1b;Rd0ty7f#jl0R*r-g+H?sr~h`S4<8VH-cO zFr9r7v#@s)7VfM~!qb!Roo50IA3QA_{F;h`H@tW`*oIFWOlM!j9PHhMgEy>k@H7X1 z@J!&~H=h;`-dAz(#uqOK+wh5l>FkS`gT0$@@WwR`p61{Woe3O#-D%2vVNgr;j>=6ENtT^7N)Z=Vixvp z!op{*O~TVGeE3XY;s5QlOv10NIC%cW%fU8$;$S-aBIaQ4CLBD!#=+AZ{NXc!gReg= z9Q=zF2cP}o_Qv*%z3FkJ-&ri#=L3s>8bp3wMo$KXhes){U8pO*}@v`7Dv@q#vpb|7;x@PpUK7 z5BoaKEWYJV;5`_6~w$C(a8C6CQ2 zG2_=s%-}*!B>xjioUDoks3_Px=|$wkP%c2bfRQHzaK+89BH^pE=T_3lNqGRxys5OZ zdF9F|Jl$}oBr$$-dkcwhUeAFRGhGxOM&z+r)c{osP}Pz-M(&obC5l=rBQnR>R*fWm z%el)!r54rtsQyv0$NEn~fGQlc`%KClfU8mzA64Bbt0h6sloANi(u&Wh3_+?~*l~w& z`c#SDKyMEe>6YYbQnvNLaQ|q1^+ni;iVwEml~Q zOm(+aAf~p}l0&?e1Mn|8-~~`n1%kgM5A78Mhb<+S7<@}FOUol^4LTWMT)wX^4v{Ju zgajt)WYKeVOmJ>fE3~UHW)&MW^D6`eQYAy0RiY9hbJ5I_$e z%?B-!5RRGj>e@6PJy1xDa*R;j(UtyZ+eWVH>goN-WZXW z*NoB7$EY_kMpO?3ii%G_sS$$4C_DBT^+Zh?t>canIp7IUuQEo%V~mlF&M^OvU8|ST zlgz1+;)DyHRBgh5bkYq!M7rP(((Sg;0uqgME9wZOtNoc6JOtyIf<~f_ZiN)#e?$`q zIS`XLVyZ6+Ej&3zx*0=AE*ABogchASS_Do*y8Lp|)zc8@iKFH3AwFeF6qIEv|0>GA zpNKgjTh3G)t-AFUUEoRBCI1ykLZqg!N3zuj$x2e0W%oZuakz}>mPlorAg^J>nIFl8 z3#E|A1=WRuCo(a|nDl9@`zPTwrfkIm*HuJ-!vZjc)LfxVwE_D`2rrZZnEbwmDj4KJ zsUT7&kj5R3i^xog<**|du3@y+PAZG?~as; zh$hGNr>zC>{m{vaX_7vX&l+@q(CflFNmR0Tk)AF<9>O5=J`n9~Py5-=CKrcFAZJ55 zR{Kzu9PMnUl2E&<VvTWztuib=Bz!c2goZ_0fqWEd57>%^E~-$ z!br$?>#Fd8FjBQwoUIJyuIg{>;y{^?%}Tr%SjiQdXPLfKUZflH zmHz?MM6ZVuH>?I)dO2LA;TX?J7|z*y9b~U0aTCKn)K)lEl`aeE z?i9mv{#riXitG-lYPwaWs;OX?gn-Db%nm|g{{@;*s5mnepVcQ!Gw4uyBFX}N+5A~{4c8c~y$&OIAmal@pRbJhbd#$Rv%2tr0Y014kOL6spZ42x=06z!9dRv1$dA-SrVf9kd?^Lt}BPh3Zxf6913NCYE{b6 zJx6r}_N=%mH5@YO+Q@|&w(~*yGD#|nenv^7U9z=Q+^0NS*p$M7wq^PTXlyBB>urW^@Fn1k^u zEn6h#7`Lp*&L-+jP`wdEJr-R?Qn9FpSNmR;ZfFH3d!phl=&lNm2t3O6L=+uydgzND zplZ-{3&~%6fOsl((GF5ge0t;pL52914 z+N4CDX%S3WmOsuYM5fxHU%pcXsFW7Wm_fa-o+IhP=V;}UXgCrst=G<-Ow1`+`yzE7 zCZmI{ak9H6bt~|WuxLnqau*iesxa@Q&g+Osji3-;QQ#D*t4@4H>e_~-S|0MU=tMKI z;J7y(+3}O9jl@7B!8G2qs?TU7s-dxwa9J`v5~`6NrC|gY`HVyGlq2p@Ry`dxCrwLA?@*Si)t(R&I>IecS>WR=` zD#MseYq0EdX{suDGLRtsjdA0 z!=;D-?oxjv>1|aF8ZycxRzG&!lw7Dj3xZL~3QSChWhO4XC74F&bPk;aDwy$wlW0 z5K5^afvwt>HX$Kx;Kx$iBq`g!m=A5!8af;c9zEG}ls(x!THnFq_bNf=}9Tp$XFZNxd{tZNQoO*>eDG3~ZESUBk;c)RJ;qEzMevJwmL=oNXt7ql|E>%-qzWXUNuFOkQ}tO z=T~UMN+y8JE$LM|K*69`*g+MyK>^;kaR4t{IhX-spaKd*I3C&*`lX^XBpQYllx?(+ zT1QPeu;Fwc$c$=DRp;)Rg>-y-zh38D2yxyP`;DPyq=L@T#|y4mhYloqzpdZE9eVEz(O~%8rlLwN%WL=cJ?Fc z&Z=l~MyxtSxq(&L*3UKOnR26M&>5K(`c>tO8KIBjWU%-4gu;3=svJXEiWw>3H|xk6 z=_Va92_1?9$Ie4(bbrC-HmwGHZbPX{OsSimnq2utc$*SxGc)qTbUN2UCwFzxy-J?@ zhHTc8#wJvB?Pr!%b)a+z5B8;HILBw;hMJ zU8%=w^P`+H(D{6g6Vo$c23vtGq8nW@{{Yr!#|!;tWl@5ca0Xs<*3vxlk91kA)QV{S zvB{tJP5%7kXTYZ~^)R=#rg_+#hSIGU~W*QSmbX>uG^75foG)or*-+8P=-z6Pqem4SliV4 zzU)1fxvfCaF{=a((TdDS=rgiVCn$T69;#P$qwUWM);by2q#1I+(9DR*nkq*XBm4$* zQrX9FqL_uy>|;D=_Awj;ZCy&$AshSHq%Ng-uq$L`jmw$)KbTs4V?mVQeg@&9x={3=R8+qVf4^OZ6wHh9(4q^8Ec^LWq0< zLp9Io^gC=XV0*6%XKdX~@yi(V2Y|CuQqLR@bIV0nTeMJuS-s?b{w226k!efSYjp># z6?1wK({VAdisOZB&|_Ig=dds^@cPJG9GG#Ie?R8*X-Hwfcl^GYw5gny1h_MUSzt0E z4%~AY66<3ayq0=a^;b9@3ED1PH)}iewT`YcTA-&^&Y8k+J$Xz60b z@7$AOzbV_<$H!dV*P!nOB<8t`d7Ap(kqm_f?RQ{Lt%bN(FC@H+mk1I0ylfEk^pZJ? z6X4brHmscNeHOOlk&A=bS|-E^i`66{1j`jB)-D#fhBvXsi8rk(c0d1Hvlh7Lo1wE( z^fP-vfdFSQZ;tS(+v+;q+f#)`h(`}4Eb+C3#I$OqGFh{2bt9qCg83eTSv4xwS)I%Y z^DB69GHA@Nv729QW$F{54{wSsK?_n`{f9X*(?DhALxje;mf`rQj}`4u84|ItZ4|N1 zNbs8BtbD}FZnq-=7)J#PU{L}k8dBN&te4V4t&c!H1$(faKSzCBA&G~w5Ko?$Was&X`!zTQxHg9bMJSWSptmOEYVqBH;z;O$Dde#I7D{P zX?ygO6qaRMRw63|>^ue`4y(ij4Lv5vBsqR52ak9H@o%E4xsvj; zThjXo7a{ye<#e}l!1A%k0dr8{_f`9M8>bjJE(U)5k#oWMm?%7Def8GOWUQ6$m>SXU)&P(4E^(2`pUL#`qXf3REdQ+e(=8GScOH3lnm8j4 zC=s(*V*Gnj6<|i)vAC#zW#c&XtqH*n`^|>=K6oA@;bzPiOWD40+|--dcW9`Z@4e0} zac3&IzaBTshpSDbuN(ClUuy5%u(pM?45u;;z@UuY{5TD$Hvb6@C`!X#8=R$UTSz-; zVg1t*MEJ65PO)l)s!WddSsZr@ZLWz=Pd4ds3|?h}77ES$XEoQb5H)3%L*X)f&?&Q` zZns_(4Z^YX$s&(BeTl?Eq*;>v- z)w$N&awhVkI(!;fb!}JZFv`sS73o&Hy|3*G{XDbkml{?zx;u@mx_O#aB|T1_Rl6s{ zsvoRo)wfi$Dw1Q?Vp7q_ZJmnf(aJutgGUZHmqlCR{`z# z{%mT*nLMrDaLUsv9FW@{pv;U?3gQ!L)7CVJ~ zS+kk1>GS>NKmK9#iil71h&K72x8=EZEVF&#)$VhCRo*8o4t(3ILTg)Subyw$e1~iv zh!xBDdmTj&+RVwuC)AprvgvJueKcgG~ zw)@x;MSH$^^ot+3>tm06{Hf>{h^(`@7$Y zUQ5hUKfM1lwEE3&V;b!hk&+k@0p&U|O{Bt+!VrrkG{(Je} z$)ER3{=9ec=cgxs9+~|4xyhe@IQjEilRtk@{d8<-w>lBr5=8Q?N51$`5}B%BkN(B~ z)BO7TuRid%&9Co#{nPL0)ldGvU;j$$y(b_4;3t}UfBuD!f1-KsdlSE&di*b1?>+U8 z57;j!K-elOpAxJ+q0BZ&cgtM)U#qLu15B0@5v?VJ0*bM+1*<`kV!O}Ko)!L9*$r&b z4h!#IMqrUU91Y&xi@U8YcYKi&jj>HfSnc9v8bJ6gmno@ZDOOln=@AjZF#`nr%EysF zv3vx64ozv|q>ua=MYae4&L)RJ@+}zm?Hz45G(wI@C6CP>qff{vfhk@d$7-QuHbv1a z*$lL}!lbBM-c{@%C{rE~h`TLPDuXvAX{3%-J8wagN@c*j%>4^n{Zel5lMF|ytxG(3 zd(k?|b4x2hB5ZyFBy2>;?ZQB^uz5tct>={zlz%R<2s^qd0Z)r&Laks7gX-OF_p^u? z)VkUImt%=xfu^1c&^GEF?<5sCvP(-VVATbYquz!Az|iFeUE88hkjUH{Zn6-B7VTH% zC$bfST%F2gz?R$DRIkx2NZkO!0-&FYb?1! z&aSbfv*dlfWd6qZt&L9WXEv8eQ;#o*)*(Ilhw?opPwdUwGM<^{LUarc+hkGG3HB~o zzOX-C$!i?&%4s8DauN1#jiT~1H(oI}BabGx5NJvYl;`86L?(ByE4l~y`7f^2CcHe5@POIh4)U0GPaa;U`)|5T_inHqdCh$pUle;otj>-vmi@CUKj5~IDyphB&7C_lPAzY5- z^$6)%)v4$dm@e7-QW^<6STB#*fV-GkW_Nfl*?z#3u~7cVGG6F-OWG%Wf;)?2Rek7; z(sVc2?vSfOk7H1O4xO0Y|KCQ@%_L?VuyK}em)+I@Xi(k=h^0q3fLh|tio z6A;S1+P{30wX2bqF2_Sdt`ujvK@umFQ$p+w)2K~jT1qYoPr=h|p&*fYWWf{Zbi@ zHm@fI+F4q#t#=s>l-q{WTESLnvC+l>T2R`6?PCmu_)w;n#$p?>HP_TB^OQa2=s1pT=D&=1PfD0ot6ect*{=1w#FE?A&8jBJ^mAoigr^)o+ zRwnP;lTq*_vvuT@%{!U4c@rmNHgAOyH2X)MxXqh(%;v53+(pOPac$nxJKW}7=^fKH zZ(5L--Evl@ZQk5-n>Q!(VXLHz(Mn|V23KOARKuk8*gP z@=x);m*0w@tOu z#zcTbSs{mHm~?`}qB>Y~BLdWcYDh z$#T(~E4hsi+|8{V&uLdOE)H8J_{s&2IuTbg`;_XF6TW0nYQAKU+N=tLR;zo}n$Ud7 zu%#9X>X)g{tQ735skR}Hu+TY&_1>dtILxPd*sGa6EYo1NZaAlh4(_eMa(Ry`gBslU^9C zwgZ_QATl)MM7k7U{&%qeC#ONoegK0;dDJErDIH-4#Y|7M#JDsyp1PJ6TcQIoWJ_i4 zRf}s6cHk>!35kM0V)t0IV8n+l;tiOgPoxG<^`%uTCCAx5*(x$gCMo;;yoc>)@C+Y(?^oCHEQ^r@4>F`)-zDBY4Lb90ZoR<3CrFx zijK9+>x*W{053J%QZQ_3!4)bUgb`T9u(8rCm<7W|TTTSSMwp~L+$k6~(8Yc7^i%(O$#)q`?mI(R^37{3Nho%`zwfHEOi>B)wOR5Y zt|&MEznEsp|I1kNm1hV`UV2h2`AnB64E5kUiEF7(`dT=ZO$X%;ZRHJUAIeZ{Yh$jw zJdxOZKdDCA(^Gl}YF>hx*RTn8jcTU9!lEO~SjrNf!h9~9bEgiQ;JTYdDl zImV8oI6@`nfE8j}eH?3So?TyTeeptRdh+sqGm*ueR(DRVdv-ZYyC+~eUF)8U4T%6E zoxWQ4NShaGIfB}7M)>RmjkFCstGN9e$wgu1FI&WOoc|pr;EF`dFyK0=Dg22U>s%*o zQU%1FPmrB?F-OuibGD0)22WMo_e|`#I&=cu_jJ6*eN{|AWB6R-zOay77;Xq{& z;xw|5HYN?b>@KfMvslrr?he!g#5C~Yup}oq;U`)D-0Lfblm!-gxQfV+3Gh*ZFdHxM zO#Wxo2~N)|pJ59Qc@0lL&}@(S84!3D|;yS zv6!9)}`Cbwx@F z=WMf*%%phGcM|7{u2r3>pC}8SU?D+_OZni39Bg77EE*}ljSBweRWJKienEXA<_0h* zU#*X_XduIe>F%=bQaq?XnpM37{51~kcR`%(&p|y+#j(u$ubcxYptzBjMA;jq{kv1EF{P2h8tG<6GbIq^pc(-*wj_8zf$+H+(jR~(ms4dk2+POP=X1Gsc%be^3l2$QwOlyuv7d}zw5q9 zwDP;|J3H;@ca0kao`bLQOaz~)TCJBbDspj!{gRMSQU!wqsY6w7L_l~*x=NR_c(`2SPrt^Ivb`Kq;F&AW;jDUssTxOJ;K4Qv=CN3#o zV_7E4R7KuIQExqPFAciW z6ws3%Msgni^{;=!I9a|PJON~U-E#RVaHn3Oer@Jba$Wi8hdv9&KxL6!#}x83H~^0a zOo1`|2^2u!cB8smWZ+B6uytH27_fi>`@`FefugoG3>9tzQVJ;%)=7&)wgIv;b>~*c z;+1m(eamHYo$}GUJ{yf9gcA*EbQ8t=0;zsUL!jCnXZ=w$j7(%&%M}1&RP|*CvBqtK zMT_=*nk~7$!K(Qt(etxLf)BFEH~RAgIWsBKF)f!h3LjYTy7?ihb9Q6k@N=Vx{ zMhf6B9|uPo1?3f&(MYkgIsh*|D|yB=7UM`Dc{4veU#*uvJpW2WCG2#9ZHOMq8%10O z)MRUe!S~&5fNUhQPDs}5A0lsZhOedQ%dLY-gz{h3`hGhKDC_}Ld*dwrnI@$s+l;A> znR`k@ST6upiHtgC%9rRs|4L+nhO`d8uEWDq6&&H7Z$QM!%HV5A#be~GjVkU*k50iv ze^tlJI~-hoA#B%NewJj1Qew*+-mikM<$i4N7Q&}(f#g0v55AVqk7lZuw+b~d0ijaI zd0VTeS3~6Y#kPTu7It#M1>fc>ao2Tc?MaWj=9R^jU2Tk%$Leb3zT$m@7P8DgBid|r z_My0ZI0ir*mULFqo7qUKkW5R~l|B}Ch?;{_&aOB(MBUlda&T@%tXd$Xg-gmoC?btL zYgK7I%vs7-F-$1i6^?@TfUU`PwYkkm(KBRYWxER4Ko2NJngT1L_XQOagB({DSrC0# zS3v_&iKO7ocFd%S!EG2Ol;R37+mI$4+5&)=NO858vNgujN>M`m`D47-OwyufJyf*F zXdR#Nj{Ei*$9NCKlbu~-yfwxP+~nGX*NnGsk`_;p@s9iU8OL~^U1L1e zI?&v_Hsgt*ew3=_Rj0&w$9?;ZW4zC;G2R;Esi@?cu*Um^Q)0a1zJ10q-qAJ2TVuR4 zh4Ef{N{n~hx6e4n`}`W?tufx2!g#-UN{n~hx6e4n`@=QHJ2}RCrk8X*n&e&?RXx5! z7JIYVn*rAL4kJ89bKy5vM3PM7)sv&hI(~0i&TNpJTkQ$V^L509HoxO{-CLz<@w@IVAF6t*tK4e(hRemepVE0EeMUV7S+Rfo*w&cp zH6GM-;^Hog{Zr?ys+0w4sj?8RaQxva?wa^(wz)7J+)kW?Axm{`KbBAmizhH>5q$ES zh5-cQ(D7pr=hem!H!Id0`8la# zW!n)7^){&Qij5c9aV=I29D&V)@4~x5OSf213Vze_-YVSSKX>C<)nU$U|MBu|hmJ-e z$^btIfdg`f;Iy-#G~BaD2nIi+HMvQsPXRRuwJtCCW`bu{k)XtLmJdYB<-a&k&I*=o z%l!Gd%Qta3-{+4|TA=j^EU^q=dIaj$BRGQC=kDM*K0@s_DDjZN#$`&ljeF%0fJ*UO zCzM8eOaPw8363j#wDD-Bw5Y!x$yWR3sGgyHx3e<3D3XVnvd;v46;!!`ic4Y%=%r4U z$AqM)ZwNXI+f3DuP76o^@Ro5U3&`1Wy+Y1-gt(g3AL;lb>=>q=bPis`XAOFTm!WIE zoe|7ceLJhZO@3vo;T8`2^|#YwJrY;nCJErWBIes{riBf#(|of_n4|Z$TYZs$(bg9g zB@FBMkW{_x9P5#&`XY`uqG$M`Dwr`(tcG`nh!_S2hCr*Lm;avRh$v4YMti_==#T9{ z=ANVxB9vH5Vh|&Wo#EuRYJRCmftT>t?N|60b+N6epB#b|^@H>&=7)t{m7~CcJ(*Nb zT6I6U#}AJ5{F}5JB~yip{Mm!4J(x6Q{%GCG{MkGHOtyb8R@iir0@ZnveBKcP%GA4D zyT(x|m84GXZ6v8Rra=8U2nBa=6WF8HwgkS<#ltuh`iIF&ziL)O``$t;;FicP~ zF}3gtzG2O%^c>*Sjq#M414~395~*PiBhv{$0zAUj^jeqR&`ieY9C&K*Z5_sNXyN|^CHi4Re6MEZ_F_oB9VNk-R)jvii+X<#+X)p~~+nH$jQC5fEe&)j~pmxVubm zfbKfR1n8KTuP=Z2wr6^ZPO{^E1aEe2nO|=`HWUt^bt1saX9&_s*a61mZ5+M{307Sh z6Lx5rJr8`D%wFXoCR3ggs%>iySSvI{xKz~;qI`ffG0-+2pdTwBgOFnjfzgSuujmsH z3FnCWVn*D8XeCsL_=;=dQpWM{^!dp2Fk@42vD^Y%|J+x^{-p6z}|0`7G1-79Op8=N5D8CJx1 zuRL+S^LODpLRnv|eD|ulXD7pV&D%e@eD}nUp6@<>y7=x@HQxAol zoZX&aD+`L>8+dHGnvB*q_O80eQvXPyl=>%)g?`!!unryPN>jDlRm!%) zwMu29&>F&?qB~cr$-{B^a@#sc(C4}7wo;fL@$G$*`19P8?mO z6H;uMRGPT|TCuHE_SR<~@}}baqoUsDHp6N;5|$^6R9w=cAFFMCC996mLdX-oHz_}< zb#bd8R$6`;Vx1`1xyDtSR*cYTR{3S91j^}iZ+qLMwrEml!8 z1-g~#Wt-Ne1i2Ay$h}rIB!1-5Dp6zWDzB|Kew>*ZA=u5?_5pSTR zl5wP>NZypyD>mn&(hQP0!X_z-BQ<=;F(=f#ng)s5 zWD_7!o2&-OYLm6 zoPx}ruZCi}ZdV0gRb`C#w|eMbl>d=F<$bjMWIa0122(}KVgmE_X*}_(Do9Yi*$Uwn zJ+rGkqOJuuY!u3N#XL^nqy`>A#V~n6tq`PG5kTv^#M8Ejh?0k`F|+b&U{kH}dA#8J z^V^La9BzZdXFmf(v3G2UV;d?dS~3bXN}|E<^oWhGOa6-bH(QBlP6|~j8G~|$6oxIi1Zet+m6G?y`2uDKqborP*u!y0#u@C0d0q)VXp!9Q9+Riu&w}0 z04!WGz-AnO(`KMk&gx0z-X3n4&SKFS4whzVb()uJTWOXfu_4Wo#2k%?<+`66I9#^V8KMnV!&1 zC5DihW>1p}@>Pjjt3qvLscP4v>C`KGLU3C(8lt=@A_{T(TZW1=d7OoYuB6vv-j5bdJczdj|3hkUnFhSv@n zCk=pDnu?eNP1)-jt;7m9Yh#bEOhy6IA}~bAKAR2+PMVkwxu@OH+vNd0^t>()sOtPY zMf#7}_{7QswzC2((KLuJiJ!3wt1}fMo0tks3PsWpBSa^ZH8B;E=MZU3tMY(KNm8#g z6M_(aAUahZP$fQf=fbK_77jz?xp!ihcOnGzv?9dXfLb>j@lKR{W?QmNh}$qh>Rx-! zHp#SG6J(U^_J2O9!NIB{4Ei;p#Y)>nb`Tq8SUpy3SPLwk4zXdJ-L5bmq^<(cMKYiw zOuwN@C|5MIDrny*>lJ#Ya@{2&@cdj&Gs^M^v0HZfF)?6!j!EhIF{6emr63AQ28d^p z4NOui8CHQ9Xqp13spdZR3HBYCb<4K^tlP5!kfQ!5|1N)803E01WomP+NF~gj94!O0p(` zt4&_5(ey2(eM?7eA?>svN%wrggJ7=EDt)l%d%Bl#ONd#GYPPW;La7f>w18T%e$l-u2g$TvvCPBkl5=iMw9(BW zg-kBiVo}0TDLAawd}boo*JdVu)oV5ChMP1d^F9WjJZ*5R20*qW&C7VCnCva+g69Tx z0uG*72yydb_T5NSy`MH%75xF|DHe7l*Kl!3vp<oj)l8-U&sd70{3ISNG=ge-y7YZYF2+P}ug zgvtv~wk{L`m7OaEk3C`42p(%)uyO>Cv@TfD0czV-erF+Jr$PI7GSU&>v-GwW|pVh;}uB%yqq&u#^>kApvQ{ z6@KCIZB)CMW8%}yO15i}*1MYY9EN!gz&GRo3@R}}-2$z?jVl29f+)Wzve;$@d7k}R zY^+A>pkmVV=g1|VW8NICcN*q&e2#1m?0|C5o`tuL7i@zJdVSY8uQtel?u%UTW+U4m zL+iUyrvW<$Y&OUUd!Vpa4oj(Cy1N(@IqM8w*2-thBqGJIQw*s6zai#)+GvnP+*MSK?>4A-B_1rALgpGToOYC^qS3 zNVSse15Vfuij8Wlr`M0>`9^NQY-E9SwymG%*>-2ZMj+!EZH*D}1XUc^7DH$7%0}g^ z7iX3I>#U%@fTBmbHs4%>g(yX!H%O3YZ;^HMZ1tu>^LlZ2MfK+P;mc2uq6!5e%8<8cki| zdBdJv@9+iNzhrvPri_oUfC6<&oJAigvYH!E8`vleB2=3Wg|Qzka@9Ukv7aun%;ke- zNpkkHMc*|0X`>g|Pjd<%6#I4R55kIY79^Rln(mZ`-g;mF3WvgQ&cS$b=)5@8!Z_lh ztOJY*Lqv|qx?)a(pBwA6Tgk9k2Z_Op^~^BGz*gJWXq_)nBk`ol7=;NvLWy0@9rP7uDf&}JXXTh3;;4vWgT(Q28d) zPq*l4VI2>6e5UBqsAz?qR`~KE$^zJ1R2J!(9dWLF|IwS@oxFLum^D!sLgqEV@ zeGr-LGwWwu^nEjsJ`Y>sFs~~yo*{5E#`1WGPBW5_WpAy^#&eR2onj_DpCZMv9CR`EW<%|{a<@BLb-pJc@#lD@;e9^gdt}F7wGE`;o0}mWu^%tsD zpMJ_eYyH(?k>2^xR`7RQkno*1t8N9rut^`VAP<)LwoSMbTO^@DR-5%{>7lKW5_rj& zp7)-$&%>g#tff(6Un*s214U41Eh$+xY-3X`Ln>cDY&qhJ#6D8MJwBNuGBlZs-#9R* zYXhCW;}0ycD@Zi>bSSeEN^HR+1vW}L@qSx}Y5#TNNxSd>kHOSq~$CU+hmb> z0&JOWj(|>ULynGF_T3SH=4Fq&1*|Me5HD*;WCnPN?xT?svak%>$DSijLC-|P&k3gp z2;mgjVT7YmwK>?xrb4f&Fwm$Ksv3N~A9v*qC>T$z5pu)0#SxpGapoYx9JnhY+s};mo(`(81pJbgSoH#jmplSS9X5% zI+a|R^e4!PB{r-435%ErDTi@Uv|03eQKX$dA#2RnCH{mVplBB~vy4l#kV^r?@&34{ zL{Ob#Nu{r!uN?`>iNukRRhP_Ok0hlXcO*!!k|V(!8`?q#N5UU9j)cTstQ-kxi6cS4 zVZYaIq>NPqqj#$$(PV0V{$##mV)CoIj{ zCXFQt)Y$1<0oejhYl29DWgjP zg4uxWH;r_<2&dBC+9c84^~p1lytm4Fyq5ES*XS53)MXLm)Fo&^4+_5eQ6^7yPuE8r zDUPHu>Xd){TMr;kseQ*eo`d)Bu6D%=itC&eOiR>BV=C*Uov9ud*jO0Dn=;8YeF1IK zv0B|g<4N@tMAe2!@L1PYyN^By!M3^vay90FEiQ1d<(V-?cuy)vTq>rzv3AnAnNOIH z83kLQB1GBTZ&(q5(OE?VMgdwQ(PRMv2LHL6pxnw_^d#lCFc)c-LoKB-*;itFJK^nNuZ}Yeiz!`n17Ze;^1zQA%!Q{xKJ%ZzM>gy zDg4C}g1uxs=k_3(Nyh7Tq}LSd?n0Xdmsd-%UP`VS8KPb{VyR|8w89V=O~4q#*~{y) zC`%I|71IzrXNqDtm+^yv>)XTHMwHE*J8`5f%{oS6tMq{9>FXQaKLi;6(hY@j*4WUM z*ne=}5ih{aYsRsmjHbsZMc`6upBemwFs8tcT*m!N4$jdvRf_y@Hl!L{fG-(nZD@-D z@UI5{CF%A_$=;2Wlthd%td&c!3|m8^cJ_)MNR_s1t1et>yz9L;FB3XbPwPGejdTZ= zAlor1CE5W}ZZ1@kf&+>R`vVqpcfr3yy377;Sn;HyEKXy9FCcU#Fp$+4u=Og?FkcA+ zC?U)!m^>YkSBwd;kc$W+SADubKl{{Rjbps9>Vthj>;t04)dz4WNlLaq5ZecQGz_KU zZYHL5?}UeG|oyf&5~J%xPL5N6z|WeG3)+CZ?3;eAumL)kSA`ItW-EOeE% z0fUMNtHOjBI8)a#z_5SvdN}fnn#p3#WOqpTm~H}bLUMe<0LseGNmEVokEX~~I*@-8 z1#&xkA8X!H1z(5@ok}X7o)m%Dg>BqV73!cM2%Ro)w!~4C$YE)J{u$FKWh8XZz69Eq zl)aPJm9Zvd+4uHfabjL?v8G-{QDXAQ|0mjkrV-NkOaRz~r#8{uDwHGgmaxyDR7)Aa zG{q7+)!Y-tE+v#mc30b4x4wp$8P9SJzejzIiFmBpe>cXG`l5CepOfCye0JxK^!4iN zmULl9dUISG2du0!$_#{QD}GHYTX;b7(N15lPG%CFY$9&$Wtvw9!Bdfmre^COOZ$tN z`Ugwpe)wSng0?L!M1`Nn+JV~GUpS%k?}Y$|9>FL`C^IZR7}y8$AA)<>Cn%7x077F+ zvgDRYKp6(OM3uZ(?=vo5;CEG^+E?HHH4z>?sxSl*+4#u4<*|O~(|m}};z^t)=6a#K z3NhP47n7wCGq3L!)59<);D(QRx>~6N?a+&OL(c+QaQcKLBruls)yW>jMXL`ARXYf50^r z3w6a$6${BLRrKn|px}z1RA$+yMP>~XuU(>mJOV%^WXF9>AYCxC56RlM2!IZRv&|3IJ2 zs8KGy`&6)(Zlk=huf|lhT~pY&cR|GLDs>+9i!1%ntme1oAIytZ&D3UFN@u<{yF_b< z3!*;A7}%9mIu;(Gls6fF+-j)#m_#p#rh~o6Iz)Ev)+m<<@m55 zXW5%{l-|jKm_nA}T7gN0$z)|V9>_*rz89QkRaeD`)tgIy8~rLa|s{ zh1fPresQ$889OVWZ08yer!s9M1b~?OMla#@N`31G^P$E_!3tKOo6$h%F`>{3`neJ7^QNE z?Lf$xhom^zGDjy1SaFPjY;u$Ri?M=DT?72JZZhLj*2CB`dhIF8dBoKC@eGKc(J9oq zAH7U^3%{^%aMHbe)ADE*bh1p|FDI4|tq4};AIKPY6hnc?Pe+htH11O<-ta!FV&(nv zo00$Q@)K8xbsQqG7OOsG?rqhdh& zCXJ+ji-l!~h{`*USkv!I7#M;P)L~JV8U#4rZIz$b3ewBZg9|G^F9<0=FD2H>&u7eY zl>cY3061P%{({KL&v&?UP)f0vpJx=T{Jb9Y^7C0!exBB?{Jg#6jZuCcsg;%wfN$Su z0ljUR3o6-92lruMN$)8Jd$M1?X=JE`&JkgZGph~R6zQM5EB2e-hYMwF&Hma0U?Iuh zr+g38OazopK^FsPuUNgixcq?zBIhPZ*Q*GBH3S|p8B6_={>y9DEPt6(9|7-(2gF2~ z5o=}N6>EreSo6q^6_@AjD?ju7@4d8$uUAZhs>Nvym0VX+Ih}`|20X11xOPi81%{DC zL5Zfsv_a|pXz;C?A0BJl_Bvt)pHWzPi12&)?<=$i+{@0chIKjrH9X8>^H731k=DgC zn=9qV3?B14(yO@0XY)UmFy;BHOc|7NU`s)+T#cd7g{cWSc7cWd9A*^X3g;O`yc3YbAnW5Uf>N;bY6%!^}_QkpfB5{5=|!muoa+ zOLl+4ClF$0ztho7Ly{+M#<5=6YSyjeTsKpa8e~aQnKJc4#43ObZpZXVf2%I+GCbJ> zi~4F_Qt+K_xX&X?p-<-fCWCibA*snzB)SI^L1qV7Qv=HlzDwN`hpfXSB?9=&{8H9o@<&n}pW$pQhMiqVY|QP@0_YRW3k z`!A^u{+QxT*9Cw1Exz_5>ZyDx!qC_8uT-xPi@QB}6Odt?1Q@wr8iBJ!V#&|!3RyF%VV)6f!X(feALmoPl|+sA|96^&~e|IUb@M zyg8a(S%rv$1+!*fPMD!M=}9$1H@2QKUZ`i>ZA() z6aW~EbI}uuSgZho)Uu4dhALEzhr5lNgeR4dpVuqpm;$JeWJW~`#(kTN*1QV z2T`8&s9fLBO1Iqbj++%6EasOzD0;^%;CI&6UoH#Bi zm6>Dn7PHl8Ju%pE4G0SUa>4CzmU*-s6p{Dtg2vtpm zJ^V>pjS<4Ap_96Vg9$_t7R}LO=|lt=OqVs72}rRgW26vlFvqhDpb3{oQ%{d-#O^Dso{ z>-{fvlb)~l6}u2GMxwDgGQ!p#0Lc`{J2y%S!0=4D)&U)&k=POgC-?EgRH}|#N}6!^ z&e*jr85z!316-43sp~=|mHG*D>|v^wE0Oflois>Cc9m%fugcq|3Hcwep?341vTxe= zNr(LhQ)M7GQLKIn9)`qIC*{%Ct4bnbiJQt-Zr(VSF&Y%D^Z}m5eTnw40kbnBKxEkV zWUtO-22FWG*9hT}ot?AA5$NNK5Ej8j+|}A>EO2QXUNBDKIW%-V&ii~ufA-p_*I&U3 z6TXtyUm5Bvw4=w-H7vrwmVpo?a>}N6Ig_JxNfe_4LAr@Vhlb2{uhVr~nsu(!w7wK2 zB5$6I%Xgq0-LO5mg4Pj3SGnwz3o3{rA9t09|aBsajD+g|V+W0-Z}KHVZ}NZNk)@eFUj>KJR%E)a;K2RCO6E^Hp}L2Nbivd-(T|KB zq6XP42C^607|Z6NGo=YNsxm52du=a2cUFpI8?FzITM5NPWGzxZxhBGQ1_F5 z=mZ0P{toD3DY+#c$8?ReTjQ~2I`1Pn*lG!X;6y&*inLs4$v;Bkv9}cG?+_V#Lm{8` zh+yzOtC|Gt1gwu+Fl&su1(af~rR0tB&_Fax$#o;ZTuN?GUJR`fIGm)=GJ(U11rE!i z#{7}mqJanBV-gqo_ zi*iaK2QX~4;oHC2YD0aG+5BxE{Z}Oox~RUdhtz+gn`~$d!r7vhaKrugnC^2ZzKJ9z zM8^=dfiGpFjXFf54LbCpG}W|35;0vE&aS)j5rl0|PQqo`SOL84}8kA^Xc z#&tHcEPImMoTCrWM9OolD{K;>-Hw87W=gw=3LQZJz)mIsrP~* zIJ^gI^-C1ORGAZKocb|JahG`JhJ5hj_2sYLdiddpgpTzgp+o6((|0BlI%Mvb*AIP9 zUQ<~Ut~9#fd#3Q1j|eS#K>(m{i%cRq3p*xWZP&6-a3)PMeXpN>77lcRSATf31 zfDrJ7E~r+7WBYQVuMtVX3uL0&LMu|>@UYkre$LRR^2@&rXR!4w=SZgw8A~IJ&dG|6 zQsc4$ljRbWz?)Y{IB7P^_OMt(i#5`C82e3dOmEY3n)1y}jgg^zl-8w`*!9hYzG$DK zUHL9$*wWb&XA2zBTRxq5nCCjl9)oZ;0B38kxYz*3?D}^Ed9MYzzqop@q;wKovR@G< zkgx#~lc)h|2g|KCm?zOxvtSrLOWR+@2L^xLS#`%q31bWBhuxaO30w`E>Tu?p>O>5A zJL4d!6i=I9D4Za+wWp`$pK=tgW#U?CZ$NYg`GF(}@=E}Pi3YVIoH21s$fR~#g@U5e zQZjq0HKc@XszZ}iVFuN72%G94T&uziJPoF(Bk#lCpj_FeI!McjF*{Os;^-=!Xm*R7miZNy zTc2f99hcf4jrmwJY4Ke&F}_<*(_R2c(=>{$a3H9|raEy+ayOgmRMVcVERs+jV$s7spQQzsng`G4K;=SW&E8EXBfNiN$$Q^Q^0xh6*2w!bkoP^OOy2DGvPRx5HU8OD zZ}yU&)=ez>X^p&319|_>DU|vDHJswglHD5C zr1uGsH#?F~OK+?2zDC}sfxJI{%H&Oj_md&--|i-vo6M`2(U35iD5?#+oTz|MDdh@t z#`e~-bJ{unXbT^a(HI+Tf;kmK+y|?aJM$FF4=Z=)dvOTK#07}D5SO3%@B`)&!zShN zG4hL=drAQc-d27@)ygm*O*KNqx*8#A@7Rq9STn0-b zwXzgWhci!K67=$G+66_JT46dFgmt>h%)J);TEzS=l$7L25m(VQi|Miev@PjgPwOUa z8ygqlUsvPf2Oi)q712&5Gy)OKZMYInf^=#yFLp42P0$K3hrRrWLAuv3IHUs40mbDg z!}JuSlAuHw1b`h}kJnjJq#4n^z#=~-ech4}6D}(*0BhghrTY|!6ZSk%c*$H0 z46wJ5l2W0tTJtsARh%aDn(nJFJY=q81rt=X(e|4$W>r$?F-(vm4jBNkchRV70r6*Z z4W!a}6gx_!h}9avM$hkI{ac-+$Yo(@;SQr|QNxgeHTRhLNI%jfZ7bLl7sH8_XYWpw zXD86(%q!2nTmHfF--t~*brp16I@KjBV4}E73Tby%t%6R%#J}V93p|LXYcDQEk(D$_ zR8?gc?j8Ar39{Mgq^wc|q=jtbfOy$z{InGpQK*bAN?)stt^zzFxvl2GD_`~Qx`Pdg{FXhL7 zwI9Fr#`>s1nOIXL$>p}!MEUMJXh*?tG*5sM4o}6$q*hjt zMisIO3;-aPFg%i~u3Wp-5b#)oX)Uz?{p4><1Nw>TN&_g-D*@0)3{d<7ToRxU#{tlH zzSjUXFzH|Wd2^;74{isX-qVvGrUypM>7$g+#I$C8)P(=F_wfOx6h%rYqWY#%fWA%H z4v`&WPRROUawwF|;xRjb@n)fqH_eG|sWvOV^@;a~Z}C?Btq)t? zYFvI&H}$Qg{ua}1_!d`{m7|(`8Y=(Rhbe+&;{Y>q@xb8oT`$tLo9c4R2^OdYa{@j} zjHS^e^xQ(REEdD4zKWkA03~?*7IBE5KqL*sV;(boL^(%%&`|NnCtQ`H53XAgNz0@R z90mgr7z5fcszfI6*7?k_%4`&>fx?-zJe#azW>JzQy%Q9MrHhKNuizdkG|{GNtL;YK zB#Y)y)Xh>D3Bo0cwh9g*ic4@45)l()WplMKMzD8{voa#fN4E`PzSq8&C<92?oVsqA zLE(Dc5}8drR{spUQm6vN?$*`+TXUW2LdaQ8H=F10)1BDvw43=<^}?Lu&YR* z{OhWfiLZXWdVIxK|DbwaxNd;?O!dN?=Lyv9dj+=XUfo_juJ&8a)GE1!bv4cZ$JM|3 zAF5_1VEIqFDlK}dai#GaD%(%zAMCV$hU#>@JTlj$N_Z5>;2$(yP``tS=TL}>0Kp~# zkD;Z4vqrwJppj%ZnRk{q40&jAqDaiQp>unfuapUN6ls)h6Mr;MK%c3ATqcJYKR&Q zyr^XVanE?svi-Z8h$mLUKY_rAS`XBsz^Ta)G2qB&qY(Z@*QwcPDHfqYkB>tlbdD3h z7WP4^DpDj0fcc+ca>p3yDj?Z|2%$UsfOVRbo@0wXMd4+Dt!cN4!fQm|I7HeVH;C}K zO|T3VMz#7lIVb|?7MZqKE&*l;a8R)4J|I_s1O3$6#FG6J&`rGMch3ld-?%El|FH=E z{1YYkjRf*jer=83*XVs!dQaASQVUi6XBMOK;g27QsK0#6hdvu&g|N75m5+!K`=~Tt zMndxwVjm@pb$GZ1o9Z@724R3ymK5{ul0`+)^Rqf!Nc13wZD>Rswi3n2VM#^Z6bFx} z#rot*6SdX#OI0>psOncv#z$1%3S9d7`tr7L*0F0+lA^KAGpeO;N|LT@z^+gp3Xl4k z%vn)+bGSCJGpn0azAIeo*_qWcC~xOlu>qS%d6Ujq2oo_#-U`j$9UkwO_l7gJ2?}R% zdA}aFstWh%Y*ruDT~%#onWQtBSge&|PG^U8ZJo~U)R`tmQ%gO@4tbc2q7v7FlFpo(e>n^W~=;9+D@9z%2& z?M1Ywd8vvkt^(yK_@W7cx-Qp}ucN7sO0F{m#OwNcY3)_(lFFf3lgsg@qT0C++L&y( z80d8-P19yQ;EW6);KES30xm5Rs`;pA{nS1OkhKO+QD`5ZBZd1?MqMj8LKCPFk# z)4nNVi*-PDM!{{p9nU&#!?WFG)K4WRRuz-IOV+Ic{TL_Bo;%wVXihrDaFn6_A{x7k zk%m+D%o&NjelcT#$&xrUse7VH;<8B%y8fO$@h^|phb>St_$Api!f2q%9g22ND8Q?y z=d?q?`nw>Vj)(ml2NEovm_BIn;6-o$xOXMW7G26hj$2QwU%_L$>uAYF&Rt!)r{`%g zT#68&aKF@T)_MYZ;Iad0%K%C9RmTmqo>D1AsX&XBp9R*Jct{wa4e9qN5K02Z7P!CQ z)a%Zpw(@%n$WrAE>r|#fdr2`+l<}1iF9J#SUgnEg9b}}uiDI-$A&m4X+-yNzWYrE~P{pYUBAM$#8e^>Szzm?w$N!(bw~xB)tO`8O z$Gz`&RozMoD5yg2y;iqx?8;a@D@`&G>GxzpJ|r0I&L8wF*J}RgwPaOgY${|j%nY3b z2%2tLJ*cz|$~gF$s6@e`yU{@@5ZkE8M-O8&iW+)h592W1I>Lwzn)&_qe$Kh~ee12H z5+D*yYUMrWp7WgNV?X=ZU(eqAiRBHszlG)dW*Rjds5Lh1Tc_=Gy+j>s+;e67a(-j9 z%amrVfg}VcM&`cBuRxL%<0I45#JeLX3BL^mEGM)@Q2!N@qaaZil@wAVGmBDXW*z68%RaKs2I^l|uqBLy_7yqBBQL)tb~Zh)=!6mW4};Br7~1^gNQ-0&t?? zd9cO<7Y4Bv-KKF4+p&*?z2PX zO-`$;mO-qQppt0fDw=3=y7y`F#6>g-_CxxljgA5GruPp2PR+@3LthdQS!D-NiEwbk}AFt^YK>mzZ z&;NXG^Xc+Pqdl8GCQdjRx1TnBL!@Ns?r9>zjrZFIL9#zqXgldEIE*oM;n*bGrU}F~ z7UuJ+dmy+|=r?UYVBPEl5bZ1SY-2QSx^s0(UEl<3kOv>(K||oCV%TbK?_k-=JE`_n zK7Ei+Lw38eeYdwfBB+<|$Pe)ruMg30t0y@{U$Y;7hSV7jf142_0BJy@5LsWu&S;-f zlrRsaLCG3^ySFy>hzuTm8M7bk`hv_BS2k~Ac=Am~%)hMVUWXjJQ$UYfsL*)w20M0A zEnO%mhea5@mNP&_nZBJe!lO(xNkQBO>xNS-2v=4ju+Km(@BlwSl;+rek_e zUFm=3jLtbK6BcPNlwJ9BHB(~5rxGK^-j96mmyUi5yXScy@)fh4W|uyf#oo@--|W0? zyv>{yo4-6JS97z|>{#~v!%l%focHHiOtZ}77i#+U4w#Jd24I?CB9Y*3$zA~cx$t49 zzUu|w!Qio@h+2W_lTQLZn%yosPK0_y>-190v|ta|j4Da)sEiogBh0mFBI?bxnus*l zE=)v3YK3eYrz!mm;wnw=9us}Y^BsHZNlD|o6zNzf(2&L#!8tOYF4?e8Ny!qv(Q|4o zXRC6@7X32EOTVmADQO}y`q6ELUEp%Qnw>6enl5DID%2~`~7@ihKq3k``vtC3*K6W(zMZ5JCMdMFB@o4vun~~!%Pmf`f-={ku6j{nV83Y< z4vO6g*%40RUL>bAezWEz1U^!~b}u6pk3UE!v__u7{6XqLbcpth`jrPeLfX-*4Y9O7 zxFi)l3(19=p=M#HK+VWN;Bf>3%l43MB9G7x?WLWo-sFU4lnzi6d$H2qI$JAtA9bIa z8nPNX2=syf6FEt-Pz@0gv7BGRPAl6Yl=E~qAM^h>igjCOIRvmgVeB^HxoY&Zd+%M} zL{VkHD`PBQD;*j+_bK3%yn&%O3Q zh2SsKtZVn@!xnEJQ!!;SLyUkzch#NTw`6=Tk z!70nU+(p*ZrB2J%La07!Kem}hG>?V!n1&`SjUMF?V)M()2(SHiNZ%YsOe*~j2{Eui zkh^7B_R|Lsq^U%g6pGbgi{J{D(d8j$`mkwN60r>lBi%gGU>BIT9231{?nL}j(M)z- z?46#jb*pmxd4@%H$crEYp;2|0LkhDSL>Yv$WmpWmiQ&H@oGgOiE4UEZ6}J1nE6?th zeqAAZAfWP*qC3r!k`GkrrN|Jci+CRRu`FaW8Ov>@VFV2*(pvAg0I*lP0A3Ti)He0CosD`%AX~-my}z>)c>!YIXve9hcqJ9##+w@G98XSc1U+XG*dW^ZJC_+?RZs zAFT*dk{y(0Xd+JYvlB1j8Me9#%P^OEw&A7Gc1qsm86@EHYQ)|emlf>PTsGjiZFlH- z)%9?6oH?(9bxPfE=6oTSyPM}%|0QqMpI2RzPdk2b&YxtGGJiWS-^fF3#J3@@&DWk+ zy?~#jzKEZzIEVruT^p~)MC`xGOT!%L>2^FHPrh@kPfHvRGMc<4&j0ETT|a|jMbDl= zZS?Hv+0@gx*sDu(2V+3|iIgH?raTv} zETh4dC5g9kT&tJMl&w$7$AL1E_aSE*EnSOX%H;+#dTPJs{-)qc7!m{=*aW%P>^Wgy zVFpXd1oEw}(JlNscs(UNFNI@Ywt46TaM?aR`86JMidi1h@43yjdD+R!)p8+U zB6dYfSgzJ111#{0V>Y;s<21_1Q>x0csRdmib9&c1MWo1Kz4^a*5<(a<=Gv@cV}R6p zj6r)>{43iAVH=HyNE|Xg%A;(b?&guh5ANX9YOqB zpB^-aAB`wUt+P5fY4*3@{JwMob(fHJK~apG>k1F6H!Eq$uFtU{dZEdYZ%9W2bl z!R^hO!%1_KlJZS)P`JC5xWYTe@tN2eQKDPg7I7nPs+bYuG6j8PIL%!V#;q{#xXssR zH3=g&>-N@x!9a+37 zj0yAh41n{fhkczG!0O%stS%40I&ut7fcrq@oWEgioFn#>K0)5mXH^^iSMz@pcN-fm z*U`p!Wp%UrV|(FG^NzzXzL0nAX7^`#$5=MHLub2RFB8oY zVngYU#qVK|T_|+I5uIfBFbhbTQS8`C=Fkx>KcD!6_r0by?;hWrMxyKfC>mu%a}v<9 zXmbA9#}ZDIYA#Uov@Y9O6hRjagkO(sIo8oyS!&(ifSi1w ziZ^JxCYwLTTQO)ew9GZK(x+DGJ|6&Q$6B=$%uwx&-3W8VyKI6cVV{cAm=SJM?JSQ` zIn51P$BM$5&$f539Wvw|f6zUbj?wl{5n`?e?1C(X z?v$yWmi1S-rk&;KLV2Cy>7gcAd8*^2V+gy4l#^v6y*}B|Csl8WTzlOy43>l9y*jIz zIS(Dj6#{h|NYXX$04L>~8AdQ+kvfp{yFu~Z({=n;MC#?PCny+f4}OK87!3s-jmD6I zGpkUs97t(#cXa_H>-yPKT2M$KnS zE4(%WSYhd+wI_UDGkVXxAs?W80*g zh(~>==Of}5XyTc;2E69A_uTu&x1GDYzH|0$Knufbc&yQbo*XyUp z7X|;(>#n)G|LU&S&5yr?#RG^|x@vm-zrPQE13sQ^p7re4EnP=swXq|{8j^%Hli!s8 zZ&GLdkEX|?hFFkaGyNJo6?WCmNfB)11Jyaewbn3LA?W~IDo=fx8D{*)u_bV!=rg8c zC=$a6^A{7Hget_HE9S&uFpsj-D1XY?=YeOPDl#$(AivIf#NidIRjhOS9n%+CV);d4 zTh7?M`|fjK4s9~=?d_#ERO^9b<}qWhG+m8_ zhXA@_&Y?048GixRSwsF)#}8!;5#b6%1cet^J&lIlD4DRJP3bYDhbsEQLvz{L7r2>y zfl=5OdK1k<0Q8_%m|RQOm1mv+*t5#s%<=ya`WPfVv?kUbc)z^%>UM`3a_v=*y!Ona zKZCrv_M}3}Ofe8@cJ0xaFV3q)B1H=`1UA@?YY&DKCHGl-Y)fWIia{NBFSHr*6-0MU zX7WsX!%^3>Hd#gf4VuhQV;4Ebi|hyt=Mxhao}ORA>Y0<_?^b@Ufh|viroIRwPnl|V z0GL(NOS;vwo|s*Bg*fSz*6N^D+IN9htCts3fLSZn?lr6TE*9_WSalEo`Ja8^PyXZY zz4zhjo>yzx6LOE~16aPcRp?}I+J@+dQ9asLJGjWUHyIBBT{xyqFX22$XwH?DM<5^< zV|QoxcC2RDHOKbQPu6vZA1D~tt$sTU>DxpWew*?e|DO6;`iG>w49Aqs`PKv1Y~2YI zruW{5{C)gB>UfoLSim@Z0#`W7n8DKw!*LJoPo?=c6N|NbiDDb(BPEN&A!i?knojF4 zvb3lGR(vU!_6{d*t6RVE7-~dJ85ED%IV_Dn!UdFg8gs?3W0+0b3c|WfN@tws11%rT zDrWK7FA1uuhY|9ZzHj83=968dcj?!+fa}cd;`Qri&vxA(oF1D#JIV6K>G{*U+abw% z%!!yDcsH7pece^a1tC3G;p*;H=n({nZ@~duSK+}WwzqT}Ip67TOJ%IWLjVH|*@{(2 z&8|XQ;l+8i#HXx6*utS)g@;^)lyns?w-+T@g_JxzJ>+3_uEXUL#Qf8&(@|BbM;SHWw^m6%43*-)U)>?vBuV<Cqk`DZ@nSP;es^~qPOasIQ7UZ$ zebbrGT8eK_SWiu5F|m>hbUd*Vn!d~%4mxYgSh=x;ic7aFA3+%e3#?oLSHQ}H0XAwD zD{X}rftAa(#HWds=npRv*+j?liinOu4pFZ+dz4%*g}dQilx(Myv-1_#HuQQgV!HZ4 zOozBJJ*Yf=&>tI?L9BMqIUQE{YT&|sagKzQpXvePI7B0UhK4{#&(jc=srT%7SI@xE6oHoOM$9{YP4#ya z>5ivP!E!=7JPLT{?1HYuKtttqayB)#LI3jP!Vq4T+lfxkHw^){M$3C-z38p5No}X8 zHy^DFDuGy^4e}emkr0r?nM2A;*d1mOll@+AHNF^~nLZ=s_4qMIwl;1h9&RE}hX3$0 zbiw?Ywf-1OT){VDt3YqAF5M2j(+FD5GFQ4j-68p7Qbnj&PedER?&Ar=U@5mpXRAyp zlDm3FoLA49#hmm1jF@qbi&24Ma?l3iSq5;TUBPmugm}vXNn;3Od@rZCE2M zP?yRhD%+(b8!J``->OZGAj+e8N5qEi^403Zs)6n^D^{Rj1lAc-*kB6DLs zXVhQ(vG)r(96FHLG?{q;c-)a;#n5MhPw#JMp4rrqalC&NIV)7Z>2zbx3iU6~fWRgT zw6KMJ^556^h%-oN5zvG_B-M({%%F=n?>0W0d zS$eA$i1-m6xtVZ4AzA`3J#b%m!8!N8j}+-Y5JA*J?}gO7a=r$M!G&&NF;dApB49sX z62#z`=`(!m-Vl?2a&FjomjTkeI5pr_;0-WhhP!v=_6oc>&}y^CaU_Fy;6Qw})GcwT z@0J_ad%7ijhHlk>mTrY3Bi-WDlM%z-cdK6NmJL3SZqezzy<&<`DEK2irb~T+Xe)aj zGv|QIVp?9Lti>`_7q#T#ARl_Yv|^n?S0XD!sfcpeLWcAbVX8xob(=yaXPPS$X4O_?GAMV++F^s z&>bNk(HVnG8WF|V-a2@(eva)iY__UtLS}WBOsdKcHZA;5L6TlOWgJ+_Y`n<25%L8& z^P~+#NUAT9U-+M5+LY1_{-?u98+ak516k?0hM3%*h9WdnPM47pNTGQe5KV2Fy1*S1^mW+@M`aB^!JTK!Lf)xw`N{Z9jMdBn!D|7p6f_PWI$|I;k~P<1n)&J#KMD8Q4a zC%-w8$Nk`Hvzh)-A8AWuoSU2M#V+rUVJN7l z&EeYD=Q!qA1MT4Pgh4U(Hs6i3x!ruK2560`M%)X9ZJ(>varpHRD?5yG;SCg)j(4}= z{Lg1cmJiPSNR4Ta-COxs*u;=m(|cc&8CzsBCt1HU9PJFPxNTcb&I~HVm=u~vadPIn z>=f+qgI@FG%m>S(&seJM-qj**d^+zR^!`)M+`C)HA8^Q%GwJZVTgDkQJB~PXjbi;% z5o+GmvL)Jf^w5(t$G93N1Z2%fy5K(2!Y+>7xu2_)XkYpo zT#z4IFs_vhhef_u6HYb>3h)v-NZrnO48I@C$lzC9sClo1Her~F-yTBDCq%4J4|HcG z&h-3z93iuUe>J;rERO}wrQi*IET8GAl}wz%28+@kFW=KZ{;a3*YD`geTetm-u>X#&Bu`U$z(xn%tQGR&sWc4 zfN&pA84zMZFl0DRASWZmgai!w;!S|HT`tEzP+QorJ8}bE7!_D3lLCu1UaurH))@1& zbpV*abC3lZaw(s$Bs5UH3N%2?D7dyb37z@_8u3k5raLmAL?v|7oUzpg@fNSyoT-pk z7G+id9|h0-MvmKc79PYa@pv!HKK{`HvwN<3M3|v{u*>g4ceMyDw;B-Y490Azx{e)1 zacb~}_KYEzCRQRL+`C23SAi&g$u~jimu~qCi8lpfSa?d!#Va)39Hk8Id{&aRYV)_o z%|UpKQ|VHHN*%d#J}E?Ma^HM?AW{@rx2vPsMu?cuCtO5&KOGJuKQ-To%~)0gJ*^q3 zHd74uQ0_p3Kn5NhB)Si}0B&jFI@4iy=_4tJb1s{fm|zhj{X!rCbJlXDU1{>ujWiKz z*Cg)(FH`~mpCY7`7lMB0S$pYoNFLM?qCge$8d$lX=E0=a1lgV3fx#2Y!yP)mcwt^J zN}Rn7d~WTC6*2n01*fZTJU!FPPeds;xAc#Vp5z)7Y`F!ufR~$I@EJCX70SekHcW_J zotPJWF!c^#V(Q1lgsZ!jYO{G?^<(FRPx0BV=0~ufO?92+PYy(Fc&ad(09Ww-091|! zsgv#xfHZDCwT`{rA7%I5i;M1~lcfc8gol0ruv^sy9Xpz_oZwzXPhj#Gp}fObpvmkk zas`RY@-2skhLGR@m<-<@@Gm7Wh)-_6Ey{&9hh`^{PqR8ZQ0d6K5iBKGp!E68D;(c6 zt?H%S9u+HGlTX~Un0 zF19iBj_xd)W<~GQwZ&(u26s1Z9X*GMuTqZW$X<4OWD7*0@&DQ#-!^Z~NZ#pJefyd2 z1#JI17N$?tyt%#m#E-upzj@H2Lo85n_&kFLn{s5H@<h^K z1+9=Fl-qF4p$pHXnfeZC!l--B^~Y}SgC@FX-+`H$?OA0n7_K&enzz#?SAZ2wL)nZ) zPf(nF*#anBG)8ebYQXhaBrM&892|9cQ8F%Tz_I3l^|Re)?#qGR)qOTcDBAF@y@Na# z;r-)th7u#2rb-V9)#_Oq%`QMcIww3D?e69-{r~``)bp-+L%o4Y=TB}>>A;b=3&JhF z^`93M6p6Bd1u|NHpbW?S<(zEUk}h!XIl#%{?GCeeqF)+L%JQo5sI$Plhf9 zgKj!&U=!`0HtSt&9?CWkR)^|C&7ni>XnbhpkaI*m_taF1NRhuVS}$lTZ;jyRvNf-6 zd*OkD4eNMH)wrbMF!8ZU{Hl(jcg-nN!HsI4Gz_(a1EpoBYtI}wBx$6`_MX~LW$h=U zb`q&X-5Bz^9UVc3nkU_BwFTX9;GmUI`oPN8!Og8n)H%hlmVG}mTiR)*;PI^eXw)tW zxAgqNwJSbkMYhoTL(tO*1cc$uTz7V0vS$=WvmF9_fsrQ2#|5L11|AJYx-tp>3y3pwOzz>L@RzPwH&d0d21xL0@oGssFCw!xz!h-U!R6 zPgH?&3hs#hSfa)8)c+tv{Mzyy%Anzrex}m`EY+}4Lwc0eqkLxIg?OBb(r_(Alg$|; zB?KMQ*#AUHN#Rw}6wjfJ7n9$$0KU zS5%Y;ylN=Tvu~)bj#M4&pf|UeY$Fb*v`n)-EHWPp(2mS9szocUYN$S(=X#jL>OI1k__*_ zM19Nb-tEbe8xC1_CFCj2&E(Ib?=MHTQgjcX%I(?%tcuC!RQ~JhSi$T;u*ysIYvEB2 zNP=cX0W0LxV0@-zvTXGK^D*4ZWjTphPHxzm811yqFP0C9%-pFJ7+gz$Ja-ENrQ!lw zf|`GsIhf_%1d8-~mw}QRNXFP3(zP-zLgaauIVZU}GOJwylWXbtn?kG{Fv|Wwh8Yr& zv#973Hi_&}e9@bg2b`jhPHS&gb`Q$PcD~11*C~jmvYrTw&y#Xo++na5b&)tAj6`)DBb|oZ8j#c!W;SFwPZq@FAoeE;F>UJcBjzn% zCd7R32}I2A{0bxHKYSdB`QS#qsQ~mg7+a((ihNoy%gGP32#jvS0_xTnp=<1S>4DS- zmiXXW=saI9^7CEc20%Tz0m?#XvW#%Yr4rO#1MpRZMai5Y$lP3kDI$WtS`Mq7YeM}X z5{M3X@qxPweQYyC)!^p{*kY$(J9axXS?M{DDVEG%g%WcsmtSBj^tsK;^TE}WXq7b( zxZ*Z)hh4!lBDkmQ>XBB--n>-nkYai0o!cBTg2NJZe-U}7dx(x<`agd-B*MypkbE6J zTe^7?%1nl%twEUDUfR;2O#4z|(J15oNf~b0={R1@;=Bw~NS?R>cZ{mHl<8v2? zG?U;^E2NYSEl6p}g~MhcCNwr)iA62RYLb-l`3bjvFcVDvFSYfg0%pWaVj2lC#}LyM zpnkIq4r0ovlfNLpmxNo80JuMrT^!6(porn*vgU>>+k0VOhV;RT6&wtWXZ{*x<}xRy zpwipJK)T`4N!dozeP-!VU}mErJd`>Pl2QtBd3c1dtSwQzjV>U3lY7np_8p$ru%nZnBQ<9yefah}$=ND_g!dckEoR;xEMs~rPGO34_e-A)+4XQCEvXA?E4kj^F#hTsp*%mO6HXP^$>(}f1h9LU9> zO*UieWppfT#s`+bXz*kR4P--K`L_EcRvb0cXX&ijcJJ$d8a&!|&&HQky62D+dTZC* z^)1M+YuD7T#_=h3^8Rf_slJS+I4SGeH7}TaC);h8wQKm#N$gRGh(lX>;F^c)*S&g9 zp3(n`jw=JR-XGw;t7mnLJqM<%8~y%lt6??l1u_8f0Gyp?s*r%7i?W`sy&!0PCEm3Y z;PiG)B`isIP3b?)o6^*=nw^pgdE0%Lz1YGz#;Rk#6H7Gafgo-)qM+`*C~k9&ejG#&fL%%S*Bz1sVuTy zx@6qXNF{zsgd-nXY{Scl&3P_c&VgFuc#J$hDT#1rZ_HPtiVOYt#9-`WQ9W9 zy@$lbE(@~|aa=(VL8|#dO()1Wo`g1L_{uKT{7^n+_n&l(`qyo9ff8<$vYQk(kr*cG zi+nMM0vDAj4klKDl8BFT6fY*rF6hOggOraui7X3*b;Gs+9P15u9cqnaJ-)Tvnm0ep z@eWE{V+GpN=movD7ql2piEc=@0DoD3hQI&$xX;9?a9XErZ}5Lia8ffMlqv@*M)+FT zo0yF4wEx+zDf>cDm;%&Tj1K8JzG}LuS#e^T`9;{jGilaZQqXcdTYD8>g92A~5F2h` zBX##5nX#`GtFOWkrF=`}{JMG$p$gJaJ7o}9M$GeT=dtc?=vb$RnK0@hI!&g>ow6Nk zEuKx?#iT*iZXf|AcH%3)NPDL997Z+J2u4B&D8z;DX~sXu7%ZQmm7_x|Onqr(OREs| zSR6KBi`r9CD+uRy6Hv*tx{*1B2^*;Al+d>MI;Cq53#3P6nT5o&LP6+ZAK33}zn8rc zC5{}!_r#&{YlUDuMEwxj*}-RQlYdF2$n93Zo9*Uh^U7Vyxc}B5Pj1b2n0_T}!;W;t z7A4HcHe?`BfhxBsqgyDZ%4#pkPTph}>n_ao^c))LPc#Vn6u83tC6YYEGbRjVS+J~8_X2n0%q(M-_iYt_n(WL6eck7(dZ5n7%ZM%8c#XYY}eCE z;_23&r-$R|WY1HK((J^2Ti4tX1}D4~OdZ#Kp_tw4Gu`LnR?&q0wDvTE$bKG46x-FZ zh(Ry~5YhzCWI%K3EusP$;h*u{(|C{gJNky&jNOVk_2hfP7%Pe`LE!1p*FCg%o^B@2gr1o>S5g|!&_TtdH z#XMzsy~j8I-w~qx!u5qgDW{WsgsNDdY@W&KKc~Fg)fh->K7^^ml-EE${{aY!$A?n) z`~W#MwoDM0)-l2_e}*jJW?kkYj6%7olZj^#ixf+H?ch|1w^>WQtCseGYc}qjuj8a+ zNC#2N_sz*1fpgT&3MHaL^otQJsR#^ePycxh-9{4*2LPppHHL(_!5sovXKbISghVK6 zRF*zR-^8;f+F5;}#m1S5cg z83EmcUFqmm5_EmEayTk?NJOhMB~f*P&>d7(=rdtapqmr`PU~n^4_KpunG+V>RT>%k zM={>aqUzS+wu%N*WY`(4t8g zJS~)-bvxSp1-CAs*E`IY^g6_nG)Kh-+vOD-*IjIa=sL-oVm~Ig^V;s1zb_RlB^^wU zkrHshD1cj=`+|p`Ups7_@^a0q4CmvNe%2ycs8 z^a^*PBmT~F?|9D`ff~ci)kRDo9)|tDs4}));M25&)NVcDpgL`4`hO0rIg&adEYP_j zgA)y5NwdkxkIQ$WD_8ej33^9AuZVuiRjGLpkhL*=&K;xkTA-#y3sFgPS+yn|DFy>} zz^aHS9i(pAtDOfhr5T=RVRIg#v`!JB$eIDI5Gh`|;f^hxLbc#Rl7JT?_pV-V>8<%X zj##(3QD9n%?s65R5d5`Rf-YJsLu6+rfWhS7wBVJPqt*^eQC|SGpSUdyFFA1p;>qI> z)3rPW<`Fp<17NBMUmOvs`TPohugu{^SG&Wgpz#z&)*XV0EOu|3+;|;!bHl>JeB-as zBJX4n#aF@Mb6YMICQ0$uDe}*#`+m>jdd6cti)-u5!F3Lwi~s6a&Q$i)33L@2_;3PU z*+2ym&9#y?zKhyG1hUY!G7gV3EatPh!6ze{$z zi{GV2Q%&0GFG_f>;dCdVEYOJUBsVCqa^7i@8*}ou9$ET-*r#v=$RJs1P0b@>!fLbg z^?-^q5)x3nCDzg1c$m24u1S3?#=b(=l|{Qc9FZ4YZ|FJ(5~TZvCWvsDHiO42j@M91 zMlkf7pk(`vv}L~`arT?;FZDZEe1Z8SJ1=czD*Ddb!*ZG_#F{L9yk(-DMtaF?pIq?X z%5x*2^61M;4nTT(Nn;cw!W_Z~+-Hg%ByBg*#Ysp4=>5e3sMT&U(g7%5>tu*V2zCf@ z?@35V5wZo+4V2-N#l)rlJdBy4J7zA&8OIbc2JRCzWCFlbB@E#QBAeNcjF`pn!H55c z7a_2!kZhg~r^s%TWE?UpvIsCk+VNgRYyzd-f?=kZ&bu4D1h|fFyYV(}&H&CeQh?Oc za4qZB%w5-FM6;D>iH@2lW-WXhsgRG45Ouyhy+8w7(lX$~a(ehj+`<5%6ix_ecC6$;ayJqEjf6<)N!lnjjI zGjsB%6x~T5` z?sE71@NsvK1WAzR>>goirF-Uv?p6lqtpL69Xt{eU7lPjF`8*^-1gZG&ad+=%bPq}c zk*gqOAp6+!exjKmCz^B5F&v4d7noFL z(@AA+mnN0IoUkwEo>jl7Cl7&@9^VtWxKP7Js$u-wH}NcMh$X8AH<>oqNb@uCY%?eo z$q1y+qifi(nGhaBd1J+4t9B)}>O+orQw{L~9B=l>7hOELe``G_Oro^|@lP5k174Bx zZZ|Jazll|zj129+YuU6Nz8V#NvrV#Z6ll!&Cl`5SPs;D~F9_Mjo5+AxgC1|+`Z$cfqA+=w9MIXr)h!Yp zsDG(LR~S{skV#|PQ%QUWc*R_lv;l-TM)S-M_zHiRj*MJeevAVZI3cK39)5jPWaWAKlT?fr+C_iz8% zxiIWvQ}x8nhG>H}BsHas=9-F1s@Xa_)ZXrSwT|?#?_*?Z0AGwh--OHl;z1fbX!s$F z570F34zLck8l%LRjZycqv)$Y7LKfmTzy9aDzKQ(CF}=?@9lOk#`YAQW{?vS7_xA$vZl(tE$ojv4Y+nl{GK&vu`F-Th_nRP00_9cJVYU-%HSMLo12m37H`SEoHO!}=vOAkY06Km)lWdU0cJOWyIJrY zlyI0w@Nmi`JaEr+{hq~M9)bpf1Ic?Ff|FNHYMHiJ_6z1{c0@g@MMkF=J6)iPzY%uP zLcr5BzZD~J*lIpCs>gSU{2Z6;1w94ex5YbmDPXt>Tap!l{uHc2FzWTx;m9hZh1op7 z`6(PhhqD5eQ2Vn22ZeWQ?yeJ+eK3}%cModKE3JPU-$)c0)6lqOK2S&7QF?w}51`PG z(gPsUtK3s6r=Fv+;m|cN7IxQ%yl++-yuFl&(dg+WH`*PSReMSgi6M$(F1}tPD1v(! z>FWizjmG#qouAvuA2>x>k8oS^o7EAy>C)9pM`Wb`{J0d)(6?^dq3`v&eM@roFM-oA0Fk`(iA-!u4q z$l~45{IBQpJaU4oB2oCO3onyV1a6gV!Mr zQ)%IK)2ifj!U9=3j^>#RkE!2LqNjH$#lLbcU>3ngk@YF_BT*>N=i~5YK2Ku4k*ZQ$$oxnJ$Ypv;s#e8?C|^Z+AYQ};r49({)pI?T(zUw8WfEi_P+FNg<@$sZ^PK>g;koa z&EZOmhXby(9LJ(}bE`F|(Ii6^t5_|_Y2K%Ucv7ZrzR{lM2RkZm8u*B;Y_; z?vJx5t!QCd-kY)nn=y8Dz3fUUVWZ7QDiEKu^OepkHR|;8e$)ztx z9(#AnZpuv4&$ij=9{ln52jj-5Af(#Ko5#IR6B|V_Xguc8)OAGwr9dOSeQ>wbLMz~W zd&akfEs-aPLg6$Lz5NdqrgsjZ*14H1aQ>Qb!M8!QNL|hv5&ft7b3(Ju+uwjgJhs(?ULAoWrn0Ms}mXWZ!DW~ z7HbVQFjZYeo&}vzwcvpvdMls8wS{SLGI<-;)kuHRPl+&LlFPp7Za-G{O>u98-Ok(r z6yQ!!ZrOk@E|>r=hj;kv)MC51pESBWOj?tZ)(n%@xVu-T1*s?|EieUx%E!N;$2OhN1>^vY zOCz=dAUMz&?Z5aJX~#|<`ye~hBs(VG!&-cN4tim?cPAI@tELtB28IPndWlp;5tkGm zm=YPV$joG4gfexP;)!CLv}40I#oTCm*i(5tEtOXhl;vj+Rb_Yg2ge-n2GJ`13#~Kk zzCJVng{Z?n6nn`v_;0zT%tQ9KyljQGzzDUBFiB#rLR#P+DLWZh%O-?$1)G#YXN|w1 zCrF&t1{bJa&8imqD#G(VMem4k09&_J`W+4TC#jobiI4z0BbGW~<2$!lO2Z|+C8I|O(0oGzx*3R%sd}lSHO|WWnJF5`~X1xwT=fweTHBB)GHw#tlAC!Unz@TdH}#!_YJ*8 z_qZMB!iZ=Ez#b^U9x5b2#^5faR1dxe>55m2N`(5JO57iy5-z0@ZQ53%tKWthA!}DZ z01|$4ZVIGfTVk1zZa7+7NHfd)+q^y?$Q;igoswG4fvtR&t97y=eCjy|ALap%+0shR_R=%`HMNcqPF!^dgiiLob>kC}RK63n)Pey^vF4 z@n#)Xv)0v^deexDU{F)M5;=DBXb!dEm(KpA=tDCv7p?Z z5Q}DepAZX@BS4@oKExvS=X;p|4KDl)fJG&Z0ib(BEa?7A01uG)vV>RwJk~+@&lqCC z-HBMZ4M-Evr)XN z$e281gDIQ`m0G)gx*0a;SlKb<6`Kt#BcszOC+cl-q-L)9R=Io3cE-HPt+GZT-yJ<# zb_(%=DtSV||Fe+0W_O-YOJ-(FO76-N+U(8~YQgjJg!0XDo>0r^%&c%9k}pX7;*lQM z+!)lyLo^XcS!f}xii#jml4p!5$+N2$S_p3;P`xzYYavz}HAvc>DLvi3&S*OB$sZX_ zO!u#OpL*A)o7W*CD=#*;6N~0#!Mm-Sg951$dWvfZ&N$M2DINP-q-{^#$czJ_K7o`c zpmJ~eX(j3DbX9V45>mL4lJrBXNYYpFdlhmbn_b193<+r!`lKwqDs5eXCr>!vEfooe zvo=Tc<6yHK+6Iu)`Ms-Wk^g*HGi$6FPCH|=4XpO)k+pp!ZN1r>h0uo9qoh4jXp7W1 zKpp)uuzYU7sgU3(NjAwie=9v(7H>mnGoW=gF>j(m8%M{To+xSKixtX(A%LhC{zA7< zfMa5OHGc1)=%180DS*(_vi@M=lMZi6tV_HeUv_NH(>1$;J=b5+M1ZiDdo4q2^_FQD@^T;L{t7J9m9iLcx)&Ke3L1B~M7vP> zRLMuG$sJ6CMZwbxU^Nug%bM z?Lg6T%i8pO!CagAdd`tJ%i2`#kv=FRO@2EhQKEU3{=}-#3=#Drf+2eImLnhB=D5M7M4J0Rn~*d@?2fyh`#hkOA?>?}LO ze*s6FA2+wZCL5y|6dz`=IJk_`HH-s(#zoBLvg?p@;!wT;VBl)^p8+L;Q!eN78jceG z8$8AT`0MlOW&9%ht6B?X{(4?u-%Qn3f57?I@pHADca8_}UjsZs{scZd{=3it=O>h5 z$^qx?jk9nAp;zZ0aBi3Ep#w?d ze@sUu#2^0Gzu2Ytlj*yJZV-?7sJFLMXG-(HadXZoI$uj`%{NqQ&#$N6aWc~!I6Wut zagcmo^)-3V-LttXK8*};P9Gq|XKgvc#k%%pTvio=G_NN_NZ!)CDE7(0MNGFzL!e1QDy%C`j1&B?HDJxq$O@TT}k<2g-2VbcZm=_ zN;0(qnc_zZ5GZ$?)SAKq_oT6$j+c#bNL?7bzl`DNQm2BMA{9 zW^KyAg5U6VAtJznQ$&c~Dk9Ll2+QOuBE&D;AvHum61+elrg+yOU#Bq+um$P!7l=}n zdAy0Gbi4Q0f-l7WP;+eR9#{jKK&T5}U{cb013$-#r{uDP9RP>|3oOw59dSw@8xa=W zqqRn_DLy8-OfBuAE)rWgp6=X`Qo4PC4McCaVIu7(Z7_5u^ z90!^m$P~5d*bq9?D-jKl18zQcun987I}$-lG9*(qWNJBcDe^+PNkkp}282b?&XzPj zTYnR47wW#x+Uf8r2o($=9R`-kR4#lzKAF1#_2d!1PK0Wf z$P}NZcLX;l%2>}y74!6{VX)8$r8NnfCC?w~B5CPfGSv??_Z_05=q;^GzT2jj2D{rk z0y3q4#6YIXXv+tWdVJL2koYe~<)kx05$rxYxf13w+$FbHB*$InoUuJ^!KDW02IT4X z%0?K|TJ*P~z4@+pdmW~AE0l;)_ko%~W+Y;eOaD_O%ojsBivKB3r|I=$&(O_CiQDeL zq!q=)ejR1G&G-aB7C(BgpYZ&kmvpFjeoQ?OO}PNwtaJ&DH83q)WAOUX#5`L*+AUPV zzkZ6@cOZZnpeH^YqnrYrOAho%9m?sx@mW!?_TNK;Kv%riZR+y z=Yh<1q}GYlhtUzo&zr4*H|{fDwbC4KKLsitXr(9u__1EgWeLsFk2ThmUNQ~m8_3K@E zR=&(;46_;4O}nC$3qeY{l&1JU+Dew%@XVtyIlK1~B`pHm`_m*}B~4nQ zzixr*STTtHofKAj{Mc>Yx@)H31E>&})&9ybc5C zhqB0seo;eVa(e#Fq3Xe1aQrWKq3|z==xz#apCCC)eTp6aAX=MGCLH=z@pKpH{{nF6 zQ9AKg5r;mg)We=kA85S$BxGzQaBdAfGVsWDFl!d}ax!JcXy5N60B)9%kUQa-nSh|5hu8)HR2A*DR#uzk~M^upFfc``4NGz=F| zMF@dAiHVJmt%~x|?sOXX+$w~s+MkmM#^DtV>F5m2S&==|1jd}QWZy77QE=0*F_!-- zp1kaZNs@3SI6Ge@>>R3y?FmzFPZe<#ECL#C9ZpKoGq8E34KVA99R8S`aADZJiEx`) zV1uA(cZJeMqSL4{Cge{>34F{mLG=PyHj=x-5F-;TMNZ8Yvm6G^e%cg3osqbwy z)r5xc_Bs!Kv`#te{yIWcdqL|LYL@pq8W$a22ZXVPq_wY*^^Rtbl!X$+_5o(&Udlqc z>ji?hr*zT19nJ5PxW0w4(`ff-o&LP3PAyMD>AxfzE_|xQB7twtjmHkQ$cc!FDt#P- z96pqjw|GcQJc7(f9SmR$ijzP36go>l1fr0iUMO2BLYc<20FO56O&+DGp`qRmfE?IEh+u!Ic0Kube!A!^wcx6poh=Glm>*L? z3lT}0^i_&azvy&)h4JZAfls%H)n5*L`u@LU`1GmAg-_oz9&*RFCn|{usmJw2P;rA? zb*$IW8_IG8_;~LODnv;C;W-EcHUj`DY4v>&k=<;+kvbex|M+f28k z?Z~RwOzx>s2<>0Ip-2De+&K(A=1X@Ibn*i%)ab&P=miTRXX%2?9jccXMh?_V&QC|q zOM5$vJlFbSP^Ch4G_4L;=-0V43Y9gJb3e9GtXSJVqab`lP&*QazUdxK6tv+f2~Zra zrvNa;?ua;3HNe7O3uCiB5q##t9`eX9&xtrtci&|lnSwrG8x@(9a)hTWO^3^-)7v+k zGf;KE(l?G@k45z*4GFB?{E>09RpMuq2SrPIrF0n_)Vm{Ogy67k74sB4&A`r2Vp!5k zhI@Fc8=Xv$&s(Z^q-1KqCX=b*ZIk<~BvWI4u|8gMmK8m4 z0L!j7k=qjBg+t*4$3NWYoNxNd)zhE33?4l`%AH_%s?XP`J5Ge&>(S$$aC-ENsmj#q zWlxyCvRP)Jjrd3=b^|4F3*X{`=7QB$uN^?7n~DY)6PT}=y1WAFj4QMuH)^X)1JB&* zgM0=_v!Bcv^tPX8cCdR4sn~AbP2*FZemvggF*)&$UgMGfAWJUh6sp0D%r)!$*M9e& z8Z?MBHOvwR#!Pz1H9}$V>GFrK^d3()h$KAOS zXwi`K11&*D{7VZ}6GsR!wAq=e;xUuq@t~LCIDE)P;oG$o)`c_W;6v7!{g+Q&_k7Xr zcBtg-l+Zy41P_N z8sxHzlIcK9$#5WUd2^e%mJY;jLT&NDD${|u=`OjQCH;rhS!)jm;`k=Z=s?^!4o4V# z;o&O1e$IW66CVIdre6lgcXR}8yp^XEUcaL|_aWYMd-sD|Hy;yt#CddgKa?NweD$m+ zQNwpw>T!-|y8~A8Z`ud|Q16>#U_yz`1{?$dAS)o?_y%Aj#1aT5-bx^#ZUnd}y9)?a z4+J!f00Lrt6s#9O;G5k*zyc!>=<>tWi|j7uli$c;5K(8B&L8~8KUxNV&sC2&c$l+; zS4WfdylqsDzJ!AS2oMpk1#8& zTQoBqll2IrAB7GYJt$o<;ae`$i|-1K=6zS#T@Lw$V;pyBT8m>G_okzPLAumqvakzf zb{qt&gv{gV4$f6WcLFj1Bq4K3)fPh+YZeA3VTMEmQISCQ-l##LkW!siuw8w&P%4y6 z>6GtMn}x;O)K>sQeh0#!JoRP9kl*PsB=WoOhas!yMOT z64N0H(09h?305uqs%s?Nsz06_4D+r0bz&x;#Sb#mWnucJ<2)x7^q^xLM*=|j3Ecw^ zPO1%cV6X6_Cq7DZ@x)j7U3lWt^5xYOcjX1>XygjI&IJ#BFKdX;T&|iO@-muD5N@dw z^5%hiNWh0#`$)jk!@P*$SJOlK3qNmHW{swzv>$V}wPfMxSzQR7PIF`erTLE}{~#6~Ugh-Ob6wh^D-ZLzOtR z(c=(B2^2tDgp-Lw=CobLp$!HZ$s~Uywe;gtKe&SH7 zapKT8aftYaz#%5zAch4Ftpx7K<}!8V5}N`OghiWbRs5(16TL3-Les zP;T(~QJ;_E9qz?DL88&yNjsWTvlYu5C2whYTc|8=lRfys{q?L}^tmK`VCmV@h90`W zS-V)3+4IRb-06yw1DyKFS#xsQr3H?{8w;Eg6_dLWB*4jO4DG+yt1FxZJYAPG+)HB1 zvcyL*E!v@-9*Bxk#8^Jcx~0FNZ*w(*h6@QShILyaXzF}EVytD|jv4D>jILYA7ko<7 zxanLM>vqL;yOkz_$s9{dO4#?HTGproJ^fPsJ#l68YP!xzqr5tDdh&J@z^_k(#TDJx zt0M>bA==dOc5jF(aN!BD?G50$Wbob^u<}GeQ&rd~rqH?Prjm-DjshFMf7B~LbK$bK zUAU}m7cNv_#KjmDF06-JJ-Rg3yhH-rf=C#{zI;+@MdSq!7N@D2B%KG0v<$Msznur! zDQ++Xr;_~dM)f-S&GJ8?7AFU4@L%ov1LelXHx)7o6ARv%Rh!r;qVGphZEhoZd z30I)^g~rohgZ7#V?!HO+q4DS2kyx*#RZ)hhaZqs#$_~0W`|hdm0&+E2nsaA-Jfr6-#i0Wu2|T}A2iKrdvKazw zL{kD_#7_`Y`~+LUPg2)I#U^){szC~R^h~m(HMKlK4cBfb{rlGDgJWQ6nV|T366>erF{C0z0d9xaTM5|h)q)gm#!9^y4>fB zU1D`R7EMQLY!Kmlk#Q_h_*Q+yI_+l>^MTR`DF_*)R~lpQ7L-u+l#_EM=(gN(6xwo~ zyXwL`m9??j2Ng86UFtXqY32g|gqE~Dc_?l4uDwtjsYJT=_9}1qurL&Q-6!;O>lPvm z`|G!E5xi2bmf%Q(de(2F+hJ({2?H9%d&HnHM?w{m&jubsAZwZdl%R8 zSTLim2(3t4)ae%izTOtKC)MLHwiw)rc^TRE`6IhPs>c{uoNf;h zDY%D*{-N;CWJu_DwXoWngD`Qo$E722uRts8%nco1zzf1dwbBSz#3a2D5{1Q>;vf(h zV^jp{Lv=G1xz!*0BpFoUp+y4o~m_@?IuN207_^S(Jem-UNq%1+RNAq>1 zx1a}Ttq5Z*P%q z14a@bw2P7O?ea)e1ylpiOgYBW{Z)EO&cico_+TITNF5u@Jo#jGrd#pRPYjRV*FXBz z;SpzJ0?^eL^1+`~h-@u9-~%Xl$cuNsqkU!kI@8_##`oNH<1us(JOHMvxkag^2M;!L=-_{^OI$9x@8};=V>0ER2E1x92r8 z%gt9f!gdf^VAgVP_mC&w0drcGVwO_%?hTpci^7t=3X$X%X6{Yka}b6vV+8g-NMchL zH_iJY$;E&D$Vl=aM6mnvhhguFB;WaXkmScNX%2Jp40=2{4l~P^nQ&nIMSKlB`4B}F~*kMeiHB>}=&Le?Sq!p45AN4zJ-xvm{k8@NteXpYA zu5mZzirvCIyOY-wOc>R9namHm61dw!h3!=uxD*Vf^9+*ct|k=Z(aA3=w@?wJ^`LU~ z!PwyAV=Us?%dNp#eo)wsJet0S^Qx4jtJo0`K)Px1qvd}VW)2#SXaXSbrqTKY9Ix3K za$RKK0IFSFPQ`~Eg6vkj2)4$q?A&}t(?u%2HdFEOEOYZj!4)*&*`=BL!bGji37PQ( z_tm5r!N{gz&>iv9ldlyxSIJaqgv$AK^?U=>CH(|&LL#%Fim9pi!d`1CzV=a4@u9Yt zRD6*kaRW1Crs5+LRj}NWijSldhzNAR3Eu`;Y{ow~M3Tj!6|z0vz&J<{N46_US%iSA zNa^Q2nsKzKz2G14nqM!&nC8?^TW1-oLOh3C`U<}T;UA`^Az_~$#)p|8qErUww(g-S z;IG2%p*NvEj<9%Xv2b2gU8xdKv86)(D3PM~(OFotJvKD7 zl#O(`VVblk(`9$0unl7_4mSc%5S@)csRP$kvrFkIInE9xCWV8V`+D}!^p|rC&qE($ zGaJiu<)HIloOgV1RMkz3X_PF{o)Fnw7fJ5eY8-LCq{)t2vwN;}?U^*l`MMEcDRb!Jq`7=)6KtGRkI^8wb|3U8kggarn5_PBzBv* z!1U7Tk!z;kaS!Jq!76538heqtUW_qp4YT8XD~Gmbtji&g zfbow{&naWV#zUIm;v_`wwyFI&#`s9Ziwibmd zjb>UHGBBAoub4!U6*pP^khX(O&7tKTNxwIzTT?R5IqeP(g*AEzl(1%R@yni-0pjuR z?j*Z5nsx(-1;Clb3}yFwk*jB0*vr$q@DS9!&jW{igSka9C(bKx;@E3`QAHekjnbee zps<8yBa@{6VEl$hH0)vUsa?^!lm57vcF)W=f(mo&wQPgehx79=Iz(}3Ug<<`0JvZZ zCTk!TClS?2=N6MoD)8tgNj2L@F~VS4W;99HUrPQD;?qb{vqd4Z&}% zEK{;&$$A2i`RG$^LToQz z)i%oID4c}L@l7>E1|$mH8ctfUb}e+MP$$d0Q4u(x=VMkGceuX>=h8No*5eh15vDbr z0pww{Cr3kCpdr{eTS7j(^uEkQN?C3tXg1Re#Lq%V_+w9*RLKT)KZQ{8{5e^Xcb3F4x zeHTla$c=o77vUx|vp)QiXlU4-Z8SUdh+QCYp}E~hb*q1AI5M{B#}`=;`CgJF4&zA@ z8abH@)yPdY5sr)~skcv8bXcs44<98%6W8c)8%Bt>&xE=fins;Shi`SEf%8ph;PK6E zfJzoO zQu^HnzjiT%nl6@%cW=N%M7dH%Ajq%*0|s{gDv#t0w}=`YI1}5Irvj?Wr%V=t@?7%| zreRX9cJ+*m{EU@7QzqKhaaM`VZW@YWK%#T|C~!}2X3DH&nU(JCn54;B33bspja4@Z zBC;+SI$4TQGbf*eP_%58)xD#_0>LV9R9slx+_|m9^6K8zkBWn4%cxd2`=_RR@1L5z zd!~4Vs&I@7>@SnIPirs=I%#WMmRlS3hk(j^2WUyf!HUU0Yx~z&SOUHz*o^10TsCen zB5805fSt(?c;0`cHs1G@1+xxRoJYDz{qPs-uV!m13~hg0sD3n{%n$U&8|S9k=>l1* zpnw1!Dp3KoC0|jz`r&d^3w?cSGppJi>=NHoQ%Ls<=$53$-Gj(7fLlj1uiU%0G>a>h z;9>vZ{=uKISj5>jX}V>5c3Ob`|2udi~|uLsqfZ}er`YJNcPlaRJ23qgnP@TBXu zit7#3mQUF5nI5=rj*OD=L@MPej0cnqUCHb;;1UPV$KDuvc1;(g zF1$F{j>lsb6w7gGf3TZ$oG~I$v}D2mY2ylEViUh3mLu1gD7VNf4EVBUf@p&a35yGk z<18{xu3Iz6Ms&>O5R8n{W*>LACm`ZL@>q!kpA5F|P*?-DqC;@xvvYTQfIC^6qeDQz z4#k3y08f=nKJ?!ARo&m5{Q9m2q%o@r6~j%*;)D#wmbVMF2|?KG)BV0{Y)jTi^v1J7 zSJ-7MNK$q*YrgC^N^|#hLuqb(^53KkFbdgu^SeeIRv{7u?PdSDy$*Obq!OrnX6%Xw z9@KiNNx4y4xNOZ+_as$!w}l5gqFQ*hE3?}sRH6&q(ow?6w5B`-^u~nB*-M1A>~TV z@xqDr)KOoc4hq+|7l4-zlP3jPN19N2e1M3-;z-T{pE*m)buotuwR25MLTWH61);^} z(Vgr~O1tT-uM!j(dV(;9^3G}-Jkdu0^=(eIxOOy>I^CzJW!UIGb9A-YQsbZd^gM`ZA3JZvC} zDziP-6^5D&DCHTWS%Toca_;&Iai*=4@{ot!1~c(tn*@fmY349=i7k;yJ^FeUKe&^a z=`e+k-RnTU*srV>HaZ6-P#daDT1Cpv`r#bBive+7}^n+HJ2RURu+EWUmcAjSKhLJ9;-Xje#>k3=bM z{*sVl@%57cDc=7SQd}fbXu^H`>|^oulK?4x=_#bRNTm3dF9|6YUq1)r1+J`hZLVNp;Pg_ zG#HiR($X4z!Q`2VuGsTu`-Xo!Vk6MYq{H;BcOtt=>_>VzMF1<8 zY3xe3m$lobs>bH%j#7B>O)&iFz0aX_QAcSj&-=zDglK_qx{O>KHW>a4LxVgi4Q^$F zN3%hrlG$9=Gjjh1@mQfjcck3RqVxL>@*}uGJ<=#|$wpt6jlQIB^raVQw5uO=l(?Wi z(kQRa25-m)uj(7zxj=(Uqr~bRqr_CacPe%EV&?eAs{yo&xx6(SeHE=SmoJ}Dg`j;! zHj3+ybIFv(ToUh3vNJ(jpT>KEPr7i2+WaTudc2(OT!SxX$`$iDc}mzzyT2Yzkqqwy zwkW$_Pw$5jhk^AD3GptDeCvLpf4k(ZFzViFQUdm%ehb$nTHrQzWU`4fMAGY|(Brz> z7TCXnt2yZr5w&2E~&{21vA^qm~**TPU( zb95ZIM;uT5AUOMax1!B=n&f~EKCgN@57@HTVH20e%{(GA&z^LAJR>UK12VZIF#nRg zSo5egkV4N5Qaq2QLA5YH9PZwWhDc!kR(16gi$WKRx z+sIGXbc_6S9cdjYu#}*#StO`yE|8$EDGBNhRPi}TpnIj~Upn)FdhJr4I&jDh_{>um zez0u;hGW?$PhE4HgrfMkQ8vI~Lbe>&D-4^9y=fj;@Vq>Ad=oxy@lBQqVAzMuQ&$an z>PWaN3;^mPNgt^S?&va49i9vO=Bd*a&?J2Y2CSdhLB{Fyhe!1!Fyiv+ud$`4pUZ5G zY2ao;&ND9LX!S^txL=!3B8I}4iNjzS0dhy@>!-U*jjxy==w9>Md)98nTXLP8m9veO z9eQ#;<+7pz+!9y2Rf7pw5|9yATtgWm#{GPHKyO<&(~SePe=Pl&o)uuG$2eIT@m`8x ziap=KZkN8}2Vo-k!@oGzS^StC+H7~ayXhaU+K}#p9Itj}+T2zi!4a3Ap6%{tDD3mZ zh18IERx%KA7_XXkO3kK%qa9q$7y<{-<{&~!AUcwjp(mu?ow-+!Zz9WC3Q)^7py^;C zPXIOk*EjNK5@)~SVS!sWk8uAuJw1%)#&6=2>O4ehE6J#t5$Mbo^|bgwkfDUd1w^w? zgi+>syv)ss;1+&7&GaMG0Z`+?d?PBIlU$1@rAAWwP@}>L4$E?6^G9udcC|j#r|+os zXdPlzBFKQ0NXDwH^|30aPS5c{Cs>8&a!HR1njhfFke{KRu0?)^DeovkH#_|4cyClm z_hJ2?Ctr(*mT^XM8(j&Z*=r1gU!0WYg&^1>CxJCMFU3P5c6>MK@R?9Z!q0bv`wEvx z9hOxwah$R)CkJorBhwe0oN7+v%vAXVr;2c2+Q4lYK1lNs(PO&=X9Q;ATtf@pWvAzd zAOJLjGbQMt_nr%4qgxdrJo*}j09;oYBR_}y*N6CV`1Cha)$?glx0+Z;3KAT0?-9&o zi!9!%;mXXyo&4veJ`ny$`Up9tD~1Aq1ZTP<-wv!|fw5@ed}euS?8H(KlpzJinIMEl z5LEWiB~-kQVsr=T`)1k8$czt!NfG|E5}qX`@dNv0qYiw*!KvTl-;7Q1bcm*Jxswko zoBZESFFsme44x@qrGHLL56~O$PENPH@9Z2X(LR*&8B=V4Q`{4RU^rL= zO|9YjrC$)E9SQ!5{^Lz{9pti(0Ne1kpHT~kuR-G}M6du+FQ$8qU=9LzY9$YHIN9V> zxA=z1q8Feec-p9!agj@t;#vLvr1L8oTKGe~{5wi%0-aV~8B5hDnuyI$RLf zy>^7_o}NaLUg1z9$+OvFmm8kxRH%H>9INB2`H56DdY6apwgH0C7amYjkMIn1yzqj5m!L zZy-?&rZVGAbV-6vUvTM@!ZCMXI_IYm=H)FCY8z7?6ouJGB?J>EpJi0&MY>*#7Dhsf zv(TA_fduhzbrQqD$S)k97kdlDEF7lFgClhT)vwg(_>waIZ| zhAZ~qM-ogePJmRt;taQ}kl;2d9We)S;`5JhHk;|R`Voce9r-gWS-yQHZ{9%POtQ_xr6k)xrA@?yGANUt47v;jhATreabL>3&qPIK zl5HzRXm{x)!dtP9s+7o++eaLJGOn7s83AwgkmRY}bzf(-b|GR}x&~nI>m-T5kGUT0 zfr+?A(J4Jur9vj)<12B=sgWg zES$4Kve~8?S@3>s+Rfc3UYGWJN1fx=#CO(Dx8fM@dRg9uS9cqy%V0 zGsW6Ehk~nLGoTKp9f|2%gQA*helRjWxp?!=98g#J^g-It6PUOu4pnV^P1FOGvwGg* zlsqIbxPErXmIu5p1Cm#^LUkKJ;w7E#`jE#6QA(i!d%(v@ih5Gg)pl=fn8EJuX3@Vl z@O23JL8NSF^Z6|8D*THW4In%-4SXghM@dX6v!bsZIDkmM-1&1;^Lr;iz zYKiFW?#>*eGWOuF_JB2eS$p)#hWwn~y_>$g6}i+*k9-7hOHad{`^`qvM3Cj!0|pQ% z#4Z-i3r zwV3LR%*rV&^BEyI;FV+IjDn$BC0R*dL6W^+3Ls*6&i|0FK!&A(F_N?ZEC$9>%YoU( z+f1LxVq~7ip&Jy?txh)!$yMM)Qo>=Gz!V(*PU9Q?=A0C`lk}ZSiJbf%tOWcLbl8Gi zj?u-DQfhdlkL`7i@0_aUR9sZ_b%1ii$(R9wN>5C|Mb)~$s45r?+< z-J^QTq>l9&qu8ao8(yke@R+q3ii<>-z)Q79uooRs`b;dPvawGFZI64Y2do>MfLmFR znUfTEWQH|x2PTWvQ&lO7wW;_SbFAXWp#k7mD1LjsHC}b;TOg+5S1l`k)u8x=7xsGh zPu_I@N2*tznXVV*582P*6MeUMbG`y-6d_uGn8p0if(jt*^&@L#Pat9$72_Qt;DF1- zKRLM2xMOg#X}|<>XlZDK)r#Td14sZv@N^R(wk{O_cyqJ|bp&28Czd8J8zSKNehWa- z-e&isZ#joFHQhjPI6NYszrd!i1hVlOowxLD7NL!6XJ(Z|*$}QRvpcf3XK2UHMqdR+ z#7%kOfz9cG%|B_$B$K#+bSK0x6UFi3sPqh;c!b3<7tJOy1-81(fn7q$ft%#Oyrr=? z$Reb)rGqZ0fVZ?gN7$)P8`EG*W77Qk&2Z} z?Fs7}P|lEgv`^4mAVg2qkX`ggg&3oJB8F=_U)jOt5FNAQbS*9o6uMd;2B0btn?F?o zT1hc52y7uB#3@vSTaTbAQXXS#R<+jNIaml9nS_+i3xw-$HC4*PcXEQ~CY-p}4kSV< z2}Un6_eE!5*Kc@Q8cEUW{P*JN5DV$423;Ms*)u4ymm|7KtEO|$Q3p(U>g(9P#a}W} zF#sj|z=|Qv@xibNnw8X0N1d`GDXU`l5awu9T_2oS!-7iVTLgt*Qg;QP7n~T7x@&+G z>=aTVq@);2p^!sxA^|gfy{?w(dX{U(D3VHGh*4zC#JJ(FT;C+8E%Avis0crdi~^Y0 zP=TTdFV-Yg&Jz_o!lu&%7eCHq8KGO`{J_m@r35TOx0Os`96wm1TuZK3R+pSDg!OW? zjXz0Ra3p^gKFeaHGtn__ZCZqy)zPQf+WsmR$Yr)=xFSL7ODb2hkIL2dDi`Hdxx(;+ zQ6g2YI%p(FU@Fl$rZEDzev?VNyxMVDaHn*vkVx7USbLE_k;G)$SD_*owjYw?DK#zn ztn7I0e0{nG#qiz@EaGL$=V*JfcPt$t29mE7L7i1F-B1n9jNXO7zUTmaLQrmEYx>dbG+;XMrkx_zJCTrAW)Gz zvlN-HI~46d9*L*eB)Xr>-f(|a85zqi`uQ_^N0Vx0ygMHrfLNKVx+t(fRiSxnC__6vZACD()J(ZI16e2)g61j+(Xi*5y&UJE{62uw-*k9YfkNm{6F0Z#P=MU*rg zqZ_+q^53-NV2ZSb;8E3G4zeK%13yM9udh#5o*Vk!yKdsx4D1Mz!Fpsu1`f*L6SsB5 zcDI1c2_5MM`T6$|-J-xEQy|4koPM*HWqtd)HO2qLZ(ODjQoK}cOV*Mx3)Vh z;tshdB=v>d&O&!1b4roPL8-}+qL@pav=6B*GGl5fu&G|8m(T@sDtR%tqT4hT3D8j+aT!D8WM!z^vQ@X*1=YvwqXd6)*&D(qckzKeS0qiwD(hDAz- z4@;(em`$M#v4k=|zK^=g6+ba600XQNj2wo-gUi}5!4`7T?^|Lp0%P#u_dYL^=Se%|(M7MwiLF#aPc%30H zQIY+4#6!=(Wu^#Ju1q$wdJQM8JbdVNGkEl@R?S)A0+j!M_TD|(*0U_^{VsFOb=^BN zjO`d(63d*k+qyHlQ}!Q7(vZ`xZw~?}Vq!-|2dBf)GR{AC?442)a#F@Qlx!qmjz)== zDpgveMUo>#KvTpkI~Z$3KoK=wutcCOYKP@i55*(M`Td^f{k}QpT5Ipzxj4)oS#!?s z@?M_zxj)bQywN8Uqt9S(u{`1AlUW9HEVIj?Krm12JDF#)9YM<@6k)f$@=amg9oEpj zn1U$89>8fq2vm(G)Cjg2Br`sB@^+&Vr;gu_t}vz+6=vM{Zd}XkIc8$FIyt7t?l_fA zbF7@@FgcuDT4b~z-3^^I&#ZTzQ}Y5$ia~9i`h5MG>Bgyz*PS~1m+fnAn{J+(yzVxD zLdhgxIX*SXQEV^@bPY-oxrEJh>+Ybkjk^g=T3uu1!D;igu@WjJyfU_E$(S=(#EYy* zzb*qNZt}m>L}#WOS665=)2*v3O`h;Z0FP(Z#8wE36IqFQS{b9$tsyPv=Kgs!75KH>TAYb0IbQ&L5$01C>zXhc*H2 zoXXCiIFx~?*SxY@u^i*i20~g z`vWQul8>6rxf{E$*=&VuG9u7c`mW)5(RG~j@ODX+W5H_RILwKuADah}mv)EEiIi)m zPdEzt3sb#hs6!1uSt-{{$j@@kMz|4g$SFT}bV+S=bVzC0k;2fGvUPn&BIsmo1?dn5zSI!r7rZSQZXG>5gwBjg2A43%xvyJe*m3 zQoIZc&s#$$=}|?7?#c7=CO)Ug^YZDE>J_Ii^{HN-sda`^MKb1sl3)<3jq?x{j-6@q=JaS1bRMO&o_C4Z?8np*>vEuO&*O1IbuZ>WMlHJsz7e{&qpXR znEo(FwL$iwLWL&osOQ@e8RYxz(J<_P-2KRX==TxR+d>d@4V8$>rRAKni0PpnM9x|0 zI7bLZ{NejErbpayCBF<0vYAm^5q{HuxIY@?kO-2E*aL!H1TYsF=j?ZEbU#R3RBE)By(%Uuq(ytenRK@9kr! zkLhF)fLMW3`wK&XVBQkXmiz`MdUJgZ^N+E)*ad?~Dg-On0}WuxZ(Qc#)lBsU)!r-y zRTM0vC~g(;!=bG{euyQ%h#!VSLBj`0Y;ZL`O8ig_o;Im{!-A}Z#x6hpFRJW;FR=QM zReU}<1qN7R+B&Gb048*Zn5VqF0LpbQu>0}?&xMgLgxH04lEZTQmru+A4Kk402fYZi z$U%8KiW^vhrY6vEZHIzHae{^PLoTOo@Kl!=fJlb{r+UI_Q;_;gbDgRE0sMNK>q3gz zBbSjlV4ZFL@vrk^tty==(}C+u{PRgJC2`<7Q&ZY?{zzMop=T^^#h=+X7`&C`{-btP zTG_iVI8?Pr2#jAOh*lp6%EKfn%L@8`Q)?fM!y@5K_M^o9p)GA;nka@CBH;81hNj7n_iBA#*?nF>12*KwOo(UkYFcha zxp9^;=&~xg)#;@s1BsplW%ZD^t@< zU7A{}OZk8%R16-f0H>~<^W49J+ZL`R;edxQWi@zXXw2R-1URD8K@+W2OPDdf-YfF; z%J*vfp_ZheTpoEVa!g?IZ8%FvhqPYIV*Y#!tE-++$MO~;YfeW+DD7;7P%_P(G^ieVN}Qq)bAQZJT4Ej?Q#<(@X0yaN{>)Qk7#o%oXCV{) zJL0+^v(3uIv4}03Ocx7CSXPs3&nqJ=VAIP83)ob}LaL|;HXJ~SG7!!)jmP&NbO7bX zqLB4&)LF#m(H}thU_DzpV0MFiHR?%|wjwuBJHh`DM@y=H%*K#0k<4(r=%va7W-;ot z)yYa=I#M6n>*9b}&!246Wd1Wy@cc=0IN5S>7s`dno8lfA7bmQ`wL&^;;?opG<~9yZ zH5~0xXYlQ$;7f~Y9iS2TY|VDhY-2UKI)N1U;5frBg6Cf1LGtv<^>HJ&LtC%IXE$Vp zu`W@}8*Gv&20nyvsus_to7jB=D)CEBL-Y&-5;ALPTA>t+?py;6=6DEAH# z9{7fNl@PyfpxH3#p4+TOB}=)qrfdp234)jVEcvx9>dQ?NI#k z?NI!ZsPk=!I^PZt|72Z9TO1+pMih8E{?BnlYo79TUMiRNl&$lRKH@r`cN9i43wuY4vWBtdtgYz2LDQyfRK;M;4u((K)=4UQ++u-?sC# z?I}*t!Ws23%qzhW!w8v^)->?UM7Ee1z30Tj-ag{okYZO=n?n3CPSIhMSqf}s0Kr16 z+NHz57NE&7DUrgZ;rJH`YGuH#A#%}sZ8#vdKUZ{dG;q@OOkBAY796T^=IU^RY+0fe z;q-R}@#xFuX@SVGdPe5!z?NCJ`%EZCEs@2i~tFsp2EoD7Bf#OWz1z^=RmqPNS zAx}xSFw01C1n!k+?BTmmkOH67O9ehrpe2Eilgm(t7K+>)w!=&AJjgHG3$lN>iintq zHG(i*AZXen7*aTVAM2Ix+kXt?%UUTQ0)JY39|WLU^p#R3HnZ@A#z{@YSM@ z!*NRn^9ml~M5kA@$9>?^*}BV|(>sv?o3H>`fzLEYSM!0ZI1X2KKUdsl zuG9GDp&2JwLlU!`d6`p{5FWOngub|Rs7BL0?9LMr;dLvzeE7Vb6ZK}}xQAewxn4x73inmoKvO@7nWNlkt;7w%DL@@uKdlS><# zyxRt8eWA(s?(G9K`2eMmBUxEc3fLxa86SMF&tr=}vOeDmrJYR46cp#t=ZVLrKF?|o zG*0Aik5+ChfQzz6ly+enWEt1uV3eID_Cd$`Zusc8Hvs%kx!or!tqKY>w{~**RCmCq z;%IprcOO*Xn5ZW81GPbo|JiYKQQ2#e^e-I*b~8Ia%^{60iOQBmXKUTC1&IW?240q+ z5Gxk!Zk*@SxQ_==98O|!ICqFuT%LXsViaxT!Z5!aeHN zQi~`^*w9rCE1A4i0Rc0-l#h$0EW|}2b@FQ10@l5nQ0yx*X{LeA9Ka7u+<}T_n*==W z!t&UPXb_N4^*0%Jzh8VJP}PVyIbquz6*^-Z zuDz3VxV#WVGUzup`$sRtYw3k7Gj7C!xT{b_1tJw6H{H?6?$QL_7GQv9(4chz1UiTQ zW-ls~i^;JnCubLDXCS27R!cvz6fclLKTyTq%~+8n`ey|rhesP}=g-xP-ys>^Kb&r3 z?oTE|__W;PguETCkdU^Vl#wg^E=u7CLzRZ0c5yz=Ug6?jn&wqPsx(vk zZErIwAUEtA46{=>^=;9f{o7zsqqv7ED{iwP4j1mZ$oz_1 z?2q!6H_Ayjkpw1*=Gn7ma(UEEW^BBDT3$RR0DuOx`G+a*USgFoQ-G<{;rw z5$r_F8gy}kn(T*kc>nl%LSj5O+QlZJ$liwkA*XI7xjBI5s(jk zuJI;pnJd9cX?xK!ubVT+<=GZYtLJ?VvT}H!8PnY7!RI{| zCK!Y>$&jQE>#|>@<-ilp>#y@(@Fk~Xbd#Zl$qUyX<=Go)%{q6be~wKN^Kk4-V&!93 zGAVwU%t13#Plaf9T}2IDcoZA0W3lm?N4_+8!>!1dPE})(FOAA^;e2VW9rC5yDR$ZZ zd}&`Vhf>5w3c4Xh52+8t)!L8->yy`)HgHj+5jj8x%zZ!y({M!52Esk;Fo&N1=sI?R zknC`#W8*0caCp>IZP{=^YDpws+8zU8{kY&@e zC=)CV7sLe253WN6S5->)U?k-%q*srYb9-Zs3YQoQ@N-CO1KgAzNim=k>S-_rkAeZB z@Bb+`s-EB*y&U7-^a@06D+?imBsmES=I&Uw#q4CVwBJ%Q3dsQ**3qSC3fI_gjjxHS zA3%cnaFPnsS|by)`yc<2U2XXa`fNPUZSBvs6IBzjM*wDci@2mOnQJ+s=!flr8H}fE zN(!y631SrCp*U^JR*g_j8;ax<6I-7(U7RbK=>k9jt-;jPb*u6K&|ns@0w11Q*#*#9 zm?bXk_)xGN?nbuW&8QbN5}a%D13ct=6=(>n@>zRi3|yOya_%umnH;7F6dn^{f(qu| zEgHHLK0Y*waA2c5nQy4>q)_d3r#z24lY6I)Qv8E0D3H?(*aHkYY73+KIWRg7B4bK& zs-`HT&1Kl-5`(@_U}+sQSZE;&hkESBjIY z)lIk?C!et`G+=k z@WZcnKX~icA6hrKzu7(Gba)+iV1N92)s5XtpU(rk-*{6#;MYTAx%p;yQ9jzdkluYD zO2>>n12mdAdF`R#w&U*gG~bU*eF5zb?lDaCJ=~_8mJskRn%us-T&5Nvrrz+>o;Dbj zETKKUJ#S$W#gPihr}>qtA!KW61Y9gYtr{cHJ!N%=Z>}H=DjbtacXM#J+@{eB@kD{l zO_o^O%PY6zZoLqup&blU!>@F6_tC8zp?`6M4qY952<~{|`FfUX8r3wqIG$O{gDqQe z7_-}x866wAF#B_)h%Nwv5mJsUo6U2?}GJIgUBpw{mH^AU7oROy3=&oG@m<58_SG~@M?tJGskQ`x|g zMFU6nH9$VXq5-O2M*oGS4nsJog&*#RfJc33A@&+L=-oJL4+M+s2MY9spW(T)s*Pj@ z%DusLntOpP9{PJ@TZSG2&YBB*TWi1aviO2LA8iZL={O2y+|8?*Eiw7AQTJeu!>uHD zmvOk;spj5xCLI@GTqQl41}md~>-JIrvgqx({7Zt=h3{R0%F<@nsgbi7xmTGW!q@yHdnU zH;0IaIV|E~go${tB@u6}M?5WntSM9w&l$08#E&cI4QIYKIm@FetNRmsAxyh--|13f z??zX!Aw1-D;G;Zzz>(PdES3g+5WRs>qJkH6sG|7cw7r*Bj}&Y`MMmO_48Vd(1~Rx; z2Sm>dcY?Q?s#rAj#!PSmhjmuBzg@*+l1h@%6r1R2mjcE1PLAFIcs_VBT9< zFq<3}tSSpu#e&g=1nPoi7iTa)GUYv}C~?a{JWwM7_7$$9>tLHGoBuE#IAO-|!@(ijg$rtoo-AfMxCF)Nr zl*qhb{sZvI)!1f&5jm&K*nyN7LG;qUyNj17k-<#6i|LT{;d|iNqn~tPdV3~at{OUA zOgcOdlc0DRK4=uh8^I4!9}9lO(X@dYEHr1+GS3y%V1Uc0VLD9TgM(j14F&E}_esmm z0yU&z^vCF8K#kS~INrQD)bsAs))kAow{lH3&qZBTJQtOR_&9Spg${d0v&q<0%LL6CI+$SxV`JiRpP4SQqj(};>SSdo9h&4+gQdgrGq*bbB8xEKRFeEu9rTvwm0RcusW%F%(h&i#hY4yU2>M zb-uh#=&hJDP@L)mTmYG!A#%tSdfV0hB^a@F*GHP2&XZ6s4VkW`M)!S+l)#!{v|Y*ss9;uhfh zyI@BSCX#@Dqo#Tn<12%yyUz?q5W)r>j6(L$wT_eK^ocSpoGEEkttCUuAxmaXNK|eX zjuGlU6vqg&)-lqgVrAJy~<*e(JARZsjNoR{l$T<=E2X7Vs}w zqWj7765X9&IHDtIeOa7-(TVQ&d!ieE2@~C4uiOFbGFNUOx_@gRUzVK7NqnKC2duSK zuppQ47^`ujl&MNY+^Ruq^%_|+D1>3-Vm@$1BeKL8BZa2(B=~rgbmmZ8!(NMu?ij-Mx4&+%R?l??_;^>xDOCsM^Yf8ycG)x*rp`p=U4@P0= zB}WLKm>SHnnpZhBMj!H*=@0YbeptqQnl40IBQwffLA@#-$s7!a8I>%Kh`m&Fu9sj{ z3GYd`ymYi9zfQSXv0owH=&nwWeuzye>sQ<6Fn&JN4#u!CU%&U%kyp(pC7o(=_xwUz zhgQ<5R(1}B^5~Yd_1R8K)3Id;h?IZRWu-j`F@lOWm|;B-Ca^ryvze z48f1wki4mdKi}#mx6CfW_quV*j7t6mU8wkf3$-tSl_(JbOQMskknI4@yvnj|7;>0x z8yWE)cPKhC!xW4Z;r{u=!P4mR>xbg?LxG7lv_g!ZSO?bPeC0Va})+x+NHCO6*{&sy9IeVm>3XXZPp zklppnG1sSz2Ff`Q%+(B{{NaEsyHEN^N$lWFyOzt)& zz>vF*$2nEgq?mE$LbEuTWNu!@bUpK-0b{0_8&f7W?3$OxBY`{VJuDg!PWPRxVVu^x z8aJ(yzFn?k2a&*vPjGMgc1so=@g9w0X5w~-cF1SMN+S4c5d_{2BG-moO5a|?XI+Ln z>W&#yz$NYyn5`j{Fq!yi%w)<3j`B$aRbS z%uyt4GbzTm-u?93@2|SUllRJU=*h0_EHaPwH6K??^KcM4!}bUZ!d3pIwpq(n{#3~n z59e^Kv42LB+uMLV)43jq%3O0Lim&gR4KY;C_QmAOFInQrJc|i##uvTH=h`96yB2&- zb`j23JYfa3qGL{ixIGr{`YsAEn=y_*4Q8c9^!j%If{OuxUiffs^Y_0kWftNs=gKEC z3msQYV`ga6ePnULe8cPK>sPc_PS@{d>?CvOh(76iWHky=*3CC{`s6pDo!@-SBAA+>?MKD{W;a=Dmh5Fk@35)*ix zP#h%Aa;ZcfSuIpZ z5dg2c|8~#0>UiZzW)LSnrBCsj88c)gi|;(%asJsSe)Fx46Ni`#xQ~zimTmxicjr%N zl-)MK$&Tg7i*phHlKe`ki3o^n#wI=Tk1}l$j`zh&TRdPwMInKaULYmVg=RTRu4HwA zltvYBxO1d5R*-o$`4$#6V@IG$pYzNkkim+yG*zIPdjcmz2gsb#Wgx zEMp0Lesq-8PKkO$#Ib^I6^~^^PjDgUGEw-*S}E5<=BX_W>-?(`aov0M&HdHVSmMNw zc(sY#RkhKfjraFYue6-ykg{d9B3QuU6~c!Y1himX z{@{UE?>q47fAFfaT$#hMGBV{#c)Tb7 z8s5q}&*B4RFde4BDf6pJ1w@TB2-f1$aqvQ36U)^U#P{&lTVYq;VZ3Jh_uJ*V4P$Z4 z)neZ`w%0xEW!Wjl*UsJOZJ#w05EX!jLJeMQ_PV2-fpU$Jl5S_YMK2WuSJ837+vi_zw8&| zCz}{&J8%_4diE!#-XYjr=^72IIElBcDrE`bsTbvqJtkmMOHjxkwYcUt($XFJiLa| zncrN^>%96hIFhrvqJ0V9A`=8PT)nBC{Ib1L^V*N4Z9KmFT#H!4KTG#hx0C~`()9_f zl=6dKFKbVxp3JwGT;WDGn&-T;erHZ-!ox9Jt;ciF@)09Af>#kNUPRlbI~$01yLO87 zXnjPRYzsU4iXbs;|E0m8$}F|$!t80$>1B&7c*3m!vTSe&041=(go|W2jGN43@B8)L zvu?B6e*dry-{R;cMweF4@nZC_Rv{9W?5*Ry;S-4j(jB5=Vfe(@Fik{=0nngfzqPhs zU-2Z?6Ue(#$LEpJu~BRut`ehAhcKZE{apkP!^`|PKoRw>eK(IAdM+KnvA%&1(@vh< zydW>I`h3A~GQ--hSYQSWMV-LbVl{`E$!b1Cjgz#Q%W5{eVi26S&vJmLvRWz*{7)JJToZEvXz*miM#Ra7-CHU9 zd7=qS;q~hinC!7ndT4fYR2yCJ%Al}FfK!@$EfZa9O3FVYVik`~n?54!?z2z5%X;T7 zEfHY`ZA92jlw6br@xjXSpvY~tAy z4a-Zv&$Ipt_6;qXg5rBt01M~WmfjDJx4nsvf3j%d>0d|k0EQ?oX4?WeUB78InOPrG z^2cb9w6_x#xJyxT?P?~+uRN;s5V|REVvTZO4*cESiMRZex=a$s;s|4IzQzp&jx{p9K3bl4ZpD_X}=)026T0R0ht2*NcM= zuA^U&=X!?h5CA=YKVO}m{7tFuI>;u@>OuJGZyFaup?Tuy$xgf`lX6A5s^ zJiB>GqQmYL?Th^un>L@_(4(~iFoS6TPNZeWmFviq$)T&`LswI421HlKLM=!Y;xuqAyKz|!vv-|4GY09^^A=t^ zx)9HE#AaoQ^er=-QK&cvbI!(S&}@!tR~3d_xE zE?@Vp*LKapLc9a7)Gc=ifq7V8VEG(P+JJ2y zz3C#}FoUu}UCME@fT2a?ep#GP-ED7qFD|t1EFbiOBmo-V+sxp3yk6;z?FkcDu(rS= z2?G8ifOY(SaB%PM;;s`b1QjtQHw`^QXQ9a>^T!^xNd^%`hS?=iEL=;61QBzn?Unex zS!C)5Lv;WIRg<3qRtaPH9YO?7-`@|_W+-CTN~cX>F!BCzf1@?_&!6;nsy=Za7Lpyi z>DeG2A9~Y8dwF0&U}ql1FmQ1xp8F~o}^t3 zEq1z#t84v-l^vS0!)vd;26iqVmZ-8@=NQd&4d6^Y+0!!hW>a z;7#kx8@zqSBkUWN9nEQ__EdxfxkyNmx>FZABMw&^UU%TYq%s&d)SR->ct7e*xe#!y zuW_S|E#s>o{@U)+yReTnS_;=KH|W`O!GxZNOxn_uU>>J3FSbHp2bl%tX5RJf2M%_% zyzL-Y%Y_)`J@stK)v^-kre|C&)`Hd5f^-U33z=v#(BP8kYAI}TZ(*ISU>CEUDeDc! zTOxCCwIHJJ!Yr~x=A(DDgxs8i8OHlSu!XAyr@lAI!oVR8)`Zk(47HZ)Ye4@odRVqq zde#58blqT^C{@{2ZM=$VBViK0jny+oeUG0A?>GC&+#;Zs85-M3eH;cBkBh9}E|k$S{6!2q5w=;1VIPcPyc|f&UHWE^u&C4YF>KKm#s!0G zi~40qTolaIbhIsP(a>#D=TXHGyk4U1059J&`K5q&r63I9o2UmPU!^Izb??Bk5SjH) z9Gc**m?AvM?driWj+_a00>QM?x<`9J=>C>~&k;W0`4c|EI7dB!%p;nuYsKjFlnnnpg|`P4Jb_ipsY| zIg*GDU|=nx0$5Plnm&lWwIQedoGt;{dLWbP+cJlb0de<$tW3h^ezrVUrV#l^tcANv zKnJ@mc}a9yGX?MUoel{^4`w6HU{%>5BW;g#KCK;#w;>IVoco|P#-m#3br>g$NYez1`& z1yXd2

p z6$rY^VGbp*Iim8w+%S0K{-wQCWz?cal-ZYFw!aLP2BLieO9M$Rqi`;45W(I95WZxV z=Jj7TOY@v3v^3B8@>`l8ee#y($vjTt0EYJHkCQlvp4$3xin}1<4E|0 zvxhL5H)pydFU>IERK-+9KmWmCCuUPd@E$={vztD%4!`b_{tP!0epPz5t+s;A$-_Fb zkc*m?L-JY(_Do(YN&;CXDcBcDy6k)|%pZ=Xv%1eFjwb8L&qoQDX7V{$fApk!TPXyv z|W$8<*mkz2h=G3+%vXBzgf*DRs04vStnUr)z9o!~NX$tval<<%k7OMXRpQ9tLc z`fM)htU}i+nVG_4aJeAaqlmudJ^)su&&*5`O0h+SCoam+JaPf>|C5YorQEOJgI{c2 zORW`H=(m8j!f#+U{btO9QI1jpcn6)C{90qhr8xj z?`>i(;ac0!tpQ4$p4{&)FoIITB*Idn-sPADIjCcNFsNw`%Ic-YQYOEi#gGD8IM4;5 zBdcO${33ZPMphf`Fp-bhlC|e-clZdu4C-h4RGDo>!|BI0!yTU$;VU*Cd6GxTDVSXE z%rk)(ClqQluT-bbzW1SLo}Kgg^Y{GPMX!3LDFkhA-|Z6(y&PrHWX9Ob;WWi~KFz5}CP8BSg+sMF ztLq|giCF)G-+GP>>Ja@sn43rjO!W=dmE|%d&(FhZ7tBh$@;?GT;>nh^A>5Kc7o$q#;RA-aFcu7$!~e>7+%3DJb}I=|5ISIoBJ(J z5&IPaV|p9NCeD$)@fug+#$cOHQ8t(?F{TLM7gJQ8%$Qu6FpelTPa^plk(d)9g(CT*R!^^v@EN{~5YkDMdvod6 z8Ar-zuv&G*m0l=0ftAc-S)X`JtvV;SH;r|r8ZcoJYx2Hcfry>M;?}UKX?1(9xArLz z|Fgk`&^4(bggXnocNKwrBbzc-MKHTLV->yX`RSjRr7;vH8fn*Ol%{bH4y=E2I`UQA zAQBl8C>+{6&4@#a^6iE3fa#W?kLl4Oiflp*ayfLXD+CzDt!1{nG6D(KJ}XNA9KdDTdxmUR|@yOy^Rxh9eSB zHTmBHVRfFs(g|+Q)$?MDLe+A=Cjg&iTxgd`5rK6ZA*S{oT5O_vPZ7B_4_=*N00}U3 zVS1YA?E$W(!6DIijiX_f#UF(uT2^0H)uVBGj2aTioDK{*o2p`n5=cxwW3aF{kK|~Q z@i=WI%eSZc)m==>RrmIHaBkAPW-J>w@qu+h@d|!X{rTbVIv2Z8xb$`T$jC?b-kUZr z%)8A6?}APjc=!Bw5fLjxp_S%&Q~rD%85wfRnXzI>w>%Za5xTFqh48?CUn9v#O_PU= z(5P8^hal0Rsss;m35+>cHxdQlVI0>SlXuz$0`zKLGM-sYbD}mMlnDFpYt*fVxXi3# zEx|zUeDd`G41$Rr9^}&iO`LD^%RMGYCxcOULV<)-_%l+6uKXTn_zk<*b>A zW`*oIs)k#)v1EC?L=?G z$!&g;A$k@wmo)}!7+0+Q)4)bGFDQNTcOsB(P%4TAA&fdwIb|i}G`p$91%?r^mvI>( z>L~~@>Jb90F+DPC*Yfan;MRZ*qYSe#Cb3}y`3C$qN{0MnJP!q*L?Q$6+ky-mA_FDA z1lL_mb-GUa5chgq@R)Cp>+B0%VT1Q48>09;yLmCM;s&^$4}M)2??N#W!sP!ls|`3j z_lo8PK{F82Z*&0B__ed31u6Z|e z3Bu?Au|>!|XQ)S>$2f92Lfys`>dXHbs)T!Z6GV?{a^b!iMb)r4L8ISxU_o~JDh1^% zNV10Z!C;QZU_M#jP{Q&yFuBbz=qFhXmBvr93~QlasH`A$TEsqo9x*$FX<=+FpQPO$ zlpg}xqMB*_t|o^l#=a;k#qn5WrF8a1Df=(tN*(D}%G2&$jW5lW`gi)Ykx|f8*#)2l z0*isoLej7|SVH&x_uU^Bg-&f)YCHKZ6eItMilt1c&O9E?gt8Wjk(FSkANL#B`RwLu zJ|ijZYJ>Cn^6|1{vDJl_L~(rGVQC&v2g-zb@(^(TEG*5aYXl}LU0@;%G~L(^{=_hN zhN0$f2BxE!oMTiaOscu24vrw@zgI}9G{ygFe}ck4qsjZQ`0Tl!{CIg62ra+IU4h57 zqrvnQ8aq=6FN`rgIlYyAl+4t{9oZuWnHj+t{0fI=$fEmX6Iln7A95^Vb?7DF3kS6o zFb&~aa^4<&xRw}(#!c)J2s1|s%QDR>l!xVgiS0tR^YrcYyvp~G$9qPwyfLxK_%_Sc zuv`m+1u3No&tzy!?+Utm6$u*r?#&>rnANt!2r6w(tMj#rP{AR@kxd0MrC7)tYj`Y} zu~IJNXX`!nLOz|4X1V8BoznmhUoI^$Nqld1J0v*IXyA(1kzG(LsH(~L>njg2Hu=#- zN%9|15eOLx9tlgmwc)1K!W5YH5^*B?F01)yU|EBT2}@d7fhE5SEcwPtuVBg}z_PUJ zsE%=hGm(JucGUm7z+tZyAizD^FPy;dPIM=EAHdg9r{&kGYr%#ZUn*3=!^(<(y+fUr z=2gjqP?M!^sblSw)OZftUj7N+fp90kg}+Dx%+o8T|`hFI#Vx*kNkCT3&VAK7xn=3)419cbOaZE> zaJm&hiSw!^=?@+SC}nvv3nDVYWk*NH8Yf_ZYH@Tu>1 z-Qm;o!(5573~_}Yha$RCn|xJw7v~RxJpkHP0kR*P%n>4ItYY=nHGIv0=tbT7^Z5~> z&-uh)l-RIAk4B^96=>;JC1K;K*p(KGAGb0S8?DPBgbxUln_O0IFy>FJ>|bEiB#Tz<4P9NucIDO%sr zZr9BhwheA>UHMhvzRG>v6nh2^b3I>I<+(*@6tpwIvS#jI_9rimALL1g^ z(|BObK`WQFQ_l2jh>SJc-P#Ox^|cLGRN%+{iu<&1S$lN$G*@+Fz7>lrFCoz$_nGuW zf^IUBsI?u3&q1Zrrv*=$w$H3jh*6D5osmOEemL z+F1~2k4BW0x^X_XR4wYs3L2$je5s6XZ0BJ{Zr6!QoP41UY+B)PB7MWXTqyV|cM^vW zz}IoXR}5m_Qx;L) z1L6j^9TcBG%*Y~R{J`h`&(54$cCozZl6iIJT9^dixf93H`H4FclM46dNkbpv#Rd+# zW|!x5OiY{HmOax#52TsHr={0d+{mio+o#1dHF3cjyVhFa-q!7ogx-prMiwnw~jj zPAfu`_#yx=^;vjc2E05Dd`q-ytyn@cWo&dC>S{kWP=apNNl^B5J#PP(CUwla9)*s1 zU)|&4UJY--()MOR9&boYFFGcrr5{npeDk1V-t)wD%xaI0iJlaolvnktO6pvXpcfU* z6^J8<{sA9Jq@m{ASChpFM4?Vo|Hx&nuLX@Vdo`3aHJ$I@$g@V^nF?p<45bDv34XpX zsUXyiF80W}gE3aSutr35RQH~8kqp=m)*uK^Pn{5-$K~enZBND8)!4)s_Mr{sKEsqk zprwi=k^oaEkP)p%zG2z@Hf7NGSk<^c7g_SzA9-(BB1XWpc8t(yT=5Nr8stlyl%C|6 z5t?S9#jtrsMnPabxM5g8`~v@X7!`^3u%XkFH#E&IQ^Ze64dKB!%PU9c#%|1=f?QR1 zGpy*NeX94m{Btvwb={>|zXU@4Iuc+=+lMXpahZ~%6bJ! zfCoDuZ=7#kGF=BATfhUUR^WltS6m1sn83)A^%qq*df5~rV-4>dA*u`p$4J3=&l`)i zz*A_Ou}eCdj5Uoo6@#V-hR7PMDY!HU!A~x^@g(9@V~`v==~q5P2=WW^ayKSa61WXD6Sb+{Iq$S<2Nnn$ohBCqHAS+D@4SacLoP12AQkf7x%ieliwQ^X{fOfjp zO{Cg&rL~`hy$%H0zXmUsn0-xB%@>9)%8>YorjL}SV?MkSIZyOq-0T3fbLK?STuoK%^)QtPB^>3v|+bp48|W|RY&i@)8dGi)H?^5EGn8%VetiBuiQ5x%peuSR}ZD5{z-=m2-zb`E|z`8j!0 zIOAPs-0Z^&_1k1)u}D69jg>IM`~>uwcw* zV;vQ!3S)$=91XgJ4oVClZ3mXWn%oeVCO?pM<4Y54<+m4JkJIx=cB>|Tt`Dnq95h9& zGWrDd>=TXKdE{Xv!b@Y6j_ukP;ee_k8=k-th;a*VVoV_H9T>o@Tt zy5y<)m3GSR=(>BT;z1|mV>uzrh*N)W@@=qa${U=j{s9B#TQ$eGfA6W!*ROdcit5Hc z0_MCXabpv8j^Hoea}HgNvh;`Qr*q3B1vDIWK>nzy8*STu_lPtyjiyW@sa0#R-RMjI0h)_ zr~0m;TqvX<`R+C>5znQ%pt~as&IZte3|5)}b8|0qYl0h9XXHJyN-H!m);9ew@qxwY z9Zt;E6y`n4jKKN8g7D-_y-(AYEAa>;{*W~LT9781^Mhi*G7(#W|IeB>MhLHxdr)Nq zIJmgEOP!Q0*<_?kF9p(gxolZ-EFfLT^UTDGp-3T^ZL8_hii%#r3pc~Cv~b51yg~cS z&2=a$T+%x~mryh$B&Kc<8MrF-Vv`5Yb1l>EbUnUzC`I#d6=^**n>MmeHApMEfkWS` zusFt6q+G9Qk`^U;<{C9iMWU$O!IM|U>a9hQ3GPnwo9oCP!>Hns#NO_TpkeF4465>fy;igENnSt zx#GJITTJG_b%7T%{V&G4eEhH1rL4;v+l*2tW2zLXDEcq-k5`$S}KH!7V-#%P~}C#5SyW3 zt89^RmgLIFs+7^?VebMNPfOPqLRBGINR~foSQ!|A&8p7uHH9I>FB}$bgcXedEp*{O zn;NP@kRTKLj6K+q8bQkSE|lZp+!`R00i~v9D2ms~(z!JaXh6@$W))1X^4yv#Hgh^5 zom8Q>^T4!^&>d4Mgro>-%`v#66V|;L;lA-9<3eMhp%W#Q&~s~eDO%E1LM!Jzw+23z zub1b;J#uw-&Z%K?HsKw4IKn{gc&(8HKtsv#r2+4ygD>{L+X9MTAb3Ccg@E@RgXTo+ zKQ*TVV^Sz4x*U;WsCG*+sYSkRinLIjbo5-PKFbK{j=fvC>5wArab$GAG!{LO){#lY-wpgWwEBY^^gRJDeD{qAhdGaWG$ z9zQ$rJKk!)pJm?%&J*y~9DAq)j*VZl-^+ww0tdvZqjo8kK5(1;jv>}Uk}r1hVZaz1 zPxGwNR5$W`c{oo1Ztn^RIh!TY7w?8WM4+L!xTE@^+9mZBclbbMU()JbtMGM*`X6rk z1DUN}Inpye)lB$lT?h5#Y>l`Zb=2`BaPc9gM|I9{_C|PQYJqqf3wA-#z0jAp=R^l5 zFB-i{$ash5+%N*chAYcgTtv3{SfGfFbeP&a$`pf(<&x?FU`e@AXMrLh69tNVG7A)~ ztZzJD3KU^HP@u>Mvp`XEzNL<5EKtNMhP#Ghj9VH!C(rQb@0v;9O~QL~FCLiD>uy6U zBo>uUI@~s-W}d2HV%wTLFiVwvf%?Iy(4>YFSxkJvBh6f~+T^hdRVGcXv{8v^=$oA5 z&>e(5J`vT06769>QfBlR59@8q+}L35&CFET!6_J;lTs9&DB6qol@n!qj+&WaVU&W} zfF^4pCYMH8=1?POB3$ZnSVmS1X>8&0jd=5tq5;|1XlNSMC9Juj7{D?#%Th+Oec&e& zgeZ}>_cWnVf0|IlMTF;@hU&*?>P1@8bf6A%@r3rL}*^pb%5FrDaP^y*!?r=K45|LC`Hc*aIO}gR0}fv z0SXC~n;=x#=3PPA&u;MXv-L1)3BS8sB6*o>cgeI^8NR+dLbQD099_oWQc5_H^d63Y zN{uKcd|7)JXAJR*EUljS>N^O@syhs>XfEocZttNpA=`8pN0qJaPI#{9!tw8CGxMH< z#d#YB$#Ve%-LUsGSG0F7GQxSyrDU@7=|ch6I~%+G<7H72f-OxGd0DAq>?61= zutWg$WzE}o-xUE)S`s=yLZc}I7%p;;F3R}yrkyi2e*3NKQOZ`ivoYUvA>>U}D15sO z|GG8a%q)^B;rDU_*B!fS4zIOsTkFoK(8vNpHh`;*?>xd*pGXCmuaR9>_(92Oz!`M9 zqpoAJ8`!bYH28u6(1m{t(GYyW43_k{n#F?Xr<*)Psv*zHj)kh;D8KhyB>Zsc3GR19 zTA*P>7c@Mu$>1f6 zMyAMcs4;ieX0OAXUvln}Wt1OrcD$zRdulY>^dt>`;XESf~*4lZRk9r8SY@pw<}h$v$6U?+AN{FyUDH z#%VXiESdIt*wUGd!?gQ|>L9n#746(Eop4vJ~Q8R+Df}WZu+3uG`22vQBG>U zdFqqv{|I<&&bC^i0-clj0$|T@VA0koN*kQz89rY1FYiVZ9%?NBQwz7g@jK4NcDT$e zq%gxq_kAmu>N60`dbeC&fo4`;Yj|emHK`DE-8%L8w|#8%4;@=9-sY*zf5=do=4qJ2 zbd%jQp!6^#>n<$HJnZQO^$sZ#6EqWHWsvvIthagHHPg-O!l8xIxOjH+ZVM#*jT@K8 z49^w~39`mKQ#j)%RMnvM;Ed{M!5POuSh4vm6B;MKP8*qzE0v+A#F~h72|vCA*5NpOqLmLv)h4=a-cn1*qXM|R0UBd?MF zmepiE(2%vC7$Rh2gXq%;g{JpF;Q}xHiG&Le6b?&@l0W=TQo%@vGMAx6|}tRmd{p4UL@^_ABIoMY@n>laSjS>;SXlQzq9 za3RnQfI^_C*+|_Dd=nP9_hPYIPbCzmTOUO+?9+ayt(NCKTTAo7M@5kzN0IU85 zxVkOuQL#EbsN4T(8LP*%7+AgDD%C9AvF{x4^Y~MNDB>&xcYDdS_os>wE7($`YLLkn z$e-#M&gV~Ej1S`@5EAM;$e$Ycoc`3Xg>;bCU7iE3gLDr*r{O1y{;$mtGLOyk2>^+l zx*xfMC~&Cbr_6aF*?o1_q?-nD3utlWW5&MBTL|@zRuuoS38sc5aBg7vU5?4zQsm$! zNTW6vGHvgZr_Xu$1zzAiQzz>ed8jE2gt>r8=)F`o;N}h{b?5;2<KmYq?&!RS3#qb9Yq+0pYL~3M z*PV>^RbP35o|dyiO3f@)W|gzFExtq%`AKwCKYm1Ba#TNVME-x8EMb%J`)L~+^g%!j zOtIOzCJjv4a=7pU%~3umTg86;Q3<0I+_#>;IU#ExfF=%(SRSIz6hB550HTo{GX{N^ z%~o9A*a4s7HZ~~=0uSPxKyqYvoC-h_Vb!-!pS*r-1UH^Wla75xt!DMYv8+(n~ z*p>;aEpE^#AH&fzqWG8`ft}u_FL4(-=9o=WfYvNC9O8=SX~nYJYvyfZvxKLPkW6LurV38}1 z2a`>g@jxpZnGa@?kNIGry7^$6(>@<;W4cK`7!>0~d@-iMYqyd-<_hDueC3><-<0d? z&tdA|GlHS3@g9pb^5X5=+6c%B3Kscnl;%OHI9e)Lqp9gE%juYf{MrBg-YWh`8?Rz~?JfV}#zHQlDwwGSA4Y%^X7F}!G@6c6%;?(2 zJPgho7hwfunGk!y$_ra`@D>D*>Tu;pPCm&#BYr(Xm-4LR`Ri! z0q&H^dzm+{A~;YzF{{^o2tipTNQoQ5?#}Aoo`K zA$m28CSs2W>cQltEA4a5WjNtZPX9~q zgWh+-mx@VgOnv4}Z5Z6I9)hujWdtK+l~Ow^S*g=-dxvHNs|n5kGr(n=d=rqlx>iR? zo{{%34O~G~qr|ab!&D2f6cD;~#9znlE_kbk2E^5`u!?{bl`{>lnnkl}{iAZ~?@A z^%nrK|M`~=Vx!$feE~#Inki90x6g4B&7dV>R7HQ0n%amb=%QXTu>QqFVNpKM=?-BT8)nuB-j=q*P;7 ztc$$&bHJ}HV{e20Hh(}#)kvo$n?8551{p1^7i!VSmH&8cmv^!_y|?75RiL&)4@@CE43OX*;@?S-bh*A*IW26>~VcM z&XS?P1dCX95>|r@EZEnu3cuaUNx^a#^^b}Y4}asro8@GDy1~tX7OD4hHGm~N1QSlb zVu(Hc^D7b$U5lq~piO-vt0K>P=^05u6H@bSk;@Gp)TbwZphn@b0#<*D-ud>1x{Tm+ z%A7p@VQBxT@)wAHbP;Lt$S{ui-8z48roh7 z8t9k0^7Q1P*zMCI*(y*&;TH$1bDq#?QzmX*j@$wXa2a`4BDW}c+mqiM9lUctd?~Hc znr!HBxmdXX3+B|T)BRHA`m1V2!NMsC)I9GN*bvulrB(HcS%f+n&&A-ixMKWxf*)cg zifPs2lU^N8Gz1ajM8o3@*t?_{MQReZ>uuCa1@D|@(sTab6V_ZgqYc9mHd}6>t?yEiOt@jED-rT&H^<| z1FecZVQAz!fFG*XG1hwW?eH1LILHYQW^fEeAU#5jB2}0OX6QSE_#J`xoKZF!FPF_^ zuKwc4U%g7;l%2=!qy~(|viX3#LehdMA6Sq@9QR)rOruHXBm4ZNT#y8zS6ADAE;tK=AQxcDx%UhV1|dB|IDDvC z@==Z(Vg=<8acK}sbqWe}=N+|9iVlnHEgdq1(&4e}@MLy4?K?bvo(|z2F-cOF6oPFsi|vm!%^@l#_Bb)R_teo> z%`Yk?4llZ!=*iN#?{Ti-;@o%qKSMGKr54Ju@3AjtQ!bf7N6J|s4A`X_JEaV1^_!N{ z=^fEkbdp9n065yzEX&V1KVJ}D?|e>cz37)?R%_9}wf@O6MUhuN)7+ANiQ7Q^l1eEC z(GN2i+}Tl1&}GM8aM# zpy1ZA=*qvJUvLYU)^x5|=1X6w2;u%Ma4C!Ofg?887aZcDEI8!Tit9yWj`n%u28ehm z+JX!RT#AT6hKCRaX0)(E@%%0YhxmpQW~J@rHirn#zE*A1fU?F$kEz&G$sY-h zvWMHU7R3vIw!PAJz`p2Y0sCgpil$Z;MGY3`x&$aMP}Bg#D!lgh_WC-5-;H|^I#{z! z`GDoBldCrC@8s-h#W4!Mv_(oQ=347*=zHYr{gd;>S=Y<{OZA1pf9Y=5X4!vfYERki z+SPD27dm9(o=F8AOd4sr#wEMI0g_H zsgUeD1~5u6aSI=+yfieDOfoHdxP4&3NZrG&atv%mQT5L}1rYFX0AR&*n4E6+SQSqG zlQX~z!Lg}v9$h^BA$~n>AK+-~lRZU*Rf~i9JWsy)pmaZMG6u$Q`=@FCTs+-1Cb2^{Lw89siOn^Zx$Ix6h81TFlV)` z`Zu);>gBl{_xI9VFxbhWEYC~*w5bZa{WG2$F!0l4g^&SeDY0L7^;g~h_>Y#h=$aV| zqniyA(OV~~rhCt=-=O?w&GoCH0-TxrNVql>Iq<-6a>R#DVt%n7me$w8jtjxVFBvZ_ z>(p6D9Fw1sHAtM$jODWFvkO66LR`jjfv4rwhmor+A6~2476RO6&<{-piH8s=kGJqYb$|N4cm4!{SWQNLeYpG*coqRjjC2~+Vj8Qb z=Q<5*LFY8+s-Fh95Ib{p7fJAXf|*7H$Sj19{ET3E0LCzggOc$C{uI^X{!}fJIM)jO z&8l{HfQFdE^h1|Ngpiy(l-gTF_m&Q@lQ8oDyIy4V()xh%TINSLv?{wu!NdenDfP)9 z&oV?9xeeK5e}G-(F*ey#=)sajiE44(V{Bxxj6?w@EtEm|BjxC08dRSfEJv7Ws?pt= zK3VDD$IqAH7Wr)_%-hsFE2)>43S5TxJ&dy$XGzrI;^oOS&G=&Ic*!&~JLi0+nfH3R z9%*I`G$Ega=Fa1cS#A43(`;X>wyA0MbfGw?4a=rkrmdxEmM7VUX;!i@7g=j~x-R5N z1eFn5-M7cq3l%1q7ZkMON&MoLo4$Z2QARuYKh(>L8W32ll!;Qa#c>$>7ob=`38(Js zWkbP9qL(#CGJR*S6c% zu#ApXy;jrZzzm>}*x0q4+=R{t%ooL0@zQk<63Xh@$vtgkz;*464VZc9LkMm4(J;6s z-yOl<9k+jmj%tc30f6`MEUJ^9oV9o{Pa`#^Mo6DXpUx+X=3>uTG*>^qa!&rI*MVT< zJJo5C=0JzyQ!7IX{|X~p8IoH?v;mig6zcR59D=JuqKG8pJKvBPi$h{84k^+dhatfx zI9$fE&yt`R;%vd~zgKm16|>9CrKtcS-^upU=t$Is#e7@XvT z{!ef(#PkW5BveasHu@oTzYsf1Nx~okqeGIU5zlmq@|I`{gaZ=CG>da)jf*K_ zNGmoAS;U+3jmduo0+>kzEux7obb#lBTJGmNg3&$sOw<&_IYC$RHC_P7xr;EKwMmVV z^6Yj$z?RteVt_p04nGhK-pqNdRnk838F#14WT%lP#90q@v#qQ%n zsPXGWXyIYH#Os#2XhLHN?L|6p=aWkGyR<_G~XIt{iL7<7hO<;3UZ|m#A@UrHuzvpmqTpgtB2Us;kFQy^hN5n0DI}x} zH^tDr5tjNqG#~?6`Bb`1_Ikp`QIY%*hq%z>_!>A|i~NXyket;;VCS#wGg`p`13-tU zeR06FZvGunA{?PdGbYLCfE}5j-IFdu@(}eqU5|r)o=z{QbfW|!wUBZ~lG)QiYwIPW zk)zq08HMd5@dft1c+Q9cXNb@*%IPQD?C*B^W3J!hTt`Y- zloi$7`96x-I@b_R9z??`yDN0^;nVR#`QvN1J$yDj} zfGyzM{?#646ieyxqKQaaXdm=-Yxvgam&t>loU|F<;W$PUa_ORRl7Tg5u} z)h}8X$Ct4VRPS$UQzX_kfpv5x?9IlJG(F9+O{}XYKM@H0T=*Tru}lL)lVetEM*Y!{ z)N7o!)KwTOjEM!hh-0zHUDb9a2!K+kE`)ySc*zWvaVg1%#zGxV4aGCG$ThsDY1Z;g z+XXqw_h?I2x^|PWDT-JW{RnR?0S~Z5+%8xW_F>=w!SPTj#1kF2Ji0;=yz_|k(264t z9?gYPU)Bbc6^?GQDv3%VnE1rebCZ^KX;x11cE zuHVh8k{v+(<)IW{>^>=gj^GOSwhKQ9?AgW@b0J@~1VXd7LqkdYUvj=`C`IwA9acq3 zGU4d5Rt#R#HV04gElUI%H439sZ&b2Fr2W+qphQ*Ex?Rz8`m=+h4_F; zNe8;9m9LKg$nY^V-K)W!FF!yQA3+ZOiwwxHWt#4Hf8xs#kPKdo%)x(=0SN+2+Q0Z^ zN!kovK<41T$biHKs;#_W?O4nlF@s#WrbfD;PKBmimpE~l$f`aHg zc`SMN29#2j=xx1>I&8wp&1b}xDH74#+I<4=RkM5ke;rng>TvNSOmI^*XAU3Us)~n^ z#y2*%w>c0Ey?1N7+u>t#yZaQ);%w|b;^+Eycg{~zY_8;kESfufdc;vAUM3gk*ZdS- zt``=~u)!*{kFt>u4*_5fS4Rct4^D$uTM2iU%dyC1&~>LFFvlLkVG$PbP?pqteU^m| z3--o8zJuC)H+Bl-b<)_;cSoV zqlRHgJmhbIDgzDSxry{7{e3hQ*fuy_G0z!Jy9OvaO-&SB|KWnk<5vP-N^L=qAoj6LKxj|3;y3oY6bPqh_KwIb*%MNk5kFCtt(_NOkk`gqmM zD;$3|F|CFs#(-v8*$%IsEk3Y!!SVDo84imj*9j!0$B*0U855iF+LEAzhek9xhd+H|8D5Utv{yFM%S+0oTw+UVTo^5k9BMJ=D^c4SD#O&aKIJj%St}T}nrZ zx8{yr@lnM-@%3Peh!HO9y5|OHMx6ov$bQO!F$#cTv|gS8xwshP;|f1ccP9!QfQQ&7 zWjq{%ocy3ZsfMmII}|5{IK+k;kQb)v_+i!$*fj1K#xbl*c!CWTNM~sQ#37 zc>*2hx)2Zl7icq&79yh_B0@M(6&(a0H){h#xVj7x^qiouLRTun1E#7ENmp?()>o}a z3QLHgg~+-PL0%0IL9P~v$o_yxP*o@=#z1=PlBAJ0i>{YZD~Y&AEnz|z zAkw6Jt+K^;1IA13Jw9xeilFETl_9K`hOHu*2HdAIgT%!`i9)vN{=`|UnxnT&K44Y} zoFh=Se{5clb~F5={!?~i_^!)=FdLRbo?+5-S&lHBbZ)OM2XZDZE|!B5zbnf@-UkEw z^PX{J8h?0@5e{WB!We^XWX6JMp{kw=(_#pbfl@QM)ggqv#KpxBaM}l|I)xeRAtIRm zC_Jz%ha7KU9^4+-U@{M`tS}F4A5XT?-~WvNeO|pBA&+#T5^dCvn<+P2@CL-PV(mJb zDX@tLUW#zfinSYy!mw0%zPbDSJ?E;^nf^u1*@iOARIFXDhP?8G@j^yGv6%ZGdgcqK zAOw-$zywgR>ONjs*@dfOj%o~QiNiTPt++c>q^-}}f#Kb{+sge-ORod)m7!+)MxIOi zY)Y|Ks8Ta)k49KJZ+4e^2dp%x9BZ1(P(>=D7R9ihu?Vgw(+Kc~4ifO}vk~KYml}Fd z89SMLxkqz}Bot5}e)capsa#}kDHr&Nz{5Xae&Z~h{4$Fm8Wr`Dsq|Vj9mS1ef z%WN+~Af--L9`hrQ4S`lOvK!hgQ6E*&*_Iy!8U1Ky0F3ON8K&~()!4#~mseYW0l^SK zDzzmx#v3g<#6>E#s)}u1Rc+-($^=d~+{F@)aDJ0d8h7Kp9qz49w{HT7bF4ww5o*g; z{N&)!wWy`oB0j0+O|in}`IiVUUL^*{WV>qe;u;`CV`0ZjiUY9LBh zv@z&*axliQC4jD~Ho3>34W2S+BTd{J^NT^lDYQ~!MXst)fjt+M#(V@;kvn)xwC(#! zUNq@GC0{bwOvof?J)*Gs#WKDY`B7`LswgtMI@gne$<)C_-G>egzxkT>hyVw!@)bpr4W<1^n5h4x}~rFUss1s zVy1@)M17_Q<|=bg6`uTLRF03YzmnU!CLtp{fMmi#)=@b=^s1Hej`Cq;jtCLkycLO%su)}380R5((}BOz za}AfeuMVNv-S(FER*?KzK4<~Xz`gHn%z5xP-lkHet)8mpXO%Wk&w+8qxGWc6KwMy8 zH60z$VayZ+DmB|!aK;=Xpi#R)cFO*NfiTKnQyiVu_B)zpJ@WVj(cGdzFX-@^u1#W}xEF7DHNbi85e zlM;##9D}MC>ORsazRJj}N$(`Tz>gu^{kkMj=Z$a>RywfSm}yPX(NfnGEC8VvX>`?G z)Q6=9>X*tOY~Q{ag>Q*wschQxm|u<>8ItIBlqbz@tfZsEeMW9eW*I+o-z1?}!s3NMs@MS^iwgymw?7e4iq#FCJCl7ftJ{ zMVv`M&rr1?kuC_>BB&a%@LK-gxaC{s?U`FJKHzKh&1bs5N9LYr3n|)oU({Ps-@%zY z0IL+qPMben;2|T9uGG+;wl_h|p_e!G77BwNAmd2k{mF7bb@!DL%PnW%s7?2b=U;Mj zY#fr@zUr24bYmzS>@|>RAU*C*b8O zSO`$=09;AaqTu;jd~9sryC-3gK}B;-u(H_N+;pFP+c_?pE`il_Y}%ZfUJ=mZBGy1) zBDg}w#~Y_!pZfdXHeY}3bp2oQwfbLq0{;HnEh5WtYs|{sm>A3LAtaMGj5BFd?S!Y= zK30Z7hsinlp@w&Q-39Hr8X|0i-lsU!Sy%Y3;ydKFjg_K|m=mA@R^meWL>!|o7o`(x zBh^l}XASCdo}!frr%JuMjq4)yQdPm|KA0lCG1T&5<&bA7QLVa%`RTobx!ze z%4Kw&rsz_{{^C`f>L&#bH_)8wi5UX?j(0*PJuPrWDswfW#mWDSB}4xRwIj$>sStNv zuvlOVjyKC{(&E@F0T0EZGa?Vrk-Pgyq|g=kwk%Q0w|nYY#m$up3Q%ZoJn+PuYxN&t zd(WN{YpBOd(fwlmlku&8Jf?&93|wx`4z__AbCc|cJEBHCx!~W@Dq>XsUW6{;NkD zYa46T`ufJkhzsi*;~K{u2iTcsLWOD5Oi&_CGnw*1mdOK%2tBPPpUCQyzb#ZX&{xz9 z9t%?iv>G906}}}<%RQb;7J__Be1Uum_}y-SJ-LjAkC3rn)>w)fR_%<(@e*5U zQOEVsGw`MQV)_8F+U+kgdc-LSlk1)80qF6GFD!ceZlcFMfgUg#l@LDqxX@BmDlh_? z)HX`%C>{r*aS^LW!R@<-34c%Hht;u$I|w)Vpiy@0Lv#*(M&0OUeC-9jV)bdH$Qk!! z&`b$IMbv1iKi2>Mr|w;#ExXDB-Syb#oPEwd=hUvGl2lTquDvbV6Rl`@ZzM6Go>fg= z228LS1#Of<{G+EnrZzBO-}NXt2`?3V1-!*c~-s8X^yg z2$#^JBf|?Cudn-k|6FVBwNF(gRh95C1!t|j)?D-P&;S4D|C;|qgoKH9t)bfK1*2!y z$YO45lN^kTwxIRqG#*EnB=N3xP-|{9y!OLh?HGYSmMoE)Df7`Qij;*N1FqUe^d0A3 z^w>Ycql~ynlAl$r9^z$Ir%ZNSBY_>)CV?HV`l<+f$a+caQ0r$o>r^uc%9uSciCw57 zvnskWT@H)6DokV-0GNHDDiUSdWOhjvQMpGI8UI{t#$i~bN^x`*zE|i-de^Np`bF_3 z`Au{_OLmP`f=J^}z$;_a#68tjtG~9fb7R1pLEp#Px#MBXElt4P22HeS1pV1Y{QQ9? zPz>2AX`5&+>Rgmp34}4`uj% zZRr7&`_ozL3mos6fa3L(fpTAyfKZ^&j6k6oKfkX_Z}WISdB8xld7wOe98ezoLI9<~ zlUvcG#ghjB%11k(JlF!|!3HQ^PZ=l=^ngM$0)=J*Q%(se54S*hYtco|xzISI@qKdEIqYyb{L{FTk@OgrGhb)^YrWCRk@8G^(aK^ySM8D1;a^g3b;uoZ? z*}ueGRpjBTxxAPahG3PeBi%%aSW0)0UptG2pN8V^`o?!0TENii``cZ(rk=qfV;UUZ zHb=gNcZc<#C(lwhjk7|MI~vNc>-zu>)`ChHVQ6cj=GaT$7H#&Fx+6RsHeE1u7%g^R zQf}}DP+S_8iw)h)^>4JDN_%SUm0h@W3TOyp_6!};B6zmMYG7YIj0Dz=N`J@m&^Glt0BTA@=Okae*ckTfuy)y&^@&U1|@Js>r*;ph9Is>n-x~IH#*j414_R(96%=WBRudq6NC^Z!BGi7 zJVqyqunr;3c^J=TXT$?UAUZf2=P{&IFC6x2T9=3z*#$iY{1)o3akWvtP5}o&XQo!6 zDNs0Vd9KpA#qee!7WnwXPHrUpvUA|$$#?xXMNfB+v-p^^JGsNjAe6{rAhZ)o4nv=V zqqyP@VQBESQff8n(V~+!xCfzs*CDq$-#Sse+8w8iEJKaOW>XXf5lXnbrDsLe51oRc z%k?n!N~@g`6P)%+kJ7v{7o)o_$IN{cc=Ny7eHz56(>B?6`bQ*TMnK?;S)m_cLnVx7 z1SYoojYKYpA?-hJc3}S=I!kzlM>C2dt4t~d>?63U6fc&$J}%owCZ@8F#U>q`uF#*A z=pJ4?hc!}YY97FQR&aj7^t(nWV$_fpcM}(#jd* zT}YpaWeMk0B(xxp-%S2%BbZhXA?f|RO9Vm=*7OD$e-rdx==^xZh%R<48U2ZVHUESJ z!=r&$__K0b1J1iLUk?`_?g zK*QtPN=`fi9i(@fg?@fTF`6IxP2~WgECL?7^*i){Vnhg=5k5ES{hajcW*L(*` zCNVG=6>HW^40Q4k>FKZZ-#R)!mv?p=cuD9fV&Eh%H^HZ8(GhpADPpx2V5U`kP0=ci ziV#*e*cpXyn8FLNYRy~SeAfoPL;#6(VA!Osa{SG_oT(brVX~A^HS~HHO|q2a_3nJ| zWbX}9`DO~FkGE%9NvDgZOe^VVvo3Vy%VE^ddNQMa*1yzIGv8-E*C6J<%(?!SCo}4A zIg?S7T(@T^X_;PoO$>MG@cKE$LjS)ke&qO%;1oKg-m>6nEzs&FF&tbfmno%S7In=l z>FI7Q?gn_2hC*mWMdeV+y}5?n?+K~Y4Oo=frR)?@9TbwMHw}@eMq8=;pjRR#QDc|w z_D|tu@YnHOu~!mpd0vhQpRK+DC8V@sPH4*T6McB*wt?lce7u*%B1PS+2Yxwlg>QW_ znDVV>f+=4PqkhJd8TB)s`cZpA(-(f-b5G?NuY1oslTrU|4p&G_K#I!R;4Y;z>}^5C zPh@YCwl9}{SkRx+BXyED3_%Z$dgN3$tZ~EUv=1uPWLg3`0{M{dI#duHud$4AvxrFfQd64^hRupd)j$7rU~n ze9k?37;zV}#SrxN%|#LHP5bNEd`jdRGFb8;P!{2?9REV-WW!134xU|@YVEH)k?BI% zi%!RxqDf&#i*#ccrHv&(i=;C(c8yEnc+n5@>lSWePS&pvenqj~iO9=IL{5-NY}(dZ zxiE8ZZe!uHw?b_)?1YPoRhZf^?xV)Y7Fe zdD@$BHKnCUN8XYXV+E9-61BmT^ldpr;vKVV#ExRq-!%!4lLXGe#brNbd4us*u%Hcz z0TCddU{LvP%wgna(&6&g)-ULw$lHmQZab$-x+4$!(Z{8#NE8O1%MLuH7wGDIi@ z^CDuA_&CMDMqk?anvl&cx9f%};?r@WxvyH$JO$Y-g>qOqO!uMbCflLqLr|+%xMNFHi|{2ET2-HB_c}5Zx-FLtsGZAhY8zGS7nX3CA$Kcw67Yk0ns-)U4`v2v zL>m=V8_y<~s(}0iwT(7Q0IrpGl9ijOi)%sOXsFRe%&Kkgsx@kjo}-)j)~=PNE1)w* zrg9lGG%gwEaz@ueF&$NFscVqG$Fm}7F@iz0M%>u;9FCX3v)HUw>7wo_s>C!( z^u|K9DvGc+9)}{BggabKVbkl$kRhfz=GAI6{tLs#;G9f0Q-#dxpMBL18t@Kc^^UiZ zu7Hg$kylL|UyOJyO8E>3NUw1ZV#i?_fkRATI+0HMH+>Ee=Y%jJ_#Ry=>syRjW(pRu z`(e1JP-G!cyd?n%i)_A;$5IRkkP6lo(jVe`ex@LF+%E>IaLQCE9CYv0{&8l?q0D@R1d2VBI z@&Ie)5SFISG})o~aSXu^L8!@U3E6J{SFJ_V6Xn=3U~%j-+W7OZ%i93U)s!|l|4@hY ziZMNbJK5oS*Z%>30wPE@v$|ub7eQc;=euSdqDaqu9T_TRKTc~aUZ>{MB@c zHleh%`T?tE(P>@SRBkOH7(c0lvFMbLJ%dgmPwCC(<2V>=#l=3IS`3JHPjetlSjLQZ z!dzVEPqe)HDvflhT8l~p2gaj@VJ#G!DO5U3515Q3qp?m5(w#V#wWlS}EBa7{4Ue0B zQ;@}7Y#~pxz&YP=&3!2VA?6z_n8>HAH0KxunmLC_{Yv_TRU_?l2#JOYH)4?OOvVCn zN`u5rGaDp`&P+z;lqB&TUMDaA0xTKVpX~ZdtP{gnB0`2s*bPs`d~HaWcQA;!BV*Wv z{V1KNs;P4fYDWXq7wmgjMc^-s%s$VrP7lX-O;(iFhlme6!vzG(pvVRgZc1{gT&tS~ zyU5=73Yqcq8Y~n8Jk^9H*CRx@NWtv?P15FG5`WRgOq`Y8an{slODp;->2gR*EGnKK zxbqn~X@8Qm;@WuS8eTa=aQL$;s57iUQKkGLzO~A%UuD)+$@U(r#Obld|A~&6RZU79 z4N6pu>;v)|91=eb`{d~`91dE=l~xK0Ks8c$h`_?QF9IJ=6;PVC>N$!KEKfiYDbUin z*`#4w2Gev^VC)n10m6DxeE`K~J|tqV1VTkfCzt*H*=JXDRKaVJTj0LC z*y7~QVt|S&G!!p_=x=Z@(lAbO1?bhvWtj=ehTo76o{{aOG%J_5*GNJlUA3ApnHd9n zk~7owUOA%mY}`?#<6T+yBhKZ-USXU~h6ggmPeFRZl+`{&Z#`6xPPUVAf$6`wYFd!;sQ)T2UkN~xTN~I3B~Hx2VC~E6N0)f@fW8{mz@w)4j-`J?TbYR__tHr-cdHx%mt5YDRElOQM+h|agHDr-jBo@D#9o86 z)-{>oSk;+K1k`q|!z-8;Q0)P9tV55VD3XD^=c;BV#%{1{Lm}MZD0GsS8dqAo)4q;j z>UL|3o{5*b@leae>Kyx1%Cqk-EIKkwK@(v!U)4Fy{6?M@16)~0Q_uuh7P0iLi&w{F zTUQa}X%I~mZUQIDCU7D-#3OJ*v)5?!!`=Slx9AWJGYP96!Lj!od`ofDbh!zZTfXZF z_8|9y<+krZ9x@EHgb0?y4FBEqjd^_&;_#c0!zvQpmGnqe1L`rRV*&7cWtkK)h9X9R zP$@E;Fi`GIX6HzOat!;s5j7leQeK$-|t#EY>$OTU5G_M{owwz zF@(GO@`>bnH`ERKKFRYEU~gi6st~w`*wc8^|FLW-Z&=5HzS1MZ`c!}|0$&I7p#n)c zVcEh~)+F^$p#rP*>rz-voL-i&jcIS6s`WH@qiqn4hT~$OB$X%4r;p_9ouS6f!{kB` zBp3mh2W~it4TLQ97pIA#3oJf#)HO8nE<&L3!>lX`GCLHr~|RIH5hUnKpWcF1B(bfl)bzuKBIpveZ8kRItbo4jk!^ z&1OHX8VoCq6v-pxfzWEwkdl^&`h1+02nsSuGaZgT0#n&3B45Fn=yhlpi77FyaQo!Z z??k__xEaLWoVPo#B_)x;QOx*tjmnm$f=i8nwo=jvhfGPP^g?Z{*%aj5x1{#9qJ>7t=IReIyAfKMG3-i zsp@FJxCt75{4u}l%VW%cJR9?eXJh`^Gad7ff00F{vi>Hb+B|H7*}p8iq$&?`*v3Wt zA}W*3t=vcvP$fs{d?-!*#KI>NkqVgCQzsw61BN$u)F$F*lN=n}oz|Avec@)N#pH`| zH9}Buv80n&H_jo*hhJl5A+MM<+eE*sS`P8vAY|mR0jbvvwJVK+x6lqNdz%9^8?g>j zkNY91hbHWhUWq1Quoy6_$ArO%Otc-uii%gJ^$&N$W!X7Emw-OQ?s@_ZzmNfqFG5O! zQj@ixuzfOQ=CPdsVuJSg^BnG)gQFtF%tzqO4Y8)d!g~8u&t{Js`A&Aco#@#Q8tfR3 zn0UP=4F{i%KShU{dR#72B8&(LDkCH)CBjJOCq=w}$83^?pss2R4=IOD@-7r?KTM<^ z9LAxsM=e(RBnQi8Vy~dv@aW*Z$HWNPuRXoeXA{f zX{PzpUyNyfV4*#UhlyTD7T`3|2yB?Oz~LSjL1Ymj0uIu ztn3`Eqa2l{wh^}qEcngTTGQSslZBcb;iu4<<{=hScWm`e-f3e=)s#~#X%Z*8b9c~K zjU`25)^QxJf_(hR=9De?O7ch{zu3Z^d1K;&uyBs~=q>paC9Kt5P;=z1q2@r$;w~Z) z<4bCef=XMoQ*+9bvf?-fas&Pq{CE}|&f*(6@gq2#KD<6pu(&%{EHK27hi~H8t8x=y zJaK%uVS$3y`ZOd)82RHzhr4Z*a+l4d-gk6W*!nA*F5TgNS-M1gu=*6IBSq(48-fpP z!r7Wd{^CeaQNm6ayL;sNp@9^=`HI+IWLjf?M(-AaS9|M7u z4;lKQ`a`#D(Gg%t;_(7#4f=`44X~7-fsm6$mJPa+(G@?O7T8z;wVW}MGT_HX^5cP$ zNpGX}8K)0Ull{q;+P}2FHlxXAcT1H;7?VLFtgR{UIR0wBnQuLL8JS@^S4R>p;28U^ zVcHFtc*0`aq?0U7ajkKrP5KQ`YC=fmT%ggm)UrH`6osHK+{h9^!OYgIK_5@xf$=cr zg(pnLp*nI($~bL}GzXu^i?WNgYDEzwO1|V@fm$AsJ}G;c2y^(zJ-o1Sw2d6QhQ+Sg zgF9mgVzWxrFCAXJhf99Np4rQLZki4obKTIrt>NOLGAfUeVuLfE81%b%gAq%tpL94_ z5EeIfmMG|`fx#j1o*WwgI>tu^8TJkYXMb?+jsuqUF*3Px+I2B{IG@|FUT9rjwG220 zsv(X1i_DTWzAYJUSc(5pW}Aowx-B-PT;%mMjgTfBpV?3JjKCO~3Ml5k$X~i%Wce%_ z1cAv7D8)vGY3yplL*#)?9Sb$--NcMoO+&gwSt6hVymZoaUdUL1@>S^`Or#lu)oLv0 zbBmw0QF=+!VK$?ozGYOCXj)vH&Sc0>n8U9YhgF+Cnxh^&IyikZbl31}_OR0Pl&yUA z&1k?yO2$#bhEm!|u@zvjJcdLNsq?Y?VZw$bv0I;AW06pJmJwy2 zkK>kol`HuT}{ynlW!KtpT+yQd3rg0B5aB0xUAg%ksP>pGhp z9Ddv$h|4@l*(XpknI$UWU6=#H+)4}cN*-+-uVgZ|IN-cdKYG3ehk5|zgoWT;uCcA+ z2f0QbEjWMY3}QH)GYG~B+JT_?`2Th(!0;X`f^tkb{z;Tz9=eQ^A%%65{jdl!0#yxw z-h}uAo;dXhQo$`5yEqTs3?jvPvvw|MD#ZItZOzh6GF3vtOhk(%8^_L|lMV#x?i1L*HOZMJF2_Yt;M$F~S1*J;nCUWIoR+OCV3Ku(BIH@>geKO~jxeTwty$Hq4=f zdsF@23E#&B9$Ez|u;2>fZqMf4w5nm3X}G4;Mn6Ty)ZMUsh$*_nZ6qwezMK_JxEiRI z>!*(C2)xV`;{ZB8TudTPpa=(0L$N*S5M~hzf=fC0$An5m;fUwwU_uw9?XVsx7i8ro zv&Fi+%@H3oF-YIBNKAnLOqdJ}s5JnGO-6`xA*dl5b?JqD)rw$#ugr&pb4~y#!Evydk&X8V0?%+dpN!4zt*j7`_}*>5{0u z#Oe)lqel_X+#)v|Q>io*tH8zCiL!KmKdq(i(+x&jfeG}XJ5d&d)auAtH2jwitq?P@ z6hvL^iLxy95&6h-Uu$thAA{KzGl#lNXg4c8mtA4Hhg ztH2?BCH2G?RHim20mT4QS=6rJexvs_UM)Nae;#^L)q1t|HI5~)IxiuPmODu(v;k<- zWS-z?G6Ty7Os0}k>&l9w$*83YGlxWi%!xGuI>RDFrLD@60@WDILTfW^)T73QMK3${ z7kZ2M|A!0tvf>E*4g3cKsWzLDIC>H)SR|*S9kGRJX@d;vJ^tn_7Ym~Po%9Qfy=j9gEo#Y6QxlEzdtdaxdE<-F zWtg-iQY|=!**``MCs6XA#<-IB%`*oXQJTo^Pw0Om2K^8<(fii_rZJ-F6Tkt78~+H=A_5E+*fKC3luF{0645nGdm)?AET4hJKGYDasCj$+^ItUL-bx;+w#4N5cCy~Y3h;bJEh#{?aGO&2M6B^(o zuEn}=(J*#0hP$cZOfJlS(3%L5v^{_{${(q#5r3S4;7>-CcBHKFWjy~b>s z1T;w0!MQVIG6eZpKn8u}tJ5STf4sf^1o@<8x* z7cw%J-FQI`O_=BqAz>*c+?1mzp;mU=I|D?n!H7XUCy-fz>2irKgWbt)o78bypcsOv zf|+;AZ9GbHx|iw#$luM|McQZ_MavLbC-oq`9hffDYBCD4_rEm?k`fq%gg%%$f)NMl zegcOVa)0`&|o9k1C|VWyd%n|D$n+>=be zi=4-*Nn7Lrk@nisGU1Y^J^4;ULXDLtn0$R$KyaBoDalJH1Yrx!%HfOF4I8|H=1my6ToK)UP?kw$S4KF{a+ znwGkFzIWxxMO*#{7DRY+2xppm!UBt^5?i&A+SIK=@@&shC68Mu)u;@}6)^q9t3BnX ztd~`+;V|R(mTE=_n6%7aOizj8vetIstT8oIjr13lhq1Lg)E82|x{I)=B8Mr}qO?Vz zP(&BKGs$7W?U>gjT-d%^MGnb)0p%~GifAdxb7v%f{hk&B1(qZ^M5GpD2m_g`tOTZX zkcM(n+dG!UC^+XmKTX>^LC9gK7=H~*ZK^2T=bs}-2{Wd?ky2{hkzZRg>D|OczP!IH ziyg^2*;k#wITsmC97s43kM*ulr&f(@msZyk#=$}PS@k4OG$8hl6d-IEmrXgBR&=Md zIy7C8tn+&gzLz9xI~#-L&bttRdS{#rwPXz@E?p*~L6w`WV8gV61VqO~TP+T|CS z>w!ES^n8pdLI!doJE?Oq@EVrJL&E(gMS-+Jf_!0)nfNHHCK(Lb5%E$O&z(6^zif&X zh&24WfL#Fv1D!+lKW9pSJJ{aMk#bP?hxlFAD_8GPJ}eNbs0pE2f63s*6ET^JFtfkv z$F>x$qK;#%kQ6>VzEh5b{KkHwB%C6rhj3a`gc1FQRB6vm#ThIm=&&Ke`?N@HsE(DL z&4OW34(Csg44at3vfj9XUibV}Xn8pu(a4pwJVqRjBq=|5WHJ7I<;O&YVF97VdOw4M z3e8QE@qJ$3-$bQ!xoJL_V?XcM396K1Kt-l|2>ejEr}|=5 z1!3ocx>i^wCe%xl>@z;}p(hhK*5Us@RpF-OS2fKKdN_F^``W2=PR-^119ZriCme)-iSq z|BT(!pu92k?36Jm@y2Z#gHECMkoOm%_e$oc-TObyPa5eoANm4Q!@v#R=q1obbE?rz zS_%kEZlf8**&2jOAx(k8lWe}JCu`$Y{%(!fZ*PfxoQQoMt+wb$q!>MAyt+R>1HAgF ze12-~&tdd^#CkLq-ED~Vwl9aSzu-)I{$&C5SDz8kzbv}`GiTIw)-}^RyQ>l`uLswx zWvs8<%+l$Xqq<3_&(cd#?bj0)O_u(PaI|5>)0M`;T*3EPL{PnPLeA3ZBhD{y>XT~< zA7Selg@Q9-#KfeOFYy2di3E+lPr7f2VgJqm5 zgAyqkAYjG*8$Rha_~7gH@)Zvq3fBsb2O#%&T!wDt$`={=?Yb|zJ9zI}qq9X=87O^i(9aZCL#wlMgLgk&o zO`WKNl@~2I)3kNf@WDZ-CmX>j3)GX|Nxzaox?nnPKKIkb^Jk~m*VSOC2~v>t$$0$q;yUjxEYaPrO3yZoc%Z>X zk0X)>yPi2wbdc!@FiDiSrQC(Jln&5>9q|6ymElLeifkol;i%Y-5%EVAuWgyNAnNfw z8xEpH3Fiiy;n$03;UOgJmE>b-wQ%;K0z^zWcv!_G0)ZMd=tVbLGrMw|1LcP-Ax!{_ znn&Wld=HCd5HS9*w6z&_%q^%8DFV%iml0iRy4U$njnp_yaAL})ZN7d1Cum|naS$zxl zoH5yKUByZl`>=Etg%u&;8~ahwzg6D5z%fAj7|^T(1F3;Hh){lKnzLtl1IOQJe&-R2xf}tW2~DTOt@BD;Nk@# zfC3Ja0dP(g4;Vfal}3Eu151|x45GFj|Dy}HPL`TAg?#FmJ6!J#;ND=K`EFmj5WZaB z`8z_-U>u&SU6K~=*<3II!2`?=$EUifO%liD02LLCIf6yF+u#nyMCa;bRK*?Z#ycYj zB&xiaC#em-bVjfj*%MlfvZ>X&Z@1~u)gHpgq5J6m7 zG8`D_L{43g(~&P4|9s!3LEg4sdx#;gfVu`te& zBp6I?$DdUWeW7QB4Gb>I)@YUs+oa-s$Oj+!Sv+ecr5FHYh&K$gQ;zv5XZ-knAUW(5 z6?`Qq1J;w=>!u!)QUODF8LIc8i0pbzUNGAb=qh%nViUn=rWR+>>#-M8M(jP;vO zl|sf3q-=@3C+}xs=;6in*FveSPs^aQwqse^SiC$M-8yJbW=T};clvy|3?_6wIlRp$ z`_|WhsPsLd;&j1tMhyZ(`oY7O4vj#4Qt*d0+6gkex3+;Xp=`XKjeC5*$=c^=#&aRS4U zF2)_FzE{6v>)k*z+ZhgJP~zhHjj8|KUkcR)AfGaY$CG~7sm z0MjywrG+7b@KD+g{2)R!B1I@|XgaQ}E@0HP~x@gFACll<4br(0E+CnMI3 zF{TJxP$BNv%rSvPhy^>utZW1&@Uje-LxO4@v{K z%KceMr0uiCb6PTq2X77=78xhDjCZH7&+sBH>Xj*t>O*c=owh;=E4|Yk3xg@q;3J{n zsU~E~04G!u8tovfAI6WMZUD3cTahKq0IA;`(X|)UHnagKXY;& zs}6+A_9bWNd7a>&d3>vae>{Idk~6NShRBQv%r}awo?cvEaToI5^S$%<69j)+u- z7^ws*s+X)pl0+{vA`RA`M2bZ{fWQo-5jshiSlGyNRbB8-U|yGGUgYAK@0Uc@W`<`>eB&pJr>oxh!c*?>YepY=bqzy1gv1t4lO zBo5GJB5I5Ehhv9OMb!P%?l0{+&1OJ3bFzm3C_tT5T(#_>f-Ab*!(QKoPWOZ;8O;h~Mv8z(! zi>J1vWs#K4!wFblA$KEUqXmu7UX-#~BoWu;W3Y$V7wbuI^DHG$SF)$K&3V@fErc`R z^_%e&Ob_k{?XeUVW%Tcge!)`q!BTLP@*a}T*sXwKh&dsvu~I-7VZ%w-xp|o1oeU71 z32pIGio#{cMmzprxCKGz5;icFQ~&IfVFn2IhmhjiFbD)2fk;6I@e3lQR6tC^+?VbN z8C2I$x@QOwX%dzeCDJ8un1%HU4RG6t6!wTrMyZxa@%pOpFG{3Trpuc)(Ql;vAkqUZ zz#Jmu*l0-`^GJwa)3~aTJQS z&`>CNF{4lr6Amavx)wl!6H0|5$QXK~neYAf(E(u>kCr~s1;Ma=>;qPHyglj8MN+OY z3jAtPu8X8hTXefJO){0BoqfSGQ!IXwJoE2{J$8G2Lm_r{i7G)pMSP3Fm-R1iZ2??0 zDaLkP@ZG=t?dDNL*A<)4EQEps|M|{%mH*&0KX}3O;B#f&6=h1{F4$QfD)|b?l=a_R z%{X+lTEipQu2jecq*H!`z1>y+SqAS-qBdXOh0nc{^NP`1^5lJd6yn!ltH?`lit)eY zmJo5B=*NeM(_>JEgj}IdP~>*>mJ$N1A5Lc}mWIo@TE(i*diV6=7=3Rd!*6A{G*Y@6 z0P$@6zuH+Ek2S*qd~Kq~)vgYQ`)C9Y^n09k#n@v2{BNm>9xLN?J!a-EEDUO=$M8SH z00-0%=$V0mXgpC53p+M5UYIvK&%4Q7a z%=G`;#i#|SLQVPj?SppXy&_LnALaJ(_L9-owjrSOQadx2&ZPg+4MNM4JVgI?v$0AP zo{d0<0tvH51hU1(Ko;W0x}D|&Us3(D>^G?w$0S>bO?it*7R{sg7Z9;#X!0y9j(-Y` zi}fxsJMO~Ccc}gaK99(1;1M5UZAF$80XU3LqZ4GQbsL=OZK;PQRx3!&rIVOJW)@A2 z(ZmXqkMC7j1VNKu<(KS!(c(v)0@>8{$??LMM1=SyrpzhAL_fz1OJAGPz0qB|#7^ig zb2(o4ylR8gdf7j;7p5dHJwHQA^0Lj((6|vn;-)uEd=FAhLTm%ZfCEY-h{@>G`q7R; zF=HZu^`LAD0FYS$z=W^|H$wJtZ-xwRC=X0`5k*7q!%PwHB7-wel&81^&$C_HFyf|H zH9#Kya)TSK{jvcwva~oJZD5LIa?^>f)=2I>FU=Nw2-tw7l_OG^;pKv$_PPoBT3Yy4EBbmo43QOdpLZ2H*Zf7bjNk` z)w6DL7?@&|d~nvy+np5weOy1&xnJA+`L=vpKVho&b5yK!?xtiX-gGGfT>cr~77N(&T_s%YQW8f)o^8>-MCAQ6vk@Xmuf_Hm76YQVxi{_U`GxR1sao^-(= z%QqFPoDO&}zcsl6GvwBXlV_D7vyRZ{R9gNA3{EZ)pUWo**g;=BeH0O@K0B=w>Y+fX zXw}tNQEn^3g|t!JT1<%M-zbh16Kp#ayo0Um_obP4^`kE*7`Ecs?D4yWMgcVDp8odi zX<8g3n4b_s4dLWjb%j?v65X$_lAU~umFoGOGE{7$N+o>=#?+><;P7G7SVV1Qsx6jh zi?Etqr5~<@?NBpAZcu-kQLDT@pCKbFeNyUiSw>Mhb?mv+MX4h z4Lk2Woeet&o(VM`M zNEO-Q2?O3JUMP`62ph$Nd6@Bl=L=Qy0bWoBZ?2b8P{j2~g|BXWJCwu|j*up-3`znC zqM1?q)sl&zzmEODq^nO!|z;eJH=Ayf40c;o3rnCmoh(MqyEE zFyTI&8A^Z1V0h)Ck`NBVFWEH{sL-3gjx^)e)u9uhIqt&IG53~|m>{K+OZxy!>t z9BHn_K4#L{Jkh`CFec#j3)adqE6XzH|MUN0@vGf!<%nwHv@Td#Ss@|+;?i)q9RIC$ z{~?OyVQOEyTA>Q@@$&TGastmmMdFf?yjGWpdE>G;su9rGGgU8h8I0;BE;P2nr5M2o z^s3fu&1h=H>T2Y3G*DbUdb8t8V@d&b(5%7MT($*U^T!K4F zLl%sYnj!(4Rufw7p@qn*mh0@>Ruk2ELH?lPH0sDrVLv+Y68TWgy4CvFu-{OX0&#c< zLmMkgCP@YYIy&}7;X6Z*A!?mHRMFEmWHX0RXhPv*i0B&QOIjUCH({OggxzesI% z-MP(-Y9H$)e?uPmjjWI*$gsz7xm`C+!{Ev13wNRJx7$@JAOp7(KD#2ZPVT7G$m#(r z5CJ5+nL+}^5Hh(*iFJ@xW{Gw9krL~$;Lx|kQggT`BJZ7f7sOre%L0Z#m)tOsHHgKn zU?qtb&D}es+M3;eW$GW+_gN45 zaeV5ZGWGC|{^TNWh98e<|-^YQjl;*XE8$sk|7_?xa((!S3~WY;F27?AaSr&rS#Lc0V!R?SAUJ318;Z_ z{xRZO@W|A6zA=8JMTpxr z95(Wi`?kt7(4edxyanUbSa)2M9U|{FeWHlbLA)6K?NE(O8%c5lDvDi{Em4ns=GTA_ zpY@eaXiv(Vr?vUf#+vf9ce_&blXr-O5&lO+5JB$ist2|C7n+P28)VEtSe}*u3IRL* zYi}}swfEda%~iPW=oFDvS5nQ&m67r@I=u@iCz~+fHoF{6RhoWh|LQ!%U0WxJsos(D zb*yHK`6B-n)yf0L;i6hJsy zTR^{Qs^VU^3sB$I8qsn-#yC%hNxX9AtqoA4+SWXly(U=}jGzZ`_2zm5Ji-%z?%1IH41Z2^2RchJ zeT*h5@@saER&kE67Uk+-Ay;K3?efyS`X@K_2U)dNi{ooV$y^U`k5sEsZowJQXY})G2N=myn2JzV0)#u(#LxY6 z#zr>uB4(whYSrb9Cswb@8=vx}CM;Da>)yAWuy=!#^ltD)?%j?P_6}>+302d@r@nW; znPWErc5M9#r%@oBe+Eq)FrEk9a#;jObjj>c1Cv{ZS&v}&DDBL~gZ*J^Pi`5l?#V4v zG|>Z%TLvP>Y>>?D+RlTqtm<4!jkVeCcpiqzAQo0aFfv&vAE)mrHT$Xd-O^v=zW=Bs z6?#-sv7!H-iv0;>2{Y0|xWKbfu{)}>;C3aO^$l`-JS7|9q_uE*HgLpbT^TC&kFk(z z>1FSNmR@_6(uwC|cljlI%=T;~=`@d-$vOum8UreBVjJM&Ib%-G-u*a+-Fxi}3?4Jr zf7!}r@&p@2o$Ox`!(yf#Bb86YU5 z88B5D;!a=s(F{dcoiyJ4T+jiNg;2u6lEhm96Vn)iYs#dS1k5IvRGy|+8~fvB8FTTX zDhy`5TvDCLdiC_h}Hl+QzbH-jOG%$U)(IPUM zu#;zMHbSHcWYOZU7hcRcK9&XZzVxAYwpV~zL~p>W+mB^Q4hdC7&BTQ02U^TPAMRJgvS63 z53}Md_K+YNjz+I)m|l_{7|d}(fiYL7wXoW+(BNibfmAh#J#5_Vn$RhW5I9Tv!-mN* z(%|h$EO_E>nYHiBuv>rhrRdg8vGzAP5+I}TB6D!6i#~vdYl#*_p`XTjpLNcgW8x6) zxh3bbuiwf{{|-a@=j@2+hPo#`WZx0nR$^Hokm3kQrs|JcSmYkx$mctb%pUB%@o4?g zM{}HvbsT9!Ft(S) zDkya&A|q*ov!HySG(*@MKZzDG=m_*@O;2(9ER8PNnKEQz52gWv)6(lam|Tix=zkef zL2^whC#CQB#MO?ea7tgZ;Cv)su_mS!W@P<2D4I;hjrHq}#_`_(jQ*fGYLJD9<&FzrU*7L11|gj-h+UW zM*wDR=t7+%*fkH|pJXatr|?VMXOY9grMM)RpY0Yk2_zMexLl4A9iVQw1cbnm}sRO=uk$$<3Lg^J=yp}Va$j}=f*lNMVri)|@p^`O$d;$r`<>NBeF?b&*pJ`+2B-h*B*TNbgG`o!I?AY1MR=Y-xG6|7kg?cg*5CA&Eyuib5#H~b??MZ3)%};6WhNFDYWH2` zu3qom&g+9!3&m&da4c^Og9lHbE>;^l-K^a7!{-053_-ftT?+9<@L!rW0*>VKNTi3! zcL^;ZVi5pC0F?0gBYd;26%p_UWyDUYiK8~R1oB>8rHB|RnFYOsK0rl5hd-Dg-OJ9wr~7hWH$)woyl2 zz{kI5Zy=S$gwZy!6#;Mp8l6iMF7lSxvBXkJSxQnEVgo2FCHSO}!oOSP=msDwDFl0n zN@}2270EIL#H83HzJr^8%Fgcz$w);y*f6RI!}rgSU0d-sWMu!4z+{g_y+=pbGn(Yd zmNQV`4LJ*V$~u0oNOAxbC8UUnj9^c|a%lV?W6ClACfHRD!6^F05=>Ech;)*BT}A}j zQmPP(8T^DzIPMZ;8?pOqA*IFoAK}mZ9`7Vj6P#j>_|tDj-U^@?B8GS5Q%34MR{7|A zp`bK~;A6+7PlM|*3BfUG08}kbUY^?QV0b>|aeo&` z33Iu)XZQ;Ljr7EhF2a$hDuVXH{FTCyV%C%SD}^KV4u@mWe`6fJ`vO)H+5GtZ1>^~O zq@xWV&srg?gf&4~-QHhimflh&gLZ{{VV}KFIpz!vuYdDjRBOyfvI@iHLKMvw@{uft zpRhI-kQ4Xx|e^A3Co%C+#!9ZLuDUlU!0~3s$c-4cSil^>i1IAaTUx z9D7ow?8tj3NQ*9-E{Vc<9v*#jqvBp~<+~ zfk-zQutIQ90Gi6QoaFIozQsuSB(J~f$b?m+8WDlcCu%d_c7zo=)S>CH{&=49#V+1h zEgq$QS75Rnq;jlKi#Hyn^bnOuVMuf9Do>(ZR-bhvbNy&`gin$c;MoFSH%K16URHvLwSF{LmEY9$2+0I+O2gaG5n zu{NyK%h%}Hz31S{P1Ext{qz#ur)zxSg`82)b?Y^Rj(%eB8X$8sPS^$+*?IhR*skcf=RO=K)dy*Ls?0i^_tT!`Ll4n%u)oElw`jC>`YPKpxQoUX7}8XFR# zSCJ+v*#bj>lLzGKSlf%TT-;JE1nIOpevdQFrrjH>bWARY71G*88RqIEj9l!p{P%^V zO;M4{D$6LiFvBp?ZIsk2aaDEb*KoSS%~{&z>}6^+yf4)f=muh~PwXhkR{ z-WY~zwf^(>Y-KfR-jWdJvqV*tD3htrlS}H4-xu~QVKZH9L98wfxs{_5N(fsr7{$N9 zEbppvnnEQa#X-IA@cO98+y6317pm15x3E9Up%4>etb!8oB$Z_JVRbrAAOX98JLRP2 zs$f2I&po?hZAtOhIp8DhvGEZTgl-Z5b33+k03JIBIhU9NqtmMbx`jN`98fam0I3j= zTR!GMI0k`JFwH?en*+XyIf!pkWx#$ahg>{t#BUZu9%k)-!wCIl(Bhecjv?c5mlZMb zyg58sW~hq{lawHmDS36M4bHSA@{n`viZv6ifQl7}7>sG3FjOLBav%;!Z`c}OIqvi& z0qaN^3 zIEA$=cnsf@m*`ws)IP>t4Mc^a-n?pURrE{$fZ39agUgj`XMsc9L`UEj2=I|PjL2$W zEm>r#Fc&uYn^yfSDHQib@C0h!nSNOdP)*LVDqk%B$hwEGxh_27Se)o!|&ti zd(zXtn1A|#S47$WIsf$jyW{C+=AZsvdiu!x)B97spPqmEfjdoBTmL`lDP%MdO26X@ zRDUWxjP0zS=gA5X$Ev?Wlq>=zcLZCieYxy%1zLK#3lL*2T#f78ty$H%7=BtdxQztG z#)i2C2`)nokf2tfAVHa3wJg;X+t}c8kf7y*1dWYKB-paS!Hfi3HW=TutE}YEvcXtk zSFWbAKZ6~n12Q3ll^_u2d$?YV&3Al^wIT1r_x&3_3qi0^9-uV@$R^ql_3r}U5_Ru#+%p(*V( z88L-nBvD#sazO5NE!TUibtU)R)q0%x#V=CCkj`_+Yd1BFzsrK5m|UF|n^pcFj4)J? zWm9jJHz(%wtfDT)=`b88*@vNS0#LB}582Gonl5aVaO8yNv-1#=t$2DDR zAW%+nnplA~0zf8tir_$=Q}svwib<>Q{l)jdQTn!kXQt_!nR2GdlHM5bj;GN6lwICT z8BmUyOR;LeZf?G0FU}PiU_SEFEh#JL1PDaJ1jsJ=>w~(lb$Y_C6gz<*XPX;Mw$y!j z45IVYo(7NTkLIe!LBR1V76L6#3HiQ*?j&A=jT_|E$UpuOOay_wUIr6-A9knYaA|1@ zm;~Ft;`^PYWHb->P~D>{2SiY{2A{P3TuMm5A8T{S+kN!jgyCJ%x{i_cJ7kneU<^Ic z^AeUYG!qsq;s@eMua97i1WzBkE?pY{w@lDH3_`k++?-z3)3Sd3YqprmsFc-OUI>|6 zPrY)52msFdQYS(~u7M`V66v6L+LReU)7Ko0T#9uLp2s%7G#A>d+;SCNsM2CP8f`XR z%iu$LwtC2P@-VwT8uTl8&U^(Y$HtRYurgo4>G$B9=PNk<9ssK+2ZLwLS8)10Kw^Dz zJ@}6K3QoTVYx5PH{w#pp{UMxw53rQ>D>(fgoHAcL875++eR4gxZoY!khr!wN6`Vc{ zo;zQ`>GuHk^Wui*4&;or01GCL;sFw**|M%hCmQStbGJf{ zYj}TI(jfn&Ab85j1p3_M8PR{_-?_$5ZS0q&Zy(aG)a$te@5Pj+fs@0a-|Q7xo8Lis z08>aWExb=6A77gmp4w4~5w|{$O=vEw-=)XPKuN-AWgw)NB#|HkDU`J0*QFVVC zC!>=o|6~a`8I8|FktJ%5-sDYh25Q~B*~%gbeUotmDey4Hp?j#7cic=DZo8FX;zPJC zoN3&}^V=r*L9DdcM{NS)aNj6LEwnx0CekD|J!pcKzP^>{lYZifllIa5BZ52RQKvnD zd34c9if?l6%kibZF-njBcEGs6!__7NEad9Y9^)fK;WpTM^mW|RoD#c|EB6F3p)q?$ zY&HJXggIit2DNv{lduM&&==VtPQ4NsGrHwp7w2_ze)hhM$;S^kikpW~8CFn1R!GB( z>o%L7Hz|1!#x#c+6`Sc_g`*eBGBB}z&He9Ie25>OYPJnd|uR`O93X2D&F&Jj}Q7R0r5LkS^ zL&XxW%N1)Y(O-&I3pVke|1=T_F4;g?|F}KJr%N(-83<4DS`erd1>f;^_*{xnefzAC z@t~ZggBP@p$ir0f!Mp#CBp(Gvgrnx?$xk}C#?PK{d~5#%DzYp zkDBckC0@>(Ny(?6I796S$h#~f^Rd&%Av9hpE(Z?rhnW03@kw#Q@Z}hvxn7KhEEF`m zgng3B6>H0@gwOR{9Xs$N(YbKD0^Whv)5su1X_&2VhxKv_J@rJqYPez~-lu81Y5sDE;c$#>6rt*_!3ZrS_-vNEaH zGAhDbN7GD)AE3T+ZC$H*Z(`Q;ttUKv5T|dR=4s|tWS&;h?kCPuepqXK54G6uJgQ$k zLp77_S!_h^H{itomrL4Bt`26-cA=d5YY(q4=A6<}=;s2l@ip=ehML~u9wDTdC(Gm) z6dLM>7K+#35F9ei`m#)H8UBR>P0G!lqq~=Sq+q(flHe_dR;%Hz)>&PGLLXtUkp^4W z+i1dHjooxVoQVW+%uxrwc0nW;fi^_oK?$s7*FbePQjsEy?a!L)2VJy*p2BUdduCv?9w#Wa z)dBymmN+}4tp(_X3xFMOT0scq5Mf*HX?r;cNxz3qGaOq+zL4zJ!6&930oFP2Z%#?K z=z8L`^QT()&}r=swV?lrcQ>5e(PbQI0izMA@frkP$di2WH*u!H0cMtv&x`4j+u$-{ zQAM50vR!c8^A1tt?iXv-;dC@-7ypO6k7x>~RU8|>_!-$bJjeF5fP651kZM`(2rS}4 zDABwT+P=6f8efVu6GmuUoM%<%a6IP}clmByo$f0yH)Gi3f6ptHtt1qkg?)=o4h~BY z9-WRatTUU9mB5(xw35PF)8U8iE#x3|)1}f~^QXp8_HoIpvktMSM!I>RG8sA}#N*^F ztvQ|-22>rI?i{}Z?DIst*jK+XS@qYx$&SR(Vto&E5H!4tZNp|B9Wa8On!5NCB8o>T z5+s$g8#s=Ck2ZFW{}a^{xHdhPd22Ub(znu$k(^tg{4m{JpQT$huWu_n68@o-q?T8! zQ@lvj?@EgO`q21QpaBo`B0XYG+pLO=`;5qp`9IQ%!@68==Q2-F20(b)$4~xevHXt7;t35HU zs8(r1k_(^!Hi05+01B{afrdPigLW8oDXVbe87u??xXlpMl{S|}HE$10*VAVbKEJP< zoa^P;U=^3EKus>sg86XSgmQ2nb83d)UX)#m@D*sX(6;=%#1D{~EzfC8b#Wtw-b7HP zQ^N0eG`Hjb24ADhfhqmxmC%77P(;jM0I$1Uhm?9=YCx1k7y*6#vybyV?8YFv0Z3(a zzMzt=$7`5^!Mtp4HQf^VB0CcZ<7Q%(oO}kzgdooynJ(?AR+*9|rUbY*(>|=mG3}y` zhYn7LnST&XwCUC>JvV0_0hQRVu0gSl6^A$#azp{1IG|p8?=%9rS|)SP;+*Mce(c zu2xyBW`Q;$DC?TS;)yHi@c8(O_;OoC$c3>kj^9>BJO?vw2QJFKaWwuP#4~i2B_iH0 z1-gz>-s&F?FVP|j;xt3F=y)v0W4imkJOEQbWJ0^0(UMt}qZf|Ef}RY^9S6Hj&bRbF z*lJK-j{teR(Xn8YIX9CL$($GVR2fu=)F42&G2b--PB?`Pxm#Z^bPPFfppN}}hrRmy=d%ag8r8vtx zeO+-SZaW@TUNvRpyNK&uxv<bvjMIecmOE-@h}-Do(VH1SXoJBZ?7a&|-e(m&>EAEyiOtdne5!9%i%lwEis zUuUKJZAZNq^U@{ES*{GkQJsw_WPiz0PnOx(GzrRiZ2#h0~r;*c31ashDxRIBY>&s3ugrWo{#=rjE>>0GF)v7=ULdEuLdXtS`xrlnfy2S%dB5L;n@*7%IU~=u} zT{T@&7l%TTR(!x-z?>FAUw&vrb3351oCb8pcEH%h=h8zZmbJwYIkO4t7pr+#CWo%4 zSnk?^Fl6i~AZxvKCl@P)TA1 zL{X6ij$+!6Vb7$CY?T9kD-gsSu7aQCrO85-;mZD#H$< zW@$s6WcveY{xd|@(T9*%K2f=Kw! zU-Ib(czxo*VMYDfSs8cTnqA*hUbr=P{&ng0liY&G^~22|mKf^pF12rFWGwwCPK~M&vl10$1)ds6Yz>hH+%0c6X=mPjq z(uKvdT`|h~7C?>ix3<&-C}jv)?QWJb32p z!Ts@o#|^OP%4OO0v_-9yti&9_YBxmQ=K&@j5Z;+gCxukA3-|;|gcYO)$xud%`jcE) zEeTCJgyHdED8`?QGiCd$rGnHPt!|030l+684XZVnla^V zB!d1_FIQ{LIFz4RZ99dvsCN3Md{IP(RAIkOlM0D6vrAP#7(#W5bEY`oQxDkz;znje zMvTH?9(~8*4QbADk1F89cXa5Mdsv};yjPw?W&e;s++iQ^rP-f~_>DIq zcjtGD0oDLOt?&m@eI7boSVuF|9b6HB&hiq6i^iMDo@y-BlkA5B&nI#jpc(;!+|u1@ zZ>sLS+#+w<&hK0EM)tpxg@IpWl&;n{GS5ch*X#MUCw=iIZZAl;_i~FE0FgC>5mq(9 zLzHQY6te636uE+n$muhM5iBuKq2tyti3=`6X z*eo_-$?O(jnz2YFx$Fw;XvrRn+k`n!3)w&!G6k!#6J6hF$dH4&&#Lke>1o>Fus|I+ zl|hOc>heJHY@7qKM<4~bi=1*0s~V+Nr5uP2H3PiH8DiK^QJ2qqrM)YzibxRx5UjiS8Se;j)ik#~}O4Phb)1 z+WT28@ctQjHi7|#a5i)N)=*5;@N#fBjX=m#Htx<1jYZ{;(}uB47 zbZU^JYf)u|@s}2zc&~^mwn-t86=wE=%2x4C5WBd;S{fL32RI96721& z$i_fx&qhc|ENxkqwidGavMgF#_r$)b@D1t@Yj(gS@aK`1q;ZCXBUq!D9q0}(1V9w>LJ976pg(W;Yp?28 zaqu&5eds+OeeEB9`u3ZjyN3t)!5{j}$3OPbkGtkH#lqu5}fY+;w(P*!o zW2E>#4x$UQ%5?szY;RGN-b9$Q94c<;31 z{*J+rUuNVJ!(jMR(TR8JuBO!=dF&IfdfR<}^7ogz^kxVD@z!5@<qC*JqQSAFV^U-@PWOs(NBfAgMS|AUu5`1wDN)jK=**e$Pl z=d1qeci;E+n=R6IBs!^CWi*M8e(NKD`R>2`%pDQflpXxQZ+`Hx|Ne`wdF6kjj%;)` zCF+eBWqoIiw|Vx;uqedf9eLC=o7&XDZf31%Oicjl!}v?;h4DRQ`{3g~81x>Pv0|>o z%g8P<_uw`kEcHHlwGaArG-t8STDj8_Memc>`Jn7QxNCbI_xhmU(|2wEq)C!GYvq00 zOMGa1r61Y;z|6FaNpQ`;Z>g%A4ucy#-N&-Al+@{KobN@7(^NJ1?+p_IE7N z??*ZmtJjbFx7T4-#ng}0gqHBlaXDHS+h70kEf7_zjGyoLp}C*Oex&_5iZ5BD+LEt$ zP5UZ7e3*2?y?VCZKKJw3@3cRy2bRSDE>A7qe&4(MAKnJprF#A~yPygr447=W8Qblq zXe&s3(}j>WSty}HhGIxSp=3~mRoU3V1*8Sm=Fz8f;!)f9iD)<$8ja3K4zi{Cu{Ui2 z&)`l7gt3Dq?Ual{vDodcf8}k*6=Fq=#DDYLPLV+FXShzX5qFEkw3ja~iTSQK@OTBy ze!e&!M83GFIhIij#ICt^G7Q8Ch76e+VyPOfbYLBQ`qJX7Q#hvS^T<}K0HT#epi_a{ zenMm+Jm%@eGt>QnDWPna7MuR7^6A+e^hP!qfK}&{T~vVbc>|ZX{OA^oz>BKVvmnFz0WQrr@9W0N2Hfw9{zOM8!APe0_zxGOH>fhtqYiQiJ)6tQ(+dH>8Isq{ zsyYs2PrIaiKBY>XKY}UXRo_92f%nwAOPn@WTamUV(m^Km{uZmRPz(d zGVBn|659@{m!j{IlJ;gv{It%+i0aS%u+1|Kk&JJn_yL8Zz)j=`P2Dz>LEErQ8rHyVN#^ zS$8^sv)E<{%RmC*02tNy5WxL|!p$Hg=K7&Ggg3)5)$}9T_>jZ-B9Wu>wMzX6Ud#oQ zMAR7Qz2x)pbU+X*_k@GR14a1N8zMUcuZKz(T}XyI%QuG)y|PWG9|>*JP!7nwIlmRt${BCtn4a*g3nx zH_tqT@p7TQ6(szM64gUE*>Q|Yejm-fFltv0yq*X6%LOTRBj!GQ&HTO85Cp(oI~@K$ zeu>73>y!RKoGstNg>%)gyxxDqqzWXTOhC33nvG^I?wZj*y;4mMP0xV^h#uj0b|Fa3 zJCCy%E(Dfic>_c6(}0&TfS`{Azff@e{yc(UFcyjuAYb4vr>YR@quM{__k?&KBXV|n zc^1}sE}NKaxm=8@OlIz=Wd9Vc7zSfL6|_K?2EwmQJU#Z;#*}!t^Q$4AfyvWKBC4yW zRhYL9ePfp0b{BRHB>goK2k`$mI+0+pYJANejMO;&Z~@Teyt+W36_cDFc-)zXYa{L$ zyYezyo~!Y-N7o2!tJnsA0hgUHP&?qlTV24PG{Oo~K~|lwI~Bg+r$k`KN9T1Pu`c`3 zd9#n!4^tL`tj6R-%4!7ZHGZV=8d<92mr)K9cjK-Pj!1HPm@jtPpLG&s1b9dQfr}%C z$3-~t|7-Rfo)CNnz&dD!h`{J37XUZ@^&odJf7x|nHmmWW$$4BDJK9=g65-c4aa%tM z0Pa3S*}NhcvKjTBLzA!MK>}4X>aUDZDoN1!yBbY$XJwP~Bt? zm-Rlp_sl?dzMTlwNwG(4XEjX^dhjdMsXi$%rU# z6SWm7hYWd1BB0!YDUH+eEQbu=xD^Cr4;e>}VxUT?v~tRtN(*#nV?({91&M5JD@2wz z21%xnNsBD4*n=H77n2qVHf*sd_s!tHok&sWRN|ei@y%*W-B7%HBZ|%X;rDE53~-MD z6^)2Fs6YH#$Xkmm(WeU-0(tcDcYWrsX@a8-@TI+kz6}U_!0S3rH+efccG7X^>z)O;^#(FSh+=eov65%QSpU_AMmgOMaoma3>Pc!%d*4NDK6JJJy3rHnmOj8AwkwJsiKn#mG zu2n7(-ny0|<|2p-CJ5VBZ5dM#3WWHyr$Bx;%dN-L9ief=TDdnZlDj9d^6i50%kSYo ztkY~7%2SxUpGv(_iyJh8Xkch?&iVuHOR`5nz8`;mIB}#mR%(;mLB!zkWVyb{b*%ZM zBXP2R|MphP1DF%Zw)s%of9Z!mXzjxogqO>*;69Yho05>PQ@vc@tXS}FvN)N%>H-mW z{xi8TC;>A{NY6;^Nx}XNsEsNl*hIz0e`yGd);ti{i_1Q+m$66mwMpJkM!$>tV6Ll^ zEC7aNI-G_Pn!B+K}#vmBG$_& z9DBgb+5?iN5`WY70DUWZ;J3Zjk#A1idLs!m5C(+#5rG`GV=V&}yeRF6la@v8Jf20(FRgT^UiPQqmXr-J-MCnKo6OL!Fe2 zI8Ck*Z^JbO~4YSaLQA+RCU0XTTsuUNkP9h{jLusx}(m@LF_g zNTdy~MS%?$7}bU!C}Pyu;ah8az=@Z$X&ym_@)uvb=P2rt9w1N$=n$9icDB_?hr!$E z^D1x+9Z@t3V+Ie$#4yZNuAi!@ydnUOO7qJRiw*F=N0>_#f&o*4009!y6~`_#QkG2s zP1vkWRD&2h53tnuplK;wb}1mean&LCCubchQ{&D`gE4R-b+3s>cI?g00>w(r4}5a* zwQDfC@a}<}4FAr&WnlEOtRDuG%`VU)J4Txei>oj@1#H5&_Q;QJNg+MsS{5%c9bI3K zS)S_uNeL}UFQ~@`%DVHnlnwW+WUu(K)*5&sD;YL2)%&7Zub0CRiOoyz(m-jo|1a4W zaDJvWoMf4?*;L7`W#)8%_{j`-&XT# ztdEat)dBp}Y*X$wg~9X!L1IfWce|&g*mS~)+l4*2Tsid-*fA{*U&9QqfV^2vorc%& zayWspvGqfY<0m=+mB#di;bbWooa9!*aan!BsI8T$hy~ud(CzFb;tll3)LPx)`X$dn zvG&Co&Xo}@X`CtASb}BxN(RIHIf5&dm^uF|Wq`~&Lf!@GChM#=R(xEvptrgY- zm)!-5xt6;twg}*?PHDOU#Bdrh9|CHU0F~5b5Ls)5!-t?4&0Glvj+sLxh+#Heh3x6P zxeX$=o%;Fd3^(8aIGXkiY0JYDMGZn2!aY1a%a-Ufu$gAfq-51u&7`Q|p5>_2;p`GK z30xdwwV0C0VNY`vD~xVMheDPXC)ogB(|MD zzB&tEJfYj*PQlT$lnM|jtWbmKqe$pO5COCUdF69}=OsrbV}H@XtXd)}j0=!dkadoQ zV~C&KZ^o{~+x-S76l9y5pDt_c&(f4+8 zW=BbOkP*en58uDK(edo{1mzF{k!nN}QO2GrgbU`E^C zUGR253WtQZJ3aD{X)rS$}yNb z6X5nq{AsL^_k?fd_TwCCuG~F0R9axEZR7tZ?>)epT(*VbH$C(u5K3sF_ui2z7C@Sy zAkq>b6a|7INKrZ}iUKN%iUn*a0*Znts3PSDjoNcZtRa7V~@$HX%15ARv5Q zh4^{|*2%LIq8ak$RC$M}we*PaVEH6nU0pq0eO&`xLtP_XV_g$nQ(ZGXT|GTLeLVv` zLp>usV?7f+Q#~_%U41=$eSHIcLwzHCV|^2SQ++c7T?0J>eFFmnLjxlNV*?WdQv)+Y zT|+%XeM197Lqj7&V?z@|Q$sT&T_ZgseIo-SLn9+2Vx{LlYwtV-ph-Qxh{&T~j?%eNzKdLsKJDV^b4TQ&TfDK%yDQ z-V7vd2GGoaS5g!`lEDPU1OI~=A@tY?b{IV-VA{$I4~~yvv%;g;ArVYEJCMnYhzO5i z2PUu?F~M{;gB>2pU@>Btv8*5lBa$8-5wj*DI3X&A5y1#zGXqz_zflZkNNm*VC}vz# z1U--u5zS&oGg$0!M$BqPLJXVE3ZSz>W4M;paj+GJC}sdiE-CCf=&!OnCltN)CrG_j)>7_#pECeP!t3~!w3ix1Yhuh z_yM2+AOWDJ?f)QE^oR&%5SK1)TZ96tAV?88Mb{P#1W5uKz-N{&EU@GLhv>TW2f6?m z5Mi1Y9`NM_zz2W|j5&3xK7kWjfg*706ZQw@AFR$GCJS^Q(Dc!4mQExym|LAt49FjD zXE6M^Z4A={w=oR=ATfX1wh;RFwuSrKOrH|~cDNr3{SVN!=MQuN68^Mp;V}XmUS2zT zYz!lq8kk@XxBCJNfm^pEV4o?EFtCdNfXl>JwB2V;c%KYfnf+nfP2RSt32}GYUf>+K&QJ~M{lpx(qN4(EW zSE|o(RHo0x#<193hTi8fvWmXUmD#uKz$N-}sEzK)xL526b<24{y~Qgk`sG%>8|d?C zAENtGp<&+p@00cB1jX>dekZV8p`?*AK)^)c@CYOy4?+v17YnZ6tVN-bJP0i62_OJai-S`{;<3C)gs!X}T9+4% zQs&_YLLd?g^bW#AU`+8yDpXq7*R*ycLjU z4S7JFp^=CH6cP=p1#tj@!jrjmJJk+?I26VX0jdb@4k$DzoFH;J9xkL9T+>tjps&0I z6l1|x5)K8CS8?lz0so>A7>Eaf97FJehXZ*ae>4KD&9L0I!y-}Ipa~!xs3wHFC?E}_ zk%$G!gH{0j56%byqGzn#f+pfB7sy&osxONrvz_maCm4qn;OE5jS2>lrvsy6 zBLe{v5Cf?ZKzd{V8#M$(0}+6H8OmT&VflSdte8kJ@BYhJam?5VFmExai3}D#v5akl)ci5d13htXy1k4<0(h!)I$ZR$_5H#+Fu|qwV+5BI3p-o?a=X6{jy7 z^^!Ji&N+w{5G0b+^bE}xE^=^maSdi{*}5(F{I%;h8e2Pj&(}yw;qbhCB4Wm7<|j^e zJ?1gV+kOJaJI^X4Ja-3?8Bjm`VP)XwpB#^6`wF#nR8*HAC@Ma3wB$s2?WG%7K7O*a zx%I-O$4hSCDZ)umFZAmVuY-YiBC$| zaNZ@#}_IMSZSibpI>ezW0 zUhGmV0z*Jy_`LB*=|CBKJa6i8fBA)cyjTHYb1W}bL`oAamU_`5*n{7mhj-CJNqfA9 zfCG*<^}M_wFLn{HG-|Pf2}%&;YKG%YGnT;3LrE`32O=)+ioHp3BZ;GR?P4WHSe#(Q`$%|Hkt zjTJ=W)3$C#uf_iO%?ZtmMrIHfI9aAPSYQ$8 zmhnVv#s39>+uEmEx1&rw9-P`GwE~6p19vBZ?41iz6gZ z6r3bN3MmV8hiRa+__PtaXg#Dpq6B>sS&BY||Bn2DnLtjWI6UR?3EA5Y>w2xo-kK-% zOi*Zv(~qCpI@Z2^0sWcVa<=a{Sy@|mv$5sY^MRKf2+bV;Cg$@j9UT2Kb3kBKZC&H7 zyKMt6q1oXv4;~->!Hmr9g$G*hwh0i`%;zn1@bdBX2P@)j+fM?Nn=L&9FGmE33mt+P zshMXlU8#T6Ir1@ML-x_*SL$yzwRJzS-*fp+aR66brMCz ze0;xro#doOu6f=gC>zC;k`72pt~l*ncS%%CMt0F+7guYYiSfIk?NC6jKohY-{N`wBr2uLqdX-XY zGba5Eih@m_KzZXtdBl0(Znp{y5en8Dr-50-s|o&;Is&D~r-`Ou`B154AV^0q^)ucA zC4{m9;)Vt$okJAI>kze2azb)Ksaw(M`$YN3S@{?pFjXQ2#d%V%$g}xVJ1A)cOllv` zr-LXHo-|*P)C>63XXJS(UaTp85uP8*=959KM0@k3W{6Aiit;$2Q@3DG9px88>lLHZ zx|MPK7)0ODk&|+xd127A{(B@8Gz^$=Su#ZK=D*vgMv$ zE4)|wJoWPrpiN~H8Wz54bwp$oGkOgR>}0Hsi%&>gw>~NPS4RIsHdt!o8X&L&3C4D7 z37D%1GwV7eyzv2Vf7rId{y+e-{m8YzF;Bog!14~Z4B|uR5ity3d0$`OK;IDGC|{N@ z`+v*2?Z16nU@`gkeSzOZrztrJmY|qGvRTdG3P%ijBxtCacKZhjhIi+{mR%5w$=zB3 z8){%%kgNSb?nY;82DRD>?|Y*)cH!6bESe2msz^kpuAG*KejtiAjhIWJUmLVq(EwaS#h^ zHS3BKphQ5+NdU044I5ZpJZzdlm~C$*;5XHXe~{Kc-K*;bdBgjLGyAaez&_KzL3f7~ z0l@tmHh2K=exee9x$%_21Cn!q`f@>dq^bb;2TSqijZbGWqUcjQp(i8=Py(RA7680+ zJBOAau$p4(uo$7>5CGmT2b-wjQNfIOZEh3AXooYk^uXytP>5-eaiCG4k&#J=4xFDB zmow;V>1pd~n;A}RzQXH0kf9E2!^Wz4Jic3AAH*Zz`KMj z1$mZ&LLdu_4}~BW7$FM3dPlOH4VaJpmDRN@HP+8F*R;^K(y>+v2HWQU++o3=b%&3D z=DEE=70^A?8{jgj1JD5Qp{{-oWq)I}g6TE_-aZ92n=MIz=pe5h0ANo0e>7WARn^u} zlYIPG3ck9&+#S~61*17s|J{c#e^#HiQoq-yCMd^DeS!mANE-lLpL59i8!M9)w3Y$$ zL*4G?14#0C;EppU$sq zI=_C9m+U{5->>?%mzk>X5ReyKzjMm>cXzwlsC zWmDCIm{Boo>O88drW!c*rBXGhcCk@0^biJ>5zl6@qNw2gT1b>CRm+M>wWM;F0&G?+ zV;yxJm6~Ku)s07j`h{mi7{C$2EC4I_G!Q=3gaI});WP2U8l&qPm^A}t0^r18J8WkB z;0d)ERBRo9dH|yUt^*hW0Gp@a+X>+9wEGVD_5pYRU=YAp0Jc{fKsITJTfqJtKqG)} z0ASM&z5@Wh00>y=Vs5UfrfOxOtZt+IYe_h@*5gK>WnQ|#sRuwGfObU0+DO33U|M0b z4sN+WGz#nw3fy)bP;yV5x^M4qMuJ?ixGz!U*UxiBY}zin?1;f1CqLeI4kYY;$P*?X z5ubQW(@yGbzcJ;MUDQU&k#TzFNZ5<4>Te?Q#w$!6Mw_aPx4o|}`r1fXrLgU)p!@Mn zUiPOi?fcY8$#U%sIc9s|P>D&;macOf`!P)y# z<9REsJ9|vzHt&A8XwjIU*!LLw+Y4U>3>KZTyMND*Me^GykZ55Ua?G&o{(0Ay4C%^) zo%ulpGE4mw=I`Jy-Y<4-Ny4-Ap5*Q%*Fr(wsu!fNGM~VEdxF(>zw{R)P|ajKM*7oA zde09pSbCOZb52YAq_XQ>cjp}|R+Z$O*xTSGYeyGKOx9s{t*? z-Rp!~D{j~{i02)Dv)Ae2Tfr6~i%-V;?h2>!60etgBvjf;(A=(kIU^g2XCt$pYF!Im zeD3(9|4Iq>A~hrC8AZd5hZ^2aF0mJRA~Brz$y++_U`p6#Mu!<8KeGl|;q%B*c@fM)k;qlc>Y_<@bpZlTrI=OFUflI*Ec?KAd+IE~uo1F5DoVo-K8(xc(bU zs7!@&ag|9qqC-^1WiPFP<$1A>wp>&3?gG*-(S|!H8Lu&;yLG~mFU+M+odSQvT)a$O zqf2M)7S}*A&&`HRWbdWA<-(&kqWG&xn@_y2Y`@*KlXVZOU~FQFSXrQmUC57 z;&JhVM~}QCTf6V{c^)$m6*8=%c8$?@YI_IB0;^4=AG{UsnJ;Zcv&g>yhPox z)Wu=qW2T2pGIe!E#N!8Rg39~*#AIb`iFb&H%2hW?9kNHGMuUS2CHbC+U-4Ld<|X!k zQLglBvgl#*;#Q%}qi?C8gNWJQnzDu@_&V@U-dc zBi+4i5+{w<&x;gRzCX^|y16RnY_8zPaSgKU1zYXhBRF-I>T$l$O_!dDf8TfIn5$Xc zwT&_zzSx2R;V)lxc_bSA_jl@!eD6?vDElp7B~B#lr9;9tWu2akwGy;feHa3DX;c%h zd;QBce-X-tw0r!i-5)Vb!M&M}mk`DthNX)@H(WagUVJVZBT+Qs-Xlu)hCe3ONPRu` z^@+%(n_CcBBE#kE9cOO(j-MuI@;nba{(il~vNx&BeAROl#fJkP7rbtn6PE9*UrY5R zXRMXBqb1A>j47?)_@{~z4_6%%4j**Pr>wHAtE{B!8KNNz<~y{j zjy>?ST)xMV^M-h&2sPi?HtV9-uDVfz{wb-~uaIG#cg*MsaX%Yud_IUSb4OAW*3bvF z##_SfkiAJ8-45){sSZ1~-e)bF?CB$Y|F~nH)pqLA3G&S^&lao~6O=tn;n+Br+*)9= zqq4n);Jftdo=r&y*P>>~q2g zVzVehnXzBD>R90iH*Js=^DkP*GTt7*tGoyM?vRN@&w#{kpKmr2k1`iwMp86IoZc)x zb-EGiBbZ?BZQZLtSp3X-q0`aOyMv04sut(om%vuuKG5;ny-T*{+4V!L6C$Q6yh|1i zKS_|#Ob(Z5*huj1I!QeIB0w#7k*-j#@fu2^a9v57)VbPYt4F)K{8h+0CwINu_d+#r z>E_(>-X-q{VzD23znTgj7!q_ky{}AIGC|#&vQw+;j0dYjso(P?S$p|nd!Z`{+n!!~ zUX!+P8F76bUw88ETyp;Yf~{@%TFC;P4iOIVc--1EJsqq_ZPA3S&+RxROUJj5o{b;7 ze1(`(K5>82TBkD5b)vhTut!#XWP+E+N&FYMQ! zNcbw-p*UJZt=9`N{w~@u(X>M%UfP#Jxvg@+|HmmrYecLFZD9Sn3LcN0;w_g#50Cf} z_7>&eJTw2T%x8AK^{PP~O5dxsXcgq38c41AUNQyT!!CdzRn=jgI~NQq_+rdrtBm4NmCVpEWQ4<0cbhVLh3? zv5clgj*&l~uEaKOpRXcL(LiAjMS1Cpoj!Q4q|jYB@A*B8)+8m0lDMAK@f~kuY+jb= zT1-mY*Cecbk$Iv{99p{ZYKz{I2REB4(hqpF2;ZqXa%cW)qC3xVv3t!MPRJh3ld?j} zJz?W6^w^jm^pJ29aBM|Xk-uVS5}`i^=8Kf@;&}?yo_{krm+1a8!-&xNjQ_;;`MNpY z7u0KZnthNEUcyTiL~gU{8z25QpI$E_WPwk$Dzsz_Hm&$xNZCsm&=i1zzcoi4Ey_4tGAnj>p$=-pQ2Iw`ll+WeCi?yNr%`0 z2ZP%NmzSPj#NhBR7JcaF7M0tPd#l7Bv-EcKeWFLpxfe^kBo;iLh;k_(%#b>1{w19! zVKJ(&KCQq(!u)CS<;e8nGs+kK+V48798mH}-(Agkm5qpKrz&k*B@1 zU)`=7Pxck7KH2o>((&x>wB>Dm4+v*Sn}iFRWT)#_jQ23#wEeNk$XS914zq=Ofr%rnHQI`M4A1YKj|e zwmy-&`TD!IP9&uQhq0CBaf^?W%H@4@DF7+g`1- z;`{>9o5Pp+yeX4|Jiu$%hS9}h8_$Ss z9({a3>0Ix!)!7G}6Aq4&*zR8fnQ!lGieIR+UbVno#_xoGdc8c~gT__$EgMPm#Ro1f z3A-(6A#^B z%e(Ox?k@cHS5u6c3caN5!9&_JU7svU^C~HEy*+Ruq5;|vOetc(o zlCQbjt3OUXQ?7J%iH^=Fk!ZM7pftyDkj!(3bT;{|tKg;e!7KPDeI zx-FX_CUMCN&rel-m`KbwUr)05^jXtep!fFUi(e(}cI|%h^YitQUdwaQeN6$PC?ZL; zz|VLkrFBd>&FmEsJtQ@v_|r2l@3}mmQSK3`_IEF~O6&GKKE5RVu%Gp7(Qbtd%S!K* zzPE?(x>V{fBl(({>Qpzhh9%rf8gR+>tM@bN@W?L-c4MK|ib-X^VpOWfpIrOy z{PCQ&8>H_GI+@j_%0eH7vpbW{;$#9>_0+4&yIZT+G0TEgvEnXSDSNYAo-kzhf7)x5s%d|TA_-aF36!y=FK?gz*T z@mZ42bSoJ6q!X?Uy6p{Ha*FPDP93{JV-+RzqK!!HVR;uD-{q@UU6LbvOcBbI^X5ft)eS;?(-z$@b z4~>3Agc+NAXTIHjl*}icE%8OA@S^{Z-tbFoH=>1DN2346{_n{;gPVf3C5!H@Yz2 zoA7Mc`D^d0{q4pCUZ&oBuS#)z?vL>De`$2%sB|bg`@P7cN^wM4a?Oo!>16kI{1t-y z`IUtU1xm$2I=VIIN?Iss{$vMwS&j4K6{Fu8WTVK1OBUeL6dF6rd&hPfy;3A$=-u=9u$L`xSE zTl&!DgT2_|t9!f}N+ym9=83(!wZ!>;DzrGE@ZBx9V~h@p zw`)a;br}d--}5@K?*Uc(?r}xMghgLYFiOfC$!nd3la87fha?*LN{+`pG{EcKZ(?rhz9_Pq=bcRBTD78Wf)DENSL73Vo|FY2@tO}gh+W`F zCvT!iyij;k-GjJOM567j)H5SjR7+)Tce)$x9Q&$VCFeV#e|i4#>hc$q({<4f{7LGP zLveN+Zg{<3_bG52&a$A6ylLDBy((c-OHMT}Hn=B{xTfI}mXLcab|5RRBZ6^HQpM=j z>f^_1zP^62t*Gpc;!83zjRC_#LY~_y?+_Ueko4f7BOK9lm7DEd*GnyZTIlR1 z^;*A2HRmDraf_&6lEa#q7u4Ld)ULG{k$I%`+Cu3YFonr)?s$Kk=b<5e>&h|2L6g(1 z!<~yi>pWd9R=g+EaLM=zp8B$g>sv)nk-(p49tJzB;H{5sJ=Y=v_FB0X3CQ+2Y(d({ zLbk(PTb3|nJIS@J5{GQJeE^}T)Jz%3_5jz~P6FZOTx({h7-V~yYh~P#hHP)cRx~xB z2xRz_Yad!`52C!|+7IVbK%5`29b@xyzb=TBJpw!OWNus%g=`DC4nyU!)l!gcDeS=GJzO%mvQ;<_xi(*{<6n6F_M&Sq#jm;n;b8=wKV~Hszl%<go&dp)fET%4z#s7RkRj4j+br++KCX zqtXB&p52@dLPC;kF&) zR<&-;L0`L(n$;lw(J^drakoID!LoP9uu@R!M(@n$M^7~S6jhy5$pq@4hnPyDckkD- znv09{UXmfz{?>}Zv`yi;=C|<4{*sV)q_s1m@^kUt;N+Wvl0=)+_PIs2&(`o>op`qP zKAlW>LOF-uu}n}vH))s1;#$g^<`L$?C!baER#DF)BB}_AKi;*9lJpI>+-VWX+SDiV z-fSp&|L)29cQ!vIR=t*>7%DDplat|m-Fd>&tzXZLU>m7qSNd{t>;lPoV5L>C$d2aW z2O@`(4MM$W2R=F{Nt{o7gYRDC57|auKt~lnl|8$4$3pve=0)}kMjHkOUJF0h`Rci{ z#G!d5`OK)a|A2VMkE(aNMBl_p%KqqMvC^^(>5n_FY)N=mkw*{N6wVT^4}NbN^}e8_ z`}4TEkj95iL7tAFKz_NRIg2tO0FEf@3{DfnPA-nDez&zk!OCTo1`TY zoA0Sz7F*Yn#J_wj|8?-8J?4wpWzz2t+*MgFF+n^ObZFpIb2ce#VZ)lzfb|_4Et;Nn z)M|@0bm$B2ij&-Wg3oN%*6{CAW{o|nm({m>Ih5Ev`jpSvtu3a2~bSAC?Tk=Q=BwH%5-_so&6Fvyhm2>r*dtg=vd^ijK+?r2;ZFN#}8P z)W&rj{~seuKm4Q^R$LAh!x)waNFFfWNq$baCQ)wdhfUjK61V{UZ6BGePZQtqd2w;_ z&BW!H^9Ub`tcB~7Z?_ehbrH+26Z_%`Dtrng6KL4+O_REzr$m9s$emLi3sO%$8%Qv^ zcB#q|6^&SWf@FjV@7t<1MGYl55n`jb#=HgpE5Ytk=ZHr=#+`xiGqQwiNQtZL`Reaw5K23MU#HMy8T7-rPBIa zGVu>i4NBhiBiK+ZP8V#m64nTAjV8{I6=|pP6;9|1b{Sbt-X`zZA%T8<2Vr@c=#p{U z(nhlINABTDs@x*cR>J*5%6MY>cLToXVJADEOyoB%)^#K+j6*r(>pSnbTbf_+zOyPghdyg8A^FCrW|ui#A&pQKf|fvX@Aeqfe%6x5<=qd z2JbP)Ti$0^HjJrR5rkz1>5Z*%7O#i>3}ULBMfSX;eXqH)EBnYQBPdUfE-@)H{*9r% zF3RcVeCTudMcIIJg>{^t{5M_e)KX3R9|)TirI%V;xSdx}H!N!GZWdo)udvH?$-t2^ zLtFcJ;tv@O0prWW(^0S9URBk4`^Hx|HZMc7VMK+6Xc*e%77 zEFZ%PkGrwbf3C1g!jr56#m_Z+nYXj;zwv_pe5c@<~ghcPhMixnY+_A7wUCm*S)2a2&iVJ`` z`LCk$V`F@-$aXxTX)VWy?5WOd41o?O9Kh%(cCoA?=B=Ojk*zXLI_o%t z!!P|Hm2>7FUWy6J{_y4$uL_90IugLMy62hLV1jOnP`2kWl0}c7fxPyiPm+}?o3zVZ#Q407u9l83`Ve^FqpG==ymY9i+y!3Wt&jYW z1>Tu!jYxHqPqMyj z)Jz<&yg~Nq(8><#@XghglUd*f>xPOsjXOCagrVd{FN zoXFG*EnF0TPNX3DYW7dfL-$`!*vwzy*()LAx}sBh{gET54~D6IHPR%!3exx@1}iZT|bWJW`H%*Yuf? zxmfte!}PUw@3)NP4vy=Q84}{=TNIY%pD2G9Lyu2hc|}$x*m!r9@8)+gLl%6w-#Q+U zCa%}@ojWy{C(nQP?D^YSViQ&B-9@|Qj5Ko70tPs%q-82sW+_e@BG!$csT=MIBr*Kf zl$KkjUwdqFVAY#~AENbD0%VCh{d(;i7GPc`)k=NMQ!UrIswI2)fuq9doXlRqJ=siEFbZpSc=PicOh#zDkBCYAJJ(YgE@d^Y~rb_4k@g_toZ+?!W3!yjgNq>*>w$ zMw{1$VjGJJAD>?;Yvy5c;ai>pQhM0}ggt5JIaI!UOrg1_94UMkqPrum2yOP(b$-jK zlcLwZr{&$=)w~e*>cx&a(PdJ#7E8Mi`5nlM?DSDjf=&DXG{p;Aut z#jwmxhkhl>ksOwmflR5S^Kt{psB*6nrM;m)d)ys~#p=-EmOYUX%#^er1%vy^4o0cG zKPR&mFX^FwPm)7Ry2#~i^gC3|pR18{X*j>1P^@M+WQcpw##+07wYs?^nb*)(9@+9F zLnuE3Ta6E-Y`hw_yx1@N>}Cs+;+lm?gp!elQl4s*Y+0*l|A4wvGAHJYJ^FEUA4tg@6iZh;BXTAo^;4*8T-=sUkPNd~!<0J}o@tQF@)M ztR}IxN~c#E{~&$SP`+UyGe)+hUAm0)@_OYm;xp))(h1?83zWRPo*O-V4c8t-^ZjwLWOGL`Qv6Q~CNiYTNo^a~L3eoh^;BAW4YWELr zIPSGu>VxF=H~wA5#Fcg#!p&cvt%)TXA6uJ~xl30hSUi!v{O)~nhKtDAm$eoWNeB1b zdy}?Ul2qxG+xGdUj$ja{LBEop==n@G2F0qWyEm^sCgqtcx$NPfYo^OF^+w*)Zaoi= zP~HxVRFamKbk~JM?%-n_Cn(EA`gy%Z(JUAY{Q0;TO$1vC`yj? zOW^|dF`AIPY#qMk0rRsgy$8<~2 zW$lzM@>IPj#qzos7V7U9ZM2?bAHfBfj|Fo-Zl366f0Iba+qk&NKsdig3Tw zp5S}@(G1RlpSndSbesf8S1w}+x2>!_=UF!In0F{oR9g!tk|NlqvBfDdjQNuIReeM9Vogc(1~TcynCgdgomgdm@2_$TUs3or?@f4AY01;o zU0`nXwvFKOmec7dvyCt3p5D&6=&NsMs&`{h1)bTdKOR~eW;HwwZ@L0Ut;>B zl5aKP*4q!FyV@4l9QDU09=y9j7Wo@fB z;|X?7A$w}5Kf5DL)vq_6;uTrelal;WwT_t8_&Mf+r+|cdr|ff?Q8iKZZy)nQ%G_iV zUp;UfHR*Py%qyT=UA;qCqBl!=4c=LYp9V| z^u2vPHjb{Pq|W_sD$!-MTFzruyVQ$iVgd^o&oQ0fPNd}Jq6Z|^rL!D4r9m4DTU=`& zr$;R{C#g%<@A?^vy!1jfPvO?fW>NNlcHIvI>XeiLyUap%om7j<#4^jizBeBaHNV|3 zdYicJutn)s?|qEnrrMBDT^mtKYwN=gA0W=_gm9ZQi+0Hof6lM*iWYsQunnFE{8CzU#=v`)cq+Y(b4| z^DnUw`L<4Nx4~LITqHU|&-mUFi7(yf)?M|uYoCQ_x}0(Iplo-ToAZj#saml?`#o9n zt_u?~j?$v^`r_T!+r4w)trGv=@-R(T8)&Ec{oa1;v`1;W6~U2v|eSj1T;mi)WSEm;k#efVql_f2-{1j!ztpwcg zt}1+GoJNP+pGM=}DF+|;(HD(2t%!_9o4Qa=qlHA#Xh6SM2>4}#t^g3YuYhPYSS+10rAm5QydtD^eFIf0O)#)fuAMJ`bIFB(Nv&; zBM@c_e-?qJNrS^dg992scMfC3Fk--ahBdL_EJiTMXAyvzXG4pD-5!7g0C3{beiY_; zXmB3GwScG0-)4Nuj)9@dRDGFWp$Vi7K0o8ZoWs~PN=S%2_A3Ou9& z;s7<2#f*&(81K@?LZ>oAsIz{v6m$F9?=J4VuQ{zw38>?YW3qy&v}TYWEIG}T z>rZfIy&}RxxLQErXI<141nxsF?mI7luL<1n;G^w-E!0ZHYfmn$3 zo>E6R8xqXmzNY(akaBaLgAGK1IduG&(4>DE>POoL`eg-x>j0hrfTa)kY#x^IV9*CN zxdDg*Z~@Q`pKH$meC8ei;5G<@`z$?%D|W#noja8U0)7(72xP_wg6Dv%xw07e0dsUL zgDa6u%VXfR9|P$1fOTq331%TtK<)^ z0n+!>H#b*OveeM9RIt{vnr8tF zhy!Bj=vb<&TPB0Lm^(N8hkf+lPRJwh`~&iY+v{(5!26fHgXS~EJNAOchIz-Y31_y) zvglEv3@TU~0TpV2uwu0-4=_b=pKyX@6};GjMN3$2iH(}&v*48?Jlk?PPE1625Cfi8 zV4Oe5@Ngr~&IPbS2O7!jOM`Rh_-_!* z|H0h;@<}rUx%>V8sCfX?&D_<&9KJM{KWb7z{R{zI_)gA37K_Q6eat)CkN#p>o>A%d z$LX4@Q5v4dqnRMe%xpea1%xul3%+9me`lZ*{0->|02F=#WCI`sz+cO8f0*h2r1J-c zM*+ppvul=_>1=lSnE>RGxl2#LSmEN>iV^{QF1N z`w-+9@H=n$)k2KO@E|65<_A{bz00ya*7vP7;#2!{F0f{Cl{5G=)}6nJxWC;kaS zBv7IaD@cq1Yd2Vq2%Z`BfXmZBi~V}o4X?oF^!ERkQvZ>^1p;B8s|dk{Mu1j;^kGF1 za9^2m!|$r+y48T&a89`TAKb7K3DY^@Fh79R-^`>Z5BMjzJ-5FBEGbfXfl&RQmgwKk z5LEi_tw>9r+8Lq#fgy9{V<0M9fVt0#Mg^3i97`8+h48jbVgFf=vo4Jp{~^RPIjIRLj!f zkwXKr5sd~o2fSkat7-DTVS0kL2mL-Xgn;&%nKeU!Jq*AfX3f82WOMrgyzEg8CO}>w zk9p{+zVaV7?jJcw2oNB-tE)Va58OxL^1;%-?E44DU+9!Y^071$Pb%0W(Mh zm==K0`@6t9CG5^fy8lwbh5tgr)RG@o{SXXB^V)D0*lCRTgRuKI*8!N4xm5t=GYDKM zC?71>V6Hdg9-MYVbG0-9-9?aX+8w|MVNKb8VL&3l{6!$}hHOXR6fVt)F@^H4aNrdG zO*n++6A~7alvPmC(la!*ut6^5ChGt>Lv#PQ3U;pJ-`JNfTjBesQFtKROKqSKst8(e z$f_uo>e~4AshL?@^YZuXFT!XXg>ycR!JL>v*2h$ULc{UJPJ;lUUW`{{&Ej{Hh-^p_Rb$}nTx zywA+Ze|S2^M=n_qUVuoJkd{+Y*U>XJx0;WHH(ViT3FP`4#s60=;JMQOH!5ZvpamY@ z=e9s#a9Bh%TXk(>a{9(CIXiamJ9zk43!IvY&uxLM2XG5i0*Wxz7cb8w1in)(a2gJ- zLrgb83zu}TTE5ZLcE1Daf^I$QdwJ*eOe3_=OM;XN0w z{u_MM&p)OFyC(spAh{v%b_~}5*CyN_(g(EtTYNYzPW^cp6X3%J_Ta$QtK2ZIlf%)0 zXjh^A5HtbYAgp)V8+@$clTA1uoGzGkIk?%7>$5gs`EZCc!8tUmesOSa7;2hsYekS6 z&~(m?h2W+Hwph3^Q7~l?G%|&z0C+lRib+o2p>Ymp;-&&*1D!!ZC;~Uwnu{Yeg`YZ` z(XV!z@@fP1_+biv^iV?TnKll}t#=cgUL>5GKdff7w;o_kyod9HfG4t-8y|MV`5~d9 zCd&@-CO`^zUkv=gpDFwYo6L~@S3%7TPvMW&&qF|M9B6WQ3V-yFSue;B3B8-bzush- z23-a9+S>!_cY*__uL2T<`nc{7u$zX0u+RwX=5SOXo9I*!{^^Pn8JtMv^I|5R5(bWCut-Vg#R3#!OslfT;=eC8ifr8nn|zYD~EHMgP{h1 zs)y5`>2BOEC<{EmKrea?2E%8>bZ5bVkq%Q1O`&qE15!Anup6MFIH;nADbz_$&s0B_ zwSfbH;pU8kQX$CNBJgS-2W2zmS5M`J07CvxObSTH8UiJU>bcP;ruy_u`mi608vy@U z!$1Fb>BAVa1_cWL78L&NuOux~EV;qlU)Yf{9ec_fIJgACV`w@6e5|c!?f)Ks5SoO? z%kTJeN9t@^f1l;on1<6l#BI4>eoY(%sMS;efGz+%i0QJy=Rv9P=JB+9nxH?$w+8sK zARb`DJpyy$=ju*%r{B^5`2mCB{(>LS;D8~*`EX-d!|4D6vvF=$1l||sG&={T7ns=+ zOyPt0LRVq`-|%PJD`lD{(BbnxfHp^@g2sm}97HdS1PJeyKhvQQ z=LOd`2cJ8rW~<@PQ~9^PkZr|BP!CvSD#!{{&sEq(%KWKg?KZ&~?X{aG07&nBaEP8R zm#$RsM_hnq8j0)0k?rRopg%(_`UDV*{w1NZ@%-F^P7h}e2c`zpaLTlSbNE+9k)5vi zIryn_@nPIvkj5m+O7_=iOX>Y(=X~wuW-!MG^hwwY&KtJ%g5OEbZ}_j~#OC}vd~Wh{ zf2KR!bjhse2K|*C$31OR0qp!wV#oqo!E&7&k^-fIuQk`s{ejDn%7G{PSpz0ZuCaa# zC;=g|zy*5hl;=qO)OY3=9*X}OzYg?A9EdfAA@u(hcdfBe6;b%E)h-ltQBa9!ZsRL$ z)-7dAZHb2Ks);6=_`}4Xl0Fuw^kugN3CO+3qXl^sG*yvcjglCD86{v$q#HF+|HwZz zLg*&`fM~RY7`M0!)Gw06So!ikPhyo?#S2KfS70pT> zTh9i7@GNUwSsMiht1@_f6%0M}SxGzmD}%~rj3MNScW`yWva(VK_X|m@*5z2xHmmUM z)}~FHU{8{po#IcBRn!}v!eJ?&%sQZ~S*eXP;#E_LM8}}zDt^qhCP&ppcg4xeis*7m zf-@y;@R=*bJN`^-iV#2Hm=;#X8l->Vyb|ABz(9RFw3BOsU=TxvsfS5vUE<*4=JR>} zGk0_uX(4?aLOHyu0Ctf0Oi^+XKLKG%9YfPYy`q9XD|<(RPQy!iIcU0A{ax4?VWDbl z0b(QyakdtzXGV<6+*o{-JXaj%MbvUDF`NhF9nRZr=E3e{KE+rOBhKAn9x)7zmjqOi zIr3D|j~1T`cAZt(V=AX|i!`S6aU!{5pI3@^E)p}gPsS0(9ulr7Cb~5tE%g)&3+S6R zJRxfWy(YavtW6R=Kqr~u=g2li2>(yi9KuOY!CM{HP;Pf>g>XV2>V*E;}#Wg z9C(7$su%IPt>6RXMv85MaIc?c90jN?%h@=?QrE})@-TnR=a2r9OA+M38pUHAA$+ai zjTahM`U&w=f!{u@`1&2`98AZ;16&99Q%q&_jEW+y;uR@FS)mtZO)vqZG%^b;g%}}PkFZGVX+|cnN(PiS&0v}phfSKw5TFGk_r`o z@Xw0?szggWN6a$8z}v1Uv+(W8|s;QzFf>TLlH@ja37*CJJ;3?UZ5hEgI?` z;g}Pso8#I)ac~HwbJz{Pi3Bv|QD*Tq@hL{;Q5UYJ5x&HLN0a?-7`z=|DD)XQsJC3p z{DJ861bnBh+~+W>9LvH>ifOTB#Fb`oZZbolZ0DcIFDu(<&qCVdF4T`J2?yQ6_$(iV zmd-F8_tR{GU{mS1V;Vqj0)(Aqr1N)|B8_{Y6p1^wUo{tlRaF?|&>kT57_qIyS4?S* zZ1(-xVj6;={a%#c;cEz!FvE0Gp=Tt_u@di*$y5uVG}8|kK!bkFgFrtlvdo*Q0#_h{ zI&(q`b2~i@Nq0_g)Xo%OMx*<{Ia`<cYOX0KafDeS zJ%S3>1$i!yoA&Ta9N5uoKvhZF_8fSt#3*xaa+SJp(kwsO?^yh&1H5=}JOUrVoVh@Q zLu8=CKYSf|Hz0-9mpr<@#2?J%XamQAHxTEm3wqFaA z6PX324*;hhgC;w0wf(nyg)BUkU_QhwWVer8%2sXtY2^KpZ1!1|Q;}amkohLck4|xb z1p$79nv~{Eo1V5pXv?b}P`!gtzxc2W++n669$+ht(pnBd=C|R%@2gk)C-%agEbdxf zEPHNJi)9CMe~;egyLXZ2TFnZ zK@6r1O8Ev*wpKW%=LyPM4V?{U81Z$${?~1J4)+bVWw4K5fId8S>Hp~Cp?%Zq#Y4Af zm(;60nQH6n=;enlHMQJP)Sl#iBkqZKpc=atsvqr0;Tyd58^LS(?M1|cY0j{i_xS#K z;=Me?H-laRZ2@fsapyLsw$`?i^mda6ELW04pdFx{pqD|rK)XSEKzl*MpuW4XFgT3i z9qO?9XJd~~`#>AMvIx!Pb{~AulWdQ*uCKU`mKd})1S zvMt`awANY^(WelvSeb0Wo~&f5G8(~FAAWckTh-aqiW3r}^KrZ|oI-Cec5KB~_V#m6 zWOPpJK#0P5o{5{M-km^$r!gsr=nF|1Ne+;ZA<4s@=ur_ B9)SP= literal 0 HcmV?d00001 diff --git a/cli/wasm/rust/windmill_parser_wasm_bg.wasm.d.ts b/cli/wasm/rust/windmill_parser_wasm_bg.wasm.d.ts new file mode 100644 index 0000000000..154edfa723 --- /dev/null +++ b/cli/wasm/rust/windmill_parser_wasm_bg.wasm.d.ts @@ -0,0 +1,9 @@ +/* tslint:disable */ +/* eslint-disable */ +export const memory: WebAssembly.Memory; +export const parse_rust: (a: number, b: number) => [number, number]; +export const __wbindgen_export_0: WebAssembly.Table; +export const __wbindgen_malloc: (a: number, b: number) => number; +export const __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; +export const __wbindgen_free: (a: number, b: number, c: number) => void; +export const __wbindgen_start: () => void; diff --git a/cli/wasm/ts/windmill_parser_wasm.d.ts b/cli/wasm/ts/windmill_parser_wasm.d.ts new file mode 100644 index 0000000000..040155c057 --- /dev/null +++ b/cli/wasm/ts/windmill_parser_wasm.d.ts @@ -0,0 +1,5 @@ +/* tslint:disable */ +/* eslint-disable */ +export function parse_deno(code: string, main_override?: string | null, skip_params?: boolean | null): string; +export function parse_outputs(code: string): string; +export function parse_ts_imports(code: string): string; diff --git a/cli/wasm/ts/windmill_parser_wasm.js b/cli/wasm/ts/windmill_parser_wasm.js new file mode 100644 index 0000000000..a4999eac0a --- /dev/null +++ b/cli/wasm/ts/windmill_parser_wasm.js @@ -0,0 +1,429 @@ + + +function addToExternrefTable0(obj) { + const idx = wasm.__externref_table_alloc(); + wasm.__wbindgen_export_2.set(idx, obj); + return idx; +} + +function handleError(f, args) { + try { + return f.apply(this, args); + } catch (e) { + const idx = addToExternrefTable0(e); + wasm.__wbindgen_exn_store(idx); + } +} + +const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } ); + +if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; + +let cachedUint8ArrayMemory0 = null; + +function getUint8ArrayMemory0() { + if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { + cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8ArrayMemory0; +} + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); +} + +function isLikeNone(x) { + return x === undefined || x === null; +} + +let cachedDataViewMemory0 = null; + +function getDataViewMemory0() { + if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) { + cachedDataViewMemory0 = new DataView(wasm.memory.buffer); + } + return cachedDataViewMemory0; +} + +function debugString(val) { + // primitive types + const type = typeof val; + if (type == 'number' || type == 'boolean' || val == null) { + return `${val}`; + } + if (type == 'string') { + return `"${val}"`; + } + if (type == 'symbol') { + const description = val.description; + if (description == null) { + return 'Symbol'; + } else { + return `Symbol(${description})`; + } + } + if (type == 'function') { + const name = val.name; + if (typeof name == 'string' && name.length > 0) { + return `Function(${name})`; + } else { + return 'Function'; + } + } + // objects + if (Array.isArray(val)) { + const length = val.length; + let debug = '['; + if (length > 0) { + debug += debugString(val[0]); + } + for(let i = 1; i < length; i++) { + debug += ', ' + debugString(val[i]); + } + debug += ']'; + return debug; + } + // Test for built-in + const builtInMatches = /\[object ([^\]]+)\]/.exec(toString.call(val)); + let className; + if (builtInMatches && builtInMatches.length > 1) { + className = builtInMatches[1]; + } else { + // Failed to match the standard '[object ClassName]' + return toString.call(val); + } + if (className == 'Object') { + // we're a user defined class or Object + // JSON.stringify avoids problems with cycles, and is generally much + // easier than looping through ownProperties of `val`. + try { + return 'Object(' + JSON.stringify(val) + ')'; + } catch (_) { + return 'Object'; + } + } + // errors + if (val instanceof Error) { + return `${val.name}: ${val.message}\n${val.stack}`; + } + // TODO we could test for more things here, like `Set`s and `Map`s. + return className; +} + +let WASM_VECTOR_LEN = 0; + +const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } ); + +const encodeString = function (arg, view) { + return cachedTextEncoder.encodeInto(arg, view); +}; + +function passStringToWasm0(arg, malloc, realloc) { + + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8ArrayMemory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7F) break; + mem[ptr + offset] = code; + } + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; + const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len); + const ret = encodeString(arg, view); + + offset += ret.written; + ptr = realloc(ptr, len, offset, 1) >>> 0; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} +/** + * @param {string} code + * @param {string | null} [main_override] + * @param {boolean | null} [skip_params] + * @returns {string} + */ +export function parse_deno(code, main_override, skip_params) { + let deferred3_0; + let deferred3_1; + try { + const ptr0 = passStringToWasm0(code, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + var ptr1 = isLikeNone(main_override) ? 0 : passStringToWasm0(main_override, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + var len1 = WASM_VECTOR_LEN; + const ret = wasm.parse_deno(ptr0, len0, ptr1, len1, isLikeNone(skip_params) ? 0xFFFFFF : skip_params ? 1 : 0); + deferred3_0 = ret[0]; + deferred3_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred3_0, deferred3_1, 1); + } +} + +/** + * @param {string} code + * @returns {string} + */ +export function parse_outputs(code) { + let deferred2_0; + let deferred2_1; + try { + const ptr0 = passStringToWasm0(code, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.parse_outputs(ptr0, len0); + deferred2_0 = ret[0]; + deferred2_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); + } +} + +/** + * @param {string} code + * @returns {string} + */ +export function parse_ts_imports(code) { + let deferred2_0; + let deferred2_1; + try { + const ptr0 = passStringToWasm0(code, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.parse_ts_imports(ptr0, len0); + deferred2_0 = ret[0]; + deferred2_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); + } +} + +const imports = { + __wbindgen_placeholder__: { + __wbg_buffer_609cc3eee51ed158: function(arg0) { + const ret = arg0.buffer; + return ret; + }, + __wbg_call_672a4d21634d4a24: function() { return handleError(function (arg0, arg1) { + const ret = arg0.call(arg1); + return ret; + }, arguments) }, + __wbg_done_769e5ede4b31c67b: function(arg0) { + const ret = arg0.done; + return ret; + }, + __wbg_entries_3265d4158b33e5dc: function(arg0) { + const ret = Object.entries(arg0); + return ret; + }, + __wbg_eval_58d0b9f11db87ad1: function(arg0, arg1) { + const ret = eval(getStringFromWasm0(arg0, arg1)); + return ret; + }, + __wbg_get_67b2ba62fc30de12: function() { return handleError(function (arg0, arg1) { + const ret = Reflect.get(arg0, arg1); + return ret; + }, arguments) }, + __wbg_get_b9b93047fe3cf45b: function(arg0, arg1) { + const ret = arg0[arg1 >>> 0]; + return ret; + }, + __wbg_instanceof_ArrayBuffer_e14585432e3737fc: function(arg0) { + let result; + try { + result = arg0 instanceof ArrayBuffer; + } catch (_) { + result = false; + } + const ret = result; + return ret; + }, + __wbg_instanceof_Map_f3469ce2244d2430: function(arg0) { + let result; + try { + result = arg0 instanceof Map; + } catch (_) { + result = false; + } + const ret = result; + return ret; + }, + __wbg_instanceof_Uint8Array_17156bcf118086a9: function(arg0) { + let result; + try { + result = arg0 instanceof Uint8Array; + } catch (_) { + result = false; + } + const ret = result; + return ret; + }, + __wbg_isArray_a1eab7e0d067391b: function(arg0) { + const ret = Array.isArray(arg0); + return ret; + }, + __wbg_isSafeInteger_343e2beeeece1bb0: function(arg0) { + const ret = Number.isSafeInteger(arg0); + return ret; + }, + __wbg_iterator_9a24c88df860dc65: function() { + const ret = Symbol.iterator; + return ret; + }, + __wbg_length_a446193dc22c12f8: function(arg0) { + const ret = arg0.length; + return ret; + }, + __wbg_length_e2d2a49132c1b256: function(arg0) { + const ret = arg0.length; + return ret; + }, + __wbg_new_a12002a7f91c75be: function(arg0) { + const ret = new Uint8Array(arg0); + return ret; + }, + __wbg_next_25feadfc0913fea9: function(arg0) { + const ret = arg0.next; + return ret; + }, + __wbg_next_6574e1a8a62d1055: function() { return handleError(function (arg0) { + const ret = arg0.next(); + return ret; + }, arguments) }, + __wbg_set_65595bdd868b3009: function(arg0, arg1, arg2) { + arg0.set(arg1, arg2 >>> 0); + }, + __wbg_value_cd1ffa7b1ab794f1: function(arg0) { + const ret = arg0.value; + return ret; + }, + __wbindgen_bigint_from_i64: function(arg0) { + const ret = arg0; + return ret; + }, + __wbindgen_bigint_from_u64: function(arg0) { + const ret = BigInt.asUintN(64, arg0); + return ret; + }, + __wbindgen_bigint_get_as_i64: function(arg0, arg1) { + const v = arg1; + const ret = typeof(v) === 'bigint' ? v : undefined; + getDataViewMemory0().setBigInt64(arg0 + 8 * 1, isLikeNone(ret) ? BigInt(0) : ret, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, !isLikeNone(ret), true); + }, + __wbindgen_boolean_get: function(arg0) { + const v = arg0; + const ret = typeof(v) === 'boolean' ? (v ? 1 : 0) : 2; + return ret; + }, + __wbindgen_debug_string: function(arg0, arg1) { + const ret = debugString(arg1); + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }, + __wbindgen_error_new: function(arg0, arg1) { + const ret = new Error(getStringFromWasm0(arg0, arg1)); + return ret; + }, + __wbindgen_in: function(arg0, arg1) { + const ret = arg0 in arg1; + return ret; + }, + __wbindgen_init_externref_table: function() { + const table = wasm.__wbindgen_export_2; + const offset = table.grow(4); + table.set(0, undefined); + table.set(offset + 0, undefined); + table.set(offset + 1, null); + table.set(offset + 2, true); + table.set(offset + 3, false); + ; + }, + __wbindgen_is_bigint: function(arg0) { + const ret = typeof(arg0) === 'bigint'; + return ret; + }, + __wbindgen_is_function: function(arg0) { + const ret = typeof(arg0) === 'function'; + return ret; + }, + __wbindgen_is_object: function(arg0) { + const val = arg0; + const ret = typeof(val) === 'object' && val !== null; + return ret; + }, + __wbindgen_jsval_eq: function(arg0, arg1) { + const ret = arg0 === arg1; + return ret; + }, + __wbindgen_jsval_loose_eq: function(arg0, arg1) { + const ret = arg0 == arg1; + return ret; + }, + __wbindgen_memory: function() { + const ret = wasm.memory; + return ret; + }, + __wbindgen_number_get: function(arg0, arg1) { + const obj = arg1; + const ret = typeof(obj) === 'number' ? obj : undefined; + getDataViewMemory0().setFloat64(arg0 + 8 * 1, isLikeNone(ret) ? 0 : ret, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, !isLikeNone(ret), true); + }, + __wbindgen_string_get: function(arg0, arg1) { + const obj = arg1; + const ret = typeof(obj) === 'string' ? obj : undefined; + var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + var len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }, + __wbindgen_throw: function(arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)); + }, + }, + +}; + +const wasm_url = new URL('windmill_parser_wasm_bg.wasm', import.meta.url); +let wasmCode = ''; +switch (wasm_url.protocol) { + case 'file:': + wasmCode = await Deno.readFile(wasm_url); + break + case 'https:': + case 'http:': + wasmCode = await (await fetch(wasm_url)).arrayBuffer(); + break + default: + throw new Error(`Unsupported protocol: ${wasm_url.protocol}`); +} + +const wasmInstance = (await WebAssembly.instantiate(wasmCode, imports)).instance; +const wasm = wasmInstance.exports; +export const __wasm = wasm; + +wasm.__wbindgen_start(); + diff --git a/cli/wasm/ts/windmill_parser_wasm_bg.wasm b/cli/wasm/ts/windmill_parser_wasm_bg.wasm new file mode 100644 index 0000000000000000000000000000000000000000..92a2ea9771ebdb8015b410d6fd52eaf69f615a16 GIT binary patch literal 1846386 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%0Dg9`Y) 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�@l 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

F6*oFMbu*)HXY^x_^*j@bl{~_CcORfNxQ`mJo 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 z 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ⅅ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 QM%3~N`wnXr>;|O&1 [number, number]; +export const parse_outputs: (a: number, b: number) => [number, number]; +export const parse_ts_imports: (a: number, b: number) => [number, number]; +export const __wbindgen_exn_store: (a: number) => void; +export const __externref_table_alloc: () => number; +export const __wbindgen_export_2: WebAssembly.Table; +export const __wbindgen_malloc: (a: number, b: number) => number; +export const __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; +export const __wbindgen_free: (a: number, b: number, c: number) => void; +export const __wbindgen_start: () => void; diff --git a/cli/wasm/windmill_parser_wasm.generated.d.ts b/cli/wasm/windmill_parser_wasm.generated.d.ts deleted file mode 100644 index ac139dee65..0000000000 --- a/cli/wasm/windmill_parser_wasm.generated.d.ts +++ /dev/null @@ -1,146 +0,0 @@ -// deno-lint-ignore-file -// deno-fmt-ignore-file - -export interface InstantiateResult { - instance: WebAssembly.Instance; - exports: { - parse_deno: typeof parse_deno; - parse_outputs: typeof parse_outputs; - parse_ts_imports: typeof parse_ts_imports; - parse_bash: typeof parse_bash; - parse_powershell: typeof parse_powershell; - parse_go: typeof parse_go; - parse_python: typeof parse_python; - parse_sql: typeof parse_sql; - parse_mysql: typeof parse_mysql; - parse_oracledb: typeof parse_oracledb; - parse_bigquery: typeof parse_bigquery; - parse_snowflake: typeof parse_snowflake; - parse_mssql: typeof parse_mssql; - parse_db_resource: typeof parse_db_resource; - parse_graphql: typeof parse_graphql; - parse_php: typeof parse_php; - parse_rust: typeof parse_rust; - parse_ansible: typeof parse_ansible; - parse_csharp: typeof parse_csharp - }; -} - -/** Gets if the Wasm module has been instantiated. */ -export function isInstantiated(): boolean; - -/** Options for instantiating a Wasm instance. */ -export interface InstantiateOptions { - /** Optional url to the Wasm file to instantiate. */ - url?: URL; - /** Callback to decompress the raw Wasm file bytes before instantiating. */ - decompress?: (bytes: Uint8Array) => Uint8Array; -} - -/** Instantiates an instance of the Wasm module returning its functions. -* @remarks It is safe to call this multiple times and once successfully -* loaded it will always return a reference to the same object. */ -export function instantiate(opts?: InstantiateOptions): Promise; - -/** Instantiates an instance of the Wasm module along with its exports. - * @remarks It is safe to call this multiple times and once successfully - * loaded it will always return a reference to the same object. */ -export function instantiateWithInstance(opts?: InstantiateOptions): Promise; - -/** -* @param {string} code -* @param {string | undefined} [main_override] -* @returns {string} -*/ -export function parse_deno(code: string, main_override?: string): string; -/** -* @param {string} code -* @returns {string} -*/ -export function parse_outputs(code: string): string; -/** -* @param {string} code -* @returns {string} -*/ -export function parse_ts_imports(code: string): string; -/** -* @param {string} code -* @returns {string} -*/ -export function parse_bash(code: string): string; -/** -* @param {string} code -* @returns {string} -*/ -export function parse_powershell(code: string): string; -/** -* @param {string} code -* @returns {string} -*/ -export function parse_go(code: string): string; -/** -* @param {string} code -* @param {string | undefined} [main_override] -* @returns {string} -*/ -export function parse_python(code: string, main_override?: string): string; -/** -* @param {string} code -* @returns {string} -*/ -export function parse_sql(code: string): string; -/** -* @param {string} code -* @returns {string} -*/ -export function parse_mysql(code: string): string; -/** -* @param {string} code -* @returns {string} -*/ -export function parse_oracledb(code: string): string; -/** -* @param {string} code -* @returns {string} -*/ -export function parse_bigquery(code: string): string; -/** -* @param {string} code -* @returns {string} -*/ -export function parse_snowflake(code: string): string; -/** -* @param {string} code -* @returns {string} -*/ -export function parse_mssql(code: string): string; -/** -* @param {string} code -* @returns {string | undefined} -*/ -export function parse_db_resource(code: string): string | undefined; -/** -* @param {string} code -* @returns {string} -*/ -export function parse_graphql(code: string): string; -/** -* @param {string} code -* @returns {string} -*/ -export function parse_php(code: string): string; -/** -* @param {string} code -* @returns {string} -*/ -export function parse_rust(code: string): string; -/** -* @param {string} code -* @returns {string} -*/ -export function parse_ansible(code: string): string; -/** -* @param {string} code -* @returns {string} -*/ -export function parse_csharp(code: string): string; diff --git a/cli/wasm/windmill_parser_wasm.generated.js b/cli/wasm/windmill_parser_wasm.generated.js deleted file mode 100644 index 81ae826164..0000000000 --- a/cli/wasm/windmill_parser_wasm.generated.js +++ /dev/null @@ -1,1268 +0,0 @@ -// @generated file from wasmbuild -- do not edit -// @ts-nocheck: generated -// deno-lint-ignore-file -// deno-fmt-ignore-file -/// - -// source-hash: f0b1d0be016a3874b6824c3458a87cf04fc171fd -let wasm; - -const heap = new Array(128).fill(undefined); - -heap.push(undefined, null, true, false); - -function getObject(idx) { - return heap[idx]; -} - -let heap_next = heap.length; - -function dropObject(idx) { - if (idx < 132) return; - heap[idx] = heap_next; - heap_next = idx; -} - -function takeObject(idx) { - const ret = getObject(idx); - dropObject(idx); - return ret; -} - -function addHeapObject(obj) { - if (heap_next === heap.length) heap.push(heap.length + 1); - const idx = heap_next; - heap_next = heap[idx]; - - heap[idx] = obj; - return idx; -} - -const cachedTextDecoder = typeof TextDecoder !== "undefined" - ? new TextDecoder("utf-8", { ignoreBOM: true, fatal: true }) - : { - decode: () => { - throw Error("TextDecoder not available"); - }, - }; - -if (typeof TextDecoder !== "undefined") cachedTextDecoder.decode(); - -let cachedUint8Memory0 = null; - -function getUint8Memory0() { - if (cachedUint8Memory0 === null || cachedUint8Memory0.byteLength === 0) { - cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer); - } - return cachedUint8Memory0; -} - -function getStringFromWasm0(ptr, len) { - ptr = ptr >>> 0; - return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); -} - -function isLikeNone(x) { - return x === undefined || x === null; -} - -let cachedFloat64Memory0 = null; - -function getFloat64Memory0() { - if (cachedFloat64Memory0 === null || cachedFloat64Memory0.byteLength === 0) { - cachedFloat64Memory0 = new Float64Array(wasm.memory.buffer); - } - return cachedFloat64Memory0; -} - -let cachedInt32Memory0 = null; - -function getInt32Memory0() { - if (cachedInt32Memory0 === null || cachedInt32Memory0.byteLength === 0) { - cachedInt32Memory0 = new Int32Array(wasm.memory.buffer); - } - return cachedInt32Memory0; -} - -let WASM_VECTOR_LEN = 0; - -const cachedTextEncoder = typeof TextEncoder !== "undefined" - ? new TextEncoder("utf-8") - : { - encode: () => { - throw Error("TextEncoder not available"); - }, - }; - -const encodeString = function (arg, view) { - return cachedTextEncoder.encodeInto(arg, view); -}; - -function passStringToWasm0(arg, malloc, realloc) { - if (realloc === undefined) { - const buf = cachedTextEncoder.encode(arg); - const ptr = malloc(buf.length, 1) >>> 0; - getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf); - WASM_VECTOR_LEN = buf.length; - return ptr; - } - - let len = arg.length; - let ptr = malloc(len, 1) >>> 0; - - const mem = getUint8Memory0(); - - let offset = 0; - - for (; offset < len; offset++) { - const code = arg.charCodeAt(offset); - if (code > 0x7F) break; - mem[ptr + offset] = code; - } - - if (offset !== len) { - if (offset !== 0) { - arg = arg.slice(offset); - } - ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; - const view = getUint8Memory0().subarray(ptr + offset, ptr + len); - const ret = encodeString(arg, view); - - offset += ret.written; - ptr = realloc(ptr, len, offset, 1) >>> 0; - } - - WASM_VECTOR_LEN = offset; - return ptr; -} - -let cachedBigInt64Memory0 = null; - -function getBigInt64Memory0() { - if ( - cachedBigInt64Memory0 === null || cachedBigInt64Memory0.byteLength === 0 - ) { - cachedBigInt64Memory0 = new BigInt64Array(wasm.memory.buffer); - } - return cachedBigInt64Memory0; -} - -function debugString(val) { - // primitive types - const type = typeof val; - if (type == "number" || type == "boolean" || val == null) { - return `${val}`; - } - if (type == "string") { - return `"${val}"`; - } - if (type == "symbol") { - const description = val.description; - if (description == null) { - return "Symbol"; - } else { - return `Symbol(${description})`; - } - } - if (type == "function") { - const name = val.name; - if (typeof name == "string" && name.length > 0) { - return `Function(${name})`; - } else { - return "Function"; - } - } - // objects - if (Array.isArray(val)) { - const length = val.length; - let debug = "["; - if (length > 0) { - debug += debugString(val[0]); - } - for (let i = 1; i < length; i++) { - debug += ", " + debugString(val[i]); - } - debug += "]"; - return debug; - } - // Test for built-in - const builtInMatches = /\[object ([^\]]+)\]/.exec(toString.call(val)); - let className; - if (builtInMatches.length > 1) { - className = builtInMatches[1]; - } else { - // Failed to match the standard '[object ClassName]' - return toString.call(val); - } - if (className == "Object") { - // we're a user defined class or Object - // JSON.stringify avoids problems with cycles, and is generally much - // easier than looping through ownProperties of `val`. - try { - return "Object(" + JSON.stringify(val) + ")"; - } catch (_) { - return "Object"; - } - } - // errors - if (val instanceof Error) { - return `${val.name}: ${val.message}\n${val.stack}`; - } - // TODO we could test for more things here, like `Set`s and `Map`s. - return className; -} -/** - * @param {string} code - * @param {string | undefined} [main_override] - * @returns {string} - */ -export function parse_deno(code, main_override) { - let deferred3_0; - let deferred3_1; - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - const ptr0 = passStringToWasm0( - code, - wasm.__wbindgen_malloc, - wasm.__wbindgen_realloc, - ); - const len0 = WASM_VECTOR_LEN; - var ptr1 = isLikeNone(main_override) - ? 0 - : passStringToWasm0( - main_override, - wasm.__wbindgen_malloc, - wasm.__wbindgen_realloc, - ); - var len1 = WASM_VECTOR_LEN; - wasm.parse_deno(retptr, ptr0, len0, ptr1, len1); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - deferred3_0 = r0; - deferred3_1 = r1; - return getStringFromWasm0(r0, r1); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - wasm.__wbindgen_free(deferred3_0, deferred3_1, 1); - } -} - -/** - * @param {string} code - * @returns {string} - */ -export function parse_outputs(code) { - let deferred2_0; - let deferred2_1; - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - const ptr0 = passStringToWasm0( - code, - wasm.__wbindgen_malloc, - wasm.__wbindgen_realloc, - ); - const len0 = WASM_VECTOR_LEN; - wasm.parse_outputs(retptr, ptr0, len0); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - deferred2_0 = r0; - deferred2_1 = r1; - return getStringFromWasm0(r0, r1); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); - } -} - -/** - * @param {string} code - * @returns {string} - */ -export function parse_ts_imports(code) { - let deferred2_0; - let deferred2_1; - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - const ptr0 = passStringToWasm0( - code, - wasm.__wbindgen_malloc, - wasm.__wbindgen_realloc, - ); - const len0 = WASM_VECTOR_LEN; - wasm.parse_ts_imports(retptr, ptr0, len0); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - deferred2_0 = r0; - deferred2_1 = r1; - return getStringFromWasm0(r0, r1); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); - } -} - -/** - * @param {string} code - * @returns {string} - */ -export function parse_bash(code) { - let deferred2_0; - let deferred2_1; - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - const ptr0 = passStringToWasm0( - code, - wasm.__wbindgen_malloc, - wasm.__wbindgen_realloc, - ); - const len0 = WASM_VECTOR_LEN; - wasm.parse_bash(retptr, ptr0, len0); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - deferred2_0 = r0; - deferred2_1 = r1; - return getStringFromWasm0(r0, r1); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); - } -} - -/** - * @param {string} code - * @returns {string} - */ -export function parse_powershell(code) { - let deferred2_0; - let deferred2_1; - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - const ptr0 = passStringToWasm0( - code, - wasm.__wbindgen_malloc, - wasm.__wbindgen_realloc, - ); - const len0 = WASM_VECTOR_LEN; - wasm.parse_powershell(retptr, ptr0, len0); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - deferred2_0 = r0; - deferred2_1 = r1; - return getStringFromWasm0(r0, r1); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); - } -} - -/** - * @param {string} code - * @returns {string} - */ -export function parse_go(code) { - let deferred2_0; - let deferred2_1; - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - const ptr0 = passStringToWasm0( - code, - wasm.__wbindgen_malloc, - wasm.__wbindgen_realloc, - ); - const len0 = WASM_VECTOR_LEN; - wasm.parse_go(retptr, ptr0, len0); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - deferred2_0 = r0; - deferred2_1 = r1; - return getStringFromWasm0(r0, r1); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); - } -} - -/** - * @param {string} code - * @param {string | undefined} [main_override] - * @returns {string} - */ -export function parse_python(code, main_override) { - let deferred3_0; - let deferred3_1; - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - const ptr0 = passStringToWasm0( - code, - wasm.__wbindgen_malloc, - wasm.__wbindgen_realloc, - ); - const len0 = WASM_VECTOR_LEN; - var ptr1 = isLikeNone(main_override) - ? 0 - : passStringToWasm0( - main_override, - wasm.__wbindgen_malloc, - wasm.__wbindgen_realloc, - ); - var len1 = WASM_VECTOR_LEN; - wasm.parse_python(retptr, ptr0, len0, ptr1, len1); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - deferred3_0 = r0; - deferred3_1 = r1; - return getStringFromWasm0(r0, r1); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - wasm.__wbindgen_free(deferred3_0, deferred3_1, 1); - } -} - -/** - * @param {string} code - * @returns {string} - */ -export function parse_sql(code) { - let deferred2_0; - let deferred2_1; - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - const ptr0 = passStringToWasm0( - code, - wasm.__wbindgen_malloc, - wasm.__wbindgen_realloc, - ); - const len0 = WASM_VECTOR_LEN; - wasm.parse_sql(retptr, ptr0, len0); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - deferred2_0 = r0; - deferred2_1 = r1; - return getStringFromWasm0(r0, r1); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); - } -} - -/** - * @param {string} code - * @returns {string} - */ -export function parse_mysql(code) { - let deferred2_0; - let deferred2_1; - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - const ptr0 = passStringToWasm0( - code, - wasm.__wbindgen_malloc, - wasm.__wbindgen_realloc, - ); - const len0 = WASM_VECTOR_LEN; - wasm.parse_mysql(retptr, ptr0, len0); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - deferred2_0 = r0; - deferred2_1 = r1; - return getStringFromWasm0(r0, r1); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); - } -} - -/** - * @param {string} code - * @returns {string} - */ -export function parse_oracledb(code) { - let deferred2_0; - let deferred2_1; - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - const ptr0 = passStringToWasm0( - code, - wasm.__wbindgen_malloc, - wasm.__wbindgen_realloc, - ); - const len0 = WASM_VECTOR_LEN; - wasm.parse_oracledb(retptr, ptr0, len0); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - deferred2_0 = r0; - deferred2_1 = r1; - return getStringFromWasm0(r0, r1); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); - } -} - -/** - * @param {string} code - * @returns {string} - */ -export function parse_bigquery(code) { - let deferred2_0; - let deferred2_1; - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - const ptr0 = passStringToWasm0( - code, - wasm.__wbindgen_malloc, - wasm.__wbindgen_realloc, - ); - const len0 = WASM_VECTOR_LEN; - wasm.parse_bigquery(retptr, ptr0, len0); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - deferred2_0 = r0; - deferred2_1 = r1; - return getStringFromWasm0(r0, r1); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); - } -} - -/** - * @param {string} code - * @returns {string} - */ -export function parse_snowflake(code) { - let deferred2_0; - let deferred2_1; - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - const ptr0 = passStringToWasm0( - code, - wasm.__wbindgen_malloc, - wasm.__wbindgen_realloc, - ); - const len0 = WASM_VECTOR_LEN; - wasm.parse_snowflake(retptr, ptr0, len0); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - deferred2_0 = r0; - deferred2_1 = r1; - return getStringFromWasm0(r0, r1); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); - } -} - -/** - * @param {string} code - * @returns {string} - */ -export function parse_mssql(code) { - let deferred2_0; - let deferred2_1; - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - const ptr0 = passStringToWasm0( - code, - wasm.__wbindgen_malloc, - wasm.__wbindgen_realloc, - ); - const len0 = WASM_VECTOR_LEN; - wasm.parse_mssql(retptr, ptr0, len0); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - deferred2_0 = r0; - deferred2_1 = r1; - return getStringFromWasm0(r0, r1); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); - } -} - -/** - * @param {string} code - * @returns {string | undefined} - */ -export function parse_db_resource(code) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - const ptr0 = passStringToWasm0( - code, - wasm.__wbindgen_malloc, - wasm.__wbindgen_realloc, - ); - const len0 = WASM_VECTOR_LEN; - wasm.parse_db_resource(retptr, ptr0, len0); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - let v2; - if (r0 !== 0) { - v2 = getStringFromWasm0(r0, r1).slice(); - wasm.__wbindgen_free(r0, r1 * 1, 1); - } - return v2; - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } -} - -/** - * @param {string} code - * @returns {string} - */ -export function parse_graphql(code) { - let deferred2_0; - let deferred2_1; - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - const ptr0 = passStringToWasm0( - code, - wasm.__wbindgen_malloc, - wasm.__wbindgen_realloc, - ); - const len0 = WASM_VECTOR_LEN; - wasm.parse_graphql(retptr, ptr0, len0); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - deferred2_0 = r0; - deferred2_1 = r1; - return getStringFromWasm0(r0, r1); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); - } -} - -/** - * @param {string} code - * @returns {string} - */ -export function parse_php(code) { - let deferred2_0; - let deferred2_1; - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - const ptr0 = passStringToWasm0( - code, - wasm.__wbindgen_malloc, - wasm.__wbindgen_realloc, - ); - const len0 = WASM_VECTOR_LEN; - wasm.parse_php(retptr, ptr0, len0); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - deferred2_0 = r0; - deferred2_1 = r1; - return getStringFromWasm0(r0, r1); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); - } -} - -/** - * @param {string} code - * @returns {string} - */ -export function parse_rust(code) { - let deferred2_0; - let deferred2_1; - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - const ptr0 = passStringToWasm0( - code, - wasm.__wbindgen_malloc, - wasm.__wbindgen_realloc, - ); - const len0 = WASM_VECTOR_LEN; - wasm.parse_rust(retptr, ptr0, len0); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - deferred2_0 = r0; - deferred2_1 = r1; - return getStringFromWasm0(r0, r1); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); - } -} - -/** - * @param {string} code - * @returns {string} - */ -export function parse_ansible(code) { - let deferred2_0; - let deferred2_1; - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - const ptr0 = passStringToWasm0( - code, - wasm.__wbindgen_malloc, - wasm.__wbindgen_realloc, - ); - const len0 = WASM_VECTOR_LEN; - wasm.parse_ansible(retptr, ptr0, len0); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - deferred2_0 = r0; - deferred2_1 = r1; - return getStringFromWasm0(r0, r1); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); - } -} - -/** - * @param {string} code - * @returns {string} - */ -export function parse_csharp(code) { - let deferred2_0; - let deferred2_1; - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - const ptr0 = passStringToWasm0( - code, - wasm.__wbindgen_malloc, - wasm.__wbindgen_realloc, - ); - const len0 = WASM_VECTOR_LEN; - wasm.parse_csharp(retptr, ptr0, len0); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - deferred2_0 = r0; - deferred2_1 = r1; - return getStringFromWasm0(r0, r1); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); - } -} - -function handleError(f, args) { - try { - return f.apply(this, args); - } catch (e) { - wasm.__wbindgen_exn_store(addHeapObject(e)); - } -} - -const imports = { - __wbindgen_placeholder__: { - __wbg_get_bd8e338fbd5f5cc8: function (arg0, arg1) { - const ret = getObject(arg0)[arg1 >>> 0]; - return addHeapObject(ret); - }, - __wbg_length_cd7af8117672b8b8: function (arg0) { - const ret = getObject(arg0).length; - return ret; - }, - __wbindgen_is_object: function (arg0) { - const val = getObject(arg0); - const ret = typeof val === "object" && val !== null; - return ret; - }, - __wbg_next_40fc327bfc8770e6: function (arg0) { - const ret = getObject(arg0).next; - return addHeapObject(ret); - }, - __wbindgen_is_function: function (arg0) { - const ret = typeof (getObject(arg0)) === "function"; - return ret; - }, - __wbindgen_object_drop_ref: function (arg0) { - takeObject(arg0); - }, - __wbg_next_196c84450b364254: function () { - return handleError(function (arg0) { - const ret = getObject(arg0).next(); - return addHeapObject(ret); - }, arguments); - }, - __wbg_done_298b57d23c0fc80c: function (arg0) { - const ret = getObject(arg0).done; - return ret; - }, - __wbg_value_d93c65011f51a456: function (arg0) { - const ret = getObject(arg0).value; - return addHeapObject(ret); - }, - __wbg_iterator_2cee6dadfd956dfa: function () { - const ret = Symbol.iterator; - return addHeapObject(ret); - }, - __wbg_get_e3c254076557e348: function () { - return handleError(function (arg0, arg1) { - const ret = Reflect.get(getObject(arg0), getObject(arg1)); - return addHeapObject(ret); - }, arguments); - }, - __wbg_call_27c0f87801dedf93: function () { - return handleError(function (arg0, arg1) { - const ret = getObject(arg0).call(getObject(arg1)); - return addHeapObject(ret); - }, arguments); - }, - __wbg_isArray_2ab64d95e09ea0ae: function (arg0) { - const ret = Array.isArray(getObject(arg0)); - return ret; - }, - __wbg_instanceof_ArrayBuffer_836825be07d4c9d2: function (arg0) { - let result; - try { - result = getObject(arg0) instanceof ArrayBuffer; - } catch (_) { - result = false; - } - const ret = result; - return ret; - }, - __wbg_instanceof_Map_87917e0a7aaf4012: function (arg0) { - let result; - try { - result = getObject(arg0) instanceof Map; - } catch (_) { - result = false; - } - const ret = result; - return ret; - }, - __wbg_isSafeInteger_f7b04ef02296c4d2: function (arg0) { - const ret = Number.isSafeInteger(getObject(arg0)); - return ret; - }, - __wbg_entries_95cc2c823b285a09: function (arg0) { - const ret = Object.entries(getObject(arg0)); - return addHeapObject(ret); - }, - __wbindgen_memory: function () { - const ret = wasm.memory; - return addHeapObject(ret); - }, - __wbg_buffer_12d079cc21e14bdb: function (arg0) { - const ret = getObject(arg0).buffer; - return addHeapObject(ret); - }, - __wbg_new_63b92bc8671ed464: function (arg0) { - const ret = new Uint8Array(getObject(arg0)); - return addHeapObject(ret); - }, - __wbg_set_a47bac70306a19a7: function (arg0, arg1, arg2) { - getObject(arg0).set(getObject(arg1), arg2 >>> 0); - }, - __wbg_length_c20a40f15020d68a: function (arg0) { - const ret = getObject(arg0).length; - return ret; - }, - __wbg_instanceof_Uint8Array_2b3bbecd033d19f6: function (arg0) { - let result; - try { - result = getObject(arg0) instanceof Uint8Array; - } catch (_) { - result = false; - } - const ret = result; - return ret; - }, - __wbindgen_error_new: function (arg0, arg1) { - const ret = new Error(getStringFromWasm0(arg0, arg1)); - return addHeapObject(ret); - }, - __wbindgen_jsval_loose_eq: function (arg0, arg1) { - const ret = getObject(arg0) == getObject(arg1); - return ret; - }, - __wbindgen_boolean_get: function (arg0) { - const v = getObject(arg0); - const ret = typeof v === "boolean" ? (v ? 1 : 0) : 2; - return ret; - }, - __wbindgen_number_get: function (arg0, arg1) { - const obj = getObject(arg1); - const ret = typeof obj === "number" ? obj : undefined; - getFloat64Memory0()[arg0 / 8 + 1] = isLikeNone(ret) ? 0 : ret; - getInt32Memory0()[arg0 / 4 + 0] = !isLikeNone(ret); - }, - __wbindgen_string_get: function (arg0, arg1) { - const obj = getObject(arg1); - const ret = typeof obj === "string" ? obj : undefined; - var ptr1 = isLikeNone(ret) - ? 0 - : passStringToWasm0( - ret, - wasm.__wbindgen_malloc, - wasm.__wbindgen_realloc, - ); - var len1 = WASM_VECTOR_LEN; - getInt32Memory0()[arg0 / 4 + 1] = len1; - getInt32Memory0()[arg0 / 4 + 0] = ptr1; - }, - __wbindgen_bigint_get_as_i64: function (arg0, arg1) { - const v = getObject(arg1); - const ret = typeof v === "bigint" ? v : undefined; - getBigInt64Memory0()[arg0 / 8 + 1] = isLikeNone(ret) ? BigInt(0) : ret; - getInt32Memory0()[arg0 / 4 + 0] = !isLikeNone(ret); - }, - __wbindgen_debug_string: function (arg0, arg1) { - const ret = debugString(getObject(arg1)); - const ptr1 = passStringToWasm0( - ret, - wasm.__wbindgen_malloc, - wasm.__wbindgen_realloc, - ); - const len1 = WASM_VECTOR_LEN; - getInt32Memory0()[arg0 / 4 + 1] = len1; - getInt32Memory0()[arg0 / 4 + 0] = ptr1; - }, - __wbindgen_throw: function (arg0, arg1) { - throw new Error(getStringFromWasm0(arg0, arg1)); - }, - __wbindgen_is_bigint: function (arg0) { - const ret = typeof (getObject(arg0)) === "bigint"; - return ret; - }, - __wbindgen_in: function (arg0, arg1) { - const ret = getObject(arg0) in getObject(arg1); - return ret; - }, - __wbindgen_bigint_from_i64: function (arg0) { - const ret = arg0; - return addHeapObject(ret); - }, - __wbindgen_jsval_eq: function (arg0, arg1) { - const ret = getObject(arg0) === getObject(arg1); - return ret; - }, - __wbindgen_bigint_from_u64: function (arg0) { - const ret = BigInt.asUintN(64, arg0); - return addHeapObject(ret); - }, - __wbg_eval_73a4cb0af5990ab1: function (arg0, arg1) { - const ret = eval(getStringFromWasm0(arg0, arg1)); - return addHeapObject(ret); - }, - }, -}; - -class WasmBuildLoader { - #options; - #lastLoadPromise; - #instantiated; - - constructor(options) { - this.#options = options; - } - - get instance() { - return this.#instantiated?.instance; - } - - get module() { - return this.#instantiated?.module; - } - - load( - url, - decompress, - ) { - if (this.#instantiated) { - return Promise.resolve(this.#instantiated); - } else if (this.#lastLoadPromise == null) { - this.#lastLoadPromise = (async () => { - try { - this.#instantiated = await this.#instantiate(url, decompress); - return this.#instantiated; - } finally { - this.#lastLoadPromise = undefined; - } - })(); - } - return this.#lastLoadPromise; - } - - async #instantiate(url, decompress) { - const imports = this.#options.imports; - if (this.#options.cache != null && url.protocol !== "file:") { - try { - const result = await this.#options.cache( - url, - decompress ?? ((bytes) => bytes), - ); - if (result instanceof URL) { - url = result; - decompress = undefined; // already decompressed - } else if (result != null) { - return WebAssembly.instantiate(result, imports); - } - } catch { - // ignore if caching ever fails (ex. when on deploy) - } - } - - const isFile = url.protocol === "file:"; - - // make file urls work in Node via dnt - const isNode = globalThis.process?.versions?.node != null; - if (isFile && typeof Deno !== "object") { - throw new Error( - "Loading local files are not supported in this environment", - ); - } - if (isNode && isFile) { - // the deno global will be shimmed by dnt - const wasmCode = await Deno.readFile(url); - return WebAssembly.instantiate( - decompress ? decompress(wasmCode) : wasmCode, - imports, - ); - } - - switch (url.protocol) { - case "file:": - case "https:": - case "http:": { - const wasmResponse = await fetchWithRetries(url); - if (decompress) { - const wasmCode = new Uint8Array(await wasmResponse.arrayBuffer()); - return WebAssembly.instantiate(decompress(wasmCode), imports); - } - if ( - isFile || - wasmResponse.headers.get("content-type")?.toLowerCase() - .startsWith("application/wasm") - ) { - return WebAssembly.instantiateStreaming(wasmResponse, imports); - } else { - return WebAssembly.instantiate( - await wasmResponse.arrayBuffer(), - imports, - ); - } - } - default: - throw new Error(`Unsupported protocol: ${url.protocol}`); - } - } -} -const isNodeOrDeno = typeof Deno === "object" || - (typeof process !== "undefined" && process.versions != null && - process.versions.node != null); - -const loader = new WasmBuildLoader({ - imports, - cache: isNodeOrDeno ? cacheToLocalDir : undefined, -}); - -export async function instantiate(opts) { - return (await instantiateWithInstance(opts)).exports; -} - -export async function instantiateWithInstance(opts) { - const { instance } = await loader.load( - opts?.url ?? new URL("windmill_parser_wasm_bg.wasm", import.meta.url), - opts?.decompress, - ); - wasm = wasm ?? instance.exports; - cachedInt32Memory0 = cachedInt32Memory0 ?? new Int32Array(wasm.memory.buffer); - cachedUint8Memory0 = cachedUint8Memory0 ?? new Uint8Array(wasm.memory.buffer); - return { - instance, - exports: getWasmInstanceExports(), - }; -} - -function getWasmInstanceExports() { - return { - parse_deno, - parse_outputs, - parse_ts_imports, - parse_bash, - parse_powershell, - parse_go, - parse_python, - parse_sql, - parse_mysql, - parse_oracledb, - parse_bigquery, - parse_snowflake, - parse_mssql, - parse_db_resource, - parse_graphql, - parse_php, - parse_rust, - parse_ansible, - parse_csharp, - }; -} - -export function isInstantiated() { - return loader.instance != null; -} -export async function cacheToLocalDir(url, decompress) { - const localPath = await getUrlLocalPath(url); - if (localPath == null) { - return undefined; - } - if (!await exists(localPath)) { - const fileBytes = decompress(new Uint8Array(await getUrlBytes(url))); - try { - await Deno.writeFile(localPath, fileBytes); - } catch { - // ignore and return the wasm bytes - return fileBytes; - } - } - return toFileUrl(localPath); -} -async function getUrlLocalPath(url) { - try { - const dataDirPath = await getInitializedLocalDataDirPath(); - const hash = await getUrlHash(url); - return `${dataDirPath}/${hash}.wasm`; - } catch { - return undefined; - } -} -async function getInitializedLocalDataDirPath() { - const dataDir = localDataDir(); - if (dataDir == null) { - throw new Error(`Could not find local data directory.`); - } - const dirPath = `${dataDir}/deno-wasmbuild`; - await ensureDir(dirPath); - return dirPath; -} -async function exists(filePath) { - try { - await Deno.lstat(filePath); - return true; - } catch (error) { - if (error instanceof Deno.errors.NotFound) { - return false; - } - throw error; - } -} -async function ensureDir(dir) { - try { - const fileInfo = await Deno.lstat(dir); - if (!fileInfo.isDirectory) { - throw new Error(`Path was not a directory '${dir}'`); - } - } catch (err) { - if (err instanceof Deno.errors.NotFound) { - // if dir not exists. then create it. - await Deno.mkdir(dir, { recursive: true }); - return; - } - throw err; - } -} -async function getUrlHash(url) { - // Taken from MDN: https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest - const hashBuffer = await crypto.subtle.digest( - "SHA-256", - new TextEncoder().encode(url.href), - ); - // convert buffer to byte array - const hashArray = Array.from(new Uint8Array(hashBuffer)); - // convert bytes to hex string - const hashHex = hashArray - .map((b) => b.toString(16).padStart(2, "0")) - .join(""); - return hashHex; -} -async function getUrlBytes(url) { - const response = await fetchWithRetries(url); - return await response.arrayBuffer(); -} -// the below is extracted from deno_std/path -const WHITESPACE_ENCODINGS = { - "\u0009": "%09", - "\u000A": "%0A", - "\u000B": "%0B", - "\u000C": "%0C", - "\u000D": "%0D", - "\u0020": "%20", -}; -function encodeWhitespace(string) { - return string.replaceAll(/[\s]/g, (c) => { - return WHITESPACE_ENCODINGS[c] ?? c; - }); -} -function toFileUrl(path) { - return Deno.build.os === "windows" - ? windowsToFileUrl(path) - : posixToFileUrl(path); -} -function posixToFileUrl(path) { - const url = new URL("file:///"); - url.pathname = encodeWhitespace( - path.replace(/%/g, "%25").replace(/\\/g, "%5C"), - ); - return url; -} -function windowsToFileUrl(path) { - const [, hostname, pathname] = path.match( - /^(?:[/\\]{2}([^/\\]+)(?=[/\\](?:[^/\\]|$)))?(.*)/, - ); - const url = new URL("file:///"); - url.pathname = encodeWhitespace(pathname.replace(/%/g, "%25")); - if (hostname != null && hostname != "localhost") { - url.hostname = hostname; - if (!url.hostname) { - throw new TypeError("Invalid hostname."); - } - } - return url; -} -export async function fetchWithRetries(url, maxRetries = 5) { - let sleepMs = 250; - let iterationCount = 0; - while (true) { - iterationCount++; - try { - const res = await fetch(url); - if (res.ok || iterationCount > maxRetries) { - return res; - } - } catch (err) { - if (iterationCount > maxRetries) { - throw err; - } - } - console.warn(`Failed fetching. Retrying in ${sleepMs}ms...`); - await new Promise((resolve) => setTimeout(resolve, sleepMs)); - sleepMs = Math.min(sleepMs * 2, 10000); - } -} -// MIT License - Copyright (c) justjavac. -// https://github.com/justjavac/deno_dirs/blob/e8c001bbef558f08fd486d444af391729b0b8068/data_local_dir/mod.ts -function localDataDir() { - switch (Deno.build.os) { - case "linux": { - const xdg = Deno.env.get("XDG_DATA_HOME"); - if (xdg) { - return xdg; - } - const home = Deno.env.get("HOME"); - if (home) { - return `${home}/.local/share`; - } - break; - } - case "darwin": { - const home = Deno.env.get("HOME"); - if (home) { - return `${home}/Library/Application Support`; - } - break; - } - case "windows": - return Deno.env.get("LOCALAPPDATA") ?? undefined; - } - return undefined; -} diff --git a/cli/wasm/windmill_parser_wasm_bg.wasm b/cli/wasm/windmill_parser_wasm_bg.wasm deleted file mode 100644 index 19f605d0764274c89f9e4ab9711b8cc0f9ca3444..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9852108 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

l`KoAMj`3bh{*`wFM=8~X~iFA@6+ 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 Hr1m$k9SH%ai{+l!8Uxc%rN`UBC^7CV+Q9!`8 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

Z)~gwPeCdoDe_@hRAnjp91tMQlN_@Lw---GT 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 z�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

-$s5=U;(+}}em`QqGtm7y4&{q|)I+3xJ40RvOc^02eAIxskOownRF$^#f z>%dzgb&~Fag3)%Jo0D;-9$0jOf;=(RrW_DN z3KF9m;2SX})$|5JBZ$D`;zCAOLe?ap?q#MyilOd3o;YU6@M(|qgN8kPncI6CmtAHj zs9YtV2>O8}R@qL7`E6Q#CR>03=-mC z)YwG5@Gi87h8Y$|J9Wjp@^rOtya>9a;Xl1rjO;n6r<2n^h_`sy;(__ zb2DLER>-tdHF^N;u-kofH*T5@Vidr+%7uziHc*flot7Bo17_bcT_7h{$8w%43zj_# z;1{|0+*628lUm~JaDZ{c$9|@oiL-*Kf|t@sg7^#w8F(vVN7G_@D;Q#KAuf5;%s=1H zQ1^(f2Q3Ezkle%v@8xD=P;QR5v?~;}GB#9J>08@kqR9x@? z!(z=zw@X~0|Mgw!=*ZWn?Da`pN#=b*Q0Dd>#ccTboc)!7_rO2pThcS^|4;)rSJrxX6j$Q&@E(5dzm_v_f#+-uEInH# zEIfTR&f>&zPKT?8*bBD=*rWhpJhGIwmQZI;=lKyYV;T!|~~=SRg7c57xVH zx0Ox0#*Eaue~dngJUUQ4Rn^SaE9s`FxqC?W894TVDu=#ln8E}elqT{CMj@Ny7z+|2cs{= zuxyTB)Se|APscE6j=2Bq<=>8xT>Sn*+?&+#R1Ejx_**f>$vOUJj8ew&H(~??$7gUG z>iFw%Z$`(@$86xj@z-KDN#OW&j7xzd`?cU1J{bKk#qcPj3LAE zGck4y$4|#S!psgvPsY8yI{tFpb2|P~-0SIhGVUchJ`wl!c?Dyuzk2dhak3116pvuh z;BhF&mg4*_E;oTb{GQR>8vLP|-m7&o9(*iTQI{49T+LtOv2Jg_Jx!DV_gGI-I7DaN z$|T@FM??@mnbx}Bv@GBmHbBrLlnuAK2m84j-)+SVEC7JK5=scn@J+Y|0S0=ug}_w@ z5M22Wc{UnHqOU8QxpgG^OC86KL@(+%aU^0lCRD~F5qla}-Q53m6i1ZCg81j}of*21lqm?+N+ z`SD;CURV|Ld$0=g<3_>!s_7%J5uZKfnI9s&bVbasnm$pwBIZ|3pDHmwA}~&g`Be|Z z4^{h_-x$o#y5qTD!?>Rk#{>6k406AQA8o-4^cOEx5c@NB6G7noHDV)Nd?WOU zD#*W^7I_B#-u>fUg06ua0VDCl4?wOqGLUoQwFNmNdGkT8;dTg(sHDp`5E&r^sGdNm zJuTQW^p}LZl5Q*U%W?N#k6UpO6R=f@TmY?=`l<=xYWj^r2n&;5HZfXih@8$aV6fVuQ11cMov``iXm^%2VeK};Fs!CICpCB=hj!8y8lYH83us9b(sGV> z(I~sE9zq#x)2Nmf3hE)!!FHf&p|)_vy!(Ftm=<76sAt4MI%wF^h6+QlOYeus_Nt-~ zk;1)vuw1dv(Hz(Oy35s4I`H$Wor89szJfw#UFo{;{g=368`reRm|1h-d#G$KY>6dJ zF0?MEeQ1>SaI$oNmNM;{cR9rLg{EkFCjS9F&*nd%Wo=SqkD2evzkuGRMd|C-fvDg8 z%T27_ueqd(2&s3gI@P(tH`<~tA~Dv}#yvgUa;RJ{@3gm>Zp=4U32g15)?=B??UY!X zL^UQnp)Hkc(won9O;!#4l=AxBPdAf#2Lp!Jhvl@6ySidd#@!BKFe`7awhlT-NKJG< z$~FvO4chN_xp6JUZv$L6aN}3*|1LKcs=syu(6}+H7sicYcO$tmidZJ`U&bg^YIq+@ z#<^N(2GsKzKvK9#)QsCpAb!lWkP_~<%3@LO_Dn4HnPIPmCX$(9Z;mE{TY=G; zCZHjM_jaX~PRk%uoECr3;~xI-M=RY^CaPxq8(kP!vsY7iX#T!gF#JN5KxpMKtH0K& z1e`3)?3<{)1$fE1Je*%V`;pg?UyOA>GNnLNi)mw3>juvH=tpzv=Kw8{+nNvr9JAvU z8^S(4DQ!(e8I=%mz7;WfA~H;9cunTTMl#`R()~j)C7j;S=_)X_l73Q}zjda89cx-C zV$)FV(W5IfPlXr)Xn7UmZF>w){X4;}}m`RI{5lmT*n6T&) zX1dPnh{;NhznP}Hbi^dZjc%ssBEpt4OwA=sP5Mosn(Twan1Ody*TPzSliu7|R4Iq*hJ;J_X#;*|ogZ*){r&##OPJ zg;kYnl#!DCrrMkCEL)>gvap>}wO5V?qk;+z#W0qK-r(!C$4q>h;4zoa9k_!Bx}ihoK+X6}wQ><+~Ldvswa?+ zML)8Il3C*hONB4vP>&TF~^~!LV1zUbAeyf+>qxS>pP9!Ug2poLoq~ew9Se0 zpEvPS)$}q2S&T+)JkL?zc{Uth;HYk&4foIJD9-aGdC2+hkI=#grQX`N*?AF!%n}8j z!hL3d0+uq5Oug0yz2M+Fz{?!Y6H>AVJ;pQr4(HjB+S=*<+!Ris^7|GV8a&lEQqL7& z@Lh$5&ags8h$D;YfU660&Qh|yr`yssH@v9CeLPF%pRU5cyI<-eanqNC;UCfNPS0n! zUc&kgVww7jFMR9g7;*ZIpXON$cNq58uxm=v9b!V1zR>LcDajC^)Ju&XIEqYZBu!u$ zd;IJcz%Ip6@fbn@nT3(zfUrT`7RMDqo9BiME{^M_rQd=$zySiM+?*=T^+A7FV6J8y zBs1uq(M}&oDDv%y0J)7nI*$U3KLhCVFMLo1IlTu$2JMn)^4LnT_-*r7lxrMyIE?ZP_#Txoj}!u-KsDA4s~ER^aZD4?75 z;{ZAm16U(qfb_2*9J-|p^E?b*b1rHV%YyImxTTIMwww%UQyuuKI-|jDXG|oZ(PB>j zS+XAQFWH!u@-eZ`(YD5j-W0pfQ5Jvan31dZsvE!l%L(Zn0Fu>*jiAyF7EmvvI0%3RNSf-Q;5G)s(ise`uo(nPwo)0cu+%))?VQ!bk zMBllQi5|*Os>DPOU0f$cZtpUw3%Wn1$^&_!0%Hfa3Xdi)8jpy&De%Z=jEYNKG9LNO z_HsOe5W$PB@n}a0kGdX@l<{aBG_akZp8O=sA^5XsV3%uz|U{X;Od=2zgPOtt~d3tOyp?jHw!)!{!+YWxb4x>AlXF(rx0T;8w4u5=Mi;>%>w>NUCFqKCR%+z@m6cH3hj$AH) zeB^Eaa+Z2I@?}|``OAD!UskDFWM{8x9grbf6|z@BcDsjRX=#6gtw#dMi@IhgE0xnI z)Q5&Rx6;s+lIlN2mKn|m55M7AW+8d6y%BTrJoEx{lyz6aoN+%2Ux*7V93`7oQ_1%W ziGpZVzZe=S(nY>WV);eBsVxRa;5mMrV!}{vG-1t4W4#(JOp?*RR_ivTXMHJB2KSosB{k$%1^!aIXkHo=EC9W%u*tGv2k>UZcLwBSFdX8rlMGUi#=57y3t(T1A?&;#4SZn~rEu zaqF)adC?~3ism*za3ontW$+UW=S7V$vMR}V44XcysKOj)R*~=rd|;;KL9;y9@A?h~ zeFvX=<9r9Cn184F4u0`<@*TV|;5z_xZm{jE^_(tQX2>vw$zn|VXt5Z}QF1bL%<2hUv*Px-imM_J{l z7J&y!r}{WcA6E5;#WxEGvhbTz3hUA0q{Yf8dWW0KAvQ-hRrgGpisCP4Icg1qG>D!B z#gWd~@PV@!Y~(MB8xTNf`HOi9&o>CZ@6TVPt|C`RTREWMT-@U6eWWY1ZENYu19qjH zzepg^?OJ>B>5F%$(_|FURGS1I;+P`Ev$7Ov`8&iG9;n`~=;gXaL8kXtvgAc&Bk(5C z?;)sPsR&#k#UQ_6={w{^WEW_?XQk~Qsix#-Y0!&Wks%<_`jFP{qO6a3{i^oYpBI1a z6?v~WgA;k-0UD~WLab08*sQE+eiOXsp*5!dD_HebSkj+5lM0RyM zlODT$ZP7k9AVnr)1KbcgyfzRg!0^pP>?}_N#sJf?j6I(tat9zHVefWQan7?78_}Gg zGdzOrVQk%2CH%g@*6Xng7gP+aMWP;m_0JOZgvTW6`Ir0os+8gkpoF0teWl{7B{o66 znq9~d*mKnqqhPyWm}(!VAT(4w)w7;AoTYl6!ItlhbeWL);mAsw$btBs5);Evm6X2p zEPUFtM#@saX=a=x11bFBYR5DD7fKi4n8c|@Im^^u(6_^w*nAS2$asp@w+--OS}XBc zrC=A`ff?mgB!1P`6EU?5>_mkkX(S+8$_uh6QG%b96P6SsvyV#}*P%=((N7}n4p(o_ zqj}R)Q3&H@x7~ENh#FcoIY>aSdZaReYR(e)ZHI6BVc;kPVok|?)so0$%Q#)2sBZo~ zDT3AX;rs&J_(=5rAbYq2IOJ>xr(sQ%?!Rb>XS6-*pdRFy4HFR|iNWXjQB*uc0P z=0(8~z3ui0hrK)X`?+IB>P(Y+fM&5P8Y-Jug55FTm=u6%8y69awogI z2|6IWVdsldzp5#T8nTqQ*_Jh&SXICv;UU@eEE)t*#JL11C z;0N*D_EODJ-Ky*K2>XEjUhAG)P{{%I62*#1J(%~(S-`{a+ zjP$}7X7e@DF%hjUkwp_xoUAfo^+#k?p;LB$++zLjpuz}%x}BVI3uQo5>-YP6 z(-~3~cFt>erm7ljWI*Ods@l3?AJF|90^@g1YZuVcCZPM4_uGnlZLNK^UwLm|6^>VO zBqjlA);^$1t+n=wjy!sWj_oz=n<;76-mjxuYcGf6J{`MjZDg>vXKsT$HNrO9=o)sN z@^E%!^GQCTl#|JZ?-g78*c)u8WnZAmoV`gkXzR@KTASPo>jYaw*^v#UtaJ7%ous0t zB(};uOE$OJCdZy*k(MSbC(}NTDrKKQ>$mp_hqR;8dNerXsU6X4>_`Zny$4IT=O6)V zm$Jk5JxpGEPUV2~KE|9q51X_jq+&oqg6SwDj-;h*FKUqy$wjDWO6oZweV}?II>rGz z^@INE{an>uREOLjaeL5X&=Z(>-CYI&&@WW(5P?k@M>j3MPs^dUwK(ilYEvtnm&Vf~ z32ajTlx0LBRrXUkNK0-?p@Q_Y22OMETRV*R8dbQVa&#IBWmQdh94IxPGQ^;40|+wr z)^)D9!DNz02=fD4DPQo}2Ly;}V+m#M*L;BJgc~OSgnDt|RomuZ+@hhw_6DkXTjP~+ zOIo2%_B>|XF~3h5bjDY@Brx+S`~0}V7JX@T3dZ@Y2TGx$YTZIRWIc@MSuC0-%F8? zQc(mg5 zROte?3Wjv)0)|1HK3QAJ)Wb|8<2!M1b9nX)?^P{03N?G{~Kgjc?w4U@I z5{r@XR#VGrWl>YhYG+YX%W7s>qA~ZWsYM)mNI2$5EiJ2+MJ+9>l|?NrtCdA9EvuD9 z4K1scMFO(b%A$sr)ykrFmetB45!q^GQ9H|OWl=NBYGqL~%jrAR%_M0pS3YV**2^Yz}BtOF@RAsB`6M%WF+q>K+{W38ad-^j&ol_-0 zYrkD8kmOaibgPGy;n>9^p#FIX_Wh+$`%Y&dBAopO8_os12dDVrbWtbMX9@A z)Da_y)Ls0HN2rs=(WmfMlw$h@{r0K671udJoiu)v!b?hTMJc?$p(820_-ZOj;r(?T zN%bYgx1to@U(=BkUYtA?rSSeLM^(Wh<+q|#-p}bsRV`9~E2^sXSsllZP$!Ke)wM_k zuBf^eslXLg*ZO50sjfvza7ER%PU=W?EmDIksuo6SaK-Jn)L_nF#?;zxb#l+I#P1XdR?>g4Hqons5?CmrP{EJZJZVY+uCH~!0jaw9VD!IN62|@so;t|0 zV0HY~$|oyeHHP666=B&*{G@gxh?OyJ%mY8UwspB$borh1-wQO$2vu5qUMJaAO_ZuqGBPR?rG9rIfK6qB3P7Q>+CN~l zjPe~Gwe=C4zs3R$EI1Cn!&#sWRz8#}c8*xX*%-LCZYX>M06;Et=`<{iczAg^Y?a*D z=PdZ-sZ|GVG;Ul(rmHlA|9R75Vkjf+iNbY6K!_4uU5dcDST+;Q|DA!ehj0&dSn$?j zQ_5B&+B=I&CZ3Re_=V&2+(!{|@`7;mpaBcT0x}pVf8xkGC$F(mg@OC1SXv~TLK7cDxgTdV1s&O)ziEm+!k!C z!dmtl1cx^Fl3gRbAPo*f*mSr=+stG>W$Yr;;S&rl^e`|sNV zVYEFQO26$@lp~B13sL-8?9H$Ugdxq@5T=`71Ys19Eri*bUF=7guDn|rC1aXqOF|`@ zwq=QNyguO`sT)SvMlR!ccWBX5x2NAiyy3RZsV}Pt_8L+j)l@Ek`mkaH2->#Mkzl#Q zWw4rZn*hj4E_;f)o&^}GiYB_h6UNrXPcME1eq<8(d8^)c5fV74K}cXb>zBYSEuB=& z9s*e;j4;ScC zM_KvFipQwvMIx;j?+7oTG+XV9y1XMYuu3X3>$>n0x*p!OR z@R>|Vn-~#S!wxX+h43=&hQ*gNEC6*%`*G$r%sZ3J!8V~Gwry-|V033Pfi}eGs9VbD z6ryCl9~?5~%fX7fHhw3QK+FPKzng!1<@-5c)?gjTqI(C^aR!IBOqk4g!K5=QB8C}I zVkeb}lht8mQX0LgmV(Ts^9g|+L=+>?%1HV8!l+WuQAhh z?W{~|cs#}6$I40&%al1A=EiI5&;oy?Z;87g&@eqcB#!0~BLeb4U zc7)?WKqaXqom4U|7jHpt)%rSKbmN6yva#6H8T8X@%WH~&!ENx#ySn_out0NXs@#|S zy*SzUZ(7D6fp6JQ*@A6PFB?0{3z=3hB-l9=XjQau&YKI| z+`R0ABOVA}ga?MAG;j$qU+gk&8kfLLU|fRUYa~{&3>6Azs<~xhRq03v>|ZTa>e^rL zlK!)V-IR^)DydwRi=+YX-h3?!qlC;izxz8z3P21)-&kyBiP7Z6W^gb1;i~?Doaz_( zGBtyac6O7#%BTB6n3b!R*R#O689t4de5rkzb-G13g7v-1=QGd$I!_+blvX9&szv<` zK7$v%Jg-!ANDtkS@YP~o+1eh5D)XwFHm{4}YpR{FC3w_&4jvi-JnCMH(Dp6IrtRJR zdyH*&n?*a`8u>MCL7jh%Cbs)E+{eY&c4?zn``U;;;(RXNTF@$D=;IT$QoX{ zw1!tg!+x;7l1q9hy@oNNN5mBPz{4ptB07xaAmF#%3BuoBfO@{oLhW|YVYZA8G?9O8 z1k!HuUV9YMvN}=pa<0uXGQAu|kkVZ*m-wu7*EPjMX|ud2XQ{VZbAmMCMUW4j?wf;nOpo7c3;(;05Fc9i@)gc6fnRL@jv1>=py4_}ooGTSo&<1)!SuW#?+v$l~EcIlkA`-UK6M2I2p0KtS2x4XwEQh|g0hZKb z+V%+4Vrc|ZZCowe8G&3A`3Trq$40QBClq(uc2Cq|sVA!Uskc>CX-f&kl4U{cJE&8q zw_p*f5k2BnF<(Cj6{1qy?RGwhP$}N(Xr~O`S{gNVGRt#-(L|VXL@Dft1_sjmeMCiI zF0O(`XGtjqd%?SY(d=cMzKkY#F+@#BP&L}y9jRK+M@l1Mq{H~{=4@%ZOjk<~C8moT z%|iuyp!?Bz0Tu?O5Kqp~<_3xS%piLK(CU8)5hp@zvXM%U)}r%qM#eZ_+a`bwhBqP=b3?Zby1F67Evf@-O2T&+u&&m) zBNmQ+5hGDQBW+8_E2GX%1LtiO$h=9VMe z!qD7uY?~UITYhZ|LvzcoZE9$4`PR3wq4^uHm!WA57qo)mx?MwaOHglWXl{uPn;49$ z4|y@~$Ek(94G`F0@H`LJFvL|n-p}A#Gh8m30ghvp> z(Dyc&cdwD5x#bAnP(zcRY%YDbHZ-?P-qKXxTmS=+a{K$%~AE>sHiLfCJYprhL6WWl5C@P#P_C9WbQjKCB(Q?vr zvn;&E*C{u>cwKotBVOkb|2p2U1J#9O;#LH=kTpSGJm5AM~)j z5ynvx`N_Z)HVESOMi5g<13y|0Vi>->FqTV_^|Bjg^&xy#c(XQs63fSb62ITzC!fb> zik8IMS23-dfAf&F6afp~$-@=`Eb=9Exg_&MGn}c-n_VV2-6EJ^yqNok&I zDvq9|B@S-Jq}>$8iQw>v$8HMBoU@50$gPi##s_8I9e`e}RA=K0wB%jR zQvW=hhi%3r8qimj1&A7vfte!fe!7=>W5mS7RaL5?ox9m<*1EOD^m$ayrq57W)2Fbd zwk3>m;=#sA32c3vP$>B&(5vl(HV)X@3Pr2jLVw2>*`35TpHC;-bAE>r1 z6I4!Rn{C1Kgd2VX1cUBy1ld$UDTz1}@;2=m9T)7c`)Stg6*X}ooGg!ODmXQ%#f&!J z^~lfD)|^b^%{UprGU(9N>oQLEj*H`Dk`_7cB9CeJ(m9zj`f^S-_S$hWALyKOGK80b zVJl816(a*1$ZOAU;AC&hIGOf293aafoQxtnw3(BoM?PbTSDUzGT2_L>!46bI)yU=S zizuFhUt|L+7-*lmvDp{Pyz^|7J{$2h7=g4uSrX@sKH#0CrZaNep~SNSlCp;}(CyF% z)PM>I8)KMW&T*1)&Y|?d{UIt{F6oER2So?U^pQijG+yA=x9y_Fn@zMIF7zZVy>BlU z#WMxDYq17`lp^qRJ(*@i0%e`TmctCL;yYf0l$2&;5EeHD*TO&|S~p5E!|1|vdbsmS zCWw}WJ~46*$jRQ)jxpty3zLhQNyGqXq$uD)Y3HbEmiIK`qYGgwV zukE$4;!EN&no;spv!C;%jMoLW+b>VC#%K@7EpL>kIa(De2yiMBF1C*GgNy>rh|&UN zKG|}Q=1c9YE!*STP6mjUd+L36P12A(ONM_#8p>-s>oCA5^ zS8y0V60L9`yZrzMlH0G`XsEloX1q2TM-{@wt<;?o0lS}`cO9a0(g|SzXA9}GAN`9c zo#_6|BI$JYC^Z&JkIv{(I!53~@hFS?XpMYQCb zUr%-k`QxBVXTNwtN-B?aAL&k{&-$O8ik+!y0AEXqEPs{`rcYZ6!C9S#Y8q!M>2tio z1(L?PuT1q0_!mPvmIEh19ynZmFAsf7&2*(TZ@8dTDWbfA~QKC|<1Fbw>-NO<20=L#8^kMY&dhezmp%x3mJdR;nNI)p z??kr4d2xokR{alQgd;KI(Kw}U9Pl_8UGAqy%b1zXtbyd z(ouy(t`wC)I_b-HrKk+ju`-mEw5SXMW?viM%DjX;ira)3HX&9QL=1`^(bL!p^)k)_ z)mxRq7Nd~!U{Q4!6IB(^IhQfr zApq0LxmcN&FNU%!lyf1-^&q7`dMv3PjDA}sK{-;+#mcvw3gufU=VIksDCc73TPWjV z<6>o7DC1&fTYe>!ZK0ftm2IJ%i&MLlbLr_wIhRC7%DC*)kuomJI#R}E zzmAk~xm-uexLlzlWn9`o@r#gD9O}4q@aN@qTsrt2-B_sOB6_kqE{CA^c3;I7NUB9u zs&9VlTip-0Awn*P@|=V3K*)m@L0FEVoxVyD%{fc)mtX4VvCdp zYMYIrfY!R-?Aom!_CC*bNyJmdmKE-XiY-=mdsAnzG6$cNQ>7@LirZvR+U(+ zVhfd2tYQllS*&8qbg0-u#g*TNHk8Kq1s%!bJEbF)U94gY6Li! zwQm($sL)~+Td2@t6Tr;Sn8=mm^2g2J=T&;bZ*vtlgYA>hwPE6|(jL&e+m$r$Zd5@VQj z_h2tecaMl==}tZR45cLAO@Z?;mtcogzZ83keJ<`*1!OC>+e!Z)Bt9=HUlLQ(3hst8 zGFiRe`e$U0H8oQxIxF$5QlKkoi;U=w6*Exzd-R!{$idb39;QxOTJ51VVPT`Ba`+)W zi)Oc+RxN4A>MAyQ^>gqg>i`MjbfJ0UVxo@F2|5tYNUzPhVr}FNODz*DTIH`(qD|wk zX_S-<)ZnNi+{3lW8Rs`GntutwbuhY;a%s{x5yO<0zq^N(qOzd$_+Yf3(rI-h_jr$f z9*nLK!X89XQfzZd#x@=b<(NuMD*b0Lnrvvjv7#vzIFbWleUTR2foy$|QPTuHPoiM$ za=ZbzryuLj&&jcCjJNv}Q}TTFH3c+BHpMe$dC-*k6Z;x4!(&8W#Knb0KTpCCFW;UV zxYdQR+$D4v*#p@Cz5yw(8=4Rk90d=t?9hb3xf0)oALJgUz%=q6jp&Ot+PX(he`wBm5Pv?q}UG_(@`_Y^DR@Q)#s`ca|U0s2*;5SB3F;~ANV zNIXD-aoCG(0RWv#g7^>vL+5Ig#I8|DZep0pDvpv{A$CP#E7y;8MU!=_5t5Ci$IwI) zpp;0Od8L1zPOcOyfG|9nEHfCELOprl40snv-aHcBzyS}z^&D^;9OW>sVh2V+@8BQ} zq~c=bWnW$VR9^N9KPkHUPFh{IKAPog?W<%U!$7k6qCnb(ms!NFdkV zm92Xwm;pfO;hGJCE2xh*aX_2=Z#bZ2-pB!+Q*cKG72MHC1^3v)9X%CTX5inYS`(OZ zsx`r6sMZ9fSdK(*=YR%zgaeB1-{*i22X~Tu72udGWX%&Ao#tm!B~+P zVVGp*n1k*oru=V+uCK{HDK@-G39)jMb-D5S8tIc{!y6Ie_(rS)3!4kF;qOb1l{bWqlU>VEdG@zDM}XCDL3mnqzqE2Uf-TuerN#BMnl{|d#UD;))5^`54s|zsGdaPt zI?+1&^m=mDEnL{;u5z4H&;yR-uF|#y({4tqJG*FmI<4Q4ymdW6|CQ4B*6XqIr`>+7 z0?)YpYsqf4+Hkwm+RdcOHFc?Zecy?Iy>j!&)ovsAS|rkbQcdSICqmuQLFL06RfK4TJLH;y>q?S zBT{Q8SJ!%p<1_2MMJ~+iv8KwxHP>*jM9%4nWXUar8<%k-S=QY>wE3Ys5tubPq-Lft z!n$smZ|ZTloDz$wqRmdqjG5%|g2YW$=3$=u#2|J9tg z$CDOU-Pr2)-*30NT&49EzY)&V99d7AL_W}>Mz)rGuO{lw+J{`LZeQUWp9xd9Wf!d`ZbTw92 z>opmI`ku`3wKW(EXB6Y@ZofNB`tNX92puEbbmA|Ty_%G1jZFjNG5xadnvsyW3 zljCM@Lc8@Nr%RwN)6Sn+Hv>`MO^Mvziu<1Q-Vd;*kWjEsvn|5ypW~+H_{x5mWYhYF z!R5-$rXB*%0i(fXGco|19`?P`H=lO5H#$r-z^w|;1ulgSaFmWx{9=fZa zeYHVWW8XO;ukNf{yrnZ~SiNu6s$%Yg#Z8M1x~ttx_bcPc)X8LAxD|Mq;J^wccsiHy z4OG{L*yWW#t1HTIb8E@vR>O?xa0k|sgPsVI34UI=mb?Y8aW*$?wSBo5ggY4cS;xIa zFWVEMnh8-&yG%8mjA||y)dX@WSY05O%f;ZVx6Bc|O-0p)Fgtw2nnWHbdKEB+FMDc& z9qh}AP$0qYR@2tVk)%5P!} ziY4;Sln&sW8+*4XU!Q0FlM)NONy&uLEYu}Q=(|R^#vEkQkMl5x)>`_iZvT~@KmVsZzmPugYG|PRJVL8@V$|X{ z)K~Do?WuU7eYKXWc)jKLI`>-YbwOXv^|~RNYOdFr!rG_Txog}qn(A=fE;KC_weDIP zg12bg-xJG0z~2O`-BRIM-loEHmC-?_$9CUvh3Bf*Q{h>5%LpLU#4Qw_dRgJAUy{OO zdv|S1w`Njp(Xg!LUYu@S--d2ouY28k*jESi$Fgp1rq4#ci{%#7gwcxKg0#50JEVO_ zwj&B&5eJvx5W1rb9&&Ze*_(Mgn6p^UOW5Q5LnqPR2n+m@S-MuJj!V2&(i1DIu~=7C zc6Wsv4x7|#fkD;8NLL8qblSXwTralHzzgT9>pg-=S@or9e8sVQtDVJk3p3vKQGo}e zM{;YwDXm|##ZRp{>5A^C{jXs?M(92}X=J_^xxKv_%vA{vJNY+*_u>R$Xj9vFUu@;t zpmWo1w+1l9aBw6fawHIX@(wPrBiD6wZC{G7UL%r~D?41iNN$r+dw;Ml9(xtK8vc}kV29VWym8zzM1cM0kxs8-CZvbm|kZX|2 zW4hj2y~azANcMDuuZcqip>oarXrVKBIxwqunpv$c-N|=q=Ke@fpK%(SWnKD$+Uv0) z+q~O-3sBpQXXNZ(ele&gj5>YlS$=&+%8Htcr30H$xl;mEwy6z6T-B~nuNhXa{=0ea>J8n`}c3@=Bh!KPVhv8#b z6$7?9+1X&VmZ%Sm(~p{sy3~W>Gd(uB18yf*D<3|l@HPSB`eaEmsLIeV7eTKulCjW# zwEFh~EBTNdJ~cFcW{y$VsHsrY&W7Id8i|HjJmalLL9TV{(GGj!i7tgy;x)o2g%k>( z=*(^p>lx9LhqXG z@$Lc(H-Zr8k(F&;b?hfb2{{nxn^s_a^J%Qel{u5JjI$VD%Q&^|>XD4Ee!n-;c5)Gi zeUQH2|D$evHTLWf=RA!gS1S@TN=jDX4||SrG^Zo;SmkX)W4Jt$%38^rR!j0-S3Rzq zVhMp__WY$)v5kr9ZgY5VCLZ3)3~7~UfRwku zLl(Q(!T3&A%TRk)4|X3WeaBC7Zw71>%>@<7a8vQJ?7PHY_V6N`-`~}AO0a{rYZg*l zy|Y&_?(FAzN+E;7DBKf&^2zXD)cv%a&E|VtNXCwP5AT$mbH=Q-Bg=;8ccNQOrB2gz zoL9$gJ9(T%4ZN2tc?){rQ27BcKUXv1+!gbB3su2-Je^zjtku`9d5y9U`^6mTf2*I$ zMs+VsTE~JH03~cu>b5?`a@`y;Y+k(_(*i0t(?|XVJ~DHm880i;9{AXx+9RjMFm0Oa zT4u9b`7nbvjWc6Vn_e7He5!`|e)Z1Uur)iW((3h6K!J?OYLcz1i`f;^l>4apHPe(g z>dA{`rVIaB!Y{Ldo=2$4C*`McERn&tZZ*EeTCUr3Qzt=jMfWgGBthGV-qo3A_|p<{ zTK$DNVrgQ4iN$ePH~l)FQXn(!!^!XLWpbSead=%w?+Yx|G!t8i3#)WPH51n6KyQ}n zyr7s^=CH`dr3hAvoi8G?*{{*;iQp>k)Msh9`Y6n_2^l&2nj^FHoiTTELQ5=l;wR)DT6INtu-XAe-T}ZuAjMQSX2RsLxj!-wz}vHYjcC| zV%Tb*bA~Ag(HKry>|~q|tT7+WFi?uQ&O1DJV2!qK!Odq5JP#~j_CvfqCrdZ>jyFbV zgZBQYzQJbS8{o8f@I)f{U@wl-7S?Sx)IbXxzgkcr24P&VSG-C+w+9+7p^7>7J!_R0 zvv#-Vm0-=9_-x6I0C4>mbB4TuuPPUJB7N};eDzF}KJmLbV-=?Me|nJixBT?cj-p6M zQ$D?xVYUZcVA%WmW#t~BY6E8KXKuE~me|{{?Dx98ufgoelFwbIQ2fF$b6|FJYbP@Y zmL{BY$<4qcc8Sd-Ygy_aRwRd@JIs0x2>r)0SdH9KPu>G;uvJY~YO)Ex^7FgX#LKh- z@klnLo$?gR0W6t%57WR0s3?{fc~Bt}%FV99XyDowEVSF?m^l6(x=B@rqP>10 z+Q;dAzaqMVlT$%+W|(Xt!%=_S+%0^AO070vuQDrxS|kDna46h6{fxgB5P`}zj1PCF zfdG*zU}A+EFvpK27J_056DfeYm%Eh3v&_>w9^y}I#hk!>MWl>-hw>of7o#tu0TNOm zG}m6BV+G@xU3e_v^A-taUlCE?m7&4jwj(h8i_qEL^c4F z9x;AhdgQb*_57KK`=9wBuM(he2Z#Ir)fXiR+>`m$Q_b2usxImrs z{8#v;#fS8%vpjiCdQKPY)rbFp3tyo4NOpx`=i-oXh4d6a37|NoXTGigl9$6fme_tTd@6nZ_qp=>d?5dL!kj#)`##D<_YbFM zIQYH^(2r)fAyw3AgffNG*9W?UA4sPN$8F6HQOj zk@O#==dQ%EzqHt0IJp< zy|;jUm3w+`1?Qb}|Ks{e=l%&?ANSMvC)U%wclHi(y~TC%tXluXMaqirO~dSW*=m-S zipKagmM+}QpA+A#-kG-UzKhe=J@!j??z!tOLfUKhq(AX5pLr#^lYkF@g0`d^@jdBh zzkc@Ts=DD%Snt)1$~~$4Pj%h!Cyethcjz8gc*nE?4s9ruz2#=_;L`Lh3UMc2iBzB& zLg6hQJeds%OtWss;TT$HReX(gT|$c$WjTgKMh>yK%&lEC*m7@mZ*dg=08v;3NGsjX zq1kKq76q0udSv1{nMd5=MQQ>-V&-=?pkB^f*rng2!#%z4b($K4^!J$}al=VBdCVb{ zCRcyp!_uPMtFw@i>KtEFzsB6s8q+xAmPvFVQ-{>D z8Ml}02%Rq=4{DY-#d>o%+wCsnV+*XoTX+G$AP?tbW2&A*%jt=H02x!}Q$eGp3~R(syPa zMQn}%i#BbHvHEoj5f!rv8D3yq#HrY*=)mm26@kNjFXPEN*AIB+o|*G~oM0+<(fI*7 zar?Sw6?d|<-XrwuDBoRjB*oW2%3==Y{2a{rIY`VQpN!cI)EI?L1bQ%l(L~h9{jmAy zS#D473d?Tmttj!k)*~oab9E)SwFD`G0L%{u=H-s$s`Ll$Ovae**`pZm(_Zl$JDE(} z4>C@}8gO%7CVXVB`Eh**#oA36Ikw#bk7JZqz&N;*1ngz9eXbULxoOYuP+j41L|?0E zG+4h>b&!j=m&SB)ii=Wky$gGa6FyB;jucq7Ul%I^s#=RD6rJAV^PM*I)nHhw;sbqc zt0_tmS(MggM{x#;zq#qPw7U)m)3cX94N6aJs9~#y#Ed6E-tP>8W4O$dRc^pUr;_ya$GPtbPVTyW3OxZme~m zGFmeVck}-GJn?4!I)i}n!649b&Mk|Wm6I*HIhTJ)G<81zwP4}2+I!8ADq<#t=fvFJ z!lWCksRj-+h)#1Cgif?2Lg+`JNuP#7DXxG(O2ipNpvHC)Xzq1HAPF=v+3g^ZBI`k* zxr;)e0(}IF41F#F2d2eW3T=0&B0~v3`!ICGP83AT zm=XXjc7ZcVM+j^^ThlW(OQ0T6IIAX+(yFBDLi#Feeq4n~fr1&)t!4qdqVWae2+0H& zp`s8UY=j=}jO)%saR;yRChs_jF+C}nNZx%iXQE7<-t_ytp|A3W#*@t08?(@lU`HIT zoJIz!Co|x{QDjUj$zFO&Z%Is;e+!vT!M7lDjbGIMX#QSg9N9D9WR}~LtEZydl4XmG z1E$PX3G<1v6Nj2`lj@wYQ5IXd)T1U5y)HA)y~CJi&oj6ko_Y34%(LTmhZv1~+js6jkop$2VczTR)B%SQ)xa))kG+t03+qCpf z0kdkpMKnCc=SaGX=gS&2#|awVI^sz}NeCkslXoMTFrcmX(WBvQNgMLACM?wqX$vp! zcksAY?^P0-pRa(_23R+d&z2FCmJE%wOqz}a=vI@X^dmDt2vHWhAj7QAgiW-^DW33A z{4mSu6CcY`P3Ap4qbrPIs6F=6fhB@k*AP?FN8Co*riOdKQu0% z)46Cpna1gaujFvGm1z{ij*3D-($#!5gK5_kr`svxmQswWWx~RU!vA5Zs&ir&9T&%M zzUxL+MWU`|l#bOB6+QV^lU$otiDVWU-^MwgqN0$}4OpF30jN1` z2h0=8GJtC==gJP273XRvmC^hmWt3m%5Z7%a{;BAFr1`QyNqzymwV`FV2BulA+IMs{ zTNF`=XTO$NhXps>3@Qq%V>GwZA?GD7Y1HdB7F00Koa*W%S9zl2m78(p2#m9k!C|MP zn$i8eHtwf}?8Js<-E!#E5j-1>HD2UX)=u8K+Um7gb#cv`wZjXLmKCteR16Kd#gI9) zZ9Th-l-I~R8hJ+}@03SAhI%aDa(VO}vy3N4jeabQe!`EQ(lkRxPnj^3v~ zdQ|cl96bR?Vf1p=`_bpEoBj#GDa}{IUUX(7g9}>Grq4AuC(jS7{C1zRLzoG!a#LrD zn?BZASkaVztz|C`e%T9~uGiKqTls}~&9bhzrq=R$lBrNPJthRm%$H%oC;}o-NT4B9Q2Roc zkdQxdOw)=hLlIScis&c!L`7v68l)@%k-J2a5hD_){F?K95$V@IOsq6eBL6vI+WJj(B0CPbk7W2HVjW+$$#}d30AV)-iN@l-auZs)#k`+ zv(SgUBtS7yV*z;sp-yJ#do0;8h`dt;@=|?V={^`r1@d;>lp&f&-iZ;&8|c`O7fKfL zQoOW;yhb|(iGaK|@&WXfWxpBvY5`~veH%Cw4K+Rb#@j((6%+z}v9u=A$4`M>f66l6 z7Xo_8IYEgA&^nn_C@e14^q~x2>2a00lEG#>2i20M=Bi~(R_0<85`>r3#c0J{%#TS; z4U;rI8H6qGiPW?D#=L*Q1dde+@dBp?tx?`sgJM!l;9yk@VY$?j7t3uA6FB$`H?UlK z8<#k)f}=E5dE;uT2ggO;C~;98r>j{nGp1=hRbd*>G*yT>W12xcW_SnF+#2uN!aMk+ z;hh<@hIguvFqCOFhcnHZSTfww;~kk?fhh-`t>(B5YZlYo#ZwZhyMSEXGSFb|GTC8h zY`T-474xx0MbYgG`7h>O)7@Q-C1rb*N4DZ6ltIyDRYSQSbTW$fN|RxW7hQ5}Co_63 z;Ka0Kndv8NXlDq7loHWPRP``edpHg<$2D_c9-@$!X6RzXzY$$19qfUyseU57u)yhl z2|cN)7tNOR6F1+7Fcf_c2m{0L*l0*bP89tHVd!Vp#SB-ho3*WQg>W@`OhC!jxI+J2 zcK}x=#iN8mLvckluya*Qsas@>c;qjm%On(0pi5U=G9YDF=px7YOc^NxeRoWI=);d) zhFSRPJyK;+^}+>s3bb@rQq$sQ#_c^$P$Z05FR%g@;T1Rnso#x`>s2_SnB*GDkwd)1 z>u&7}K#rW33{&4wP&efzh8zRx+W>M%1<1HbXujYks$sT0A zJUkpc#Cl@GjB~)!v0+shmKWNZU1nK0#4H)cV4xTyCegx74YPDYjBY-;GKE3`HchQX zEXgXdZ1IWVj97ueIU}}-iHY)!dMo0Jr`uuH$27Nnw`vDlN9Dg>!u7dAvhgR|0*)A&1Zxwz_%iS#ivy!4Nv^c87( z7UuTq#41YCgxaw3olsE)QOfGO-ib-7a1l+(>r zb=5Fe)D$9&i=J|f94n68A!&7+*s`se$lYYDq)}QXOqaCNyX@LSEuF6g z+2t%Bo$TVZy-z4;%7h^MO-1TB^G~Fh8IwBB$cJ1~$C>Ms8y>HH2+hnvSjB{~##T;( zoDum}W!e8S?vPQmBVu+6LbLK2o8w3}*hH!nE1?lO@Z7Y@5{0SAp%F-%4jIp0Ob$>- zMpY)#P-VjClF892%UG*cnNT?}2x{v3_*ow$LNkZx$#;~N)#sK~nMjq{7JQWZDiiw3 zf-_ZRqLr)4gs~mUr?&y7N#8?Dq)4i1m7%{@eheLu)L4KdFLxIL`Nbu|GXQuiBEfE( z0xDN|7LI*LdMnKn7q29S1W2K2#aJktBdnMB`Zi@%oFso8FVJdLoFv~bhu*v_Tae^W zSWj8DfHk@We^AD-IeC>7^ACwhNaSg1MGKghFUFEuF%~wGgyF*dskST04}<~)bRgFz za;@V?x;x0OnW$bw(E;vFDur~$r+PRApvF2gtK={b0Z}u;co9vmsI-c@>qVU1Djj3kKKDM#_#QCoS zt!-KW^Q6+I;AVX;*^wU7SqBo4ZjeNhkWAg+6()h&S)c&te39gx0`^qi;2}SKDoUW3 zNb_?%HXMdKLBE$jWPp!4l<(MR{$4Dy)eu4pyp>`!coNc5Lx`$FRzt{Y3{gYKY79|B z$Z89n@U?}$>}v~AOUP;qQA=p8e)qhuEksQrt1a}!vbN9$eNSy6t1(1vA*(S&Z6T{M zL~Wrf^*yzPti}+vg)&_~lMDuG-&BpEB>ynzsGSom;fMkZAzYQm|4lAXReI_G!PlpU zl3im}hDf#C;zao>LvZ|{Vo`@0%H(<#{|g19Quj20+xmk=yBo0NyRM@JQ-=R*!v9j@ zdi*akA@?ZSKCG>)G6di2@V}w=IaEi&;|RD$26V4S`OpfDvcUgY&sP~DCA(D_qI!^3 z86r3P@8~R%oc$|m$?E>wYRUC}LM^G^t;!IY;H}CKiQ!dcNO|I|$`EPet;!J9hOEjE zRgA345Y>jP$`I9tzM%W5He^+Xs5WF(hNw35tok!wWoU3ostoZ&JKtittw0QU)4R}I z8Y*dV#;G|2ZF4y9Yk;#3JF0KM>4;U0V@V542^kdjFfyoa1-M)~B8X{cga{%+PsVJo z7>zw^Q5_<3%yDyi8obBP4R?R6HQ0*y!CZWmk_M$B)tk*vesy1MYZT#X+W*^lh~-OZmTjO(&UV6i$PRWpW8`Wl ztMn?H*yWN6d?;gV=y~lC>6siM5+4)|>+Be8i$mce4YrXyjxWT|G_$U!3d)?z5$EJP zDxtK2T!R+EHGD=FW}~=<5$VE>@EQ@!M5BH1?POz$2})3njgj%frt_^%DRaZJHd>S&B;!In0shDKM`qj>Jp{v`FhQo7l|x&J3E}RVA>43H`DHk(-kr7h`T4pvrnfkeEHy zwn(M*@Gfu?e&HhZ$Yt{M^RdWola4aN&7h&u2zRqEsZS{PFm?3ck zBenF5&OryQh90%_FrQg1J)?8bL8EggJe`9M8l8g=~Vd4jP?<4jP?<4i5Al=-^N-bnt4m(7{b=p@Y|`g$`b;mRft)sioH5qS|B0V6$3k z?Om^yT6;IBrPdx*LZE>1aL2uY7~>cW&FA9rzq0(2KHd zpBtnYF5)g3u_{E_Ci7IL5pAt1wxa7mMFR>j8 zp-l2^!se~~l_Up>g!-Xu!Z%f<6i@kO_@}1JZxJ{9>K=mK{S~Z{GFF3 zP0gVat(R2I(H`UQ-bOV?$!77=X5Kaazz9AdU{H4QqXD|MPlB$-ICS|A9Vb{y{j2{c zKo^cPSWi840ZUbgau9+dswDMQ2(r?-RjO{qb>9#{7tHcVW(mBa$q%PjJO+oqe6Q18 z8IPgGGB(amp)naP&o7V=XBm@mBNKl^V}hI7>QoKXwGyv!<0!8I+ACRihp1Rx%|aLq zoRy~@RiMK65Pnv;dO3t=_5MdTiV;O`EGmf7Ok7ta_C}sjc5pbTnr@^>zhf9V=Y@dg zgw|;fDo(ZYk9HC|!CN4c>>c`RtXR~pt$X$YO$oE}XjF4Y~& zcaj%6C80{oGSL&24$~SwSLraV;qkJA#}7)Ril#T43AUes}GPI3spIbRwn{3Z?J&Kbgt(;iy zHhPQbS5o&OCE;Kn_y#&^DGyF3!yC=dlD-#t8=`Jn$T41Of#9L$k`TFxhDT&HoPh-z zD=r5`-jVj%HVzHQDMwU^RK`y>v8jQT_)E-q(EnxRrN!jAIR7vl%45(Ay^mQ@r0uh- z?N0j<_bhUSA4QrI?Z${z4>zyzQNSYF6Aq89hyig7g*TTOKv|S16eBM{xi${UUcMb2pkIbwz&rPzL2K&hjKESuz%y?j*`Vv-0Mr4hs3m3;n+>$PhM z=r40EAk#s8Ia$I#FY12=B8UsI)Mi)|ffKn@u52W_d@#P9P;H8~2&TohZ2+hv8{8!v z&z9k=mXk9xU+^3jlmxoW@|pHljmq*Ah-4JMUCJ$nrp4%_qW-5$##?aPHP3bl(@Or8 z5s0KZY^gHR7Js2mlmBYIM^K7l2N4O=U&9mualMmZz~OPN$SED%nhvY6mzViDz$ZY& z!JUM})L5qwU_11SuyF`lT8a&wM6nU48+(S0P0@023ZP_MfoY= zp7+Kh6ctWi#*I$`X4035mwa4I2|w$j&!d?eF&?!`;}L}dC0O_W22Muk2XURYj~Y+L zqs@Ff$#|4bFdkJs2^4aG@#yyv>N1Q*|4uDNq%&&KH~pSkj7R@gE&8-?sYRc5S}ppt z-&Kn~?f+JbKJA-o(Wj9ufpC;tqyI}S`m}$e7Jb?`)S^#A4MDAuTcfY5MW6OHwdm8( z*EKTqY3S=3G9IC?Yh>ut(APCG^l9kp8X5Yu6Kc_?p|5LX=+n^GH8S*R=<6C8dNdR! zjSM{+`Z_{dOkZb?S^~@dGv-#_9pJ9aF0vgh7fQh=R7EHX#JDtaY%=gbbnZ*B6g5P< z_ldugj=^q_tkbACLo`g*Y2-*YUchYRl64x`p39yy*7H;vbkroyxFtC*iMz2m*`Mx6 zo;B&Gk;B#TQ2#d`EiqgQc?6qe!386%x|KRmm*QBv)HJJL@Eo3zf&{JN!kHsU**nm-cYZLUnIe%hqk+5%7GH|fT^b}}vkI(Ii&cQ!OIv|MtOc}K1=gs=DnLo&t-#@6om#8{ z^J=jQP`-96dSk2wv{(huvY2(8Ic`O7jJ1FktH70Nu?k$J7OOy}7OTKOEmnb{TC4(B zs|8bSQVXWKMlG1?TD4%R>(qj&PzCD~m};}fRA3q0oLbt}X3*@DXb7YtGk3E`mB|7t z?N5f7ep)ixxjt^|V`YQ{BL~9#c{2lJB#g zY4%$VQ(0fo?6>ru!pxltLxCw$VJI*~DhvgtNQI%m6r@o%OhKs}!xX776qtf6F@`Bf zgm0LFIDW$vxWO5wptP`I3aYLcrbvaM(Cm}t#Wee=Fcg~oR2T})eku%wWwr@~NZ_ETY~<7&ZBX!cWKsNYZvhB~Ge4E3~HH2rAy(+o}jucPX9)op5= z2?JN4RPcMcAz!@~YR>a3QZMlB!KVpIx-maNGuh9t12Zg!(tJneg$uc={vk_yv-2P0{eBWOS=kR$l4Y$Rcfix6qlut7oc zS`to%gzMLmrT(9;GTGrx%lhc7nC&E4Un_J3-~wwpmA3StubGeBh+@nQauBOMDCULs ziPV_~58x76D$e9xIxlsxROh(b$=+Y+(BMm?Lqn@M*gq^Tl_>*_>Xivpm#OmzJV)KrWGjr1Dd1oWRRt4HFPW`ho zNMH(Kxm&i}hL`#XYv81(f9=z8-sm6PIBY1su0FsR@09AWepCIA8ccMtnE)ECjzC0b zgrPP19|MpVIe1RTa5NnfS>V;7`r>$sU9CZ8!sZ}_9n>MhLEr|l#PxjJUASVNF8@yX4z60*74wq}}ayRBgFo!4?MeiCH8At^nX?IHfuTfV~K8 zK7VJgE4!vCqOAjyY{k&|1e@q+bPKcRBwM_D%w4^PxPstm<oA0@yXVZci7e85D&RI> zt#nHql*sZ;eR*E%~1U=&_vQ9|1TQ zL30Xx@%LlB*__ zf68I~L>~QwHiPbjHL>oP)R3_6btSh|PJ}pa35BV2=_zin+3k&d)uT{?S4eWp0Mg=@1fJ6ULIj5_IK+O?Woe0lLAQ)=b^jFX zfP_Xfgf9$i2njQh;}EWLk^uQc1Q$JAONS^!#$h5X4+n$k5StXlb3 zKYjojm&tok-S$ZMZ9Q~|bF4n}hY&Rx-0iVCQd{>-CsB-IfW#4ZV#1S#hZi7)a$}OU zs<%SaxGi}v$I%C0uXGz`MfX5==L!$JQQUw%kZJK=WzN%JDYxsXf#4F^+)zH~uH~Bh}(?D6`&A^g3NoZ`&>j;OV`4FAy+w zCzYHOx645T*}n_~yS)1>*n4%52^$*JG)DdIJ_i9F1qurY*EL5`AX>)IeNiZoj0EBS zi$Q@>cj~Pb6vzNB0SYt`i%DJx1vWYJ!v4dWLx8Lv3zdp9yFZf#6E*Sc7G$jpsyA>Y zK1J+RNnfvb^fiILUY{TS_bmHqVl2f2-4A}Gxlb57%~gBg$#3)ZU*I80_xr%jS>x6S zrb6VDrQoHD2}DeL7^`p32rdVaW0U~R@+CLkAAV!MHY`tXAAo@S2e{zW^ER)BdH^b# z)C2B^@3$Ym-y9GOhV1$Q-KV4k<(uW!G5L*d)d1%J$>C-GMOviMm!-CF^Z|}c^#Lc% zKk;XuiG5I!oTTz+xxOiiZevkmH1PS;)$iw*@~5iTsGJX1ugP-#WO;4sc=06#M?!Vc zOhS^jWSD4A*aQxxQ;$zcJr19MN}a5nq=H7nfl_^1JP-VK;*{z$sK~$5u>Je-@QioA z`Dg45&$#`~KVwUH#84_=JCM&J{M-QFzzTwnE6BwItdwmI ztr!*cXvIPGePT+{D4htL6<`bmSht}SDe>T}5F0&bRkvajkHETlw#K0q9%E>wX`GdQ zAIS+Eez8^wNCg{-(O>fg0AmAj_YZ52uw0LOWCI9l=K5xf{@FfEuuf9F zlx%ezWWswa0AxGQGpO69kmgz$&%B+)1xk2lXo}zOG8DF$yc?l`%l9}GC7q zTN@V}D2Np(j`DOcbLxe)TY*UeY3_^3Ai`?%i1%~I_w`A}sCHkCJQ;?We{3%|J#uUG z_w8!c2Y@=R-fvfp55Tayum7HPbjyyP$_*fe+?U;RZsH?;DmO{A`iq|muQ_4A$de8< z>kTbks!*P=t(EVJJ#I~@JqBH4}fJLNfp5ksq3u@c5Tqd za>1@$k<=XeK|C|`(>C;@Upe%H-tHm=JNxAiUa$i~O0mwUe{EP7ha<_R;0yC7Ukw~$ zoX;%fzscod6y3ssrOF(nm+OKwKUH2t`RWmB!Ih|m3rO?SqEsA!!GrAddLi)0?2UgH ziUUAUp2ZW$w8MH1iETr?7mR`^X)3h4<7szOv|CvqWKe~6Hy!Op{sh?M%x4C1Y#I}2 z_nUr3g?7KWX8_k-P616cG^w5(5L%;enrN@goBB$~i`Fz2=n$4r97kY)L?McM^2LXc z?>(uOE4nRaAk~m=(=ls@ASF_^VrJ9snSNMWo?lLGi}fYM9<_`Vh?}$>^MPw}gpXfp zr%>;h*2_z0HD*@>t+ap;HPTNk*2~2==mby zyDqG}DdwA=XUZP*OO|!ycB8Mm!oR{ul|VZgx*_*I&@L{_@inlQH^;NKnB%3ehYlna zb37IsLQw_+D2i9?LsEglK))BI)Ud&&C3xNhoUttFgKN$)O(RmI(2#-*S;{l>%O{>Np zG?%3-X)a4w(p;9Vq`53z3A~x2HW+**T}ji@mAnhbn`yw>`Q1#L-_3N^R8%ai`Lx__ znw4}V(}L(G6gEU6Ov~-2SxHwi4YHzxh;JXOprjOj!j)ARnLWl6!bev!vR@Xfpfwf< zn2sBod6y0x9@Jz-C_Jd^`PvmdsKdsW9@Jr3N)KxE1I0GG%pfjVfUt0g2`)epHQ(5Z zb5<=sKzMMOBqzMQjCgr-P$y~j9kR=uHFLSfa-e;-EEwALDRZ^fo)g2vZgZbb{g}Zt zEchGS?P8Z9y0=FEfb(vrii`@fcV8)I`3J1iE@h#5KagQw*G+MyXiUsi9?QFYuW9B7 zQ_A`KcA<)~L(;Ir(llEJ4(Yink}xRo9W;v;$B&eW5_07=Y=NIRdLp?Fu3O+I@3@Hg z>CTG_m7^A{KPC>V3sxP*5;Oiz0bCe-p(pu^_z;iy9;4z46fl_fNX#wgyX41W3;8h3 zKYPYSWHw#A@4LJ+izhH4-nX8;Ydqc;0*y0^1aCg!%;I)}c;A{)r{R?f$BO+XD1t9g z%8&@-l2J;GF+VIyY2fc>Dp)r~`-;fn{DAEV!8l+ST2iefRJZ1xWTx&wo6X_6DSH2H zk#ZhjMI;RZ_`_q4AHq z@hNZUd=6frMi@Q^S&Vi|QbRjSBvZ@+w@4kH zC1!|RAO*yHYq*V8IfAgCYw(gB()n@MziS;umLKd+)={MSNhQCW zM8%Z3T7IX@9FOl2x6L97vG<8}6D zW?ix_R;Mt*6WCIZvi6R?_upq^-MOY+?XduEOQ6$Az)Dl7Q+iHn$ zIH7i%MOaWH*CH$uAB&avSgb@54#Z+5;-1Kzlqk}H2#X{mml0WS68RRQLn4)iMOY-+ zjTT`+O=63%NEDGlghiqV4I(TOMP?9TLCmv7SR{(f0M%5Ir)m9NfR^sqf$FTMTyIfXR$BSGT;;jm!qvcZCe{Rj**>_^%-l ztH6Tdp+>Qw*sNt(@YHe)2vVwGz$*au0WZ;@Jg&oDOUU*(%h z9?RW&;E094tSQqz@EuWyr@uOv~ErvtSXn-mHnv7 zBzDb@p~53}^X5a-HN<_tNvcY&;LCXXLGWN?D;E}p+- zViPTcQ{w38c|}6?4u8l>WxbXM=9Ua=g}Bz0ZN|@5wi)dixnW}^w;|<;Y{6agy;m?0 zIEOLme8;HAy7*<9YW{zeSCmLccWbn1IFqLemG26f3~>$gQI|Ytb26urQ{DXUkZP9Z zx}cWhyPKkGZi{a(^?*EaaZoQ~TXB}flE{2qsn@jnu(g>kth zIStk>7UEqex204lc4O5n~vfsopJjiGR9yCn} zS70>ops5foS3yW|#X4CeY|Y`p0?%23s|ud8{8pBkIoxk}5UYe;YZ-Pz9rWUylP_vf z-T!ESa}F~F2Id3Nz8?kymg* zzI4z|i3?x_IcNZ68UH5W5nb`1FYQa56ZsZ#?o=HOKW-V!lsds*%3!9kb+3dQyQ9}* z6Tr(yaG#VqD{uw;UL=x?X?)rm!NuuQDuei74rqRb1T&pYkym;+M@0V^L%AliFJ{Ct z0kHi80J&))P)(Q?!n6`-AxtZQ79vysSCYX{Em{cEN}z=>tpo`hOe=vlVw1i{8*z64-I`Da%GPJ9&3;l`LUC`t^J z=`#teFOtVt`b-i`R65{IJNdav2gk3IpDj8@XTO*{CC$P+YT7`M^nSL>C>Yp`n7_6I zN`{Fhb*^x4Q!E2_zm({d#rY;-Hf>${5^?-Tl;r?8A-xj!oJmAy0#tmrD18$k2V@_h zLVJJ4_P%^T1un{m0~F$`DEn$)#8%$a|Bcw8T)mTEYZLwy9hdO-%D^=Zy@$lBfZd#E zIk6>xK>}Z<4w&zbWf=+`206+y6gmuYju#!aLPM<-UYtHBPokVWNR94#*zhQx7De-h zjMh**t)X~YL-DkR;%N=V(;AAWH55;4D4y0(JguR4T0`-)rg)|`#WSrbo@q_-OiNCl z8})uuJkyesXQQqS#nT#!r#-G5K(vP9X${5G8j7ct>ID?frwWQE0~3nlxe>L=RT|LOE%iaZwSN1NUcu;i1Ym6ISW8Cl>JkazA zGd9A6UFn#xbaV2sGIhX}$%v?eXzqj&391hHAchWj`P94=LkC(9bU)z^&$I;=jnYtJ z(MVT84dPKH4R$$G(uld6mBAl9kLT!;yYvY?k85z;yR(N?-^`obi#(osdE8h|1acHm zvtAccCihmcqsYLiHAy?fOAN`pxuJU-pmh7 zGSKd*KC{pzUn35Niy#5GsZoIeFJ_h-d)+ii{NDo4FZWhy`y{H3@%*epPaeC83hxj) z6AT2UdSikbEr=DDkF}N6WiM0Y8W_lKSeS#HIwWh%i z00nm#{yjks<>eur*aAR)0&RY%9@Ez%|rmxJ7y(pTd$Dh5pvag49rqC`tq!ME>{R z%YEd%el&{};E$Cs+-dP4WQZXcP4_>nxPRHh6rH9UQ@gQN2Bz_J3rw@$JYqWH7a|nF z+*@1f*c@?Y7~Ys&oo7{^7S7WZa%jA!#}(K zz`-LY_Qf9>?3Db^LhZs#Fryl9!&|bQKR4XI`|+R4wwE{l%tvx&*kX{GT4+UnZ(mah1audHO-rM$3K(ZY&R=FCA%fNWq171kq6x;#kVpAP{*jQ zM_3*=gbCsQJv?m*LZO{v)~9Q{Gug$843T`ZJ;SRD!Iy3(V3=Td6|@{jXo8XAY)Ylm z>8K4iWE<2)G4>BYbea!w*&^c&fqx&!EQ5oKg~(`dM~nHAfyMdX@+ZEhM`^pmh6R?u(+T=24JK(SO-W=-DQOGXVQCajNPK*|+Y7bx937_xfQ z&yi-Y#`fES?`|F_SNtO^|KI-2fBEab{Lg>%<-d*gTd`+_-n^k7SW1mJ8{+LS9NH!@ z4i`e9cLOgM`)&lyyrtz_!w<80XYdk@pJz-ICtuV5G7Wy7!1}3O0%^hS018gvJJ%a z>d-PG#xnw-+wUVbx}}4vuy|G)d;qc02v~J?hu=b_mi@}sXg=HSpc-=z_r*(~5QjkK zS+44P>^3PSdC?vL@}8gO7jB{4?lLXjHlu?FdlY3`gruo!rXQxb4(z0JvxeWG z>R6Mlg9twRNy@~m18;58HA)_jXyDDLO{jO_fspZQQahqZ z3OCbVbNxJSYg7;Y{H*T!dGFS!5&8*fhY!_rU`w|~&CuVxHEO#4CdU;mftxb-Y06k< z+>~{##{Wtv`{42!D3N202Dm(Dmc$60^eJDfKDSyN^K~JLxscd=8fOy zP&V%+eQCjLB)hU1h49yaTw;Efcnv(|A9e>Bza_kpselrM5aN7_ic9m^l;U6Q7`Ftp znFCsNfWd*>1yfIh9;ZlTA;QPAqc4I9DLu>DM787qU!P^#EM01=iB61-6-X+bBcp7B|> z^Jp*3{L{xit=Hol_PEi7I9t#vUpyyLudHN?6c7HqOyERpZ?o+X*a_?iIo;9Xf>v(A z5XHcNAhP+z?C1iPPk4azf96OG>o&IKk8p$o$wq74+6%c};l_U`zG*3Mir?I*mGBAz zFqGR`Ly$VW!nVSq+(ULOwyO*N#82M%BVffuX+TYcg%#{DRPdqB3n}Amw-sY;`KEYR zn*TXO1rAfyFSKnkXZ*oNW3di_C>_{}CmF|ar1(Nr$>@v}d(Vb=53kz}L+JQH>}%i} z8Swl8s6sD$Sz^G+I4@u!G9TD>z838TJGd$42~qn1y_+VlP4ho}jXA~XpiSl7La711Xc_-wiVZ5!-Q9!hVAtwkxSh)2y&h<4?U8yT2j~@dWLtrm z=3^e$XoiM+X7Z-;ZE=2-Ns9Jd;RB6c!VBW1qqK<;rx7C#qu{Fk&!5 zgmt$Rymm9c(acS!ZKAeeXpp>w z!A-#y^9g2ESgZE~&S*adi!}1B9MGy*GbK`0+gIy<3Z_=8ewglUZn#37%m13UDwv|; zhY`D(Sb%UauVe$S1Czcj8}LtYjb3_yi$QUX3^0(ljZ=|zq}d+u59r5{7uyICUkB80 zS2Td8sICW~ z*Quwq1vx_ z3;J(+3;GFfLC4IpN#9?{uOBnZ^|}u;%MEHVvusg|nZ^A2F|(LoKV}y5>&MJue*KtP z%z}=Y#VqKUSuSWn*K;eLt+ZBA@8;Bx_5BNa4%T#8IrTdejXColQ@=COBr4lrPW{OJ z!KvS9=^@h9CH*gQN;xTpE3Gz9O?C-5j?KxDLfGcIqyV6)k8NFEIqbF2FZ(IKLa6# zbrmBpwzXgh?Kv=X={NUc*^ULdBifkPW?`PhCHp==cJhq+Qc_+JdN?KqKY^eKeug#r zE=Vdx)7}uNTnU0$@{8bO%Jr|o!xcQ=6c_)EFnkc08XAj8P`4SsfonaL@(IUXjuu6g|?Lq-BT%Ae~kt?`{FAHf%;K4vk{z)+O z#^6ErT8Y9nReXjb21F~_W@HIm#p@r`5@6Q=vHQXN5SD<=cS}&~Sn%cqxy|iGjI|;N zgJ(kG`Oxv*(81C{>iT~^iwB$H{!E!gh3HboN%E-wc|+HyVh!@^A==-qBf z&Tyjy+0$y#GMtK+OKr=09Bx(UuO!k@T3I60AW>gF24@gDoXB0`QO#>m8E^PZo!EN5 z-m)BlG0{FU^SBfs;95?_u>TTu6_vXvttqar3Q`?fa2niu8KP?}JS@Gj@UZkly#kj0 zYPGQR<^&5%Z%(kV^v1%UNCxHv3oCCj`OR<;2PTwn{I6TCeOBCGZu@BCl#Jm z7K4jtmBrxVS(S*rRxGZscJ}6DaSupO)6Sd zuzN~g1Lo9^mj$Op*wLD4_@&;1 zW5)_hxV0kN_|!-9T%%gULoWZgLs}sw2Fn8~!@Ryn)^>E)(`l5(7>zl7H@kwde7Zw5 zEjZ%D(QLt`n}#3~#(IQRH^#V*=8tH?4W+6u#{BG2SPF93p!Dx zpLY^M7S8z=UYTlf<_QQIj|pl&gP!kTl~$3o-flROD5^oan?D6f8!|3%(@WN)Y>>_z zh}2;{$_D9sz)|409qCyMB5{h?;<-)=)pP5mt^#?+I^bWcPqpCe@K70W^vrk8wkhY; zI|fFHnH7`vi|92*0ONplQ~+b2bs+YP0>*3asI^+AdAaPk$^060iKdzm`%F0!q#^N? zvf<@tg>r<*99rxDht<^IE55gH+^vT7@L3C>HHymwTgF`mSjq)l#$tw^fXiO<7?UH3 zH}bOAt1gfP2;PTJyoEdA6Yr@Y6rcWQNN4-g=vnpo^Zs-H8IY`G4(1B^e^Igr3OxPp zDMn(vpVxJz`MNciQb`edtSE{UQD*-pL^|77*zY8*a+jG^;@joitQ+W>Ce8+WRky+OU9y z#67{5CQTbe^Tu7yoASrks%#k|1urP@JXOCY8*WRM%-ko3iP{Gv?Z zaw@pVnL{dJjFeu1=d`FsXAWtah@IvHAV{06U*b}N{4I9M^t`{jfIU@#jyi5;`*A=b zK9vNa1(?j|r#?*?Mu7>pYL4CQvpSNOCZYRX`pHMVjxeo+RPQEalzT>yMk#2Qrn8x(j3%pViXLz38f9hZ*_o^4 zhZXS?^H`=t%~Jo&8u=#mEg6BOPIUI|aB{WhjK7c~og#)|l|7n^EbXXdA=#Uu<1$N= zKUJ^7yGRc}h3zT$l#@%b#}pm5C+8|1oAeWGJB(S+Naf`q+naJH9MGb0jiU*qA&*Es z`E8aHm%IU3TeFnIJ@*jE%D;t`-PYU;>t~H^lwrO9$%SFO8|fINX&x;5VyA2(Wndnu z3V{||H)s%yaGHo5vz3>#ULBWDOZ9Syf^tCwz&Fub;Y?ar;*e$69N9ZH~iH*uA zWkofJIgdb-P@4e&;l&(V5R~+U5z16;di+dsOLWBbM_-`-SN-QN^ZA%Q&zOc0NSslI^J9$a%W>gXF-acuA>9Qk~=;XoWZ=If$q{vcD7vNt?t@$@%Qp6Rnx>r?VzVV_rGj9rHNY8oMzGP;^a$Q8n}TWc!#nY!tNVCO{M{1tRb8FQ;W{hv+nxGQh@5%w8Zynv@loQfnHuqL}EtV!K; z@n2UOt+tXALbU$U5Ur+;dV+ERqWQ|TPgxzsmF56i|1;!77e8bBsx2fa&4cPuiVHZm zU*GXu=n#horh>}4zmo1mYo%$H?udpvkbdMb$PvEmYV4GSGthHE6_kEZ=2D5aiQ-NN zHF)jQjXlH0rbufPR!H#AVquH?QC#rA$gxrm(SubLcFgiotWt|r6$gB?s)7;BQF5DF ztg3`xY{iuhhe}!;B{Q{HR|%xDd=yu!#k#siE%_)2;Ie!apcHeIyhbgKlGm!mQIZe{ z%SUmYS{x-etHn|BdbK!8-k=so$t`NJx^7i_T#l8r=-yxsEguDOdzOy^?$Yv6bltSc zN3j;!Y)DzxC?nAXS}E*Tm9kXeGOT6#wnmV>FH6OZPrB3fahrYI8n;oQIdjBWo!v2=CUcXn-X6mrnZ`dLin}t zeIz4A{uNool^=phw@P;MbhXn|~J z2`%t$#O!K`CosEO!U;=cfmh=RU6Z2N5?PQ_$P!tQQ^*oo;MHh}EbzYkmhQt`icYqn zoJZtDvV<7lREyUoIgu^uYhP~6 z?ez>dvez?(-CTREyIFR=>*}9Sf^0^6jU6=XwZ2lxAKJ1683{sN+G-xk_XL7zlM}bs z)`z}{K4pf{DBXp!k6h&9$ksiw2>`_JYVj_#8Ndn&s+IwZeD5y`Sb##yeu69P8v+_! zVMl;K7)XUhj;HK20!OX?4AI?=%+s_`r#F@ekK#eRYTuF=zn?t#2cpgrABY)byM1sm(AICf+?pXiof6}Nrm_*Hwe~)s;5N4JN zTbmrgdw_)W6|CV$`K-<72LK;HfE=LtWBx{`!m-XR1ZDko|3Hai-d!7H2BF z{f+ErY9aeWwUGU*)k5~ysKu#jom$BLCbf|LYt#}Sajjb7Bd${m+25=dvQJ_VBl|a~ zh3s!p3)$bQ7P5b%TFCyqTFCxJwUGSfx zMBl|Y^d}JgYASC6B}5gW+C5Q4sCG|O5vtu2;)iPYM14WTBw;c{+!Nx5diRuh5bE6% z6^45Elz9;9O(3vQ@1D2>5OGgj0@S!C?tmDFo}!Y8ap)=bff$FL(ozxQ&=cE1j6+Xp zsfcmtDfWRFhn~0uoTYloJV=Z~Pnid?*^sH&3K#U0dGI%MO^Eq1wTYQ2VYn>Dp_l!r zVjMUFf#pA0aQLoSw`TEP${C5*}b(h$E(aRN=L z03JhP1A#v3uJ*+UZ@#MSgT<5lBb*uwtdvO_=Y3!^WspMdqsGVXL;9WmJg$dRp%8r9 za&-!&|M!}^NmFY_-~ zruH}RbG;i^N(N_%yfI9hXPgSu#lRZV+cb#MU0Kxs%?2Zf!$nqSBE#6yQ1E>=jJ)T< zCizPkR!mfTo1M&eKE#vB4S<9JdQ240-j=k%$%%~nie>8dd!7wYC?uzASYcoLsp^9$3 zYHq!><4OO&XR>ZQma_1L2+{xwVmx(7g|N{}k;YTssC5ykh}hRhJ88p(=&lzqReznt*Kv*g(r-_~w;Wq{IFEdT`rk63%- z)`B!Tf{VL}7L5H`B-)!OjCi~M_4jAoDbo1urdq^V%)_m@SN8AES6Bs*K zb4%PA83)LEK1VxK!UzbR^}GGvkzu&P?k2Zu1bnFMbFF_I6M~;yy#&0v9@=DbZIqG@ z@R}QmA+EWNCJcXM)p@AfXg$4Hbpa0Z<77VS7ro34VdRYY`Lopa8y%KLXMpEues%^T zTjz-R#eRMQIRlJri2hm-vVe{?8YC$)sbH6gOlh-+=i5F9%3=Eql(l_QgLhp9rEomx zsVrMv%NA04Hp^wBa`4_^o3VBw0&dyb8%dL?q@LQlv1N1PWAu7@v25CgVY9kywi|V! zAQ{{tFk#s^89c!jB)Ry6Vm`pDY%Lee;{mU@f&Vb2o zzbH(GPMT*H$C4$q$AS{K3_ZiK=oyZGDu!bM8@VaG5yo>IcTPYAE4{IbJ5Q;$6>kF( z=zOGnd?lO@yha!znfj8zPE2M2S7hKT95|-|7SNH;Wtel~`CwrtAijdqPdFdue^H)~ zVudU7W!*+7z2+M>+D+FSqFHFsU7)Yz#T=h(JW$F?$w$gTYr0X(#!9il6~20VzO!6c z$3c3o8ebi)YehgpBmCxgdMA`c&Q{1arO>G%nh`7~tTi9-nM!x@1s_cY^Nx7M+nA)6 zqf8n$g9h}=i(#}9!*mJ@F>L$^Ku`Gukh}Q4u_p+?$TBW3KGt9Q?=fMl@&vM~tndUc z%f)!NPolBLQ#w|l;3@I1_jn4PlH*_}4la0UAYK#+O(AZgx^gW9(DMsQ$zox$a1191 za|KwIEDZCh9{e;M{1t&k3w|~nLL9kl)KUja(!cN!KfXUs<{z(1U_VDH-y{IXa+$sC z5qvBvNz6PVDb3ulspWxp&YI-%P1V;Q*2&9U{w93VcU>T_{wN;Z-C>&le5}NKsgzcX zKEF*Ml;nqINmR&~PSp1dTd4M8NrWIW_7Z0z1PaOh2C;A~xoJ7LlJA;*Cw56GgN3M$ z?OyoMaKqRE@7IKj}S>)UcuB8HTzcuMK)|=}M1VsJqZKlB1|c5>vRF zsr=>NIvMp(FA&CHhTQv5YLU3;Jv2zQ?{-%QWB26~w0t5T+pvv;Ct4r=;(v&BxTTEt z{d1_77L#{lji*t)ESmcU(+siBYBc?B8~#!mGb9z*`jWoGa<4b~t}m}s7P}2u({{d< z-*#(+6;f}(6|aSFYX2|WS({H!7CuXiZFBMjK1=To+u~Y{;($^QN`3d3^cH5AaueyW z_F8rQIDNN55^Nnv!&;3Ju~(mcygpP;3Jfkri0mFi84OT#&|==eP1 z2bbzatL#&z#~h3?LC`)CV-jfPe~1xt8*P~7Hk+kX!AgWuj1+SUk9zm$I23`=Lc2j~ zmGL?4439(w`S(bOV&&8|6iM_5KRQ=obon{$E?qABn%#v;&WtgX3G;JMg(!s02D2-= zD0;xbX@FUZu6+nT>*(4Uj6>L{?8`9r_4)6R1y#umF-j7!@?zXSJVj>l`~X>ZSE~q% zTeJKi*S)M+Tp!}PnYD}SBV4zO+$yd7DAzzy@%?eG%Zw|n{5h`4Ok6Cf+x&fu1ksi; z)66+YnOn+V`x0m5v#2lWozK?gCz6MjhVvPz-IQRNpYE&6^Kl-POtxCDRKMJ(d&LE= zjy8Dv1~*3=xm|3Lk3jg%_NAg6!F+x@MrA+1c{bK9QdlBVV&8(#JMSlf86j0Rj-A-p z{Ksqup7D(0d2E47Yi(oApXO@LzpcegWWpyukB|@==y{fq21fx9A98)0T;+B3^oO;3 zk%{<(>#0X_`7P30dsyxNEOrq?47iv~Jdz$*Q?K#{Siu!Kal~WI05io@QAP`$ECi6z zZPW-v32#4W$pd>PX9;zP{lsRnX{q2WAE~t3q&$*V+s-=^SM3IXMPfL(ZJra1YxaA4 z5$6+_^3$7g)9Yz^s<7V8cUU3zoT-E9#822-L;?%^=Dr9_{53GaH}WMj7a1+GSZ(JS z0d{0f!&}{}=I%CX86)GFK}2}`C%&!GTbQa;b%@Ybe$t!H=`P< zt^CyvFzVET*zb)!AXycyASy1VfH)S`2EdEAKt z%i3mffQskOfCRYXc%=iA07tOWVOxrKX)$O{N`P(KR^UJ*O0`?)0Bo2)=m8kO77*ls zQG`h$Z94%@4P(}^X<4xuhd=yIfSdghpOJB<1^ZWa*iL}si#ssr z8yzS*aM7@paUDuhE}{Fm=YaR$To0dsBYOV2xCXoGVut2Gt?{%yl{yWv5~7|;ph_v% zx}?1RsqufR?+IBamAtrrJf;`)pF_Gmp%V^_Wz?_bWF2Lm!#2IO9EW^e1Z%3j#jy_I zEp3^sks^l(8FlIcSTE8GG!=%4p2Wj#e4-6=BREKt?;Q(N5cFEx0j=ylw$7 z{V$9S(O9Trh>nGFLN;f(E)Jg^OpJU>Z+m<;5bH#61cpoU=PG?7;1Z!vRQg~}V1|?Y z?}COTVC{lVqf_?;57d?jSVK;< zL`X&AuTZLX8zx#h1}B?}_#CeBwgKE>2u zAw}lIx%cwx7$W03#lcGQv$IS2lTG7t-qcd$CwYtnhLMGFOZ3V-1#nu*6{0iBHo>LO zi}I1tGTjBYY!Xa*FLnl#SK3DF(kiV})fv7+c2;Awu2<4Jx};zbtrMp9uaPC$vRxXj zvv=AHpmoZN#$ZjXa`F_Wb)GUmaDy3u;b7Zrj1sZx_hQp=o5@{XqC%WP?mcX|P!G-K z--BcH05xa|JtaWHtWVzpF={!3X9wRr;8r$#sLu-`F*PVW<7AI!v{?eCo1>;xgJ!R{Zyo zlNH%btkut7(Q4H9)rj|p5xF5a~M9>&StS%vft`Ue>ZGb0;u#~3;5qc|o z%&ngLY06)+U9xy$Pve+$+_S_LX`Jq)$>@g9>aF%rI^47M4Zm@J+ynFz{de>%f+s zb$aYfttV@NnHQF*r-H}ePjp4gBGxU`UEucks_`gKv*p=d6!MWqHd!=RNG4h>A z@|Ur|3$2|47b!|&7gF#hoCUsG2IVDaeRMiZ(VTzv+^JtnZ;8rV@}V6a7rRJSjF)O=(Y%V8mMvpU9P>$`V^DRU#wnJ$>dD+`c!$*L|m1GElourPtAPj2oM-x4i~Kb zZ~;eZ5;~fqA2N2BjtlP01cU9|BSyjgJia5@8sJxW>EpT#ImMTw+oQsnDY3LsjUxi?7oZ0I$=mKU1aIejva5Ln} z#j7)*!Me1BaIT873s8jFiG{88R{3*PuVB|CKf)_iD$$RfEF6Zr5AlKmJf-JM&kvq5 z_ry8i`PotMyxHC@@T}!qm-3I65LSaF%s*Vc27JH&O9i;9c76W6>NVi||5mR7-#@Ni z|3P`t%x`v}3X}v;J>77i3LKQ6Dlm5;#w@_lK*Ry90qHmZmum{dI~dQe@&}OY+4;Jq z{8!5v*@64ts@IJ86V>ZqDlaAhIXYwkxn-ZLL;9_|M0}N(MV03+vTt8ajd*3li4dL?@FA zv>0HUGqi?e1+S<2B1amCH+(e3oEPM*c@OSqKs$Z?;gpzHlV1p~OY*}U@wrsL2BP-f zp?k1!jeosS47HK~$_LwXAG^WVJaNL<1#D^2-eChhISDIdt(F0un66OUOk z;`}(VILNLnb|y9wAy&aTMa(Z)i)+aNXNvU)SsLK5T7E|iS)S^X(v>yR!%nbsPZ3$z zKTUGh{1iw!$@e)`xunwk1?zc@x|U8Cm*g*64>Ck}WPXGmd@4+ho#aRD`=do-5F~JV zf|{CPb5-3sScDzP^GsR8ImhQS{_`OXlg~oA{Cfyg2$ev0o-ZIGuPY_uFN{Bua?YSL9`{t=((YSUF{{#gKO6A?gIYW@+w=u#2pLh}!t(^aFZ z(EKOpo%QastgT61spMkjmA?YnTwln<6j|?M!r-1$eFx5`K;!%W_ise~LkPC?pC&_S zex}KpBjtlgG?a(puk4jlUR6}^v*O`{3Vs%nRjA-+r9TcT_*rRCg9?5Y5?!d^XR9js zS*hS{w8dB%hcvw$sf#>8rpOW3QEJnuzGFMc7I_UEG2GU}4i!E7W9>2s&#&iXLS@l~ zws1%==AF-IMqt~~SHLM(m`t&jGVMFHNVCGYi&>G{(V;4IHb}2QMR+W09^0LLbU%9A zw!WCV*KA|<8Mkif3+e450ZD6x96M?o(yQddH}GhmLsJ_|3lZE}P015(|{ zj8~7SKh`Dih8j`e31Qi8Be`FmD8dA6$8{eL} zIpeGmb3!NQ8F2kk%P~(8V1Q{bt&2Va1Pw9sS*kQ1sm#fyZm+3wR4r@Yi@tw)YZMJu zF{?~JTU8j7(TSt8mgfx{ZTGS%#S#r*aaLK9YZO5|tl^@-8U@E5c_1LNkp1U-%&vnT zLr86CveVaX#4K^aZ%dU#*f*3s?te@%xXx9hCtb~yab-LSPD%XP!wT^Xt5P=+ZHqY@Q(BW2eh+Vxn@Q)H^kQJ- zhu#uI^0mSsvj__w7=WR62@c^2SL<0Tf;!&`)M*UVXG>70YXsD13s9fc?S>Ey1gCZB zwbfzeeoiY#>LeaLzGyf|xmCm2#a3-@eATo8^6D8`vxE35?L#}yZ-hW;Y{0zmcVKrv z2`tbhoVgul7uOmbO|Z#lfEcbPOhgIfBO1PVK*A>uEiPtpPREGw4|x+wZQ@?;xj;)! z7%(A@?*6bF)VH;FIDTmFM(h{#7?QbC-&OYOmMU!F1j2v;7H^(WRZ-@!IeC_0&t)C4 z;Dm=4ZU7yz;Y5&EI>6W@E~s>X&&gX*>A)+dffLLUi>2A~bf9#D-m{n-H{C`@bfQHM zS2f-$${+>44dsNbU`Mue(kxV-i++xX+e(Km+sU#+i`(TPEUq5TqO*TU_8l294Kn-! zqn0aQoUK)8>UwV;S40y>N#=1MNtCU{WUH#}5l48fGh8oZ>t!Ct1p(VwP6CYqR=Ye2bd8(@D7=RQyy`|z0+;?IR1l+KK!+}ESy3ji)Y0DHd!4_7t-q&8^-7+(MAtR1dls$>T`Q}R13+?rV-9kJ1U zVOQ4LuINj1Cm=PWcEyq&I9&Q+p6zidi5ncGczg&bmblb#C{SvnC~>KdjxF9>fJv4@ zD>6G_MFQtD0*#ho)nu_aq_!xUW5Q%8Aeam4Twc+}yxN-_j8YGBVrw}tH za)I@jFj)swYl2ZNuAL@hRr{Y{ogA(1b-MkF8oUIFw|DS_%wJ&e-Hs$mc}7E5f@U|c z$eCLsAWpuvG-JND^cb7vYq||c0|&~Xx8iqeEb=OZ@sdTJDj9?DgzMa|RyZi!rGr9a z2W3^s7|^A&A(7n<%BsE5pqQEBZNL^$H;$FYL@4cq z0RCb)X)1aE7X>GcV~jcG&MJk~+Lb|S7LZ!)L2A}ON*2Ynf+Q=NGm(VHp5;%^EwR{^LM+uV%+E!)RLGLPy z$aX%OZQC@i7Q8E*6ban~#bzXA6a4z5eY`wlhsh5mI>#+daipvUT{OerMjP z_Px`BH+nkNKGGPcg5zL5i4uh$kg z8l%v5W(TnbW_CcKH)3{Zi=m=O7P{aT92RCvVXMna@K>01b92)m))6%`gVL*P-A;nR+jJG~3SEmyo1$y6 zybC^*y`AM9#ShQXCGUa4U7?%J+Lw#rsF<@tH-ElWaaQ0IWyA{7%)3K`1KO*<>OB?c zU4UOQM+NApP$pZrIbD>dY)#cqVU0xg;HR*r>Zh=#>Zh=#>Zh=#>Zh=#>ZhpM3ytV;F2kPD~ek$c1 zD1^I=x440Y&`uZEXb=Sp{@T`Cj)PiTDQd82-i}Bv#0%~a;&ti9v?CI3fh5TZ%UBdP zWtp~5SiZue5cTBvj7(Ec9+Lvw&zU$je=Pl+F$x&8>xkH#4^}#C&Zz#2J8aGb))XC_ zFE~%bUbf88T#lVUrp5!My~ZfS4MWPYMfy}zSW>CJ9Oc97Fip}fOP}ncsM$*6x4Lpa zgIz-3B9l|014O6IqC(DIojKo=#o=3&I#2c-J{kafGQWLrAUmeA8{$MJ-<}vcr2{FJ z%1@U=n%IfNS4-v)J7Vh7k(7^{UpTu@XHqU(tgc_3L`Xo7MRO3kWG8-X2cTfK)x&6A zx2fx4#US~R8?baZ3W<=JaU=E$@L7=16Oe{OY4(k9R(QqokegkK6E~l%ZHl-NBQwGw zDTH3UCma;Kb22Cd5EI$M@YZHZqhr|(!9nu!s>hiB! z+u@Z$fwsE*>(H)PNqX_#{LOoQZDSQ__len4Vcb|H+>4IQ>Y%{8_lhTXg{x_9=F3s#aODbSK!4@+|1T1G zNOE*xEy(4I)P(LOnI8vE`d8YlFL_$bM(k{*T-$Dg{`|eDyDGfAA+hZ zfxk+GVQ5w4Wv%}=@I8DrK#--CKfBa9=pJb0BgpC3_gM`t2ur27pgGqUlDeZQ;N`|9 z0o_VB!mEve`&TfhqVf2=1NiA_s5h1wYSoy~X#?YNh25rGDcTwF! zh=jz_R^6iRenSZ?G=lKjMMWUWf?3c0G+@hA!R6fZM5RYAYOyk(`_sab-9qM9ZB+6q zX{SG^w^9Zbh;Nb8T)5VyG_Uo453?ZPvpEHYfc%96tUQj+p>=R>DWL?W3LW4NMIV+O zFa$8tMaP7R7i+SZoGaIWk~;0nd@aIC3t2%Z_O*d<*Jph1;W-BSDay`q*J@q-5V$)8vEQnMRLa1v(J(F>VDtV1U+DlgT_V(G4Zw+>|e}^ThWnYpG0~CoNZ#WtcL)nIuhb zF&DEU3fM;ZKKe?8kkZo$n;hRmPrO$djOqGTq7p)y=Qqb!0`7BkC6J6JEW}QZ1N9UJ z91D>qyezE>Q%N!4YM~gWj5CS>3G@^r8K)Q)(O#t(#&K3DMuJewU`vXjr`tP~(H&Cl zCWB1P2d?pA3Vz65Q_e!;ETW z%hPYj!Lo0;#jP6-06BUbP#?zuUgubHjb=2g;s7Bb-caHI*m1;raiu^b)>q*GJN~Zy zev(i7u7emhep+y)LUbTOSwyVhY0UX<_rJrq&_4=y!@!dtL1~+f^^L8DJm@|KU^MpO z%zYO7$+A#sQ1>Bq#Di&8N`4Mj5xP7r;?Xsj%bIyNkSk}pFBvEX+bClUkLJ#xD5I%R zD2c=3zuEKcWt3&-8?hyilE<~uL2wWyy!<66%UZ%rIR&a`)bX%PUmE3rY@D$$8pRcNrG zNWxv@r+}t%(nCY$>BMyzOKS$sMmo=k7DQ&xaMtB-S7n4Zm6xjNkrl79jDds1xe1|V z&F*vpRNR{?-4K#Y&}ubWE=y0Vt~3rVQO(rYw?UjWknH9jovK zgiVl0?fjfl$uAKTOqy1N1rWp-EIvihdqjr#&dEX2`cUt2G;F7%J;S+8QK=mo{UlwK zMN1sZS|8%1oQVEAppM9UneA8W$w0D$_|+;rHYbx`%XK2!Wo>y_68xn57(qq@*e}p9 zta;SasKe%9(E7hJO`j@T4ebEP_mekpF9J-qQ8=KMZB%kY5=jvJD&wAVkfx6UC^h`b z*GrK`iAQPQ*72y;?)am_X=$0K?;|d1+D48ig3j@t;hKATUDjj`zaL(?G>|>9A>AGx za(j12+4Rrs{yQI$QD>bZDfwY|m@I_5)6ptw$3HVa`N%PT zpnEaWsi*tCM~3T;A@Pqcf^-)w=oR9pF!mNpj6%x zz)3xmL8>h^V^x5Rx*)@!3lAW8kC*2nyMnh1?l>4Eg>3*; z^0)>jNRw5-gu$kV2_R6+hUGor0E_|!$MS>dz1QjmYqOgCsBrMh_kH2(QGP{!_KQHl zzgAVMm-v+bNPhTBz5{Fp72lahLRWGzRqTBJw7&k2++X=xNWkMa?s$Imj(77Fc=L9e zeV_ljo|w(;CVkB=I=K6k?*5m`_FTSB77vBq8eG*(+2IycV0XlduyK;#Ih&K-A1-J(ICGu?j z%H5vVf@dcK_Hc(t6i6o^1S5^X6Ffss4ty%vd4fdSm<2amh+r&P)x9JV}R zsGk1W^7NBDRG6BqzjpdtLKL6^^>m;M6Hfn?Bd33Xw|lZ^r{B)Lr0cpn`#c>Kqo?YD zdRck;`RN4@KcNkQosb3sCjz1QzIcZ;+koDL!ign}48msYgPnjl+aMlq zDwAm~-n$VeFlHlPjSV=9c>*b%Vih zgK6!K{x07VSM;c@?XbQl@9*KPU;th+jt_ddTJoABn#B(xj=D|r20B{znMV%=DE6=g zXc_k)Q|qCFw)ROhSI@wORtytDo^hG~KYQ;UCRcgid7e6T>FVz4?vlD&YF$9*6ard+ zkZgmHOW5Wp21LLCCnO<>lQ09hOp7Pa!1D0q58HIcN+Qp)Gm3*_oZwkyLt@2-M0QA` z#KcxI*u%`=8D-Hi2596$fio{NM!7%lLp?|Bezt?#WBI5XagnlL%YC`Ido7n5V2T8$5 zfC+0)_1bnfX*_`_fFeT$Llx?df+1xlRe99OhHziDL@#1ZOa?%7(PPEQA=WTP=rJOI zt{xA9o#Mt-9{BNJ0Z^Y-rDT12Bzz62kXZuWNac9NhD~(;X3EH+q#_tYy?9dh+ArI? z*ZiQ;Misqe#6Mw0r8gMi*E4d-LoZMG>p~M-;y@xIc^yXhCnW)j77S4;CWY;kWUZor z*pMgu7_>Vqn>oS}p8V5|t`K{RQUM{=L``4YPJ=FiN)e?VMNXB%#IwS76MUF{xul+~ z2;zzwpyr@X5EsDdbRZ5+!;(yA=N;m-c&3d2aRJf- z+&z#8trLL|84?UdiY~G9mxwXL+)!v`5|>4iS~j$p1W7Q8**Tp9U;w?}?K*NGJn&GBlq4MjMkG0hlUl4$g(JK8`39Z}4w&QHQENUR+-smEDI;bH{SZFn2o- zv12(^a$Ha<@28u@b}fx`W&j0lXWF<{=eg8IYU>n-YA3{KIan}1*77h*g)Ry_{9&E$ zs6N2VHb(@BXK}oizv4tYA1mn|Y7_SlgIFn|aoFSZ5YEJ44Y}Byb0&_pDq9ziEtoj1Bag zrb6$?VcIknLW45O92bI~av|J9s}NudG5m3CAy%~i2_vu)`-&@E`T`-95hmxuG&i5d zEVBTYn@?|!Iti#UM-P~8j#j##VRhVQb43-6frVQ($Kj7-j#n*o|9hjWoL{!k{Z)k8 zWsvHIE^vr%iEs)m48kcmwK8D2!|rO`PYZcVlp^-_a9VJHi(!=xSd)VSeo%ZNwKFNL zkiP@;?Yz!qZ#aP8X`8^{uJLeoLKO8`gzXBP36{6#Vjd2zuUS5kXNMphLB5P4A{>&6 z5eFW|segjATKC^^^h#wWytsHyFNQkktb5JlMLSTLv+kiX?)MzEX^_Q(jvHjvA)%Dy z=x*^Ol%x_j(C2IUYo3IPoK{FEkytiMpz<_Hs3gEhLfJijewrk-7D=e;^f-WupjlFm zl7u1!RCko^@jC+Se-g$^ic;Y4`ATM2tOW( zp;PkSNRsvh8>azpb6fn?xWzAi8*H&VMKf|qcdoAS<rMD$CFNjOM3d^xFlqz1oUf`aLMZf zm)!X>ToNuCxg@N0=|qNc$(3m8JSPpG9+%WSBA4{@5Qd!u<=vWot>(x5g8U|5AStxM z-A(OyDH4jW4Iva?NS25xMxBQd3cdI1wv)xz;mH59QiJEyJBwAy>wzH{=XNyw&OiX} zcWX-0foez}_K^LaHp^DVqYu_U$baTz1)?wR^-4|O4!`lefvZ97tz!&30s zFT-lT3~$fp$|xFJhSgdI6_Zdc$2!@#<#On(G+Au2PCm)BFd1uFt&B5@+UzGocvvT( zC57chw^2&?K!S1GWr7jiPjm}*wtDw7I&SeToHd)|8CTcaRnFC0?W)Hn>Ig-??_J{j zt8JFnf*8po*YT-(vJTp`5LA-o+L#;Er$a>N?20N4G8JtliitqMY^y~u;eO>VLKT%k zEmwN7XM%aQiGj3!XQdjG6)u( z08VOY^G4a8Wu&xJXDUL_H5L9By*UFr^V619Lgh%8U21l)U1TJ5(YV&QBdcWt*vECi{Ilx7hwzp%=!r$qCI)a zZGfNy%iRtV*=RWcW>M`$I%=l&bd5_l!9!fmr(db%SExNvQBB0oEep__2KU+J#2q3()}XQvJcez?Qng53h1-Pdnh$gXl@ zed|Kjb60O!$TD|z{X&-OswIP9D=W_q^z~MuaH4KmG#mt~r{4Kq=1n zNNv@GT9e%;hrtO=$fNQ1TT+MBhlw4IVw892iFdoKU=p_P1iq=RbO#M#o42`7duZl& zq;IF$vV*Ni6|Z?c4ST1|TDYIU@!RP}Zk;n%cJ79lL5SV}}v~xz0Hh{gN#i z_QfX%1liKspzg;kB+m$1wpEZct~GO4<;;oO99)%gk&o)SSz*)a$}*0v34xY|(zW^I z+8xQys%RTqL_oO_PP^sJ{p9`X2bu#JOAFAgEf*O>Br{b_SJ6M1N92r@M+=cxMJWau z4uX#uOWiY^x)=`bN8SS@+f=naJRIpl^+3RP1q5!SvASNVCJs?4h+tFBHY+*5tELs^ z0h?K5MZR-+m6BCK1BT|9tY2CIsqjQ!Uf*jV0|gi_sd*rajaNv`ZL9nO`g3C7Jh5ZR zwisovf^(I+Gs+tVM`_%bAjArfRD>&QPtyjQX^64*+;{Ru0vH|lC1_aOmx7v}`zlTc zSj8c%^+tLzO2+DKP2SGtabONR?wEvf&{DCO02V5)M9*`T9QxJ{i2cu`^p&p*#!}Z zeHD-ch)^c$v+f`{0Yw6dHxRLss*PN=Jw(-s57)9vK*MJ#5Rs+Z31|WesG2|o?9(Su zQsVd4=kHJ|mN{I7BwmPkzAxQ?0+F z_5pxN1kI}6KvRvb0D*<%QI%@GjJaVx{Wa}0q`WPzD1C-*TN@>xiIAjdSdI~QdZSBO zZbi`m7=^Kj6cbjr%77*6(}A??mreQt9VNw*Qb7lja=e3Os8TElv6n}eFkq{iCHxmr z2ZBV@*}RMfuo6)RMifZF3L`_SmLs%XpS0}bT6P(3s^r|Qb-QR1MddKO%5J)+!ERs> z#$lcpGyuX_72d571@UPrlSep z4s2sZ1_97v#Mq=THF@XA3c<#a^GI;BCA{h?nDKdl@mchW>K}n zsg*EEphm^~u%d(bCx;dz>YB zgax?WeF`ZbD93>*tGLvct3)r`Qs3$HpA34f9q?qtG_)|#}CAhSTaiR{~n`_pY5n8@r3%7N16ld=4jVUmfAaY%ItT;aw?Js}D&X)EAJ&X0Z=dwplz~+1N*{=b1{+qt^3mrRQ<$c|KNN zX^Lx~q*ef%m_Av*F8zAlZT87JDlWTi!%@N!TB>a~qU4tP$-4HtCC1V$9<#tZ*8yW` z76&RFw%_|J9k$<#v193UkECEPMyh_osA~L&PFq)=mxk4L37i~-W7DWWtY3}_RBJ-} zY(h+~oFw%+C|}2fwW5n^_4to4tKtMxZWe!mS|*d!7FUd+S-eQM7-a1DYwMT|<%M{< zeRZ6Ng}oE!x`6hMV?(q#BtZ+Bk82&bCi_{Bt;zfAO4U}k+cPK;%Nx_^9UR+wyDBC` zct(JXd&LUt+pjO*Hc`k6c-ajnNVgN3>|E&n$F@pSUub~mr!FMDX+rs}M$IDd1VkrS zzCLcm#a0T(%+C;y^V4Gd@Lt3K*%kb=+`B};SC>;=WTO+;Ce z`yFJGvNlqXTgv)LO=$*R0#VVV>)pmcrlTaJbkZe~5DZC~vD|yE4qBAMC1jxq(@+Wo~o7gXm!)gu=wh>^J9(PBTEQw2~C?|9SbBpflUahQ+q0(d8}N zl@vE_BgyLC-WVbt9>Xz2D+Dc?c0S?K>?dQIeLI^pCzTng#w@eaP9PIf5-cz2PrRW^ zmOc6TXw{f)bnH8g^vG5Qm?-NK9a9zzpO4CSb9`!VOPafqS#Dk{4nE?I`!I~<13=)_ zbCB;Oep=N5e&+{3ST6$*eNi;C2?{;QWI&m(hiT%|^_-OpheGg3-a+YRT}jxUPm&$U zCau;^gmzfsZN2d#y@|LMR{?B{+e}cKPd4pH^n8hSZ3)P%f*!|X9rM%m+;z$SKr%@- z-cKG;%g9f96NNFuAVEt?1V2usE(K{RsyBuXL804J92V3JQ@%~Bm?Jn$uN zoaW#?iQ2NLI5>X&D(Vd-Sy(o0%J!Lo;Z%h8+jZJuv!QxYm%5S!hSOYauI1u{y~H5~ zfi?Y5$u_5xVpXjr0)e3CDsuBY+RE-9juJ|>o zHa~tGwHJ`G!YBJg+DJvxXO%8l@FKlsSah2S+ zYyp;`0W^*b^6HwDbC+3DID)+RkLK3W!g%dQ;-<>)O1(Y7?wO!FeGqyy9m>%L* z9GXGNQKFF@WIjoEs>HZ?tj!kUaMZlo&R7yUaD6*-O6b_E4h${ z3NE;O6z;s8^6SRH2rOxbf<@7)RH!(t30UB4pgRtRLjZ5Zwt|d#Bm7g&+$lw&e z$I>t&z1@5YS^}WYGkA%K9PZ5L0_`bTuMrgn!6#C|r|2qcK+{0NXaI$bTf4X2Bmjvt z>>DDD#m0Yjq}L*1p8ej!;=2OMc*54v!-1Z2H0(kLmBMTvm>K+T8L$HNH6%g)3C?w9 zvj3<8K3ykWl@jN3KX=Zk4X@SWLv2`ym8lInzR?1Y?9!AfdK8!mrkYJk7x>N1% zr}_7){k=5*KDED_=HIXO=`_Df?eC=d52*cQn*X5MPo((|sXd(L?^65QY5v1%e=E&@ zMD0^){twhXndU#L_Ty>(Hnks1^Sh(JAiW{{SG+W0jziIPD}bvOtMnVQ)v8S~PlI%t zarR$RPM+0P80sL3n$8VUp<11fDtfYxa60^k`I~4VQwkN_#3d1``E}}|Eokvg>8nf9 z8|rZkjK!z(DXZ3s?MbFZH?oi?=sa`^8+D{pO-H9TWgEPFx=9GPLAE?cE;m69_zX!1 zpCKU|N_lpZ?3o+*l3LAH8y7hEh*Hi<>Gx8omLvGmc7yI)5g-7d#O;r@#Pe1+b~I{ zyo8@G3Q|@}cf1Rps7rtmqjFD$a#`!)rE*8D7EmaaJGw!l3NgJ5zFyRjc{%ft|5Gla zu1eW}N!TtE*aqR#HV-@KB@sF=SpuDxEP>8T#NaB>dC4&7JXvFgMKX@-%U+H$$ARsd zGROf}iO7*UDPdUBZ16JaE7d8Y)j3Ey0zidMyqAe68otNTFDU`ypvL;VV+muDMj5eb^W6_w`|4wBO%{ebL_4hkeohKp*x+ z`-6Sh7wr%AVPCZG>chThf4C3(qWzIR?2Gmv^kHALKiY?V(Y~z@`=Y(O5BqZP!(R)% zmXK!f!{5zD<{`|E$gC!ARCHe*IxK010?S#Fr(QPBoDbF@pf|0JAexc=>eccD0>R~6 z&sR^Y-=8ZjYnD`U@yA@@%xu$D@;}cO@4jDAA9+%Tf&;AVR7VMSv~#}QY;Cf@|8n&! zjvPgLlwg$JDAFh)jjr}v(YcT9hD=z%hdm8eYLC=UC`humH}2foPwn3M-rl_*&3(X1 zcCRG_j1MLRFo`bVx-^*L)HJZqjk}N(gkvT`z)K7s7?%Vvs(2K}QylvEuhiUuhG3qg zS!!(w!V!B-k(UV*SG?_p{*>We6HB4 zU=DoKV4M`CZ}e;;oGitx{jnJs#}t{`E_V83GumJn&+I4+6kIEI;`YDyqujFdK7V!w z_Y-TWQ8NZY#a#+yqNClX8TQWmdTeIVMrI`aHQ7Lp%@o&^@8e55NxYkNEtx}O1d-*I zM%uJ_(8>x)xQ=GH|>W%qT%acsyKWq(x|?>4If1_)0cku(>8n{M$(9? zuLER^vE3Wj$~&U!R%Kd`owXrir_`!U>#@^%EI`9!^`$))bF3cQVJ&J)Hwdsft%Qa&&Zx!FH z-LH8AFr#+8!R(UUg`x^-nW9RDzbUGe7B)o{8;2>X=xC;>VpKFml`vXURL9h!sA7yW zMV0IUQ&d-}ML}Jo76p~CVN*~qQj3C0P_8Mc>(!#5UaS@cl_*_PP%l-Bf|{v4oaUR= zqM+t#QBZqoQBW^ai-JnFmno)O)S{?PXGJl)klnx^1zIEtpFzbNB(v6%>uUN8CX(wG zKW8_%Z-g??td$RQvd|xYn3I^eNo|OH;V>sT6Ri&#+0CyIspJ4~V>kLU(;F`jbAtOo zn##kRAhFycYA;Fd3cejY%xTmlIdf&b%wbNL+f9<2@RHn=m*l!$k|XfdB)J(c$zgml zNv`cBxiK%vb-W}u=_R>UPLh*eWRlz(FUhU-lH5gJlAH6A+fjb4(w)Jt-i zm*h5kNiO%29EmR`$zA3pxp^RyYv5?Xn% zhP@8HfbC#Q{UG(Hlk7U|65QnD)UCrPxesNx4x{8pTy(2-7$rYk=`c!uD0X0@*aBhJ z^Ua9hsC=**L_QEYBBux)k(Y!H8{@&KdTdf)^6KJHI3B1NH6=<@e1b)IS1~pY(vykE z)IZlnCXyY{WK(i6ZAJ1+ktX2AIrX??+055q;5|Iz{I4~rqO31?XJobMM$YkYFsZ~I z5abO0TUK9*-wx|r;h91o;uxo-q?*`aBpP*Y@K~|7>7=bn93$1h(Lr04vpm|Sm9{Ez zjBPuGsZ}{v4C!=7dN;;fBuO1BcCQw>Ei((^+^$ST`bA|EBnBNTMuz4Vr3CR=!a%zq zlHHSJOId1HRM!bnAc~hqU3Nkws9i}x($j6G;#X7RS1mgYM+E!fr1>hfoND9EJ?-KU0aY6Clnq$$KV<`^j2@|H7K%6JM*JM1e$K`;CGmyW(@KYp z_(-M0Mtr#Jh zX4(k`+S+D?A&&=!OuQ)C_>S~mnkRo(c6(rPH+Iwe07<$=p#ML~1@Krr&G)WW=6Tp| z0JK?*QYXr$_3>2v(%~nT57ScO;fFVA;uys_g2ZGE>=7nw5Laum2K>}y4T335)<8ut zS!0b_jN+8zG+BfA43jn1tHmfziC2>~DD-Sb@k}i;$7Z$29JyMI;yty<9G9uZD2{!^ zWR7{Y$Q)bLVibo{o6NCQEi%W|YLPjpg>Ev(8`L6eT%#5v__fllbf#)^Vh;jCVEI7| zxFv`I+||u5x0_LtVDBix%ftXFlPie+Y zGT1x@9Wr%H48VJ7VgLy|CI*ntV`2aW(oGDYY`lp9tqeAfL8q0$#xdx$GT1l2Iyk|@$nfHvTB=epzm1N#CrjpE;%X@8Shu*uBRq+)5dPm`RPP`%R zf;jaBvLZK4T!UfHc6^e9#;&bl*ys|AvA%N+lu;l^JOM#sF%TnwU1?1PC5@6{Ht9a9S*mobnlHQEq1MxeS!ob`m2lH*TOLO_@@U2%mW$YJArrfgA zE+tU7se4gSxP|N71Rn6*i-NRrBFf4-fP6|4^u9Z{^vV#79YT1e2gVNJ`#6FTG(^;+ zME7yK1#Evc@y^M<<%Ee#n>jUReOphrBr_IPxhM}DxiS630HcZ3)PcgEQE}o0f;BB- zMePfuGX52Efm8+i4VoO*P0vZfG!O_VS{y_4ekpj3NOVahePEY)Mqv716u6K3% z4r~wE=q-d+VCv@It*Qefj3Rj05i4c;Zk14Cp&ZCR6?$cB8qivi9+ZaGLc6f7t*;(2 zlD^76&b?ur(j(yYoeg1)E@iXncQ|{ga1||wc_Jti0&Mf8h)4yjky&bwzhWcUVxFsQGjFwh3?9^RKA4B9@-WaB0bqR&ehw7wt= zj_N&87{ohZLX@>12f9Y2=&z!Y-an>kp=ggg$z`NCL8nd?*U{eVmHW*1rm&5O#8;2> zZWNE87LHV8t48st^^m#aDQly6+)J*8|#6cAB+RNV#bO!?ktiN1|uksDW` z%#H~{P5T}*WtOrATk4Az>NO^1wox1e<()D+CS|r!JXYyInQasYDjhtwQS6T$OXgfz z5P+W9Lw(o0{#QYZY)}BuGHD~i4H02>MkLs_!yTeFsT_C?ywbik2yQra&WoOgsbY=E zOJ`s}sv3sQz;JYCZvd<8php94M79x`*8N%C0h&vZEkJxJvNhz;3$QDZZJ(+~1GtE6 zh$Kwi;}&8QA70;xRDzIA_VhvMHW4Kqao*8>h_{ZITsh@ohw#d+$w8z~Gz_=DqK1+` z>Bq5yv+`DYbZj&~wPT|R@YPeCRN8?W<@aW!x4T47{GCRrI!FdqH%;K|Hn#&q>A5q` zZ4xh#6hRuVQJE)VIA+ID8EB-Zb1I`;(l}uY^exc9>|PHS$hyGFh+yV%NQ>O!kJY&s zcp*qPW1C~Ms2(^n!Va5WZn~&k(t`fgS@tpOP)UQz- zwVsmvQOa^leLuwWh?rAb>MAurD7w;6DILS<4h`OTGHxVkf#}7&-ox8Gk)3qw!OLQY zQC;2@I!LQuFNz}4u}1N!*YMCaMoHEvdUbo}4r46{ZnSQ9Z=R3`#Il($7+f(^ngKJU z$2@oA6+$U6-zy^_5(jKjClcW6pKK(xw1N47qR*nw%H+h1WS3T?v1ymoV=^`e8XS+F zXffIPvGh9lCrONuD4~r^c%u3knyGjJgzyt+oTVdu%6@S?&F_&4#E*}sy?azPkRKH_ z%NSCV-DBBVY`5*Yg%%}@n2JsX<4_Kgkx3x?N-NfOHw0W4&XZQ)Cg(4GTTsr962#q*56(fQ8hH|i_!r$PY+e=AM~nww-$;<4xh zLnu*s8Qw3Y44qpza&dq??$IQ~5Z>R01W^T^tmaXN;0*`^;;N@;e&RBsaEYODBX=JG zdq=2epe}5wxmx_TJ+%ZFPpBop_%gKw7|*LEz<7(=qp4y;%$7Q>mH^``)Z(|@suo-7 z)oKYazEmv%#+h1dsoT|JOMQb{Y^j&4#g@8FEw#l?|EH|biI)67Q#K~LxFg9kg{Li^V*OJ z^cxUmnLz(PwRm8^t`<}1|Em@g=zmp<3H0yP&QiBPEuPK)M=d7N|DqO?=-;WuB>FYA zcufCqwU}K0RxKvd|Ev}h=}T%a?KJsRc&5@L zRiaTmTj`N1(I}oD2|6Gw&5L7j`X@)kc15)e0r`7^8cw_7zz`q8aqm%|P$&>L9*oL? zo%deVCoDUus!!N??-hN*C&Y&7Z)l=Y;qTWFc{1kL>|R29ex7PW%b7ZyzBoBDID!Td z_UfrJ^%t#Y2va{X!j3`AzM_`3pnM=qUY78N9FE!+i5NuCgI>|x#mexVTszJrhF?=f zzlgn|%bCrri|Qp1{Z$b<$B&#@BHyj$F%m6}6(|r~I$boQB{D92Y zkEhoqzv{1lhwI<;*Pr706LvihZQGIj0i}X@?!obe?lY^FiY5|W_FRWLJ*mQ;RxQ;e z7Sf+AzT7@+#<(XSwGUSTzU+n5V30^Gn`~t<cJ#cslbIJ{G31z0K{z(cVJt>K48G&ORXAvSv%kN;;CX3R9vs9HU$-4xqrC93hH5y`4B;8LU{K_;VOr;`uoABcF zCJd=at0-{6oYW}(y%}RZ)DFeNxdV$-`?~ZQuCm6q()V;KcK4c{K`oSV!_C z0^ZLxQI9Vu(ZIwavn5-)HD-C1KUj`9yw;Mv$oO0*c?$DBtA+y&#%TdnW|+l+#zwC4 z4m8;-QBZoV;6PjD9caFzg+$OY2bx{sKyv~e4z%V{QVcO$JCuZuo?{Y<-2(yjSI0VN zvV)d~K88!A^FhPs8KPDNvBYr*q6&y5JY0%c<`(!C5lgWS96BM0U++CX*abTrFF827 z>sFo};ZK3hi*Sr;5ga8bWj?2Io?EivbkU{Ey@PZ=IJ;4W?6NU<2mH{@%{HJLpA9!# z(2dWJo6WofniB_fc(b0<&Ao+B=*xGn|CKPcpb0946}f3*HOav*<3;=SL}jxOZ;eG9 zUQq0+&f^VL9S;0ns6qoJe=)@*GeEi@`=^S1I0fnUp$;u*`q$Ee5XBh#K zuhPqJ!DYj@;M_7@w*|&@%Ply#d<&4>5aGfNe4Fmnx5UThyy1IDxSiCGhag>caH&bM z7fX9mlB=_X1B>R~9`}jf&}YzxpexA5QRzaEG}DvN-_VKXIq|e%yq!Z1G}TGp&dHWb_>j)70N4~)a5Kkh8dtzjXVsb#^>HO#)tXV7U}#%< zN4$5mSf^j6;{T)UpkZm)f8aO+`jZ^;qM?@m8*;&KZT6AyF0 zT*i#fwFReMisj-s9R{?Lr1IJp%iaECTeDEQ^SGjosi}!T4eR8Rs{19==JP&gR@&p#wjS^Sy-*d^L^YkaIVg z$Z(B14u@5c{$K~#C=;?#z)QRomk16Oe`3zYr*U0E2~g%wN1=z#@IzTA@wyMOiJn{8 zLIyFf&=Y$(Ak85`1bOdh5H>=`v85f4{eBRv<1;Ga$cLthv^q0Nvq`}sfkxut(i)kt zVlNP455_l*c&5pqRa6ujy6(fuX$ zkp)}cc{~IPD5SK`Fx`4tbl}Cdhr>i`cGe6h7pQEV-t3em%w@_BH*JYnj&+tD{&F(6 zf7t>k22am{En15;H3JaBSMe;QM&dGKj{6wVx}qH@AeYxVo#4*1s5yc0#<3G%e-;U-1Z)S@{>Fp<_c9s z4B4(mbsUnrucC-p2!&Hbq&KYy419-jhJn&-7x^stF*l%MQRdX;jEG*5LNb7%PE?}e zlqJBz*zvwiNIv6|9V7rzy1d!7{XNYBaj$CDZt5i6kxJnP&Pq^6X|!*07&aZa9hkNV zNmECus(6?;X>ZgUEo5t)KrdqemN!y4k7!PDOI9IR)tY^{vQ-Ff0>|+)fuBt#89z&Z z#6IOeo8U5hvbd#)%6vUeTFa?9o02~*SOXx;aZTBrTdj6ZX{k!>E(@m{cPC&R{jhAg ziq*smHwRRs9V=&C5R3>o;hb>OeBms)zJnrN*);ZB62NpNcN~U8C8AKWB#g+3eXl<_ zixbqTNz>6%9qeLN-= zzpCr73{uBfd&T{kxBDNVTcS$o3`-NAw~p(LIZD+QKGEUsI%jp;+?3Rdo7~N-dbj zu81?7K5-2!`NP(SwTgA9N1Yfls>47C#Kl4+s&T_!DBLn;7ZW7TF|)&&FeptC?!K%e z2tF5TJfJ5yk@gS{GcH1dOb8{i3?WC9p0LU!6NxDTFQc^rxeBigcX_622V^)#3tStY zo$&WL4cFgCg+ybyjbcK(QY<3+79-uyuFLOrfGdVRPo59ypTvedQ)loz5P6AI+6Wl2NNr(#ZvKXm%BtA5h-+6>qa`e+`sS$8kt>q5L)VU4g#;)X#>N75uv$>KH{R!f7 zKV$c7AxGf4efuyrj>N#SFA)qB2N)3gnV&ku|m+GrLjWNjWOmp z;an&zN4FKVK7|m5(8VDPCUnUN1&ah~qWop@1(Y!gRijSuYKp=R3RPIy28AjUyQ)H! ziCtBpiZ~9L%e+u!Cofo(yTrbgUWf5L#ien+ut{v!MW zu4%Fof{0s{JY#BIyhO^vuSu_MpLeyMh8-!=?(U!1UJh81Ec2M8BwSb3e5*!r!g@+u z5s5O^QyPo3!K{BdX2tYY&UM1qI%~o~Z9ED2*0~pX*SB5~HQz%1c>?j_%d) zV#uvB2RhXfL6M$&|1GxN*Sic>CFhZump;DHVwIg(fFn9|G(NqZ9@FnmU^KDgMf)KhaM7)J23ikttmA>j^!^)pjZ8S$e5BjG zAB*06y3wKgoG%wcB4bM#Fp;{M(9V(B7Of?X!AEONVfvw(FPkJ6nZv5v8Q7+#Gw!k5yB&mEbVx1X~z+YKDyI+<3qJjUP2>$ zYm(Q6&+IEa1bQCgR zvHvJ`-l6Iv1kn9r2R33;4@1Yx&u^%CeSBgPeZdEk3><0@&GEf!EbcZq5KR5`4usl; z%7^eb`U(uuSOZGOJlBhTp6g}MV)JHj{tnxPj_&O&jpDzU);^f)YFhhA=z`C6t$odC z1crf@sy#(mzgW^3=VbA2doDGqmpm7r$<_oHiL>|A57)1&hv)uLeV2dkp*q##4JvvJ z^d@uy2-1@{FJ+FupcO`)>t!_&>W}2q=k;xNrCKP0q*oe8% z&YL`4iB&UEpA^%TlqVR8+$yk=SPXD@-ucof%X6O`8?(;4e-jV~mT6fNEjDFR_4sET z^;IoD%@m}9bDWlSoi&LVXl!{^WMRhxg90V7qdr0;;O<5JkBZ6r@U`aG!q_h>5_$fI z-9hKRbfI`rk2$(pLslu>3_QodzZ>L5{D3Baw-zU$kt=WjhM_apx?EC5i;w_0Zj7{e z9GhTv@BK>%hn9j)PU1FNA$9`QTDl!7x`5#f3oCApWpH`SP;K;ApJ0 zBgvw&rS7zhgxsR)Mh!P9pFy1vg)J@(s_BgqR)btH(*0W#f%doMSXN>uMf%crQY;I% zqA3rQjf}zpr;NIcGz1R05z|MATRFfE2(KV{f67_E$$_;f8?4_qb7d?m!i1y3=QgX< z&=MOJB@V`-1bR>_uhJ12l^YcCxAZ>;=-n!{_LBVT@X&&iT5H0>>@LaXrnQ-!l#GyA zON=iowZsT{C~JvXyaBE_=4?WYXd!&1q^2X!2QcAQnMA52aIoUUe!R#05 z2*F&ZDBtz!t5KpHZjjij%xA2?N98F*h+)aZ1x3d!RHZyX%rUiUNZl(v z(Q`^q2p)%|iJn+)#4;=GxuqwT$?NC|%8Xm`SK(ZdsDL`gYdTp(iQ%l(F;=bB62=;` zs9`D<2`DgDna#^uTxY^q;Y&*yYXvz}nPUJ-j_-f{avh6sa!@iFxz6#xb%GB1V(1Xv zDCNgUH)QB?p}6OgazLBU0~nj{4SQjQvI~swsp|g~k$=7l#=R}3q4lotLjM&Gkb67* zX9vpnX7dh|dvEsr0_I+yP6{>lcE!$Yp?5u<=nB2Jgx83VSg9zoIt-|h#we;fLO#&~ zr-|Bvg=01-CQS|Od@H?FXv}jqjgN?Z#Yc!gzMS@hv{%#qHI>V^)4HnJRK&M{8Y|BK zzjDabHa1N5tk$Ak#g)Rk$N3NE2a0&>cri)MGqGI4K?5jP z1$nKO7v}HToqo58-^bW%4iIIUVHzq$Pvw^_5-)aWt|ruPu`9~a-*bmbe6ht_>PM{> z*H+#59mI#bQs7&86hD`7%c!kb>p^^7UKRq(8wyuPAgA*9CjcPM11K5-f3CV5j!}H= zZ~yq?6e{wOzAlCm*TQZcmVtxLi4;TZJ7;q%(QePjRx(+i!;qH?oC`3+^5$B+fyF(F z#s!jc)Qmq@Y`_QEKs(Zs6B2~&0AV8AY1UM#pob$#75s4WS_MJe znPkf`gyA}zs~#ip>PrqnmL-gM|Gsm{h}T7NZJk^6D9W=17~#&XxK>gB)<;HsC_2P_ zv?~;uw5gHq&zqioysoPJ<`X$Vrj;TLI6j4Jbl{6!?U-?hu_#w-o=9FwYgKYSlRkw;)Jt>16?ID>j8^uRM?G)upI@J2o2J*y=zPeC1e(XGcrbTWh zP~XzXUaTzci}gE1fl-jOv`7I?_P{$&3Y#s_VO9fUOrXKVKjHI^Z0W*iHT=RXE?tMx6HitMivtU=iB5?b z=yYOf$Q;!L}Zn z7E402j7|3fOh!Jip;7z>&z`PKhb35~c$qC1Yw&ga*-tdI#r8d6*Ma5rc$W(728`{S)LM8#VPJ$#s z%B|f9nf$v~b#eiHUVc>^iiX((zXKO1r(7mJSBaugXr$9|qz<_1Ha=GNiN>xP1LVw} zFoQ5wihyNdtacs7x<^BmFv!rtu!>s8j@@#-8ljDRcj}ild@{H?_2{c3iRY)eh4PE0 z1;pPvfsk>p7L5VzPQ*`*-tDQ7I}UL1%izf!$G3!aapaDnO15E#iAyzh#;1ZBr$^PuEVsMAyt z!?n_P9}U((yBVybj0>yDq9j}V8;_4o4a)(w)x;mS-UZ(-46PLUrnld7Q6epCe`t za5;BQ#(wd-MJTc;AOsuu1CUA3>+^?dT{Z1ER#z1xn<`y!WeAwtk;tFD9nl3MPJhBIbFF&P5qlHx_c0NzioSI;&Eu`78C>J;g%6PgT=IWDil ztY3j~RZzJye)Bd6r=K5A{eH5Cr(`?Qx6@p@1L(1_eSviDTX@X#Kp!XceUXm|)1$_R zc_K`a9Tr`Iz9YYp8QW!31qjb3ognw%4Cw^?8v2IhUb zoy4y7uJRBuCV^uIok}nKj?l@Xn)c!Bd6O87ydHzX{+gQolso&1+08n*;Oa_vrelgb zVDj#2Y;Z;c7Rr*=RjOI9OzN)41}!=FV95zKoPHJzH`iy;T2riGdTb)yj8ZSCW#xl_ z$g0=t+}a=8QSISKo*}Ws=T_~h*dLK5UTcQpNn>P7&oY2!IHmmb+-~2_O8MFIxJe8& z7J-k)B>MddYiWufqRO599*$g1#p>?d@KK#DBjSpjA|Xv>4M1a< zrRpf?N{9Br)a{q`_ertwC)F8v%QFZePq>M*SxuSysypS|N{Z~)X;jk+y$h-YITgM_ zgPnet-^1Ya0$wFS1HoL1w|j-1JfAQ^_X-ZD|1O9mFR{Cl74OqUFa+mq9;%$<0i)LkEAFT>?1DXl-9?*C$1 zbaErn5aG#MR=2=BZ29UgpZcB&B$=TTKsNBJD_f{eRfHWAc`=R<7aR?b1%pT8lhenY z)-KlS!l{OviJjZw+ZofMIh=V)`$LRXV>Syc#}tBT)L0a0_3I_#zEVh{C6^UEQ-;J+e=qjk($PyHAHqZ^LxKzV6*zrm6{xb)gXh$W z27${k@Y7AY95_c*lJ(1-Bg#ESEq-kcbu_GOkjiNQF4paBSgMra z3Vyo~C?kr@6-Gn({Kv73N}qU4EpD*`w0fr1%|B4{Hm)1?Li>plAg61*`EKIUoykyd4GFjgEy9OxLg%KIAR(Qy^UY0szk@-Uja2|ODW2WyM;@%It3eh{r0 z7q{u$S^hp+69?!iFEndsZP23DLq*!dW&J1fA5-&>^B-69)A>(i7wNf+I14f^f8x6O z9L|emSqkbK$N4bkZqiRWZ-_8*A`oQR zOYvKgp3+t<{D~F=#O26g$<1N|Mg_VlmJV5h3A?j8+Xc1K>4>L!wu{eO$E@9vXxcpK zX@0spMAbjZ2a>V%fFni#ry+vc9L$%q+)st}tflIU`unG;9q(D|kVr@PrX??613P9m zBCXy@bAVZC`xjE3SxaQ3eL8{qij$O^b;LWn1z&6zi;dtrG#6OA!2IbgAC}(Nmi07t zWctZtp#V$q+-Dbo_hfxB*ZpR#H*(_yr;SU!?b6sDk7P42FJcv5)GAC&054sg^n{r0Sy6hkt`xv#&1jL+ zp#+C;pN~`GKCXOm6uTPLDY6p^5O=`Q>VC2#nnQ*e+a&7Vn-P7_`Th}%cm|;!LE6QK ztfx#_GlKRcD5-7D+S@4Jw=4Oet~s3jQMJIOZS@Ca3$A!;18V> zXri`!zLxUAJV^PtX#(51o2H~?0iNq?7k|B!6sac90I^a@o+>%>bm@34E}Soh$ij*I zsbG(m4{8<89v(KlW!phKp|HH`%Nwt>Ypz~nxXTA8+9|)9tF6odIRWGw1YZxN(t+5l z$B6IiP_4~vAv6pz0QXh9c(El3JnosXp%2hEM&I&Xs~g34yH-2ED+a(|jlh6SEeglo5oisZC`3{ak}`;hY?fhQL!rF9*+{8gk1ob?W+usSv6&S0$uvz+q?*O!pQN&8 ztNTkEChC%YjI#3gz(^pctT}X>MJao<|BG0sMN*4-V1jy-w*AP_Ymjk@vBEZRo)ftA zW~xzkF4oH)1FedtUSI03#2U$95Nsz3qakAFe^Nq=7hbHA>_-eL-iFtO}-d7^ihQ(rtG|4yP|Z2L7QrYbFU~6sRQWyOxS6qNWgLJ zZC}E!=xYjFNYZ~kB@aO(bkwmJ%SSt9Sjyo57ovDY0?@=e%_q!e$w9}81QC46_DkR{ zPpIWBQLc8tfTkk-4#DZIRTb2yt3@m|g|s0&Ge1C}Hai0II;i0>Ul@D21a4 z|JFy6pV9ymfSaJsJDxo~Z=B0hD!doqQ!LIREPoZ#OGzb4F z7e7EQ9G#FGyMpKy+Hy9uYO9<;)X-oV+QmSBvYGDRVUeKl__UEI@;f4mK=T-`OcoMH zxHQYLfe!S)W%1D?Fg4UgXOIoMS1nD=k$wi5L=6UFwW*6)I3t2k)GarQ{f)$?I{1l?rI_99P*w)5D9|YO--Gz8ja?LT@hHD1{J6y;zWZxuxM7;}I=6-ay>qG=^YDl4fEy zbpXekiYz0?OgPnyoK}Pc{4t8>28hCY6=fgas>tENcOLe?opUj;21TQ#2ZGR8$rPOk zMOJsDVi{9ugenwSHf9Bitjfgz6hS5zM;sJsJ605rWXFnrhlA0^<^2wiRXS{qO1s#E zW?VIk85C)Payrk6i9u!TBrhU2LIkXJIeu2sAd3aF{i=!(Hs?TvthUEoR#G6vz>2sq zxlpu$FqiJ<4d@mX>x}{Z(UBgZuCf4K8-r}GA^QgZ7yRH_&A<*k22!pmSf#c6nNJeM zCbqN7`^ndU0lDx_2u7Z3X}*w>?pLLc%PMGKW{eSkOx*EFfyHwz!QZ4?q+>0!CR&FB zwb%jIG#HXG(KzB4T9Iq6uW-#d0qyP@>R1z90ekZbl;~{25Xf>qU`P@+)>se>`teN5 znF@|*D_E+-Sh)9Vxd*8&R`uC z8g1CcfX0lf?>i5OrdbNn#=TW(2s1FZ#gtve=U%sOh_rr&K8F$ZyF z@jTEJ5%$&SUl+Z*)sBC=%C$e2?<37PQ$N|o}&ST7e#3G1*W12_2-B@B(o#K}bYM z!Rw=OeoSqgj$o3kIg_N3;g=g;orKnqgm6V1o-$kG@UGDC21fQ(KeFQ**-@ayWHya! z4Qn*G${KWBW!1xRNc$zu)i7##v?*%oh-%2fajuvQ&gUgjPfVX{E+MAJVn;j64EO>q zeW77C7il1(rA_{m27-4Eb45cuLQ4u#knG~fO$9RK!;53q`G#T4QWk8~&>|!0EK`8U zNheBxQyxU!oQ%svMsc~HP&>Q09Ik+B<F7=cvoq9La=z9vp*v(Mu`!tO@vbA z9cZ&lBBINQP<-p@{^^QPqbrC|O@)tpb z`9Q%U{aW8oo)D>rAj_p)oHQzNpejNQ#|#77lSULg&@M)d@<6*kb_}2qn7yxcYCPI4 z)B%L-CC5Exm{%0B7M8)dk%Zc<$AgS z`bolbucw#5p5C_D`x3oxp%-bgX9+fT?~C-lm0l#ym`h^Vq?n<*g;?{+uX48aacSgl zw#EN4m*#R?W@I@w=yLN$7Wjzy+FU3V8^5J~xAKLW*~WeX!^_t1NUx`v+mY@B49N_7 zt6!+5j4E%5AE-5Uef&Tq+^+b6V7R_t6rN9BW_?Fe@T_MO7J5GUG9N`Gf<-3kT8M&! zvM#?t^ub#gwWYJAb0ba#>ZUr;&a1ql=2S*(Vaf_SE4>N*Gi>Pu>;O6#_EI_%YHrAx z33|5)a%j;AULl<3#tA|zSuS-poGldI9fttBm2vs}n>4TmisPbQ51W*H$oJ;eU$iB)y23{XlPl4K#)!YnjF&x{LG zBiY~a?r+tBEOBSl9LRPx;6Rqt?Ibob$tP?pB+nCYRx$CKB^*CcnA_A+NAfafw=3lE z3cOpVJ=RVftB%B6;_yD@SUb^0cOtl%qR%dL46eMZN_Z}3gDFP1#>%Ut!6|2>>=r=@o4r^Z@!KTiQY&eLv0S=ny!dk=>h2KTctuF3x&&7b>LYdB@ zR;8Ue;HM*ry%A#t637Q|)zzIlmk>ith=&-c@~I)l>|iCtpl1L*L!6~EXsj}QNO>{` znPL_^5p!#$h=$l9XX#97M|RHAnPrA#u~hrbs~m-FL`(Z))0Z;{{$;FYx!v>ZOcx2p zVCB3_*Kpoui<{0&=#qC`*fsFMwW44YGh~LAMkIm)|6ZIH=HZ2Q2Q^6tqio(yr#<*ZwC;lrjQJB8c zs+USZ48da6W!YMJ)fKClgJpizb@S3yw?i4vWYwKsab_`Eha*fG93v+TaPjjOqoug4 z5Tj-BTBc01WVBD#T)dX957(5uVfa|mEPtYaMQufzrKPrTNFTLTZq6&9PQ#gqo z617FZF=~cHBw}v6KLbG?Eyl!_n>n;LW~Q;_jqK7c$AGnz1*CrjpXSp=TLmdX44asl zV%SF1qw8BXKq$nmz!Ig=rb?qVLM0nZq~sMA;PARtd?nUY3DWQvsGbsn!5kV}64mpT zM8){ULlu*JiosCFr5Mdei`6PABCRfN*h@8%H_5~R z)$x5)iRyLf#0)VOJCzJRLT9$n>x9niO?I_iZ@QNV@1K}PEM9tpD+Z9h;v%`F#f$d&eeB+zn{N~856r#We`pL6u zZ|NuhQtfy4lRr^=Yd`s8wYT+?qiWyLPd=meyZXte)!yDu{z&Z|{p1<7@9Za^Qv2Qg z)G z_PzG2lUmNZ`3}@77C(b({o5O%D@mbD)}IzuqEte#AW%*2ngIgYguJHB>h$XDaxG8l zH)Kf{!*c@mFq(Q%+uN&C5W%*((Mxn!(by~0tQS9hKg9;Q^FGiNBF)|P`+M~b3%6hs zs29AAFE3xXbpvNW)VluxA|!}%FP!U*Hg4c$P}HKMlN$uJ8Uq)NQw@Xfp$h&+#^A=% z(pWUtIF^>i!r2SANSJ0U`qIYI$?7&1mEXYVJ&LaF0eN6{sh(KpN1ZS`^z!?AsheHO z6ZK_vb`T)tnr%)v6&*C4kvO|r$Tg#n8SkQ*yG6ZZDlzY!%p1ZWBAU9y4HO}96k?&Z zT@Z^c_3g^nO`%P(fKUqYh(!xiB~x`hfl8GwK-~mK*LZ^4#ohmX~4jv1`IF?^z!tQgnaV7z0u8yX=J|GvIDts zwoeO_7DS^#LHS6v=W#7lLK?}~%|I0QG*}p#POrK5R=BRd09Bfdy*^&-|M;)ex*yO9 z6z~K^Wd5@Fs($5ulN!l_va#{)VyEbpo|R)MrX@QcnvKyNF6~Z3kmxz89Q0}Ng;~$1 zMwN>`Ev7ILd#?ASJDiwUB-C6P75VX^les#iBVjP3Moy*>qTg zQ8tpz%J1cB-mZ{B`JwuLjH{h?_2XRKuvdLQ!4c}SYt{hxGK z00r6i>H}6tz}FQZL=L{L(CtVx(G|StUR~+dF9^%g z6flN`u;D0I#+E?2{BsPMR7bW!uj~H14oHc$iiTY=iHI$0iW6#IwX1wF*Gn<%8_lAM zjgVaD7AY)qt2+~8V`U&F!39Dz$@VL26l6^rVHFq3ZntE(ImZe zZ?W^I;Clv88g#~=c5lici7<8LT{=ioe?H};HvmkgC%Pzks<-8{khBRlj?n=CLF|~& z&InVZ&@rKv5+X;5!_wG==TY3Sc(PO=Imwo5m*g7ZSAgxR(37QHsbT}l+(#w&P-RsB za&M*|q1H%v0h-3t{J2yt!I6Fh49#j>VUV*Lk^#+Z1e)0hG_w(CECbbmX4XO5tXRb? z3&7q^F+9XBEevEeYiYA5wD(rzT;HjOCGX}9HJzNmWUc53w^45zm|(TFWv$HiB%gIw z9U-$IgG5!iAE*gWD69RnXR#t9q9;=lpWPMvkcyAFS29!h*sO-c1JdOW;CC{#0S<;$ zyq)d7PdPd}@9TbO(|SZ7M$mwq@`wrW5g-BzJDyr;WHZIdk3p9{MrxkmIe?!>C=qpV zAEGWv%1BSZr&PW{BRv7BQaK2X^aRXG9l-)#thBK`#|T!1@}!PnRS1tbA56|6h|wj1 zw!=peu7Ike1%xd;*yvt(uaU(tETfuX)JWOF=n8FfIIS(P`3L^yW?e2rn7=2garW`E zpL_glq#8=;w4BrtYUpM7Y-DzMqoLzdy|nq>OCE+!WqW(80kK+9d#FdC{!itX z$tbc|>O?9MN$2$PKk)r+}hwF;HgAx$fhw@Eo?$0l0?j!f*TL=-R^9n?*nZ3mH zK-&08Z}UPvpI!D7*=7HT@?{Ifru*}&vLx^6(RKa}`!Bnk_fZ3>Hw8~t31D5XddEZ? zWLuTZ+>U~=DqAlBXFgk{cK~~rKpTl*r%Cd4yqm6#>bfYSN%BlZZ5jvyQuYu8>NH3b zG>sneZ6mAQ$oT{a0F*+LHoA_`xP-TCy01qH`a|7oQpuxlyT8YMNj43q*iBy8Zr<}$ zZ~Q&G-}XKdX(^bwx0e^_L!3|F6PfC*L6n2?bg8;pe{i9c=0;dpR^t{7UE@E8JkHZagV$th)Hy*XH;nD~-$1YZH@cllCGi_*`wG9w7I?Mp z#I-qvNZXr&RG|}l5qa3_`GH<)0a?tCN*esYCNi24o25~9O`huk%p)<;QBPt{EW}C$zZuaMUWAD)mes*{A z11uYY7Muu#VF&o46MDJ#-Muj}DaL%433S~!gl-&yR3!~zckSK1(G`Xu`r=-rXZ@f} zXV|k&Z#o;Zx~C)c>>|NiJ`^Hcb8G}2W_!INp!;; zxR;7)!ak_5*d8w){UBH)c3ZsgXt)~ECsZm9ANCj~{3;H{PcWY1Sin9|0o<#BTv|O= z5eW4xsg`X<{1$s@BPy!J93x8ZKEP7CAA!zh7i;a68z&?epR0QmKN??R2%dnFlb|G2 zPgob;W>~NFJ>}cNLcSjc=icZRCY!lMOT#uUd#32wsh??>zhn||wI$%PiU;DlVXnK0 zFe#?6fRHoA3nvZV<&c@&3w;~OuE@4P50PAWlQD;&=Y)`489ig}cCVs4r>{ z6@UJ*KmS-$U$~2+#m#w^)HL9)tT|i*9{%oLM{L~0r41&XATA+S$cBMHAc5pg z{&c?Yfu}sjAIm1xGj`_#Pnl=~`H~1?R4fP2sH-w%7CQ}bogtpYOpER0McG<=bT;~K z-it1X4O%`8?KzGO95{quOP6aF2O>I~VQUWa6pPTIdFdCQMMr95TE%0)v4x1a<|xEf00ZhrRB&n4aeB>NQX^+C3`s|FD^z!ehdLp}C9!__Y+1b8Od zY293f5~SJZufZg9+A`I>CA}+iGZWwG$pD zfj2K$UwRsX^`+UR{BD?F?Y|i!Sg-J#vn5#DL`Ji#o$$bcpc>#Z!CG@Lx`_cCQisNw6ONEHNU(@>2*8Xd)Hy;BqHe zuNe@mb0;1kZL1up7px6i*9lwK30tMoK>0)v4Py+EaMc-8La3NC1nU`RT9s{FAVqa^ zHodpUACGG88FM@l91s=}J_3}N53t|P1g<8ahuXXhXXA*%$l01z&PMt{_v^nArhCkNO3}xPR0?~wXxM6O zhUWQzD;F=t5y7u3pO#YEC%*ByWt8^uZ$dmhrJX4jC9l}~?YFoLjm{QNBRM)^`}A*e zhluS5E=|WDZoC)c$xApNQnQ{=i!DcR#fT9d*xbqtQK({B-bE74@5OMdCn77AE*)lqm0rBz*9zPRKY+&8n^MJ=K)jsb2O5Vxcch68Zadk zM5g5nV1qPM<){&fVyyu$h(RH`v^em7IlFJ;iaKd)@y8#J||a>FGJ@$ z8t5)9atAmfLej6gIPGj1p>2vriood&37R^}fec2vc2*MuXE29oVsKwq)owbcJF5rOxqPoDAvz=VO5 zMF#IpH%rp0N!0b!9Xqg4!kp&vLIq(AiJQH>ru=N&`TFv+v2XlsP#iH90#d?zc{st^ zl;<4!LcXOIJY}yDws^xUf1@ewh&8Y)3o$0lE56Y2ETOzv#|Due54J;l0d#!7EeWO+ zf%Iul8A7fNh{L&-+1FIlZ&GipaYnUH(C*ufS;$r76qc63APBp z&m3FiWnY3VgCZhY%IjW4EH1@D7UXzC0Rndlg_uN2da9k05j5@;Vxs8jxu9&tN|a4n zWzzk73ya+&Nnva9u3o#KHZ@wFqCY~MRa$HkrT^dJsh<2~OM08q%DLK>{P3>iBCgu~ zWFrmi$jPzpXr?;KJ~4`X=c1EDHlp&-aw}zut;7kw2)apmct_A*&Q!6rd7l@>7DMSs zDau0}t)o?hGVU;TK?!5)eiCs)2GS7=Iusoxph_py5CW;NGNQs1JcbceerkS$E$+H{ z#ud@-J5dfTVvB4-r-Uairi+S4{&O~Fu_gExYT1~Qni~8RgTq(CnfB*EDh=uwbU2BZ>`TJ(H=6Q3_pMLC|~m!}qO zzEuf>IW}B9+*kR9@{|Rw9alyIj%>pH@&PObX*O}{pK^<7KEJj`cAUXM@YPF-9vc7C`E>N*nru=>F_pKX zO=^T?!X_0ZR4>!Cs~FpMOKBL(7sA+9@dSrTR83JW<)_e7Vr;8;+ImV;RI7N#dP-9i z(QS4F6-2?=q8_*N5n9D#+&GFcN->d)g(Vy@V-$s+tVB3W)`~B-bn1}@e5=mbDh^jV z5QtkUOdjt*er>5NdFaqaXtKh>woY_`kZ(<%C(@G+yOUv{`ZJ=Rlj_g0SuN@Q9Gf-j zm483Pp!^duy;S*!KuYD8GL|)D2GI0m>9M#$Vm_;@4TXq?KfXA-t4#nNBR{XJt;woX z27!c1V~S*cEn)xS;a13Q~e>#^a_x*!F4hopDQa zukxQey@PjSJh(tHz-j=10mrlgR4wAq{SP>#pd5h158!@*Xg1dArMONd#*P`r3T(#= zW5-I29h3dIim@t!Nk@sXs^mvUiLt8nM@NaVdVB?AosG`D-HSGe!;jTKt=87$$(lqP zAu=q}fFl5k1f9og;;P(!sD`>u`=k*c;d9)6hl;=;EZN&w?O3qqg{Ih2`CCdYHD$%o zQ_{d%@q+b~G_Y2D)p{ZgB;gHq%wnEE!xk`#5qmnc!Y&xK8X!)GEG7J05+|)Y(W_%x zkc2_LZb=h4p+=g96P^lb!X>yeX*xAg3S@XFQ5s~yw(iub4D0^-X21cR!S}#-oyq;b zfwmLwU#W~^T=&%gZRq4m{I&#ak+%y3u#J*?XJ1RsK2}Hnl`>#w+-b>eXBAHT|Jt~^ zojl_OP|_C;>UXaEham*zKX}|(5kyCI7!qPH)DKGUN`ElUXmd8HC=fh--DDDU+F?jc z!A%J5_Wi_ViUY$!M_^R+<1g;PUn^|BC6_V5ZdFcibw&=tlJCltrQEWUU_-)lOB#;F zy2$Npx88MK{RU%~RepVe0F_r)oDp_F5O7A=vrR1naEwLZK>Rxua44EI0tfjSuar?@ za~w`hfDf{}1XaXDRE4_RuB&es0Pc|lxTStWZ|V*u{rUg{69hYz`<2z2DdBa5rvqCbH#tb zSDFhQFD~tP3|Zb~W%-{x7w#Cko`z<;qCSpsr@OaT+nfZIRtS)Q05aHYO*R&(tgsA; zsthvlk@>t=klG-@ytt;=iN%k+^5%wHFa|eBpuU|r%;pAyoKw=&6@|j%$VBxd1k@(WoUA?o&FVpAZreN z{qrbqrqV`htQ}9$Vi4hXPNB8HWA~gIE5JWlW;gR7|50|^jHhj1Aj+z|8>+|W@HCeK z_*^n91rYqWVQ=?~YsZV4EYk)F(H;o_v#rCT<>V19Az^uDkffE=;v^KUA+vQxWZ8=8 zKU$MX@z3*gKh5j;Vd8%ctL71sk0vhj@~RWLZ`z9)(%T#f0D0Kio;a$CT6he@we zTD@iOQ=~v~Pjhrq5`i3Bl~d(6JJPFYu<*~*P_bw;VRx+cY7$br|KlWmR@;Cgw^T*p zUA%#NuYo4dnXsai7zTpzQwdX}R{DVIuE6|*FpvfZjIL*DeCVy!$CfIVOanfcOJ{GL zP~OutNlySsQ)X7~QD}4geL@T(p`nUXr`g-v=zKG!HbYoNlCL6~dX=)} zlit|w^yjjUCG4#dWQ@AK?v1N|Z1-DTF5f6S&M#M~As3x)3>GRLh55_!o5xvR?F_N@ z9CX2Z1a8%b>rpxKzaL{5-tHt<>X;j%N|P(NdMsPRTL`jdm;~UuflgR9H=*+H?oA4A zHBiDsRsEYfHX1uu@9vF@kKW0jNsFW>(@q61rqnZjCt3YZ@pL~8KPj0*<1`dY@8`ks z119Gw{JNQ~iI4yP*?a#eIj-`~ySln(x~IEmrsnrZ8c9`U*%~=^;;@eF2%klzWBlXT z1aFQ`jyETN_z%um-Wi`gwxgHBA2tjiKmjGMLKHATfWj(RVP#N^0!r4KD8a@Kafm`p z5Lgg}7*<9VL@{JPJz?R&Ck;INOb zeCvHg-NQ=X_wbg=oAiBV?WV!@O6JbZqxLSa4dFJaf$S$`+R4B!O*dZbh3vNpW$e;% z8@RYdRkR)4(FnAD&MI;H6bUn?Szrj}7_Lep1k+IA3wzU`e0#O+UH;A1d5sKD6aRsy z88!TWsnKm=oaDYUW2#`Ddj+o9V$K<3y!PbpKjHjNvxSd85oD{gy<~2AIH-afvgh&w zP(k(usP?F~Hje@=Brwj|89ieA07{R**?0ufBRdawJ)#gAAmQy~3%~P(nJsJ=!X3WG zJ$l@nV@owct46Ub`$rDsHD-_M$~H5rN5^${NS?eLf{^Wb4_>x*2VQ1R={MT|ee@ll z46-ykP38i#wy>l;Y$qj$A|>ec0vv;h0yLjaiMmV(%Q&hUB*go=Vs6*$DDs9pS09y=%yV}A*S4YehU1v0aqlTYLH9;Vj zzXUOIFB$E;5!#4K+)(1?!MewI2(WaHw&}w?COXGFGVwf0paPln#!FPezKVx69o6<3 zHq{zOT&4Mr>8lmhP2?_8!*89E45UIM+4 zp4O5=)C4UlWUy}eWa;<*VolK-Obvc#<#ok?Z;5qfG3b@o6}Lt(nu`cBOizhS6`<{E zcZ-qXGJ6zhYk8IItcacFch(zr376KJ#`kHx5$<=bH@OOQB0}mIFf4-_v(aB@vQl}XR*a>u^Rz5*}TKn9xY~$hWO=BOkbEaqFh7U}@{W&=ZaCnm%)_Wnz6N=T6D1w2uM`sIfdt7|VAu`9O*rrsGHhV-+Dvm!6-Bw%AF}TmR zAJEo93vnU-Q0+3lT|1ZD)$jvsGP9MEMU1tRAQ$4Oha5*8QNloWO9zrQ8G$h-8#332 zB*y|r+(pD}&HuKPV_X;~eF&(rQ-9!gRjow)5;u4KTz2GtJ|SjO{NZ8op)M1Y};l>M1y&{wNf?^4Sp$Oap zU94dF{N5ioZTE3W6zAj>u`u$UfyJR6TV4;(!tUAt*m}#B*T4Da!IdC;nZkD=dcQ(` zft_cu|Gs5Qbz$pZm@NPg*=)97U||O*$dl+mPPnp1xysgMCsbfRE8<`pi2Lzcr;5TF zhI|W<#Azv$iWK!zMPUtPT-U?|F05fSUTJ|6M`bp^b*UCl{vuOCbVC#y*{R~A=hg6( z!F%&OcZxmb;Jer={jpb6T2g9k#xt{{O6v^a_kLyWUm5%-TUb!S&EAT8`TWrO^;cZJ z?y@wA*REMTvufpv>8Z(y@v+g7Xn1I_-D(ar>ivDSYFIJPG91VVlxgg+VwN#i_)Of* zzxkvJ#X}t@H3%MjbJ0iFFzBTMOf;V)G8ivc_&A;x{%ziD2Q9_u78VvFb|<*Np0;x=n$yx!ljJa))u_9MyFO$=nj>q) zIx@63u|{EB003ZQrvpOPRdqd+^w9x2Bwb~n{!v3b7kvtd-~&|`G?EA7gbJk&tD&Bk zb5B(tV4FaU1t6nd^hY)T-yCjV$u0w{Chb>6|8)F|L8jj08%N$BeN!&crvrw9#%mDT zvtFCZ?#&Q%VMl$6+ixSa2<==E85FXSkGYymlUzJW1xTf*+Jx_hns1 zS<%95Z~hCb5CfuCMc*buamXrxTJ#EY7*s>QG}gY{XnTkklsZ#$lPX6Zb)T7}Fw)|u zb%N_g8Yp8VEwCFcRYW}hnt`82;#zx}uSMT(wrtAK5`@u5noJfy-vD)W)AWCaX#j1u zkM+4WyjU=v{h0>7U(KI&10N{R9b7{67sKt#1i!3)G!Ky40%SQ~Ioh zg*SmyzBtY>R<91wQz+}h&_$+`n#sg&kPXPWSQo9dxhYT>wxLbI8j9+h%x{~sDdo3~ z3R_zdfg*)U#+iEsS^uU$@iFPWJJf`L(oLvUM$9slANTSTy$GUrwN;WlNX?l z&t*hT!NL5)ReM@nyfY#`(1D?7VQN)^8!$`Arhss(Y6;7KOiPF=tCk3m9jL1%K(bnb zeqSw-KRG=h_%M`i=vISd>;sPoFSOmeodUZWn->dW!p-6Lohq`kphOo_!o>no=c9~` zmji>r&G({_<9JaBI05rs=9>@G7pu1{_zFHyp!=C0>PEYJP6BG z0;bE_z?!RAz1fkYe-dPyvORzCCqeZ7l|d_el&fqb&kWCH2XuW}KRq%X5Rm82ozRcBS{r6BpLqL&H^LPc#yB5Y5>)jqQgi5HiOeHo2Q?5{9Nm01n2V<7DHU*R1atfW@ zg6bkAon_@o4d1L_`qnH_44NgQB@KXZShEzpie}mB*iAAv zY4wX~ht^8ofYB1g(RK<1WXgBr^i*3Ch~;mFV_@+q%W`OP7Y*qAdXo z5-kX#Z()-Vhf7&s^o@3V&G&@|d9Pave{ej=>i zDJC7R7aUzK1G~D_UcG#pLgkm3E6KhhC=sj@o!cXdNR!h`|7t-F@%w>|H4^_LE(JXH zbcWox6i&=u?z-@OnZxW|#mr$cW9Gumf=sPA*&jc{j6;!FmFy=ZqwGf$%}g$b9VJY+ zn0C|{??C{IUKnVv=w44Y7wgFlmwr8AmxWtT+SC8xXsailqAq7Ao&n2zhk=}KF%G?m z=O&19lq65p+wyafocm&no^KY)8D7PPSHiFvS`lolY$SU__|nR?c54cp;H8yKc~`!T z46o?xVh>(uwI^JI9m>9V{7Ll25uK-89-DOq@Wz)GcqK1mh=wJ^yEyuMJNsJCveU}W zh%li%n5E~YGzsK$pg}o0+#Y+80iJQdtD+M9O|^{@?E;9oXYxf(FNK;Q`&W&Ei6G+z z7)gor#W4HVo3}J%5cw5`PRd*qLu8T&$s`eyNg^Z@V3PHtS0Za7 z7@FwSBV_4tDM?qTXG+o)1FaX3wWLfXlMa+8<)K-U3#FGT$%V-FS|_Vsoup<#k5d#1 zdXt#C`czfbA;PLUo##Y`&P(5y{@=b>l?Dk7m_$Ber>n5a9U>ocqwcU+N%JHb)bts4 zJYp^T>ABg!O$n;w;3sv&5h0_m4z5A?gr?|xKWUl3pK+(3hHDQmLKkG8#R(9F`NC^E z8gf2x6-$m3*LcOgL1DT~#WEz)mKeT)W=fV} zGfkaMu{@IiT_RbuU2Ftaf3XowWmUKdGI5w>QY@1-6INcW=0CjlDCuS`pAD1WmS@4A_{hHn-Z#KDio zA~4=@(m3lv7`$AxqGUY}3hO!ZC6}EJZ@}lZ|DlRal46Vk;tjNu(s%=#v2pcL8z}fJ z7Gq`O&RT>ZB;BH!q+_{_dMmo@I8sZ>ie5>~h+9=y1jX?6=5siv4Ix2?;!N&j>Kcak zZ!(-fnD)@fXI|BGSlLI{;<S?IF`h?Qs z1)~sMT1Mf6#fPscF$(6r{mbHFOm6{UbXsz!&5=@FR>O+yJw5&f-sgly*N{NEeNHgi zc8~W^ z{g%5h6e5_JKY`fuP}Xtq|nmT6jd zUV|a6GYR#q%QWjmi4`q$E3~V^G&+wAor_D4{7}f3BJZ@Dmcm&_o*0F*j*P2?vyS{Q z3TGY8M&Wi`t~%se{Y8s(*5feef-Zgd_#=$~@?6P2@!ats`>>LQXGlJztDQ;?zn$dF zKal*EZucm8_VXlPQrRbzJgVelN)9Udkdl2$-lyb2CGSwOQ^{MDEGYT*-;DtV)lZ+)5Muaz8C@|cp3D%q!Gr;^iuL-LH0Pb&GCk`F0)x01Ii`Nj#7<4QiQ z*l9NgfDEWetN0od?z<=~O$#3iS{Yu`hN_HyQq2#o1>(fdeRkBaXuPb?@k`u>B zzN6%nl20r7gp!Xb`AsG7RPuHu|MWSMzf|%GC5Mzeq~u*n7L=U+E0SlGd|JuJll3oAC zBfp`m7j}|7ujK1Wo>THwB`1`8LCMofKCR?QC4a2sQ6(Q!a!|>KlY{DzX< zN`6Jj4kd3?az-EemXcFS{$9zmO1`Azn3B&Zc}mGAl^jv>`$`Te`LL4xNEMuhm`!flJC5k=`1zpdm!C2vsj-R&fQr{vF+{DG23 zl)OjDP9+OU{^?C5CzL#?Cs zO8!X6$CMmU@;)WMtmHcjBqx>Z{4T?ELRWvGCm8_bGXsl5eW2 zFDZFc$-9)iRmoeFJg@ovypm5TIjrQ6lD$g4{cVzyN{%Y|BPAbJvQx=#E7_yu%)gTS zvyx|({JE0Hl>DBO_bPdVl7D`lADmM~5wSKH!(t>(Qp5?6%vW9% z58KsUs;{TZyO-!PrzUKu-lgEsLy9}Z*_nzvq+`lH8L|_2C5giiT0+vD;p_%PE%oT2T&gGS`TI=htHwK!m_TbQPG%`9iJ~25py<+96nbm97#z}hFy2~L&+Q`?w zO8NL)`^S8KB{_48x~aWEMeR8@n7BvRD`(Tp70UVja^>sh+UtCNnR2QE75bUpcA|WG zPA=#3fWd;#Y(dlTOzYs~DNoRX})xW`yNrJTmutK_(t z^h28D|Iv@367LH4oV3K!hSuiVBPybOm>caYIR9A{SlTSN=&O7kW1IbMk>a?=SYq!n zwe}no-I{=w+dj$E+w&+4Ek{3R&x4wlLw#(VAW_O&qL0j1JivJ?#M$7A>)Qz81?Xh| zg4W^rN?g&PIfUj+4^6ia-h!z)3iq^>FdhsBqQ|N%Q3D=y`xPYVv4Fjhe2;x<^;O!+ zui$pC1Z?Z828jjW!X$B|kxn%dI;0%&rwy2@RROCGe+K$x!7ln@mK5f=z$^2--xw~i zwCK{#L#4@Df^21FpV-~t=Jqg$_BedGoW?!Qo~gJcqRtYbVvD_vU(7%7t`5=vJ|Mf+LLqwyvWFLp?DFUk zvZInQWVak-r`8#R9PI|#t#Kf`A4 zBjtvotj>c!!R(2D)7s$H<3kGN%w*n7a``LlnEJl#g&h5xU=y))Z(D^y$*yjN3K&Fx zo&l3K)f}32)u3K795Z-glP4cwN9lP+WeM0>&N^|0sEjza4r7(=4>7<|qvOmtMdUGf zn!S8|HasFTANix|9Qol+XW_G~^L|JmeRUk@247;GdAZBQ;#!ZS3C_DhQPGtwOzQ2I zXlw~mR42m?vOkAwE0BFktC?n_Q{W*Tb&C7sZ(%Pyz12I5zGp# z?H<#tz&_(qj!}Uh(x}jnel4}#gW%E7-m~%c_-F+-ZXPi^1s+4KU|N;3E}H|9=8TW^ z=Q!J`)FUsV1K+4?weFrmkID9eb;qN0=c69CI|UxeJFj?b?-Y2n?-Y3aw*s3iPYA5Q z`syiy71(Ha(qIMFS5G6Xz*_2wMW?`14J)v(c=FLH@N~oq46HmsDGFGoMN$UD-Vn_I z3_0qV|C(p~k4i)+?~R_7Op481b^_S)qb7-n@#5uEg#;wdi-MD-0+XvwlnRU<9Lo!Y zlo)G6nM}d)rz=b^9qNc9d5aK5Od>-R(Xwg6sfbBmwkPZek`R>LVNOtXg^r-?3>`t) zAqzeq*&fn$@&z0NC3v5fgss3`8Qjd0K?b`d1;j}tg$tGtU}O+NyM+Xqeh?CH4$QEY z`M?0;xFjU#$Mti!iRY4#Kug{K`Zg{=$~rRR_AUWRqKDWrH{ocnTEGC*g?PV$V4VZtzk@QfdWvHddG&>>S^mJr%$zWcy2pJ}Ztz znC&f<+@OL7O9i+(gxRiA0lN-qNvQymRi58)p?V#MhLL1W%c=?v>NaqNmWUa>9Qzp0g>|iuOfaHozYj2;OukD?2wxnpkq;gh?vmT z9qr@yy^)FEpd%ksb>D4^4JEmwJlbW_Tmjire!mwdj2# z7AnTh398}KLMR;~4zLJ<(KxOZPH;H*vk3Bzui}$NOs}#nSU}b+T&qzA>3`jm(LTKs zOQ~8#=kZ7FnqMhAJy7uH!0dYeKXv7@H?x6KhV5<9Ur1 zqDGNw8d~yeVglMyc;^)nXr`kgm9$gTROKdmzr}~*;o0yS@f22_nqfRe=~e$U{Wk9o zpyYxH=B1?Tmz5v{Br8D(cR5`@go5hAo0(Jbf~@zno5;-q&+lPbGKvF_TxvIWMZ2{x zWqHHvSKc4^Iy+gKk8@(Ii)Yh=nr;uTp=PCnnp$ZbNBFxEPnS0&r6sy&=Dvq1g8?sS z(phKjV?Xd_UQuf1;)%#d6Ua7B6?S1s4mkSIl;fjq?0M=lVk(w5`d41y8VqZ0@rKTg z5now8CVx*2INOLte}3^OS+MtKPwSY{khjqO@Oz{ZS(=qvJE87tw{t%r?+5$a8(@}G# zwRr^ugteEv!|%~I=%4hTBKZhjtaQA@>KONXK9(4U><}b$q>}{sz!^Rul9E=VZ;0SN zPYb0%aSy-~Vua0`o{G7m@l`dv#!{)TEYM!H!dkAF-n>j}i4drTp6{p5T!^Hn6Dll3 zAclTaF5Xg z23Ck4zD*~p%hZ;AJIN0*!SR08x*#XvOXol#!*F-HI_rN;I^zPV&M1&-dKonC4h2xF z#xn{B9>%Vm1JqPri&vu|W-Cu6i{sV*ZT{hS_5XvZ>EQ>`@h$D22badTtkJ)%s~*aB z{|-yq)j^Q3yo_(D?1(E5Z+W5erU%lAE%DEzWg5%Ec;cayu&HZqg=yVh>E~yb3e|#zf%hf(Q8!mc^`X5*9TL&m>5tQxsqGYd@Wp!Ex^-2G`g4Tge;GXng+#Nm!<{*_RMw|IdfT9OO7sb; z)^U--mjtx*ia3cr(#JaGKdKp^n&Lxo-^0=qdpMBuRnpWsH1p{gQ;12*_8RZ{UD|0U ze*l8n!TgS?#i63Qf(!)$By~!_z#&n%5@V_uWtG z?ReFenp6Sy?w%Ju>CZ7Ks>WZmsQPGLb#{OUvp9QnArEM5&zEXH^=psy)P72B`G`Ce zi`vst?F&Wi2a8$KuDc_;GdB^2J3Ct36_uv6&O_ZA;rE=7qQHCJ~A0JR6SxrAe{>51( z8LKiJB6jQmjUg2wL)J)9?N?TcP2q-0 zq{?DgMX5k^P&EP7lbBL}5>FMlY8B@bpd*X1tE4pRRTCWhluXcP z?Y@<#8DqteON>h8OqxCRE?%{hki^oX2Pd>VXUPcuQq35F^eKxcqQgT8Au}Be@)0d# zadpnl_p=F&#~(chDQ6V6RFZM&@Humn7j;sWRm{^oV?YZ0jq8Xk*`S}!hs>6VqiVdC3F~NL;htRA z7$q+#SueE0xpu{q_jAJ6_*S#A5a^^NaSf{7$MQ49)h)=`6@1#JLsZ_PZGj*yY9@mgQF*%2oLj#|7%L_i1L0c++v zU~DKV>sK;G;_*^(PH7YNb63&9HMHcE8g4@gQH6B5V+r6m4NU|`lvbIFmY+Fh)J+*o zt9z(JW;Jte%0MDMo-Gs;Wz0a6=FQP34S4Wh2Lr~!NcmDt6EpwWOjep zzK8`k9@3csWHSGZ*`W5kVjT+N#)VcrptY_VOOpmEjx;OmEznsb5#*l9wW9`W@!(B^ z&d?^;_k-%aEx!0_XM6KIhtYY;tPN^d7!w`QS&s)LIrO_iH)}-c2aU?ylpjDq$NWE+ z96uH$W3t5A8d5=x49yo!-x3%n#7hiq6=H8Ad-Q;%SvkxC6zg&n;v+0F-9RMGD+Al%_GYc^&V&mJ=!O zwdoanf<91Wnnerv0#s2`V{I{_p}O^5ccvILf+evpzATpP=cx#Weu-SWa@5N9>dJ_% zXvM+2d|B(v5j}0|Oa+o~LU#sI9Jk2Or#i}KS@j$(>fx+K-jtWlD(MA5qn<|-Yuaz($;9BR%)v#L6KOuk805;KEwj<6!=8aic@tWYdWwn#B=&{KS9 zg0z^$bj1Ulzd6yF$J9MM9k0+ZulzYXE|S&7O`xAnn@5i3Fm|v;e2$#*!6}K|=}cU? z0iCbV3OqcFnW@IZ;w-$R;#Ug@jG*hy?o=U`Vz)Q|4Z5;bM?A8?#mo3cZs7V1)3gT7 z#{|R>6LleI$KoOBZ56z({CwQR!agxmt6+plkaTvwol}N%j$`)h?i{XK;>)z#h!(+@ zITWWEH36^9#OpK%?!XC1Yqm@5i|GEB*H(u8t{+E|gy1uF&Mgw-RQon1#pBXz-a+B$HVm?-0)%4%(G+jq zmsTl$ERd%U0E>mm&gSmd3S5t#no1Ur8a;L&X*ceRHQ`R6rp6??+ z-L`5z3%8-d28Ci+A*)-Oh?+ft+TvFCgcziuY!fFiX0P!CbSn}^h4#WiU`k*UlZHqq z&@xy0+LekEVh%~}&H5fD6FED`F;p6Oi9M5)t={*$- z(649j;(-L&p36H}!z%IM#_%qtP|Pc=G}FqBaKYU(Om&-TrbwUH@ZwRy?h2b!HM1(o zApgOp6{V1-wMpitwW(D!fi$BRgTpl21ZW6_b#^(KQK;MUzmxz$EB} z?n%fo%uj;zg|JD$`-_n~%Oo(E0h7Q{=;xRM0_+r1P(~7jQ9}|x1tJpXn*xaDvZmlg z!h`N9D8TyP2OgYj3YLilBE09Df*)Z)4=K8oSRf1R`KI7USkN;C5GWC%`Z)>FGO?h4 z8B_2hEa;hnONj;bWlX`3u%KrOE+rN;mN5lC!h)VDSQZuxoR1?Kg3XDtf$|h|$qaDO z(>yZN%Zws4z=|RbxR@IpB<>{v%DBhz1zk1v-hlE`^&vH`Ak6( zWW8Pd1H8T)RG4q$)(7T{A%f#BVvVrZTN}GfYmWtzz*Ap9rm|=wL`C^q#4H}zGa%gu zR~GL?0XgN1pxeN4^ds5-i;&x?6!G0EmE=aeEoz~}*YbFGExL6_Eh6G{1!G_rklrh` z2(^tlyS4fHxa?>R36$#n!Ij~F+YLkv_`b9GH^f92WJ#PKs=M8*0iwPF4yHl0Uv)ZH z44v4T5k2Yz@{#lGxph#Rvlc3^WV&jr1_#`BthxkB%>RwFxuyCh>5=97(|ia8Ny-p$ zN`Yk20Lx+pU6d-ruqL+yJg5H$n;!XcoYv%h0RUKSZHosc!DsW8*pJZyw=7Qs|glOnlAH+_NdbOkoIRYQqnImbqInu-`kcC zBxN^si`2b>Yd&ulRh*DM;9`!vH{GvVgg z_p3Y_Dc0mn-UCcw#gB%7;D%Rr4aW7ogW>1#q|7&%pqJ5Jb5atZh51>=29V~XB#4yW z$U{!vUUoK`+gu=^t5{Rn@WwgJ*3^JkD!!><4ry`P&p#aneUb(y23Sm3B95l{sPyoUxaJSoZPd64%I{V zZdK<5*kHGo#o0QV>tVN#OMUgR06ar=tRd4@l1tQ8Md~iP%8XvJuF4g@)Kwgud%Bv< zWU=dL4cO2W9kJjqtbC~V)X}QJhK=sh0K%Hgdg_)kEx20#$h&AL03G)dr5_>+-7}QM zS{Z9yHKcc^zjsq;%n3|^qtJknjX#62IVXEJTpZbx*KrZ02Rcl>-xso{=usuI$7*an zIv3f~Dv=X@Al;ttA$!-`;?Ka`uq?7Ccl#1xJ4iM9d6g~yR5Y6eRcKoD714X68e+{l zjLW+Gi?h97T!Lzx?TckX`xL=h1^Rw*7Rz+XkO@MILYbap&IoDL|Lw?hw!svUI2STu z=waF&GC`^gl*Hy~QO`-g=y!H)c710a1OUhKd8oR1F#C|rgIs#ki{$CG>OEu!Da8hM zRJd;O8dS;P_gGx;@$M|!_!$}e`mF=5Q7kAWLSlU=M3M?UcYS~`(;@4+!Wb?ue!?^B z!-3ab{d%^oa-PNn+g2xJ=WCOpF=^z!8|9n@QqihdnJV%JB>se4Z`k87pUPE;SeN`3 zuaO_gnsh3wVja?RSeRY|OOs5=&?6tR>VM}}{}MvMRO2aG3~eL zNwd(euxh7deyzs*LIrxb5l_W4uY`43AycKEbe_JrSv9c(XDB{-u_=!e8Dp#4s2bC8 zeO|sS1gSLBwH!U`(1dzCB@_9$`3A{TOI4`lifm(ECOCT`ZQ{()l*5+)sl~_j>2z!k zcbs$%*R(p`jN5EW3hn1-`$y3nek7Cg(d+0|gNm#%(Yw}~o8^?ev}6NU3+0ink;1|L zm2`529(El_>sIfIEf#v^+|}1rw{!;h&g1wQPt7N5`LsSTC+9nIx%A*3r2<8#WPob& zT#`Q?BQnOgje`dm5$QOk+3RDuGb7uM;cO)gY5goEt*xul4YVIJ*2;)$8jr0?h>Wx$ z3vMwX6&H$?f|z@^sH%QG8Ybh^KW%FsUS7z zHPZUFbX8n`4bEyrzDA*A{yqX;tJP{=BQK3L@zj4$0X^QDy8Gt2^gpRkdm?}_H6*=~ zMRzXwu^1kJQ{fU>VuR)a5+*FZVw1?`2B` z{k=>bT2T39b&rO3*r9#<9aTuZ*>lmoN@GW+K*?etIrV z7&i9#jMLOKzAPS#_Ho1#8&JRv8hQ(qt{$(w4YG?1llFPy2&9MwxHb|MR{g#WPM^&- zs&3On#Hax$B^tF!hYdCFPh0n=ZAXH^MNwYSfPxx8pB*jW_$zaaYw6i$ zJSbYw!l7zF)WDMgPZT^gSncV7q-&bAa=w++@m*Nw=y-jO3hHrUpBv_ic*Sy!qdB%B zcmmYgdLO=#@~?upRBfk>;9|&r>+pf_F3@+goy5LK!?!d`pihIz6lH+yO&;yy5rV%A0s|V zuNXVwu3m5EKC^eo1Kke~K4shD|IB0Nw#JSSF5^j~6$4e){gt^Xnx zLXe8z5U!N0JX#p0wNkXn+)B}ir`-mgX&RC3-se|}Wj(#`tWWRS;q>q2y7#;tVr~wY z>IysPoI4Z!%ywygvlVDshq^IU^r-TS_c4=P%Wc^j-vI1Uya%w60VOh3w(UxGV{tZe z5YL`_?`M*i*SG@L>Fg>*xB0e4en9acn2m=tLrg|x3cE2Fm&bcNL$ z@T7e}q&>dsYtH5MPlA=1d*#9T^P;#8FVJ2RNvAc>`l> zUN;B4)MBSbBc{0V(07UvvF|KB90NAD@E67!#ac{~c!uE(tuN3z*B9$jsS0%h=jVKO zqj=@=`m)3%C$Ir5BycEFi_;RZK{FJ()kNoD)os9fN3=YzEOz$Zj2hypy`uuLCpJIr zNdNUQ%#G3WVvX=C;-WP|or96_C)?Dloa_@LM2)pTj#^&9Rd6Mq11Q{*I^# zwu=U$k{vDX&entjT2rhEfyj>VWjJm<5U+fAi}rZ8kfJ>bfeY*6bxcP=$4zJ-a4bsp zTK1d3Le{lrd!D3tu#3`D-PL~O7a{W0U6)?$bb`KtsADtJ_5<*gjvg7L&cp^5Lmhy9 zARU1m4gVa(XRt$#hT=%%Xe1{`-JIq%U66Ve;D%wry>V#928P)jBp9#lbAHEK*>;x-fl@DVJYbQ-7tI3$po;ghU zX-%6ADsmhcrcZ3Rmnp1|Z86MqsLcQaLd2Tk` zSBc)TDyhIJzS%j1L^18hgak^Ph^@^WT^l;oElPUJR9^fsZO;VrL!5A2{8#l?70Xd! z=|8rR@Mtyow8J+Qc)UkMhqlR%oi?TppVb!sPZ!F$>%6~t2Q z{F^`;nY!Cbx@cH!16xmX8P?7l)@t|M;#PlS>F3-GRcr!!I(CigSlBfI*QjIHs$)bi z4{}!~Aa@Hfp|tT85id}5^dNgf0oD0$2HXtDQoq@ID9YVn(J*MLHmwO|Q07FRgZ2Y@ zY~~{{_SBZ@&m#Q3QC|R+DO?DXNq(MsD8ub3tSWZ!YPM*-X@jj~|a7 z`@)0yX<3V2gYGVVjR*-nuT>P?dL6@+BJi$*61<>obom6Nbc(H$>d{e}>4t-#uTRpu zxb{i}|7y0ABeUcV!xZVrEcVYBFEh--A`3buMkyqTje~0>vH2G}G^)bq`l00dT&U00-RJ6^&tWU&bv~EB zsb)|CBRkI%=(R+?F<14F@7HQB?-vfhp{xBZgVcNh;6$kN)$nT7aJOn8a(;C~_*5mC zQqhx)AaFmBZ5L$g$50~xk*#JEzJZ)U<*T>8EY-k!RM$3D&lV|iMIfFG8Iz4{|vRAhGezdZ`(#W*jn>o%lRp{7W2bK>1VJFL({{+s4C;jblLQY-)9GaK|m1-&=yE>h46V$R(=VyH3C4Q5x@D}m26G)PO0RWpv*pY%V3@8-h&_)!j+w40WR9% zY22OlZB%3a?W*1m?QI;TI>CY6={SB-l${7Fq=55_h;uiAx>|=PN_l{|$WHhAeZRP7mRYpxB%rvxc+7%nhMN(SXekMUgLR&p?Xh4PN?-@_l zqXE?f}L38$s7TRxHQ6W z_GPCHA6Y}9UqQ6Zj@s>BNVtxabW_4dxz|~k4_d?o*9ol;Lg@YE60cq93GO(xQpZ`O zGNZfFliVp#h8B>Cyi_gTMO4QlB5RWmu}GWPLy!VT765rev|r>G*-HC#JVUiwt;p%0 z(yN`X_GSA}5-3QI*penWaU#W!@HOjpqR{0i@7)m^&<{;u zI#3X%IJ`Qj85?$W(5JkFx*+lZ@QsuR*vQX-yPOsw7II3XR-*yYBB)eDXI4RdGGp<$ zYU@R@b_3K4Wr%R0?4bRCSi6XLE{;bV$o79VXYD|Ds?#Zec}*Lm*<@5Kau3K)%&c7dacupfA}0=^e=)Tl!&A!bgoz-XFcp_jm5Gh!k)05V#= zn+h&JByh5um=(XcA=+5J$Sbe}tpu_yY?*r)>#Ci~$(stAi-O$qFMzILodoNBDiLxPxaw$&~-5(}d(cAbv^lFrb~B$s;PTz)B*Flf@B6bS$Z9`mH&h;X0vl~5x* z;V1GK2S-2!WHqqZZ4Ui02aDr#xU8uv&Og=G9y;KD8RCZSd6YLLzi_(?vn%Jo>{_kX zjoI*C21F^`0Ii*+?S(^`S%unNR-q6;lHoD{>O%)e-lN;CS&xN|mv}Nvr3q)1s%~Z# zeMS+wL;yFcCdr+HF;(TA6~UOen)@m&Bm;WlnS4no-a=rtqf-X6pCJ07 zSa9IEkq_fgM@#4iu-yTOd~Cs-AulgW3mCH4`u{3H;p$X896GIHwNMo{Lw^}qUU7Fd z6o^Dk6RenG4GrEa28XOj6qyNUL9V+GXHMHzW9$Kzn}{^3H}UI$a!DUxt;?K_Yrri^ ztZeyn1hX(`94MY+;&f0eZ{I@(f(>c#q`x8}2J954ZgWZ)8%zX)I@xw{I~gR3dfVv~ zh($XGmux4U5zLj^>7HBMPAS^T?SxSDwsThPyh`oV$-9f&DT!dIcA`LJ`7PS%-aP+! zy60#oN6Mg)_2cPuhQoP(2(ILw>+|DIh+iWqi~Do^QvItFsHKrLHwBs^P0C1i zQmU+PO@WJ#Psxnf$XaLp86w-rP*|PiZGf+lErc(voaJ{kD!6H!^=HIAH`W@5hPZs_ z2GY8ii_NBUbfvz{yYb0Yn|Y1dy2S`YPG^Jxu9j!%q)3*dH9Yugs59BCL}}2y;3p}&G7m_8%a9r{}UzkNvr*fkrf-jK*a z>!gxUC-2BRsp3Vw)Z+v+(o#eV-8az@>zk&eFFtdPo--XWbiQ~rUh2_UkD8v`dg5z^ zf$Oa`(xX!SOWVdIR}fdlrt)?9zKtW;#U$4?Wik7-$6)`Bxvh zYF8Bs6(+_90lW?+aSR(i%M!rT{^%=m^ycQlobBcrV>rZg790nXSU1aoz*ZC(&#|{u zV61XS%=26al9PMI!~iwOgr`%1m!8ypab2umoFZq!a-ioy*ONW{ z(Ff56UF!nP%>>^a@+`CWkKk!cg3PJk2&YV0|FsTM-GJ?ho-(TOVHB&}4m9Y_>$V?Mj28V5FZ zx+p3vv%uPZJ-E)!CJEfmwH=M&1(y09Yl~cuj3m_Ss?R{f%Y+6B=m!c&=%^q(^GWl& zA%R901x{!x6@WEm^@9m^U5$2v9W$go)h5_!N=t$r`zTDX(`F51cX6-_3gpkkF2fL9 z@yf?JStrb_YZf5Sk9ZsCA{}mRbD7ySv%}E3Ww5(_3~YtQFUjEIEa+A5Is|ZO1TRdx zyG+ZzTc%yjR)6-L++N7xPiA0{?&my}?6699S|!kU<$*qgq(%a(RUiI|6(_Ys!Yo~9e zd2+L31pNm_m^O?=)l>u3>{&YOWOPg-Oh7ezu2drRKs7sE$%%rZ5QoPZl>Igl$8?&n zY!?-6N0E&K%1RbqLa~+G3Zjos>8M2CCVq#OLt8YQ@~7pPL=RIe zhGkm>sFTZH1z;{%bGDz==YXT6o#9UPvfdf2ir}5c7u5`Hg& zq;M&+xJA6zmW8k-u*L^)_~9+lTegc*U?HB|vhc>!;m@KL?2s-ol;;5@V$%?RwCF~4 z3+m)2yM}@V>wJ~msY-sqDv?FM@+Lg+Xa;&aY}6nRBP%X(KUgRW%ns$=_KT(;6TKkB zF@>RZ;GiKmN@dgmg)Yuf0x>WJX%HbOF$a9bei9jQ?g?7<3?`F)BZy}8%5j>}AV`E$rY%{4UO%BD##`@P zS(z|qNqesw={T^Z&A-Wn2;bsAT)~H63^2jNSqAbp3bKBNw{a``Y`Ve;ak$)E^rxYg zD!bfQ)k?)%ZKLO0G?D=N!ncC7qL1=|uB)E!b(G%tUQgoV3Vbgb7+6Tixg+xQ!&t}w zt~&`tit?C0e1UjIRIE>dnvR>cI0RKbHhniu7gKHfh%1U)qDnyle)KVaT(k+}PJi1B ziIEPhLXR&!Aie7F=K`^%Li)JiHTu=6#6Bi2ou!#7+Uc-wT@pcv`x%Ug&aGo`TWazM zzj9GaM)|eLucJtWCjx$EVgu_M7q#xLHOhU819~-Ry#nA}6A;TZU?CL5BC0s1OO%0o z7l(q2nWg83+O5wut-?;-?$3O)x#75729S6!?o%AK;^$_jYi{hz2?CR5M;}|%1)4h3 zJ3E9uqw=C32vAlz?_ZU+T}88;JwhN|2e>$+yy8BjT^KN50gbiFFRJ}=jwrQ%>|E_XK>PELE!l2|LZx;a1gKL6 z@0gTraA+;#F5_uN)GW#Elsw8zczCkFGK@Q8U?C#vPFx(((=pr9uo$}W9*hwA-FO3W z(O;mG67$iB+j7-{7%0ks9V*AwY*BxK^}s_9+B*a((B2~mxJJeJw!4Z!M2B+1$liKE z%kFw%N9iO3UDOL-Y7IB1tp0e|)q5T)wQfcnIjamoj_=y(wy z$&)+UclL^Av)x)Q#b)$jriz|rWT|#tPPt7%b1Dpna4D#;q{9+JjSNErE}9B2S=+g(urbwaZCjG5UWy7c zMzpw~!f@tlG5nPY8fVO*-!9*va~AmZ2^bDM+~srTwoT#zzj$9!k97Lru1a{h+dH%u z5fsDuVqxf9_rh(MPWBvS3Mmpf`DnP};;l9YnyvQW(6D%5#Ga&zb^fTdUf2VOhXmgt zBjC`(TlQC8m#%+EXMjQB*UO8CPM%>4LjAV;YDAeq779b5(p#HlVEwa~Yr+l`n zVorH9PF>XY;pn>|^4oxZ!NsoL_3AyiUGeJuC>=Tbn#QzWJ~-*##NR4<35)EAe&Izn zFvUX~LpA_NHS;QWcNZDHUG3{Ibyc&cP;&L-og(!S6H?8dwgN(Q$`uQ_Vl&Kx|33!s&<$Buhv+^-HI{5czPrKL6Ff?ADKRd+iJ zq-B-a5N-#d_gDFKH{&M<`Xh9vZX^d&WGV-&l(VM~Ihtb*KAz@a_bk(#mZLe7nnKyD z+5S{aVN2jW>87w%nnD*C$Bt44=QL%60hiNpf3&>`6~VXbAdvQG1%#ZGYr!E$H3qp5 zed@PdKA|+)pG|E*CYLcMTB1W?jEknAyi{8-ruuI|7WA!tOr-o|IB$DJkoW}sKtYU3 z9i^ee1&-A9ppIaAkkNd?eAtomDsixCBn+V54fB_lE0M>&Ms|jYXk_^5Ib>{P+nI|7 zM8YE@D7P`(#WV;TcPi(8hjLJFpYrym;E;e4q-9@BBgTE>fO5!!0c%4>nsjFZ{Kk{AniKa)PKhk)3e9Gw zfoU?%s=@*ghnoWJWdsb{WI!R>nRwK+=GoN(Jm~R;Ah<3FfV-bk0YoS-5DwkR^8oEu zG8UOT$bin<$$1X!Ue77#{v>(!6h;Oj+sWu7fY3q|eWXN$8Lel<3QdauvUm>ikPPBlAPO?Xia=?YviGWq zr|A@o0%&nf0H(Mm?tp4}#^GcIo>b*EY=d2lGn00@A~0v3e9aaMMe+{rN1ny6s{4M_ ztKFksb)%khOi_8%s~UCBF=2cvSbX!wSkRz* zbPB3aifK>q+D{_!MaXUJ0?I+MlOrF^;I_=vrd41f6Z0L;=kUpXg=!4|<@XcF8^zQP zms&sE-TGnI`nFonYtX8}PV{APESJPPBN~$2!a2%;OV{Cl! z;+ule~zSz(?KUw*l$G8 zOPC*o$-yp}Vo(qj0Z|o`DF#b2MMPA;L1T(L07zXo0xD#;CxltMI+#w@ddWAI;@l=Q ziKiv{#&P0BUpzju|BpU}*`ubo-xx^m{#Gkt6%Y}&k{5uDQ0qZnB8P~5FarMq%@^Os z?wxq;reK=PIFbR0porL72HD9LmhuQ(^muDkY_dt%A-Mby(dNmoKwT*0SQ=n}oKp(1aL7zlL zpig8HU zw~`s}pA&zvZl4ts#|FzAuM?VS(4@oiBW4`G^m`V~LvZC>6l9Hr6+~Go=n@gj2e!eY zg54;PhL>+4Y{*F?bgyj;cQaR-v{nZE4eSDzgtIPHi`9dgi6oc7vYJx(7vUq4P1d-JoMs%4$1Y<~4pe zi6RUS$Ojfdw`rV8Ego`AXe;MbOl{XHaVp3Fa4Kk|=~ObSDWXH-R0iT%`P8%F*u*1r z*BWU# zEk@<1k&)ZtQ1qPijI2xp*$(GF%*4w6PQgN{AXdTiIO02+rahn(pusB&;M{<`QUN@m zO+)^KqORPD?pTppL$69#;y2ryg6w% zVVI1~uk^C{ynYa{8U>Yj@)YhZ1sY8l%(&i6boXY$^=3+F#B0xm9PD1;(S*7)<+?Lb z>W&F>qhk11#iPdXPscU0*Nnvz>e+PM&e2H0gxTQLVffpIMl1A$&}bDuIy4#;8a41L zBiQX;2@O+o)ZStE#|(SMcwSf}vnt)K7{jl}AcGhp#I(|n(_u29yau~S79^{HeJ&bw zSGjc5WNjOHZ@y76PGl~mm3~{1RnS>fSlBU-lr-UO4a*oMj%#g~xYjXFmS9`E%r``5 z7*AH<9}PN)F_0phPY|JCHHBaUrKEyWiqC|}8j9tu87f6rfV%_qgtcGnAKF#BKdBr_ zds;dCAV;=~Nesx=Y@`8U|9>gRHpF`iW448wX7>y@HXn5yjr3c_f&jN5- zDaHL8z)f`n+*AkPrj`ac;LHIWu;~G=?f{PX)dp~*1O}(}WdR&kMx*t0=^qgp?H*NF z-Be+rytfS!HvoaNl$z{{1_()$$S)>(!2bIY#eTd2KknQ_}XxKPKd-K(u0^OaTzuKmbPprn)J>l%oLCo&pf^ZL~uH zrUdHKZbGIOQvi$Xxgs933Bg0oD8PhHY*CPWK+IWeS7}0wO!)qe8U@*@VqF%Xqf_-UZG3@wujP2hytuq79={ZhKmjb7}agt zR6b=2fOo3}wbO5e?l%g+C%Y)XsD@>tpa7#K3NR7Vu@VJX4Y+kv05&JCp|Fbr5CH{* zf(6h5Or84vex(ssOBINlZzDwqm%p-pDCBSl+wINmlK z*JOE=ZX1q|b#T0$3CG7eIBvvoCm^;HnZw~YAeYMy4BOTV$MidXcoF?h@Q@+i>d^cS z!^E^=m?qi5@YiGq!_!JGJ8&mvw~!qex0382JVlpFVIezkjm1;UNFdokZ_9Il4a2$Y zunP*I`Q2@@gLG~tJLn11r%QG)TC@k*0rIhdm{XD+hMnv%EKahn{d5i#XgfTIv!BC! zVTmNf1O`H*F)djN;aN&H<`Ky)3l)O0z~$dh#_em#u*Ga6LoU6?-Q7*L78uo|?5)L} zAWkGDjKrzncqG0|eH#&LhZ6x&!MobFP>j2^?D}4Li=hk@pE1y`JZAG%B}38qtr@vq{jRcJ-K-g2uU@uhlspkI z$(koZ&SfInh!P|E<&@a(mhSLk&JzLSy_UxHh%~*P2ms-c3-d%kATc+C+u6?QO^ton z7;#L?ZH#wdphx`B&}=muqgIHDcJ_NaBf;@xXKc4*GQB#uGl9V{m3Z3ZIVZ7q?9@!= zc5kGGdMhytO%j6L@@~cD2r*Fw2N{L?~NEI?hkpFNlIVX<~}1An)K9qX}$^ zJ#b5DQv+oxb`ObA43kNDLKEmzpk2;S0P_*=!%%j9%C+X9Ev4ApI?S{=Kea$WaWM1( zICT3y>dM>^3tZSjN**C?lC|yF8`fAAr7PVcYUN^~2?L8Xy0U8#U8zM>Ann-bm8C^g z@rGBrMYJV0y6xy6supV8>TaZe;qDi}t#rNF3X$8w5}$+Wt?VRXQEF?1NJP@%y*taQ ztRe`Z7}*k=W7yTi=v}o5u?=wMUj?nhw8yh2IeChGnGgxntdPo;3`I7%T#5@3Mec1V z03agBaJeD`ifby8>TKM6SjM)uY){rZ-3aRds+SuX2&mF#GVX35b8c5LSIq2PWYC!! z8O|C38NM1ecwz`RHcF(oA~Gj4{%n_<7Ka_`z96v`Vn1HpKhTB79!YCA~y+}*!O0do~1krZzv&EpH19yJPNP>VfH9Q z3WDR#0*;BtDiyEc=ase#V_%kb5DHl7?6v z!bDx0K~A#UG0@<3$U#(L?op_nOdjILC929X5OoWVf#Y2@+=xI;4R<8wHwa>*GA4); zFsE~4Oqw0_9))uCGhjB4Lbgrn?piVj+H5q`;@{;^Xpmb#YSlq*0jcI4cncK(=eLs$ z2nWm}F6Tuwu==7g#pZY@GdY|J9wg8bIIwCwB4dkrBZ}xEFyBbV3tMSL;a0Rh8O9k`nmI{1FAw$Jdp-5v;i@ne^=O^2dx^k^$?t9op)L4&d1iUh^rXRcc0+7s= z_L(Wi*-%-RqpXUFbZc^!{iaCVS|&h^t|g+WC8Faf+bk^+(r7o`62bbaID+OVt0*hd zw3t_F(#KNHsc*z;6L~QbQ$ zmO$UMNIiyViuWP+Qk0%{4~uS)zgv0a9C6LH$}mT`Vl6Q2L}he0BYPTlxW6M#;vHfI zh03U!ZAXXE&qw{}fQx2axsgIs7=b@BjA#e0VbU=3q=3xQUzoo+oZ&(xHw1u5&Jf_1 zhoubxE4?A${<8C@83I;1^+k^%U<~5K+C3(B06|{a4uC9_Ba$)AhHbt#{hsII3CA?c zQsC4Vcr3(dF<6-ovtY+7olp&nB|t@xlG;L4Q8^C7;trh00tbkR1I9k6^?}~+l}`kD z8}$WQ!S zg|w8MdS{Xp$q>3+ArXS{)jN~RlxO|@1b-Tf}ca_P8AiZI6@T))63IG!;-K!X(Y#i?PNDQI_cDIqXJuA zdn&}+r;rsUMfbcObaF928cJk0SDQoCIn>;aH${4turMJiQn78>DR68lxhRVcf;&TMoB+avMVJuz{SvJ$QrO{@()iQGnG5y)c%UI9PF#W8ieAB z@d+Uo$8#nmO4)-(?rEuEV2F<@M>F)4zkgCWdUu^-2m4DfTJaWWXT-z@WXNeO1VmkP zI>BOzs0+2ij{ZZTYPm019^(1yzR-WvUBe3fM_r-+Li8UV-RR))P?l+_QjgIp4FwNq zN{xNvJVdDrk4bgSNIWgo^>J`kJ@$R&7rJ;HumHZjmY;fwlM@yk&iMg+BnNOsxakIP zO)&yj8NiXS2stP1Hvk@)0t!2hmxh-K;A}Zu4B(M`$xb2&X|fiu&c`DJc$JWr12|z# z_$It#FMvn3_-gUTrPV@00T~8C9YIv%UD0L*@3SiU0uv2VEC>0Ift8EKW(nlC9Sf0J ztyk0d=WLAdT7kq7Q5odd_uL-^D~MzcFvw|@L*O}2yxVDYiX$TF5l*X-oK{cjtV}l| z@q~9;UCkrrv`RQ!bEo4xV%{;P<~eE1an`d+a9WMzw0e@F0g(TWMPD2*a>&s=RuPdN9@;sU&RY5_)R}SfyYROMjYQ_8u2 zQaSSL5pv^&xQ#aOf$QWBSXaxaoMt$*VGKM$7c*i6ozH6xI9c}fE>G-0H&wTI>9~=4 zpnn$P)|ptNYqA;u^jORb-&oT!gldLSbt2wl+i+CfO)NIik({cVsdJ=6)ki#4=LxYR zQwV4!s?G=*RY&nPp?xd_{_6n!qyhURZwUCYhj&qREJ3oF(EAQm=g>V-b%FP2iK?@d z7F3-u)mV@eJ#3_ls+;qx^k0tEKw(l)^+~{Hq(s$4z!5A;RQ(p2OyvD{1wY}G-xm18 zX=Eb|89&^SjTDsqc7qF?tqjJbRCFd*oLS8x1hz3K<``jvp1Hj$(uFhGV2)W}%&QNQ zF(5Meta6AUKr_W@agkc z(s5Y3Cz<0z%DF#CE_#7pjzBZ!Glt2{#G3tDUyXnFPGj6@wq>?lDxM#wTsTkqQHS9!folkcJm>8AD)`s9BNK2jWR^Q}HK}*;Hf_LJrY1@`xgu zyO|f2KkBU)h`#8YCE1>EX61e^B$<>bvIWvs+L#sWsp}3HXnVAPWstYL(R%Q`c5` z-gxoh>6&wFm2c+c@&Z+W%h)QvqzVx7QZq@*!P7neKH#atb}=E^Do?fzr8UwIvUT)w zg5{WYx_76%1F~L_bL#0192G=rnH%2kp<)St?jJ! zQaWjS`w0Xf=jp8N?WhqO@}hZqx!c<#2^G9mD_bsYd%O4u=uvrlySZqx5gy?Xg}(SG zc@c9+)?l<-QX1Q?jzZTEq~L4h^zpP4uh_MKD8Lp2%eBp&M)#YOrTLXerGc46Dh=^C z)QZ?5<(cN<{(RrNq{9LMF`)?M5MTSe5&!>Z@BM@9D$hI5d(OGH@9o>SyKn!H)Ka&^ zxyNn0g#}R@1u2BseKdfj0S9)AN>MIXt!vAFP%YJ#k*O3_>zK}3lVP%CLb7Zbdo&eo z1`o^*RG0~~p=Ld`iiafBgh_BhGI)$La)ou+m~50RwZm?)@qWI~`=0ll`=h(1mLOmY z6@Bjc^`7^A-skuGywAg~dG$iYExBjWlI&BrxLq~|KZ5>HgQcMBwemBTgi&82c^=%_ zwlaDhwq@!=s|;u1u4G3`4l>WdnGFj=v1kDmEHDbRGfEI>AF}pI-o;O}1k@WsRHRW@ zu)qQbNR+|~TA?D~T}qzqnhd+!*_TnIkGs3#_p4VlNUfwk^K;Dgy53fjO*e^S92 zKpK6TX(RB!;yOIkwGH-s5vTzMR@7@At*F;pKX5zkgL=&aRrOkoG$rhU7?VQ1ep53K zro3g_b!`Aru(_HmBzH<0wmonf{Tp1Q(ijw82PH5OY8()Ps^bxqY;dp+U69zPo-d4w z5aK#jJs%p(;lNf6?u^>RVK*++hF_^oeCgvcDN~24iaS3AgC9{-E||wQiWRz<4=T z#fyGkL{;&kpBq*cFZwxDd>ffK+|Se!V3IWWqN<7){k-_9;zf72sw!UedXuW++6kq} z92yvocMa^_SXF$%ir?h_oswf}J<-y3Yb9o(QdNA{B~}&Rb@5fjDKy%G_pt&FCzOF! z+oY;E{tJ~ZV`ChS#k!7HqN?~~|M834sVZK+7Fi+_X*riuRh%q!5){>{;^YCcH2~AV z#;t7GJ62WPeeQCridWdT)&>XJH<`Oo`9$1o=M$43t}4Do3)ooLW@;f+6({;<1-HHF z%%As4A{#8R?yg+yv)h zRTXc0|E^tno=b#4;r9)`14Y&Ps^Zw>{KSXIH(5Y4^nX55qFR^f|H*HF#@ntcu2Qd3 zLt<4G$Cv0&mfxwW;>9#yR#oxQ%uJ@!r82aEs^XW&&@Q8@IC0g|DHXmW`?V1&_sTk8 zP@9$%cP1m{f19}CWARwq}P}oL{vJ3Ci~H`~u@N zqt=%cf3rBpeV^{?FDV|EtImY)KU|g+ue*}sBYM&#v`rs#4e6vsbdkler5p~d<&_Uw z{c!Bxqgr{ukD*%P>4H@mFZ;R7HRg`E2TCLP>b=N+RqxfxRipcc)fqpQ|2=VVxgV}r zRdMYsrnS`*s`~--RK_?tqJnCk%;Y#|{+3E&vI1daC4M@Ygu&a21oYQX`y|5vv@IZ^3GWySbw%I_Ih#PH088vuIg;Qtj{;#k_W1a_w+T zw5jK}jg52_|-?qZhRh+=dER0-k~TgBys~@B+<*vf=Ig$!`|a zje3oVE;X{`4qE9d&)^mKTIvGB3=2J4M<6c^LDJ%j?w&h?S7_a}jOS7!Un(=lj%+Gr z!=I0-XeF@jkNLSv&vArln}?!6;qyiDLgBE&yKp7jqGewND3V4{E1;+gqEgQ~vlU@i zc>ob%Cc^y0<-`uC)>q*hY*T&*50MGQFf>X~`ikEHntnH#0hIP^^qQgGIKFP8uBTC4=y7di zxo()LU$Lrz`QEQljO`>=hhY=jruK)SkV59-J9MHNY! z#+R>Jax727!(@&Cf6MGDMT@~u?z_Wa=&>tXZt9yu4A?uD`^uL?_>}wZn%!3n3dZQm zeYY#+zPY$zx$llTMg1M|T2y+K`{poDLsssa-b*)+ln^i$CdRvYx$m#OUa<1;mi8q{`|FG>_f6K(egF~{Erd{oyKqC9RIaPlpt&nu z?wbII!E)bIePy&K4I4+4`<}`vPi?CLERxtm&iT|X%1*QCQf0xXa6`Lt-|g^Re;IA4 zi(KE%u@p)Xv*y6e3J0y+_dq{Y?t4@}N0j>>?x!pFUG1mJeGm6@usk+gVz{3x>Zj_7 zxpLnF{cLa0&k^Omhx<7UPf?@w6Td$jSUfzPGmpHs65@o)xN_f9Iq5nPQS)@VYx6TW z9`w`U@f^{3RK0CPx$kG>W7@dfci(MXAp_;U`)-dY_uY4YxZHQ&ZA>viqA1i&Oc+YW z$a3HI+Ggdx%T``RpT3-O-+et~M+X9FqjKMZJGps8d==&ske~H9$ADpbR4IpfY*FsJ zZ&edWFbucaYVjS2bVm;BXmZn55jD8hPg+LilOLXpiR zAex9{|8nK^wXP<%DEIxR+QW#zf3(n;>9=Vc@Ah)vuV45gZkj_NE&^}a9o`+~zST4O zQ*Sfg25H_i<-W1gK7PTiBr5_pae;-<36jC>@RkSU0@bwA!~@P*Xn;as+Gu zUo@AZ-F}rK;OeI|no#ZA@^WEQ+X$_06~A6!J;v94v>LAn(bA+Itmdto#yvn1;~s=p zblB{sC<{Qx!Bz8ayLr3VYTj zF^oGkj4i8qZ_&uzYUGm!Px^6b)w~x%HE+}TVuo)OulalV)x3A11{Q4PXiYm|BY}m}cTqL(VjkZE)x6c!%c|x*+<+~! z%gr#d7`H5jL=Ge4vM5@^4G_5JOtp~>==Jkf&HHL-T5x9-ZY`{&X8z6EiK*WBMEEc9 zzal%v?yQ3i*EHW(vmO2$Q%*6sB8bZh9KodN*vBWSV!uE#qR1T$4@VpwDRsah;Q*4Hl4ut&54Hd6~dN6qcyGBQIaQg=*H0_Z` z|Iv0r)5_PPtD$MOjAMCo5+zhLc|@x5t+f94W@y@fFdGQsc~^y|o%teYd^I$UfQErM z+pD2zZ*yqcSO4luml2xQ_x6 zg??@sn)ZLcdqUH`B&YLxFEs5>HwaDp+V@Rp+6%w?Wl!BK(7*da(;Nz)FBaNx$IvmssqR9_l+M5O zVP6eRQ-B_xd_^g|t)XeBf4wlnLqNmT(6p?6r3$G_9|P?`&vV-zeYnp=oc4iN1G3)4uaw4NZII*Z$GF zG&D^;V~L~;O?!n4AvEm;oxJrlNOLtbt0vZg6yrG|$;n+Lb}LGpHOqp$uWbNUpipHHr3+RjR%u8f>? zfR;>OQ;jH2>J4034fgwWe>Ya(v;BN5(O7w*W6Yc%tzL~ip?rdZBKj6D=yy_$Jtl6e zvX4As(?T1MGo`ACu(7aXl5|_xaScaxkN8R@E{ZKZBVVXzH5%5Z*fLo^VPDc#h=h+V zoK&xAJksvtXwkN)6ShP6Y|S;z;(^}}LHfRbMsfk|$E@8lNwQsSJY`hYVyqS;UV6D! zG)bh?y;-a#X@e$p*Lq7MH0hnsoow3oj&guhd`VWdzcpV5uGHgeWi#C62i2ju+ve^p zVQlAX+yo(@P#!TLBz*pB;>lEeTQ&XI=W44%^$+YF?W~py(?8`lHM6<(JwQ;vHJL>9E0m^cA z)NExO?5nfJdH+DBs%-pNvGV0Dhp*HfB1L8lxClZAOO;%RU(d34-2HkcE(clXQh|Wv zF0etGX+otd23hQysWZqq&T884=HN+njgf-{>?qfBz{qvvL2Qr2oaoM)up0kjDY_ z+b}?bGGt>PzcudQuGF-77f|5j=E_$~P}GD^E@wnd_|&9&HmyzT>9naDDDXu!IXP9# zJ5;sS{d$u*W~T$$N);IeFC~UiG+Hxs2wjc}ss|s2$lei1AbU?B&>9W5(;3$=gy=|4 z6gk{3WZB;?IS1GT0iuL9lKi3of-h&@4b{_BX3EK!1W5a@>i@GUim^ zSQvQyzM=kY+|Ww?h@_;n3*|rPz6xY%cDdl(sR#!SBHo?<+nOk=ARe;XirZPbux+t& zsWG+uj3unioLpdIkf6U!!2pt|#d9QL7?cl7LKRC)kq)!-a{*O6JGV3vft{baZIS%F z#?C=!pz{u~b4k7m8)W~DrvGhW=i+e{cHX(7?A%e^pjZ;wzO(H7QrO|P**O_CK)!x< z4kx=3?0lx5ol|PX*a0GR0N?r8C9`uf3V{KEoljjJJD(b6=V&L6eO)QP)+35UE=EiO!kD&ONq_jlmMmQGz3%`Ff-uXbJbkXOq9@@*bs0WHr*1|BG_ORwum&*D+HA%}H6xP??JI z7?!^%sZ#)E^ovyfI2&PGjH|d)Ss|Cw^rT}0lk7;T zR9R&%X})EEB*mP{0WxtuAEfG`vfEEN_}KYg=MO;D9y!Lj+*3FaY1Zoe>Ha>oZS>MI zAADMw_5mx~Uuzu}1(=BgStEeb)unf!q$X>%_Ict!*%T;wYo!;LptQR5O$SPRE1@bG zg+d_{y2kF-cK(bFuwkHNTy~ z=`P{QR}NBl^+L@TKOk`pa&TJwY^X= zjT)6j*Qn9*G(e4sqed&@4K+g8+DBhfW7ANl2@wgE2+}L5u`Wm}U!co1=%`V2MzRx# z?Ju;Qsh~2YP*HND4FPwo!p1Hha5ukq0e8#+?q&{vah1b(_mAYyD?kR~)|5XLuc&ioZNoufGB&>!6 z(#DFJ0@0CimPwcsoCSM+CH{;RJps?jR743i&swRaW~^1mDr;pf`TlY?HiD0p3~a`I zh8Ojj2o?=*v*InrfyA94D{&|Ik+_qIEn{c%oWag0p(5rcCIxrG7E;j_^P~!KItG}| zwh*UPh247waRM}eji3Q+10P^MZqJUUjNQf4Zb69ZPWY*;BXwM}9G_U|1eOJ27`r9|a}^EH%t@F0WY zkV4iR4)j=mLAk5bRZgiy#jEH}PMKTp#&Au!q0Kc&DRPvP@b&zN;78d<>32E1nioT9x zXn*_+Wo^)M90{u+H4lF^)V3nQ$qn&M+=gzCaNvxzS;%AXHkSH=f+GFnAP0EC0S>4r zD;z*YR9MYb$^kukiH6Tfp%n<~`H@j|ZNOMssVUn{pA-(pL{qRVjft)C){F_>ny*S> z!&`4m4B_oaV}gQ3+g4u&j0tME_8Sugz7DG|P;SEi4UmW-EM;RA)b%_8rCqsX4Oz#! zABH-VT+eZ7-bqKj1IG2eqZ&=cJD4n*Diio%wB}YB2gFf0z~@sAmTZ`*$EB}YqHceL zP{An%%3@H)XeR9O<`Qf+X$ZK95l*z=JY4ke634=lIn!={{&?mQT}1habZC>`cQdX&L!*s7{FHUM*P_XO{>+)eymwVrCvU+RRKr;Vk0`3sBtqY-PCTDd=AOfW-kc5xd(Nd*Q!8GBVr~IG zmif17M{0(o4vsR`##iEFDoK9eBB4I*p?-6(H30SLVW=x&7eR~H%7faBEDeMuq3^UA z5}7HL8FnQz)-s+>lTBKB-->iJfthE5j;5sZoCh6F8R@EcZ6pwfx)flgXcfyyAj8aKQN z7eV3V)t&A{E2s45?uzZ^P{p~DCi)3sqGChv)?HOXuzIH6hN#vvHE*O5!cImdLQwh{ z)PI|ymMd{eQJjJp=0_95u7VhL+AQ@E1C`>97|iv0F~lG={bY|l&y-%1T1;wYsl|47 zhy&TG4|153B0Q#A@~W_m>buNgR;trjxs`rXqL)w7B)sl!4yf#RxwAVtppMAA~HOurMU^ z7OF0IM?6B17ONViD;g!iY`ED0G0MedECLQIy=gB-Vdbo~I59dVF=_>Wyq7~_ls)DW zqb!ZvngbGFt_NCiVl)=7XnHZ4=<1z^6;iB(%UtKLXBlS6cNq@G1eGErV#k78b8Ch^ zDH+RKH&-Xb82Y4>u~mkS_ewIBGC92l>Wt^$Hp)3%A5NPyN9LmucPFV$Qz(rsen=eF z?TCpgvDk3xiN1e(W~vrm(mt{1>?&$6Yc&d;gcSmP2KzObySRSD7g@m*UraQuH@mY{ z4(9tvobSWV4sp@eY!Y$z1DwG~S2)03mpLE+QV#I?B@V2Gb({+a)-Kmd;erusk4x5` zXu9H(wa1|Bns}y~xuT zigw~&#tkMKW4@fK%9F4(XJjKvWlMk^ss_&VDz*=um@r~B=W|G#Hl)RGv+OsjLQNyI z=4Z>Tmy#`=Z_h$TNx_v9c-~srUyHSwS>gJ&k%=JuUGt zESnZf&2Rl;vD6%abrgR9tyG}2dz__smRsbAzqdDS>~dU7IT6l7BKe}V160YG%OCh` zz8>A1H-9>9=)!z?L2lgGp4!oWF|ms~`!Ck*;;#OS4ZFC|e{sw%cKa_j?cz-T#g<*1 z?Y}r~7kBqxY}>^>{TCQ`>|(qB;1AJZ4FV*El zh4p+|BJwwDuA<4F<9Xx0w0Y{rn!KG@&Fz6(ZGQ`KH92r=(%-_o=nUNI_*)Ze>Eghx zMSrWkmhKt2wa4GWf4qC()^2|bzA-y+Yu4W)?qX)(){MV3M&YS}TU~#vv6e0j+*TBt)fm^%$t%MSE1GjeiTjapsF>q^#zs0J_+`z3lcPpJAxIS;!Wx`@CLobR>n!XK< z0A0pxcZKYDdg)=kVDYR$MGYJu*|+R=_cD@3_q!dbzq-dllr4cp z6991>xD~H}yp8U^!-ZDk#ZHU~t^M3JI|Fl(8xUkbPNIXphJL8i2%G)L4XoE z0wLwY>jtFpO@Soa$HA1y#=nyvH6Sf&*|n8_fuUILRQ$mw@Ht; zX$PBvo-jP1{gk5b2+{oaBe8Tv?ujx*w1$E>)(`@d1|wlKJ0vK>XUK|uGy$_wbQ9*v zufYkluqD@)es$p}>(L$70sNIqK%EO+UEsK0w>$it{b>q-z`SH1Kx01*I`JMC_SuC_ zd0{W1kd4$5@99zQoFDn(-aO&C8OMsO$#eEx9&?#u*6r{K@K9Y9tZoaC5^j!w6yqco zp<1I<1SLVoHQ`E`vjy(YQBS$#0Gzf9umU-I0TdH>z;g}@7CDzDMu-F8LYFph zNvHPUs`r7bJ_s)2xcb4>Oy{hFU{@7feJ=`J&2-*@%kBhlHPanZ0E!u@!Q0$etKe#G z09`QSepaC3>5*!WUatrJ++-iv~(PR~%2mUyK2!EOb_|vGs#n30b zIN>lzN^XfkZxh0_)7=+^Fzs~DD1>RJi~R^g_{I=@wLOFYjqVyl8Ve9oUE@7y0qs7N zdBE5hq-CH1o@g*|odKK?8C`L_NxLkVxCGn|qc*^sbcW{?&SIDcDmuJLXSqz37Dm{I zJNU>2nLgYZD{&{V5cEyMoH2uo_>O(T-mRca^?5@Wq059a?x9Bvk`fn;lsFcoG}%W= zlY^u*IY>&4bf-fUyAwdt_o8FOyBtXDP9P;hmn2n6Qu2(rUXl{93E(hZX{2NUeSNH$ z=PGm|xYR3fF?_L*Bw^U3BPA<;D`u?1)7Q9ddB{F|h4M~mFB>rL6h6TOXYO)MdofYK zq|>IIHH0MQ=b^P6pYJU2#C-QpciXq;Gxalzy5Eer>~^_o zdvyLvjg89y#acf;Im=J@IUh(C`BFsFbhWYtm>{E^k`sD9TGaCq&&K(oJM?%>yFD~m zR2dD z5%g(by;ESF+BR5an(aOh+S6C3v;a3<>h z60wmi`1gc0On+k2&r@V*xMh++?JDtW>)w&!ea}FRdDP9y)^bJHyJp05syxK=9OEG| zXh4Xq2VK0#3>XuE;~NwC?k?8|bK{1fz0#Hgz>+(#wxJF=7Fp(Y=+JF-$g{{v*QVl% zZCqP*NLcIUk`8s;%L?qgsF!hkmoM{@u-ajmD&^8fw+epIdP5{zWF?Dm=9^T zV7^=RUfBRb?+L9@?-ks2QRpa42`@L@%eWOU?qw+%;brxdFKbm?U)~Z$v@_1V42sZF zK#?s6T(5ps@mPE|dB>(}M8ExXIqhnT+1}{&)r&)xjb6W5$O8Y^3R%ST!j!S-CfMQ9 z^BSzCuH}@_&x&jEaGlgZ^(by6USDNmA47HQ{`&=n4*>opq3MgI+7_;;- zWn4DGE=ojN9Z{)3Y}jU1fpB`t5;`Gj8tvmv+P-4P6nhA6NnJ8z0(Bw6jk>CQKkir5 zBc{4g)P+W%1ruJ!Cn%F?Xyf(J*6g>_LVERGWg)#HP?b8y_l-#r0;BOA^p?0XASB9 z*<=mrTkn{K#Ne**8q$byg*But#`U&YNWbx}vyjMl^?kpFWKh3C7SeYv&O+J(tnb-1 zq+fpf*N~vi&4l{sH6-Wu)QgsCy0TsxCAM%%;u+fl(fu}V?TCG_@?Iw0E#`@R7vA^A z5^Cbs`urMN9F|b=H*W1!le&j1{faJbZ2_sxO}8yx-j3-8FyC#9TU#*tO-#4#y(!ae zdvD5g+hR`MX4CD```vH4ZPEM9O}8yx-rRKC;^oavw=IUfiRre*XWwSi?b7?*XS!|k z^}=-9=Ig<9+X8l1!gTw})x|9Z8~yDrZf$`lmv6dV%F@2d<@HkpkH+~UWPI4o@p*Rs?&P@6 zx%Tls$N3(okqrJ#Se{h?WG$=b?^nDRVNMrfBG04z{WtK7yShQt4mlFszDYtth<;S| zwQx>&ef zHfEG4CGFhP{mvdGRIBIhTPMf4FquxBx`k-ezxm#Od)q0X6zBihT8MPVx9|<>oluu7 z{=SA}&$QJuNq%0=oA=+kD7}^aQ*I_%=0%*XL`#1<@$>rrpc@I|cac@i|FUC)6c zMQWap4=0am_YzYw$>vQCGa#?+Fz1We6xTS+`gdYw28Bn6!DjXDKStwQiJ1_}AHW=I z-3R;ed_n_A(w$*icPc}H5(xQO->FSd+I<<$#iYbV9a}S!fCDL~QI#nxWcwmeKshu6 zM^*}{Vw*byrX%krqA z%$`v=5%J1;<*$vWJKe9!Zgz>a)x*jCx#gcC&j$5Wf~ZrD`#?u^P1~GrO3^aud^o9y zH&`g!M)?1>#T&?15>AhEdb`7>V;o?&;8xCIb%Kqp3Tcb3tDTMWSQ8K^_4^vv<}_6K ziy{%!dBT|uPe_d~oTyE@j7{&%w6ilZoj%T{V-B~m-&hmKre_YvdwVYrB}Po`4kUG$ z+8vJ2Ot<4kzixLqY(%tpNm^YYGAx-(f$Fwdv_N&`F%BHnuv9~l9NCfYGIezuJcAr& z1z+!!d>ua?8H^H=5y$!8c$P4Qde`ZGgB@#3Q@XH-ywQ)vMY8wBNCJ`G(qh)(CH>sH zn9cQwnO4&8wQL8+1H}#@q}~2_`EYViy35HCRE1W$>-Zul0P>|7tb@Itnk8i-%FqAm zm)T9jWkzz#yI8ODrsc#=BB01wDL^nPmTK22ttM ziw(!q^=cW$B9_>fwD02O2fvJ#{yBafl9|-bFU0w?WcvXSfFWy`(oez6Ha2PgReaL! z0vq(w#_>h{)&I9G(g4a6rWN*TyZb-PkaCKMeQH+J@@2kinT|K5U!e^XDZMOcWu&ON z-zjkuroV>%bKea8&-&t-hH;~xM=!@jps#TwaN9n8R zS})C7VH4nrp>U5z-`V*I#mK12E zf(BIT&gPI&q$ne%x{xt$rN!hoyvK55q8pm+k#yg%8a`wB14@}ToxkzYw`$%0 zj}#}WPLU|9HG5(6^Z)&yc+&<_R!&WBFBuzOQaHVh(+)Ld<(SW!sKn#YDMd$>5~8W% zvToFnxibDFC#K@42G%9l)!4-h;_KK%cmI!4D&u;=<0zxAye=`YTA*yk_^ znI1_~3^2%mcMvpNfG1|tuLp_^Jb(vf-h+n`^?_$Qkmc~~_i~>(>3-CBD6F3Z|lnd?xGb*?XR9BKPS!BdrNE`v+zWfvv|^>J{P4TBvSM%hqKUZAL(%BI17A8No+2SsdRsPA1p@37|k13$sd0O zHdF8Z>YO&)7@slk9_#+%z?3zI^9Gn)2G?zl;<{}?hGcohSX|=<9eDEy=osHsYS672 z3(`aztwulxkC?HeVV2vhuw1?YA(8!=ysVYWh)*Pzm3B8l$Jq+A&LNeR6y%=0z0C9^ zm`Jc_iNAXO&41{{A2(#X^h?0X2frZJABpvE^Mle*_~6T%f3QS?e^MZU!vT*PzoDxQ zP^0ha?|-wr%D^3rx_^HPN8`4D!gI6LVuppie)FAvK7m7 z=(3)}I6h;%ruy8psHeE=<%9*|br^=H=ghkSlgJSoAY!A{D%Lbhc& zVCpOilAF-#$oQ7NJf)X5Zt2#^dcRosb4|Heka|OYB6Sq^5Qn;)bFJ>5%!(0n-om)* z7NB#lan@bq?e9{cLZI_|Y_<7y>PN{T)++}1pCW$Y0?{G3rRb`;rD)W>Jf~HdDfvkF zdk{aAD~mUkzsVJKOy;28O1g)W3oJ(e);d~$ZI4ecOgveXMoRYxuh3H$Sj5(P2?;%| z4c|f}f3|(5_yPs0(w|Fvr+YoJ{-{@&M=8Kv(Q_fu&Scs<3>&nGSaK7w;3i_80~w{e z8~~Cg$?BF&re+V}Wp|U**=fx)#qJ^QY9`HSbu-E5NFnnpW&&GBmSxpVYD{6WQ3$vd z8sTj{VcgZDgFUe^wm@2H8z6>887n~YAV%T1C7r%SOU<(=F+vFK&H}5Ik;ms!AeE3y zVS$iE9$E$r)<)Q13k|qI=*N1DQ7jH~BxkEIJ8;vn{qYffxRxJM-oMvEZu1(L!38aK zxFQ=kYIH&C9K{7vl#SUUM{$AjXXK5pJi#!=%EBG6Pk|mQibUpckA(jx;2`J72kBxS zE|4h+Lhqhs(SId=Gj^+cZ^WeMU%LKaf@!bHblCkMQ=Fep3h$*kTi;^2 zPwO`zP@JDhiUGvpJA_J<7vxZQC{e5hu#snVPSj3>1yI+Ydj1azfv5b}<>kL0tVTM{ zhV||*@6ZErLBj5B^^i@^RT4h0=iR7X)1019JQdrJ8Je*#^9Qq5k-(SyE8U;hI@fCn z`{Oyj755GL4F;{&1vW4y(R>4h{qZ^jJeam*!Qku+gICQIMS>bx>p|X@TcV{*bQSk? zOGWPFqw#3a60TO#vD-JO$H=C53546(rmy}>Alys`zyM{h#}kqA03xxb@)-6KJ%)JL z887l`<#@4`E}RQExjP(KRM2g%huhFr=xTA1SLu--iCjVHTKDT6z6vPPtR^gxd!*Q2 zZP}ni0AmB`giaktw*W=)oM98Fl6b^|q9}^@4-}aY9%bhPl?W{fki02=Y68N@I_$?; zHzkrcgU_0&WE190Nsn`XC81z0iO7wX`hy4Tm+D?>*gy=R1~?z#rj<`Im@RV#%mi*@ z#x0S$2&I_o!3i9i;64OUdKUAXSKAPoC9T7WR>D=qj=w>$SZQi5IE+bzsyOHP>x#4J zg3xlFC3(F~X3>%;IENYl`~QnCQ<&_)M%)v3h=PJRDggpDp=5H7=JfDGpxUdnsK!qx z8PbBiI(BCresM$mGG|A@$_qLcDEb;Fj^1vF-_-9{37pykqwGD7vtJ+Od@skR3BA%9 zuR^ip-Cj@DdiyxO!ub-%S2-@ktMO`5%rnmPXs!DnSwP+|&el^O;cVvp;z9D=x_^~{ zO2j>^;UJqHvaYMsD-0wLNFgz6h}2Vw5K^kwVDU8=k9{u_kIGDCHw~g*Wj`+A9|$hO zQl1TXuWOexDua>*wiSO~q%;q?1TLfm6VgHe_re6@fDuBf9O$iRMG5dUNCww)gHd)@ z{zHqiLA>c3a~vCWg81TJX~P=7OP)VKX|wxCKRbH}cBTo@M^4Ae@76n-KKM8e+TPcG`j{B_p~Km?fmtwqRBneftOtN+}H z^%n&3y6~^g4fN4p->7xO3@yve%7NM@lEN9WM}jc=e##=_DH09~>yn;%>m|J$ZlgF` zPbD;|jgl^U5wRfm{9;L|-q`|ehgbhKYpqOEoRJ2bmkofg6ZEC4uXzx>3bCkD3dck2 z*}HGXl0y)8!A5|3hTyXq;{}_28k!cGL}~UoA20=8+DA;jVsW#T*q(5oGQ26?40H8= z7K%A>I`OTiCh3?||JOaHyyh|GRUOei&#V64R*$3|Y-##I5LIs$;6jK*FHzSHxRX2i zUQJxO(0!FSPAx^)WRQp)5Y#5}gh)GOE}lT>RA!2-*pjDJ+5lD$!6_q=7{e3-YV3Ki6ipmb6 z*Fs(B?19}bqx;U@SVOy4@fWG_EMZHH=Q*kI=m%2cVSiHNAxSCM<|LR*S-Xcaa{Ai+ zg`JMHUWp}^VSgt6wF`!JIN{P#_uuUj26u$TBy#Gc8ZNgrb)i4!IWcw2A@o1A6?s8O zWTp|8MD5n+OXPovFx!Jg}UcMu8<} z7#cu(n?D|SwV_>yFR|Eiji5O&6ISmn#QQ2A#1gX2 z3Tw>etUS$$EbJ$Bq=3*9I>MJ9(-CSrt0O=qdo`Qk*~$fCv*tactGUT}BHT4`@&=PGQIy$N zUx{v2c04l#U=)Qi?*zzS8k+$G12%vcB&7{7jjUfqZZ3nFJpLLolqJqi*3|3@tve=& zN#CmKil!Gq2UtMFJ*d87xN>kUyM`++LK`NEGP{>4t|IAY4i%UodSlN9U!H_s#v)x2R?!Ij?+nLuXaZ%SVt4S$- zbtjm~i6@vv%dYZB#WhZqJM5I?DGS)w3WJIRQur$a=(l+0e%S7qBgb9%=UZrQ! zRFM_B1{~9C!U>eRE1Vz#8~#L%$rDYGPQ{|n599}FfwZJ`OG_GITHle=8RaEyy3|^$ zC#(QCv&0lDb16h6mFxUJ|CZx)T1u8K_Zkgn$*S|=sYqGSuA0eBk%17E_( zWpYrfUv`M8NPW!;3FF#mJ1xva$cuyO|MPaCqW+&7t^PkN<|u|5b^qR$hHbp6e;OAo zc^;V#;ycx`uwh{aX2Y7==-YkE3}Toxu`R|M*%M(vFg<~m8mu21lg6s1y~mt+3|-JO zyYgheYvD}dtnB^qBT28P#vV2UUFHV@o%073C(QA5;$-AHab>Rabf0LdTZu5K-+Hf* zf53y*y=AgTTnq78#Kmeb&qh+PyUw=j${t?k%xpWmZ+2ltJf_YYh1~%oQGJ}O=R0u7Od)G#d!Rq=IXuC19|v$Jhx6v~@kKcO6zkDw zKjcAYDxp68fi}#2vi>Kvd{1|MK>;Mv<+1tlPR|nP6Q07{n?FOnGMHmkImr8NnfiYw z;#G{hM|JdbOjr_;cLZGvG_64pQ&wbeN-YYR$3)JFr=S>! zkH9CSf>78(goZE{OC@qjRNIm8sdK={u5q9bk1{pO?&k$0$3cLBJH;$r-}R1jxJY4j z%%X#1j3*ePd&0Xi-lQeDIgn$r+);~UxihCr6$^i!JM+#DLXT=ZU|Io|lWR*V^5%{a z=UK5)QS3*fBIubGHE;5~Fg+^!i04Ge`y9ec1V*4xbWxrYEs~0lde4b8PwzQ-(KS`; zn&+f+Xy!NN=fpwbe+m3gsbS9>|08jyY(u?{J5EmNnJyZ@jAxz7>CAQ~g0uM;FDoIq zIN-CEUOHNozB9wyxE&Q`cDe2e!a?5z?;JnjXwGol6ON<>p~6Y=vSITEP70Zn;0@g2 zaC}TZ#UP}u-t10rQGkCyT#EBL_X9cG*I!^87phZ=F2Ox>K2WJ9;d!sUD(1=*(u$gI zGx-*ql3Xv5)>26K@DAFBf!nGEs4H<*GjfF>QH}QUMQ{YwLZkwag`~`}@JE`%fM&`_ z7|>}O+-hdb@Mf5ZF5`tzmEE$pdC+`tFuOGj10{?l_#GUuxqNr`_XxRPi47rdmQ-sv zsfIN3+V_NGzUy%oIlO%fqZatIyEh_yRSy%CG_BN9OVZ=FIvt2_UX)DqbtMFmCUR2T*?a!_Hh-0|UZ4;>AphJbtrkwUwoWBZgBHii2fT5^DR6Lj#z$9RoG%!MH60KvCLpxYDC$$or;LWn#q@J*E> zSOIYOCYz=EbLRGWE#UC$BN{z$@ombcgM9aP|EY!E%irpV?Nz?8fi=3vX7#d2ia5?< zh*~CS7DHT#FOsAP3oS{CK%h$^sRk%nkdz5WWSyK(`T7t!oi|JXdjdJJSf?i)wwTJr zrX{XCI80#oJNg3W6F9eUUZiF`7;0(@C!i*9V}Eisk}eF>Q&SHYh{tbRb9%nN?FVV) z9@pSG==C6vxruXVxaHKbHlh{z!XS}5SO{)T6Q|1v-JeRET2?-dawX^(&E9|5$c+x) zbC|FoyLR_sK5M^LRrI+fi_Sn92=1URFtl*N!4TL6ibIC+j21$js@Gz6bp_ZKZv}aN z$nk`m_$cb6R6g{2R6gnTsC@Ewi$dLSM7GlQC|gf+VULFOm)#wo*0i6i<9|2rk9f_x z91O6KH<+>f&3`5{@d7_(C%&mm*jxEavejiQZk;PedV2_o>3(gWv@6b+(AO?47zUMF z!7yLnJT}GREW`KMYFUI@`uL(t{i-eQ*YiKyJnCuSt8wwwFxd7b4i?_6!T$B8pN&`b zuL9lQE}=_+=_Q34nSD~vU)mJ9qJz>j`@iIRN(encE2+*gAy$!_Vj|Tmov@2T@pr89 zWeOOCC%GUzWSNFu##y0t;rbX1!V_uG{GozAER28)2MSiDFai}_GQ*G%_WkkF;p9kK zlaZi)$zC$e0mOAudxYib?o-M}~1kdG$nez~O$CkH5iLHdH_UeCbIl{D)*|ABuF zCxJaTt-}gdJBQ^SJ3;hl$2kbJD};7maVSf-LU#^VTn*hpCwxksipu#wLmHITP?QCQGWXoPKaafWw;cpn>47)y3IK1m}u zU+>|7Ba6k})J*Pa86q?{i<={&$q4`^7jy@RP4+75a^Ay@9if`ww3Ko%liLgkGX0Cm z=^nfR->c_xg*^aSUYUdy3nHi{pm)Q#`NQ zDDf&?w3XM$tRB0K2juHh4(@Q~WnOyWcg2{~v~d)T@qi#KiSd+S#=~E$oo1V`U1SfH zXs4k-olGAkw&CZge3LQ<-CyZU}vswsvE5tiUZafK}rck8$@ZJm8>zoC9cTu>t7nt60Ky!G*srNXe}VYD0<~O{UWC zkMGpgPw{yU)B)CawWGRwVTL2FZ^bX8LVLuAbwP|$O7sQse~yQkd=3XecJ)9?@i=!1 z<7-03*EDvawBd2HzF4liH=B^XILj6jFq^w(FS^oK8g9{#Uy(AoML)2i@z+vzuF^|3 zcP1&9L5MF{_lSFR-Cb5EEN;yAEJ5`?2~=el4)-i6dNyuas5Xv8-LFWC2TH%7g*L{% zw4pj(C#*vnHD-iX*;uFNRl$&{M==(*HS?cUFn~wYV$K}U-71j-yPK(|oR^RZyu#sf z<#q5`t!razwOPKvI{`Yb;}_R$YSR{DBwyMFCPUjyhPrqSgn@c;#EnQkXwE}O9i5Qa zlF*|2wOsB(t8S!cZgRmA_6%8h{8V}oMu?mdph7yHhNFuBDI|PjjYSxXo)Ia4*ADsR z4iKv`fyV5djSN%sM_Kk&S*#EuQ_oqN;>~Bx0x0MMNmkMa77Hh5p(Qp5O4>fGpIm}+ z#VNtDAg^pisDtZYUMP0X(F>w0^S8{qQdb-hGN5j~BUOer*7jQQY61q?7{EX3$x(D0 z-9~W}@w>9M++G}4FylCH7M#RfI|FYje{6V@)Gxd#D+Fd_fQCXVLsP{} z;K0N?7)$SAfXkCfkT70ffC%Z6#1*|%Tb~i(;Nq9$WMiwurUeyS3IRQ&#f>mkc7er> zmY+){%i`|JT0jgjmt}pN5|}!4VqChB4D~1!4^s}j@C1N4zxOY@m+GV7b#XChDa!wM7pIWquX{r9!UvhVl#Q3v!1?Rq z$%2)&S_w;2m1b+Kj7a106wYm}l(BPpq~&@{4EKDO?F*K{L5G!sN0R|}f1FCEv$xTN zC6toACj!qvL|Rk66=vA3gv|&*&$cN*?BYlW zMiDog-NdHEO|WcaJ7`m~J)4RH6nAag2p@2p4a5mGh-IfH(}13&0ov(*67@%oxvc~K zo)l*Tw}#}Kgb6e8L07T0@~WP~ELa@BAFf4$ZXU;P!vU|Xl}$Ang3-2qh*ig6ZxF%i zv>gZ!1w9}rKoEseQ6rfcGgM_GhoZJOMmWNq=5(x0G%N)@$<@hRy9 zE8}Fp(pEU0J%fpYGF|9*BdK^$zmtrTfw=X6`G`3*#u$<*I=mt}?#QPxf>`Csjmq%S zlG@fI_Q6``Bz$0&deBh_dI~nLfkEunnAQYr3<<&^C60ZEuMB=ilWE^65r4Y-N3M3D#VkpsZZNft{6&M8JU(*QX1erBp_7=S zBYp{ZtvZ0mt8%xnfK7q|vB!q#lzInuxt~V!Kww2;N>{GQTvw#To5A(o0Mu)&(eZrc z8ip%ZUMsK28FZc=+{uuLz)%)zAYq;Lv*R64GI^b|*}Pbmv4%-A&rUPkIS3yMC%8ul zW-{T|(7G;9%bT(){mOpbDgSuMx?O0vJcKrObT^u>IK1++7#HT6D7vQJ--QW5x7G5e z2=~DGrZ6mk0iN`@A^!nimNNwj!D9c*)G-613&aQY0u`AEol{X#c+m)y7il+{{ zg2hEIJayQWGh8X+y@X<-6%=xZZVKUiBqBW+F;-n4W2I-7nH$EPf-4-9v5P}X6DK5` zEvtv0>`!aVc4D$J=#oA_91dzLUK0)=I7rdBni9uEi7?~_8H+QyYzxfGPjk73e@&!lll_(^8;vhqU@s0Ag2vvE zHp+#NZMdP`J6s3}oQw*%5PSv=#aD@x;e`6kOA$Kq!4ug`AsjODh6-Q0!WV+ng)c*-(23F_AAQq2MdopA;b202Af>hBHz{TsnakrK*ubnUuOGa5keX;%qioLLz5GB|K0; zA#K!1#rM$wMU0Ir$SqM*oFA`-P0v2gFF32@%?P0nZOw}sk?u#>B8{OSx^8ucyES6F zXQfw)Mlqr9=Hei`tJJf)>ZEKk{1GjtRO`FS>)L$&V`RJ{<)mK@43M5SYt` z(fR@6iO0!Li&W-N5E;L;L$CDR7~o$U0eBe%l_u#hO^UbFx_?Pe8_sjV1@CzFzJeQT z*wwb$!U0k;zjMO;7j9?aiHz2R(hczwfzXeuuU%TVSUD{YSF1dahCv)-@_n&|t|bLCo=g8;9dj6u&&62F@v z_5DScH@|XXUcNTdXYS%eDt%^50@mVs2rEn0UG75-wXUcWj!U-6$J(u>xPj{vAB86j znvEt~gKU)>Gbv6gwP_BAb)!J{D8bFZjh=~?k5tIRW#ywtJ>&~NX@YEaZc-jN2!d7& zRgj2_shp&0)HUfNIXT-O9}=4fNEOR49+Fa#Ix%`YHiH|E$r@&n+3%M)+LVe>lRwIk z*T1KZumD1kA7tDirp%#n;l8w4M1mlWJ?`2}*yWmJaWO+;0*n$aBI0Z1S9ZyN;dum`-D-b*Nf*jZt{Ug>GLT%KI|K;bSc&AHjDKAHJx#mRp-}YZqu$-y%Axx#; ztT|h0HHwpZW31U4Z$n^H)7_cbx%nMCcP;GRv$(W(-!*A3d*AZ=Kk&ho{nvizz;)OE z(7_-6@Q)n&(HjmQ`LP>+{HCAy$VXSvL!f23PS1KLl5+6q+Wr`Y6Bc6fia!p=I;%r3 zpt5fE!bf4`(uIWoXo+3zK%+UnC%3e8VCc#QJCdJJ-c6Q)_*muyu^iq1{j=`Hi8KE3n3{c-hno+UPvp7q3X z(U?A?Y0n^TA_1zqv(CiI^GcNXN3eiN)`S3JvboCog0UC0&Fb^(iJm9nal~WfhhW0^ z+xv-=tn=QSJ(G=3T@T$x>XhriW_lr4pz&Ib4SfPEU3Q0SOQAZob_ zhqCclQ?!&oxp<#9FshK;u#t5<#J{tS*S3aOf$_WixXgnk3$e8TO}T${<0-$<0g;Y^ zeZRmCZfAL!Ocf4=1}+wde$3BG%&eS+mEo{uRzjMLVTNX(_M12mQd1KZ-U6=;x{#Z{ z#jjjT0~DhXoqXf>3eVd-TB&_s6#l!{Yjup!&&Ht!m0d4ymVp+Yv?vF(0D z7i{<6mFR+RX!9;ijOxNIR|*Qgq0PHM?#bbaxcN$T!8f#d7sf|*;qP3jF8GEv??P)- z7mi-3F8GEv?*bu4#%zSr@Q^-aA2CJwhMn6Zhx4U0g`;2tvfCrm>D5nc{1NfoVf?>o;}GI3XunzF5RG!HDCU0RXSe@mWT zEWbS>o8L29lZV+D(}db%Vvyx0*(s6}H7nKjsEO;1x=eV}j#>2_k%G zr<6cuG@<{8mV7(d$G#m#hM}Z(BsPsJ?@=0b`5rBedY6OAsJ=nlQvSsc`tX2|!QU|` zWCq1b!^Fz4KtaHN1UsQmps-EBb^THVO4(3J!HslSps;Pfm8;64Q<|qVKN5_R1v%~6X6@$ybD#ogd+#Kpt!9of(yQ(&AWgT=At5|j;ko{=n}Zf4VTGP4qqXz;@jCKS790CQU?8_8*`NkHyM+X+K6fq z|6SVj$*BQu;fL_7mi2qjBJ=JD5yOlh-tZL`h6cociAp1=+c&fUIwFnGbu}8ZJ&{Yp z7-TEj7tf*(RSk=;>;(60D{N>W7#657BaP7?8ESw;fDrr&zViD6}+paal`j>LP3OvRkcWL%gwy^YZUWv(K^!g zRaE-R4h^!(C{)_6qvX1w>9qtz8&B_np%*L<+Qu(@Xy^s%f6?U)G49%-7pRB3*$ewU z#=(x@O1%bZ&dH2kbFa~kp!OuNRt+bfp5c# z{Ve&#uBVQ^5`R8hc)Z7sf_ODuP%=n#q_@8Jz3(+|J5_%muc0ytq1oo9l~FC0kv=fs zbxU|XPF8U&4z}k8q(%V+G`%=km3pa&E9)+MAJg`l+%Z)0p)w;L99t(ElPkxRJN);t z^WTF_49~^PX(g&rdOvIr6q||UC&%!@pDl%!Fh}Xf@@;#MjYW|w+_muF=rQg6VA-Vb z-Wf!ewQ;!)m<(XyZG7qqdM(~&KAgX&qsi4yHR0?b@yqJglefzoxZ)8+u1Z-H-p+_B z2;vo3v8E3AWF|*LTgnYZh)45kv?9}D;fJN#QmSQ7!;yBLa<9agNU*Qup*6P{s{%rN z2Yc}zpy|_j@vCD?i_TUFbKw>|`I3hw=7ThB^dkZq$bBC}b65&KyQN(anYi?DoQRZI24 zE_R*UHmDX<6!wm;^7^iWu(K- z1?cy0IUoD<*s`AwG%Hcbn5YCcN-%VQp;%p*6S2~|=$DDcNj< zChPfqOg6of^=%w3p>^EN@WeJ-a4g`SZUk9hKBKmJR&(T7udVOi+>89wvU6O#NIlXl zGO+|jfx39uSV{8M zCgg0@QRcHa2#N8EkQnb565~!tOiD;FoGt-?K}d`XAd^l=j8}vNadh}xdJTjG8=fU3 z+^`i6HEmLY$SH+pc_~4aJEVldE3_lsqy#k@gr|gfSdMf>SRLaGHh(h*jI31->~>-e zOR>K&H;PV(vRZ;0i{pp53eAm`!lk99lQI5y2)DEkmZyrPFT@UOV@#0_DF+&Yk0~h) ztgBwG1GU801Y6JAED1)vWNnsh3@&PXkF4T)IEX6sT1qYJrQmNc8(~1oL}L?N%dZi_ zzt1E5rRxoM4(bhcOL9|I2W&7 z9Q<3;E~?v=aesj>UcE?5^}-Z_AkwtM7=VO1Gc82wg(PMn&ji4moq7SDNgwlfSOEdA zM(YWldB+$aS+NNt;M;lFW;Lil(lZsD<24$E=OG%T zq!j%U!_d417Rf0yC@+^xsRRLI zr*&ZM8vo!^ZU#+#VIKnxmAe^CO*H<&FY%8Cw;l8FHfP9H5+4DdH%a_)`K0kL1N2*RScggVFHK1`NmoEKXsi?11 zJ<&86HthtgHW-1i%SLs~9Hyp=O*1bh<9xsC?b~JU?DeCo@H)S&5-@X^*I9&y6Ke%p z8k-}k+_O1yE;tnq#+LuQ>OxBt2n4X&^NpOi5fHt(gu}g`yQJmNw^R4jSjWo*^Z!JgniWV{rW|YM+G|| zB_Qb~5w|{?vBifD_`Vq1l9%K~>K?TSZa2G%7`T=+))(vM))=d3tYiHe>zLD6m0v@V zb9Jh+1&wt~8ta79SgGC=+!|hEP0(0@x-?ewG<4MN9}D6WQqEqid+qy0NKzJ^whEiB z%17q2`cp?c)-&6su6` zZeFM(d}v7R75fEcNZ_PhE1-zZ(1qzV8YVDCu*u#Jvwf{@bHl|WF*_ho)j3@7I?pc+ z9oqhc%>eu36)DDsHJ$KGAH(QStHcSQ!I?ybB*6O;X0mWl)q53a*-Ux|RdpsS4ywvb zPWYL`H#Ibqv1Zcwrs!H_CMi#aZsA;KL>X0GXXY+LWR9LmTk`cYNeolKGG-E+5QZS< zm{^R|7EB!JGGLU>Y8-5O@epWwDbehLm5^lzwL!!rW24*%WNt2OI^w@&mJGTCjnPY| z;Z6_%1zyzh4;dbyj4)TFo?JR(M$fIA_$$IL2vs$PU{c951ejOF3oC1LW%6VGZ%$)!wT<~qFAS#Kpyp`!4z0V@u2zZ!s-Y@Le!hA@ZglJer-^<3)D%J^Lp!O8?>g?fyF3rcxNnB!%XTXSP&vt|!M0ltzgQmyP)DY}R!GN(Fp)pP9)xp65?1=u(U+P=10glMrvlPu6 zIl5RlCaA~=0n9H6VHcRUbFG_mz|XZSf2rx|;HBmO9gxn7aSon9v=FQF0U+TugQcb5HplUNto3Z?(lw9*#fBJ%`l%t=_xmaC{FP0$60Y8Po1c zlHZIej~5?@YQnQX^!~%~(|QO+={X&dujh1R(VH|>B>HfeSor`i@qy=cQ+O=jO<#+5 zYhx@o!Dntlhtml|q>7lSaeJo$MD-eL+;yGqX^NmP~E5d|lnV<`5 z;f#Ie>97@iOnZZA6Jqf4Y0T2P;9smw5X@?^LV+5UTi&gQjV)Qx15x__@z$XI!2wVU=v)*QYUaj%0U4p?Xaz1+dsBIyjaJKhGY0(4?QTeDm)|e6Py>U=8 z92v{laZXDIB6JLoLiRG6c)-|@d~3877?kz)484UvHk6tV^yF`N9UJ^^UPm{-ivy&xoKH0R zj9Yf9<<|q-4#7*#KsVy=)sd?5PhDUKLe)PN7fYkDoX|K$*+#%*nx|S~!L4WdBv$w; zxd(5Nav^oX)|BgFDyZD^J!~6U&O!^^C*n6AbcU=8a-Z-%TYTNR1PbL?Md2Oo9x$Vl zw@>WOp`qi+IqZ(gD-G_Ny7wM<`?8;PHOp-`9xUXvP3t6Sb=AJ z9SDY4B6z8VEmEEi24Bm6NT0C%MP>_n$?y)^f^!bF46(YeP12Wxu1iQ7IVb!$g4?1q zTi9J7VG%VkwOm6JcY;Zd2C_&ihKrdd7ljLXiF%gzre6Tah;Zw=t%??|JufXWS5_Q^ zVVG3T%QImJ=6nMa{R+Pvl9(!HQ5k}DO9Y#!SX2|k7F8Yp6ALIPlGc1X6_QmcgMpHj z+Rdr+cTzkOGUb`V#K4g_Y+%HSP~%neGLD0o!O#eO^Bh>IdQ}o#>ZWU0URP~aH$t=(ALY;6NChXn8{`dnpUZpb(oJ7 zPjpO05y5C#%5|w#?2Me)dEue{VTTvqAs;Z+<4JK|xVJ3Jt~^@8itg8UgG{MT*rdow zE&uSPwFb$G1G?4>O@G8Suo0SK#s^Q>dD2C*2Ez;h5yMhk0d@HUTKEM#a9jQeXknRw zEefxdLV|sjJ}mJNj!3hNquv-366O-K7e*!zltXERM=;*u!_F#3?Ux{p6p`Rb%P-xO zDy+F>ZaSQ#S}fQfAA@0~^`}y-Dr!aa@aEE?yFv$P5Ec|E?R)nhTWYL(vay0)7>q*F2#5h$UOq)0$gV7uL9tXB(2+C5$jP5mb^ z6#=8z#0Xa{S5@!9Xpa>GfT{nls50qp#S!3P6Mx2Tw#bd@Qi?{(${8)=XG0%SC-BJg zOQ>J*>fpcHA7gpk&mHU$K3-ZSdMil}#|r0XDtIj{BoIiVjPeKzB~Ld$;iovz)w?-B zB6snQ2BV4dgR$li4ac~}@VRxQ@76)3s&^j2;te_fi?qR(L^75$(36oR{#0;OxS&zq zq>Q1l6bqROLgpktT__5Npa%*fV?q>ML&*V*20$Yo?nz}BUi9%SsBY0zuXBJW|r;}esQOR|>7X-~< z*muM69|Mwj2<=$^N>wF{U+!?padV1=ziZYOI^h+>O6=9AY3OE(WH+fcF{TbBGW z_j%6+{bUZg@&gwn0l}y#7^$^2YzoR%MVkUt4L=19rrtPU(7_F!=-{O?<>$nzMOj0( zkJJL3t8*DUUOYsL3xktuk#W|L#n!hpzi5)h47;FbrWm&7gif(7L(>KDYWa;0ULd=C z$^l;6oj$4n3{1$6U)qGQ#n2?uU+w8dbnhlV{|rHCOl+>SFb26yLM~bjYgbl)r6G72 zE7Yx>q9}9(l&A>3z=6oM)r{LEFrTr-i7Dl)Xy=dNdWiJb1Ea015nSPKaYgue24@bL z*4q001iwi;#BY6TibiPBwpa75mX^Vuae>E9g>n3Tz$NNkq0{m?^H#kVhyKwll55&= zd$I)uv1ND!4fDB^Yvgll=VZ*u=HRncd-G+lOa>+D6=t^5$BB*2J@|;74)V|Be=YwB2uPc4t3>sY3Q^%aRQr6z$%F4C4PzFPiK zjRr)kj^><8QX%!a4s_D!y4pNgBsq&_>v!Lz)Ing&3^_#n*f+@Z5s4>$O%Dk!koI1YDFjO@x!hRGenjW|a!D}f z?QZ_Ts5|9WF8#o9lG^Li#7U*IY2<%aJ8l_$ z`oH-bk!*=Z{*74O#Ft`Y8tmEgv7Q>d`qyyh;j9032kT()(T5`G7fR0+-}i9=Eq}Q# z@C-iplN-O>$e)ZyzvA?=K2UyA>KX0>y%6_yx;fspT&se&|96@g0HYIm^4|!+C-V5G zIVLA*2IwzlODbo+Lo>Krt?mN2yH8|hY4J-8dPn+Ufw++_eVlxEM3$yIFpciu_bxie z@9RV({1SfbNUzfjU6+2C>g##^<3K-3$%VI;x!g?YBJZa5o5S$$bdi=8PuzBjL{3fE z@YqSw^YzCe(#7=p+Zg`!;WhF0q6z;yQPY~I#hmm<%NgIr;8@F6(&e?RM-$8TZ;aEm z?1$H~_pfCKKvi1V&os`^{r9Jf-QQ3a+$Er~BmWz%5Z>FnmN6u_+}E&0S!G+w>-VK& zYv}*B!G;VuCt$tExD$BqvhkzQ&r#_}D(sxjTb!rkM?dQ66*`*m&FJ3x=hIFj{b3%~1MpOCzE2)Q`-U~I1}F6K>v%pE zN+u`t?tQmrvv9v!Z=VvKU6+5}4T^Cvs09Y4Tj`h^Ph}|a&!y9DFtU{Vc(^!z^dqCk z^N|Pf!Ss)3FP-dt5O|J-p2z72eZRv8TC}K@bl-8`+oLrcG)0dW)Ja`IkwB&F&7nxl z3GxC#Tjp8qbJ^7AGKzZDG={ZoHl5Wyc~VH0s@w7fPThqVp8Ba%Px(h#{ksd-$>dL+ z%C3D%?tM2oeySF#lT(gjPEn~m>)NlUbFTe%XtS+0+dp-x$7ZG7%vf)Cdc6*Nk^R>` zbu{|I=XxDx2$E68y)g!EvzjTPG71!(x29ctxmI`aUfx9q;H*4qSa<@Q%jSehtfs9o zgODl244I$k;eP1N9gTV&pwvjMj=(NexNUTTp}Qwax1S5RlQq{L)w^XOIA*$Q)p==(=*UXXPPj^2g1FV(RSv z=CiH24)lm)JZ9v;w^sCv@2CTkW14N9(5l0;wDUQ}G$C-`2MiOZ!m8u>XT&ybKCr)d z0r!Vk1RxfR;9;dpw+?2l|AJ3yUOz$3Kny=#{@5f2%Vr?Uno54EYE!Pf5ljHY3qRKsh12gnxfq1OHx$b@I^!dRGwHnNsI-G(gGL9UE| z)-9@0?s_C(6+O_X!C_5r0kqEN)SSvj?Itho>wn26u7A0kvF}pWyB7GiD}Uk-o~v=7 zK+V&C&h0-_X1OQ+!*gUp&d=$>zu`jlc{o@3%K7lh1^3E@;+1^;yR@;CpW#qxV}Yj3 zcfTt?^Lx*!6X~v_SoB@jg|F&q6%*a|Tp0YX_3)oAu{Il?3x~Iw3x^ilnhTG)BDd;P z^v!}zjGKyyG|QvU_Hc_WBN&l;UIHR%yT4TLeSmp2+Rf&XI7H^~{|D3Sy1&=Xc7q#2 zB)m2p;?;CXo^*^jp`@5~kehoMwIKlxzq&({-fV%mdINfaQ>&;z$Kh*%mu-k12B5VO zaH%A8tA}wdh$b8t9U17hWb6AX$h#M6MA%YoR{>5YS070CHRwnTW%bKdC>QZ-Js4)} zaLIcC`g}Ui129#9;WgcKHynK_f8eu@IV|N1C#5f>VzZ_^fVyI~@v0bxykTY_!-{DM zcCk+ftxFl#fH9vCV@}5lZgDr<0<&U{5~n5jO)~a@ziA-%YK#A}Q(H{jYa)zcAw$rT z`6gUL-_)-PlFm5+J88Ykw#3a*GPGHhp#{vZ4Y~|g26^K2**4tPsWjsy$1<*DvQ!`! zxU_yPm>W;o8VEsMlkOH2xfl#Ipp`%I=_{AAyZ1gI))TJgERwf7*h&$YgKcQ@=dWK&KLR)vhd0mGgM@{aZtG6tzp>0#fQ1;Rp@d zzHL&=PDNu#SeSroa1YP;2Ct{d7}X+=Pi4*HlL`f)gczT_K5d?0)Qjm#`7jyek55i< zj#K&sX;ibuZPXW-l`WwRuylcbH#wq{HBfMh@1fE7??Hq+WVT}M$PQFHy(X{PlZxt; zMRXf?^g3KL{ZRU0d-dCq2v%2hMRzoSZ*y%XUAm2_+kvn=BVqZBgeC3gUk##@uEDb% zYxd(t=G-y4Q>>JExPu(cafbIIo6!(@4G}y>7r|AvEYRxNn?Ct`MwmPOe zgj#OK=9sYz7s;p6)Oc8$%2J$H4ArNZmzj@&VRm*;UIVr4=ShBoSel&=X~Opctq*-1 zBtyx&ZL$fdGSS7%|Igmp0LpPy_kCw(ci*?PlAdK*vd!!w>?dR=N3?#`LHbMLw5`<{EQb6@x%`4&F4`pk>uws8C#W{@0! zmK`nU$XSvra_pE{F7WbnuLq?#ojQ^Cbb}XPV{@1}IFrr+PSAB+vRyvbJ#)h3!VjW&8($SS%9dA|9uM8HNG_6-5pCJYM8aR!C zijGP?z23dFU!MXPvLqmr0+K0?erzP8IkO-#>Y3Ja9pD&>;6Y-fwQ@s8S83#_OgEVx zQ~4ARIW@>F_FeN7r${3%M_Qkvr_VG+PuCPBVTuwpX7R25DVl-=EFggZo?&8q+k`&i z#CVQa-ZwGE)8)h{`QwK(F~>eFFhbgJuO8yqqNy&l@r5D-EJ8xaKS-|cDQDPp4{Cor5te}|zMNg(%>n>> zV3Ir#({C3xF8s_}{J%!$9Xi|!&Rmt9Z%RTAI18WfrKw#_*T4fy@fjycV+Hn`1f9ly z>E7SO!J>)FViUT7#1wzWD0ftuP06C>B`aoQ;(n~f1H{^d@PYUF4o=lt=j5yM^+bR4 z;9JAMZvHKK&BrL7lmWP{(mm(W zi6xK-p1*=D%^SN*jR2M?zUN1=R6&2UNd_%j3D5w=EBE5`sB)C7$Z~SANY?ijo7JUW z5JF@KGH7jP&9RPF?2J0QWJC$Q`RMEuj(kv07C}Gio$U8In;UFk-JT&D>#@jwLuRI9 zIoIt;FgPbg4@ZigRPfX|PKMzC2Mig4sStF7KJMQst9;%s2&) z@N!&kKGyeOO1a!VPKS9gXkuA7uEr}k&rDa1S4d4@ECa5`vFa#UzWvTezuc^HN?bcZ zWlBaouQwQCBRmP8^pHIwQUV44tyT`CX0gROL-O3fz-EbKsipVhmD(4BPNf$jki=;bE_Lews6M5oNz+) zQuAf>&)Wkm6sGKQ1H*Vsv3d8@n01{Yt?o0+t)rz`E}E&itF!1@N4Lk~FAeJ2y0;|P zug>DAFi$bYQ+dC)bgx`NeAzD5vNTn;?~!pr5#UGX6AKghhy@AU(u)yFo@zCXf$E3} zlfuvm5fq~nP-imH6H$#$q|HY}cdTBrhO8szPsvZag5VKxEjgonu)^Gj;ZsBkC5Gkr z)VOjM4Ez2cgEezhkCgs_n=>#LA?4GMEZyZ~;#XPK%qyYY{GplA-pYF}I=dJoEWZNG zc>xkIH!KtZnz5`?SwYzg-ixATpaqWg8B+OS$@Dx|0x5Sp7+D-ds zx=CBPsx2LgHxUdgj_8*O3u||i2E{tn^Z3~Gh7apa`J~pVHVB|0Zr;HIwo-Kpk3aH0 ze%Z>}JRjdyc|0xd(J#HdxSfUy{&!Ff8ZvUI{{8^ZSF@erf}O1f?%VSS30nw_jXKp-kA(`VX@MJKC1Ny-&g+<2^ee%+ z=?njM*RtMiZyq#MXiYJ?)1rbI;mL{TMZ8<$hD4tsrx#R>TC8XrJmh&;CCk+Y30ul- zTTZ$bMg($OGt?!|58abr-aA84A2V5oXHfBG7MhA*BnA-P%`B{`_&~l3>k(|z2OpvZX}hBq#V$>m!GTT; z;*PDJ?A0PsNVaG`O)?*vm928!9$c#fKOMX1$NKf%cG18>?rJHUp+VHykbS3 zuNSE_nQKD2p1;WHBoL7|FJVp1dz+&^V@j*9{g#!pB*bpCEc;Z(5=?}3<5$xcT}*>U z=1ZY#F2gQen3h9?5h`XJk;eQy*0%XhZ;0JNr{or}00-&vMb?@!|Da|}Zq~q!^&)0S zlvyGQpXP>OMYL*Ggfixj&PC(oHeuv19xL{}6V0`!QEYox&~q#|Ut{|!=#K1sJ|rf~ zUb#NO;KN`kn330D@f@XNtnVM)m?R}tbx^k67xXyY`NfG2DWncTbM=T@f3u1zEYK5x zDl~<9bm%?4N5v+-6`yJp`*p?1aCFBZtTMAaiU$8Szk^@zk|D88-|VbrQ_eR*q=RAQ z?NSGp@v}|F-P4NwYR%d{4L!d(w4KWcxkoLUiA3Ihaew?Ji{OFEuSLcEidL%^FhaT> z%6uSPDE7y0X^r(r7@Q6D9?^n~C{W(R^EAwx&)3XzM+@dpWFcS@-2*dnQHsj=$fkpJ z%kQQmSJWC_MWE35*bLsMLeM#Af8^c1FU6gFBU`*Us4Iq=W`5e`5a?;#c3Zg3`g)pU zBU1`Krh{e-D~smzFcNskIL-S#rxa_h3q7v)GiD6V)KAj&$FG{8LfTG9mTd{e#?Zgw ze(s9;y#VShBgOvZ;p#5rxv*y zSV<}6ualK_Msb7>d%oEBWiI5!=0oAaHog^S7Wc;sJHNt(Zt+08u;1NrBwpD34Quos zK3u2B;3)3bFJr|A1U|Dk6u`w1cVXK%!~K?yca+q)dvv!s92ps{`(r-Be4c$EK1+T` zv0uN8kx3gZ9yq3!4pmyBR#t3j1=hu8wWM}+5ZipZwO7f4Hl+F7eUIjB-giH6On2WO zhc&OBXrR`U1~EZpBZO@i&*Gp)R2CU9H};-%`2?j1lw-3f&t#wv!wDDPe|ajLyY0X$xwKaq=-7nuot*1#i`-p%k3@9Dp)-nGb_+VB~8^WBpE+T)|X zuIBS=4WVFBe%2Kea+qQE7Sh_AWw1gsuGSOHd}KU2OY&*h<0uQ8Sq0Ba@0@EOXZ7#pG0lJUu@G`Ydln1Hp8(Agkzv zHm{#x@)ze*>#;1Cg1m&^Yt&Lsgymp2$T56m@}#9xnVF4-xUFMTG$VJUODcVDm%o}d8Rviu2( zgN^gy;$Xx16BGyQaDkNZ`##OxGfKkWPi$K;O?&y+dGQdr_QgY=LWBQUaho1A1#YiV zD*6-1^m741YkD6yI@@%E9_bakb-^BSa#2!Op3o4vjBIRFGz4~GQA}=n*DVz|LHtbo zi200Wmn4^shRDQ?y`?nOV#k|y%@19dFO>i*U+wnUZBCS2-+%R4%>^Gr z-eRWSS*8hklby{%j^tBs6#^X=%beWeJxjZbWQz6+N-@>bwCG`Say9QTIk{Y}p_8^f z_Jc@%I+?jd4Q0X$>Od%QEav)i7K(;0bOpm{dV6l&qJ0HBpTCVR><87{+e63IwPt9cBYD6r3<2v zoq^|wSLMssBjX6>Nn9@0heGg3%|%E}o6oatHuElfCJ~oo#lz5i@v%m6yHMIk$c~!c zkd%b%Croog%V&!qiCcMs)VCo>Q#+8P(9bpka}%m?{>3R8gQGL$@$2(!;ib@keC?>j35TPLKD}<7igtAK$ zXN2-o7V^sz?e$d;c8S3)%rYMW*d0~1l1KOHml^3IKl^3m*TsN;NHF__8eyD@zAuN! zbaI@Kh{3+?t+iWP5vr#Bka6tFtw#dd)#$eq6K>^8L*Zt6t8I{GBK>zci z>;r+a#@|pH7ZihlAX$k90=8yFqHb6o%=UJki%amlQe6# z+C#%5qhsR}3l?@3EnYH-cR{t;g!Vf-@GYjO)JVLS&#meteW8RP4w$Nnb}^vNZ8Ti1 z(bNhr$wlymG*rzS#hw(&QyCBRHl#wztaOqROPv|5c_2v`>`m z8tS@n4#vPXVPus~B9>MECu6xbRpH1~U`!GZ>DJwna8%!&$1cclDp)n=&2Xso-SO)U`xuSx_9$Y#`RJ^Bgj&M?x-p z?7(vs;LgO*RJqv0bwPG>X__e!#$$Dr!fL)yxL?cE-v?G=jMw5FDRy%~`TTI9b8FiQ z^0^Xh4gDma@#w?1IR|?-%moY+(sv85M*7V#Jc1R?I6P_x&p`TCtpxUAj*a{i&C*Tt z=z~Y{$od5%S;~J|nq{a9H!t`=GtNsSG@>osQW9E8W(WX>R_ZVsTDj3PJ4|Od<%Ufj z)8mFsS5B=grY!zUZwLL5n+mpw+$b|8ax;l2)^qA0AUmvtp%;cG9E0sJ;k~GEObF>Ap z#Ii(~VR>{0EN?2Yd|DrtDNgHo_LxMJV`(OQ-lRjnW+t6Pa@pofq%;3PRY>R56Ei3$ zcb5>Taa9)6N?Gz6C&5DEBp9m3Nvu*vqWgAJ6>}od@e|u@kmyWj)%3q)wN3ii`UOLp z^pt<9B{hFkFPs_GtUwCY)(=o!rJhm+o=5>oKhOQq|Ik$g3jEWt+;*F0C`lL4Jpr?v+37NobAcYxL|h9 zo@r1O&Q|>T1Psa%$in01Y@)A8F=6EFbaKT%KoC$`5ZB?l;w4hX-9#0sq9FKsrV5!+ z5b%?Fjz^YaEe010E#fPKRaPbA;YZ1^aRYCuw%NgrI5iS-LIlU8(ePD^AK z`3aupO>~RrBsxR!25*TBI!!!0V2Rum4G}6p*J$oI4H0vTC|@%$*L_C31pW-hVlTE@!pP=44g>K!QbLwU>B2iECpK}%Ung89~8f{fdizeaMgGt_SMF^2Tt5S{=>?gaznUe`+*LZ_s9)d*Bf!QxcPpKo^*$jsz|8S{iSpy-|`Wg zM#U94EZ}rNOqb&Q?mi|nup=F`699e0Mg@?)^#DEKhAN0Y&rwynH&>?u z7hQbGrI%g)&#t)g8UOs5SN*~-{)?;sN*+kf}(pZzQU;Xgj-KmF(b za_z59ufOiU{@Q|MP$S@8|vIZ{55hd4BSOV~sz9~gzcYZoE)bQe%Q3$rfW9M8ZD2bB=m!H0zCD0m z^rrr&-WEW&2*l|V<-6_;pjQgCunM{-fbJ5gHeqiKpzQ+W%>Vnm{!I zcw+$ll|ZA_ZrmO~4+~U7?;8T>g?9q7^Bn?3y*_|mAyBOwuM41U0@XUdEr9M6$T%uA z_}Tz^yFj%bz9xX)H}I}k2hfKEs!iqA0Q#svwQjsBfc|9QsaFQjK7ndI{JjABqChqD z-WEV#8EEho0d#NxbZY>8L!cVj{B8jK{Qzi70KNDwo~ljC%LC|D0xhV{^2-9~E`e&i zd`kemV*sR;SSWU~_<%q)^u9EJJ|s{LQ7;LgPY6`Q{O<(NX9TMCa8m$%MIhD^N=|uk z0DWiRsoxHu7rmLMYCU{W0KH@Yv@w8QE)bao<-1-OK(`B2V}}<6(Ax#7VgC66^ud9r zHU!Wg3smdj%^tg-7K9*U*^A%ukV6BI-}I0d-OV#K+&<4kZV{x$k^kF6UMUC*VC8%M zmxsJ=;F`Aw{O=y}M}pMQeWQnbN|2gt z|8)=f%)onY@Q^PEV&6mGuJ@3?6r?6zp6ems7NmyJ|K=gz9eB^LdC11?{qOm&9`bTQ zYJ7H`hrD*+ne`s>jW_a4O|VRR$eZ;{t#7~TA#W3;_RO^&@=if&3jM!$$WB3Ol=z=L zm$~yi|}{Yya9qZWW|P z2iJJW>jkOt!oTv6+XbnO=a)R>O#|=wmmcyKL0AqddHZS)`H&zrjQ$G``M4l8jQ*mB z{IMYRJ@C&jc*vg%Qj?fhdB|T0Qlp(`ddS0q)JFQxJ>+i(o_U6cY*k@)aK_Y9`a`cke~99{esl+_LCm+RY6#+DY@|{Jmfoq)c9wO zhitkB$nxqlKkgxS2vU;=KjtBK2~wlPb3Nqu1*zff91nSyAhlkvE?rS1Rq=psP{GCV z>EeFA%N2dHfB4f5RvFkT5BaPhH6wP)L;gaLS|`u;kgp3;>*QG;^8W^&d6I|x-M}*| zJ>-S=(pn8oPxO%A7Nj=ho`<|#kQ%#mJ>-=G&*UER20>~{=VSk2UaHA#~@!6q}Df5Vhr+CL29@rxx^sf z5~QZ0$cr$@cL$zvi4T*-i{8dFHH^A-?aAV0g47s^b!uzv6@u9J&}&i*4DxzGYP}}g zz#w-DQtP!_Wt%MCHUMGO%%0gf0AcyoARiid59^->*&|4;*Q`ew-~U0H71I&-VX^>lUOm)p%unPR;g_H&Pq z^&aLP7wg@qyQ{I@&AP27X=1E*i$JyB$5`+02~_KSjP<_Oy%**VLORBJ?-r;wuo&xo z`#^&+*8A>(r(&%40|M2AM~wA;M4*~M7-PMk5vVp{G1mLwK!Y*X`z3*D*od*-uMIpE zW4+%Rcq+zv9~P*lw_~jL`JV?=^LJvb_k{zX80&qJKsEHnSnn+Y)ev<@5VNlos73%W z*83WPYVthBdhZmdhTa(KeV0HrvpU9l|45)(H)5>!0fB0rkFnl;0+~_>6cuB=Ulgd; z!x-!R%Yk>rSnuBmRGZ2e>-~;EwQj^%?+*r^im~2}U+C{)jP<@;pc;B(toIcH)w&U5 zy;}!BG1mJ!fofzEW4&(~0L57Edj+aZN{sb>RG^wm6Jx!f5vXRM#8~f_20$^^`wf9= zFhZh9?`l3KJ%*R;ow+5byvEJ_sRO?}g^}g@`kQrmW+Xf&Z*86Tj zYPb!t-VX>;b#7l_vzDbZ8MnkOktpo1~ zvEKUz-VSnt~esqsRH^}bt>TCYQ__x%Hq5bOQmKx-k^`w>BE zbP!^_pAw|T3nA9KPmtPpLag`C2Hq25y)kF$ZKNUA`<8)cLag^bL2C08V!eMLNUd)n*834bYE%_s zy?-+Bo)GK(^8rYR^?qfbwGit)BuEW!A=Z0%01{%o4+~PGsu1h_y8%du^?rY#wGiul z!9%oGQ=bka)DRM+hPM#weU%_JyoFfr9fH*G7Gk|`9e{*b?|lQUg;?(g2c8MB-aP}5 z5bOPSO^_NZhgk0$1gZ5c#Cq=%q=xGd>wUW*H5Cvf3rescg4V!e+H zKtind1qb`z6Joua1gZ5p#CmTTfP`4@t%B6>7Gk}x7oAtyMpYr!`z}Fh;|a0eodb{%>-~TrHC%^S??(q9A=djzL27i6c>eip|1&Yx z`<+{pbfMpJu3AwuZ#jSL(_Pt@fn38pfG8<%tV;Q9sY9&O@l!^-54#@YGC zuu?mDN8BqZJV$I;m&UsoR>{asnzB6#$hn835Xr#!(Y6P)gLH^m zjWMyjV0Xb#vD+oKTjDwi=|kLReN!Sk+3G{w6@Q2&8Wbp|V&3XuJFuG$97tUcc5$$zDxyQfQ|bLFhm9v)_Hi+mh?Tsl;SF;o5rMPG z>+mgDD%v|hUEda9@IrSUv3EUKf7f2#b=dq7a;-0I-dr?5DU8)MyR51AjdfMP8*GCC z*a&o|ZWjlg_q!w5$vTzpgOPXhP5Uek&}^=Y8!}J=n?0CP(#TN4PX27V*lM%I&2Zvg zJ+ydjwg*Yd<}aod8=yE6Tc+vif757qzL~?@SM3Ns_J}x4*1~yO^NIa+aczOWN z8+Ng=Hb>mt&u6g{Jg_SzHqYLZRlIv`x(69HY9TkhA&~_g@u2g3BDPH1@1^G zEN+qfq8DnwOP|=le5DUwjInwuR!6TiS2oaVb8KgU1~>>-YKR&msGhNk>Y?0mpHP6k zFNO4Z!i=Ym=u}6Hm{{nldNyJ);g9dQu{!hBoV_8lCMI1&!-1Ztf5W5{la&3O;mJ!* zR2O_hb9aFXV}n?@_(XNVH#Bz_MrZ26MJK8YzM;9hK#9RYEd2b5>Vj`*?k=!-Z?Fp& zo~SPPhUV@9c5o!=eqx`YbH%KkTdoRD$I=wLiDzNEgQ&EiDd3zuP&JVf!TXCR^YTzD$TSR`xEuqL{dt!n*c}oRRnmj?j+V` z6yWENm4enJFV%R=DmJl75y|N;C7Y0j-QhTdbe+VUGnRhF4Fb~&gUSiPkthVEfs%>_ zlFgv)l(8k>4mDVOJB*BU0<|Oi!5M4lG`K@;|>DVc0g$@Ht0 zmZ_CNg@TRsG_-R~p)`+2p_C1k9Nf$Y6-sM>lz8&zPE;3sLvwebIa3!dI8j~j4b9z! zK{f{qKYOCO;2WB|3v7q(<7v9^)DzVO-_YD$z@3=4grajlGi&FT*QJX2y;)VNnDrdZ z!lO!+^B$#CS$l${if`vQrOL#yNfiR)vq_bTG-=C7Z6ytrR64flJKs&8#i&fwQlrz0 z$f7fYiebjr&iY8VHM@?Pfv$Z+vyda&2wPX9vFHV!${+23VOOGK6IB{LOL~g5scRw2V2vGligjV&H+r?v40DNv%eJMOr53 zXo?k%zIStC?OgBv@jlvfZqvF7-L-VI4{p+UFN=|aVLYCU>jkk2ssqP)&n*U-eSxgTJas_%hib3gFpfd@{T`vI1+OynVxWGObWCAVahu3TA~cxf;e z3DF^qo}xm*#2wbuY`pHM2`Yk6#M?53GMiMD^>ajQW>vaOB{_I*vX|U@;r{fudW-Jv z4ig#R=!gsRO?P7`9pUiqp(}21!Kqbeu}c7bR;3Px70O{ch=>+TrV zZ7JrK@mAkj#(cP-k2asMT59tdgUOK#&XIfYLkK3bqG<%eC`2G3s*_X*#QOk}Pvcq| zl`U=M2#rJtOgbHhEa0l>BN2vDQ0;r4Fnm2xQcNP;E4&ve2a^ZDc zM;EAqEX~KcP)%`uPX=t-ord>JcxMuyKa3%Ht0NmZF+uGCw_+8 z#$R!IpCSp+j?>Gx$)IY$Efv01F{OVwU%)tuC{vW{5~nr5ANGKkMTcPe@Fu zvzlP$d_2tg@;SOEO8~5zg>0moNU58!Y)c53plg>bZ{tEqC-$SsvDmb5~?aSob^>sC`VzzB2uB4*Cz#)k0i)Q8p~OCfvr~ z$XY3x_*)V&{yF5Yfx$0AY)py6VF5I|25!9URxytf-NZ#Q7I#u;z~ z-$(RKXFpJ2@~XQ1FyU^`ReG|wP%c)Qq`aNq<3zNK$oW1Dk)wYnS-0XBRzco&B%g3F zOMG?S*5oG>xN5dk)}D#v{qwXo++AGcdIABry6i`@hqP?;7L=XgH!GE{GkhP$>OoYh zGyLjwNeXbC86Iy}I%E7dJi+3Ib!JBX^Uu@TaCeF84A#s!P#tsvu-U<4HNDx?qOzYa z8PVKQE-EWl$AxGIBvNq@T%#rs>MwJVK;HIbds`19UGK99UKzcbqDF8SZQavw)8NtQ z8Uv53Tw|DEzA<8e&JI|vOQ*Bg=;o20jbmhRI2M9x+sM5+=3)NZ8@nXRv}JLf&Ib#D ziXLK?X_;(^d^Zaz5~s`MmfEr`4nx}-XuAf;r;+!9ddqDUSQU>=*LfCWP0`fc>FUo@ zg1}jFcXt&3!&#Gb$yF`aui(|;2?6T6KA>(sPvue`U@Ijaz145H{5g!o8Wqg>7%HM@=`EFStZy &N$;l#Pg>iSbY1ZnifOMPL{8n3+gKHN12M*4zZ(idKN zH3yYfb8hA3p9eQlUr6YB=->m;@%_LY)~U+r$D%SxtFa z(n%JTS0(8r;wn5(YvhwS#qn|zdg)HX2238(h0~EHXijoi>Y0o7}q@c7$t7^DYY3?j7 zPhnA%0I7)*en;-*`!E^>ELBX;$h}oN*mG~NgJRv+@N-|BM)J~(nTf|2J9_DQG$!s+lqC<0r{8)Vqr5Dd%#8;u7Pm_4Xh z2b6&7XhEG-n`eJVL*CR0Nmpj?N255Kcj)M@Mlq#tN8@y@mdTtPJ}#2)AJ92;WDAZN^wM>X3hDAb5;*33{Crq1n6Q!?{y5`va* zNOY7-5;`l&X-fF`z=-9ALYhf0jqW+`R1CiJF)q_HcYK|ek&r+or8?svTUI1p7HlMU z!;NND#7gdFKTfXArnr%#jB@)1^uIY{3d*QhCudUQtzl7GV2P(MnYQik$V>G)-(Wq%GA0o3JR^ns% z$XJ)OY+}3$rXawu84OqajkrQ}T%*Z5PZ0$dm@rLrCBKk4m+@i2P{ZoAYtw7pnR7}o zpGxoK09*dMiIjR8XYfqKor#|ppR^rM^C7rpH|#I3hyeC*VgqU1*8V=elkna2hYeC( zzq7+8WH*}u0-BNvn#eh?t~Ao6U5QZa;yS~9c=FLZ!&4=6muF)bP0eB>CxwiowRs+V ziH(}dIcH1dkA{d1edF4c(~wvO-OL69 zZq~7igiSaJ+ARx>6}JhaOdNwbl(=6Gznoq{U%+ylJkYn1?DivitHVCWRdn7VrEu7e zcG~I=yvQ_^N9+pSj*ruwEoA*4|0$Ow}NVSAW;Y&JLT9P$AY%9E&kG$Uj+pz(?2Doo>X*^-o%e2ch+X&wNt zVjfP6G&0cfL;G2yaAseN4HbF`e?uc;2PTC7^8&=OB76}>Pm#>57Z?*8D+gF{(1?h? zp6V2L)8qV&S6tYJzwwGrc!9zzS6rZvzwsV9eyEu6TL{GMBn%|~^-e9gaLgdLK*pYc z0pScE(m3hzLB@Pow>j#AD*YiItzv^Q5ZB|CO?HLr;fh|jlNN5I0XU8K>Swg98qF-0;yOeq8U5-Swv+BonFHS zw0Sij=)0@LVV;!u=5CcStWhMnhMco`XB z>l^WkWLQ@0tK1_QW~(Cc9%Ptu0b(=i#sv~$1n$m5wxE7(X87v`Pt(s8GZwG7`Q&f7 zBDCGKHob{vpeBwD&JY+TO(ZUw#eFWK-za_zouZ>Hoy}~5WIowhYvd)MnESJ{ya7h& z5!{vb7a?qE>`41foaohll_%O(GIl6z9d9Fla)S0kaFOLg7MS zxjdp3Sx>X3^!19MuH;%}(w6R=D%0VaR?p%E9PP|BZny)-s=91dNfAR4HHsfsUmDT| z=C68^Zpiw0Y&IYhb1GfvgL0wQxGrJu$gA|Iz>Otn2)cBruF-jl6=*6G{0>(FG3-wb zOY2SIAW@{b)Rrc0*1*!bgrb?`UCb!agK|$T$YsA21E)6UlddQHjret`f6@sp9dhyoHXT#%V`88(Rv@?U__q1l;A&ku`8e1D3P`rNWnyEZWv zcy7muL3W3nBW!P;LG#At5?A=*>T2iUK#tX`_vJbs+eG1zieNxHI^YQfgXw2FKvC z&`W6R57?@#z^#(opgs+Nb(9{{fz=i;EmhPT6}}0&Dmj!lp=>41hy_%FADAGkQd1w! zRKSytic?QX;cE8{v&dsn;}ZWqFTGZ_iq4QXG52gfNFk7MgZF}Q<4@g;YTTM5euRl* z=8-}tzP|=S%v}cvQ6!BbYRwc89QB-{{8zeArmFZ2+oeXeQKC^X!{l~-{vanrPe$(lwPEc@(m~bL{dmtCU8#*n^do1@XT11$&GjHS|9Wb+dZA{0$ zT|mTWWSL;Owf2+d^FD*h_Fe=Bo@Gtsf@~>jY{~3r-0QvM^OHFc0gRH5 z;w>{x!HgN>F7?zl*BQEP3J}bG3Xsgwe#*}cte}45Y?qO=FqsxN)108({aQ+OE>kCe zqXiRqaasT5S`MrA$l{^HnqLx!!Wxg$6Yz<&1`I2*Ci>y03*!xf zAxZis3W?+*GhC6ECo|eXIvideKSG!=B`dp zU0c`Vo)V+?nM2XKctSoD3kERFoiQ+x75Cc}t_J}jqi7qUitXI5@7wu)pPuENT0-ZA zB&`%Q3$KgSlFkPZ50YMz5(pDUTBa`99AC6Hy-0Ujup5SS3*S+U8RT?rJxC>{ReRPB5U=IhsQi}n3CN1IR+0QXE z+H_r=t*2FHi%{_p0-stOjhJWOT-gXV5oF((MODarAr!7n^P4)3zPvB>C@U{j$N4BLFV&l>)DQ4pH^Zn` zUaCESf~p~*M2~F$W5HFu@>1<3GnB=kSM|zEwFhSJ)#JPJk`3YnR9>Q;xRSS=zy`k9 zk4ohwx?T-9%t~JU+(x>xFX3b{9h2rHB6)unN+f_Fg))!IOOK)p^~y`u&|nuT`*J;x z(Rp7msT38*iv{1%+*lZ7bGlHky!0rrP_Mi+3l=I%I3*V9m6skx7wVOlX6XXag?URT z@Kdk6RPEg3yYdn}CEg!7LF)?fIK{6djpHxPgN7pENvj8VzFH3j$;9MIbYO)*-&n6z)|8nRar^F%dgZ0R z`=L}`GVLFhzgb_?Mx2yCafK9go==uxzlUS1)>@+JF_EO*XnM7NXK4}aU3e7Ji*NL! zP(Y?f;Yy;o znjR`%QKR{jm6!UrzxP#M!eV_)D=*pXlrEySiH}Opvf00uwn&n!3Sg0wtO8apuVbL{ z5{(g83POWNPF7yhUfGkCm$aAThg^B7CT1Sbm6zz~$;wMg-}_Ohyu@UYJ?Kr}la-gO z+=^7d%$1i=UXNkrCFZ8G@M7AAf+kiPrlz`BbGLGd>i3dTb=4~`(HMm@g6iUtla-fj z$>MQWdC5Y=Ppn1!y+b>D8hNeqk~OgM*cvzym6xC}gh`($!M{FPdCAJ5vd~_wyo4xu z3@b00n2%PlaX;&tgQA4#s@U(&3TDA>Wv%j($)#uo^T^4{OGM#k%Nc#Nm6wdI!e-*f zapfiYSuy)gR$f8?pRBxOIp<+x>dDGW2nnyti80&m=aZF}PF7yhg2SrxWaXvhC!q4u zJ5N?#B0yOwbk5E|%Jbw}zdTuaDeUlR*#_;Cm6vRzc-TR_{AA^&${_c0V^-noF&3%+WB>|@={qRLY1a|v??#vW^~jSU?E2XJG!iKLJ0e0<)z?SoUFX$ zib=#Re#cu(;$-Eela-h3Aghy=mrhn*^3vq-P#K*NaZCzTPM8o z5;&}iD`ea}Dla)6@Hr00Q+dgcX70*MeoM+@TY2fPe=1#YbNXA9=sP@Q$F>l)xsN*Q zL&{)p_Be5fBA>cUpGT>IlFLiDuhs!nByMa#VQA$EKsO!x>kWOroM>*xjhFT7QMy41;zJLQ~x(nh! zF13R$N7aDNr}1r!YId~qMCS}xp-7bkps0JJ*m!79qqFz)Mo0qV2;gx?KI;0A^5HL2 zv9h5+Q`9fhJhT-{b*srTT9Cj)&gSP1jQp6tcLHVym2t$7c5I z`rh!08!i`d6%A^VHjA^TuUJ9py`jz*sPor$xPixZ3~850tJpOZM$uAz@SQ_zv+YBH zDQ5muG4T6_IBr*Tf0K|%a}WR%X2sgn5RK4~Z9{4FQf?XXoo=er98UyGbEu0t-BhQW zE2b}>Sj2b62+%s+$w#cyt>SiCw|8jRR;P@Pt8AVK*1fLTTf8>gs&aIE?$pRsYLFEJ zzU}1JtnQ}CDZU-~fDh|amhlcI@I3hzw7))_YNpGxZi{0#;Y5pGO+>Y(8$f@NV zP`A~}OWXD}_{jedWyK$m9i{g?1ezRH=qHcbJsE;CV&qz&boMLnsgM`az^cm~j@XW`7$gFx*knTFWUt~XSKcbEaQ-AN_! zRN+q5WQ74H%9S*9W$#otJ0Q`JVCbc7Lx3UPelU2O68pixZL;hKyWVXY?FaJ4CYbk) zvs$=oPotPB9^j+%ffdL!JDhDJG*fJ933@#TriYR1K$n zkEMD{0;{!t!ALUFZjCh4k&Lpkj%a&bjjv znvip9$GxideN7}otfef@Gf0!8e;`eAoE&LRIB8s&8`|hnMwo@n?&6eFDl}IkM)w~+ zu=^d^dEl5A-o}YI@mTRK2{w{HL2_=#U094ZZK1VctiX zc^x37jU&R;bNJv0(r3G08a;Lg=MJS}iw!0i3==xrLfFF`0dcRrf{NP~tDn~)?-?!jWO0U!Epmz_1MC;_ph#4X zw4D!GJ!c&P!c>^dNX>)-gF4v3OVyNJcbwXns_?egDXNU!Q+?V;+-VV<8jxZp@YWIT zkn+-nT&g3Ll8%opo9>BV{pmV(7Y83Oae8ctJ*F%R4x~l^+KHPozBsKxG&PYgxf=zw z_-<)wwgI~F(z7X!$`~$|U8i9*G_*|TfwMtZr%(@fjU=9c>2usFAi5o91Dsq7kL zKAkU+TG3@m(I5mZnLLO(Gg!ytZRn-3_yfHZq^Mb~K~|>lu<9ve#3jWUMM<+bOe>`U zNY2!lR6)Dg_WF-CIdAOeE>lt_Y}lI?k@N*Pvy4nY5*~>oq73 zTt^w=x&{?_!b$YS8mBU^x4$rhI!6$&Q|SY-&AsVhn=9wv=2ZG%Y-;}uO<~j4x`$0W zTlc2YhhkF)`jbGo_UZ{>BcNf&W7xVJ~>BXmp5dCh&-0b*_2Ipc2c!}D&3TY z3Ewb~IWE2gSYrZQGST(`_ZH$O;Vt%6=Us+( zEcBglZJS%@+W(sd-a!Mq%-+x{{xZC}U3@8g9pc0#-=X31hLPg$!_`rGe96QR)zQ^x zs~mH?_%`=gkB4k1_I22rwyz`QRo6%ulIy6Aqgi~JM(k^=_jmm4}Z#A|Moc)C^Qo&S1w=$xw|-tg%`rMKE@?)=8nw zt_~Mp315Z#OC~}eGH`V1g!RF-XJ2(znZN4Vv#V~<_SGTWzK$>>mrP_FZC#Fuw1+Sz z`kxL@B@?OY&qs9ObA+aGoZLTMN*STt-=Q1f zt?%RCB)@Tk{G0`&S-YLK`LB^ULeNQK9xcssa%=Of*OnL(ZP`$37!tSI)wUrtARsf+ z@#7O4*w@1ugDoVl zL1)$3F%900l2;>%rW59{$(@-pDnCI1JmRbJ6Gok%z_D=%P5Crtp|qTjUpi96T_^Eo zhHH-07_E;LI8yHmj?|W_Begl<{2uQ}jSo6f;}cj_M{%Ua<=e@T!bFkZ@N7Pa%*un} zmxhm9wGm{>k$N7Z$8!P|IwViX;+HUGK9u*PuJga;N8y&C+Z~nye#V5Kal_A;@G}9|Z~UkSs=s%aKkRH|rm5mbU5mTHVCC^r zd4-Uq^P}unLq3F@jbV9^qLxGbeiR7Q;hR-IO5Tq@3)j3K{HTRo;@qd`BjHC8zpDFD z(ytt%6z{>0;^5nGo?q~zn76tgb!FX;!Xpw%Es`HK>iwwUK0j)-?nhAtPkz**nf<5{ zDA@T?tZ;Zg%Hq8f-Y2qPaBz@@Y%w81@KP4WANVlA_p*rexJTL$USxE{YJSw2RX>Ut z#P>Mhk-)L}1&Ig>QiS0W5md4wZ)4T5l@x+v0oD-|tHZbieUe0SlW+YT z2NM<>?)jVxUKLyT#)Vzs!h4>Oj^3PT$!AyQ<1~u58iT695pSVx zm?R+!D~LefslNhW{9ukF_inc?#?I;BQlo>1EBEZ=nu=~7sa)H|HAPf5#$Y`08m@_! zIMzD0zn5!5#ceS_ZwPR7Sd>muWusx(3idd@GvPva?_QNBjH`C>h;dJtZkmQVR;4onZB#{{uqimh8ZI9!PJ3m%48`C|zD zBk!wq>-dqQpy{}KhhF7`Eux?y|vHR6TL?4vEGOnof zr_KRckm1G>`_e9QK#@6CQ_|uNY&8N)W$$(pX^L7{-JVek*Ly{#1UGJQ!(mxCbAj&L zKmsT+4u|z&R^4`I7ExCa)CH^?p#<{C$s=QzTos^U`|Wu>UJKs9RlN+%kO@i~aI(pYwl4wq|K;zDYnd(ZZ= zHF-0_J~SkQlq)EMc;z9xqD6u56gDyUpiJTwOkJ*^Y~mH{VXkb6Mo^AKAzGl ziX@z?r>s-TdBc`0zCntv!h=wJg$WrEcRy10$GpX)+Pj1FZbPCFmd)g2s)nH6el;X& zzdh?hy;JF(L;+#Kq?=*$Nq^}eM65U$*&p_nc1xDFTO(}A(r&F_ef9E*QRJQ02z|x| z$ukywSD{+CvZ2U+!&!A4=+29Do?-~cln!Mvwk7Y=v~ zw0PigqmZC%Dq1`TLqZmjRnA%`vTBCy`d-r;urgAtOawiwr?j@qJ?&<%^#4Y8F=Ga(n``d%aW#0@$_ z*(v7}XKpoLedxH!ot$fO+kP&F)HpH$hkHnk4>>WQJTzoz5Ci1H&px^14vX`V0$Pl$ zNC8BLqyQ#oiWBb6%si^!{<&XGS2@4^z=$0WOPdc$k9R(+h|@uHtFq#usIZweEN)ct zfh1j5{*!2YPysg{V$F2a^Ox@CPT2>c-4B{``(Q?TTg&BTHZSdV_56XXJ1Tz|Nl~QF z;9GL(^$5gKMJqo!t~SR_`0}M=8Hkd`7BpMV&Fzpd=VNEAgtZ9~HgW;az5y{glusDm zd7gj(U2S%5lWcauk_qOnxS-gjL`J4=Y=xemK=(hBHpcX{!X(NNb@$t1E@wRzD`|oU znmj;Uotq~}BYfrxo*vbF5Rx^FbyrKou&#-ik>$L)%sg_E+hNM|EVnd}{FtvEk=#+@ zy86uwF8yg1`#$&iMlsa6V~I_IO=7tA5eqi#&$`RqJoWtEL<~7X9H+A=3@TkKpV&_; zZMAZ9n6koOi>;i|-%9GDsoh?D0q4odqnr zO+$b(HQazLLzq$Kqg{j&sfdi4JJ;u9osXY60s4~SRn5-p7fry-e1E;Zi;0tBvwc-c zbW+^j?A$kIrpX)Qw_D=3JKQ(jxW%;vwOxppypj)vlN2O69m>ElkWA4fLKx?`E0fau zK{mXK*!tWu$CD8PLV1;>gGF7 z*$}p8cuF$KP{wJ!%9F`Q)0-V9Oz5L2d5H{LED*nkS!;k4utj;9dpEz5&esXob2r3q zxRw(MJMcbHpnCy^y}f|zRAQ7UYAQ5gQ;Cd0C?0IH!K&wQ%++7W?$y0I$)r4i^Y_YrW1^KG*YC) zHB@QH3tSIU#q~Z!WL!^?c08ScPb6^Xe11vQ%D9?c)!tka{BDBAibW!d%mR)yl1<}f zYAKLQa!f;D$cB4WNz_*Z$Cd3atql8{BI*pH?yWT5BEjh}>en6ezFiRxg@lvNT`XsG z$HGiYz4y(Sf2pE*VU)h@s1IOt84PH8Lz@I?rri9logU7a^1N;-mV}SL$p3= z{36O~!e{7RtcX!lB2#HzDBD$ize+|534zG`v0@>iTT-nrok(fMcW^4bnrmBZGEBS3 z&{!~(H1uBrquF>nUoz>y$bHA$1GLGPubej9n~>{c*aY-{l;>=s3cnsq-vaG%y^r=F z*a;@i#x!hPjoogtlm)-{G5u4;miK?&Cn#rf@tK9Vbp=Ul7doXdB?uJfN%B|e`?rB~ z2@?V}#%vIgpTG2xv}lZx!5GLQ5I++)8}Vz(jZ`A36I7;w8mVjgYoy*c^`l+W@{*f$ z(osav!cNM>rxm#B>|df=eJ?xjIhC)s&)&tYA$I3Fnii5dHyK|}p-os_ks9hfsq+~f z{6Qo-zD(#s5h_%Rv#g$Ng;v+ZH~*>Lyg!@nqMyS*hYn|IKR6;(Je*BKx=#OzadggG zWE>RQAgZgV7`6a~|0to`z!^FON`~dnSR~JalGpMz8{WX{J7m60s%SP! z#&Bx^$ZNEeJm*M!KUF|=mX1!jj-KN>y3%zt_Z>}H#q8iCrBFbSuC>uC^YlV8b1&ip#d`s5ty|y4 zXMz}`V z{Y)^X>GRUd-1{%E9~Tr28Rk5fN$kd)2H;hvAxp9*CXeXHsWp9*(~#u$YMcg6uSbFK%Q+2F zIO8jMgu#->-AyvJt|KVm#v~t+Ij?u)&%oo(oafH^#qxX? zDF7*O|R#(8~<(vZSADuXDe!^MB4f z-Z$9{k_T5PZ@ zzKoYvR8c#W@yZ?%zaB;xvluiy-T8*r_pu%H)3mX)h`;-A)>}=4QHNimq3n9w1b#f{$Z)kx~qL4SzR|)KvcwoZrJ)(MClgY}7^c@7G6l zyPB`KyS(KHXDzt51qrGsgh{9k=qRaRQpASUQouvB#0(8sUxo%u5|pF8qq~5pz?N3n zC;xD&x1zT@50L-wS5e8+hz5&oGJS+irUz4L9_)g&x7Y^H?Q;1@2*ttKoSGNNZWb;{ z@$~2!$rf5SXF~d`(2rRa_KJIm+OiFnm9V6{M4xvi-AR3JPq0V$ zJdk!z(dV-e-+Vl~dzwD3?w(3p>_F!)`KF#u?8vf~cH4O}X}SG7qy@$cBxJNINr5f5 ze}{F_ct@@~SV|2S7)$ybrFik)tx0zZsL;n&;AEPYI|NLnEP>lTmxt2sD&5K^745@A zhhnWJorg$fGG7=4s};EsTc+YZ?S|2PUi;ZLwJfvzX!CJG~+ z4{D|8{Asxor(T>dyx2r`P|%j}M}I2`e+%i{Lb^puK{t22ZeAh>77OGVfL*A49ClNv zowUPo8#`Y**k3N6tkfT@3;UuF#@3bltt4Ta8K zsNEvx!$i(Om=CoN>uI-6MJ{Za$Ji_sYWI1JLb#2|h1wTV8Nr3xLHNU(Zf#V6?!Eub zPp!#|(0zP>P2a0BSpQk{nQw%{PUj}2mB9bu9=Gjzs{BoGu|-{g2q*fe$%wxZdR&M} z21AxVVBFyOU?^X8Ub+Q$MM7<}J~cn3k4Q!!XUIEYK>hN!!2oZ;eGNh&qPFen&^oi-eflqVl$WrrPsfI#S z!2f9U(4brRQEVKW?zU2#J35%i*sw-7jF~5bwV{^SY&zx~gpF2}0uHZu2)xs|2t&@| z7^+wt&PCX)x6;Z6jCDK)*QDOg&fBrhix(X0JBv+YBqTDM{>2cmv*;djrcQxNz#C_M zx!0gu$AV-`y$0Pf7Q~v<9EdiTW+?5sVJxW6c13-fazux;LtAq2(!=f2!=pEewz_y_ z)_ILNjvGh1wmo*kh_n0AYD1}+y5XL^-&%kfj zcX)w_M(Fj+$TTp`ZJ&&4q~iN{CC_vbgT)+SaxJs8?5R+SjgTFnMMKIYLYuV^W@$)+ z!u}~XI8{UTAk$O!54Jtbl+XfCuT3B3dvSmf40k?us+xUhth-u`9vCb8l;x{0%s1WL zoh+V=8@BpFcI^LP;R}1KFHC;HX2L!H>7_LFAe}vh&qF0GxmF4GSZA%>C$k%in>L$K zc6e+WDQkMs(cLK(Wbzc;%kU*{9$`_*e77SqiQHQWgYnjJhoYI@I_^hviVJ|*n{hkG zuncT|JNsmu?Ws*7^6!4V3aR#hK0(%AGP!o~-M{u$n>dhVUOj_4Ell8Wekw%=@>Be8 z(3Sk+4L4j&?yP$jIV4R=y#dKQ;|@)P;va}Vn{G#1vL^*L8mfm!{B(}9aK;@75^v{m zD7Zo`7MUoGQfnlfWK^+}r*Z+aD=lC(&tz>GW;R>#!n*Zb zfMMeWS$FLAiFDUiJ{(sLx2J=`HOy?lfEO_xQGY?$Bl<*P5g4|Rl`1?DvQmX7LRMGt zu|oD}Tlz~I^U)d|KF}AktWkf$oB1kjslNu{4#Oz7>jrMu4d$SQ=$BSn3|AuV`pkOT z_b~=XcJ({Lw4vf?gHW!OGqR!SMUZT`f6Qo4%0v^`xmwfR1r6HFhrO(eyE=!_%^ zDL+VnkN{r!Pu9ae3!o-)ErvW{>SmG+@hU>2#5uY3K!!fzlNB{uS0EaP!2I1dR34^)jF^JW}QtYAtx{G8?*kB3&yqTV9p{P58 zdE#y!$6Q{JHqvaYICL*j%9o$nz#0;8zeT57qDed^CliP>LZMQ=iK5@Q2bJPpcp5O1 zeB9gRJ&DE11Ygm{d!NcsJ21S8-2x0+Tgp zBo2{2FP)Ncw~D*hs#*k%IIO+4T=K+vVbxh6UL};u2B2z_tvd5ttIh{CCk|KcNq*8* zxAt7at-`u3tCgVWEa)lnktQ%2{J_6{H@LQ z2@8d0I|b;k^(J}MFhxf+as0uWS$_o>)@H>?{J!l;=i40vbWv&C(1d!_YQ8K# z#q|CH31U1vJ;1xD=GOT(9)KUg8&rit>uWPIxiDbk(CqJINvDq#i`|9_kV^LqpPEt; z=MIgK?|UFS){v;eVejaK8*T1!#||Lubf3#R#%s3QVotIu1o7&rX*_)A-Ah&M)k8@A z2lNS1?9nGi;BI}wlMsotj`)kFchH4HKx{EM>?k1cU~k$L7m(eIzV>t}5QmakI2feN z#=(K8mCqa~)!kg-U^!4Nw}4}!LlVRma2yxt?V_#MDoaZNfX^XPFsz9e$#ZA#5J_^* zp_AthyNvf*Py}B(%1AZ`dR&3~1>B71P8^)@z_ zs_wjDRP;66YnczKk%V?E_5$mRmi-9I*b6&PX;4s$y^O>rcQ{AY%=#psDfEY7ZX&^% z_IS+B-ziP|hpVPNo%8EY6_Z|+ceu?;ybnC$Qw_Q7B)w85(MAi!Dap?)kwNp&w_8Z_ zOORm(%Wy4PZb3$^yPV^_4oUQO@34hc__mMTh5Z24baE7j`=piIcyP8mSL(wD{1v_1ak`N20%F~ub)RT)saJMo$gmf)_4BRZ! zBSb_Wb`eoaem3I>DM1uBpV>n$Sa&Z5kr$niM@Y(uMJ+IkFQmyG>$`Qr0TouCM z_Em9^;?9JtmM7TM;-`q&!qc{J3qP5#PA%Tb7=ye9HSC|{dA6uJ8pmh?&NP~oYbrWK zJ4l9MWcD)90jns9z&MmIO=TS$hgu4yum3-0hFZMN?B*9{uuU;iz z%F=vC@{UQcR0{_dM*}(MxYC|1^)X3`quCk;8zA!Bf@p9=OZJeQf)c+704-Dq$!&<< zkQ^kh55Cgr8-)}^xDUR9WU8FeA33@v015Z0M;P+tBTr~an1)*{@zuDSzRZns|HevY zbs6r35bcdVvziLMhJ$&bT;X1ogm+4Va4$ZcdwLF(Ytb~KymcHX$L=$=BIXnKfLtQm zUNC86cpoi`eOx5HBxdRG3NgDp{ybrw8rja2N(4XxYMb!+EP>RsjR4Z(z&KG<#C@^x zGdL5sQW5g#yXZ_hSo7+v{n$EBDu22lI&X!(secsKVc*707#B%*G$mzlXdC-vpxy2-u$wl{ML%1F)ETB9uEN!>B%UoZdbdCLFIbgCy>p5VCT|Y*L zFO?bL+pbLcA&}`U%FJMS4b=lvk^X1nGgNlIu}n@%!_|e;_5$~yG7HD_AT!N_CRkla!ZzKq8gWAowzj1iJ{vqroG4>GB>pB$l(8NXf8%LpBwNSd>(=x8g7Qt|sc&M! z6t3B*Pg2{*`RGZJu_r@Tc_Tkv1l+IymL(g;*0hdk*@p27$*Nr05Yx8Z-b^yP*;nYo z!-j*yta4mLlPo=QJLz$ip_2o*mfDqEcgQC76Q1?Tp2@lj84waQl?fdZG-ZU{pRd_pz9mv&xYY3%BOCGgeBO61Ex?O7IwG|dPHB?X>t>v=9OP(mr| ze0`Zh24xQi=)wAIMr&#mHfyI{Pp#9CP=BWz)@i+o4k5CDv)M`_i+}W2G-|ePgG-s# zu}o}*E{hacg5-JYHV@dtu1hTUcxgH+zeC87G;NsH@|Az4p9zDg?vJ3RwG!fBwuT3u z9I6hCAR!mdLoCv8XC^uE{bk8;nMJtH&$KJg$N+getDk1uEodfb)-=h|obG&i(Lxv* zdzJbkbdztC$QXu?rT7_&l4}T;`K(U{Ew4q|mFCnWTSn5vQ4luG$NWsM^2D>uioJpG zNxuM%+)bEtQ&i2RXxctj!UrpW{_FU&J0RTtMdHmQbxkBy~!y$ z)r@p&uvTq3Ln&LN-?lqtD=?~TIz&3sm^O$tLX8P9W$O}?Y!DR(JJexOPYqA8t7bT9 zWSV>DjCcbIi^Xk}64d4%GsyZ%3-@bEgh;P z?@S$~ID?ITUhw#*69NnjCDIA2D#u7CT2FGu8+79L9?y$T&JSdA!ThMi8GVsTaIgcF zoIWFwkd%7dG}3}zDl`&o(qo|!xucOrh&8FR2nVQwjcpBmPCBcQZ=F627{z-2$W;_} z_OV~Yp6NSO1Hmz}az0RZl(dF`39*P;g|eN=GwDsbf|eTe#L+1gksUu>`}n6*+!zKB z=@jX7jC3l7k90~qJT7bM=<@72fljaOnyIcudi zSCNAXh8*63g*Dd zd5n^rcKDaJR`zvgmN8a%$Q6n(%5-D2$)+hk*?cP}+aYdXj59aKfUpK%I_{VY`{|9^ zTWkJc#YjLnJJG{{z37T20<-{2NNIZ!h|->&u+~^hN$3A$jJmXDaMyRRl1)Uf6oZb? z_oZyd_Jl4m{1jeR?$$$T+Y|se-&5HEEm7{SQ<**3MSl2UoIf~>-7{D^vkzmPOlDl8 z&L1zV3-jFxbzbOz7v?f44+deLRfPG~fx)hN{0nne-y#ZgOb8QO5ZyeDQ$^RKFlUvD z$LA-^uMBi|)!>AcVxcrml_Fme<_JscsVe8l3U06nE-QFGe#uv!n2!5%u#j=-%7znv zkM6IW4V@EY1pMngQkUVsF%EZ;^V&!jEnbpNo@r+JWp6}jF+AF2agqyD z+AGhx$(r><21kn9IBa7mANld*LrvHyy|LRaZg&0+ceO17-_7K|XgRhk9SU=39d8X; z1H|&0>)GU{?A7j2adXbfqG61 zFr%y>o!gN6xnQ_GG(0joHa>xyX&vXFl>fV-N!K>;AsO9V*LmHNF8(s{M{+QG|DV0L z0kZ45>U__~y?t+Y-|oIGb+=k-Svu#qZMR~H7%-Mm1kq_EM=smg0aeN`m8xfEQt#!d z{ib4}a=8lGZek^f;7kNDpn!)_UJTX{3zWey3Ya&7I2keH@WkK;qGB?F1R^LyG++kJ z#4mZj|JwVUdv1T-w)_!bVkLdf+4r3NvG)4fYp=ET@N9TUo3`%whDLto#~x?H&yJEH zjZ*QzfN=f9X&Eq#X>|$m9>w9k^()L?%0gO9Tjm|x=J4w9jcrmHG&RUOk$z8>idi|T2%*tH3? zt6&}B&=X+Jz8V2WmZ_7}UBW6nUtPB$J&GC>rB-AxK2MP*aDAtU%sv@bjC{0HMCPJ6t677YZ2S4%3X8Lc6PJ^f19U&_CztmimBw-A&J9yFz zOp{9!o2+pt6cR%Dc>6f>9AZ9&OW7`?4jeLX31?w7TsUg)xC7x-AY*omcJX6zyU+w= zP)TXMjdHNz1bVNxdOsx<*n#0(r~4iZXDcNR3}-4O4h*L&B@PUyIwbl1i|9qla=FbEc*WllKMq! zoQEnpaazamEHS^ci2OKgIx2-1b{Ar=?} z<^Cu$M!+X;n;S^mqFdxLWTCG_`^m-As^W{YkHSGecNKz5oH4&1Cp5O}qN3F=&?>@w zQM=L(nXpQ`&9YrNqacl{?N%B*zo0?<{WP4=hSRAQjL`N$KCn`?a4U^NTNM|}YW0~C z+0?_D%(nRvWDRS_pPE7_YbP?EVVr;cm!JHiI|s8aqO**d_QOkG`hP#6AK+$>L~jYb zE&Iq3BvG9@SS+y=QhC``8ZSF3{lURyQ7Hf+nwgz;i8&l!m=&oRq2{W8N3c0R@*&!| zp3gV$&o48Y{Ami>|8|n8DXMJ$s`*`M0fqw7vUv%AlN!tICC1F|(qMUJ z8pmfa3Oh+FF}ShOoua#F;{rDsWeKUdC+QnB0TJ3TF-~x&UL+O{@r@$Ifqa7WNX+)Y zK~H)Es8_XHhUC*MQse5>C&}AI3eTfUDm+fVf&B%@Zi`8o54Q)>B@hYHN4y#%nz34A zWeJfq#(<6Eqf;w*H2q1+1wq`-Z64WOXam$l2$Y_k!eGxx@It4s=Ty(BX%F_iMbBG0 z&$cl|Ope!766>H>GEmuQLVR19mQ3U7?q{M>uWC6ZsO;yD!#cV;`cW&W^z>s^;M5=M z+P|@aN?*mDt7?=wC%NKOpx{R(VkB68tyMx1m5@(XgrWrSAK7-8Q>v`(Ke2*J@BYFH zD!u!!R#55Pf471PDCc1>Xp3F2RM565Y{A2EgYC2APc><{ol?TCx@7 zB~L02ST{vag?WI-;h>Yc-zfSP4V%nNntPJ)009p}Lqcav7#dk@EId|87YjF@F4^@p z0BnjHYVHZIvw0{u4hklZlRkH0L)U8d4Q`j zovv9E5VyGf(Y%xkdGNM8JeW!-*a8r{3xZnUhTs1iI$wZSa>Mkz6L#~B(P|vOG*}Y} zya%X(v~WE0t6Cy&WYab=Sw5=XCT5@!n@KnTnJR*^vd&iY5+hJ$TGML;zA_NgDvRWXvAWIYpO}P!bXe6ZyA#{@ z25_{)e3G5xb=rxp7q*Y#kv0~cvGIv@s2XO2Ix(P+*c;w6H0h*9VNNv^WeJiWDeaKB zyeP#f1Kp4Wd*FQ9qPXM0&^j{!Pz^>LYGZ?$8IQg76Ypr;zsbb~ACx3=8`8YiGE-VH zJ#L%SUcJ{_Z@uLe>#c%S1XsT$LLw`JE0wVQ-KK?Vr*QzmPm|%%*^uq4_4r5dbR@j> zz|e%&=zPXZ>a(iB*MC;-UlS+BH`?`LUvizzq`t(e-K#+yTgwK=TLiiC84&K(pyJ`m z2Fawx5Us(~OdG8%mZVz@R43kx&2xxs&yeEyI@@_N<}d;Giu^!+vjm6o)n-tdL?J7a zIM(8HC#6d6&cfeO=i9Q5b8^VeGJ!ZtTBZ*iSU_LhOH* z9icAl2eQPzRIq=vwbmvQ^4`NK^F6VMkg^hs+AU{f1%Z3vzWP>D4(m)$zqiXk5EJKO;J>{H!HQjdi!@ zXT%VdpJBBxM%fF%I>4(0Fo9DZz&J?kQ6hj|%z?zHWvc_6v#!pPa-vtOgerGhMLo4v zF(2^dPg13H2qxG>ZD&`s6tHI&3RrkEOE@oJ55SxI{mQuc%4Go?(F>_zDOo_LE7Z{R zE8JCxNqnC>Lw9ao0vbM5d*lMv3*fNG65tIP7YsXk0$igir`b6T>C06JXS!H6*k_)- ztI`JK%~m#unbzagDjKABWrKAY=52&M0Ye+*XEk|o2HG+#)iop~^`L3_$@N+GtJ<1Z ztzmWAYN@DC*y8EFY9s*6)i`6kni>%&uc}7;KV6Nxgz>f;gShBoX(kj49j~KOqU?B# zmo^fc_p^-QOK3k8Dc8;aP5Y5SV}bS~nX{1pqajx?KGF(zbu)t+TF#8EfLHe!+H(1s zSv+kLFmx|G{BDus{u{j}_{8hJCitrmBzRrd1hi0Kf%xod*96wFjuXf$SQGSUaJe-> zj|N}Kn!u`ZKwW|=UiF%wM^AgK33`0J#5j!{i#5R&eqOE#_L;w&t;^*H(506}Oqh49vwJT1_e~4w*n?$}(N&(CTOv|Ma%Fnhv#QlaI_G+8ez( zio-B$@qhnct+*+#^+0=H_5Aa}+%VfjVc6$>YUt8rE25r%h?=IGLDzqMm8X7xKcJ0^ zS$V6TeII`w*1~ybzO}!QayXuV}*x4WUIJex4aeBi$AJ*mHQon((I5&;yS znXhdNNUs;m-K(#3_adJ9LuWZ|bR%4em;`>t-HTv9WvpI?8+Gvn&db^!?^5G}%vcvs zYTU^w2o*$VToF&g*D`<;t%fJbt)K;%NY(%!(i7%8F{WKE#$S-+q&4lVa*j#Cqt?AH z@UyIui&^<%;N7q^@Hq0m3wT5UTmeJ3)Q77Ap3)P7E}#r}VA*YW3fWr$xfY@ii9?ij z&b^0u6ZvHBruo;%&f2)oqHkza9`ejNY4h^m3fw^;8*WARCjAHGG}n++^KUd3ywR{X zkU%)BW^yi-YbdTh+Fn(~NG4SrF8D0eXL=LQsJ^~hy)oQmyXMuCy(M}o6o)s4pPlVR z_U!w<`hl^5{zfzEW4%Nx`_Zp{VA#Xn=z*Q@HDm10l9)jb_a$FI@j}Uy>vc`O_51v3 zgyginof5LNyo<|`pFGQNck>&0^WKdUNpx~nZCw~Syghy|&o!O4ep7T0HzcOWAN^Nn z;d;uW)c)vzoOEk>B0p(ThB&oMpXjuAP73H&@s?&q=$3CNIBSGY(%mu{qOou?Aj&IA z<2DwqAt+(}G=(@iX^4tgFy=m{=ORr#+v54tKqTKz;nxAr6MA@&Kjt+ZA-wcYPJg&i zqTi2)L!JL3yN!o}A@*Lk1!4Y`;B7kOW?K;De^K1(@I6ZNN7Ol(Cd{gQ*KQ;G%x*cF zk9P<2ANB9zr)cl~9i>ewOqIPk*=Y4jrVVP!G>P5;S4xuJV06uT`>1Uzg*n_>q_)|*R?^M_Svbc34w$fVu#iEoH zp1RFH|9*r!iJvcIw(`5vJ=y!@%o z6WL0OC)5{?Li|Xf(i-a^Ex6P{pYw`J3ndU;ZLSwc53H+_!T{An?5ds!Loj|F&o}Az=pS4H>XaGkd4d8`Syc|K9gt!CtKiC}g`^etFopFfHhBDRC#A zJXR(HGiUa_TA^$q)jFcpc~>iId!zjpWe*7Gi4q*Ne_ydca{1n?fW=sH(^6*oU^pc& zpa4rvSzz)UQCk)?^#)M^MFF+jNEPd=xGdU1cjYV{8x)`=$q*vlb4i)Gw}s1;bb7wU;Y2KDJo#V z?cZOo6=Bh*|B0Z_#Mbg@7q{k6?JNkP2($}$_aBpa)#26)QK2Q-!Ct&eKGPE0Fobzb zdQO<+q57{Z`q81Z9cS2$($v8@OtwbvLhU|c7|oc1BS?gJ&6 zz0!SNo$0eT-cYPA3D}SJaZbMJMachnM_bT~f)E+`JU+}!JmGG8g+U$%psY}w*X#=> zY~+w*Ol<+C@y$&1T-5&9fQ9yvSB+%JUFup#aa;Zlbe@_U9tZ>fpYp3YjP;y@lOzaM z%8&d+!9Z^KCIfjD>>Dq5V<3^d%q!D66MYF@&JjDvI!){aSi~`uhR=9|8yx1mj@9OR zE=pVZq#588cGs71jFArXAj%n|6&4j1HA($e4*k&a9scn)9-9b7$MH>kbaR(~f&vry zFPUhh#&Xw@8e*J(g%}fzBCU{7>sbJ{{~W`0m_Mh~(-Nk~+0c*aLAwrpu)#N&p0OEN@=W^x+T$s$`wXxhsL zC}~-XanRuk5t%Nc8swjki61Dsj%=DJo|t}!HJo3ll{0s4G=cOnHGc*-N|BLU{3F(ZMMFjndF< zi(5b+4No7~9v0Jw^xiUS@#^V=Q$(cubkheQQ<$*!T$C=`K&FLWN!Z2&P!v0q9ah+g zh`HKDZ!2AO@A7HW&%kpOD-iAXKJob=|CW6Ism}+N7iiI9wm`*81uAx?+_sLI?Y|pC zEknPKgKTg%eq=WIKEx7C;>o;e>45h#RD7p{3`4=3DSqsP=oMRQeSE@y-OdK@N_+)c z?7h+&D(n4xW1i4W3k+1&k03u|6dq22n5$mscLvHt>5%pA0x6PMl&6Ei&u=ATSNITV zNG`FikEa9aqauV|vMV#63riVR9*6sV<^>6??Y#gNFvG{;%<)$;j};TPI5FEsDZqI_a*cq;5K z{)>wne>DvmGaz;I0r|J`_q{}3DjE8uAT%ZR+;8*Su*6B~`Ns>geo0wh;?qdFg$B>j zLbp)wnO+7|0Zb^HOhE}>LO4)jo48eNH}1bvDa-;NcJyF3&R0}x5!*(07+OB zn4toNh7C9ICe<0aIwJwba{>0^-yV3mBWRP4qcW5ZGmge)@2<=zc1-BOn z^S6+Q1#gpz#|Qlnh*H7JZnv0Af5@=DN;n+9NZSNU8HfB~c$sJK8Dl7K_?}8K*ee-O z+9`y;%>c>`Bmf+3Tfos7K%!n!CGrx#aet$OQYLB7H}l0vg9UH0Or51fBoFFmw-*{?lz} zclIYHqXAgx5Fs_D$~u3rd=3XWt#;M1-lotnM7D3srHxz+3?GsK;{ocvbT({=xh2M^ zDJjM;e}Ty)JCEHzuZb14Ma7`VizX&v#<^PiGo&vehe^?G1$G0A8Cr5IhvBxB`Qc7@E@)79NV%lZHh!KVqUz6&FxOKHt0x5l39IF9LFswNPIxe?Z1PV zTz$+upwgvKrpVsLh~`Rrn(Wj&eq(cQMkotFuOL?w8NRyNe+zR57Ht@|tYu2Ka zuq_819I>-+Pf`*1g$TK+Q>bE@B6cS(TMb&}PD*y7Rg&!EuSjC^=HR=O%jvCo`{03c zq}FN1(nn`fFl_!=@eLa-!@4tTiR+W5Py^O0T2rZ+dpIDE*Ts@`ZTstdO*c|8-g+Ou zvN`|H?P<;ZoT)cB05`9UlE2_x-!Mux`;@SQa+k<^V$BDOkK!GZE6mCqDn_fa9qS4|{n% z-IiXFSwxAzl+M3q!JQny51SBd`GlJOvDQj7Cz=#|&k4Spf$yN^%=g9RRg@Ni4}djE%U0zXR&|{BDq_+v)RoV_P!9EO z;hP}OBEfkB3{vAQB$I0mjm8ezw7NW+Fk_rdrEUrWC5Gsz33J)u2M+SkpLb=E9mZvS z0Q98HDrfLrnl9eC+d*BtXVHwQ3Ya)B6=FFC;_9XEv|(v(Gz={*;Z|MM<4XhtbmFVE z;_w0#3mmY75vreA)109`-!epGa{*m=+JIKxja%W|3hQ>%)Bc2gRnpFY6U4U+jVmm= zoHyJ}R(v0FRAjwW#*X~8Iot^&JdO~y@AGH>h-v#0#}c6a2Br3QE<5^fI4dV z<>z_XobFsrDA;XQ6r3*`Bo%pifPnZ3cQt^bIOvM1;w+rvKfIq{6n5fi*8JGfYgCfdqTXQD?B_y6= zV34*@+0brZQkOV$NPW~HH9Zg-)mZ4+>IvruYLQXDRW>!(Asl?X9_CdR>^yy5Wf?0}7BnrTEYw=T82Jng zRBdLgJ|t1#yyECE(wdY=ojV9Gq!adgj0V9RWCOGhPZ`M78Ot_R^hCc{&zk5m(5f^D z04q!_)StR29?gc0XhZ$mm|XOuq{b?jNiN!C4sBJ$r_Yy&BTBKSr=_VfJ&J(l(lRcF zu?D(;Pz6lfxjmM6qq27wpl|?L`L6)PR>?q9cH&EMUlj0%1loXq#XB?azGzY+g&s9(z3Z{=X&FBUKn1$bYr`3~gO` zGf0LU%zp6;pZfSuf9~_Y{%4p7Mo?NvY7ynXtyde$2RV?}m8K%ff2aId zF+D){_3#(ZVUcL&mLknQ`SKTj@2h;mIqc?ClfS5n`&4l)9~R=_siLBO*Vc&3#QW7s z^KG}<`kIPtbmS{^tFHI|6-5TpC|?7=$=6cb2UVyBuyJn4$#0V%?J7}R?@v`rcz(Qi zW@r;K=B&$6uQVMm{mpMNJ4&pUuZKtE>vN?!`USl&=#UTEt#j6EObTa%Nq++CG*`-`CBb&)tefb<5Qd(Xtue-gFuQ9TdPHNZiyt~KBP&P~>Qs!^z zM>}mL0IpY2Qs#h~OA(jU<$F!i?jU9FAC+B3Ts*XaJL=>IhmD>@zpVC^d)&OawelBz z!$`0wgzbK^NDK!+@Y{PpG)s37+J_@z$JWs;4$g?tQ{Xv9)^pQ|o2?avj5?8LTb* zdn}=tPDPbq#^M(dePFIZ5ek6@=v{-{S(C~=kN#kY(bM#q+F=2}D?b9?&ZkU>$qIPb zbxbxN#Asl|uk|G2G-*iM$cFd4bQ#CpmsX$sTAT4kno;p{R;5a<-?i=>M83h*cZndk z1v{BaTAzPl5X><#NmI>(2SlU8Px5M?0~DYda4-HKa$m}POe9!qxE6p`h^+={BoApN}*+?No75trY%cWV2k_BOCY z7;qtwoidObp_ugd;ac5xDd}RY<%L07Y?)C?oEv(8u9G2YP!(0htAqpZ|UY!*H)ZTd>$nR z(5$SFnX=DovFh=a{XhNf&mtY``5!W@!lZ&}~EQF4nOQB8!<}3}d z96JuU4-Ya}&Ja&xIamU8Y|gMxzhjlQPj2KqqY%#qNj3Sy(hRB8;ZM#bJ7!ju_LGA0 zC;%PDtODGfTylCiqujY;4Z-Hqx=N8wZFJm!mLZ7iR{Wt48N=EWR|~Vy*!1Oq7vq?{YS$x?IKao zo!M1szB$Acu%E2r{C*ys)68?*VusZz=_!v3Nx%fd;HL~Jgf|p23XeEsq$L7dpjztz25nkE*n$EBr!L5vUqI)y3FBbd9GmK5 z41h_Ue?VjocPiWh^szQx_+Ao?N#Ip14Jx;0gxB0_rDE%pwkLHRj3$<36i;?|N9m6l z)Um1nPL)BTkNPW2z*8bTKy2@*e(=0t_Beer9^gL0iSrfHzt*%zRHx@FYTQ^6kkb6l z>o?p4kv>NH86$0V&gF!Sn*LL$qOqx>&_Ei4XwK4Vswhi6uZjw)s->32rOIUMd#8%l z^lg_aYM#@a9^f^nIDho#f7Yjym(FSNh3F9So@N(G1JZhuCvc!CBWgnoMSdpygtf!H z(bs-tN|V2vv;Ll6!zjpwWod}**v_r_4a_haQamLyCq_8i6D8{@2?d3RB-92aLo}rJ zPm|+BW1@oF@U{<0#G9|bZ)i}Oj`0|aFzq< zM^L+8n4oDvogRbj9KXJZyTG7rv(R%F36G_j%dzE{ix*p7uFZEdmIox(T&KiOxMRUW z)SZdJD#;&(;L41~B#sF!@%##>5y!XVXFR`-?>2UC$F5;3 z7MZ&_ZAb|98*^!BRvX4#Se2k!Ip*Td_^Zp!nifunp0>q3wvefNd%TxoAi-ZT+Cs$e z<8gj`z|Dxwim`jyOY)();gK+^RsM@nY3hy%N}kGoW_(ok72Ng+cQvln{*8WPbS5Yk z{}g!y@MypbP0pPN`=VHqQqBb&fl;7O8pG0d!Smod(52Q4QDG&KzZ<;dW-f^=T=x5o zT#kNB!e1o72Z_6|DCR~Jww1dADL=UmM2yS}iXj^xY=5~SoJ5V*X)6>OUySmK6Vt9a z4rXVmeVTTNqC)H4pP$hE`Tq;jwxcIF21A_J)Q(#F@RZ~hqSa{Xhs$3W?Y3YH(HUYc zm?d5y>AOCj%+~At+EuyxnH5N zgCVFQE-)O-h7T%K4<*i*poQlb{^Vy${DZ&Q3R@yr)5VtGuzYxGoUX+Mdz_P4HKup) zgd%J*2khIyc6sUFAo)fT9_hkcN>84GKmTJ`L?n4kYebsVgSW$;H z;n;Ao&TMmw=&gaNAfy<+ynYIKo;cz&OAh!cLJ^j8ESbp$&NGMpBO-V_h1&t;6mVjL zBYE6#?Tzw~s+e=7d7)(R9LS*>O8(wYZ(Qa0sQAwImz@O@MKf*m6d!1()jalBbsQCX zfBUoSta>h{Z0)&AJaUogro3lpz`V%~2Y>}TYe?537ovdFUAB)m8l3eoJB?3BzmOuWS%+U>KR}3R$*9Nt<&VSWuIE=od;X#xo<^xIc%JFUs?PLu z?IqLY8J>ZR{dS8UAIOKytCm{mk*llyi_*Ojl?Y{SoTyr`oY6EqAdz$4CW&{-iM;5h zwo-C~Dt@LT`-RtN(v<=bzn(u=vMRr*LV|k2Guer{a869rOUeuGo|8bf$1|>&z^KWN zD8qCF*Kp4;F%xcm`0a#s^f?tkwApCsItO<)*E!|@iD%n$0hr}{=eTM=$7u}s>XH z@?&jK^!nJZ7}_77&?=PAlWg=ZIBWa}o_h!Itm<6_@7UUlDio6O8V*2fn_dGbR(`aO z;IcD>6cU6$6=L?`@vCbKbeAy8Vr_G?N@;%)Cl^8ME|`NthV%ivN)WgUkoLjwD6;W* zT2!{(-1!Szmff0Z&V){y=3LVXPG&{TtY4?aK@ggb{`?ws0(F+PoGvb}KgPKj@zMT- z`~_~tEKA39YL9V#-hzX$w4f^$HlnP)H{UDP(#1w({bM1?kH$t^PZ*E(E3i!%FR}hh z@AtjG6^|LQe=!q!-_KeCW`f~a3mZ`;>PSkDsD={#Vho{?1X`!bN~I+T7cl=E*e>%G zEMUf!%xp)Ea*2&Zjh+r&7Loiyr63X2L7n9rH>$wNBULXCoVpiS_RLzBf?XPuYo8O5 z?%_Sp_x5q?l-x4x%epuz6_>l2VDzTo2YBgARu4*Bz!_CR*HUK~S`0#2%0kvoQdMmo zZlO#qvjIhEz}y9zyFha%5v815&WNbF3qU!zeF^#uh-vCrMKN_Y2eD4o(5&+{KibsQ zy`cyztTi{O?Dnkfr0o|gIGxuHzmzG#AM7A&b4WFKCfhm1wuBSj3xRaVnOj$J4lB5A z)&(sJ%L*4R2^CCRSrV#w&ZQ6xSWG?}m*3gJ@s1>{BRV)9Y*MzzIq34o4Dv59t3K_pW;!a~bc5j{U{%HxB=n{044_o8XnXw5^qPGBKz3({Upw-kZzT^7>ki##QlJP1`{^ zreT;zZt4Nuj|WuYcvsS<4{PX;EZMsBCu`iB%sB5z1KgjsIo+1s;P2C)eN)+HW(ejm zn4`TW?WuILSkAgV$>u!RE5~QLc^`tD3sM867GlKcW8Hq}zPWULvX-8Vr)@Q#v;~ZY z^&#tjFvGlr_APxAEALn`re9m?lL2k`!3-6fPGI>Nc*lX0S;Jm#CByqD9-$;{@-hnf z8fmQbJXsH10BTLPa=K8P8%*26sBvD14`$@PUt^6kL2K1U(mbR(2NM)Gd%?lZdTC;F zGTCq^LZ;>>!9#XDnam%$kD-xA?Y=bOH@qiUhUp)}WFDF0WYhk1%$0Ti((l2yGYN4r zh64mMI!3GPE~+a-Z`aPf{i1RaYZ8lYM1W8I^k;maJcn)MkCspMWP`>umQ2oNZO#pv zW#bI^x08u<4P67tqgdT~yzJJf>8^dVXq;+s)YQ~bskj;`4W0=>13!F0 zyLl)>S){3KU=~p5BN-0_oU8QvNHV0)PFX*}+X0S2#*7MLB!dq@CQPQx z2Yhwt(4hxuX84_ex}VIq3-jxk;sCHf|l2GxIP_g zKFCszE!TGdj{&wX2~`xm(iswdA)Q$Z)APn%tWcAF=lu_2Apz)U!?22dO`~HFNMlz& z0fg`?6Y+vXfJt?UhCQt@cVmvC>AGO02^fZYd0VdzBqJ&r*mnTn0zyy9j*x|DFi$$4 zuzhWqE8C(7hRQr*TeEC5NWmCTUCnnKs3&U%rw&nFOQT{M!eoOObO3pRRW3erTx<_& z7LmJyxi=sjUM|siBj9_cM1plp-*bAhZPJa5>V@LB{Pa(LCdjYOU*O^bQ$GF}1=r;# z%7Tj@p&-eRl?6xi#uS-={3q}r;Bl@nE*4BfI79eSC}XNInya7;$L`^>Da=M}hFK93 z!I0(GpFeE7XUV$#ND(9>&W*`>xdlm%yzo9z$Z@*zL1Y+2Gq`+Rd zPL<6}B;%5X)e5q~IqCfB@(x-_pwU^*a4GFagWDkl#L6ZPuEmL679_Q0>2X9SACfIj~18fJP z?uFrGV?mQpd`UG0P4+t(+rJMPTTSfu&zzk3aFk1-?fkfW3l4r z#T>Yb!=C#>b>hG9p)upRB3>9SU22F;HMGX<{30-|7h%RsyHpO;DO9Zu$yKOY9?NA& zbBI3oW0Ou>}^Q$Khm0BX*sz^>=YH$xO?(`1fp_HRV1lDs zOy)0(ssFhghf7|qUXBf+f+6!qWwJzgHaoo1BpU2#OT5c#Vgw8EhF)v)0Y*=?iq95G z(u0tc`9~GCM;^_^-5K~O+Hi%(@od&m)!xP_3$tr88#sij-6xH!ztFh)rBq@3(@YIJ zg-h(?L2Lp9h2UZ$mv6`hAI$nB-bXQd=*4C>)b(PMp^UmExcaFgtE z4wg?15lZJq&XdNr{-WwEEt`k7v;hF8$IOq!;_) zAg0nU)ws^EPwr=&H7_}8>ScC?OA(z2%LE7wmjEHop8z+jX_r`1SV<@CQk*|+C7rZO zv8<1L)k(X=cx{WE#k|YA^tk!g#I{k{B=M3(Oj+Wknk8Oh?Xo34hVcanp~;KAYVHbf zTZpwZV5(gKXd73y_gI#y;CT7Q!qJkWhEp3X;{BiSsLf;ArWo6W&sBp+*b(5YpnnE_ zrGW}De0VF9I1)Qn=GMhG7ov28h5K^D zs)>{^ZFF!$nUrv^u%2auO0+K^2w`mALMz(jmfbn{Bm=%nx58wzntgw{!ImfH-MR-eqDv`) z@1bz>ZsnlF$Sg}8Y+y$)sq&fVuA74OST;9;e>1`N%l?LUHKIhQs#n=eEweeqISn7A zVcaX6z7A-4h)PMs^Uc(KN+s6?}+LHVv`YwtkR)g5)$!JNG ztvx)4<8^Ad#wS!0KJWv57Bs9&5X*qHy5bpX8bA`1&yd@IBth{z^f&-f7SMI`Cpq>?10GzH(^&Jc#OT|O5^s&m5aepiDV2Qd^301(mbchYAzdt0ytf^G+!Xklp5I> z_^bbujiDqH{CJd&AyQDFoMDt@0Jd7edB80y5U|fi`WX)s&4J7Cgl19@3ev)Zv--IV z{74I&sZh8*c$F$ki)LLW{5Nqv;YddOQ$#`({%4~U9b{YZnJ6Wd>$c$82tyOsPe&*& zTz@-C@fqG0{8p5bl6_lnCQ8XUzb*LpQA$$%ZNdK?rJNeDE%?nSO>})GN>g2bBT6$} ze?3aC*7Z|SI<4#JD7{A4e;1|K>iTO@dY!Jn8l`wi;%FD8TXg-ED1DQz|29gm*Y%T8 zx>eU-j?!(q{!)~Fi>@c5^v$|H6{R=m`ioKet-5|9VqdzQk3&QJ*%AcXp((BPc?L(r zV0-8cfjoo5{uzR^JBVr2uQZqjPP8Ysx(RVucIw;k3F3K7>yWx_$Udxna$Y=)Xyirq zW$U?>@mf3mHhUWthu_QOA}Q+Bzzwr#I{fAVeo>LVL5 z)XHCE7>5j$QL#69gHz^W%jMgyUZQf+8}YhzJD6RrlRKDQuIqO&yIeQyV0O7q?O=Af zZrs7_a=mH?v&(hU4rZ6@<{iu~*JKB?%QfA>>~hU^FuPo@-ofm0o!-Iha=m5;v&;3` z9n3D*>vk}^TxWJLyIi;IV0O8_X$P~*_4*ymF4wI)m|ajj+!378^R^w#GS_d}!7Otn zm%vF~Nj`>$YnY7gV0O8F>keicHVDB&sOEGMwtvCcy9EkqCitBoG?+S<-QsL9TUPt? z7f#}ypb&kE_X140LK{zxc@O}R97ZIcZ5wAT8OQ2)kUY6V^=fb7Tw0Ty7q?XRD%SKry6*_^_4(36? zWUZ8d=mGA=Oda?kq1Qn;GnacE^5I#TzbNFJR~YXM@_WdRk^w=t#Phh{;uqpD5u1p# z1H;@0q#g8o?cj%`9S|YF;?HXb{n8Ewiyl&=F!&&x!)zrm6y-I*2{tCXZ%6#1%-pNw zaUy{frv|x3_BnmdMy}vZ=?)Co#FkVRsX+3fvEdFV;M~+OLXoA65S2+M-0A=Y&h%sm zRbuUue92JMY3DUt8?d=5y05GaFlQ8Gt2=<*{x~snM)U2T0^(izDg<9suv{TrD?e7H zD~hcov0j!_@*B1GC_w3TmC+@r^3fht=@UhDbd@r5RFo)l6o2*qs;)w$m!HCp8dy#t zQjtk?s`6{Kz*{_t-x!4u#{d>30NHX*IZe!zt@PWq@ZJ(7&a;taERHwp=Z@@#Ey%{gP(X&^%0Tv`lgizg@Oi zmZOq;tXDJD&1%K>NTd$g`X|VCOT@xMYc!Ux{2Nh%$c>#xC5Xfgq~Jj~Gbs?pEHn0* z)TVNwj03#X3lAcr4ZNZ{FsjmyfWnt0C*#)x%c72!3g4hO0UXX@4d%6Gn+{t9( z|6n)!B$lJumi*9$XE*8p`=*}EANwTQ%C;a#A&TMI@JJG#oc%iX%4}pdc_-p&D36kn zC$n`2Gt9P@?uSX8#L~FyzGNL@;Qnk=`*2@|4;G&4Ab5OG+I>S8tlG?^xi zZyo(rrnV*>!}OP=$<;~L{tRxkdbO4@fi%HKK-zth44teD5M8twS$Dtx5JK656k${F ze%4(hvs3RN=mjUM059Klz_Ve#7;+v-CvxrA0?J#>h!7vl?;)CyLK|$-5+4HK#H;an zGW?L*SC9&G#)76&WF*I$r&46R#~Eqehd4!HXLO3P25kbe-sAvw=NefN(ituDVz*?6$ zgoD%$X0Qzurfd?jpxz)vxh}nmS(Q`S5G@ZS*D4hi7GU*iv!*Q_rkxGRW}I>E2dT08 z&Sfm7lj&Othz}C&Vk8Zr`*qyoyrb8I8xcXREUWILcC@4-UCULj7WU+Co3aHhP9MB&~w-;mBpj^$}_M$xR)$y{=eaSQhSf_o@RiRu7HJjS-We1!sPA(ght5k@O zgF^zjgM$R6D?3#VCCW{#b-ujON)N0QCnN2Mj4;Rv5WzVCWg>9#oKP(5*`Ee=jb%}W zYqj7smkEC{Tml6wdz$!>_UU0Ejs7J~adX~~HxZ$3ej4$1GT-}toLk`@58}zvPDXwN zDHD9(Np1KrcVcjATMV_+hfDvi=z}$`sCRqSdZUgAP3VX=XJArdZZ_|>GvX?gEzDNt z0o~z1V_wOI4_Sv8JewiO=-o)SlJ4Mrz*KY@0fpI+Y%(&6*@uA4`G80=8RnRb8OCdM zP$3V`7a%icHeWI`4Ky7R_PL<}C9}kW=mIB|*+4Mcv=6b#JiN~__=MFD9zz;5sbAA3kH1}uP!AAI|n3=>ykV^^=2VwG4 z;(X>85+KKGlx<2P51Du=qCGBUVQ^NQSfH0YK;rj!$0N%+jHC5O- zPgl{lgLe~60@Dbx_+GNR80k%>6Va~N@XBy2PNt+vC}hFN1$dz0fDia3GQ(0UGLx7Q zo62WO#F?Te$Ms}l#kNX^k|Dza3y=XJC4Qr15T4?4?SU~Mghv(sQi&fn@ovV=4Fdp` zwVRk0HET*WU%~$}6aWk3{Y$k9_&swW?ILh+YbGv6f58ExR&cL$@Wxk5i{26VB31pox6&2@H3_`yXDJcNH&=+;2# zDBVMG34(*va}Mn2PbP0e^Yv8Arq09Qtb9Z9 zQy4D%Lt`jPL?Cgu8MlUpeoX3oUh~r4Ga=X~;DDhxW@HnM#~A^d0mgJ`SN8J=9ICxf zY|8w~%mr;ES)-B>{K_VjAI3{WFLdOJ-X(2>*_-k+fdbUD&r(Pm0^`+~)@e1@7=1CG zqq^1ZI}W5oHaJI^dcuFa@0kz|92?*cX9^uHKc_pB7vdThit<%4q)U3+7!oGr{Ahth z@SBZ*-VRJ&RXy|i(rIb1%zjJ%G;TI7sIV{D$Xs#L&kfY0uqdd9X~v`ZJ}XyR3o#$f znRbina)ybc;sAyjZxZIEOEI?vO|nW%8#S{+tEy=x{d=EO9TF(%|H5M zxDb3<>iU-+^LS-K^>~3-XE#QZ4-Y=X`j`OJetZbf8w8+#kqxMu_p%-%a+sA~h9ZJp zV`IUKyfA4?m^6}6IZd(mf2+)eNn;LyX7?;L#q4laKA26&e-LOYO{(4F6k$)2J5t4g zP+vyG;W{Om!&8j{u+1w~l&@DfBHqkXa1837%O+iR8u@$5N0U0*zw6RHQNoi-DH+VJ zI+HYJ&{3JzE40DQUtc$Pj0 z^m%6=n$M`RO0|tQf+~{`~NdvDh~9e2hCz$aqQxGJ7RB`QiHB?RebSuC@ zd|+rdFp0;sX~dmC^CyL#_}?n#Uem$cDjNd2f$c~N*2jTC_l-y1||_X=_2T(L>L;MEm#3)mFzLlK$HSwVq}-{h=03~@=#W# ze4soe%c)Vm=K+UU_peC#%?jnOT?juYU!cR_Bs`=eO~N^R{q(_luq5eY?`_IY60QPw zmR3B#{E0npg$Ky6^VA>#QpiS{y;@1KH{l}`4^YVW^7QX$oguN6U>`t!w;m_iGE%dPML<~*dEQH z7J#LkR_$yWO;gZi(bHm+wL0iXC$eO~t-&}0kr(+H_e@u6l%}<1me5X;ktvX&G1AOT z^g*WPlVtX-NBl4NefVGOgH4@Z*!S}~`oeD#2?xDNn+l1{nt+h#huW@A^Y%@r`OXLE zFo+cUz&J9b;>Dkh!T?-|KsnO``^0G_T1RT2n-fm7QcE!YqVw0-Ogk>J*%+)_VuSRW zZUMwI;>{~E;?2Bn3tBG%W#PjrMXpkfFiWmGoL&eg{sZ|CMUe{somEW+b0UaeKnVF4+^4HEra!#$oPU`n&Ksb9;)#8rNazhRSe|iT8=Gh?K6EYShR-5WCPmyhW&fBw5@3 zyHFW3YA~jvCeNz;r@8i^3*AzcVIQDGV~ni(=|PNokjE=kSiZxS>c`TGs3 zB*+Fsv_debVpph^09CkwFVRS>0yg`x*xx}dm@Vd*z`#&UK6s<~^{Rc;&)EPYA4lx? z+KH&GmQXwG`4VbZTiObk|Chi}>-q}H(UP=g;Tp~NNp;q?OdlhZDlDG~CAhi`yc+<{ zX-cOob^th!Zz4#wS=B?x&tPZ{J7@Z z>^tb``6WG>MPfCWbE?D~(zWMjO3d*sId}tc?R;d{%!YTvQKJ;q>`C|%hZ_K{YaFBI z#}A~}%+}JY#jMY%CNXQxmQ#WZ%N&OihJazhG#HZ%w@&f|$<>OC^JteO7+ML_nJ#1< za&8)oBioQzM~w=EpEV?h!QM`~tcz=NBb!oNDWU)(`SYYCaZ7dss$BCU4F7A)f@ zamoa-}^Yn@T>-*joaWLaw=~rG$#u@j!A#yb$oS z`E{rR+_0Na?FD1(G>@Ft(pnvmVb}-ZTL&Whm?C3L*4yHGA`f$r|5st*pmHr*zR#a{Wc8HpbR(zKI4Of`=CJ4 z1{ClsN}lO}A`qx`#zd1ZJD|n|9Vl=bq82&^?;(79BG+H`@7jOBF1u86wo#oz2sTVB ztAt_mOgCPM2Em6#6zT}1q);rl)&NFJ9Zl4B6+?)D!9o#*;(`MDE8@lP!b(k-@5%a& z7sEoBxJG_7cI@NXl4+drMA!bEy5k%&z!d_f;s439peO<>xAVWBJ}! zdyP4Bg?=v-k2FSHneX>=OZ2;(nbq|B`Le3>3#+m&77|>dZu!w)j`GI{Z?a^tq;Dq` z*jHFS($ggWbReBO#Bu;Tv9cG-CND+ZR3J@c3376jt{*+r9S8BO$seQ#dfjbMDH2!@QL%PD%wc9l8(6@#4e+!{mH{;~8| z-+f}nMEen(OnUJ`MNeuSKU5Sw`TZ4~jM_~HGEU|cJkE=N&jCR2kN9%PF)KWJv3%%{wR9=PSJxpyrRb)ik`;E zT~*PmR|dI)qF1LM<6cp!yFp@iUviKbKBS9vDSFmuNuCD8E=AA7l1A2;qF3)y^f)cX zSK#_zRrFp#|Hr!fzjmemdqvNUq!6XmeuEetDW-lK29%24sGlS%0PgjQqDKjeUQy)| zik?7C)OlJedIs+yeEr?L2Vk5OJ+C*dtmqkDi4%4dy$)hI0x1!ZiU?suetl$FJ8N;D`evVANxboB-twV&`(is<3lU4ot>t&(3wILWP}^ ziE2qscV+B+X|bfb-dJ}2O4#8Qv-8m<*tw#XY~k<4(G{|D9UUvXgBM4{B`!Hh*4Qg% z=Q1s6k?nN{JU*@RD`e-y=B5kSIVQ%}nw>iWDcO0^z^i8G*y@2rSucL{28&nA&XpLm zQmtbtjyqMk@Wzr0PZnGlQ_yR{g|+Ea;lfyh8P^qa;U#NZnF}MfEIw^roB&g55e zVQ2D_A_{4{b7-# zeN?6@!k`IH!ZG(-K#|XJUdLE6nkF%e(&Ss%poitNPz`d6^x?lje9m-0nyiEqw!J<0y&E)pK=cRV>UU<>*IraXm}1`=|6hgkIPvIDX*Ap_s< zWE+{w&3w#dpMvnoYLR{$!**5ewzSPl)y3L}cW)=qj?3QkM)hNt`q3);L5%*={oq^I z4>s2y&TFbcJ=GcY8%oI2bDdTd;j(WBL7|;={^^ruraY6weZ0a>0c#M-IJi!iN%m6c zPdh6>vdhN7W{_GE-w;gL1lT)-3eE@9^8J(+gi5z1PO|*2Bo_$w*b$!jN?*H?L!e(cg^ZSYG^W+TB~g}@=At9d~GoT zbyFVsC4w8649cC_Nkt9T4{&HSR{5HnF3W2`Sg{-`*vOQ}q_#TEZ=#`R@*dPM#`WtI z22N=ZO|ey!cOQAsr;5id@(!C%%9+_U+#0`Bl2v^$#Z#ZcJ{`?xIjD97+5;v|ScyL^ zI1rPv=G)DTz;0-bRzx)g4p?|U$KLv}ZstOmW5R8k1RL^Io-s+Mh#w;i(d z`-VMQIck07t;_PY`qp`Ssn!RR@4yEssk2*payI$E;dBpvMM>oDb0+0Gl3|6od2ZMw z#bo#$q`BZvJIx(Wt7UfDh%nv!XG(O!nOZZ9%d51Z;G1O!LzD&V6~}Cg7SGz5zL{_HFhw4v zYX%u@k{?cU(uZRjDky-^U3D4HMk8Gg>l7m2Bt17sw->xBscj4H&0`o~9@2l}q;y=N zUCUIRd~p{s0bFh;5{b)R(zlRV4L<5I#qq7B_%C}zw6HJ5<6g+g$K30p8V!;)i-i3u zdD*X|ezsp?JYM9Wpjg%&ffh+)oGhzz$kye}`_rqX?Cwo()@64(t;??T8eMj#*XnX} zdY$qz+%93Wpbr=~`GUfG_+phKMxgS+yQrJX-PFx@cV)9rGTvDau8HL&4&Tns&cKqd z<|@{_E{Ah`r)oNw?$G7E>021^*8OY>zf1t}-{Z-@EjSXUJ3(N6egG7;4Fere-9d#h zVFEF8-uF-fN^)0OXS(^`NQdw7ds`u2qJ^ns#PPkgrtAojHkP#$5k~E6jrlc`k(5*j zO_ZLFPC+OdP8;y}y1Cd8RV**RDA}l`I`N4m#-2AK`>uk>vhPl=YX7X>T)RK{uH?Hx z6u75T6No6q?@4QF?^>3$b=V2n6YX#p$5+w46m*SSKOYHEt`#NWAJr~U1tWW=Y)Uth zo0-n2Zk*jXUg|9&n4;MBtva;NL!5LS?LY3z70w9McM==dCsRFeZxNfv1$$~qSZvW2 zRJ9aEB?vpd*hr=$E|a))fG6$jdpwGK&$1c~?2pE$IcB$@DDG8!YHF6$g!}5!`WxRmYMSxXR2MZVf5Dqbj#{9ApY9n+i@HU?i=WP%oSpf= z;lt@ILL1W03bfaj90qR8PV7{HG4i0pi@JQAQ07>*Qf*`UEg^+s-kgpAH}c5k5pL!! zq4EGnJA$2D-YRdoMzZCm=teGY(&<@^yKzo0Myzk!)79bR+p5 zwa+7GFk!%-oHeH5Az4>Ix3lZw|-a5`0(E;QXx;x{drR z0X}#h4)#*}Ey4fE>!>;paM__`GL7Ud$~M=?50egtq*F$Ryev5v9pdMmJK%BrPHHjX zLFadb>d}y+&!u^6fr|F%f;b2I$YzY1B3P$)nl32K*-+LzU3Q`a7|LQB90a3U`1Uz{ zVHO|EBy;z>&>cvC&f=qys-==&sool&nYzFVNAy3`(G)y2Hva)=3NT&(Bte@JZzw`CpT(Z>&dL96&+N_T2FTCY^!?mX5nBxxj{H+hel6x zAy-erWsf`FG#3umla_E0uU6q8*%gF?cIIS2>x43IOA;~f#2h69dCcQ!A&+^?9D0H* zlpRT~V8I}!{`QgyI+`dsOa4&H$CfN_GV*19IJ4vr@4Ge{;}Br2#feL+5q6~GV-kc? z`@_bXcBYoaOCr^Y;G2<@yabN!O=@L^NEKbSGzhi)Tz$XJHOr60idCuQFHx@S_T(>3 z*Rr^<9Ozb|d8xUoeFGrbJ?LtWXz!SHsN{J5KHErUlS8@b-pvvrmi~6jed-9#nq<|n z^@ENs0|~D29UpU2gEJ*0n4=a3F<<(yjdG&eWn6qKD8NcbFvJn~umVDn%=29J{4%;s?kc}zGVT&*FH)vfq&sq~ zsBHn-K`1(>%QmND<&@?uBA#x(^#J~v#4jQr|E8wlZ43S@9Ypu&i*0_oKGr>Vt z?;LdN#>8y1$N#%)$abRYZ5`=fqAhnjCChy?7KE4Rl7)Vnvc)s4qVZl+dd?jL3$8LZe~ul^;fDe$ObHkLun0 zKBFf9aN4daFXs1IN(^Uf`RP8*uYSA?5xBl-f69K(kN+pmr2jFJ0`mJyatk?PE~Q0^ z+XsLNbn;#RN+zy&isY?hNU*Khze{v6)%6H=2OqU2)AQENb<}JaUH467l z(%VzsIX6+qUe`E98npS$JcJo+U|Fn%0~0gN#DE2=*-ea4=aS#(E2mnrdcbcvnYa*m8jF4a17bf$Zb8h(xn%(N4@4684I z)!L8~LUX9-ij$}Q%be%v2Fd4}b=+6{)5gH&=q*D!qhp>f{*SP=Q3yW|r?nD+itr*H zF5+VhW9#sW5}X2tV;UE9f}=nyGDOgj{uo#yR)z0{dSxK7s%WLCUsL&_n#$@6NY*_Y z$+p%Fvg7DruX#Am2s-n?5#Kfs9I?x_IuB3qq~YxBX244GVD|L=4sZ(7+>gCyuIx*NtPiL}1dYzG?5=&LF1`o%@L}6z% zo;xEccplthT_PI`*R8n3YW-K??s#YuS|L2~wz-|E$G{M_e^+Nb-9SBP6Bi~bGpUu5 z!S05X^op8FGNJV0SHcX7rD7xmukxeMeLC>jXO%S~KT>_3?>y)P8(Ko&@Q7H`adM9e zkI=Y|a8;hu!~S_*SJNq=CMH2tbyQ`@=Ju!7x3mBS`QZU#BpS_$2GtuUFtLXitpI5wWyh$~gq|q^)Gd1W1)Bo+nx`Ff4EUPS!x@?`Bp2PH z7edL?yy$wQK0d7{uBYs(@`8OoLy2b%ry3R3z-T2}I;`PR1;=3D^@24R*CL^ks2kZO zDAS_?$D-A62)Xq_Qi?qqww%|>^_tanZegO;UmfB8Si){z3(ZSXx))!gD|4lQ*i?{PgbdB^NpoxCR~@soFqL-)|F z*x0Vi1WJG?MA)S&Gdrd;+c|Hh+)4}WR%HvRo%s`9$)Et!kp`QhB$)&>qI_Aw_qtU}|0ED`IxlzuvN*H8(F`gfxQ9L}_FmO>tNN<+R_VT&tZ4P6nux|V zKcIF+Xlcmei~$DbsG@bQ?h6gs0tH;)MG+_ zj3!<-mSd+cqXQKcn|BZkUiqBzC)X0!{QdAyStli2zgcuZ&>CYhw4d7^Y;hLKGAlTs z07B!P?H462H`FF(cIIbGv}-%7NJz^q4>9p+7aRf)xR93?WunMSsr5?%(xv4I0crVj zvPO6WFZr!kL>d4WE~PfQ^;|w$^hrm+E~UU?B^6PyX}73Lp0zlN7V}iH)5Tq?)bH2| zua$)9H4;aB96V}EHxn`|DkCBcxDDsg=-_kK4o#IH;}B_h5*e?BR?iDDo}Vm^ITl3; z=`MqZu*>QKB4tVBLeF??oAg^q_GT-53J)!)xmsl+&&K5{RWfN0i1$_i zq3us7ZZ0#sd%sp2_4Z4c_ywLt1H88w;Cs;l+yGr{8?RHp8(_!Dp2W@!ket-T09|kZ zSgD}V2^WyUL^e&6<)*{ptXf$tzznqo;5zk^K8KB+L}PVguj)sbE{s#@jNUqqB08EO!t~uLwyCVTz=cqLv{~_y`xB&&)*@RJn6Hmk3-^ z^=4BNHqseF0s;RhYq_7=d6)#F4S)j4kdvRESiu|CQ6h8 z;JIIC%>>9~ka~ZnRas>)I#$^GaunTFUlQ{(jbx8pu{V$T-W(6{7oays%ieHmP_;L; z?%wzvX+fvj+=(8|J>{D_?VCGMHg{^-<~RnSh<01p99f809Nn|NxpTg`Gi7sUmu-&i z3`=FguogDQ(PAq$_kwTkqHpee+1!O?n~P}<&eWOPB#g+HA*QuN4^SOe?7{60x9)b6 zxwpWqyOx_u!Pc6#-H62_zTBg|L#{nGa}9eQC>m7e{t7BDK%VNzGSiMgYx0rYVFZNd zfsN6emr4TSHBUhAc5S}bHF;0bxh=!o+SsG^sCv*6xu+sgmfB|7sUz<5>+CKoN*0K77ZrLHQ4Oc;EJu)Tx)ID znqj_pQggZ1`e;o|AlQP0!=2*@`%N}l2+&1z7d_v3rN;y|D94dT6Q13g|gcw*TG2XU?_+jQI(6PO!!iMtr;ZFX(^C4@UP z^Qdq5m>LAaN7Mm>@KN8e7dikM2z&7-*^>-@cZL1Z@V21IwCxP?zPWS0xie*RXP0eG^R31B63w0O(cBBZxr@HJ^JQ}~_Ae<$^O~BI@9*N#9bxNi zrMY{w?y&h--LaV?^y~Ab}X$u8ZWdmEOT{cLZhVR?GR1VYaE0-wR zX*aQ9I(OrRD0;ldFrVQIi^P)i9`EM76{z;F0;=;p+CA*sJ?h(?FWWt`T)Pgcl17V3 z@>GxJp7zb1>2tVxs%-9bcXJh}4lqm_>k|EllLbqpZVlvY4=M7Tmm=q5*N?NM6glTL z0Iv^K`e7PpMbLFGnY!D*(4+k?`SvgQ_Aiv}UtG3*GXiwLpx7s;1Ho>(CZlUrbISK* zxn<4Mz9(mVPfnFRIlWv@60J1cnze>92CvI6^yxUD53dVri`;*@wSeWHOqW!ysxU{T z%O`K08eZ2?76w~G!z1m{HEYMlC)UxpGW5$(h1S#7M&qRJ##7ZsT()SC%@Ko^5+nF6pej&f0W~gw3K8ugWk3NBOYXs>7*qo@n1&86ws%86 z^`q_GjLC;;b)cE3_H?}LDQH9&djfWeaazMfk-wVH!Gt|SW7x@ipaYOCXJ;*&RDR5R zI3d?fZv~YyuoD}zM|@H}DIG%~p!p52HQMkZ;YmSB4yUQ7T@sRyt*;VNtSN{^NaNst z1+mqAL+pIIsL=(%Q{&95tZ`>i<4%J!HST(KH7c6JP?IC&E2#NV+z9h$?d+p&)Vy7& zsUr^@&6TM6Y#I3OQ4_cjpi@E3(UuNcG}_z4Nw__yn6r+{DQ>g-tZ%`tUKFpsl@vc( zqBXo?52;36`zs^Inl9uR(N-XzSp{TqwgIeM!Dv?n!`j=n3VIHiQ0a2WL)sc#-DeyM zQGV8v*Wl_t!*Ec3hFmE|*$co!RRCk`@*ECY(FtZf$4DG#+3G-xa5OqgbaJm&Th&$( z^VTY60KWW53oQ*a!6pb{?p^Z(CZA!Krc3<6IN6-`Jm3H+@%rT(LsxW&6qi;PHB_Wu zH#Hce?q5s|oy;B`Mop(H)X>yI+~%q0&@n-DFdA2Q4{&x$<-61q-~$zaH#od)m91)2 zB^|LQ^{uW#a?-_ehWm6TPbL1PpDIpVhRs4!V>n zxFPj)bg30ZfIKrQA^>w9@KTM0^Ema41cI){ttEP1S&eRIlCJF%#+&VNcUk3%3LmOZ zMe4=MC>20LzJtc#O!ZrWfQ~FAAlQ4otGY<*=+yxp9lQj5XvTA~*PingS3a}#rNMYL zQTg9g$ge;l|LT<~8C!6g*cZ`2`2_3$vkpJUX$a_rjate75%=!ndkoOq!ate8m&z4ij zdwjN>Lf!+wy%h2utuCjK_h|K>vO?Zt=)Dy39splXA@9-Z3JQ6T2A5OFdo;L$Lf)gn zY_utY#u&I zqQdXUUg451)~S-}T#JM)Ojlz3H}ak9<1YHnZH3jjig8Eq71KoSKCp?P)Dq>(-4Fp zY`0RGa+NGqnd@j>N7pP>*(Ift*rn6A>ug^!NI(c|1!KUS4ud2Y@K&jHg2@ugTv#Rt zv7~~Ww52S6pZ@>O23vw)d!QpP39tW;o#$Fkma`Yg5`-gFbY2;Rcz!;VKUpn*o){w( z-1aY65*)nH9@Pt9`q1xy1V^}?#aH|>ecN|(R*{q!Ml8V@k)`_7m7N=>Y%lLvtTCAo zRK-~;R$Sfw_6IGe&huf`1O=JM^C73NJGTZ4?Q}<#_?XV5$&Qx}2T^W&9iv8I-&z+i z+6hLkDcwWA(4#;9%!TKEJXRLLs7SebJoGH2joV(A-Bed z+LFOw3}|psL}4vIPVf8k^Z$*3K4$rNo-oMm2uQfEObu-=mYoc6Dz3a~eQPTp1^E^D zn4n$J1@X{K^C*<#o`~P#ykipm2s)nN3Gb#<$-7Qby0$FE%Pk|6m*;G~_>Ltx&4_7M z3cGB)e2=`Zlo421mXP>}c;G&Lxxu~^bsixV)Lw-&H%S1!;Ym(wTmPgYB#9e$!?YOG zcLSeE&Ie;$Hdy6S(qM;`if!>=TfFWvOj{4=M<)yIcrxahr-P?bEifiuwl-Pg??#iM z@;$JIw}6?47@^R`Z;T<{yFDflwV>~0K!a)Jqe53ZIUF{#KY#x3&k}-R-kCa9H-C<2 zPx*cMvz-TU=0unc2zQQKHil+?u>y%FLa^6?0#8#Nw9q~8mTu0F0Zh&<-JF|xaxs@M z;oxhf4AA5_IbwOXYzE7M#HHUjUU}yR9j0gaP`-6@i8y5u2_)eh_>>gTs=+29IvrPB zOgr$}9;2@@(FA8GVKJ96od+);FdKX#Ea>aPg6VST4hxbs4hu+yx)c^bj5gvKPD<1? z5u`@wwB(xNt%do65_&ex_AtX)=IW$9BoIjXKn$J^7I(iOe+94dnKTcE4txeGDYG9u z8kRI#VL~`TPZRjfWuwM5kw5-(zZ0~77Pl>m5<0R|XN^ih*yX5|ULt{t6cAKQPZ2O6 zs`!gqqPKNR$XpcAfsNjhSKvNky=ADH3mO|lPDRdqfVUQFzSv%dm2qz zfB+>CL;(T92qIE~C>eDkQtFH$%HVX=Q_93m9GK5{?S0NY_rCk|!#~Ibp;x-+oPGA$ zKh|Eq_S$Q&jc#Cy6HF2`&{naih-eexdgLyAn&GifF3%NrfLsxUn|?pI0p<;}2*jy+ zlq77nmOel)G>X~BO&f&YF}_6~YuSg=yxqo=+>n7e$1=#!GGq|S`e8DZRcyv8)(RoY z_jFtMP(FhRHJ1;bfr4RdQJ!J2SM30d4vFWzSN(X7VH_R{5MeZOu8#nkfhr}A&;eq_ zwCFrI3o{^vJ@OA0_@RR;P}W+gcIqb^%_xC9;>UI3s1cdAMjcShGjl7?w+XL=DuRTKnR1JLSdq3)W-=GP!1Qggb%@j@uwoSr1&<`Z^?5{!vp z8qyZCF!W7@R|(V%p_!!Zh*L*}M*)+PWCYO7Z*D-q-f>n3oceA8ZOiWvLi?d~_;v|n!6?FoPRK?ECsfx%D;xJWJ#m2I#BEsP2RK;WeVu`9a`SMl8 z2ABW~M^!9Nwd*Phh(Fo4E05srY_1b7S8zs#PS^=2b7uY+q*8`DQx&^X6}wUuf2E=- zHma&(IJO|}O%17vc4)y=sVX*ZQdQ(MCVz}U5MZc39HCJRE6Vha#8gGp4pS9*9#R!i zAx#gzIaRS^^g5&}3Vt_$+|)4Sit_*`B|j&;?lB1|Ah$U+dRSEia#9&Mqd{_$1F$7G zNtCMC7*!RKodZ>IRlsZ_y~5N49Wn4#MgfvVQWX*2rYcUCsZtdi$k$<2k+UL9Rh%jF zjaL=vjJ_OI713H-P!OtOH>irkO2XTLkMyIWvtCtfDDv*O&Q6ehIaP5cUlaI{ho@BV zfvPy2uMTflya9~iUOhQ@I6a%Q07>2UA+VkfEXd}uZ8wiB# z;E`mLb>Ec5$pYPN%CMPERPi96_DD}Z$KgRO^ciK55Kci^Y)a)QaK9;aqfiN((pqfP zC25eg9vSQbX*;P7+5@7tP%tGuN(B>48fc1ZMm0q&i_0hn&4H$Pjp!K~GTK;o#|9C0 zy;}5)w?$bF+FIA~f1)@`FjeuXN&;=JyC*9Nv>V%1C4shM;9}@}8H!nMN1rgt+%&AzJX2W{JsNnC7KQT9*ihd0;_nY+Bb zu4?geXVK;w7{So>CF*6>J5SOiNnW|Kq>ChVNb>rZC0!e4c06V4=LYqjfd4s)f1ZBu$ev(A9$eoIWiR;?uldGpqr5z3m7F z%AgDpXLFni_rzz$sc@Ru2MzA&fd)4qJ~TL+rz;bBSB3aCm%1HqwpJWMXoizOmo@}5CT`Da%#aX zHKY5M)EaR>2MJ(IU>QW1R03F4CeSCtyfT3vGi|Hn03K#>E_0yo8kUCyAU~&_NdzR* zS&&tS2OTKtv~*(o5ObaFt)(&;3yn299u5+C>uYO-l;ama2^oH3ebm;D5XJ4RZ~+wN z8EBTvv`kG4qCn;e9NZw1pL_&&eC|463bO$b{0@)sD8tn86GA#srqpIk=>6t*cfGm(dQ*frxfQaDse zFj6>JNkDLwI8Y#mMi5z4rNn|ngK@#Ar|7CTY#J^W(C})g_NxG-s(}H3AzCZ-n=~F6 zDLk9+&)Q5eQaF2$O3W|w4IZgx6=ec3Hqt;03K?Q_06Q>eKz-E8@s;moDv6@dk0dvk z1CLNP02_DWE39n6s*ZsMaHIbdi>Qd=c zR4H7Yibgxt>fL3X@_kc4)JWX=^aRBSXl=lj9@xuiNdRXeoSWA^aRXn@5k}_%K=?SbB^kG5|XD0e99)<>(Y{L-Z1I(;j z%o|$|&7vrwI_U~ir^>aeQZZIFuS^fP(_t`E3(RCmCqq&_YBOPHy=({Nb7eMu%4!Q$ z_p}#Lsi!TKcT?&lEn+ImvXoYOpflfTArP3_5MX`lISmZWH#7+3>)p*KI-Z&-Mweu0!tiOZ-SwszEePpn6WBY zS}k?0z_@Bp6%)VVDKmO0uxcRjC7chY?vYS!*=#%PUZcc=T#chiL_%+xGR5RjDr9W`Jbk%;p< zVRSH$ZBgX@hkaDQT@023M2}79Ccp`LNVI5%nd;9ApbEq2VbWDeb_EzU=+tbgswNW+h#Q_caVn_#ls>GD~ksv%Ke$*;R+9{Mf_SY$3le~-qO2^ zFdbbb7j!)$j$_NGtM^bVB!xrl{)x@Hh z;-^yhRs`KKl{vYXjPQkz$;!zCQcw8)npw_RmVABuAE`puKLjiD*6V1_>*G0p`yaXe zA-+M!;l=YjiT?g;CNogv4tvg+jb;=OH=t}l)_|r}1Qm>zMbPB+u@E@#ff5sjqM)UrEYuIrY3G{) zP98O!dg(ZMWPp>PI|tYpZW>M=rWFAvuMOd(ko6_tq!3%5T^}d6gDxn~lNFTQnZC<7 ziI?qOvJa_GZ!k1ry|RL37@CUU{>Jm$Lkd)(!;ET9(qW8efh?S?$$YeL!7E;Xd~MN{ zgED)Vkin$DEujmqIwDuvnk1q{>!!o%moZ_)fLJ0)TlKRY?K54Fm5LJKri>$H_F2== zF^#PLNH3JqA*JSZanhfHfltCOQ7@*5<=mUpd!oRTg%9&&4~qH}iVm!CQi86YPqurh zGJ=~>S|{%+S&_x4eojBk7#__z7>3%#an%4>=Xi6E*O-jy%km6+GJ+ym;1n-}EJ&sk zMOGRq(ZC#Y-)v9f3y|Dgr#pjA)86(-$0w}ga0>}y^=C}SSqxa(@rhi^)qQC5W;%{K zHDSV#)r02!bZn(RJdP267knS!Y;`rrZ!4mSB*r&qIKzt>z0lW^%_%ciENU>2DEFbQ z0E3wMKwo%=xZ?{vi>J=zvmiTD$CcUVOaKN}+M%;kbk?#OYeOmO&xplY7$&$YYFZTa z@BUDa(|4$MPRP`k%BxY)Na?sjn4(-GJgPA+9K7Hvst280=_wLah}gjWM4PkAY{!oS-1Aq zgdSF>R{`2x-pq*mw+!#yh6C=-|A|8OwQ(kqZoYaitpawM4&AK-h~0{PXpDF7zW1P3 zknY~Sog@y(<9tFMIG9)u;zDgCzJR@sJ6i&jqDf;oi5J3B_BOM5jaAoiNO}3wDM04=I%C0 zj9sB9P1Vhuq}m=j2b9gF4i^$@O+$?bJNP)(9LKT%HsLKuzlrA~ z+;UdDa_-A!+UVo_T61@DJ_}|hxm-l<8jdxR zo*a{hJ*V}~|B(Rb!d_m*2NuwZd&I42!s6WVFE0AiOTuyB!csdOKBARSid#><_?-*< z-nnP?KrhvM!(hyUHF+c8bfTFt7Yr{si%kgE9+IwKGn6M@aL=NiYL$@;$|;e(>7A~& zZ!cq^5l$YM)r(o`OlcwDOeA~Zy=Oxo6Gu2L`tDvx)r&TE@H%s$e)LYDkz$en+hQi5 z)=3VMLgZpfJAIbk!LTEDR(Glji!}CM8OlKgEnadkoA_O*3$5fmdHtX7v$2l(Fx_v4 z#2jpiBwCQymZEdih?&Jof^Xr&-Bja7)EM;oVq`G&(c^av0h$H~ZholZUShx`G3!Tw zj+<$_0bDb^rWMI)Q8J5}y*lB%T03i4AMm~9}gCKfDJXTJ*YN;%~Z<`fwDl%s2#PFU54;26Gw*TtX%RQwU>T`}r*-i+c3gRi_>RBPPfYv~+qGJ<iR|KQO z;A$N1!G3eLXY+MMp#yTFpC06=i6EICgfe@=VYp%5gs};W6A?8M!3LpZ8vW>D@`!Ce zf*cm{7c?L1A<%s6snR%uCrzCd8F`u~8xgcT$RL#fGCpAqaD?V*!!XS!1Da2Yf`@6I zAyGprG!H6`(tKQ{`I@v#YY#9+10A7x73OI^g^-KC0UPbdvJceV1y4r(2-KvjjIH~q zcsUH~ox9-T?(sb+xHxvW465R|S$A0&5V4l|7^7-Wv=mt>dU=j__CpfmNT2fb!CBs@ z0q#<$3+tm0LvjdD8w5r#5(?;>*s!2apk*eG^iDw6fWmd%^Wk%bgmROIXN7A@)M!L) zcU6^t_fECr1chp-SR2uu-n(<$8TZh`1wBYs=|R`>%_TjY4{vlWvpuJWi{Xu~Wwz(_ za5=ouwaj)+4_Cq)UCV4Q>fvg5qidP%i7)Z+LU^NVneCJwtXoei&muo+zpmv62di(M z(t}cz?NIgMupX46H&0g|p3#F+^yWzQ;g}wjqBlpY4=41X6umiKeK@5DrRdGc>cbg5 zC`E5hS0B#lK`DB3K@VrcgRbS9OL{mT-soCpdrl7*!y8@8Y|rcAa(JU_neCb$u7o$b zmf2p^!`1Lc*D~7^!nha08(qt6PwLGgKk9<6WwxjEa4@{lwaj){4~N1VUCV6G=;7(` zM%OaiF+Cg!Z*(oQozTP4@J81%+bKO94{vlWvz^hy$?!(kGMh-(lhNsF9&rzN!Q4V$ zSSfZCv^MVdx;ZpDcSZT}dk}w6*hoa~!;o+K(0&*(^o@}v^|W0QxD}Kq#yH5&tThg7 zLTm(95qoCQkaihZgmh^W@05p_Iu50Xt0cRS6rQt4_KGF(1b=I=;_KA`*n8Y=8*}nK zv`*oeev_S|Q062HlG3ariLYtqgWeoFIG<;5Opcg~*%84fX_@9qfQuFwh|p0U~lSFuK!j8E~sW>^77tZZp@%IFbKFjm7D0kr^?xNHF` zxwWcn3!_>nekfrY(vgn%QDvMU43ohktwQC{_<$dIyubpi*B^#DoQ`84unJ>EYMd2R zmL|p3w>ThssjXUG1BHG-AoXrIFU?5(bgEEhr3)2hYeZN_w@1O|r41UhhuUBU0okC{ zihl{H%;!WY%pgc7IIW*S@B()Z{~}=??dK1Mfrb>^$?L3`G>KE@;v=MZgeFA@jmnJt zDe1e4&?yMbVUfcK4XuqLv~Ysv*pbh|WNVc!)TcQ;2sko#7@5bDgHdju*^o5f(|Md7 zBoyrvDzSg6ce}1MXOX3QNG0_;(XN}dt+|@mZJZDmK2bAiG( z<}0O&#I7F6(Xo(!OrlXF+=uhU25>`mAb*6 zvV*k;w!7}I1rn>AHo!v}7oEW>5Xi`bF1vb)Dv!k)~#Z_2TZy?OtKLtYkM-jrhpee?eQ znh#@Q4vqz@=sp!`1E-nFIO~;(rkTn-X2DE2To!X%J}u8es%c>KwT7_57z)Rb_$Jv3 z-?YC+D1JPrH9|~)waU`pn6LRT%l9vE|dzRa%zvy)CoSE6YPyW%T_q zO_`V_3iuoBb1JFFakMkPMS8@NEq_ibPo4^%hRJc^_)vL12fS`2z4c|BDRQ`{xpN!c2_>kXBHtNL)h*D9 zr%plD8>>`JYuH&NelSGW;Mtn7v|XU%gwWCGTPY=tv+s`IKj_y@R`^nz`-g2*AO4@5w!kP+c4d$z_DJ*9ex=L!`|% zBPx3JNt^9uL!_-u!Un!uB<(fBq}`&I*CXxq1!=E+>7;!a(7Ue@;zdJXq>TbwC2gs{ z9GZiyh6kT3sCOxSC&l0)jN$Mjd>KQWWG8Fr!0Kjrw1~pEw()3o`F&3Ya>K|#YG7Z= zK#uU}Y2(oaqc7R+r038g49~>t3!V|z5v<0G>GVtC*Ux=|LH#9MgijQMs@bZ_UM*@A zuUDmoE1k`XeTWj|I5K}CU&U4tWi+9Pe3xvT{KuLn;&|~-x|%QN6Pg1vanr0J!ZlA? z3NsE(t2JMuE=^l4&OzX3R$As&m+re+OMUxL#2D(PF*W9G(&6b50?xFfe8pobSysZupZ$Ww)(I{~ z4Kf)NeT>mmR2C?#ZklnoKJKH?eFF$A2rv-p;qMd#(^A|9{V)1mz`^%lO1AMlfY!|^wISsNkv8z9c#)!WNtG-HK* zYW0|7>R=)=^@a2CY|iSAJohWHBgi4@7CP2Sg^bbs5XDcsw0KhdL^_R~fe-mP#0S|y z#xCkJA`j#VJBa$}{$6YckbuYgyRV@V<3=oow6N2?hI;KznQ=+GJ0~{HM%K5xce_|0 zGF5XIzIK|gbRQZ*KKpXC#i!Nc$y;dg@f)|877ewSkR(GbzN>8UUDs{#U7fqf!1$6{ z%%N^&*KP#kb2o1B=8+aNBOPjSuWWJex-IT?)K>~?VF)q;(_lRD4O)!l^QK#T?Zzzz zhC?vUM_PPm+2T8|+u}Prca3TB5w#dbdebdF#0NLP8(Ena`! z7O(FJpGIMP?N(d-+>Kido({p-`wzh90(V zi{S-BFy>&yp%&wz9$?HSwCl8ZMQ7Hxcu0aA{xe#9EByFLKDYrMZy0GY(I|&n%nqQ? zVxp{Er^VflxXdVwPpZX4@xEyoAH8vl;a)>9#(Fo@VkU>7#kh@Lr^W5g`Y|oOq!!-_ zuQ+$(7Hdy=Rd>T(b*RNmszQq~m|v&G6FL@n35;L7RTw{i;}*kjhgz(~>Z-QcEL+SX z#dTWT)VacH@em##xdM!Fy1HqsIK&4xz+-Lxt-=_?&rpk5h72&q+I*cB*LA+|k`|v* zi*H4DJ9gt1BO!)b%;|zdEoMP5v^c$Pi&LEryrjh!)ncN;-!zQR-nhj?Qy6M7W|N^7 zGt&qyX3~8f7{@w}cu9+2P>XK`E3VwQ#j7!R47V98&rqAAvd!dMw#{9gpDZQ*Z@zMx ze3cm$4x;|l-|_DdS<8OskKG;roj*}`{5!3jF4q=+HtzWE`~kS*-}z%|$G`K=B;((~ z%9d@5c0VuIP8iCv@BI0u7kWd||LY>S>vhrOLhzmR)PkJ_a`)ERh2cAEY^lbY1;iQ-A`B>8HRV^|~`*%sd4}@gU!yDmH z;$7vN?2KVI!9!TN;9q9$Yhv5N0n?V<=aMIrKAzt#76h9ae@h{%3ym~45V>p|#hXJhSzjcy`Z3!< zjK3cl>)GplvuG5U7-zo^E1^+a(xa(N`my%;;8IDAY~{8DcJ|0WbnE+IzZFKLADmMrTjg!ou8M>{BuX24S0f zZ@-?e+|xD3)7zxy($b_LY>TcY-3VQ=p8ev=zIJP)m$Tgr@o9d(bIHL(x}{cJP4$bV z)JfyZet-Rr+_Ah**CFZ+UwpVlQlWz#?0WP^`fK^t5aKq@$OS_vX}cO z8^qa!EyJb-^Key@J#^k3+^I)i`;E2UohXuKu}wk|7n6!M9Q%-&ZlDdvihDyIwBexp z;u|f0Ulc5h!kKIpvyA1Z*g)}BJRYz2rl$9%a&sVHKW^YsdpQ+_!zH}hn`%RQOo*WJ z8Lc-Sgp{>y>oL=T;yp!MA2nP!vDm^k%Krqn`?a$3)ui8Y>rDOCy3O}L7<{Lhztj2i z%;y7G3?OL0L=4!|-K62UO<*yA0llAaY}%QMk=43z&JE&@S_9ixzyFbhpdyt=k5fO$kRI z9o5cF8D-#`w+SR}sF<(cLujGfM=}4Z78#eDq^xBR`fUOW=`I`1+z`7>npS^?xwt>= zH`Z)8ai8)DwkpJQIB_2zBrxM^6WykOalFP$5+S0;_})k1e;UWPQB(eg}spOdO=5{qkG@glNJ~s}hCx zp#PCe_K<^!VyKEb-ilRdwrc0;d=#^2>bF?4hJ7?8KiB^QFaLdA{F`kFy04XL4h}w& znonw!eM3PfV*ji~?Yxb5siM8cTkxXY8J!FFpWyyNxc_bLFWLPZo}@dX=kO!evTx1( zF3a7gRw@`BJ_E<_n9UBYw)ouHx8+k?ThPjFq%d@w-5ejWV>~8qhQ2==JxI{G7|T$t z?XJA{19A3?Y{PaJb@vOpJ6qhzXO@t2<~nQfz2aU(42USZBHw>P8M3>NZPk4i@ev(l zrb;d1hw2sLSW(gN%cUtmgWPt)CFfgeC7uOpUfKzDw8wU?S6j|*_Zg=hWVYK~F+ZaF zDf_+$3AU(sKux|d7z0`cQJ}yQcnI z)pTn1!P%(|W44)3uUWfpX8i_soAX5nC`Clp&)(xVMfbF=Gr#+H>P8&yLv+5W=$y6Vx8OwyhNw_+35{ zbC0TJpaZd4XxA+0prBhAICyET;A8|t2ey;!4F&rC%T4@c6{uq!)H2a`UnhrgQ|n_^ zu_o39sD`zT;2it<^;x{gAMDP+A28GaDQn$&BGLVc-=37K1iUP4;3%pSjzzU(+WynB zDh!Q+n{!(!$iT0D8}#w`cx0Ap1bcaQ%oM$zDZse#W%hdR??JEq7@FRH1vyqlIDUG2VM&7-~!op+=0`_p7h7iy z&?*ZzR?G8n59~auF?@7f4|Fn5Wk^=~O0?ChtYo-wJL}~p3tur@IGbM71ML;_T)N}8 zh7m8gLz2gS?Fb8RwE;{4B*o56M2yF7V|;-(5m{BIP!IKqs3%lQS+|JT>~gwU#Figu z1&TynQAf2&ZP5N(K=ASX98XhYt5(He_XpTWWr2Bge)ss!oE^n#;HPtvD!oA#s5jbH zR|r=My}yfQ=yAlN7vG|+XD9DiLKwp}IBB5T985xLPP4LR0Ax7C6Nv@Gop^AThpAd5 zZ6-ANr`JpKvet8p@&en6{qrBpXhlh{`f>Ip-emt?Dg#GHd6~G!lutw@9}0&Gst76z zJLQ&kV+le^23G*u^gYnN!2+N`TPYfh;-UtJN(}u+Np49coE25A1Xu`6UQ@dT+%w25 z?bCSV)8@8H$54+|rvQ43=n##Ai)&Cf6Tumh7Stc6UcNykfw#O z(`obh3_nUIW=XiSfOkaSdsE)bTMBsBu-pow3&bqoogJm2IfxFZ2c9~i8~%|oyQaN) z25`ky6P^AnT}c&>^re7MA43#`Ue z7K~a6JL3oY!L^?z_MhUU89dv-TJRJ`R{`n)Spe1pR2*w<-jpNw5T=Uogss}XDO@T+ zOa8G4d)PogZ>1y}G%0eRTS}it~J&{N%hLr42k@Kmdd$Qr3D4N>E z%<~`W03b?SOH|)gm9IjIz8VxBQFt;`cu29r3EusX(V7=SE7bRWoMpL+W8<(5^k>*W zEu@DtVJIZPGGw~Cs}HC-kXcfKL#2$AM3aLeq`-Y!P~?*aONrDv3?Uq z3;%5x|0Tb&HuFiPG~cwppNI}J(E(B9JvnS3NG}{1QDhur%>rX}9eB>C&*933q-I2-lvbkUDf*nF8~f%-h*7;Xh2yviW8G1PSBe6C{A?fSAYi5 zoIM7#2heCKy1js81J@eCiH-RN;RId}h7%jc-~^`GVpxpmfl3j%9#L3JriE& zdmCPQtIR?Mm_kD#;Pa*g8ptckqy7i>(~@qCbrgkxQFs*8UM}iY%3&zHddpV`gP#AT00{I19x!bHTgsGjq7 zEE?oA3(heqwID%znkMfC+dlm6`feH@g6cQ(2~TT}*~!*507}wZpLGB@^obJWYWIy&cd<>5M&x%^SN@MVkd2xW5Ge_Zwc6@si=unE*4` zVi=^SyvEWAdxlHbZWvl-&}3!C^n3%jX|$5 z8P|*%^k}vTl8kcoBkmd(uUwffa|79Qu8>V&)U>;#C!0##%(u^%-;U*BkA; zPn}wIMn~`!(l_8p&23+BlaGKV#Nc4RWIFW^YVqJ-634YT<$vX0^`Us5YNG0LN&d+F zpWpowIsg%H91%Mr8DZn>+pIIx++7P(Z>`l*{`kjFI`VHxLgl@EQh6S|wfAbp5BpXe z8g9j^wo5o(v+O^u`Kt)yhI#;b*4!U(6chY~2qrs{w=zN~G>>vQ@xCw9nRn#L?s#W% zfY*t;6me!Whkz{}U-`t&G`F;zSTjG)yDPA@Q+#6j4u^@@@?neRLkL|^0MK!E8pc)* zl6F=`?!WSlKJpW)tpwdF`wYXE7Aq#)-`E+76MiU}87c;sqT9Tk)~P+&&g89?dibta z6AvjWB>cavpS0M@qh&)DK-}M|+Yr6bgSZ`ho*GJUjE1`pW_0qWzAPD@y3Ycw*F^Sj z&9eW(d)hUZyq)T}yj9Z-1DZSY?Jq^y|EpHdC2xbBX(bh=#o|f~_}*>+GESyeN~Qy( z9=09ggFnFb6oq0O(_PM)28Gq$AECX!^91chj#t~;UG|@EuRML+wMZO1aaXxY$S}%9 zgME7m3PfXt7jFj~@q!vC5KpAL+_MCmcYn>eQ?-Wq{w~3z3$Po|*>K{|ZxV_`KJ3|kGBr$mJAy$fGxwZk*E91_pABtuXQOzNIG>->?~6CXp|)76u|^ySFav(r-=k9Ty5KRrKk8WZ-;#vNOZ%kqJbG*IH8mi1kw;ao zi}54-xjNlNxSRbX3lK6s#s#|&l5={PxD>c9MV|K^T7~kZ-Q`x&W`D`Kkaw%k%P(fz z^XuSefkI%I78lz^uaBRIJ#%~qY|Q-W7tyf&nSiqK^6?AoKQ9ujeb88uAhsH@kfDJX z{|7+sTbTNh$*3Jg&52Ry4nK3&a})_h^{>YNdXz>Dt}S>xrWem;e|uOo*b*&_8**-D zUt-bfC3HjR_73$#@jWF4D6I3c3zJ87C~V?o7pAC~p|Hu9U6>rFLt)*QU6{!+53}~m zE^M_1`n}2PV~aif`nba*(GyTiJgV7xKxV zmLR6>l;J+Ery(KHnMHU=)W+NdpGgf2${et0i+fIoO-a4_>tXCg@xKnUd!}S|Prr!p zm7|YIEie4NLg6J6W5l4HGKkwVgU_ zPhF|IGmBo`!Pi2XBDNe!RJF~QuO*{`Np=(C)R!Y!glle_+RF#37jGiI)R}p5)R59? z^-y7LXir>y=gq@@sw#=wON)tXquRI z*)S$ss<7t19kG-_$yzsL-3n$bRmkcsH6cRhkg$;XqY1_8$~_N=_MX zNeF|r)N1!S4wQZWdnLP7N2kY}(*Ie_E?t;v#f_-ZNE-=@J2m%{$tod{P->FXA|$$ETryag$lk%SOc{PhL_q6ow=Y6!0@brK?)-h4FnTP z=n!yWSJ@7`>#*ag;+5oGeu6uat$b5=wJ9j6wl4 zOTy(UE{Ml_OA+pcJTYU2Wc*xsmWyJwT{I8+p^E!C1+3r~tf-48? z>?14>1ueK#_|>!;I5df~C>e@IF9nt<!FF^GqvGeUJy>hdhlk&qn2G4)UNkS)Q2Tq*>w-U`Pk2TvpSW{K&kcErOW%Fuf}a zCs~=XN9{)&H0oFT<3amjC)N$xKPZ#A)!MXPh&A6e2sT zw}YlVt?*EVrX7fnOYUiKD=QjC%cf=H!P}E;Q!RAp71FXb*d<(DsSl`wLFxtoX*gB& zTX^-hnKRI@#9?aa`5Ds zehWj#QS4HLPEzcESqaS5p_8RXb9z>U)Whoxp-ox_LpZbS5N_--NaKePtlo;esScqx zB>)yXHv3f?MhVAqBoP>l$5k7T3T3qhK%#*j12kBNVsC03l~Z5al&p9>eh(_(Y4|k8 zM#1$h#vp;RVgUp62CsiPL;S z@|TSOd;6WhvQP^4<{f^@XV`rQ)?7X#4mvp7h3C2!0qQvtNL;%qu5ATsB44A@THfRs zL*5du+SVcvZQ)aWAxWo;%mnc08lP(k&R}u`9KafeyV8!t zbXoSmcbRIj1<3ZWQ2P;k8?5ntdgsl4KVjL#+_yz<2S{_;1EPlmvSdkLu~X3Aio8s4 zl%?K_rnzjtUmpB($vs#&k?4VMM;gDHe8Hv4-a%PH`+EnU-HR?6i?zks|JH?rP=Mp zp=RSi`|j1;Mj;ToC<-Eze0SvwpO5Ac_7Nz~;JM2@qvP(hXQl@itIy{L4~aWQqfJ2z z189obuALrvLFQ9*N9Kl;T*Wa?gl9upko&Zr4fsNI?twz~$@M@JWGP^B)vO|7jz?l6 zmu=Apu~{kM*J9R~rjj^ey6fQ<4+eqyz;wbjF|kg&9FU{oWC>Kmsc`8Y;w1tV5Z9c` z5Cc6_+TKy-qHpAu=DvXoz4}o;MyJ>%hKdX>Q3=HLh@=4*Cb=zOKbig5?OI@Vq@nY< z=p^cl#{hGu^iwwEv)Y|7p4qoiNC*~8=Ta4=M$a*}ZcFy_*59py!dx=P{IKZGN6akv z4A`YNM}$BdhX)a0I`pEm*#y zytyM;)D_L?F)py5cQF!d6?#gkbZIk}js!jB>NxkvrkJORV2)FRzlRG-U6OXimUQh( zk5B|@0q`qY5DVn*f-_hJx7Hj@FN@~T06$Z<`o=cF;}pbIA#58Pf?s6PNzFY_n~TD3 zlCVVw=J}wU*d0A(f?|6mrt_BOa9P`l`JVXP=e?HhP&wR@&xR*Hu~~aSfjZHO%z3$z zXmgMv7pN!%pYR3?V~YT*L^BUK+K^`dvykB_R(^Elbb^|YLaG7$gx{w*mX)1Pp060D zoAjalBe8KzkHUdK9ZPnTBLz+s1u|L7%cA1yU|G44PCfHeiN62dQ8hKZ`ZNpO< zUzVdF%pXwtWi>3%g+m^5ZTIMIomv7LrAr@c_3oL*Si-x@n7BC0R z!2-kyU;*L;aM6Mj9AAbLc#JJz3%0-&+h`Y4+0U;B@rC+7Rg9cN2 zlpoWstW4E0b#w657r^lm`J4DrT{PH%RbhT#%7z!X(_miHl@47MU72igcVz$T3{Fy2 z$@Oc-nFAITBLyCN9ExqEwCBzEUPap9BG@Ikt^(1BqKt{ZfNNx7n6Swj{V5Vg`67ce zBeFLkENHaBzF{C+EZ=^V9i7ah>}xpv7-)wxnTRrKGqM;SI(aQ5bh2Ncn;1!=fp-h(lHB{gOymHhadn#GH~6b0jE4d;<|G`y1UTL@3MOW_xS`^a*dU zLhI~<;aoITklw)FSYD^uHPe}F8X>D!ziFnPNkM&LNN_VnV&2A#!)Y$fG%3%*|n*8!AM?JcU%9G*BQ>$D!a$383af*?Z-97omMe|*t>v=T0GKpBpy`g>h z8+XJtxz8NIGpoUj7UY!`wV}yLLmKDD*2zSAZ_gY2!Sq}E)5rJG#i>Rz6VId(%YaR{ z_!A%C%sDLR_p`{}bU$A_vV#%jg?hiDsZS*!S;L*RltDzYhC6L3gOFqm9OWz|8B+^* zf{#J|09%NN^Npdeu0&#y%Rl;VdhIJ!L6_SmX_N z*ir_u$Z_T3fFBfP+5zj|nYh0H=nS_lR=+zWtmf`I8-%JBiyn-(w~FWW8Y3$c7Io02~b>4h?$TLS#H zAw|4QfUPy$!Ab&hrr{O`38GGQw#)i0v!N>q5P|S@78PCQ__2J zQrHm+I9#AaFS#)L4tjLXV9s}RC;L|ngCT*{H=!9{lNqi1#-%^_7U%Fx`loCE&u9M~ zA>!76c5Kepm@qW@48Thv9KxJ(WHc^PpNjSjg4h>rzE#Yr^devma;nLUd-s1h^Ob+| zp^ser*tO^%a|Q&x@T1jav@9$h4PnY4|qg3#8DK3jk6d0Rh>K9!G z%(aa^#;i(|`~GDH4?v3mb5VO^8d5L-g#J7*et$j5k;8_7AlDqBCKE|rBE8{$&Jb-7 zwi0xdEjsR>^Cs4lYL;IqKAQUXG90`n+U;quY1?M~mP4ISDWRQr&2ATuXK!jQ|Rie@(ELAyQ4 zV*>c!thK!p(uZh0w#|2|v8|rI;s$$_=Ajb~4Re5 z8CqVfbPaWog0sIw$0Z0rk#}>E7vW=hL5_x*3ds8blsox;hjOQjyeJ@+SAmuFhiW>z zFf|z`;a?;S3o1$wqY!ARV*{}{v=B-YDmH8(i`u?zz1UvVc27}T(K28ixb}yah+r&K zBV608EtS~OgvM*^lk7dWYyPSmm7Kc6;J;4dbb(UPQdDqT0gjdpRw+rV~kR3p^X1cH%bB*!^B?;_Q@QI-yxr@DigQE#0uHpy{p5 z6~qizSU9E+_3T38+O}WoI@SS=Y{s;YWx3fXvX~k5Mx$x}TIIjViMH$X8c-gK+X}tm zQZDRiZ*i%Mz|G&S$ps_)B$uS^8q^*4n%;zqDna-HMRH@~m}~5@UCKbY<~j?m9!^}Q zG{KhrC%QynP~E+Tsi&_0{u5t^Ih=vSwAx&Qm@xNt|Xp`D?_t0B`lm$uOxeSBp3D3c5Mu-yYtLce|CxrXjS&BwzTs@ zVkz}N&Yq|PX|HgJmgrZw^g(Q-bXPsF-njpK>Fcnt>@s0)EF~nrsN{rX%@Hv>>w`YM zQP7Wu^^ATA;Yn#>BHZqq1pWE~t)Z0rEs%k;jbrmZ)$%z~o`mfH)A}Glk?n&#&H)sx zu|7MN9{!P??yIk$?p43uS>U^#LF*>{YWh4r2lH?kf&5l&eN`KgK|hu|wS5}LtKBJx z3W`iHSJM8M0Vw`c(dYZw@fcc{eLz#od*#T`9f+!W-ZfE0uS4hX98^nj>ca8?tc38k zKXLocG%pHcw9@RSp$qG(bs5NL^O1E`v~j(zPSDi}pC@#c?wG~cZG<1#;y8;Ud3{To zix}lsVTKts#$d9U3j~^zmlkdW7^?a-R6Gs&bmV2t*NlT86?tQHrpMP)uo}(dYsXue{kpi3(=%C0L2IW)FA+=)YbRQ zl52E)VGX00L>mlE1i50+3p`;=0-~S?%QJK4QF>(^l%fQCphL1-sTVoy-m&pcy{fsH z1>XYCt)26Zt;VT2DnhzQ^>GwJv%p-}8Rc2N0d&36@3kt*0w&W5e}& z+LU%?C6=*U%bwza9%8r3Q3Q$|^i&bKP%33S3_6P+WtgowbxY4cib>C4O|qhAOiIs~ zga^}C>%UM-BQ5>V`Y+w3rv5k5U68VGT#H08+WurnXltaWt^cUD`}*zKyv0a&a7BrT zv(obY@8*-XqNzC|O{*+aQq^=HKM~qjg{bDN^xtpO2!LgzqM+2!&!x}+*T}6@rH;xb)$A_H){&4X8SOoC$;gS`Zbv@C}b7 zO=Vx!;uFcs&bq=(O9aMvW#j05sH#X+@fWI6oAaowD#`v^W2}|7L9nn_YlPZnMvJ)o z09biA62Jp@)wEdQz4{VYc)zfzn0j7S90PeRZzHZY>@IaZ&D946^b~h@5@d3XQ72&# z;57-dxP}Cb2QlY9B^|HR6u)4l!a`BDj;8K21TCcPcWl#&ri);&4T$O2k81$Q_ylfe zWCVX|&eF)1q4_I!AMVFE>Ib}Ec*uwhEmZ0R6p(!dnXA>kUhm(n9Ih?$ZZ3dYd1fuzZYJI+Z zmhlY>T=@(!YlXjjhT7!<0HR44v1S#J9dnmXl3Snh?G3mi##cDM) z<}Dd;eMfR1FQA`$^Oe~*Hw;+r094Cjeg#4vH7X$T+_eHD&s>Lq6tLby{d>w<2S|^0 z*>IZdqpTuvn$Ch185=J6%f*A&C)e+P*pcYz7xp*M7>`$11D!ffyCTi2FMSqePS&4yx=)!p3JnG9*R^q*s*1s1> zkCqM6Yegv$OwqTFU}Mpy3vU1S1XYRK3`iRp{NF|gxbyMXW?aG@V^vCk!3cR-;5I*? ztvZ##Fx|v65xkdpZO&9$+{u1zQa+crlz9l@UbsHOHAWFGBxn}UFod(aD#Cd*Gcj6n z!0&6awq-v*C}Q&?f{dXl28uu?D5uUS7H*MnsYqZ3Y;!Z4XPE8Q`_xtv zZADMU-fB)uq$LGaS24mf%pr=E%BrbYN!ycNl6qD!5TsOMn&LeLu_JJ{BwLw2$SSfT zpVHJJj##%K+ms3{o{?fxBIx3Ijh@$pLujRMYo0PRub9xh!taW25`9vEqikN$#MVFI z=MaFBc?HI}78KI-X=KY-2~%$P67M?tneKOOUeT0wo0)epuh6TW98)!~=-Rwul{p35 zyrOBJ=94zBz)Yigg{2kqiV4+InODT~(eW^$K-&3Df1g4%*DgKV=y)$1MQlp}VB5tC z9dGV|uX5Qcsh1MLz&)?Q|2D38q;99HH6lw+=Bs6{p+lMpPx^f$z{I9Bs4d2GpC$09 zZ5ACt2K%PSqDjQoz1d%^LO#3e9()9h@^KSlS00U2IWDOzX)MYOuzsXzXj`DJd z6}0?nq!rX}Z%C&73hJS{-+Y_6Bih%W{gJj{o+RWfg3TQ(ccsEkw;H zyorx9%ke&Au#vH4Q)qDd`%_T=Mly$hJ?uw1A91!TzR$xy8D!B~^ zWU3Ww-`Q{r_*g^_54d}?r8muGi43$uyF?elNR%LA*6y%U=8{t>tFEM}ckRO0 zqwH^Cd8APv#!c}&g~@=~xet9t3kVusjHK}5Q>xKQwMR9~XqF`E=l6_Os9DV5_J}8c zYl5h-+5~WUToXKhF&JArQfF>JOe;3H~nsSjH07sA&VZvM>zA%}YbIfSPyMLNOY`vQ5Jk!_+UqH&ti9Kvd55aJl zJPVEQg>h|GHB=U=iSbb(f##O=!V&@zybkpl60_widYbP{FB&RtgeQYc(_Rit?{%j?4MxA;W3&Qt-SeoT$MDHTBYb90M95ZA zv|ZvaZH+VlnC{**tnw zUyui-Oiay>9b$&Pg}*wPN7=V#3?GF4MAjjxp1l!Z`aapgj@KfbnJIzJ=x9ei!lUdF z`V-H};hCP~-Ryma|6BW!=SJJLTILt&1eTO_!&_Ug>L5|V zfpeQ)HYFUih{@r@zMx(@VHW8%=5ni^y4QbO1FheG~a4H8ylX@mWT?aL>{nObqvc_Jol|-2#{t*iugnbvsK-JURv_0#F4gNCb+M z)7BGz0K(hJndO~i`gJ-h^8+J}B7)kgB{tf#Q7fE$1LXW_2`(?J!0~7V#1}L(@USR_ z8EI)l-bvzo7a>x#Z1k=Ygy%_;{ciJs`@)-1r?vc1GGv%@Us~w&AW1r=tb&~~Ni!YO zFsbQ0u}#1!@uIS-v!qGg6N`|_LNDBD(xmIbP>Li31QE=Q?G#B!h`uyFA3e-IL`3w7 zT`K++azQx>>;^Fbgjf{-_hPqF6yv!tzEWBP1&LM$77=SfM`tXEc__M(MSb@V@Z_oT z%~qyF4*6b~YIVY-c|XY$DOyc}to zPRnjE(ztQ3lv{8Bt>%Lgn@e=HwP9hp&{fO!;$%=@D&7WmfUbILG>jc3Pyl{kLYdNP zMGLp2EwwbnYh^Gzmr&C0zkirtSWzFp1Txeps# z&HeWeTRt=Evm$*UukQ~z6LKOx8VB}U{vUtPGBVGS=WF6R2Yg1kglg)r>Hw_fYP3(W z@zV0s{dmFBuC5$x6+nl{8pexl+LP>|HTYF)_nFTQP=iy&GK0TX*|*Cn)n)S$E@+AX z{yLrjv6FA|VoaPi4y({@X17ReJuG6=MJU-BDYEY>m;#D~03QRZhWoCLd;!#eekN}` z7A{XO^_d zJ+tk;T5WE8Bz$Gnf?NO38Kc(2%nVuMJ>dR0**8nq#oEabxlgKV-~DRx;H-{#abG8_ zBR%8}jil}le(3$ChdwN$wLA=-2niwkYi}v{x?9TKxux8VTgr_TxrJV$_`Djq1!96~ z77#^q5!?%q<1H<`0B1VT7K6uKYu4gZ$v+0QM{6{kFkx?|l}9S8ybjxY;IcA`*{h6i z^_YQyoqY8kkgg-jg&&A=RXSv4U*biFHrNTYtMwshSG?M27iSU<8PFB9E6N-;C!he=+$a2Cw?O!z9)GBVFr12#VIG;3JTh6rBa<8ONaLve z#CUg!EZ6`A8W8u4Q1i9=lAf^yWhuxA zkZ3DhL2{0-G>w0zfC%3c9HP~TY(GfMzK;aUCrgn~vCs{Lrjb1n9#;{wZmC?3CNzO;MgRh8pGhagAA3Cre9y!@iz@PR6W-S(o^Y6iO(bITUiO zP|Uz|O+A@ffW|pU2lj$~6~!zy7L%G{hGwagxa9k1?8g%=&i?%s5G6XdQ?NANnbR8# z7O-KeK?P=$L0&@x39**Z`1C=e?K@OgiI^Zf>0~+t4%4ladeed-WRVeCFl{TyXqe06 zRTF3gK0h_g=chawi3@o$s%G(Iq%4%ZEEzEhV()C4pkXi~lwi#@xMD=nWU;Gy;#d;#D-V|Q{`AS^m|bN|AC z1zQiy@O}$a6lR5yuf{~U}SzMCKw9Ov?L0=L?^tT*ija9>YZHH0;k+mOKjV4kN?FtH9T@^j}yFa$%Bx=2*e9st3Ru+sk(MgOf7 zXt8Is%d{#*XO&`GLxMrR61KUBlfr~^hP1Ekt+10>4JB5XelCSEN~m+CTYS&HpzTJ8 zeH0U0%XZIw`u&E=P3dVH^XBg3pML*)kDSANHJ7u}?dGs5&u}F!?DJ&xClOg`F5chn z;{eC$gR< zJ7q&mr<9f3GDm)~@ySn}jk3RCX@;*f=S*-Ww`C(ecz-Z-;*>Xe430`;)~;+OAZM zR&~U+kSLsH6`{#Q7oQUIV@l+|Op=yB4Q&8=V*3<|@icc7)Xc(0t^ElERtOer z?M)~SQn3RC%GF9cm&MNX(?Htxs$Cumy+`s0gy0VusrTLN9hq7#$Cbk8lxZF7MVwbD zrlRkz&x?u}3uK0X2*MC}(Me=`cm||D0+Q_sBnM6!xn#l2o@>H3fomBe##RyYV!FE z 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�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 z z`dzX(fwb8Cz;A}u>>(O&-ipby0svSw=1R`}>k3;$k(blPy#5hj#C2VnALRc@Z~Hzn zqVg(~*TFnzx>SHzW>e~&I0>dSt?QQU%l#-N3RvhQ=yivkU$xzn8PE7NCGxtc849f^z?TmhaSM}C7V z@D@B$;MyPH3Iw?{7F?545Z`7)7L)>sL6RKeg;g%rUDoqn`=zck0s8(YQz!t{3e#-p zL)C}B73&zjexG4Z+YwyDd7-8*tfc~*i9%UOO=2|Z|E7O7C1^HE3B0zjSbB8cQ=qe- ze5qy|AoFgfba2drRRfq))1)#?yA6=>BWd(Io|3)L^m&MHeZLL@aR%5M56iBPD| z{q4wLr6=v7z>1IrlQtPN0RVUAKd%JgFq4)~s)CX+T`5o9_Nk!+8UVr7;058N8&rg? zl}HB%W)D*!OCb(km`nvJyX?So?U4A`A05d;quARtBsxt&E!kJ$(qEw*{6 zb={m8=Eb@my!L24k0#rRt>_teVmyhit7ovaqD#Jtxc**f4`TWxI@zTkMmH)!i=;hp zRkfbdCBE-b=SYFBeG9VNPxthgf?XA?pTX_1Qj!od@n;xJ_I5#@l|Q86P$R~ZKR zJEJej2`ib$=?Ybxok_Z*myap>L`9(B%IhO8eJ@l6_aW>ua3L7y3SUn_t!`~QQT~Hc zcW1g{aRQ^w&oO98{bO#)O3?=;Wt9;M`!coVvjW}jCu#R@xFeMhCt^jDqn&}&FyQ@i zuXu{#4f;Q(Kwbx$%CE7RBDe0+qb|uD$Y!1ds}9dmVSgicSlN4!B(Xm{N;d*g)X|>I z4*T|?8U{|SU-;G>DYzKbZC&_govb~|idPbLmq#-ylNkO}98?54{v z9>UlM#O`?4+~q%xC7;)TxZ6~ zlyV4JM!!}t+1l}=iZjQg-Q?>`Fw!n_1?J32KJ%jr1uvOy_t?fE5*nR0@iy#Q^{oN0 zG}?{$k(2BmRuhetHH1D^L;A^hOX#Kg8Y52m2g+&W1r z#kwZ$Wu%-hNHmA@)fD?jkTMCS8(vr3#>{bPZx9vAT1Jw>3Vzm*4kac|I*=0~pPwDA z88@O5s|4YP(K^vPqj}u$lP)g{M46Mt>n7wjMnV(R{|w|F_2)v zcEY>B)IL6YgO&(DNsrNmg*d1lP~lY_OOYrI-}s2%1e97^7YfrwUA=(PB`P7{ zS{7!AsdtNUA4Sfe;>BGv3l=Vvj!t-AN~`OloAcOe&ofq@s!cA7hJR%R>? z)1c#_p7TyHZ{fVDuTV0sOR3uOBIvsX^@(=+7LT!iJ{^uh`Fqi>*EDzG>98JMh0scc$f+Y<=8Oi0TSq{XogtY6nd+x zqVX*&?=i-u2uaYynE6+m$hQc&qDN*)**pd`0zNxa-U5_5Tr$0r5tXa6v1TpyJVLf4 z&pg^1gt9D4yzy;T1qxWl8ic@F4#tC4we?wz&fMjI0i@tg0zV~z zNMN!wGc>;44Vqf29U5OG$Cxw^eJ2h4?8CINV4C1OH^X@@z2HKIg7^1DwKMueCBjT( zq3QTyt*wQ58bxU~8&G4RlPVP7V$E|lN11z;2MKr4kn-?kQo5B);B1ge?e~qArirD@ z4nbA45j%s|-5|Q%7Awv3s3-*b8@E@p>3VHg8M~?Qggs2e6S@u~WgM!c^61ZW(T_>x zv-#SFB;lf;Og4uNmIcIxw8dQK=NYuPuJdU&Y}Jk?fuA|xM1u9T8DQ&7O27-&HsM88 zGlyRsF!HknYHJNu2TKSI{9;1^9yi6%&GGom@aTkFl)I0|?|{A<*oF@Gyn)Ul9U9dC zz`?ihPn~km_&9qfboQWUFBB<}9i~*LtSufknp{%jdWd)}mhQO2Tvw2z643_3YF3)4 z+0@M-ELT+oJ4|X;T>&-o&}40< z1r#xXymYv~1ObWCYY_P9$%1rql-C`E{Q*E*8bEerFqKA-KXw^kK#g3s{! zB(76ElJO48cPw%>k(l`7R|Xl(_IV^=(-|Syh2Juylv)RLFOYhV+jKisBDy=31Ka7v z6Q4aK>**dasSPoDY9waPUcXs$7cuKsvy+1+_aF}9uxCxygU9er`;X+Y_J;Kkz+p>* zJrg1$BH_w(^%VzDKdqf6BQZoqErL?Bzzaaw-9~aEhq_b-E$O?{k5U9>e#EE$uz!rI z!jSKDqK=lJn!%AjTOM=0=tLARTf)2`>Vr%a9v_I8_c14U9fp(Ag7~iRJjRqcd|>yY z{Tb~Mf#o4FE8HWDPZYDF<{}=#CBY%lon8r^nKu$1_M&Zb|9u5~Cg-45ptGx=wvwNx z!Y0qt$Bd6`j))~m(>3kuN9}9V%{q;hb#Jml2`fdyl^SFdF!zfSlJuA*JUbIiz|C@s z)@dG+B!0H+CtCr%j8;#YPeYN^GcI&`LbpyB&`qvIx1>(8UeaH<9^ct{S}dhxI`f~Y zba8TwuiVCGaq=#{X(U&flXyV)p*DjfBMNX{lFu_m+iNmv6MxFeEdgoLI=?Ax)WrBy z@l*$0vvR3Tb%OwFgl;^Ac3N9k*;;}2Nwut!JVFDx0=|gPi<1=^;G>d{ntDJV)7);|GgBf?yo3*1;9>gy!XbuVQQl7+k93bU!=J@Ld=+7_)q^JVQLRv7il7>Hy_Y zL75?IS7fV*Ryu_Wn6;5j;Ckzs9wC!V6&eD4MJPbKgSKDAzA{M7B+EpqZ6OM5KvI7PL)q2+D|ANYlI9^cDq zi8+y1`_#IgPQ#*(E*0;$cg=P$gu&W$3=dj(v@#soG4`Gdf20i<66aDtP@kCwASZ-_ z3n@LF65MD3-`MY1&+>r->cJH4XF@ZXL)*g!H0d-r-{tr)OX_g7gP$lSB#Z0hO~T|A}(+Z9uqn?h%O&VQV^@ zj+yb~#~H|)m;v1H1KQK_$`TTAMjs^}6rn0gOrigeVJ6B&gfiNWYBp9qWwwp=n^!O+ zD(?TYSqw4G8!IhkP}T%8-4L0!^dFTHRl+&wwI!@rkv(0CP3cClEssxAUEZ$=*A-t- ztk>yylMsJ z6`fN|aJG+Wc4I!tI7moYE~cAm*VM(3$?QzZnLb%mHs&+AtRHX$IwzfdAaUanX9)To zNt~zq0c{vp@W#kKgM=iNVPe)n*(^C`0LQEM5DB;IdQd_NGjJdWd-95Qj~UteMYbR& zqP+Sl;{n%@?#`$!9AF8DOHEmN+t{|R-FMv=Z++fQTP2d^EYLKoG5uL0nAzgRwSFeB zXJXy;iyBUsvM2@b;(;)ei@{%m-$5#tCw8L;G>=IXm}$*$J1x%orzJ4)q%(;GF_x_^ z3(@23F?9^9I;BTNNLS-piKSOf3*{kT$}EG_bcJ|%W>E;VM#4ou=UN?Y8)(X$=}OU2 zBFIy03b0ct0CKJOi7Vt21HdBV_Gutx$1^=UdhH4644KSh)zSm4V)iWuWDL75xky;E zxF;-a8(ALHHOdV1;soXg(L%dV1QqP)pyC@#nS(M`=^OJ*nm)1I*(W6z$JXX*EjTtr zKWOn&*(TLQ7^*APcxu|Ab=GA4$_=$EavMv>#sQX2tdUr{J|?G_F>3@IqEB1vk_##| za$(t4;;W@w1w|B09Y4EF9WTbzk=P`A=}PM*buRB3Hh zTH;q2nSagwM{YLk>(_cAqlt#P{uX&0fs+7Cen`}EtZ_B3^nIT!zr-kFRMMvg+2Hgc z)6+5#hD3{5=)QH_Sj*DbFjx%|*kY#T2b{IR@rxPo?II}g8Z8Rc85u2ReiT(?qZq$9 zCN_$tv6DDZi<;I{Oz`@^a2cr4)B}PJ6O0WEKxTxs@bb{+itSV#BSEtzL>&ejE2Po{ z4dB4ir2q%E90G@#7um|}*Y=329B&ow>Pqb{IO={49}kYY<||0h>%pOYmB1mXyIUatRJgiA_?Znz!cYUpk`|=*7Z38ofO7fOA zdPC)(t+)|4x^~N%@I;vU0iqH>UkBNc*iHf`Y${xk2PZVxD%S<=0{4h(6-{WpP7`|i zp}MV+&cILtj}=i@M8~9vof%$9goQxxx?jl@Hn^8@DHly-K1r)@) zNxIk>^lq%=sNysYc-|{~0!;F{)%eGJF#K2vZJEIv6sC1!L)U7}(Oy!9)-X*b7Q!O= zkAs2}4fB(7ke@aw!q%p2L?sV-9T6_T+tU+lo;#2A}fXr<<5+iC=Br zcu3D!^m?`EWy6g0i$A~pvIfEpheRvToRPtLmMp2(-?2nk{0zY3SlG zcin!8WqW(`zxO*%*vT?@&u$Ev{{ho7z5H}HGLv_@e`x+g$nyNw2hXxB8`I|h)$cA% zDg37@yk?S?<7ASyC%z+2zASAX7qUKm|E+3d#eF4hzFUoYQR(VxREo2)=3>SDwrFVP zzM3}wPsP1bq-(e<(&n*>8~w@?u(Uq!m1%R4;#L)L8OIu$@9K9~(>!(b=^x+q?Z)u~ ze^2Z5`oc4xzqyWKySpZB{=IU3s>oS$UrU?E^t(;!*qRur`3w#Dn=asfL1|TYTiW~^<-EC+^P6dNVZYm= z#@!O5mkkWhbGIw%j&V_UC~E7ts5=#P|G20zMeQg@@&5hz4m|Eko5O0x&LS>zcc;y_ zEAGis+&yXYZNzD0?)v%HpQa1wwbSNX``x{&;-@j`vVkGNa!-7xiu=;$P`~?@lD!zC zmkqpS9v62K_1kh3?|+EzjKcP``4%6xx$mXTd6J)0?cj)k{5xve z@dHhlXeZSR-=QUd0&a~3EW-qiGah17bO;Vj5nu18Nn} zN#B>mJyR;rJ*(PZjTuAjAHO^zW8$8RRS4uiRqC_jSEY8l6}6@u#rt{jojgA)RmZ3G zrB6Q(pUNPAHiG;Y6G86wsH!i<{GqLvb>9cdqd?ND<0o42ysGjTM=65G&tgR{q|HMN zdyC}K8aC%>JZ*$tRJ}LGuW&x|+^-b%Z{;Z7Z;$WP_fjYzAlf~pPcQpVD&2-{Tk$P* zzn;|07h*Giqh`9_s^W)Y4r>dhKAC%TT-5Ir^`mkW@4MnV&Er08>tATzbEQwe51-0| z^6S`$R}EG*cnT(SmqUv2`Q-))cku2}8g#H{Kg z@4t`l6!l0JMu%qXQsU9C283NUaEKD09p52NPi7ikKNH+OQmf)0s^a4{lIO|Q05Q+) zy!~d2@vl#Rcl#x*0ExS=R%+Q!vAkgc}5d+hWRP1B3J27ZtUo9L4(`@!k3$hFkqWb@HW#Oh+;|MgoHi zC*SNV>qM3QnVoLtz7_M+zl{y^^Na6kYv=aTr%UxIud4{G8r=7#GQhoh$L$)88dmt8oIGN>%N<+yH#}8C`c>{AfK4GdL;5^DFKa7d{YWSpF?h5t( z@tBdre)HUwiu!RmiuWhuJ9(~B0jm6JrF| z+uv5($^-sXMA@4fa8)O_5NFm+ER|<{m%GK@3$2# z0@c_SdnW1bn8Ht8?drEHA)9AOZ-elw$5w=eNwW0i9bdTY!aX~;{4)6;l=-kq0sZ1U zj)n2*yWvv++XJOf-}j$9PQ%N&PmG22=GmQWOp*G5xFVL%{wVBI&l)q?2Vl{{`JJMy z)Sbf@iFlO!mFI7L#0dEsBCTDj+`$C2jo_)e~KV;Sn3JKxg( zIDWS>)>+)s*lVlX^=b>*G7{ zxM3W0ZnE@Wir+)}%i=rfZ;t7O+3r?Le^vY*(q9+fNpV|DZ_vNP(r=F6L;73eJL$K^ z^ksVU?9aFV-tb}5T>&2gp59T)`T4uUH%}DrDL$ocJ)gj>a*@Bf|C54L;x@!=p~&q; zzQlbceybb*_z<58I$JK%t-UAU{hqtGpAX)Hn4gbPzb>NAi&4KSqRx*|&%`J{19t0G z&0B{7czI@iuhhJ+hi{p!DVl#fVsU#uVeP2Qa}UR;Ul&oB4fZBhg68FXUHRL>}l=DmRn~}zi2F=gK z?_pwnKE6}dl`(yQ$-2_FtKv5+>uM|Og81D=>l%x@s2m4eH^g_!|5_{~K;X-zZ=2({ z0M)OSzHN!$$`E+^$G3jd#^c`jH9+91QqFDhTjJ?x`XPHd+su3zP;GOXa9zGjvOv*4?F4 zPm@Y!{H4guDKZc@GV$@3F$Y@hL=K3oNcZdmNnV`~Ve_xg@d{ra)6Vagj*_bBn{jxHQO45e7W>`;q0Kytm*OeRwZOIYYCp1 zb!_8C7Cj%34c}Ix(Dk$w@n||i%vkAcODg4+Ty0?F^EO!@p#byFpLlSneCZYRAA9D> z{j-=-|70feI=z#=a9r;&urh<19_*dN#Q~|i>Sc6M=0JN|hsRMFreT<<46C@Z{*0kK zDw(-B8Frhc6UiAlEFLe{??(x|VWDh2)_iM}BdG~S{b`=epPAvjWK-~Ew6QmOxZI7} zIc@ptQTAl*zKH7Mp8L^VF|o4USx0youOJ%E_Hu+vnKeMCf|_T=Z@hodl=q*o7y!rt zt`Bv3T>psc*Ac}Ycf`nGBjrd`h5?@T1!T$5<(nUKejkVAn8$*)ENUzKVIjd-ceR)e z4L^rtoOkNqaGQ38Yhgf{9uBdXCX*uY+rl2E>N}}2@!m2>tw}%D9UvPz?3(0hJcTDKUQDUJ8p)RC>MA`kj(HiPBZcf=L=1d_NTHT9_s%{|g5z8x*>cuX?1>}XlQmc|re zKD_P6HJHcSP~uGyQyYejffOJrsBd*bZW$3n+#7{_KYESG5bW78G%q3@rWQA=^+yhG zW2*~{c?=7b_|Y0PL^vur!+0tzuw#32Ghzp!Qhx)r*ofk}+e zwSjh&^Kb)v--f;#Cy|YKH&M~L&^9Dm%{TQoxef#woNO6-b#)mEc`3Rrd%V;LV+xTM z^cqTrjRMI)PiaGtIGH8H4lD!Zyzv1&`Myn-f;RblQLS6BVHjr6eD9f7I{FF7t%VBZ zM^a}@)e+UVhb2RL_}yj|eX1W)T@8xv3R@)zw4a8WWK}nJWbn`=#r|^QzYHWc)qR9( z4}hm7%}EHMgYar{yNc<_UVrsLtl|tr#$W@0v0^y>WPWNY{(O}tfllbzaIlc+Fp(X}z8R2c1%Y`@tBY1PARYcR{@jKr%L{kTb^*-R=g*h55xP*#?#H zeAPzZt+mvnOg}vGV;k-cXO7~%tH67pYPh$%!7)@$nq{=Pz_%8{M-}F8qAJf6?0K*| zQX?@|cMm^!PvYLxI%{we07-{V3K;2RPSIj>xL+}Rz;}Nfg}Htd7PNKI71=zU)?A+e zoFmP3uG>_Lz}b>n-%3+$Yi4A{+GkzFqE2u(b9~&k)i^5w3T6pGo&wBFgDS#rY<>s3ck8I+VD(#t@wq8o;4xa7DeT#ml38zie(Bz&M~< z0P7&o?+DpjQLe@U+~x2YcP3T&3AKSM)2z^`GtRkLZ;Hc)^0+2s4rokDK=WZ9jOvHT zut(?x%7p)4HbDA5+CxP?oyzSN~;50iZ&A5%4aep_}jDyq^*{I5!*xQAWRUOBy(pft@Eo-BSt>-4) zAJ6(h@O2K8eHG^2fx+b*rohP4>LS7$T8`?MmyiLxrMpCeb=~ruJ6$bJcv!SNr*c!$bz`=NIi7HBF?}v)CojfaA<9 zN80)r4ff+;r$o0hL70f%`-z+jLBf)Mq+6BwoSF3&^WH$uvx6ZmhvB2LXB;wB zcCxx-@VQaSeGCV|DCAgkbCl_LjPGTY*2HW4b&Gjrov8d3dGz zCTB9JqrhKEKH9s4{AMMfgm@>MGgiSZObz0lEhRMzGx%~q8NKJ0-+NKAvHjyO& z(_#TwL=g(?+u1C)v-KIx>){F0io{g|NvyJ%*TWwfKd+%DvbPWOS}rDil~y4ql_Zu) zS`baBP?s`gMl=ISl2}EJ&Wvb6m(*e{68mZKl!U-qOl>NrRFSA0)PTw%MWH@h#>YVk z(5lWvT%YWeag#LdQu@lww1J33UOEy{siP83x~U)UP7wyMU(+h)-YuS4bxGWSG{$Qx zNNg;JlC-{XSanGS)O95Ei7YGe#yD6p9avFIQxqgBZ0>7SONUdI+DXZ>zJj%W4hBdN zmb%{1nxbA4U>{_e9XK+2DK-xx>I?3R1%p~u1efw;O}F~h7p?r(hfd}?wv7V|goD<@ z=FF5*B7i!SI$h5|1*-S`^YHACwL@i#Lg{W14?|Ffy1WZnt8AFS5f0x7RXF2B(@1-O z1JP-)Q#UxnfsO$Y9ZK$wiHboi&~K6tby6H*If03Zpn;_0RKt)B8`9Nu#WG02SaJek z=Y$m;P$3tt7NV?5bpb~T%nWi$3nMPJ$Ff-$y6y1pijg`6D2<0v(Od?pqM8hYwAU%M z)D;*E>S=mbC`)sAdFw^(QZzTkq9KZfJ%(B+2{)erQ#^fm9zJ<@l9Cj!OD3BSnXTm4 zFCd+w0Mqa>UZ(P~+U=JbZ{jCE|3O8VBABt$khaN*6wHSgQqT=G#(zSbQJF9@5HTfB zmm7K;NHjVow_r@hLnju*!EAD6mP_dEss<%ri#{+fbXYfAB2+Vrk8ab|V(cY6_z!3n z1i$34BkHC)NgbM%FyOvom2P~q2}?EQDt>MX7kw+tI?!4H>NDo*>hJNfY(rA*G{^x6 zxjRSq*=I`tlTO5SI9mg&3#Q6RbqP_FT)U}Ij<8a~B}wOIsn9LUuVBdto|`12j%fS3KYZ<7(q z>MtcQI5m9V>2~mJEmWY^Sg#;gbj{;Q#bbmY!}sbeGVwU^unAB!MkpHbg0}u1dL_xZ z4SYC&dO|L?8J(BBj@rI1liz2$&cQ++f6=Bul7TKqP?A%uO?}5(!&WZiu~T}wvXZ)Q<~W6 zivH`XsvlL?Yd^%eRKcB}{1FB?3cjJ>CI#0ixLU#G3NBS}iGm9hoTp%|g3l`Wq=MI0 z5&S{H?-l%7!AlB$so-Y{o>TA>1wT~qJp~Udcu2vw72KoX4h6R=*sS1s1y?J$Qo-d4 zHY(Vl;6erGDmX{MClrh-_{~`a&nb9Z!2=5JP;kA1D->){uvWp@3jXj3f|nHhT*2cC z9#-%z1$QXetl)YDmnpbd!FdWkqu`SYUi&z~J_Wy4uvfv)6g;b7mx7%NexTqH1rI5> zU%`C}?ozNt!7U0lE4V?yCIy!%c=q><+fNicrr_04;x5pKJ^FQ?e(lt+FDqE1*UR-IMn2=m!H@PzV*+X;T9;Fk)1rr=oxPb%1{ z;0FpGRq&94?F#NyaF2p91-B@;Nx=;Yu2XQ8f-4kkRIow8MGDSSutvdZ1*;T%T)`i= z5d22LiwgEA_^E=Y6zo*+BLzQD@Q8x%D7at2-3qoS__~6d6+^XOP1y?BeqJqyUSf${V+X!A%@KXg(DfqsE2Nm3_;0^`1D7Z<%*A!f( z;4%dp6s%WpzJhZVd|JWT3O=sj54RHhPQl9xUQqB01wU2rw1S@~_`ZT23hq~MkAe*f zzM)`^f}0e)dJDmw3O4C=tA71f!A=D)DcGanQ3ab6Y*DaI!Bq+_CnzJ#S1$&OzM$aK z3O=de;|l(85y9^iysY2_1$z`cr{GBiPbhd?!D9+`D7at2HU;-77*lYEf?E`9R&b+& zYZP3rV55Q!3NBJ`fr8H|I7h)M1+T3qctyd>3Vx;F1qHuQ@KXg(Dfp3sM-@D%;M)rB zQgEY!D->L);2Z_7TuAVuf}bjQT*1Q%wkfzn!PgaBpquV9UWPboM{!E0Y2_`QPP zDtKPOZUs*%cwE6|1rI5>T*3Vc)+zYGI)bhGwNt;&)vuTJ>ofYbO2HmWqTo>ln-q*G z*h0{HrAuLMe-SLYR>4;kd{Mzg3cjG=^9t4|_>_WG3jVm4;CBjst>7gEdll?f@RWjG z3Vy8MF$LdOutUKE3bre_Tfr6uw7sIk1Kdg!6OPDP_RwGJqqqraGQc}D7aCqi3La4KoPsS1o>H($!3)12*r{JH>(`a~wMM~Z z3N|QMrC_JN?oqH+!D9*@B@n`#|2Ns7*K_P;zf&8M&>c;*u}cc7tzS-1V!#J;(*2_y zOhed=^JY6xqE3hFha=&-`pdU0}U{XS|_hDBdjTu51v2C1RkD6fXir;2( z*FAnFWGo}0ToqqE?A@zNWz1pLQD(^?g9dbMv_pzH>>6ZMBG{mFn9&7}d!&2=>;%Z6 z@#hj%gVlg`-|UO!oPmqE#3^&GesS`GTre28dA@*tk}=`l5IH$VNU5yKSi{9C8Rg-Q zz+V;DnI#Q%EhshPeS}1yNB5ruw$W7Sa+=Qre||C%KwCSeYFoNlE9C+rYYata$nM1? zqkf`fOX_nQm@PJ;9H7BzcY)b5()xA-qli(^rvmy^P^i(52$}ofmF0V}soh=oKSiDj z3VC%0eU!sQW3_E#Ta~yBLGUc?nu+c~A4-}~^jS|}?1ai?!Z zV~e4VxBTO`gjRUuYm0y9wog3nnFHzGZoAmkRhHrn7pI@fJO}-ds+a#f`-RgTc@GWS z2~cB*BGh5Ytu<3(TQoPk?KX}3u*Wq40@D^hGkSEX2bxd>vTXWSbb97vb9K_dAa7`a znIASYW}r>>Vqh}QF{>jk;iXx_SclOae2Pl)QM!bes0HL^-%nL`MQ7bTcg~N^Gle|k zNLH280hMPjRv6vD?5Oqf944^79CS^xYhWw3^Yv@e2n(Q9cbO(mmCKrag}#0_Y9rg) z)kJ|fMKc)lDLRb*wT_JaKsw)RQ|8y*zM?H&LN~G3=0mVj_$y=}H4`gtC|XV6B%28C zCo%&EK(;WOv#4?^GEeg=&#>##VfouZXQv5)rrxljU1vfpp;gR>s@$k?H(Y^)5SxHg zjFSOF*E`SkzmpDtoI|D@=ek_zQYOB-$R$T4709m1Ux*s+#9u?gCnLLqLav#HT!TWc z!TA{8ois2z9|XDZ?&FbbPPoy+YQucgF8j;^Tcdx`~Dg zR2@huPdd0s=__uZrfp4{YdF|b;2;=i@KA3&HcDv33%zD=Jqqd@8kAVB+<5{vCZdqN zsDX;9!pqF4*HEypKtaqG4ZnfC(uKMN@F`GGH!)G&g4oG$Pt}}=3hFQ4i>nnVQeLww zIp6^q1VP~fp4S3l3^2VI$3V!psDA=n%^BD@I3hSQpyNwZA5{)PQ8r)@RMd&Q16Gl>Qn{r`w~5XX0w^=7jZ|VesZ$kivzPqg4~;C5B(BMZ!eiI;ghR11S56p0d-> zFbhB6e;H+ezyEDFWV{cwl!*BSQK}T0WD;~%77QpWLU`-zDZqi&y+_^ckEm~J-ihQL zM~{A8&?AqFr%)MLml&2>VeixX`%6^N2;RgBEpk$Y0_Xve!HLxdGRQr&5n6!`?nol` zPeBNmye=U`7&rZb{y|SHA=@6ryz08~Nh`V}a`2NN4OY~xpD>QVyQ8BR{5WyKf@(mA zu_&#p`&(6Ql;##o^MV5^X<+>N%yjXy#0sNT@~thCuxn4~Au*;H9Eh}*=8yH>OscJ(Xf|W_XUQstdc4U=xJHY5`p6G4;iJ_< zg)};JpOSDEr7PwRq$DkOrIIklRrghvmbs7efVzK($G)qdAmUU%=RQmXtEGGN8f^4+ zy9C2CXDX{Jncuul-$g16ydM^8-jGT16c93f4@*fzk?z30-dJGbOwWq3fbaJ(Itaeh zb1(FD9AB!#F|z6L_`0N>`W`}xv;zWMb9r#&V~+1o3kb8oR>E2XSHZ$ih6y>!_#n`u zj{LZ>ao$>i(bQ=UPx1@Am>W$Nx_E(O$MR@GJR@Fk(>HrL_~OWw8`mL*7U{SZ&oBJ9 zdG_3PQbcn*2TP7)8L}-J#}|AX>`sSXo0F^zD>`-0>tY^B^{CW5TGA`49_%ge9p^gZ zXSH{fiA0qw4R;)NWe{-RT=pJVD}Wr`rD}S^1=}j2xvXIh8Yv%^C=0XGY^S6hZX7vk zt!aUhc{{tWKqhM}%bGa0!dT8xjvH~E0EJZ8Ne=OgvC4CEmMBG+HgtT){>^P&{o}+f zYJHb8N4A%uWH<;0F$GOXF(e(BLBYG%W$G5=hw@fNcFb$pyC+(*JOHs;Gk}o)NSU0V zw`BZK7P6=FS6q(OcbNQlY5E6_!&qr2YLEUSRI6x1UJGO52(zFPRe+I zz_cK<@jwGk_1YD(eKh7#J4NGT5;!YyA_l8OH-_kLgksaqQmxIce>a0hKM){#*y4A` zDC|A4E~sKXGnMVNYS#e7eX1`bj1(BF-Co|HF$$_~Q`~b%c+pEVUTXEVQ#~q~qcs7i zixfW}9!W+!`43Os$&^S&H8m_}rTwE|3`N*{ zXMX3&C$k_Wg};&;f0To@Bulf3DpH%wuc3aqw@V{xm17Z_xQv}JZ%4WssxGBgD?WnG z(OSge2T2mDc@xE>Rh(yS)|=U*72UB5RWhtq;^10We~1U>)*N+#?y zewwCTr75z2DI%(`F=b{#?h{?MV8+bEA$0O))5PhMWHq8mq1M)y*;|CR`3WFPGa(xW z;sN_=TA7Hsp%eozM9fvC7FU_l zT4?`(sEOoDtD z4eap+8kQQgTouEP3Oi8FCul`MP~MHxRZLe^7FA9(ci_HAxo8dSgPmDnpJU<(yYzw^ zgZ&FRD<|5S6$u2Ob#OmgoaSI(m5wm~YbW8}R57g%_9v{na;~J^Gc-q{qN9=~%k=XXPkaRmYHlToHSBSt-Ba;}- z%>`abTl?F(&-P(85Q4`D(5z7T)LjmP^zYMU*_DG2g%BjRe;9r)VDoi-8u)9;R6Sya6;aWxxTUQ2-pefd3cBagcEm9oR?Q z1UleGao{i3YOG5e+-l-vyc=ej(U7&oX>h_+w7B)eVJaTytHo_3j@v`su1e%y1$d)1 zyN#iTcJ%>T>079Qr7d;ORJg{>-@gOl60jq&akubRkRCV2Tch~4jkliSZ3l1t#oJ@N zHH$YLw;KoxpW(soY*FPZJG?l|wI2Pg`)A~~q(1;xpqaZ(PYB(yi?SVJ6jYoJW2i(( z3%ZRK%9+dyT$#UIx0Pp-`RJGxd?;N_@)?V=U7;LuaZnf~tCi!A{TaP_)grjL(HHFX zA6*HkHDcHpObMGrArV{%yzw44VpwU3p@~HyTzXFo5Gi6tpy9c2`zN4j@?CAnv$z4ixQ=nsUF?PH1S8pIen^#TT2mbMch@2Sg45YrHH>% z#KWbCV!aE6>WKGMmBoozOz@~!v~)60^XQGQlkwOe*sa2C71w}CjTeCh-`=g$)L|G5 z7*C)xOs${y>$tA23b^GK7QCDBZLY=By?SeW)9nHK`-aEwao-xILdi!ueM5<7i`e(Vj%6&n9ae$mez3KvK;;O-CswnK2Dn{kjRzlCY#{jZoR)Kj zU8fM+@Qz~Xv~yySga_p?C4KWHLY)kKwDK!4o19RTS%?Qu_EsV|G_gcU*eTO)(PKj- zw329H)sAm@@9=mwz=_d!!dsWmi@zK$((|4Z6r9}YpWkWFRWviYDZn~r63Y=*c(vBI zi>@P(ha%A$I?jMCXQ$~qYI6ZM>u2V=Tp99h8_>oH5(%;X$b8QDS60c1VjB^*tG1i4cqPvZTuF~M9EbA`v2Cw= zU>m)b;|?tNfhwyd3GC>-IfTf2XwZOqHJB|Cua8T7T{ggPyVH)AAXI9b$@qZ#qZ+fK zJyWr{F2R8%&{vJQ_6A93maaigIH2P28^y`q3&Y}6NeD+De zWX{Q4b75&`Ed+$v+3qwCa(h;2~Rdvwy8{{Q@QGB7p2PaFo_FlxXCA7sRP(vn7IN^`qw}w@?>6 zS6;L-1;{F_c-*lzUe+E!p`Bf${>`175M^?=apKQpqPLZid9> z3;Dn*#*lVs4{wu4j%@mwg0=_nsLn1-_Wi7&V7P5pMbfywXczC~qcflzE$}$i6LCtN z==^Co)#GuBb_%Cbc@W8&KW_}7jL-awAyhgUp%5n?5JDMJOhPCuKMnw)3>l@EI#7hN z3$yHQcJ5;o=`~!86q)&J6pPFCrba2I|Nc-42QavW=_w3^MD0J8_aHEXu6q~Ckc$EI zilAn(96(gm8mm^b&mXF@^`G+!IwhOy`aPjKOCM$0`p@>6^Ru7^fN9=CF$W#}v z;4ReTLe%t;075baq^v_&TiuqJR)J>ybo&-5zmaiuTXt9x)%)BP~Sg zk;!anYgcZ<0;m&$89gf0Fzi)JJ(75UUF!HAL6B|rpWGuI$mnP7&JXaM9%Yw0Mn)$2 zTpmcMn>=ngYa0~V zxUlj8$yqAe_H$hvI#Mr!ktGokdrJ|BJu=A~ixlW}GBN2s!o3w7QVrHyV{I6Hu0Ep) zSP^PlcvQk}mzUdkL59G>$;(Z=;08-_YWULoGF=>cRB~^IY=P(2Oa^L4CHG`lK=Hgg zYtPhkENjow^Ny@NThH6GHrj@xk}X;L5Iw({wGY+v)~tP)p0{M}xqALv)_#+o-^kkB z7k5wThD8=c1O=mS^F(| zUX!(l^!!=|mz24`*G|E++nI?W7N%hk5iRw^7ltXlhGELV1UwAc;tY zoQzn8_c<(oc@?P@m=ZwV+BG1-h29f8?#S9|j&YFFf-e)alFnRVZPVUrm_F@K==bXh1D$hd} zGpIZdUCf~J>|dPRrsrXc8C;%o7c;m#-?W&)1#SFHl7~W49w;D58 zi_U-LsqLqAx2K~StWGA2&kq0){e;4_9+9gVgUI}m!M-fX68l$$uxApIv92{maF%r5 zzBKzET7r<~Yuy>n-Y3xpBH#Ag$p7{$H5K&THGB>5A)$^R&hJ{yjG5apQ})3Odh}#F zD+8&wEvjfvyi=T?+SIymK9zdMBv4XS;T@A$`$e5IIxU(;2$_jMH2&)=MFOfu9MgRnx=2=}nyo~#FKKKY^>hcx{ z2HLNa;N}9hgSw5@`7=A5xHTDUqNCrbgio(G&JVEMN!bC?X_F--2n&4sZ4`_B2jH{O zf19oNTEf)+=-MXf#0^Dy zaFeeuD4p(W!Tsr?gjmKn^t6KdneK_pY?CFrCoa}<>UxFUAHSIEWJ^Rb z5q8hqnPfWTy`9;jar|n%ATRj&A^9AB^@AKN`md!YGaQsU)9o`JAc#C>lE?M5=S~oL z%#_GuE+P+B^Oc}t)yIEsF?ouuk0LpEsW?)rlGh= zJy`ei*%GkKHUW!xtv3O$LRCJ@TJ&U0uk^@#CK{q^e%-_E?{v8u&|iCN;`XKGE6Tpf${Z?vbHt<1)WIW zzo_EbHsd`gxRhgD~>IW&?~kzJudRK>#erU>8IH za}NV6M%r&uG+>ySF9>L{9}tMH;@+TFEi2IC03gsi88L(h*@#CB8ZvuCNlv-bWlx!YGbuQ9(4vNb{?DT8?{U>+ej7 zTp{n}Y~Z|7s>d{}?|mkx({_Tz2##F8Je0LGCh~$+s#31npoY}utMp~beO9cG+NP~f zsEXCi3~ebJCt*>{tdRqvKntvputD0xO<1YwNoElGabPs6+4F4kfOU}~(jg7^^x~sI)lh`Zr(fVLBcS{9Et0ct1EXiWJLY$g=z+$>W9E_MO zrYpp;GkQ0O;|Nlm&GI(G9KC^rO~g3Trg$+(Q33^HMaOP%@3^o(u!oNf&U&{V))_QjK zq6#K2xOZi#kV*z2pi$3vIWGB$xrgQp zg3~-HqHRZP8aD>9yYrhu>{xSuE{uh{{||t%c$o3X2Bv{(!`dC zD@|;PxYERycTEsm-WkM}h%ZfSiTKjQmWVG+Y>D{N#Fn=Ou_aBucb4c%qGvBHw;!H#^-TC>o ztn+r`AHcEUZ2d&RB-}6)#|tK90bznk60Qq^N!b)x9LZYkVK10OI8q2E8(qO9E8{r9 zBpXuF>HL5MlU#B!K`_~KK!Qop&0|fCD#79RGw22a%J1okfbvm25l}v&Cjv_DvqaOn z7`nm}!6bG$H3=lYqbCB%hx9}s`JkQ%Br)Y-Ke#ygww?$g@7EJSmv9_wYXA1d|twU^HYHm*blP&@w(7X6Wx!B_FM7XqB zD^Hxy(4xIEV+$QL>h7*@s+F}ZC^7u{S92RmF zGRR{lN+g0BE>II%vb2{j;X~1+Z!hAianSV0GdGD3fuD?=FDY*(;*E0HW7Y zM6m!0`+Xf=lR=A)O7>+sKLR@Uj|^5M+mtGM&hh%RGsDny1+Ry{*Fop=>S=D>$4AGq z74t=O>Jkw_k`Z%=(i~xeDKiOvwnwza;EGU2QEp?!MDJ#_Q z!Zy?GI}53dOm3!=>UdHKR}yWpG-lSDy>(g8{JNF)OBQoO#UG<*{r>>8Gga-#TxD|! z3K9E$x()}x`AwGGNO>kd^F9enDynuBE3|4G)pLN$FtC^rzV1WeXm=SFB3odOSVYz) zbd8EvPn8pkH%f$Q@M}E^Th>%oXJjVufEy*Nkr9kRG26#t1MzSch;akMM~Cxn?nMQeiDeRilXn?Q7TIIZT`5 zrw2I@J)*-Qbv++% z5Ufzcc8d0_Xy#RSpU_XUpXE{ucZ7b8zjH#I49)U)SIqY~E77C2v}^%?g zX$QI;kXsY2Fw7U?R9i34)`T^X$+o0Zvt2TNQ~Ow8N}D{Pf^_hv?GE;PZ1M*3WEoRN zCzIa0a=@;dsQdeHPL$E~QOQRJ>ITWQb;$tU@}*H_2;dV0Ag--Q87rRqQlM<2Fh3TI zPP`0c9#}TdAR=%b=XTtCj}DA*`Gh!Rei3Kq)L(`mc ztIV2QJImA^hsm^2IZqUhH{B7IL4o479(of+rkuFhb!c~aqO%;eQ=gM|>JHUnWj+q- zZg9E#I@3Q`5NNyTt}nk|*?pl$lAyB9*v7x|TusklzrIuaPQIUOr%N(n(sE&d-z9gL8T3_$cp>9me~kyiY-M4rV;vI_mun zmo!zxYlf@W4(;A62a49AD5-Uq7!Ivt!fqm`g?n_+m zZs6g^YTajunCr%hh#g9?!0m|<%t;s=j*olEXTxni`#vI2H+jjY4wAc9mDk&@VY)XU!LCY-{2Q(hx$_YR?Dwmnxo&q1r$r*)m za^JH9L4j9`K~?_Pvvg@T)j;{Fc~?3w(|#ci)0DlNHNJNf#sxT+6VN-`XLSdf{*)7d zRlFZsw6C(XK2`ft5*X>2zI{-nGV~|6ubg1Y_LUQ;eR}W0Zz@E$){SNd0KG$|Yh5|P zl&vc#Q0w#_TZim#D(LxXcp#&z!xv@jo2mto4A>&WD)C-uL7l~-f21?0Y2C{PQbK6C zFA`yvY|Ud5UubMWiJ2JX80ums90+Q!SsQ5~OPAZAH>0EF(gd1bS`|UV;WI#EbcnS` zWN5%zr{%GW=UI+Z8Cy2g7C|D$&^k(#V0}|jU-`T0W6@H<;)jLfns=fqP#iKI2BGXh zcKdg9(OU`=jlioY?SOh-OzHzky&mS?1z=mmJP z_hZ!?c0m^Qk}!NE9)DZQmtiZg5@iP^okO_3j8s*f0cYtCjBRoK(-e1~AWQ)`&>+v( z`fHfb$NExQBYg1Ou?lg=xMN8VPpr$WbTacXyBjN;KhVS49s8)vx(@>7H%*`!z4Ry> z8LTFFa?mY+>Ia(uj(V|O?8F+pix1k9xy?w3+s-?WQqYplvf@w zYG)(j2W-kJM@T; zT*B(u6{Cz5otpP81UFCN7!mlvV;5_MPkCt^b8@N?;?B5nD1qbwkrbsC zC{b$i0^j7k+~n5&P-3pg6eiIJfc2XG0#YDTjA?=OID0B11?-B3XBwiST1!Y#G3}k) zMF<3`Z}I*xLwO6#pkZ;iCNv~DpoXO58v=5vxC6Oz%BTFv+p|NxVZtsiGLJ-f@>6mK z6E;+xcO4s@`8iHnvu9%a?o>S+Xs$IMG-nDDj-n#jzbU}LDUdVp30{ZX!u>v~dlD`1k5SB9)}4v3l#a8{Y#j)JenLt=n! zPU!18KjbV2mWfiMQwl0!x;T@-=wX!wgr6ctk_mee>Nz_YgXc zYE%4N9Z-rB8Mah)tt;0`X1s#FQgd?Zl_PsXzMiH8_~C*m60 z_#p^FX`BfdtfUevCw($0Aq6PF^N#dXiZ4#WUwkyo4tx%>{dk~u|m&ciIS|t7L8eE9~gGq-ESrEIA||$ zkrsWZfz;hQd`rl=2jm!8-wP3};cZ^IC&-aUFq0bCkJy(>p!K1^+k==r*xe)sz!-{A zmG6;&I2=h3>XH`bJ(j#c+$`$)ur zp7LW&e(G3tzeV?C`YWGr*Zt0_PeeJ*Vm}zH1M5dw$O-M1W4~Hb0Wq?U9p3EU&w%U~ zK7Uw4AZCR%xq@4?@AJAO+Vc*?QFhyajD_Rj6?4N=fNO$y(b;W7DWhH?cl2$A@M(!1 z@pV;_OX`TZtCBeh9dUS7vQ08aY+jaVpiFE5ILGIjtd>_94kpTf`XU*rctZ5D(2OA* z)SKLBi63@ixPTBQ$}&+&DLz^vp)v z8V;kkvWVzf#=}UiEFuDz0WqozMPNATC^yxZlsJPJOpDkQpV}!7z(axbjbkV2SO6*|S zff67-wi3eryMJ zYglf_4mB6us_3-61!woFA_aGMfUM|OMR?axgp8Odi-NWwnt=_FI$NV?y)#9@R!Uw^ zz~TL}WIO#g-9nf!6+x9qs!Cj1BX)zVG$8B-L1{qR4N}rN!Ogf-1cnuYb2tk#yU0&h zo7>Pq)HA0H6kEJXPypmb(r_oCTzN1wwCi(N4~R;4r$o=TcavzBD1#$-Up9f$AJ_ZP zv)-49=vfNvRrl!Ez7)C3D0)B_&+||A$?0g^ojAqqE_aU#KC-?X1rA{fi19K2$3ZDl z?Eb=k9znRt2|>sbO{Ng~NqERUtj2u*WJjT0GMdsZ z>O|WNoywH@7CLArbNdB9pKlR<__Y4L8It_>W=d-EJuP0z2tE?;4QE^O?OfU6+0fz7 z$grpNK&``un%tXZWU(3@1bcsRca`RdL12hHX7X71QoYS6*rG6VX~-kADkwzxQfW@r z%5UeKyYtX5`D9HM)q-G65KgujxCgt$sg!WI=xSy7MFYNz1H=L zYK!`cVX0TFDz_jl$5?%y(1XVHuxf zZk12H0>>|2$YT3D%IQ>JJZ$P4vMrBhIIR{Yuk^|osc7o z$SC;grNEct*;&BX!XcG-KBe^sNPSGdK6m~JE+wH)sz?J=WzWxvTF~+YJBPZ>aNi#n z5&h=sfmj4snRW|o3F>%M-(8^NGV-!g<)L*PwlG?!f`_R})pH`dT%mkbwg+NMjcOA_ zlEdqaY=U5)^xrdwX5U3EN!{t-kaErwNcc?G~ACYYm??g1Gf3=0Cskj6jLD75@wR%g?UIXNYho0Vims_eSf2fZOBTd-;#_Jk~D)Sx;e z0fAR2%CI|3PfZh}=VN}|9M2Aw0zUv`PALVA`~2xA-;rJx4PWsOA?GQk;pSWvjXd0> zFLg3KeOfc`{*Pl{iZ=TcF*4S=_t)<+jlR2n|Ki=%%Q%}Ut!?F69J@`DUeqe-Wp{*} zC|5698_JwAXQMUCp-tNr+|hY6cFEv%_;v|Ge=p%`_K=btf8~w_G!G?=**>2ba^C3r?U^%J4a{#WBvZa!y64* zG3K8AYnE3<>8pE}i<)}|#X?MszMM03XMrsg#upk0mO9UcrfH+KT<4SAF z5w#7?enf3UxgV=^IQ03Nj%I6~7*j^|9MgtICD2wPE<{WQrCBxscEWor2~TsI+>?Js zSCoy5yY<66?S|63xq^SrPS|q&hB;p%Ve2ad%V7NMgq=$4LfEIiv;<+}oQOXg+`oXZ zKWB+pl(;V+b9X_hjuIwcR)C^a8AAhV;yrgjaz~jSMUhx;h7`#+o{Vw8gpAKZpeR;> zw#x)%;Xn?NYVh>j3k$X&)iEPg$aaKOF{p@CwP=P^FR790+`Ri+I#7`+>FWP#$a+S~ z->=_8%HONsL(1Q(-~Z0==B%WA$p|TP_y1{9ULoTB97%y|w0z0%PW$pkZR~y9H0GWT zQeDj0%zjs?COI9+7aG;qrX^+t#5oZ!h;wFMO*(x|RW|92m&vg&Q=Su+C-SsJLz`x% z;1i!4+om_0szSbTKUH;?%#Cd?FPUQ9f-e-?fXuRnG)5?^FlgDT`oRq3Q>-uS2&ZG9 z?;(h?$Ge(ks7U&sVP>=l$lbG5wp)qJVSd}uJKSe#&-7iD7q?Up^2AT6ezsJ5_aYOQ z&@AfOgW?V_QeiUC?-B~cDKm`CqK0xth|J#B9mSkTUNQM-B2F}Nan6d+mtiJu zCi}l8;<%cKZGkG>mQ%4oD8a_6O3G&Spgu>V6PcDGQ5H@mjF*|COHuaZ|GtDMBSSAU z2rw-WWp)yqMGUnyO?{D>$iKp34Br0iaAs<|UmxC>oU3irRFkeP9?D7AvA)nmjp14o zHFwNUXBBkb4znGC@N=@Q+L5OSy09+x$rdCnG$&6i5Og*fV>6YY>$tTNbaXD^mr zuC8)hAt_g@~~nBZ!S&cPOeCBUIr^sbDzqH!p76EGf{AK;?%@)H!|-NtMjL*tIiL!*U7NPt8#cMdumwC&$F6GQw|HC4a#s?S!|FZY>PF$orKN~ z7i1}fyrDE+nB}27%IQjErOZggOU2sQwHiFgkDV9D{-`elxo)CTz*Y@pY%9xy{3sxU zjPrz;YCXtcVk|5HJ%VF)#yGz8@wQwVDSD!LF2@wi|MtzGtwnK%C03}qFSjy-xJ`W$ z&$IK)h*oXp(StoqK%ad;4LgdMRyrm#aG3$mTaBbvnU@z}ERUU@w+o&RcKian!VW8K ztCmfSP8q1t7%~!U#X(f>KM@q&bFP^`kR|JH>nL7y+rHw0*$7In}ZH{umfK>VdKbJgW>hil$BRIoC} z_ye+X&0GHc?D}HUOtI17Rko3${9RN{L0Q>}C_L}@=h=eihY!c$g@%8jv*?Agg~Y$m zSoDH#gT|BasJkcn*9G~53qxIcq-gsCvD-gIL<$`ZeN^|< z)pXAr-dQx?1%8@G)Mzdff;Hmq(Yr%ZF+eKq@EStfri()yV}l=<)Ue?Ae( zc2+d^C>h4&J2Aq5mLo;~wqi`bYxAal+BpT&2idzx%NNtz_=rdA4w4OFER<@bZlm-d zpZN+8+BkI%QaG5{6T^n&FmTVR-Am(WexG~8{s)WByJ#&wL`*JD4XV^C_Z3)C0Iuch zh7WElT1zy*d7C_9k4cq~LskGPg{=FN(B6Ov8VmTw2SJzGnYyh|GE{!7FRK^!(12Mp z?9H%$RrAHnu!jft#7bY(IdWgI$sPS_ByZ-sAnTTuuibK`r z(b%;`KBJhOPyPA{MdaN71vuBT>zr1>M)ycnaP$#-<78Fv{HH0n%suiBzG0br1%J3t;M$pzWUL`{TA zzmpj%Co>kx_@JO*MZW4_zVcw69XwQQ5SEF5f2XBWkG%*P{+ojHeB-|z3}_pFF$@Da zz7ezefZe)+dqd#6JhwPqH5~83L``+_rf3etG%M^F zCF+9@y0^h{47I8y?E|vLzJd0-w_(|C>jkt>;4IP`@Hc_Zh@v@kTYd-grPVTeS`vE*fkU^t1Ve@^lxf4HzjKdG8>L z@(vmMcpX&pI=yTk1gmuC5bd_|@f!%hROiQknjZT)Ww#D^-RQb|bN>0agN+z{$KCxR zy62UUN&`%bgWQnLmt%BM;SC*$6wrET(BFeE3|-JOkV6;fqR`RvT>$n?YAdG&V7Kw) zXoZ7p&yQVC+7&+0G(&m-Pys>6pgEyYMWJ&m`0o)xV+Wc*CGKQ-m#DX6H|84;V5i3P zsiJVAbj3*xc6EU)g{LJJetsev|Ib<6TBHReyTi7K zf)X%GqUW}BxFi7yjizN$(q@Sn{B4^wT;b+jS6aR6cFByN(bDP%g2}BnKW*N!VsWs(9s^b8rjX1QO^)#tRW0za78x#Ff-#j-K`C z(4)+Q^)^-!TKw4-dSYAX^ji)}jREbb3cnJFQ;pnzV4hmImu|eRg`SOF=z|3jXp8o) ziqygeE=xW+nby`%M80`dUi>0#L>Xz(qfnFWl=*FN+bYwc#qzrG+vp8h9PD$PS=4#< zS_RABryB2kh||k*SXgp{oyK{887vGLZiof#AJniwevb+Z;6R&m*{_nkJ7TiI!;jH3 zS!%Myj9uU=WCcLp>M^T4(Q0*abs#JVbRl68djxt}w+&gzM>ZK@X&H{;yd*5bsvsvQ z=f`sL@syo_T*^XawL}u&o5pyvgwzSh3Z{C&d@bV{ln#lZ5Je^zMR?m5jdlfnhpyRH z5gXL>$>b47p2)ZWhk|1fZHPD$jx9(FJbfZ5uii8%+A$Xu>IY##Xg3y!p*qg2{&Lqh z)X%a+Sfehg$tt0Z%~Dj2Ob!CDMnK7k0Q7DodUHX`^k7Is!%_1QN!6r5cWuK^GrmDe<$EIlqc2 zggzdG%*(={Z0sclsogqklTY6;7{qO!A`DoQ(3FCI4TG2=m&Bm8T>6Hou?1aN8j)TV zsrrFM#46|eEk)l$JvSh+?x2&JQo>rO!~PTKLPv-Y6}-dMBg91ctA}yW1glalYzi(r zITku;*0%}kWNCfVA&)u^*AjpFPWH+Ajzkj73&@1V9!d}rj4qyXL0NfNAz3vfYX20f z@hNPEQ`fjYkt^C5tp)q4La=also*Eieoj5-cjY3|-)M6Hsm8%3@IHL6bG@3`M+WkV=x4BA$dR^4-q76CI4` zd0rg3xZYtZq)@K~i;D58dV_?9!>PBGPx^Wh0L-@FxD-x)o(0s|64F#MijykJ^Tn#k zHVzVsI$&h#;9>zUsr4#j)DX1gh0+{LTB_Mnm!k?wQTM$pJ??KxcweG0)sWe7v5Q1% z(9^?+8AV7(J;8{fgOrpJE5Va6Af+Sd=s~6uh7FF~$M{er3*hWzIPJocG_- zobkJ_%o#qb!vBBf42JBVaL)Mif0?}Q_J*A&z!IQsTbDz#m()k;kPY{n3MFq6O3qB& zCMZD;gQ1K-auU(q6Aw1)mpq1fuvrnQ6Avz7J&Qg*tm#*ls40|HHDTnon$mhruSO58 z;Q7kaz|#UA88J$LLSa?SmQYPnR+9qIcG=(}Jvok3Wsl2TE+A2Pl6df-0A{Ju!xlgI zX@Vdf8oUty-WOsZlDW+<+3Gn+@4WJb{JLEg$L10AHSFT16^Jv1V1~w50KUZILo8E<7t6ciN4f% z>^hXaA!1DimRhcX_x}8VJTn47`&d|B<~fF-;hy2QSV&5=+Hj`uw$+FWQFz>r^Dy@dl5r_b)J>icvEp3N6lbd5CA)5ybp6G;-o z_k<|xTRKDTO!?7G(7p%8*Dg;>dx;3wg)b2vS%N@7UG@?7!RC^k+OuHWj?~LlVqG(3 zbQy*Fv7C-D^0Gh z(LpE}wDDtmCLZjpP?zr%u_H+ zrcepe_~{I~3u&^vcbWNe!_leO04RMJy=Z`wSR^4R6TM)VkW|IWr`e(d*AMzYK~Dx< zpg0N?V}3U0AzM(2td_%g!+p;N$fvh(>A)=iW6TA5Lk>2)W7|!Ptpo)39ppGUcgGaS z3YL5Y+}^1zX;PFxF9c8A3WeDaUj_Kw-6V@(H$|Ti16uQWRHFi;@Dy}uk(>Jgn=VdYTxqRg4wbo=)VMras(GN3*4`(k2r9XzzEP7p!ND?fTs0peo=z>RdPd#sqwEN zkumpy;Rst4_?Uv@Or(Y}|9Qsz77hPq)UX}tO&a~9F=xh5DQU>(^vjS=>G!UfGidlF zr#BJ$rhQyU8_3HsO|fkMDCBBSJlKV^8}b2iY%x3h#eXu?ezO6{twEEa@QLLc8IRTXgi}));x{uR@&C+~K%b@4o){CqC688j5ieW8O(us|o53^_!Xf z){5DE;5COKwaJZZJRz1PO|IyV0TTUXIpIGIe#kHcQWROLSo1OW9=JsPd;buJ;*$4* zu_I(U5EaC(J9rhnnPUospazrjPwlHhkvB2$B5!3bg6w%^Js4Rh9Vp`6_4z8$N@S`| z>*fK66#iu6cJQ#Czf+u3LG6{$>Pj3PU9S0UX4iz6<$e=D|K|wG(U54$X}`O-;5t4gO#2PR{8{1EAv;0%2o>Z zw+Qts^9vPCiTj{NV5J`c9&eU5I>%{vHWt7XAX=$35X7;WC#8mQC37MLIKhO|8~Qp| zC8_g^~%vn46L3h{=K4G10_cxv4uL?SU1cDHN+HsuBowES1(2MOBU= zrfUn@#O*~Vv#^Q$r>I|2RfarjuHX z`O|MgE$oKc1YVTVVoE*tBg@Ic`-`cWe3CxDn)6vBJQgSY*lsatfi6a5CUYQOultIw zxoXiA25%WbN8*;LD1S7X@omcT6iQ!J-w!0Gzl%^ zLRE9@5A#mT>sDZiZu8s@R18Ncrg7RpkkeE2>9D=V<_LB9#yLPRb_q)ks@vk4SIt<8 z7OkIvfke5$Vqj?Gp{Q~aBr5x)$%RY882iTFyT(`hv>nx<2}yh_dIBzP>2))Ed~Iz`KV!kM zEn;Ahu!s;g(xqmAT}_H0PLm?4l|En829yb^ZS2$rpKx2Y!Rv^?_pVW$1VPwgEDK)6 zXGb2ZEjk4G%qUVa!=uv@<+S#!v}KWyi1UEys76LqcM1np#LmJ=lQxJj^I&QoMSIZ_ zhYz085|-a5mU?kcU+Ev>6yHOffN5 zm}+IeGGtk;PTlkJTVl`{NXeFqxjbg>kjfJVJXNv1 za-N9o$v-Sr>LNh(D9pYix>TYsp$Llf-GOGAww^>wzs}RnDV^N2%FnA9Pk5Kf&z&|c ze28&RHvoz+sPLu{Wd6BMOZ8L;v!+55siq+6!DQg;$w^n~Qj*msju0rIYI923M;k}F zP|kVC!Rk?-kMAKli>6yoAMlE1&hRcbaQ={3crAS}Z$8M<1&wDKsNjhYZID8*Duwro z%_#DGmWp~1?&hyz3FJKWn8%N(=OS39q8>;|!wsPukTwFLBBNYMR>p^i3;2;X7Vx9Q zd?xuYN{i?m=S_=)QCciKEh6B{(F}~N5nG0hncXp$`VSVdG39kOmaM1lAu~dX5?gg< zJSRE_b#xYn&N>1huk-JJG1~tNEAc!k3&H$C+}i@Cl1TJJ5($xdZi%#LWEF0vVIK-* zR0z$jFNFl)SE<{qvY3OirEv;@&6Ov*&2EYlcSfO_DWh_$R2zo1_b`;h%8dkWqn!LCLUYdL*S# zdcVm8$pw=Qh-%3|?9Q8cB#xhvQcM&&rVg(d&j>WqDb@;rjTCXU0)T7SUPAc^&^2r? zp)3HrQqx9s>io&n*@nhX^f9|KcY+Rnru1XUSS?Lezy{ZeDm+rzU%0lC!?hBYLcD`{ zFRXgFW>VGYl_fH#YxU?tUMdgzsGkq|IC`<9M<}c7e4;G0|8yPi6VFy!P23eBAqU(k=uaDQ zq*^c=m|}DXQ{olI@xzwmGP<`cB%;1r${|aM4xlVV(mTeyaM3q(F3s z>0&9ua7TcJ!~`qiT+GkOWy%by)0*=O!Vot##2dnBG&Q_ys~d)Py1HRlS64R-X}L7l zc3ibI=gckK>ok3pD*(UNBjqqQ3|bDVqfBXNdyeSInf^wvI;PUCkkyQHDopF}JJU{i zVEHGt)qq+}bSX^^Q&1Z51ddY_JOr@J=8JTDZLOCC@@RrE(6$g%Q74i|YeaHf`RrRI6fTmw0)sU{7RfR@L!)VC7O8ZA>^^&6-plClJsEY35$!@hk#i&hhA?6rJsH0 z;Ppnfo0EGJO3U50a?1$yUa|?P6SmQwWrkt2f#td30hQI7TK0*NMK$X!@<`Q{YiQ2a z)YJe#=)Y)DUR^^Y_Hh=rujiB0mGEesZR+!#1P8Vz@{sh*L%Ns!IU91yG%GgIYRW7C zyhwCdcyaM^fGD65fUyFQUaACG84%&55@1r1DM})R*J)y?UNTCa#;WW@Vo{Nt(HP0@ zrC@6CMO!5Awq&UH>enaFle7?d-LE2vi7I&>D#8^@Y6xuZsy;s-81EOm{1gEt^I)6k z!LM2yjkVgphML?RS}m&?VOwzay;uDrT5k@uuLO^C8=Wnu#|NB!_cBfs4Cs2e%W zDS!}ao8FPqgNYofLP?+HOFRIy6C~=fkB@VV!4|=L!c-!ZXuk{yz$dafFA0Z87;OGsWiYVFXOn|Me=*YV&O?Pv|~T^#eYI|SEycMi~~ zO(6L@gtxN)YprTRfsl8{60RIrTI?GL_#McZTNNrz!Ts@|%LiLfJhI=>S*plvdAw*i z3D&(V!E;C}geweWvzczoUw0(~8Tqw;n*CrMpFxS)w^nh%%#!^XX`kUv7H|2s?6VkF zRP{wy<{Q1$W{_`G@KUln-+CpvHDt-*I>8L(#$_TK3An>;IJzd3A)ZEV^og%SC2Bwh9764!nhiiLD~dx0)ovOlwsm z+J%G(1A7wXG5#sgfCvye*Bs-~9h|YeU3!!}%K;ItHE%IAmcM4ZUCEGeRBZE%kzAF$ zE|N0{15stSBg+>BWgebLI{-ZPW_pHOQ>O~Nk=_cf(0!EwnaF-4eCRdI(AL+7X#N8A*Q!s-Ux53D=Yao!v^frX=X>R>CzUL2p-yaCp;>l`!_%yEzqLgjOvE zQOr>WVl1RS?V#1DFE;99sp0=!W|N&+?aNEN}0 z>IO>EUC|>1sW`^ue*N+WL*8_EJ$I5zM%{`Sb^B#?N`7O>w9621wmc+3i6|%gYAS)H z(^L2dff2+EuiKi5^akE+Ue6d~Yfs{4loF&ZlX%W3&HCnj76{c4BWLfBXFqLC^X(0u*Z$b7_cy!RK)-mcvvfJkbZPSM~c@>}d zw33l&oaj~crkm7?htL$<)ZB0V?a63!6zzx*6Rth)9v|K}9Xj%}!WA>%Gr}GBr(lA*k#$jk$uvcy+J)B*mT2s=!fwn-ChU%s%Ssvo z$sGpQoJdf>h8cLav;2mO!5li|0LLb-^89rRjbZgi zf;bD7@*%x3pR_DN94Z9w%XT&8H`+R^F`8zvK@kX9RsrT=MpP~cc5aQkd5hv;c(N7Y|!?JXniy;3to5R=d0|VI?llz=Dy-KR&FoAFxCB; z;SIIjim{uYpOq9&%XE0~+FWuA*kz*(Z8c=RBORXd3_%}SYgnFISX&d4-36@il~AV% zs;P;{>#x>J3h1#WOv4zMphWXfS@MvTXs!w+vT@z8BlR3{5FP-o!&*V|oxO_&U6Y;Z z5wLZ-#&f^r_o@6==zGA5qXar{G3FxOTMvYlruE*hZ7d4Xhvt=0kc#_;$RM~X(2u3D z(WsX8h0ex;U`j}2oCpM1c0?8oMf7R(%iiV+|jqg^T9^AVhXrHS(eR1dkLoC zbqULzQoCrAjDJxcNloqsU`chRA;rp~PTEt<8%;EW>OM!msBW-ul)eL`Rl#|qdcw+= zT@|YX*gK}aaxqkaEx^$)ViO7Cgj^anN(rMRmD~g|^l78i$o^RKN2v~sBq?T-@V9DN zU&DL}4(%)x_b79_+rh^_U_a{t-8}t$rcgU_6$<@i2S1WXKQUkTZjIK~$Ww^pB z3MF%}ZfSpN1Oad>@4`PUVVl_pmEOFWJw20sbWHOv!j&aH?r2v-xLlFH$QKVE9@hNP z-8a#S+Hu-WSkE=x$N%tdyu`8(a!M0-zgFHs+mY+Tu~OP!8i0~u2B!PbA5nKBJF{Bw z{H#g+hGVoFj@4d}XboAr8d?wrg3&@cd8?Uf=8~J(_U9=yenhUqh!CBe^7ONJa|JSF zDmbhMASL_dbv7Z&)~&5GRa{o7wS-y@aH?o&o?Oar)V@4Xh{o+INekwyQc>w_pVmfjDdmfv8SR_gNvfSEBjL<(;LW zkYLnX0pT_*_vnpD-e>);V1kn^LMfA|4;VA%nIDmB@gKm5puAR?9+ zk!?$i$d+EhEh0BD92YxJcccIs8+`+WR|Oha zISAUYAH)UK{pf?=j@+w(3dFkSbo0pF-}da!TL?_N_(e)@+Z;%@@5XE=P;(Wq(Od;x~hGXi+Duw?P@s z(5N;05ERs>^Tf6FqWSKm;QqCBSfO~^-`U~l5c{-NBi82)TIe*~uhFBM!|z-9h0?`~ z&%ooJ7qM*J!H`h)l$JL?W0x$NrAn(5Y+dHLm8G>f%0wBf_nuE(;pG&)pr|pCL@_|7 zaw#>}RsGtb@3NG#C`5|CXF~nZ@?Q>QI?dK}W0|Yi!MB_PeB&Yuwjb(Cc7lpk%#utw z3!Z-F?${hWnI!m5$^eNy#KT0$dkdP~@p6)VoU9N-;t-z;h=3?Neqwq)yHld5q9A(- zm`#kLTiNiJI-tpVqX`DO9N&fVUXv+ZVv!ICWJn6tt0nr*@;j1cjIMSU5{n&?r8Xuj#|_!HH^%t;-+Is1lZ zc&PQ7?YX(xxw*MGY7}!Ki67`qiR&xzg^S(4|KsWwN^lPjZ=o0WRcMx7$ z$eBsBpI+tZ@AK4mV))sNK07n~OwlfuzA<)p>vfHsU-rNEPbzFF!PXbK_2ashab-S7 zeD4`YQS4#*5q6i8Q32jH735$%a+<+=Q!uKGNwIrw2oZZ?GGs*RHWVQjLtgk{*%y;4 zwhO~DpaiiGYkNy>4`V|@LP}G_2D{%56_}OyE zM$ChgtnMG0Qtc7=4~dP;CqrfL77KgEAt|-`fY1 zUI67yx`@$6%4a_D7Ok@)s?p=M%GifO2_c6rM<#RirD4$T< zs6^-b97MHITo}>5KZ3%LvkXS8{`1C(Rn62}RUPLYt)PTkY7)kVNED(NFd5wB3yiti zUMMD{Ga$`4pm5MjU&f3Pe!{w0PkyxUNf-9CO)NaZi8A69h*!SWz|ToG zkszQD`s?h|8&DhPc*1+YM8@^1WtfOW+xUF9*W!j3efyKiAyCh}3c6)QBY_4qk* z|KnyvTj3oBzji1Yo}*g>BgL-@~Oh_inV$^tu#m+SzlU~X_`J@(W zlIDJb#lIH0$XtBy+N67XqWm1EB3oN%M@yUb9Z)AN|;Jd!#qqg-1*c$=dK=o6Z0s|}Qq z&O%spkJ#%dHmgY8Z$|qjrqd+SpP0X$mR;(fPFtN0ka0MgJEoR1TJEpnxG@@uvyY{m zfF1YS(w@zoD$4$X46s|HZS=+Lp*xEnRwde`rU(p#w?4%p8&jy1Q}eu%^;S|(OLI(` z$+jJ7UNydgcQ9bZ+24|_GL}wnU`5)7i9mx2M(`r&Jm7inx&!@56!>I=YwY(|Q|`-# zLzPZ594n%TL%sC@19=$o@dvBpzm{sljUW@Gvexq)q6o>{=O)>3ciRqtl5bFeA#d-D z!lkjd@5A8R+ml_-KaC@U9yH97pE|XL@s3!#r0BUQ$iGdTricoY=a0B{q~}omyodnC zX7K-@pXhG3gscG8Dfh%exUcL__Bbw!Rf5+DLr}R5dWeix$56*ad?FS2L8Q`=$_T-W z4BU4j4k(v9B)0Utb1fk{c{)g})Akts9DAal!dxeNG&)xM z!96d=?^Fi(-i@GE8{ir?u@3q{jRX?2KUuA^C-nE+{!ZvyY5iP2o)_R#*VArXVLNXeus-IZCD!y3=sj5;w zUSCyL(-1_&acUH`U4pGbHXkpOk{Y!DY~n;qhYvqS7XwN8eoOc?c2lhpd(Hl!E|;RA z!s%LYdg?cjUkUQdOUd4}VMmFU7YQ#DsFs46?UkJn$U?EjUY(^-Swe0JX2Gk2%#d+x z6U`-WI-pZKH5Q^(9nVz(g9v1R8$B(l^_*5$GnRERuQj%R6a=0vy6bODAp@%Fll9d9 z6^V+}rV$a47m}fU7UfJ5+6@XaH8Xk6)A5kcHen}bpY6J1Hj|yVDLUJxfrV4;V>X!5 z>?=gkCz8LSDSLn)uUc;VmQ}BaAw2qq9yK(BKyT_2WLrm(t>!1}<-~ncFKeRf!$ARZ z`~ga+Ln*AGHG%31q`5qmtKwxS-5$LRYA?TAg5vE_o$9MzXrsHveZ3wBWqEAKAYq)L zjS%Ap_m>copV9H6WNU-vxmZV9i+|xeynrBrky0^|gj0zw3B?+rwS&T7L@0xJ4G860 zXqc~~YDq%mMLm4)AhY`tLaXnIlw$i5}N}| zl3{iTJv7JaY8rqAGfe}~icV$%d-Z8Rfid)0MhlZ8{XK_tibsV5S$=E%WRj+znsYq) znbd^9T!cK4bc{sl8Iyy%>jVV&&!M<&^X?8^AAurmzft?Us)v3&@tKlJaWhd-l>I@| za+7~0lG5&nf{WOFtD=6}98rUP#=9IW8Tr0k)`nEj?54E;p`oWMcA$;G4#Wbx7#{wG zNs&lZ7`yjTuM>GhFObZnoW^=M8CyNkvdzK{7~TyL*lC{iXdo=`|MHq6oFj7pR!t29c;&kV^`c^-O2NdDtU>8gWp2oYq^w&i1-LL8}6Po}^B(qCf zs+d&-n#+nhdceq81iX2CEPy~_oh6?}#&kp*Ak=NIQCgxj#+(4zeOnn6iS#HJ?TpR4 zW8eO*$X%G-F@b46hDj-9Qsqg}d9$pi$PE!|ry^FqRVhi>Za28yQ@;zb{PmQ2)?+`5 zujk!sv|<4!$y||)d+ng%*+LrGzKO{w(I5YBlEid6rj6521I#K94BWhp<9{eeI{-g< zBl|f0q!I7-f;Q2Fu`{%xPgdz|7vSq1p2F= z5fPaFtB-+$F4PeP@d~m9XxhDW%Y0sM8PQ>?C9_*Tu4!%rmFk=_hg1L9NY9f1un-2i zaPDX)vHnB=gDkk3rA>Ub@?8iwjNx710&QzN+RV4&^U+mEg6~C~Xs_Kl0b$@>g8n7aIfAskw%7wKoMWkzM6;v z(uYReHuqXEhN(NyN+zLYBx5+0>=fkuh)}|4mxKcO@215-Q4LQf1e^x)7*dpm0R~V@ zS07MiS6gld(Mf$M7++=~6A4CD1(7Gn1U_h?OU$Y<{u38r24{zx+;9x9%&P`R*H%*q zOoSaz8)l%UVXhiv%U8m^-%7XZpFt-yt$3wq}K`UC~Z{@Tr&Z8ci2CAg>Z|Mc=*S-`&x<8QVOsa_$7ZZ|)sTVS^xgoh*M= zJGlzT-sjpP5CkAyb1$#4^uoPP`ht$AA5GaNXg?Wsc5dS#St*xRKd?$nV z@H=j>y6?lM!_$^-I5r~P?G6K`54+3WR!r>6CvaS}B5&Qz%hLVsFg+r3g#Cz(dyv1a zB(WIK7P1??m3ANix`5TpcS4)yO>|?76>>zOC+wQ)RjeSI)4R6J*JCtWNpjwhF;RSx zxA*eT%4;Qgrl@Cyis%JVitOEK2cEq(UWOjcS<1;;Oih@k-JRcHk}y9MQ0swXTMQ~Q zkhD>^22xAWW@<3aX;3Az>iHjAmO=xJ_l+Zf#I6KPL%_&HR6FFz%>IBKJ-?s*3M;pgl<7=xDue5Dh&d8_N8`UZm4b zDjtyy?-40EAJIzih{V=w9+3$P+VcyI07@oEXySP$VT1CclgWnL+p<5iqoK5xpux6% zbA=o-5osHjG6@5Of2V*T_K`0Sl96u9^o-qvxsC0s7t?F0Stk1SwFk&J7cr-k=E#eN z!Hnd9ZeEA5o3%-i1b2`k)U!ZK?ZTCsH{Am-ele)1Ifv-UHqHsD zV>ZD`h&J;T%vX%`3R+@*0sdP!mX@6eWWYXhPtue9gH3$j*f&^XqjTH-eM;?_&pcRM zNRE!;qCf4|4d9D(x9xztCj`*@H!<9FWnbt#m>k81ZvHL6l+KX z_JEM&dq{bVtr|h7E+Dhx`C8-x!CXsf9#BUUgM!(NYxvB=LvLgVb;_g!`B2$v%-p^* zV-hyOwbzq^=n1g0YJSitzsyN*2>cB|Z9o@vC~xw6+aY`5f8K;oG(bP$di1) ziMRF|WsBd`Q!u8;bB0bf07znj8G~%8Ey+M2Z0#E#=r9lwBT}@Vubr1FGK7F7&$3k` zmo$g#c-Q$ho!0>42FHmC0 zeZ{)a`E_)@$!V%ULP}~+CYu0WEr1R}h43#CK;qq&R&q2Vn2^rEgdqn3(z^D*0R0;~ z2%%po+t8CDbn4CWjr5RSk%f$UtR_hc1CuVmF*cZtjS{$7nsu;;%zz1OhfJE_ormR< zt^G10NwhJIvZ!gR<77o|Dn9ltTHU2XR~WqxD2%Sh$~Hn9J!1%6D$P&$Bj$o@e- z?KN@$kt|pZOvnNa6ZkAu&jFqmz@%aXiKNnVHExgHJr$=;5omR1bqAek&WYWlD*7Sj z%0OAFe_jswktQ?YLAz;;yO`PgISB$pvhYk5ER&^c^SO|zTBLQ0NZdi1;LBzZ8-_^6 zhbQz%115Cl3Cfu%+x(ngMjg|k#v^}JbVxI&7?jDV| z3=tAfCZbjf%$AsHrC)xu&`1>YMr$iIS@OayY*;IbirK)&dMpt|Fh&%C3=R@YV`UV9 z4o1_=BM7<_LyN3BApRu#M7uz#HbnuFl|OPyJ~zzh@VbEF|8MC2!$pk5RFC&FPn?1SO;||1>iF2$G zRm-<(lG?T51w=O~w^krKyeVv4$GW(MfgSrQmM+XuBWgg0d z`n1o&p~v=Xrx?f(m1ySG^8Cc{U*w9$_aFeT5aGEywOrCd9-2AHV?POV7A;G~05n)i z+Q72t`AV#FB)x{}l_=C!L(Gm4K(!!n+hn$GLuMF*17h0?2By7W zVC0!dYCb;-m~S*n)u@=0p3F%8xl3$zIRpJmizbV;BXckAAlMeK%gPq--;vt$dnsz zjmFU`TUfE2xsa3vSmh{yRkf$np3zLJA@IUQpT&i_sdjy$TP;Gy-5Bz14k6RrH&G-p zfB1*twX4W}bXgTcCd881SPE@aiY4%XmK|tLQ{Es;{X7HDJT1w5s>F`65znhQOm zQ{l>f)J=8NiminP-^Eu`!(g=j#9C<536YlQl@b)ceG}bshl8FN#N^Y@1r`z?_^04l z-6567{AKvGvu|Q`_36-nPVxu)ZjOCdsiIh_yakaCGB^UQZ5spjB+?70uOjyn6&|={ z|E)Q?EPTf!t_9*+hB!#!RjH6O8ATb0vOh`qUAbyiG_C7Z{GEnYw4R(urdF@gnFLHv z#>JSJ-Q?9X{S9t>z(Q`21c3KVtnYTaN!n<(+U+s>)2aSgjxeZ^biS&}0)?y|CIYLL zg^4}bAT!ZBHeDWf`DK2QeQSJIWXlX~lAbiv*+{Sg-(Q;!- z2hrAUyEaE%G@uT41h{N5=d>Lrj0Are*8`POp*y=GOHQ^cBG142jhkamH?^9l-}oGb zey`S*^?Map^lGiqpeU%229A-RokRd;tgf2LyCwyO08b<<&;|_QnMq=4(0Y|o(2gbk zgT#dRdT%B zwg^si`Yx*$|DWDL{%EUDe#??6(B8#Ki-mM6QqT^+E&cKnw_2%1@%Uh#2AIxq`k_Zp zf?`-Kw^LyUwlzYH*f}4TXYLU`aefxtjGIlEdJ=lEk%ZX&nEn@mI8|UrP~4AA41 zcz9xs+7-P9Q22Q@KVae#e!$CSe>dlQfFW7f=v*Fe;R?7f^@PpS*?A@=HZM?d-EDh| zlK=b!$DV^HXk3qJUvK9n<)Q|A5x|a#h!dKg!ZzeXxyb z?`3HFXA;S{Sc3>Gg^+T~N91YUDTSL|@ucm;ztMubjRdTn7XQ0jTBY1a3SL(_L=zs9T!s}NorXQL`o?i_nK%)mN zHp7i=J`Z`;*77udA=OOmii#z%;!X5TmYxAz0XPkf$R9yJe2kDSF-y-R+XnogHs%6& zS9F28wJX}h9sSwp#~Bw56JT13G1!X*S5rz1@wXB}O)U(nQJyg3L)J?2AYvIF`Wf#R zNg@=QZhHx=aEk>)t?$y06iy?_%RDTv6M%->*Xzn~yTfp+ez81S$eZXgOX60oo;H`G z*7&clj1y^TnVEV#tDWD!;#^c=NhM@rH}-REXRHe*n0-<5{bCzK$&@?t`415jDx*p8 zW7i2r*lXFS?Yw5-w?STQ4-Iba`_8*X&DwG4c zqWpJ|stW70E4|#mvQOaM*2tXcS26Z}mUK_biQTRPAiQT^E`<0L065s~ydgeuZisMRhikR$6N96u|F%{A;ias1S|AzrxvVjNFLASM_yK#UdqED%r1 zzg7@8>Qr&ZmtP`PJb!M8!Qlvw@hl&KxL-lsKP$w2`QI*r_#Q!wEIx0lxRVdgLC4ww zuG29S#R$ac2LZ>DVawC;xSZe@LHw{FHiy6Sq>6jb4KbrW0x?t12*hI*#4K{o0`Zts zmPHVs6vRx{=Z)h>&JFRz0*KLTM<7N|4>(3*o(1Bz1$tB22pvBoh+hilJ$Y`3q0>4^le#~$un=7xBKB&PVkq^<1(} zdBrUET`+ts`JFduEDfhOd@TJ8bS~E(h{nKc`(g3^@ke{{YBO=@{Z2879>PUqkfpna z`V(8#$OB(o4vv-^uNpH8yN9i|y<{~?{E&o!srgMlfW=y&YhT2nr?ubN^j*6(UszC;+5 z7HH8w&K*^oRj+3!{QV5HUud>QS zRVJ#EI;c`l4O%LpN|~Xk;@+fK;W2SM8LVW%GM2JIOZR3$V^=`y@OUm7c7AS;r<_fI zLd#?GXVePDoEb+tC(p5}SGf|uF~tA`lHUW-_5Fgu_!xB`S64QvwUx+yZllA+hQX4f zL+#dU^Qh`uQ>90hG6Bk6LLL-hbV$@-D2%j8RvR5_c>q0xE^HVbAA!1|MCNdOdZYb- zOs#T&-BR>DF6Qi*;kGAD&Vy^ar$v;ACafD_+wGCW`bgQs$*_}hVJS(l6FRArf{F?2 zWJu(mH|V6#<*u&UpptH2$xhnL{!jwRVBMHPZ)e!8(Wmwuc(b=3&%4SJhwfJ@l}M@jZi7j2{?8kvyd2$XEG_VMJDe;6fa^xL(+Dv|bJl zKvM$IRlRKL7~trNc>Come7#75dpwf4;(&(|BNfE63o3><6h&667)ys$Oa=E>RWWj- zRV|VW%hdu>{feCvmcD4d4sw^u?uC9)%;i*t5eHmjUOf81H;Kh@C-}*JV`^f0ZXFFHU(FGj@vF;;W9CwmtO2 zq|``Y%Yw{mPF9j9zrjdZl#+MZ5B`E}%&Igc_jDz<#{Mc{nK*4zYO6>+Cn3WpAOVFP z%F)A4d7yKCx47E2HKzn^*o6&a+l5bt+y1r-pYTz5-ry1AgKm!-xN)$J8a8V6gxsF$ zT4a%l)j*Mvj6M;z%aL@SKips&YrQ5^IsNk^;~_r{d;T@ zdd6Ji!T_4Xn~j|xG)7c|#`tQ`y5>{u{ZlZ(>q8q?#kko{Y(4$74UtivQLRN(_|fSQ zG(ra$0quN)Szc{`+&o=?%v29+$Run^_mvMtsvYJUGI6m9!(zBwOz$`nwud<5CA1C? z6B?CpR?<5-^RPkhW1~3JrVog~sO;$-(_NrD6L@h{6SKd^&-*f|em!1k%sF(ZSPx}@Dx&%*NC zx6x$x%98<58w=x6PqJ_MtYNei7YBj}Tx{M$Ojx`P2>`t!F91Q^!v{qoDE^i$$d+h_QN5dQ~Z-qfbt3pFx}@OmPVlCnDjR3ceIzn>((46;sgm5@JFe)j-_A8Wu zH&BY5F~M2(!{-c;4oV8o%@1K#dqfvZ)i^_1D)89-ZZdyqjE^AFm&fsME3txR+OIJ- zQZ~=_pWZu_6zuF-CLsa@8##Zyt3YFNa+0mVWOv@0*wo}^^iQPQ#LAFsXp-MsWuXflO3UON-~iS^G!i-jNb^i;x!EJOBNzN3~SspxE!>QAD7 zB7d#R;h%^}RvI2-K5EwYnND%!Ju^Lr$GML_L}*6~B& zKz3QY-ghWh0os7!dlNV8vQ8W1s8&kr0XiQ^)DhElw??1R4Qh@ad;;3u8ht#Ga~6z< zra0~%I&~P)MzT%TJ$92lHB}Z4%#&iG@?)E@Ws#8p*0r!Kib-nFj|daN?pZQjg>vyU z0`&tc3PLHEgCtg=KfoO2V$qqWNIjPRT#+KHZ$?kJUAoq8RcrU`wW3%KYweD^WA&cv zCj0%Vvhbz#99c#8+V1{(jk?KxZ>lVOX*IHFtH$3(*r-{9AG_a9h*6n~BTo~o#w%iw zD$qa`$UfmchoGFE8)H>18tS+we)AXEXHj@46VBF1M?*pew)}?f6+sEonTAY=9+Oji z!(Af8Ln=s5^ z+!7}g=AI$iz*9N%{C7LgKvXu*Kxb#2XS5`ilIjwOT*n7nDwpxEOePbUceEoAnS+Pv zvAQv@4lCv=_b=>bPe5~z74O84qkNlVSa6!&;yz1Mqg;>lLRt3W-!4)1cf&Gswy7#g z8B%dsY2v*e|B-k$Pj1HXhL|2p)&WZ(Wo0NFB#;FtFu(9w>}BaK1oYw0kCY&j8BfTX zlI{jYWWI=TZsW?B*qm@J%`i46wkcSJ*}6|*-VFjnwni8P>>xL)R?iM62k4mQ$F5%4 z8d2n5u)g9FWpBmymi6C~XH5bIaY$XktL0@&ZcgefZ0;`=l#4LItnzlUAnH-#4uc-< zi)1kF`^Sk8Y}oiJSW$!(DwUAzPP5dsN(M+WEmI{wtTPI2H0WqddV;M+E&fiu%~{3? zc>%mc4QlNIfC{P)08yL4>~(glmRLy4ylT--KcGpqOF*H56$2z#H=D|t5`YyX8Y4V0 zdsz4c%9KpAy}5|~&OeALVjOZZ2(4&_GtUV9#UCHS6)`c|d}YlfC^_2D;x9QLz$~p} zCM4NSJcoAkcQ5Lga`#>AN3>ZEX0o3M?C&-J9Ydm7nR5W~bnSzLTJx$yM8$VhMcUQ$ z&3$TMV2hqoU8c}j2d&AUVn?b;D4jl{nnH) zdH6IV+j~3H3aS!+@gQS63?zFhQnSFXq@zkZZ?0t>d4pDWi8PGz7OJB+z@YlAP>z`d zy-;-XIJE{yln#(iH!0Fv{Kb(B0Qf5atZ~>7tDyQ%jvKA>z&gHNXk8j;(WRbUY5ZY_ zM_U2`p0WOdBBc4|%9a*+6*R}MNgGL|o+Fv^}+3+3J2>{M8bS}4aA$?4C}^hwV;3d#^PFIv;?`FUn@>t zc)kjQF~Dopjr#@?g@f9_dGHMNf{;FLH;zPUwbr(4z||*@BFSt*vD^8Cn9oR90_8*` zxmH#v?3{?aJP~OJ(i?f6>G4QOrz+9=m&cbt5EY(16C3)+uT(H3zEJZ8PBKEVJhWthV33f9ZguoTbb7I}e)h8lnytr|jZk{LpSVR!`Dv`Y8m08((F(GQy==s|r zKXwIg$q85PXg6{Y>sd08;AS^yzgY{ZR$-SNm)(-L4=~z~5rJm4&3H8|GN{}acq!pu zcgg5OeCxKj4l;Z=MnZ%kNQm&&H>>$f_24&aYaldkl1uI+Ui8y6kkdOa)KWX~i8r&qY1)Xg<_|l$v3J?xlkMt)F)y!S&myWZM-|uPT zQaRr1PfTVjR<0_hR)KGS zYoo7=MX7b?+mlM_VV8flMhA&l3xBx660NGSuXKBBL+MjpOL(f%53bU&Es^%wT470v z%9pqNqEfnbEP-h&ON$SK-mk_@RkJmLbhw!gi9-nKu%$OW&88lL77yI{?E7ndvs`{- zt#6jg53jdo^}_pC$XB&|*Rn|i*W)WKE2=>J_L$rjtvg@nT2fpM-}l#qUjk#NGKT(?9czdCNG$(_$&cIpGdju_QY2Nd}(poBC)n)f`wi5-e1fEx&r^UEOd+&}D;_sVRyxBtp)_sVQnNt9P+J63U~ zFTFC`*`)o-Z1;~i+dXjJ&fL$&_|3{Hqo`n3h|(kcdX0@X{tJmJ*-DR!c`T3gojHv@oT! z0Fr&L`S*6-e)nY3_vXOEOak%^Ybak8p3Zv|Gjf7!*%?k_`DEjn^E&RbT=Q7Jr091C+ErjZMz0+39-|o+@qG~N)6`9 z+bQp@s$@|)f85Ni12 zC{rCM%OPk~#cq{*0kd~z$EJD^A2Bm{FZhi$+zIY`dB3_p$vv?!)%_{%+m)jvz2=@U zr|S7>?%Cg|?w{qJ?Vs{qyZPkRJEP?{m)VZ=AugGZYtFr_q2*;tUQhx^eAY~s#hdv^ zTYh%=5SL{4W_g}x0o&%iJ*jpW*%sL2=+p8Bhdb+$J;6oPx??vukeWBD-R$1yJ7PEB z(|3criR?IJpxj+;`Y}6!wkY z!iU^uB;3ya6rzO0F!PHtNx2CnswB()%c}Ad`e@Z=_h;C(!t3U^W;-zy{7k{ID2B?n zDi~!L-$hzWtjHzXwXq{>0|38p_8W}tNT({c^MHn~y28Cg3>_Eht2fdX>`3l68?0&}1_96nH zAfiEx+ZZIw7D@IDxiypmhplRs)a)y1|Iza{n-k&PqKqiD7&E>3B(Yk4U&vz3BJB%l zH;vsLo*F+hpPAv2#*j=g!t1oSTRF%$8zeE~B3DdNKg$m=zm=aCKKd;RZen`m{Pv%r z07>PZ{MfgAzF9=bsU=;o&zBg-$_Eb{g!`_@{lJywO3p7@6iDaE`Ew%Xv#u!ZSc z*aGwH`~H|iN`-KF0)&Af*vSUw#}iU2Lv*blh-LRsUOJ13gn4MTJ8JJez6+VBHv3JK9jspwa1rpW5`BsSkV_wTBA_xNxvX+WG( z*Rj3V+G8s(@VQsC*W{iz9AQ;v2h+Sd?O5jQFw;-xD}KX{tI(MjFGlaQr6$i_crm&W zbTda={n9y5aBA^Z+CAr<^_|ziLPF^(-b&sCJV)IupQE!RQb_GyutaruSG-=J?jf19 zygt|qepfGq=yGOrbv_^=lep*OQx}u@m`sSJY6p?C{A%~Xl&hpf-r>WyTY__cAMZ$UBEtDI&G}(SNJZ?9m7gg;H8HvHYZ-Xy zk#6~j1JbJ)s(^GgKd43r z|3YD3dDQ!&!IZzrZux3;gm(ENw!OO{I$iXWkcf^{w&6foYqKgqL=8ay=e^Di?rmTa zUcn8>PLyMUsYb^=#W=Y+_w;udF2%H?qNaRw&ls*Wv`T!o=bx(>cRRz3!mQ%<&M;?0 zM_byR8GQEkqTl0zo=?!xpfGtxN8j`rpe>Np?&vjL<3Jd+&aj%*iaBvFpo+J%Pp9g> zN5GNT{hZj(*2z-rdF!}W)s1Ggj$vSHB`2)pXsv`51n(TFl{{o6hleHNxLbFma=Re9 zSpVeU1dQ}>aWt6k!JSX>oX7M_kM81Eq>Rv)JHcIv+PI&&^?hV^F$TlUbcyY?MQQawOpBmRxOLfNSmNkZNfWLb1QAyIw#a)8B2Ty zm@;FD(y}Q3u+-d2hi-%!*wEx9y~Qw7Wd}PBRZ;vv;qPh_t|99*ecG zpSAOGMM}j|p_mhy-~#4LG7Zw}Z9LHu%WzNf*jTg281=}_WlVL$tYg`)uLYSU2R>JF zU|@HgD&cIkQyozl=TJ`wd4E}=X=J__kxn4XsD{(zL_9jjPN&02-?4=xLx)KyEFg1X zSy=$2LIo_deD}oR?)nG0MhEq0~qOaPG>k^huqJK{U6g1 zDboz}^aQ8Od+&aJpc(-|(r*^a@=B(RgWs9uIQoZ}*N8#EK6&lTK8~-!0wk*gZu;J) z=U?P-2gb(aJ+DH{_9_jM-keFNoMYUjnq!bEc;&iF>m#Z=YG4*{@A|_J#hasON2L3l zGrqo8yPuwS|FwRPk@E-jdnUv`s^5R7x)GBqO2ysvP4dEV#w=kf9XC)`TYRH~@pXfe z$s?-K%#lh+ZjTI>CPD|383@p{DYFzMH`wsszztFi`t(bZNQn|4ZJx z2itYsb)Nfi9`|wX)s}o^%a&~Kb0Q~KAQREJZI!I5)^;V1jmz;$-pXr{1-aUV)IT^uj)L;Ar9N1QwPIpk= zH?igHk7y4875VbqQff?fKvG?EYJ#TSkeFa~4_FTg*OiF%CMtd&Crpj`C~hV35VRn? z&m-RJtuDd`bl2u?E;9qxvk1w>k_#p>MopdVocNEUj;k4wljNk7&QCB> z-!8P&wy)Z`K}J8ei39}96UO_n!B`{|5EiJnc*d+3GFZX_BrCSQVXm>j2w2LC9Kupw z)KXr!YdjmM2BJ{=hWW;V7qi|Ai&=R>TFlK0Y;dSg0IkJ#LDLcQ4!_NUrYl;~*OS5| z0737yoV$}^KA`G0-h8Dxeu_euOVxdU3Ss@|B?%K!y|H@Wk2zCCrRq6udpFC@FRH7o z^#pj3+jKqx_~g+clVCHM5TVd-i1F7hsD`t1Cp*FBs5+sU?vl!ge1x48&aKD`~O_1<3C*b>ZF^`M#q z2K9FXx-C36uTFp9WGp*1uaV*Fz^CxG{bMPfryz0CVDHaK(B$|4+iPhvup=C`qt+pg z+EVLjp3|OM_j7&;$9p-ld5)~{>?UN5@xpR`d{MrS_P0oVn$>RS-G5r2i2|CKNP0Dh zmJjEjKoHSG&{^p6{^GwXHQ)qzC$ArxOau;k&5rCT^ylN!Yo5sUH0cVT?ScGJw&Kcm zJ&r(O1IA5^m*ReR^UbiAE9Y_IytR~gKaY=5L2C`wrh}2@4hE8svC&ePt22k%?6Dk; z*+#}SBdHDm`EGnM$_--?*S;9WSsXx35K8ch{H3&NzCSB>iN?n`p?N`z7C{1yc4Svw zlRu?VhB;Z@Upyu)6fKS?aSPQmA`g@HW)S7#zVu1V=iyAv?7JpE3YJPtKb~KcpNPMo z;x}IF(WB+SshVT*Sa4t{m!0EDm002UWKLf>K9#~Qnfj;G@ugM9W`knDJF=3u0I9M! z>8GIq?0#C<6ned+Zqi?;l@|BQ+@|h&$W12&(%3V9$vxmp?!gzZ5L7u|1dnTo^Nk4c zP#86~4}=?tgJ5@0W?P7BPhG$Xmy+-g6*0^^^~+|(U563ov&wL%kU$G_mS8N{HUPhY zpYXd^4z*98E3(OpCQsa=pf6W!Jdg0!Hbj$w;XRyZ2UXiNg9x(R8aV4|1K1zeT!9$g z#j2UALaiDt42#QZ*tBbB+y3I8n7DQDB&(imH#jt|OoL(yU%-Y{_!4jdaQpidy~j=^ z9Jy?Ksnzfn3xH4HOL*=>2ypo*K&3$9aDS84VQ6XaPE3eSmqv>5WKro z)7>XB1NG1NIi5sqs}Cz|}DDtZnLE(30HPxlo23;k?o| z8DQ?pM*q}WG?vfl$k2`L&qQp07Hrq`=e+aCj_gbt*5wOv{e6w~NB7v>B;ByxSCF1P$%(9%`BSI5bW=m{6)Xkld8LO5$7X&Vm zV~=%nJJzMnSOKfY$XLCi8LP+0SdB-F)wJjNI7Y@A$9PE`V>KL;kR;Vd)$-&GM{D1} z1@SQC2(%wGMfyTNB--`MORveafeIqUGKX!~WF-eAEOz9Oos8{?RcMgCjHKbSy^!9O zr~j((^C&+NtK{_ev_#lzV-YTZfz1U6*l1dsE81C95USzRuTFy>^)__WL^S;iR&RCN zxF$HsNL!DCUnkS@A`y*?Of(WjC&)0t{_`?Sa3*ShI!DZyf22qY?|{bRk|2Wl4oSqg zc1I8)vVGy7(Cc<l09$m>Ai$uc|L?;KW(+fx#mF^<;k+ucSPH>uu)h zk3(zd@Q%C`IK;?_JPWW9F%My2zJsaVrgfi`ZFrWdnUssoJGGFeb0gfS-sD z^5jv+3cIN=b0TT$`K)>z5QYni1jBryzxqF=zKrN9EruM0^hhD1!0>oom4+lV;#q3T ziJjytbs-`f9rV$nfiyTH>73R5ye2-zm^o%4Fqv|SA3C4K>7IZH%R;PBe<6%7pAczq61kRRTjgE896 zJKSeb(j}3JqAr<9Q+^i66%WOIS>W-@5HhIa4#p!2Ml~JHlyp+&1o9G*X((mI)6!hn zrVEUzxd3xObZ#gTex|6OZY(~8{4SlicMBSOnE$8ggD?#Nbl!nwjCBfDta8gtRGL=m+??7wQX#wLb6Q;#GT++oAPgb;fQ{WIHa-eq5aK0@0!D zOs~c1UtXLH$#wq%!TO(Uer2zxwjp&DWX4{jP*ROOr@ZrB;Ee&pp6+Y|j+_v2}Pugp1~aS8(GzSL60cxQ-@zN&{)YNYTc6KwYc~gKn|PnD7ksnJD>a zY7~be4BJbK+O%A}ZnqGvrjl@2b7;h{4xN;5^oqEbJvV|^`IVYvM7LLOl08mQNA}di zS%k61Sav#_*Mk=nL)h=$ z8m+{2!0fd6SuhQnBeR=nkeqNra;o-p@NC$@Gj6=Hc!pZ_D&m>O8EUr*&xBT|DREn& zS&DNc73);;CySvM6#ab%AT#FGhYyKYYfjxYWYfoARRAY1S~0dsK5HZ zc{OVtIeG{XJo$s}iX#U=lPt-?!j)RlP{$#sBvzS5m_k1Vo`Jp1^JnxoHCiV%Z7@ z45V8n04K3*MXItDabuu!d-$8Rt3^1LnXn#KyMQOS4x&A_Ucyv|59$IqN!jH&20A^E zl>=4SRnT-9wJdtglpu+Vw`A3#z@5tc;d;YJ>SkJIHDEdCvKR>2IoO?!DO`)jBGRj3nVx5XmN3Qv#H85>w@wpA+fROb7%lJb`k$CIV0d<*~c)rL#va;v!&h+X(`6@oRH#ymM)c7)(%Th zJXlQ9K|SIjzN$smUV0o=78IBoj+{ zRWgis2qRCNXom5`8pCKav08ew{&$}gjZLa2p$dPX^fOgX+$ie`7D5pZ?MU_cpZAVb z2b&$KR&G&sW@9!C>gTa&u7)EJYg03swU1&Om@%(RmhkfR@agI?$gK*9rU}e~Tg3Y+ z5)F<_)|hq}gzbRe1ocbA&3Ts>h-=2#FFBz-HXz{pJ1eWys6&5NJ8fDb2?8dsnXohbglxp<-Okove+VG^(jAwnW< zY>_9iKfv7yBDMmB*-s?2{b?IV?v}HFIRTa-xD)sozykposqH560o_6Q*a4!T%^dVq z-MEE0Agy7Zk9&Fwek%YA8+OvpjC3t-fdi;r3X<&;0qY+^2bMMa*c%Mc}y33xCd66R51 z64H^2Uu*iL-euDKI^ipsd=F>AF;J~kqmo9!z}bfci0#$q{shqX1$qc3fyCkJLjqcF z<<(!))m6{_gIdUVR>`#W5C}Po*K5Fs#lXxP@KVy+XN#W{wZ@`@#ANF)cx79jmdV{@ zr~+W44KYkXYsDDLlZRVlw^o=|fAboito(MZEvM{jmkUiS2;GExRNG=;UCK>_W$7n8 zy-Rj@|GHgi`iZVV6!Z&Gdc*;BQS!A6{CpNsolx0IvM)r zM*Mk)qs2k60KKoW#ucF)@^%9V1Lf%E?aqeSHZ|n^bv0q+5~;sYAF%TU0O|?tq}zFd zfptdYC+w8*AV5IN@{A-99$VcBEmKW~&}R)9oNBue2$H@q60sO^cLlM)M+Z3yk?jHP zN$2_q&cNmDU2+(P7<&$P%Zw(PF|61e#Kf}H1wx z3i#4@5vl+y(@i8J(@i182QE~D+tz)0;71LAL0rZJg{4@B` z&ehO)lK`l{>vm{?<00)64p!1le7UJO5rKhr%c|lB(W~;*w&6;Z14F&FC+@|yHlKnj zM(0~0I^Ss4P>#ApfN>Ya>qljw2HfT>=p4ZeZqze!$9JXYa30*Uez(N>ymCp2s)O9w z+pYAg+3s46`*X_ zL7Q5Mq3F!g!e8)|zI-@nWs(6#c68Xtyo4%qr;WY_-m6%YWF4Hk$mcvw<;4 zmNFe#1!Pi#WSQ;LKQ&em?q(P($)-`xb9s`vyEL|9$2NZA7*S+I*@G=RmI4bI4nV7@ z(hcg~#4S(7`*KfCm?BRT z<~d|nEE1qbqG?hbB1~R!h;aWb@AVx{%WaEJ9HZ{VFXbGDv3S>DWE2bvM5a+^JftRR z_XH>bL-u?iK1AuCmzPAcz&iEJAW%=!T$A+MdIO1iEXPg*1)dD5BtN#V__CjWTQn2I z9srM!rQLiV*~1e`13QIq#`uSVZ)#uNiM_ECzeiQbs69+~g7VkG2g!QV!}s&6JF)g8 zsDU?$s?s~vjF`fTr?qo;ixnc>FVu#WIb(%_4QTZ2>hy$b9?f)3cl&VqG@mx~7Mz%a~X zc`mSr#ly?xiZ3$=karc>wPRQ3`;5N^`*Hv~v4jRYkuVxD8-^I5F9XA6(d&E)Q(ZgM zZv}?0J=H>u6&NmO+YV*nV0)v?Q)7DzOA7MZ&?Fn(+G%Z-VDO8vHbytdoTnAqvQvnh z)+;wOW%Bf7N+=fu3G@?rQcO6}@mhNFNSM5x&yLNnQEu_a-)wH-544bZ$=ssz{{Oh# z;&;E5+~VPNxWzvy2s7B4zUkcJFJCj<;*VQyam}}yTdWKAZw9w8*u^av@wc8^tUJ_~ zDi56xw+KUpTU_%^=N2B%LK%IRA(SteYG@&n(c?92*KQqM_ zaW#n;_A|yHEGqc<{db?~3S;5GEaQN48V8EQ$*)E8$=$iv=xi)1R{V9J<=5n=wW_H7bB5d^lL4-=!ul+&@%VCSm|=J(O8=~W zy&^&9}En2NIugrq{| zlcXL%jpf4d)x>&*ow=ko9@*$4PV^$?_%Hjc+Opk;Xlc;Z6yzVO_BINm0Y z%FDC4O&p%)yq@u%`Qn!5gJIs9q$yWX<%K3`%5_%teH)TDidB+_bg>L-7l+6j)j*YR zV^fHRav&hAwWs{4uP$Z-s<*)jk47O1Ba(Itr;iXO&_tXd#Sd2tCT4^n%`s&XyCeKL znKziJg?a+o0M-h(9>d@-k?2IGai_%}2p5o}%+`qzuE~*JdxC;zM=|)ia$uiG9De{i zZR6K6cim_H>#t7awUXoi_z}#av*B%R|J3TyPa>7h@#C$y)yO5!+dfZ-=Y^J z;8k1Y{Noe1>Yz7Gzu^-K0i0Um%9?5}9M??1E1L_)d||o0@USmf*b2hlQQB6=y@n@q z;o=b+hcueHr4Uw|A9k-ENG;^n@Mo5Q+YimP2%xSX1B3YQodHH9#xsz|fa8(xQbOK4$?v~9p_ zX~n$-Jm5j$N|C}Ok}YH&wsN;dDL_{rJnPB|8_=@ZuRH`A@t3679lPG8>L!tyfVAgb?Q zE4m|sNt7CX)rCloV9AA(O`;6H6FmYU(b53Q{PvYEbgtm0=lbcEcvVD?LNbK~S8)If zc5wg;mN^K=SpK_t1vs)FACRPK{1!=%T^tI)wl}%cM+pW~;I|2uVV+1epWQiLJI)SV zu%^K@fdC6=V-a$mDS41Z;){PB#3M)p=Z{g9L9wd_U?5_+L+$T|M7WFQB8|gacvF$ao+bs)nk;yna45>oa&K-*z-qGxKd#-ooplvqU zWXEs4EB+%7<+A|#mvfb^7mAX$XZLJ*#9ce_0oP>D)!feMQdP_d4j7eXkIq(KNq ztartSH3w(gDOY{(cl%C5-M%XpN>mG9%e8US`CDS(W8}V)<7OHX>%s8SaRf zF%SX~Q%0UB{Yu0P=_-z?SgOBRgfFV;ytsqsgHWYdmzX%^NRxrFmkmigWdmWaf&l0x zan37yiJTIKLvl`RujwVc5}+WX$6g|%cY3+M?IkpUaZc@N!Fl5h+7@T(K?yEI&UO0W z_r?lBhd$4fmkkdncipXdQOLL?(6_Ak*^gT&P zzaR~iqiDK-vKqU9Sgq)Nrcqj1U|}4^!eo`F3#J>(Fx9hvxFuYCSUMUsR0ON-{0%|C zKQA~*|7hS8$>4Mp9-)ODIH6@3H3TQ7z*Ngrgl24zkcLjIN{IX0WmL`9Un-D1#kAC4 z6r?92r7RC{n^kInCtJZ|tuq!GH;u(6(Oe!X-$xh*vdK zSlM(!;?6FtYEtjrz}Mq&j5Rlh;k@;{h66?KAntm@VVb(b0W&<8+9&J$>Nmau9N^1m z;Q&AO>TrO61APBG;{gBRTgU~uqjYgr_&Wn-~naba$DX4t1pcy>?mBU=?((O3_cWITjn6GYQwg&;^bxr%{j zk~||lMyxqgegykzI)7}mpECW@+%Y}M7v`iCv)8*}exJ#!pYk4*tT~EpRR{&e-%HBF zMVJ-8m#Wk69BXEs&CxhdlwhTB1VWyX@FYr*PxJR1Mx?-};~f2H7x6oUFCaCmu(!Fo z4AiN2Bgu;w$XyKCIrvhl-&ckivN8$|`o;4b9Gi`PWI?U^f0b$Gy9#oD-o@R$VQ->I zRbJmrHLu3$tE%*JD3}cnGh^84mC5F@oU;J}1@0zxt+^*WjFzOSCNUaeu9)2#0#z)ZpZ^>b&s!5lEM3! z7%jjDBgs1WFb68k@_$B&fP5B&c=p~FA?5-?Ao_xf<2m}+-;=2F=$uf)9arU1kU^D4 zDR0i^wL$y%;ZgP1VZxO9#DvXgwyM9=wH(+k@8_Uv>NWGKwGwAoE3|%r#*~g_sA#cj zvmgF6E>gnic4WkaX-g!OMQ(wJfA4j4D3x|ueb`&)0ucER?(V#z66x^C9Og&G zS%}`ISD5HYd-@D>E8=iAvc@B2OV;pg{GAr9(FeUuR7g#bPau5K4yU2)7kesrDRI>% z7M4*SmJzFYW0^GTh{YvRoj(fI#@SX+X|6!)c@b_+X%VJW#FcNJq7;6h)%9$qaW-{t z-ng%Y3(oWTI^!0Q2v=xQeFCWiDAjqe!DvO^u^0p_Ml9R3TDS^j$2S$UT&Vk3=LBl^ zB`-cc7jAC@=>qZp%MBQ)*P&#zOgYvLCHuyiS2OkGs%h#y;r(o1zAsKVv(Pu)Fq6}^ zW$;6}>+~e-R7Y~=ad5NC4M4!r4Z8^&jKP74aeU!-4~qJT^|B=Rg~35AmR}U9pgLxQ z-I^4TTddRVFP#;&nD%*Aso1 z|5p@y&X)>I3paD~c-yNl*A#oZV6G)-R0`ZMcvFinhH@DZ06!k-Icu&40Q3y;pBG&zP|V|5Y>f5v$T+2(nU}(SO_|ZPuFB|H5AgqAE=5ZfFiR`BkY}`{jvIiWgr-*n4N;z*jY^7m2yC0Fr z(muO_K=ma%9LJnpZX&D+Emi`}QA(7Q^9p`AOf1pEjy^^13Zj|o8Dq)oY{*9f|JB(e zdKoJEu#TKRh>;V5$P{piSU znI@*kl_1PxKfbq?-IxF|S*esoo=Ilh$HSav%NO z!G=;uD2n_bnk`k9`G?^0b!|GLU=FuYPV7YF=$eEGb>4Y6gb%`a6W(jm^b;bGxl2G) zd|WfFf^Xiq20<>iK_q5g9j%{=GC7e_F9(sR4E5h9Cb3X}eTyp4SE0%%ph*^PkI)ZW zG!cp{@PCBxDKwc8nrIW4fF?5?G(qh^3OAb2Jk^-kLgneiiJiK)r=z9e&D8P9f>vG$-5=9h!GbiE^q7u@tjeERIACt#OexOM!fJ5(=*BNCw9f z@%)62P@2begz^v@?(@euRuX|l@##Lb4PVYGq7dRsTSdyIdRg=smlkvY$^&6uMUR=B zmr9Qr^Mi!LXJq9>Wtl58f$*{?5_mT^MR;dAgcmaitBLo7U{fpVtb~`if@VcMoWYV< z93uy%5{nGZ5S{n+topWqR?R+rgtmlwgh+@wLBn8S$iqHs* z5gN_zNk$w%6`>L6hyEZ$5h=#b<#=d>aCMLy;N`=@5aN16>lCw(w z*HIloF81j4`Tb6FI2PmMv~boE9)4^wqh^Q#3!b7#cM}&^X3PpQgZBwc#BUlL%}fSw;Y$QVO!`P8m}XSnN1Nr1gVhgvKPaHC z>({Jg6X*vt593)$IZ+G-<*Wo4-`A@=HsBj`$SD&{E;{tz0-a{FMu?faGGCFWRt~nx zPUlKui&>US=T`25W^Yn&qh(H>OwhPX?vjV4RW;GZrq+wS+9soG@?A*b^A9nm(L(k%|^6+F4c(AEW$RH|vA84fShj@~;I1VXdh=+}&H}nXp9B@zi^R+?ScLE6h|~#!XQvOseK*_tvqn z>Rd1IOja!*V+HbPU1u>%Qe$LX5O$dOo4q$C$+Zb46@9id+ex)Sk=ogQ6gmn6YV3(h z1e#aXq`y4hx2?T~;hBJi@t)_~mV*)no+sHpQSxtur)2XCB|s8W=lR81JUyRo4!iwf z_L!M$fK18$F)mnMm_@5YIfb1d`%h#JyW!V~81ParEvfGMT}L*|D#~Tf6m3@VOtYb8 z5R8QtK3CH;1PD{hM1>bY4;WmmI?X2@&n5~9^T!(U5#p+V)V4afEQVJR<0kq5^3>!* zc0L6h(f~Vd#HOBP1d;Z}5G@hi*hZ;MN7rxV*=({gbch<`n~>AQIuQ%2?aU6mab|J> zxB1ZRU_H)DLxdkO zSZ^gjXx%Yz<}?dk7E`KVb)a+#VmAAlD~D?W#9toE&>4onM#J4%R9Dvkh)S7s#sS-O z<8*fCWFa)PJl@Py1t-|Pax;|RRK|3%2H+6lp!_->u#R7kb+Arcy2d)(uO8$;Shwgw z4uo|Bw)tU@cn9eRdr8(jdS=Z*dKn%ARivI_RgNm-V=c;f5|Lsx*icBWWnK$<1y2?h z9#w7o9@R~QUAotX5xTOC7y$h3hq z^jU;Pu0!^H=Py=_8z;l9(l0pU$BZOd+ai`G!<#T`@_w5B;%muY*kI9wTe)Wsk9_$B4+JF~VoNqtq_<>3$T)dU#ce ziNwf=*=2jg8<@z^9`WQ_tOEK0gs;VX;59l|m3LKNPTnH4%ZM&A(#_ta8o*jk)wk=( zWPm*2)8+w$r}*mi3-V2w2b_6=+4+@=d03GnK6^}O;t%WGLnIJ!V9m-NV{@|B^*F`g z0dGz*oo21+6g#Obr;RnaU!DAAK52&xOM=@E%0JFQO`y(vYW}QZ3O>48xxhwTEJfmpoeeI1wV=V)i4`{iILxyeXtkjQ;8& zn~*awQ-jB*`Z$Z$Sa&hgL<_@W2QkBSW*Fy2Inc`U%<9?gQ$*Xmf+f*Hoq@ZQ(FlC} z^DbW69i{9mWE!j=B2yuT9%u}!6E)iW#a0TIIb-Tr&ISfB{a$r12HLdv1a1nviy4j) zj+A4ew5iM46q=Xmf4Xxox=!V-9lU2$uX?b_MaTV!2a`e?Gt;ltXO!ejGz#-2V*tvkq(NowwffFAY&orl=Pbjl~=HI812 zhJd!>^a!$8_OHWUP1IW(ydexzFoRxTt#ar|+CazK0Ox_*MKRVch z(IAGjV+OXn_R}Frnm~2%%#h@ z)P(Wk*L3IJsje*%K2nDhMBg9511Lx37MV9y)GXhknjQZ2P65^%7GD&x#`V)Kk2QIQ z^sc&rcpl!_w_R+1)2{y({niEx}xHz6|E{;m}$G<}K9p5wJR1G*~@JAXX z@HTdF0AVsPLf@j^9A7&Rpq>*$@gYXY$C$jnDpnXjr!Z4RZ-lwJ_;^};?t-N0LFrq7%pb~0xJp-xfSpHUi5&(MxOiDY-q#`*rwf)tL_<4GLYI|!# zZ5z`$AHmrxX_2z2e6ctR(y;)6H`-{dajw^9iuat>3@qia&m1}z1>8Ud{_ znM7h?>5@n-afO9e;Wf@g8v~}yOi{%|R53gY4=V&G`Mx;RP8n7fuw7E2BxBm5ws~Tc z8hNoq(I6alcp3_|@5+k}@-Ae>Sr2=Vd(|c?LlN(fg5SNz$e>akE}3iw)kgh-3v}N1 zU2ZX+*t!4=^st%FI*4JoU)GLxM_o8(Czvy56kP8v$MUbn$HvOV%kg~H> z#04lME496V0v%BjS8wCH6*Uwsu06BHNMR1fzsNEvO92u!f*QvyG&YLYv6Z-&T zVM%pd)IxPCqv*vxDn{0}k|-eph{&Robqzju?1pQyLz)3ZLvFIk5Ot_xAOeKW+Q&xP5`m(G#0!rl-oD~o67 zbIkN4)q|0LxsHJR&g}+vZ6N`9I$4$6HUGl$Z~jFiBbv~bY;Z7z$E!QUB7FkGQXt&( z<J9#`Ts>~6g zYW#E?4y!i4Kxw`sy3VrCs%Mb;9;x3@U}vNfFe620F{R~=8q zc#r3wW(xk9j47`1dHh3nqgqyGLjCG5e?hVulfw;JDxOgXc=8L#3Y>-})sbcTR($?4 zsdc`Md^P=1KePIynm#)l!AgCZ?~AJRst*vO9KIYrwZ@mLBYn;BnHB)mVPAQ+sj-+< z2f2cg0v$`Ez|AfIy&&cS3VQyEztVa!!zKzot7R(|7KCYH=?brJSGqEMjly+)WTp^m z%UFS3j6GbCt;0St1@-dDhE*8)GgNW}K>spxqmTFrLjBPO6koNkPY-f_rU;%t!zmD!FvmX|$X?^^Ew#?#z@aQzbwamVWjCvy;sR6E7jv5o4HB)R zGW^tM5BGJQkSOrqP&=-lTx#arQ%x&Gnm=Iko(A7C>CiDhRD6_om$O5Ct$<~wQNEF7 zMpk#y*jk-2BGA`nZL*Ay53b3d6%GT};-^@iX9Hff3T$G00-Kik*JwsH^njc)Bt5rm zLGRu6cuWkHr^GFJ$ilAy@B#o3nj!-ki$m`kW*T}HHmPF=Z*0Kg#Y92CVVWX<8o&b# zfGU8nVbd(&9jX}eF|7!#4NW=o+m)V%9qEar!$W@rmH3IR=x5C@niDu9d_$6009u4# zprHB+=7F|3Q<_t0ZM6mu9T*lZ(gZAgrb&^4K~gu|MxJGjs?zgq1V# zCmqU*!1i<+Cif{F0j|W$C-|+cws?zW8A0#6&oc3+bQj{yUC^UO3{g$>JInS7k-njR zJIN$Kg=p5FH+Vp4Dq+&{jJ`r=BplR1ea+N7%wmRmRr3D9qH}5Ka;hjm-6I-?{%8|KJ`k^55_PJz^VKMU>s(gq9_;*?axLaAuZVsfEQ2 z#l}q+EZKJekrUGfC3kW-g*QY7g6uldPP8YY7W<>7fKP2agk0cDTi`#`?!peCKU{<3 z79XA)ry~LlB?$L;pwsHJkFDG4>GNsz0+ycOf$`{V;~6j@=G!RiM0b>fQX9zdRpH?w z(v;NRF+|o|4`-s~C8JUfCH`!6nZnXHa45Y6r0&0ovm-yDo`Pb!pv@pTFdO{PnD?>- zJl6l1FR(?W1Rxp^j!sYjK^jq*Eh=mbNnzro7HSF3Im8QcLWjIDuEhpi?V*ksZL?^U zdwYh7f|dQIKC>P~NLAG+&S>J8W1gH@4;;ecEfYn*@MBwJbh03gy8<+hlBPpnF62zo zZ47<6D4LrH(AcD@%=c-kDZ45`H->O2>Q~piKtga*Tp0MIZd}kVBeGA<2C{*E=cOU) zGzK)HmII~$R1M9n(Xknt*&I7I6PmfO?9;Ppy?n5M!uJY6sX2DBj=x4(&m5^Dsur@s{WhitY_*3;np^W?55Bn;40F@4dgW`d*0WTB;7OaSxT(?|ne`R`io9n7;Sp zx@S?i{T|wo@7cjUeRPfYupju|e^}!^#7^J)nC{u+*?tec z>3hGl#yu2o-}{Xh~l>IZCxmmFo%M@BPd{%pL@8Rfr5* zH)aVk(s2lQbq$Yx4lB&VIyu81Qm?u9`Jew2eB{-^NB$%!eoF$?5q@#uM1A3Kkrk;$P!55`E_o^R&2q|ter%sYzqr+(Iu!z8*b2Dm4xyzmePsGIfocCpr$riuK zWP`--o~%`IpP5M!u8`wmTRP8d3|C+=vI^@h@;W7Fs5bp%QMBK7s4_MtQ&nsQE0*7$ zQ7Wij;ptuF;zN_!P!evANu%=&g&lvUB@4x`9atP>78jt*%v#@#J;euaNWvWauw(j%fO$ zow|UtQWw}4DIb0N$_wAd1&85c?`%FIVQ^cWmb@6ld9TGoYb%Wu#Hn$#0Kn2%ns z3*9!Z(1q>c2`akeqwOm%yiOOoy_@KQDi3oYq&f$Y`L!in;K6)Uu6*V4l^3Xdtp#D6 z3Dbike!5i(QB3!pD%I1Uxx|eSoQxFd-Y|}Q`U2cw z`T{Iq`m?rzb-yBW$<%B>;it#S5}j_;CWI~)S@G$j1XO$av#iN!w1PfQT`;+Zx!Srm z=KWsvul6Ljia79-tqF=hycqg{%Y?Z4w7SCa0NUb!SGag4BkQAIU4gC5id}U@Z~#67 zG3!@f>qJFhx8};BI<1<AyBND?-peIyyifERzi-SbeY{1}Vic=SgFb|7QZ&X{u;1VmKRt#r`_0nEDRjTdf ztzys8<<5t4eqK#6V)Kxi|=}6)r`b?i;7^f`e&TUS$$6 zQXgbp1*G;~d|-LlQp!&lsj=%ePZ+6X){U4&=V9Se+^MWYh0bvG%4Fe)WDQN`` z5a+MJV1;G5b&XB4gbd-MJ2#d$=TaFkbGpMCl_l`Q- zzG7jPngqnQNEmh#Z(?Y4Y3y}|}(`po0Rq*)|{Sbj}jsR}9i_9#6EA1)^ zJP2metg0Z&^KN^kUbZ&~ZwN@N+HWWir)^)!O5L^}_S)#Qt(Kl;WgKN?fQ|g&GsQ<( zZ&F_{lml}vev&BClPMy+H*pJ$d$#z=jT5Q|z)D3{U}4Z5C{NA0V4yHF6T6d{ZgW#y zHE=Uk9HKQvK|%>0&8T5eoY?}klv)KHc%Q?9_Chx4!fsK`E0d#HXtqh8;EhxNp*>SNqYl$n0S8?YXgh8did}Dgv%u4>d#fhfAUl; z%kFEftnS(N(6f@B^{V%+?#|~BZrw4)0*=$xGnBf~@ic`&1D0E4;HegRFB3y*C@N$M zx^{D*ayMAjf(Bv#2-CSOKonz}A<8rfqL934h@z`ShyuU!hA2$*)Qca6305b5;Uj6# zqT_|9>I?Mby%?S04VDKX`^D3ne9n?H!iY~sIjH+-q7y*fw0e?IBJU|!3wGj@q84;m z>k{&AnGe6Dr-C7d0sge$1c6P9`9JEAP7C1#>_)_?}k)MQm=qe$`B1(i1ibG5biO@i6;i{Yw)bdna zG+c*MLG>?^+&^?+y9jD8$&zcKmtY)2X-XMHDu5unuL0!-dp1>&&Qx#`ad25DN6k3JeTg@ zNw-KnqMv}J`yD?vW@voqfY{i9AK;CMD1xN&Rp{VCb@4kU&K035NHueShae=%9bs&Y z^8lr>UQ~2!wa-{UO;_-ecNqb@ZI=sBOwK~G35*J#lQ0){n2g1-^ZHD;=u3D4I@@_7 zo=rVLU0EDJG}J^|E~-g>d{{K!7=8uAybf1xL|X@ z_YM0s<_ivZbq(&E%xkVY?=$Sz6>Kl%uuZ@MLekF8x2t&F^It!+Ld5 zxR5vUc6ANcTwO>RG%vM^HAIDHs!8di2Y4B&NavJb(;5;IhPp511wK)xNko=h$k=a@ z(Y1)A@HO{AMk##FxkRoO8LiCNb{~*cqvn2tj9^E6Q`XYSOjt7DRK6xRt3#1%4>C9* zM5IKWWKE9((NepQGem+hN}5Zi-60SMGVeRZICE&)x=F$n!3 zrcKd#@tw%-+nb?eY|M#jFNeafN+V+JG%bayqETx9|TfK8oBDDCQ|UP zOh{Hi=i{e}AM%7&1dE*{$DK$_GuFdI1ImFO!v41oTLmCkf(M~Y0-XKlX9Y7i&th9p1@zJV(J!QpgDMcm+aX`AnqM*X^U%AOb znr03|Zi2$1zD-hQh`OS8oFFE{GKw`9H}g|%c^mWODU;D7Op)x+VO~nb&4t+}!(Q{n z8wa3pp+K;4LJa6gulRQxEjmR!i#YRX#)@LA^=jO&5$$?#Gy=W&1R5fx`7*x5@sNy` z91kj`!$_$Lv^flg2pTDJ3>O_e#LRgu$7!WpF9J7ROYfvKcOp&Q7$2%5$282V;B~yd zt8QCsrQ0BJGJ+Gby3))Mis8tVSEJ=w*=>=Ib&bKai=dea56Pd5m+HZLT zqJl^p8GzJ)sAa;4<(A;n!k<#XdDxQl)^hy;D~N6@HY2i+zoZ=8wUAXu9%}=q>lQ-z zV8lEI$lS8+n(SZ*f?+doMyk!gJ0k^OFAHdksjQ_F_2Q}D2iWDRW&|nTztr!G{g!=H zROV1-w@zC^oUk~gm@CAN`3if4=$9+qIfAGOyMMR|v9rxTQ-~eDYUn~vQ;zk38QJXL z(?-a&GIC%beUyYG?rJMR0#O|){89i1Cz0&bhw&T+;nO_S$C4+8?Zhuh2At<&k*a$F z|AM>--DV~vU{IFN+(cRC-ddXvDdcNOD6sM$lQA1>heytmD+ZkQAk+BZW7xOo*a%xF z5K*y%k9;u%T_dS0;RC~`xEC@!pW#*JN`JP*+SnrgX*tAZ9@=JkAmq^7P`702BWh)g ziq7rPWM1DJq1=7Q--Ahq+$C2t;j_(mS|&pbFv+GXzhfia+TQ`4U86C4Y>AKE=a136 zzOKQAL5X*@6$tssGFFAg$jdB)&DJL}`jDAWq7mhYI)sjUi*?QRTi7;6iOR%X0Ia>f z&#H>`+htG=JeSeQ`W$&KQ~WRSp~-jVE5cwYb(zs4l)$hHg1LuqZTl2z9rg)6TajYwpb zN!SQgXR^AAn^bthheN%qS^4Z{wSLK5Vg2f+*Dv5#03V#AiD>TpI=7Q9hrnv_k{LN( z(CU-Vi>)If-(vhBt1=L93E>d%^^+(=nkg6Lj!@pWOd|F3*nEWHD49UO�h|i2}lvaB@y$b50b;MoNCQC8`{F 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 z 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

-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 z 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�#J68;W!-BmLONEt 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

YCd)a1~kvr-X@cobVceq|mbs zGSn?;LnG$4;;f(cbHF2V5t2!$hv7OkV|VH|K2Qf=Qua7W2bji#ge9ue$K{%$(t{i2 zXDl<&6{0_xy2CCTtYp_bMY}ujxLOeZYL+cz8mxxE#6w8420j z*qOR!QkbgojB!TqRLF}~qj~ZM%`=Ka54B)4&jzm>1lOwiLd9oBX&38%ZnFNRscq6a zc^%t_zD%Mhlc;9EW_45yX8ETj`}`%6*ds4`Np_=txkosT-b_JbYFoA{XMv#$KnN>cGl!Lj0OkSrPRAP+=$gE5`I06}a zjU{5P|48t|3JH;B20a;gY8Chq*($nHKfJOk=%Ca+HMu+j9rIlgbff$R7NiBKVZl!G z?aK;mZ$NOb7N1x-_XME0`$S*>3Iq%sat&ZWe2dslp6?vtS^}LU5;{sC*vM65K|69@ z0tuUFEda|;^J=LBG_MZaa3ra|eLa63(x01jdu-p4qxFbJ5gw=|1=BA){C5Of(p>=*ozdYYkE&_?OZ`U8ZMLFf>*+0TR3Xx0&9hUk3AQ; z5wgKJ0G1+}2MCD-d>p+J)9PB$J=Pf(5#sPo$RtS1a5j>QqxBl2a4R+Qp-S8Fy-SA$w)4=#mpF;%K9Tkn5*Y(Q9Kx zuX_d+Y2JOZSSZm;zQlCgR?Y`12Vj(U!~tVGCRvsLM@rCgT8^T=awPX&X&)AC@aPHX#?Ca%`y(a%hk;sydyr;yeIKmge0;M;b&!W}|86;68_ zer&{!HQIYbYwH-v*g}!^cG|r`tF!SNw7k(&CI&^m9@2f3EK-Onm{bSUWs#17;=IRI4e z5^$sK5+|Zhha>yahOBeV2I*4dr8y0`lyPDV*Mfrv>ufa!Lc);UG=jzhbUqD*PViBq zzo+%H13fH+{x*JE=j98!Tl&^#KL6R&-VZ2`@Zx?-%=6!UiD_aoGjNBpP1n8N>jUGjDH zIYot2Ve#|ym2LqK(DwY$+&Su$y303;et^bUaHnBuMX-}G27+^eQMQ+Myyd{Keccd^ z*A24hxq8^u&3fICIsEEjZ>hY2@POA1(U9GMOh?8`(>Ij8>xM1fv&Bs@Rh$X zdjpR-$vZr0TLo6DH36kf1$y3#52?MUj}^qBwd5bullse^nuZ`$!}Jw*wD_=doxamI z_CPN{MqJH1s)lRcY@tNt^19mwXP5b4Er)i-ngic!L?JUbLz0X21{+F#T7wtrXUoY&omKxhmfasCF;swuhV8dfZn_WnX|S zO-k;t%P7}hyb*RmNf|3jVM?m*8`%c`X0JUa(zVwuDcAV*2M-TEU#^qp7c9l-`+q6Utyyp#EL=G#TmR>6%psN?8sgA=3Da`Jt4Y4qFJH)d zbtDGdHvFk_{qErz%jYEHEwt%J)f=SrB`wcb9uRXwT~d0Z_2n6>e__a{wUoZOY-v#a zvh7_sV_9va%UhB}4sA?{CSf#!{q~x))>OY-{#13=-r*Udu1ht#i;tH}yYF+KUAc>y zL}W13uL*6FlHh@4g0l9{EZ2+9I8(+k2|w#ul68xtvqK##NsZy_;Mf^$~b5s{r zJ=q07&59i@zIK+=q}Q&TxvIOnN?s9|Rj{pznX4y&4br5~Fi&Wpb*N~CSs>Q9 zd;L;eWt8Ntr6-^G{`da=8xMZ$$>hM*@z{A=Hqr60RR@>$#boNn6? zRE%oQ6Por*G{b!$;Jn1dDS}v5Z_W~w&M{Ny`L+0S`~buyJ3qfA;HJXv%IU;EQ*5IRozQK3I4OLj2?vodgmKT5=G`Z zVKQbdB!g`v+d7lwCa52a*eRyJ$H-U7lF4i}JG4pE;5=WNSZY&s%XdCbL9g7Tym|%Y z2qhk;%u?%3>g3Sb0JNN0o~=orJv`b;*Kk6UAE^g=NOpi=|ll zNn+RvOdt+9Kead6jrG=i^Zq6-8n!Os(Bi`lj5**?kkaICEwDlJtMCR65X=c>AsEXU z5u75zc8J+4XOM7`bwPO9u%Rk7plmmr8i=<|p_UAnG}{_%|_o zU%*5SU!a9SM!-@|GQ5ofY|b#ltVLO@hFgalB{&%X8qAfVTk5lNR`57w=QOLB?lzm> zIWHL{X5m!<(B$rA8uxEh6!EaIER`lGmn_%$8Zp81yh@p#ttsb?P68)j7ez8+`p(I! zBUmP^`T;BFLr6!EndWwl+QEzo68|H!RyX6dey8Ocy6+J^h}l{~fp}OIJslEr$aYip z{;$N1kN}1I>brHS1r3sLkI8{W9j4`4W=!aKov{^~VaZgzBp3w^C+iYeehE2-nrDB9 z@uqBv;n{V`HkB;IHlT;gwNx7(PjZ9Ez`riIso9RRxv6;$`ZZ!W*2!`)5xld~09FRD z>Gb2)0z<(KvlC;$fn?d!JgDKIZV`QgehJU|Ai3 z<1rQVtQkw8`ntvclo%Kgs%_B_X(=a^AtM%69fJM`zJWCAeD!n!Mzn@38x)M3s?An+ z2ItwSV~rwN1IUE@Y$j6G_`?Z@;ISegZzDBd#Q+HsK0Uhu5{MFXvWOJ_NP!dnD$hFC zcCIl&lL_pRIHAGi%oAxK*%KBD92KlLLU3%nIXJ3wwU0n2BIH;z%5}G^AaisAqRw_L zS1i zrBm!r3wR)egO$bPdnU8K>&EY6T2Og9w$OC2*EsvCw?FUzlUW?c(MSG5r4&xeJ+IJc z_J)vvj+GqYIVh#Y#N>;i8cd&KcxE1B<)R~^%q5e{;9NP#pe$Nj6S5#xisYq7KnH#S zqEy;dn**8)Rju$@X%r&z$gC`QBjl93XyZ&f$*@5N3S^M#)+c6~`ZHFsnis=Sfj?B? z7IfVt^5SjvgNSdr^-02b?}Mq}X}E-7tnkxNM|g7=;CRDmP84Jr7OREC;t(?^Jx=a= zu$XK^TwlBR@>)SM6V>BXJ0Ll;5dl8C+#Nu#nHFE~`NT0fbe*7=!Rn4GxId6F*H5Q* z?`Na-v08P6daX=?l7iRW@-LvKzDs-9I3Va!cVKSv>IlqHBf|z(H5BAX=b+h!)1q&r z-zfb`cI!J-dXIQ#&&6@4E-8|@{9*eR&Hup}?v6tt&{Fm7+KoiKarOwF5XY>m52wRk zWhZnli=k*HZ5;G5B*t6#SiO}QydpfSWBamri00KnN}3;KkMYq>j7kbVjb5y{D!M)_ zkgW@q(8GT}9V+)Z#LG!MTh4|UDz`*Uy~bg390E$buwxlc*R-cHUlu`Olo@a?Ba2Mw z$ho?cR!IeIs$4!|mh1OWIuh>^p`FfuQ_W%uBfdyeP0xP$40Va9s><5Ne|#w61{x@Y zv=rqutIX+QE;OH8WC{SQ@(xOKlv=L;xu>2=LQLuhEI=HSo|v$4vA>1*atX z5MbBGqsCT6g7P7!0@J25E30n#J{j9T1nnoOIDNc5HPL?aA<# z!$7A{@d{LG$5P^ZThq@((S56!V}xPYSR4R!sNJXWP2QVl=`|D44MS=lIn42ac;5-S z&V>wokaYmQ)V5M;mW(J)&kgsU!P zc7zwzc$;1T<#rtn$GW40FkPvkx}M!brj`=Pv|S5`#M+byfP~i+Fkjhrdt=B?E02a_ zmNUeSx=~N+B>!tAs?& zYZGTdLoi_p8nsh1O>cRY5;VosOve))G^xFpf!%roD3YJtWK5rGCSy7d@KuyNXUUj8 z#hz^>W76$raG6l~k6|*VPd%TE$(`t+6NC!maSr8Tq*6%6bZaXsu5H0xOT@DmiXUEc zhHREK2W6sO7;BE{^vWUNfF1O2LlwYj;(QLf982VTh+qvbNlJN$suSa$l=G0I9_kf> zLHq;#7(oB&j$j$O>%+abp$(8ilh{rr9jFlH$kcU#SdHshU8hE45D=nW{fphhDGnT3 z;LKIu&AlHn=^WsS@=yJnIy^kHxN`>W<~p+Z@ltN_evwNdLl)(+{>?)(ZJsOVmvr}< z!{r&}ng70Ak0|@_o2BxSw|f^dVWM1%2wDv>6;)?%@y{gplU=T;9tOm;N@~oh4gV<8 z)`)r(bb34?l*T~ezj1D~x6n2^#fmu>)E@#0xE#@51Bue$M3i$=l$j>XCeJ3zCeA4> zn+zg=i@1b*6Fr8|vP$S$vomJI1hr(X(Kxdah;MyIYn^hvx{c6+S0=HaxclvQ2UqQ* z@#?cVRyC0~44|QbGwm~ZmM5Yhg{_friyF*C3b-n^cv52C1+!$)B4ti|s<+66#lbYC z!puPJjv0i*P&o+inD$yU43EZnfgC~8RUGT-iu$A=RVR?H{BJxORa@On{xHF}S@ydT z(!O5hjBnov1#nlf@NfREPHd! zcrXcO7L52r@wT(-h>ntgw)j(GHjItqR%L7$jYF6B#LNTCj_Noa^Ow7{nCk5v2sHG2 zrw>&k)-ckK5gviI##c@2uGio1!;Pe{`B2EP3q}Ruy5#z~Pqh)Kxh-87DY7v2((7UU z6V)eSo?j`Ry|0@)W;81cE`6#_^ktxTYXi9>ve%`uyL~JX`aUy5$BriB1JQeTh4&h8 zGGrg}Zj3QJf@l=79L6d0d;EWS+Gmsb!K-boaqv55Q}*UwYid&t|?ylHEjpKmi8C$Ob};iIxv=!+Juidkhw%CxUotu9JV(~c!;*A z+FWwYd+I-?>AOI6jPKevRWIDD{1PNWkZ2)viV=q5*iWGXH6)ztS4=}ms0DA5%h;sY z=}-?Gw+%8%Y9#77;bS@5@Nv)j+f%1vCv=XJt+h*p?NFA5&t)>`73m=ETQ3GkGbv;k z@Y`lorM7j*0ZrkIP1P1>F5jRIwic6(q)^ZaER`1GurN^jPO>5mlXt?Xo7Ktfrvn*8 zpS}Lg)UXA$f_F`4=QB7Z_X*)Xho|HNtDKUUr!`U5(>x^~WUDM789d>XJlRm5qf_z| z&(SIQD{{ul6`}=Gz&cD^Nrs9f6S*S^N6&=n|GS$*7!E^tW7w?4KFpza+;9)6lSn#< z>)p_{>EXcyCm_-&>4iXlswHF`-wj1cNe+f8Q*1oTiECsn+4~;^*lY{7bUPMf-B>>{ z(c`L5uv}dEO<%S3`5d}6WP%WaC5yTARp8x~&D#fR9#kE^Yxq(0UCQ$sA2}H30+AQh zL!X0L{T>0kAgn-G5|n0FE|)eGodYJG)X+6?et0u$4dN0<9*K{xl2{Z*0WTyF6|;`p zp0#KJfh0TDq)X2RV}oJ7d>`cDh_4;)S;7&DF%BkAFDw4qqq&4y^d{%F-o%_63e(&q zgr)7H5zmx?8jyfKk!RCrt3VPcQs##&8qv2*!)PK%&h0 zA7d89bNQl%NKmh=WYO0CT#{VBl$y0nDiJ$zi~s>eyX!D243>OC>>GJjW815LSfF%3 z{-UV+>OmJvz`+!QBq~~;JIs^lL6?Q}R4`>%k?#6TI*+rG5Nb2!|IgmrN844FhraV; zt-bc%Ywu(QqK!!`YpoG)H*Ki7XK;}V^fWU=1WK)(b9&F{AD(gf!!wQ}$>}g5m+QU5 zLM(~J7Aqan3Ti8DY2jE<{5UOItWi;s>Jcp}3Mj3#qEbbr78UjWe$PASTx;*_O=A71 zo{N#a=6vV-{XXyWKHu-cDH-`AUj)z_Erbmiil@Fva}QXPZrGif#U7Rz!=Be;VRRf# z(+lox#w8n^91X!Hxl;8gyhxm9r2N#C>765w!~i{?WJaLcd&BiAG3@QI^vZ(X@B~Hy zPVXVmx3B7Qqn~xB2KGpcXC@~uR)wLguJ}!?@WYHuaqeR;ZQj=Nc5nLzKQ_d3kJa@Y zqu4|3Czx3M7keX6Nm^90#9n~zb4fCPvi{8*igig_2@5&5Eh~4zxhm7ePHn*-2RSD^ z9|0|Tc*F}NDYWArhE8_)=%M#J3kJhEX@YKOn=$J=_|p60YWQRc&w;R^8`Zl#q`9D; zNL0nmtZFe$@lMiE&T+wmQgKGNRNUF*;UN;FQvHB?7Z`+Ha+@FEIZeC^5Soc9kAQM8 zs$$((p)<0#6ZDdemu^?$1__kvYBIzB87h($X+U$BYtU6dfl!v5h1|Jx(@8|+#I$BV zlT=g}rt3ejz+stA$+%;6-+s0|688fj#iDw_dE8G=)Xm|{e$YjA0uyrZ;cTCIJLF}> zsA+#+y}Nb)pITl`)dbv$dpV?OE@)D7%4s2yAVnS1(Uodiv)=+hcJ2V3L;@sS8Sd*` zC#K3a3;im`z&g}CF{5|p-11I*0v2Lwl9|<*WGqaH1s9XdQcO)UFmWVjQW>LLrJGPc zmj-7vG)VwCSJc5SxswHvqGJ@CA5mO2G(u6WG~b@fHl32ajZ3d9wo)tz^Q0oUQeOy~ zKm%T#^nb6L$+Ds-@^EVxGuvUOIc@f_1V2HyIEi0A?G$-AR+RUlVzYz;UHz-Pp=Kl!>ZL-j}=Qk zoMkn?XB~d@sGtPO$t$R;tZq1x?Wqcl=}MQdV1}TjW6tUccQnowX$6J{EW)MDc%Yyi zPXbgP0n==A-gYE0uqITtJHx7EiAYO)o?!kf2P`N%I#KJ$_ zpHBBt(u18T1;2btT?PS%N=L~1}L1+W%KwFxF&bF-BX?{?XScsKeb?ZUxa0^Vm^#bYL zm5=c*XJ(nKBRM0aX1vECWrTYwMVD+ePBx7UC=UXXC{*kJcU=05ffAOA2i1YI-#wn# znamGs7fw+uBTUIC_vic(7RIs_Txa>{1|ytOzdMU%nQ?HJeeIsi1(7OSG`(vxLMJxs z)R1oh*Za^n*ol#WCwdWvuk|oLHxRd^+EHH$P9aI3C1w@04O=2XGfZ!CEp!_1ekaT; z;Ma$#&aM~J_i!a+(SaHe=CXDm$f~8~^?!FYCUI5)bT$=v%D!|HG5KX*;Z{NOTov;=l5vgS&%sWG<#-Vd~L z&tpq?F&Pe7C!(Ff>pSa@OXBxqvWPc*kBdn8AHzlb#t(H7Kly{+iP6CKuoEf&eO$!% z{E&9y4ad2NFRh)+A^5Feh+ry3y(j)uR56TKO=)r=Iw-wtA~BVnvl1di`&oZB4J^YuvkS{ zIkPoYw0Z7dwTi_m2>tgVd4fYzN z?^M^$6?IXj4OKQdVW9$6uMjQb9}_M-o#O(u5+8t{o>J`!+L=IKT#O1Ia<1aKEjOxiw<2&G20L6kOV$@fuJl@&{Pj( z)q@$GsTH_6kC#srpP@-Q9>wRU%c9rHZ_2cR38)WQ81peZ?lI{zYM@MN{sj~@mmS!z z-GiI@(91D`aG4p;w$ZGRGBwexWYc1Qub5eN8H2l?1QY{USRu5fA#*0B;q_K2EhR)O zth=6+LY;-`#0_6ir(oDY^$onm%ypf)B-B^%99NrrUrSPb=UecrRvD}0!$BQSaTuUU zafCEAAr*7-hX@D@RTykp!KK#_tV!Y4m}7>*EjQ=U3b&kfm85MIZpkK7gYM%ClKg#J z;Maf83!K80{Yw}4kDt8e0$=>SE%4(Pf4l|0_eWrX4)Xo7{;6Gp39 zwz+!mw9)ES0G}y8Fr(G?Lg7vst@`?7Y_$5`?~~DL7?Fhm{6eA(6ciI(QPYR;e8R;I zaqc>WkV=*+v8IH;;2p{yktQnCL~tm17Nrn)O0S?O3`!$?NjEj9W!xUr~+ zR2$bkH18Nnc-KMu9rvjYMtOAsZXgNaa(lf*Q1&zjQ9?_~o#~Q1)s+#v@X-=QT-<%P z6Nx#59CQ|OA8*=q>LugB^*V`y;s+?WuLtoz7T(_bQ>d@50#z(eJzf=WkLbmF4t5YD z5?xYx=UfV0*sbnwt|eF3Xw&cq3&WX+c>@#Tfl&_=BKvde5!cU$g(i0`NxI{A1?z%1 zS}T<_45re^et2oZ1I|l7qSf9;1~e^~`aDz`ZwGU9G^lFYp2eN%>c9C=rHI?JlY7%q zY*NlGMu;cZsHhEwJnv`}wf43#vR+pZ6BoNCvBx!6>1(-Tyusj9sB_T{GS1Gh!sIQ1 z6g`@?!7{-F&v8#zf(g0qNu3dywF9&!cqpqIUw)(xM#uGLyD{xhJz5GD8U(Pk2wt5@ zO`e)3);bosX9?xfEJ6}@Vy2>!0~fZWQ*w>nhcmH-Wz*c5`~V%bnU~WxkY_aSLfGe` zbI2CBuM5`Ar^QMCtAV?Xpz>V#6RR+Iqx=J1v$h6L)Xmura(#Z(VssW3tWoT=piDeP zRpz!G78Bd!G<7^{RHAt!+bLh*f~{!Ry9%3D?5}alPfZER;i? zQ9oFP6%ZFeSo;Z=^{Q1N4wwLmQF%ZdT^0)k#32G&4dMcdClJ@28Xrds=o3&|V4GuB zCj>gwKpAz^1{HH)0qx{Bj@OBfFpJlBk2Q~zMilEMYJg~y0C24f<8&*H@^d;!&(Q!s zBD5A@adQ`7v9T9m<1Ha2`TWXiH44ZoYhlI^QVdqrIH>|H97>*`ZGoStIl&$^xMKo8 z95bgro9db5U;Cd4!(C%dRvN#c-8jIOQ?ydMO=$3fA%w>lJWChR0B#5%eMNj=NX;tI z4fgOv4Cb1%NFhYP2bq-WMfhu2Xv19--Hnj4sB=MVslg$42IfPuJ{yTa%7o>|E)Rhj z1rfiNqGwP~j0PQqLfRK;*rs+nOG*^2R3a)D z+Eqd_xTV7(R0r*O&ygN~rjs~OdaUVm66Z;eLuHaw^5zlgkH(ldLGK>xx39u0)G9G@ z(#r$J{vp(sog?aNh+Gj^OzNs1_piSm$+T_4! zDh_wV9i316xwA43cZnQV&?&2{7%C1c5gY-Ckw{^aG*Okg1k>Yx&8W&+;UJs3#YHC0 z#0&XhGhL~n5CNqK|4pEaH6n3OCQx+wB08a%3##N3c>>U-;-KhWSd7>R{7gkBq|Bk5 z3rQai-XUB$qB-o83nF1FkL8mgz{z<9h7YXv1fP?3dCqL5(p`0esWf|!(p`v)RGR&- z3EGSJVQapSANKNr^!5U)zA}$(Z{Jgqacur8bMkke|_Xj`PG)xEWSf@t{)a4sWrXL*Kzr2&r zMsRvuv_R7U8uJ{}#_Aw3)ht28s$s}@_Q)7hLJUGSyK|2I2YP$+Jx9Wb1U$U1%<=+y z2u;xL>i$n1VZwC{prYzXu7c+r3+#?`AX+*e(D={bwDVH{e$_R?R#P83s(x#}b%jP9!zJR|0+OZHX2dJfrl z{?h)G!NnZvS^Cs%;;9@u9sQDrRf_X*@*t~9`M?Z-er5Jp+2e}-OQa@JT@I%hq*{s4`lf6yl?&UVS z)KdH5Y!*TTD{HrxQNxU3XH$dUZ0bcz&}8tjYCqsnX>_)f{joMX^HDu|_xm$WNlj|( z8V*BK<$SAKJo-ajGZZkjw{8lngK2AJFUhN=-dxsZ2S$$SjcIK;wqRS~Q6DC~(E`dt zd4_o!$(8kA)b~3?^qdKk+n5 z3Gl(#lS_VxA8N(|2?rc?Fg>EB#O%sJ-kBxM7ut-~ND63;(^pIXcA3u@-W)pxrDKJ> zdWS{3de%%}N?wK4Jjg8gl?Q97fU;?Z5aSucpiaaQ{jt#-xfiPnZK7 zRR!uufoHl=kwP>R<^b4EI1eP9k->}@Z5J|Pw*-ptAum06S15M^zOm5r))&p{&C($| zM{+g>%|BZVeok`_49798)VfY7Fi&GRlnq+H0cssVjS>?D>KMnE%J};zP`kC+;sI@{|!tkXHQxR$=6;vlXZH%T-ix=mu+;TNy=4!xBT_9 zyh7r0y;etAPF{V&?{kqIA&fm>&GaBmNjeqL%E1LG{BD-5z7$iYn{bidTM(bVXu(rdl-qCzoR8mBG z_(uDMwg%2383q0IV+i~!jpKzZ_&!*sZFE=usI~igW8N=Y8fRH-^aYQ;=O9P{JaRUq zk8v0vr#vZmQo_gdR$sc;@PuyNra^%g6C&s|I_Mm{v)AN8G8kjmPt0_14r-UIFAAVe z3fjA(Dh!S1%brwR&bV$U__tIGGcSKfU^YxHj0Bd-rKNI)`;eDgekND|Lo9IL>sQNMiH!mrh>oI1*OtYM%VI4q zb26TpChx%jKd-z8!=x4WU@(unR@{SO(u#X9lvj)aZxFM8X1(}g7MS!l3_Hbb7zml- zK8(nPc{|XwJXigFmd>)U{A^;j=5V2upW(&~=kMfl=pX&cX48?Y#33%o;DU;dcTfP6 z+$V9En<=<;A}Cm{AC6F%Tuae22L}Sr#cwD59>4FSO^(+O{k->PILA!B5Myh}& zx>kS_dsN_eZrDg4CrwTYbF;2ON^lOoHY>snU~4W7l%VK^nH6-6WR!J`*@tjlyoid(A_a*ZO`t>S z`DZ;69F@UPo0`~jbxncQaskK))yqubIDOLfgEX^5bdj|OK7+A3D6O`Un$g56jLoH# zt>m>m(PcLH0$V=~z9t&9pRXRtkg!p@B^q*~`QeW+EaiKxh-pJlqbL}Ty&G~*6@FnH zbeo4eUg$dD((^omn)u`u$3a~V?gpBfX(#0>~fKmU_RkK2B9PF0wtXPlIR=g#^q* zzPlZ9#f5vi6fU)+D^s!KgkM+N6KnDtpKwC$roU^bCOE8ud`XV40b^w(iwb|m5B{CVKpzr}Y? z$;S+cf;~U00d6>W=6j?9hGC$U)Eg|o`HTI;I`9PFN3Dpa@Y4DP<~#|w&R^uj7nkDH z%2Ew}XVLx+MzB{v921Mr2wkk+_?|nmhKr}e*Q`hG0H0rD7E2|SZgsVV1|i3wFyE;NlVclJ4pe1~fm~%PMzO%ui%xl<_XVuNO-w~d|)OP#((j!eV>;@UUg~1J8 z{*#{RfVErX_IHz_3)X8&c*9u2wBvomR+`ls^UUdc#r&{X6W^JfXSgMLvCKR= zRxyANq4`vI{{tD}lW7pBYt+|dPR>O~HFzfhewMWuH;S#*BKN@7<^fn{><{uC7aq=< zDQ1t^q5n0rhmF7fgC!%74z5RV+_9PF00%@IpF61^Pdj}2y;A8hBU)*z%xV#lq}oP2 z7cky%oHHwF`6j)K<%+&_YEP=PT%Cz06=j*L6~iQP0A5cO#Z8K6+ZbkZlcK`}0WeI? zfaRPpMZpsEg$HnN5$N@Ug7##<+K^QYtF5N27=Er)i!sz&T`0y*`vcZ}=nf@AU?gU|R%%w}c)z19? z-&C|HblwE>2p}ZeX;%X7qc4dzD zwo$W-YMTjnO0u4o?8=&)Nn$=U z(IL4TVu}EIUMAP)QwV3^Y!U?&%4&o)LBFN@ToS$Fnd=c7)=6*gW^s4|2FL%;oy{4s zXWgctdmHnlb?XNkPB?Mnlb-w&vSt7kS2(dv0$uyc)hY`cvc$fJKYl=z|_PF&@~i(j_JhpYTR zoVKH?`lGcz-0X+d8oza|5_hci;ch>y*4;1oVYMka{M&r^x2tsb-F`^-sJCkqQ}S^? zoVrSh-+DP8wy*NxFZ{4=l@Is$VYRvXoF7&j$76no+uBzw?bTQEVH!&MucY`Ku!gM5kzf zT8?X!ZcndTjti-pU#~Y^+b* z8E_W0KYZtXEXe6zg!YW$nKpe>M4P(uUD=`NS#;wx*0RG{HI~ffM(f{P$1i#-;21$q zKDcXx-6AHBKLd`U=;lT^B2N%|j#M%Ayr?70OIJ1^8{y^WqVG+3d9SY44hAtL@Da2M z1dn|uiDr!-h&tLO$%B!t&tnA+&Dq9|qaUqS>6onLv4P@yMEFe0n7v(cfr2JZ{G zMK;EUlEV{1wDx5LWss-^wFg0I?Q9ckXCzd?i6T17n}IVD$HA8fhnu#M?8!uxga|nXk(!y{ znM4Wu^`}xZ3D1P>9@0t(tp0ID7x?2Qo@fZ$rx&s-Pe0ka;x4weYGedtEa2Z}aqCUq z=_C@U)~gxSx2Tt+A;8y&B+5=Xn++odCX#5VS`hH4N>6pwFKKC))g@_(uPF=)D;pxS z+>o7YYjzdi>d>S}4x75dsO&iVg^o_3Nmrb(w(cG^aH?9_%dVvdbjKWSPpi6S1xX#CCjjAOf1IBbGYogQhdi z&1#)-ahv2CH@LQ*UlOi^K^Wd1|GRqhnXz}e(u-ggh){FBHSJR(wZB!Vv9 z>vb?%Xn7rs5@73~d?=5~oz<7`3B4PWxkTL5(;Oh zAt8C7!EeklRhn+_gTVZ&Cp5rh6+4)g>QmModoQW zQ;E;qCi+vwvp=iPb^elOnN*i3~`%^OXeCcrJPNACybR;Zphi!qQ)H6 z3TliR+@P^Y@51-|k}%4Ey7vC@^&ZOpcw{>mYzaLYhFDw^p3G%PvQMOcF;@MG0y40t z;{tc=#8DsS!z?Z+CIADr&0}z(KXboEjJ=-r+(Ux{0l{H^J@(j5PYb`s?QdA%|1#9d z{D0hk(>Uek!bwvW|KtAg;3mYj3KVIl4idV~w{=|nxIqiNbkDAshlLecex`E-_ zik?hb8{s8FFnyrIKx-&upw+n{$L{tnz{Z&&g?Q8~#pWvKRVs$AGhXpNCh&1%K=*9A z6ZXEW*>p7wm>e-$icqO0;_HTk{a#loZOx>zsO#MkhNxQ4BVgl2uGMwF`JQa>S!}th zgFIE^>MbT{-2JekQ?@oMNc2Zw7dS@0h@_h^AH)%0(U4zz2SRy1B*rqwGvi@a9I*&} zrx+#96|9+1U00ql)$N8%jq5`_PEN@@I)qVrIFs!8XZz?aiD2ebiz5anljMkx$5gNeST3I(`~6AY+kwP<4`Q9^O=IpEwK&LYw8L98_Y=u~m>u=i|g zoWYBR8VN54fU-tty=|8aSgJ>)GCDd%xB&c|%{9RSU`&K}_4$X|1vKlVSZ|LCLBwDh z?#Vg;efP%Rn59*Hr@{qEOd@VMK;1WUv5c(YoNKs=ACe8idGP&STmrDAo0{ib(uYZl zo0^YJ(9(WUU3F)@4j+^_0su>9Swtq<3a&_ZO1n=ZfJk|jI7|9S4JK+Vkvv)HT%y|ss{ zvg(^6i&y(|^z3vUxObymv_B@BnMe6+m z&&(L&*;9bpxmbrg>^R*LGA_Ar)_nndv*_jn$Cr>}4516LMR@e9s3KohO7E7^H=4UQw$6XNbm$<_f{ z>Px*oU%{5=ZDH5D73cTvX1}v$x7<&FnyuCC-^RPj6ZU1Dq=>$st&AqR%JHHt+RKP? zuJhJACL;=Lg#i!$HR6rV>o>tEVn6afI;xvj5C{ zJD>19Iu##BN5n>xoPBPfXFaduE_m9A`wee8-vjQhNH?GxMLO7PK=YZ$C4)%72SbCNp(fyqt#brj5nR&yvmS zMdJkoYN02mLbv%A$`xTE9beFZ1!HGkplIIACRaFw%jDO@*J0K!K+HpPac9x&2seCJ z!GNjWVdP!t;r6-Y4-pDx4&Zd*{D3F6Ljoa^oL6f2HZFpIgyqjpd3DD;4;jH9prT0_ z&W8w6Pg0(q$@;Wn?P6z&xvD7yJJiwA=b2<{j#8<4r^_&n%yKl7^&2GV31yxo6^m<;2Gu--&zJ1OdYqOI>fu9*wA{? z84C%EAT_G6I9ABdq=4P9k5M|NNrU>7FpnQDAPU{(l*YO(@qWABI+7V-QDyop+sDfFi?p3LH%ikg!%K zI{q;bkk+4sQM+Gw`A8U@@Uq}7IidMT!tSNL;aLi99~^oLO-J}EB-F|7A&_gT;ZJPF zg`kJ{>eXGJzCD9b9F(W$GfmI!Y2sArYDeJ>m9SaszRJ{1_th_{wv*zQwxRkZHN?w;*0KPi`&9Cf87j-20QK|?k=)n- zD9(qds5SRp-@ttJ40#_`4FGVS1@){1fc}pFsC;Z1RQ~2TK;`h`g38B!kf4(KT0;jf z6HuY!-%n6U4b{+*8meDXLyr$ClNtIxg333_Vtq1leRwVf@Pzp#=-*AdZYVApZ@6A_ zGj`mDi0)A=XWzqfc{*+k%sO-e)W&8YdlEOMn2H;NPaYT&0^){(ZB4+-3OhUm7QMLf zFbA4v3;~{3@6I^OJjr+pnN-{zJ~OyKPWIOne1)?n6hd{ikqI#A%f0KPwb-QSb;Y>2 zY1dsn#$oqqc*FJM#=qSCn8Xhem7DC>7Nhl(0fcio;bov$5h-vZ03;z^p=|)1Kpn-% z9`ju>Lf0OS2fVJ|J*do1WSHu%UbtvObaKClgfPTx9=L7+>U5-;{0+>2Y^=pS=aHGE zF`?C3h=~FjaBS0KM_e{vAv#ZEkW#Ow(R+!|(+Uhd5WheeBz)S42{@u4*L{=FdU#Gs z;=$IySxN%!Hu54!2zX(pU2;2O)+hlzSgR}jg7HWa$F_6Tx}Sm2z*WoK&%o}IF|-QM zdgOCDw+S4$#WDxAAPS}&)Pg9Oa!~U$o^nv*XfBqhTZP6BKW%Hs0x0v7i>=z;)8n&7 z1`JUU#mn}j0u-dA++?Uwy|&z&Axq&00`JFF7EG5~fg%-ajeG}U32piY-qIY>)( z2RF~l2q1fr{eXmU&LdP$CK*9r7t$h}#SfgCUT<`C;Teg3u*=x)cp+Mhh+eo}nFMLh zpL*i3oACR_=AHf3y2P#G`qt0-ukhZcFlE=RIqVo5wxVk1LF<8;A|6~@6S&#HA3PMn zfaw#bSc-=d>F9e9+~o|Nvki-`X5$|fg6F|2j@0ryPBe(0*sEcl#N`YQuYhh@w2RqQbtiJ( zW9-e1df@<+SA5$VZN#@&@bY#xi}Q;Z#!5Nh^TD^H;H^$-ftkB45!-8U4J}n~ ziE3!5CO(Vm)<~iHCdEPBK(zwkZThfNlZDR6p34ul{|d#xSk+zhsd5oO#jp7&@O%Hd z>Tc5n!G%fMJ*G*ca+g+ zR4rh6dJC5>)nf7bmIQ9Hz-$105hGxljm(R1Jm(pRq{Fox>T%wbx`t{!RmXANRM+0O zc?5B`9lI^@O=XG~+ z_-;ylRbw~3FwUEsQUUc))7P5rYuUT*9~v*VC@3pfgSev9##n-5pZRc>;_fdBqTg~#xDd{X{k5YW9>t1ZA8mH>ow0|I^ z&SxUozKA*Lt-*Q_9jd}26(7^)-TT9J`KW&Cd{zN8#ZVIcM`p2BDkHU62DO;0zi|Hz zUG|KTU@%b!&5HJ^o>pc9OGs>93l>1EQCLOKW*9JiQes#f2+@iHTI;_!8CRg?QohKZ zHbathQ5yPJN0Opis&4-h=r)2%#bEM1(`nUL_*y+RWl}ckVlB%-%TskQZ=8m%XD>;C z86Oz2o+8wt0d?4cR7=lcid0uKPqPP-BN|8Y#rvHw(#Z<-LRTT55OphMiOEsYC<3KW zB1Rx-(yUaMPWOapH{nNoE#hD)?LwI+M_riFd1>QDv84alA+KI^LC6!t#!nAk&eTYf zaU!u{m_J=)!N$xNene#ynszy(!@nMsOE_mhLp`th88{RRKyv4ULo5^K1PqCv;dr*% zo-T!ZpfI}Ft-(+EX{+)VP6LU=IO8t=5Rv|WTe}NzKb!D2H*1h?Y^dZZW~4$gQ&n4$ zyOpDOD_vIh&vdEe0x(&>cQwK{(BXq@~B||o|Y5_B`FjKd|=;{p~n7B+QQt7tf zYkeZsmaNsaU05o_dB?OL%KjM`AGN3Ockn>#n z;O>Jz;FPvDFqgF@3`30vF6o@m^st~PZxqx zS%?U;k(6^xIdklyEGCUX%xsc&Pi8hj6;kcNN4a1k{v;m={L509Gc?FfkVhvETUpsr zR_=7>{1>YTHX4JWn2ETADwn;@1|ObJsyM8Zu1iWJaMj==xc4=-JQK-6R7LfhVjI{_ z3)^wT3%ycX>F}x#`k=OoRbZQLQN=8|i)Y~{=qmDF8-MczAyIFfRC%0;b)_6kQZK7j zYbD!o9DWgFi&w_0$^Rn9y>e29$$+Vv0KUhSZQnoa@-AYXV6gJ``) zk7q}IrflNpURiQfiJfoSbz6SPc>VSDMHuTt{I$CEilGT7>~Gkv)G-NXR*H+z^MixX zhsrP_^eREeBhN5Q>I@Q!JQw1Bgq^S=GB9=m3swN@1aJVO7CMMp1W*DUpt9O>xU7hh z0RB)wG`Lv{6O~fPR%H3m7DfQEWtlFM(1}df247f}NqZWZ5aE0am6x{{s)9A&I+)&& zWNBT3-X@_VjZ0E2BsK(>@B+~FmvT54PwXSCsT60!(t`jzVy&>Lt`mH0qlN1PpBp-} z$b2I_?qbc~b_~);q|^uy1FpJ_IW#x{_(4uJPjT!G zPN0P`*g`N~FFit~OI%GXNTT25XXvts)mSWX98kw$;Ua0d&eVAv#|+J~WW05_%a|Xm zv|3n5da>m2QH|5!3DbZbzoDZy@&nEzno~m1psg^L7u!>h*|C&w0AQ_OmZcBK;^b0R zTM|HQ&a%8%U#{;M)p=cSc6M&Pk)7ACU%w7gt%t!9v4_27l^A%w5hssWLI#?d;Rl2= z#}CR}-$a7^;6*#n4?1<!@yt!^Ko!|K&b}whDo)DlD?39n0qkjV~S2es6TNP5zMA zwn8+uRFrR|XOs^a?2bu!b49oX+gb|K)Y6c)b(%7Z$fh9pI1d*ZQRhAn#tcXJ$pjso+ zSPe4we&uQcG5O~f|J>l8+x_z@{~YwsmHzq0m#@wRnTJ-ri7Cjcm?%iR6nX^CS(-sw z3vVmvIiD4aml(TV5ab;)b6@H!m{876E>V&^0vI!n?Wu?!+K_T|{PC07FyGw3uBOhW zICC*6E|GO~ap#us6zPH=1o%^pFDosjwtDFZOae`A>mU$CZ+3Eq$RdrCLvM0+__s?M+Njw03rttSbstXNrO#B5Qe3& z;b+%F2nU7a#Q=6NC^U(_+_SRgsi?)c zh$Cl-X)e+cY{zh;2wu9S(lFT|t9EQtoeU`qUG!V+nW8b{zofMQ-eb1L7^Ye?*aX^$ zXe`2-ZIeuJL>mQz2tskS+`s@>{^<%VJ4?eM4KSrzdxhGcZ$7r=a|HNwj z7_HV9o>;B#cD4RUKgHm&6uu+Yl!Z?JhS+E!q``>elnenqtPz|St}c_?Kss5D)qPBQ zQlFruk^2s}{=o-BS|i7bhu+IWWkxk24wN%OkU({?M8)9E8>C}XN%^J_^=TaJOJaEW z4NfM)ixK()uC56$RtC$|p>qmRYQ?n*=EN{B*nJc&DpzEk!{+!nt3}s3T`fYQV0dR_ z@H9=V`DobU)Vl~Dvy7{&qsWB3U!`wi>xlJ$mcQn*j>$Dgh<3POG?p7x*+08;X|qc7 z&wz;SJuqZx?t#gbd{HXI=&*uV!c#czfuR%QlF*X~H#^NOFjkJByq^LrI$H`Ps-KD{ zYxQCm0HhO@>ii7%i{5HG(z~d%R1Z6>tHs)2x|c}xrh7?WnqE@sI4i6#)u1f>B=n*+ z>IUr)g*ka}x#SQ(6aG$_Sr#?|CezEfw2Wtbt*U&ap&m=P%t$Y8Et^4-n3EgHZ8b5{ z!?O}Q#xT;O2Ma1Anz=>ns+U1b0&;|*A(@$3rZ0T1H3-n45$P*oxmwAr>bX{ohJ05s znr5g7qtRweKlJ|kjLHDM622)g=ZSR_p3ix!J?svGae zJS1H8Q9vLwB@%IH**a8_B~OCX@a#BGjz{IrI4JUq$5=;ld{PX(cbE?0)2Tltn*E5a zbAHGdiSE>97}uA|YCS~t;rnU+?s=F6=w?9owe;y}90lTx;0L%qP81C5;D1R25t075db7*0YtU5N4*1%6Jir;DKBwg|yvipu&w?^lprrD&O%X4`lAh(elo&4z zWCB?mg)GQJ)}giVLc!1m{HyKEwZs_2ty_imU_@yfv3ytKmDJDAuOg;PkCehtG?ObF=wGaNW=MAW0Vqfg zFej6n6^N#nQ;yItjF>q1oxmN;GG2SE3sK|UX*?O$4X>U$h)<7=4ekhH1#ohHQz*EI z+Cv#&fXt4-LZ}5JAWT5fI0$qay{~9O(CE0?^rQN!0H=lq18ay7`ev~jit8&Opi|od zv}~9fqIr-j<~Q`3t)&8lc~~k8Dh2|`6l5R#69zme61RETZ30J#6={DKW$@p_KFKzC zd5GAA8OGU|3WQ5$)=b`9-D8y~$#lc=lGc=GLx(AZIC zY+TKK)Ro8HIs+)LN%xOnT1)hH_C!n=Kko}AANhVcK_kwi^qBYOj^pP-%zs(j>SNA# z5S!1V6mgWu@+*KL7Ij`xl9ygSQo|hDDVF4>UBj1zKNsj&-Xyz;sUeP>>4z||z_c#k z-DfF?&l29<>^Q1^)z$`V3VnGyl`&^N-{2+l>_u;RP@W8 z)j_&BoC7e2ix-Xidxrh}by8vn+f;5XWJDM|#Sesc*xCSda5|yXe|DUYw8Jtogn62b zK?EiMs{(Lxl8mI|NH|ZDT}2j{25iqZA2KR3sQG4kIPlKn&-(LWwTBx3T@02CYJia_ zfr{eVpCQO7nOuNE#m)iP=xeLTK677vQ!K}4>Kg_v;55|SSi%Oz0L<99T>rQS6!5D} zL<3r;Yit$Zs{SW#7PWA$!{MxEAg9&L;3`egx9uLB=M?MQPm17IKMD$`Cs21I^7c%B zDtstl;mM{^yABFGoJDCtfzHT50}NFuxFyz|-zcHTzym3`{4}XFF=i70k5r<)whO4DO^gQKDYwcVdMw^75^CVDXJ>{xmLPDwrBP&!_Q{n%>m%ew6?3O!<19MqnSo*jZO z2aA=}i{tLKGNndvkgPi7VOy`gmw+;47+9`Y)`pvbYMtMq+f`N>%_HCQUoPecd$@5~ zUFw$gYULrI$;1pEUC<5R+v8u{ICDWjXhB5s!m6k<&WVurq}~anbe5l42>{?BkQ%k~ z$}k)ic%l!IqGRVPv;c&0#^>Cox1y%7sfFE+BYSEa4ok+xiOYJX0@fZU30db$F{`~H zcu^lA8Q(8}cr=EC+2DQnoAw;-z z*!eFP3kh3Nk~0_+DTFzZAbvdMCli@$+e}`4B9py@$J?D>;;OI>)g%0*8<*;Y2TTY< z{^?0(9Qwr}h}b>s2lZ+jz&=*w%oM+%j)aie>C7O>%th16q*5=`=Hx$E^FGioOav?V z2o4jN;`xa6wEM~3R@xSFDI4f$GCnYfmhu-ym;a=~rKsbiq%K)Ggx~BBwjQRH$*# zrRRVa%JcVQxSTUKlZRu_{M3-05S-1(4{_WKnVg=PymL-7O3N@Z%Y%B1j^j+F;hM-$ zpQjLt%7&>6FNiJxj|$>g_0x(MDB&vDR(4|8BRG*y=Za^kYVZkN>)0@iirBRNxiFn^ z2>^+&^Yx-Wbg-Rjwm~wcDv~*iW1bQBr*n6V%aSsW@HBT-?v4~hA)X)zuX>rZdMB>Rw;gw(q|P zYNFu_mRS+~Dd-*6lu2U+Yb&B=fzFM=Hoa?)upKLgx#nFZ)>Fi65sb63l!hvS9;Y8Q z$GPK}-7)i0k|=yHeX$w^E}TLLT!d_3HBHI$kKG4Qt>`!{dA(2=T&`HCm<2tmJt}4aUPIGTUK1tXPuHPd5LhPIYA<;11iK*k7JsXAy zN)3}va1|ObAsV*h2$iZcMD&&&WrZ6&m20cX_f%!_Nn`Ijgs4fbg}iZ7wJ97AyQ?pL z{*9lRIV}sE%49U&vQ2;X#I5zwgKk?<-KFkymmte7KYS!x0^ia#M!vhcf_FwqSF5mf zqRG12@1lQ?Jn+#!vwvVq$-+7~>z#*=aLiQ?yyQpOvF=D{fUX8|H+ za~LOAZB9gg3-IYc$NI$)SAlZ^6FXTSpNJT9nAdN=6iFlICJEo0Cx?{CS+Z(Z0}*Jj&rV zBL#NtEr+VTg*rGnJ*cw?=Qd@50_PFLiJ0U=ld3rd z4_`EFEzjqHXr|pJnv9p0Rrm{#lXOrbx<2#4EYnmMpMfB1d&v9 zC9n#>_*+!aJFl&29~3{X9L`|GMxCu5`2(aHKNDPZ^?=XUz7~!(uKa9D*UfV!d~1Rq zinCG^d{&!_;fH+#x4XZ=f(lx2%WAj_XTxsTzpJ2>mQY38wm#mpZQ5%Nra5Tacw(W^Z{$}xbS873S z5LQnz93}U~tl)&4frEy$q!C!!E+)ht=?`YlVMtv)z9nLUM~G97ZE(~@SPxnPzDF7v zq?DYI$p{(hE(i8n8YSIZLUvY}GSDa!#WRaQn}}%>jRH3&AG@rp)U(NpU+k*)3rZPz zuAYT&x{^8b*ZlP3-kZhTF(2S@dr))IQ*=nyP)WyqZ`K1PlV9&Ba6g{6X-|3fY=r&g z$6K4?Oc9;ny%&vQO1=68K4I3DdTB?T(K-A%uJL-MO|bcD{QLfMciy^ zmcpNKute!`&#Uvn*EWVI1XQ@Yn)f_Hg)BHtPSsx-ye(uPWO4M4`r=|i6~z}Sn>wzZPWRGzs9U64 zzY^WD(U_H$jjk9f`5yd(B0dW0NgXuxRoUg9D%zKOdLgCkoL!KP2EQqdpxQ&SgCQMqtb;PYg za-eXQ^%TdTH;On%*^t#dxj0p~AYvby=d32rJTLgpzRUn92sPISU(bHVYe`0q)G5y$ zWcc&7qf!Z7z{e@KpC#X0$0T)Myid6e;h3avR9(K%nT*|^+5=&=_0qrf^~;>jOP)OZ z!iKJ$x70jh{l$xt!=BN#8T5bkxSUf){Ss(oa0lYN$5cF#)gV~>mMX5uc1Qus{BGte z^I+j8ZY?`Ai}U}?jN1uAC1%&y{rp55mIz<# zIleEUiSO=NH_kKu$DiCk?T?RbGV}vQS)g*cvXw={n#)hx)2*g#b*&Nf(V?W;o6OadRr% zniB3s{=Kv#EmwDOO2k)pu%QmAV7r?A%(j$dPNZ-&i(@~{hH588K6*HR4#O;^gF~xA z_a`zO81Ez0V}64jux>Dq<|o*JTy=6zJEnx~J0%w()n|+hy=o~+f6=ZaBMRAV)Afz`$ju zdhiv*AJ80#nO$8$5ZmzJAKac9Pb32zs>go+_C_vJRxor^CN{z9vZm6JK#$a7yhU_C zu8wnUH5<+Mi2c+C1ssh#hW2S@1vvzR=^h}+Na#dKSKdTBtWq4{Y0%D0go}2<>Y36; zBBnG-Br%P|!j2TQ5o?j@XqK5#6AH+Mnt;ey1m0V!BWf2Rq^77kBwx0BRG)&)k5hsv zy5$z8H6kQMG)*}9--r00kd-dr^uLhgF)QoJyeQc~Oa{k4W1TEpW3J-f0SVpxSNAlF zAh}T8$@|I4G73&_@&ce~KtqKx*6|kHPzv^U=bzt0`qHr2#f`K?1SCTT69DC(2Y;Gt z1Ba0`TPIy<5-UosO)v;MVm1BaDlZWPao!y*AAoHa*g}C4;4|6B;QGn_MOvpTYsp^H z3M^0zhX*@KMYys|YZI0TVpBc#hNh=POH4i8RCnwClj#HPS#9{zs9-&i% zw#HR_m>J$wYu}xp>OD2$-ie++2oS*Ct64)rExSgOHy67HpIh%n0JBNi6>>Wsf;H-( zU&cQrBtKecKq-(ve~gse;xuGJHD1{ixGrI`VN(ZtA-J=fh4Wi5@bCyp^$VWHt)$5t zqbo%mqDKlqqOlac6{AF2hfZbITC4&E#PJY^fo5gQ=7dv(0_8LIp);_c(rvkSIz_w+ ztu>~H)_F#`!^#~RNHUIpherH8``MmjF@|kKJ7o;yBHGuu8>sg-2lW9m*TLb_RB%+2 zBVuC}cbemFa!dtZ;V^3F3f^T zg7Jf$D|ZcF`l4~?@UADllmlwRONZs*aj|QWm*LEdd_0=*yP~W;h>D%fKan-kxQ0|E zSR)|R^#;&Rr<0??H^Wdm*$3s0#eu57+q;)BJ!_7ykZFd6!0rlJ$COwz420Mz6+lMe zIL2TZLrm#z7`y~oNsVF&WmluCIznZEiKwJ5r(!MdL_$diBRT_6$`z@LNdo~yi|T>l zIER*1GhIGVJwS9e1Xhiy6M7x|&66w}wXijhu7&Kau5!{D2(+oH5NpCnoE^cvH9vE`QUH38<}1#uj%VeyUY4`)vERX>8h!}vuf%W zR;~Bos(D{*YO!)geq+_t!>gvgZq?KWo7r17w%=Mc?;n_2uI$5gVL?9lBd)pDHpt_- z82nL)1XQd!oy}JCoXn;O`J`J@*=9Bbb&~tF2F;@}Xt1D63FytP?F7%}weP+zX!$DZG@pX#3hwa+ze zTU34mYI{bUUgCp`N6I?}*cW-+9YjE0V5yZ@$%8}_BJ%R!O;7RTDOvXTO?;dtkJSc} z?t>7wtTdsp(^9vymRiewCEhT)LO8<9?POsJ>0pyMs+rYV3^Ria@WcdDtr_w)Aw| zv7ZqIsSCOK7)4~>odAYXG1NVSulLlF<`fl&EU#GR-hX7YI$+=;^GhJNb73DrxYKiC zku}Y!_Zm19J^TR8x@NzD(y&7lWohE<1NM4nBkk**W5$K?ToZ`1%bGWV zI3aWl#EFRUbbb)ytrmzAMx1IL$jU&RvoR3Vh{@BB+T2~Wf>BRD-iT_BjcS0;BCoh# zsL{qGkmD{=4d+itPE<-0#Wk92wMF#QIY%O$#@|v{zbW|~m_KG&38phU%F1?s7Lg=$ zt5L2)D*d`kPDrI9ozP6Br~}%SNPTT{M|W6LHC0WY zpzP|&2^=RVr2%oR8fv~Y=_#e$qis*(Vz7tr6ZW<`wK|>lYPBWA00$>A!U@upE_!ZS z4)k+;g9uW41p)mqis+^%58u+2y_hV@X8KsE0+>1kl-kO(%kRZ9!Ox-FxHSj9Zn zA(1lSsN5RI;b;(|O+ns1^NYPv{X~GPdSSv2E3NM|GYra`USIZT^mZ9HiC-~#=(hrM*xRh~ z`yq>6U07__wl}iazj}OGYz{oNvRD?VhMx(4zd{xZ(wfL(0TlAH4UQ>l`I62JoHF+t z#5Y8-Ni??0W5zJw?t1xm*2zCO`9TWChC!k=1k^kMLg25_ahbMF%K1vEBB@gMc&cS^ zt^0(lQjLt?#tnsp2x%{pIk^wi{+jI}o5WaZ21P=c%Y*=}YmQEmDxeTK_!jI;-kQRD zYgmD9#}g`yL_Dab7Dr2U0Kvf=7)sdPM&r5u_QKDj8Rt6N$y% zBuem|4eR|8(Mi`i2h8a(2kI1N91CRhbcFyvXqjoK&SMcJK90GH(X*nHxc=x#&HOi# z36G%r3(1NxfHGt`Ku(A;nBE8OLt%30Q~Y^^r@`+J`?nbiw7ewoD&CRpx?|EI42+9C z1o&r;Ik>1P&g*bxiNH^8G8`l`3xfegw&*YU@NJ_;5d{l+T^U;Rz~T+W|Wv)ph9 zSI*o0a|?e~&GN{Ne7))>{v6`Zs#&i4EMIT)&s+FomcQ6gJPDv@!b|y$XF>%dl!kKbDFO1i-e&gtYc+yU3iku$&yGd?uHIt-1T6bYcqg*~GuYyOb!y7cfa{p~Kl^4cQ@ zFTHHEc}Ua^xSzprz0Ntq%>-NJXJBbepRt>Wu8z9Xr5M?yj(;amPA4250d2kElZTuC z-|Ok)5bfLv)q%ZYzh+csu)Z_l!11>_aE)2&4|z00Y7_wXmGr(8S^$DAkG=pG8! zjykT|r5AB$HH$@W*t91!?^^rR7SHszRwvE7JYH3Yxfc^#^Dc9N0T!#?zA8J1nxtqD zFnfy4aNRMcq5DRC#*LrQ?(u9a6|>A@^)BDlELVOR1O3jozxB<3{?e!4@ty3@i_~!9 zclq5FP*YE@;B~paIA)K2#0AvRHX3~<>bTk_Fm^Jfof|GP+iCnNql}r(iYy-79PmKdnN>=~WX&}Ih8G<9x)T7KTNS`C9jBo^ zfX)1#iztz1ET(#fVbR(;K@axPX!CSp51Alpe0P&4&|{B&CyXF_>iOIdaJyK9%#Hn@PxU*=)UP0c*zajdBS^%e8zfDs?-Ch?A4;>` ze5w;X?Al%JCOok1=LQE^Xl}Zq(MC#U z|6ad}&BHCb@|Rp@jPLcsr!c(nQ+9K*cSoCIEoX)s-C^Sm35m~e8R9Bvd>nDkMtBaJ zU$}5%ZFJ>l_w9CBBPn-km>3cYG-8kW)yjLuBpIg2JcHo?3b4`WWcR zof^6}4joSY`ZH{&`Lp5XL}|+d^gmN`P_0}a2~YGyvooeB=w|G}9cRHfnb(rtUH$w% zW)GK=eH{8dG#|t6eqJv`bh_CL1sQ01=D_~Q_5xi90oiKdzB$=z~M$!V3D0adD1cwi2`>eWbtKQ$IO9v6xW)&Jynm;)38B*HkgHSsjp>!A| z3XtJTUk28Xi3rkHo3WkMqwhHw^r`C95W9thRpuZu3X;azBYy zi(RKkw#%g{Np@=lpOHMER#X5>z=GByO-dD2_?;9Lctu_gxR8(rn$w~oeFqfu(~>@h zIbJJ-MVh>2c4V)gLvk17R?RZDguySvHq}RO{T!6j^4$H-iOVndkgJ{jYh*cx|3}2>xWKk|)58j?J+tsciln z@6&?fwY^bRaqu?Ov%em~)o@fyr^S5R3m}V`TAw2NEM&9!EdMLY&TN-EHdvHH`54PU zZ`$Bxb~I(1lbeFsfk^@fqe8agIGG}Ea+fyYw zq7pzMDj|#vGV$puT4_&#@Sgu5_xUSUDxlUDyLBhG)8VefGi~9c)vEm&C@Hv?`om3J zbogJ~R;RAtwmMQo8%LpQCUt30jpRWJP|$Qxwb(@^$!&%iC_TdtyJsX*d3c>#n zWbBe|p@{{WSV%4P`&NQ`5lQfj++R}_{C7I9gz<`G%G)P=rMi6ak!{Q7J6NgqQZy?P&~`WMYX6L3s&c~DXW-j5Z(Vm*M)|1+?ny5Td|aA;h>)9s(~>0Cqy z#sf;X<=zr$Y#q|x$?#8{v>>h5o z6gKzUK1TbMvZSeda4-8XX`-pAdvG5$pK04BWnc2?I&J$T?XPUZLucw9+&fY?m)(PV ztz{L)P2Yq25i^=dXo9APqg=<*ANoDG50u4xx&`QF_}rN!`@0bf`kQv$!2Mzi*VmDV z78HI!Ry?L;!;lMA265sh>WrGJfNsb~fEbhkI}z4h+p0ONtx((artSiom5iQ|YXxp2 zY#AYeWDp@byirU{crqcwqzgQlnI>YJ0m~lhNDi;g;V;OMjTT@H3UUl?2`*17$Qdtf zx)zcIzMI;iiEc>3WN+_PM#pa8H+c?>yArt&LP+qazdl0>w!*|rW0t&p#OZ;-ie9ax7i$uF>mC| zk}tWzU*50tm$9m(gcDleCs9wy9Rq^O>6-C=V?=|W?IzVS;YGShsMef;oEn~iv&PY) zJ2A;DBLX<`<|%K19K-nuT@#0FzT9sB8Zf*kGYMVRm8@FRL3ve|g+d^xG8!}xnpm$+ zReoEiG657Mlo?-dl@2?Ng!L=KirLkT5STqo4v`u3m~9$n<3Noh;>KfU2;(Lx;F3}c z)`=r@v;dY)b2^Qc5=g=tnR={Q#&_maJ3wfE=3Wcg*)#*$WClof60DX=(9bN3RENz{ zm_RxSwdrFs3CW5j>YbW|I+g7)nFI}{mQ8{h=M}Nly!fot&=E*0;cgrsqUXLGB3mcl zLjN2ti*Gl(%ex7u3eQCrC?5A9PpO-o#_xoqd(xrYd1T#wZ(Z|QD$#Ys#w*f;0!>aj zJyt@dASRnx?F0!-2jRc0fz@hiVbpt?xsbO>892(KSl;h@M%IAPJ$epclj_I;D=GSy zmZ%$rlMa)@4||j$03)E6eDEJw8e-wlPj-0ico85&PFB{Obj;^Al*gUiy+m(0eQIs* zln-rf?pA9$rOfKJa-?3t$ z=SiE?_%T*Dho^Q}0@P!LkU6G`>Im`3FYTyQ(zCF`$&iCZ7? zi#HTzyZ-5p4_@~18}IpxubPyCb0Chl!*~oDoBNFHIh+rj>O&m5;YNrzgK8aqpu>jU z|BWMsoF|v3!=Up+AJ8Xq*mMLM`j6Op*Xb`gG@d&=?(G`9l=t};jeCd3vzlniLF6wQ z=V7%udw4u=4h4CcHk|&p(&ZDCkV>H{p+eH z2+Cq%LzX2Eko#kQWROjLTsh+MXryC3sYy;+{)0oG!?JiZFS;#u4(B8{5L)c>IlKlq z`gyu!U)(RtDIBH+sEx(O_)Ge;e$SY&j&KN~5~6<~`!!kNU9!>HuxEUN;#yR2sQUJg zQ(nZXCY*5oe#nJdEg)gZ0jf9|8++r$_xm0kz8@GHStKxzcL>iVO2453lcfS@ z?k^ehEJ>Lq8aSy-58#%R51%<>isTXt5DquK{74-}TdntuZW8lt_O!&+uy(yGF0HQq z>w~e5*v>thgNNY{zJN@aVS#D+>A3hT3GVB_1EP}m9_&2JsHM__26vc?s0(9WAkDHN z9QnD6B^@Lm-#T0R&XV$awFxNc5s*4b=b+*Bn#s`u)kYZLdNrV8YA^~d6f*GLgTL|G zZapQ8k_~0;^{%`bg(s#tesuO*P*2Bt+FH=rtfOyWM#0ge6)))^Bht}2eWVWcETyVy z>QIIM31gp@s+p~ZM{Cvk*>N1Yw|63XcA|i~4Q(?U4$+ucl(G9F*}m5Hg&MKg^OC@0 zEd}K59+h`jV*r#QkqEWz-PJnB5Hv;8o+v7~mV*cRGd*++g)5vNCp9?kPIW4=Oi~5P z#|pr8@K35<63q=0%5s@H_A2G^Tzy9<6zy>C`jFGR!g)~m5NA_&gp$RjN4mmK9 zsGJ%f^Oo8a88~|_wR!pqVlzwt3+IeUtO>AgzzTIBLZo|zgJT7wqA>RZjF|KlhI`$Z zbgedz({S%LEz8?I?Og9joAuOD=mFA&$usnTF|)_q6f@WYGglY{H}9BNl}O*)_iza3 zw%g`A2F0?B?K|v#IE=^lw)JI~Gv{??+hJDP#%zc8wz2R&*Z#82U;AdY?=+^qAib|> zEPPOq`PG?i2Nc{kW;?vMjoA+GZDX>4ytgB>9p0P9APZ;DN7TW2Bcg%sN}PNkn!qWd z7O;<~h3ljN04|AU@w_QoqvJJIRcGcHFyZ*U}~9{`Ivde?LTvW%cN^XifkFj{bgYl#d{QD9I)fm}c!$&P`!e|o;@%-s8r z@F~Sk7Ph&%U&0-3evR-4)hsO@O^Rgw56axnn*s8aYzF@J+5v+y$&GECaX^pgV>q!Ss8f}m*A7iRF}5@%X|eY)@&C^QrZ zy6V_QlR@}!>Ff7s`DNTmE>4A~QXJ0Rl!*Xoq&X9q`4>esmz ztLr|&#}S0$?f3Aosd{SllhxMhB$zgG{g1Nfw45S)yVw~Z?cU8K$h$Q`4j2x*k57;b zsX>r)7Fx}8arf9Uij$?L=PkNv+`V8}H|~uO-$n5P%$)vd#&I?Z=XFI^c>IMz*q+AlWQ1O{>*eDxZ~Oc_cD}w5}lSZJK+^AFT~l&$DrIn zc+lSMJS?@-_+1Tz+IH?4yaB~^0VWFEeN0L0TUL?dfucsv?t`J1y@02?<0Sn{dyRWp2bq$SO;8sBZCB`xsKd`T^w)W=CJyq!#{ zg_HVt5S48s4J|9xs&GD9GyLdB(WC~Ac3hg_R^vOR8E!ScQ<~vcxHqL4ZnePMTAgk6 zn~ipNN;CYsP1=-ZxYYumH7WaN=G(w{r!~X3nuvPyM?fXDR4 zNTzI&Ow$dJVqH8)BhF&GQPkbw7ec)$9wQ)z=>@~O^nT9nrudqpAWPl4$Gcc+x`O=J z6_BN_AmJn8>>zRgo3ye4K*aF1p@AwR43{+2bHFZy?P7C;L?CHUk4H1}F)R#&MA+QA(){-)l90OX;JyBolZAUcETiXyL!AYug5g|4DE(qM8x zF8Xj3GM-dk=?kHwEgw>$G@86FAET*VJk?U=sW;Ozk;=wQbZDE&x35KALB}X&sRIdN zD=6KTAQh)bMYV(x@>&Djdc#{%sI)5wEx8JxSeHq3?y-(jlob|@+3@~8gSi_7%(Pu2945)!H(1tA$k<+4xv!^cwb+~-2iRDat5N(Mli`Xrtw#LW`h!fzu1G5cXiL(!nRp)+PYrRo$X-i zi>24^+t>)Ln7k+e2K1n{vY1{)tP54&YGA~9(dP>|BRIR^!CU{{(Jpay@D#} z302HhB~{E*#mQN=%L4Cx{U`tY@3ViO>d|%}udcAgUfhmVLGCONJ-llh)$88Ghb|v9 z;LNKx@EX<1%chKGY8#u;a>fwj{P5u|ZFZ!f?C3W(rQ`K=PGR&BM<>(v9hKTbD9#MVF zrb*-6ygX@q(ki&%m@S==9n}(3RV}rZ*VVmIypFJBN}d}Xa%8nI#Cc2|PV(H4a!tu| z?M?_woO#qT(89{}m^?ac@e*ZTHJL=|g&J7w)pPhR^|f9+4+@xDeM z%e6l}PVd+HG(8PUVi1OIhRQ}!d%hkM*Yr`-Ri9(A%y>gRUmWVp@6F{!oDjEVd#Zz1 z-g@bIgayTX>Nij#BAgURUlsp9M41!;GOylA-p%LXxH`=DlQ-+54Pk+j`V6Y9fr|d; ziZI?8ylUX~n>rUcDOa37^n?h&bQO?u#tcuonzE!m8WDenUXEK$xF-yMZO+`wLDimb z5$1RK=|=50tWvvcGj;HCjC$~tH9Y>&xq7us5s}9K4}K<; z6E)#L`x@7w*2($kcDgl3rB+jd$8$!$y-eo9AiiMm6TXv}y4|pOPt!IIBgU{TBk|!P zwA)WRjVH$2sh*aM?U7v**rsR@mX@?694aRX5ti?YsRV>=_zIU&1!4jec`>Oc+l38N2;%F)Uy$dI!dY=isz6F= z%^G%T_vmN9hB?_)^sR3?36q_IG`lC_?B8dgH-xVbBUV@VnxB&W83!nzvEXLr-ocWj zXsAWVW2?83kcR-Xj$rtvNdm+|{yL_9N3k>gV=|HlDJy?DL7$Y_m*LggQ)$IJzAUT< z0LR6AE*}{W0XJj};xf|6HsEA5H+EQj!*So|ZbT1=5Dl15uz@>+Z=+<7qcQ_QaXl8`)Q$Hp(IboU#E&0&|Sb z7ch*mwfBnEUL*I0_&FjDgz(qvZ72uvnne(A>Wc7_A%QqKd+IZ?|4i-pV?Hl6a={Q# z)=X^h(20rgz%#lcF2O%36%jhSjNEOArTbHSJ`%vSv-E*YXcn73md_W}F#>Qjm}|iPZ^7P>Gfa z2_yl>k7|b)VhRO8gGs4G(U4dwDlHf*2}$S!TLeYAp%(Y-{qDWr z&*y#K=lgl{JM!T#nK0!(uYS?1yW6Y3Fl0~#-kC5HEC%i^v=5bhjLA-+Dni~zNhC|jjq0S5D7NXa;YK&sMxYl^k1 z$e7g)$5n1RjIL)r!vS^ENd`lQ-Jc#aE!UL7{H)exL*dxvvh6ZZ77SRTD%XR3?=Op` zBw#(H=gWj%>`-ypXyc8^YpdEAim@&UQL?!Y%~EedF*adq9=U&-R2%(?R2!ifla9lf zaklkKcj@K<0t|?oX@d|rwYUjHQ>nU2Q*(ns-`cbr2MUhvChx|Khka)u6nQrQ#Twi3 ziabof0YEp7rm7)kPt_Gj0E|3Zs^+^!p%E*MIK|JHdgb+P(>*#U>f>n;)I^ub(H&#m zPw+R5=SR2)6tGrtnA8WjG>30I?MiQ=lvdDr`G5geOHJ!V#Aprsg?L8O)rRKTTz!c1 z4_+>Q^9t*u*2R8R4O{7ZAZKFcPGqTL8rhXQ4c?V`bs7_-Gr|S@zgJ;1FSuvI*as0hS!20@=@4Zr;0HGsZn)i_17YTA}|>t`g1c8z^{64CTD`-7hpHV z52HS`-GB6LAQ+GbdLIF3Z?uGii}b)zlBx%#f;h%W&XJquJWdJC&*18=#Aod&&KOyF z_(sqp$pcWlS)ikheshJiiMLGd!zMyD1pbZfL=>IBel|{%;3~Zs(^SP%`=6e|qy$*f zv);5-yE@gFL{6lF37`oL)l{YbWttZ4?Yf?)ZUeq6t;buFbKD?Tn%#pmgJ*oRi!0uk z{1@>FH_T-HykC^cG6R!zk*Qk}Zk5ns%5zvKLZty_5vnb?;I@KTp}}a43OLm!DkwsP z>YUv^?g^x!hsAV7G`UKqN z0)%aXJi~^7V;xuloOG4VxM`?i1tbm0-57rq(d9(E+GyE}MuZx;mv?`LkPz+ihy%i` zGMLsT!P_~EHTalEGklSmk>%aHRr`E^Vx1-HkE5}f}PLY!sdd(ahbW>eX#i7fQETsq{?r^6ux(H zz5ktvp+<{L>u$ze75~?0<|<5Z-@k>dVYr5JFga_KUQ)!%*jkJ0MZOLu=ZdyQiJ`ts#4N28tHKYBIpEBK2Hu7($w zy%B@;Z{DzUK|TEUEa~1o^^cN(uYSuL$+TAQ8`O`_R^@J;KK(Ddf-Q#)##L4E>aAW1 z4tZSmcNed*DBsPaa>UNTjoXLz7Y~Au7bJK@iIl!B`|DapP(Qk zx#>h0UUwvWtrh!==K`kXu*HHLsECbY8$cGG1?9ZxiAo;XGy>YSsBPBnrhr2LU|@bi1;9aFXe4)F;zbN*>3I1E_X%3s5*K|{R@drL{a1-n#5v>@Mo}$Gj-N~UI=}vY;(GJ7` zTX+P;`v@O|w}aj7qLXOQfn0#F20^}Y1$Y&B0vOLI*mrM(bx_e6)|AI33ZtFrWK*W& zQc#2gE<%fBk_RuVe2Ur58PMrOG$uaDx$#;AJ_+DiOu)1BBiYgv@DP?qzt_`KV5bgv z=y-?`ItPJk`op)bE7@xO+2+k(>!mO5oQ>b#p2_FpWKZYYoTo&Ci`&h?xCr$Y86nHCo1McCuwGggsXUk>PFl zGBnjWd8<`NH=xuL9o38n-^|rVLluz#5}6OPAIGSR7zZy{q%$fozNh&YXmKn<@4Q=m zNcshZ$`Nx|ZhuXQOprv;mNVmV?#*l~D3CUa(_yc!yL)#~_c z6&^+!W};4{gAHyZa&7pX5pi+7>g2;^u`y9uhXLnKSVK(6g9vLj-KeCb*i~%`VGWs@ zIM2EO357@RI6wk$I~JKlV1On*LNOt%(Z`Ez(nm6Zle_W~#219OgtWsC4nHfH;1Y-* z^{Pc>IK{Gjah`x!bce_W3+wCcoPDCUO*f7PO~<%1#3r4JJX5@Wpjh5G?$tmwpn@Fw zT49q6fFj5lXKih4tfL22M4~Shp^U)Q)yBx^!~1&(I2pp3Q&^ts5u(t`F;Um^1B&$K zLKw27svM~kn1hTHQ{t$e!X9W8!X1FE#jgka<^Fo;0V;5cn4p6ZMS;^Eh&NOtq^25G z$$$vu7I#t+hkKF(U+(DUr1woz=id+_r0t(17@c1>B=( z8fSO*a;a8JK^8x!(NUg|0!-B|-x(zZVI?y`6f47{@SH`}Fs_7$uyB!(hEmgW^a~< zclXbTBWJ|J%yKOr4#rISKirMF6E!$ITVt2 z$#)d>ZIlI<`V9LessBXSuOm-7`}MJB*slpzX_Eb7W}bTX>zS?cM7PS9pY*MA$1_{y zI9r98d1k9LqNJyxQ12^G`c}E~nXPi1t-{PavsIqHTji@y`d0b)Gh5|2TZNfrZo-ekp__u9Pz8hy4V8JDm%iV{Kt-cr98t5= zr-v!RDPPU{74{>%V1!dN6V(h6PRj_9N)vsXK*bsr_>>8f@(nf7C zdSuVAL?*)NYC$t_gpOR8h}H^5Unpr}_J;4$)(&Zx*I&%lvTR`z`B}s)haa*q`?F1x zD*NBlTM>y2#%$_SCq@wTwy z=5t-H)ob&4xLo&=DqE8V6*Y}2o5@whi5#z_52$^|BXBg105NLUYb0lk&0Zs6iyns_ zsckcC=Jd@7t4_oJRmLqu@1Tn7;pyG371Ld|yoY-xtTT;zaw0 z{{gyQ)|IS-+-&G&dC{3LpOihP`xv;u8gp#I{Eso`s3rt2M^`*l1KvA5dsR~K5*GW+ zY>ur@5BTm!&&)FLBZhEl*-^Hm->t)vs?-WL+PHRu1|d{8vjZCkeokAS_h+Z^xWT#$;I2^RpT^I;igauRRGgDzPfdEJ&j-1xwf)<| z&vZ~l6bTRqtwBK2O&c)}g8;g!1x|GMh@M#s_cpFq9N-=a(iF>?cwLW!v1M6Uy`x>v zn!H!$xsS|N2CzZfZOj_1=k!heA?Bvo6=yQ0FkwpN%)09QiPW|(B}kg=wuU*6dWf52 zTr%Akhre$)Th4UOg)ri+uQ^0ko}VXPErnPLL|QCPq*II2w4w;FY?F|5K*q6Vq7s3K z=cs6sqg*IDFel(4`{Vuv&aW7-`Xo09Gy*?HDhSsL50=WRGGo_*jxO6Ln>ICbJ~zLx zxU^y8Q1j6BOoR)=X`0dHB2 zkwzTkr#3}s5h>#njZgQ2xo&*87tF`_QXO|Kxi8kW#-i13jX9H?Bl6NU-~N4Uv@xt- zNpkC)FB(|aw&|vDh5^=@CqIs8Bx$kOdhNR5QxccIml7N~(0_QY`yxuYG^XA3zko9U ziRdwbG7O6qFqaK)Vlp{pNe~)+H7&En|P@} ziN!c3ixXuZe{xjfWJ7G(gmt%|jxU>8WDmyqsOhcNagFtT0Zq#APS0NF%=XJX&r8Q< z!9OS2x|VNHCHe5mVA3`xUTp}|bXq!T@5QTg2DefV9l0Hh^85+s7|*_X-={v74S#_H zl~UQPJFqLnoq`h_1Gp4FHOvr5OGf;kwjy3kxke{Ph3^oPD+tC=;vh&BMZ@AA8(Gdl zKl$+O*dWlF=8zNk$G){b)V?f<9`M|S8>E9e^TD4nOA&8SGlmj8BpnvqSx)tU_PRW& zISM2`;?N3WA!0$%cc*rLU&83O%g*tUvRUK!7ZF0)RjtcC^`!*Osz9NAp1_>$C7F+8 zL7vhXoStR%|9r02z04Ve1rIUt0NXOZg)!Yr@~#Wo-oTWWyXt*!xf1r%Xv5He_#V~o zz5mv~D&DZSnz<-F)2Y)Zz3xfxq6=$Nnd4&>Kc?e!;atmC&{%AV)D^;>6ganDw3G`- zIh~7=qAe-flCmu++mc>e(rZilZArf^nQ2RAC`rMH=nCXpouxYm#ypr28ke}pTn(}9 zBykAI+^1=R5Xa*ehmFRpl>_$ltank^Q#y8#JPs33NnA7`5Erg6L2Ya|3X{b=7kKQu z&kz~(F#C>-gTeCyyaRzPb8~X+O@bQofH8#XngH&a8ST(*~ z&-wJWUgwn0@dS3+-kQv}t26lz9{GB=jZr0pUuzp_?hp| z%*+ognVFlN8_b*EGnd9<+wB--OAA5q%K+2zWIJAWZNV!6giQk84cTyJm=A}L5yRPG z9}1SbuFR=yR??E23hV_cfw<&mGQF+$+we5Vy&%CXH2pb{mEaVnuFDRa5lk@h@eb>^ zcp9H4Z5o>dcU)-8sMNHjUR9(k1vj&6_6!ft(khEofLBw=J<#0PgooD4VGYg2mA91=;~gk7PSv zj)Ak9;Rtv%m1bpr|w&Q800+WTvgIyH- z!ns7>2=8C^Ff)vN4<`F>p45GO)mCFVh#*}E9x7$g}n-9(|vE|HQVW{j&8 zFpL97-KLKa3Ggz)jSp~sAehx3tr&hD1Py)kjquGiH`q^w~?AmS*Qs57(9 zs8Fdl(5xtvfyC1E>mQC>X42`i6r$>pke<_BeGVdfuFfxpXVJH6K%7aku2!?eqMR|u z4uLAEEjT4Zpy4ii=+1pIIh#`4w zKF+zAQjvPl>0GRUTJg`3F0p9Ct%mceusgv>q`(VQfXB35GU|%eEoZ<%Ca27Bg3?`o z!^g78dbq9La6`04ga{mgCsSzIwBt2zSt3`3)|2B0J~gFSaOR)UD3mSu^`3Sbg+FdE z-4U3C9B`K76omk&d`1J_JrvQ^+EaYfU->jq{*ds@$AruG+2)f zQDIAf^jEp{-MMnD>r#gE*f~&wY#FsgFkyS@!~fwgvf=Nwa;?7Mip;!&eoRzKAWcG| z$uN_C#$b9;tSBw2?kWbWbaJkhBWc7ENqi(-6O}~L8I@b9(!fPsbI`{&)Vve<1HHGy zhGumDiBsol710-CnC4w44#Lhbp+P3~5hJp#hd+Fx`0!g#6+V2&(;OfEbukfv;`IP* zkc-A0WnepsTT%ZrwL6N#VEa^9-%6Aur#r<5>Q4y{Q6&!Nu_d~ z=?}Bxk)aZ6d0ciY(rvf%pe-XsAS}|s>)N>KceGd6CYcmN8R~eKB$47^PPYs}6mc>< z)G|b+KCBew_CquYzpHm2JhdrtCPGUno~&mfdN`!JmuA6a>2=)tnyY?yg~GWhE4wR( z&^6FrA-09w3xS&>HZfg+lsQVzr)PPv#YlSx7evlCCQLlyv@(d2J}F#aRLg}_8~BbG zAfrA67^SmFt9!d9I~^knA{4qbzWnZvjF5;CsbJxA4P|gZdDHgHGh_U(p%j_rCRr<| z2?SC)FQqs=Ly)}Gh(1szjRQGEc!_d}^$7($`rV&LQ*?NnazVot5u!%zk$RIv+%k9F z*L5WCjV=J7ULgbJmbz(;l zg`#U7Fkqy;;n#AyE}0*(C6dWW1e}hzGjXO^_hv%uBXEFQS|y7v8>7efs|Aq_^{3am{-UZ* zWP$2(5XFjB6kxGMgV80G_Gwu*DpSc_8~I3e zGF2ZL9d8!xn+0z|e9c^Jd0GFoNLvlsVibVd;>BM5tcwvI9L+AY_OkmXRo2@>y!`?k zPs#|y**!65qk`h6Y)}oADq}3gG9-JgN`0(LbeT#5Gv5kucW0cQokl&TO!rZR48qrx zZ}yQ$$YGkCq9@8tm8vt5CC^54^$)4YC}r*AG0I;MHZ`XD@`^({)yCQ9XBaE1Gs~Ih z=u(PHuJTa4XPQ-7ge!lGCtD}Wg~5h)%s6rR_L|%NEW<=;&e;!SCV}bm!SJ`|;;CZB zFiAr`xz$%KU{jD*oKuHp^5Hk1n_@DHn1fQ`kPdl`3T9$i2F(K5+AxvFiS$ad=Xgpc zGs$F{h&C@K+FA#y^N@iv*Fhu%Q8SA8R#mwP9zGGr%BIm2jWxo_Qn&N~FSnviY_(ua zQPKs|W+-#o{)IUU$a^w5H}5Fk#!&2)Vbm5MB#~>?hlE};F6*rgOO#CK;s`^+;JD5k zF{B;EOTyLOg?Y0Wtt#sSv`nW^jm-3NSZpmeyjyTv4JJeY;{NJIkpP^+x1$ z68!C{_df)yb;l3HQ+EQbDi-JWZ2#<%ys$et|H|{X?j_|#WFy4}Up5PYmuHlr?5f!) z^9D2XneK+uOj0o&WmNeR09{G>OBfrs%p+Rz)YfW4Ux zjSO}FA7}rLRpaNUkw!hh4LcKDbd;C}M?FNG5wP`V*Zl>!a_#`~u-ep!;{q z(xy8j7M280ojK;A^-D@S^B^^^kbqg37(Fo#k26XH zdi7kGS8$?my%S}BoHOVnxt;FH!hbD}5xu+c#7yIBVUe#UHOyj`;a4^#72+9V9A91FyeC5}15bx> zde$S!h(;7u%X4uPBzyg~_k#~px-+qO`+Wsiq&N5t3D)pK8&zOZCj^4cjw1L>`aliz zY99pJiH7vZN&mWjkY0{{7eQ&&SKANsv9Sk47v+u&_26ed^&2LUXTR8+;n$BzGw1py zxnLYB!FaWCW(DJPh#+d~C1&V&xzl3Wuw)FS1pCGTZch@#=>910y1kQtga(LZO^|tZ zqe20}Vcq~<3OUVOu^Feh)F7BK7Ds{K@tLSsVD$Q=e@k3yS>OD&Lk*W|L{{2%5`wzq zRD?*|E!A~M=F+JGRH*`vt>0CN>7x-0lLRJ|%otDIQkA#tuCBV$W4K5WdKw)$`;{3I zsG8;=Q0u(WSOtuQH1(MAkl`(H-Nr8O8gIu#8^Lw2KAzC5E8MZ`x2U$4B9+jkb8y=v zT>y114*v@YW7ydd%80_nWRvJXs`(fSOo6LRVteTXq`HgUFq&DDq6z+6X>z-ceB)^q zcA(G&IHlCry%(Y&gagvTbVR;=Ih6L{^U@ps$)<&LS}cGQvT7m32aT>jguYVOR{6w^ zqz8_3Bz-7ZzN~sAecRj|-|Zvm_NUd6geE?Mg&odfi+VC-%c8u)AA2XLKma=wSGrjk zus7vzeqWU7Y?0M3pzJi>OJ(?>P-YtD?UWse_o^r}r}H+-_D5Nya8CJ~A2?)Fz%Cz} zwOR4PJs+`5C9NVSMK@kmT)l*=$boEjX|~zs`r13*2?gZ!ik!}`@S_)JFXxBK&f~MY zvpx0WR9(BR(RW<`r(lmG8|ru7-jq$`c|JlvYdL_4JkMXZ%x@?1Jb%+NwJ_Vq_5HPF zj$t;$ynKW<9K^{13McE)dZCHT#WN!q>uq)K zLa>Ufwz>Y3&m78X20SqhqP%$a$39~lPCT`lpF!Nm0zaEE=-Or?*o@I`_&ktqkBaL9?d^Dt44-%Ci$t1^HCnRT$u)ZHqbt{FwwvdP zXWbgXhvsR}t34%J?+Koc*XWpUU89M@W7g=5ZjIuti8Xo%&a_#hGfuQdkG2C{V~rki zeji#m;Tj#jWBqINzf7&sL-5M&8vT&_>1Su_7u1J8eS22ldYC`k>)ZS(>bd%Tw<3KT zzN=b@_uf;~|E#|4A)f93CVx(?ul0w7M)l#FfJxsY{%KgqKtgFD!zSEY7ndNJU@y~@ zg#2tI$de$4o38WWgSszOVPmJJb_D5u5dudzR4i-wA*<$Gxyub88o|ZT6sUkM1k)l^ z9R))R^gZmw6E2^12`0`kmV}q)Zsrn%hI~iChA3DZ7vMU|wwToz&{uhKWYrIs>XP>~ z+-s{m6z|mq#aMy%x+cQvqZ@6(Xknt533%`rZOj6jFmN5@P^hQ-kV@>5cm~tLS<)aw zDAt%esVCo{`!-RATulCUa*Ql{O>H||H`KcbwIshJ7NQX?g(mb*llQ~ZYWIgw}& z3q`7hj5<-GJt;XPlYD7{JkWVl}5ChDT027FXhui3fj8 zl9!El(20IaC5eRHePDJ9AzhC_V;q7qIT>X73tDCb10g#>hV)f9h0D7wzU3kGF< zj~)|ryoiot?wLBSmC>l2?zpN|MjljgZ@E~}@u2gI)bVnn<9$1h95+$%O~+9@O4hE@ z@tLmU%99g^(`cAF^7GTpLVmxi)4nY|@l>kQj&R5@_fMTVE$PoX1CUJR9R?{<{L`AW z_mnx(08m`|=YB^A8mG1!tqcU?ao-XGIC-PCaRC3m8w^lPvW_Gso1$Bq@skA<0vx4G^N6g^Hp; zwW%i{rRa&l(wVWso)q?EJ(8}qeFeW!=6Nhp()9G3PJ8aKC~)JV5pYy02P<|wbG==L zJ#;8McTX#oLx*36o>ln=0&@o)_dHf+F4peu5u0n&neLrzP(zb^RW)r?3O;G-3&SJ% zVJ6Y$3jF_>gf^F@FjkN3Q}_vsHmR!~$KbQh0$12nYS^;lSSu*^vS_ohf`U|y z6>r8TC3?fVzL2CVYcD8bf$ghl$=}(_=Nl8>J_JneS+^O@9(1E&7o0u8U-_H1u3jxx zUrstSy>HcX!@F2l z7u8>j4Q#^%kN-dK$1dXTy7unJFN9=Av}79v zv;@h7ch6r|E!{%sqAM`7U`ZVKk8F0)2km{&s+fge- z;5M$Ey1 zJ&*wJ3-6oxp|>&lQUzZl9=O{E?GpYLEXnXH^0oshK)1MupNJ6BSE$Lyt9}VK0o|_h zrH;a3RZQaIHWeDwZJM0oatvK1XW9)`Z+3Gbvj_8a;ygurZ)P`{qc!0O@UsG?ASm6? z#xap2TigRGvDd7=f`o=zfbx3P2$Eq(@fuUZhkkfR@!F)ejfI$j2xG1K&Jpy+hX-IJ zXeL6U>okPV6wu1g>+Kq$nU-g!4RkqgqWa0y7hv{COJX)^?6ZgUUzu*yeaLR-heW9u zupXpB6$n$r{BJmB7{hkv_~S7LoXR2Ic$E05wWP8dK0XhHMxWAZxU zWPtBWCp>>u2#5Riq2RDpeX_kk3A4L((!F~BfkXQ)zhYEO+`T&OI{;ani+MZ9mYGr! zks`cIzWi2G!o8`=sRB%#_R8eDlTRzM>#%u&@BjP8y1b-*Ju=lny(KhGGXTb*-W=C+ zje;Z8IP=VA=V(o6`qqYgp0hqqd2-eTrbR|OQPW^OH35k=&RA_tGfhp!GAQE7JDvYi zSaxhPk{5W(jBX{vCZFDwfP~u=C0-+YL*P?5mk2+_tl*3K$nXAnqB3?PhnHP{kb+18 zu=W}J)mFjSDftR!rff8_KNW)qP-v^6<=SP1e)Yv>459Xuj#?#CmS0OVH1uj3PE5HW zjhOk(;d0!x*<@K$lwbe{V*VswrDSK(=@}#YTGBJN+1HGC2d1ViE!&%2)94w8jsyUi z8j5W%2L00xBN?qQ`FD5jB#m;Jx^t=kI(Zs(H{)0jZTsbZXF3Ey;|#9+7cgnwpyw1b zlmBILlk5JTdK>9B9?$o3ZgI z7yjv3$C~Qm46Hf>{B1&kegpiED72KKLFuGl6%M^Ilqk?UQ-ULg62{a{fSiV3^JO^Q zdYo}ShUpLQeqpiA&mB^E){qm?EySJ%Fo%Z?Bo=BaPQQ$Qw_bxkLr79#T`D!+4Ao)C zUQ9pd7;1P8&n9ZA@Al)5Kkt+@;80-7tel<3%GFuW7t>>9u9E(u9cvW0i>Jrhi?OD! zyRpi~1ZRRoiseoNN#c}g%7T>#UR*&1lTC0IgpNcdO`6^-A;Ic5ho}%LQ5hdUS`!Byh$K!5N(t1yT;XkO3iekY3LS7S z(x(`5fd>>uRwSWk$?EL9kaQ_8Y`$q*DbWV=O1aES%d=Bj;Ko*&MtK1B?uq02zkk+P z7*Ps|rg?6N0Ye=6BD~?56kxIOiW7%vLoO_|-Lh>R^1uz+qdTg$6267Jpbq+V9`lb4 zU7Xj+f+bG;CL#o8UE(gfE$mO@F1D2W8muNoI%wDC%A;@3>#DwipWz>ns1uGTHVq`F zgzO!E$>V>{>+*nJANn>geqamMZEIRae6yGcW!7UgS&o8z(B*h$N8mMc;vCOvg1Q{f ziBAl=$;h;Aj%P=k;z@Cmp;#6^GUOsDxEa4;ogfzYjpqhhs^ZWQirOd@t?%B0;^n7d zZs%Vmp6`?u3WDn5vUbLujt=7|DKt)*aDTBN>^>f5_pPK=`dL88tG6Gi=bWMv*av3*ka;aPWQyZ@!hs(Zl9 z?(D}rRv@BA_`4=98X|G<6AfRRK6Q+zsyYovIhVKT<8WRJ85rvxjeGopzS>{+7B4GeALo~!rjFUz}EXsN#@<1Yn zFdbwRctQ^hB?*6yV1mgpC*x*rU^BVe=9R3*fVg;CWMG2xi%ZaYgo@NclXFd8m|FN5 zfIQv$;1GmVP?Av2FcscIH@Ej^=@~KceAnI>P4^rEhyuv!_5-xJ6hKwC1@}b(M0Hzm zBnlv@n}S5t;tS0xNG6vRS1wBmJgti5EXR3sPB{qaCVxR-H#ENo_;uQ^X?`!Q2Em}? z9Q}GO5p?YU3HO{7>7N&&}@b(X3IVQGnNRSrLgX^!ivi4;eij7nlX8md4dz$J}h zbxW+Vmcqk7i=OY4`Y{%dN0X6PGi(ZmzeGjY3^c~TF2idnAl7G2sGFuPS|{SgOZZuQ zac2H&gbOfAo-#&z0y6b)-=N!jo>H9V0yF!}<*fLjuP;9nn+=Y2=lFU}WdN6;90rse zD;yvu%JHNI`0Ay2pWy!;1^)UUo_!s3+m@Q8`%PkFe;3_m^ZPWBiW z-Y^@7jhCMZ+inTP3`D?gE@gV7D(b&F4+bDw8ntXd!_5SthHzZgyfJ1BHUJ3V;F@Lw z=oobjc)K{aLW(X$AOeC;jVn#n(&?WnpRBY>fv;DqmMJAV>zVwFc|~f%n(z9Y9yC^~ z8J7<3wj7&J76x{4J#5JzbV+KV+9s{-fT*OEq3G!vpG!n`pOaYJ&lP+*C-3n*1C0T7 zlPVd;xIS;;waK*ilm#JCG+^B)bFQR39TXfjY;^|!-Ng!ydc$u8z_Uc4vYmh^o2#fd zy{LEc=$oN5KuemTrKN?N2ujO`A1kqQGY^*l?A)@ilR7` zLgA>uroGobaOY^o;1@Gm^y65b^A?Crn<#q;s^dG~+w6N><0B!(4@Ona#}X%0hO>_5 zmCR_8+JV>@bTtdcblD08BCq4;o(stN;|Is@vDCj4= z!wAGGA-UQPyW}6Y!%qD9iFVli-}N2#E)isFBCah>;6or%{HSQ4zg(2NTI8tQ5JULg z<(o#cH$p6cl4o}puOT{NoKJ4A=7lQ~H4C@dB1ewzv}323A4NQ%5++|(7pMwKZ8Qsc zVhtd&ik5JnIRSc&h&3+$%F!ur*PYd|t%$SX#R3CBnkFH5cc3yc zS)8Xx2!hq^PSUYJ?F1)j%JrapVtqLBp0PnqBUf`0cSu2Ofm`BdGYBW&%VsA6;)qH1 zNS=Y0am~C_$fOHZk0{~wZ)!?2)*&s1(pZC%dhu9VhF#8N%5Aabx41f031e1z5zTPd z=(vh#qO^%K6F<~@rRY^CikCC-ab92ZVaTX|Ku*UK`J>`u6ekJA*^qoie6^)*H8r(4 zxuJ6mC@JxM$dm9!Z;NR!)PfIf@6z{`Lu3e#T!8Mi_tS^WCeTNzmrssTff{a$m2HC9>Q`$;js(2vyG#P!(2;;Q(dJ6PMJ{<#Bp~q55jQ3QAqg82u(zV}^^<^`@fVV$AJc&K zK_W}!EN^)I$ZQkBG6ISc@){snCk6PK0*f^FLi`ORPw*r;t zy#k^)KQx-Jzm%O@&BLKylte!ocpklj4fdb34Mw<`?hbO7P?o;hWzzP9;8n_pf7l7r zYhK@fCm;JdD>S!9uXB7k5)zw#8JOkYj5~44%Pyk84zM)mU6j-|ct-+70YDQ$Ac|V?LoMIr7c+Q(1jbqu0AeAo<;HHk2$#5ET@~Rjq ziW}uI0wqwOnP*8pDU%}=%zi+%-bav`ew}*5?S2l^eE86y9qag4!Oy<3GyJ1E3icO> zoor=!BDV?mo#by8!6gDLZ3kv{Gc+V`ogE9?1%Ztw*4l=+c|4E77J|Qo)bbpGg4rt2 zeRnR{VDwh>JG@Ea`noXHFYBwzcAmmMV;>3Q9NX#HHRWiw-mF(bSwB}pj<D*j3Q#B$1)<1KZ<%?crNUbH(ut+lP?hm|K3Y7p+~<7$ z47J)=Lygd7bt=u9FU&XpNcL9ht$6*74iz_!5n7q6Et`FDhQ5UkzqHCPB=v&x>Yv^? zFq$?tF}--B+66+h!* zP(u@{!s?N2*F3fIrt02aHZt!t*xI$Q$x@x)Q!mKy{dmGkiQ-97^sUnH<H!;ZWAOf779=)zfPd2JF!gEzCl-R)EbATU%LIWt z{+k>;(4aASGp|4|6RbqSr}d6TB2h|;l9r)t*#3Q7%J*NxuYD+{7=Iy>(*2UtSI1Se z0qCo&zcy~fE?9Jr$5v)%=fltVCV&ef(3W{>t6U45?_+J#ULFXFIf1&zWh&48sH4iH4RY z2TyFY>(O!A8*BIXS|O8Pq^dLYj-^UVLwj(k(cUQ(sf7qc&`542a6f`)$nx%O=+kqHbXpy%`m z_{%9u!J@HyBAJnLcGLljaa?nO19n5dg*^yMXH)<=HklI0xc*k60_b+mZsTD@1wfb^ zv?AYcu~ksW@K+UHk6G3f6(Bg(K4LsL+8hIv41TPMWjB z_#T?CpF^Swupbm%!T&@+h^g9S5d*)7GN;ktRaEBLkV*dOF(@kjCneu!@$Ch?T^rqo}S#{ z(VLFm5a~6{=R}A`PFGZf@an7xBPfPHCrL_>6zRYw|;DMDJ7Ss_`I-h~g)+hM+9R)vi9^vLw zjJ}PawE&k~-Oy|pd(SX>N+W*8m1A2J$ZpMi>rN0y&K9t|K!b>#JwAyE6-47{+akMlYi0nLqL>h>; z#8-vF0=_HaJMz-e8gUsWKg_!i?O=q4mPvudYMU$0wfS>6*QJw|Ue=iCMc7Ll$=?9G zfax=I^1`o`MShGyFFFaQn+`6HX44eOccJQIQ0%tdm%nwwR`-g;pe7?<&aQkf15(<` z#`2TNSFzL`oBW26?_|MSg9Z)LT%z0@%`XHSH5Ro4x&bZe!a|ghtmbsyQH+k~4p;R~Ki)h1^Tkuh zXIKBQ_N#>pru?8f9RC!&yY>Yeu>Z>#fUdxl+}PVvSOce+w;gM#@-YT@9gqcnZpg%bn7bqG4I-V^t8z^Z*EA{sTp-?aELcoW(5J_YJ@e)J@3`u?PqaRDU zh7W7qHMuWb0&RSp7(}kN`xezH=OG83h>I)gi_EmVE)mhi#hr{e)YzIbx$qrqn~Au% zd^R0gccO}8ys*oq;@B#RU3T@jl@u%CA*@@E=?9PjxSSvkZL)7=0o-0|zul^yB&b%t zJ+U={6%3kD56fnS*%YT1@WqQP8RyNG7iU{y`%IJU@m9F*{!xh^XyPO^TA5fz=?O@d zhom>{ z)5a-@2&&O)a@RUfG!#}H;ZZ3c)Hm3>nFs`C746Wk-GAK9?0dnQone46^y{gm20xD{ znl|FehkP`Ck!ZnQI5vut&cJ($!yJxCWGGpXfgW7vV78oAuTMa* zsV%|>k1eecW@w8v@}6*+=FmXi5Y!qiV6)XUr66If#nupo7<9Barp`KTfDapwlf;Hm z(YCgt3d%NB)TpJb0oA98k*k#Pkn9*;F*>yp0CUq!A6;7gIFo zVjK;cZziKb`;O6|C6EyG7t#bjeMg6Ep`}r63@KS;U5n!>ZhRD(6Zw#$*c=v%;$Xvd8Z{y8w?fRZ_ zxVbuE_`_f!{!0@rsA})|-xSr+qY0{{S>hqed%3urnl4_z+-QI-&Cr{m0r z|32-!MsQfXIC}wYBY-A}fW3oqFhl~c##G1l6uhZq%W~M+pk+x_qU|E@I1|G&ExY+~ zVaQ}Y7%euI-HTy16-=X4-;`zd7#65!8+7mv>FNj{oBE1b;_#PTPL^+KIa$PJ(bIad zlnpp^3)%omT2|m<;1$rF#ybdp&%ss{VxPS&EdXdqYSw@gAUhqF0UH+wcEH7%2Pyr=!vdHYl}*OlJG*$!at7i)Na&2L-7q0pam9B;hj*S@Nu*f23ZYtQa!)7x_XH zT4Yvk9DZK1S;+!xkD$xzh@};0XMGuba8-a{vXo;Sxrbu)5vFhaKz!^Oh35v)tcN-( zrEIhzxZHS**sxlB8Gn|}zlfK`-Ggd_1%sDeGztYM%R%+bhjIYpbHHYsmtbKbVwQ1# z@kpLIDXZCDRZzUDOlUmNC6vp{EIOYr3XqpSLRq+*U!UmD1d{>u zvF}?^=VI6}2&#ZZhdk@jz03J=MZI$?MZJ>+Z(SxNTwcwkC=3^~ z@sLUc?(leI!sD8Si{ID=?1?e>Lwt%<+yExHjl+?J3do#O(mQtrhs$J?Hz5axaq+TN z(u*t#NpISAjJkr&n8aVQ1+>?40x~M19~O`8*l+?*qNMlpYvf}*E#aoB)naX12ESC< z@IydFI3G)sFoYr?1pGweXVFvg1W(f#+gxVorj^?~23In;305f(JUfmm#LvZq+2o|> z%+$G|jJU%cRpOpjtJX?M>O8!Z&P*H`kC@s!O}U4LpY}#Ig?tl2%kex-83y6=BtxgYc*wBg3 z`{0XE3AXo;F~yi_4H~H6qxLzF9pmfhrn(=N)5#I15y^o*1S9U8Al%0v`>VG@UNt_` zk8-mk%U%?&)rBf%S%$ zuzCrw)DktGMWH2{3u6YfAP3xWNc$~z%On7qd8?TOq3U5h=` zV-NYTK@g4VX?Rdd8k`RE9H)oF;`pWRK)CHDXwKmYJBjfz9CBl(vayrkJQmrlhv@%} zlIVGzNRH!&Hs5G(SnoFi=LF`FIpvB66^J-ws9c||W)cK~fdtxI{^xk&jOsv%iG%je zDM_-_UVZbCMuf|1u~(I0&RPXAG3#tOAJao%l%&8dU09g!OE{qElAn1dN(E_)OOs%D zF>`)?U^ZCL?uAifnh%vDs~D+1e7}4dr)Q!U!CMz|6en0vF{$3O8$i9m0r09_;H?kc z{;}-T6t69--#5Mqn6H?8W=z>5o7o)zwXb@GJILF5LjrXUVC9wEu^|$*9$ew@_nxOf z9oCz(yCR_xHbEQe12htVkDF}c&C-PKPRoHievk}Kp%{K+BlA44>B?o*kUN_D_i+zv zCBMZfr6jJ$%mO6rV(srXj*opR&NpB{-u##6S(Yn}t-q7Kg1>pPdVAh0F9iR>#)fFs z9o=kf2lwCyr868~v(w9n%3Z^ho>vvSu>qm&(9&^v7O%lG?W8gXFB)|VTNwpUsIu^Y0Jc~~IqI^il<$=+BzvUVlY6-5PrIorS6TjGS4WVRO7xKEZ zXq+INN-(=!md)a#x15)|gyyz)+3D!_H;w<6HYO$``Q>(#ae`_5_#mP@QPTO^j$JB9i38N6-c} z0FW~L)K$GbeUb7oW$vRp(mt}ME5E3>)z!EK;rmb)K}U@JA@W%d%n~YnBBx&*Wg@&l zso*k2=Mi4pklEo0AQ#SosfDjPrF{6cVH6p?Bnmh%5TLL*B?(T$#6Uv;q?xka)L7+e z>1UDI_c%7|kR`*92Pv((i}kv3Ylt3rTt&04yFCJr+H7D=o3+T}J_@2)yA6d?zgWwL zi1H0h(`I{U>)0EX?(tQBWi=7>JVq~}l+{8yHJFVFAh=S{nR^onI=qvgf0 z{Ai1^Jq2fFU0#wbjy2w=<5CFHHDTC9I?cHXVzS&tmGgW%*h`h8#cJUyxDY2?IkZLd z6jj(fUmfKNccT)1{Lnt2b;SILfQE@Gr@1huVu9$<2y>Tt+ExNCKQ(T`I+wAz2~|L{ z=|ma>4GIZZ=Uk9tPeA%!>$dn0^bewu5x8emv&Hss62+{+xk zsJJw)Ow59V20FdvKGh-0N&2uvT}ZKpPKP(JJm<(yhEy({sylem^SFZYeJ$^ujZqAB z994ltmkN2-9-$lz6bYmcho5VJg0+Q$s1R@V)3P2>O2-GCVi3wOQZT+2{Yhj3MdlU* zM0mu1UE-(E$ry4zXlsG$wNQs+!X8M4vTw3LL6!zr)}*_i;ozpt&R)Baij|&61Sn12 z(DOSndI4l;!@$N4YlkJ>L_m0k%Og z0-Z}#)(v5)nN`M}VleF5i?DLOd(IHgJF|qCcBjsYY}~ta2uzI+(!-F(;v7&NQcaA3 zz~3r~j4jHiXQ`;s2B_N5)ySu;Pz-%M04mwZ7>KpZHephlfu#L0X9Y6KO&v(4lNwjD z9XP?X8A=&RdRAZgFk(j?huiZo$u$%0O6S29rxs^xx7~yUx2srt3OOiXQv;&0co8!z zpPuE@PD$>@;~rT^(g$mB&OI8u_CDaSv*&X&^1L(n3oG{t^XQ0}ES7J+hl)Ep$p^XG z)d>KS*{QSNT8%f>r=hN!sT+~}9z^mmj56so3ZOGN#X91CC&VWVl=8>nTmOGMNzhFI{IG+?RNr|eNxUzn@oz@D(Z2|g>W~iYsM~6RAz}(^f zJyF2q;l(piFm8^6r0GR0w`d2hlT`*7f>j7-OmW*7ihbrgA~QL)W;yS0V>C8-OfRe0TzK zC)Fo|SmdCHkY9#Sr#9egk%PcfX2B_35SW^K`O>qj#XMFE)k0_wt8fxQyNvE(fN*i1 z%?sbok8XERB3n3vf*8PDjy8~DsavndZw^>NFn6Kf7H!o$}Uj;CKGTpwB)n5?hF95Op0n~?Ip5>xl zxZ?zp|E(q{Wz}e+gJ4nK#smn)by!+JHxMQiM371~W$~$jy7<9HpnHUsL6TfWImj)E ztyU9R^(RDD4_?Dr5t;AEauXseV$k6^IAnp!y04ZOq6M=zepp-0Jdpxv=E-pZZ1EC4 zCO^BlP&d)NCG;Qy3}q_*@-`(^Jn?w4G#;aGrlBrEqqE z@pyDl51+8(j)z5bJPgb6Fs#Y(Ffi3j3%3_t! zEk8<*@%rwC2ml{%kc$cP{pX`LuYcu}znt%RVGf^wtQH#pZGtP({xrp-LX+V1fGV{2 zj|Qk#_7TA(%zU?j^phLrwrV+uOxxp*NChVfZCF)v5prtQ$D-11tiJl-30h%>WjX z)=647(NIJC zLDEhO^rmbQ9aJ__9M#%irqH&4H~wzGI5m#tbvf4(_l=gnpV1^@)^=BP~^rIP&L#6Z$0WUvhXXsN2 z7q8R2j??+4n2Mb;cGH@hpKPc8b={1nsN}wWfzZqF$F>wnm8@DRP!rTh5Fv$I55}NV z+N23>bxX-&lsTiL$IK|BV@5mK9%$Ao*O~wL&XQbV@KnQKsahCKD=LJCts!+w2+$A$ z|N5GH2_%ei1iTE=MDT5PH=ZS?hC7X-_`r#UaUk#5XHmLcy(yrCSm7Re;95h>A>IK# zNlj_*L&g$kP>SQ`sY|1$XG@_sNm(mBfc(&o-20hBeC2i15#CD(37~`R?0S5!JqB-g zFRs<&N58UWk8^kPRG&G6Q}3HTXNr!@w7JB4%g5_;*cdsQfB4jj(Iltv80jj{Xbhqg z+LH;naN+AkYjDa!!mhiJ?LQ}|kr~qCB;Rw+)JHMz!v~%G@j(O*7}l7zC(Gnkz>ZNa z@o(5Xz?O5Y0nzX%@)2lN1cr&2AZ+Sz)Srk;*1u6{OK`op(+{x@ItrpP1po+|CW6vM z#4dN7{b~1g6MMz}G<3Y8Y@mzXZGS+Vv3(fM&ZLQ(lv###SduBnXgr4LMkBKfypZ%A zN^C*^wI=C*Pk|qg6N*h&yIBUKxj^VhO#`9pb{(cP!9WIjfB;X(1^^-41#;Ck3ix2G zKES*A!qGf^#Qn7CBx*bGV13HMa7OX$-|oI-#bKd1#GGX3mFGTH~Ht zW7b8bXtFs9hzX3&Y1&aJoXP9M=#hzRJsAB!nM@|sL>gV0Ar0VD_|ak$Nhl*z(-+~C zclm>8f$SWz4N>+IW(rMx+1(Gkht*HtLySm1(KXpN z$l$ob%wF40L?oy2!*=qB3Xvuvz zFC?GxUju1^0CXm4HOtWY!2@5&>i?;J>^&GfD;E5Pxs*i|-l;c@RfK+^DTjCh(DJ>E zk|?}fB<+NUYr$@&A1UfpZ#0XLsz$ph%7+@{X?Z$I;{jBaMCjv4F`jq+}9~bo( zRSuj|-<$3}*o(XS)7_hYAnqPWcmM6oxO+I=9XXmld?ele(xd72v2^>9@1)x+Z;nQ; zyFvxtDfKn!_J*s{?X~IlomZ#Z>(lLfe>UCTkZzAQw>PKT>wYdhJ(zBPr@6f?-QL>V z-jQzqpt-%LyJf-|Y`Xnu^Ys37duMa|K)Ssv-7-a=__>^rh4sUfD=*i{fHOk|v#76T zyp3Hy8G0Ys_l*$rC_{1~`Tj{O#t^Ij z@bZ^q_b(iT4TUecrll7z#l@61%aw1p-vb<>R}E-+I6(`!JFev_yaMVQxT<&5_gD}D zZkx4cNEHN77Jupo8KTmSyc!&W1s;`KrCRjBgxltt$Ixq*@s$W9FcX>vpqdUuJ{BM| z3&;fa0Jj;A7(;?UlBpoM`tD!Omy7zjoaGkMd%aw9cZOP!!stdL1z35#@qCZ7`pQqh zD>*y6&Wn3O8ZZxe{nobJS>ph1-lX!J%9&U@vXuK{Kk!hcwzj>A)|Tmhy)A{qc#dp& zuYR`tIMUD$eg$Mhp#6H^2fWhf`nLCZm2^^6RuUwWBMb+NDmU1i#~D3oi>cd^SeqC~ zZS-)DmiiGUqM7hCGmqXCGc%;~j)pb4mJvpHNO6Y@6^M`{r z>_eZ@1WZu7sc}}{#MP~txSNPE}DdvCo!$GKe*mo)B zkNy#5vc?nX4h%&l7={bL5YslHc8J>oTox=_}r6o&UapM+5H=1qS>@w4h{ed#){v77s-Zw^28 z{Dr2r>px>beRKM`=ZoCU)%U=qB?0#EGtXamLDTNH;>~?#yBXB?dN*G`;Ln_IHEkYz z@Ez87<=6SS;T!y!tq=MWZ8q=R^KiU#zd!Hu&tiQjitJa@+ORmPZ1Hr{CVud{OQ*Z9`r5S``GdJ1qd)i z)hqYK)puIMNdVfTcf4~gKy&kb_qg-}_Bi~t)+txm&j(MdtwAL5LE{!mD&|=@9(GE2 z*-HL%g_Ef?KRiaxAC^|k5z&|?d|E+uZGPH{2W112t~x z8ppQjNK%-H0pb+MsNz_E++HcJja*v@s}PC~Kd0z^pd$FN_O`}~JB+gk;wFgxQRI*e zj6CY;{Gg|B!9fmfe!Si>jv;Jb)5#f(NsftqFw^$$Xy-57)3225l__um5GkXiOB@6m z<}k@<95r9CO)8osA-HoM(N0eIKF5rQSF}Tty7*AhIL3_`U}Yykpvm)(rnL_t+H2$z zSZ;Kp2^t9o8{ugyov0F#H~e7E!_}m_$qk{E?uHveC)z;X+2~=r9O3FMo?vGtIrHvaSBM#($L*(Wuu6+t9+SC2W(dOgUDR)3u*M#W$aVZ5G)q0rDXFkkj$|(h#}D zry=>9Y!`xmt&e#nwJSd-NxqyHGI_}fc=#8aEY}6B>yfnGNeyPTPmenoYH#O3K@Hn} z17l{A@BRFrWy7yMf8m)`$%kKh>R08n4aK941+u5ag2R)_7B0F=fFkzETRcCCUG=@+ zd|cgNO;Ux-XZ2wU6=;ls~9k0N$8;n?^)5VNNcZQN}hQQ~r8s2>hGya%Yh9aYbVWjcQ-a=t<^x29hYX} z6=^0uUX_OX+COG1HG_E~G@PGK({P7AP4G)-xVu_gk>eQN5WQYOHm9Gmcl5DST-ii^ zz}D&}CHM=go5o^8E?nOOs_8A~rPchFnrm!ClxBBUH%i2#8DB&)Kj!|hNaytnpz&8X zx@p)*bPvHsu3>bObmi=fEf%j)x^-`vTG0 z!<1QCw0TOvWuB&vcrk~0-CTXgo%>X+kphYuKt>1ycPEQ{N|9wQOuT^+F@@DEo8$9v zt!_e;M$*%mc%i@xe-HGqgfYp&8VO-kkhO|jq|9!WIzLg@QrcsEUq(9ToFmFsx!=U4dJY7+tTHSMH zB+l1A2~c>BK3?OB^_9))=UlQ})PGns0zY0t`79sO^9eu#dllYd@!fsxPzX1bUC0b` zq^sh({0)1;3!NA#*a=u){K4Ea;u?^P$W;U`Ik8Me?lLRB)lI2#9nex=+!Wz zeB78VYx%r4>Zh$ICl_SML4gNp>3+o6eK+)J|?Sb>tdRZ zt&0wDIIeDyx?&I}I><2sS`OVk6Q1_HJrzeynNezXeO$X#A4c>k0BpU|&u=Er@%mGb z|37?<47wh&1GBxV$b~Ao=l}(OO+dLvS}FyT6IKUw8~BH$#dNPK!b~||j?E&qkT9jr zK<+{FiDrArL!jw1mz3oMhCF{OD2J<2VeAS0goH%)l)$5fWnEm9MB(5JsbsrxebB zBGYbUidu*bf=L{5%x;`;7vg!l8=GjcP>o5PvPC1}sz|h7vl}t(=7Y2wTd0fONTU-w z!=O^hv>IQKb~gsVK}FtU7MfLHIiZ)9fDC_Wdj~8hMACTfhj$ow(v!J` zySck#ip7R{fE{>hIMx#^;Hn~rTkkwck;BoupUMT?|A~`?w|#uD2E09O7LXkn4$o6E zqmu^dn=#Z_V@AG?Vw{p-r1`U*Mv%$dg)>yTk{>e~5TJJ40*?bw2!@ zexq;;P~9P|(2RR!ZSYD@v^Hy(C*#i!JEnwX=LLy**^W=ka%R8mwQ}rnhmc^4-*>`I z!bfX77S$BW*0KU5bb5A99f|SCu9B*#8ikcIm(UTQL1%!UnQLzF5edN#-HE!-q8sHd z>azKIPMXCDdT2vZFkohu58tosgV{+Rq|PiXoa_>P{N$GCu@y`7oByaKTC=v3U!v5Z zCvS;9eUeM`TcPU_+*zUzthz+a`4;x9V{2AzSv}uaPL{fU|i9istEp>U`R zcl!)cC4nIlj3ZkCz>(Wk{Uq1nrxD|6yc=x*2?fFu=Y|?$h)Noek!aG9DbnubS~$@% zRO2)74GS^#%{XEOLuE3c66FS*9;U6Go`Wl=ha3}WZkSajhd!AMuA3BgFOu{&1ZBDK z{-QILbnl8p8sX=YU?uss8~_>X$-=Wcgo;mVE6LyOto`0c7=&=rb**FZdiC4?oNU%b zo5nuW9^yjN&->CSlvIdYMU_a3BKjS3e<1oOcr!fRJ2co?UwMNu_ zW_f@Odgs30=@~v~qz5*DFD=uWFHy~@yrDM4@Rn3Z6-@3;$8 z8+v(B_S7;kcf+@B(j^VE%t2?#$eFs9YF#N^QmvOEM4kNHc}kjjCT&s7B_tGJ0_Tul zj@$P0XnD)1hkaSH3Dv2-{hSF~WaP0;C1w1aUoAV^*7dkLwVbYiZMatVd8O&Ta~ssg z8c`#Kx1>!cY9y#BbR4ev`aH1zVJzbXwA799!#vdabYk9OS5*YXW#g!QjmE~L8< z^e15t;om~0|2hHWb<1onT6=)73CfshP@b3{qMTGYb%WMYsa2L&!R; z-nj-e>7|lz$lw?-Tin9ad-7uvnA%u_XC@yv`0o|uf8CHEK;ZXg^1pFH$p6OwXpqn3 ze-F{lcVqJ3T^0+8Avgf#G>;hzSc)`};b^pUV-s6xDO{lX(UT^g4s7j zN#g?5pKyU9c`h^tXmoa2Gz--Z-Q)4kIy#B93?%T+4AjnziN zI?!BHIlpx@&q`Jc{%@qJYKgeEgbl%PzFUqrK;o)$-iD_P3g2sP`9j#s?9ppwj-dF} z219#Qb4&Rt^}{z1;llKRjKS)#d|z*M3ld?*HKJ;r4gK-_jOr&O(6##2dSk6#cDS!v`0y$M%hR(nhz`qKgRt#QP&rRKU+bGs zR*`i5(@l|d%-SCL6l*(QU#-(PYuh~U^b7TaM|i$eKg!Rl&+qtVz{b7&Ogz6?!EXqw zukmWBzMdbSzeU?Mj0@Y)nu$kp0~6&aA!*eXv61`rB#^3oZ2$PH zo+_wnw$SF3=p`aegPm%429VQca&J6WUUZOH7r9!H6hEZ@&g(mV{!kNO6O0{Agax5I z2~j*SoG~CeG1gwWM0FyQ)<7dgR|^9T%~#CFI}-*Pkm7zYX`ms}mOvM$gq`0YuMT!H0v43EC9=nx5-SX?>9!0rEEzg2g#p&ZGCve9XUy_3cG!YoFVt(U$ zCI9=T4UFH6x@8%cig+9~jNmizXb(r#d8}@!>C0IP!*oiD>2rH`OMJ7k{=vP=294v2 zbim7S;yHtE`pD)O?9O)o%i;TRk%Kqio&DGn=Q?5=(n3S@J)U22DdO6>pMZreU}4jz z0`Fk=E6PyI3vv}r+0`U7Jj8H^2^H0J4(#6 z80UF+at1TaWN%rH{0?U<&pA;ka#&KLw2{Mbtv2#k7dgxg&3zX+tVyueMGgyDoDyKA zQ)NSyxnI(K*O$~5+7xzZ)o)(59dKUPnC)=iH5Srq!;*LJBVscwd3O&9Xjt;*p2|L+=ST)KVuzsbun3 z(oqD)ST#HuLb4qi2qDCZobUdrT|(M?Gn#T#a2s9>W{ySv64c8?mP{lhbLj4oQydl zX8NZdz{KzeJ1_2~@c+v0=eY-f_{D|NbL**#i)8oNQ;d)w$A0e8?C+!gXT!_g{Awk+ zf@R!|8E_lPxiM*FYLz72@z)8hNlQ0JAITv8HJkT+dH5YRD=zKJw^VyA-&h8URhPKw zQ$G(2^<(di9h4m)T&;1(+!z9tsPdtL+!#y|YU|}V)P6~YoDx{m(ZCzJTW6>9cDrbo z?RJ(d{}6V_r691VJ8~aR+^HPvS+y#$EnohZ>{wxio_LJ_GiiO7(*R4c(SW7XOAQ#< zPS^u!w#PltdenDY;mr#NU?%{PjiUN!w}z}dt}V~G#XKnEhz3AGC}ur>NX51fM}i}n zT^j-ZYB+x_a-ADH%#HKC#a{#7s9oZk8Qqd2T=co4>(SGWU(vsgU(u_MU(uJ2Uyr-a z8QGW%pTBiKWJA+mdkdQ3O+@Q+x@V|S-xC40w4}fgT6CLcHnfL%S}c$JsIC|xgXXb< zpN@J6!DF;m#yf07Q`0lO{)*X?s+A`{VeW}fdh)8LoU(e&Q=fL~U?|I;@|(gI8!szb z#v)XNmdP%yr$7DaBUD@+cB4@*bUAQFJ+3}Vs%Z|V_QDK@r}aXQ!&7@i)#d#)y|9AA z>Ry=Ta7r(n#NjEF5aF<@7gln3axa|B;Yq#l1P)K^QPU^y&-KC+IXuBSMYNk`l{~pV zdouS{QYeH&)eF=B?L(hV;V|0^lsE0Kpd<+g>PI}4L$4Q}#$l!xPUSG&3j+>Qy)fi} zwQR(p(+f}MKo0!197wMD3=V9%&*Z?S24tq`gm&V*7oLr7zl=Mv-$C=I6ck06+BwK~ z^uANL!+>;pLJicJ9LQoMrGVy`={L(Wpj{9JLFho-2{`~?@GPjJ#tW6@R%NHr$pTZs zC$L)^gDR#>LWyl2NHdZ=IKa8Z?3;DkQRU0D8}YlcvRl*(nK$Wxsc|jsj>#wzRiC$A zGJH67I|D5Ux)`)}aQc4{+=32ceOB-Q%x7ok4twlBi+$GC)Ze)SwI7%*YZ?RO(#bpN z_z$w}dabNq+cA=+jp1fK{1xRXKsns=ubk@+CG!d)HH!CaSl&2ojJ%LX_ks0ry;Xwd1$wuOk-oVWy$~L8oCnKwECRYQD&pq8m z)HDBNsf3he)5@Q~P>WHtI!>Sz4pz7eafoi}Ce>OfYhtoGYi&uPrS~hDjRzi|jmOYz{QU9Rc(}9iY3&NW zA1tovF>7>{|$G`eI$lLtli&A9MBgMQA3(Ev9LRUtDG- zk8dnuiRouHq_uG1_V*;t*nW9X$rt42r>K&Bcj&f9m5A#_jT$btYf_+Qi2fc`a`$a| zZlG%(QnJe)@{khBwHeJ0hwLelZMp6yZkm}`Dz4=I!&noHNY~t;V1B&p$cN}Y`@T|< z)Y*}*p%ZqkksbN4o|9zJh%32P&n=28`DA*x5m)lBdRN{GjkuC`dN&^faV765Jstm8 z&r-0hOYDHVcheJ*tn9e#QG|Vrg28 zjSgbUQ7f>KE$`r9itfc40!boamz@#VrEbl z;gi7Gw!ySr#P^fd;07@ozh*Rr&^5K#_)T!LJ~*|A;X}1){ApAdTB5sRtUp#74aQvS zk5$Z)^ICr_JvryK{unZ*^M?MoFZyYUnNt=vrS=!_oXRY9pH3b;Q zr7nKkShu{$w2cHeRvw3&lNo<$?u$8EtXuw8C;5^@-9bbLvt#n2j9sVDh072YTScyo~3wS&Sk2v%oUFdvo1&fz-)OLH%s>GL_e=&%1Ol6fvb z&UIZBTx3v@e3~9Ja9F>XYjp{Z8lkEBb{BmTzt&LB)v)PoG42Xv_d%o9^$pbTvS3XD z9G^+hJFOUi*m9>uJcuwG$tPcQ$)IV$FfGhksP7v-wTLe&fn5SrcxmSM+eE-CPfaIv zMzSSgGJ4MX(beFl23-S6U8`4u%1BzWvuamjczu<5Ii_H*@;~A-0Y5MFLLdOLm}Kdu zrIpcT#28^FkLgp;5HOQ@PaQ#Q=Z%84Sqf>KOi%Ypr<&r+>j zI&!PtDH|)phJxrN5iRud94NZ`3o|xSgi>W{$tFUAndt#5hDD^#6W7o}rBCPkprLhM zuaW{sBN%^P3Vum$MaxV9LI^qf_&e&D)clg>t+MWsO9#9Hz~7z)Xv?GJC)^ z;9NL^3!l%ngnc?W{C-~g(5kF=ayG~So@Q?Eb(op=4w{$lKjfFLE3-%gHR3xmB=&Uf zN4siP;=D~=`*7c-hqX=J`!|QvHl>AUO6sE&RbbN2-fon~Eg>>P8R@D?6}Hp~QiWO% zfJus0Ls&JZ(l_=@euIQFopkH+bSquBHeK*$3LJ9Nt(zxrb!111qc~FEf<722UQU0X z>HXC!nn=i{BC@J8vz7j9<(Zkxb6|rwrHBw&c=j=`9rMWV)Q>#7ocj0phXU%xrRv|8 zl7)-<=Cioj`=qBoDK3$BGOe*< zRc$Nq#RJbyYNA-nlZj=p(Q@D;A5DIx$>3YU?xowOk88cD>P$Y}2t-*_(^JTOasE=e zSSRe}-F1ps!vTd%BO+GIu@bzoL=1v1Vna7=Hc-y1eN|inhM6AM@B1?QEWTkSpA`=9 zORA9lU->FaU);MP{JJgG51#;Y#LKHJP>6^;l}O8-&Nqjpj3~$<7GYDa9%NV-G%``f zS`v}4B_0Ib-khLH3aBzJRlTUHPnjzPDPsnq<4GkDD>kv^kn)*HTyH6@r?jVWOC!`{ z;v3u4%#rT{MzXSX zLZ0m5gq7WXSuD=Qt>A$9I+R1eZY?XrHdzVd#CeKtDah#a8dJRaBFU;xoJ_YJv#d;= z%6uZUC~uON-1Fj0_RYorZhk;Ym(C9%8)(ZUTGFm~m&};?NWH!7N#Z%A(AtlUk85Iw^#Vg?IuJ1M# z52QxY;+yER6xwzE$8q`|$OiF#T|2yP`=~vfV%5p_h2C3fT#l6ty&PBBvDm_Y zW&t2XxP-MKt<#iqYJi4s>{MA@Rf|Y1QCCbfMtPkOX#iB$9;a7*-YBFxCYKlUO?XPE zUbLOFBIG-VNMnFTw~JFGo5}~Eq}S&DoZ`*!$&(|7eDZ{Wd;V;HbPQ}c-^e6N%z!uw zWvO2Lw*3GE$25svTo6s=hTv_SJVW&dBQD=fgW)#4dD50}NGCV{IiC>Q^N9ja=)x$Y zFN`D$ih?m5Mr~Nv(I_2dXnoY>6b!aqN6^zX%NvDrOM^5kZ0tX(n5cGQNy2K&)J|e>*QAoPMr?AWofD#|LFnw3b5&E*(~XLQs6If2Ps4Db48O)z zCw$TIfg{B>j0%m#N0T|Q1ESouCYfpVaXDo8+HrW77H7>(bjnQwRfL}N#I3GW%c^&4 ztu%&MhJzIC(uktj9_fRgl;K{P?VXf5tEcp@xETmWnwE_AV{-?KzfW`Iw3QIawBdbc0396|5RuS(zbtRX)2eBikaCcK3Yu&Kme;78NuT>5#EtccBc08pP z?m}teK31|_5yn7+pp5J(ne;E>Gg+g34rmLQHxt#cKKjxsHrf2lwzINi+vv&MGbq7&Pq}ltSUhH(m8%7;|P#XJ3qGqPPgNg?%j! z@8Jy%pr|-Fc&WkARog0?Lj!8&Q>-LeWzsZt$jQJ~)2N>!nq);#pE zTy}+@D@o4=PlWaPq+m`!TwO;n1&4WpDLAYp!h(Z@bPlVAeI3^Hh9@&V#Z}N=YxIPH zg;#hq#LQrZrd^PI4XOdDq!tHP=-V>`@GDmX8TzhFlIc1Q)D@iPfSzY92O=B>9EgmN z4v4S^>3~r8XvR?Y>2z9!AwmL9H31m$P_@1UnFwpEM!iA@<%(W~oFI|cv8UZOPZo=YojO_`Z zJ%R&br+WVrpjfn>SMM}dhrLT`ka+h7+Z{yTm^7ucRDY$#0b|ewhRc6$jog9WS&EVl zWYjN(tGQF{kv6E!8YZV?hlR{8Qhfkx2yNjE34sw(pq1zLl{^nY{=H0mgxY}gJXi4o z#b$6GiLO>|@xDOSstIb?D1r)&)$V2;6m~&^rOk$To5ITD3`~6mQowwS5vO)sXW$;A`AwA|Q#W9J8HQ2b6&*+_n z$1VH-7cQ+E7Kg73T1K_!P5{&%vxSqg^3Yk;Lc)Eg$o1iFIR6X#fz7I5)Uz8ds889+ zx?xv5?Lv~)Foja^YWll@cK?9GetY2Mpj>%I@k&11WpQ{~j~|qTJ)C2grka;F2_m8o zzR)CpJErgR!`5SS!mc(Gt_atbvsF16~mnYMr}Uv32~| zivRy=xI=!va5e1X7IK^5%mggGv|Af!igPuA0;|O-zSs;aO%G7~F1vzqO=y}1rC~MN zR(WDE(`z{_{NNz>2HYd`WF4LC*h5E8vZ0BU($MBPR$IdEdk-=W@U3Ro%hL+li+C)L z6{EJ6AmUmcMn9>?!{z#Y;US*eSg8FYs9J zqEN9*tR=IE6`R7|^u!=j#%)&YRv66-(^X@$dHllLq6I4K;a7M@IG_twfM=IK%c?1r zlUy7dIvqOUemvPQ&Am+;$%C<=@g;Nn;d7dHp^80Kv3X`Iy8vH_Zs1|WSin??mEZw6 z@SulA`jvfH7vwr)oC^yD!e$72hgMwwst+||E6`4qkFiMguo_&urTVz6F8FA9!>dxmYaUro z*?B*{Vp%fV)soo^Hg3e#PolGdmj_QU-)=}t5-z$16QOLtm@|-Y%_F#2jo{%Ciuk}2EAOSP<GXB2R);+8`Jd$9 ztG7D(WIeC}4^9}zZLaNZ;rCctT?L8-06V^f``{Iu2Nz%<%Ou@t*DS8!>vK@h z!3F0JHR-D;C$DedQAhOFWxN=B``Lcj{Z&}4oPe#tuFE*))lWKYEvf3W{hoCiraQ5E z>d@Z8&8hs{gLq5l5>V)w2#5j2gs(oI#y;XeF3^%xwPX{f*4Qe4$_nku>Q| zV)1f^#GOp4V8D|82UJ4<8UY!r2a}$u}D-qIc1e)X;{S4Cf zmH1MEG{8&q!*Pnc9BR1g5*wev)vk}>DuYJN7NfwK&@*I<;0k*#xS}Vh;VOUvR{@mH z%54d_f*sN5Yn=zK#U_Bsrw`;T0FDO%0INfrmT&()OvOBFb@0Uge8g544rQzlGuiI2 zWN;t`k(0n5P=IXp`asEJeD)Pg0s>fCAQ=s?LiC;S3W)$cGPm>!Q6G-X`3g}_24SU7 zxOVl%gfQVHlWdrg=39KNX&7!mtI`Nt5#}iI)LmI*yq#D99<#jWkiR=K;)B{*-f9)c zYU-g|V>KlECj>ug=%S_`*##z`a3adi?>cr={iZH$s_Q44;+2vDDa{sb1DR+KdgkqE zQObT`bWSMspuG}NZ}f`g6I)>wR6kwb)_CQ3Yb*sb0n)Xa5!--po8ejy$q^^xK0K7DRYBj`>sa^viEw15V(sx%345U|+RmITz!%9TEvDTx8>jQC zs6nX%sTC&d)Tg6P22qNDe(z-*uDn%7=@;{B751MULoh;>dvc)$Neu0Nn617rEBj`l z>6MqINzNjAs3=Y!btQUrFJos#Rn1m6Up${3mBTsKA5&Jiz24k;?5#C=OX?1GdApho zx^k5;b%+j-dEg)znJZHvS@e~B{ANNqB}NyLMYpL7RKreE;3qR=zSr8t`{mL4hunog z1ByaQvFcBW{6}sntM}Os+UOar$MH0KW>;g+vRakml~R9MM9=7h7`U|ZZqD7#$aX5y z;S{)laxfVp!=C$Q9Hp68Uzl-sBgoaI7HlsfQ{6fvdLeEHSc>Z{WaOxu<4f#vVt*6m zsKpZ4DOo?p+`29F!bnHW|3=b*ROov{5uI|3XJUe@uXp*F)4`k>P2L+KEoiiu6v;-D z-)?^M!TmN)-%@?0SdOLS#0~+!D3YV#(T)l5aIc#Wv|c}&y=>SKxCXPPWA01_ns*o| zkxyMkO4atrju?|JtO{FWr;%xjy$Bo>vo@60;2;)K`D-!52#}xLPEmBx3p7@$pT$8d6b!C%6c@4ecBld2%x@B+Ldu9jl+q@@9-K?o? z^?(&SBb=Kt!x~FM3<)d1l!-bMIF5Ft&3&h|CpP9LBLcSfXNycWAMw?O{CFHVG2)Pg zh2r;e6<+hEwTzv3;fM4V3;0d%7f#iK>WQeGW(^XV&LZqe9dC zTnlQvDTcKH-L(vmN>{5c9n4AmGorDk zHirLNt;E8RADna`Osjh$45H{F?4o2EhV@7=Md7^t%BreFq_59j8J-FK7MVAJU?JC7`;38u z)Q_u;x~q~kkD%$p!w-I)ao|=9(?Oge?vMU*cxHH3b^l}oc&01Lo5t1*&Co(5q|W9X zsA!Lr4aCW;!%G+HH5zt#j#_btEDQlP?h=9!-=$xvOSRJdwS#;!%G_6T0B`<~gH#i8 zNPR`XE0q7c=D1_DJ$e?*XcaR}J%Ztl zQwu}zk=V;A4XZPldX@gXn*7ly0Mvw%W#s4b11`FpBxI!%vKG>NF+t3t^vaZotX%k^ z8{L!}4*mJ3vg$sC4wz*}CN6easq$Hhtzy%l?ub^PCdYaNb|dl*rna5UMv4ncL*Oi+ zq%?-mDSC$iGT$lri+|{(d5>K}$166M7mWH4od|QW9M9EWBJxIaDj?`LMj$nK}op>?mfhOd?-DbJEm;as4_Fm5?T2qr!~{^ zX~*dc$H+z`$EjaBIYbQrlr2r$gd~c@TJGI4gX6) z>W?~;eZDpWmbG^f4w0dhnva!WR;`jy8XIITQql)99u8Sj)E_fyYI!%h$7>}l^FdZPBoIh)=3n}-&EQ!1%OFZtTU zNYv|bw@^mL#$mg&UUkh=a31Bp`KD7U@L+)_7R1DTVVFNUw;LCQmye`;D0Xg{&k0AC zjMN@X;YGpzYb0j7N8qr!6+T5N=y{QhwWHqZEzikiIBAg*V$cJ-wKv_6*_e14dOtuP zvZcpUv3aN;Ae)BDmfQ6Q(FkfP!!egp&6pBR)_ZV^HPW)ckRZOs0vmTvKPP{sxRWj< zY$kNhV;?tSlszY37iM%yZch8CNR(1l47#iN`~Xw4SO_)r0u3!9jH(b6p{tZ%T4n%* zOaU1iG_ACslh1NMIflOWY!NMYHW{>f|6KT{A0Y|4N}*(PO*DbZ-SQ!*ycNEMCKD48 z$0xrbb}vS%gHb#!F}}co-GhF4OQ!?8)Pm?LR~acl(IQ2VlcORge^n3W_FTN}Ch8J8 zhs8(tR1(;vBpb27)@_swra``os!p3Vz2IR!GFenuU1CkGl?nBBq&T===kXvBa8Kqb z;XGnwvumDEB!v58o>46sbWoHREFeJ)rb0z-fmHRbQ%@P#T82?$z0?5j?HlWi*foJ9 z@BJ#xDFE}4no#iY21~`*yBnwB#*!u!ij%ttxmZ{9a7-va?D!HtiXc?7>z2tG0wGFF z$ICge+5SEU*>YuuN5~>7xC33#OSu#q67ab$LEf^-PF3HS5!?;-?0YZ9vSf+Yjfygv zM7hMQhrBJ0`(>iCZN+)9sydEjZo{64O|o?;{MSq6rX|9XOgCxDXO^`dvalq#Re*kA zl)auJlT5?`oW`swqD$z8ZoVIftmihjPWDcjvF(T)cmNpCl zX@pObH|JfRw#ICnV$?;5ar}bA@jk^NZ7`k_9gkrZEDqQWyIWQF#t1KHzaKYvx(+U#R-9wOH3_F!tIjC^E$^byP(9dpnQ^1gh`M=k07|;e z1y^SoRbhroLdGIN$uu7&TDbZg0#ibI>T|?1mE)+-8Jx19#&ddn&d4%m@$1D}R%6XE z`v*~CFbNH9jTMG1f~aM5O9jPD(Tm6(1G-KaCh-#)23S46L5Gs^A$XFYvJunv7;+_9 zcv!9^-z$R?WfCXr@AgkrEeNYP)vLZ=+ z-e{S&k(`<$3BOxPA_iNA8xZml;R&W>X~mi%?WAN;1B78{Q(#*vjXX%Lu)L(Y1f#SX zYA4$Yu*YVzPi*lYMy|$xStk0T&0V%7*Z?#YP&vOKTB7Yc^?nJb{&AUfiH~O2k(E7` ze#hW~bY%&koMq!H%WPD;9zaTsGV2qK!jIEabse3mumNge6vRwL@Nq$mviZ@Qm5%wM zIqABitAp%e%W@F;d_h64W*%Ejyem-+vYe8=L+H>Nb(hRG3vW2+p1XPoV_9y}@5N8~ zw(`Oi(ldZ%VsY8FH!$-iQq9Q!y&dk%8aZj(;kx>i@aML2(ps&rw&kRiFu_>IIccXC z=cI*O5Q@*p&%tuiP7h}OPY_Mo5-IKdb#a{2mVOpMPm_!meiqieFU?u?_p_W3=_zY? zZBzpLWK@!moSe>)6oX~H&%>=Mosi1XmW4 z)hR@pIg7}2^G4wJMie%t^T*X=LQQ5m|29iEm!b)_@bb6skD8;tvxxm#TWI1KvIs&4 zro0&z8e6~Mx@eF@Zh@#`YRu!&M8~ljdi*e5Wx_WRgeCog1V?Ewugg(1p#a)B>PCp= zd=g$!4i9J=k&L8K5gg2B2I?8}C720G(Uze+awyRL)_`r0w6_^bB@2NEHIS*!0^JNa z{N9KrRska1Z-d))2N@ev*2W;>z`+5!1`b*?ZUY9AWC#pXOM-z|h~t65aIzUhA7y6* zY*6LCCLh`pA4*cTs78~3CuHkN=K-?nmnOm)VAQ!WqJ9SUhgl+JpX@eM257)ydkp(p zRM7P&nNhKz(hah*gS490UiU5!uMfCD2{Z_H+c)@@Mccnvx?mk}citUz$j^^bK93lgKi4 zd*9JD>2$`)me>=}oBaowx7KHnjU7XXEfY;XXAn2vE{>7Wz?jtKI0fT}m0?s4*}x2q z*{xEqfS}X1m$7Z|5xSK_^k;Zt;TP!Yrp{wsTd2Ws1^fo;LK$WeRM%(hG?F`ktyqj) znlLEixhTMu6|p};=ZzT(l(OdWY?MPaWK&)?pt{-aStHm5`Q}zO549s)lnP~qXb1## zTAMHLhV$=aHvWOEL#%|BpD72?_*+hNOwER=SRRaY8+D_37nvbJFm11+uZ5QBra_GG zg|w*eZAL^-ewi_7a#zau!1&~h7VbOBx2;4DPq0!vCU-jIufaN9#;8Pe1i+NMR3;VP z!is8y-c*0J0ykB@V%snkLug1A6~@l0hE7G3-@Pbc45`K@KhqzundsSYfbA=`G^G4*ViSf`{t@YlaWOcY-1DjHV^j?Q#-ezX^V72I36xUq?wPAjFo9QMJ+Ma ztXj83icST_p3I6&NrT4Z!u{8RBhM{f>&!}QKo2>i*u0>fBdqaUD{h_&x0rqK2Zi&B zNl9j)vIINSsrC6Vt23@VqTWW(4P^_(rely|J2u0WlJBX<^XPrVUKuZjGK5QmEu&t2 z3EdHwUnX6tIZAK^w{<zVzG0{os&v1{T8>##Jr zNz_4W${b&Zw22or*;gH8M&bt;jcjWq=}e*Nte4{yaf17i4Hm9IepD0mKb$YKkk2H5 z*%~&y%6KHjp_Q&i>3u~RQJgz(!9NmaBcqR|b3ak(T8eCf=V{kWY4qwN?nRL?&5#K@S*$v?cn8!q79tl3QZ5{y%eO-sS;O%NU{F14Uh-U4!x53y>yF0@H2G zLA2=!zaq0hq7dO*t*eijc$5DIixY*v(71jc2RUJSeU8_gFesh_;961+XNCQARf4i| zcjWv$YW^Np-qhl_Gqe9IT+vpStfeBlB9_iua9!Ikg2&heMSSGOGi2>#95mV(4Db>? zt2+nZI+g->exUQlVCHq+7|aHpr@<`8?SnRDjb~)iCR9I1u+(-5Fw$+4?-~Xuv#}fk+7$fH%M$0ep zj@4yYp?Q)|*1JHM6W#ZagIcD-t7-EaS*((jKv`C;eXx?f&OY8UJtDH8Fm=rqF2-(a z^`k7&>eryO^VuB<>l%%4l|K-@k|8;Ig8^J}go5r!HGqs(4nk(bFRPz0{f@%`eE%&3 zYMmMOd?5vDUCXcVTx&F3uHX0RmJ&+9n9eQ5_+KUs)gY_hIHyT4-gA^Q4KPScgecW! z7ifq4k{;A^uRqFKnp%ru(1JC4pEzZ;jxLK|P#7&yJ|;6iM>rpT1yy!3WfJ?jiB&h4NsT~DtRfRP$xkGJz1{u>7&Oo>0%Z@%5cqh z6Q91%emS2mySMoCgJ09#0m$pTw)pgG?3(lGX!@N|-$k`FA&VYVJpjb%aLX;aW{i5| z(jhTRFzTP@!xKfOtYdKKOET(j{sK=gV$}a%m249@8;ttfk8+L8yveBV{W{mQYc#T= z9@N+MT!T@+K+owLziCGOyG@;UliYx9wUw8E8<1XHAY&M2rLBdqW-GgXt@{?9)tc-6 zAQu@HS~qmxTGX}P8D|?kLA!Z%k85&ulKF}F2skxS@6xr(YE2KQ7a;9;Yrt6v9o@EQ zhKYz==lRu5)1)TkPrHhF);sb?E2+B?>Z?M2CdU?w=+N@i*(dgPJy78>k%?5 zbSmW?8U?ZAB9nRbP1EO1$w7cy(77$)UqM&;rrV&n0>u{C*GyhwSr~azDWb6Vz5CI) zF={x(>U!LL5xu$u<9L~%ZkW+>lI|t2J5(2_XaQmrR7kejVM*^WezfVGS{q4j(!Qg; zQ_{ScC=jSZ}$)$(FE=L9jyylDf-@TU^(r*5T@x zT{?lFMCVOps`DL~Pr_xZMG5Vr!kW0poBWbK%60o_t_${2by^=i(;&xdzC-D)#Vy5{ zT)o>8^qY+-Jp`J$*x2{JbJblPHq#K*iBc8X9BB?2MSzvEQDF5wg?lM&LmWo(_+U7Q z7Y|`}QiE$1;6crVViw6cj(YOu&u&d#9rAt(+~u1ryF?+ zD5p6?UT#f^w--z2$jcRayd@;$)nbB_RF`+bKz^SHn04b`;%c7RJE|F1RFj6)#eSoE&K7p`7cjWEG zWUx_a`i$-%wAlrNqoH=0P&-ba7=}E2JkcFXhV4{`@YsmhQi2MxK}zvo&^~R5LXalt zGksp#pfSmYyx9f&yulsagCV)z#RJ3(sVR+*B^Mf{=|fxK)5k5FKD%JeaAk7(uzmHU zV`agd`d>!bYX)+&2^W1Xlf^C{D%z$*uge&uwuLd=sts8Wyo!C2!#0^L%wz6uE&;xs z;jiAZKig90N-4Giq%z#ilm6VICuV4q9#FpJy4#;~?jRd7xmITImh(Y~`Ed6I`(y6d zjDSX^A0V?4Aqm#0ErSf0)t}Ff`x*3mJUH{x^m?9NU({ito`pP&AK0+NwwjJB0mO%l z;?1yLcR*S$*&M`)n6WGgD7s-nKqi|8!gvh$Gp-hA4RKQr^V1ArMw5d?BkRNlr(4jC z87%<9{vxmkOM;@V~NON zw--j;%|E!ReEp#Fy30_W)YDT4*uS8r)FgIUq9@qIw+`vZW?{#F8gz&5 zSKYk~MM-z_UDyF6QeMILoW|q*t!h6W`_)d~0F=MKq@u!$RN{sMcrCfJPY$i8`h~>@$eG`Y-&& z=c}(-h53>mm4gCJI8;Nk6RgEZAjS-MaL7cEl)kl(GmH|#_RSXu+~OXnCB}n!vb>gK zJD9$|X4nh!Qg6r&#HK^-4XTgL@;Hi~hJw`8)+HAKtSLX4Chpg2(n3U6bC>RG3RKI8 z;Y^*Gt>pmUKHxwxTqS8k0jeZzQ5{NTiqxTfF;}%Y43feWh@KbpH59q5{;Z>~Dtpx2Xu4+A z{R)-LWS;7Q?dk;ST!icVn!`)LWx*~kOC!>Hq5~oE6b|N|=R{||oJt{>^2CZ^fsm*Za-r0tq{-Jp!`epy@QUEp1y#ygV~FAkVujEa{#jn`pJQ$Gx{o! zv!wWS@40A#O-gP$BaleBHO1~ovoou)jlF0EL$I^cYAwAT_J26a{sm+d@Q= zz-&%c9ZXRqXu;@9o7UBGHL^BuX+Cf-SCcAY;=;4f>yvyA&B=;MGmz^eAO)wqr|q%2 z>B*vFw(F(YSBlBwY4L1_Jw}VSr1?Hvbom`w_;+DH2P0RCveWfZ;`X7 z33FTFmQN^T8Oj8vnwlMv#pP7|y-v2<;b{u7hFT%wNV(ODan1vhLR-!)UV~bRj_Ea5fZN`hJ`uab!J1Cq zNa~>FC)bUfT8})YTl}AN*s@mXy=@C8JBxK6W$LEMc3lQJ=(ZgDiJ)TC*z? zA04}`bzaIx+xloU_o$S*>1CJm(IexJ3J9T)iHQS_9h%T)Mp%{t9Fcm>?#I?H8p$le z;!}yjG#IuxWZ=+~{C}?+SNhV=msku$Jdgj6$H^Z*n`gKPO-=XhzZS@qV@L>h-SU=q zc3-$6o_*u+$KOdjbUeH7raLbg-}~l~FMW4>?T!~1lB@q;eU*L? z>6A_xhWvOiw`{)qlVAA24gc*cANgkXzflxe{7Lw^1~+XzkZ^fp{Z?V^YUh@5hY`X1 zOOUteHJgWB19APPh+^+}J}>uvI_c7zJ})POD{GlxzczqyWML)Oq)Wf~TD{@AbOmR~ z=f$6MReDNKbpOYWQKd`EevHq{!5bLo6GR>#uFp&Dx6)9h|KKy4DZ1A1dHJ!f!A3My z>37SAM%UJkeO~Tigm&#WtxA7;=@x0_+RUZyP`0B!$iQJ$j9SJ{hH^3BW_lKffw>at zK2djJ_Yu{8JKbMc>jx||{LmzA(AqW|kTxrk2$GE+P=uTj5}6L4&&2~5-9dAk_#CM= zU#vdxwr@E{m005s?NZu>?9wZADeg+Q>zS8x!NPBp=T~31uJLQrR`NkA{D$eThV()F zm+h6Sswbzkbo4H%=PjuP8?{Xj{0FJ$RQH0V3je_-=KKc?xA7keDXGqvL*frIsf(6X zQ6gLm)W|+*{SBAv*SxJ5#Imboy;O- z*CtodrS`6^B26>8(yR3%*l94=`qr0{+t+;SFBaXrqIvV}i*A0XdGpT}-TY|t=3D%x9IR~!S2sKKGoBn$hB4i|Hodu` z2tW0E8as+j+xvg|wNGEdmYav~`@QJ3orml6UPt?G7XHcZ84nmn#-fB9x#W8oNYB>A zo@??cXX0D5#_{&^XL&H|EtJj_iabs@a&q_igJQFGMabh>ya;*xLkxn>!ATlJqyhaw@l?oJ zid{;6i*-3}GbT}vTPzUexFx3G$5f8Xar1z=PnG6A<(^3RP4W1v;iwh0U6`QzO`>ZEPVlY&z$kepO^ z!{med>0&$nq@pIcY0)7PAgR4ysv2fss{(N-KS1I4a>&=R-utJDDbGrPmR4pdfPFa% zCT-rz5D8@2GV*Q1qTCeT5XiH#xbk-sKe=iw)E z;(0aIAd5=|b1eoMFkV6S1Xyb6$=qjFzbBJuBC-xqB0@%&NTOM2Hq52GnM4y)9$z0P z(UhcONi?yJ$xDq9h~31WP7*X`Qe%dAh+SUE9{r!XQlSipsm9SN%JEmOWb_AN(WOXt zcYU}XNiqkSM-mW+grFTU;P;a^5`*^L+F}sUuP7N1hpBKVC$pqnH{gNroF+91+WVM; z6+dG$J~5%5ViKha>%?-=DC*t5fzw!l@F^L(gvhw>9F-E8I3`c+;QWt%B3hj|HU1dS}S5ERDzy%f)_Yo0A`g0cSfC$5wsE0QzZOk&TX zTa7k0R84i6u$(i^PaW21QIgQ~6K-0UYts^7v}lcP>6;Ng)pblcV#!czX-xVe@f+oO zasp&L-AVbS;WH$X)Dhb)Za!-V#hH>o!q+g>*(SwL3j((en68sws$6m0`B08+F$GfL zlrHGdSKH1dl2w1N9mC%?-LE;gnnpD@2iFqQ`%8H{e@K3K-xsuMrM$5r&@VKFYlddc z3L9kQ5Qf3)M+-$;KBa{;eQwc^5|;DY!qJAY;k>qRNL$N!ZQ-y0xk6OV-mkyz-y&*) zNH?C}0H+bZ&{_0Ft&`>#JBz+3w~*!+Ed#;$i`c@ZJaG{T^JG%7LN2vQ#XZc!6JbKR zSDHQ(7FD`SDF&HY-D%0WT$N6soS01)S2V`XvSBGZ%hl!5(MbocOPZSduGcT;BVjyT z$h_Kai<9&U?h-Q3KQLC+NcSRDjlXO{CTQ+*<`SwJalpr@YTiqG0sX`Bgv_PFla^A| zT>p=>Iz!hQs+!&U(jp=AF|Dfklde1B9gVU`k#utG(N>!Wjna72#wf}5ZL)?-BxiYY zlUmW^=&N)d@X7Eq)m66G#Ni11133Mzj0L&eX{0b22k_?dKwm4Ji}IhGAhn5DLgA`j zDqp@tY7;SUP+2fu#5SciDTV6tT~Dv4kW<(mIzK*Rk2#y z1?dn6^ua0BiI}DVQp}=MCph)Xg%KOZOd7RbWrkcQR}X;ZH!ucVIEYs?>CFZrv${5L z8aQ666VpqYS8Q5mO!8zT@uC21B#6MPl+47KHD?j+u1T*O)2!hkB_fz2 z3V1t_ZLrgxPee4GC$gQ+6A?}4jLnFspVQ&9Mz+cEYg4_oMYA7!RmyZSHv55V>`=Hy zB}Ja^Z-vl&c|Nm0)PALHz3=V-0DD1lp)ReGBL%p{n$+wg69i1-QaR#U4|L_a2Fq&Re1o9DE3pQ(%t{>OKAO_fYShXYV0zn$&{l0N);o(XnAO1hufrTAhp2 zDLu48t?Wkc#|oS(0PN&HH3UfEqQrDyi3()OL-AI4+B@v?-&lE46f332khF*ktUsY z0yoXgMat+;2zp42)u&^z*m0bMxhoiC)7N4-$iG+&JPf28!q`e$3>+kLe)j9Ar;$46JR(O}>IfcKO95A`Wn6mjm~=Y` zpEMe_0ZK%LpD97-OO+5e{Lp{4YwnC|P)$q6$_uW^vwXuc{A%&kuj^Csbv~1NWcrEJ z$W`6Zv5iP?CBM(*aQWfhAH6FN&*lw^y&lo;2YyWCzUj4&xpm=v@z#x^9yKs)gmzRG zK9g*()9K`$PSNRA%7-@P9-z1G$Z$`;0CDM>3BS3Os z(a@$MjTs4*NQ~Nk?;5N zEDaQrP+q6pC;tl%K?Sum$*)7WIh>=F0A*+Ty<8bJA?R|a;xeKEUMgt#3k)J)v)vo` z>udZ2tF)upd!Dts9p3tx{p<{KR%H{%=Z7`|)SI28C87ahL#+lVIQgZpcQb%nXVn%R zo8z#{8o{|sgHWf8spR_urCpUFjWJl@D>BZYh4oM0(E6|@xE-5F-4yN7r!70C;)3US zgpRL8ZO5%dXN<{(wA_E={wxf`?wj^U-=0hP6;2HY(gjixST=1)Z*-Q`MhDR+IGBN> zh^EQvpgGIVhzkK5q9=7`jvgfw5<2Ydcw4gW{PwHZ0&$kzHh{6kcSX5J<-baL#tGL| zfn_UvsC;E9&b^ectS}k9EB?^tN!=P|QGeUQaoX}449#7KxwYw_E8>FnwanU;R(Rs0 zwoALe?8HmiqUQu@UuZT!u}a7I%i6dl?OBvGxTt z&&d{^`WQJ}>tjhDb=O?wm?n{soU%Tc+yAi%nr*?y7R+3>SaK_(L$#+>79-s_(9ps+#m)I+(W-u-|Gm=;0@C zSZKX)1SbXp1dFkh>;co1!)*KuOu3oh?UWR60XY z0B1$^9ut3w&w$?(Bg|0_o65UeeUZv&jKh6VU^LKf=uD~&C`sblIYZCQsuX#VClnM! zOb%yiCsN|6FgR8hgEQ;|%(1!9t(L=ldHIpXFc(p^{7BQsz#P}h2FzLCo;9E?n9KVT zeH#aZIhwJpLy5<*T?TU$Zw_-bR-Q+9Cc+%!!5HR%8JH_P4o#Nj5`fne>I@)Xuo2~D;?=G%E#%7Q7E;-gP^--`q2tKLO)4LuM_ zvYjk=fR6HdBOJKdaQI}2AH6!wil?bvO+lNfZ8B z-{NBew$ze__2$$q7jLGv&%w4!X3=0SP%w)~b%yc1k9F#RQAmivPGW+v3=a8Iw(K$S zsnn@}Q*280H{p*?T<|m(<^tudkmd`)Poa@97+hOU!Bci}0u7L%8LT<=%6urRD)ZpW zPB{w#rcU{2Bu{ZRTjdcThojpRQ6_zcFnp1^P?re>t3gdz0>Mt)1_yB)=O0%2SaBP; z;XD)O$(XprT_tPA_}~a7HOL2>0L*(MErpbXP$#iM;TuS6p@flFn zMJ{U3pbImR%U?teM_!ijm)>5&BW^51sv%=D5KJdqf$vyGE5dQcpIQMTu@&$lE>m!u z_3Fj(@?i$r2p(o*q>HBfns8B>aP$WS&DEceu*Z2r_%N$@s#LAUgb>`ubMXOcWse*BPAnAdT@+mbEiq`Ne4N$-61O2pray$(W^fs z_lr85kv3!V*yqR8Xu7qDL4!Ohsyed4N3NCBOihk(a^#vMcmlpe+>wu*_2wg&4pC|? z8mqJ+7=5+~4JoVzUg@TFoKidnk(02&?14n9c!&zj01eC7ALB7ny+H?QDUc@qS5Yn| z@mq|`6d+a5g@JSm4{1{a(L+Eg(g#Q>3ZOk`f;~^zsQEE-1iD@4&TXPvu77LMDK?ul zTH}0yn{u_LJdEOZY^Ed_>9>jF5@y&_`3eJFtg_Ng8z#g$&eXE_=|^=v-}d-=Mq9MJ z_5AtA*RwEN5m%4adIqGAujfZ|f4=?k^}Ou$eCy-u`O#j_fb{Y8{AjM{!;i1$Wv}Ni zKE9qG?ez>u|IM%Gf0V_#DLMOZlNXn1RvpXFUmmY#Nx&w+m1R zLLVH<&&R2nfqKP+mFO%mDL>Q7BKi3^tw`9B$P-(cke{)@MuD=z0J|Imz)gj0Bz$>& z2KR_&BH&_QNVl|*QzMRFC{@rG+NGnp2Sb$M`=*tXBJHH@Ua+zi{_efMEETb!wosjg z_IWBxr&d3V!}h>%4H!KhexOn&G!zm!3rpASiZr z?y$FLN%{lgld*xIYUE{A;ue?v-UVFD2hju0K#acrIC zCai)$m4Ak;uF$<6w?3f6;3&s2+isO*nWO02V}p|dey@J%Gq<$JHq+YDtG=L!VA9#x z4>^iSWyfvF(bOb}l|k)8nmW3Iu&X{abq4;*A}f;l7ndNG?nWz;8={vM%1uQiRP3jQ zqOt=Ogll+eq1-WaS=e}DAAk=m>5SfGjHTeLp}S@y`cIhVT}vxTMM(!>13(3Y@E?1Q zwo-bE;svIpeAbqiD5Hf%uDO1s4b)KpHIzLarYKx0|7p}Du4I$4mZ>;UV4DU{O!p$! zJSGUM>oG;~5&<{2A9b<@XEgTHCFvqE@F30$+JCjm;yz)*h@Xi%nkNG09=T->G4qW7 z>5>9$^0Q43i)HODRe%JRW@yV*q?yTcg(W&AD`vq3hQnaIAR|lIGAb)qqx>%IoH81! zrBR=gQMrq~v_4;_^OTRl3lb;gllwoRY9d!Az+rYGAk5iHfMEPd*&_{n2kUT*clF-OQ+3x9`cVAp zX~AuY7U;+0v_K0VQsvb#e+{(Yw*SFs!Q0B@JhcfA5zHSHBp1lmXXsvaXcIVQ8wTpq zHA+!ragLnKg&Rq$77p--g~E2b^C5+ynduArPpVuDgeXcGBP2D6p{21hi*_b_8Gb%!5 z;3&dCwn`<>3psWJ66T3Zkw-%d(_&UKiLflx?VwASi61L)kYP`{oeLzSd(mp8W#L`r zx@&E&exE)+Nt2_!J zx8!!#gNOMpHaNYB8LgrN>7CqR~a1%3DD-M9c2cy-iS^K$-N&yypy!c z&RBGVT>p7(#Ez#qW}~%V`cAp(jNO5{1*yYDkv3e9nmHQ|>+H zVU4N@%DbJ<$?gm5gj>jl>id>?b*+}|x>0ZI01i!005b9Q{)Bw`SpIzumIMyRB6&R6 zfrqWZ!Ax~4wEs92L*Q6sd1`?NaXOVTi}RY@p`FtT=0=uxmT znJ}{)iTK1a$d`+{oV-#*fO>teVCj+vqN(ihmh=}S-5Ta!B{5CpMp=tNTzpPRh=_Bh zUBw)kpC_s*cdjWF1J_f)U5HrJYXr;^7eBE2({dBh_`uuw>KC}DsSm`q=_71A3Syey zCKrh*#lB03985#V`aV1Q)?$fpKEV)?T29(F`DGJ^B=z&jx25Xz#Da6o01WOjr6&d+ z=#Jnor@81%BzFi6*IYJHM_BbJZHvjn`@y$G5vLsV!8KOfBBw)Uepr;y03)(SCo8Jy@)@p^M;Bn@?G(S4Y4VnpdALKO)-m`V#e9ho1%5pH%0Sc z_4$8z?@AW%P4Qm}cguqIdS(KxOk4hVd}R6s{)PM5;rK&3T0!!6<Iz$(oFM9|CW^ErRxX3i)z7f?Nn9gDH@!8#gR6=ov<;< zZOMai6&M1|NpZNUS2LIv-Q&HS561M@Iw5$hTi+p6$}_&}4w&gl?b+!EIQcQlLOc{U z5(r=IXOa>*lavS=isWiTV(Zg5ZnPa8W(x9pQm^`%Qpz4DzV;YV@#3+XqHSxAfs%Yv z3s0od35B#4NiC5S0Y--*nGLmsl3}_^g?%WIGt&X^c5=S>(pVWh>CYmy1o&0^{&FW;mV>!8fu+H?RPO2#dF{TTF^|?6&Yz*4tf1~QCDpeVEmtboV7SRl@~<7 zbUR&00v%eT*f8);z+*?ZU$~xwk9|u?QW!$J*}H@Y+*X&O;pF`lZ2%yDo<*RgZB9Vo zMqV9R;hJCj2AgsGhW&bE--xww)uP5kB%6;02esuN!9E;~_A_a97*1 z`LS8Or>wf~34%3xNY<0?`IgO_uQkUTH30!`c;AS;6vTKXJI`(VBjC>kwQgpTd?UMVAl9%P?`~5e`x#Ys=DM^TsKDazgc0V43Yx1g_F- zdG2bGLG2X4!_3y%R*~o8X5k>PLhwP*UXeHI0UCN9<|I8XpKn@xIlirWFkQBIVcqxx zbFcpcEg|-tS1=5WC9rER=a*t*+%bFnAeV7O6lbB&@&Aif^UNyH*j|u}y*#<~No!f{ zSpSOHzk>eBKlYg3r0f$3Tx>V%+WPRNWwQ4Zst(E?-Vx0c;QI8Fl!SLu6{G} z|Lv#th<`Mmj?gCKLs*>T&JtlU7FRjG$yTKc^1N;N9XyW99k9*XVop8}dl7{aEc`+x zte>}?7Pvs(b8h#?7ghvIe{1;$i}X78k1qN83W_J%6!Nh=Jx%lb?deb`qY-qo{v1FQ zObxJ8RK!rd2u(m)eGANI!CT~)(ONAq3Eswi+cQk3M|+Dfcsn-#Vef9h^xx++b($kv zH)^9~lTrx?S`up6D_WGHH(Ml; zW!*72I?56h=u99~8g#O)RqT?vM0@7{;twD`D!!{Q9akpZ&6)AjV0=pDuK_?XLDF#b z_19z)wa7QODQX*P?2Ar3$6cSMWux1;CRSfvC zl5k{8QjBh1-Ju-O{=V4daDEwfvAB~xFyrUG@}+bPulw8}z8qE~;^#dV9i;yDsl9l5 z_wI?)-PaI_Fur@}DBIng^}`4L;w#P5J#Qob;y3EM*IweMHy1InMN9IYD3g(2{NEMm zuPH!;mVoSvY2PCYrYTZz5pF4ojBpFZ0GX`$zy#X&*^|Lnw&JsmArqanD^NLqhR4&D zLYa|Z;nEe+^+e_605IMJ03~OQO@PVZLSqx)<5C4Qo2Z|$jo_Fj_^@iJT2rrNsDb2t{&X{`4#uN>~nko9@ZR6IU&7w5vyxa8mD*vjMFdIcXvN9 zak_Wc#m&2W{+iRT)DJ&!sh@sRTt`CKbTpI>a=gHM1TZAcWL{)4)@TbiwD**8Wt_Da z@Z=$tYiGzc8R21KZX}aV2qRJ^9qJ|u5`_|@z7k1vH&R~-HYSZeoR4ak8P6*E=A}QX zh1mG0)}&_*sc!2oXR=N#^7MXdDEU`^m6Uwf-%sG^)&Ich9W}~c`q7Eg{r60q?!DmM z_V8zZ>)B|mgn9KZkARiF_(DKstn@NDz-xcb3rFgSIC_wr?BmmWzcz7t;2j7&w7tO{ z{mMmSh!lR!U04qN-U z@nsNGk0j&Er|Miqto%0O`<>24cWtKb!EF`{OB2=HWEmISpZ9Pa@7@>d5bGS^j z0GXM{^&&dMDjRXgHUb6el{Cqa=9;kRRvvHH=%@nYIksyHec zkJ^_?l{?vx+8k1;&S)8!O0_>$sS?dAoJC|`c&*%pwNRH*sg9GFOy-A;D$_?hH7uSX zu2RMMKq^&~s8Xro9-w84D?*<`&s0N$6^m4=^2s=kHg#{UL%p*8wOnl~h62;tUCFF< zv2sJWD`+YD15C~8iTy%Vu*!e6PETgn=BsZKcV zwWBUi$vx${q|j%+q<60lkQhb7F;|UlxYFE}u*@cfQ*D`b5ykhdcK9SBN+&$+k01+u z{DdH~7~#tB#$vm<)4!>;oh(|q7%q}`m}xagJ?-@}=v)~FJHodz*DxBkyH1Ck_f|nb z)Mj=%$K|}pa66YThQ?&C{pdKaS>@|Be>B_5vph4Ff^U4|*oR54A9HZoeKyL;)@5Rj zOVB%IFYpi!2D-qWC=^HWExgC4>z7|tT z_=i<+b5SF053EZZ7j0SkUDnn5>~sh^UQk=AFWaC1%{oBin9HI z7QfHoqQ6$zpO^Usb(!lM4Nz+V)Qh=bM$xOD%r6!miyVNn(yMP{r4HBdwiWdFIt4xU z>E!VH;cqPu1|T+vC4lYY8hbjaO$}Dd&G-&X`V>zA&;vTDY|<=9xVZgGx}9+7e`itdmAE@LmH*@x{1`Jhca<{cn!@jPCUh?s67`FQm$kvf;K-7+EK z7J=;MH@s!@!W-Xo{;rGm?q7Jro89(HHCmvU3(?<#}NzmdrksOdrRw%?_{uTII~1s8grorit0GQQeX(og%(Uylv#d=<>)@XS~GCi ztuPBXX!Y0S2~sXSBX~7n@g-4tjj3LESbbcIRM9Qg zJGg+!Q5#iMXue-u_wM7Uq220|kki%`(kG9nfSj>X(^r@7PO72VH|%?5^*#x>4JGn! zax+0$gk@epq6pU{B{GkK+@^*#i#*=Nyx!~xozUynfeanAe){W~>Q5}&#q+TO9p>SY zK!?|Vo1t^nBZCgF|0tld;vq@yr@(TLWP? z?iQZ0GsuV)7ru|{+RDt<7mrHye%+dll%XqbO|Z#y`o`jM(w!sufj2en4f%` zDv1r-r8Z?T7nZk@ozOnj9 z-+i(eWA$Z*BfV?pal`)GeDpjqBpLnMKF_fiQl)eQqH>sb%l$Kp4t?unr1$P{?C8jW zgx@8<{9IRhVL-nK{5_Oe#c2Y48I+}9)$j&n$ugazPSE|FJ%m`IUc?dH3omn+n3Ix-FYyzsDOrDmwpNT%p$W~A z%O!S!7Ile+Y$#R<2~4n!A{xA?{o+|I8H0{$qLqfOCovK**V>BRkrWlX!yRfr$$)Gq zcbqC)kCi>?YmbcT^7^lW>ONMWv+t2Xhu43bq4VBH1|44iZHCU@Ju>L<`mY~4U-`93 z3VeyZXY6kB5G4g(|5ZTek%_4nJ!Zw!OP&<903ZB~im7N;ThgpLn>UdE6T7P{1;Y+| zHI}RO7`EY1VR=ChSe;h&sp-URrQ;x)A2wdH|a8ChK*js;Qe-zh$1St~^PuX561gFZTx7 z3|@)jVsC`gI2kAyG|c}i;V_Eoqm)TPXKlZ9TagNq4y^UXZPO&rj$q;}pn+jqJl(%R z0AICi0AEuB_!{~6KP&)$GV;g2#m?>DMXF>;3_(4PI2}rO0HvYrkDEtYcWT z05&L60*Oy4DvC{Rf^9<_2<$;AtvEm{2dc=x`g|Zsxioc=E+3e(TqZ=%N+bDjah(0}!V+&Pis?5LuQz?dh%{4#S~|_7GgR7o-nj@s z_p9XAxjWqH$O=$QA%sSQ;4rTNL*%z=vXT^CekS42?RXGd;SaMjlx9F6oC+GI0syOq zrq@tRvXmJZ)O*>W=NfBEGt@JUH9I%L9DdmDu~c}C37hFrpQo`(4EhiHBr`E& z{VMrm6UuUSiv)(On ztEvTIL`kV57_7ucdM^zQXXH;4fHug0t6~#a_N9EdlM+5U?I^xQ=EZbsch4a2z4nC` z@yYrrGB3H9k{I%LLUs=ae*9G~u(>FwJ;gD!8{W({%V}S*HuT9>`ebHTCO+Dp{AfGy zQ45!8+ea;QaycJ8l0KRSEr2RWNl?SD7JDKJB{n;}sCI5~)r6Ef7!C@2J?_=(N(=J- z(#lMwU3~G8Mk&W}QjTkGx7CgRwY$C0M!lAYcU^UH9@^FaBgL<4uZ)w~t;;2sU$6q4 z3wzS35?Pt&n4X%?vhaCS>rv0uLX)<3(%tDx$kdvEv^q^F>;tR+5m%auBYkhqpEd9CylP-7-FVr@_Fq0@f{$X z6n6YsTiu4Y9l9M`irO)NkyJe>V#8@?X7e8%bZ6Yb0%Z{<@lO}-bMR333c8nKCfF@Fd+334jV9{gx(5%QYrL_-K1yiDIDjr^ zI$;`EFF zvTY;mQJNSFn~UKy_gzW&%vWn)-+RC3r+-z(5Ey(f78R?px*l>sc+h$^asX>Kj2VohlkYiJCQ99LPQjhJ^Jquac~%eRjk@y`HUdN0VJ^Iln4=FvyTcxSg=d5V zx?n+|by1u~d7Q;v-Q_)`7b?k<@S-)*eMm}=|AFZs>!rx2yZOr3>Z!Z@hkp9AqA0z1 zStF;@nxQY~A$w-xnuxxR+#bMG%QK2kUd2IHmcY#O1UKdeGc_3}WE&R56Iqb?P;P~a z>Be+3t%g;*TS!>8ZSVY&c3_#fC<%D!KP6kJXAZ$^i#BpVK+; zdOn)hZoULo=;KtSE!U32G3tZHf?Jm{8>{qZ?C(Btw1!DSgB^MVYdJ;!1@>asgL7 zU5H=uFurE|o<%d&v(8R86hQ>wxlcWp^)$hJYjp<@tY*GDHS#dmFyCEgzS|AvTUp!~(+0{+ z4cL3xxkz&-9-P38l{qwgpOy9;U+dd7niqS)r~VH1gU+)e%rwd3rH2;p!PSZm zaG*RnJQKHci3hzrn6BeiMFQr0$g+e2jqxfIUKL#NDrZ@^=feF_u7lq5Sqs%Dsb(h| zTEI}ahDF3dxdV)1vZUl_3AZmcSdtDY6tn8B%Ap1wVyj{xNAdA073e|I6K#TK^`C34cG2N zi6x>M)vC)D%h!P&i=7eemsBCd}>9WN# zDZ$;Pvc>H>0HzHGWSp*-EsoJE>Ix|k#-H@s#qA{<7olZT(&tRP4qcw;rYm#U=tTL{ zKAQT;;Fk!20Ow}GFJ8=B`993={I^;Lyyp?D>ch8@apJ@TvUj+yavZ(3kic=V5o3nZ zfhv*WT&25VuM$@;#)QpHYzmy3YMOVi*u3WTBci2pCVk41k&@E3sXDbHq6lnA6J5DF z9sJZnYkiiT!j@-+MBz`RKe+c}h@GZ4E!f#%n)wdQgKw3D80xEbCg(5it>O%peU9B! z3N=y(aeZz}b@U|ANJ0%GQ46$T1tv2w9|P&iCtbKeYSL{v2M*UkSp(1T2$R63J>kdY zN|)t1`u?p{_el#m0kpu*B?WE&(jaMyP zpno+nLp+g-8SVwn?YXG8Op148&^6mH1dkXSv;kY*7<2 z!Bq1NqTBp4$J3D&QAftIuRgfa5L1d9p$%BbG@>OK>&K*QAM3|lZ~>{%o1;cXk)KsKUvu|jPw~R9-MNY1d385Z5FVVaC)Td-;_ZBKQ9g<2e92^RK^8q%3HqJ>%r`Z5I$e0j|GTeU^V!CaB=FKbIfo{n*HzW*m z2tEy`N~q$1fc#t^^nY9+^he6jKwfDygaZr)F)ObeX?>C3*uX!EI6aXEMCrgmwLvy&Q%R?^)XM8=HL1Y_ zp|UJr$iFpW7bL7hf7bhwwntx#MxlzOy=T$lu-IxYggF1j-m_Y)i@axDV_1978cjAQ z+KfqJoekVwnqM-CEafh3CQIW^MbTwaMAuM0xW}|wUS|mwV+J;?0fu2&s<)#d7ved*B6xDf9IOm>~S&y761lF^vVb3~*SV2+3J(=PF zJ2F|v@IyF|t4*AV=Fqs!X>`_42w}6IXT!N;l{#V3qz4}ioP?-^7zAZH9iNaHse3GB z&#z@VgKYodL$(h@wH50KM>q*t2%n&uY!C+2ls?8%6?!Jdl&a7(F~VZ8-PE=SRhXA> z$Q~#nxEPv-5yzSJREueoLO_%IXEGC$Bd*w(Fs2n~n615Krgsp@n$q6=S<9YXz1<>q_=Y1i@IpkU zM{u5)Cs#V-hN3%DSEkez`*lKdl=EAQy7DM3|IgOO%B0Q_I0fFhkk+^ard8m8Utj0f z^Xi)`O*%xR8@1|qUsk^PL@{!NM#n+qZ8My5L{bC4@JhhbSIr&wWw_ttybLoXH{mpW zlC8t(VIva-Z740RJb3_&Hjq6KBxT;z(c^qeA{i)W$iZIj7T(lR=2qX5jJrI=!@ZHS z+AG`2+RRatfwC4~0o(6MRar}Kf(pFWi`wCv^~&%&aFqfGC$AHTpk#-cb}+Wy)lD@} zgj1ed?1%iy5(G-ya- zTOl(x{b38O*m3Oj;IZD(F)m}LoIy)RNB`()qok0-EmE=PQl)BCJdGMOK$W6B8lZ)W zRU%eLkpe->HRFsPPcC*`dj#qIe4po?bIrB)+Sxm$P`nbl=bZ1F^ZoI>&+qqnpEvtG zbX8?wwQp{~rrIEGniBS6>ZUS|B&13d8*s-CZkd~QrX*gNP2SQ|J+`>^Jb4sw1hKjz zh*{#J!gBf3(gJuf5a0BYgZQR@t04YFSbz$N zdul#;Ck})K!OqF<;+U<2TZ#nnXDM{q4y1?0E|90E416H4p%%*!oUK(lsT4mJzt^0v z1R*ExqIGvG_VrNUgvo*`CLNh#ds5KAA1fCRWG+a`nh!+=fCLCmyEyv*-U$Mi`RRf2 zUJT~K@8R;LJ3Q~y@6^wE$F485@F znhZRNv#lc;ZBkS?kfPuOqgWuvy+TxU5=W>T{M1&c6bw-qTg=?Vi!)m9R1B?lQ1QO@ zCa`9}yIYI4w8FG}sRh=sqnwoJV{%=V?@A$5>(;V@ilqDNExg0zXj8@>9Xdxla87i7 zl#~Xq^Sh|YJZ)tK+1;y5nPs#2G_{~8S*$-F>wp;zj71r@ANVqMY;lZB z_TM;e2?}hOJDGu6W-MHcTC!I5C?U6L{Y}#uJBuOeZGswOd+8+BZQn&i{q?oqhQyLa zt*t1_)2Nr0SbtI4*-^2ed|f=x;RMj?vp+|H(JHkv zsmLNN=tzjV1V#2_<61O-iQ?kCFmo=7keLBYlu-}B1uFI(8wJJTEjh3q2Ag7NR` zv4UlLn{~;<(rMS$a`FjI4ZpzXZ+u^Ws#tdw#6ERv@d3#CW)gEj`AF-$AypcB=it`I z5Wk9mlSD`9*I`xCRV=iF_#B!d3`SKJ6Z$BY=)`{1wii>s2n?U=^jX5r`Hjr+tgdX% zlRn1<`*cxRnKfQQUEwD|Fnd%6l#TsRoOqOeXk*a7tV<@V%@4txF^GX;k$W?PSKm_- zqL0XFi3+C`X#D#2B&@Lv%ZPRljRUYWP9A$RYv~1BA|7s=Cs&$cTKu#*N*SV6bxAE5 z)ppd(N~Ixzgd*M*e^$PzIHp}Zp`UE$Le-{|%IOn^YJE^wY(o$zApF?IszWf>uzYG` zv)$j)&j>B>Q`<3=6lOrOi4_kL4+5GiSDg0V7XJ`scgxa28502PvX!ae4ND-giF<7L zS(}{z08N#8r>Wv3KJ|Cg9MA~W>XP-xjQvv!15zXzNGpsHCU8U((@LN93P&)F%g`bW zLmQINtHwm9j^jQ@)|XNjZz&P0RLkj`Wci^fw?zIeg%c{FcVv2}E#<_OD!vWvEY}8O zQg66m3hJOi{Sw5IdKuHGj)Tyq30fwkM0mh5PgwXItl!usAF3#bX=JkKgn1wB)M_S+ zPUuJLL~t5{0*sYC9fA({vQf2%w9bs#mJpyO4>f36Op(s#41H)rvqH&UY(44`EK=Mh z#glim&8Ag62KJCI9DV>7XceF4kp$Da$7LMO$Obs7X^~!)rj9vjH z0J;eXzP+-=0Bobmgsv0k;hvjur4Xn>>QLu659H!mvd4C>5P^k5TgIa9^eOW7ueG>UeanLHp&a#T(8KJxPhl+`WvhLm+ zDn1x0zNe~~-FI|X(Ko$D-lftm6DhXXi&CF+cH3cwN%5!os%0gKR~D7|E$Lk?SuEdSm)If@OW`MYgoWJ}EGsOHa{U+EXp*ls?@5|s5;-`b>8T8-r#j! z?{&Vps?)LqE||sL`$mHDTCehIuks47a<^A`X;~#4DL|5arwkdlCdl2ULd_RQtjC6- z#g=rY$7W;^0ty|BNgwD2-_MTZY0AX%pW<3P0ba2_MM&GnIY$6u(H|q5Tz5uJvq+}K z%C_u%C%AmYPDEErJW@vsP!|!?+U-@ItEie0TvmPdiyow?H@ewBpB;6INB#oUbBF(2 z9MQvb{PE1@ymcIbsm3Fw#Ld?e3hWZ+K6ad!FDf3;>)HX!{(j!jyakzNyrR(;ztN{9 ziUr;!&L%8#Z^M9nNr@MTLdNH&DKUN|Jp_?GjgZuM#Q#mEAeJOLa=%D~hFz<@*oBk= z`I9VPBp1agHN{G8o!=V+DjvmjE zJMt>xfrL`_71I`Ek+)ra_$vM<@%@hn0-yv`-Z zQ3M!-X~;OMk}RhB6n){yN?f+ua4^FK7tOR^gh9eVQ?)i(Ml8{HEoyIqht*Of%yAPE zW5V(C^ulQ6#W8xn#5V{}y9x&Z9-H)M+VR8tPLW#vF!** zsw_x?Y~?YAuTU%pu|lm`#N^4CoG>)pVZa*FTdF4H7%8ejWyptVpDwL2t)S);Vm@s- zh2@&yLVUR9YTQ&h)DRDa37g5~B<_4Yth0q(`3%O=|B0)jGnDo{cDqhcxr9q@N2};} zPD&|`f9_AX+s+*qY-C-uFG9q{L3Sky@@y0bhyB=;>Gwg}N}vJ)gkSb?ocxusL8=*J z2obDOHZ>>>fmms#qApw+*2K^-LDytTU^lLB*4A9H*Gc66g_aq@T z4Y8luTLnIPJ{YA1Sz6jLcq>On+KYi^oZUz67z;F{zQEs% z!9@m6u*o19#tpfZkPO2Hzhqux!Ih9Ckl*l&ma=}Dy_IPi)G-JeEYEE4e%hH0`ff#s zR7z(64!W7yvTg+qb0&J|P;e%i*Lx5;R0D`|h#+792RB&s29c8*5cX!wL;{h>xCp;H zCg{as1k;3%P~L@~0!zRK_dts592y~;{!FonH_WV5Rv=MoTwHQZIc>`X$2$x=_?!yj z+xo;orsQ*jb;C`HX$!+*R{mi{4>bv@xfMf|m{Cl4nq%dTmbJwz;SKZv^}3kWIs(_` zP4qaql~;vvP9Eu104yr*#1^Ku^d>$Re{W>}Q@dSxC%q|;u0kb(nD)^hIGt|N|JV_6 zkq=@mVqZO=v+O-Xs0vI#+E)n@)nheA+{vnx4CL>X8_9xC75-y`-gfALMjc_S@KVEc$Vv3{*f{2ITn)$(^x>G5@DMuYX5xOr@6Y zL#?C?vd7p&IF21iu2k`}FspZR-k4@fB8xvNW!um@d1LIL{Ui>~mqC3XTH+x4jAgHI zs;IkErAuhYV45kZCio>=Cg&m_Hy1=dCo1|-h61F>hXe*ny9Uk5Bl=+6 zkNn0LqU^o$4J`Ml#3@Z^Ts-|>`S5UFCaroTJhD5%{KX(>Ltao2#BoP9PA$|69bZGk zNz5I5lzt119gq@-bkm*R=IXX?+qPd}WGc6lpdmHio-GuumXpUq(W(rkLQ~!!gq{hb zZ8rRSJYRF!6Ik0NujB?PRFghXgGC&nofmcYtFu7;XaW&))FgwQf7mdL2F8m)c1bmw zlnAz=4jm3)x=1w8a74DYA40#HibJ1gli>pxTb8v3M2T^)qL^mC&HglOe~2BHz}7Mg0gPJBTLq=bK94YL5&MWL`b`ZtD%kk(eD*Z>LXZ$Lusw!>k+B5z6&caR;4 zqhR7FNGAn*IIv(3bvX*k%w^9uhBez8m?HaVmJ9W4mY5Y2w2x$?@DV1C;3(rsD2Uvt z;200!NMQ*_MWZ?j24+#Apd=p^RVWzOQBZ0WKgv~UtG(_~5N>SKpX~z_1g6L(B$GuN z_E8x*xI2aA83rnEJ7GE&>j+(9cv`F@1RndjJK%-(%H$0q8~NB`8~F+1O62jAAXjW5 zH+(yd2=7>pzWYsai!F950XYrXbAdz>+$2_X$*2v)Cf*ECsRv8h%kbyY{^gbV_HPn` zrPAWadxaZZg!iao4 zT`qBhC>tijM^yvAUss zMOp;5aCmsXTM7bW_Pe|t3M`cWX{dk!)Pn;^&mc{+3=RlJhgi&#pG%>vJ_lTGZ^$SF z0`#xnG@V_z`clO^zMQ~3`t1R8iO*jKV16q`ayu$2HB3|_ZxGwK+)~)t?u@@cFiOji zX~qp9QFV1gY-w!XatZc#&EisUW~FYFYYb8LK31jbXn9F-EMTSYVN1YLVP&<44Tcfk zH+wB9@?tYp4B2Z5n_kRdGdx_5x&JA7pEQ2|Cpz3-GH^v(^SlfH2A50B`H{Hok^Pa3 ziKE1l$gHb;AEM+EJi$(H@>aPdKk!eKhI%@zj?v6+Gel4kvOj{qVn57f%m68{4RMQe?MMRPlhF4;HrifAgHOs1yNsYY{h%KkSwHr1MHwa3S&rY0!pOm!!xIz^X= z`^ip0!s>3fQ_OJbbc&qIgg=e@Z|x4GKxwN}?Bc>9cKV{}-?O-2KO!boo#B}~G|k=W zYXTheIpMk^0V#MS5Kxt~#nPil#XTICzBdyniNZ~UbHcpJ_a~I;hF9 zw3)C1g7zXUT45%pQi~mwu|CV%?fYrYtG=@ps9BgkL$r$1u#$&Sp!HSlgB1}YW@A5D z8K*nh{V@#qh4n=uxW{ToC%>bg)Sm2QWs~s|{APbJR^tF>(dPA+@9xJsK{=)htUtGc z>hIQn&1IA;xFD|1Xoe4UO^~;sSeBRVz8z@aHnEQz(U+UpTLygAxmfXUm5xsiuat*b zd`gmdIXv-;(yH+x{i&b3$U1ww-=+&%aA%bPAz%SBLJ0Xlj^ili4+t$|CUWKX^zMmL zIjh_e3UZS(M@BLLWF@1d>f!&Lwyt za5Uh7kfTA4eAYKW4R?v4xfoKycD2T#h5dk%V^!*E8P34+$QgSjjwMN}io{b80N`xH z3r3_N9!lk7X^879NTbpavq(<%;wqJor6G1-YREsVbi>a=*4jch#_9I`aT&9oeYhgU zU`SLxpkQbKU?LOcItsGjF#l`c; z!nB$ zr=_2a@ZgdL0rGaQ%aG!;smQ4THKsgy`IzZFEEhz%=UiAikDXrK^D$tMWgp5r_Vif! z^hvm)Biw%UlnxlzK^gC()eZ0(<}53_!gF*j%^glJIFijGz87bo(gg*?iV`{^*KVNQ z4j`ufiZ-c8%XHMTBe{f2$97WYc|CPION2gWmb#q)Q1KU5Jk^2`oMlwUaNLnxPZgM6 z99JXH>(x9_{S{nDroNjCtz5@%3P_t6c+v30T0zATI{Ae4_Xa-UZf0kCyI6quOb5-2 zKPRF&C0y@d+hDhJ9!lI<81@3nI8NO1OfWg2IeLTfUM^PRY-c4g8rrjyl8fFuSVcSKq0IVi=>DUvfhbtNhb3qgp7hc}+cuYJULKqHpt&OU}GE7hGoR*;g-J8dZW zR?1Iy76d3mNds>U7$~;MAvj#k+UtBWtnA`qHJdlks$v`!>I*}jO$c+0=q7pu|8X2^ zx;xoz@0EuJ8)RkLVq5CaU_OjZ@sNe74|RrX)QRZ6H~|I>-UHPU(r{DS=1ndPS8gC* zL{~8{+g2<44P*7&NX6a2bAh)4--c3ggTqS2jS6J(SejGPcu89@C!_52|J*H)kCyl< zVn$~t(iBbfL36}}S<7&bRY2_w@#*C8vOw;=Sa3^uF0AmFj^&q8($TNPcz ztP@?tPafl~S;IAo_c8dyn{b7`J5>R#3n~i^0U<%GuMrn5;DT&cAeWs=K%=?h8y1Fy zP*>fsXQ4IymaDP&~zt`k>_5+fG>O^Z+J8;FAsgt>_@ z8lr$92aJY?^XMIPHV9uX_J1qAc`s5qzS&M;gDYhWJ^S!R@hqbNafDoMIgx7iuJsB7 zgfCB19ha;cDqZ zW_gU+76Vg^#-y)|ZG_Mj(}Ji2?{PHDnX9LYIk*m|gz>1$Ko%Pl%GvcVwmy-}pJ|zg zN@l6#ZmK2)Pn277ro@NC&uM9Zz>IllD$8-B(TH)w>eF52z!Wl++*)+zG^|v|!uc@U zdM1!xv5MrjWZKXKadIoU62sM^nhdNkT+xdRENb3n4kB*0hUl30O3~&(4LQRq7m@WI z+Cez*CL(B{J8C=9z?GAFlQ`1|quy(5<(0Qswq@CKV1{IvQ(K%f&n8Dk?_Sa8w*InzenfkvT_kAKRS4|rT%JpbRq6ErFEw8aDo z)Z*kLpNfj}jZ}-LbpHTNS}Yd^j0q)HtzyY^wbCxpQjFqxS=7&CQLF9ZwJ3L;?0@-o zBurmLBnQhXmdYypub$DxBMPf$)Ny#<;2FzHzQ6E$RP3_B;uJ~RI=+yBTX>(~Ae9R# zT)k@Hewzl*m<%!Q$?EsbdfqyCW?3s9tVTuL@?5P}!HQ%V#I_jPA-$dAc2W6_DIsEv zDVan=z99p2bS1@&zP9yLE(i1^fylVb+hGbKwNVif17kTX+*@?tcWj-W-4^b0K>f)9 zsx3L2uR$&c91wCjm{fq3xbEy`Ru{Mf=b9;I#!v7zJaNX}hEFTduVjshVH$j+_?f^v zDM`W>J#L&=-y)VO)d(EWG&DuVa+o2|_Ay`ECuqQ*#Ga}CV0 zr5sT%6~Z}xwUr@LBZk<74C-AAW7{O1Fn9RTxCDlJ$#}I@N$8qAO6)v+-XspCt=cMB zj>Bu|Ah*Yap947hoxw+*+!(y$KO_y5EiuC!W`BamQQrG4umn1lmju2k!15SslcYn; zh>#A6t&{O0ThBEfG32^qp|A1d=VuWF<~a}!vJ_xw{22WF!Np)ZD$G{OXbG0%F86o;`5!-dJe}(kudqLEx1K2qPj`3p(l`QxQhcXJ9Cb?;o+^AJ*qI}w> zJRT|r0lKvUCS))K>6B(2ejzFI!QsL7Ks&JyjWDof4^iW63=y|G_EG!oN47VpvqUtp z4}=nS`binY!;7O=N9oD&OV5Gx3}%492ax5Ffo%+890oR~9i=xeoWr;iSJV0ikaE_> zhDeDNv9{2+ac6avG#hs>R4L8y_*70NdMaswKZ=-cE-=llTwtNITsT`e=K^2d&V@JM zjKbze>DlA;a9inc2upb!<=JV=#S=DFj66#3kAw5VLrZK{dyQ(WdJf?UI7f<1numhH zQZN_ho>qy%L1J4ZKrqSrC-mNI0aM1AMZ|NQ{SD<%0qKI1fqZ1eWlOSsXPSveqg0loY+}Xf=jj4ENt5nD{XCHVWUu5 z0g88Jpkg8a-hB6v~vhh5#G=6~iz~*wk>@)GE?ilogmw zO$j7in(|_TM_O=XZIr-eEY9-6Pv3EKvA=OkPrYN0c>_xJR&0cF?HZ1_6`a&YG}1j% zTB`aE2^B2V1MfQK7V41@Pv`zdZ%3;yMv{Ho(Td^WjTn`pfm?x%M&yf^F8E*=jo80s zr-O&$lVD>OwyOIi*n$vz5^^HplQ0|^o+fJ#zE>NRG=3FWd!hxk=N<`~!(c%=zd$;q zWwfKI(g@rASilp1Hgr&t%w8+7b|^tu%@zORX1@GDvY|UDIpYeN!);ZMtzlBTGO1K` zgJcjz3>Q<#toPb{iu@SK*rVqDME0v-gv@EXlsmzu(j<=PM_NP|$J#XpDJUsFyHRxh zH(plxW*~|$Nqy#fmPvI%qt9c~wo1N6m)q$>{H|SN05u`~_a+Kw%-IrR$O`|`_M({CChMfpXgmq)W)+QTtr&7iz@(I9MD&rGHl243M z#?j!(lEa~_yxbcEYPn*rb;fqFS)D_4$%|@Se%krEAUxsgc5rz`U;$4Ra&Byw3uk~2 z7W0btO3SsHJcgI4XdANw(`j43j7!3_^k=ZrAVG)p5F61NC=|+Hh;*^&*b~2AMkb%C z?oJ;1LR6ereDhcNNiHXn38r@qNsrCG^Cql-s;%$X0;n|jX7-SDkb$#duuVnzzV2ejZ zF6fVtt*F#!91I9|Oze!8HIz|hntLvR?IVtbGhG!*I4X0=CLYE>3=LLyO5u@n)iM&Y zeJ*<+#{(ITNNEuNFXOpo;izDCP;lG|s>NyyPb;Wa#B{_eUjQRt?HqrSA=^RC0feK4p)R!A1SHDDSc2sI6t0 zTrSQLYml;{Ur8bg zltZ0f_QYpRxwe=wtVZW7;Es%4ooz@x}7$_10sV&yf zo2Xb%oAGV?_}%^N`HV?ikla@p2hB&QGoN%lz=IQ*aF9t&;W+b6q6^poBDZ+bHyey`qm&GZU6Y)(o{-Vd@zhODExh_-Vim}8 z+}77{W=KDzC8YwUCDp)Bc3f|TXb5CUDX9Wn%u;F;mcRmFH+X-PIz52k@p%w@;=2Yx zlt@AFJqniwf{z2iCn^X&Q9_V}AqGKR&j5mt*CFWYs#;PF{Im=Rl7c@NbdQgO;2#Ze z5My}=2cz#Y4*s8*(}Li&GF3|qv~vfbIUQ1F7|8Vu;CI{)jUK{4+A$2Yssjrbs~e4h zl|g)bWX|c|pC5PQzCq(}5rh^g1yMg%*dSzzod@TlB0CrXAyH#SQi%`8Hw9nT{K!H5 zYA!xBA~CW=)tJU6N84pYIhczQ&Tp-loeIh6VYn4zl%aO)22WcrXHBTTbV{19YYUBV z)OZizh~~{x^V0CX7vfT_22`8S-US!A=U}_W{mnCHvHADK^g#l`Px8?1!xo!wiT47V zW~?D3826XgwIC>aq^nSNN*KO^vT+lX9#l{K5@qin#M9c|-C<8*4B#qHAwpDNF9$@Q zYp@&C^66rsp|=(H{`VJB`(qN%?6JX)yW(K8@}^*M;}&6q2&k2Psk@Fc~m?Ze&wJ)?riHt@sxgj!G3-^{G1fJL%q{CCvZ9)(&fxVtBPA&-b1jc+S1xtaVMBpnub@q5_?q}DLl zd?)p4!Z(U2IyIsb2taV&lQbw>Ts-%oJ;^&CEQoGE<6x&R3!z%~gA_HOoQ=Yz%YMXR zO6i<@u!=*)5l~;#(;C{6NrdN zZ*)wB7@dA&phC<~zY$aj#PIy|8xtvG&c{(9B=Z4)DK6>uZl;(eV?5EEuUP?h-Yomx8~koQqYltXe6&WB0V? z#?%hvk~;*&`%8i6TVnKPDOJPH7|VqbL5h+zb*Z`>#=SJLvM$y%C$DT9lWYtgClr88 zLI9rVrSt&T0`LZ8WZx_GO5B6SQF-7rHTpCF+6uIF}-h-Fa57R++QtBE)AK^*v z34(~ETthcft}#L*E-~R{w$m@!t=UmF9$ne|VB}m63{){9#{vV@#~xrm^M1kX%YM-z zsa$kO{h~wkt1z;*er0TEW`7`5S>l?mKEvP_F3kc-R*d}!=mbZ}V0 zgf9?>-UC>-GI>NrOKJ{Cmwi(QN0K|nZgqD>*(#)u3anP`?&{^VDu?iChW_c*otFZb ze?0)^UpEH8EboVbS-xBjYbjuUcsandN*4n28v|f|1Hb1P0CQBUqkvhChUxkY!2GRw zJ6F}F7QQqI=B#K6NkG^H28rgviG=TBv!V9NhHc>tuM*QqwEt%4rr) zCXxuv;tO0^o+UY2;=2BEOLRD|@bQF=Uvi)WcE-e>Ayz)Q z5CwJOFCL4szgI9(_&Mh0`CocWZ}Ib~>gQTR*}GaKq+8JRuav3lhdT7Xi!;9P1ys_{Lpw{hh+|gn7U)JJa$U7OPHSnFpsz5MoV4$vc2d%s~HAwnegSu zCKG;>3R2I7-(=|`Pgu7zd3r%)>F^b1cZ(!VVd?M%eA40jJIz5xd}_6f`1blOAg&Gq zAi7c_`Gtt1e{^%~r=O0LE`h*R$^IhMS@m4UZ!3=e>{mHZ@Yp|ok%1TcAMakdk@rA7 zj@mfHFFa7*x>>GP5WzUx@fa@HDDsOUNekUV9shE64@9ICM9jyu8)2|#)hSUfejwH8 zMJYGM2S*so@83E zEE)(5$uwCr*>CA;0cgXP1qp@VCZ%N&wz1a&ljrX-m-P~2&qC-oK+5)aq2#S|*)yE< zva}ts^cx=@sfa)sQbff5SY*)@`9G{>d@ad;B7+7ietVMZHa-|)^WyBQs~NY{RD0z| z%n$a})y}+Ow%i(DXVr3~Ho_!BbD|>IJnmKD>Z%MBCT%2UQGD2BGjb8hnai$po>XQV zYv{onIS|S;Q2Qf*_ zs^zzkM1D()Oe6slyiW4($UiTtmXm&juinEeH-J9QbC7Kf7JgW!Z5w~DEB zvP+9c6V}&c8~ORDuKtQw8`hS~dX^j0y#lGbe$87g^+dEA=ASw%ufP$R0ig%xsNGy( z?3JyHRXlEyw?uT(7N0GL2G0}I>a*cK0MA z&^8RQDs60q2j!nLZ;6Pz5F5~5)(yFdL!?^>Qy>R_Ju8!Khvk^dAcB+P(NA(zjd^vD zyH*8SRau9qRZ5VNI8?MrGFXY!&407G2gXZ?G8GEnf(IyMwVlFi2*el5$;Yk{9V$Oq z-jd>7p1Y%Hus#AioV!E71KVL~Er*FiV*CjI*bHT(DJAAs^|f&b>b@_~V`U^%^~JGA zdD2lkXG%tozuX9P^gDq-X9|TsdAXtR;qL_~eD>vr!biRrpzxG( z6|P(+tmGx|r`cpTO4!e6X~BFQ82dkM58Rk)c3Ie#bE&u@Za>%2rShU(>_gz&5g-n9NwZ zu(MLzF=5`?)B>|sbe&YVNQ^l9Me$SfAP&~~Inif(!13t)w zFO!i<@EW+-H_@+JM{a(~{#FMNNI#v+PBqOPq1$KWL9FSlAmY)acu4jQTC?X$VU3k` zpLDHx+3^KS8;`8?S$`f0ddrw?{1?~_ z4!p}(FL1h7^?ghkS+-QQr8ud6XzK@z9G|t*ehz@FXAA08w71&kSDS@-{f5@!?C1&u zx}}E$Q&^_IQR`)WrjoVm6bhuo-uxKO2?&vIK9=cc1xT7VORt~`Rb3ZMWSv=%{l5Va zet6j+e7FMP!)E}(@d&`bHv6r-GoicBM7sTG;t4(~x1`M!v8u*vZDnoVeqch=VY8YR z@m-vH<+dN(E`6EmzGs&xl0O3zp!cBQ#BbHfxcITsQct%u>+?<62&Ekoc546|3Brq!>y%fx575gy~W));!0+@Y$ zF__I(K{J3kk34ARLzdTfw=*}*axHvs4E~^PjoRfw-akaRmV>o$7NK0!x%S}Hh=%z& z;;?PNlE)gy*0-1R6`a7$t|0ucp%S^ogcGIk*YDe{5xpqAq}rltXe^%?O%Ew6+KMIN z6xQenlQiKZvkhWsij^%ZByDMtQHFXuih-7jx&h<$r;+^+MJ3X0dA}9*5TI(g5h&i& zFYh>xHjK-Hw~44`JoVsh#S5E1s`T=eN5ZJR>;+tnPUxcLie%XuNYW}uRz5VyQXOep zM|8hg)^SCvfXn^Sc%Vy?^oq2mS9`B8mzdLRcma!j$#^X~A+ub9LX_M2+C(zp`Nmkw z8%NrXGXS-d{nZ3OBgq$Mkp!hy2v&3~ZL-qmC`Dqjo0p{9@S+CgNU=!dy92L^GAoyC z)nc!M`{Iyvq0N!%OmV!!uxx%Zw)T`X>RbE|Ii35f{Ce}+LGsi4hSjtwDL6!VkR;jZ! zsdAfFxz($j^(wblRSGlYFOpx|oJ-V&&z`d@HE5NT^=SsEZ&Yuv?Do4t;(?iClkMc0{j434w=`Qk_eE0i+i4wGP_#e= z36YcG^Ta+cI#v1{Du@@WfEZVf5=j*no$Y7m;04hGv7^AfvCfxEi+9@ZzY@zMrOBeh z7e>DnUmPD`99xq6Y|*-2&HtQsBT*y2H-=4?=HbR3Ckm@_ebwQdR^UdCFQBDAx&Ca{ zpILU_P3WXfJ7aK`3sRY16f4ME^04uRK&ZnJ$o0;$MAy#7BgY<9(?xb#-OJTvyGE$v zJL!&L^YHPV*7JFXQ}N;ZKyVo&J zzc4!M;<%fSvtkP% ze-zuihXTS!mu9!)2m;vb-^rv2Sd1{=tW8`mw9MIgL3Dvd6qr@c7A87)8MGiZQ1)W@ z2tg4sqVatMF#_k@JPd>>ScpS2*-aUV-7C?iePQtJwfm+vHoE2i;_@b3Ba498e*z6v zM;KCtP7C;%=RRS<4n;zk!-R&NPAXt^=r@HxjQb+oxg5H#s1`bK!R3>fUQzbXlN-#C z)J=-e5OVvtAaox{=(xYkw-cre3|`fvP~!e?GW$PI08DZ68&LdN#X%M5sMrMsonN14 zH)=7dixWA3M%PU1TwM1zbR%o_^=uT6Z@DPqd|jSa-Bz5^lhzE0%2#lR|2$;{-9f=* z(GYCvRaEbs7+J++Vac28Urd(G9J4P9MO>}4oo9CRBEMrl zJI$1TVKi&l=>h=YJhm+wnLk0WrlB;4V3T-BTiiGgiQwiCLQRdii>R(*=@a53Ln3%r(Nn0 z*DaRuTa?VFQguSrS~UTZYAz{g(zLF!2tC|mUwyW)1d&<%hagmVN;zQ&Z6KJ|7H|e( zxv3<$hrj9s0d=ueGV&_|tD&y7|> z^?YNDdF0FFic}A#!e>Q`j(`#2-TA}C?bX9;zNSmr2+OlEF^O#%%YyPu3^%m`&Mfh=svkoys!|}ZvD|52BwDXlYIm{YdcoI4rq1pzPNe8luwT&g8l(hi>i4(Yh%4g}0yHtxZKBH`gjL*s>0g$+mF;-BQ3N6~AMYcIf|JuLt`9y4!NhcY;UyTSA)ne6unx;|DgHEUxelBC%9;t& zKxSy0XV{eCX20sr-W$^fX#<2)qHXi$J2u6R@gP{$wz5~+`(*@Ch(fVOVCL|r5J7^H zDsRbhVnLSHL!XcfPGqMXxBCd`n6yfwLl(Y5hu8 zbOw2sD1jFbB+3rd20F2q@mk2kf-k@@QGcfU4YNE2E$9@^g8%+omX3H@te01mbU3+H zb}4?5Tg|`(s#0c}kli$Gg7yd_l_BDc6wQnb4^o;4;QMWYdh)T0qTkXr+7gfLjE^YJ z=b>Z{eR^tcOC0Tt8DsH?6|5Z;e98*W3ak*AKmGMzj9u@1LU-?z2Kq>O_bxHF5`HBV z0cwal0=}qhiaQ!w(MyU$7I##wpa7!1bmr0I%3DyOfrNdCBhpYBW>m+T;eAMo%$4vH z-vcLyvfQWH=T{H4Tnxn^n=hSz zk|P&A2t0^6x(ZW`%4C`Ns)REW$hj&%PY}mqr)*$@F6h*#WSKSR|2AoPzDvO!`S8}J z*uR`Uf%!JYRa5>{&)PFPkO)!;c&?bWWzCTLAiPg9Ha{U02W1YtaY*QdQ1o1Eyuy0x zTd2Zz#tFAuOi@vS9;9^0aRP!paKu4QntoOGIjbG4w`de@H@L6ulAq2vGZmK!gYyh!C*SL)n%CP7XrHnzapq zXmb2)8v=36b>$%}GxEd4m60DDgZaBl9R0%)OKG>r$RGGFjc1N_KmYfhR)9kJcBGG|MDfd3AjT#McLmGI}wXSfGtFj{oG0oZ!58|lTq;t zU*eET+3(xtxI~-*AUQ++e^q3Dp5;jff*wlVZUNihJ<0HuZ(B0__3|Xc`xDQ!-<(_By@Q+^}z=RlsoQ=CLt5 z%mP8eDA!el?c@hX6n#td#sf1m-h-L?HcH@3Z-HEne(HbGVhAa2+pn z#67VHfUa9Mz0Gq-oqGXA0{Z8-g0@&3afh=V=bDDJBss!Czm z`T%m4VhBgk{v4pi{+vDUrgNw05z6ggEK|7b5d`eY~P2zBodkA~~p5ORD zY+$1H+Zt28qAsF-;7?HTkcO*}# zC6Mw-YcceMmaGSqA6Gd&d%}Ka{`n$o?($XCJB8=gG-e%ANqLgNGbSD>QTR+*OmS~ z7p|w|C0D|(W^rh2u9p>YZyXeFq$)W~FN0^gvW=B%ZJ-8ek4k%IDkxI!>zq1cp^$QI zX|&rL#j}(`?wSIv! z8F{7J{G>Oe0Z2+#c*b#p$VYw=swfnQ$^fJcF7k#JCz`UjAT0bDSX})0OcNk-J=x?f zyiu~bJQb9Ip9x{PhuPE(eZ%c#%ls>pS!5+x-Nr#h0N9F+yeGSO1w%zdx?McMF;I#= zqyB>$o-wFf{32T%!`f=ILmO6DZEViIx!?BMY?Es)H=|kEXv0=pf37l1nP2AnIl{G?#i{08c5s!y#9tA_BL?TgWBs=GK&vYB?C4m}z;t9xHn2ir4vqCU zT$^tg?1OIR8*CpmT=9M_Dq`10{S>7_Y86*Sr+9a4Gcz6DbrV@VP)s9caWdMFC%rh8 zt^w9Y{=Trf{1Su~c9xibihCs}eOS1X???{o$~zC~dhf4(0Af2DiVlS<-O@*ldPj0Z zWv2Y0uY7o&#^h8-iyCkju_Sup_PHh|6W3GCUZX_B=h;mwuUlGt0Crh)v;S-3UfaNG zWju!Y3ubiCX3BNzo7xp~4G0DOJ_$od5VLD&zq(4wVaaa#e{Tdwd zBQq@SOi0n%B_=Vh#U2=FZ+gI5IdZJg+hFcFsroveCy1Hie|+*c{&9?zZ3dc#nbqhD zu=ZYo1#sOXknnua@^UbpJFQ4!?jXbx&@k-e!EH-Lj7mq@N|VC^Ew-{12$AgQEF(vd z7dtV?!(KiZo*z(C%!3wjHOyXu%v8$D#%6k`f0RS|{WY@i;+#vjzfRPkljRF?6wCQR z*e>J?2Ws~$qjRID1zpA9aALf9msX^^^ED1JMxmwTUDEfr$u8?}low5zE-5ifufNGl zW>sRgUjHmFLAA9UpnP?bOVB+eT2%9TE3plF{SEF(l{YUmC_i3k=>)f- z3B^HJ-QCr5u*D zhf+wtWv_ft*Js}+N;wpYSev$=4szx0n-P@qfbP4{2n8(jdv+xJrVS_rcM5m=W0(Wi zJ9-K9u`*w)hXa;`Db8o|wMHD;bj$peXk;htw2V0FC+)0+-6=vO_zaOILMG5*r95d= z`<6auItt0{h$gbHZ%ME1t>-JuoAgOsa;+5D+;^DO7aba=x3u5qIk!56P6*GlW zi$XHmKDUZnDkv_2WO%dudbewZ*-05pLtkfw7Afa_t=yK?*R^g#8qfh%g!k2#Q{{HK z%tS=K-dVT6D%|l57EC<<#JNE>|zy`#Cejh{@yZsvRC-cHROs<)@cF<t6`8#LMCOw_?zSNy;M9hw9SBP3+voPA4T^-mJ%eGF z)ARWDS|*&!bxTjUH?$WZmb31NNyAl|p@5&njrRg}23ecitariecJ{ODy2Qj=qX;wQ zqdk4+C*Z0|gKH@n&U*LA0;=mO3oW3K^XVoQ2`znm)`mz*m}7N08)QLZY2Bi1Y8 zamk9rL_Bm#F99AU#I5Fb#=%3NcKG(6 zBn1c5Q5;b6JiY+ig%~s39=4o{q50L(d2= zT@t+F1Qm4H>J9hM0J7|tr?u`I>Nv=Ha2-m{6DlZ)136CsO3p;&m0MN^L@reaoJq@| z=G!YwMll>qeKNGWcO-KZsThTav<3Q8n_!q&@KlqM4be0l#^zhq0} zQYIBj!LdQiDmvx3(0yFzwb6AGMu9C6hGTY9`!gol^rK}EvVilSv{ zCQU&K&!|VbLmFv`d@CDW_Urad?p43 z72vArdn|NS^gK$T{Ly8BJFZi_M3}!Z=oKqQ@Nt6=9t2$jP>ykLK#|~Ae~zUNm;p$% zldS|sZ?bq+AuQA>+%!NBrqLMmum)h}nxPG78QBEf(Mb89s25_IH&7+fI+G11E7f zpx~P-?WQo3ONI{efI0&+qqrdkwuU-o5{KbVhZHWpGt-!ic-gzuNbI)mF4&AUH0VR&0kG*K_Z4$cJQIo4d1WmRdln%R5_pH|=CPxPR zYC_YP8`(RIkL10vbg5jyXciX^CKC|Er zj#8Dx&VF}BOR>Uo|H!1e^H_S1d1jjIYukcX;pyAmwiAtBx1nyc!tRWDqkuM3{eP#^s zcC4H%Xkp#$#;D;n0yLuAnt|+!YY#SxHw;J zLu8qbdWutF8IWK(1!6!z6UYsP6D}i6=dpyK2}wY$N-D0X+I>Jsu*z-#kt2)YvbU@Z z$!_}-5cc$J`X*%E1yQ6ZiYCsHW>d-}qTs#vb;Vl^Yc;@o3eBhsrK|GD+CP zp`}|QBw8+b8n|s0Er*_zqKx(6pfp6VgkoKaNWN=u!l(!NF;KQ`pKj2#ZL6O`p9s12 za1J3V;Rs34mw{4hQ4Cs-GL4UCB0@`@+cZFh)ewy>wXRyVYPp(M3*H%%Q@0~4hP`WB zQbH|f^3H?d04)W03edQ_w{ih;vs}<#H*=ZLUOIy+fj%aNSboFiiCFB_=EglutJUHl zfM25+xfhtc8ZF;`aFpO2!b}VwbhOOTsNLe#~Kt!InOl-{w7t*4V7vD5AW;tQfR;3<@siTCQ-XC_1J zj`C_NFr$cjmYlI150NdbxiqzwgZ&L&6d{a0((KNR>ZMF@KC^^U9m9R`0CdH&Ejn%6 zRcLEWgkH5}^EXy)P-xV`gzzmey{vD-VDk1w(HbrUdurhx3{_%HV5ki{X7t)>KB19P z>tLsy-wQ!a9*DxE@)j?b2+SOa?wGE3b7xbli}5Y}P@H_nm!s@H_!gyN*fTIf!r|0@ zs=8dJxPw_%J60gQq6IO9SQw*!RwpbmUn-#iq-rK+IaTimh@?6*XUN5 zU*!Wx>&veKY0wP$2}@4oh#(aH+mks?eMdR{<89F-o)L2bAvlLMA}z#L!O?OMLcg{U z%bTVPjoTLMSLWvxPaVBqOVvMX`#NvvZP7**TnFj}iH{&qr>YUEmdxHzcS%))>WLJj zcGbZEfPZL!v%PJ6`CPB3@|pgt3}`11VHp#f6$kOz37O!k*%zC6wg=I;KjDWH4EbcN zH%ODrF16w$SKb3_BXd9=#YKoNF%s~FZ`(4kW3wVNG|O@h8;ixUVlKnh9s*NXHE8Kz z!Tnq{19!-yup_yh3kM}>oq38|T)w@{To0ymy;pF(k1I}qVt;C{AP9@YiQR7E_5g36 z%@yBW?;OJf(;^)w(%t-W97zd>>h(dP6A@t<<)XL0Q~%4`1gCBQ3Hob`uSN1=ZYZ8H zj9AN6+YC2k@1LUZYbxyIyqfpd6hE_HS-i(72mBLU`1LKSSTEdYGov*c(c+Ey1{L1W zUuSF>{Nd?(0*{asS8e2l8&vS-e4Vm-+rbBP#hPY|AaUh11pA13>nZH5)e=!xtLzim zEqNE$5T#OQ37d=TWes5>`_C){P1v*bx~oxY7%d@A9ft0$%c0F$@Nei)K4!%wBq~3am ze!iCTnDqIxqqxyXSZ3E6DSfT}C%Vx1E}N7sov#P&d)D{$ zs7^v$0@v4S)sR3l2j#sPlSFzQ|Fg;AiAFbeGej1npd zqd+q-N>7`ZYLItLZLBt#>la`T__LnAidKJOtl0$5qd4I@_+NzOe#ZYx=YKKA@~(KS zQLOIvaR)xG)dW(dDrd)6az%m`+6;ykVYCaFz>f|2`ir8Q9GxW)OnDM|gYFUt zCAuR<5(~zXOw)>(Vd8`?+np6O`2orhS7=J;&|`%cueY#aKdQSa!Gl#QcY|68l@lYV zXLlrs33cf#h6TgK8F)NF;+k+QS}wmRd?tYyxSmLG{d0Xf>7AwPQ%Ub!U7t*PtY;AJ zwod#E9&~*{vuhaS}>3O8$WdD6*a;LgsTM}AYU+lN@O&TE%7I;LfI6+Z^ zBKNsi(MgJ8imIjIR=&yJCkUFl_N&WW@95!*A<&K6!wGSdK0coAjTs-IR&-81S-~8n?fsTh@rBrGfL=GZTEUl4v*s>b)t;oMr@`S#47ALT#vhThilr z!6Q7AaLTsfgC4*uq8!Z0xSFBLR1(_IKH;|aTKfmm-pV5B^g)*WR&XTkydy(hryy^ z4D6wfV@U_pNwDTp?I&GZuwwy!0l#J|kSU1V?VIdMp);T#5%9}N0An->8k;6T7^N8y zMgjg-zIA7Ml&fa9-vmv!$~6VM-}+!Ll@82w_t!u$F$cvY`(7PO5xyz!pkEfp{+>kE zNp8gzu$6zf2w6Li@Yi_a=MCEBUV?zb`# zj}Fyz>blp;L}NPH!OO5p_*SH-10k%;k+csPgJp_&mi-YW*@_#;#Nsaibkapg97rKqv<+$$E=d)`d9SImyyRz*ZbwN}1`(S$ zpbGh%@CU^k^RuvA6#Y)~PQ&5W( z8uKcx@mlB^U1$&2F!ZT)LFaMQxF|%l27=0kK&+Vi>m38a%0$JPJmc9jY1T zooP>G2V35f-cP6s+*{KNq_lvhC77U{S^B_(3bE9P_Q>h!xaC1e`=%GoP{^-j~8S!6zH# zfz(H7U8bhMX{Y7gZ>g55-MeeWK>X0pi#(BZAc(N7?u#3{iu=R(W^Ki&0q@UG%Q z`^kSPcfRq0{fs;C0^>@7dl)}3mQ)qM6Oe#F&H0P*g;oJGstVu@M!a62fW`p_K-`(u zf%YM-LmWU_M-bdnJc8gx_h80N(U9O4Ppf#5X%>_X8YMEwsAAAB>ah~IY3P{oSyeeG z(KJgPke>(cXe6{h6|aN=o&O+Yk02z91=vXt0$h)i(&pG!1LZr+kJ*F+KICqtP_Nbh z6g2Rde|&o{$8*S%Au|YB5X78tEgEG|TIwqT(bQLLXOpA7yUPy-e;Cr5|8niu9P}!N=`< z)ittsfU^Sk0sX40HVV3YQi3)J#pOb`2HN3V5R3SO9R^jmSIq;hO>7;=%YmzdqJrzn z0bE1x1k`2qP8;HCK+Og~T?C@G!9-YH#nJ@?SgC_Fha@_ITdauG5r9y65WooKZKgX@ z(XI0ktCev_HmfVPlOb=3m1)wDp2lU%2f}ulc_3 z-~QSiJ9quSMHgT4rXPIW>vtD>e(2J@mtB6vl|Ovd)o*y?HP`;gn@UDTt8Hd%0UNpQ zy5u_BqeGm<-pL@30<*r#46y`S)|T{EcWjmxU$-w#*wX0PUrK0=cjmrcIG$pI$4V6v~hHu0X@WLwXd zoa{w=4jkz;YIVV;k(sV{!YY2lvS#bYhsW~oeJpQaEQpBgkH))K`>^Enn7pbgy~;`( zeJ1pWl~xSd2S-qvv8B-V`r!uuH*1hBE?OP370K+ad5QTJcelORB~d4v>B`CLxqZrZ zR>d19Yu_^BuyRQ}f(0K_;gV2YtS`faH(P9_&!Gc9=G|u-8ynoNXJ-!5^@kl8dnd1S z^Z_VWo*7U=t)-y7{>*^#V|Ad^zI|~(S*$Oo0m{Ft1LemYC|3d$1Y-Y;kRw!7!r{lx z3=aRU4u{&eFAffi_hs`k5Oq{vx>q<%vM)_^FAujr*X~~C=o9dFa<9QH5scjzA%P5G8kS5~EC{V|F%M8mbJr3%Ew>$3 zfW`bHCz&YQ6>LJ%?&j69i0aRju_^;#LiB$rWGpO^Ud^jzXyCc}@FJ4xKR}5EprB`^dRk(n*eiYi$CjODcb&3!t-!#DVQsRT{D_pdY7PDp>lZh> zPS-Df-)`(gFZNlWGFr6FDGId{Ou#t2vZi4q8*Oe9ltle%hWQmH&SVS`3Wzc5o45pT zjd!QUy8zhuH|E(>)O+b*xVK!j5jJm@`A!?IwBVmnNIsb0>I>D{;ogh!4pExdSlPJ{ zznOYta*n*UyCVRyln>~L4ygcy`7N5mV+r!}DXUt%EVQWQL=!y9n>vy>Ub_gK9-oht z3~SE-P;&t4ha6C^oj06ih`a5JG&(}u6~k@r@iw^fnR$GOvmpE&G_2@D9 z94=4!_`$mJ@w$oz7E?YhSOfwil#h#s0dTPc-~#J%4Gr0nyeJwjZwQyvhwy`o3_-1w zSZqy>z~T{u_<`X;T;zk;8V14io$mlyV)}LsPu~yt^qoI)`bqR(hkNZD9{nyK{j2CUYnHI(E%OEdW!G5QVmL%jvXOFT1o&S&+<_h5 zfmw9`BK}sZ`%3FUX)jNnSN(8ac<2A^c3&~SmoI_v&=%a9}UDBBu^V^*Z5 z5wm)kq41hvD16@tD5#$$yR%M@V0WY7@akbWT7yBJGx!MLX3KsHft}av*lL@ z0tt-coKPWR5IYx6a<)}FUmIB-{~y_qR)tKBTZ{{xwFq{M;6kq&2Fm#kl(VeMHRRaj z$WiL3j`+(P0wF>JSKtK|GZ{IA`qWyJBc^u5Ahrw-;#EEfGOP+y%;V|vdU`#?YpJBo ztIBCLTN;W#y#r-SeVDaxWiq%{DwAPyqx!U@#V~6Fs=Bhpy3*ZP4yaUf*?$+TucdUX zkri5X%W;xvLv`iN_0HJ0^TuW=)s`IFD~HE6>toxn?9RNh-WmUTL}&IoU|w8rtiJgK zo1IpDCV|{Y!9PlUK5rOZU+L&d$f-&GPj5n@f4A?li5q%I529u6|=4cFE8x~2nQhj`Iy z)w<;3OFlePJ)bGUBZIN4N^mhR$sqGO-Fhw7sWWq2tx|K#bX=V?42s-AL3pOo+2Kj$ z-SateW`R5S^b&$Bdv(qDoRS8#fd#8S3or?ipOO{Uz zH+SdhhFC!)3#xlEHaUpc$O2rx&2FDH46L&QutaVE3$i2s&PXF}a*^(j@YQV?bYH$Y zHt%YkkC2EF-8YR19p2hLv6us_yGY{%7cU@N(h}Bzr`_5wsS~tSxu#TFaj9hag=Vz3~ z;W4|_;v9LSG(kl9s0vAUov>yLhb#$L+3RjrF)0(gn6P>S(6HWpdQBuBT@K2O1fIbIYjxwlkKgaUS2h#KNg$t5-k+433@-5>aV^;ijap*~cfj_!F;*8Cb zXj%ErwEu)n8(?t84zW4@KEP%G&ta2kryM2s4NCHC3!6{~VNR|if|-0I#E!Cwo}Dt8 z_O6F;;EZFNR1)?Tq}qXh+)BdU11ovlN{A(|zB*K&fHJO_{tn9IuKPm(EGu3nh>CItGwl2q(TNPc;#-vPJ zRJ4c66Q5;@?N@+)ZXfMdymp@V6n@|4!X}djziidX7M$3iNc)UkY((LcHk+vwPe^hu zpaoD(Y^l>~m%~h{medl#v$hau3EMnvV5*3ubR!YXO5C4 zBP*U`N4z6KPutovyZ{{Zb9sPJGBjlB@$f*!b~eSX^<;OFz!tmX&Lr+=&R zZ4P8!tAMNyrTI=aHuP${+|*I_bPJ`}oMb6Axn;hd)r>!KOp)*>x!uF=mFKup__WTM zKc$~Z?ob?J`+`TslPMwxXPB08OOZM*6bq_L`1+!Iw4${nbrq@%**q?~=@jc={9J%u-_mqPCAF`qo(Se=mAuoiEyztQ9 zsg!MRdX+T(wolPcfxU-evwLz}Y4f0#ab?tFTO1XBL=a&|oj!rs*cqYXM}frA-%?G* z5q2;B!UTctFbNy;6V&QE_{*r51oP;FcZ6(+yT(FVRf;3+oUIn9Pr$L(i^Cq@*+Q>-W z@%Ur=8yApxs+iSIa5dE^j(t>JGYT*~CZSI58Co%CFp{7e-(ISBw2#S-*>e&gU6%H^ zR7p}qGQ=6oj@ql!YtSVfH%4!mr0ioYjT3%O9AQJZ#9N9EBG4I-8oUao>+XEY4CaVXw#jLCz zayFh+4+xMI)x);IUfoS}z1pigmA^u1U#7Gn>vk?@YlA0=)7juz!q+7;Q{@v2)^5&U zq0B2eXNzp+a0_myOb|}7NB^a~=oPtdiTqF-EsCKBMgKSa41!7c& z32_eK|Vs{vmKGMJU2;3_uodS ze!ySl6*$v>C6L}uHQGVN(VJ82qc}+$&9PQ>z(X1Bk4JoU_IvFv-ebGsL!A=)mb{Mo zZN?$NJ*;pIGa^wXSZ;#}RQZZhhr_gSna{DhR25`CrUyqmNMH|6D^)Wnzj~<-w>C3? zG0Zd!_LCy8y*>SCkxQ=#Sv9Fc=ZtX4>+OMS8cca02`7yB`N_p4Ln?YRWgrDlGQNI3za0T%wJ1$7+H4B8Qk6I}gCTB?T{fnD@)D-v-bqg38OCN_ zUFZet@u@H@>}n1UXFU0<#h=NiDxF#M6VGq5MnAmdTNBE}d=~mQL_dSbzaDL=#XvuJ z&yD#|2grL`;N*N+0SASX@6^983-r#j^0reKg<5o}Dc=j(M$ZOb33DHKr;FQub@uFv zE-v@g**)vJc*=cr*;^B-E2AflGwk?vWbfc#ryW!@`ZM~kc|Pr@asAVB07<9AnzatX zS)Co5kdxf5c(+$)-juI#Ke{&RX1kkVOUkvm}j1 zKt`KVyokH1NHlCt8`7HG)=peq;+&-N+XJyP*MqU8Z!fv)kJ3$vy!q@EDv>XA2zA6k zM|sP<$%?<$8of6(df#xPi?H;27HM+?OJBUnN8Y?&H?YB-v>YTf5m%5d*M_mwL&Jv!-)tQvwgewO-@@Eq^ta35q4U}`l#oKoSldiI zm+p{~FiI)mCAj?FNgY~MlQ~23Z{YCp_<@R&2#5d;yXd|GmqZTgLV1hm_sUPpl+Ufh zZnL3v7YVK}vtJ`ekMZTx)-X!#KoZ&n`qr{D6MwFR`%cBvvw|VGnI4+}7_EQecvtiz_e#r(bcN+)HuxRyptH+XB4ry3BIsvS&&}HJ5_TaL# z?ZHbf`Cfc`Qc^U@XNs?~>zBq?Ux%;8m^;3rUl@}9rme%5w`ds#dpD@g3}!dMnfe9rdC^uw(z3I{X z%sOd!59Of-DY-UAFy7R#K|h*hcy8cgD9UsFX1>Drw9rE`UQjJZO4gmjN>IB{J&%X0 z?B%P3V20{vb)?LdkVl_e2B%QY*GlmIf9$<~lw4PJ=X-xtbys&)x3264I<$gsRRpv^ z4tj4qw#M+@==1_(kKo~C@ds}$)_Trc`GX~Su_EE;@tftb1U8NWCJ17J4I&7zk;7QT zfJw~6AxaR&Nz6omUNBfDCNUFD;(!TaVr&P$&v);0Z&kHg?w^K)U@dpux^?gQvClsH z_u0GeZ|6;L@Dw8Ck6k;=4Fy~* zYAA46))K!*OHg@Fn>Fok)~8c+c-A-TQWPDD=L3q)23K@!?WRp?t+vXtXYZgl>j-<^ zaDG4v?PK$Rie_lHR1=3os^0Q5k*v|iLMD~fnK<%cA^2x2A=qZIkcs0A)N&yc$HMcl z6?jft`hx8qR0ULql@QQTR(N0&3t*6i`J%JCfNN-yiC+vK?PQ|3wxfQ_A=PAJME5YO z3^q+aeQ~^$*~=a5H8%I76RJH0oE9U%48Pva)Zk)R%iB>^VzsCpVR10(l(ykWQVk5e zNHk~%OP~>|;8+hQrhY-6us1Q%n=po4@bqA*Oq+2?UO9~wS2N3IklMkEudm8%4(xMm z<62*g@+;|5g3aPxx*AlY)MVVC!21k#CGzCr9;|aRdZ8BmHjN)|c zi<(sB3K>vq4y3M29UN9`Fs@lmx%s*jE+=eN$?3|}0^WLes@J+ym2_v^Cm@S_j(5&UGV8uS(I%PNxcpU< z_-F7Y!L)GuysmU8<9of_ zue5#_pwy>S+?{BdZ^XHd!h^i-d8W_~cPG?Q zFqAjce)fU!*FC1p-GC;qzM)o$RK=7xJ_bwg?K@Ufb=Rly3cS2oaf z4nR_fy~3n6^Li7+AYU74kTZUU*D9-V(rxg+rEhI19zs9}SCc8Z`bEG11dk=!1LRaz zQPN|BUuOG1#3w-2ru?h4CE*QqRmH9mObjQ}Fnc+)7NoJzAD$h2ZB}n(f_PRz{0-d} z<6S3wURRBtpaLKL(8$+SBTs+aqvphSgCzgBjn^HXJDFV51Nc@Wr+l%M6H3ElDj2nW zcVkaTnnJ^?yM~o}({3-24XplX(_Ule1m7ybkE&88t_#5)|vMxo&$K&(H4mZ|2ID?^Nv^pphUFMiP|=&FK%{KFK8%PGV92*_}F_Y!O|nTRq|u1-D?g>>aa=HA^Hq~uS?LD zmh+_TD8q*yT~3AK!5=>=iz4A z#uXW^*UT+?s2v8O&=!5>>3wxfQd@R9?%)I$nTEuYliuz;=9Jv-K$hF`FV>GhmVI^N zJFJf4k+uwYJ~fh3vBNtj$CIj}K#D-a{f#0A6Dlsvmu&=E+8`OQO3A?C&#ni7~<1s2Za?! zC$YzeX5j*y!!fHM^3>D45v3=418ypT&=;i*tuH>N!kVD#{rWs3W@lt=59<~R!BB|> zMqh$KOb(dF>2QcCLUOR8ODF^-dAm}Jy^)J&?;i0QwGkS^-Z&hv7WueXs83D>LRvQR zBtaJ?Q@VeWzAG45^yyTPc4{!gkHh8G*92&q-1-*ak;zLUM+wMp>8;yUco0Oh9r6nk zs1YME8fDKwk*J0DX$7`G%TIjZ7rP#H$HR?UU zmZ5H|ZJ_!d8w;9Z+pM}L!nL26Ba+D~7(?r?pXmM^?HVG&7>KTj8M{nzCkfPWggk&J zWqz4-au42Y$~uz7CKcJ!CY(p|4zErsvZswS7U!fVwH2rNrHpYL^gSuGs}fgFf|GUP z>Pg91RpRPNrd=nlmU!+P^TOmZS`ZpRPhZQWhz4LcC|Zw@j*HP+5D1jQkdO6{cYrZl z#e$N(R{%HBubdGiHpKU5VpJBt&y<@GKU6$-#*639ls&sK!B3@KbqE~ckT}#9hWaCu z?>uI!mhZ-+d^Z!UXfA_QiC;bxKRM%@&g!7o6SCnFz|A&!(JgGWH+t)tATq zOSQXZD(uiALNGkGi)d^n%tB2+U4)o|;@kpQ4;T(PG;4$o8IUUKbB6qhQjz+zmKI%l@1@VL0gL@%ijlMjI|NRo%tU(n?mVWf* z2k-s6w|?)wZ|?aBtu&N$9!@a-eMB_{)YYw`JKLYi(#9T#8eyoJAz}j#$M~Q;V(?fTDJu19 zu3+#Ybx0zbkRn#~7@%gyF%{JeGkrjRG!a-@5>i!?04X#pX2dBa}sNsT-= zNtKrUhTnW3+3^xy;0CX9<9&W(_aBAU6}p?%cgfzqTX*vMMcu*MY6;yr0BD0m$IZzY zH!wVCg@b3I;UyyKHr|(}D!i)K!y`9R@cWY-J79_iw7XQKH;q*n6}>AkI4#sE1iq=> zX$GOdFeH>Ovq}cqz-{=jBsd70hwA41Zu}T6DH=3LcV}1fw{F-G9{bn>dS+HZ&T>jj z!^y1$Yg@6R8+w$+l?2P8uu2T6Y$7QDaN6mj`&R={I|?!he02rpDW zluRj815ug_%8RKB4(ialW>jh~36I|W09Uq)ZIDJD+XqxBwce6cm@SQ2aG~(!?26Fd zLHW)e>1l^j6avh$u_KHjXE72tc941%GM&<|Ffcli7`KsW8l1w`&j(D1CCQ@a>Yd{} z&sj`RS*D2GwlGf>JxR{eTLjibV-SQmg$b#p!$bmaqD*W#*Xl40FVrbaG&glf(St>a z{^Cyn9n}eC>uJTnQgl8Bhjz;!yWh(V!8H2fTSi4%s&Hk~0XW*8dXLPBRJfv+C>y%T z#Av4Y!}UbGY5Spy%Z}5yA{09nrN%Sr1emxPM?0VSaqDUN8tiE^9RWMF7JH(t*blZ2 z)q7!xniT{9zFN1O4a~x512?c?#5qtS@Nxr-q4S8H-g*~Jf~2q5Gz75jl@%0A(?dRxUKXo0`!Kq#kak%!5l!%= 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 z%0D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�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∓CgkWXH^qqb1a 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

&uHz|cI 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�Zb*iiu%fMfrozT; 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≪@LGhnN8n{nIELPGFfDg?;WVM$jd1OR8+FhuwO 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 z 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�iRG9pyTR( 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 (a) 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 [number, number]; +export const __wbindgen_export_0: WebAssembly.Table; +export const __wbindgen_malloc: (a: number, b: number) => number; +export const __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; +export const __wbindgen_free: (a: number, b: number, c: number) => void; +export const __wbindgen_start: () => void; diff --git a/cli/wasm/python/windmill_parser_wasm.d.ts b/cli/wasm/python/windmill_parser_wasm.d.ts new file mode 100644 index 0000000000..14851b02df --- /dev/null +++ b/cli/wasm/python/windmill_parser_wasm.d.ts @@ -0,0 +1,3 @@ +/* tslint:disable */ +/* eslint-disable */ +export function parse_python(code: string, main_override?: string | null): string; diff --git a/cli/wasm/python/windmill_parser_wasm.js b/cli/wasm/python/windmill_parser_wasm.js new file mode 100644 index 0000000000..d09b9eb221 --- /dev/null +++ b/cli/wasm/python/windmill_parser_wasm.js @@ -0,0 +1,128 @@ + + +let WASM_VECTOR_LEN = 0; + +let cachedUint8ArrayMemory0 = null; + +function getUint8ArrayMemory0() { + if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { + cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8ArrayMemory0; +} + +const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } ); + +const encodeString = function (arg, view) { + return cachedTextEncoder.encodeInto(arg, view); +}; + +function passStringToWasm0(arg, malloc, realloc) { + + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8ArrayMemory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7F) break; + mem[ptr + offset] = code; + } + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; + const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len); + const ret = encodeString(arg, view); + + offset += ret.written; + ptr = realloc(ptr, len, offset, 1) >>> 0; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} + +function isLikeNone(x) { + return x === undefined || x === null; +} + +const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } ); + +if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); +} +/** + * @param {string} code + * @param {string | null} [main_override] + * @returns {string} + */ +export function parse_python(code, main_override) { + let deferred3_0; + let deferred3_1; + try { + const ptr0 = passStringToWasm0(code, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + var ptr1 = isLikeNone(main_override) ? 0 : passStringToWasm0(main_override, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + var len1 = WASM_VECTOR_LEN; + const ret = wasm.parse_python(ptr0, len0, ptr1, len1); + deferred3_0 = ret[0]; + deferred3_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred3_0, deferred3_1, 1); + } +} + +const imports = { + __wbindgen_placeholder__: { + __wbindgen_init_externref_table: function() { + const table = wasm.__wbindgen_export_0; + const offset = table.grow(4); + table.set(0, undefined); + table.set(offset + 0, undefined); + table.set(offset + 1, null); + table.set(offset + 2, true); + table.set(offset + 3, false); + ; + }, + }, + +}; + +const wasm_url = new URL('windmill_parser_wasm_bg.wasm', import.meta.url); +let wasmCode = ''; +switch (wasm_url.protocol) { + case 'file:': + wasmCode = await Deno.readFile(wasm_url); + break + case 'https:': + case 'http:': + wasmCode = await (await fetch(wasm_url)).arrayBuffer(); + break + default: + throw new Error(`Unsupported protocol: ${wasm_url.protocol}`); +} + +const wasmInstance = (await WebAssembly.instantiate(wasmCode, imports)).instance; +const wasm = wasmInstance.exports; +export const __wasm = wasm; + +wasm.__wbindgen_start(); + diff --git a/cli/wasm/python/windmill_parser_wasm_bg.wasm b/cli/wasm/python/windmill_parser_wasm_bg.wasm new file mode 100644 index 0000000000000000000000000000000000000000..37a288920d175d90c5ba01e4fef7b9b1dcc53778 GIT binary patch literal 2088454 zcmeFa3%p!ao$p!uQTx=XQ*}6vkQoH2Gw zUpmm5#>`yqj3ePGFBKIfDkv&QRMe=bD5&8b5H%`lK-35*4?%*WprYLG@4p_ksyGKp z1iW`z^5N{g*WR_(+H3tEzyE*z*MHYu_Nsr)YPDK+Uj4c2ildJ{Iy-t@c64oBZfE?h zS!r!uoqM{f?8r&Oov5sIw=(^B#244rHNyjXWHesX){Vt;-EkH3ORI%rE4j^m-yk>i z1+6*@0}~}ca=M?b$(nN{Tlwp2RW~C zyFB{UR#(YgigciZHO6gSt+s9=eG|@W>)Hb)wRN3=YkQ>sc2qbsd|%hKb>oA@OxLS5 z_P(>6`N>hA?36dt17Xf6c7vgERj9G2kddq_2PmFIf( zFhFX#aOM7m)Kr)YeibK!V*U7N%|qy)N(zRSgHeUXQxlLKogbJjed$a8(?9;pD_;H| z4}HZ;HyrV@e>(KAS03^5LyvsvOaCaj@h`9VmyIty^r(%89{GwR5B=wtZhYB49&u>x zPl}uCyXy6)jE((iIkIdd%d*x;HBuC1*2uG}SUxhcBwPAtSvFQ=PaPR~61Sf;I$fV0 zdGbD0l}$H!a^I2tJJsk&(aia;c-qt3Bm0yM9{+>9$m?0B-Kl1ZJg4Hulk4MuUU9x+ z-^Me_vK-0l`Di^Wvuw01imVu|k5oKZG#WHtKJzb{Wj4AvpUkSN*{oFu@JOp(&#S7) z%Brf@r$)0{Ia;sR8jbqoUzSCEa+EeQ{Who0YP_h?sQxSeU~!Qz%~$G_|BEayc$B-v zXvterTBj&))BW0HK3b?6{l`h3O>u1G^l2t9>Z`JevDI1jhdjW~^Xyrp`hABQMvFED zIc54+j7}8KUaaQY*>nD=#%N^Oxc>0pfpt4+^S4$^<=GzfK;FXdRiA$uSHURm3eG5)o=Y827j z+q7w0ZEWP2Y^3_vL;v-aNB-x$*4ps0BVTpsOE>)IjfcJR6}9)(rxOM`^r#K5JaXep zS7g~_Qu?niJK~5}{!{Jv`czVQ{VVkgi%aUCDRffk;rhXZ%et;icQvXSDYmsPC+qH)`rQ_O_xa-B*A*AnKU@D+{j&P! z`MazB!}4wQo9d_3FXj4_`VY#B%TLv})jw8$Q(eRG&H5STTX=z!@}C#C<^OnG{loSi zJE-FQv~&aQ=`sEP%R+zOZRZ!&Tlrh}YkuHM&)rqO;!V@VqNA(VgBoem?@gAA#SG!0$)k_apH85qP3Upqup`dZ_rf@i&Z|3i7LA(v2kT3p^yGc^{ewUJqweh7AMf`kPx;ej z%m3`D`#nm|M7qN`~UfW`CniBzx~7i{*wRW|9t7Xm;K{Ez5LLB{*QKtJ z`Kpco*Z=*Wj{494&;R@C3+f*NnSP}H|GnnuP1)A^G1;-%aoO?N3E7F+YqOKGle3T3 zPsvWrPRm}Gy*_(Gc6#|NP8*}Jn#fW4msCvO8SUsk`o{+{f;*}2&j_46=n&d;`F@6SGveK5Nq z`%w1b>?7IM?4#MovX5sMW}nDDnSCm|DEoBwne5{1lI*kD=d#ad+pW4>#{FqU&_9meQ5N8(H+@Wvae=e%dQ`~`g)fB`$qQ7Y-e^uc4PLf z?56D7*>|$d7FuN~PqsU|H~Vq+lkC3i zr`gZ4`?CkKpJ%_wewjU({VMx)_E5GdKPEpmKQ2E$KOsLce{FtJesX?FerkSN{<{42 z`5W@n^Ec*i%HN!yk-sH>Ykp?FIe%OJ_WT|BS^3%dJM(wt=U@uFCx35#Zhl_=KK`Ab zZ^_@Ee<1&0enI}B{KNT2@~!zt^N-~p&o9hBk$*D(RDMzZ>HIVK#rY-qXYvZgepHUED8gZ#Gq_WX|g&ise@UHRSlkMeu+-TA%wkMk?* zSJi)#-y?A5srsB=T8O2+Qw-#p>oB8)P{=L0;M{!nhcJa>QUBx-Y zyNmY}?=8+P&MV$moL_9g0{lSn!Qz7AL&b-Sj}%*rj}{**K3-f{d;)XvQ^iHar;E=N z7Z;ZlpDjLzEx4_?w79Ieyttycvbd_ay4YS^Q(Rkop}4O2V)3Qo8Vu4e)UU(r{1P_h z4ouOn*1v{r`E?A$Z`OBWuHA^ucat|-ch$dFzqx)({nq;T>p!U9R=>S|NBz$F59@c; z@2>x-eouXO{oeYI>p!XASO01KXZ8E*57d8N|3&?m^#|*}s{gwFP<>N%Om%E^Ty=bP zLUm&G+Ulh0-)_y}3H0`f{db0$^|tEm)jO)Q zsXX%{s*9>mSD&dat}dxQTYawje6_8*w7RUiyt<;gvbw6ey4qe{Q(aqqp}Ma6V)do! z%hitRE7e!4uT|GqU$4GVeY4tG-B8_FeXF{u`cC!TYFG8W>MO-pi?0>e7dKb8RJT^& zuWqYuukNVstbSPCRoz|vsM=lKTm88DNp)ZK)9UNRH~9C>VrOwfabxkV;-=!;#doma zcNO0&ZZ2*qZY{oF{Ghn4xV^ZexU=|SvAejdxV!jKaSvzr7C$b2QruVkwD?(ZKaPN( z7r!WeSv*+$s`z#BP_d~zraZPht~|axp**pCZFy38a(PO5YI$1uy7CR>>E#kCq=RKVDu~exm$j`Kj`v^3(kL47UCyJ#qvw#m&+aHSIV!JUn{RKzg~W${ARhcyrI0Y{8o8W`R(#M<#)?n z<@d^)%UjA@%kP&zC~qroFYmx@@x$`2^6v6SQ* z_ zW*hm@-Mr-gdbjbsa!s!`+vwF=x!o|`$S{udmagxP@@IKoTUFG!?&!MHzh1VU0c-WISLk}Cf4%1LZYzC$ zdu=@h{R+FI%k##nqR}1cHkRk*s-nwT%gR>M+)f@J={45(w$~nP)@roNrEYZgb{+>S6t>-Vd*va#A&uYi^cXz5dU0A5mOnqO6TfG=~k{Z0!m$ zLce2b_6KRlMkx4b+OY-&Tc7xjso7hsWA{pS<-Jh~KD<}`*duwm7A8iVu6^dcyG=1d!fH*4wnS7ldtF`c8$?&LXQFMtcH%5V>>&#iY0&hdZ$-D+ee$Z}U{RQp!%|`z3996D!>l@wD4EN; zV~ARAihrBkF_V|;xVd6|=krB3;||X>m*wlE_?kVWP3HqBKT2NCI4?V5{oF{mxx8qs z((g^SW+=Nk2wS4Pv7SO?Q&H1>6C4_(c+Gfekm5Dtr9tx7P1U?^jyE}kZa!00jv=M# z(34eNrs}Psv2H{BG}avzKb75<SyOs#-yr3Q18zd zqTZi7>ech-r_?)6!Ta`-dM|kVsh1`mYwD%Sf49`D**=+V?o=qUX;xVX^~NIA987(G)5T zMH4M~z{T9yfSMeUK1@vk>B|)9dNW{!fbGisU=G-AFXDHm?s^yf>V)iRwc3+=D>_e~ zBlZKRj|v@;I-)D6JKlQ!TQCR#KR zagALwUK%t%@q@T#)o+7qpae5S-(l1sD}JJnVqw-{)@?e3*%lmJeNg+|-nb78Hm-7v zd&+raEjgtpAh!Rd8BTaDWQVND2;A!C6@V z@Z;Sv;oxx%v~X}!f@30eTr7oNFx*;if8rF=vj!E@laO6sOcc|d^D3ri9n`+F=<%!! zx7KE(?p=GNn4s==N->!tiZo`d+UQf5v1+4FUlQ+#wn$vk45_Fakw$6ssoPvkP6Lax z0v`oMMGqEGRM708rgC1aen-8kTH{oeTrsfCOL(C*hhv%bRn_VtRb^T;Q@7Pu5w58o zUQ6#1uaQs#s?1auY!;qp*alQtL)Y}q-G5}&_34MHu3e_Op6rS5Oq4BK=*&7w}`v*}gYLMAy~7*=JPxWs?ilsKBtD93!3 zQU2l~qZ~@7(x}W3O!FJ%8_*y&^@&lw!5QU3nlozBBjB>jVsU*tFI7GwfNx?Wo!|1O~xoucgtix7+mZ`S+jB{_tH?i;grhITi z^pMBF(<+*gr}eFd^nw2Scp`d>6#)JB^#x}<{vvGw=uZz?SDPDs&qUN;9n^l?kOB^Z zgK{r8G~Q5z+)RFa3<-)(%ej4>TgAx^V}iMTTv6Xij{gJ&i$Ds%wnjV#ZXD%qE;pZIGri|YSI8w4< zcBDHczy<~}>YW=G)lCT|m2&H?;WmTG@b?FNilG4oCIdc&aA8tdFJRokb2R0uaihMJ z3NsV;E4oiUzdMdhWI?NY_}rvkGhfpyX$2f9%sa=JZDjJYUir8C%;g_iyX-Y{PhQ(S z>HKz$-%|Sn4?XnI$P2le>{cud@)sZH%6wnW_45)SBG zoOdVjL-(?S++=gn0ywvwhq5j0UGij?DH-cdEz6$^NR<0D>rO2%mWn8*H1Ffldur}Y z!>HWLbkE?cT|h8XeG#0AngYR0slGKDT|vL+Xrw0Qb(&5%usG3$SRz=Qa#p5WXS~cW zuQIb?v0_f%_TE#T5B;<>!nx*L6Yr&D4wG>0unyCTPM6q$)A7s5aSwrIGCXqr_}^p_ z&bePbOs!f1HB9>OhfviC}R{2OiYE zq3H3f_4c(U(HPg3+t;9NZBb+=I9yhY<3_;H*Q5av9B)ltdh9`p$4Y zzuPdIcR64OM*-hkidb(vuZ?0BTbfXpN2ObO7}SuDCGezS_l>AITkjija@$-`_;uD^ z66AKvCW8osn%0>A#J}Z<_Lghb&yDw~XC9R|w03mbD58Y^B*;{DdkRd)>7Sfz3RFmJ z7ZdLcG&Qh#uhl10j;e3@IQK;_7ZSa2kUEJAPoh^&1c_ce83#zuo9G?) zQ->%P$PEiuCVI`Sk(fi~_HftZ_%w3-H-;<{DjyS(CVVg^l;;47AjVQRcKh-> zgFG!a_ij)LsIbtAF|8Ah^!`evM&P1z!zUijjj*a%bS0cdB%CDVtOi3TPSHHYkHYbf zZWLT-j`IdH3a5bLcoA57o(>Lqki!V^n|Vg4MMbF6ff0gd<{6<5Ljx9D=0<3L8(B9H ze?2e|JR{x8c);lz2=J~S2!+NB55%APfjDljK-oo6GwCMnWflgmY05a2PueVu3QWC121Zoflal3fOq)%hwlFskYF(lE zmDsX0zA`_M-(i{Ht2R0BaKNOwl3NrdwaKI1peXv3CS{l+ZKO0p8x~BFQ-oi{*X8}* zYiP(hb=rOLi8W#3b3=DhQbT5eJIePQ{L7O)3)C{1!E5y7dk#M9NjY^LzCi9y_O@`< z_gPb)X4v13-K4Nmb~C?D!fxPCV}TAj2zFbB zJ16hKQ$BLj>V@5`3y?ciMKX5ICM|t>x*jouUM6QOz}J*ECYYG;erSA!pt9rT;N_x0 z)54h!ZUNVpY5MFpBE~Yr9$NE$@pTSm9K``{ezoanr+{HjPWniFTW!cgZqarC_m%ky zEGNfp2hd~0hIz?6f;X$$UOyHX7C>sm0;HN8^6{Ga8}PcbKBGzXn!Y6%xRJp(cr?7= zdl}l!FZhC6MGfW#?XB>v@KYl#E%8--jM(Uv3(IR8W=QLoa;MO>1Rmi@nwPYA)MkWb zXh&M|%%rnfG4bhaSCO?YbYM8Dn26mvOA-W1JuQ26N z9zN$`p)nMSf>w=7G9BcKs%#A~374ykxDpEqoNj!w4#bXE?OdoAr)R4Q^vPK7GKXEALox>58P4^-eV*QwNnN-&J>TOhU5ylJ z*OBt~88SK}?>&P8L8YHq!9{uRnZDr1M*Krjn)5j?iFXuK2{``&_(*60dtNg}D5FLw z0r)n83BYH_y$RIR+%IMD!SMSA7pSMPK-pB^^mH2~rUhjtgl$VqiM+HWs6<}MpUfCV zyh6JkuNd|bBN^op^+0o;@E$pOQ-V-kgw~n^p_}uCJanaC76^Gj>N|^9Bg8|zWVnW~ zl2soc@(>A6s}^o(0-X)Saz0|r1LK{A7S)kGk26}4O- ziTgcC*g+&QCJ~pAgtwC8gaoUY!52w%Inb&75U28*08gcxP3l~ZaG-jVH>ww_8Ic0J zLL;`y9prr&~axv`V&K^Rk%K-hx-2G?lV9t0VZrWwY1+xkf9FFc3re&UeQ z6+=kr0Fcsq6Qs0lUZivdgR`yZ@vtE!_QBw$7f0Ld1>YTBoWJ$nI|L6`G2AT7-+jX@ zy%+NbiS0+_nm+`F=Fe)^{JHAo^7CE~De$5B>w}B!0vGrJ*%<^6`&nk;Op~^NyYGs= zp10+$u{2KkFa2!ZZKHEK9ZP8YQOLWWJXV9_mwZxrr_rH)4U5V2@VZe<*%)e?T`!~{ z$4rB0&q!RpGgiQRy4` zP@=WUy z%(L3F#_fAG3_p5&hk@$%WEig6`(b#NABNlZN-yu3EB7i?iv2g_D5Vdrw?|E4i!#p5 zHxD^_*BenM76E!!!v&xa5aocg!ZJ~r(J`jLO|BzKYRAYaTkGz!fP?dAzd>@ewWX^e zN2*u6ChoUnpgTVl8Oc|VSGCIBe-$nt*`Nq0@zlew{i_rj{I_Fzk3sd;~mbtYn z1&2CK(>9YYc-YzlQK4-EWx>PNmJW&@w)Q|&Xw|#g2&0V~uOReO_970wmxw8}Kt^-7 zVo*76StSQsJBbCYL9uBs)oOGVyD(6|N1W3i1=2>gY zoD6LEY)^mR-z)mtBPVn4plu(*h0lTfHv8t~LHoqKxNtk<@QI?w!-fmlUx@Tnm`b8i z=b_gj@p;Fv+}LY{nu<@fT8+6rs7>`|r%5P#8Z$di*fUiAtcBQuei=E9v!gChOM@S?nkT6G=^*~ zqoOglE{#f%`)O?Lc0`JINO>a+J|m#$Ku=jW+f41bO@8}hHdV+Utm71;YObjN2?IYO zUfTQr2m0A=LT#ZfmcPj?7g-4Yup>7$?3}_$&2o0_%wyKw=BdIC&MY7F)I8E+wZ}h@ z>Av19_hy~BK(AqvsNQ_c;=ZoT@|FuH+u;p!S>>(XH8ukB-1&0z)yidSksE$Rd%$A* zE6)wPo&Y)Pw?SV!BxnB`Is4{B&TgGo&R)wXY%O{`Y;yKHgVXfr?eANM*>`V&s`2fB z{jG^|)jRu}iIVA9t`E~8blNw*cMKTce#WA8XEQb&YjbU1raj#F{u@7)-?pLIbL0D# z$7*EeF}^i4)b9dElMxv-zBR|L7mvdD7Rk?VdA~2QymvUuyW5`wgGmco-q$+FyqA`@ zra(f3jnN2^t(Zy4;`Afz%C{9`VnJ?>f%`&p#Q2zBj@1Be@XSW`Frh59m)@476W{-& zbZ4?SFzMF<8mt#vpbtTIZZEy9M6+B*m6NvLsi~!2Tc^`n^c=CTeUvaMOglnJ#0ita z1uaSDajttwqHQR z08zhWr+|0nvr}X?Q$03IgLq~RrB-|tTh`P;;Z@ifw5r9D)tn=74g`9<>6&w=2qEq@ zc%Vs$U=&z_W=DYNa);=gDbwoNOxdrWOC=ahYd8=q-eXtd%KXJ#AgcaeWh?VT+~GwW zXzk_L1pIm(S7_&#aA>nYv@$=!&Q^1F7$t=2^Ox}Z&RGQ~P^j&j_03|ptdXGO||b##n$V3x-fX)k3Jz;y8}KWG{{j8L7XD=>5y}CJJ>X zmjD{3gNf#1Rb#F51rM9Fd8&ekwVDGc(Nem%>WC!t(%&QyJ7i2YM6ORmg@d$3OR<%J zH3Pz0J6JK8WpvQQvLQ|wAZ!Qc2{wo8d0^<;F9-Z0&4sC-6DeF9L*V+i`i8yLZ`>c_ zO(s*0yw**!nCOFIPlBx~^=CS5AUN0z;x8i@`H5fV;-K}_Xacc1;FrT)78o;eEl9Yl z{TaF2vqr$v`EJYFe#D|E8rKY58v=uHGcK~DL(fpm1Uw_QoKN3u*oLh{qPUt`SnSI0 zPfTX-%QoG6WWw}4mo|!$Twk|Q+y(l0;9wY-pK(x+)4j{`!+PIhqSUEn`A$f_ zJMpyI5v+HPcK(4M6I@|Y1vSNU;g`@b)>hdSX1>$!cBQ}#)BSd}i!0#*2Au2hZuab& zg5!4BxLbs{-LOs3RJYnTMc1COs-}3kNd@LTYyI+?H8kFPlCCesQx*zlRd7vGuv`US zNeZ5!f*bk;ZhdrI{2@P>L5zvsu0F)LGKemcb9hLZOzJ$2B|oWQiT_58G*gHoOed8o zWTC!~>TC)naJqqmYzm1^N+%WFOJq$tscx;G#ltYEz(uAgbwZ_cy4vPceR^8$K;Q^d zyG2u**__@6K_HvrM1FT*>b^NJtzYJwJ4+Uiv`iNaCM2}}QO7F%wbA*onk^9)tR0-I;WoP?j)JVRTtV1*>2CyRkOW`mUS zWQ+^(KzVDw5+q`re8ZQ$tHQj0&E|c_ped2}`b%^WkA{1Wm3)Pcgo(dFSe1zfCiW*@ zR)Ud20_WjfkwQ02yaG_+?_}c5ED$O5!8~s#zn`D@7EQ@FNTLNg6Mb5Nnb}KruuZ)B z^t9TG{Di|&iAC}in4S9;6+5c>GEGae@6N0R6U5tODco=E1n2Tu;?W^*q1CuVKP=N&rauk1)gHBhQA`1)H%0cQhmvey#h{qT{0a8~rMCDJ zu6YT)NqnA{u%#b&U+O@D?qD$g=-)X_I;MbD>n*EHp`&!bHt&+6s%MLOBfY;g`G^w= zwKt;0L=>R*T49kZ$jD^ZNU!$n8jJWU+}9N@?T3rGb(^nfwgqo53$tw{nr(K_f{nE3 zwnwvl^%FkZwD|kkh6;Z3Y=1S(_O>wFR-)PdypscMrpq>JLPPs4j{~Y!HdL+ z3Cdd}>nH*Di#%Fe(Oo28@WEZZR)4!vK#cZI1a@M|B~WjX0Exl=DB>2G>86Om2pSjp zO+{&|=3G`hb~GkKM-IX7I_>sSO#6Th8s}8|qBv}ron(0B(Vgy_D2ptHVLGjC+9WHH zc#FD|EA!1dB3#bmi2NN`Yq5-Ya*c3rd2xsvTV$N!M+Bx`#aSM9fpi>5T@Y5NT`ag4 zl2fD_Bk%e^*1Z|+sh;UhNyN>lDLevYcLp3QW5nD8Gm?R9!1Wgjrid2=QW#FvuN6c= z__H+mShv%i^kR3ByxCg&nC^BYL8tZV8#v6!C1ZshSJ>jfa4@iIuK|~AJ(fQ{!p21N zA{WaJ9!9Wgx6)^#7`46H`5MO%Y%Gopp$K#s#z))WhphGBhHbK;;f8^57;Q|0Zj#&> z+Ltyr5DuelX@k))+LbmK3}d^ru{9LsohVS-&4&k_w#}Q}bSdA6l@a|^bO`T&{m|o1f%lW<1@GXXlM37-(4hpg+rIn3qIY8``9!45Wm39z`R36Y%r;5V`GlH}H-Qt=WD$ zy;!_PxDDjQ;+^zj{(e)YvWIPBy+_>KV4yATmoXoPWef{pTQ*~&!V8TGF(JPd=Fql0 zKfYABfC;HCw0>aL$E`){Bi6GE%GQVNL4oK=R7hMuLVJ?O%$n2D^9s+cZT`O*VviX8D2zeEV~A@Z#n2^ z`{6Erm?+>;i$+XT^k~;<pAn^>64)mdx2+ z+bes@Yf}8%T)xkdFW^ir%SP`{*S~O|Bk9>>XLE*4M*p!5`D=M77{iNzOrrt_9#M?S znMDc9;ju)HwNZhqSb|fC5|-0r$xbUdCzeb*D~^;Z%ZsB{2q4pek$z< ztglR4-kg{wU6wksj2^Jyy@mri=DD2Akje|*AZy19+j(!l*-p2G!@W6+qXGZx*eqZ4 zw(lU+<~o+NiKYM&sD)W`KcZHq%~NW6!g;c%(G#^N$$)4+t+o`V1)k0@S{ypm$w9Bf z0T+`F3OHzq#G9VP$9s@Ci~S;T*5V=YaglgSBu*fK0FNheMUsldr;(-N(rL7njxews z1*A-q%rpiS#~b#YlJ`Iyk4r%u4?KqB9pz5BY++LxBrUXfX)wLKz^OaSQ@CDj0K@_{ zaW>;@1K@qJ(@8o%sR!)McNMMo*~x90Ke;P&8_7Dq&RXZ%tz+}nd+g*pS?e4-xjApW z+fMGzTJN-z<4b?*gtGN6D>r(-e4zm>~(fR$4<2qI>zcW??uN>wi7z$Zqcz*tb~raTXgIsE5V@t zPSEhK!Y^d4W9`KeZ-sLEdL4SC*}x*vVC8>&JF-b=kVt zPPUh=-6L`@bx~P;@VVgXy-R?m7x&irK;ARhY9KF~uDx|GdGCl_9|&O^Sk@bRcCF;_ zb@S%tXg*-pJ$v36Ii7#}&aiIwu+IEw&pRV8^l#sp<~*Ib+ve+Iw^z#v&YFwo;OeqfcoHmf597<3VhYfBgIP2#g z7*W=mE1jrEiQyvq0GGYR5spYGK9 z7jQ1BoQh~;RHC@2rH!LzrvMzmbqli6W<{toaotk5lt+~Cj02)rSv&BD$oYGss*qG3 zaXV04`m9@mB!Cy0uH7imWQn`c8;Mq4UwwOboCUU!BH|YcQ3Q1-DI!=L^ARANp;PCO z{2eWs8Oqi&_HN+4sc5_iRsmL0g0i&$&UM59!~vSBU8;ych2s<}OsmgTbVl3UEr`?A zl^J$M1-ehlQ9C&b$iWbt7FMvMZXmeU`w8Ha6209>v|-JngbcW0k)H(oIc!3%#0CMN z2A>sSiJK$I-#}VSdu?T}!5I&je=corqh52?gjWS@QygIgAqQ5FysX=SbO_bRy`rEz zJ2NDIm?~eHUr%Np&Hi;9*NQxpFo7jgySYO*x8{o7OPaaJ3i{3Two}mbh#Fx?Hhe3H zK2>@~L6YQ%xDhMp*Wn#GTZj+=peX8Rn@(Nc{+&7nES$r!2du@nG|}5aD6HS?JRxE} zSA}d_X91h^K44$PzzPjb2!4%r8EsC1gcF^+l}y*g*(;h50`Y;{mU2S@haR7rZA{+& zTtYh=tBuJ5_2iwTLTvP^g~=Q4wv1JX0{Pcqn`pF+%ZRi9C(cCPwAaCP#W_agFnL=A zgXC>F0~7Mb>*dK?X9;=dp1cG7P?sZbqfmV@krJ0;#0VY|qd>%59UeBf*o!!sCTbE8 zb;N95x_Mqpfj2nKjC}Lnc4`W&W3M9eP3UUe$TxNNd73zcYWSg%ubpj>7&uIo8~KiV z@*Pjf*KR_-<3_&CKKYLKM84)&ar^YfjeNy@9**OTO z1;InUeE%SjZ*Y1-zUGdEe8)Zcj;G{{t!(5w?#XxD$XDbd@|Dli$?dh0=$1iqTqNA~ zB-|b#VGF~RFVcf#I70}%Pr_^q1b$&Z2qbx0P6FHs1YDSwgQ$LB1dDf2R8K}x&6#K! z7Q*4ZfT*?#25H%HrX{o-^0SfTc#xKxXgi5&i-CtwsVg^8ZPX=Nri5f7i0UBC?GcG; zQxy``Rw9x#j)1Bupu&xqYy3!CKg3ChXm8OeRD>CitVFa%9R^->!x16T+%}!M zJa}*fP9qcOjExC&wh8nF`lP5Afo_2`2y~0*K^$3d4u28oEfeUrV`B1=1Uh6WfzB|* z-Q(061-j#gQMdt1VK0Hp{l6`6u?hyc;ZXyZG2?|GSgC1j5Vlx}c)^GVcCmuU3s61< z60e|ABPwZ0Xg%>Q8fZdI367Xn0giZ_lkR(Tb=&86Qd)PgBw=i;4q+)+5@_AdJgt*j z2Bc%G3$4>TW61a!AR7=rT_SV^f$GqukUyO zW72;Bz}#YFz7_eItioVRM4_*!-~q3=#nph%ek4GOxgzKgf{S?*-&<=#L))3S#-8R*l0ESZ;aJPBY6rP>ZV%t84|aS zyHw9T2%8(J5J#ko%(eQNEa%9F>=ttrnWHla^B3`!G2a@5ZCw| zk%dipTrmV)x~!&nHAfaUp+sCDe4qZGyx{i zN43uC(b|(F1O*E01LpCJ9QW$lELOTn2z|qV2SqAubu&Sybt+;9OhV}Ofs|h8Sd~Z$ z>$>PgE<%r=T*eRi5JQ2gGf6>po?h&1gEpARYbXV68XFZzm8O{^+-oZYIE8x_T>uGL zAOe!ba*r_D+jR=NBTw3asu**VCzfgidBVF=nI3Qk8S+Hfs%;ddjP;y4idx8K9)wu% zw+3*SqADl~=N=I25p<7sn+)h4V_$U7PrU9)1WVH!&(b|Swo#lW-NX4jg2gHrq^Ld6 zJq)2Jsud_I(2vzBsgjUNGm?tV9I5EN`uZu5iv4*;hfU#A-$rZ#-4W_XcxhZ?hfHVux z&g~e*hnaWqW7lvql;A%OWi_}idw;drHi-k%?9N2&Sxu0`3OZ?FfX-=SwlKjm^v&%D z*BW$`Ka+B;%xM!*lt8v;fw9w`p=jj^fC~P{Ai zSwX-8LCX##`TgEWU*swwzWH>1A(VPSe{ZryYmI5GkrDI(eq%P0TF}E0WBM(GZdnX> z2;DN&5u*L10a3{AHw2N{x0JN-NL;|_nZg8cpIc^g3N=|Sipvs^bG0l8{Ry9934=l; zYg@@T$h=rd8eF?t!GU+!AJ-`#!Qq3VYY8FP*E>?TaXtfu!$WMD(HnJFDU+ZjLYJ2{ zWx?i8o03-S!mQ*i8>)EPo2sDrk6A7tfVUgbz08qK%Fu`V=SsmgYAEV^z|X3<08-y zP&lqMTQ<-Ee|S=ik%my+2B+>1;K0=iDSeS*+mT}1kz(7B<^U<$mt!0$5_GdXccdtH z4=wgdaolI}+G$j{2^`fKjL4W@94l5>%V06<#cuq_62}(sEK2M^gy_Rai5-njvRk#| zqw^XB%p#7v99Vkl=Sl@}i6j-|BXO_#`{H;vG)jrmwjyTzK1u_C?oobaLQ6eD6)M`n z?7{|-5L}h?4>6+T93279WDiM4UZ-Ra345lEVV2Q9h*b-6(!>^P1*Ou7jx2a~;U&>l z9Ty=*QS$l{&cyllC2_~cW-DOA%h8SzFL7A(DirxZEkeQdQseXk0@$hnJ_qWNmLotT zO5%=vpds;v@VM2qnO}(4FVv9%e?Uh6KTfO!w~UmvuYK*#x|*xJXrTek0W7cq~lC!bm*8kc3Ku4vD(p~BU0P*Dq-BqsZ&Z|TIu$z557&iM-Uc4M|wl+P`m}T zD@F=6qmXc}4scg1I51E9qf=~;F~8~??T$?q?Kps%9+k4V$14kTfGA1292QNKg(0XU z8WR7k(Z2MWv8W*??V^v$LX1egUM2VtMooZtmK(-;X16zH&2B4ky$dhHdeX?$6?Kz= zq7=Y+z_yI$jrF3Q2snra%vTIw4d5WDjv*W*?i<2EQXNA$NUB5r#K?WYm3?p@2chTz z*0{U9>m9l5cn8bhN`c!r+l@D25AlwJN9Nx4({BiXa-2M&M4^kKPZ(7&g4J18nuhph zM0~?bd%m&!d_gf;e!ifXEUq|klm#6Jj9GGz-K09216xbR1o+ea!xPMrX!lHfvvQ;Ca+z2Wo1Df!J&r9%*j>LWxF zqUe*p5CPXwTLg&Ibr4BbDG*6sjsTIUizQ9SbqFF!7Y#uqal;Tq5;w>f5EYLDQu9J2 zoFN*F1tHQJN$|%WBDwDrJsKn=Qd@EwZolAAn+7%DCkD1kyE9T#bC-Y(M#8jfz8> z7+rPodX4nR7^^X();Kcy+&dt7sJKwf5b2x<0%+I{Drt_RkO)#B%C0gZykhCoDcJ}G zD||BeSx3czi;ILa7t4QGUFf{i8W z;`M>LhLFR3ee+453XkLB_QUf19(8t>ugSSDRI4jIM2;q^->kxkI4I zQqOPLaO26;J{Xc#n*mRiO#v|NevH?K@!j{gnQnt_1dm55b-*s6(xylK z`qT^~4wWj(QVy7Ov$Zn&!$p334u`H{mTjd>u0dPh*Mu~^bMRn?Xb4pi5l6@uZnGvM zQHeZfw}89?O-IEXlJDB=dejXB*#n1xJTDZ$+$z;AkTml zMXgGT`e8FkXuESCCJ7rR2^r=gk;gKViHD(L#DcyvZ-Ve76wOfeLF$y`U;(3WJb6M<&}G17(?h>ZnZ1y&h1vx4FI}uqHT&MKRP%yGe$r!!lGI=Vmd?K+z%%?f)T&3|c4gRN1zD3%>)(1z zTCc11ZF}B2%P^0@yEoMO=dE>8V`4D|>@*J`_aOzrZGEE_922!-_9R|3$}L{OQt8Sm z;Zad!NspS4@wq9`Uz)aUP_$ZE-pe}MHb+Y-$pxB`*sdi4;evwww^zi_|JrND z9ah5TIV+LU0)4w@?hem6;QkuSFgH94=U|Oz`i_Tc6NR{U)fh z7kKdb?F&a*XS1IvJb2cE4}N^4byo7=I~IKKV<^0)nAySIOM$I|O!1;oo2N zr{Rowdrk-mpPJLd26507ya7o(?hPeQdJlaXXC4tYl*Hp|#qXHQAPOUo!K1M97#wrP z2`i7mqa)H|@D=gCcNh%02@G@d8no!KcErd4d!Q*t!ef)f!)8oLJoZTA zEjM!=XokkYqZ1s_NcRD_$90DLPg37)lvstA04IuK{sDUyOE&k`yIo^j zmgwsTJR(V#p#-EzK~?1dZM@>$vzUe`?X0?P@9MD3+3J zJMKTwHyn7x)pfhiB1bbOiQF3T6?)FS@xI@p{Xez#!F8_vSsj)>VmHVU(w%j^u^6b~ z-kfK=cWc4ULeGttSP9bnzEFb1C!kK;IIy5WdZ!p6qJUvWbST-=rCKET9VL6BZNeF~ zmcsIZV$^IE;lJ5rPe5t~va-;moKLL4v#ubou$Es~!qv)xWl!`UNDHZ+Y!1brpRrlJ zE$jVMvszH{X_d%butzyQ_tbAZpO*L;U1;5vXo-^-(h?`qn$tNRS zK6=*-F%y?O;aY+g|6OYdn=w%#P|iz|WG~=6dfjjM!H-$%DHqYjLulDnA+b#;=NV-y z;m{x+l>VGw#6=7<9C(74K*l&3_zjyLB$mG^3JPJRe%8tzH~p5 zR^;0GcWK2mu!V4j`)Fv3ZV1w)%G_0oJIAj{SOFjR5#r$eLQFth{)HZVAe^Ky zR|>f_^=<(mEa5&NsbuNQjK4CD=GijwJ)iMdYNh&p|z?CpbrMzgCi8$P6Qq3?A*ED8^xw{ts zslcr$F)9s#7ykN%QY#^dj}mEdfNgoAk$ghb)+ZXtCq!+23?CW!dC)K)x49Ho5A0FO;^q`B=`qvZm0~UvG|Z=m#1-Pm0+J}_ z5q(a{1e9CHW+BLejBU-u86~!!XKOP4ItD`7E}kxIV3Nu5Du-o$UUZBJgLj;WFctwto#N^I|!sF6Tz%9DWu1I1qmCPuOJ!Lrm>|Adm>u}2=*uEx{u*( zGQ)5WN!Q7)FX8%*(qjogkJ5T1JZ zZ0#;7WBoU@exy#cz9&PWb5_0gtI(wjj6&9|pIiKh{_XUeMb9~?{jrhmVtE_10Pcr) zv79^XDQI*#gF2L6bE!MG&0Pcj@I?~hf9C5!-7cb@xn`_sk=4}Y*F4D9%oXm;lHlx5 z%OJ!F4vqD*4G)2r`at)^@TKC|mA0~WFaehEnHF(5033BFXP2mdo6bLv?t7B7#Sn^EsaNEg^y4GGm?rDkvhGq+2*N=eT54b^^>nU-vM9jWvcC6p zeQZTJQSqB$67#nB)<_%5;b8weK&Moz-;GC$PPng`v}J z8n7yPD=9^a*36Cbcu2`PPkyZNm>+B0=f@(MprtC**vu{IPLW6yh)h;O2Am@Us@U?41}C(Yyqf-l6B$!^(fMSo9fDVneWy9ZlCdbEi22MQK4fRzq!%pk?&O4 zR~KyKKio~y!?Jmeu75$h>SoVVs3+b1TXKiC;Jo~KZQ*HGm%o^&E`6M<*f^LVj0)>i z2vF5s@{zXdB8N~J9aCuUJe3Wm8B@n_$tm*Kb?t?1UT@q6QYM|=r(rW;o<6krg74Uf zGt%%gQt*v1C683xFr<>$9n3&uPSnqdGRP*C>UEZp&^OJ7=42DO69bQVY|xKuYz6W@S3|c-r@v-2>L+rGj!^KOl?#N|h~=WwMcj?c4G3 z`-{4Zm*)q_VcJCgM8jw?STU#xK42wxm##z#<^5K2cD?sd zkjGn|02OhwQxFeR5$Z(iTa}FOZ9u=o5!C4QQwd;Cfcb`VFtg+LL-GZo6dq~EFOqZN z9lurq+93F_!BUU7;};~U6esEsd)QJx2k?-}AaURnw+z65LMej+^^s!^G95x*iHIOw zVB$O(A_&s)86sZd&MbEUc_R$C4FDV2X(_U?y*&wFY}&S-1TeCfb`UTUoV1et12lwE zzeGp3dE+FxhHnLJS};;mTfaE%>JRqCMFjxq76*{DW%K2tQ$aIs^L^cDrQq3bCPv_x z3mYO;MSQ{{9*>U}UBp)&a2md9Y7bE$`b`-mt_%duAusAl42MVf0<-jT58AoFr=dtP zm0+HEK*5;+h0%_kJ3xVK#nAB6E?usDDpnCRltjXsm5@Zj;{LGc>Mn?ppZRnYoLM%T z)u;#m$!1BbSf?z9WSX7zmrQej_G_qB)TQO7m$-9JD&}@!HphBTS(!7HhF6*8F`H7e zRmN;e`$-{~(h)zUW)|9%S{&F|GNl#>HkM4OHx&C*>Mh0olwv$P%QKx)()bKbsiYRG z8VCg0g0`E``Cl5neo~2t2?R6UnbZ$zLmenQNe>B#vPorsmznP_=a`){sl)m6tOCe8 z5eVAF#dTbR1g+R)E~P?+yTtU6E|G+7Um|UU)r3Kx?E3Gx#V-Vi&a~_Qxl}B1VLyVF z>_@WclZ{PmnX`hV18yt&A)%V$Fq24RgYa8MtU4r;RVQ03l>lk|Mz>{FN4t2 zsgDjwB6gXGfrwob)6p_P>3MlSU@DsKzST7$X)PC@)8RpRKbr7>_W*O7E<9kr5FS8m ztpEmo{)dGJfCro(RuZ3Q;P!BB;Q@}C__;-4HDOLa#m#|mfLon12Ju78Lt*@Bya=HmIHOpC^<-AY_tA`P(+|rU=lY% zB->>@j|A>gp_9OFi>fPbgU8lTnrU#9m`Zx5VcqsrV$naFmuNKG9^c zfZ&!v0c+y3{}l||C?CM?u@aVb`10Mxm!|_lXZp^wN6ai7kkR?_{GewNzMP53h%?WZ z9sE6<&x4Gtg6;q^ni)byu(C%+I!lmI-jf^MHv52#tR|3Al0DLXi7Rh4&D$?QM!6v) z`w=W)KN71Z$ZW=tQ6d;Z2M!6B9f3Kd#o1<18*W^G|&YhqqGZtC_zSkL<+!AZV8fwYGfqXyX@e1 z61cIaJFOtfw;7Qo(q+3U;+NPSxB63)3cI*a{)Jh-E2ku1h=Cbdi{>KSjdYmg8mKkS z!FvpmpaE*lLuVDeuY#_h3?hz?kVBp9cxj(N>$8 z-f4Mg9~zB`9(pD)l)m|#fVYkdcB>R-4yQP&qO5_>S`YjQh zeJhg`K2{KsnEMP_*_X?srT`Qk;l-bQT#P!RJjA2BQu(wjKw*=PrHR8sIOEP)lxTtc z432BfM+rZkrpLGmkm5U7fE*bStcG@up|3t&Y6-%&d$vAmDKa;L1kATFD)$>PC8vb3 zahnh|Hi?6Cp13K$f^AM9qLbe~-=ZiwjB*}Pu!+1r2x_xV%t&$B{4|bZ{c*HSzZArA zbh`%S^YO#hv~f&*kcNu2VjiB*t1*sE*$|AQExMvs4#8A89gQ>Kfo1F%P+L=F49%5@ zZpZ(GtzyGzenbuDK=xVPv*C>1KiY~x3QaevX2`ms6*0d#8Y%-BZL(hfQ(y#In)kTr z0tbS10R2fZ%;6L3zot|Nk=zM7mvWg?y4W~aQa^KwIf&zFaZ6e|SP_ORWDDdmP0=__ zt=89o)fbSEnVag4y)NrOtNHZLL2Y&EX|)4kiK_Dt3|8BPAB220+_rRjO=^>tPZP~3 zl@bL>m(bGld(fKC6B6>$R7{EDkt}G! zQmMtfG)yS|>u`tqL#C%@%vci>!vN)#ua6CX`reDJJd&VW>#UZ&kK8~G2Ta&kS$8Mv z+>m)cZOqSY5#t;tH{tQoWD!HbPy>q?=4ODMH){{JoSnw^uE01N_7L%CYrWp5Po+Mx zAxgcbMq+7Dql=L1ZU{oE0R^A`jUCWb%;RN z$m>goFfv|;3@2SS?~G*$Nrhe?)R{iflE)jJu7%b{`c~j0EP0p>$Q+!B;t(k%Q=n<& zIu3<-my!t(6{X`ZD&jhhL)a~-kWjNBc?ohLcpK8(G7@;6tgIuDm32g(nSq{&tkSOd zcr4a%ITMw>xEmKr23|@2nSq*i57jhGR+fB)pTzkcF^g}W_gd%Q%gD;TmM1IX&cF}o zV6Ck%?RE`CjQHsvF`a6ud~A#5$X-nUNbj6D{cdAc=i_jM*KbGzx^-Ec4C)@Pfhz zaF@ebiUomFl*9*a+*cF$LWLB_u`-C7?26<#dYr7iCT-6-E<_dS!_9a@^06BKTKAf; z{cqwGwl44ryX_U^_O?%;g-Q6$yK+u<9})qjR6hC!u_!eTN~wGZj+OXNu*duqT9F`f zt|BLc2X(>=wjdHyp4e9^EaizraZIaY-`Ri)Xq#O*`i7}(&S5)_6cl-5MHFp%fmbK_ zMvQ$_EBS~F>eaxvBHGD+M^-#d_KSLolWJOSok8ty(I?!J;Z0sWDReAx+c;+0UBxn# zP4C+UMzSFSyTCv;tY8;}sS5c~)fn)m?GvgBLYa?GCci$3LAN$2wn+Nlz7pSZg?t{# zeU&}Y|K|3yIDf$Y>jJ}_{9h@1$;|0Eo*Uw_t?``(x$H+qq9K&?HwX#{!pu6YZ{Rv^ zKxdsmXTmQ=c~Q*>!OWFBlc-#%Q;Ty^CTop@MU1MiY#=+MAAq0;&TkQG4H6Bxp#e@V zQWHM-4Y{F9j}k37I3P=f$VOy|(3ixj-14=3{B47~A~&iWIJy!s2bCqCk!$uwUr5jqVz|U~F)rEp=1El4BPTZ09{jkIv84?P@1uit&KCu!$hZt5nXvF8{w1k9- zS!Fq$6Qhc(>o$?gTzzX`<6U7DoK<`(a-TIz*3RuGSdj|FXyfQayGIqB4kWG4$b}T1*_i)mROyGIOYZIc; z#@O<5y00?^Pqe)xj#hq`RD{(vP?2Q>BO^Fm<30yn#H(5N&vw-D1nF)W-s+xuU6vQ_?(I4m4?m-sy#3#&q^4 zgJuQ&cU8a;)oxNo>m8u$WG@$Az_Wt>wDopbK@=D6>v{tzD0kZv$vA+|9?)0yaNItq zqx;m-cI|O;dn2@6%SnIa{aN%we7srx!9YOt5U1GNM6d0GeEh|&qZ0e8FG7tQ#Ir=2 zz`uPuKad)8pN!-~*cwFd&}cg0fsx=G8fH0CUm;ABfoOWKm-=YJ^d}h8?*cPdeQZyP z*vRw>TN!Uf%HLELFN1XEbx<_zL>0Zn#p0ZoG|uT}wYKOsm7-;@?u`?E>w zQgwgjb%ep{X@$qg0Un~Jgrgxe3XDFmWgQQ}Vqo-yQx%mluq;}68L@_@jNt|U`wZ_| zsVx81KsCbt3By;0{qw$}scZrh?@eXwoH%bn%j;sxSdkib)^eQZ#+mBwy(%M%#6GTk zuw5ixw1f>BzA&B2lG&Q^F8Z>dIRRWnX7kgGgH((M6qdN;7%?k|420IPYPU&i$~={t z^~kR3ZMK4bA7n}JL}Va(X$4V`z|d9@8K{zha}kw`fiBU}G3-e?g<)>e5&gH5qr?;p zBMRI`Ei@04RK^~aKp|sn#a)%Mt44_9sI@h5%zz6pa!hmq`V|x77%GhBkmDFFaU37j zWIN@U{ue422)g%R}n#3of$za=yQKj&*RHOwq{Uma{{lwIy&LFk?@0s;fP1>(yF%L96 z#5JMib+qi5FR00Y^QZ>TkT}At016D1VPQB5ZhO9pMAM5x=c8Y4+vR7r1G|@%fu7bHg%b}!rX_95?>gfKC(GOUFuZKiMn*3(hSULZA(oi zP9#3pWCi`UJv*W%$?44ytjzE8r?$|F&SbWX3z89$o=d(o*fu?vz+#%QCnB4+^<7GS z64|sZ_C(J?e5U8@vrZ5Vdd|MdgrO}pDLrSOc|y;*&pe@ctpJ6`UK`K9ZBuxB=82bU zn`EQJ&Lw^59)#mQeARLaZz1+Yc4&W8%D&V$r111f&Ew`*c>Q3{1=;uH-&WyS1$(LR z@RtmzJn9-$c@&t+vo9daNZvb@r?)4pa)=wO=VIc78!B5aOZ>7<^(EZkRA0gkPW2_+ z5LA^^pJN78AG?GVTI%`SnidioXxedRWQI_WQ+dV=#3E4&NYppD(0`AU&Vm_CXTc1^ zI*WFtvusUXN>lnRQC>1x_f&a}c(|uLxy-+Zdzg%(e)9;*mAioQQat3bj`}fvl7OD6 zt>Z6buX(v{_l1TU&EiBG8DT+wMqIj@nNBc(2jD6b#W!x8Y_HKx^ z0VRkwrDapn_|2W#;jqDiSR}R*Wi#V}U=+SHXf_!j3fbXHCMQ{>%}TBQ^6e7rN;A~H zicM}WCqN_5lLuHcCL85_iUnc;!iW0>&X$Y*w;6BC?Z4ima~oZBH7w?1e6;g|Q05Ru zt$eYF~lTYEQYvIN%5*n&xd zYXTYUiWL?QsH6Ja^pqD1RK%&|9ES}SHM9fMX{v8}6JBHm$plO}09)`5QiKXSj_=^O zm1$p@@5&jVX$#fep;LB2-p5fMt-CnJh5K9m&E2{QqLI#0MO`Ls!jx*%oT2-KT864z_is;r(f4syW*-c^P7jo=v z%7u|>Q6=1QRm@}Ntyqp@4H&gE0V-_$T z(NKFb&7i(&X0JazwIPPOg0|Li=Old&i*oKNhf#W`=G$3&7 zEluD|!5oYY?nzJUbYxzc<31Ub$ehlw%t<#+IGIBPv&kG5%~P3Uqc$XS+$Wn7nd83J zl*pWp0pg6%FfWzhQRD3>b8Pd9lR2Eiuq*Rzu(D1~F(ZIjtw#WvfI!?>M}`DUs00Dy zD$)0P!M&~;`)sl3i4Syp*b=0TRW>AT>=RLpaKsK)I|Glj(WwwQ(uVj2>I>3_iUy?( zGY=;v(gy0Vf+%hHKv&j!11@y6D4KUb-*>CS9y$q>CMq zE_Ot^*b(VspLs&MbWFN*OuF#REgG>vV*YN25EvySire1vzpFoqN?z=vlC`VfR+JH|+SSkbJkrG~7?duHhd|6?Z#mVAfabmCJ#EBnVL6|9%AeM1K5QfI51|SRt+|&Y&k}VLx#weSZit0bq zi-ZaF0%4|11_WVZ?=&P#77s%gtH=oxUy+1~=n?OA$YbmuilwRn3OJo2_K77F z;3;a86tdjlN}bRnVvic=-G*5(fx|-F*g#}82YuUcvB?KzP~dqjYA)_BF-?joPS0US zWu=Js$SZITTsJh$?21 zt01Zto1_S$%4li3TEty_osNr59BtO=jEN&VB90a-`N8$R`~i-=+o?9JqtP#}@E;l4 zV*GJX=vk`Ulq2Bv{AL41kUCE;?p<$x5iOhx6fHKfMXij@Vsjty3%iThQaTQSq9q;_ zDNhB{7eBS~4WRmPGlbGpR$r+iA)hVIdaA>T(h+iH2F?C0G(! zv&2iVB+h4vmtaXu%n~oblBgJaH^W4Oz7AT}t3FJEEg6Ij$KxC)pwu|D-#14SSIx-}#LM4bRSBVx{ z07R}D2Z;I-5UbTH8IoN~hGm!4>SUKrJrEKtVs{P6F01fivTKRf1qNkTsMKVa3^)_h z$S!IalwBsGr=5tNg3N_&68W^m%O7MHxll}08LuI#mPk}RD8}^o3M&oLF|oy4I>U^~ zqrxDom^rS3tYX@@3bKkh<0{CiB?Gd`s0LZJ#LKEBNK`>5WYrQctL%uZvR)#q>>61G zeN%0aRrHIiAgdT9lT}uomsLx8XPKY$tu{!&Lyjsn5+5 zf1IpZO0a>-k$*M&IvWj-1tZLn2BI0st|!p#>HJl^cW8v=+2CVB(9pchWcKO3G+ZF7S4pN0A>U=dA(_UfuYyGxXMT=+>IH4PO zyMyTke^X%LOvE}!r0J`lf?>&Kwa~&*YC&x20^^yDhZ#Kfl1^$xLuA5Bt!VIAeegMc zAYWmzMT-SmU9sgB1O^rPWffawX{uMyRNQJu;sV$KDd~WIy{XV zvU*O}k;p6t4XI$k&*$nlK$NpMMgxd!@OJYY9pP}Sr3nQ;Zqc;_p1%*b+jAfjJK~n% zy$rQU5o4XzE>*kTPwRFD<$iNRgztz&r0;dyB~;3IZp0}O3|#mi!wG3G8LXr?-k)J zGL@YhQ#BzW^CFlcVM?jb;^z~rX$yi0&{~VPk@dqFFcBMtI*#If ztPZH}BrTG0!64cG5@sT@Q4^llPDiUtY}D*qW^Q%LHp;sQ6SBRU5Q2?#Ds>4Pfd{EC zun`pvvXNWwO4x{{Fla7eqp+R^8@0tXa0@?jegoKr2{ul$T(huE+p|qOWgEK*+t_*= zY}58^)Anp*_hB15!Zvn)N(M(EY8yclPQgcKldlXJP6Hj_&Wux5bm!ARRxN{+C?M=q1~5@T zn6g$783n`I3Zjb*TiyyHqgYp9l-0f~VwA&tXIAp9wIKyWF9sD51%nDm3qS)3D73Ia zwVDEYHFZR3umeb1fkJ#rPYmQJ~n*2&bRm$n&+ zs9&i`9CWZSJAXMSclVS9piHJS&PS;k71)QZ_t0mejiw~5VGm1gg36f^pB=BG=*DBLtwl%<+nk>?^7}- zV7Dm?ubDD-n=&mmWw8yMGch#5Ku;-lgCEeEypY`~S*DX-MJZ_>Q{gSsNnzEEEXWXZ z9NqP_(dV`AMqW!2tv@QXcZ_zm4f5J#0IyjE-2uX}{5A=%kz3L88fR3f zZ_nFV%4N%6sO_7!?q$&Rp+)d?$28Y?B?{8S1nCGr0D3s?zaFjkrr z-#P?3*}K44i4Voo`AK7?Nn@o+VyQ&eOCImv65(Dy05lI6SV~d7B1@tQHKO^n^>%LSG+Fo0q3aQ55gf z=H(&j51`pE2Thxohq#3PQv0-dd0G@jKefFj(`FWw#-_jWMMw1Bgv5zckow{gwzp0X zJ9@O5IKU#LQLs1Nz;F?kfX=aO3#_&et$f+2IZYMq!s%g0&-AdPXL{JtGd=9+v7r{1 zSj(n0<6@UBE6Ez9anS>M&hJ<=off&Vacf`}YSq23 zG+}jnH@ST*C53~n)8_WEoE5%+?X}_>*1x7ro#Kh`ryJ&2C_)P|wWepH2(Tm-081Ow zT{^PZMQ3*Cl;7Ytp7sk`(-D}$({>Y0M<<+DhKZC}>0P$d=JW}E;c4+zT*8_*M{HQa zVurXEHsIP6Zz-rAMb2{hG^_W1LCacX0n3gT`6CNhc6}4ap7Kd<^98tV=#jZyrcGu{ z+sf9o`GBBih7xA5zdINadT8g;`O~r$r@gJXkRpbErHC0JNe|>AQ5ACO_^|BOywYPT zal0%Sp7YRuVej37?7HeZ|L)UAeK~!)`>55jTUax7)Z-%Z6f>o%a%}x6|7&zq1e*#e z{J?|jUp(l62bXdEMIxZmt;fx$(2mN-m1#%i*F?bly; z&Z!3Eae=)}Cmhe$q7zZVSg>A&@nNVc9;8K9v?XO2 z&9N%|gkni!0=q-qAl?c)%5;KaK^q9{?f_C(X?kZ?muvCVFh2Kn0CP!AX$VX*d8mj@ z1okOpuZR{A*ry1Z5~>`5eJU(aL<@f!RBAuNttkU9)|ZY^29=%)F`^Kr70Zd0=$)hZ zu8u$}1a}8yVM-c{;`6tOJyh!ciskl7-Cs$9Mo~dr3yVjJ3bK*}jiQ1$IF8jqqS2}N z{`>UuRumsEk0?HqLdXIQj^dk(C_aUSiH%iii9d{fkE>s+5ESPmMG2@X_OYx&_}jz` zE9rb?B!W>%=POAXhtP0p684>RdRSWsJgia6BjoyG=ph=k#5)QDYHd^jOnz7utAe1* zf9>L8j1iI&forV@KEymk3y033PO$V)wiGXinvo;=?&ef7XcMfLrH=^K%hE>#>*W9% zRt|Y1OCKy-C4D&J4(VehNgoc@qh5)F_4rVvj}>{WkUp4*OFBp&zDD|3$n*@CpT5$H+PjbWC4$d?@Aj|P`&`n8ilq%#q__+cNugS`U@zGK*#A$Wha-QA;?fG) zyT2$dRmk3QOL5sCGWf>=wzdtx!E7ce4%4&ZLX^=4B*h)HNyOzHF1Q;)@X3+~<5-uz zf4PEEV;jf~iF$C<}@B zCM3oc2nowjWhAurffP%BTjKCyhZPeU1H6QOcZ`r?_L)o_=fvfO zHmiLE181_s%f2NU4;Y3B8K{_y2X#ZjH|%*`Cv zcWUwDG2Ilt;Kr%NG=YnL7<}~+JED)+9DF27B(l(u5ZrM6)_Auz%D=Y7-D%iG(QkRT zK3#C6O1ox@7z^;gmAp~nU|rQ+XhSxb@*@^l%6=6jKrm>+4$g!fOwuZDX(^1_ipY`C z3X9M-YK^PQJ+*Cyr_I6k5?_}3)e7$?U#t|{6>_*oAx9~5dJNe9%ZQsx?-uZFf z;Evmlr`U-%Z#9pa9bre6<0-<9D#ufV9aWB}C7H8<*!>K_@)Xd2b({mR+3n<-B4Q1U zA|Tj23zk5Gi;B$U{mmodrPBZM8xE^itCcTf5$hnMj1B%o0ZGLfmMnQz*g)ist;(Pk zr=Gr>)9GPtoOet(CYzIWO0++EwHK-vUMP0Kvfrt4+vcDlct%9(EHq5Tju{Zd0Y5mR zSa-X0Sujvr*Hq(R{vOpBAY0&26H65Q!%iJ=$VYII6skz&l7vB=i7JA@s!GKPdw}xnfUYA?Qa;cZEbzE~P@ET+?SigK3b+=QgTlG|EWh zVT3`bnxsI)!?_RO3neW&xug>~b81A9yBfop#c`Zr$urJynsLUb8D~O9GoFJp^lGf` z1y)l#%s5lwg{#m2_uvfsWLthRV1XhoRD&Ewg_&SRczswJql;k>99c|!W>KaMWGt5` z14n!WN8Bek;%jhZG2@6Ez>&q|howFbII?IyLy;t(3rC`0(xUyauG+L{KdcKvEeb~# z5{@jiaD<8n!V$+Q6(-{vK-rV>3F8RG#Ec@j+#Q0|uS9LZE~=5mEQhgrN6m@RXCR%A zPA6H3dbE<1?2*HlK|APCN?IX#vq0pM7>kygB6qHBwZsOVd&6dh1?{5Fg|e>F(~yvL z4!d*ZdUhqhs577<7L9%6bq=#CYzM~S?CizLJeQ+H4xetdz~6J_Ggh!acj$d6W}&)*0$J&?Glw zpA9%*L1*JDX9E!SkPo8U`J8=_T*}jRRIx>yjZ>IzQk$Era^-GqE<5Y*fLMAKX8oCt z6XzCoKv!vE<|Inz;eRBjM8(@4_E$cPI^AnN^E5SDXXsx^uHOUP=}b1XAnw-2(VqE% zdj#QBI8@O#aeD?=+<0R4To-wXU;tAuYA!`J8W1cBO1rKJLI_>DCNCeaP5YelsSo!K zMY+6#uc7_9u!OIrPvpW9Zoq>`Lzw>EAljb`OQ=EBQJ{M&)9ZpO%saz4jK$wO36e{R z!mF2imm+Pd9#H2>euplF@p->)v4Xe@(#)3SyJ@~qlF!9PIz2Be=rvoGYd3SQn=Q+= zojDE7mgU~hoR((Ka&Kr(OSNga2B(51)^d`o*!7EZ1uw6>D))cWE3e9)EmHTyl|8>J z_D$`?C~J~wh=5a-J0Dp2xL!n_SkXebfhAImW;>fd`APqq>G35xcEzuy^SSGk4|?MB~JrXP&c1ZzKY zzOpLwC2ZiDMMqHcq!@LWVj&SgsLf2_2fKNarPyjL&A8cCbgdU6<*FZh|Lq}m(RDXS4Ci@SiDxYkl_3P}u&Hvkmv%kb%-xGUg zN2*^OFOKXjtRn)Cc|;3_12>Umaq52S?c7Ao>hv69t$LN>?S20}W<1 z!{NMuxaX>@Ctra$wP-RUKmIs8y)rJ&RZ&E8cD14dvI+jHSfg6@K^nx>CFKCX z5(Xp_lnQmp3R&h)Y=a&O`KCM1C+s6vsGEmTj7srFSOKqKbrjr}7HL|9rdlK$B&$W@ zes{W;PMK621TX142N0Eu-yndEly1Z9Sed>3BvQc@JgIle?srw3qv5`g9^_(k4>7Q? zLe}rLPG1i$4Mr8LY)QwcsOiPBkpwDJWGJ-V{p+4b6mEC#<#xn6{ZwP?tb7 z%013EF%Fn|JRNAEI#npv?b2;zT*=(P@0P!(_3pdJ-kmza-A6}Ek0XP8>b(u{-+99C z6r+bey^mutQr;%pBGY+?e#AZqCaAV@9NA_L_;%Gs{>m5|_TDH_Ha)rxeNgq?{tM%a zfSCD~x@R#+bQeZc=&q}0WohVl1pBJa7>SF5{g(5osXVhG>_0dT`!v+BpF&Yd772Oy zEUGgC`@Py=2$1m-S=*4W&$2qB-9dj1Eu^Qa@*)^OgWW(NU*K2vQ59oG&X2kRX(eoa zs@_?jhf~rtko73aDXA5L77J5K&O#6!|l{*aDX%; zV5rmJKpp`&kiJAXzy{t7A>)AGJ%$5Op0N^#Ff16Ez=2#hv5$YJD9skZONsE`zc8Wl*DX$qAZ6=p$& ze=<)!3My1gwca8IZL-Y=lI9T{C?i1H86t&=jbt_0FBiqCG~d|6yi$FkPyQB>elbYz-r>`{DU3x%3~civ zoPUWiBitCDCMlWI>JQO z;4v>ZPK#1%SC=mq@Mu{KnmuDn zEr^J9yo1dIOzSlxTrb%91(WD3+k}a!ZS)Ea*tS+|cw7Oo~Or=jEss-WUAk(?o zS52X{wlxV)6njFnKR6llDMgRBl^6ndF9@W6XiQi$Gm@)K?_}CyMa|(Vc#_aw!;@L4 zDHp<#BPaCg%NT3SeiiFvhT_?`PAM*+RhR)CWQ{BZU+G5E%Oc8bkMQr=*D{ugHm7V& zw9xf4CjLW!R@P$uSMbnVFV$$cW_26jod~76tAnD8G@nEb73GCOF}g0K8)g&;)EMi` zm{#FWSiE=JI z;VqvOI>vNj)zD0_<%|F@?QYiBFMY0$nUop*+(r1JSmm7>K*nl8)F9*JWBTtaw_O3nomXos@D66FK+*1KY>I`XAW*2t-S_ zW(1m={`(VYK8Kd2gBA!n2OqTEv9T<@6=L82uN7-}$GWWHK@jsDlgLboHH6FWC_cOX zIzZiLt}$AV+u=mCZCV4SXOR#Sl)ns*4K4D?akvg7pBwx?4VZQl;08p>FJo}SE+T}) zLMCtnFa>V22OrGf)|c+vz}wsM$UpAYzLAl)M6pScJ=q#C(QDjT*nx3A&x|Gy97eM0 zfq%xl<%UV5FxqyDFtM$tg(7)k?)EG1I|n<3TJSt9no-+Xqdmq{zcra4crSmhObU2|Y~* zMZloFa?D^1$&|`-BYR@F?*>okzLQ0B^nV){39i$&yIqv(uH)7N zoG1&BsEo(g)#hGqm=i+EJ2%jPZujyqgx1z+eD?;vWFW?o(Vrf(PCC6xv(FFOjFE++ zX_kfJ(A~2Dso|u*){%#{Gn#rSHTZNO)3$A${XF`>^(Jx%{%NP7A zn_Nu}Zkpr;3bZL6(t(MG~Tddjh`qg+7WFf2^ zIiZV}@%t(^&>o`3&ggih8SoskUt|V3t5lN-Ebacd#Hc7Nf5t}5QDC_AR zwG=yNzpSsG6<2$q8#oL2GLe-l<=}^$rh&K((RnwYgdb6KG^ol+d)vIeQcwO?jAii8 z9c=Q6#@y?c4|Jmin$Z7fzUTMyJs-*UxJCEef)F3BEAJ#XGZq^(1{D;#UHz(gAk25(Nc@A+qh^_k| zarVQaE&69qSR>$R5d9x)oBwwcBUBK_G%G1d=s%3XZ}scjCpUEN{;JyO!eR9 zme+RsZ}rKmy8XBK_&s$eC!=K$vndMu@<|qEpfNY!~>OWEbd%T_D*aT6O^> z(8@BH?E>Sr2-}lHsU^8*O9#E%(lM!n>`1mcv@9J^=5;I`!;rT3b1-GbG?iW2qN~}& zPz=a6E%@r<&}8od|#vQbAsUd3n1 zoIP&e%T-K^fx(ghY+6hdHu)kBP_bhQeMgYK$wvgwlUOTBw@S@#)hxjvc z>cN!C9_)T^=RmSIYL{mqR0#n|1Q-d%OpF&3jG2Mo3Lq*T7bVVbRa}=8A_{!baK~g0 z6!oslm5=}=TpU8eK5iCt)Axm0URW9(FIs8;cMP=00NN_DVs_NnCmR6|2trfmOI1+v zuad}%rzZf`ffJSKOg{74bjJM&V37+2u(qh~woHe8GMSn+kt4w;{adE1<0@$5_X3gl ztpg$f+E%ayqFo)&Ai=H&Iwc4N$UTrDBS3!I&%xw_7dr5rfnL&49+gs~1EOA~I00H; zR=oVci~!2+eg_UdFp+`BnP3hb{7%!R*g@bzksX{}DkU6W8vzpR^aMNJT{1U>D%#7@JmAyC z7)+R%ee_$wPO^9(6YK=hliBsp3_mjT*n5!$IP^jjJ*JSKm|w&U7K>>~85f!QA5YXD zM^L~~N|G&v&pwQb`jZ};;Hda8Q1XBy5jd;3 z1K071;F-|kT*ZMId=Up&7+?@ZN);y0$5u`e(Yi{V%1#j{+>()J@7nXAV2*!aDP*y6 z4+-w_1BZ%-gKyunU(q z{8j`424BF=Ud9USfX@VWy&zxM6dQi)ZUHX3MMx6AO(K-(8RU{5lG57~IjUC4-r!2< zrTavl9CW@P0+~E+ne^%&p-zghWyT6t_S;k~dB=Btatd!Z$U z@FJ!t+RVVw7jS6i#8PvJ_#1*z!75zQGZUKG(R7in7;sy<$}{#CX~s~sgUG0QTs>i~ z_*waRsN|Sd+m#qs!=jg^tBl%oD-Dppv*DvE&aZ4(%> z%%n26Yx?kfillNu$4*0ow#yq{`TTRW%zX?L8gvD(5DgN7iCNbj$)DQl35&pbU0oSn zT@9!($AwzDOEGBrtcq@?mjrj_o>>|Ff;*G?Bkt@BparHNB(j2N6vbo!RdEa#Ji3Nnf_1^)?*=wTE?t#ysF-Ve&*F zxS8-3>ZsBcd#6pB%Ws#c1-+!sVi6Ikz3S)$3UM}Vs!DbOS&>Ms?K;1o^WzG(T9n|( zrxRwS2^3s!AKk!JhH{rAMFbGU`d1#Oo7lKZ=f^>?SE-aJ=R;?|Z5L8v%D!6dPJm0p-T!w|n^FXX zA~iwmN^P1$WNLJZ4^0|Ef19ueHOfxoNC+v z6SzO&tpk56Y?~g#Tiw_J*7w2g65gH^^GJAGcQl5#5pG(MfZWxU(bd&f{7Bmj*IINb zyrs{m=#JEE;-HsQc#BtHeW_Y_+Y+mVx9iB&;^0V+;4N>m*ue{2D+iu?N#}00%ViRx z^(TDk`Z>xY zwozw-r%xK6#kGZO(<1`W3M!I5Y0TD==Nt6sjdXioykhDY=<+4bgG{QhyAZDslp) z%oi{Ork)A$r>-f}y#0OJ%S(SX&aH1J6~ zL{LftpS5FjZ`Hu3?HGNcYPeVp_ZJ%EV);jSFC6bM2X-ub4hI+?TNTQ6a~TJgV}BNQ znTTS8A@n=xGyltIdONsQ?GSNVZ<{4tko3>Tk(360>*EIJFbj5a=z^UbDi53>h-EBb zPC)(R&4e=5pO7oMZnQI3*rx5 zS`NGh4Jo%z})l^A$Xo_XP@d@(|k(+=NUdbR@32(w&3M!K2zUXen;5X zx0Y)NmA~tClVYe80bBPSyWq`5PVadc`|cKqGQ&jGZkWe2l6;Sp|Hr1NPM?J z1i6DBtgNdp$dpW{!~ctHY8?7?P-AtFR7kYL=$1VWdxU4Z*RU8VP0psT7N z$(RA+*CqhR4~x_niN{-;fch0(_vR)h^#wq^y@^RZixqJl-a-RS4Ixi3CgncJ`{L;9 zUJmxjfP`m)9#(`*(8JP@3Az>Ril8If6u~I$8a+V-%NIrs!=tXGVIx=x*SlhQ4^3P% z`d|cU8tp|302ToQA_IYAL3d-p-zmhGsr}tva7p4V#BUZ{0bSLC8_mR>KOlvxqXkd- zBnSa!(fp8X-H3Era1(^e4rYQ-85W%x43kvOl!bN-h7m(<3n(HxU79LXrc+ae%CtJq zdSg?nsEn+Yvo)E4JJV3sFfyMiH9j(*Dm|YXfF>MOr;^WS>P`_EX=pl47TvvkOBe#K z%039u4srhZl+3!9*rHgj+0i!)G|o|)7k?goDg7d9t~{l*kRZ2WMjvj(yg$whN%SQ_ zH@9_R&55S}iCb>!jNX;+i3l}ieOC3*F~k+@Zv1j6O|@t4eW@OLwTvqwfYmat0K}4Y zRDW6m;Tn>_?l>p)Z58TM^gWSj_t>_7kRF%pA3Bqt^I7)Sjafqcq)nBBjE^pcUK<=q zoAO}xGXR-QMCjXgQ1=1}F(S&2^<4%nF)o zOrVKex<5eO{T&HI)QLYh+q_3uH6lFQdFk}c7U|dQD?TJ|rIH1|7Zk(M`J)wLTGtYn5 z_{Hp3L^b;QGh_OpKg;|vC13~+nOIugh!(WE5iMA! zo9jw9&;kmUU{!7PBO1`^M>Jraen9B_Sr{p_Xe4tlh79HoAu67wWC*HDmQfE^ssjGx}FR92QWG8G;v`AY>~V@1CAmtJ&y2Zhzq0UIK#0Jmz{i55Elpb z%M=Z9VOtmk{Pl%8GAP6WSXb%(at(1Aj1iZ?7;!O8&cp`n(_R9FxNH}3 z!CDg`Fp!fKu1s7oHj22|N{-n(h|6?CTy~0@j1iZf+IAEQvyv#xisVcc3o(UR5e+*6 z4`6vDW5Vrcne>wlh4~Fr7)cwwhQic)yq%Icokhs^;I1E|FugGfgV8BT8=Q&4Ks+hF zr1SMCjC*WTm|meUI?EJ>TH$WoQ8r2 zxf}V?qnpE!+1l&sZbV~R-H67l(~WYbqZ?>UIB0TU3jJvMo7xi=>=ixDFWe-H1_y^g z*#K1~z4j#9qWwU6bgHSl884&J-reL$149vx3)=TAlvDz?JAyJpxHvW1-3_-%qwh)%J*LvjkTf|!IlG;)IQyHwcnkR}Sw8aG zU9+nP0uq#Pm-0u0rAmF)v<1Ky4ciGJr6y6uQeV9uz|U9WwJIw~mvTUn#OtgizdHeZ zr4}3DE43J5p#Z$>8yVm^Uk~8j<5>c{pFL}U&s@yC2;eI&764yyF`=Fo%fTbYn+))+ zZUpeHZpN5u?nVI5gHc(+r>(&gHc7OC; zHYmfoJJ||Y7s(a`<9jC%RiMn9DV1_g;TY^uQehj8Q6)dr?Z3hr32a0xh~XjmoT!@>32ye zuT=V7NFrPpab#CgzGsJ=Y2600KKmRL(H5RIP|5RC8K^uE84D`p+Xd3Ap&3fTz5{e8 zJC-1}*riq_>R^|0Pm&r}vAo;yCh>jOaMjfEkj@O7hvV$<8jSi{W`5X_t1eInN zjBn41m7-m8Y$+qDzqV5uM}xIVg?y}BG_@DA3S!cQ$U_{4(zTSzifSd%1! z4g<23I4HiA1NCln=xWy}DM9FsKYsP(f0&qfhATpzCne~-(VB*R-iR!S)!}&p!4(cW zrK+5#x{?^9y8MiDK^Azr(e3>`lNxjV-$)wYJQ^>{0OzyZV~sY{%MoJ`3ws7%8Zec1V$ zfB^?4pwGd!wDX7O>6Y_H^g{4<5tVjX58pL{UP(6Nw_WCWyX3JfEfTzU$qH0jBzf{-Jlr@VSLNo}RXHP96>zhwaz?Jo&9kd= zMy@J2Zdc`uTvd72U6nJE9i=4h5wsTK-VV(a0NPlhZl6ph#hXnd-Z3?Lw_4;~_=DW? zp4<|NK%2^yR3XD#5nzSA!({aDB_)G)34y>mEtXj%!HDKVVXF8N`zpj)limT8C8i3X zNq7dTBu8$#km19xKwIC!LWb|vM9Cmeb`f;;-5u69wM1?X)9V&ZZ&a7$p8u8ad3&C4 zx9A@7cL>%vz#gNb()uqY#R*}?oovvWiP7hnZ#k*#Qj=#b&6$FXv8-3sXXUP1Q&pCt zI?9{1rtIdTJIdLGSzVsB(vMwg@~q{SRJE1|wR|K&dNCUe-;bfDCy!cBu``GbisXa` zWRF@;3?h5fEYD?+nqUBpA@nB!K-k#b!7P54^owJnRj?L9K!kHR(M&)X)4?yW#&)79 z;;M0?y*~prsZq@FQCMLWaCRE!iCLkh`S%qI#+WKz=n|0?FSJXr;)UTaY|n4a3+-u~ zt>-pEjj`DW7fiW3SpsDUVwo_F3uUUFcUs_}PA2ogD8lVw)mTMqN)0eJERnlt|1tz|Kh~FYsxi|WPS)VHh z;N^9o@tBtlg;Zp-Cq5%B*&cA$cFe9fLytT$kxzHq)aU~lo+7bMk?5O%C(J#^1Wrs! z3!DsIMV?9ERUxcJtqNV4luEP$IufB=AAES_IQZ;uNmLF}TnBiXAjM(w@)>xfh|*^P z9;B*`f#*;KJV;D~KM3G?F+j2}15fg}V;fozc#0_{0T0Bk1w71KzGj|Uz+~Vlz*Gav zAvqlcSTd*dMjsjj7E*4`3|MeNWneLA2w2`^QbVncGcHVod`dzxV6mof)uQYW18eEj zMTh5jI6LGJQKB z5S>?;fvLwI1%y5a;?)O2O*}lccF_xY)9i{40kHFh+SLGdz%jl|Yyj9d#{g{KnF1KP zP6jY9i~x)jKID$~clzJ3qIa}A`qR8-Z}gfepe)G}AxYr9jO;9D`vMdxJBtyA!etj1 zYxkDmc1R4>zDfvohC?O9O2BjcvmAz5$>u3KP?(u4PUt`8h?RB89I-MkVc;^!QV2H7 zw~t{cp4$E8Q5?V`fVroFp|ETzL5A-s2@07@G6imr%Z9AX%< z=b6fV1rYLVfZ_nbIwhFNl+gPKGe&^XG9%MU2aJlyno+}DX@iqkF=np8y3g1DfBt}z2? zjHRWZ2NJcG)?~-gO^RIe!V<9ZoV2cdVOk{!mDCxiX{nd8FGMn>S}MvrJWLXh)c=~P4&>*-On&|> zlb_c;N%HeMXGMN^YD>wFN3mJ*!$Vt5emst+$o{p71BPVX zgA}z83BrL~DIbd5X~~U9H_5u7pB?0k zTzLd3MlldGC5T+<|DL?Gf)cN}F6ywvYp#nrtj)%_F18hgMsi)$VMRuAy)UcJGl&md z@6Xq0R7JCiWbqW>+|!V3ZBdPG$rB3340Dg_3+U%VrwE3)5TuKa*ULmm&4Qt!OZv@! zGjyp2-IikY$$$k`YwPb&7mD@&!S8Rjt0(3G*jNo+++l7NMh zBu#1d;I}e5=>AGozBA*)4Ic3^@WH$!D_xDFO)87L%PBNl!WMz0moL0Ni7p6@Om`Wr zRUCxaRI$Rh1FE_^i>+8)c%qV95fo^s1lNdqI23~Gb!f;*aK&~PC0FQKz77H7rmJXK?kbdC=6761TR4Rdgt)%0$zImh4Y?xe>(?`N` zd@5qFvOSMdE>J5hn4YF8jeeY#5bvGXRPta<+kvYKs2$H!w4FsMY8j{vA_D5)w9@`( zQ=|W#f#$UanoXJz|I_6QH-?Z5MD>exUbsKYTxDxLlfiY_STdy0*2R^4&ZO?oq_w$#9KKYa<3uKwsyXhG$4ym!v!P{V2Lou=NPS_ zaL+)WTlUKEY&T145$(4N&-{TZ3$pH2hG#`(&x?i1Nt>1y44ODUb&?RbzgkO*&)==rbFhwEuglB4Ivn@f7r|M-W|`-@~X38y?F0l`_uyq zuiR2#k@t>1f1ZG4E4+6G4FSt5GqC(s1{Nai5PUaDS^$>opL$^7m0J!h^!YTfz$4JF zvQTf(5U@n-C6wi_Gq4bZc~-#k8&5s3@X9R*7W#Y|SlYm1&=9Z?mKzH6dV9N!hk4l* z`k3WBx#^JD4SmNjA8U*wB2u z@sTAqE@na$V<#zzVyO1AhB(Haof{55l0~t;RqiZ`{Y^%J6m^XGW)pD(`qWnm2N=`o z6k8ed2qf4@aixoKm_{sZDXv(()(IpSh6{K^$Hx1HMk`d z*B4?HSshbcd;#oUKa_K`7B>A)#giVXstFmz;s=Cu=y{@5

0N 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

f;m_-$(cz-GCQ;mG-xb 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%0AwozSMZCR#U*4s(4D^eAi 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Μ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%0DyRKjA$ubDCY3bqyuE@(ST&!& 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
*HssiJDl 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 &zdWk* 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%0AE+eSa80tZym5gQ3{{2qS18iGB?B6W}*=Q(*?o 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

qU^<H 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 z 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�`p0a+^+_^=L^8XuoX!i35yu_q0DpTv_ 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 v8S4`G|Klk{xLuCu?GdA$sfCRcxhs11~vvd%jt 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 T--=BS?AXZte_RH_RX+a*?NOT> diff --git a/cli/wasm/yaml/windmill_parser_wasm.d.ts b/cli/wasm/yaml/windmill_parser_wasm.d.ts new file mode 100644 index 0000000000..ed09685cac --- /dev/null +++ b/cli/wasm/yaml/windmill_parser_wasm.d.ts @@ -0,0 +1,3 @@ +/* tslint:disable */ +/* eslint-disable */ +export function parse_ansible(code: string): string; diff --git a/cli/wasm/yaml/windmill_parser_wasm.js b/cli/wasm/yaml/windmill_parser_wasm.js new file mode 100644 index 0000000000..909de8a6e8 --- /dev/null +++ b/cli/wasm/yaml/windmill_parser_wasm.js @@ -0,0 +1,121 @@ + + +let WASM_VECTOR_LEN = 0; + +let cachedUint8ArrayMemory0 = null; + +function getUint8ArrayMemory0() { + if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { + cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8ArrayMemory0; +} + +const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } ); + +const encodeString = function (arg, view) { + return cachedTextEncoder.encodeInto(arg, view); +}; + +function passStringToWasm0(arg, malloc, realloc) { + + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8ArrayMemory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7F) break; + mem[ptr + offset] = code; + } + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; + const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len); + const ret = encodeString(arg, view); + + offset += ret.written; + ptr = realloc(ptr, len, offset, 1) >>> 0; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} + +const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } ); + +if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); +} +/** + * @param {string} code + * @returns {string} + */ +export function parse_ansible(code) { + let deferred2_0; + let deferred2_1; + try { + const ptr0 = passStringToWasm0(code, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.parse_ansible(ptr0, len0); + deferred2_0 = ret[0]; + deferred2_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); + } +} + +const imports = { + __wbindgen_placeholder__: { + __wbindgen_init_externref_table: function() { + const table = wasm.__wbindgen_export_0; + const offset = table.grow(4); + table.set(0, undefined); + table.set(offset + 0, undefined); + table.set(offset + 1, null); + table.set(offset + 2, true); + table.set(offset + 3, false); + ; + }, + }, + +}; + +const wasm_url = new URL('windmill_parser_wasm_bg.wasm', import.meta.url); +let wasmCode = ''; +switch (wasm_url.protocol) { + case 'file:': + wasmCode = await Deno.readFile(wasm_url); + break + case 'https:': + case 'http:': + wasmCode = await (await fetch(wasm_url)).arrayBuffer(); + break + default: + throw new Error(`Unsupported protocol: ${wasm_url.protocol}`); +} + +const wasmInstance = (await WebAssembly.instantiate(wasmCode, imports)).instance; +const wasm = wasmInstance.exports; +export const __wasm = wasm; + +wasm.__wbindgen_start(); + diff --git a/cli/wasm/yaml/windmill_parser_wasm_bg.wasm b/cli/wasm/yaml/windmill_parser_wasm_bg.wasm new file mode 100644 index 0000000000000000000000000000000000000000..40e1226b48208d64c6ec795561198ed9a0f1a778 GIT binary patch literal 262484 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 [number, number]; +export const __wbindgen_export_0: WebAssembly.Table; +export const __wbindgen_malloc: (a: number, b: number) => number; +export const __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; +export const __wbindgen_free: (a: number, b: number, c: number) => void; +export const __wbindgen_start: () => void; diff --git a/docker/DockerfileFull b/docker/DockerfileFull index c64dff2e00..7f904b01b7 100644 --- a/docker/DockerfileFull +++ b/docker/DockerfileFull @@ -1,10 +1,16 @@ FROM ghcr.io/windmill-labs/windmill:dev +# Rust COPY --from=rust:1.81.0 /usr/local/cargo /usr/local/cargo COPY --from=rust:1.81.0 /usr/local/rustup /usr/local/rustup +# Ansible RUN uv tool install ansible && [ -d "$(uv tool dir)/ansible/bin/" ] && find "$(uv tool dir)/ansible/bin/" -mindepth 1 -maxdepth 1 -type f -executable -regextype posix-extended -regex '^((.+/)?)[^.]+' -print0 | xargs -0 ln -s -t "$UV_TOOL_BIN_DIR/" || true +# C# COPY --from=bitnami/dotnet-sdk:9.0.101-debian-12-r0 /opt/bitnami/dotnet-sdk /opt/dotnet-sdk RUN ln -s /opt/dotnet-sdk/bin/dotnet /usr/bin/dotnet ENV DOTNET_ROOT="/opt/dotnet-sdk/bin" + +# Nushell +COPY --from=ghcr.io/nushell/nushell:0.101.0-bookworm /usr/bin/nu /usr/bin/nu diff --git a/docker/DockerfileFullEe b/docker/DockerfileFullEe index 9661443f53..b074bb4ecf 100644 --- a/docker/DockerfileFullEe +++ b/docker/DockerfileFullEe @@ -19,9 +19,11 @@ RUN if [ "$TARGETPLATFORM" = "linux/arm64" ]; then \ FROM ghcr.io/windmill-labs/windmill-ee:dev +# Rust COPY --from=rust:1.81.0 /usr/local/cargo /usr/local/cargo COPY --from=rust:1.81.0 /usr/local/rustup /usr/local/rustup +# Ansible RUN uv tool install ansible && [ -d "$(uv tool dir)/ansible/bin/" ] && find "$(uv tool dir)/ansible/bin/" -mindepth 1 -maxdepth 1 -type f -executable -regextype posix-extended -regex '^((.+/)?)[^.]+' -print0 | xargs -0 ln -s -t "$UV_TOOL_BIN_DIR/" || true # dotnet SDK COPY --from=bitnami/dotnet-sdk:9.0.101-debian-12-r0 /opt/bitnami/dotnet-sdk /opt/dotnet-sdk @@ -32,3 +34,6 @@ ENV DOTNET_ROOT="/opt/dotnet-sdk/bin" COPY --from=oracledb-client /opt/oracle/23/lib /opt/oracle/23/lib RUN apt-get -y update && apt-get install -y libaio1 RUN echo /opt/oracle/23/lib > /etc/ld.so.conf.d/oracle-instantclient.conf && ldconfig + +# Nushell +COPY --from=ghcr.io/nushell/nushell:0.101.0-bookworm /usr/bin/nu /usr/bin/nu diff --git a/docker/DockerfileNsjail b/docker/DockerfileNsjail index ca1c71b706..d667b15722 100644 --- a/docker/DockerfileNsjail +++ b/docker/DockerfileNsjail @@ -42,9 +42,11 @@ FROM ghcr.io/windmill-labs/windmill-ee:dev RUN apt-get update && apt-get install -y libprotobuf-dev libnl-route-3-dev +# Rust COPY --from=rust:1.80.1 /usr/local/cargo /usr/local/cargo COPY --from=rust:1.80.1 /usr/local/rustup /usr/local/rustup +# Ansible RUN uv tool install ansible && [ -d "$(uv tool dir)/ansible/bin/" ] && find "$(uv tool dir)/ansible/bin/" -mindepth 1 -maxdepth 1 -type f -executable -regextype posix-extended -regex '^((.+/)?)[^.]+' -print0 | xargs -0 ln -s -t "$UV_TOOL_BIN_DIR/" || true # dotnet SDK @@ -57,4 +59,7 @@ COPY --from=oracledb-client /opt/oracle/23/lib /opt/oracle/23/lib RUN apt-get -y update && apt-get install -y libaio1 RUN echo /opt/oracle/23/lib > /etc/ld.so.conf.d/oracle-instantclient.conf && ldconfig +# Nushell +COPY --from=ghcr.io/nushell/nushell:0.101.0-bookworm /usr/bin/nu /usr/bin/nu + COPY --from=nsjail /nsjail/nsjail /bin/nsjail diff --git a/docker/dev.nu b/docker/dev.nu new file mode 100755 index 0000000000..a1fd303b0b --- /dev/null +++ b/docker/dev.nu @@ -0,0 +1,170 @@ +#! /usr/bin/env nu +# ------------------------------------ # +# Build and Test docker images locally # +# run: # +# docker/dev.nu --help # +# ------------------------------------ # + +let branch = git branch --show-current; +# cp -f Caddyfile .dev-docker/Caddyfile + +# --- Constraints --- # +def constraints [ + custom_dockerfile?: path + features?: string +] { + # if ($features | str contains "enterprise") { + # print "Building in EE mode" + # print "Is windmill ee private repo mounted? [Y/n]"; + # let inp = input listen --types [key] + + # if ($inp.code != "y") { + # # print "You can use --auto-substitute(-s) to automatically mount ee private repo (TODO)" + # print "Aborted" + # return; + # } + # } + if not ($features | str contains "static_frontend") { + panic "If you compile without 'static_frontend' you won't be able to load frontend" + } + if ($features | str contains "enterprise") and not ($features | str contains "license") { + panic "If you build enterprise you also need to include 'license' feature" + } +} +# --- Patches --- # +# ./Dockerfile +def patch_main_dockerfile [ + features?: string + wasm_pkg?: string +] { + let dockerfile = open ./Dockerfile + # Spread wasm parser + if $wasm_pkg != null { + $dockerfile + | str replace '# -- MACRO-SPREAD-WASM-PARSER-DEV-ONLY -- #' $"COPY ./backend/parsers/windmill-parser-wasm/pkg-($wasm_pkg) ./node_modules/windmill-parser-wasm-($wasm_pkg)" + | return $in + } + + print $dockerfile + + return $dockerfile +} + +# ./docker/Dockerfile* +def patch_custom_dockerfile [ + custom_dockerfile: path + features?: string +] { + open $custom_dockerfile + | str replace 'ghcr.io/windmill-labs/windmill-ee:dev' (get_ident -f $features) + | return $in +} + +# ./docker-compose.yml +def patch_docker_compose [ + custom_dockerfile?: path + features?: string +] { + mut compose = open ./docker-compose.yml + + $compose.services.windmill_worker.pull_policy = "never" + $compose.services.windmill_worker_native.pull_policy = "never" + $compose.services.windmill_server.pull_policy = "never" + $compose.services.windmill_indexer.pull_policy = "never" + + if ($custom_dockerfile | default 'none' | path basename) == "DockerfileNsjail" { + $compose.services.windmill_worker.privileged = true + $compose.services.windmill_worker_native.privileged = true + + $compose.services.windmill_worker.environment ++= ["DISABLE_NSJAIL=false"] + $compose.services.windmill_worker_native.environment ++= ["DISABLE_NSJAIL=false"] + } + return ($compose | to yaml) +} + +# Build and Test docker images +# +# For more info run: +# docker.nu up --help +# docker.nu build --help +# +# Should be invoked in repo root +def main [] { + ./docker/dev.nu --help; +} + +# TODO: +# Also we need single tmpdir for it +def kill [] {} + +# Get tag for dockerfile + features +def "main tag" [ + custom_dockerfile?: path # Any dockerfile that depends on root Dockerfile + --features(-f): string # Features that will be passed to base Dockerfile to compile windmill +] { + get_ident $custom_dockerfile -f $features +} + +# Run and Build (if not yet) docker image +def "main up" [ + custom_dockerfile?: path # Any dockerfile that depends on root Dockerfile + --features(-f): string = "static_frontend" # Features that will be passed to base Dockerfile to compile windmill + --wasm-pkg: string # Include unreleased wasm parser in docker image + --rebuild(-r) # Rebuild if there is existing image with same tag + --yes(-y) # Say yes for every confirmation (TODO) + --podman(-p) # Use podman as a backend (TODO) +] { + constraints $custom_dockerfile $features + + # let base_ident = get_ident -f $features; + let ident = get_ident $custom_dockerfile -f $features; + + if $rebuild or not (docker images | into string | str contains $ident) { + let base_ident = get_ident -f $features; + + if $rebuild or not (docker images | into string | str contains $base_ident) { + print $"Building base image with ident: ($base_ident)" + docker build . -t ($base_ident) -f (wrap "Dockerfile" (patch_main_dockerfile $features $wasm_pkg)) --build-arg features=($features) + } + + if $custom_dockerfile != null { + # let ident = get_ident $custom_dockerfile -f $features; + print $"Building image by path ($custom_dockerfile) with ident: ($ident)" + docker build -f (wrap "DockerfileCustom" (patch_custom_dockerfile $custom_dockerfile $features)) -t $ident / + } + } else { + print $"($ident) was found" + } + + print $"Running: ($ident)" + WM_IMAGE=$"($ident)" docker compose -f (wrap "docker-compose.yml" (patch_docker_compose $custom_dockerfile $features)) up +} + +# TODO +def clone_ee_private [] { + let rev = open backend/ee-repo-ref.txt + git clone --depth 1 git@github.com:windmill-labs/windmill-ee-private.git .docker.nu/private-ee-repo-rev-($rev) + # git checkout ddcfdfc18a9833a5fc4e62ad62a265ef1e06a0aa) +} + +def get_ident [ custom_dockerfile?: path, --features(-f): string ] { + let feat_postfix = if $features != null { + $features | split row ',' | each { |e| $e | str trim --left --right } | sort | str join "-"; + } else { + "no-features" + } + + if $custom_dockerfile != null { + let df_postfix = $"($custom_dockerfile)" | split row "Dockerfile" | get 1 | str downcase; + return ($branch | append $df_postfix | append $feat_postfix | str join "__"); + } else { + return ($branch | append $feat_postfix | str join "-"); + } +} + +def wrap [ filename content ] { + let tmpfile = ".dev-docker-wrapper-" ++ $filename; + $content | save -f $tmpfile + return $tmpfile +} + diff --git a/flake.lock b/flake.lock index c0cae8c380..8a6dec28f5 100644 --- a/flake.lock +++ b/flake.lock @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1736883708, - "narHash": "sha256-uQ+NQ0/xYU0N1CnXsa2zghgNaOPxWpMJXSUJJ9W7140=", + "lastModified": 1740367490, + "narHash": "sha256-WGaHVAjcrv+Cun7zPlI41SerRtfknGQap281+AakSAw=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "eb62e6aa39ea67e0b8018ba8ea077efe65807dc8", + "rev": "0196c0175e9191c474c26ab5548db27ef5d34b05", "type": "github" }, "original": { @@ -61,11 +61,11 @@ "nixpkgs": "nixpkgs_2" }, "locked": { - "lastModified": 1737080704, - "narHash": "sha256-n+J2h9GM9ZpFOQUmtZoCr1+DFF/iO5UlmLJeHIxbZGY=", + "lastModified": 1740536993, + "narHash": "sha256-3YI+1ONZ28chM19Hep9Z+TSyiybYf/1VC/gwImVZKUw=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "f9953fe89f8b65401fc4d4a288940bc2cb072949", + "rev": "9f05c0655de9dc2c7b60b689447c48abb9190bf8", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 6f4463e5ae..506e61d68e 100644 --- a/flake.nix +++ b/flake.nix @@ -7,167 +7,242 @@ outputs = { self, nixpkgs, flake-utils, rust-overlay }: flake-utils.lib.eachDefaultSystem (system: - let - pkgs = import nixpkgs { - inherit system; - config.allowUnfree = true; - overlays = [ (import rust-overlay) ]; - }; - rust = pkgs.rust-bin.stable.latest.default.override { - extensions = [ - "rust-src" # for rust-analyzer - "rust-analyzer" + let + pkgs = import nixpkgs { + inherit system; + config.allowUnfree = true; + overlays = [ (import rust-overlay) ]; + }; + rust = pkgs.rust-bin.stable.latest.default.override { + extensions = [ + "rust-src" # for rust-analyzer + "rust-analyzer" + ]; + }; + buildInputs = with pkgs; [ + openssl + openssl.dev + libxml2.dev + xmlsec.dev + libxslt.dev + libtool + nodejs + postgresql + pkg-config + cmake ]; - }; - buildInputs = with pkgs; [ - openssl openssl.dev libxml2.dev xmlsec.dev libxslt.dev libtool - rust nodejs - postgresql - pkg-config cmake - ]; - PKG_CONFIG_PATH = pkgs.lib.makeSearchPath "lib/pkgconfig" (with pkgs; [ - openssl.dev - libxml2.dev - xmlsec.dev - libxslt.dev - ]); - RUSTY_V8_ARCHIVE = - let + PKG_CONFIG_PATH = pkgs.lib.makeSearchPath "lib/pkgconfig" + (with pkgs; [ openssl.dev libxml2.dev xmlsec.dev libxslt.dev ]); + RUSTY_V8_ARCHIVE = let version = "130.0.1"; target = pkgs.hostPlatform.rust.rustcTarget; sha256 = { - x86_64-linux = "sha256-qc25H3Aj2KRhsAZ+2SD1c4RmweVK07oW71opZXRuUoc="; - aarch64-linux = "sha256-qc25H3Aj2KRhsAZ+2SD1c4RmweVK07oW71opZXRuUoc="; + x86_64-linux = + "sha256-qc25H3Aj2KRhsAZ+2SD1c4RmweVK07oW71opZXRuUoc="; + aarch64-linux = + "sha256-qc25H3Aj2KRhsAZ+2SD1c4RmweVK07oW71opZXRuUoc="; x86_64-darwin = pkgs.lib.fakeHash; - aarch64-darwin = "sha256-d1QTLt8gOUFxACes4oyIYgDF/srLOEk+5p5Oj1ECajQ="; + aarch64-darwin = + "sha256-d1QTLt8gOUFxACes4oyIYgDF/srLOEk+5p5Oj1ECajQ="; }.${system}; in pkgs.fetchurl { name = "librusty_v8-${version}"; - url = "https://github.com/denoland/rusty_v8/releases/download/v${version}/librusty_v8_release_${target}.a.gz"; + url = + "https://github.com/denoland/rusty_v8/releases/download/v${version}/librusty_v8_release_${target}.a.gz"; inherit sha256; }; - in { - devShell = pkgs.mkShell { - buildInputs = buildInputs ++ (with pkgs; [ - git xcaddy sqlx-cli flock sccache - deno python3 python3Packages.pip go bun uv dotnet-sdk_9 oracle-instantclient - ]); - packages = [ - (pkgs.writeScriptBin "wm-caddy" '' - cd ./frontend - xcaddy build $* \ - --with github.com/mholt/caddy-l4@145ec36251a44286f05a10d231d8bfb3a8192e09 \ - --with github.com/RussellLuo/caddy-ext/layer4@ab1e18cfe426012af351a68463937ae2e934a2a1 - '') - (pkgs.writeScriptBin "wm-build" '' - cd ./frontend - npm install - npm run ${if pkgs.stdenv.isDarwin then "generate-backend-client-mac" else "generate-backend-client"} - npm run build $* - '') - (pkgs.writeScriptBin "wm-migrate" '' - cd ./backend - sqlx migrate run - '') - (pkgs.writeScriptBin "wm-setup" '' - sqlx database create - wm-build - wm-caddy - wm-migrate - '') - (pkgs.writeScriptBin "wm-reset" '' - sqlx database drop -f - sqlx database create - wm-migrate - '') - (pkgs.writeScriptBin "wm-bench" '' - deno run -A benchmarks/main.ts -e admin@windmill.dev -p changeme $* - '') - (pkgs.writeScriptBin "wm" '' - cd ./frontend - npm run dev $* - '') - ]; - - inherit PKG_CONFIG_PATH RUSTY_V8_ARCHIVE; - NODE_ENV = "development"; - NODE_OPTIONS = "--max-old-space-size=16384"; - DATABASE_URL = "postgres://postgres:changeme@127.0.0.1:5432/"; - REMOTE = "http://127.0.0.1:8000"; - REMOTE_LSP = "http://127.0.0.1:3001"; - RUSTC_WRAPPER = "${pkgs.sccache}/bin/sccache"; - DENO_PATH = "${pkgs.deno}/bin/deno"; - GO_PATH = "${pkgs.go}/bin/go"; - BUN_PATH = "${pkgs.bun}/bin/bun"; - UV_PATH = "${pkgs.uv}/bin/uv"; - FLOCK_PATH = "${pkgs.flock}/bin/flock"; - CARGO_PATH = "${rust}/bin/cargo"; - DOTNET_PATH = "${pkgs.dotnet-sdk_9}/bin/dotnet"; - DOTNET_ROOT = "${pkgs.dotnet-sdk_9}/share/dotnet"; - ORACLE_LIB_DIR = "${pkgs.oracle-instantclient.lib}/lib"; - }; - packages.default = self.packages.${system}.windmill; - packages.windmill-client = pkgs.buildNpmPackage { - name = "windmill-client"; - version = (pkgs.lib.strings.trim (builtins.readFile ./version.txt)); - - src = pkgs.nix-gitignore.gitignoreSource [] ./frontend; - nativeBuildInputs = with pkgs; [ pkg-config ]; - buildInputs = with pkgs; [ nodejs pixman cairo pango ]; - doCheck = false; - - npmDepsHash = "sha256-NXk9mnf74+/k0i3goqU8Zi/jr5b/bmW+HWRLJCI2CX8="; - npmBuild = "npm run build"; - - postUnpack = '' - mkdir -p ./backend/windmill-api/ - cp ${./backend/windmill-api/openapi.yaml} ./backend/windmill-api/openapi.yaml - cp ${./openflow.openapi.yaml} ./openflow.openapi.yaml - ''; - preBuild = '' - npm run ${if pkgs.stdenv.isDarwin then "generate-backend-client-mac" else "generate-backend-client"} - ''; - - installPhase = '' - mkdir -p $out/build - cp -r build $out - ''; - - NODE_OPTIONS = "--max-old-space-size=8192"; - }; - packages.windmill = pkgs.rustPlatform.buildRustPackage { - pname = "windmill"; - version = (pkgs.lib.strings.trim (builtins.readFile ./version.txt)); - - src = ./backend; - nativeBuildInputs = buildInputs - ++ [ self.packages.${system}.windmill-client pkgs.perl ] - ++ pkgs.lib.optionals pkgs.stdenv.isDarwin [ - # Additional darwin specific inputs can be set here - pkgs.libiconv - pkgs.darwin.apple_sdk.frameworks.SystemConfiguration - ]; - - cargoLock = { - lockFile = ./backend/Cargo.lock; - outputHashes = { - "php-parser-rs-0.1.3" = "sha256-ZeI3KgUPmtjlRfq6eAYveqt8Ay35gwj6B9iOQRjQa9A="; - "progenitor-0.3.0" = "sha256-F6XRZFVIN6/HfcM8yI/PyNke45FL7jbcznIiqj22eIQ="; - "tinyvector-0.1.0" = "sha256-NYGhofU4rh+2IAM+zwe04YQdXY8Aa4gTmn2V2HtzRfI="; - }; + in { + # Enter by `nix develop .#wasm` + devShells."wasm" = pkgs.mkShell { + buildInputs = buildInputs ++ (with pkgs; [ + (rust-bin.nightly.latest.default.override { + extensions = [ + "rust-src" # for rust-analyzer + "rust-analyzer" + ]; + targets = [ "wasm32-unknown-unknown" ]; + }) + wasm-pack + deno + ]); }; - buildFeatures = [ - "enterprise" "enterprise_saml" "stripe" "embedding" "parquet" "prometheus" - "openidconnect" "cloud" "jemalloc" "tantivy" "deno_core" "license" "http_trigger" - "zip" "oauth2" "kafka" "otel" "dind" "php" "mysql" "mssql" "bigquery" "websocket" - "python" "smtp" "csharp" "static_frontend" "rust" - ]; - doCheck = false; + devShells.default = pkgs.mkShell { + buildInputs = buildInputs ++ (with pkgs; [ + rust + git + xcaddy + sqlx-cli + flock + sccache + deno + python3 + python3Packages.pip + go + bun + uv + nushell + dotnet-sdk_9 + oracle-instantclient + svelte-language-server + ]); + packages = [ + (pkgs.writeScriptBin "wm-caddy" '' + cd ./frontend + xcaddy build $* \ + --with github.com/mholt/caddy-l4@145ec36251a44286f05a10d231d8bfb3a8192e09 \ + --with github.com/RussellLuo/caddy-ext/layer4@ab1e18cfe426012af351a68463937ae2e934a2a1 + '') + (pkgs.writeScriptBin "wm-build" '' + cd ./frontend + npm install + npm run ${ + if pkgs.stdenv.isDarwin then + "generate-backend-client-mac" + else + "generate-backend-client" + } + npm run build $* + '') + (pkgs.writeScriptBin "wm-migrate" '' + cd ./backend + sqlx migrate run + '') + (pkgs.writeScriptBin "wm-setup" '' + sqlx database create + wm-build + wm-caddy + wm-migrate + '') + (pkgs.writeScriptBin "wm-reset" '' + sqlx database drop -f + sqlx database create + wm-migrate + '') + (pkgs.writeScriptBin "wm-bench" '' + deno run -A benchmarks/main.ts -e admin@windmill.dev -p changeme $* + '') + (pkgs.writeScriptBin "wm" '' + cd ./frontend + npm run dev $* + '') + ]; - inherit PKG_CONFIG_PATH RUSTY_V8_ARCHIVE; - SQLX_OFFLINE = true; - FRONTEND_BUILD_DIR = "${self.packages.${system}.windmill-client}/build"; - }; - }); + inherit PKG_CONFIG_PATH RUSTY_V8_ARCHIVE; + NODE_ENV = "development"; + NODE_OPTIONS = "--max-old-space-size=16384"; + DATABASE_URL = "postgres://postgres:changeme@127.0.0.1:5432/"; + REMOTE = "http://127.0.0.1:8000"; + REMOTE_LSP = "http://127.0.0.1:3001"; + RUSTC_WRAPPER = "${pkgs.sccache}/bin/sccache"; + DENO_PATH = "${pkgs.deno}/bin/deno"; + GO_PATH = "${pkgs.go}/bin/go"; + BUN_PATH = "${pkgs.bun}/bin/bun"; + UV_PATH = "${pkgs.uv}/bin/uv"; + NU_PATH = "${pkgs.nushell}/bin/nu"; + FLOCK_PATH = "${pkgs.flock}/bin/flock"; + CARGO_PATH = "${rust}/bin/cargo"; + DOTNET_PATH = "${pkgs.dotnet-sdk_9}/bin/dotnet"; + DOTNET_ROOT = "${pkgs.dotnet-sdk_9}/share/dotnet"; + ORACLE_LIB_DIR = "${pkgs.oracle-instantclient.lib}/lib"; + }; + packages.default = self.packages.${system}.windmill; + packages.windmill-client = pkgs.buildNpmPackage { + name = "windmill-client"; + version = (pkgs.lib.strings.trim (builtins.readFile ./version.txt)); + + src = pkgs.nix-gitignore.gitignoreSource [ ] ./frontend; + nativeBuildInputs = with pkgs; [ pkg-config ]; + buildInputs = with pkgs; [ nodejs pixman cairo pango ]; + doCheck = false; + + npmDepsHash = "sha256-NXk9mnf74+/k0i3goqU8Zi/jr5b/bmW+HWRLJCI2CX8="; + npmBuild = "npm run build"; + + postUnpack = '' + mkdir -p ./backend/windmill-api/ + cp ${ + ./backend/windmill-api/openapi.yaml + } ./backend/windmill-api/openapi.yaml + cp ${./openflow.openapi.yaml} ./openflow.openapi.yaml + ''; + preBuild = '' + npm run ${ + if pkgs.stdenv.isDarwin then + "generate-backend-client-mac" + else + "generate-backend-client" + } + ''; + + installPhase = '' + mkdir -p $out/build + cp -r build $out + ''; + + NODE_OPTIONS = "--max-old-space-size=8192"; + }; + packages.windmill = pkgs.rustPlatform.buildRustPackage { + pname = "windmill"; + version = (pkgs.lib.strings.trim (builtins.readFile ./version.txt)); + + src = ./backend; + nativeBuildInputs = buildInputs + ++ [ self.packages.${system}.windmill-client pkgs.perl ] + ++ pkgs.lib.optionals pkgs.stdenv.isDarwin [ + # Additional darwin specific inputs can be set here + pkgs.libiconv + pkgs.darwin.apple_sdk.frameworks.SystemConfiguration + ]; + + cargoLock = { + lockFile = ./backend/Cargo.lock; + outputHashes = { + "php-parser-rs-0.1.3" = + "sha256-ZeI3KgUPmtjlRfq6eAYveqt8Ay35gwj6B9iOQRjQa9A="; + "progenitor-0.3.0" = + "sha256-F6XRZFVIN6/HfcM8yI/PyNke45FL7jbcznIiqj22eIQ="; + "tinyvector-0.1.0" = + "sha256-NYGhofU4rh+2IAM+zwe04YQdXY8Aa4gTmn2V2HtzRfI="; + }; + }; + + buildFeatures = [ + "enterprise" + "enterprise_saml" + "stripe" + "embedding" + "parquet" + "prometheus" + "openidconnect" + "cloud" + "jemalloc" + "tantivy" + "deno_core" + "license" + "http_trigger" + "zip" + "oauth2" + "kafka" + "otel" + "dind" + "php" + "mysql" + "mssql" + "bigquery" + "websocket" + "python" + "smtp" + "csharp" + "static_frontend" + "rust" + ]; + doCheck = false; + + inherit PKG_CONFIG_PATH RUSTY_V8_ARCHIVE; + SQLX_OFFLINE = true; + FRONTEND_BUILD_DIR = + "${self.packages.${system}.windmill-client}/build"; + }; + }); } diff --git a/frontend/package-lock.json b/frontend/package-lock.json index b307035fca..cece7518b1 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -69,6 +69,7 @@ "vscode-ws-jsonrpc": "~3.4.0", "windmill-parser-wasm-csharp": "^1.437.1", "windmill-parser-wasm-go": "^1.429.0", + "windmill-parser-wasm-nu": "^1.474.1", "windmill-parser-wasm-php": "^1.429.0", "windmill-parser-wasm-py": "^1.477.1", "windmill-parser-wasm-regex": "^1.439.0", @@ -12588,6 +12589,11 @@ "resolved": "https://registry.npmjs.org/windmill-parser-wasm-go/-/windmill-parser-wasm-go-1.429.0.tgz", "integrity": "sha512-M3jeGDqeTyPj9HyyX3msdzMrqIIzlfMfxTMsXS8m7MJp4Cm60qifMxD29Ipxb2B4WdzyGwCSlaBjLsXu0b3c5g==" }, + "node_modules/windmill-parser-wasm-nu": { + "version": "1.474.1", + "resolved": "https://registry.npmjs.org/windmill-parser-wasm-nu/-/windmill-parser-wasm-nu-1.474.1.tgz", + "integrity": "sha512-ikRhz9CWpWilt/7K8mmRniF2cdWnH6EgjuL189z76pcEQbuMwDO4eXocAdMDaufehOsTWpXmDtsYeFfmayPIpQ==" + }, "node_modules/windmill-parser-wasm-php": { "version": "1.429.0", "resolved": "https://registry.npmjs.org/windmill-parser-wasm-php/-/windmill-parser-wasm-php-1.429.0.tgz", diff --git a/frontend/package.json b/frontend/package.json index 9032983fea..d6135d7613 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -144,6 +144,7 @@ "vscode-ws-jsonrpc": "~3.4.0", "windmill-parser-wasm-csharp": "^1.437.1", "windmill-parser-wasm-go": "^1.429.0", + "windmill-parser-wasm-nu": "^1.474.1", "windmill-parser-wasm-php": "^1.429.0", "windmill-parser-wasm-py": "^1.477.1", "windmill-parser-wasm-regex": "^1.439.0", @@ -514,4 +515,4 @@ "optionalDependencies": { "fsevents": "^2.3.3" } -} +} \ No newline at end of file diff --git a/frontend/src/lib/components/Editor.svelte b/frontend/src/lib/components/Editor.svelte index b5f6565362..db74de17b4 100644 --- a/frontend/src/lib/components/Editor.svelte +++ b/frontend/src/lib/components/Editor.svelte @@ -192,6 +192,7 @@ | 'rust' | 'yaml' | 'csharp' + | 'nu' export let code: string = '' export let cmdEnterAction: (() => void) | undefined = undefined export let formatAction: (() => void) | undefined = undefined @@ -201,7 +202,7 @@ ruff: false, deno: false, go: false, - shellcheck: false + shellcheck: false, } export let shouldBindKey: boolean = true export let fixedOverflowWidgets = true @@ -246,7 +247,7 @@ let destroyed = false const uri = - lang != 'go' && lang != 'typescript' && lang != 'python' + lang != 'go' && lang != 'typescript' && lang != 'python' && lang != 'nu' ? `file:///${filePath ?? rHash}.${langToExt(lang)}` : `file:///tmp/monaco/${randomHash()}.${langToExt(lang)}` @@ -369,7 +370,7 @@ export async function format() { if (editor) { code = getCode() - if (lang != 'shell') { + if (lang != 'shell' && lang != 'nu') { if ($formatOnSave != false) { if (scriptLang == 'deno' && languageClients.length > 0) { languageClients.forEach(async (x) => { @@ -1120,7 +1121,7 @@ initialized = true try { - model = meditor.createModel(code, lang, mUri.parse(uri)) + model = meditor.createModel(code, (lang == 'nu') ? 'python' : lang, mUri.parse(uri)) } catch (err) { console.log('model already existed', err) const nmodel = meditor.getModel(mUri.parse(uri)) diff --git a/frontend/src/lib/components/EditorBar.svelte b/frontend/src/lib/components/EditorBar.svelte index fc597cf8e0..3a778bfa66 100644 --- a/frontend/src/lib/components/EditorBar.svelte +++ b/frontend/src/lib/components/EditorBar.svelte @@ -92,7 +92,8 @@ 'nativets', 'php', 'rust', - 'csharp' + 'csharp', + 'nu' ].includes(lang ?? '') $: showVarPicker = [ 'python3', @@ -105,7 +106,8 @@ 'nativets', 'php', 'rust', - 'csharp' + 'csharp', + 'nu' ].includes(lang ?? '') $: showResourcePicker = [ 'python3', @@ -118,7 +120,8 @@ 'nativets', 'php', 'rust', - 'csharp' + 'csharp', + 'nu' ].includes(lang ?? '') $: showResourceTypePicker = ['typescript', 'javascript'].includes(scriptLangToEditorLang(lang)) || @@ -368,6 +371,8 @@ editor.insertAtCursor(`std::env::var("${name}").unwrap();`) } else if (lang == 'csharp') { editor.insertAtCursor(`Environment.GetEnvironmentVariable("${name}");`) + } else if (lang == 'nu') { + editor.insertAtCursor(`$env.${name}`) } sendUserToast(`${name} inserted at cursor`) }} @@ -433,6 +438,8 @@ client.DefaultRequestHeaders.Add("Authorization", $"Bearer {Environment.GetEnvir string ${windmillPathToCamelCaseName(path)} = await client.GetStringAsync(uri); `) + } else if (lang == 'nu') { + editor.insertAtCursor(`get_variable ${path}`) } sendUserToast(`${name} inserted at cursor`) }} @@ -515,6 +522,8 @@ client.DefaultRequestHeaders.Add("Authorization", $"Bearer {Environment.GetEnvir JsonNode ${windmillPathToCamelCaseName(path)} = JsonNode.Parse(await client.GetStringAsync(uri)); `) + } else if (lang == 'nu') { + editor.insertAtCursor(`get_resource ${path}`) } sendUserToast(`${path} inserted at cursor`) }} @@ -639,7 +648,7 @@ JsonNode ${windmillPathToCamelCaseName(path)} = JsonNode.Parse(await client.GetS {/if} {#if customUi?.assistants != false} - {#if lang == 'deno' || lang == 'python3' || lang == 'go' || lang == 'bash'} + {#if lang == 'deno' || lang == 'python3' || lang == 'go' || lang == 'bash' || lang == 'nu'} diff --git a/frontend/src/lib/components/ScriptEditor.svelte b/frontend/src/lib/components/ScriptEditor.svelte index f00347febe..2dacb88b8f 100644 --- a/frontend/src/lib/components/ScriptEditor.svelte +++ b/frontend/src/lib/components/ScriptEditor.svelte @@ -64,7 +64,7 @@ deno: false, go: false, ruff: false, - shellcheck: false + shellcheck: false, } const dispatch = createEventDispatcher() diff --git a/frontend/src/lib/components/WorkerGroup.svelte b/frontend/src/lib/components/WorkerGroup.svelte index a3dd1c0dce..55878d4928 100644 --- a/frontend/src/lib/components/WorkerGroup.svelte +++ b/frontend/src/lib/components/WorkerGroup.svelte @@ -122,7 +122,8 @@ 'php', 'rust', 'ansible', - 'csharp' + 'csharp', + 'nu' ] const nativeTags = [ 'nativets', diff --git a/frontend/src/lib/components/common/languageIcons/LanguageIcon.svelte b/frontend/src/lib/components/common/languageIcons/LanguageIcon.svelte index f3855adce0..1c75ce39ed 100644 --- a/frontend/src/lib/components/common/languageIcons/LanguageIcon.svelte +++ b/frontend/src/lib/components/common/languageIcons/LanguageIcon.svelte @@ -20,6 +20,7 @@ import RustIcon from '$lib/components/icons/RustIcon.svelte' import AnsibleIcon from '$lib/components/icons/AnsibleIcon.svelte' import CSharpIcon from '$lib/components/icons/CSharpIcon.svelte' + import NuIcon from '$lib/components/icons/NuIcon.svelte' export let lang: | SupportedLanguage @@ -54,7 +55,8 @@ php: 'PHP', rust: 'Rust', ansible: 'Ansible Playbook', - csharp: 'C#' + csharp: 'C#', + nu: 'Nu' } const langToComponent: Record< @@ -84,7 +86,8 @@ php: PHPIcon, rust: RustIcon, ansible: AnsibleIcon, - csharp: CSharpIcon + csharp: CSharpIcon, + nu: NuIcon } let subIconScale = width === 30 ? 0.6 : 0.8 diff --git a/frontend/src/lib/components/icons/NuIcon.svelte b/frontend/src/lib/components/icons/NuIcon.svelte new file mode 100644 index 0000000000..2af6655af8 --- /dev/null +++ b/frontend/src/lib/components/icons/NuIcon.svelte @@ -0,0 +1,6 @@ + + + diff --git a/frontend/src/lib/editorUtils.ts b/frontend/src/lib/editorUtils.ts index 33c54c4a0f..12ebc7f0b1 100644 --- a/frontend/src/lib/editorUtils.ts +++ b/frontend/src/lib/editorUtils.ts @@ -82,6 +82,8 @@ export function langToExt(lang: string): string { return 'yml' case 'csharp': return 'cs' + case 'nu': + return 'nu' default: return 'unknown' } diff --git a/frontend/src/lib/infer.ts b/frontend/src/lib/infer.ts index 0e1ab2bc77..4c0e55fa94 100644 --- a/frontend/src/lib/infer.ts +++ b/frontend/src/lib/infer.ts @@ -23,6 +23,7 @@ import initPhpParser, { parse_php } from 'windmill-parser-wasm-php' import initRustParser, { parse_rust } from 'windmill-parser-wasm-rust' import initYamlParser, { parse_ansible } from 'windmill-parser-wasm-yaml' import initCSharpParser, { parse_csharp } from 'windmill-parser-wasm-csharp' +import initNuParser, { parse_nu } from 'windmill-parser-wasm-nu' import wasmUrlTs from 'windmill-parser-wasm-ts/windmill_parser_wasm_bg.wasm?url' import wasmUrlRegex from 'windmill-parser-wasm-regex/windmill_parser_wasm_bg.wasm?url' @@ -32,6 +33,7 @@ import wasmUrlPhp from 'windmill-parser-wasm-php/windmill_parser_wasm_bg.wasm?ur import wasmUrlRust from 'windmill-parser-wasm-rust/windmill_parser_wasm_bg.wasm?url' import wasmUrlYaml from 'windmill-parser-wasm-yaml/windmill_parser_wasm_bg.wasm?url' import wasmUrlCSharp from 'windmill-parser-wasm-csharp/windmill_parser_wasm_bg.wasm?url' +import wasmUrlNu from 'windmill-parser-wasm-nu/windmill_parser_wasm_bg.wasm?url' import { workspaceStore } from './stores.js' import { argSigToJsonSchemaType } from './inferArgSig.js' @@ -66,6 +68,9 @@ async function initWasmYaml() { async function initWasmCSharp() { await initCSharpParser(wasmUrlCSharp) } +async function initWasmNu() { + await initNuParser(wasmUrlNu) +} export async function inferArgs( language: SupportedLanguage | 'bunnative' | undefined, @@ -178,6 +183,9 @@ export async function inferArgs( } else if (language == 'csharp') { await initWasmCSharp() inferedSchema = JSON.parse(parse_csharp(code)) + } else if (language == 'nu') { + await initWasmNu() + inferedSchema = JSON.parse(parse_nu(code)) } else { return null } diff --git a/frontend/src/lib/script_helpers.ts b/frontend/src/lib/script_helpers.ts index 1f1755a5a7..bdb5ce0870 100644 --- a/frontend/src/lib/script_helpers.ts +++ b/frontend/src/lib/script_helpers.ts @@ -414,6 +414,52 @@ class Script } ` +const NU_INIT_CODE = `use std assert + +# Nushell +# A new type of shell +def main [ + no_default: string, + name = "Nicolas Bourbaki", + age: int = 42, + date_of_birth?: datetime, + obj: record = {"records": "included"}, + l: list = ["or", "lists!"], + tables?: table, + enable_kill_mode?: bool = true, +] { + # Test + # https://www.nushell.sh/book/testing.html + assert ($age == 42) + + print $"Hello World and a warm welcome especially to ($name)" + print "and its acolytes.." $age $obj $l + print $tables + + let secret = try { + get_variable f/examples/secret + } catch { + 'No secret yet at f/examples/secret !' + }; + + print $"The variable at \`f/examples/secret\`: ($secret)" + # fetch context variables + let user = $env.WM_USERNAME + + # Nu pipelines + ls | where size > 1kb | sort-by modified | print "ls:" $in + + # Nu works with existing data + # Nu speaks JSON, YAML, SQLite, Excel, and more out of the box. + # It's easy to bring data into a Nu pipeline whether it's in a file, a database, or a web API: + let nu_license = http get https://api.github.com/repos/nushell/nushell | get license + + return { splitted: ($name | split words), user: $user, nu_license: $nu_license} + # Interested in learning more? + # https://www.nushell.sh/book/getting_started.html +} +` + const FETCH_INIT_CODE = `export async function main( url: string | undefined, method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'OPTIONS' = 'GET', @@ -974,6 +1020,9 @@ export const INITIAL_CODE = { csharp: { script: CSHARP_INIT_CODE }, + nu: { + script: NU_INIT_CODE + }, docker: { script: DOCKER_INIT_CODE }, @@ -1081,6 +1130,8 @@ export function initialCode( return INITIAL_CODE.ansible.script } else if (language == 'csharp') { return INITIAL_CODE.csharp.script + } else if (language == 'nu') { + return INITIAL_CODE.nu.script } else if (language == 'bun' || language == 'bunnative') { if (kind == 'trigger') { return INITIAL_CODE.bun.trigger diff --git a/frontend/src/lib/scripts.ts b/frontend/src/lib/scripts.ts index f1acf854cd..95c0869e36 100644 --- a/frontend/src/lib/scripts.ts +++ b/frontend/src/lib/scripts.ts @@ -43,6 +43,8 @@ export function scriptLangToEditorLang( return 'yaml' } else if (lang == 'csharp') { return 'csharp' + } else if (lang == 'nu') { + return 'nu' } else if (lang == undefined) { return 'typescript' } else { @@ -122,7 +124,8 @@ const scriptLanguagesArray: [SupportedLanguage | 'docker' | 'bunnative', string] ['rust', 'Rust'], ['ansible', 'Ansible Playbook'], ['csharp', 'C#'], - ['docker', 'Docker'] + ['docker', 'Docker'], + ['nu', 'Nu'] ] export function processLangs(selected: string | undefined, langs: string[]): string[] { if (selected === 'nativets') { @@ -131,7 +134,7 @@ export function processLangs(selected: string | undefined, langs: string[]): str let ls = langs.filter((lang) => lang !== 'nativets') //those languages are newer and may not be in the saved list - let nl = ['bunnative', 'rust', 'ansible', 'csharp'] + let nl = ['bunnative', 'rust', 'ansible', 'csharp', 'nu'] nl.forEach((lang) => { if (!ls.includes(lang)) { ls.push(lang) diff --git a/frontend/src/routes/(root)/(logged)/run/[...run]/+page.svelte b/frontend/src/routes/(root)/(logged)/run/[...run]/+page.svelte index 678c3c11eb..15251cf14f 100644 --- a/frontend/src/routes/(root)/(logged)/run/[...run]/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/run/[...run]/+page.svelte @@ -755,7 +755,7 @@ priority: {job.priority} {/if} - {#if job.tag && !['deno', 'python3', 'flow', 'other', 'go', 'postgresql', 'mysql', 'bigquery', 'snowflake', 'mssql', 'graphql', 'oracledb', 'nativets', 'bash', 'powershell', 'php', 'rust', 'other', 'ansible', 'csharp', 'dependency'].includes(job.tag)} + {#if job.tag && !['deno', 'python3', 'flow', 'other', 'go', 'postgresql', 'mysql', 'bigquery', 'snowflake', 'mssql', 'graphql', 'oracledb', 'nativets', 'bash', 'powershell', 'php', 'rust', 'other', 'ansible', 'csharp', 'dependency', 'nu'].includes(job.tag)}

diff --git a/lsp/dev.nu b/lsp/dev.nu new file mode 100755 index 0000000000..0beac3cfc1 --- /dev/null +++ b/lsp/dev.nu @@ -0,0 +1,21 @@ +#!/usr/bin/env nu +let tag = $"dev-lsp-(git branch --show-current)"; + +# Build docker image and start server on localhost:3001 +def main [ + --podman(-p) # Use podman + # TODO: + --detach(-d) # Run container in background and print container ID + ] { + if $podman { + podman build --tag $tag .; podman run -p 3001:3001 $tag + } else { + docker build --tag $tag .; docker run -p 3001:3001 $tag + } +} + +# Stop podman container +def "main stop" [] { + try { docker stop (docker ps -q --filter $"ancestor=($tag)") } + try { podman stop (podman ps -q --filter $"ancestor=($tag)") } +} diff --git a/lsp/pyls_launcher.py b/lsp/pyls_launcher.py index 93636b5786..614d47294e 100644 --- a/lsp/pyls_launcher.py +++ b/lsp/pyls_launcher.py @@ -71,33 +71,25 @@ class LanguageServerWebSocketHandler(websocket.WebSocketHandler): def check_origin(self, origin): return True - class PyrightLS(LanguageServerWebSocketHandler): procargs = ["pipenv", "run", "pyright-langserver", "--stdio"] - class DiagnosticLS(LanguageServerWebSocketHandler): procargs = ["diagnostic-languageserver", "--stdio", "--log-level", "4"] - class RuffLS(LanguageServerWebSocketHandler): procargs = ["ruff-lsp"] - class DenoLS(LanguageServerWebSocketHandler): procargs = ["deno", "lsp"] - - class GoLS(LanguageServerWebSocketHandler): procargs = ["gopls", "serve"] - class MainHandler(web.RequestHandler): def get(self): self.write("ok") - if __name__ == "__main__": monaco_path = "/tmp/monaco" os.makedirs(monaco_path, exist_ok=True) From 38ee0183aaa014c740da7b54d66928ec851fb522 Mon Sep 17 00:00:00 2001 From: wendrul <53628737+wendrul@users.noreply.github.com> Date: Thu, 20 Mar 2025 20:02:25 +0100 Subject: [PATCH 076/739] feat: unsafe parameters for sql queries (table names, column names) (#5488) * Make schema validation struct Schema Validation rules that are constructed from the schema or from the MainArgSig(TODO). * Make other validator builder * Fail dependency job like with lockfile failing for schema validator * Add last types + tests * Remove unused dependency * fix typos * Migration ID was colliding with another, changed it manually * Add Oneof + other fixes * fix: cache for querying scripts correclty handles ScriptMetadata * Add cache for schema validation from main arg sig * Prepare sqlx * Remove default features * Feature flags * WIP: unsafe sql params for sql langauges * Fix down migration table name * cleanup: put validation logic inside a function * Refactor to cache the should_validate boolean Changed the schemavalidators cache to take in an Option, effectively storing the `should_validate_schema` information. Also pass the schema when avaialble to construct the schema validator * Add other job kinds to u8 cache key just in case * Change sql languages to all get arguments as Values instead of RawValue * Only cache if not preview * Add last sql languages and some CI fixes * Rename after typo on `sanitized` * Finish rename * Remove unused import * Fix wrong test * Add newly published regex parser version * Remove default features from cargo.toml * Change to a cleaner syntax for the interpolated args * Update republished parser --- .../parsers/windmill-parser-sql/src/lib.rs | 102 +++++++++++++++++- .../windmill-worker/src/bigquery_executor.rs | 15 ++- backend/windmill-worker/src/lib.rs | 1 + backend/windmill-worker/src/mssql_executor.rs | 6 ++ backend/windmill-worker/src/mysql_executor.rs | 42 +++----- .../windmill-worker/src/oracledb_executor.rs | 70 ++++++------ backend/windmill-worker/src/pg_executor.rs | 7 +- .../src/sanitized_sql_params.rs | 97 +++++++++++++++++ .../windmill-worker/src/snowflake_executor.rs | 13 ++- frontend/package-lock.json | 8 +- frontend/package.json | 4 +- 11 files changed, 283 insertions(+), 82 deletions(-) create mode 100644 backend/windmill-worker/src/sanitized_sql_params.rs diff --git a/backend/parsers/windmill-parser-sql/src/lib.rs b/backend/parsers/windmill-parser-sql/src/lib.rs index f5ddb73151..5b9e1ddd6f 100644 --- a/backend/parsers/windmill-parser-sql/src/lib.rs +++ b/backend/parsers/windmill-parser-sql/src/lib.rs @@ -16,6 +16,9 @@ use std::{ }; pub use windmill_parser::{Arg, MainArgSignature, Typ}; +pub const SANITIZED_ENUM_STR: &str = "__sanitized_enum__"; +pub const SANITIZED_RAW_STRING_STR: &str = "__sanitized_raw_string__"; + pub fn parse_mysql_sig(code: &str) -> anyhow::Result { let parsed = parse_mysql_file(&code)?; if let Some(x) = parsed { @@ -147,7 +150,7 @@ lazy_static::lazy_static! { // -- $1 name (type) = default static ref RE_ARG_MYSQL: Regex = Regex::new(r#"(?m)^-- \? (\w+) \((\w+)\)(?: ?\= ?(.+))? *(?:\r|\n|$)"#).unwrap(); - pub static ref RE_ARG_MYSQL_NAMED: Regex = Regex::new(r#"(?m)^-- :([a-z_][a-z0-9_]*) \((\w+)\)(?: ?\= ?(.+))? *(?:\r|\n|$)"#).unwrap(); + pub static ref RE_ARG_MYSQL_NAMED: Regex = Regex::new(r#"(?m)^-- :([a-z_][a-z0-9_]*) \((\w+(?:\([\w, ]+\))?)\)(?: ?\= ?(.+))? *(?:\r|\n|$)"#).unwrap(); static ref RE_ARG_PGSQL: Regex = Regex::new(r#"(?m)^-- \$(\d+) (\w+)(?: ?\= ?(.+))? *(?:\r|\n|$)"#).unwrap(); @@ -159,6 +162,9 @@ lazy_static::lazy_static! { static ref RE_ARG_MSSQL: Regex = Regex::new(r#"(?m)^-- @(?:P|p)\d+ (\w+) \((\w+)\)(?: ?\= ?(.+))? *(?:\r|\n|$)"#).unwrap(); + // used for `unsafe` sql interpolation + // -- %%name%% (type) = default + static ref RE_ARG_SQL_INTERPOLATION: Regex = Regex::new(r#"(?m)^--\s*%%([a-z_][a-z0-9_]*)%%\s*([\s\w\/]+)?(?: ?\= ?(.+))? *(?:\r|\n|$)"#).unwrap(); } fn parsed_default(parsed_typ: &Typ, default: String) -> Option { @@ -225,9 +231,34 @@ fn parse_oracledb_file(code: &str) -> anyhow::Result>> { } } + args.append(&mut parse_sql_sanitized_interpolation(code)); Ok(Some(args)) } +fn parse_sql_sanitized_interpolation(code: &str) -> Vec { + let mut args: Vec = vec![]; + + for cap in RE_ARG_SQL_INTERPOLATION.captures_iter(code) { + let name = cap.get(1).map(|x| x.as_str().to_string()).unwrap(); + let typ = cap.get(2).map(|x| x.as_str()); + let default = cap.get(3).map(|x| x.as_str().to_string()); + let has_default = default.is_some(); + let (parsed_typ, otyp) = parse_unsafe_typ(typ); + + let parsed_default = default.and_then(|x| parsed_default(&parsed_typ, x)); + args.push(Arg { + name, + typ: parsed_typ, + default: parsed_default, + otyp: Some(otyp.to_string()), + has_default, + oidx: None, + }); + } + + args +} + fn parse_mysql_file(code: &str) -> anyhow::Result>> { let mut args: Vec = vec![]; @@ -279,6 +310,7 @@ fn parse_mysql_file(code: &str) -> anyhow::Result>> { } } + args.append(&mut parse_sql_sanitized_interpolation(code)); Ok(Some(args)) } @@ -431,6 +463,7 @@ fn parse_pg_file(code: &str) -> anyhow::Result>> { } } + args.append(&mut parse_sql_sanitized_interpolation(code)); Ok(Some(args)) } @@ -485,6 +518,7 @@ fn parse_bigquery_file(code: &str) -> anyhow::Result>> { }); } + args.append(&mut parse_sql_sanitized_interpolation(code)); Ok(Some(args)) } @@ -513,6 +547,7 @@ fn parse_snowflake_file(code: &str) -> anyhow::Result>> { }); } + args.append(&mut parse_sql_sanitized_interpolation(code)); Ok(Some(args)) } @@ -541,9 +576,25 @@ fn parse_mssql_file(code: &str) -> anyhow::Result>> { }); } + args.append(&mut parse_sql_sanitized_interpolation(code)); Ok(Some(args)) } +fn parse_unsafe_typ(typ: Option<&str>) -> (Typ, &'static str) { + match typ { + Some(s) => { + let variants = s + .split("/") + .map(|x| x.trim().to_string()) + .filter(|x| !x.is_empty()) + .collect(); + + (Typ::Str(Some(variants)), SANITIZED_ENUM_STR) + } + None => (Typ::Str(None), SANITIZED_RAW_STRING_STR), + } +} + pub fn parse_mysql_typ(typ: &str) -> Typ { match typ { "varchar" | "char" | "binary" | "varbinary" | "blob" | "text" | "enum" | "set" => { @@ -1048,6 +1099,55 @@ SELECT @P2; } ); + Ok(()) + } + #[test] + fn test_parse_oracledb_sig() -> anyhow::Result<()> { + let code = r#" +-- :name1 (int) = 3 +-- :name2 (text) +-- :name4 (text) +SELECT :name, :name2; +SELECT * FROM table_name WHERE thing = :name4; +"#; + + println!("{:#?}", parse_oracledb_sig(code)?); + assert_eq!( + parse_oracledb_sig(code)?, + MainArgSignature { + star_args: false, + star_kwargs: false, + args: vec![ + Arg { + otyp: Some("int".to_string()), + name: "name1".to_string(), + typ: Typ::Int, + default: Some(json!(3)), + has_default: true, + oidx: None, + }, + Arg { + otyp: Some("text".to_string()), + name: "name2".to_string(), + typ: Typ::Str(None), + default: None, + has_default: false, + oidx: None, + }, + Arg { + otyp: Some("text".to_string()), + name: "name4".to_string(), + typ: Typ::Str(None), + default: None, + has_default: false, + oidx: None, + }, + ], + no_main_func: None, + has_preprocessor: None + } + ); + Ok(()) } } diff --git a/backend/windmill-worker/src/bigquery_executor.rs b/backend/windmill-worker/src/bigquery_executor.rs index 6c3b9337fd..b6367c8529 100644 --- a/backend/windmill-worker/src/bigquery_executor.rs +++ b/backend/windmill-worker/src/bigquery_executor.rs @@ -15,6 +15,7 @@ use serde::Deserialize; use crate::common::{build_http_client, OccupancyMetrics}; use crate::handle_child::run_future_with_polling_update_job_poller; +use crate::sanitized_sql_params::sanitize_and_interpolate_unsafe_sql_args; use crate::{ common::{build_args_values, resolve_job_timeout}, AuthedClientBackgroundTask, @@ -262,15 +263,21 @@ pub async fn do_bigquery( .await .map_err(|e| Error::ExecutionErr(e.to_string()))?; - let queries = parse_sql_blocks(query); - - let mut statement_values: HashMap = HashMap::new(); - let sig = parse_bigquery_sig(&query) .map_err(|x| Error::ExecutionErr(x.to_string()))? .args; + let (query, args_to_skip) = &sanitize_and_interpolate_unsafe_sql_args(query, &sig, &bigquery_args)?; + + let queries = parse_sql_blocks(query); + + let mut statement_values: HashMap = HashMap::new(); + + for arg in &sig { + if args_to_skip.contains(&arg.name) { + continue; + } let arg_t = arg.otyp.clone().unwrap_or_else(|| "string".to_string()); let arg_n = arg.clone().name; let arg_v = bigquery_args.get(&arg.name).cloned().unwrap_or(json!("")); diff --git a/backend/windmill-worker/src/lib.rs b/backend/windmill-worker/src/lib.rs index 4ae83309da..ba47fd81fc 100644 --- a/backend/windmill-worker/src/lib.rs +++ b/backend/windmill-worker/src/lib.rs @@ -43,6 +43,7 @@ mod rust_executor; mod worker; mod worker_flow; mod worker_lockfiles; +mod sanitized_sql_params; mod schema; pub use worker::*; diff --git a/backend/windmill-worker/src/mssql_executor.rs b/backend/windmill-worker/src/mssql_executor.rs index a033d1eff1..ef06c8f0bf 100644 --- a/backend/windmill-worker/src/mssql_executor.rs +++ b/backend/windmill-worker/src/mssql_executor.rs @@ -17,6 +17,7 @@ use windmill_queue::{append_logs, CanceledBy}; use crate::common::{build_args_values, OccupancyMetrics}; use crate::handle_child::run_future_with_polling_update_job_poller; +use crate::sanitized_sql_params::sanitize_and_interpolate_unsafe_sql_args; use crate::AuthedClientBackgroundTask; #[derive(Deserialize)] @@ -132,8 +133,13 @@ pub async fn do_mssql( .map_err(|x| Error::ExecutionErr(x.to_string()))? .args; + let (query, args_to_skip) = &sanitize_and_interpolate_unsafe_sql_args(query, &sig, &mssql_args)?; + let mut prepared_query = Query::new(query.to_owned()); for arg in &sig { + if args_to_skip.contains(&arg.name) { + continue; + } let arg_t = arg.otyp.clone().unwrap_or_else(|| "string".to_string()); let arg_v = mssql_args .get(&arg.name) diff --git a/backend/windmill-worker/src/mysql_executor.rs b/backend/windmill-worker/src/mysql_executor.rs index 80c41f21c3..ca8fa1a5c9 100644 --- a/backend/windmill-worker/src/mysql_executor.rs +++ b/backend/windmill-worker/src/mysql_executor.rs @@ -8,7 +8,6 @@ use mysql_async::{ }; use serde::{Deserialize, Serialize}; use serde_json::{json, value::RawValue, Value}; -use sqlx::types::Json; use tokio::sync::Mutex; use windmill_common::{ error::{to_anyhow, Error}, @@ -22,9 +21,7 @@ use windmill_queue::CanceledBy; use windmill_queue::MiniPulledJob; use crate::{ - common::{build_args_map, OccupancyMetrics}, - handle_child::run_future_with_polling_update_job_poller, - AuthedClientBackgroundTask, + common::{build_args_values, OccupancyMetrics}, handle_child::run_future_with_polling_update_job_poller, sanitized_sql_params::sanitize_and_interpolate_unsafe_sql_args, AuthedClientBackgroundTask }; #[derive(Deserialize)] @@ -113,36 +110,25 @@ pub async fn do_mysql( column_order: &mut Option>, occupancy_metrics: &mut OccupancyMetrics, ) -> windmill_common::error::Result> { - let args = build_args_map(job, client, db).await?.map(Json); - let job_args = if args.is_some() { - args.as_ref() - } else { - job.args.as_ref() - }; + let job_args = build_args_values(job, client, db).await?; let inline_db_res_path = parse_db_resource(&query); let db_arg = if let Some(inline_db_res_path) = inline_db_res_path { - let val = client + Some(client .get_authed() .await .get_resource_value_interpolated::( &inline_db_res_path, Some(job.id.to_string()), ) - .await?; - - let as_raw = serde_json::from_value(val).map_err(|e| { - Error::internal_err(format!("Error while parsing inline resource: {e:#}")) - })?; - - Some(as_raw) + .await?) } else { - job_args.and_then(|x| x.get("database").cloned()) + job_args.get("database").cloned() }; let database = if let Some(db) = db_arg { - serde_json::from_str::(db.get()) + serde_json::from_value::(db) .map_err(|e| Error::ExecutionErr(e.to_string()))? } else { return Err(Error::BadRequest("Missing database argument".to_string())); @@ -171,6 +157,8 @@ pub async fn do_mysql( .map_err(|x| Error::ExecutionErr(x.to_string()))? .args; + let (query, args_to_skip) = &sanitize_and_interpolate_unsafe_sql_args(query, &sig, &job_args)?; + let using_named_params = RE_ARG_MYSQL_NAMED.captures_iter(query).count() > 0; let mut statement_values: Params = match using_named_params { @@ -178,18 +166,16 @@ pub async fn do_mysql( false => Params::Positional(vec![]), }; for arg in &sig { + if args_to_skip.contains(&arg.name) { + continue; + } let arg_t = arg.otyp.clone().unwrap_or_else(|| "text".to_string()); let arg_n = arg.name.clone(); - let mysql_v = match job_args - .and_then(|x| { - x.get(arg.name.as_str()) - .map(|x| serde_json::from_str::(x.get()).ok()) - }) - .flatten() - .unwrap_or_else(|| json!(null)) + let mysql_v = match job_args.get(arg.name.as_str()) + .unwrap_or_else(|| &json!(null)) { Value::Null => mysql_async::Value::NULL, - Value::Bool(b) => mysql_async::Value::Int(if b { 1 } else { 0 }), + Value::Bool(b) => mysql_async::Value::Int(if *b { 1 } else { 0 }), Value::String(s) if arg_t == "timestamp" || arg_t == "datetime" diff --git a/backend/windmill-worker/src/oracledb_executor.rs b/backend/windmill-worker/src/oracledb_executor.rs index 3127659b02..7f340b8525 100644 --- a/backend/windmill-worker/src/oracledb_executor.rs +++ b/backend/windmill-worker/src/oracledb_executor.rs @@ -8,7 +8,6 @@ use itertools::Itertools; use oracle::sql_type::{InnerValue, OracleType, ToSql}; use serde::{Deserialize, Serialize}; use serde_json::{json, value::RawValue, Value}; -use sqlx::types::Json; use windmill_common::{ error::{to_anyhow, Error}, worker::to_raw_value, @@ -21,8 +20,9 @@ use windmill_parser_sql::{ use windmill_queue::CanceledBy; use crate::{ - common::{build_args_map, check_executor_binary_exists, OccupancyMetrics}, + common::{build_args_values, check_executor_binary_exists, OccupancyMetrics}, handle_child::run_future_with_polling_update_job_poller, + sanitized_sql_params::sanitize_and_interpolate_unsafe_sql_args, AuthedClientBackgroundTask, }; @@ -221,24 +221,23 @@ fn convert_oracledb_value_to_json(v: &oracle::SqlValue, c: &OracleType) -> serde fn get_statement_values( sig: Vec, - job_args: Option<&Json>>>, + job_args: &HashMap, + args_to_skip: &Vec, ) -> (Vec<(String, Box)>, Vec) { let mut statement_values = vec![]; let mut errors = vec![]; for arg in &sig { + if args_to_skip.contains(&arg.name) { + continue; + } let arg_t = arg.otyp.clone().unwrap_or_else(|| "text".to_string()); let arg_n = arg.name.clone(); - let oracle_v: Box = match job_args - .and_then(|x| { - x.get(arg.name.as_str()) - .map(|x| serde_json::from_str::(x.get()).ok()) - }) - .flatten() - .unwrap_or_else(|| json!(null)) + let oracle_v: Box = match job_args.get(arg.name.as_str()) + .unwrap_or_else(|| &json!(null)) { // Value::Null => todo!(), - Value::Bool(b) => Box::new(b), + Value::Bool(b) => Box::new(*b), Value::String(s) if arg_t == "timestamp" || arg_t == "datetime" @@ -248,10 +247,10 @@ fn get_statement_values( if let Ok(d) = chrono::DateTime::::from_str(s.as_str()) { Box::new(d) } else { - Box::new(s) + Box::new(s.clone()) } } - Value::String(s) => Box::new(s), + Value::String(s) => Box::new(s.clone()), Value::Number(n) if n.is_i64() && (arg_t == "int" @@ -309,36 +308,27 @@ pub async fn do_oracledb( "Oracle Database", )?; - let args = build_args_map(job, client, db).await?.map(Json); - let job_args = if args.is_some() { - args.as_ref() - } else { - job.args.as_ref() - }; + let job_args = build_args_values(job, client, db).await?; let inline_db_res_path = parse_db_resource(&query); let db_arg = if let Some(inline_db_res_path) = inline_db_res_path { - let val = client - .get_authed() - .await - .get_resource_value_interpolated::( - &inline_db_res_path, - Some(job.id.to_string()), - ) - .await?; - - let as_raw = serde_json::from_value(val).map_err(|e| { - Error::internal_err(format!("Error while parsing inline resource: {e:#}")) - })?; - - Some(as_raw) + Some( + client + .get_authed() + .await + .get_resource_value_interpolated::( + &inline_db_res_path, + Some(job.id.to_string()), + ) + .await?, + ) } else { - job_args.and_then(|x| x.get("database").cloned()) + job_args.get("database").cloned() }; let database = if let Some(db) = db_arg { - serde_json::from_str::(db.get()) + serde_json::from_value::(db) .map_err(|e| Error::ExecutionErr(e.to_string()))? } else { return Err(Error::BadRequest("Missing database argument".to_string())); @@ -350,7 +340,9 @@ pub async fn do_oracledb( .map_err(|x| Error::ExecutionErr(x.to_string()))? .args; - let (statement_values, errors) = get_statement_values(sig.clone(), job_args); + let (query, args_to_skip) = sanitize_and_interpolate_unsafe_sql_args(query, &sig, &job_args)?; + + let (statement_values, errors) = get_statement_values(sig.clone(), &job_args, &args_to_skip); if !errors.is_empty() { return Err(Error::ExecutionErr(errors.join("\n"))); @@ -372,13 +364,13 @@ pub async fn do_oracledb( let conn_a = Arc::new(std::sync::Mutex::new(conn)); - let queries = parse_sql_blocks(query); + let queries = parse_sql_blocks(&query); let result_f = if queries.len() > 1 { let f = async { let mut res: Vec> = vec![]; for (i, q) in queries.iter().enumerate() { - let (vals, _) = get_statement_values(sig.clone(), job_args); + let (vals, _) = get_statement_values(sig.clone(), &job_args, &args_to_skip); let r = do_oracledb_inner( q, vals, @@ -399,7 +391,7 @@ pub async fn do_oracledb( f.boxed() } else { - do_oracledb_inner(query, statement_values, conn_a, Some(column_order), false)? + do_oracledb_inner(&query, statement_values, conn_a, Some(column_order), false)? }; let result = run_future_with_polling_update_job_poller( diff --git a/backend/windmill-worker/src/pg_executor.rs b/backend/windmill-worker/src/pg_executor.rs index 645d7ff09f..2847389ca7 100644 --- a/backend/windmill-worker/src/pg_executor.rs +++ b/backend/windmill-worker/src/pg_executor.rs @@ -36,6 +36,7 @@ use windmill_queue::{CanceledBy, MiniPulledJob}; use crate::common::{build_args_values, sizeof_val, OccupancyMetrics}; use crate::handle_child::run_future_with_polling_update_job_poller; +use crate::sanitized_sql_params::sanitize_and_interpolate_unsafe_sql_args; use crate::{AuthedClientBackgroundTask, MAX_RESULT_SIZE}; use bytes::Buf; use lazy_static::lazy_static; @@ -290,6 +291,11 @@ pub async fn do_postgresql( (Some((client, handle)), None) }; + let sig = parse_pgsql_sig(&query).map_err(|x| Error::ExecutionErr(x.to_string()))?; + + let (query, _) = + &sanitize_and_interpolate_unsafe_sql_args(query, &sig.args, &pg_args)?; + let queries = parse_sql_blocks(query); let (client, handle) = if let Some((client, handle)) = new_client.as_ref() { @@ -299,7 +305,6 @@ pub async fn do_postgresql( (client, None) }; - let sig = parse_pgsql_sig(&query).map_err(|x| Error::ExecutionErr(x.to_string()))?; let param_idx_to_arg_and_value = sig .args .iter() diff --git a/backend/windmill-worker/src/sanitized_sql_params.rs b/backend/windmill-worker/src/sanitized_sql_params.rs new file mode 100644 index 0000000000..c7eb3b6ef4 --- /dev/null +++ b/backend/windmill-worker/src/sanitized_sql_params.rs @@ -0,0 +1,97 @@ +use anyhow::anyhow; +use std::collections::HashMap; + +use serde_json::Value; +use windmill_common::error; +use windmill_parser::Arg; +use windmill_parser_sql::{SANITIZED_ENUM_STR, SANITIZED_RAW_STRING_STR}; + +/// Identifier must be a continuous ASCII alphanumeric word, not starting with +/// a number, that can contain underscores +fn sanitize_identifier(arg: &Arg, input: &str) -> Result<(), error::Error> { + if input.is_empty() { + return Err(error::Error::BadRequest(format!("Interpolated argument `{}` cannot be empty", arg.name))); + } + if input + .chars() + .next() + .map(|c| c.is_ascii_alphabetic()) + .unwrap_or(false) + && input.chars().all(|c| c.is_ascii_alphanumeric() || c == '_') + { + Ok(()) + } else { + Err(error::Error::BadRequest(format!("Interpolated argument `{}` contained forbidden characters. Received `{}` but should only contain alphanumerical characters and `_`.", arg.name, input))) + } +} + +pub fn sanitize_and_interpolate_unsafe_sql_args( + code: &str, + args: &Vec, + args_map: &HashMap, +) -> Result<(String, Vec), error::Error> { + let mut ret = code.to_string(); + let mut args_to_skip = vec![]; + + for arg in args { + if let Some(typ) = &arg.otyp { + let pattern = format!("%%{}%%", arg.name); + match typ.as_str() { + SANITIZED_ENUM_STR => { + let replace = + args_map + .get(&arg.name) + .and_then(|rv| rv.as_str()) + .ok_or(anyhow!( + "Sanitized enum `{}` needs to receive a string", + arg.name + ))?; + let windmill_parser::Typ::Str(Some(variants)) = &arg.typ else { + return Err(error::Error::ArgumentErr(format!( + "Wrong type of argument for sanitized enum `{}`", + arg.name + ))); + }; + if variants.iter().all(|v| v != replace) { + return Err(error::Error::ArgumentErr(format!( + "Sanitized enum argument `{}` expected one of `[{}]` but received `{}`", + arg.name, + variants + .iter() + .map(|s| format!("{s}")) + .collect::>() + .join(","), + replace, + ))); + } + + sanitize_identifier(&arg, replace)?; + ret = ret.replace(&pattern, replace); + args_to_skip.push(arg.name.to_string()); + } + SANITIZED_RAW_STRING_STR => { + let replace = + args_map + .get(&arg.name) + .and_then(|rv| rv.as_str()) + .ok_or(anyhow!( + "Sanitized raw string `{}` needs to receive a string", + arg.name + ))?; + let windmill_parser::Typ::Str(_) = &arg.typ else { + return Err(error::Error::ArgumentErr(format!( + "Wrong type of argument for sanitized raw string `{}`", + arg.name + ))); + }; + sanitize_identifier(&arg, replace)?; + ret = ret.replace(&pattern, &replace); + args_to_skip.push(arg.name.to_string()); + } + _ => continue, + } + } + } + + Ok((ret, args_to_skip)) +} diff --git a/backend/windmill-worker/src/snowflake_executor.rs b/backend/windmill-worker/src/snowflake_executor.rs index 7090c114e8..30f1188ce0 100644 --- a/backend/windmill-worker/src/snowflake_executor.rs +++ b/backend/windmill-worker/src/snowflake_executor.rs @@ -18,6 +18,7 @@ use serde::{Deserialize, Serialize}; use crate::common::{build_http_client, resolve_job_timeout, OccupancyMetrics}; use crate::handle_child::run_future_with_polling_update_job_poller; +use crate::sanitized_sql_params::sanitize_and_interpolate_unsafe_sql_args; use crate::{common::build_args_values, AuthedClientBackgroundTask}; #[derive(Serialize)] @@ -123,15 +124,21 @@ fn do_snowflake_inner<'a>( skip_collect: bool, http_client: &'a Client, ) -> windmill_common::error::Result>>> { - body.insert("statement".to_string(), json!(query)); - - let mut bindings = serde_json::Map::new(); let sig = parse_snowflake_sig(&query) .map_err(|x| Error::ExecutionErr(x.to_string()))? .args; + let (query, args_to_skip) = &sanitize_and_interpolate_unsafe_sql_args(query, &sig, &job_args)?; + + body.insert("statement".to_string(), json!(query)); + + let mut bindings = serde_json::Map::new(); + let mut i = 1; for arg in &sig { + if args_to_skip.contains(&arg.name) { + continue; + } let arg_t = arg.otyp.clone().unwrap_or_else(|| "string".to_string()); let arg_v = job_args.get(&arg.name).cloned().unwrap_or(json!("")); let snowflake_v = convert_typ_val(arg_t, arg_v); diff --git a/frontend/package-lock.json b/frontend/package-lock.json index cece7518b1..819d7a117e 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -72,7 +72,7 @@ "windmill-parser-wasm-nu": "^1.474.1", "windmill-parser-wasm-php": "^1.429.0", "windmill-parser-wasm-py": "^1.477.1", - "windmill-parser-wasm-regex": "^1.439.0", + "windmill-parser-wasm-regex": "^1.478.2", "windmill-parser-wasm-rust": "^1.429.0", "windmill-parser-wasm-ts": "^1.429.0", "windmill-parser-wasm-yaml": "^1.429.0", @@ -12605,9 +12605,9 @@ "integrity": "sha512-EY3mSMWpqFPzd7fsLg2/hSfQFU8HpW9nplFwm4JHHCDbcTpBzlvzjPJoHAAGO5kMzowAxjqi5ai/mXjeUWuiSg==" }, "node_modules/windmill-parser-wasm-regex": { - "version": "1.439.0", - "resolved": "https://registry.npmjs.org/windmill-parser-wasm-regex/-/windmill-parser-wasm-regex-1.439.0.tgz", - "integrity": "sha512-v7vcEOWurGbqvoTdtQ8wauyUYeuQExRCmr7phPtwUwD+1cNbqDrS11kM8p2Na3DXjL9RqGAGjd6uRjNSccZjjQ==" + "version": "1.478.2", + "resolved": "https://registry.npmjs.org/windmill-parser-wasm-regex/-/windmill-parser-wasm-regex-1.478.2.tgz", + "integrity": "sha512-XXYOzCePuHBEdiTREF+UlRGDyUu5VVXD9RBb5JGiq9YkjKhKek0CkjSt8HhJ0yAu0i/gvWLOO0RboT2C04Qt1A==" }, "node_modules/windmill-parser-wasm-rust": { "version": "1.429.0", diff --git a/frontend/package.json b/frontend/package.json index d6135d7613..6356634a93 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -147,7 +147,7 @@ "windmill-parser-wasm-nu": "^1.474.1", "windmill-parser-wasm-php": "^1.429.0", "windmill-parser-wasm-py": "^1.477.1", - "windmill-parser-wasm-regex": "^1.439.0", + "windmill-parser-wasm-regex": "^1.478.2", "windmill-parser-wasm-rust": "^1.429.0", "windmill-parser-wasm-ts": "^1.429.0", "windmill-parser-wasm-yaml": "^1.429.0", @@ -515,4 +515,4 @@ "optionalDependencies": { "fsevents": "^2.3.3" } -} \ No newline at end of file +} From f3c32c236f471f23df1a3a0fb0a1b67090f9f7db Mon Sep 17 00:00:00 2001 From: Alexander Petric Date: Thu, 20 Mar 2025 14:28:15 -0600 Subject: [PATCH 077/739] fix win build (#5494) * add sysinfoapi feature flag for winapi dependency * add ff * add ff at the right place --- backend/Cargo.lock | 1 + backend/Cargo.toml | 5 ++++- backend/windmill-worker/Cargo.toml | 6 ++++-- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/backend/Cargo.lock b/backend/Cargo.lock index eb243435c9..a5eb9a0965 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -14706,6 +14706,7 @@ dependencies = [ "tracing", "urlencoding", "uuid 1.16.0", + "winapi", "windmill-audit", "windmill-common", "windmill-git-sync", diff --git a/backend/Cargo.toml b/backend/Cargo.toml index d69ba61f7f..f07ef205fb 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -138,7 +138,6 @@ windmill-api-client.workspace = true deno_core = { workspace = true, features = ["include_js_files_for_snapshotting", "unsafe_use_unprotected_platform"] } - [workspace.dependencies] windmill-api = { path = "./windmill-api", default-features = false } windmill-queue = { path = "./windmill-queue" } @@ -232,6 +231,10 @@ deno_runtime = { version = "0.198.0", features = ["transpile"] } deno_telemetry = "0.12.0" deno_error = "=0.5.5" +# TODO: remove once deno fixes the issue on their end +# https://github.com/denoland/deno/issues/28557 +winapi = { version = "0.3.9", features = ["sysinfoapi"] } + swc_common = "=0.37.5" swc_ecma_parser = "=0.149.1" swc_ecma_ast = "=0.118.2" diff --git a/backend/windmill-worker/Cargo.toml b/backend/windmill-worker/Cargo.toml index f216dab35b..291e92c2df 100644 --- a/backend/windmill-worker/Cargo.toml +++ b/backend/windmill-worker/Cargo.toml @@ -20,7 +20,7 @@ flow_testing = [] cloud = [] sqlx = [] deno_core = ["dep:deno_fetch", "dep:deno_webidl", "dep:deno_web", "dep:deno_net", "dep:deno_console", "dep:deno_url", "dep:deno_core", - "dep:deno_ast", "dep:deno_tls", "dep:deno_permissions", "dep:deno_io", "dep:deno_runtime", "dep:deno_telemetry", "dep:deno_error"] + "dep:deno_ast", "dep:deno_tls", "dep:deno_permissions", "dep:deno_io", "dep:deno_runtime", "dep:deno_telemetry", "dep:deno_error", "dep:winapi"] otel = ["windmill-common/otel", "dep:opentelemetry"] dind = ["dep:bollard"] php = ["dep:windmill-parser-php"] @@ -107,6 +107,7 @@ object_store = { workspace = true, optional = true} convert_case.workspace = true yaml-rust.workspace = true backon.workspace = true +winapi = { workspace = true, optional = true } opentelemetry = { workspace = true, optional = true } bollard = { workspace = true, optional = true } @@ -125,4 +126,5 @@ deno_tls = { workspace = true, optional = true } deno_permissions = { workspace = true, optional = true } deno_io = { workspace = true, optional = true } deno_runtime = { workspace = true, optional = true } -deno_telemetry = { workspace = true, optional = true } \ No newline at end of file +deno_telemetry = { workspace = true, optional = true } +winapi = { workspace = true, optional = true } \ No newline at end of file From e16d6299f52564def484e78fb2f48e9bf39cbd3d Mon Sep 17 00:00:00 2001 From: HugoCasa Date: Fri, 21 Mar 2025 00:00:10 +0100 Subject: [PATCH 078/739] fix(frontend): use stable path for capture tables + nits (#5495) --- .../src/lib/components/FlowPreviewContent.svelte | 4 +++- .../lib/components/SchemaFormWithArgPicker.svelte | 3 ++- frontend/src/lib/components/ScriptBuilder.svelte | 5 +++-- frontend/src/lib/components/ScriptEditor.svelte | 8 +++++--- .../InlineScriptEditorDrawer.svelte | 1 + .../lib/components/flows/content/FlowInput.svelte | 12 +++++++++--- .../flows/content/ScriptEditorDrawer.svelte | 2 +- .../src/lib/components/triggers/CaptureButton.svelte | 2 +- 8 files changed, 25 insertions(+), 12 deletions(-) diff --git a/frontend/src/lib/components/FlowPreviewContent.svelte b/frontend/src/lib/components/FlowPreviewContent.svelte index e9cba15af9..99c180d0a6 100644 --- a/frontend/src/lib/components/FlowPreviewContent.svelte +++ b/frontend/src/lib/components/FlowPreviewContent.svelte @@ -52,6 +52,7 @@ flowStore, pathStore, initialPathStore, + fakeInitialPath, customUi, executionCount } = getContext('FlowEditorContext') @@ -373,7 +374,8 @@
{ dispatch('select', { payload: e.detail, type: 'captures' }) }} diff --git a/frontend/src/lib/components/ScriptBuilder.svelte b/frontend/src/lib/components/ScriptBuilder.svelte index 1dcf21bbdc..93f40cc104 100644 --- a/frontend/src/lib/components/ScriptBuilder.svelte +++ b/frontend/src/lib/components/ScriptBuilder.svelte @@ -109,9 +109,9 @@ } // used for new scripts for captures - let fakeInitialPath = + const fakeInitialPath = 'u/' + - ($userStore?.username?.includes('@') + ($userStore!.username?.includes('@') ? $userStore!.username.split('@')[0].replace(/[^a-zA-Z0-9_]/g, '') : $userStore!.username!) + '/' + @@ -1625,6 +1625,7 @@ bind:this={scriptEditor} bind:schema={script.schema} path={script.path} + stablePathForCaptures={initialPath || fakeInitialPath} bind:code={script.content} lang={script.language} {initialArgs} diff --git a/frontend/src/lib/components/ScriptEditor.svelte b/frontend/src/lib/components/ScriptEditor.svelte index 2dacb88b8f..a7ab798684 100644 --- a/frontend/src/lib/components/ScriptEditor.svelte +++ b/frontend/src/lib/components/ScriptEditor.svelte @@ -56,6 +56,8 @@ export let selectedTab: 'main' | 'preprocessor' = 'main' export let hasPreprocessor = false export let captureTable: CaptureTable | undefined = undefined + export let showCaptures: boolean = true + export let stablePathForCaptures: string = '' let jobProgressReset: () => void @@ -64,7 +66,7 @@ deno: false, go: false, ruff: false, - shellcheck: false, + shellcheck: false } const dispatch = createEventDispatcher() @@ -495,7 +497,7 @@ {editor} {diffEditor} {args} - showCaptures={true} + {showCaptures} customUi={customUi?.previewPanel} > {#if scriptProgress} @@ -514,7 +516,7 @@ {hasPreprocessor} canHavePreprocessor={lang === 'bun' || lang === 'deno' || lang === 'python3'} isFlow={false} - path={path ?? ''} + path={stablePathForCaptures} canEdit={true} on:applyArgs on:updateSchema diff --git a/frontend/src/lib/components/apps/editor/inlineScriptsPanel/InlineScriptEditorDrawer.svelte b/frontend/src/lib/components/apps/editor/inlineScriptsPanel/InlineScriptEditorDrawer.svelte index a4a15ec34c..6b59a972c2 100644 --- a/frontend/src/lib/components/apps/editor/inlineScriptsPanel/InlineScriptEditorDrawer.svelte +++ b/frontend/src/lib/components/apps/editor/inlineScriptsPanel/InlineScriptEditorDrawer.svelte @@ -27,6 +27,7 @@ > {#if inlineScript && inlineScript.language != 'frontend'} ('FlowEditorContext') + const { + flowStore, + previewArgs, + pathStore, + initialPathStore, + fakeInitialPath, + flowInputEditorState + } = getContext('FlowEditorContext') let addProperty: AddPropertyV2 | undefined = undefined let previewSchema: Record | undefined = undefined @@ -505,7 +511,7 @@
{ updatePreviewSchemaAndArgs(e.detail ?? undefined) }} diff --git a/frontend/src/lib/components/flows/content/ScriptEditorDrawer.svelte b/frontend/src/lib/components/flows/content/ScriptEditorDrawer.svelte index fc436571d1..ff61d83618 100644 --- a/frontend/src/lib/components/flows/content/ScriptEditorDrawer.svelte +++ b/frontend/src/lib/components/flows/content/ScriptEditorDrawer.svelte @@ -129,7 +129,6 @@ } - { saveScript() }} diff --git a/frontend/src/lib/components/triggers/CaptureButton.svelte b/frontend/src/lib/components/triggers/CaptureButton.svelte index 3925c916ab..bfa34cf908 100644 --- a/frontend/src/lib/components/triggers/CaptureButton.svelte +++ b/frontend/src/lib/components/triggers/CaptureButton.svelte @@ -94,7 +94,7 @@ {:else} - {:else} - - {/if} -
- - - - - { - loadVariables() - }} - /> - - - -
- - Workspace + + +
+ {#if tab == 'contextual' && ($userStore?.is_admin || $userStore?.is_super_admin)} + + {:else} + + {/if}
- - -
- - Contextual - - Contextual variables are passed as environment variables when running a script and depends - on the execution context. - -
-
- - {#if tab == 'workspace'} -
- -
-
- -
-
- {#if !filteredItems} - - {#each new Array(3) as _} - - {/each} - {:else if filteredItems.length == 0} -
-
No variables found
-
- Try changing the filters or creating a new variable -
+ + + + + { + loadVariables() + }} + /> + + + +
+ + Workspace
- {:else} - - - - - Path - Value - Description - - - - - - {#each filteredItems as { path, value, is_secret, description, extra_perms, canWrite, account, is_refreshed, is_expired, refresh_error, is_linked, marked }} - - - - - -
variableEditor.editVariable(path)} - href="#{path}" - > - {#if marked} - {@html marked} - {:else} - {path} - {/if} - - - - -
- {#if value} - {truncate(value, 20)} - {:else} - ∗∗∗∗ - {/if} -
- {#if is_secret} - - - This item is secret - - {/if} -
-
- - {truncate(description ?? '', 50)} - - - -
- {#if is_linked} - - -
- This variable is linked with a resource of the same path. They are deleted - and renamed together. -
-
- {/if} - {#if account} - - -
- This OAuth token will be kept up-to-date in the background by Windmill - using its refresh token -
-
- {/if} - - {#if is_refreshed} -
- {#if refresh_error} - -
- - -
- -
- Latest exchange of the refresh token did not succeed. Error: {refresh_error} -
-
- {:else if is_expired} - - -
- The access_token is expired, it will get renewed the next time this - variable is fetched or you can request is to be refreshed in the - dropdown on the right. -
-
- {:else} - - -
- The variable was connected through OAuth and the token is not expired. -
-
- {/if} -
- {/if} -
-
- - { - let owner = isOwner(path, $userStore, $workspaceStore) - return [ - { - displayName: 'Edit', - icon: Pen, - action: () => variableEditor.editVariable(path), - disabled: !canWrite - }, - { - displayName: 'Delete', - icon: Trash, - type: 'delete', - action: (event) => { - if (event['shiftKey']) { - deleteVariable(path, account) - } else { - deleteConfirmedCallback = () => { - deleteVariable(path, account) - } - } - }, - disabled: !owner - }, - ...(isDeployable(is_secret ? 'secret' : 'variable', path, deployUiSettings) - ? [ - { - displayName: 'Deploy to prod/staging', - icon: FileUp, - action: () => { - deploymentDrawer.openDrawer(path, 'variable') - } - } - ] - : []), - { - displayName: owner ? 'Share' : 'See Permissions', - action: () => { - shareModal.openDrawer(path, 'variable') - }, - icon: Share - }, - ...(account != undefined - ? [ - { - displayName: 'Refresh token', - icon: RefreshCw, - action: async () => { - await OauthService.refreshToken({ - workspace: $workspaceStore ?? '', - id: account ?? 0, - requestBody: { - path - } - }) - sendUserToast('Token refreshed') - loadVariables() - } - } - ] - : []) - ] - }} - /> - - - {/each} - - - {/if} -
- {:else if tab == 'contextual'} -
- {#if loading.contextual} - - {#each new Array(8) as _} - - {/each} - {:else} - - {#if contextualVariables.filter((x) => x.is_custom).length === 0} + + +
+ + Contextual + + Contextual variables are passed as environment variables when running a script and + depends on the execution context. + +
+
+ + {#if tab == 'workspace'} +
+ +
+
+ +
+
+ {#if !filteredItems} + + {#each new Array(3) as _} + + {/each} + {:else if filteredItems.length == 0}
-
No custom contextual variables found
+
No variables found
+
+ Try changing the filters or creating a new variable +
{:else} - x.is_custom)} - keys={['name', 'value']} - getRowActions={$userStore?.is_admin || $userStore?.is_super_admin - ? (row) => { - return [ - { - displayName: 'Edit', - action: () => contextualVariableEditor.editVariable(row.name, row.value) - }, - { - displayName: 'Delete', - type: 'delete', - action: () => { - deleteContextualVariable(row) + + + + + Path + Value + Description + + + + + + {#each filteredItems as { path, value, is_secret, description, extra_perms, canWrite, account, is_refreshed, is_expired, refresh_error, is_linked, marked }} + + + + + + variableEditor.editVariable(path)} + href="#{path}" + > + {#if marked} + {@html marked} + {:else} + {path} + {/if} + + + + +
+ {#if value} + {truncate(value, 20)} + {:else} + ∗∗∗∗ + {/if} +
+ {#if is_secret} + + + This item is secret + + {/if} +
+
+ + {truncate(description ?? '', 50)} + + + +
+ {#if is_linked} + + +
+ This variable is linked with a resource of the same path. They are + deleted and renamed together. +
+
+ {/if} + {#if account} + + +
+ This OAuth token will be kept up-to-date in the background by Windmill + using its refresh token +
+
+ {/if} + + {#if is_refreshed} +
+ {#if refresh_error} + +
+ + +
+ +
+ Latest exchange of the refresh token did not succeed. Error: {refresh_error} +
+
+ {:else if is_expired} + + +
+ The access_token is expired, it will get renewed the next time this + variable is fetched or you can request is to be refreshed in the + dropdown on the right. +
+
+ {:else} + + +
+ The variable was connected through OAuth and the token is not + expired. +
+
+ {/if} +
+ {/if} +
+
+ + { + let owner = isOwner(path, $userStore, $workspaceStore) + return [ + { + displayName: 'Edit', + icon: Pen, + action: () => variableEditor.editVariable(path), + disabled: !canWrite + }, + { + displayName: 'Delete', + icon: Trash, + type: 'delete', + action: (event) => { + if (event['shiftKey']) { + deleteVariable(path, account) + } else { + deleteConfirmedCallback = () => { + deleteVariable(path, account) + } + } + }, + disabled: !owner + }, + ...(isDeployable( + is_secret ? 'secret' : 'variable', + path, + deployUiSettings + ) + ? [ + { + displayName: 'Deploy to prod/staging', + icon: FileUp, + action: () => { + deploymentDrawer.openDrawer(path, 'variable') + } + } + ] + : []), + { + displayName: owner ? 'Share' : 'See Permissions', + action: () => { + shareModal.openDrawer(path, 'variable') + }, + icon: Share + }, + ...(account != undefined + ? [ + { + displayName: 'Refresh token', + icon: RefreshCw, + action: async () => { + await OauthService.refreshToken({ + workspace: $workspaceStore ?? '', + id: account ?? 0, + requestBody: { + path + } + }) + sendUserToast('Token refreshed') + loadVariables() + } + } + ] + : []) + ] + }} + /> + +
+ {/each} + +
+ {/if} +
+ {:else if tab == 'contextual'} +
+ {#if loading.contextual} + + {#each new Array(8) as _} + + {/each} + {:else} + + {#if contextualVariables.filter((x) => x.is_custom).length === 0} +
+
No custom contextual variables found
+
+ {:else} + x.is_custom)} + keys={['name', 'value']} + getRowActions={$userStore?.is_admin || $userStore?.is_super_admin + ? (row) => { + return [ + { + displayName: 'Edit', + action: () => contextualVariableEditor.editVariable(row.name, row.value) + }, + { + displayName: 'Delete', + type: 'delete', + action: () => { + deleteContextualVariable(row) + } } - } - ] - } - : undefined} + ] + } + : undefined} + /> + {/if} + + !x.is_custom)} + keys={['name', 'value', 'description']} /> {/if} - - !x.is_custom)} - keys={['name', 'value', 'description']} - /> - {/if} -
- {/if} - +
+ {/if} + {/if} Date: Mon, 24 Mar 2025 20:12:26 +0100 Subject: [PATCH 082/739] perf: optimize number of queries needed for job run (#5504) * optPerf * update sqlx * update sqlx --- ...984a2ea952e782fd52eb3088454690bd13dd1.json | 3 +- ...8234ca7d1efeee9661f3901f298da375e73f7.json | 38 +-- ...132d79fdb2982de111cb5fd43e3d9ecd0f15e.json | 3 +- ...4ca116895d71de09db338ec09e425dcebe5e.json} | 32 +-- ...73917ed13269f2ee20b86df79fca2c8efe672.json | 3 +- ...a6c391c4d0054a618b861464ee37239f1f1e0.json | 3 +- ...dcc40f463cbc52d94ed9315cf9a547d4c89f2.json | 38 +-- ...3b9b96854e5bfd752e45922c358c42ebea0c4.json | 3 +- ...d968b8fb0bf4374a2fccc167fa879bad7078f.json | 3 +- ...9d60e3a3a40b90421aaf589c4c3bcc5a45ec8.json | 29 -- ...94f91df7e588d4d2431bc85f4d8734920c8bf.json | 3 +- ...94cb1a32c4991cbd25046282d34272587d2de.json | 3 +- ...5ef756b8e5c1955fbe111df9ee171dc262338.json | 3 +- ...0867540ab6bb02ac6bf82decc220dce0ab048.json | 3 +- ...4feaeb1b671120f5f8c98fca8c89c6587fc35.json | 3 +- ...77afbd8b3a660b3be27514b517c077c63c238.json | 3 +- backend/src/monitor.rs | 1 + backend/tests/worker.rs | 5 +- backend/windmill-api/src/resources.rs | 6 +- backend/windmill-common/src/auth.rs | 3 - backend/windmill-common/src/worker.rs | 22 +- backend/windmill-queue/src/jobs.rs | 7 + .../windmill-worker/src/ansible_executor.rs | 13 +- backend/windmill-worker/src/bash_executor.rs | 16 +- .../windmill-worker/src/bigquery_executor.rs | 10 +- backend/windmill-worker/src/bun_executor.rs | 18 +- backend/windmill-worker/src/common.rs | 60 ++--- .../windmill-worker/src/csharp_executor.rs | 12 +- backend/windmill-worker/src/deno_executor.rs | 19 +- backend/windmill-worker/src/go_executor.rs | 12 +- .../windmill-worker/src/graphql_executor.rs | 4 +- backend/windmill-worker/src/mssql_executor.rs | 9 +- backend/windmill-worker/src/mysql_executor.rs | 26 +- backend/windmill-worker/src/nu_executor.rs | 11 +- .../windmill-worker/src/oracledb_executor.rs | 9 +- backend/windmill-worker/src/pg_executor.rs | 9 +- backend/windmill-worker/src/php_executor.rs | 11 +- .../windmill-worker/src/python_executor.rs | 12 +- .../windmill-worker/src/result_processor.rs | 6 +- backend/windmill-worker/src/rust_executor.rs | 11 +- .../src/sanitized_sql_params.rs | 5 +- .../windmill-worker/src/snowflake_executor.rs | 6 +- backend/windmill-worker/src/worker.rs | 251 ++++++++++-------- backend/windmill-worker/src/worker_flow.rs | 10 +- 44 files changed, 375 insertions(+), 382 deletions(-) rename backend/.sqlx/{query-d2def87d7f7901eebc65082f7df5e0a33e5702b25c3db3affa06155e90480e42.json => query-2a510a8bec98055796f987d86c344ca116895d71de09db338ec09e425dcebe5e.json} (63%) delete mode 100644 backend/.sqlx/query-7e93c924e3fc51f8c26df26e5d09d60e3a3a40b90421aaf589c4c3bcc5a45ec8.json diff --git a/backend/.sqlx/query-03ae5b1c912b13a8a7aadf50cb4984a2ea952e782fd52eb3088454690bd13dd1.json b/backend/.sqlx/query-03ae5b1c912b13a8a7aadf50cb4984a2ea952e782fd52eb3088454690bd13dd1.json index 60404da57c..c26b190f79 100644 --- a/backend/.sqlx/query-03ae5b1c912b13a8a7aadf50cb4984a2ea952e782fd52eb3088454690bd13dd1.json +++ b/backend/.sqlx/query-03ae5b1c912b13a8a7aadf50cb4984a2ea952e782fd52eb3088454690bd13dd1.json @@ -39,7 +39,8 @@ "rust", "ansible", "csharp", - "oracledb" + "oracledb", + "nu" ] } } diff --git a/backend/.sqlx/query-08f288d2781d823e109a9e5b8848234ca7d1efeee9661f3901f298da375e73f7.json b/backend/.sqlx/query-08f288d2781d823e109a9e5b8848234ca7d1efeee9661f3901f298da375e73f7.json index 2be39fce26..4bcf3c6ce3 100644 --- a/backend/.sqlx/query-08f288d2781d823e109a9e5b8848234ca7d1efeee9661f3901f298da375e73f7.json +++ b/backend/.sqlx/query-08f288d2781d823e109a9e5b8848234ca7d1efeee9661f3901f298da375e73f7.json @@ -130,28 +130,28 @@ }, { "ordinal": 25, - "name": "teams_command_script", - "type_info": "Text" - }, - { - "ordinal": 26, - "name": "teams_team_id", - "type_info": "Text" - }, - { - "ordinal": 27, - "name": "teams_team_name", - "type_info": "Text" - }, - { - "ordinal": 28, "name": "ai_models", "type_info": "VarcharArray" }, { - "ordinal": 29, + "ordinal": 26, "name": "code_completion_model", "type_info": "Varchar" + }, + { + "ordinal": 27, + "name": "teams_command_script", + "type_info": "Text" + }, + { + "ordinal": 28, + "name": "teams_team_id", + "type_info": "Text" + }, + { + "ordinal": 29, + "name": "teams_team_name", + "type_info": "Text" } ], "parameters": { @@ -185,10 +185,10 @@ true, true, true, - true, - true, - true, false, + true, + true, + true, true ] }, diff --git a/backend/.sqlx/query-29624682d687790dd199c4af759132d79fdb2982de111cb5fd43e3d9ecd0f15e.json b/backend/.sqlx/query-29624682d687790dd199c4af759132d79fdb2982de111cb5fd43e3d9ecd0f15e.json index 7623243f07..0967139406 100644 --- a/backend/.sqlx/query-29624682d687790dd199c4af759132d79fdb2982de111cb5fd43e3d9ecd0f15e.json +++ b/backend/.sqlx/query-29624682d687790dd199c4af759132d79fdb2982de111cb5fd43e3d9ecd0f15e.json @@ -68,7 +68,8 @@ "rust", "ansible", "csharp", - "oracledb" + "oracledb", + "nu" ] } } diff --git a/backend/.sqlx/query-d2def87d7f7901eebc65082f7df5e0a33e5702b25c3db3affa06155e90480e42.json b/backend/.sqlx/query-2a510a8bec98055796f987d86c344ca116895d71de09db338ec09e425dcebe5e.json similarity index 63% rename from backend/.sqlx/query-d2def87d7f7901eebc65082f7df5e0a33e5702b25c3db3affa06155e90480e42.json rename to backend/.sqlx/query-2a510a8bec98055796f987d86c344ca116895d71de09db338ec09e425dcebe5e.json index 58f03dbec2..23337708f8 100644 --- a/backend/.sqlx/query-d2def87d7f7901eebc65082f7df5e0a33e5702b25c3db3affa06155e90480e42.json +++ b/backend/.sqlx/query-2a510a8bec98055796f987d86c344ca116895d71de09db338ec09e425dcebe5e.json @@ -1,50 +1,35 @@ { "db_name": "PostgreSQL", - "query": "SELECT * FROM job_perms WHERE job_id = $1 AND workspace_id = $2", + "query": "SELECT email, username, is_admin, is_operator, groups, folders FROM job_perms WHERE job_id = $1 AND workspace_id = $2", "describe": { "columns": [ { "ordinal": 0, - "name": "job_id", - "type_info": "Uuid" - }, - { - "ordinal": 1, "name": "email", "type_info": "Varchar" }, { - "ordinal": 2, + "ordinal": 1, "name": "username", "type_info": "Varchar" }, { - "ordinal": 3, + "ordinal": 2, "name": "is_admin", "type_info": "Bool" }, { - "ordinal": 4, + "ordinal": 3, "name": "is_operator", "type_info": "Bool" }, { - "ordinal": 5, - "name": "created_at", - "type_info": "Timestamp" - }, - { - "ordinal": 6, - "name": "workspace_id", - "type_info": "Varchar" - }, - { - "ordinal": 7, + "ordinal": 4, "name": "groups", "type_info": "TextArray" }, { - "ordinal": 8, + "ordinal": 5, "name": "folders", "type_info": "JsonbArray" } @@ -61,11 +46,8 @@ false, false, false, - false, - false, - false, false ] }, - "hash": "d2def87d7f7901eebc65082f7df5e0a33e5702b25c3db3affa06155e90480e42" + "hash": "2a510a8bec98055796f987d86c344ca116895d71de09db338ec09e425dcebe5e" } diff --git a/backend/.sqlx/query-488dd591096b2b47787afdc3a1d73917ed13269f2ee20b86df79fca2c8efe672.json b/backend/.sqlx/query-488dd591096b2b47787afdc3a1d73917ed13269f2ee20b86df79fca2c8efe672.json index 8622eb9125..e6d4991053 100644 --- a/backend/.sqlx/query-488dd591096b2b47787afdc3a1d73917ed13269f2ee20b86df79fca2c8efe672.json +++ b/backend/.sqlx/query-488dd591096b2b47787afdc3a1d73917ed13269f2ee20b86df79fca2c8efe672.json @@ -68,7 +68,8 @@ "rust", "ansible", "csharp", - "oracledb" + "oracledb", + "nu" ] } } diff --git a/backend/.sqlx/query-4aaab98ebdaa90f1edf49ac96fba6c391c4d0054a618b861464ee37239f1f1e0.json b/backend/.sqlx/query-4aaab98ebdaa90f1edf49ac96fba6c391c4d0054a618b861464ee37239f1f1e0.json index 1ae47774dd..166d6b84a0 100644 --- a/backend/.sqlx/query-4aaab98ebdaa90f1edf49ac96fba6c391c4d0054a618b861464ee37239f1f1e0.json +++ b/backend/.sqlx/query-4aaab98ebdaa90f1edf49ac96fba6c391c4d0054a618b861464ee37239f1f1e0.json @@ -135,7 +135,8 @@ "rust", "ansible", "csharp", - "oracledb" + "oracledb", + "nu" ] } } diff --git a/backend/.sqlx/query-55cb03040bc2a8c53dd7fbb42bbdcc40f463cbc52d94ed9315cf9a547d4c89f2.json b/backend/.sqlx/query-55cb03040bc2a8c53dd7fbb42bbdcc40f463cbc52d94ed9315cf9a547d4c89f2.json index 9243288c9d..14685a8bfa 100644 --- a/backend/.sqlx/query-55cb03040bc2a8c53dd7fbb42bbdcc40f463cbc52d94ed9315cf9a547d4c89f2.json +++ b/backend/.sqlx/query-55cb03040bc2a8c53dd7fbb42bbdcc40f463cbc52d94ed9315cf9a547d4c89f2.json @@ -130,28 +130,28 @@ }, { "ordinal": 25, - "name": "teams_command_script", - "type_info": "Text" - }, - { - "ordinal": 26, - "name": "teams_team_id", - "type_info": "Text" - }, - { - "ordinal": 27, - "name": "teams_team_name", - "type_info": "Text" - }, - { - "ordinal": 28, "name": "ai_models", "type_info": "VarcharArray" }, { - "ordinal": 29, + "ordinal": 26, "name": "code_completion_model", "type_info": "Varchar" + }, + { + "ordinal": 27, + "name": "teams_command_script", + "type_info": "Text" + }, + { + "ordinal": 28, + "name": "teams_team_id", + "type_info": "Text" + }, + { + "ordinal": 29, + "name": "teams_team_name", + "type_info": "Text" } ], "parameters": { @@ -185,10 +185,10 @@ true, true, true, - true, - true, - true, false, + true, + true, + true, true ] }, diff --git a/backend/.sqlx/query-61c29d684e8e683e839a6d7210b3b9b96854e5bfd752e45922c358c42ebea0c4.json b/backend/.sqlx/query-61c29d684e8e683e839a6d7210b3b9b96854e5bfd752e45922c358c42ebea0c4.json index 6354dae16b..1bc34cfbc0 100644 --- a/backend/.sqlx/query-61c29d684e8e683e839a6d7210b3b9b96854e5bfd752e45922c358c42ebea0c4.json +++ b/backend/.sqlx/query-61c29d684e8e683e839a6d7210b3b9b96854e5bfd752e45922c358c42ebea0c4.json @@ -59,7 +59,8 @@ "rust", "ansible", "csharp", - "oracledb" + "oracledb", + "nu" ] } } diff --git a/backend/.sqlx/query-75451b6d48e4c26812ae64981d0d968b8fb0bf4374a2fccc167fa879bad7078f.json b/backend/.sqlx/query-75451b6d48e4c26812ae64981d0d968b8fb0bf4374a2fccc167fa879bad7078f.json index 287284b86b..98de576f13 100644 --- a/backend/.sqlx/query-75451b6d48e4c26812ae64981d0d968b8fb0bf4374a2fccc167fa879bad7078f.json +++ b/backend/.sqlx/query-75451b6d48e4c26812ae64981d0d968b8fb0bf4374a2fccc167fa879bad7078f.json @@ -59,7 +59,8 @@ "rust", "ansible", "csharp", - "oracledb" + "oracledb", + "nu" ] } } diff --git a/backend/.sqlx/query-7e93c924e3fc51f8c26df26e5d09d60e3a3a40b90421aaf589c4c3bcc5a45ec8.json b/backend/.sqlx/query-7e93c924e3fc51f8c26df26e5d09d60e3a3a40b90421aaf589c4c3bcc5a45ec8.json deleted file mode 100644 index 044c752555..0000000000 --- a/backend/.sqlx/query-7e93c924e3fc51f8c26df26e5d09d60e3a3a40b90421aaf589c4c3bcc5a45ec8.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT v2_job_completed.id AS \"id!\", flow_status AS \"flow_status!: Json\"\n FROM v2_job_completed\n INNER JOIN v2_job ON (v2_job_completed.id = v2_job.id)\n WHERE parent_job = $1 AND v2_job_completed.workspace_id = $2 AND flow_status IS NOT NULL", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id!", - "type_info": "Uuid" - }, - { - "ordinal": 1, - "name": "flow_status!: Json", - "type_info": "Jsonb" - } - ], - "parameters": { - "Left": [ - "Uuid", - "Text" - ] - }, - "nullable": [ - false, - true - ] - }, - "hash": "7e93c924e3fc51f8c26df26e5d09d60e3a3a40b90421aaf589c4c3bcc5a45ec8" -} diff --git a/backend/.sqlx/query-804fc11e35f4afc0db194b6fe2594f91df7e588d4d2431bc85f4d8734920c8bf.json b/backend/.sqlx/query-804fc11e35f4afc0db194b6fe2594f91df7e588d4d2431bc85f4d8734920c8bf.json index 2179199223..967f53c987 100644 --- a/backend/.sqlx/query-804fc11e35f4afc0db194b6fe2594f91df7e588d4d2431bc85f4d8734920c8bf.json +++ b/backend/.sqlx/query-804fc11e35f4afc0db194b6fe2594f91df7e588d4d2431bc85f4d8734920c8bf.json @@ -32,7 +32,8 @@ "rust", "ansible", "csharp", - "oracledb" + "oracledb", + "nu" ] } } diff --git a/backend/.sqlx/query-89de3ff8ab32e545efcbcda05f994cb1a32c4991cbd25046282d34272587d2de.json b/backend/.sqlx/query-89de3ff8ab32e545efcbcda05f994cb1a32c4991cbd25046282d34272587d2de.json index d90a9646de..e7f486d2a4 100644 --- a/backend/.sqlx/query-89de3ff8ab32e545efcbcda05f994cb1a32c4991cbd25046282d34272587d2de.json +++ b/backend/.sqlx/query-89de3ff8ab32e545efcbcda05f994cb1a32c4991cbd25046282d34272587d2de.json @@ -59,7 +59,8 @@ "rust", "ansible", "csharp", - "oracledb" + "oracledb", + "nu" ] } } diff --git a/backend/.sqlx/query-ab04cda71f8e2be9acbecabe1ee5ef756b8e5c1955fbe111df9ee171dc262338.json b/backend/.sqlx/query-ab04cda71f8e2be9acbecabe1ee5ef756b8e5c1955fbe111df9ee171dc262338.json index 3284fb1846..aefb084bba 100644 --- a/backend/.sqlx/query-ab04cda71f8e2be9acbecabe1ee5ef756b8e5c1955fbe111df9ee171dc262338.json +++ b/backend/.sqlx/query-ab04cda71f8e2be9acbecabe1ee5ef756b8e5c1955fbe111df9ee171dc262338.json @@ -63,7 +63,8 @@ "rust", "ansible", "csharp", - "oracledb" + "oracledb", + "nu" ] } } diff --git a/backend/.sqlx/query-d15f02f090b8d1a7e816fe11b2e0867540ab6bb02ac6bf82decc220dce0ab048.json b/backend/.sqlx/query-d15f02f090b8d1a7e816fe11b2e0867540ab6bb02ac6bf82decc220dce0ab048.json index ba3589bf24..7a54e8ea3f 100644 --- a/backend/.sqlx/query-d15f02f090b8d1a7e816fe11b2e0867540ab6bb02ac6bf82decc220dce0ab048.json +++ b/backend/.sqlx/query-d15f02f090b8d1a7e816fe11b2e0867540ab6bb02ac6bf82decc220dce0ab048.json @@ -40,7 +40,8 @@ "rust", "ansible", "csharp", - "oracledb" + "oracledb", + "nu" ] } } diff --git a/backend/.sqlx/query-ec7836df5f9056ec70015800b7f4feaeb1b671120f5f8c98fca8c89c6587fc35.json b/backend/.sqlx/query-ec7836df5f9056ec70015800b7f4feaeb1b671120f5f8c98fca8c89c6587fc35.json index 81093c5f12..a99ef5bd04 100644 --- a/backend/.sqlx/query-ec7836df5f9056ec70015800b7f4feaeb1b671120f5f8c98fca8c89c6587fc35.json +++ b/backend/.sqlx/query-ec7836df5f9056ec70015800b7f4feaeb1b671120f5f8c98fca8c89c6587fc35.json @@ -54,7 +54,8 @@ "rust", "ansible", "csharp", - "oracledb" + "oracledb", + "nu" ] } } diff --git a/backend/.sqlx/query-ff0403790674cdb07022af71c2377afbd8b3a660b3be27514b517c077c63c238.json b/backend/.sqlx/query-ff0403790674cdb07022af71c2377afbd8b3a660b3be27514b517c077c63c238.json index 6a4a3b3d75..95fca28ce0 100644 --- a/backend/.sqlx/query-ff0403790674cdb07022af71c2377afbd8b3a660b3be27514b517c077c63c238.json +++ b/backend/.sqlx/query-ff0403790674cdb07022af71c2377afbd8b3a660b3be27514b517c077c63c238.json @@ -63,7 +63,8 @@ "rust", "ansible", "csharp", - "oracledb" + "oracledb", + "nu" ] } } diff --git a/backend/src/monitor.rs b/backend/src/monitor.rs index 0a87924669..a54011eef3 100644 --- a/backend/src/monitor.rs +++ b/backend/src/monitor.rs @@ -1803,6 +1803,7 @@ async fn handle_zombie_jobs(db: &Pool, base_internal_url: &str, worker *SCRIPT_TOKEN_EXPIRY, &job.email, &job.id, + None, ) .await .expect("could not create job token"); diff --git a/backend/tests/worker.rs b/backend/tests/worker.rs index 695071b489..2c1e47f2af 100644 --- a/backend/tests/worker.rs +++ b/backend/tests/worker.rs @@ -315,7 +315,7 @@ mod suspend_resume { let second = completed.next().await.unwrap(); // print_job(second, &db).await; - let token = windmill_worker::create_token_for_owner(&db, "test-workspace", "u/test-user", "", 100, "", &Uuid::nil()).await.unwrap(); + let token = windmill_worker::create_token_for_owner(&db, "test-workspace", "u/test-user", "", 100, "", &Uuid::nil(), None).await.unwrap(); let secret = reqwest::get(format!( "http://localhost:{port}/api/w/test-workspace/jobs/job_signature/{second}/0?token={token}&approver=ruben" )) @@ -418,7 +418,7 @@ mod suspend_resume { /* ... and send a request resume it. */ let second = completed.next().await.unwrap(); - let token = windmill_worker::create_token_for_owner(&db, "test-workspace", "u/test-user", "", 100, "", &Uuid::nil()).await.unwrap(); + let token = windmill_worker::create_token_for_owner(&db, "test-workspace", "u/test-user", "", 100, "", &Uuid::nil(), None).await.unwrap(); let secret = reqwest::get(format!( "http://localhost:{port}/api/w/test-workspace/jobs/job_signature/{second}/0?token={token}" )) @@ -3806,6 +3806,7 @@ async fn test_result_format(db: Pool) { 100, "", &Uuid::nil(), + None, ) .await .unwrap(); diff --git a/backend/windmill-api/src/resources.rs b/backend/windmill-api/src/resources.rs index 2a3331ef9a..a3f7ee3d20 100644 --- a/backend/windmill-api/src/resources.rs +++ b/backend/windmill-api/src/resources.rs @@ -1208,7 +1208,11 @@ async fn update_resource_type( Ok(format!("resource_type {} updated", name)) } -#[cfg(any(feature = "postgres_trigger", feature = "mqtt_trigger", all(feature = "sqs_trigger", feature = "enterprise")))] +#[cfg(any( + feature = "postgres_trigger", + feature = "mqtt_trigger", + all(feature = "sqs_trigger", feature = "enterprise") +))] pub async fn try_get_resource_from_db_as( authed: ApiAuthed, user_db: Option, diff --git a/backend/windmill-common/src/auth.rs b/backend/windmill-common/src/auth.rs index 451157b115..d63fddc670 100644 --- a/backend/windmill-common/src/auth.rs +++ b/backend/windmill-common/src/auth.rs @@ -24,15 +24,12 @@ pub struct JWTAuthClaims { #[derive(Deserialize)] pub struct JobPerms { - pub workspace_id: String, - pub job_id: String, pub email: String, pub username: String, pub is_admin: bool, pub is_operator: bool, pub groups: Vec, pub folders: Vec, - pub created_at: chrono::NaiveDateTime, } impl From for Authed { diff --git a/backend/windmill-common/src/worker.rs b/backend/windmill-common/src/worker.rs index af5814aedc..a6979ad30e 100644 --- a/backend/windmill-common/src/worker.rs +++ b/backend/windmill-common/src/worker.rs @@ -142,16 +142,20 @@ fn format_pull_query(peek: String) -> String { raw_flow, script_entrypoint_override, preprocessed FROM v2_job WHERE id = (SELECT id FROM peek) - ) SELECT id, workspace_id, parent_job, created_by, started_at, scheduled_for, - runnable_id, runnable_path, args, canceled_by, - canceled_reason, kind, trigger, trigger_kind, permissioned_as, permissioned_as_email, - flow_status, script_lang, - same_worker, pre_run_error, visible_to_owner, - tag, concurrent_limit, concurrency_time_window_s, flow_innermost_root_job, - timeout, flow_step_id, cache_ttl, priority, raw_code, raw_lock, raw_flow, - script_entrypoint_override, preprocessed + ) SELECT j.id, j.workspace_id, j.parent_job, j.created_by, started_at, scheduled_for, + j.runnable_id, j.runnable_path, j.args, canceled_by, + canceled_reason, j.kind, j.trigger, j.trigger_kind, j.permissioned_as, j.permissioned_as_email, + flow_status, j.script_lang, + j.same_worker, j.pre_run_error, j.visible_to_owner, + j.tag, j.concurrent_limit, j.concurrency_time_window_s, j.flow_innermost_root_job, + j.timeout, j.flow_step_id, j.cache_ttl, j.priority, j.raw_code, j.raw_lock, j.raw_flow, + j.script_entrypoint_override, j.preprocessed, pj.runnable_path as parent_runnable_path, + p.email as permissioned_as_email, p.username as permissioned_as_username, p.is_admin as permissioned_as_is_admin, + p.is_operator as permissioned_as_is_operator, p.groups as permissioned_as_groups, p.folders as permissioned_as_folders FROM q, j - LEFT JOIN v2_job_status f USING (id)", + LEFT JOIN v2_job_status f USING (id) + LEFT JOIN job_perms p ON p.job_id = j.id + LEFT JOIN v2_job pj ON j.parent_job = pj.id", peek ); tracing::debug!("pull query: {}", r); diff --git a/backend/windmill-queue/src/jobs.rs b/backend/windmill-queue/src/jobs.rs index 7f1473055a..394d04e366 100644 --- a/backend/windmill-queue/src/jobs.rs +++ b/backend/windmill-queue/src/jobs.rs @@ -2002,6 +2002,13 @@ pub struct PulledJob { pub raw_code: Option, pub raw_lock: Option, pub raw_flow: Option>>, + pub parent_runnable_path: Option, + pub permissioned_as_email: Option, + pub permissioned_as_username: Option, + pub permissioned_as_is_admin: Option, + pub permissioned_as_is_operator: Option, + pub permissioned_as_groups: Option>, + pub permissioned_as_folders: Option>, } impl std::ops::Deref for PulledJob { diff --git a/backend/windmill-worker/src/ansible_executor.rs b/backend/windmill-worker/src/ansible_executor.rs index a565ff6820..c98837ac5d 100644 --- a/backend/windmill-worker/src/ansible_executor.rs +++ b/backend/windmill-worker/src/ansible_executor.rs @@ -26,8 +26,8 @@ use crate::{ }, handle_child::handle_child, python_executor::{create_dependencies_dir, handle_python_reqs, uv_pip_compile, PyVersion}, - AuthedClientBackgroundTask, DISABLE_NSJAIL, DISABLE_NUSER, HOME_ENV, NSJAIL_PATH, PATH_ENV, - PROXY_ENVS, PY_INSTALL_DIR, TZ_ENV, + AuthedClient, DISABLE_NSJAIL, DISABLE_NUSER, HOME_ENV, NSJAIL_PATH, PATH_ENV, PROXY_ENVS, + PY_INSTALL_DIR, TZ_ENV, }; lazy_static::lazy_static! { @@ -185,7 +185,8 @@ pub async fn handle_ansible_job( mem_peak: &mut i32, canceled_by: &mut Option, db: &sqlx::Pool, - client: &AuthedClientBackgroundTask, + client: &AuthedClient, + parent_runnable_path: Option, inner_content: &String, shared_mount: &str, base_internal_url: &str, @@ -263,7 +264,6 @@ pub async fn handle_ansible_job( }) .unwrap_or_else(|| vec![]); - let authed_client = client.get_authed().await; let mut nsjail_extra_mounts = vec![]; if let Some(r) = reqs { nsjail_extra_mounts = create_file_resources( @@ -272,7 +272,7 @@ pub async fn handle_ansible_job( job_dir, interpolated_args.as_ref(), &r, - &authed_client, + &client, db, ) .await?; @@ -311,7 +311,8 @@ remote_tmp={job_dir}/.ansible/tmp ); write_file(job_dir, "ansible.cfg", &ansible_cfg_content)?; - let mut reserved_variables = get_reserved_variables(job, &authed_client.token, db).await?; + let mut reserved_variables = + get_reserved_variables(job, &client.token, db, parent_runnable_path).await?; let additional_python_paths_folders = additional_python_paths.join(":"); if !*DISABLE_NSJAIL { diff --git a/backend/windmill-worker/src/bash_executor.rs b/backend/windmill-worker/src/bash_executor.rs index 412014eb73..a496b327b5 100644 --- a/backend/windmill-worker/src/bash_executor.rs +++ b/backend/windmill-worker/src/bash_executor.rs @@ -46,7 +46,7 @@ use crate::{ OccupancyMetrics, }, handle_child::handle_child, - AuthedClientBackgroundTask, DISABLE_NSJAIL, DISABLE_NUSER, HOME_ENV, NSJAIL_PATH, PATH_ENV, + AuthedClient, DISABLE_NSJAIL, DISABLE_NUSER, HOME_ENV, NSJAIL_PATH, PATH_ENV, POWERSHELL_CACHE_DIR, POWERSHELL_PATH, PROXY_ENVS, TZ_ENV, }; @@ -64,7 +64,8 @@ pub async fn handle_bash_job( canceled_by: &mut Option, job: &MiniPulledJob, db: &sqlx::Pool, - client: &AuthedClientBackgroundTask, + client: &AuthedClient, + parent_runnable_path: Option, content: &str, job_dir: &str, shared_mount: &str, @@ -135,8 +136,8 @@ exit $exit_status ); write_file(job_dir, "wrapper.sh", &script)?; - let token = client.get_token().await; - let mut reserved_variables = get_reserved_variables(job, &token, db).await?; + let mut reserved_variables = + get_reserved_variables(job, &client.token, db, parent_runnable_path).await?; reserved_variables.insert("RUST_LOG".to_string(), "info".to_string()); let args = build_args_map(job, client, db).await?.map(Json); @@ -471,7 +472,8 @@ pub async fn handle_powershell_job( canceled_by: &mut Option, job: &MiniPulledJob, db: &sqlx::Pool, - client: &AuthedClientBackgroundTask, + client: &AuthedClient, + parent_runnable_path: Option, content: &str, job_dir: &str, shared_mount: &str, @@ -653,8 +655,8 @@ $env:PSModulePath = \"{};$PSModulePathBackup\"", ), )?; - let token = client.get_token().await; - let mut reserved_variables = get_reserved_variables(job, &token, db).await?; + let mut reserved_variables = + get_reserved_variables(job, &client.token, db, parent_runnable_path).await?; reserved_variables.insert("RUST_LOG".to_string(), "info".to_string()); let _ = write_file(job_dir, "result.json", "")?; diff --git a/backend/windmill-worker/src/bigquery_executor.rs b/backend/windmill-worker/src/bigquery_executor.rs index b6367c8529..28aa1398d3 100644 --- a/backend/windmill-worker/src/bigquery_executor.rs +++ b/backend/windmill-worker/src/bigquery_executor.rs @@ -18,7 +18,7 @@ use crate::handle_child::run_future_with_polling_update_job_poller; use crate::sanitized_sql_params::sanitize_and_interpolate_unsafe_sql_args; use crate::{ common::{build_args_values, resolve_job_timeout}, - AuthedClientBackgroundTask, + AuthedClient, }; use gcp_auth::{AuthenticationManager, CustomServiceAccount}; @@ -207,7 +207,7 @@ use windmill_queue::MiniPulledJob; pub async fn do_bigquery( job: &MiniPulledJob, - client: &AuthedClientBackgroundTask, + client: &AuthedClient, query: &str, db: &sqlx::Pool, mem_peak: &mut i32, @@ -223,8 +223,6 @@ pub async fn do_bigquery( let db_arg = if let Some(inline_db_res_path) = inline_db_res_path { Some( client - .get_authed() - .await .get_resource_value_interpolated::( &inline_db_res_path, Some(job.id.to_string()), @@ -267,13 +265,13 @@ pub async fn do_bigquery( .map_err(|x| Error::ExecutionErr(x.to_string()))? .args; - let (query, args_to_skip) = &sanitize_and_interpolate_unsafe_sql_args(query, &sig, &bigquery_args)?; + let (query, args_to_skip) = + &sanitize_and_interpolate_unsafe_sql_args(query, &sig, &bigquery_args)?; let queries = parse_sql_blocks(query); let mut statement_values: HashMap = HashMap::new(); - for arg in &sig { if args_to_skip.contains(&arg.name) { continue; diff --git a/backend/windmill-worker/src/bun_executor.rs b/backend/windmill-worker/src/bun_executor.rs index 8e13e0d57f..ed6881b4fd 100644 --- a/backend/windmill-worker/src/bun_executor.rs +++ b/backend/windmill-worker/src/bun_executor.rs @@ -20,9 +20,9 @@ use crate::{ read_file_content, read_result, start_child_process, write_file_binary, OccupancyMetrics, }, handle_child::handle_child, - AuthedClientBackgroundTask, BUNFIG_INSTALL_SCOPES, BUN_BUNDLE_CACHE_DIR, BUN_CACHE_DIR, - BUN_PATH, DISABLE_NSJAIL, DISABLE_NUSER, HOME_ENV, NODE_BIN_PATH, NODE_PATH, - NPM_CONFIG_REGISTRY, NPM_PATH, NSJAIL_PATH, PATH_ENV, PROXY_ENVS, TZ_ENV, + AuthedClient, BUNFIG_INSTALL_SCOPES, BUN_BUNDLE_CACHE_DIR, BUN_CACHE_DIR, BUN_PATH, + DISABLE_NSJAIL, DISABLE_NUSER, HOME_ENV, NODE_BIN_PATH, NODE_PATH, NPM_CONFIG_REGISTRY, + NPM_PATH, NSJAIL_PATH, PATH_ENV, PROXY_ENVS, TZ_ENV, }; #[cfg(windows)] @@ -825,7 +825,8 @@ pub async fn handle_bun_job( canceled_by: &mut Option, job: &MiniPulledJob, db: &sqlx::Pool, - client: &AuthedClientBackgroundTask, + client: &AuthedClient, + parent_runnable_path: Option, job_dir: &str, inner_content: &String, base_internal_url: &str, @@ -934,7 +935,7 @@ pub async fn handle_bun_job( &job.id, &job.workspace_id, Some(db), - &client.get_token().await, + &client.token, job.runnable_path(), job_dir, base_internal_url, @@ -1108,8 +1109,7 @@ try {{ Ok(()) as Result<()> }; let reserved_variables_f = async { - let client = client.get_authed().await; - let vars = get_reserved_variables(job, &client.token, db).await?; + let vars = get_reserved_variables(job, &client.token, db, parent_runnable_path).await?; Ok(vars) as Result> }; let (_, reserved_variables) = tokio::try_join!(args_and_out_f, reserved_variables_f)?; @@ -1127,7 +1127,7 @@ try {{ build_loader( job_dir, base_internal_url, - &client.get_token().await, + &client.token, &job.workspace_id, job.runnable_path(), if annotation.nodejs { @@ -1145,7 +1145,7 @@ try {{ build_loader( job_dir, base_internal_url, - &client.get_token().await, + &client.token, &job.workspace_id, job.runnable_path(), if annotation.nodejs { diff --git a/backend/windmill-worker/src/common.rs b/backend/windmill-worker/src/common.rs index 3b9eadae96..67df5e2f23 100644 --- a/backend/windmill-worker/src/common.rs +++ b/backend/windmill-worker/src/common.rs @@ -39,14 +39,11 @@ use windmill_common::{variables, DB}; use tokio::{io::AsyncWriteExt, process::Child, time::Instant}; -use crate::{ - AuthedClient, AuthedClientBackgroundTask, JOB_DEFAULT_TIMEOUT, MAX_RESULT_SIZE, - MAX_TIMEOUT_DURATION, PATH_ENV, -}; +use crate::{AuthedClient, JOB_DEFAULT_TIMEOUT, MAX_RESULT_SIZE, MAX_TIMEOUT_DURATION, PATH_ENV}; pub async fn build_args_map<'a>( job: &'a MiniPulledJob, - client: &AuthedClientBackgroundTask, + client: &AuthedClient, db: &Pool, ) -> error::Result>>> { if let Some(args) = &job.args { @@ -74,7 +71,7 @@ pub fn check_executor_binary_exists( pub async fn build_args_values( job: &MiniPulledJob, - client: &AuthedClientBackgroundTask, + client: &AuthedClient, db: &Pool, ) -> error::Result> { if let Some(args) = &job.args { @@ -86,7 +83,7 @@ pub async fn build_args_values( #[tracing::instrument(level = "trace", skip_all)] pub async fn create_args_and_out_file( - client: &AuthedClientBackgroundTask, + client: &AuthedClient, job: &MiniPulledJob, job_dir: &str, db: &Pool, @@ -126,7 +123,7 @@ lazy_static::lazy_static! { } pub async fn transform_json<'a>( - client: &AuthedClientBackgroundTask, + client: &AuthedClient, workspace: &str, vs: &'a HashMap>, job: &MiniPulledJob, @@ -150,9 +147,7 @@ pub async fn transform_json<'a>( let value = serde_json::from_str(inner_vs).map_err(|e| { error::Error::internal_err(format!("Error while parsing inner arg: {e:#}")) })?; - let transformed = - transform_json_value(&k, &client.get_authed().await, workspace, value, job, db) - .await?; + let transformed = transform_json_value(&k, &client, workspace, value, job, db).await?; let as_raw = serde_json::from_value(transformed).map_err(|e| { error::Error::internal_err(format!("Error while parsing inner arg: {e:#}")) })?; @@ -165,7 +160,7 @@ pub async fn transform_json<'a>( } pub async fn transform_json_as_values<'a>( - client: &AuthedClientBackgroundTask, + client: &AuthedClient, workspace: &str, vs: &'a HashMap>, job: &MiniPulledJob, @@ -178,9 +173,7 @@ pub async fn transform_json_as_values<'a>( let value = serde_json::from_str(inner_vs).map_err(|e| { error::Error::internal_err(format!("Error while parsing inner arg: {e:#}")) })?; - let transformed = - transform_json_value(&k, &client.get_authed().await, workspace, value, job, db) - .await?; + let transformed = transform_json_value(&k, &client, workspace, value, job, db).await?; let as_raw = serde_json::from_value(transformed).map_err(|e| { error::Error::internal_err(format!("Error while parsing inner arg: {e:#}")) })?; @@ -283,40 +276,14 @@ pub async fn transform_json_value( // let path = y.strip_prefix("$res:").unwrap(); } Value::String(y) if y.starts_with("$") => { - let flow_path = if let Some(uuid) = job.parent_job { - sqlx::query_scalar!("SELECT runnable_path FROM v2_job WHERE id = $1", uuid) - .fetch_optional(db) - .await? - .flatten() - } else { - None - }; - - let variables = variables::get_reserved_variables( - db, - &job.workspace_id, - &client.token, - &job.permissioned_as_email, - &job.created_by, - &job.id.to_string(), - &job.permissioned_as, - job.runnable_path.clone(), - job.parent_job.map(|x| x.to_string()), - flow_path, - job.schedule_path(), - job.flow_step_id.clone(), - job.flow_innermost_root_job.clone().map(|x| x.to_string()), - None, - Some(job.scheduled_for.clone()), - ) - .await; + let variables = get_reserved_variables(job, &client.token, &db, None).await?; let name = y.strip_prefix("$").unwrap(); let value = variables .iter() - .find(|x| x.name == name) - .map(|x| x.value.clone()) + .find(|x| x.0 == name) + .map(|x| x.1.clone()) .unwrap_or_else(|| y); Ok(json!(value)) } @@ -417,8 +384,11 @@ pub async fn get_reserved_variables( job: &MiniPulledJob, token: &str, db: &sqlx::Pool, + parent_runnable_path: Option, ) -> Result, Error> { - let flow_path = if let Some(uuid) = job.parent_job { + let flow_path = if parent_runnable_path.is_some() { + parent_runnable_path + } else if let Some(uuid) = job.parent_job { sqlx::query_scalar!("SELECT runnable_path FROM v2_job WHERE id = $1", uuid) .fetch_optional(db) .await? diff --git a/backend/windmill-worker/src/csharp_executor.rs b/backend/windmill-worker/src/csharp_executor.rs index 811443d3b8..9acb32b684 100644 --- a/backend/windmill-worker/src/csharp_executor.rs +++ b/backend/windmill-worker/src/csharp_executor.rs @@ -36,7 +36,7 @@ use crate::{ }; use crate::common::OccupancyMetrics; -use crate::AuthedClientBackgroundTask; +use crate::AuthedClient; #[cfg(windows)] use crate::SYSTEM_ROOT; @@ -433,7 +433,8 @@ pub async fn handle_csharp_job( _canceled_by: &mut Option, _job: &MiniPulledJob, _db: &sqlx::Pool, - _client: &AuthedClientBackgroundTask, + _client: &AuthedClient, + _parent_runnable_path: Option, _inner_content: &str, _job_dir: &str, _requirements_o: Option<&String>, @@ -452,7 +453,8 @@ pub async fn handle_csharp_job( canceled_by: &mut Option, job: &MiniPulledJob, db: &sqlx::Pool, - client: &AuthedClientBackgroundTask, + client: &AuthedClient, + parent_runnable_path: Option, inner_content: &str, job_dir: &str, requirements_o: Option<&String>, @@ -534,8 +536,8 @@ pub async fn handle_csharp_job( let logs2 = format!("{cache_logs}\n\n--- C# CODE EXECUTION ---\n"); append_logs(&job.id, &job.workspace_id, format!("{}\n", logs2), db).await; - let client = &client.get_authed().await; - let reserved_variables = get_reserved_variables(job, &client.token, db).await?; + let reserved_variables = + get_reserved_variables(job, &client.token, db, parent_runnable_path).await?; let child = if !*DISABLE_NSJAIL { write_file( diff --git a/backend/windmill-worker/src/deno_executor.rs b/backend/windmill-worker/src/deno_executor.rs index 2bd979571c..2b93c86ab4 100644 --- a/backend/windmill-worker/src/deno_executor.rs +++ b/backend/windmill-worker/src/deno_executor.rs @@ -11,8 +11,8 @@ use crate::{ start_child_process, OccupancyMetrics, }, handle_child::handle_child, - AuthedClientBackgroundTask, DENO_CACHE_DIR, DENO_PATH, DISABLE_NSJAIL, HOME_ENV, - NPM_CONFIG_REGISTRY, PATH_ENV, TZ_ENV, + AuthedClient, DENO_CACHE_DIR, DENO_PATH, DISABLE_NSJAIL, HOME_ENV, NPM_CONFIG_REGISTRY, + PATH_ENV, TZ_ENV, }; use tokio::{fs::File, io::AsyncReadExt, process::Command}; use windmill_common::error::{self}; @@ -179,7 +179,8 @@ pub async fn handle_deno_job( canceled_by: &mut Option, job: &MiniPulledJob, db: &sqlx::Pool, - client: &AuthedClientBackgroundTask, + client: &AuthedClient, + parent_runnable_path: Option, job_dir: &str, inner_content: &String, base_internal_url: &str, @@ -318,21 +319,21 @@ try {{ Ok(()) as Result<()> }; let reserved_variables_f = async { - let client = client.get_authed().await; - let vars = get_reserved_variables(job, &client.token, db).await?; - Ok((vars, client.token)) as Result<(HashMap, String)> + let vars = get_reserved_variables(job, &client.token, db, parent_runnable_path).await?; + Ok(vars) as Result> }; let (_, reserved_variables) = tokio::try_join!(args_and_out_f, reserved_variables_f)?; - Ok(reserved_variables) as error::Result<(HashMap, String)> + Ok(reserved_variables) as error::Result> }; - let ((reserved_variables, token), _, _) = tokio::try_join!( + let (reserved_variables, _, _) = tokio::try_join!( reserved_variables_args_out_f, write_wrapper_f, write_import_map_f )?; - let mut common_deno_proc_envs = get_common_deno_proc_envs(&token, base_internal_url).await; + let mut common_deno_proc_envs = + get_common_deno_proc_envs(&client.token, base_internal_url).await; if !*DISABLE_NSJAIL { common_deno_proc_envs.insert("HOME".to_string(), job_dir.to_string()); } diff --git a/backend/windmill-worker/src/go_executor.rs b/backend/windmill-worker/src/go_executor.rs index 23aee36fa4..43e88c59aa 100644 --- a/backend/windmill-worker/src/go_executor.rs +++ b/backend/windmill-worker/src/go_executor.rs @@ -19,8 +19,8 @@ use crate::{ start_child_process, OccupancyMetrics, }, handle_child::handle_child, - AuthedClientBackgroundTask, DISABLE_NSJAIL, DISABLE_NUSER, GOPRIVATE, GOPROXY, - GO_BIN_CACHE_DIR, GO_CACHE_DIR, HOME_ENV, NSJAIL_PATH, PATH_ENV, TZ_ENV, + AuthedClient, DISABLE_NSJAIL, DISABLE_NUSER, GOPRIVATE, GOPROXY, GO_BIN_CACHE_DIR, + GO_CACHE_DIR, HOME_ENV, NSJAIL_PATH, PATH_ENV, TZ_ENV, }; const GO_REQ_SPLITTER: &str = "//go.sum\n"; @@ -37,7 +37,8 @@ pub async fn handle_go_job( canceled_by: &mut Option, job: &MiniPulledJob, db: &sqlx::Pool, - client: &AuthedClientBackgroundTask, + client: &AuthedClient, + parent_runnable_path: Option, inner_content: &str, job_dir: &str, requirements_o: Option<&String>, @@ -248,9 +249,8 @@ func Run(req Req) (interface{{}}, error){{ let logs2 = format!("{cache_logs}\n\n--- GO CODE EXECUTION ---\n"); append_logs(&job.id, &job.workspace_id, logs2, db).await; - let client = &client.get_authed().await; - - let reserved_variables = get_reserved_variables(job, &client.token, db).await?; + let reserved_variables = + get_reserved_variables(job, &client.token, db, parent_runnable_path).await?; let child = if !*DISABLE_NSJAIL { let _ = write_file( diff --git a/backend/windmill-worker/src/graphql_executor.rs b/backend/windmill-worker/src/graphql_executor.rs index 98e5ef9a32..c755d33beb 100644 --- a/backend/windmill-worker/src/graphql_executor.rs +++ b/backend/windmill-worker/src/graphql_executor.rs @@ -13,7 +13,7 @@ use serde::Deserialize; use crate::common::{build_http_client, resolve_job_timeout, OccupancyMetrics}; use crate::handle_child::run_future_with_polling_update_job_poller; -use crate::{common::build_args_map, AuthedClientBackgroundTask}; +use crate::{common::build_args_map, AuthedClient}; #[derive(Deserialize)] struct GraphqlApi { @@ -35,7 +35,7 @@ struct GraphqlError { pub async fn do_graphql( job: &MiniPulledJob, - client: &AuthedClientBackgroundTask, + client: &AuthedClient, query: &str, db: &sqlx::Pool, mem_peak: &mut i32, diff --git a/backend/windmill-worker/src/mssql_executor.rs b/backend/windmill-worker/src/mssql_executor.rs index ef06c8f0bf..659686268e 100644 --- a/backend/windmill-worker/src/mssql_executor.rs +++ b/backend/windmill-worker/src/mssql_executor.rs @@ -18,7 +18,7 @@ use windmill_queue::{append_logs, CanceledBy}; use crate::common::{build_args_values, OccupancyMetrics}; use crate::handle_child::run_future_with_polling_update_job_poller; use crate::sanitized_sql_params::sanitize_and_interpolate_unsafe_sql_args; -use crate::AuthedClientBackgroundTask; +use crate::AuthedClient; #[derive(Deserialize)] struct MssqlDatabase { @@ -36,7 +36,7 @@ lazy_static::lazy_static! { pub async fn do_mssql( job: &MiniPulledJob, - client: &AuthedClientBackgroundTask, + client: &AuthedClient, query: &str, db: &sqlx::Pool, mem_peak: &mut i32, @@ -51,8 +51,6 @@ pub async fn do_mssql( let db_arg = if let Some(inline_db_res_path) = inline_db_res_path { Some( client - .get_authed() - .await .get_resource_value_interpolated::( &inline_db_res_path, Some(job.id.to_string()), @@ -133,7 +131,8 @@ pub async fn do_mssql( .map_err(|x| Error::ExecutionErr(x.to_string()))? .args; - let (query, args_to_skip) = &sanitize_and_interpolate_unsafe_sql_args(query, &sig, &mssql_args)?; + let (query, args_to_skip) = + &sanitize_and_interpolate_unsafe_sql_args(query, &sig, &mssql_args)?; let mut prepared_query = Query::new(query.to_owned()); for arg in &sig { diff --git a/backend/windmill-worker/src/mysql_executor.rs b/backend/windmill-worker/src/mysql_executor.rs index ca8fa1a5c9..2cab8ce8b2 100644 --- a/backend/windmill-worker/src/mysql_executor.rs +++ b/backend/windmill-worker/src/mysql_executor.rs @@ -21,7 +21,10 @@ use windmill_queue::CanceledBy; use windmill_queue::MiniPulledJob; use crate::{ - common::{build_args_values, OccupancyMetrics}, handle_child::run_future_with_polling_update_job_poller, sanitized_sql_params::sanitize_and_interpolate_unsafe_sql_args, AuthedClientBackgroundTask + common::{build_args_values, OccupancyMetrics}, + handle_child::run_future_with_polling_update_job_poller, + sanitized_sql_params::sanitize_and_interpolate_unsafe_sql_args, + AuthedClient, }; #[derive(Deserialize)] @@ -101,7 +104,7 @@ pub fn do_mysql_inner<'a>( pub async fn do_mysql( job: &MiniPulledJob, - client: &AuthedClientBackgroundTask, + client: &AuthedClient, query: &str, db: &sqlx::Pool, mem_peak: &mut i32, @@ -115,14 +118,14 @@ pub async fn do_mysql( let inline_db_res_path = parse_db_resource(&query); let db_arg = if let Some(inline_db_res_path) = inline_db_res_path { - Some(client - .get_authed() - .await - .get_resource_value_interpolated::( - &inline_db_res_path, - Some(job.id.to_string()), - ) - .await?) + Some( + client + .get_resource_value_interpolated::( + &inline_db_res_path, + Some(job.id.to_string()), + ) + .await?, + ) } else { job_args.get("database").cloned() }; @@ -171,7 +174,8 @@ pub async fn do_mysql( } let arg_t = arg.otyp.clone().unwrap_or_else(|| "text".to_string()); let arg_n = arg.name.clone(); - let mysql_v = match job_args.get(arg.name.as_str()) + let mysql_v = match job_args + .get(arg.name.as_str()) .unwrap_or_else(|| &json!(null)) { Value::Null => mysql_async::Value::NULL, diff --git a/backend/windmill-worker/src/nu_executor.rs b/backend/windmill-worker/src/nu_executor.rs index 2859e016b8..e40e1029f4 100644 --- a/backend/windmill-worker/src/nu_executor.rs +++ b/backend/windmill-worker/src/nu_executor.rs @@ -13,8 +13,7 @@ use crate::{ create_args_and_out_file, get_reserved_variables, read_result, start_child_process, OccupancyMetrics, }, - handle_child, AuthedClientBackgroundTask, DISABLE_NSJAIL, DISABLE_NUSER, NSJAIL_PATH, PATH_ENV, - PROXY_ENVS, + handle_child, AuthedClient, DISABLE_NSJAIL, DISABLE_NUSER, NSJAIL_PATH, PATH_ENV, PROXY_ENVS, }; const NSJAIL_CONFIG_RUN_NU_CONTENT: &str = include_str!("../nsjail/run.nu.config.proto"); @@ -29,7 +28,8 @@ lazy_static::lazy_static! { pub(crate) struct JobHandlerInput<'a> { pub base_internal_url: &'a str, pub canceled_by: &'a mut Option, - pub client: &'a AuthedClientBackgroundTask, + pub client: &'a AuthedClient, + pub parent_runnable_path: Option, pub db: &'a sqlx::Pool, pub envs: HashMap, pub inner_content: &'a str, @@ -221,14 +221,15 @@ async fn run<'a>( job_dir, shared_mount, client, + parent_runnable_path, envs, base_internal_url, .. }: &mut JobHandlerInput<'a>, // plugins: Vec<&'a str>, ) -> Result<(), Error> { - let client = &client.get_authed().await; - let reserved_variables = get_reserved_variables(job, &client.token, db).await?; + let reserved_variables = + get_reserved_variables(job, &client.token, db, parent_runnable_path.clone()).await?; let child = if !cfg!(windows) && !*DISABLE_NSJAIL { append_logs( &job.id, diff --git a/backend/windmill-worker/src/oracledb_executor.rs b/backend/windmill-worker/src/oracledb_executor.rs index 7f340b8525..2020e421df 100644 --- a/backend/windmill-worker/src/oracledb_executor.rs +++ b/backend/windmill-worker/src/oracledb_executor.rs @@ -23,7 +23,7 @@ use crate::{ common::{build_args_values, check_executor_binary_exists, OccupancyMetrics}, handle_child::run_future_with_polling_update_job_poller, sanitized_sql_params::sanitize_and_interpolate_unsafe_sql_args, - AuthedClientBackgroundTask, + AuthedClient, }; #[derive(Deserialize)] @@ -233,7 +233,8 @@ fn get_statement_values( } let arg_t = arg.otyp.clone().unwrap_or_else(|| "text".to_string()); let arg_n = arg.name.clone(); - let oracle_v: Box = match job_args.get(arg.name.as_str()) + let oracle_v: Box = match job_args + .get(arg.name.as_str()) .unwrap_or_else(|| &json!(null)) { // Value::Null => todo!(), @@ -293,7 +294,7 @@ fn get_statement_values( pub async fn do_oracledb( job: &MiniPulledJob, - client: &AuthedClientBackgroundTask, + client: &AuthedClient, query: &str, db: &sqlx::Pool, mem_peak: &mut i32, @@ -315,8 +316,6 @@ pub async fn do_oracledb( let db_arg = if let Some(inline_db_res_path) = inline_db_res_path { Some( client - .get_authed() - .await .get_resource_value_interpolated::( &inline_db_res_path, Some(job.id.to_string()), diff --git a/backend/windmill-worker/src/pg_executor.rs b/backend/windmill-worker/src/pg_executor.rs index 2847389ca7..e9aa27eca9 100644 --- a/backend/windmill-worker/src/pg_executor.rs +++ b/backend/windmill-worker/src/pg_executor.rs @@ -37,7 +37,7 @@ use windmill_queue::{CanceledBy, MiniPulledJob}; use crate::common::{build_args_values, sizeof_val, OccupancyMetrics}; use crate::handle_child::run_future_with_polling_update_job_poller; use crate::sanitized_sql_params::sanitize_and_interpolate_unsafe_sql_args; -use crate::{AuthedClientBackgroundTask, MAX_RESULT_SIZE}; +use crate::{AuthedClient, MAX_RESULT_SIZE}; use bytes::Buf; use lazy_static::lazy_static; use urlencoding::encode; @@ -159,7 +159,7 @@ fn do_postgresql_inner<'a>( pub async fn do_postgresql( job: &MiniPulledJob, - client: &AuthedClientBackgroundTask, + client: &AuthedClient, query: &str, db: &sqlx::Pool, mem_peak: &mut i32, @@ -175,8 +175,6 @@ pub async fn do_postgresql( let db_arg = if let Some(inline_db_res_path) = inline_db_res_path { Some( client - .get_authed() - .await .get_resource_value_interpolated::( &inline_db_res_path, Some(job.id.to_string()), @@ -293,8 +291,7 @@ pub async fn do_postgresql( let sig = parse_pgsql_sig(&query).map_err(|x| Error::ExecutionErr(x.to_string()))?; - let (query, _) = - &sanitize_and_interpolate_unsafe_sql_args(query, &sig.args, &pg_args)?; + let (query, _) = &sanitize_and_interpolate_unsafe_sql_args(query, &sig.args, &pg_args)?; let queries = parse_sql_blocks(query); diff --git a/backend/windmill-worker/src/php_executor.rs b/backend/windmill-worker/src/php_executor.rs index fa5eb58c16..19dce7f1b9 100644 --- a/backend/windmill-worker/src/php_executor.rs +++ b/backend/windmill-worker/src/php_executor.rs @@ -20,8 +20,8 @@ use crate::{ read_result, start_child_process, OccupancyMetrics, }, handle_child::handle_child, - AuthedClientBackgroundTask, COMPOSER_CACHE_DIR, COMPOSER_PATH, DISABLE_NSJAIL, DISABLE_NUSER, - NSJAIL_PATH, PHP_PATH, + AuthedClient, COMPOSER_CACHE_DIR, COMPOSER_PATH, DISABLE_NSJAIL, DISABLE_NUSER, NSJAIL_PATH, + PHP_PATH, }; const NSJAIL_CONFIG_RUN_PHP_CONTENT: &str = include_str!("../nsjail/run.php.config.proto"); @@ -139,7 +139,8 @@ pub async fn handle_php_job( canceled_by: &mut Option, job: &MiniPulledJob, db: &sqlx::Pool, - client: &AuthedClientBackgroundTask, + client: &AuthedClient, + parent_runnable_path: Option, job_dir: &str, inner_content: &String, base_internal_url: &str, @@ -265,8 +266,8 @@ try {{ Ok(()) as Result<()> }; let reserved_variables_f = async { - let client = client.get_authed().await; - let vars = get_reserved_variables(job, &client.token, db).await?; + let vars = get_reserved_variables(job, &client.token, db, parent_runnable_path.clone()) + .await?; Ok(vars) as Result> }; let (_, reserved_variables) = tokio::try_join!(args_and_out_f, reserved_variables_f)?; diff --git a/backend/windmill-worker/src/python_executor.rs b/backend/windmill-worker/src/python_executor.rs index d39580d285..648c40a9a3 100644 --- a/backend/windmill-worker/src/python_executor.rs +++ b/backend/windmill-worker/src/python_executor.rs @@ -76,9 +76,8 @@ use crate::{ start_child_process, OccupancyMetrics, }, handle_child::handle_child, - AuthedClientBackgroundTask, DISABLE_NSJAIL, DISABLE_NUSER, HOME_ENV, INSTANCE_PYTHON_VERSION, - NSJAIL_PATH, PATH_ENV, PIP_EXTRA_INDEX_URL, PIP_INDEX_URL, PROXY_ENVS, PY_INSTALL_DIR, TZ_ENV, - UV_CACHE_DIR, + AuthedClient, DISABLE_NSJAIL, DISABLE_NUSER, HOME_ENV, INSTANCE_PYTHON_VERSION, NSJAIL_PATH, + PATH_ENV, PIP_EXTRA_INDEX_URL, PIP_INDEX_URL, PROXY_ENVS, PY_INSTALL_DIR, TZ_ENV, UV_CACHE_DIR, }; // To change latest stable version: @@ -839,7 +838,8 @@ pub async fn handle_python_job( mem_peak: &mut i32, canceled_by: &mut Option, db: &sqlx::Pool, - client: &AuthedClientBackgroundTask, + client: &AuthedClient, + parent_runnable_path: Option, inner_content: &String, shared_mount: &str, base_internal_url: &str, @@ -1024,8 +1024,8 @@ except BaseException as e: tracing::debug!("Finished writing wrapper"); - let client = client.get_authed().await; - let mut reserved_variables = get_reserved_variables(job, &client.token, db).await?; + let mut reserved_variables = + get_reserved_variables(job, &client.token, db, parent_runnable_path).await?; // Add /tmp/windmill/cache/python_xyz/global-site-packages to PYTHONPATH. // Usefull if certain wheels needs to be preinstalled before execution. diff --git a/backend/windmill-worker/src/result_processor.rs b/backend/windmill-worker/src/result_processor.rs index 966991d0ea..4c2e9fa7a0 100644 --- a/backend/windmill-worker/src/result_processor.rs +++ b/backend/windmill-worker/src/result_processor.rs @@ -235,7 +235,7 @@ async fn send_job_completed( canceled_by: Option, success: bool, cached_res_path: Option, - token: String, + token: &str, duration: Option, ) { let jc = JobCompleted { @@ -246,7 +246,7 @@ async fn send_job_completed( canceled_by, success, cached_res_path, - token, + token: token.to_string(), duration, }; job_completed_tx @@ -264,7 +264,7 @@ pub async fn process_result( mem_peak: i32, canceled_by: Option, cached_res_path: Option, - token: String, + token: &str, column_order: Option>, new_args: Option>>, db: &DB, diff --git a/backend/windmill-worker/src/rust_executor.rs b/backend/windmill-worker/src/rust_executor.rs index b3fbb08d35..d2a0c3217d 100644 --- a/backend/windmill-worker/src/rust_executor.rs +++ b/backend/windmill-worker/src/rust_executor.rs @@ -19,8 +19,8 @@ use crate::{ read_result, start_child_process, OccupancyMetrics, }, handle_child::handle_child, - AuthedClientBackgroundTask, DISABLE_NSJAIL, DISABLE_NUSER, HOME_ENV, NSJAIL_PATH, PATH_ENV, - PROXY_ENVS, RUST_CACHE_DIR, TZ_ENV, + AuthedClient, DISABLE_NSJAIL, DISABLE_NUSER, HOME_ENV, NSJAIL_PATH, PATH_ENV, PROXY_ENVS, + RUST_CACHE_DIR, TZ_ENV, }; #[cfg(windows)] @@ -277,7 +277,8 @@ pub async fn handle_rust_job( canceled_by: &mut Option, job: &MiniPulledJob, db: &sqlx::Pool, - client: &AuthedClientBackgroundTask, + client: &AuthedClient, + parent_runnable_path: Option, inner_content: &str, job_dir: &str, requirements_o: Option<&String>, @@ -343,8 +344,8 @@ pub async fn handle_rust_job( let logs2 = format!("{cache_logs}\n\n--- RUST CODE EXECUTION ---\n"); append_logs(&job.id, &job.workspace_id, logs2, db).await; - let client = &client.get_authed().await; - let reserved_variables = get_reserved_variables(job, &client.token, db).await?; + let reserved_variables = + get_reserved_variables(job, &client.token, db, parent_runnable_path).await?; let child = if !*DISABLE_NSJAIL { let _ = write_file( diff --git a/backend/windmill-worker/src/sanitized_sql_params.rs b/backend/windmill-worker/src/sanitized_sql_params.rs index c7eb3b6ef4..465b67658f 100644 --- a/backend/windmill-worker/src/sanitized_sql_params.rs +++ b/backend/windmill-worker/src/sanitized_sql_params.rs @@ -10,7 +10,10 @@ use windmill_parser_sql::{SANITIZED_ENUM_STR, SANITIZED_RAW_STRING_STR}; /// a number, that can contain underscores fn sanitize_identifier(arg: &Arg, input: &str) -> Result<(), error::Error> { if input.is_empty() { - return Err(error::Error::BadRequest(format!("Interpolated argument `{}` cannot be empty", arg.name))); + return Err(error::Error::BadRequest(format!( + "Interpolated argument `{}` cannot be empty", + arg.name + ))); } if input .chars() diff --git a/backend/windmill-worker/src/snowflake_executor.rs b/backend/windmill-worker/src/snowflake_executor.rs index 30f1188ce0..377c553d56 100644 --- a/backend/windmill-worker/src/snowflake_executor.rs +++ b/backend/windmill-worker/src/snowflake_executor.rs @@ -19,7 +19,7 @@ use serde::{Deserialize, Serialize}; use crate::common::{build_http_client, resolve_job_timeout, OccupancyMetrics}; use crate::handle_child::run_future_with_polling_update_job_poller; use crate::sanitized_sql_params::sanitize_and_interpolate_unsafe_sql_args; -use crate::{common::build_args_values, AuthedClientBackgroundTask}; +use crate::{common::build_args_values, AuthedClient}; #[derive(Serialize)] struct Claims { @@ -247,7 +247,7 @@ fn do_snowflake_inner<'a>( pub async fn do_snowflake( job: &MiniPulledJob, - client: &AuthedClientBackgroundTask, + client: &AuthedClient, query: &str, db: &sqlx::Pool, mem_peak: &mut i32, @@ -263,8 +263,6 @@ pub async fn do_snowflake( let db_arg = if let Some(inline_db_res_path) = inline_db_res_path { Some( client - .get_authed() - .await .get_resource_value_interpolated::( &inline_db_res_path, Some(job.id.to_string()), diff --git a/backend/windmill-worker/src/worker.rs b/backend/windmill-worker/src/worker.rs index 6f7bd1f16a..c696dbe6c6 100644 --- a/backend/windmill-worker/src/worker.rs +++ b/backend/windmill-worker/src/worker.rs @@ -160,20 +160,10 @@ use crate::bench::{benchmark_init, BenchmarkInfo, BenchmarkIter}; use windmill_common::add_time; -pub async fn create_token_for_owner_in_bg( - db: &Pool, - job: &MiniPulledJob, -) -> Arc> { - let rw_lock = Arc::new(RwLock::new(String::new())); +// struct Permission +pub async fn create_token(db: &DB, job: &MiniPulledJob, perms: Option) -> String { // skipping test runs if job.workspace_id != "" { - let mut locked = rw_lock.clone().write_owned().await; - let db = db.clone(); - let w_id = job.workspace_id.clone(); - let owner = job.permissioned_as.clone(); - let email = job.permissioned_as_email.clone(); - let job_id = job.id.clone(); - let label = if job.permissioned_as != format!("u/{}", job.created_by) && job.permissioned_as != job.created_by { @@ -181,23 +171,22 @@ pub async fn create_token_for_owner_in_bg( } else { "ephemeral-script".to_string() }; - tokio::spawn(async move { - let token = create_token_for_owner( - &db.clone(), - &w_id, - &owner, - &label, - *SCRIPT_TOKEN_EXPIRY, - &email, - &job_id, - ) - .warn_after_seconds(5) - .await - .expect("could not create job token"); - *locked = token; - }); - }; - return rw_lock; + create_token_for_owner( + &db, + &job.workspace_id, + &job.permissioned_as, + &label, + *SCRIPT_TOKEN_EXPIRY, + &job.permissioned_as_email, + &job.id, + perms, + ) + .warn_after_seconds(5) + .await + .expect("could not create job token") + } else { + return "".to_string(); + } } #[tracing::instrument(level = "trace", skip_all)] @@ -209,21 +198,27 @@ pub async fn create_token_for_owner( expires_in: u64, email: &str, job_id: &Uuid, + perms: Option, ) -> error::Result { // TODO: Bad implementation. We should not have access to this DB here. if let Some(token) = JOB_TOKEN.as_ref() { return Ok(token.clone()); } - let job_authed = match sqlx::query_as!( - JobPerms, - "SELECT * FROM job_perms WHERE job_id = $1 AND workspace_id = $2", - job_id, - w_id - ) + let job_perms = if perms.is_some() { + Ok(perms) + } else { + sqlx::query_as!( + JobPerms, + "SELECT email, username, is_admin, is_operator, groups, folders FROM job_perms WHERE job_id = $1 AND workspace_id = $2", + job_id, + w_id + ) .fetch_optional(db) .await - { + }; + + let job_authed = match job_perms { Ok(Some(jp)) => jp.into(), _ => { tracing::warn!("Could not get permissions for job {job_id} from job_perms table, getting permissions directly..."); @@ -460,25 +455,6 @@ pub const MAX_RESULT_SIZE: usize = 1024 * 1024 * 2; // 2MB pub const INIT_SCRIPT_TAG: &str = "init_script"; -pub struct AuthedClientBackgroundTask { - pub base_internal_url: String, - pub workspace: String, - pub token: Arc>, -} - -impl AuthedClientBackgroundTask { - pub async fn get_authed(&self) -> AuthedClient { - return AuthedClient { - base_internal_url: self.base_internal_url.clone(), - workspace: self.workspace.clone(), - token: self.get_token().await, - force_client: None, - }; - } - pub async fn get_token(&self) -> String { - return self.token.read().await.clone(); - } -} #[derive(Clone)] pub struct AuthedClient { pub base_internal_url: String, @@ -1322,35 +1298,43 @@ pub async fn run_worker( v2_job.created_by, v2_job_queue.started_at, scheduled_for, - runnable_path, - kind, - runnable_id, - canceled_reason, - canceled_by, - permissioned_as, - permissioned_as_email, - flow_status, + v2_job.runnable_path, + v2_job.kind, + v2_job.runnable_id, + v2_job_queue.canceled_reason, + v2_job_queue.canceled_by, + v2_job.permissioned_as, + v2_job.permissioned_as_email, + v2_job_status.flow_status, v2_job.tag, - script_lang, - same_worker, - pre_run_error, - concurrent_limit, - concurrency_time_window_s, - flow_innermost_root_job, - timeout, - flow_step_id, - cache_ttl, + v2_job.script_lang, + v2_job.same_worker, + v2_job.pre_run_error, + v2_job.concurrent_limit, + v2_job.concurrency_time_window_s, + v2_job.flow_innermost_root_job, + v2_job.timeout, + v2_job.flow_step_id, + v2_job.cache_ttl, v2_job_queue.priority, - preprocessed, - script_entrypoint_override, - trigger, - trigger_kind, - visible_to_owner, - raw_code, - raw_lock, - raw_flow - FROM v2_job_queue INNER JOIN v2_job ON v2_job.id = v2_job_queue.id LEFT JOIN v2_job_status ON v2_job_status.id = v2_job_queue.id WHERE v2_job_queue.id = $1 - ", + v2_job.preprocessed, + v2_job.script_entrypoint_override, + v2_job.trigger, + v2_job.trigger_kind, + v2_job.visible_to_owner, + v2_job.raw_code, + v2_job.raw_lock, + v2_job.raw_flow, + pj.runnable_path as parent_runnable_path, + p.email as permissioned_as_email, p.username as permissioned_as_username, p.is_admin as permissioned_as_is_admin, + p.is_operator as permissioned_as_is_operator, p.groups as permissioned_as_groups, p.folders as permissioned_as_folders + FROM v2_job_queue + INNER JOIN v2_job ON v2_job.id = v2_job_queue.id + LEFT JOIN v2_job_status ON v2_job_status.id = v2_job_queue.id + LEFT JOIN job_perms p ON p.job_id = v2_job.id + LEFT JOIN v2_job pj ON v2_job.parent_job = pj.id + WHERE v2_job_queue.id = $1 +", ) .bind(same_worker_job.job_id) .fetch_optional(db) @@ -1526,7 +1510,6 @@ pub async fn run_worker( .expect("send job completed END"); add_time!(bench, "sent job completed"); } else { - let token = create_token_for_owner_in_bg(&db, &job).await; add_outstanding_wait_time(&job, db, OUTSTANDING_WAIT_TIME_THRESHOLD_MS); #[cfg(feature = "prometheus")] @@ -1627,17 +1610,57 @@ pub async fn run_worker( .expect("could not create shared dir"); } - let authed_client = AuthedClientBackgroundTask { - base_internal_url: base_internal_url.to_string(), - token, - workspace: job.workspace_id.to_string(), - }; - #[cfg(feature = "prometheus")] let tag = job.tag.clone(); let is_init_script: bool = job.tag.as_str() == INIT_SCRIPT_TAG; - let PulledJob { job, raw_code, raw_lock, raw_flow } = job; + let PulledJob { + job, + raw_code, + raw_lock, + raw_flow, + parent_runnable_path, + permissioned_as_email, + permissioned_as_username, + permissioned_as_is_admin, + permissioned_as_is_operator, + permissioned_as_groups, + permissioned_as_folders, + } = job; + let job_perms = match ( + permissioned_as_email, + permissioned_as_username, + permissioned_as_is_admin, + permissioned_as_is_operator, + permissioned_as_groups, + permissioned_as_folders, + ) { + ( + Some(email), + Some(username), + Some(is_admin), + Some(is_operator), + Some(groups), + Some(folders), + ) => Some(JobPerms { + email, + username, + is_admin, + is_operator, + groups, + folders, + }), + _ => None, + }; + + let token = create_token(&db, &job, job_perms).await; + let authed_client = AuthedClient { + base_internal_url: base_internal_url.to_string(), + token, + workspace: job.workspace_id.to_string(), + force_client: None, + }; + let arc_job = Arc::new(job); add_time!(bench, "handle_queued_job START"); @@ -1678,6 +1701,7 @@ pub async fn run_worker( raw_code, raw_lock, raw_flow, + parent_runnable_path, db, &authed_client, &hostname, @@ -1698,7 +1722,7 @@ pub async fn run_worker( Err(err) => { handle_job_error( db, - &authed_client.get_authed().await, + &authed_client, arc_job.as_ref(), 0, None, @@ -1923,7 +1947,7 @@ pub struct JobCompleted { async fn do_nativets( job: &MiniPulledJob, - client: &AuthedClientBackgroundTask, + client: &AuthedClient, env_code: String, code: String, db: &Pool, @@ -1968,8 +1992,9 @@ async fn handle_queued_job( raw_code: Option, raw_lock: Option, raw_flow: Option>>, + parent_runnable_path: Option, db: &DB, - client: &AuthedClientBackgroundTask, + client: &AuthedClient, hostname: &str, worker_name: &str, worker_dir: &str, @@ -2081,17 +2106,15 @@ async fn handle_queued_job( }; let cached_res_path = if job.cache_ttl.is_some() { - Some(cached_result_path(db, &client.get_authed().await, &job, preview_data.as_ref()).await) + Some(cached_result_path(db, &client, &job, preview_data.as_ref()).await) } else { None }; if let Some(cached_res_path) = cached_res_path.as_ref() { - let authed_client = client.get_authed().await; - let cached_result_maybe = get_cached_resource_value_if_valid( db, - &authed_client, + &client, &job.id, &job.workspace_id, &cached_res_path, @@ -2113,7 +2136,7 @@ async fn handle_queued_job( canceled_by: None, success: true, cached_res_path: None, - token: authed_client.token, + token: client.token.clone(), duration: None, }) .await @@ -2132,7 +2155,7 @@ async fn handle_queued_job( job, &flow_data, db, - &client.get_authed().await, + &client, None, same_worker_tx, worker_dir, @@ -2193,7 +2216,7 @@ async fn handle_queued_job( worker_name, worker_dir, base_internal_url, - &client.get_token().await, + &client.token, occupancy_metrics, ) .await @@ -2209,7 +2232,7 @@ async fn handle_queued_job( worker_name, worker_dir, base_internal_url, - &client.get_token().await, + &client.token, occupancy_metrics, ) .await @@ -2223,7 +2246,7 @@ async fn handle_queued_job( worker_name, worker_dir, base_internal_url, - &client.get_token().await, + &client.token, occupancy_metrics, ) .await @@ -2246,6 +2269,7 @@ async fn handle_queued_job( preview_data, db, client, + parent_runnable_path, job_dir, worker_dir, &mut mem_peak, @@ -2284,7 +2308,7 @@ async fn handle_queued_job( mem_peak, canceled_by, cached_res_path, - client.get_token().await, + &client.token, column_order, new_args, db, @@ -2421,9 +2445,7 @@ async fn try_validate_schema( }; let sv = match job.runnable_id { - Some(hash) - if job.kind != JobKind::Preview && job.kind != JobKind::FlowPreview => - { + Some(hash) if job.kind != JobKind::Preview && job.kind != JobKind::FlowPreview => { sv_fut.cached(validators_cache, (sub_key, hash)).await? } _ => sv_fut.await?, @@ -2464,7 +2486,8 @@ async fn handle_code_execution_job( job: &MiniPulledJob, preview: Option>, db: &sqlx::Pool, - client: &AuthedClientBackgroundTask, + client: &AuthedClient, + parent_runnable_path: Option, job_dir: &str, #[allow(unused_variables)] worker_dir: &str, mem_peak: &mut i32, @@ -2754,7 +2777,8 @@ async fn handle_code_execution_job( ) .await; - let reserved_variables = get_reserved_variables(job, &client.get_token().await, db).await?; + let reserved_variables = + get_reserved_variables(job, &client.token, db, parent_runnable_path).await?; let env_code = format!( "const process = {{ env: {{}} }};\nconst BASE_URL = '{base_internal_url}';\nconst BASE_INTERNAL_URL = '{base_internal_url}';\nprocess.env['BASE_URL'] = BASE_URL;process.env['BASE_INTERNAL_URL'] = BASE_INTERNAL_URL;\n{}", @@ -2839,6 +2863,7 @@ mount {{ canceled_by, db, client, + parent_runnable_path, &code, &shared_mount, base_internal_url, @@ -2856,6 +2881,7 @@ mount {{ job, db, client, + parent_runnable_path, job_dir, &code, base_internal_url, @@ -2875,6 +2901,7 @@ mount {{ job, db, client, + parent_runnable_path, job_dir, &code, base_internal_url, @@ -2893,6 +2920,7 @@ mount {{ job, db, client, + parent_runnable_path, &code, job_dir, lock.as_ref(), @@ -2911,6 +2939,7 @@ mount {{ job, db, client, + parent_runnable_path, &code, job_dir, &shared_mount, @@ -2929,6 +2958,7 @@ mount {{ job, db, client, + parent_runnable_path, &code, job_dir, &shared_mount, @@ -2953,6 +2983,7 @@ mount {{ job, db, client, + parent_runnable_path, job_dir, &code, base_internal_url, @@ -2976,6 +3007,7 @@ mount {{ job, db, client, + parent_runnable_path, &code, job_dir, lock.as_ref(), @@ -3004,6 +3036,7 @@ mount {{ canceled_by, db, client, + parent_runnable_path, &code, &shared_mount, base_internal_url, @@ -3019,6 +3052,7 @@ mount {{ job, db, client, + parent_runnable_path, &code, job_dir, lock.as_ref(), @@ -3043,6 +3077,7 @@ mount {{ job, db, client, + parent_runnable_path, inner_content: &code, job_dir, requirements_o: lock.as_ref(), diff --git a/backend/windmill-worker/src/worker_flow.rs b/backend/windmill-worker/src/worker_flow.rs index 0b1b049f4c..d8c9a0a410 100644 --- a/backend/windmill-worker/src/worker_flow.rs +++ b/backend/windmill-worker/src/worker_flow.rs @@ -2651,7 +2651,7 @@ async fn push_next_flow_job( { sqlx::query_as!( JobPerms, - "SELECT * FROM job_perms WHERE job_id = $1 AND workspace_id = $2", + "SELECT email, username, is_admin, is_operator, groups, folders FROM job_perms WHERE job_id = $1 AND workspace_id = $2", root_job, flow_job.workspace_id, ) @@ -2940,15 +2940,17 @@ async fn push_next_flow_job( .execute(&mut *tx) .await?; - tx.commit().warn_after_seconds(3).await?; - tracing::info!(id = %flow_job.id, root_id = %job_root, "all next flow jobs pushed: {uuids:?}"); - if continue_on_same_worker { if !is_one_uuid { return Err(Error::BadRequest( "Cannot continue on same worker with multiple jobs, parallel cannot be used in conjunction with same_worker".to_string(), )); } + } + tx.commit().warn_after_seconds(3).await?; + tracing::info!(id = %flow_job.id, root_id = %job_root, "all next flow jobs pushed: {uuids:?}"); + + if continue_on_same_worker { same_worker_tx .send(SameWorkerPayload { job_id: first_uuid, recoverable: true }) .await From ec11d577c6089df0b6019cd05064f5ea63fb317c Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Mon, 24 Mar 2025 22:00:15 +0100 Subject: [PATCH 083/739] fix: improve cancel for flows with many substeps --- ...bb36bdece81385380a42ca06ca6be19694896.json | 25 +++++++ ...f2e6606bfc0f440fbdbbdf4dd3234068c9345.json | 29 ++++++++ ...c538fbb54ad269ec81aea89e431a511245a1e.json | 23 ------- backend/windmill-queue/src/jobs.rs | 68 ++++++++++++++----- .../src/lib/components/FlowBuilder.svelte | 4 +- 5 files changed, 107 insertions(+), 42 deletions(-) create mode 100644 backend/.sqlx/query-21204693fa8608c78151f63fa76bb36bdece81385380a42ca06ca6be19694896.json create mode 100644 backend/.sqlx/query-5e8ba1850b2520bd4bf030f53f1f2e6606bfc0f440fbdbbdf4dd3234068c9345.json delete mode 100644 backend/.sqlx/query-eb68469026be39048c5f42a80a2c538fbb54ad269ec81aea89e431a511245a1e.json diff --git a/backend/.sqlx/query-21204693fa8608c78151f63fa76bb36bdece81385380a42ca06ca6be19694896.json b/backend/.sqlx/query-21204693fa8608c78151f63fa76bb36bdece81385380a42ca06ca6be19694896.json new file mode 100644 index 0000000000..5454fdf323 --- /dev/null +++ b/backend/.sqlx/query-21204693fa8608c78151f63fa76bb36bdece81385380a42ca06ca6be19694896.json @@ -0,0 +1,25 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE v2_job_queue SET canceled_by = $1, canceled_reason = $2, scheduled_for = now(), suspend = 0 WHERE id = ANY($3) AND workspace_id = $4 AND (canceled_by IS NULL OR canceled_reason != $2) RETURNING id", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Uuid" + } + ], + "parameters": { + "Left": [ + "Varchar", + "Text", + "UuidArray", + "Text" + ] + }, + "nullable": [ + false + ] + }, + "hash": "21204693fa8608c78151f63fa76bb36bdece81385380a42ca06ca6be19694896" +} diff --git a/backend/.sqlx/query-5e8ba1850b2520bd4bf030f53f1f2e6606bfc0f440fbdbbdf4dd3234068c9345.json b/backend/.sqlx/query-5e8ba1850b2520bd4bf030f53f1f2e6606bfc0f440fbdbbdf4dd3234068c9345.json new file mode 100644 index 0000000000..a3751998fb --- /dev/null +++ b/backend/.sqlx/query-5e8ba1850b2520bd4bf030f53f1f2e6606bfc0f440fbdbbdf4dd3234068c9345.json @@ -0,0 +1,29 @@ +{ + "db_name": "PostgreSQL", + "query": "\nWITH RECURSIVE job_tree AS (\n -- Base case: direct children of the given parent job\n SELECT id, parent_job, 1 AS depth\n FROM v2_job_queue \n INNER JOIN v2_job USING (id)\n WHERE parent_job = $1 AND v2_job.workspace_id = $2\n\n UNION ALL\n\n -- Recursive case: fetch children of previously found jobs\n SELECT q.id, j.parent_job, t.depth + 1\n FROM v2_job_queue q\n INNER JOIN v2_job j USING (id)\n INNER JOIN job_tree t ON t.id = j.parent_job\n WHERE j.workspace_id = $2 AND t.depth < 500 -- Limit recursion depth to 500\n)\nSELECT id AS id, depth\nFROM job_tree\nORDER BY depth, id\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Uuid" + }, + { + "ordinal": 1, + "name": "depth", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Uuid", + "Text" + ] + }, + "nullable": [ + null, + null + ] + }, + "hash": "5e8ba1850b2520bd4bf030f53f1f2e6606bfc0f440fbdbbdf4dd3234068c9345" +} diff --git a/backend/.sqlx/query-eb68469026be39048c5f42a80a2c538fbb54ad269ec81aea89e431a511245a1e.json b/backend/.sqlx/query-eb68469026be39048c5f42a80a2c538fbb54ad269ec81aea89e431a511245a1e.json deleted file mode 100644 index 60a98ba32a..0000000000 --- a/backend/.sqlx/query-eb68469026be39048c5f42a80a2c538fbb54ad269ec81aea89e431a511245a1e.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT id AS \"id!\" FROM v2_job_queue INNER JOIN v2_job USING (id) WHERE parent_job = $1 AND v2_job.workspace_id = $2", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id!", - "type_info": "Uuid" - } - ], - "parameters": { - "Left": [ - "Uuid", - "Text" - ] - }, - "nullable": [ - false - ] - }, - "hash": "eb68469026be39048c5f42a80a2c538fbb54ad269ec81aea89e431a511245a1e" -} diff --git a/backend/windmill-queue/src/jobs.rs b/backend/windmill-queue/src/jobs.rs index 394d04e366..865b7d47bc 100644 --- a/backend/windmill-queue/src/jobs.rs +++ b/backend/windmill-queue/src/jobs.rs @@ -245,22 +245,40 @@ pub async fn cancel_job<'c>( let job = Arc::new(job); - // get all children - let mut jobs = vec![job.id]; - let mut jobs_to_cancel = vec![]; - while !jobs.is_empty() { - let p_job = jobs.pop(); - let new_jobs = sqlx::query_scalar!( - "SELECT id AS \"id!\" FROM v2_job_queue INNER JOIN v2_job USING (id) WHERE parent_job = $1 AND v2_job.workspace_id = $2", - p_job, - w_id - ) - .fetch_all(&mut *tx) - .await?; - jobs.extend(new_jobs.clone()); - jobs_to_cancel.extend(new_jobs); - } - jobs.reverse(); + // get all children using recursive CTE + let mut jobs_to_cancel = sqlx::query!( + r#" +WITH RECURSIVE job_tree AS ( + -- Base case: direct children of the given parent job + SELECT id, parent_job, 1 AS depth + FROM v2_job_queue + INNER JOIN v2_job USING (id) + WHERE parent_job = $1 AND v2_job.workspace_id = $2 + + UNION ALL + + -- Recursive case: fetch children of previously found jobs + SELECT q.id, j.parent_job, t.depth + 1 + FROM v2_job_queue q + INNER JOIN v2_job j USING (id) + INNER JOIN job_tree t ON t.id = j.parent_job + WHERE j.workspace_id = $2 AND t.depth < 500 -- Limit recursion depth to 500 +) +SELECT id AS id, depth +FROM job_tree +ORDER BY depth, id + "#, + job.id, + w_id + ) + .fetch_all(&mut *tx) + .await? + .into_iter() + .filter_map(|r| r.id.clone()) + .collect_vec(); + + jobs_to_cancel.reverse(); + tracing::info!("Found {} child jobs to cancel", jobs_to_cancel.len()); let (ntx, _) = cancel_single_job( username, @@ -274,7 +292,23 @@ pub async fn cancel_job<'c>( .await?; tx = ntx; - // cancel children + if !force_cancel { + // cancel children in batch first + if !jobs_to_cancel.is_empty() { + let updated = sqlx::query_scalar!( + "UPDATE v2_job_queue SET canceled_by = $1, canceled_reason = $2, scheduled_for = now(), suspend = 0 WHERE id = ANY($3) AND workspace_id = $4 AND (canceled_by IS NULL OR canceled_reason != $2) RETURNING id", + username, + reason, + jobs_to_cancel.as_slice(), + w_id + ) + .fetch_all(&mut *tx) + .await?; + + // Remove any jobs that were successfully updated + jobs_to_cancel.retain(|id| !updated.contains(&id)); + } + } for job_id in jobs_to_cancel { let job = get_queued_job_tx(job_id, &w_id, &mut tx).await?; diff --git a/frontend/src/lib/components/FlowBuilder.svelte b/frontend/src/lib/components/FlowBuilder.svelte index adb5331a6e..412a5ee88f 100644 --- a/frontend/src/lib/components/FlowBuilder.svelte +++ b/frontend/src/lib/components/FlowBuilder.svelte @@ -248,7 +248,7 @@ workspace: $workspaceStore!, requestBody: { path: $pathStore, - summary: flow.summary, + summary: flow.summary ?? '', description: flow.description ?? '', value: flow.value, schema: flow.schema, @@ -379,7 +379,7 @@ workspace: $workspaceStore!, requestBody: { path: $pathStore, - summary: flow.summary, + summary: flow.summary ?? '', description: flow.description ?? '', value: flow.value, schema: flow.schema, From e868fe2bf5695b968151e27826854def3e847eb1 Mon Sep 17 00:00:00 2001 From: Diego Imbert <70353967+diegoimbert@users.noreply.github.com> Date: Mon, 24 Mar 2025 22:08:19 +0100 Subject: [PATCH 084/739] feat: list references upon renaming a script or a flow (#5487) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Refactored flow_workspace_runnables to more generic workspace_runnable_dependencies * list flows referencing an item upon renaming it * Refactor with two exclusive columns to avoid breaking FK constraints * Show apps depending on item upon renaming * sqlx prepare * list-disc instead of • * on delete and on update cascade * displayPathChangedWarning oneOf check instead noneOf * combine migrations + add "on update cascade" to flow fk * unique index on app dependencies to avoid duplicates * create new workspace_runnable_dependencies instead of renaming old table * Add "looking for references" loading msg * Revert "create new workspace_runnable_dependencies instead of renaming old table" This reverts commit 015c38ca8f9fbd8b4a4e817f1ad105434bfd68c5. * flow_workspace_runnables view for backwards compatibility * Add warning for script imports on rename * support import dependency tracking in deno * number of using scripts / flows / apps tooltip * forgot sqlx prepare * delete app-related rows in down migration --- ...0286cbc09d4abf2926146b24a8c95cf21e5c8.json | 17 ++++ ...de70315eeb4e0ef9ed3165365f257e27f5e68.json | 16 ++++ ...233389683f8d510850487453052a317391f0f.json | 24 +++++ ...f84fef7557f3e3046e7188ee06f6c3a2b2add.json | 15 +++ ...ee42065315ac8df5fc8bd8004c0992e6f1bdb.json | 16 ++++ ...707bd1c48c58aaa5b2ae7560cbed3c8d46329.json | 24 +++++ ...184d17c5100a3f3dc9fda02b1a7acc0b73fa5.json | 23 +++++ ...c5954f40cf46905b40b40ba97a21558a1ac01.json | 15 +++ ...60d447fd719f2a56ea954c8cce49ffabd4245.json | 24 +++++ ...359d6d9fdfdbffb40a2464a45056660a3a2d4.json | 17 ++++ ...cc62a0fc9d4ba56014f3e554cc2b50ce1da06.json | 16 ++++ ...4ee12e8cffe925bd7cc4e9d02dc90ffe200f3.json | 15 +++ ...ba8354d4cd733335db3d76155b663f668b9d7.json | 16 ++++ ...66fa5f32b5a56e28100a2487b478e5dc3eaec.json | 17 ++++ ...77eb9b71337a9aa2a64cd2db031e64e929251.json | 15 +++ ...bbe4303249c8d8664962d479056971f0409a2.json | 15 +++ ...dc6b39dabab77ae7810f553f1773995db51f1.json | 16 ++++ ...099e8f0ea697e279f6a72484ab031b7e1e952.json | 16 ++++ ...b16ffcb2bc8d94a8240143a913ad125ad6eb8.json | 15 +++ ...f2dc0746d9f3a1bea104123188fe2921bc886.json | 16 ++++ ..._generic_workspace_runnable_usage.down.sql | 24 +++++ ...re_generic_workspace_runnable_usage.up.sql | 42 ++++++++ backend/windmill-api/openapi.yaml | 39 ++++++++ backend/windmill-api/src/apps.rs | 28 +++++- backend/windmill-api/src/flows.rs | 8 +- backend/windmill-api/src/scripts.rs | 22 +++++ backend/windmill-api/src/users.rs | 12 ++- backend/windmill-api/src/workspaces_extra.rs | 2 +- .../windmill-worker/src/worker_lockfiles.rs | 39 ++++++-- frontend/src/lib/components/Path.svelte | 95 ++++++++++++++++++- frontend/src/lib/utils.ts | 6 ++ 31 files changed, 648 insertions(+), 17 deletions(-) create mode 100644 backend/.sqlx/query-01755585cd3f6e100a66da331720286cbc09d4abf2926146b24a8c95cf21e5c8.json create mode 100644 backend/.sqlx/query-09efbd7177c6172569dc29b7d9ede70315eeb4e0ef9ed3165365f257e27f5e68.json create mode 100644 backend/.sqlx/query-171b11d66b9ec6cb7b0dd74929e233389683f8d510850487453052a317391f0f.json create mode 100644 backend/.sqlx/query-1ea8c2ce29da8d1be19dfd3ecc7f84fef7557f3e3046e7188ee06f6c3a2b2add.json create mode 100644 backend/.sqlx/query-44ce12725e09c1e32d82dfe9539ee42065315ac8df5fc8bd8004c0992e6f1bdb.json create mode 100644 backend/.sqlx/query-56a2fe44b73728c9aba10f3d1c7707bd1c48c58aaa5b2ae7560cbed3c8d46329.json create mode 100644 backend/.sqlx/query-6aa04cc83e746ebca45959294b6184d17c5100a3f3dc9fda02b1a7acc0b73fa5.json create mode 100644 backend/.sqlx/query-7023184bfeece73252aac9e3e89c5954f40cf46905b40b40ba97a21558a1ac01.json create mode 100644 backend/.sqlx/query-808790cc01ec68be41dfeb80dc560d447fd719f2a56ea954c8cce49ffabd4245.json create mode 100644 backend/.sqlx/query-894e5080e83b098839a050bb472359d6d9fdfdbffb40a2464a45056660a3a2d4.json create mode 100644 backend/.sqlx/query-9c956541e068154193243795d96cc62a0fc9d4ba56014f3e554cc2b50ce1da06.json create mode 100644 backend/.sqlx/query-a28f8697da75d7ac2c6e13dda394ee12e8cffe925bd7cc4e9d02dc90ffe200f3.json create mode 100644 backend/.sqlx/query-ab9783a48e0f6cacd5dd86cfa21ba8354d4cd733335db3d76155b663f668b9d7.json create mode 100644 backend/.sqlx/query-aeca239a2997efc514ee56a6b3766fa5f32b5a56e28100a2487b478e5dc3eaec.json create mode 100644 backend/.sqlx/query-af2f780da994befd09959d3b1b077eb9b71337a9aa2a64cd2db031e64e929251.json create mode 100644 backend/.sqlx/query-b190ad25e22367f71c1e16e34bfbbe4303249c8d8664962d479056971f0409a2.json create mode 100644 backend/.sqlx/query-baf63525ca210c22d3ad8c0b197dc6b39dabab77ae7810f553f1773995db51f1.json create mode 100644 backend/.sqlx/query-c14cc34a5350865b8a5b57205b6099e8f0ea697e279f6a72484ab031b7e1e952.json create mode 100644 backend/.sqlx/query-e19fab3d594c8b9d38f9caa8f71b16ffcb2bc8d94a8240143a913ad125ad6eb8.json create mode 100644 backend/.sqlx/query-f699cc3644aeb35a0588bbb3a6bf2dc0746d9f3a1bea104123188fe2921bc886.json create mode 100644 backend/migrations/20250317145509_more_generic_workspace_runnable_usage.down.sql create mode 100644 backend/migrations/20250317145509_more_generic_workspace_runnable_usage.up.sql diff --git a/backend/.sqlx/query-01755585cd3f6e100a66da331720286cbc09d4abf2926146b24a8c95cf21e5c8.json b/backend/.sqlx/query-01755585cd3f6e100a66da331720286cbc09d4abf2926146b24a8c95cf21e5c8.json new file mode 100644 index 0000000000..8c1ba3782c --- /dev/null +++ b/backend/.sqlx/query-01755585cd3f6e100a66da331720286cbc09d4abf2926146b24a8c95cf21e5c8.json @@ -0,0 +1,17 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO workspace_runnable_dependencies (app_path, runnable_path, runnable_is_flow, workspace_id) VALUES ($1, $2, $3, $4) ON CONFLICT DO NOTHING", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Varchar", + "Bool", + "Varchar" + ] + }, + "nullable": [] + }, + "hash": "01755585cd3f6e100a66da331720286cbc09d4abf2926146b24a8c95cf21e5c8" +} diff --git a/backend/.sqlx/query-09efbd7177c6172569dc29b7d9ede70315eeb4e0ef9ed3165365f257e27f5e68.json b/backend/.sqlx/query-09efbd7177c6172569dc29b7d9ede70315eeb4e0ef9ed3165365f257e27f5e68.json new file mode 100644 index 0000000000..4500681506 --- /dev/null +++ b/backend/.sqlx/query-09efbd7177c6172569dc29b7d9ede70315eeb4e0ef9ed3165365f257e27f5e68.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO workspace_runnable_dependencies (flow_path, runnable_path, runnable_is_flow, workspace_id) VALUES ($1, $2, TRUE, $3) ON CONFLICT DO NOTHING", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Varchar", + "Varchar" + ] + }, + "nullable": [] + }, + "hash": "09efbd7177c6172569dc29b7d9ede70315eeb4e0ef9ed3165365f257e27f5e68" +} diff --git a/backend/.sqlx/query-171b11d66b9ec6cb7b0dd74929e233389683f8d510850487453052a317391f0f.json b/backend/.sqlx/query-171b11d66b9ec6cb7b0dd74929e233389683f8d510850487453052a317391f0f.json new file mode 100644 index 0000000000..b8f2ccca5f --- /dev/null +++ b/backend/.sqlx/query-171b11d66b9ec6cb7b0dd74929e233389683f8d510850487453052a317391f0f.json @@ -0,0 +1,24 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT a.path\n FROM workspace_runnable_dependencies wru \n JOIN app a\n ON wru.app_path = a.path AND wru.workspace_id = a.workspace_id\n WHERE wru.runnable_path = $1 AND wru.runnable_is_flow = $2 AND wru.workspace_id = $3", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "path", + "type_info": "Varchar" + } + ], + "parameters": { + "Left": [ + "Text", + "Bool", + "Text" + ] + }, + "nullable": [ + false + ] + }, + "hash": "171b11d66b9ec6cb7b0dd74929e233389683f8d510850487453052a317391f0f" +} diff --git a/backend/.sqlx/query-1ea8c2ce29da8d1be19dfd3ecc7f84fef7557f3e3046e7188ee06f6c3a2b2add.json b/backend/.sqlx/query-1ea8c2ce29da8d1be19dfd3ecc7f84fef7557f3e3046e7188ee06f6c3a2b2add.json new file mode 100644 index 0000000000..17c406c101 --- /dev/null +++ b/backend/.sqlx/query-1ea8c2ce29da8d1be19dfd3ecc7f84fef7557f3e3046e7188ee06f6c3a2b2add.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "DELETE FROM workspace_runnable_usage WHERE resource_path = $1 AND workspace_id = $2 and resource_kind = 'flow'", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [] + }, + "hash": "1ea8c2ce29da8d1be19dfd3ecc7f84fef7557f3e3046e7188ee06f6c3a2b2add" +} diff --git a/backend/.sqlx/query-44ce12725e09c1e32d82dfe9539ee42065315ac8df5fc8bd8004c0992e6f1bdb.json b/backend/.sqlx/query-44ce12725e09c1e32d82dfe9539ee42065315ac8df5fc8bd8004c0992e6f1bdb.json new file mode 100644 index 0000000000..1369de2911 --- /dev/null +++ b/backend/.sqlx/query-44ce12725e09c1e32d82dfe9539ee42065315ac8df5fc8bd8004c0992e6f1bdb.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE workspace_runnable_dependencies SET flow_path = REGEXP_REPLACE(flow_path,'u/' || $2 || '/(.*)','u/' || $1 || '/\\1') WHERE flow_path LIKE ('u/' || $2 || '/%') AND workspace_id = $3", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Text", + "Text" + ] + }, + "nullable": [] + }, + "hash": "44ce12725e09c1e32d82dfe9539ee42065315ac8df5fc8bd8004c0992e6f1bdb" +} diff --git a/backend/.sqlx/query-56a2fe44b73728c9aba10f3d1c7707bd1c48c58aaa5b2ae7560cbed3c8d46329.json b/backend/.sqlx/query-56a2fe44b73728c9aba10f3d1c7707bd1c48c58aaa5b2ae7560cbed3c8d46329.json new file mode 100644 index 0000000000..22870b1d2d --- /dev/null +++ b/backend/.sqlx/query-56a2fe44b73728c9aba10f3d1c7707bd1c48c58aaa5b2ae7560cbed3c8d46329.json @@ -0,0 +1,24 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT f.path\n FROM workspace_runnable_usage wru \n JOIN flow f\n ON wru.resource_path = f.path AND wru.workspace_id = f.workspace_id\n WHERE wru.runnable_path = $1 AND wru.runnable_is_flow = $2 AND wru.workspace_id = $3", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "path", + "type_info": "Varchar" + } + ], + "parameters": { + "Left": [ + "Text", + "Bool", + "Text" + ] + }, + "nullable": [ + false + ] + }, + "hash": "56a2fe44b73728c9aba10f3d1c7707bd1c48c58aaa5b2ae7560cbed3c8d46329" +} diff --git a/backend/.sqlx/query-6aa04cc83e746ebca45959294b6184d17c5100a3f3dc9fda02b1a7acc0b73fa5.json b/backend/.sqlx/query-6aa04cc83e746ebca45959294b6184d17c5100a3f3dc9fda02b1a7acc0b73fa5.json new file mode 100644 index 0000000000..44d1cfc7a5 --- /dev/null +++ b/backend/.sqlx/query-6aa04cc83e746ebca45959294b6184d17c5100a3f3dc9fda02b1a7acc0b73fa5.json @@ -0,0 +1,23 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT importer_path FROM dependency_map \n WHERE workspace_id = $1 AND imported_path = $2", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "importer_path", + "type_info": "Varchar" + } + ], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [ + false + ] + }, + "hash": "6aa04cc83e746ebca45959294b6184d17c5100a3f3dc9fda02b1a7acc0b73fa5" +} diff --git a/backend/.sqlx/query-7023184bfeece73252aac9e3e89c5954f40cf46905b40b40ba97a21558a1ac01.json b/backend/.sqlx/query-7023184bfeece73252aac9e3e89c5954f40cf46905b40b40ba97a21558a1ac01.json new file mode 100644 index 0000000000..e1d8d14548 --- /dev/null +++ b/backend/.sqlx/query-7023184bfeece73252aac9e3e89c5954f40cf46905b40b40ba97a21558a1ac01.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "DELETE FROM workspace_runnable_dependencies WHERE flow_path = $1 AND workspace_id = $2", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [] + }, + "hash": "7023184bfeece73252aac9e3e89c5954f40cf46905b40b40ba97a21558a1ac01" +} diff --git a/backend/.sqlx/query-808790cc01ec68be41dfeb80dc560d447fd719f2a56ea954c8cce49ffabd4245.json b/backend/.sqlx/query-808790cc01ec68be41dfeb80dc560d447fd719f2a56ea954c8cce49ffabd4245.json new file mode 100644 index 0000000000..846f94dcbb --- /dev/null +++ b/backend/.sqlx/query-808790cc01ec68be41dfeb80dc560d447fd719f2a56ea954c8cce49ffabd4245.json @@ -0,0 +1,24 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT f.path\n FROM workspace_runnable_dependencies wru \n JOIN flow f\n ON wru.flow_path = f.path AND wru.workspace_id = f.workspace_id\n WHERE wru.runnable_path = $1 AND wru.runnable_is_flow = $2 AND wru.workspace_id = $3", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "path", + "type_info": "Varchar" + } + ], + "parameters": { + "Left": [ + "Text", + "Bool", + "Text" + ] + }, + "nullable": [ + false + ] + }, + "hash": "808790cc01ec68be41dfeb80dc560d447fd719f2a56ea954c8cce49ffabd4245" +} diff --git a/backend/.sqlx/query-894e5080e83b098839a050bb472359d6d9fdfdbffb40a2464a45056660a3a2d4.json b/backend/.sqlx/query-894e5080e83b098839a050bb472359d6d9fdfdbffb40a2464a45056660a3a2d4.json new file mode 100644 index 0000000000..7ee434f66e --- /dev/null +++ b/backend/.sqlx/query-894e5080e83b098839a050bb472359d6d9fdfdbffb40a2464a45056660a3a2d4.json @@ -0,0 +1,17 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO workspace_runnable_usage (resource_path, runnable_path, script_hash, runnable_is_flow, workspace_id, resource_kind) VALUES ($1, $2, $3, FALSE, $4, 'flow') ON CONFLICT DO NOTHING", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Varchar", + "Int8", + "Varchar" + ] + }, + "nullable": [] + }, + "hash": "894e5080e83b098839a050bb472359d6d9fdfdbffb40a2464a45056660a3a2d4" +} diff --git a/backend/.sqlx/query-9c956541e068154193243795d96cc62a0fc9d4ba56014f3e554cc2b50ce1da06.json b/backend/.sqlx/query-9c956541e068154193243795d96cc62a0fc9d4ba56014f3e554cc2b50ce1da06.json new file mode 100644 index 0000000000..690f2dedcc --- /dev/null +++ b/backend/.sqlx/query-9c956541e068154193243795d96cc62a0fc9d4ba56014f3e554cc2b50ce1da06.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE workspace_runnable_usage SET resource_path = REGEXP_REPLACE(resource_path,'u/' || $2 || '/(.*)','u/' || $1 || '/\\1') WHERE resource_path LIKE ('u/' || $2 || '/%') AND workspace_id = $3", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Text", + "Text" + ] + }, + "nullable": [] + }, + "hash": "9c956541e068154193243795d96cc62a0fc9d4ba56014f3e554cc2b50ce1da06" +} diff --git a/backend/.sqlx/query-a28f8697da75d7ac2c6e13dda394ee12e8cffe925bd7cc4e9d02dc90ffe200f3.json b/backend/.sqlx/query-a28f8697da75d7ac2c6e13dda394ee12e8cffe925bd7cc4e9d02dc90ffe200f3.json new file mode 100644 index 0000000000..62c2a10550 --- /dev/null +++ b/backend/.sqlx/query-a28f8697da75d7ac2c6e13dda394ee12e8cffe925bd7cc4e9d02dc90ffe200f3.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "DELETE FROM workspace_runnable_usage WHERE resource_path = $1 AND workspace_id = $2 and resource_kind = 'app'", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [] + }, + "hash": "a28f8697da75d7ac2c6e13dda394ee12e8cffe925bd7cc4e9d02dc90ffe200f3" +} diff --git a/backend/.sqlx/query-ab9783a48e0f6cacd5dd86cfa21ba8354d4cd733335db3d76155b663f668b9d7.json b/backend/.sqlx/query-ab9783a48e0f6cacd5dd86cfa21ba8354d4cd733335db3d76155b663f668b9d7.json new file mode 100644 index 0000000000..7dd52db3fa --- /dev/null +++ b/backend/.sqlx/query-ab9783a48e0f6cacd5dd86cfa21ba8354d4cd733335db3d76155b663f668b9d7.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO workspace_runnable_usage (resource_path, runnable_path, runnable_is_flow, workspace_id, resource_kind) VALUES ($1, $2, TRUE, $3, 'flow') ON CONFLICT DO NOTHING", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Varchar", + "Varchar" + ] + }, + "nullable": [] + }, + "hash": "ab9783a48e0f6cacd5dd86cfa21ba8354d4cd733335db3d76155b663f668b9d7" +} diff --git a/backend/.sqlx/query-aeca239a2997efc514ee56a6b3766fa5f32b5a56e28100a2487b478e5dc3eaec.json b/backend/.sqlx/query-aeca239a2997efc514ee56a6b3766fa5f32b5a56e28100a2487b478e5dc3eaec.json new file mode 100644 index 0000000000..db6ed5a29a --- /dev/null +++ b/backend/.sqlx/query-aeca239a2997efc514ee56a6b3766fa5f32b5a56e28100a2487b478e5dc3eaec.json @@ -0,0 +1,17 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO workspace_runnable_dependencies (flow_path, runnable_path, script_hash, runnable_is_flow, workspace_id) VALUES ($1, $2, $3, FALSE, $4) ON CONFLICT DO NOTHING", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Varchar", + "Int8", + "Varchar" + ] + }, + "nullable": [] + }, + "hash": "aeca239a2997efc514ee56a6b3766fa5f32b5a56e28100a2487b478e5dc3eaec" +} diff --git a/backend/.sqlx/query-af2f780da994befd09959d3b1b077eb9b71337a9aa2a64cd2db031e64e929251.json b/backend/.sqlx/query-af2f780da994befd09959d3b1b077eb9b71337a9aa2a64cd2db031e64e929251.json new file mode 100644 index 0000000000..8ccc824ace --- /dev/null +++ b/backend/.sqlx/query-af2f780da994befd09959d3b1b077eb9b71337a9aa2a64cd2db031e64e929251.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE workspace_runnable_usage SET workspace_id = $1 WHERE workspace_id = $2", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Text" + ] + }, + "nullable": [] + }, + "hash": "af2f780da994befd09959d3b1b077eb9b71337a9aa2a64cd2db031e64e929251" +} diff --git a/backend/.sqlx/query-b190ad25e22367f71c1e16e34bfbbe4303249c8d8664962d479056971f0409a2.json b/backend/.sqlx/query-b190ad25e22367f71c1e16e34bfbbe4303249c8d8664962d479056971f0409a2.json new file mode 100644 index 0000000000..def6dfdd14 --- /dev/null +++ b/backend/.sqlx/query-b190ad25e22367f71c1e16e34bfbbe4303249c8d8664962d479056971f0409a2.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "DELETE FROM workspace_runnable_dependencies WHERE app_path = $1 AND workspace_id = $2", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [] + }, + "hash": "b190ad25e22367f71c1e16e34bfbbe4303249c8d8664962d479056971f0409a2" +} diff --git a/backend/.sqlx/query-baf63525ca210c22d3ad8c0b197dc6b39dabab77ae7810f553f1773995db51f1.json b/backend/.sqlx/query-baf63525ca210c22d3ad8c0b197dc6b39dabab77ae7810f553f1773995db51f1.json new file mode 100644 index 0000000000..dfc8414434 --- /dev/null +++ b/backend/.sqlx/query-baf63525ca210c22d3ad8c0b197dc6b39dabab77ae7810f553f1773995db51f1.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE workspace_runnable_usage SET runnable_path = REGEXP_REPLACE(runnable_path,'u/' || $2 || '/(.*)','u/' || $1 || '/\\1') WHERE runnable_path LIKE ('u/' || $2 || '/%') AND workspace_id = $3", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Text", + "Text" + ] + }, + "nullable": [] + }, + "hash": "baf63525ca210c22d3ad8c0b197dc6b39dabab77ae7810f553f1773995db51f1" +} diff --git a/backend/.sqlx/query-c14cc34a5350865b8a5b57205b6099e8f0ea697e279f6a72484ab031b7e1e952.json b/backend/.sqlx/query-c14cc34a5350865b8a5b57205b6099e8f0ea697e279f6a72484ab031b7e1e952.json new file mode 100644 index 0000000000..828dc6f04a --- /dev/null +++ b/backend/.sqlx/query-c14cc34a5350865b8a5b57205b6099e8f0ea697e279f6a72484ab031b7e1e952.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE workspace_runnable_dependencies SET runnable_path = REGEXP_REPLACE(runnable_path,'u/' || $2 || '/(.*)','u/' || $1 || '/\\1') WHERE runnable_path LIKE ('u/' || $2 || '/%') AND workspace_id = $3", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Text", + "Text" + ] + }, + "nullable": [] + }, + "hash": "c14cc34a5350865b8a5b57205b6099e8f0ea697e279f6a72484ab031b7e1e952" +} diff --git a/backend/.sqlx/query-e19fab3d594c8b9d38f9caa8f71b16ffcb2bc8d94a8240143a913ad125ad6eb8.json b/backend/.sqlx/query-e19fab3d594c8b9d38f9caa8f71b16ffcb2bc8d94a8240143a913ad125ad6eb8.json new file mode 100644 index 0000000000..f75e6eaa56 --- /dev/null +++ b/backend/.sqlx/query-e19fab3d594c8b9d38f9caa8f71b16ffcb2bc8d94a8240143a913ad125ad6eb8.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE workspace_runnable_dependencies SET workspace_id = $1 WHERE workspace_id = $2", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Text" + ] + }, + "nullable": [] + }, + "hash": "e19fab3d594c8b9d38f9caa8f71b16ffcb2bc8d94a8240143a913ad125ad6eb8" +} diff --git a/backend/.sqlx/query-f699cc3644aeb35a0588bbb3a6bf2dc0746d9f3a1bea104123188fe2921bc886.json b/backend/.sqlx/query-f699cc3644aeb35a0588bbb3a6bf2dc0746d9f3a1bea104123188fe2921bc886.json new file mode 100644 index 0000000000..d352d3d69d --- /dev/null +++ b/backend/.sqlx/query-f699cc3644aeb35a0588bbb3a6bf2dc0746d9f3a1bea104123188fe2921bc886.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE workspace_runnable_dependencies SET app_path = REGEXP_REPLACE(app_path,'u/' || $2 || '/(.*)','u/' || $1 || '/\\1') WHERE app_path LIKE ('u/' || $2 || '/%') AND workspace_id = $3", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Text", + "Text" + ] + }, + "nullable": [] + }, + "hash": "f699cc3644aeb35a0588bbb3a6bf2dc0746d9f3a1bea104123188fe2921bc886" +} diff --git a/backend/migrations/20250317145509_more_generic_workspace_runnable_usage.down.sql b/backend/migrations/20250317145509_more_generic_workspace_runnable_usage.down.sql new file mode 100644 index 0000000000..27f65545ae --- /dev/null +++ b/backend/migrations/20250317145509_more_generic_workspace_runnable_usage.down.sql @@ -0,0 +1,24 @@ +DROP VIEW flow_workspace_runnables; + +DELETE FROM workspace_runnable_dependencies WHERE flow_path IS NULL; + +ALTER TABLE workspace_runnable_dependencies +DROP CONSTRAINT flow_workspace_runnables_workspace_id_flow_path_fkey; + +ALTER TABLE workspace_runnable_dependencies +ADD CONSTRAINT flow_workspace_runnables_workspace_id_flow_path_fkey +FOREIGN KEY (flow_path, workspace_id) REFERENCES flow (path, workspace_id) +ON DELETE CASCADE; + +ALTER TABLE workspace_runnable_dependencies +DROP CONSTRAINT workspace_runnable_dependencies_path_exclusive; + +ALTER TABLE workspace_runnable_dependencies +DROP CONSTRAINT fk_workspace_runnable_dependencies_app_path; + +ALTER TABLE workspace_runnable_dependencies DROP COLUMN app_path; + +ALTER TABLE workspace_runnable_dependencies ALTER flow_path SET NOT NULL; + +ALTER TABLE workspace_runnable_dependencies +RENAME TO flow_workspace_runnables; diff --git a/backend/migrations/20250317145509_more_generic_workspace_runnable_usage.up.sql b/backend/migrations/20250317145509_more_generic_workspace_runnable_usage.up.sql new file mode 100644 index 0000000000..4b7b209bb5 --- /dev/null +++ b/backend/migrations/20250317145509_more_generic_workspace_runnable_usage.up.sql @@ -0,0 +1,42 @@ +-- flow_workspace_runnables only stored runnable usages by +-- flows although apps can also use runnables + +ALTER TABLE flow_workspace_runnables +RENAME TO workspace_runnable_dependencies; + +ALTER TABLE workspace_runnable_dependencies ALTER flow_path DROP NOT NULL; + +ALTER TABLE workspace_runnable_dependencies +ADD COLUMN app_path VARCHAR(255); + +ALTER TABLE workspace_runnable_dependencies +ADD CONSTRAINT workspace_runnable_dependencies_path_exclusive CHECK ( + (flow_path IS NOT NULL AND app_path IS NULL) OR + (flow_path IS NULL AND app_path IS NOT NULL) +); + +ALTER TABLE workspace_runnable_dependencies +ADD CONSTRAINT fk_workspace_runnable_dependencies_app_path +FOREIGN KEY (app_path, workspace_id) REFERENCES app (path, workspace_id) +ON DELETE CASCADE +ON UPDATE CASCADE; + + +ALTER TABLE workspace_runnable_dependencies +DROP CONSTRAINT flow_workspace_runnables_workspace_id_flow_path_fkey; + +ALTER TABLE workspace_runnable_dependencies +ADD CONSTRAINT flow_workspace_runnables_workspace_id_flow_path_fkey +FOREIGN KEY (flow_path, workspace_id) REFERENCES flow (path, workspace_id) +ON DELETE CASCADE +ON UPDATE CASCADE; + + +CREATE UNIQUE INDEX app_workspace_without_hash_unique_idx ON workspace_runnable_dependencies (app_path, runnable_path, runnable_is_flow, workspace_id) WHERE script_hash IS NULL; +CREATE UNIQUE INDEX app_workspace_with_hash_unique_idx ON workspace_runnable_dependencies (app_path, runnable_path, script_hash, runnable_is_flow, workspace_id) WHERE script_hash IS NOT NULL; + + +-- This is to maintain compatibility with old workers +CREATE VIEW flow_workspace_runnables AS +SELECT flow_path, runnable_path, script_hash, runnable_is_flow, workspace_id +FROM workspace_runnable_dependencies; \ No newline at end of file diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index 5339ed86af..3d73899486 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -4774,6 +4774,25 @@ paths: items: $ref: "#/components/schemas/ScriptHistory" + /w/{workspace}/scripts/list_paths_from_workspace_runnable/{path}: + get: + summary: list script paths using provided script as a relative import + operationId: listScriptPathsFromWorkspaceRunnable + tags: + - script + parameters: + - $ref: "#/components/parameters/WorkspaceId" + - $ref: "#/components/parameters/ScriptPath" + responses: + "200": + description: list of script paths + content: + application/json: + schema: + type: array + items: + type: string + /w/{workspace}/scripts/get_latest_version/{path}: get: summary: get scripts's latest version (hash) @@ -5934,6 +5953,26 @@ paths: schema: $ref: "#/components/schemas/AppHistory" + /w/{workspace}/apps/list_paths_from_workspace_runnable/{runnable_kind}/{path}: + get: + summary: list app paths from workspace runnable + operationId: listAppPathsFromWorkspaceRunnable + tags: + - app + parameters: + - $ref: "#/components/parameters/WorkspaceId" + - $ref: "#/components/parameters/RunnableKind" + - $ref: "#/components/parameters/ScriptPath" + responses: + "200": + description: list of app paths + content: + application/json: + schema: + type: array + items: + type: string + /w/{workspace}/apps/history_update/a/{id}/v/{version}: post: summary: update app history diff --git a/backend/windmill-api/src/apps.rs b/backend/windmill-api/src/apps.rs index 0a8878fad6..78159218c7 100644 --- a/backend/windmill-api/src/apps.rs +++ b/backend/windmill-api/src/apps.rs @@ -12,7 +12,7 @@ use crate::{ db::{ApiAuthed, DB}, resources::get_resource_value_interpolated_internal, users::{require_owner_of_path, OptAuthed}, - utils::WithStarredInfoQuery, + utils::{RunnableKind, WithStarredInfoQuery}, webhook_util::{WebhookMessage, WebhookShared}, HTTP_CLIENT, }; @@ -89,6 +89,10 @@ pub fn workspaced_service() -> Router { .route("/history/p/*path", get(get_app_history)) .route("/get_latest_version/*path", get(get_latest_version)) .route("/history_update/a/:id/v/:version", post(update_app_history)) + .route( + "/list_paths_from_workspace_runnable/:runnable_kind/*path", + get(list_paths_from_workspace_runnable), + ) .route("/custom_path_exists/*custom_path", get(custom_path_exists)) } @@ -719,6 +723,28 @@ async fn get_secret_id( Ok(hx) } +async fn list_paths_from_workspace_runnable( + authed: ApiAuthed, + Extension(user_db): Extension, + Path((w_id, runnable_kind, path)): Path<(String, RunnableKind, StripPath)>, +) -> JsonResult> { + let mut tx = user_db.begin(&authed).await?; + let runnables = sqlx::query_scalar!( + r#"SELECT a.path + FROM workspace_runnable_dependencies wru + JOIN app a + ON wru.app_path = a.path AND wru.workspace_id = a.workspace_id + WHERE wru.runnable_path = $1 AND wru.runnable_is_flow = $2 AND wru.workspace_id = $3"#, + path.to_path(), + matches!(runnable_kind, RunnableKind::Flow), + w_id + ) + .fetch_all(&mut *tx) + .await?; + tx.commit().await?; + Ok(Json(runnables)) +} + async fn create_app( authed: ApiAuthed, Extension(user_db): Extension, diff --git a/backend/windmill-api/src/flows.rs b/backend/windmill-api/src/flows.rs index beaec364f6..95a2145bcf 100644 --- a/backend/windmill-api/src/flows.rs +++ b/backend/windmill-api/src/flows.rs @@ -336,10 +336,10 @@ async fn list_paths_from_workspace_runnable( let mut tx = user_db.begin(&authed).await?; let runnables = sqlx::query_scalar!( r#"SELECT f.path - FROM flow_workspace_runnables fwr - JOIN flow f - ON fwr.flow_path = f.path AND fwr.workspace_id = f.workspace_id - WHERE fwr.runnable_path = $1 AND fwr.runnable_is_flow = $2 AND fwr.workspace_id = $3"#, + FROM workspace_runnable_dependencies wru + JOIN flow f + ON wru.flow_path = f.path AND wru.workspace_id = f.workspace_id + WHERE wru.runnable_path = $1 AND wru.runnable_is_flow = $2 AND wru.workspace_id = $3"#, path.to_path(), matches!(runnable_kind, RunnableKind::Flow), w_id diff --git a/backend/windmill-api/src/scripts.rs b/backend/windmill-api/src/scripts.rs index 3e0197fccc..f370bf33fe 100644 --- a/backend/windmill-api/src/scripts.rs +++ b/backend/windmill-api/src/scripts.rs @@ -147,6 +147,10 @@ pub fn workspaced_service() -> Router { ) .route("/history/p/*path", get(get_script_history)) .route("/get_latest_version/*path", get(get_latest_version)) + .route( + "/list_paths_from_workspace_runnable/*path", + get(list_paths_from_workspace_runnable), + ) .route( "/history_update/h/:hash/p/*path", post(update_script_history), @@ -447,6 +451,24 @@ async fn create_snapshot_script( return Ok((StatusCode::CREATED, format!("{}", script_hash.unwrap()))); } +async fn list_paths_from_workspace_runnable( + authed: ApiAuthed, + Extension(user_db): Extension, + Path((w_id, path)): Path<(String, StripPath)>, +) -> JsonResult> { + let mut tx = user_db.begin(&authed).await?; + let runnables = sqlx::query_scalar!( + r#"SELECT importer_path FROM dependency_map + WHERE workspace_id = $1 AND imported_path = $2"#, + w_id, + path.to_path(), + ) + .fetch_all(&mut *tx) + .await?; + tx.commit().await?; + Ok(Json(runnables)) +} + async fn create_script( authed: ApiAuthed, Extension(user_db): Extension, diff --git a/backend/windmill-api/src/users.rs b/backend/windmill-api/src/users.rs index b8cac903b6..507831e78f 100644 --- a/backend/windmill-api/src/users.rs +++ b/backend/windmill-api/src/users.rs @@ -2538,7 +2538,7 @@ async fn update_username_in_workpsace<'c>( .await?; sqlx::query!( - r#"UPDATE flow_workspace_runnables SET flow_path = REGEXP_REPLACE(flow_path,'u/' || $2 || '/(.*)','u/' || $1 || '/\1') WHERE flow_path LIKE ('u/' || $2 || '/%') AND workspace_id = $3"#, + r#"UPDATE workspace_runnable_dependencies SET flow_path = REGEXP_REPLACE(flow_path,'u/' || $2 || '/(.*)','u/' || $1 || '/\1') WHERE flow_path LIKE ('u/' || $2 || '/%') AND workspace_id = $3"#, new_username, old_username, w_id @@ -2546,7 +2546,15 @@ async fn update_username_in_workpsace<'c>( .await?; sqlx::query!( - r#"UPDATE flow_workspace_runnables SET runnable_path = REGEXP_REPLACE(runnable_path,'u/' || $2 || '/(.*)','u/' || $1 || '/\1') WHERE runnable_path LIKE ('u/' || $2 || '/%') AND workspace_id = $3"#, + r#"UPDATE workspace_runnable_dependencies SET app_path = REGEXP_REPLACE(app_path,'u/' || $2 || '/(.*)','u/' || $1 || '/\1') WHERE app_path LIKE ('u/' || $2 || '/%') AND workspace_id = $3"#, + new_username, + old_username, + w_id + ).execute(&mut **tx) + .await?; + + sqlx::query!( + r#"UPDATE workspace_runnable_dependencies SET runnable_path = REGEXP_REPLACE(runnable_path,'u/' || $2 || '/(.*)','u/' || $1 || '/\1') WHERE runnable_path LIKE ('u/' || $2 || '/%') AND workspace_id = $3"#, new_username, old_username, w_id diff --git a/backend/windmill-api/src/workspaces_extra.rs b/backend/windmill-api/src/workspaces_extra.rs index 2f77112331..07570df5c3 100644 --- a/backend/windmill-api/src/workspaces_extra.rs +++ b/backend/windmill-api/src/workspaces_extra.rs @@ -190,7 +190,7 @@ pub(crate) async fn change_workspace_id( .await?; sqlx::query!( - "UPDATE flow_workspace_runnables SET workspace_id = $1 WHERE workspace_id = $2", + "UPDATE workspace_runnable_dependencies SET workspace_id = $1 WHERE workspace_id = $2", &rw.new_id, &old_id ) diff --git a/backend/windmill-worker/src/worker_lockfiles.rs b/backend/windmill-worker/src/worker_lockfiles.rs index 47a0d264cb..113d1714d2 100644 --- a/backend/windmill-worker/src/worker_lockfiles.rs +++ b/backend/windmill-worker/src/worker_lockfiles.rs @@ -177,7 +177,7 @@ fn try_normalize(path: &Path) -> Option { Some(ret) } -fn parse_bun_relative_imports(raw_code: &str, script_path: &str) -> error::Result> { +fn parse_ts_relative_imports(raw_code: &str, script_path: &str) -> error::Result> { let mut relative_imports = vec![]; let r = parse_expr_for_imports(raw_code)?; for import in r { @@ -209,8 +209,8 @@ pub fn extract_relative_imports( match language { #[cfg(feature = "python")] Some(ScriptLang::Python3) => parse_relative_imports(&raw_code, script_path).ok(), - Some(ScriptLang::Bun) | Some(ScriptLang::Bunnative) => { - parse_bun_relative_imports(&raw_code, script_path).ok() + Some(ScriptLang::Bun) | Some(ScriptLang::Bunnative) | Some(ScriptLang::Deno) => { + parse_ts_relative_imports(&raw_code, script_path).ok() } _ => None, } @@ -644,7 +644,7 @@ pub async fn handle_flow_dependency_job( tx = clear_dependency_parent_path(&parent_path, &job_path, &job.workspace_id, "flow", tx) .await?; sqlx::query!( - "DELETE FROM flow_workspace_runnables WHERE flow_path = $1 AND workspace_id = $2", + "DELETE FROM workspace_runnable_dependencies WHERE flow_path = $1 AND workspace_id = $2", job_path, job.workspace_id ) @@ -1013,7 +1013,7 @@ async fn lock_modules<'c>( } FlowModuleValue::Script { path, hash, .. } if !path.starts_with("hub/") => { sqlx::query!( - "INSERT INTO flow_workspace_runnables (flow_path, runnable_path, script_hash, runnable_is_flow, workspace_id) VALUES ($1, $2, $3, FALSE, $4) ON CONFLICT DO NOTHING", + "INSERT INTO workspace_runnable_dependencies (flow_path, runnable_path, script_hash, runnable_is_flow, workspace_id) VALUES ($1, $2, $3, FALSE, $4) ON CONFLICT DO NOTHING", job_path, path, hash.map(|h| h.0), @@ -1024,10 +1024,10 @@ async fn lock_modules<'c>( } FlowModuleValue::Flow { path, .. } => { sqlx::query!( - "INSERT INTO flow_workspace_runnables (flow_path, runnable_path, runnable_is_flow, workspace_id) VALUES ($1, $2, TRUE, $3) ON CONFLICT DO NOTHING", + "INSERT INTO workspace_runnable_dependencies (flow_path, runnable_path, runnable_is_flow, workspace_id) VALUES ($1, $2, TRUE, $3) ON CONFLICT DO NOTHING", job_path, path, - job.workspace_id + job.workspace_id, ) .execute(&mut *tx) .await?; @@ -1439,6 +1439,22 @@ async fn lock_modules_app( ) -> Result { match value { Value::Object(mut m) => { + if let (Some(Value::String(ref run_type)), Some(path), Some("runnableByPath")) = ( + m.get("runType"), + m.get("path").and_then(|s| s.as_str()), + m.get("type").and_then(|s| s.as_str()), + ) { + // No script_hash because apps don't supports script version locks yet + sqlx::query!( + "INSERT INTO workspace_runnable_dependencies (app_path, runnable_path, runnable_is_flow, workspace_id) VALUES ($1, $2, $3, $4) ON CONFLICT DO NOTHING", + job_path, + path, + run_type == "flow", + job.workspace_id + ) + .execute(db) + .await?; + } if m.contains_key("inlineScript") { let v = m.get_mut("inlineScript").unwrap(); if let Some(v) = v.as_object_mut() { @@ -1595,6 +1611,15 @@ pub async fn handle_app_dependency_job( .clone() .ok_or_else(|| Error::internal_err("App Dependency requires script hash".to_owned()))? .0; + + sqlx::query!( + "DELETE FROM workspace_runnable_dependencies WHERE app_path = $1 AND workspace_id = $2", + job_path, + job.workspace_id + ) + .execute(db) + .await?; + let record = sqlx::query!("SELECT app_id, value FROM app_version WHERE id = $1", id) .fetch_optional(db) .await? diff --git a/frontend/src/lib/components/Path.svelte b/frontend/src/lib/components/Path.svelte index f6ea751e6c..feb23b9ea2 100644 --- a/frontend/src/lib/components/Path.svelte +++ b/frontend/src/lib/components/Path.svelte @@ -5,6 +5,7 @@ @@ -503,7 +536,65 @@
{error}
- {#if kind != 'app' && kind != 'schedule' && kind != 'http_trigger' && kind != 'websocket_trigger' && initialPath != '' && initialPath != undefined && initialPath != path} + {#if pathUsageInFlowsPromise || pathUsageInAppsPromise || pathUsageInScriptsPromise} + {#await Promise.all( [pathUsageInAppsPromise, pathUsageInFlowsPromise, pathUsageInScriptsPromise] )} + + {:then [apps, flows, scripts]} + {#if (apps && apps.length) || (flows && flows.length) || (scripts && scripts.length)} +

+ Used by {localeConcatAnd([ + ...(scripts && scripts.length ? [pluralize(scripts.length, 'script')] : []), + ...(flows && flows.length ? [pluralize(flows.length, 'flow')] : []), + ...(apps && apps.length ? [pluralize(apps.length, 'app')] : []) + ])} + +

    + {#each scripts || [] as path} +
  • {path}
  • + {/each} + {#each flows || [] as path} +
  • {path}
  • + {/each} + {#each apps || [] as path} +
  • {path}
  • + {/each} +
+ +

+ {#if displayPathChangedWarning} + + + + {/if} + {/if} + {/await} + {:else if displayPathChangedWarning} You are renaming an item that may be depended upon by other items. This may break apps, flows or resources. Find if it used elsewhere using the content search. Note that linked variables diff --git a/frontend/src/lib/utils.ts b/frontend/src/lib/utils.ts index dbcca70726..57c4d93312 100644 --- a/frontend/src/lib/utils.ts +++ b/frontend/src/lib/utils.ts @@ -1163,3 +1163,9 @@ export function isObjectTooBig(obj: any): boolean { const { totalItems, maxDepth } = analyze(obj) return maxDepth > MAX_DEPTH || totalItems > MAX_ITEMS } + +export function localeConcatAnd(items: string[]) { + if (!items.length) return '' + if (items.length === 1) return items[0] + return items.slice(0, -1).join(', ') + ' and ' + items[items.length - 1] +} From 5573d886954182efcac71b3baa54d455f5086b30 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Tue, 25 Mar 2025 01:51:25 +0100 Subject: [PATCH 085/739] perf: cache workspace premium check --- ...f84fef7557f3e3046e7188ee06f6c3a2b2add.json | 15 -- ...52a6591e7593b1a7c3d7a6848587679a48187.json | 15 -- ...a6ed16c25aea4584103c1b9a3651eb31bfe53.json | 16 --- ...b6e80888e511fb4787cb1a7976878abed1d30.json | 22 --- ...707bd1c48c58aaa5b2ae7560cbed3c8d46329.json | 24 ---- ...359d6d9fdfdbffb40a2464a45056660a3a2d4.json | 17 --- ...3242b54d77b46b5f785ae66b8104f89f43219.json | 24 ---- ...cc62a0fc9d4ba56014f3e554cc2b50ce1da06.json | 16 --- ...4ee12e8cffe925bd7cc4e9d02dc90ffe200f3.json | 15 -- ...ba8354d4cd733335db3d76155b663f668b9d7.json | 16 --- ...18cd141e68cf83a7dcae7d3c1b8a7ba94425b.json | 15 -- ...77eb9b71337a9aa2a64cd2db031e64e929251.json | 15 -- ...4f0bf040da3af9e2eac3229264ec95b4755d8.json | 16 --- ...dc6b39dabab77ae7810f553f1773995db51f1.json | 16 --- ...706f62e700695810f23108e975dfcd1fee7a3.json | 17 --- ...a4420f232867a23cacb9a62b386f129a86a4b.json | 16 --- backend/Cargo.toml | 2 +- ...003851_workspace_premium_listener.down.sql | 3 + ...25003851_workspace_premium_listener.up.sql | 13 ++ backend/src/main.rs | 25 ++-- backend/windmill-api/Cargo.toml | 1 + backend/windmill-api/src/workspaces.rs | 20 ++- backend/windmill-common/Cargo.toml | 1 + backend/windmill-common/src/workspaces.rs | 21 ++- backend/windmill-queue/src/jobs.rs | 18 +-- backend/windmill-worker/src/common.rs | 10 +- backend/windmill-worker/src/worker.rs | 135 +++++++++--------- 27 files changed, 138 insertions(+), 386 deletions(-) delete mode 100644 backend/.sqlx/query-1ea8c2ce29da8d1be19dfd3ecc7f84fef7557f3e3046e7188ee06f6c3a2b2add.json delete mode 100644 backend/.sqlx/query-2bb2cf6accb18d3e37a63388cca52a6591e7593b1a7c3d7a6848587679a48187.json delete mode 100644 backend/.sqlx/query-35795d27c4ca69d2f145b4dba08a6ed16c25aea4584103c1b9a3651eb31bfe53.json delete mode 100644 backend/.sqlx/query-4c970f10d345bcdcf956dcbfa22b6e80888e511fb4787cb1a7976878abed1d30.json delete mode 100644 backend/.sqlx/query-56a2fe44b73728c9aba10f3d1c7707bd1c48c58aaa5b2ae7560cbed3c8d46329.json delete mode 100644 backend/.sqlx/query-894e5080e83b098839a050bb472359d6d9fdfdbffb40a2464a45056660a3a2d4.json delete mode 100644 backend/.sqlx/query-9aeee333b1dbe58ba819ba3b2713242b54d77b46b5f785ae66b8104f89f43219.json delete mode 100644 backend/.sqlx/query-9c956541e068154193243795d96cc62a0fc9d4ba56014f3e554cc2b50ce1da06.json delete mode 100644 backend/.sqlx/query-a28f8697da75d7ac2c6e13dda394ee12e8cffe925bd7cc4e9d02dc90ffe200f3.json delete mode 100644 backend/.sqlx/query-ab9783a48e0f6cacd5dd86cfa21ba8354d4cd733335db3d76155b663f668b9d7.json delete mode 100644 backend/.sqlx/query-acbea8740b28c26942c50edcf5618cd141e68cf83a7dcae7d3c1b8a7ba94425b.json delete mode 100644 backend/.sqlx/query-af2f780da994befd09959d3b1b077eb9b71337a9aa2a64cd2db031e64e929251.json delete mode 100644 backend/.sqlx/query-b656927cd70b6667f3c72186ec04f0bf040da3af9e2eac3229264ec95b4755d8.json delete mode 100644 backend/.sqlx/query-baf63525ca210c22d3ad8c0b197dc6b39dabab77ae7810f553f1773995db51f1.json delete mode 100644 backend/.sqlx/query-c35f44f91b08fa57e29a2b4a685706f62e700695810f23108e975dfcd1fee7a3.json delete mode 100644 backend/.sqlx/query-dc58e5b4715601a93b3c01a2564a4420f232867a23cacb9a62b386f129a86a4b.json create mode 100644 backend/migrations/20250325003851_workspace_premium_listener.down.sql create mode 100644 backend/migrations/20250325003851_workspace_premium_listener.up.sql diff --git a/backend/.sqlx/query-1ea8c2ce29da8d1be19dfd3ecc7f84fef7557f3e3046e7188ee06f6c3a2b2add.json b/backend/.sqlx/query-1ea8c2ce29da8d1be19dfd3ecc7f84fef7557f3e3046e7188ee06f6c3a2b2add.json deleted file mode 100644 index 17c406c101..0000000000 --- a/backend/.sqlx/query-1ea8c2ce29da8d1be19dfd3ecc7f84fef7557f3e3046e7188ee06f6c3a2b2add.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "DELETE FROM workspace_runnable_usage WHERE resource_path = $1 AND workspace_id = $2 and resource_kind = 'flow'", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Text" - ] - }, - "nullable": [] - }, - "hash": "1ea8c2ce29da8d1be19dfd3ecc7f84fef7557f3e3046e7188ee06f6c3a2b2add" -} diff --git a/backend/.sqlx/query-2bb2cf6accb18d3e37a63388cca52a6591e7593b1a7c3d7a6848587679a48187.json b/backend/.sqlx/query-2bb2cf6accb18d3e37a63388cca52a6591e7593b1a7c3d7a6848587679a48187.json deleted file mode 100644 index 11e7df65bf..0000000000 --- a/backend/.sqlx/query-2bb2cf6accb18d3e37a63388cca52a6591e7593b1a7c3d7a6848587679a48187.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE flow_workspace_runnables SET workspace_id = $1 WHERE workspace_id = $2", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "Text" - ] - }, - "nullable": [] - }, - "hash": "2bb2cf6accb18d3e37a63388cca52a6591e7593b1a7c3d7a6848587679a48187" -} diff --git a/backend/.sqlx/query-35795d27c4ca69d2f145b4dba08a6ed16c25aea4584103c1b9a3651eb31bfe53.json b/backend/.sqlx/query-35795d27c4ca69d2f145b4dba08a6ed16c25aea4584103c1b9a3651eb31bfe53.json deleted file mode 100644 index 06730d3e26..0000000000 --- a/backend/.sqlx/query-35795d27c4ca69d2f145b4dba08a6ed16c25aea4584103c1b9a3651eb31bfe53.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO flow_workspace_runnables (flow_path, runnable_path, runnable_is_flow, workspace_id) VALUES ($1, $2, TRUE, $3) ON CONFLICT DO NOTHING", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "Varchar", - "Varchar" - ] - }, - "nullable": [] - }, - "hash": "35795d27c4ca69d2f145b4dba08a6ed16c25aea4584103c1b9a3651eb31bfe53" -} diff --git a/backend/.sqlx/query-4c970f10d345bcdcf956dcbfa22b6e80888e511fb4787cb1a7976878abed1d30.json b/backend/.sqlx/query-4c970f10d345bcdcf956dcbfa22b6e80888e511fb4787cb1a7976878abed1d30.json deleted file mode 100644 index 26894a04ef..0000000000 --- a/backend/.sqlx/query-4c970f10d345bcdcf956dcbfa22b6e80888e511fb4787cb1a7976878abed1d30.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT premium FROM workspace WHERE workspace.id = $1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "premium", - "type_info": "Bool" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - false - ] - }, - "hash": "4c970f10d345bcdcf956dcbfa22b6e80888e511fb4787cb1a7976878abed1d30" -} diff --git a/backend/.sqlx/query-56a2fe44b73728c9aba10f3d1c7707bd1c48c58aaa5b2ae7560cbed3c8d46329.json b/backend/.sqlx/query-56a2fe44b73728c9aba10f3d1c7707bd1c48c58aaa5b2ae7560cbed3c8d46329.json deleted file mode 100644 index 22870b1d2d..0000000000 --- a/backend/.sqlx/query-56a2fe44b73728c9aba10f3d1c7707bd1c48c58aaa5b2ae7560cbed3c8d46329.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT f.path\n FROM workspace_runnable_usage wru \n JOIN flow f\n ON wru.resource_path = f.path AND wru.workspace_id = f.workspace_id\n WHERE wru.runnable_path = $1 AND wru.runnable_is_flow = $2 AND wru.workspace_id = $3", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "path", - "type_info": "Varchar" - } - ], - "parameters": { - "Left": [ - "Text", - "Bool", - "Text" - ] - }, - "nullable": [ - false - ] - }, - "hash": "56a2fe44b73728c9aba10f3d1c7707bd1c48c58aaa5b2ae7560cbed3c8d46329" -} diff --git a/backend/.sqlx/query-894e5080e83b098839a050bb472359d6d9fdfdbffb40a2464a45056660a3a2d4.json b/backend/.sqlx/query-894e5080e83b098839a050bb472359d6d9fdfdbffb40a2464a45056660a3a2d4.json deleted file mode 100644 index 7ee434f66e..0000000000 --- a/backend/.sqlx/query-894e5080e83b098839a050bb472359d6d9fdfdbffb40a2464a45056660a3a2d4.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO workspace_runnable_usage (resource_path, runnable_path, script_hash, runnable_is_flow, workspace_id, resource_kind) VALUES ($1, $2, $3, FALSE, $4, 'flow') ON CONFLICT DO NOTHING", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "Varchar", - "Int8", - "Varchar" - ] - }, - "nullable": [] - }, - "hash": "894e5080e83b098839a050bb472359d6d9fdfdbffb40a2464a45056660a3a2d4" -} diff --git a/backend/.sqlx/query-9aeee333b1dbe58ba819ba3b2713242b54d77b46b5f785ae66b8104f89f43219.json b/backend/.sqlx/query-9aeee333b1dbe58ba819ba3b2713242b54d77b46b5f785ae66b8104f89f43219.json deleted file mode 100644 index 271a508a83..0000000000 --- a/backend/.sqlx/query-9aeee333b1dbe58ba819ba3b2713242b54d77b46b5f785ae66b8104f89f43219.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT f.path\n FROM flow_workspace_runnables fwr \n JOIN flow f \n ON fwr.flow_path = f.path AND fwr.workspace_id = f.workspace_id\n WHERE fwr.runnable_path = $1 AND fwr.runnable_is_flow = $2 AND fwr.workspace_id = $3", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "path", - "type_info": "Varchar" - } - ], - "parameters": { - "Left": [ - "Text", - "Bool", - "Text" - ] - }, - "nullable": [ - false - ] - }, - "hash": "9aeee333b1dbe58ba819ba3b2713242b54d77b46b5f785ae66b8104f89f43219" -} diff --git a/backend/.sqlx/query-9c956541e068154193243795d96cc62a0fc9d4ba56014f3e554cc2b50ce1da06.json b/backend/.sqlx/query-9c956541e068154193243795d96cc62a0fc9d4ba56014f3e554cc2b50ce1da06.json deleted file mode 100644 index 690f2dedcc..0000000000 --- a/backend/.sqlx/query-9c956541e068154193243795d96cc62a0fc9d4ba56014f3e554cc2b50ce1da06.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE workspace_runnable_usage SET resource_path = REGEXP_REPLACE(resource_path,'u/' || $2 || '/(.*)','u/' || $1 || '/\\1') WHERE resource_path LIKE ('u/' || $2 || '/%') AND workspace_id = $3", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Text", - "Text" - ] - }, - "nullable": [] - }, - "hash": "9c956541e068154193243795d96cc62a0fc9d4ba56014f3e554cc2b50ce1da06" -} diff --git a/backend/.sqlx/query-a28f8697da75d7ac2c6e13dda394ee12e8cffe925bd7cc4e9d02dc90ffe200f3.json b/backend/.sqlx/query-a28f8697da75d7ac2c6e13dda394ee12e8cffe925bd7cc4e9d02dc90ffe200f3.json deleted file mode 100644 index 62c2a10550..0000000000 --- a/backend/.sqlx/query-a28f8697da75d7ac2c6e13dda394ee12e8cffe925bd7cc4e9d02dc90ffe200f3.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "DELETE FROM workspace_runnable_usage WHERE resource_path = $1 AND workspace_id = $2 and resource_kind = 'app'", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Text" - ] - }, - "nullable": [] - }, - "hash": "a28f8697da75d7ac2c6e13dda394ee12e8cffe925bd7cc4e9d02dc90ffe200f3" -} diff --git a/backend/.sqlx/query-ab9783a48e0f6cacd5dd86cfa21ba8354d4cd733335db3d76155b663f668b9d7.json b/backend/.sqlx/query-ab9783a48e0f6cacd5dd86cfa21ba8354d4cd733335db3d76155b663f668b9d7.json deleted file mode 100644 index 7dd52db3fa..0000000000 --- a/backend/.sqlx/query-ab9783a48e0f6cacd5dd86cfa21ba8354d4cd733335db3d76155b663f668b9d7.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO workspace_runnable_usage (resource_path, runnable_path, runnable_is_flow, workspace_id, resource_kind) VALUES ($1, $2, TRUE, $3, 'flow') ON CONFLICT DO NOTHING", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "Varchar", - "Varchar" - ] - }, - "nullable": [] - }, - "hash": "ab9783a48e0f6cacd5dd86cfa21ba8354d4cd733335db3d76155b663f668b9d7" -} diff --git a/backend/.sqlx/query-acbea8740b28c26942c50edcf5618cd141e68cf83a7dcae7d3c1b8a7ba94425b.json b/backend/.sqlx/query-acbea8740b28c26942c50edcf5618cd141e68cf83a7dcae7d3c1b8a7ba94425b.json deleted file mode 100644 index 410aed9cc5..0000000000 --- a/backend/.sqlx/query-acbea8740b28c26942c50edcf5618cd141e68cf83a7dcae7d3c1b8a7ba94425b.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "DELETE FROM flow_workspace_runnables WHERE flow_path = $1 AND workspace_id = $2", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Text" - ] - }, - "nullable": [] - }, - "hash": "acbea8740b28c26942c50edcf5618cd141e68cf83a7dcae7d3c1b8a7ba94425b" -} diff --git a/backend/.sqlx/query-af2f780da994befd09959d3b1b077eb9b71337a9aa2a64cd2db031e64e929251.json b/backend/.sqlx/query-af2f780da994befd09959d3b1b077eb9b71337a9aa2a64cd2db031e64e929251.json deleted file mode 100644 index 8ccc824ace..0000000000 --- a/backend/.sqlx/query-af2f780da994befd09959d3b1b077eb9b71337a9aa2a64cd2db031e64e929251.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE workspace_runnable_usage SET workspace_id = $1 WHERE workspace_id = $2", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "Text" - ] - }, - "nullable": [] - }, - "hash": "af2f780da994befd09959d3b1b077eb9b71337a9aa2a64cd2db031e64e929251" -} diff --git a/backend/.sqlx/query-b656927cd70b6667f3c72186ec04f0bf040da3af9e2eac3229264ec95b4755d8.json b/backend/.sqlx/query-b656927cd70b6667f3c72186ec04f0bf040da3af9e2eac3229264ec95b4755d8.json deleted file mode 100644 index c05edddc9f..0000000000 --- a/backend/.sqlx/query-b656927cd70b6667f3c72186ec04f0bf040da3af9e2eac3229264ec95b4755d8.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE flow_workspace_runnables SET flow_path = REGEXP_REPLACE(flow_path,'u/' || $2 || '/(.*)','u/' || $1 || '/\\1') WHERE flow_path LIKE ('u/' || $2 || '/%') AND workspace_id = $3", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Text", - "Text" - ] - }, - "nullable": [] - }, - "hash": "b656927cd70b6667f3c72186ec04f0bf040da3af9e2eac3229264ec95b4755d8" -} diff --git a/backend/.sqlx/query-baf63525ca210c22d3ad8c0b197dc6b39dabab77ae7810f553f1773995db51f1.json b/backend/.sqlx/query-baf63525ca210c22d3ad8c0b197dc6b39dabab77ae7810f553f1773995db51f1.json deleted file mode 100644 index dfc8414434..0000000000 --- a/backend/.sqlx/query-baf63525ca210c22d3ad8c0b197dc6b39dabab77ae7810f553f1773995db51f1.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE workspace_runnable_usage SET runnable_path = REGEXP_REPLACE(runnable_path,'u/' || $2 || '/(.*)','u/' || $1 || '/\\1') WHERE runnable_path LIKE ('u/' || $2 || '/%') AND workspace_id = $3", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Text", - "Text" - ] - }, - "nullable": [] - }, - "hash": "baf63525ca210c22d3ad8c0b197dc6b39dabab77ae7810f553f1773995db51f1" -} diff --git a/backend/.sqlx/query-c35f44f91b08fa57e29a2b4a685706f62e700695810f23108e975dfcd1fee7a3.json b/backend/.sqlx/query-c35f44f91b08fa57e29a2b4a685706f62e700695810f23108e975dfcd1fee7a3.json deleted file mode 100644 index 77e89c52a8..0000000000 --- a/backend/.sqlx/query-c35f44f91b08fa57e29a2b4a685706f62e700695810f23108e975dfcd1fee7a3.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO flow_workspace_runnables (flow_path, runnable_path, script_hash, runnable_is_flow, workspace_id) VALUES ($1, $2, $3, FALSE, $4) ON CONFLICT DO NOTHING", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "Varchar", - "Int8", - "Varchar" - ] - }, - "nullable": [] - }, - "hash": "c35f44f91b08fa57e29a2b4a685706f62e700695810f23108e975dfcd1fee7a3" -} diff --git a/backend/.sqlx/query-dc58e5b4715601a93b3c01a2564a4420f232867a23cacb9a62b386f129a86a4b.json b/backend/.sqlx/query-dc58e5b4715601a93b3c01a2564a4420f232867a23cacb9a62b386f129a86a4b.json deleted file mode 100644 index d3b8f33ff0..0000000000 --- a/backend/.sqlx/query-dc58e5b4715601a93b3c01a2564a4420f232867a23cacb9a62b386f129a86a4b.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE flow_workspace_runnables SET runnable_path = REGEXP_REPLACE(runnable_path,'u/' || $2 || '/(.*)','u/' || $1 || '/\\1') WHERE runnable_path LIKE ('u/' || $2 || '/%') AND workspace_id = $3", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Text", - "Text" - ] - }, - "nullable": [] - }, - "hash": "dc58e5b4715601a93b3c01a2564a4420f232867a23cacb9a62b386f129a86a4b" -} diff --git a/backend/Cargo.toml b/backend/Cargo.toml index f07ef205fb..c001db30c2 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -58,7 +58,7 @@ parquet = ["windmill-api/parquet", "windmill-common/parquet", "windmill-worker/p prometheus = ["windmill-common/prometheus", "windmill-api/prometheus", "windmill-worker/prometheus", "windmill-queue/prometheus", "dep:prometheus"] flow_testing = ["windmill-worker/flow_testing"] openidconnect = ["windmill-api/openidconnect"] -cloud = ["windmill-queue/cloud", "windmill-worker/cloud"] +cloud = ["windmill-queue/cloud", "windmill-worker/cloud", "windmill-common/cloud", "windmill-api/cloud"] jemalloc = ["windmill-common/jemalloc", "dep:tikv-jemallocator", "dep:tikv-jemalloc-sys", "dep:tikv-jemalloc-ctl"] tantivy = ["dep:windmill-indexer", "windmill-api/tantivy", "windmill-indexer/enterprise", "windmill-indexer/parquet", "windmill-common/tantivy", "enterprise", "parquet"] sqlx = ["windmill-worker/sqlx"] diff --git a/backend/migrations/20250325003851_workspace_premium_listener.down.sql b/backend/migrations/20250325003851_workspace_premium_listener.down.sql new file mode 100644 index 0000000000..5515b4226d --- /dev/null +++ b/backend/migrations/20250325003851_workspace_premium_listener.down.sql @@ -0,0 +1,3 @@ +-- Add down migration script here +DROP TRIGGER workspace_premium_change_trigger ON workspace; +DROP FUNCTION notify_workspace_premium_change(); diff --git a/backend/migrations/20250325003851_workspace_premium_listener.up.sql b/backend/migrations/20250325003851_workspace_premium_listener.up.sql new file mode 100644 index 0000000000..e841dfbe16 --- /dev/null +++ b/backend/migrations/20250325003851_workspace_premium_listener.up.sql @@ -0,0 +1,13 @@ +-- Add up migration script here +CREATE OR REPLACE FUNCTION notify_workspace_premium_change() +RETURNS TRIGGER AS $$ +BEGIN + PERFORM pg_notify('notify_workspace_premium_change', NEW.id); + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +CREATE TRIGGER workspace_premium_change_trigger +AFTER UPDATE OF premium ON workspace +FOR EACH ROW +EXECUTE FUNCTION notify_workspace_premium_change(); diff --git a/backend/src/main.rs b/backend/src/main.rs index c349a87249..c608b214b0 100644 --- a/backend/src/main.rs +++ b/backend/src/main.rs @@ -707,6 +707,11 @@ Windmill Community Edition {GIT_VERSION} tracing::info!("Workspace envs change detected, invalidating workspace envs cache: {}", workspace_id); windmill_common::variables::CUSTOM_ENVS_CACHE.remove(workspace_id); }, + "notify_workspace_premium_change" => { + let workspace_id = n.payload(); + tracing::info!("Workspace premium change detected, invalidating workspace premium cache: {}", workspace_id); + windmill_common::workspaces::IS_PREMIUM_CACHE.remove(workspace_id); + }, "notify_global_setting_change" => { tracing::info!("Global setting change detected: {}", n.payload()); match n.payload() { @@ -980,15 +985,17 @@ async fn listen_pg(url: &str) -> Option { } }; - if let Err(e) = listener - .listen_all(vec![ - "notify_config_change", - "notify_global_setting_change", - "notify_webhook_change", - "notify_workspace_envs_change", - ]) - .await - { + #[allow(unused_mut)] + let mut channels = vec![ + "notify_config_change", + "notify_global_setting_change", + "notify_webhook_change", + "notify_workspace_envs_change", + ]; + #[cfg(feature = "cloud")] + channels.push("notify_workspace_premium_change"); + + if let Err(e) = listener.listen_all(channels).await { tracing::error!(error = %e, "Could not listen to database"); return None; } diff --git a/backend/windmill-api/Cargo.toml b/backend/windmill-api/Cargo.toml index 20fe893517..97928baa19 100644 --- a/backend/windmill-api/Cargo.toml +++ b/backend/windmill-api/Cargo.toml @@ -31,6 +31,7 @@ static_frontend = ["dep:rust-embed"] postgres_trigger = ["dep:rust-postgres", "dep:pg_escape", "dep:byteorder", "dep:thiserror", "dep:rust_decimal", "dep:rust-postgres-native-tls"] mqtt_trigger = ["dep:thiserror", "dep:rumqttc"] sqs_trigger = ["dep:aws-sdk-sqs", "dep:thiserror", "dep:aws-config"] +cloud = ["windmill-common/cloud"] [dependencies] windmill-queue.workspace = true diff --git a/backend/windmill-api/src/workspaces.rs b/backend/windmill-api/src/workspaces.rs index c83370bfb5..03ba214bba 100644 --- a/backend/windmill-api/src/workspaces.rs +++ b/backend/windmill-api/src/workspaces.rs @@ -393,19 +393,15 @@ async fn list_pending_invites( async fn is_premium( authed: ApiAuthed, - Extension(db): Extension, - Path(w_id): Path, + Extension(_db): Extension, + Path(_w_id): Path, ) -> JsonResult { require_admin(authed.is_admin, &authed.username)?; - let mut tx = db.begin().await?; - let row = sqlx::query_scalar!( - "SELECT premium FROM workspace WHERE workspace.id = $1", - &w_id - ) - .fetch_one(&mut *tx) - .await?; - tx.commit().await?; - Ok(Json(row)) + #[cfg(feature = "cloud")] + let premium = windmill_common::workspaces::is_premium_workspace(&_db, &_w_id).await; + #[cfg(not(feature = "cloud"))] + let premium = false; + Ok(Json(premium)) } async fn exists_workspace( @@ -1362,7 +1358,7 @@ struct UsedTriggers { pub nats_used: bool, pub postgres_used: bool, pub mqtt_used: bool, - pub sqs_used: bool + pub sqs_used: bool, } async fn get_used_triggers( diff --git a/backend/windmill-common/Cargo.toml b/backend/windmill-common/Cargo.toml index f19ef1b06c..7ff360b42b 100644 --- a/backend/windmill-common/Cargo.toml +++ b/backend/windmill-common/Cargo.toml @@ -17,6 +17,7 @@ otel = ["dep:opentelemetry-semantic-conventions", "dep:opentelemetry-otlp", "dep "dep:opentelemetry", "dep:tracing-opentelemetry", "dep:opentelemetry-appender-tracing", "dep:tonic"] smtp = ["dep:mail-send"] scoped_cache = [] +cloud = [] [lib] name = "windmill_common" diff --git a/backend/windmill-common/src/workspaces.rs b/backend/windmill-common/src/workspaces.rs index 8fd5471a00..1238d5b243 100644 --- a/backend/windmill-common/src/workspaces.rs +++ b/backend/windmill-common/src/workspaces.rs @@ -1,3 +1,4 @@ +use quick_cache::sync::Cache; use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize, Debug, Default)] @@ -27,7 +28,7 @@ pub enum ObjectType { ResourceType, User, Group, - Trigger + Trigger, } #[derive(Serialize, Deserialize, Debug)] @@ -38,3 +39,21 @@ pub struct GitRepositorySettings { pub group_by_folder: Option, pub exclude_types_override: Option>, } + +lazy_static::lazy_static! { + pub static ref IS_PREMIUM_CACHE: Cache = Cache::new(5000); +} + +#[cfg(feature = "cloud")] +pub async fn is_premium_workspace(_db: &crate::DB, _w_id: &str) -> bool { + let cached = IS_PREMIUM_CACHE.get(_w_id); + if let Some(cached) = cached { + return cached; + } + let premium = sqlx::query_scalar!("SELECT premium FROM workspace WHERE id = $1", _w_id) + .fetch_one(_db) + .await + .unwrap_or(false); + IS_PREMIUM_CACHE.insert(_w_id.to_string(), premium); + premium +} diff --git a/backend/windmill-queue/src/jobs.rs b/backend/windmill-queue/src/jobs.rs index 865b7d47bc..f62984942d 100644 --- a/backend/windmill-queue/src/jobs.rs +++ b/backend/windmill-queue/src/jobs.rs @@ -928,13 +928,7 @@ pub async fn add_completed_job( if *CLOUD_HOSTED && !queued_job.is_flow() && _duration > 1000 { let additional_usage = _duration / 1000; let w_id = &queued_job.workspace_id; - let premium_workspace = - sqlx::query_scalar!("SELECT premium FROM workspace WHERE id = $1", w_id) - .fetch_one(db) - .await - .map_err(|e| { - Error::internal_err(format!("fetching if {w_id} is premium: {e:#}")) - })?; + let premium_workspace = windmill_common::workspaces::is_premium_workspace(db, w_id).await; let _ = sqlx::query!( "INSERT INTO usage (id, is_workspace, month_, usage) VALUES ($1, TRUE, EXTRACT(YEAR FROM current_date) * 12 + EXTRACT(MONTH FROM current_date), $2) @@ -2996,15 +2990,7 @@ pub async fn push<'c, 'd>( #[cfg(feature = "cloud")] if *CLOUD_HOSTED { let premium_workspace = - sqlx::query_scalar!("SELECT premium FROM workspace WHERE id = $1", workspace_id) - .fetch_one(_db) - .await - .map_err(|e| { - Error::internal_err(format!( - "fetching if {workspace_id} is premium and overquota: {e:#}" - )) - })?; - + windmill_common::workspaces::is_premium_workspace(_db, workspace_id).await; // we track only non flow steps let (workspace_usage, user_usage) = if !matches!( job_payload, diff --git a/backend/windmill-worker/src/common.rs b/backend/windmill-worker/src/common.rs index 67df5e2f23..cd4f26b776 100644 --- a/backend/windmill-worker/src/common.rs +++ b/backend/windmill-worker/src/common.rs @@ -564,14 +564,8 @@ pub async fn resolve_job_timeout( ) -> (Duration, Option, bool) { let mut warn_msg: Option = None; #[cfg(feature = "cloud")] - let cloud_premium_workspace = *CLOUD_HOSTED - && sqlx::query_scalar!("SELECT premium FROM workspace WHERE id = $1", _w_id) - .fetch_one(_db) - .await - .map_err(|e| { - tracing::error!(%e, "error getting premium workspace for job {_job_id}: {e:#}"); - }) - .unwrap_or(false); + let cloud_premium_workspace = + *CLOUD_HOSTED && windmill_common::workspaces::is_premium_workspace(_db, _w_id).await; #[cfg(not(feature = "cloud"))] let cloud_premium_workspace = false; diff --git a/backend/windmill-worker/src/worker.rs b/backend/windmill-worker/src/worker.rs index c696dbe6c6..a1f1754ab5 100644 --- a/backend/windmill-worker/src/worker.rs +++ b/backend/windmill-worker/src/worker.rs @@ -1283,70 +1283,9 @@ pub async fn run_worker( "received {} from same worker channel", same_worker_job.job_id ); - let r = sqlx::query_as::<_, PulledJob>( - "WITH ping AS ( - UPDATE v2_job_runtime SET ping = NOW() WHERE id = $1 - ), - started_at AS ( - UPDATE v2_job_queue SET started_at = NOW() WHERE id = $1 - ) - SELECT - v2_job_queue.workspace_id, - v2_job_queue.id, - v2_job.args, - v2_job.parent_job, - v2_job.created_by, - v2_job_queue.started_at, - scheduled_for, - v2_job.runnable_path, - v2_job.kind, - v2_job.runnable_id, - v2_job_queue.canceled_reason, - v2_job_queue.canceled_by, - v2_job.permissioned_as, - v2_job.permissioned_as_email, - v2_job_status.flow_status, - v2_job.tag, - v2_job.script_lang, - v2_job.same_worker, - v2_job.pre_run_error, - v2_job.concurrent_limit, - v2_job.concurrency_time_window_s, - v2_job.flow_innermost_root_job, - v2_job.timeout, - v2_job.flow_step_id, - v2_job.cache_ttl, - v2_job_queue.priority, - v2_job.preprocessed, - v2_job.script_entrypoint_override, - v2_job.trigger, - v2_job.trigger_kind, - v2_job.visible_to_owner, - v2_job.raw_code, - v2_job.raw_lock, - v2_job.raw_flow, - pj.runnable_path as parent_runnable_path, - p.email as permissioned_as_email, p.username as permissioned_as_username, p.is_admin as permissioned_as_is_admin, - p.is_operator as permissioned_as_is_operator, p.groups as permissioned_as_groups, p.folders as permissioned_as_folders - FROM v2_job_queue - INNER JOIN v2_job ON v2_job.id = v2_job_queue.id - LEFT JOIN v2_job_status ON v2_job_status.id = v2_job_queue.id - LEFT JOIN job_perms p ON p.job_id = v2_job.id - LEFT JOIN v2_job pj ON v2_job.parent_job = pj.id - WHERE v2_job_queue.id = $1 -", - ) - .bind(same_worker_job.job_id) - .fetch_optional(db) - .await - .map_err(|e| { - Error::internal_err(format!( - "Impossible to fetch same_worker job {}: {}", - same_worker_job.job_id, e - )) - }); + let job = get_same_worker_job(db, &same_worker_job).await; // tracing::error!("r: {:?}", r); - if r.is_err() && !same_worker_job.recoverable { + if job.is_err() && !same_worker_job.recoverable { tracing::error!( worker = %worker_name, hostname = %hostname, "failed to fetch same_worker job on a non recoverable job, exiting" @@ -1358,7 +1297,7 @@ pub async fn run_worker( .expect("send kill to job completed tx"); break; } else { - r + job } } else if let Ok(_) = killpill_rx.try_recv() { if !killed_but_draining_same_worker_jobs { @@ -1862,6 +1801,74 @@ pub async fn run_worker( tracing::info!(worker = %worker_name, hostname = %hostname, "number of jobs executed: {}", jobs_executed); } +async fn get_same_worker_job( + db: &Pool, + same_worker_job: &SameWorkerPayload, +) -> windmill_common::error::Result> { + sqlx::query_as::<_, PulledJob>( + "WITH ping AS ( + UPDATE v2_job_runtime SET ping = NOW() WHERE id = $1 + ), + started_at AS ( + UPDATE v2_job_queue SET started_at = NOW() WHERE id = $1 + ) + SELECT + v2_job_queue.workspace_id, + v2_job_queue.id, + v2_job.args, + v2_job.parent_job, + v2_job.created_by, + v2_job_queue.started_at, + scheduled_for, + v2_job.runnable_path, + v2_job.kind, + v2_job.runnable_id, + v2_job_queue.canceled_reason, + v2_job_queue.canceled_by, + v2_job.permissioned_as, + v2_job.permissioned_as_email, + v2_job_status.flow_status, + v2_job.tag, + v2_job.script_lang, + v2_job.same_worker, + v2_job.pre_run_error, + v2_job.concurrent_limit, + v2_job.concurrency_time_window_s, + v2_job.flow_innermost_root_job, + v2_job.timeout, + v2_job.flow_step_id, + v2_job.cache_ttl, + v2_job_queue.priority, + v2_job.preprocessed, + v2_job.script_entrypoint_override, + v2_job.trigger, + v2_job.trigger_kind, + v2_job.visible_to_owner, + v2_job.raw_code, + v2_job.raw_lock, + v2_job.raw_flow, + pj.runnable_path as parent_runnable_path, + p.email as permissioned_as_email, p.username as permissioned_as_username, p.is_admin as permissioned_as_is_admin, + p.is_operator as permissioned_as_is_operator, p.groups as permissioned_as_groups, p.folders as permissioned_as_folders + FROM v2_job_queue + INNER JOIN v2_job ON v2_job.id = v2_job_queue.id + LEFT JOIN v2_job_status ON v2_job_status.id = v2_job_queue.id + LEFT JOIN job_perms p ON p.job_id = v2_job.id + LEFT JOIN v2_job pj ON v2_job.parent_job = pj.id + WHERE v2_job_queue.id = $1 +", + ) + .bind(same_worker_job.job_id) + .fetch_optional(db) + .await + .map_err(|e| { + Error::internal_err(format!( + "Impossible to fetch same_worker job {}: {}", + same_worker_job.job_id, e + )) + }) +} + async fn queue_init_bash_maybe<'c>( db: &Pool, same_worker_tx: SameWorkerSender, From dd3074a23cd2778d4a1c70681e885e3069d392a8 Mon Sep 17 00:00:00 2001 From: Diego Imbert <70353967+diegoimbert@users.noreply.github.com> Date: Tue, 25 Mar 2025 10:17:58 +0100 Subject: [PATCH 086/739] fix 404 when creating new scripts flows or apps (#5505) --- frontend/src/lib/components/Path.svelte | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/frontend/src/lib/components/Path.svelte b/frontend/src/lib/components/Path.svelte index feb23b9ea2..15688aa026 100644 --- a/frontend/src/lib/components/Path.svelte +++ b/frontend/src/lib/components/Path.svelte @@ -340,7 +340,8 @@ $: pathUsageInFlowsPromise = (kind == 'script' || kind == 'flow') && - !!$workspaceStore && + $workspaceStore && + initialPath && FlowService.listFlowPathsFromWorkspaceRunnable({ workspace: $workspaceStore, path: initialPath, @@ -349,7 +350,8 @@ $: pathUsageInAppsPromise = (kind == 'script' || kind == 'flow') && - !!$workspaceStore && + $workspaceStore && + initialPath && AppService.listAppPathsFromWorkspaceRunnable({ workspace: $workspaceStore, path: initialPath, @@ -358,7 +360,8 @@ $: pathUsageInScriptsPromise = kind == 'script' && - !!$workspaceStore && + $workspaceStore && + initialPath && ScriptService.listScriptPathsFromWorkspaceRunnable({ workspace: $workspaceStore, path: initialPath From 234b20f8bd55ea19b17b80f08d9ff1e0e00ba739 Mon Sep 17 00:00:00 2001 From: HugoCasa Date: Tue, 25 Mar 2025 19:53:48 +0100 Subject: [PATCH 087/739] feat: autocomplete v2 + AI chat (#5323) * feat: autocomplete v2 * wip chat * wip * feat: chat ai review and apply * feat: multiple providers * update cli gen * fixes * improvements * fix build * fix issues * fix build * final nits * nits * nits --- ...172ea9a70835bfba6cef56142556197e9767.json} | 6 +- ...8234ca7d1efeee9661f3901f298da375e73f7.json | 18 +- ...290d810a5e8ea6458d9f9fd484ced549ea82e.json | 29 - ...850bed8f435ea5de16ba796f346fba51d9437.json | 22 + ...bb1e4b9022f5e841afd9eeb08a81688f6c0c8.json | 15 - ...05db96faeec6c18500ad96087cd06c2c85a8b.json | 22 + ...70aafd27ef61c940daba186e7e66f668c31ed.json | 17 - ...dcc40f463cbc52d94ed9315cf9a547d4c89f2.json | 18 +- ...23919cee3cc444725ac6b7906922554bae800.json | 23 + ...c496f1757d950cdec63c93c77fe79d5212cc.json} | 4 +- ...122fd3eae99a382ca3e66606d3183de51843.json} | 40 +- ...085502a1e77e30e59c7310c78976f77a810a3.json | 34 -- ...0c624cd1b00bcab9855edb9284d8afec46ff0.json | 15 + ...fe2635785b53d31d0ceb3d72226a0c316e8a.json} | 36 +- ...5859c924cffa61074562ac6d33106d02d7d6.json} | 4 +- ...fb565f04539fc7eb141ebfaa957456016841.json} | 4 +- ...a9442c35453dff95140d2f252c4fe6a14c6a4.json | 22 - ...50319121050_multiple_ai_providers.down.sql | 24 + ...0250319121050_multiple_ai_providers.up.sql | 38 ++ backend/windmill-api/openapi.yaml | 74 ++- backend/windmill-api/src/ai.rs | 414 +++++++------ backend/windmill-api/src/lib.rs | 1 + backend/windmill-api/src/workspaces.rs | 142 ++--- backend/windmill-api/src/workspaces_export.rs | 37 +- cli/gen/core/OpenAPI.ts | 2 +- cli/gen/services.gen.ts | 2 +- cli/gen/types.gen.ts | 34 +- cli/settings.ts | 18 +- frontend/package-lock.json | 158 ++--- frontend/package.json | 8 +- frontend/src/lib/components/Dev.svelte | 21 +- frontend/src/lib/components/Editor.svelte | 202 ++++--- .../src/lib/components/FlowBuilder.svelte | 11 +- .../src/lib/components/HighlightCode.svelte | 32 +- .../src/lib/components/ScriptEditor.svelte | 196 +++++- frontend/src/lib/components/Toggle.svelte | 2 +- .../editor/settingsPanel/HideButton.svelte | 43 +- .../copilot/CodeCompletionStatus.svelte | 6 +- .../src/lib/components/copilot/CronGen.svelte | 10 +- .../copilot/FlowCopilotStatus.svelte | 2 +- .../lib/components/copilot/IteratorGen.svelte | 10 +- .../lib/components/copilot/MetadataGen.svelte | 11 +- .../components/copilot/PredicateGen.svelte | 6 +- .../lib/components/copilot/RegexGen.svelte | 6 +- .../lib/components/copilot/ScriptFix.svelte | 16 +- .../lib/components/copilot/ScriptGen.svelte | 35 +- .../src/lib/components/copilot/StepGen.svelte | 2 +- .../components/copilot/StepInputGen.svelte | 10 +- .../components/copilot/StepInputsGen.svelte | 8 +- .../copilot/autocomplete/monaco-adapter.ts | 567 ++++++++++++++++++ .../copilot/autocomplete/request.ts | 103 ++++ .../components/copilot/autocomplete/widget.ts | 126 ++++ .../lib/components/copilot/chat/AIChat.svelte | 372 ++++++++++++ .../copilot/chat/AIChatDisplay.svelte | 283 +++++++++ .../copilot/chat/AssistantMessage.svelte | 29 + .../copilot/chat/CodeDisplay.svelte | 206 +++++++ .../copilot/chat/ContextElementBadge.svelte | 79 +++ .../copilot/chat/GlobalReviewButtons.svelte | 19 + .../src/lib/components/copilot/chat/core.ts | 492 +++++++++++++++ .../components/copilot/chat/monaco-adapter.ts | 221 +++++++ .../src/lib/components/copilot/completion.ts | 110 ---- frontend/src/lib/components/copilot/flow.ts | 13 +- frontend/src/lib/components/copilot/lib.ts | 492 ++++----------- frontend/src/lib/components/copilot/shared.ts | 295 +++++++++ frontend/src/lib/components/copilot/utils.ts | 2 +- .../flows/content/FlowInputsQuick.svelte | 2 +- .../flows/map/FlowModuleSchemaMap.svelte | 2 +- .../components/scriptEditor/LogPanel.svelte | 3 + frontend/src/lib/stores.ts | 54 +- .../src/routes/(root)/(logged)/+layout.svelte | 18 +- .../user/(user)/create_workspace/+page.svelte | 22 +- .../(logged)/workspace_settings/+page.svelte | 286 +++++---- typescript-client/build.jsr.sh | 2 +- typescript-client/build.sh | 2 +- 74 files changed, 4185 insertions(+), 1525 deletions(-) rename backend/.sqlx/{query-ceda377fa534656ac12a7f41db77db1f054ec751855c8db7352b0e9c20b63ef8.json => query-0689cdc6c7676f5e1984792a0e0b172ea9a70835bfba6cef56142556197e9767.json} (56%) delete mode 100644 backend/.sqlx/query-103ef3cf5cf4d25d780e4aefd5b290d810a5e8ea6458d9f9fd484ced549ea82e.json create mode 100644 backend/.sqlx/query-197590e7ab74f64bbf374f23128850bed8f435ea5de16ba796f346fba51d9437.json delete mode 100644 backend/.sqlx/query-1bbef6baa5b8e2522d685df2979bb1e4b9022f5e841afd9eeb08a81688f6c0c8.json create mode 100644 backend/.sqlx/query-3734117167a1269f78b3949eed005db96faeec6c18500ad96087cd06c2c85a8b.json delete mode 100644 backend/.sqlx/query-4edf05cbf35325d444de0e74ee070aafd27ef61c940daba186e7e66f668c31ed.json create mode 100644 backend/.sqlx/query-63c16a4277983aaed0aed54972923919cee3cc444725ac6b7906922554bae800.json rename backend/.sqlx/{query-31b6fccad46b22bcbba6bbce22209ccb1825116004ed72682854ce3352f454a5.json => query-9ae20f2f29406cfa5337736ad710c496f1757d950cdec63c93c77fe79d5212cc.json} (54%) rename backend/.sqlx/{query-4e9c2e0690eaca280ccb5e5160438f207d930d29e3000b9845eef89e87a35ad1.json => query-aff243a11d41085b0b2f52b1b49f122fd3eae99a382ca3e66606d3183de51843.json} (83%) delete mode 100644 backend/.sqlx/query-b186efe51e7bb1924efbd7e9b36085502a1e77e30e59c7310c78976f77a810a3.json create mode 100644 backend/.sqlx/query-ba117e89b5da7ef46a9e702a2f80c624cd1b00bcab9855edb9284d8afec46ff0.json rename backend/.sqlx/{query-dc165e2d3e6cfc52d92b48500b5ca7dd94b46263c58163071c0ded1c54535727.json => query-c12a0b0d423577afbb2772f971bffe2635785b53d31d0ceb3d72226a0c316e8a.json} (56%) rename backend/.sqlx/{query-cc6e21bf16d7b92764aa2b261cee94f6daf6a1eedd8a68742a2f510f0452cc32.json => query-e3c8219420bb859de3f1c322978c5859c924cffa61074562ac6d33106d02d7d6.json} (66%) rename backend/.sqlx/{query-82b16e771b6e21c4587b5ebf059e312f43b3e5a48f7599133831dbd65886f5d8.json => query-e5f1e1e74daeabf410991e2484c1fb565f04539fc7eb141ebfaa957456016841.json} (50%) delete mode 100644 backend/.sqlx/query-f632ca2e17a3952fc45bd40a055a9442c35453dff95140d2f252c4fe6a14c6a4.json create mode 100644 backend/migrations/20250319121050_multiple_ai_providers.down.sql create mode 100644 backend/migrations/20250319121050_multiple_ai_providers.up.sql create mode 100644 frontend/src/lib/components/copilot/autocomplete/monaco-adapter.ts create mode 100644 frontend/src/lib/components/copilot/autocomplete/request.ts create mode 100644 frontend/src/lib/components/copilot/autocomplete/widget.ts create mode 100644 frontend/src/lib/components/copilot/chat/AIChat.svelte create mode 100644 frontend/src/lib/components/copilot/chat/AIChatDisplay.svelte create mode 100644 frontend/src/lib/components/copilot/chat/AssistantMessage.svelte create mode 100644 frontend/src/lib/components/copilot/chat/CodeDisplay.svelte create mode 100644 frontend/src/lib/components/copilot/chat/ContextElementBadge.svelte create mode 100644 frontend/src/lib/components/copilot/chat/GlobalReviewButtons.svelte create mode 100644 frontend/src/lib/components/copilot/chat/core.ts create mode 100644 frontend/src/lib/components/copilot/chat/monaco-adapter.ts delete mode 100644 frontend/src/lib/components/copilot/completion.ts create mode 100644 frontend/src/lib/components/copilot/shared.ts diff --git a/backend/.sqlx/query-ceda377fa534656ac12a7f41db77db1f054ec751855c8db7352b0e9c20b63ef8.json b/backend/.sqlx/query-0689cdc6c7676f5e1984792a0e0b172ea9a70835bfba6cef56142556197e9767.json similarity index 56% rename from backend/.sqlx/query-ceda377fa534656ac12a7f41db77db1f054ec751855c8db7352b0e9c20b63ef8.json rename to backend/.sqlx/query-0689cdc6c7676f5e1984792a0e0b172ea9a70835bfba6cef56142556197e9767.json index a309a03762..27c1d1d2d8 100644 --- a/backend/.sqlx/query-ceda377fa534656ac12a7f41db77db1f054ec751855c8db7352b0e9c20b63ef8.json +++ b/backend/.sqlx/query-0689cdc6c7676f5e1984792a0e0b172ea9a70835bfba6cef56142556197e9767.json @@ -1,11 +1,11 @@ { "db_name": "PostgreSQL", - "query": "SELECT ai_resource FROM workspace_settings WHERE workspace_id = $1", + "query": "SELECT ai_config FROM workspace_settings WHERE workspace_id = $1", "describe": { "columns": [ { "ordinal": 0, - "name": "ai_resource", + "name": "ai_config", "type_info": "Jsonb" } ], @@ -18,5 +18,5 @@ true ] }, - "hash": "ceda377fa534656ac12a7f41db77db1f054ec751855c8db7352b0e9c20b63ef8" + "hash": "0689cdc6c7676f5e1984792a0e0b172ea9a70835bfba6cef56142556197e9767" } diff --git a/backend/.sqlx/query-08f288d2781d823e109a9e5b8848234ca7d1efeee9661f3901f298da375e73f7.json b/backend/.sqlx/query-08f288d2781d823e109a9e5b8848234ca7d1efeee9661f3901f298da375e73f7.json index 4bcf3c6ce3..3d07525fa0 100644 --- a/backend/.sqlx/query-08f288d2781d823e109a9e5b8848234ca7d1efeee9661f3901f298da375e73f7.json +++ b/backend/.sqlx/query-08f288d2781d823e109a9e5b8848234ca7d1efeee9661f3901f298da375e73f7.json @@ -65,7 +65,7 @@ }, { "ordinal": 12, - "name": "ai_resource", + "name": "ai_config", "type_info": "Jsonb" }, { @@ -130,26 +130,16 @@ }, { "ordinal": 25, - "name": "ai_models", - "type_info": "VarcharArray" - }, - { - "ordinal": 26, - "name": "code_completion_model", - "type_info": "Varchar" - }, - { - "ordinal": 27, "name": "teams_command_script", "type_info": "Text" }, { - "ordinal": 28, + "ordinal": 26, "name": "teams_team_id", "type_info": "Text" }, { - "ordinal": 29, + "ordinal": 27, "name": "teams_team_name", "type_info": "Text" } @@ -185,8 +175,6 @@ true, true, true, - false, - true, true, true, true diff --git a/backend/.sqlx/query-103ef3cf5cf4d25d780e4aefd5b290d810a5e8ea6458d9f9fd484ced549ea82e.json b/backend/.sqlx/query-103ef3cf5cf4d25d780e4aefd5b290d810a5e8ea6458d9f9fd484ced549ea82e.json deleted file mode 100644 index 15d772ab16..0000000000 --- a/backend/.sqlx/query-103ef3cf5cf4d25d780e4aefd5b290d810a5e8ea6458d9f9fd484ced549ea82e.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT value, resource_type FROM resource WHERE path = $1 AND workspace_id = $2", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "value", - "type_info": "Jsonb" - }, - { - "ordinal": 1, - "name": "resource_type", - "type_info": "Varchar" - } - ], - "parameters": { - "Left": [ - "Text", - "Text" - ] - }, - "nullable": [ - true, - false - ] - }, - "hash": "103ef3cf5cf4d25d780e4aefd5b290d810a5e8ea6458d9f9fd484ced549ea82e" -} diff --git a/backend/.sqlx/query-197590e7ab74f64bbf374f23128850bed8f435ea5de16ba796f346fba51d9437.json b/backend/.sqlx/query-197590e7ab74f64bbf374f23128850bed8f435ea5de16ba796f346fba51d9437.json new file mode 100644 index 0000000000..28d629c587 --- /dev/null +++ b/backend/.sqlx/query-197590e7ab74f64bbf374f23128850bed8f435ea5de16ba796f346fba51d9437.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT ai_config as \"ai_config: sqlx::types::Json\" FROM workspace_settings WHERE workspace_id = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "ai_config: sqlx::types::Json", + "type_info": "Jsonb" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + true + ] + }, + "hash": "197590e7ab74f64bbf374f23128850bed8f435ea5de16ba796f346fba51d9437" +} diff --git a/backend/.sqlx/query-1bbef6baa5b8e2522d685df2979bb1e4b9022f5e841afd9eeb08a81688f6c0c8.json b/backend/.sqlx/query-1bbef6baa5b8e2522d685df2979bb1e4b9022f5e841afd9eeb08a81688f6c0c8.json deleted file mode 100644 index 4fcd1f0969..0000000000 --- a/backend/.sqlx/query-1bbef6baa5b8e2522d685df2979bb1e4b9022f5e841afd9eeb08a81688f6c0c8.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE workspace_settings SET ai_resource = NULL, code_completion_model = $1, ai_models = '{}' WHERE workspace_id = $2", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "Text" - ] - }, - "nullable": [] - }, - "hash": "1bbef6baa5b8e2522d685df2979bb1e4b9022f5e841afd9eeb08a81688f6c0c8" -} diff --git a/backend/.sqlx/query-3734117167a1269f78b3949eed005db96faeec6c18500ad96087cd06c2c85a8b.json b/backend/.sqlx/query-3734117167a1269f78b3949eed005db96faeec6c18500ad96087cd06c2c85a8b.json new file mode 100644 index 0000000000..6a3afafb5e --- /dev/null +++ b/backend/.sqlx/query-3734117167a1269f78b3949eed005db96faeec6c18500ad96087cd06c2c85a8b.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT EXISTS (SELECT 1\n FROM workspace_settings\n WHERE workspace_id <> $1\n AND slack_command_script IS NOT NULL\n AND slack_team_id IS NOT NULL\n AND slack_team_id = (SELECT slack_team_id FROM workspace_settings WHERE workspace_id = $1))\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "exists", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + null + ] + }, + "hash": "3734117167a1269f78b3949eed005db96faeec6c18500ad96087cd06c2c85a8b" +} diff --git a/backend/.sqlx/query-4edf05cbf35325d444de0e74ee070aafd27ef61c940daba186e7e66f668c31ed.json b/backend/.sqlx/query-4edf05cbf35325d444de0e74ee070aafd27ef61c940daba186e7e66f668c31ed.json deleted file mode 100644 index 4eae8c22fb..0000000000 --- a/backend/.sqlx/query-4edf05cbf35325d444de0e74ee070aafd27ef61c940daba186e7e66f668c31ed.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE workspace_settings SET ai_resource = $1, code_completion_model = $2, ai_models = $3 WHERE workspace_id = $4", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Jsonb", - "Varchar", - "VarcharArray", - "Text" - ] - }, - "nullable": [] - }, - "hash": "4edf05cbf35325d444de0e74ee070aafd27ef61c940daba186e7e66f668c31ed" -} diff --git a/backend/.sqlx/query-55cb03040bc2a8c53dd7fbb42bbdcc40f463cbc52d94ed9315cf9a547d4c89f2.json b/backend/.sqlx/query-55cb03040bc2a8c53dd7fbb42bbdcc40f463cbc52d94ed9315cf9a547d4c89f2.json index 14685a8bfa..3d06725f17 100644 --- a/backend/.sqlx/query-55cb03040bc2a8c53dd7fbb42bbdcc40f463cbc52d94ed9315cf9a547d4c89f2.json +++ b/backend/.sqlx/query-55cb03040bc2a8c53dd7fbb42bbdcc40f463cbc52d94ed9315cf9a547d4c89f2.json @@ -65,7 +65,7 @@ }, { "ordinal": 12, - "name": "ai_resource", + "name": "ai_config", "type_info": "Jsonb" }, { @@ -130,26 +130,16 @@ }, { "ordinal": 25, - "name": "ai_models", - "type_info": "VarcharArray" - }, - { - "ordinal": 26, - "name": "code_completion_model", - "type_info": "Varchar" - }, - { - "ordinal": 27, "name": "teams_command_script", "type_info": "Text" }, { - "ordinal": 28, + "ordinal": 26, "name": "teams_team_id", "type_info": "Text" }, { - "ordinal": 29, + "ordinal": 27, "name": "teams_team_name", "type_info": "Text" } @@ -185,8 +175,6 @@ true, true, true, - false, - true, true, true, true diff --git a/backend/.sqlx/query-63c16a4277983aaed0aed54972923919cee3cc444725ac6b7906922554bae800.json b/backend/.sqlx/query-63c16a4277983aaed0aed54972923919cee3cc444725ac6b7906922554bae800.json new file mode 100644 index 0000000000..4abea8d7e5 --- /dev/null +++ b/backend/.sqlx/query-63c16a4277983aaed0aed54972923919cee3cc444725ac6b7906922554bae800.json @@ -0,0 +1,23 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT value FROM resource WHERE path = $1 AND workspace_id = $2", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "value", + "type_info": "Jsonb" + } + ], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [ + true + ] + }, + "hash": "63c16a4277983aaed0aed54972923919cee3cc444725ac6b7906922554bae800" +} diff --git a/backend/.sqlx/query-31b6fccad46b22bcbba6bbce22209ccb1825116004ed72682854ce3352f454a5.json b/backend/.sqlx/query-9ae20f2f29406cfa5337736ad710c496f1757d950cdec63c93c77fe79d5212cc.json similarity index 54% rename from backend/.sqlx/query-31b6fccad46b22bcbba6bbce22209ccb1825116004ed72682854ce3352f454a5.json rename to backend/.sqlx/query-9ae20f2f29406cfa5337736ad710c496f1757d950cdec63c93c77fe79d5212cc.json index 0871986a4e..2b30281364 100644 --- a/backend/.sqlx/query-31b6fccad46b22bcbba6bbce22209ccb1825116004ed72682854ce3352f454a5.json +++ b/backend/.sqlx/query-9ae20f2f29406cfa5337736ad710c496f1757d950cdec63c93c77fe79d5212cc.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT \n \n EXISTS(SELECT 1 FROM websocket_trigger WHERE workspace_id = $1) AS \"websocket_used!\", \n EXISTS(SELECT 1 FROM http_trigger WHERE workspace_id = $1) AS \"http_routes_used!\",\n EXISTS(SELECT 1 FROM kafka_trigger WHERE workspace_id = $1) as \"kafka_used!\",\n EXISTS(SELECT 1 FROM nats_trigger WHERE workspace_id = $1) as \"nats_used!\",\n EXISTS(SELECT 1 FROM postgres_trigger WHERE workspace_id = $1) AS \"postgres_used!\",\n EXISTS(SELECT 1 FROM mqtt_trigger WHERE workspace_id = $1) AS \"mqtt_used!\",\n EXISTS(SELECT 1 FROM sqs_trigger WHERE workspace_id = $1) AS \"sqs_used!\"\n ", + "query": "\n SELECT\n EXISTS(SELECT 1 FROM websocket_trigger WHERE workspace_id = $1) AS \"websocket_used!\",\n EXISTS(SELECT 1 FROM http_trigger WHERE workspace_id = $1) AS \"http_routes_used!\",\n EXISTS(SELECT 1 FROM kafka_trigger WHERE workspace_id = $1) as \"kafka_used!\",\n EXISTS(SELECT 1 FROM nats_trigger WHERE workspace_id = $1) as \"nats_used!\",\n EXISTS(SELECT 1 FROM postgres_trigger WHERE workspace_id = $1) AS \"postgres_used!\",\n EXISTS(SELECT 1 FROM mqtt_trigger WHERE workspace_id = $1) AS \"mqtt_used!\",\n EXISTS(SELECT 1 FROM sqs_trigger WHERE workspace_id = $1) AS \"sqs_used!\"\n ", "describe": { "columns": [ { @@ -54,5 +54,5 @@ null ] }, - "hash": "31b6fccad46b22bcbba6bbce22209ccb1825116004ed72682854ce3352f454a5" + "hash": "9ae20f2f29406cfa5337736ad710c496f1757d950cdec63c93c77fe79d5212cc" } diff --git a/backend/.sqlx/query-4e9c2e0690eaca280ccb5e5160438f207d930d29e3000b9845eef89e87a35ad1.json b/backend/.sqlx/query-aff243a11d41085b0b2f52b1b49f122fd3eae99a382ca3e66606d3183de51843.json similarity index 83% rename from backend/.sqlx/query-4e9c2e0690eaca280ccb5e5160438f207d930d29e3000b9845eef89e87a35ad1.json rename to backend/.sqlx/query-aff243a11d41085b0b2f52b1b49f122fd3eae99a382ca3e66606d3183de51843.json index 3dd496788f..a38b54e197 100644 --- a/backend/.sqlx/query-4e9c2e0690eaca280ccb5e5160438f207d930d29e3000b9845eef89e87a35ad1.json +++ b/backend/.sqlx/query-aff243a11d41085b0b2f52b1b49f122fd3eae99a382ca3e66606d3183de51843.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT workspace_id, slack_team_id, teams_team_id, teams_team_name, slack_name, slack_command_script, teams_command_script, slack_email, auto_invite_domain, auto_invite_operator, auto_add, customer_id, plan, webhook, deploy_to, ai_resource, ai_models, code_completion_model, error_handler, error_handler_extra_args, error_handler_muted_on_cancel, large_file_storage, git_sync, deploy_ui, default_app, automatic_billing, default_scripts, mute_critical_alerts, color, operator_settings FROM workspace_settings WHERE workspace_id = $1", + "query": "SELECT workspace_id, slack_team_id, teams_team_id, teams_team_name, slack_name, slack_command_script, teams_command_script, slack_email, auto_invite_domain, auto_invite_operator, auto_add, customer_id, plan, webhook, deploy_to, ai_config, error_handler, error_handler_extra_args, error_handler_muted_on_cancel, large_file_storage, git_sync, deploy_ui, default_app, automatic_billing, default_scripts, mute_critical_alerts, color, operator_settings FROM workspace_settings WHERE workspace_id = $1", "describe": { "columns": [ { @@ -80,76 +80,66 @@ }, { "ordinal": 15, - "name": "ai_resource", + "name": "ai_config", "type_info": "Jsonb" }, { "ordinal": 16, - "name": "ai_models", - "type_info": "VarcharArray" - }, - { - "ordinal": 17, - "name": "code_completion_model", - "type_info": "Varchar" - }, - { - "ordinal": 18, "name": "error_handler", "type_info": "Varchar" }, { - "ordinal": 19, + "ordinal": 17, "name": "error_handler_extra_args", "type_info": "Json" }, { - "ordinal": 20, + "ordinal": 18, "name": "error_handler_muted_on_cancel", "type_info": "Bool" }, { - "ordinal": 21, + "ordinal": 19, "name": "large_file_storage", "type_info": "Jsonb" }, { - "ordinal": 22, + "ordinal": 20, "name": "git_sync", "type_info": "Jsonb" }, { - "ordinal": 23, + "ordinal": 21, "name": "deploy_ui", "type_info": "Jsonb" }, { - "ordinal": 24, + "ordinal": 22, "name": "default_app", "type_info": "Varchar" }, { - "ordinal": 25, + "ordinal": 23, "name": "automatic_billing", "type_info": "Bool" }, { - "ordinal": 26, + "ordinal": 24, "name": "default_scripts", "type_info": "Jsonb" }, { - "ordinal": 27, + "ordinal": 25, "name": "mute_critical_alerts", "type_info": "Bool" }, { - "ordinal": 28, + "ordinal": 26, "name": "color", "type_info": "Varchar" }, { - "ordinal": 29, + "ordinal": 27, "name": "operator_settings", "type_info": "Jsonb" } @@ -176,8 +166,6 @@ true, true, true, - false, - true, true, true, false, @@ -192,5 +180,5 @@ true ] }, - "hash": "4e9c2e0690eaca280ccb5e5160438f207d930d29e3000b9845eef89e87a35ad1" + "hash": "aff243a11d41085b0b2f52b1b49f122fd3eae99a382ca3e66606d3183de51843" } diff --git a/backend/.sqlx/query-b186efe51e7bb1924efbd7e9b36085502a1e77e30e59c7310c78976f77a810a3.json b/backend/.sqlx/query-b186efe51e7bb1924efbd7e9b36085502a1e77e30e59c7310c78976f77a810a3.json deleted file mode 100644 index d856ab0109..0000000000 --- a/backend/.sqlx/query-b186efe51e7bb1924efbd7e9b36085502a1e77e30e59c7310c78976f77a810a3.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT ai_resource, code_completion_model, ai_models FROM workspace_settings WHERE workspace_id = $1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "ai_resource", - "type_info": "Jsonb" - }, - { - "ordinal": 1, - "name": "code_completion_model", - "type_info": "Varchar" - }, - { - "ordinal": 2, - "name": "ai_models", - "type_info": "VarcharArray" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - true, - true, - false - ] - }, - "hash": "b186efe51e7bb1924efbd7e9b36085502a1e77e30e59c7310c78976f77a810a3" -} diff --git a/backend/.sqlx/query-ba117e89b5da7ef46a9e702a2f80c624cd1b00bcab9855edb9284d8afec46ff0.json b/backend/.sqlx/query-ba117e89b5da7ef46a9e702a2f80c624cd1b00bcab9855edb9284d8afec46ff0.json new file mode 100644 index 0000000000..773dc5d24d --- /dev/null +++ b/backend/.sqlx/query-ba117e89b5da7ef46a9e702a2f80c624cd1b00bcab9855edb9284d8afec46ff0.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE workspace_settings SET ai_config = $1 WHERE workspace_id = $2", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Jsonb", + "Text" + ] + }, + "nullable": [] + }, + "hash": "ba117e89b5da7ef46a9e702a2f80c624cd1b00bcab9855edb9284d8afec46ff0" +} diff --git a/backend/.sqlx/query-dc165e2d3e6cfc52d92b48500b5ca7dd94b46263c58163071c0ded1c54535727.json b/backend/.sqlx/query-c12a0b0d423577afbb2772f971bffe2635785b53d31d0ceb3d72226a0c316e8a.json similarity index 56% rename from backend/.sqlx/query-dc165e2d3e6cfc52d92b48500b5ca7dd94b46263c58163071c0ded1c54535727.json rename to backend/.sqlx/query-c12a0b0d423577afbb2772f971bffe2635785b53d31d0ceb3d72226a0c316e8a.json index 3a607fbf31..ca8fd862d2 100644 --- a/backend/.sqlx/query-dc165e2d3e6cfc52d92b48500b5ca7dd94b46263c58163071c0ded1c54535727.json +++ b/backend/.sqlx/query-c12a0b0d423577afbb2772f971bffe2635785b53d31d0ceb3d72226a0c316e8a.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT\n -- slack_team_id, \n -- slack_name, \n -- slack_command_script, \n -- CASE WHEN slack_email = 'missing@email.xyz' THEN NULL ELSE slack_email END AS slack_email,\n auto_invite_domain IS NOT NULL AS \"auto_invite_enabled!\",\n CASE WHEN auto_invite_operator IS TRUE THEN 'operator' ELSE 'developer' END AS \"auto_invite_as!\", \n CASE WHEN auto_add IS TRUE THEN 'add' ELSE 'invite' END AS \"auto_invite_mode!\", \n webhook, \n deploy_to, \n error_handler, \n ai_resource, \n ai_models,\n code_completion_model,\n error_handler_extra_args, \n error_handler_muted_on_cancel, \n large_file_storage, \n git_sync,\n default_app,\n default_scripts,\n workspace.name,\n mute_critical_alerts,\n color,\n operator_settings\n FROM workspace_settings\n LEFT JOIN workspace ON workspace.id = workspace_settings.workspace_id\n WHERE workspace_id = $1", + "query": "SELECT\n -- slack_team_id,\n -- slack_name,\n -- slack_command_script,\n -- CASE WHEN slack_email = 'missing@email.xyz' THEN NULL ELSE slack_email END AS slack_email,\n auto_invite_domain IS NOT NULL AS \"auto_invite_enabled!\",\n CASE WHEN auto_invite_operator IS TRUE THEN 'operator' ELSE 'developer' END AS \"auto_invite_as!\",\n CASE WHEN auto_add IS TRUE THEN 'add' ELSE 'invite' END AS \"auto_invite_mode!\",\n webhook,\n deploy_to,\n error_handler,\n ai_config,\n error_handler_extra_args,\n error_handler_muted_on_cancel,\n large_file_storage,\n git_sync,\n default_app,\n default_scripts,\n workspace.name,\n mute_critical_alerts,\n color,\n operator_settings\n FROM workspace_settings\n LEFT JOIN workspace ON workspace.id = workspace_settings.workspace_id\n WHERE workspace_id = $1", "describe": { "columns": [ { @@ -35,66 +35,56 @@ }, { "ordinal": 6, - "name": "ai_resource", + "name": "ai_config", "type_info": "Jsonb" }, { "ordinal": 7, - "name": "ai_models", - "type_info": "VarcharArray" - }, - { - "ordinal": 8, - "name": "code_completion_model", - "type_info": "Varchar" - }, - { - "ordinal": 9, "name": "error_handler_extra_args", "type_info": "Json" }, { - "ordinal": 10, + "ordinal": 8, "name": "error_handler_muted_on_cancel", "type_info": "Bool" }, { - "ordinal": 11, + "ordinal": 9, "name": "large_file_storage", "type_info": "Jsonb" }, { - "ordinal": 12, + "ordinal": 10, "name": "git_sync", "type_info": "Jsonb" }, { - "ordinal": 13, + "ordinal": 11, "name": "default_app", "type_info": "Varchar" }, { - "ordinal": 14, + "ordinal": 12, "name": "default_scripts", "type_info": "Jsonb" }, { - "ordinal": 15, + "ordinal": 13, "name": "name", "type_info": "Varchar" }, { - "ordinal": 16, + "ordinal": 14, "name": "mute_critical_alerts", "type_info": "Bool" }, { - "ordinal": 17, + "ordinal": 15, "name": "color", "type_info": "Varchar" }, { - "ordinal": 18, + "ordinal": 16, "name": "operator_settings", "type_info": "Jsonb" } @@ -112,8 +102,6 @@ true, true, true, - false, - true, true, false, true, @@ -126,5 +114,5 @@ true ] }, - "hash": "dc165e2d3e6cfc52d92b48500b5ca7dd94b46263c58163071c0ded1c54535727" + "hash": "c12a0b0d423577afbb2772f971bffe2635785b53d31d0ceb3d72226a0c316e8a" } diff --git a/backend/.sqlx/query-cc6e21bf16d7b92764aa2b261cee94f6daf6a1eedd8a68742a2f510f0452cc32.json b/backend/.sqlx/query-e3c8219420bb859de3f1c322978c5859c924cffa61074562ac6d33106d02d7d6.json similarity index 66% rename from backend/.sqlx/query-cc6e21bf16d7b92764aa2b261cee94f6daf6a1eedd8a68742a2f510f0452cc32.json rename to backend/.sqlx/query-e3c8219420bb859de3f1c322978c5859c924cffa61074562ac6d33106d02d7d6.json index 54ae52423d..8ee4e7890e 100644 --- a/backend/.sqlx/query-cc6e21bf16d7b92764aa2b261cee94f6daf6a1eedd8a68742a2f510f0452cc32.json +++ b/backend/.sqlx/query-e3c8219420bb859de3f1c322978c5859c924cffa61074562ac6d33106d02d7d6.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT g_.workspace_id, name, summary, extra_perms, array_agg(u2g.usr) filter (where u2g.usr is not null) as members \n FROM usr u\n JOIN usr_to_group u2g ON u2g.usr = u.username AND u2g.workspace_id = u.workspace_id\n RIGHT JOIN group_ g_ ON g_.workspace_id = u.workspace_id AND g_.name = u2g.group_\n WHERE g_.workspace_id = $1 AND g_.name != 'all'\n GROUP BY g_.workspace_id, name, summary, extra_perms", + "query": "SELECT g_.workspace_id, name, summary, extra_perms, array_agg(u2g.usr) filter (where u2g.usr is not null) as members\n FROM usr u\n JOIN usr_to_group u2g ON u2g.usr = u.username AND u2g.workspace_id = u.workspace_id\n RIGHT JOIN group_ g_ ON g_.workspace_id = u.workspace_id AND g_.name = u2g.group_\n WHERE g_.workspace_id = $1 AND g_.name != 'all'\n GROUP BY g_.workspace_id, name, summary, extra_perms", "describe": { "columns": [ { @@ -42,5 +42,5 @@ null ] }, - "hash": "cc6e21bf16d7b92764aa2b261cee94f6daf6a1eedd8a68742a2f510f0452cc32" + "hash": "e3c8219420bb859de3f1c322978c5859c924cffa61074562ac6d33106d02d7d6" } diff --git a/backend/.sqlx/query-82b16e771b6e21c4587b5ebf059e312f43b3e5a48f7599133831dbd65886f5d8.json b/backend/.sqlx/query-e5f1e1e74daeabf410991e2484c1fb565f04539fc7eb141ebfaa957456016841.json similarity index 50% rename from backend/.sqlx/query-82b16e771b6e21c4587b5ebf059e312f43b3e5a48f7599133831dbd65886f5d8.json rename to backend/.sqlx/query-e5f1e1e74daeabf410991e2484c1fb565f04539fc7eb141ebfaa957456016841.json index 880e79a957..ddd216acc1 100644 --- a/backend/.sqlx/query-82b16e771b6e21c4587b5ebf059e312f43b3e5a48f7599133831dbd65886f5d8.json +++ b/backend/.sqlx/query-e5f1e1e74daeabf410991e2484c1fb565f04539fc7eb141ebfaa957456016841.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT usage.usage FROM usage \n WHERE is_workspace = true \n AND month_ = EXTRACT(YEAR FROM current_date) * 12 + EXTRACT(MONTH FROM current_date)\n AND id = $1", + "query": "\n SELECT usage.usage FROM usage\n WHERE is_workspace = true\n AND month_ = EXTRACT(YEAR FROM current_date) * 12 + EXTRACT(MONTH FROM current_date)\n AND id = $1", "describe": { "columns": [ { @@ -18,5 +18,5 @@ false ] }, - "hash": "82b16e771b6e21c4587b5ebf059e312f43b3e5a48f7599133831dbd65886f5d8" + "hash": "e5f1e1e74daeabf410991e2484c1fb565f04539fc7eb141ebfaa957456016841" } diff --git a/backend/.sqlx/query-f632ca2e17a3952fc45bd40a055a9442c35453dff95140d2f252c4fe6a14c6a4.json b/backend/.sqlx/query-f632ca2e17a3952fc45bd40a055a9442c35453dff95140d2f252c4fe6a14c6a4.json deleted file mode 100644 index 5145efa595..0000000000 --- a/backend/.sqlx/query-f632ca2e17a3952fc45bd40a055a9442c35453dff95140d2f252c4fe6a14c6a4.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT EXISTS (SELECT 1 \n FROM workspace_settings \n WHERE workspace_id <> $1 \n AND slack_command_script IS NOT NULL\n AND slack_team_id IS NOT NULL \n AND slack_team_id = (SELECT slack_team_id FROM workspace_settings WHERE workspace_id = $1))\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "exists", - "type_info": "Bool" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - null - ] - }, - "hash": "f632ca2e17a3952fc45bd40a055a9442c35453dff95140d2f252c4fe6a14c6a4" -} diff --git a/backend/migrations/20250319121050_multiple_ai_providers.down.sql b/backend/migrations/20250319121050_multiple_ai_providers.down.sql new file mode 100644 index 0000000000..b6c6ff23bc --- /dev/null +++ b/backend/migrations/20250319121050_multiple_ai_providers.down.sql @@ -0,0 +1,24 @@ +ALTER TABLE workspace_settings RENAME COLUMN ai_config TO ai_resource; + +ALTER TABLE workspace_settings +ADD COLUMN ai_models VARCHAR(255)[] NOT NULL DEFAULT '{}', +ADD COLUMN code_completion_model VARCHAR(255); + +UPDATE workspace_settings +SET ai_resource = CASE + WHEN ai_resource IS NULL THEN NULL + ELSE jsonb_build_object( + 'provider', + COALESCE((SELECT jsonb_object_keys(COALESCE(ai_resource->>'providers', '{}')::jsonb) LIMIT 1), 'openai'), -- Get the first provider key + 'path', + ai_resource->'providers'->(SELECT jsonb_object_keys(COALESCE(ai_resource->>'providers', '{}')::jsonb) LIMIT 1)->>'resource_path' + ) +END, +ai_models = COALESCE(( + SELECT array_agg(model) + FROM jsonb_array_elements_text( + COALESCE(ai_resource->'providers'->(SELECT jsonb_object_keys(COALESCE(ai_resource->>'providers', '{}')::jsonb) LIMIT 1)->>'models', '[]')::jsonb + ) model + WHERE model IS NOT NULL +), '{}'), +code_completion_model = ai_resource->'code_completion_model'->>'model'; diff --git a/backend/migrations/20250319121050_multiple_ai_providers.up.sql b/backend/migrations/20250319121050_multiple_ai_providers.up.sql new file mode 100644 index 0000000000..40353f7501 --- /dev/null +++ b/backend/migrations/20250319121050_multiple_ai_providers.up.sql @@ -0,0 +1,38 @@ +UPDATE workspace_settings +SET ai_resource = CASE + WHEN ai_resource IS NULL OR ai_resource->>'path' IS NULL OR ai_resource->>'provider' IS NULL THEN NULL + ELSE jsonb_build_object( + 'providers', jsonb_build_object( + ai_resource->>'provider', + jsonb_build_object( + 'resource_path', ai_resource->>'path', + 'models', to_jsonb(ai_models) + ) + ), + 'default_model', + CASE + WHEN array_length(ai_models, 1) > 0 THEN jsonb_build_object( + 'model', ai_models[1], + 'provider', ai_resource->>'provider' + ) + ELSE NULL + END, + 'code_completion_model', + CASE + WHEN code_completion_model IS NULL THEN NULL + ELSE jsonb_build_object( + 'model', code_completion_model, + 'provider', ai_resource->>'provider' + ) + END + ) +END; + +ALTER TABLE workspace_settings +DROP COLUMN code_completion_model, +DROP COLUMN ai_models; + +ALTER TABLE workspace_settings RENAME COLUMN ai_resource TO ai_config; + + +-- { providers: { [provider]: { resource_path: resource_path, models: ai_models}, default_model: ai_models[0], code_completion_model: code_completion_model} diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index 3d73899486..03724d8b20 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -1755,14 +1755,8 @@ paths: type: string deploy_to: type: string - ai_resource: - $ref: "#/components/schemas/AIResource" - code_completion_model: - type: string - ai_models: - type: array - items: - type: string + ai_config: + $ref: "#/components/schemas/AIConfig" error_handler: type: string error_handler_extra_args: @@ -1786,7 +1780,6 @@ paths: operator_settings: $ref: "#/components/schemas/OperatorSettings" required: - - ai_models - automatic_billing - error_handler_muted_on_cancel @@ -2235,18 +2228,7 @@ paths: content: application/json: schema: - type: object - required: - - ai_models - properties: - ai_resource: - $ref: "#/components/schemas/AIResource" - code_completion_model: - type: string - ai_models: - type: array - items: - type: string + $ref: "#/components/schemas/AIConfig" responses: "200": description: status @@ -2268,23 +2250,10 @@ paths: "200": description: status content: - text/plain: + application/json: schema: - type: object - properties: - ai_provider: - $ref: "#/components/schemas/AIProvider" - exists_ai_resource: - type: boolean - code_completion_model: - type: string - ai_models: - type: array - items: - type: string - required: - - exists_ai_resource - - ai_models + $ref: "#/components/schemas/AIConfig" + /w/{workspace}/workspaces/edit_error_handler: post: @@ -12415,17 +12384,42 @@ components: type: string enum: [openai, anthropic, mistral, deepseek, googleai, groq, openrouter, customai] - AIResource: + AIProviderModel: type: object properties: - path: + model: type: string provider: $ref: "#/components/schemas/AIProvider" required: - - path + - model - provider + AIProviderConfig: + type: object + properties: + resource_path: + type: string + models: + type: array + items: + type: string + required: + - resource_path + - models + + AIConfig: + type: object + properties: + providers: + type: object + additionalProperties: + $ref: "#/components/schemas/AIProviderConfig" + default_model: + $ref: "#/components/schemas/AIProviderModel" + code_completion_model: + $ref: "#/components/schemas/AIProviderModel" + Script: type: object properties: diff --git a/backend/windmill-api/src/ai.rs b/backend/windmill-api/src/ai.rs index d9469900b1..4ff0f77d57 100644 --- a/backend/windmill-api/src/ai.rs +++ b/backend/windmill-api/src/ai.rs @@ -3,11 +3,12 @@ use crate::{ variables::get_variable_or_self, }; -use anthropic::AnthropicCache; use anyhow::Context; use axum::{body::Bytes, extract::Path, response::IntoResponse, routing::post, Extension, Router}; use http::HeaderMap; use lazy_static::lazy_static; +use openai::OpenaiCache; +use openai_api_compatible::OpenaiApiCompatibleCache; use quick_cache::sync::Cache; use reqwest::{Client, RequestBuilder}; use serde::{Deserialize, Serialize}; @@ -16,10 +17,6 @@ use std::collections::HashMap; use windmill_audit::{audit_ee::audit_log, ActionKind}; use windmill_common::error::{to_anyhow, Error, Result}; -use mistral::MistralCache; -use openai::OpenaiCache; -use openai_api_compatible::OpenaiApiCompatibleCache; - lazy_static::lazy_static! { static ref HTTP_CLIENT: Client = reqwest::ClientBuilder::new() .timeout(std::time::Duration::from_secs(60 * 5)) @@ -64,7 +61,12 @@ mod openai_api_compatible { Value::Object(mut obj) => obj .remove("api_key") .map(|v| serde_json::from_value::(v.clone()).ok()) - .flatten(), + .flatten() + .or_else(|| { + obj.remove("apiKey") + .map(|v| serde_json::from_value::(v.clone()).ok()) + .flatten() + }), _ => None, }; OpenaiApiCompatibleCache { base_url, api_key } @@ -134,7 +136,7 @@ mod openai { } } - const BASE_URL: &str = "https://api.openai.com/v1"; + pub const BASE_URL: &str = "https://api.openai.com/v1"; impl OpenaiCache { pub fn prepare_request(self, openai_path: &str, mut body: Bytes) -> Result { let OpenaiCache { api_key, azure_base_path, organization_id, user } = self; @@ -274,92 +276,21 @@ mod openai { } } -mod anthropic { - - use super::*; - - #[derive(Clone, Deserialize, Debug)] - pub struct AnthropicCache { - #[serde(rename = "apiKey")] - pub api_key: String, - } - - const API_VERSION: &str = "2023-06-01"; - - const BASE_URL: &str = "https://api.anthropic.com"; - impl AnthropicCache { - pub fn prepare_request(self, anthropic_path: &str, body: Bytes) -> Result { - let AnthropicCache { api_key } = self; - let url = format!("{}/{}", BASE_URL, anthropic_path); - let request = HTTP_CLIENT - .post(url) - .header("x-api-key", api_key) - .header("anthropic-version", API_VERSION) - .header("content-type", "application/json") - .body(body); - Ok(request) - } - } - - pub async fn get_cached_value(db: &DB, w_id: &str, resource: Value) -> Result { - let mut resource: AnthropicCache = serde_json::from_value(resource) - .map_err(|e| Error::internal_err(format!("validating anthropic resource {e:#}")))?; - resource.api_key = get_variable_or_self(resource.api_key, db, w_id).await?; - Ok(KeyCache::Anthropic(resource)) - } -} - -mod mistral { - use super::*; - #[derive(Deserialize, Clone, Debug)] - pub struct MistralCache { - #[serde(rename = "apiKey")] - pub api_key: String, - } - - const BASE_URL: &str = "https://api.mistral.ai"; - impl MistralCache { - pub fn prepare_request(self, mistral_path: &str, body: Bytes) -> Result { - let MistralCache { api_key } = self; - - let url = format!("{}/{}", BASE_URL, mistral_path); - let request = HTTP_CLIENT - .post(url) - .header("content-type", "application/json") - .header("Accept", "application/json") - .header("authorization", format!("Bearer {}", api_key)) - .body(body); - Ok(request) - } - } - - pub async fn get_cached_value(db: &DB, w_id: &str, resource: Value) -> Result { - let mut resource: MistralCache = serde_json::from_value(resource) - .map_err(|e| Error::internal_err(format!("validating mistral resource {e:#}")))?; - resource.api_key = get_variable_or_self(resource.api_key, db, w_id).await?; - Ok(KeyCache::Mistral(resource)) - } -} - #[derive(Clone, Debug)] pub enum KeyCache { Openai(OpenaiCache), - Anthropic(AnthropicCache), - Mistral(MistralCache), OpenaiApiCompatible(OpenaiApiCompatibleCache), } #[derive(Clone, Debug)] pub struct AICache { - pub path: String, pub cached_key: KeyCache, pub expires_at: std::time::Instant, } impl AICache { - pub fn new(path: String, cached_key: KeyCache) -> Self { + pub fn new(cached_key: KeyCache) -> Self { Self { - path, cached_key, expires_at: std::time::Instant::now() + std::time::Duration::from_secs(60), } @@ -370,10 +301,10 @@ impl AICache { } lazy_static! { - pub static ref AI_KEY_CACHE: Cache = Cache::new(500); + pub static ref AI_KEY_CACHE: Cache<(String, AIProvider), AICache> = Cache::new(500); } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug, Eq, PartialEq, Hash, Clone)] #[serde(rename_all = "lowercase")] pub enum AIProvider { OpenAI, @@ -387,7 +318,7 @@ pub enum AIProvider { } impl AIProvider { - pub fn get_openai_compatible_base_url(&self) -> Result> { + pub fn get_base_url(&self) -> Result> { match self { AIProvider::DeepSeek => Ok(Some("https://api.deepseek.com/v1".to_string())), AIProvider::GoogleAI => Ok(Some( @@ -395,10 +326,10 @@ impl AIProvider { )), AIProvider::Groq => Ok(Some("https://api.groq.com/openai/v1".to_string())), AIProvider::OpenRouter => Ok(Some("https://openrouter.ai/api/v1".to_string())), + AIProvider::Anthropic => Ok(Some("https://api.anthropic.com/v1".to_string())), + AIProvider::Mistral => Ok(Some("https://api.mistral.ai/v1".to_string())), AIProvider::CustomAI => Ok(None), - _ => Err(Error::BadRequest( - "Please use the specific provider instead of the OpenAI compatible one".to_string(), - )), + AIProvider::OpenAI => Ok(Some(openai::BASE_URL.to_string())), } } } @@ -420,141 +351,232 @@ impl TryFrom<&str> for AIProvider { } } -#[derive(Deserialize, Debug)] -pub struct AIResource { - pub path: Option, +#[derive(Serialize, Deserialize, Debug)] +pub struct ProviderConfig { + pub resource_path: String, + pub models: Vec, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct ProviderModel { + pub model: String, pub provider: AIProvider, } -pub fn workspaced_service() -> Router { - let router = Router::new().route("/proxy/*ai", post(proxy)); - - router +#[derive(Serialize, Deserialize, Debug)] +pub struct AIConfig { + #[serde(skip_serializing_if = "Option::is_none")] + pub providers: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + pub default_model: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub code_completion_model: Option, } -async fn proxy( +pub fn global_service() -> Router { + Router::new().route("/proxy/*ai", post(global_proxy)) +} + +pub fn workspaced_service() -> Router { + Router::new().route("/proxy/*ai", post(proxy)) +} + +async fn global_proxy( authed: ApiAuthed, Extension(db): Extension, - Path((w_id, ai_path)): Path<(String, String)>, + Path(ai_path): Path, headers: HeaderMap, body: Bytes, ) -> impl IntoResponse { - let workspace_cache = AI_KEY_CACHE.get(&w_id); - let forced_resource_path = headers - .get("X-Resource-Path") + let provider = headers + .get("X-Provider") + .map(|v| v.to_str().unwrap_or("").to_string()); + let api_key = headers + .get("X-API-Key") .map(|v| v.to_str().unwrap_or("").to_string()); - let ai_cache = match workspace_cache { - Some(cache) if !cache.is_expired() && forced_resource_path.is_none() => cache.cached_key, - _ => { - let (resource, resource_path, ai_provider) = if let Some(resource_path) = - forced_resource_path - { - // guess the provider from the resource type - let record = sqlx::query!( - "SELECT value, resource_type FROM resource WHERE path = $1 AND workspace_id = $2", - &resource_path, - &w_id - ) - .fetch_optional(&db) - .await? - .ok_or_else(|| { - Error::NotFound(format!( - "Could not find the resource {}, update the resource path in the workspace settings", resource_path - )) - })?; - ( - record.value, - resource_path, - AIProvider::try_from(record.resource_type.as_str())?, - ) - } else { - let ai_resource = sqlx::query_scalar!( - "SELECT ai_resource FROM workspace_settings WHERE workspace_id = $1", - &w_id - ) - .fetch_one(&db) - .await?; - - if ai_resource.is_none() { - return Err(Error::internal_err( - "AI resource not configured".to_string(), - )); - } - - let ai_resource = serde_json::from_value::(ai_resource.unwrap()) - .map_err(|e| Error::BadRequest(e.to_string()))?; - - let path = ai_resource.path.unwrap_or("".to_string()); - if path.is_empty() { - return Err(Error::BadRequest("Resource path is empty".to_string())); - } - let resource = sqlx::query_scalar!( - "SELECT value - FROM resource - WHERE path = $1 AND workspace_id = $2", - &path, - &w_id - ) - .fetch_optional(&db) - .await? - .ok_or_else(|| { - Error::NotFound(format!( - "Could not find the {:?} resource at path {}, update the resource path in the workspace settings", ai_resource.provider, path - )) - })?; - - (resource, path, ai_resource.provider) - }; - - if resource.is_none() { - return Err(Error::internal_err(format!( - "{:?} resource missing value", - ai_provider - ))); - } - - let resource = resource.unwrap(); - - let ai_cache = match ai_provider { - AIProvider::OpenAI => openai::get_cached_value(&db, &w_id, resource).await, - AIProvider::Anthropic => anthropic::get_cached_value(&db, &w_id, resource).await, - AIProvider::Mistral => mistral::get_cached_value(&db, &w_id, resource).await, - _ => { - openai_api_compatible::get_cached_value( - &db, - &w_id, - resource, - ai_provider.get_openai_compatible_base_url()?, - ) - .await - } - }; - let ai_cache = ai_cache?; - AI_KEY_CACHE.insert(w_id.clone(), AICache::new(resource_path, ai_cache.clone())); - ai_cache - } + let provider = match provider { + Some(provider) => AIProvider::try_from(provider.as_str())?, + None => return Err(Error::BadRequest("Provider is required".to_string())), }; - let request = match ai_cache { - KeyCache::Openai(cached) => cached.prepare_request(&ai_path, body), - KeyCache::Anthropic(cached) => cached.prepare_request(&ai_path, body), - KeyCache::Mistral(cached) => cached.prepare_request(&ai_path, body), - KeyCache::OpenaiApiCompatible(cached) => cached.prepare_request(&ai_path, body), + let Some(api_key) = api_key else { + return Err(Error::BadRequest("API key is required".to_string())); }; - let response = request?.send().await.map_err(to_anyhow)?; + let base_url = provider.get_base_url()?; + + let Some(base_url) = base_url else { + return Err(Error::BadRequest("Provider is not supported".to_string())); + }; + + let url = format!("{}/{}", base_url, ai_path); + + let request = HTTP_CLIENT + .post(url) + .header("content-type", "application/json") + .header("Authorization", format!("Bearer {}", api_key)) + .body(body); + + let response = request.send().await.map_err(to_anyhow)?; let mut tx = db.begin().await?; audit_log( &mut *tx, &authed, - "ai.request", + "ai.global_request", ActionKind::Execute, - &w_id, + "global", Some(&authed.email), - Some([("ai_resource_path", &format!("{:?}", ai_path)[..])].into()), + None, + ) + .await?; + tx.commit().await?; + + if response.error_for_status_ref().is_err() { + let err_msg = response.text().await.unwrap_or("".to_string()); + return Err(Error::AiError(err_msg)); + } + + let status_code = response.status(); + let headers = response.headers().clone(); + let stream = response.bytes_stream(); + Ok((status_code, headers, axum::body::Body::from_stream(stream))) +} + +async fn proxy( + authed: ApiAuthed, + Extension(db): Extension, + Path((w_id, ai_path)): Path<(String, String)>, + headers: HeaderMap, + body: Bytes, +) -> impl IntoResponse { + let provider = headers + .get("X-Provider") + .map(|v| v.to_str().unwrap_or("").to_string()); + + let provider = match provider { + Some(provider) => AIProvider::try_from(provider.as_str())?, + None => return Err(Error::BadRequest("Provider is required".to_string())), + }; + + let workspace_cache = AI_KEY_CACHE.get(&(w_id.clone(), provider.clone())); + + let forced_resource_path = headers + .get("X-Resource-Path") + .map(|v| v.to_str().unwrap_or("").to_string()); + let ai_cache = match workspace_cache { + Some(cache) if !cache.is_expired() && forced_resource_path.is_none() => cache.cached_key, + _ => { + let (resource, ai_provider, save_to_cache) = if let Some(resource_path) = + forced_resource_path + { + // forced resource path, get the resource directly + let resource = sqlx::query_scalar!( + "SELECT value FROM resource WHERE path = $1 AND workspace_id = $2", + &resource_path, + &w_id + ) + .fetch_optional(&db) + .await? + .ok_or_else(|| { + Error::NotFound(format!( + "Could not find the resource {}, update the resource path in the workspace settings", resource_path + )) + })?; + + (resource, provider, false) + } else { + let ai_config = sqlx::query_scalar!( + "SELECT ai_config FROM workspace_settings WHERE workspace_id = $1", + &w_id + ) + .fetch_one(&db) + .await?; + + if ai_config.is_none() { + return Err(Error::internal_err( + "AI resource not configured".to_string(), + )); + } + + let ai_config = serde_json::from_value::(ai_config.unwrap()) + .map_err(|e| Error::BadRequest(e.to_string()))?; + + let provider_config = ai_config + .providers + .as_ref() + .map(|providers| providers.get(&provider)) + .flatten() + .ok_or_else(|| { + Error::BadRequest(format!("Provider {:?} not configured", provider)) + })?; + + if provider_config.resource_path.is_empty() { + return Err(Error::BadRequest("Resource path is empty".to_string())); + } + let resource = sqlx::query_scalar!( + "SELECT value + FROM resource + WHERE path = $1 AND workspace_id = $2", + &provider_config.resource_path, + &w_id + ) + .fetch_optional(&db) + .await? + .ok_or_else(|| { + Error::NotFound(format!( + "Could not find the {:?} resource at path {}, update the resource path in the workspace settings", provider, provider_config.resource_path + )) + })?; + + (resource, provider, true) + }; + + let Some(resource) = resource else { + return Err(Error::internal_err(format!( + "{:?} resource missing value", + ai_provider + ))); + }; + + let ai_cache = match ai_provider { + AIProvider::OpenAI => openai::get_cached_value(&db, &w_id, resource).await?, + _ => { + openai_api_compatible::get_cached_value( + &db, + &w_id, + resource, + ai_provider.get_base_url()?, + ) + .await? + } + }; + if save_to_cache { + AI_KEY_CACHE.insert((w_id.clone(), ai_provider), AICache::new(ai_cache.clone())); + } + ai_cache + } + }; + + let request = match ai_cache { + KeyCache::Openai(cached) => cached.prepare_request(&ai_path, body), + KeyCache::OpenaiApiCompatible(cached) => cached.prepare_request(&ai_path, body), + }; + + let response = request?.send().await.map_err(to_anyhow)?; + + let mut tx = db.begin().await?; + + audit_log( + &mut *tx, + &authed, + "ai.request", + ActionKind::Execute, + &w_id, + Some(&authed.email), + Some([("ai_config_path", &format!("{:?}", ai_path)[..])].into()), ) .await?; tx.commit().await?; diff --git a/backend/windmill-api/src/lib.rs b/backend/windmill-api/src/lib.rs index 86a42aa8ba..442d88ea65 100644 --- a/backend/windmill-api/src/lib.rs +++ b/backend/windmill-api/src/lib.rs @@ -487,6 +487,7 @@ pub async fn run_server( .nest("/apps", apps::global_service().layer(cors.clone())) .nest("/schedules", schedule::global_service()) .nest("/embeddings", embeddings::global_service()) + .nest("/ai", ai::global_service()) .route_layer(from_extractor::()) .route_layer(from_extractor::()) .nest("/jobs", jobs::global_root_service()) diff --git a/backend/windmill-api/src/workspaces.rs b/backend/windmill-api/src/workspaces.rs index 03ba214bba..c94a7704cf 100644 --- a/backend/windmill-api/src/workspaces.rs +++ b/backend/windmill-api/src/workspaces.rs @@ -8,7 +8,7 @@ use std::collections::HashMap; -use crate::ai::{AIProvider, AIResource, AI_KEY_CACHE}; +use crate::ai::{AIConfig, AI_KEY_CACHE}; use crate::db::ApiAuthed; use crate::users_ee::send_email_if_possible; use crate::utils::get_instance_username_or_create_pending; @@ -52,6 +52,9 @@ use windmill_git_sync::handle_deployment_metadata; #[cfg(feature = "enterprise")] use windmill_common::utils::require_admin_or_devops; +#[cfg(not(feature = "enterprise"))] +use crate::ai::AIProvider; + use hyper::StatusCode; use serde::{Deserialize, Serialize}; use sqlx::{FromRow, Postgres, Transaction}; @@ -211,10 +214,7 @@ pub struct WorkspaceSettings { #[serde(skip_serializing_if = "Option::is_none")] pub deploy_to: Option, #[serde(skip_serializing_if = "Option::is_none")] - pub ai_resource: Option, - pub ai_models: Option>, - #[serde(skip_serializing_if = "Option::is_none")] - pub code_completion_model: Option, + pub ai_config: Option, #[serde(skip_serializing_if = "Option::is_none")] pub error_handler: Option, #[serde(skip_serializing_if = "Option::is_none")] @@ -291,13 +291,6 @@ struct EditWebhook { webhook: Option, } -#[derive(Deserialize)] -struct EditCopilotConfig { - ai_resource: Option, - code_completion_model: Option, - ai_models: Vec, -} - #[derive(Deserialize, Serialize, Debug)] struct LargeFileStorageWithSecondary { #[serde(flatten)] @@ -449,7 +442,7 @@ async fn get_settings( let mut tx = user_db.begin(&authed).await?; let settings = sqlx::query_as!( WorkspaceSettings, - "SELECT workspace_id, slack_team_id, teams_team_id, teams_team_name, slack_name, slack_command_script, teams_command_script, slack_email, auto_invite_domain, auto_invite_operator, auto_add, customer_id, plan, webhook, deploy_to, ai_resource, ai_models, code_completion_model, error_handler, error_handler_extra_args, error_handler_muted_on_cancel, large_file_storage, git_sync, deploy_ui, default_app, automatic_billing, default_scripts, mute_critical_alerts, color, operator_settings FROM workspace_settings WHERE workspace_id = $1", + "SELECT workspace_id, slack_team_id, teams_team_id, teams_team_name, slack_name, slack_command_script, teams_command_script, slack_email, auto_invite_domain, auto_invite_operator, auto_add, customer_id, plan, webhook, deploy_to, ai_config, error_handler, error_handler_extra_args, error_handler_muted_on_cancel, large_file_storage, git_sync, deploy_ui, default_app, automatic_billing, default_scripts, mute_critical_alerts, color, operator_settings FROM workspace_settings WHERE workspace_id = $1", &w_id ) .fetch_one(&mut *tx) @@ -495,11 +488,11 @@ async fn edit_slack_command( if es.slack_command_script.is_some() { let exists_slack_command_with_team_id = sqlx::query_scalar!( r#" - SELECT EXISTS (SELECT 1 - FROM workspace_settings - WHERE workspace_id <> $1 + SELECT EXISTS (SELECT 1 + FROM workspace_settings + WHERE workspace_id <> $1 AND slack_command_script IS NOT NULL - AND slack_team_id IS NOT NULL + AND slack_team_id IS NOT NULL AND slack_team_id = (SELECT slack_team_id FROM workspace_settings WHERE workspace_id = $1)) "#, &w_id @@ -697,51 +690,35 @@ async fn edit_copilot_config( Extension(db): Extension, Path(w_id): Path, ApiAuthed { is_admin, username, .. }: ApiAuthed, - Json(eo): Json, + Json(ai_config): Json, ) -> Result { require_admin(is_admin, &username)?; let mut tx = db.begin().await?; - if let Some(ai_resource) = &eo.ai_resource { - let parsed_ai_resource = serde_json::from_value::(ai_resource.clone()) - .map_err(|e| Error::BadRequest(e.to_string()))?; + sqlx::query!( + "UPDATE workspace_settings SET ai_config = $1 WHERE workspace_id = $2", + sqlx::types::Json(&ai_config) as sqlx::types::Json<&AIConfig>, + &w_id + ) + .execute(&mut *tx) + .await?; - #[cfg(not(feature = "enterprise"))] - { - if matches!(parsed_ai_resource.provider, AIProvider::CustomAI) { - return Err(Error::BadRequest( - "Custom AI is only available on EE".to_string(), - )); - } - } - - sqlx::query!( - "UPDATE workspace_settings SET ai_resource = $1, code_completion_model = $2, ai_models = $3 WHERE workspace_id = $4", - ai_resource, - eo.code_completion_model, - eo.ai_models.as_slice(), - &w_id - ) - .execute(&mut *tx) - .await?; - - if let Some(cached) = AI_KEY_CACHE.get(&w_id) { - if parsed_ai_resource.path.is_none() || parsed_ai_resource.path.unwrap() != cached.path + if let Some(ref providers) = ai_config.providers { + for provider in providers.keys() { + #[cfg(not(feature = "enterprise"))] { - AI_KEY_CACHE.remove(&w_id); + if matches!(provider, &AIProvider::CustomAI) { + return Err(Error::BadRequest( + "Custom AI is only available on EE".to_string(), + )); + } } + + AI_KEY_CACHE.remove(&(w_id.clone(), provider.clone())); } - } else { - sqlx::query!( - "UPDATE workspace_settings SET ai_resource = NULL, code_completion_model = $1, ai_models = '{}' WHERE workspace_id = $2", - eo.code_completion_model, - &w_id, - ) - .execute(&mut *tx) - .await?; - AI_KEY_CACHE.remove(&w_id); } + audit_log( &mut *tx, &authed, @@ -749,16 +726,7 @@ async fn edit_copilot_config( ActionKind::Update, &w_id, Some(&authed.email), - Some( - [ - ("ai_resource", &format!("{:?}", eo.ai_resource)[..]), - ( - "code_completion_model", - &format!("{:?}", eo.code_completion_model)[..], - ), - ] - .into(), - ), + Some([("ai_config", &format!("{:?}", ai_config)[..])].into()), ) .await?; tx.commit().await?; @@ -766,42 +734,33 @@ async fn edit_copilot_config( Ok(format!("Edit copilot config for workspace {}", &w_id)) } -#[derive(Serialize)] -struct CopilotInfo { - #[serde(skip_serializing_if = "Option::is_none")] - pub ai_provider: Option, - pub exists_ai_resource: bool, - #[serde(skip_serializing_if = "Option::is_none")] - pub code_completion_model: Option, - pub ai_models: Vec, -} async fn get_copilot_info( Extension(db): Extension, Path(w_id): Path, -) -> JsonResult { +) -> JsonResult { let mut tx = db.begin().await?; - let record = sqlx::query!( - "SELECT ai_resource, code_completion_model, ai_models FROM workspace_settings WHERE workspace_id = $1", + let copilot_info = sqlx::query_scalar!( + "SELECT ai_config as \"ai_config: sqlx::types::Json\" FROM workspace_settings WHERE workspace_id = $1", &w_id ) .fetch_one(&mut *tx) .await - .map_err(|e| Error::internal_err(format!("getting ai_resource and code_completion_model: {e:#}")))?; + .map_err(|e| { + Error::internal_err(format!( + "getting ai config: {e:#}" + )) + })?; tx.commit().await?; - let (ai_provider, exists_ai_resource) = if let Some(ai_resource) = record.ai_resource { - let ai_resource = serde_json::from_value::(ai_resource)?; - (Some(ai_resource.provider), ai_resource.path.is_some()) + if let Some(sqlx::types::Json(copilot_info)) = copilot_info { + Ok(Json(copilot_info)) } else { - (None, false) - }; - - Ok(Json(CopilotInfo { - ai_provider, - exists_ai_resource, - code_completion_model: record.code_completion_model, - ai_models: record.ai_models, - })) + Ok(Json(AIConfig { + providers: None, + default_model: None, + code_completion_model: None, + })) + } } async fn edit_large_file_storage_config( @@ -1370,9 +1329,8 @@ async fn get_used_triggers( let websocket_used = sqlx::query_as!( UsedTriggers, r#" - SELECT - - EXISTS(SELECT 1 FROM websocket_trigger WHERE workspace_id = $1) AS "websocket_used!", + SELECT + EXISTS(SELECT 1 FROM websocket_trigger WHERE workspace_id = $1) AS "websocket_used!", EXISTS(SELECT 1 FROM http_trigger WHERE workspace_id = $1) AS "http_routes_used!", EXISTS(SELECT 1 FROM kafka_trigger WHERE workspace_id = $1) as "kafka_used!", EXISTS(SELECT 1 FROM nats_trigger WHERE workspace_id = $1) as "nats_used!", @@ -2100,8 +2058,8 @@ async fn change_workspace_color( async fn get_usage(Extension(db): Extension, Path(w_id): Path) -> Result { let usage = sqlx::query_scalar!( " - SELECT usage.usage FROM usage - WHERE is_workspace = true + SELECT usage.usage FROM usage + WHERE is_workspace = true AND month_ = EXTRACT(YEAR FROM current_date) * 12 + EXTRACT(MONTH FROM current_date) AND id = $1", w_id diff --git a/backend/windmill-api/src/workspaces_export.rs b/backend/windmill-api/src/workspaces_export.rs index 003a01c002..4560d9b415 100644 --- a/backend/windmill-api/src/workspaces_export.rs +++ b/backend/windmill-api/src/workspaces_export.rs @@ -250,10 +250,7 @@ struct SimplifiedSettings { error_handler_extra_args: Option, error_handler_muted_on_cancel: bool, #[serde(skip_serializing_if = "Option::is_none")] - ai_resource: Option, - ai_models: Vec, - #[serde(skip_serializing_if = "Option::is_none")] - code_completion_model: Option, + ai_config: Option, #[serde(skip_serializing_if = "Option::is_none")] large_file_storage: Option, #[serde(skip_serializing_if = "Option::is_none")] @@ -500,8 +497,8 @@ pub(crate) async fn tarball_workspace( { let apps = sqlx::query_as::<_, AppWithLastVersion>( "SELECT app.id, app.path, app.summary, app.versions, app.policy, app.custom_path, - app.extra_perms, app_version.value, - app_version.created_at, app_version.created_by from app, app_version + app.extra_perms, app_version.value, + app_version.created_at, app_version.created_by from app, app_version WHERE app.workspace_id = $1 AND app_version.id = app.versions[array_upper(app.versions, 1)]", ) .bind(&w_id) @@ -711,7 +708,7 @@ pub(crate) async fn tarball_workspace( if include_groups.unwrap_or(false) { let groups = sqlx::query!( - r#"SELECT g_.workspace_id, name, summary, extra_perms, array_agg(u2g.usr) filter (where u2g.usr is not null) as members + r#"SELECT g_.workspace_id, name, summary, extra_perms, array_agg(u2g.usr) filter (where u2g.usr is not null) as members FROM usr u JOIN usr_to_group u2g ON u2g.usr = u.username AND u2g.workspace_id = u.workspace_id RIGHT JOIN group_ g_ ON g_.workspace_id = u.workspace_id AND g_.name = u2g.group_ @@ -773,22 +770,20 @@ pub(crate) async fn tarball_workspace( let settings = sqlx::query_as!( SimplifiedSettings, r#"SELECT - -- slack_team_id, - -- slack_name, - -- slack_command_script, + -- slack_team_id, + -- slack_name, + -- slack_command_script, -- CASE WHEN slack_email = 'missing@email.xyz' THEN NULL ELSE slack_email END AS slack_email, auto_invite_domain IS NOT NULL AS "auto_invite_enabled!", - CASE WHEN auto_invite_operator IS TRUE THEN 'operator' ELSE 'developer' END AS "auto_invite_as!", - CASE WHEN auto_add IS TRUE THEN 'add' ELSE 'invite' END AS "auto_invite_mode!", - webhook, - deploy_to, - error_handler, - ai_resource, - ai_models, - code_completion_model, - error_handler_extra_args, - error_handler_muted_on_cancel, - large_file_storage, + CASE WHEN auto_invite_operator IS TRUE THEN 'operator' ELSE 'developer' END AS "auto_invite_as!", + CASE WHEN auto_add IS TRUE THEN 'add' ELSE 'invite' END AS "auto_invite_mode!", + webhook, + deploy_to, + error_handler, + ai_config, + error_handler_extra_args, + error_handler_muted_on_cancel, + large_file_storage, git_sync, default_app, default_scripts, diff --git a/cli/gen/core/OpenAPI.ts b/cli/gen/core/OpenAPI.ts index 3aa0d92808..9965c2ef9a 100644 --- a/cli/gen/core/OpenAPI.ts +++ b/cli/gen/core/OpenAPI.ts @@ -54,7 +54,7 @@ export const OpenAPI: OpenAPIConfig = { PASSWORD: undefined, TOKEN: getEnv("WM_TOKEN"), USERNAME: undefined, - VERSION: '1.477.1', + VERSION: '1.478.1', WITH_CREDENTIALS: true, interceptors: { request: new Interceptors(), diff --git a/cli/gen/services.gen.ts b/cli/gen/services.gen.ts index b3fa22bf66..bee9069a5b 100644 --- a/cli/gen/services.gen.ts +++ b/cli/gen/services.gen.ts @@ -1374,7 +1374,7 @@ export const editCopilotConfig = (data: EditCopilotConfigData): CancelablePromis * get copilot info * @param data The data for the request. * @param data.workspace - * @returns unknown status + * @returns AIConfig status * @throws ApiError */ export const getCopilotInfo = (data: GetCopilotInfoData): CancelablePromise => { return __request(OpenAPI, { diff --git a/cli/gen/types.gen.ts b/cli/gen/types.gen.ts index 13d30a5967..0d73b24876 100644 --- a/cli/gen/types.gen.ts +++ b/cli/gen/types.gen.ts @@ -2,11 +2,24 @@ export type AIProvider = 'openai' | 'anthropic' | 'mistral' | 'deepseek' | 'googleai' | 'groq' | 'openrouter' | 'customai'; -export type AIResource = { - path: string; +export type AIProviderModel = { + model: string; provider: AIProvider; }; +export type AIProviderConfig = { + resource_path: string; + models: Array<(string)>; +}; + +export type AIConfig = { + providers?: { + [key: string]: AIProviderConfig; + }; + default_model?: AIProviderModel; + code_completion_model?: AIProviderModel; +}; + export type Script = { workspace_id?: string; hash: string; @@ -2538,9 +2551,7 @@ export type GetSettingsResponse = ({ customer_id?: string; webhook?: string; deploy_to?: string; - ai_resource?: AIResource; - code_completion_model?: string; - ai_models: Array<(string)>; + ai_config?: AIConfig; error_handler?: string; error_handler_extra_args?: ScriptArgs; error_handler_muted_on_cancel: boolean; @@ -2742,11 +2753,7 @@ export type EditCopilotConfigData = { /** * WorkspaceCopilotConfig */ - requestBody: { - ai_resource?: AIResource; - code_completion_model?: string; - ai_models: Array<(string)>; - }; + requestBody: AIConfig; workspace: string; }; @@ -2756,12 +2763,7 @@ export type GetCopilotInfoData = { workspace: string; }; -export type GetCopilotInfoResponse = ({ - ai_provider?: AIProvider; - exists_ai_resource: boolean; - code_completion_model?: string; - ai_models: Array<(string)>; -}); +export type GetCopilotInfoResponse = (AIConfig); export type EditErrorHandlerData = { /** diff --git a/cli/settings.ts b/cli/settings.ts index 054763a16b..9877e085c2 100644 --- a/cli/settings.ts +++ b/cli/settings.ts @@ -1,7 +1,7 @@ import process from "node:process"; import { colors, Confirm, log, yamlParseFile, yamlStringify } from "./deps.ts"; import * as wmill from "./gen/services.gen.ts"; -import { AIResource, Config, GlobalSetting } from "./gen/types.gen.ts"; +import { AIConfig, Config, GlobalSetting } from "./gen/types.gen.ts"; import { compareInstanceObjects, InstanceSyncOptions } from "./instance.ts"; import { isSuperset } from "./types.ts"; import { deepEqual } from "./utils.ts"; @@ -20,9 +20,7 @@ export interface SimplifiedSettings { error_handler?: string; error_handler_extra_args?: any; error_handler_muted_on_cancel?: boolean; - ai_resource?: AIResource; - code_completion_model?: string; - ai_models: string[]; + ai_config?: AIConfig; large_file_storage?: any; git_sync?: any; default_app?: string; @@ -156,19 +154,11 @@ export async function pushWorkspaceSettings( }); } } - if ( - localSettings.ai_resource != settings.ai_resource || - localSettings.code_completion_model != settings.code_completion_model || - !deepEqual(localSettings.ai_models, settings.ai_models) - ) { + if (!deepEqual(localSettings.ai_config, settings.ai_config)) { log.debug(`Updating copilot settings...`); await wmill.editCopilotConfig({ workspace, - requestBody: { - ai_resource: localSettings.ai_resource, - code_completion_model: localSettings.code_completion_model, - ai_models: localSettings.ai_models, - }, + requestBody: localSettings.ai_config ?? {}, }); } if ( diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 819d7a117e..b31aeec507 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -9,7 +9,6 @@ "version": "1.478.1", "license": "AGPL-3.0", "dependencies": { - "@anthropic-ai/sdk": "^0.37.0", "@aws-crypto/sha256-js": "^4.0.0", "@codingame/monaco-vscode-configuration-service-override": "~11.1.2", "@codingame/monaco-vscode-standalone-css-language-features": "~11.1.2", @@ -18,7 +17,6 @@ "@codingame/monaco-vscode-standalone-typescript-language-features": "~11.1.2", "@json2csv/plainjs": "^7.0.6", "@leeoniya/ufuzzy": "^1.0.8", - "@mistralai/mistralai": "^1.3.0", "@popperjs/core": "^2.11.6", "@redocly/json-to-json-schema": "^0.0.1", "@tanstack/svelte-table": "^8.9.9", @@ -34,13 +32,14 @@ "chartjs-plugin-zoom": "^2.0.0", "d3-zoom": "^3.0.0", "date-fns": "^2.30.0", - "diff": "^5.1.0", + "diff": "^7.0.0", "driver.js": "^1.3.0", "esm-env": "^1.0.0", "fast-equals": "^5.0.1", "graphql": "^16.7.1", "hash-sum": "^2.0.0", "highlight.js": "^11.8.0", + "idb": "^8.0.2", "lucide-svelte": "^0.399.0", "minimatch": "^10.0.1", "monaco-editor": "npm:@codingame/monaco-vscode-editor-api@~11.1.2", @@ -49,7 +48,7 @@ "monaco-languageclient": "9.1.1", "monaco-vim": "^0.4.1", "ol": "^7.4.0", - "openai": "^4.57.2", + "openai": "^4.87.1", "p-limit": "^6.1.0", "panzoom": "^9.4.3", "pdfjs-dist": "4.8.69", @@ -97,6 +96,7 @@ "@tailwindcss/typography": "^0.5.8", "@types/d3": "^7.4.0", "@types/d3-zoom": "^3.0.3", + "@types/diff": "^7.0.1", "@types/lodash": "^4.14.195", "@types/node": "^20.3.3", "@types/vscode": "^1.83.5", @@ -185,30 +185,6 @@ "node": ">=6.0.0" } }, - "node_modules/@anthropic-ai/sdk": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.37.0.tgz", - "integrity": "sha512-tHjX2YbkUBwEgg0JZU3EFSSAQPoK4qQR/NFYa8Vtzd5UAyXzZksCw2In69Rml4R/TyHPBfRYaLK35XiOe33pjw==", - "license": "MIT", - "dependencies": { - "@types/node": "^18.11.18", - "@types/node-fetch": "^2.6.4", - "abort-controller": "^3.0.0", - "agentkeepalive": "^4.2.1", - "form-data-encoder": "1.7.2", - "formdata-node": "^4.3.2", - "node-fetch": "^2.6.7" - } - }, - "node_modules/@anthropic-ai/sdk/node_modules/@types/node": { - "version": "18.19.64", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.64.tgz", - "integrity": "sha512-955mDqvO2vFf/oL7V3WiUtiz+BugyX8uVbaT2H8oj3+8dRyH2FLiNdowe7eNqRM7IOIZvzDH76EoAT+gwm6aIQ==", - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, "node_modules/@apidevtools/json-schema-ref-parser": { "version": "11.6.1", "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.6.1.tgz", @@ -1758,14 +1734,6 @@ "node": "^18 || >=20" } }, - "node_modules/@mistralai/mistralai": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@mistralai/mistralai/-/mistralai-1.3.0.tgz", - "integrity": "sha512-G5DPCSC8sEhG3LUEZDYLD7qEZWDuZXgaX3IcoC3a/ydm9jFuh2pRZtknsgMx2sU8d7kxRuxblY3fPH5C38wnhQ==", - "peerDependencies": { - "zod": ">= 3" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -2746,6 +2714,13 @@ "@types/ms": "*" } }, + "node_modules/@types/diff": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@types/diff/-/diff-7.0.1.tgz", + "integrity": "sha512-R/BHQFripuhW6XPXy05hIvXJQdQ4540KnTvEFHSLjXfHYM41liOLKgIJEyYYiQe796xpaMHfe4Uj/p7Uvng2vA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", @@ -2829,11 +2804,6 @@ "integrity": "sha512-Yg4LkgFYvn1faISbDNWmcAC1XoDT8IoMUFspp5mnagKk+UvD2N0IWt5A7GRdMubsNWqgCLmrkf8rXkzNqb4szA==", "dev": true }, - "node_modules/@types/qs": { - "version": "6.9.15", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", - "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==" - }, "node_modules/@types/semver": { "version": "7.5.5", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.5.tgz", @@ -3334,6 +3304,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "license": "MIT", "optional": true }, "node_modules/asynckit": { @@ -4573,9 +4544,10 @@ "dev": true }, "node_modules/diff": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", + "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } @@ -6130,6 +6102,12 @@ "ms": "^2.0.0" } }, + "node_modules/idb": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/idb/-/idb-8.0.2.tgz", + "integrity": "sha512-CX70rYhx7GDDQzwwQMDwF6kDRQi5vVs6khHUumDrMecBylKkwvZ8HWvKV08AGb7VbpoGCWUQ4aHzNDgoUiOIUg==", + "license": "ISC" + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -8913,17 +8891,6 @@ "node": ">= 6" } }, - "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/object-is": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", @@ -9004,27 +8971,30 @@ } }, "node_modules/openai": { - "version": "4.57.2", - "resolved": "https://registry.npmjs.org/openai/-/openai-4.57.2.tgz", - "integrity": "sha512-IgIxNjo9tfgnfx6gmwNMg3tdF9giK/2lbwG5DY7zs4TP9Gz+h6h2hBOMoalLPFUVOO5HLOgMI/PFV5VDAUvvMg==", + "version": "4.87.1", + "resolved": "https://registry.npmjs.org/openai/-/openai-4.87.1.tgz", + "integrity": "sha512-mwZ4N4KKGUE5JSTR4IdQZzuxFyStJFqSR62JuWob7ka286tbFacYkOf+Ypk/2IPAUCmhzft5C3UqzcFYaliVMA==", + "license": "Apache-2.0", "dependencies": { "@types/node": "^18.11.18", "@types/node-fetch": "^2.6.4", - "@types/qs": "^6.9.7", "abort-controller": "^3.0.0", "agentkeepalive": "^4.2.1", "form-data-encoder": "1.7.2", "formdata-node": "^4.3.2", - "node-fetch": "^2.6.7", - "qs": "^6.10.3" + "node-fetch": "^2.6.7" }, "bin": { "openai": "bin/cli" }, "peerDependencies": { + "ws": "^8.18.0", "zod": "^3.23.8" }, "peerDependenciesMeta": { + "ws": { + "optional": true + }, "zod": { "optional": true } @@ -10166,20 +10136,6 @@ "node": ">=6" } }, - "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/quadprog": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/quadprog/-/quadprog-1.6.1.tgz", @@ -10801,23 +10757,6 @@ "node": ">=8" } }, - "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/simple-concat": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", @@ -12671,12 +12610,26 @@ } }, "node_modules/ws": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", + "license": "MIT", "optional": true, - "dependencies": { - "async-limiter": "~1.0.0" + "peer": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, "node_modules/xml-utils": { @@ -12775,6 +12728,16 @@ "yjs": "^13.5.6" } }, + "node_modules/y-websocket/node_modules/ws": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", + "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", + "license": "MIT", + "optional": true, + "dependencies": { + "async-limiter": "~1.0.0" + } + }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -12838,6 +12801,7 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", "license": "MIT", + "optional": true, "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" diff --git a/frontend/package.json b/frontend/package.json index 6356634a93..489dba9869 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -31,6 +31,7 @@ "@tailwindcss/typography": "^0.5.8", "@types/d3": "^7.4.0", "@types/d3-zoom": "^3.0.3", + "@types/diff": "^7.0.1", "@types/lodash": "^4.14.195", "@types/node": "^20.3.3", "@types/vscode": "^1.83.5", @@ -84,7 +85,6 @@ }, "type": "module", "dependencies": { - "@anthropic-ai/sdk": "^0.37.0", "@aws-crypto/sha256-js": "^4.0.0", "@codingame/monaco-vscode-configuration-service-override": "~11.1.2", "@codingame/monaco-vscode-standalone-css-language-features": "~11.1.2", @@ -93,7 +93,6 @@ "@codingame/monaco-vscode-standalone-typescript-language-features": "~11.1.2", "@json2csv/plainjs": "^7.0.6", "@leeoniya/ufuzzy": "^1.0.8", - "@mistralai/mistralai": "^1.3.0", "@popperjs/core": "^2.11.6", "@redocly/json-to-json-schema": "^0.0.1", "@tanstack/svelte-table": "^8.9.9", @@ -109,13 +108,14 @@ "chartjs-plugin-zoom": "^2.0.0", "d3-zoom": "^3.0.0", "date-fns": "^2.30.0", - "diff": "^5.1.0", + "diff": "^7.0.0", "driver.js": "^1.3.0", "esm-env": "^1.0.0", "fast-equals": "^5.0.1", "graphql": "^16.7.1", "hash-sum": "^2.0.0", "highlight.js": "^11.8.0", + "idb": "^8.0.2", "lucide-svelte": "^0.399.0", "minimatch": "^10.0.1", "monaco-editor": "npm:@codingame/monaco-vscode-editor-api@~11.1.2", @@ -124,7 +124,7 @@ "monaco-languageclient": "9.1.1", "monaco-vim": "^0.4.1", "ol": "^7.4.0", - "openai": "^4.57.2", + "openai": "^4.87.1", "p-limit": "^6.1.0", "panzoom": "^9.4.3", "pdfjs-dist": "4.8.69", diff --git a/frontend/src/lib/components/Dev.svelte b/frontend/src/lib/components/Dev.svelte index 8e96e68e7c..fb8ce2c8f9 100644 --- a/frontend/src/lib/components/Dev.svelte +++ b/frontend/src/lib/components/Dev.svelte @@ -19,7 +19,7 @@ type TriggersCount } from '$lib/gen' import { inferArgs } from '$lib/infer' - import { copilotInfo, userStore, workspaceStore } from '$lib/stores' + import { setCopilotInfo, userStore, workspaceStore } from '$lib/stores' import { emptySchema, sendUserToast } from '$lib/utils' import { Pane, Splitpanes } from 'svelte-splitpanes' import { onDestroy, onMount, setContext } from 'svelte' @@ -108,30 +108,21 @@ setContext('FlowCopilotContext', flowCopilotContext) - async function setCopilotInfo() { + async function setupCopilotInfo() { if (workspace) { workspaceAIClients.init(workspace) try { const info = await WorkspaceService.getCopilotInfo({ workspace }) - copilotInfo.set({ - ...info, - ai_provider: info.ai_provider ?? 'openai' - }) + setCopilotInfo(info) } catch (err) { - copilotInfo.set({ - ai_provider: 'openai', - exists_ai_resource: false, - code_completion_model: undefined, - ai_models: [] - }) - - console.error('Could not get copilot info') + console.error('Could not get copilot info', err) + setCopilotInfo({}) } } } $: if (workspace) { $workspaceStore = workspace - setCopilotInfo() + setupCopilotInfo() } $: if (workspace && token) { diff --git a/frontend/src/lib/components/Editor.svelte b/frontend/src/lib/components/Editor.svelte index db74de17b4..807e16e69b 100644 --- a/frontend/src/lib/components/Editor.svelte +++ b/frontend/src/lib/components/Editor.svelte @@ -140,13 +140,11 @@ import type { Disposable } from 'vscode' import type { DocumentUri, MessageTransports } from 'vscode-languageclient' import { workspaceStore } from '$lib/stores' - import { type Preview, UserService } from '$lib/gen' + import { type Preview, ResourceService, UserService } from '$lib/gen' import type { Text } from 'yjs' import { initializeVscode } from '$lib/components/vscode' import { initializeMode } from 'monaco-graphql/esm/initializeMode.js' - import { sleep } from '$lib/utils' - import { editorCodeCompletion } from '$lib/components/copilot/completion' import { editor as meditor, languages, @@ -172,7 +170,11 @@ import { initVim } from './monaco_keybindings' import { buildWorkerDefinition } from '$lib/monaco_workers/build_workers' import { parseTypescriptDeps } from '$lib/relative_imports' - + import { Autocompletor } from './copilot/autocomplete/monaco-adapter' + import { AIChatEditorHandler } from './copilot/chat/monaco-adapter' + import GlobalReviewButtons from './copilot/chat/GlobalReviewButtons.svelte' + import { writable } from 'svelte/store' + import { formatResourceTypes } from './copilot/chat/core' // import EditorTheme from './EditorTheme.svelte' let divEl: HTMLDivElement | null = null @@ -202,7 +204,7 @@ ruff: false, deno: false, go: false, - shellcheck: false, + shellcheck: false } export let shouldBindKey: boolean = true export let fixedOverflowWidgets = true @@ -346,7 +348,7 @@ } } - export function append(code): void { + export function append(code: string): void { if (editor) { const lineCount = editor.getModel()?.getLineCount() || 0 const lastLineLength = editor.getModel()?.getLineLength(lineCount) || 0 @@ -601,79 +603,86 @@ } } - let copilotCompletor: Disposable | undefined = undefined - let copilotTs = Date.now() - let abortController: AbortController | undefined = undefined - - function addCopilotSuggestions() { - if (copilotCompletor) { - copilotCompletor.dispose() - } - copilotCompletor = vscode.languages.registerInlineCompletionItemProvider( - { pattern: '**' }, - { - async provideInlineCompletionItems(model, position, context, token) { - abortController?.abort() - const textUntilPosition = model.getText( - new vscode.Range(0, 0, position.line, position.character) - ) - let items: vscode.InlineCompletionItem[] = [] - - const lastChar = textUntilPosition[textUntilPosition.length - 1] - if (textUntilPosition.trim().length > 5 && lastChar.match(/[\(\{\s:=]/)) { - const textAfterPosition = model.getText( - new vscode.Range(position.line, position.character, model.lineCount + 1, 1) - ) - - const thisTs = Date.now() - copilotTs = thisTs - await sleep(200) - if (copilotTs === thisTs) { - abortController?.abort() - abortController = new AbortController() - token.onCancellationRequested(() => { - abortController?.abort() - }) - const aiProvider = $copilotInfo.ai_provider - const insertText = await editorCodeCompletion( - textUntilPosition, - textAfterPosition, - lang, - abortController, - aiProvider - ) - if (insertText) { - items = [ - { - insertText, - range: new vscode.Range( - position.line, - position.character, - position.line, - position.character - ) - } - ] - } - } - } - - return { - items, - commands: [] - } - } - } - ) + let reviewingChanges = writable(false) + let aiChatEditorHandler: AIChatEditorHandler | undefined = undefined + export function reviewAndApplyCode(code: string) { + aiChatEditorHandler?.reviewAndApply(code) } - $: $copilotInfo.exists_ai_resource && - $copilotInfo.code_completion_model && + function addChatHandler(editor: meditor.IStandaloneCodeEditor) { + aiChatEditorHandler = new AIChatEditorHandler(editor) + reviewingChanges = aiChatEditorHandler.reviewingChanges + } + + $: $reviewingChanges && autocompletor?.reject() + + let completorDisposable: Disposable | undefined = undefined + let autocompletor: Autocompletor | undefined = undefined + function addSuperCompletor(editor: meditor.IStandaloneCodeEditor) { + if (completorDisposable) { + completorDisposable.dispose() + } + autocompletor = new Autocompletor(editor, lang) + + // last user events (currently disabled): + // let lastTs = Date.now() + // editor.onDidChangeModelContent((e) => { + // const thisTs = Date.now() + // lastTs = thisTs + // setTimeout(() => { + // if (thisTs === lastTs) { + // autocompletor?.savePatch() + // } + // }, 150) + // }) + + completorDisposable = editor.onDidChangeCursorPosition((e) => { + autocompletor?.reject() + if ($reviewingChanges) { + return + } + const position = editor.getPosition() + if (!position) { + return + } + const upToText = editor.getModel()?.getValueInRange({ + startLineNumber: position.lineNumber, + startColumn: 0, + endLineNumber: position.lineNumber, + endColumn: position.column + }) + const lastChar = upToText ? upToText[upToText.length - 1] : '' + if (lastChar && lastChar.match(/[\(\{\s:="',]/)) { + autocompletor?.predict() + } + }) + + editor.addCommand(KeyCode.Tab, () => { + if (autocompletor?.hasChanges()) { + autocompletor?.accept() + autocompletor?.predict() + } else { + editor.trigger('keyboard', 'tab', {}) + } + }) + + editor.onKeyDown((e) => { + if (e.keyCode === KeyCode.Escape) { + autocompletor?.reject() + } + }) + } + + $: $copilotInfo.enabled && + $copilotInfo.codeCompletionModel && $codeCompletionSessionEnabled && initialized && - addCopilotSuggestions() + editor && + addSuperCompletor(editor) - $: !$codeCompletionSessionEnabled && copilotCompletor && copilotCompletor.dispose() + $: $copilotInfo.enabled && initialized && editor && addChatHandler(editor) + + $: !$codeCompletionSessionEnabled && completorDisposable && completorDisposable.dispose() const outputChannel = { name: 'Language Server Client', @@ -1121,7 +1130,7 @@ initialized = true try { - model = meditor.createModel(code, (lang == 'nu') ? 'python' : lang, mUri.parse(uri)) + model = meditor.createModel(code, lang == 'nu' ? 'python' : lang, mUri.parse(uri)) } catch (err) { console.log('model already existed', err) const nmodel = meditor.getModel(mUri.parse(uri)) @@ -1182,6 +1191,14 @@ editor?.trigger('keyboard', 'editor.action.commentLine', {}) }) + editor?.addCommand(KeyMod.CtrlCmd | KeyCode.KeyL, function () { + dispatch('toggleAiPanel') + }) + + editor?.addCommand(KeyMod.CtrlCmd | KeyCode.KeyU, function () { + dispatch('toggleTestPanel') + }) + if ( !websocketAlive.deno && !websocketAlive.pyright && @@ -1199,6 +1216,7 @@ reloadWebsocket() setTypescriptExtraLibs() + setTypescriptRTNamespace() return () => { console.log('disposing editor') ata = undefined @@ -1214,6 +1232,27 @@ } } + async function setTypescriptRTNamespace() { + if ( + scriptLang && + (scriptLang === 'bun' || + scriptLang === 'deno' || + scriptLang === 'bunnative' || + scriptLang === 'nativets') + ) { + const resourceTypes = await ResourceService.listResourceType({ + workspace: $workspaceStore ?? '' + }) + + const namespace = formatResourceTypes( + resourceTypes, + scriptLang === 'bunnative' ? 'bun' : scriptLang + ) + + languages.typescript.typescriptDefaults.addExtraLib(namespace, 'rt.d.ts') + } + } + async function setTypescriptExtraLibs() { if (lang === 'typescript' && scriptLang != 'deno') { const hostname = getHostname() @@ -1314,7 +1353,7 @@ disposeMethod && disposeMethod() websocketInterval && clearInterval(websocketInterval) sqlSchemaCompletor && sqlSchemaCompletor.dispose() - copilotCompletor && copilotCompletor.dispose() + completorDisposable && completorDisposable.dispose() sqlTypeCompletor && sqlTypeCompletor.dispose() timeoutModel && clearTimeout(timeoutModel) }) @@ -1341,6 +1380,17 @@
{/if} +{#if $reviewingChanges} + { + aiChatEditorHandler?.acceptAll() + }} + on:rejectAll={() => { + aiChatEditorHandler?.rejectAll() + }} + /> +{/if} + diff --git a/frontend/src/lib/components/flows/propPicker/OutputPickerInner.svelte b/frontend/src/lib/components/flows/propPicker/OutputPickerInner.svelte new file mode 100644 index 0000000000..2d4da2bbe4 --- /dev/null +++ b/frontend/src/lib/components/flows/propPicker/OutputPickerInner.svelte @@ -0,0 +1,646 @@ + + + + +
+
+
+
+ {#if !disableHistory} + + + + {/if} +
+ {/if} + + {#if !disableMock && !isLoading} + + + Pin data + + {/if} + + {#if jsonView} +
+ +
+ {#if selectedJob && 'result' in selectedJob && displayResultJob && toolbarLocationJob === 'external'} + { + if (displayResultJob && typeof displayResultJob.openDrawer === 'function') { + displayResultJob.openDrawer() + } + }} + /> + {:else if mock?.enabled && displayResultMock && toolbarLocationMock === 'external'} + { + if (displayResultMock && typeof displayResultMock.openDrawer === 'function') { + displayResultMock.openDrawer() + } + }} + /> + {/if} +
+
+
+ + + +
+
{ + if ( + !event.target || + !(event.target instanceof HTMLElement) || + event.target.closest('[data-interactive]') || + event.target.closest('button') || + event.target.closest('input') || + event.target.closest('textarea') || + event.target.closest('select') || + event.target.closest('option') || + event.target.closest('label') || + event.target.closest('a') || + event.target.closest('svg') + ) { + dblClickDisabled = true + } else { + dblClickDisabled = false + } + }} + on:dblclick={() => { + if (canEditWithDblClick) { + stepHistoryPopover?.close() + jsonView = true + tmpMock = undefined + } + }} + on:mouseenter={() => { + hoveringResult = true + }} + on:mouseleave={() => { + hoveringResult = false + }} + > + {#if isLoading} +
+ +
+ {:else if connectingData || simpleViewer} + + {:else if jsonView} + { + if (mock?.enabled) { + const newMock = { + enabled: true, + return_value: structuredClone(detail) + } + tmpMock = newMock + } + }} + code={JSON.stringify( + mock?.enabled && mock.return_value ? mock.return_value : '', + null, + 2 + )} + class="h-full" + /> + {:else if (mock?.enabled || preview == 'mock') && preview != 'job'} + {#if fullResult} +
+ { + toolbarLocationMock = detail + }} + /> +
+ {:else} + + {/if} + {:else if selectedJob != undefined && 'result' in selectedJob} + {#if fullResult} +
+ {#key selectedJob} + { + toolbarLocationJob = detail + }} + > + + + + + {/key} +
+ {:else} + + {/if} + {:else if !lastJob} +
+

+ Test this step to see results{#if !disableMock} + or + {:else}.{/if} +

+
+ {/if} +
+
+
+ + diff --git a/frontend/src/lib/components/flows/propPicker/StepHistory.svelte b/frontend/src/lib/components/flows/propPicker/StepHistory.svelte new file mode 100644 index 0000000000..1fb5448801 --- /dev/null +++ b/frontend/src/lib/components/flows/propPicker/StepHistory.svelte @@ -0,0 +1,132 @@ + + + + + {#if mockValue} + +
+ + + + {mockEnabled ? 'Pin' : 'Last pin'} + +
+
+ {/if} +
+ + + + + + + + + + +
+ {noHistory === 'isLoop' + ? 'History is not available with loops.' + : noHistory === 'isInsideLoop' + ? 'History is not available inside loops.' + : 'No run in history for this step'} +
+
+
diff --git a/frontend/src/lib/components/flows/utils.ts b/frontend/src/lib/components/flows/utils.ts index 11146c2a17..b3270331ea 100644 --- a/frontend/src/lib/components/flows/utils.ts +++ b/frontend/src/lib/components/flows/utils.ts @@ -12,7 +12,7 @@ import { workspaceStore } from '$lib/stores' import { cleanExpr, emptySchema } from '$lib/utils' import { get } from 'svelte/store' import type { FlowModuleState } from './flowState' -import type { PickableProperties } from './previousResults' +import { type PickableProperties, dfs } from './previousResults' import { NEVER_TESTED_THIS_FAR } from './models' import { sendUserToast } from '$lib/toast' import type { Schema } from '$lib/common' @@ -316,3 +316,17 @@ export async function initFlowStepWarnings( return messages } + +export function checkIfParentLoop( + flowStore: ExtendedOpenFlow, + modId: string +): { id: string; type: 'forloopflow' | 'whileloopflow' } | undefined { + const flow: ExtendedOpenFlow = JSON.parse(JSON.stringify(flowStore)) + const parents = dfs(modId, flow, true) + for (const parent of parents.slice(1)) { + if (parent.value.type === 'forloopflow' || parent.value.type === 'whileloopflow') { + return { id: parent.id, type: parent.value.type } + } + } + return undefined +} diff --git a/frontend/src/lib/components/graph/FlowGraphV2.svelte b/frontend/src/lib/components/graph/FlowGraphV2.svelte index 245426a041..6fa84591f2 100644 --- a/frontend/src/lib/components/graph/FlowGraphV2.svelte +++ b/frontend/src/lib/components/graph/FlowGraphV2.svelte @@ -71,6 +71,7 @@ ) export let triggerNode = false export let workspace: string = $workspaceStore ?? 'NO_WORKSPACE' + export let editMode = false let useDataflow: Writable = writable(false) @@ -218,6 +219,9 @@ minimizeSubflow: (id: string) => { delete expandedSubflows[id] expandedSubflows = expandedSubflows + }, + updateMock: () => { + dispatch('updateMock') } } @@ -242,7 +246,8 @@ path, newFlow, cache, - earlyStop + earlyStop, + editMode }, failureModule, preprocessorModule, diff --git a/frontend/src/lib/components/graph/graphBuilder.ts b/frontend/src/lib/components/graph/graphBuilder.ts index 4e37d6e863..0011106ade 100644 --- a/frontend/src/lib/components/graph/graphBuilder.ts +++ b/frontend/src/lib/components/graph/graphBuilder.ts @@ -17,6 +17,7 @@ export type GraphEventHandlers = { simplifyFlow: (detail: boolean) => void expandSubflow: (id: string, path: string) => void minimizeSubflow: (id: string) => void + updateMock: () => void } export type SimplifiableFlow = { simplifiedFlow: boolean } diff --git a/frontend/src/lib/components/graph/renderers/nodes/ForLoopStartNode.svelte b/frontend/src/lib/components/graph/renderers/nodes/ForLoopStartNode.svelte index 596a32892f..278018360e 100644 --- a/frontend/src/lib/components/graph/renderers/nodes/ForLoopStartNode.svelte +++ b/frontend/src/lib/components/graph/renderers/nodes/ForLoopStartNode.svelte @@ -12,9 +12,12 @@ offset: number id: string modules: FlowModule[] + module: FlowModule flowModuleStates: Record | undefined eventHandlers: GraphEventHandlers simplifiedTriggerView: boolean + selectedId: string + editMode: boolean } const propPickerContext = getContext('PropPickerContext') @@ -23,8 +26,16 @@ $: filteredInput = filterIterFromInput($pickablePropertiesFiltered?.flow_input) function filterIterFromInput(inputJson: Record | undefined): Record { - if (!inputJson || typeof inputJson !== 'object' || !inputJson.iter) return {} - return { iter: inputJson.iter } + if (!inputJson || typeof inputJson !== 'object' || (!inputJson.iter && !inputJson.iter_parent)) + return {} + const selectedIdIsDescendant = isSelectedDescendant(data.module, data.selectedId) + if (selectedIdIsDescendant === 'child') { + return { iter: inputJson.iter } + } + if (selectedIdIsDescendant === 'grandchild') { + return { iter_parent: inputJson.iter_parent } + } + return {} } function computeStatus(state: GraphModuleState | undefined): FlowStatusModule["type"] | undefined { @@ -34,10 +45,30 @@ return r ? 'Success' : 'InProgress' } } + + function isSelectedDescendant( + module: FlowModule, + selectedId: string + ): 'child' | 'grandchild' | 'none' { + if (!selectedId) return 'none' + // Check direct children + if (module.value.type === 'forloopflow' || module.value.type === 'whileloopflow') { + if (module.value.modules.some((m) => m.id === selectedId)) { + return 'child' + } + // Check grandchildren + return module.value.modules.some( + (m) => + (m.value.type === 'forloopflow' || m.value.type === 'whileloopflow') && + m.value.modules.some((gm) => gm.id === selectedId) + ) + ? 'grandchild' + : 'none' + } + return 'none' + } - - diff --git a/frontend/src/lib/components/graph/renderers/nodes/InputNode.svelte b/frontend/src/lib/components/graph/renderers/nodes/InputNode.svelte index bdfcdd30cb..247870d0a4 100644 --- a/frontend/src/lib/components/graph/renderers/nodes/InputNode.svelte +++ b/frontend/src/lib/components/graph/renderers/nodes/InputNode.svelte @@ -7,7 +7,9 @@ import { getContext } from 'svelte' import type { Writable } from 'svelte/store' import InsertModuleButton from '$lib/components/flows/map/InsertModuleButton.svelte' - import type { PropPickerContext } from '$lib/components/prop_picker' + import { schemaToObject } from '$lib/schema' + import type { Schema } from '$lib/common' + import type { FlowEditorContext } from '$lib/components/flows/types' export let data: { hasPreprocessor: boolean @@ -20,25 +22,20 @@ disableMoveIds: string[] cache: boolean earlyStop: boolean + editMode: boolean } const { selectedId } = getContext<{ selectedId: Writable }>('FlowGraphContext') - const propPickerContext = getContext('PropPickerContext') - const pickablePropertiesFiltered = propPickerContext?.pickablePropertiesFiltered + const { previewArgs, flowStore } = + getContext('FlowEditorContext') || {} - function filterIterFromInput(inputJson: Record | undefined): Record { - if (!inputJson || typeof inputJson !== 'object') return {} - - const newJson = { ...inputJson } - delete newJson.iter - - return newJson - } - - $: filteredInput = filterIterFromInput($pickablePropertiesFiltered?.flow_input) + $: topFlowInput = + flowStore && previewArgs && $flowStore?.schema + ? schemaToObject($flowStore.schema as Schema, $previewArgs || {}) + : undefined @@ -82,10 +79,11 @@ on:select={(e) => { data.eventHandlers?.select(e.detail) }} - inputJson={filteredInput} + inputJson={topFlowInput} prefix="flow_input" alwaysPluggable cache={data.cache} earlyStop={data.earlyStop} + editMode={data.editMode} /> diff --git a/frontend/src/lib/components/graph/renderers/nodes/ModuleNode.svelte b/frontend/src/lib/components/graph/renderers/nodes/ModuleNode.svelte index 05867a844e..66139fb034 100644 --- a/frontend/src/lib/components/graph/renderers/nodes/ModuleNode.svelte +++ b/frontend/src/lib/components/graph/renderers/nodes/ModuleNode.svelte @@ -26,6 +26,7 @@ eventHandlers: GraphEventHandlers flowModuleStates: Record | undefined selected: boolean + editMode: boolean } $: type = data.flowModuleStates?.[data.module.id]?.type @@ -42,15 +43,12 @@ flowJobsSuccess: state?.flow_jobs_success } : (undefined as any) - - - {#if data.module.value.type == 'flow'}
- {:else if contextElement.type === 'code' || contextElement.type === 'diff'} + {:else if contextElement.type === 'code' || contextElement.type === 'code_piece' || contextElement.type === 'diff'}
diff --git a/frontend/src/lib/components/copilot/chat/core.ts b/frontend/src/lib/components/copilot/chat/core.ts index 2d5d2f669f..d315b7c65d 100644 --- a/frontend/src/lib/components/copilot/chat/core.ts +++ b/frontend/src/lib/components/copilot/chat/core.ts @@ -211,6 +211,7 @@ export const CHAT_SYSTEM_PROMPT = ` When the user requests code changes: - Always include a **single code block** with the **entire updated file**, not just the modified sections. + - The code can include \`[#START]\` and \`[#END]\` markers to indicate the start and end of a code piece. You MUST only modify the code between these markers if given, and remove them in your response. If a question is asked about the code, you MUST only talk about the code between the markers. Refer to it as the code piece, not the code between the markers. - Follow the instructions carefully and explain the reasoning behind your changes. - If the request is abstract (e.g., "make this cleaner"), interpret it concretely and reflect that in the code block. - Preserve existing formatting, indentation, and whitespace unless changes are strictly required to fulfill the user's request. @@ -223,7 +224,7 @@ export const CHAT_SYSTEM_PROMPT = ` ` const CHAT_USER_CODE_CONTEXT = ` -CODE ({title}): +- {title}: \`\`\`{language} {code} \`\`\` @@ -241,19 +242,6 @@ INSTRUCTIONS: WINDMILL LANGUAGE CONTEXT: {lang_context} -DATABASES: -{db_context} - -CODE: -{code_context} - -ERROR: -{error_context} - -DIFF: -{diff_context} - -\`\`\` ` export const CHAT_USER_DB_CONTEXT = `- {title}: SCHEMA: \n{schema}\n` @@ -278,71 +266,120 @@ export const ContextIconMap = { code: Code, error: TriangleAlert, db: Database, - diff: Diff + diff: Diff, + code_piece: Code } -export type ContextElement = - | { - type: 'code' - content: string - title: string - lang: ScriptLang | 'bunnative' - } - | { - type: 'error' - content: string - title: 'error' - } - | { - type: 'db' - schema?: DBSchema - title: string - } - | { - type: 'diff' - content: string - title: string - diff: Change[] - lang: ScriptLang | 'bunnative' - } +type CodeElement = { + type: 'code' + content: string + title: string + lang: ScriptLang | 'bunnative' +} + +type ErrorElement = { + type: 'error' + content: string + title: 'error' +} + +type DBElement = { + type: 'db' + schema?: DBSchema + title: string +} + +type DiffElement = { + type: 'diff' + content: string + title: string + diff: Change[] + lang: ScriptLang | 'bunnative' +} + +type CodePieceElement = { + type: 'code_piece' + content: string + startLine: number + endLine: number + title: string + lang: ScriptLang | 'bunnative' +} + +export type ContextElement = CodeElement | ErrorElement | DBElement | DiffElement | CodePieceElement + +const applyCodePieceToCodeContext = (codePieces: CodePieceElement[], codeContext: string) => { + let code = codeContext.split('\n') + let shiftOffset = 0 + codePieces.sort((a, b) => a.startLine - b.startLine) + for (const codePiece of codePieces) { + code.splice(codePiece.endLine + shiftOffset, 0, '[#END]') + code.splice(codePiece.startLine + shiftOffset - 1, 0, '[#START]') + shiftOffset += 2 + } + return code.join('\n') +} export async function prepareUserMessage( instructions: string, language: ScriptLang | 'bunnative', selectedContext: ContextElement[] ) { - let codeContext = '' - let errorContext = '' - let dbContext = '' - let diffContext = '' + let codeContext = 'CODE:\n' + let errorContext = 'ERROR:\n' + let dbContext = 'DATABASES:\n' + let diffContext = 'DIFF:\n' + let hasCode = false + let hasError = false + let hasDb = false + let hasDiff = false for (const context of selectedContext) { if (context.type === 'code') { + hasCode = true codeContext += CHAT_USER_CODE_CONTEXT.replace('{title}', context.title) .replace('{language}', scriptLangToEditorLang(language)) - .replace('{code}', context.content) + .replace( + '{code}', + applyCodePieceToCodeContext( + selectedContext.filter((c) => c.type === 'code_piece'), + context.content + ) + ) } else if (context.type === 'error') { - if (errorContext) { + if (hasError) { throw new Error('Multiple error contexts provided') } + hasError = true errorContext = CHAT_USER_ERROR_CONTEXT.replace('{error}', context.content) } else if (context.type === 'db') { + hasDb = true dbContext += CHAT_USER_DB_CONTEXT.replace('{title}', context.title).replace( '{schema}', context.schema?.stringified ?? 'to fetch with get_db_schema' ) } else if (context.type === 'diff') { + hasDiff = true const diff = JSON.stringify(context.diff) diffContext = diff.length > 3000 ? diff.slice(0, 3000) + '...' : diff } } - const userMessage = CHAT_USER_PROMPT.replace('{instructions}', instructions) - .replace('{lang_context}', getLangContext(language)) - .replace('{code_context}', codeContext) - .replace('{error_context}', errorContext) - .replace('{db_context}', dbContext) - .replace('{diff_context}', diffContext) - + let userMessage = CHAT_USER_PROMPT.replace('{instructions}', instructions).replace( + '{lang_context}', + getLangContext(language) + ) + if (hasCode) { + userMessage += codeContext + } + if (hasError) { + userMessage += errorContext + } + if (hasDb) { + userMessage += dbContext + } + if (hasDiff) { + userMessage += diffContext + } return userMessage } diff --git a/frontend/src/lib/stores.ts b/frontend/src/lib/stores.ts index ec0e1268c8..5168b184c4 100644 --- a/frontend/src/lib/stores.ts +++ b/frontend/src/lib/stores.ts @@ -154,7 +154,7 @@ export const copilotSessionModel = writable( ? { model: sessionModel, provider: sessionProvider as AIProvider - } + } : undefined ) export const usedTriggerKinds = writable([]) From 4f6be6ed340e26bf1ed95398a9dc9f1eb41b33dd Mon Sep 17 00:00:00 2001 From: HugoCasa Date: Fri, 4 Apr 2025 11:30:03 +0200 Subject: [PATCH 160/739] fix: flow editor svelte 5 issues (#5567) --- .../flows/content/FlowEditorPanel.svelte | 2 +- .../flows/content/FlowModuleWrapper.svelte | 16 ++++++++-------- .../workspaceSettings/AISettings.svelte | 11 +++++++---- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/frontend/src/lib/components/flows/content/FlowEditorPanel.svelte b/frontend/src/lib/components/flows/content/FlowEditorPanel.svelte index dd710eac9e..5858da0eb0 100644 --- a/frontend/src/lib/components/flows/content/FlowEditorPanel.svelte +++ b/frontend/src/lib/components/flows/content/FlowEditorPanel.svelte @@ -137,7 +137,7 @@ {#each $flowStore.value.modules as flowModule, index (flowModule.id ?? index)} diff --git a/frontend/src/lib/components/flows/content/FlowModuleWrapper.svelte b/frontend/src/lib/components/flows/content/FlowModuleWrapper.svelte index a52370ea87..12e506ed48 100644 --- a/frontend/src/lib/components/flows/content/FlowModuleWrapper.svelte +++ b/frontend/src/lib/components/flows/content/FlowModuleWrapper.svelte @@ -193,10 +193,10 @@ /> {/if} {:else if flowModule.value.type === 'forloopflow' || flowModule.value.type == 'whileloopflow'} - {#each flowModule.value.modules as submodule, index (index)} + {#each flowModule.value.modules as _, index (index)} {:else} - {#each flowModule.value.default as submodule, index} + {#each flowModule.value.default as _, index} {:else} - {#each branch.modules as submodule, index} + {#each branch.modules as _, index} {:else} - {#each branch.modules as submodule, index} + {#each branch.modules as _, index} { if (e.detail) { - aiProviders[provider] = { - resource_path: '', - models: - AI_DEFAULT_MODELS[provider].length > 0 ? [AI_DEFAULT_MODELS[provider][0]] : [] + aiProviders = { + ...aiProviders, + [provider]: { + resource_path: '', + models: + AI_DEFAULT_MODELS[provider].length > 0 ? [AI_DEFAULT_MODELS[provider][0]] : [] + } } if (AI_DEFAULT_MODELS[provider].length > 0 && !defaultModel) { From b3ecde3316252bcd7323de98149786349019ba7e Mon Sep 17 00:00:00 2001 From: centdix <40307056+centdix@users.noreply.github.com> Date: Fri, 4 Apr 2025 18:03:40 +0200 Subject: [PATCH 161/739] feat: add diff toggle to flow inline scripts (#5550) * draft flow diff * add missing import * cleaning * code cleaning * fix for recursive renderings * fix typo * cleaning --------- Co-authored-by: HugoCasa --- .../src/lib/components/FlowBuilder.svelte | 1 + .../lib/components/flows/FlowEditor.svelte | 8 ++++- .../flows/content/FlowEditorPanel.svelte | 8 ++++- .../flows/content/FlowModuleComponent.svelte | 31 ++++++++++++++++++- .../flows/content/FlowModuleWrapper.svelte | 14 ++++++++- 5 files changed, 58 insertions(+), 4 deletions(-) diff --git a/frontend/src/lib/components/FlowBuilder.svelte b/frontend/src/lib/components/FlowBuilder.svelte index 39594c5b70..c9d0dcf257 100644 --- a/frontend/src/lib/components/FlowBuilder.svelte +++ b/frontend/src/lib/components/FlowBuilder.svelte @@ -1529,6 +1529,7 @@ $previewArgsStore = JSON.parse(JSON.stringify(e.detail)) flowPreviewButtons?.openPreview(true) }} + {savedFlow} /> {:else} Loading... diff --git a/frontend/src/lib/components/flows/FlowEditor.svelte b/frontend/src/lib/components/flows/FlowEditor.svelte index 3250fc9ee6..411a5e9311 100644 --- a/frontend/src/lib/components/flows/FlowEditor.svelte +++ b/frontend/src/lib/components/flows/FlowEditor.svelte @@ -12,6 +12,7 @@ import { writable } from 'svelte/store' import type { PropPickerContext, FlowPropPickerConfig } from '$lib/components/prop_picker' import type { PickableProperties } from '$lib/components/flows/previousResults' + import type { Flow } from '$lib/gen' const { flowStore } = getContext('FlowEditorContext') export let loading: boolean @@ -22,7 +23,11 @@ export let disabledFlowInputs = false export let smallErrorHandler = false export let newFlow: boolean = false - + export let savedFlow: + | (Flow & { + draft?: Flow | undefined + }) + | undefined = undefined let size = 50 const { currentStepStore: copilotCurrentStepStore } = @@ -75,6 +80,7 @@ {/each} {/key} diff --git a/frontend/src/lib/components/flows/content/FlowModuleComponent.svelte b/frontend/src/lib/components/flows/content/FlowModuleComponent.svelte index f52c113457..b977e061a7 100644 --- a/frontend/src/lib/components/flows/content/FlowModuleComponent.svelte +++ b/frontend/src/lib/components/flows/content/FlowModuleComponent.svelte @@ -8,7 +8,7 @@ import Toggle from '$lib/components/Toggle.svelte' import { createScriptFromInlineScript, fork } from '$lib/components/flows/flowStateUtils' - import type { FlowModule } from '$lib/gen' + import type { FlowModule, RawScript } from '$lib/gen' import FlowCard from '../common/FlowCard.svelte' import FlowModuleHeader from './FlowModuleHeader.svelte' import { getLatestHashForScript, scriptLangToEditorLang } from '$lib/scripts' @@ -74,8 +74,10 @@ export let scriptTemplate: 'pgsql' | 'mysql' | 'script' | 'docker' | 'powershell' = 'script' export let noEditor: boolean export let enableAi: boolean + export let savedModule: FlowModule | undefined = undefined let tag: string | undefined = undefined + let diffMode = false let editor: Editor let diffEditor: DiffEditor @@ -98,6 +100,15 @@ let testIsLoading = false let scriptProgress = undefined + $: lastDeployedCode = onModulesChange(savedModule, flowModule) + function onModulesChange(savedModule: FlowModule | undefined, flowModule: FlowModule) { + return savedModule?.value?.type === 'rawscript' && + flowModule.value.type === 'rawscript' && + savedModule.value.content !== flowModule.value.content + ? savedModule.value.content + : undefined + } + const { modulesStore: copilotModulesStore } = getContext('FlowCopilotContext') || {} @@ -246,6 +257,20 @@ } else { leftPanelSize = 100 } + + function showDiffMode() { + diffMode = true + diffEditor?.setOriginal((savedModule?.value as RawScript).content ?? '') + diffEditor?.setModified(editor?.getCode() ?? '') + diffEditor?.show() + editor?.hide() + } + + function hideDiffMode() { + diffMode = false + diffEditor?.hide() + editor?.show() + } @@ -323,6 +348,10 @@ acc[key] = obj.type === 'static' ? obj.value : undefined return acc }, {})} + on:showDiffMode={showDiffMode} + on:hideDiffMode={hideDiffMode} + {lastDeployedCode} + {diffMode} />
{/if} diff --git a/frontend/src/lib/components/flows/content/FlowModuleWrapper.svelte b/frontend/src/lib/components/flows/content/FlowModuleWrapper.svelte index 12e506ed48..09261baf7d 100644 --- a/frontend/src/lib/components/flows/content/FlowModuleWrapper.svelte +++ b/frontend/src/lib/components/flows/content/FlowModuleWrapper.svelte @@ -1,5 +1,11 @@ -{#if componentSettings} - {#key componentSettings?.item?.id} +{#if gridItemWithLocation} + {#key gridItemWithLocation.item.id} gridItemWithLocation, + (cs) => { + if (gridItemWithLocation?.location.type === 'grid') { + $app.grid[gridItemWithLocation.location.gridItemIndex] = cs.item + } else if ( + gridItemWithLocation?.location.type === 'subgrid' && + Array.isArray($app.subgrids?.[gridItemWithLocation.location.subgridKey]) + ) { + $app.subgrids[gridItemWithLocation.location.subgridKey][ + gridItemWithLocation.location.subgridItemIndex + ] = cs.item + } + } + } onDelete={() => { dispatch('delete') }} @@ -83,30 +136,65 @@ {#key tableActionSettings?.item?.data?.id} tableActionSettings, + (cs) => { + if (tableActionSettings) { + if (tableActionSettings.gridItemLocation.type === 'grid') { + const { gridItemIndex } = tableActionSettings.gridItemLocation + const { key, index } = tableActionSettings.location + if ($app.grid[gridItemIndex]?.data?.[key]) { + $app.grid[gridItemIndex].data[key][index] = cs.item.data + } + } else if (tableActionSettings.gridItemLocation.type === 'subgrid') { + const { subgridKey, subgridItemIndex } = tableActionSettings.gridItemLocation + const { key, index } = tableActionSettings.location + if ($app.subgrids?.[subgridKey]?.[subgridItemIndex]?.data?.[key]) { + $app.subgrids[subgridKey][subgridItemIndex].data[key][index] = cs.item.data + } + } + } + } + } duplicateMoveAllowed={false} onDelete={() => { if (tableActionSettings) { - const parent = findGridItem($app, tableActionSettings.parent) - if (!parent) return - + const item = findGridItemWithLocation($app, tableActionSettings.parent) + if (!item) return + const { item: parent, location } = item if (parent.data.type === 'tablecomponent') { - parent.data.actionButtons = parent.data.actionButtons.filter( + const newActionButtons = parent.data.actionButtons.filter( (x) => x.id !== tableActionSettings?.item.id ) + if (location.type === 'grid') { + const { gridItemIndex } = location + if ($app.grid[gridItemIndex]?.data?.type === 'tablecomponent') { + $app.grid[gridItemIndex].data.actionButtons = newActionButtons + } + } else if (location.type === 'subgrid') { + const { subgridKey, subgridItemIndex } = location + if ( + $app.subgrids?.[subgridKey]?.[subgridItemIndex]?.data?.type === 'tablecomponent' + ) { + $app.subgrids[subgridKey][subgridItemIndex].data.actionButtons = newActionButtons + } + } } - - if ( - (parent.data.type === 'aggridcomponent' || - parent.data.type === 'aggridcomponentee' || - parent.data.type === 'dbexplorercomponent' || - parent.data.type === 'aggridinfinitecomponent' || - parent.data.type === 'aggridinfinitecomponentee') && - Array.isArray(parent.data.actions) - ) { - parent.data.actions = parent.data.actions.filter( + if (itemHasActions(parent) && Array.isArray(parent.data.actions)) { + const newActions = parent.data.actions.filter( (x) => x.id !== tableActionSettings?.item.id ) + if (location.type === 'grid') { + const { gridItemIndex } = location + if (itemHasActions($app.grid[gridItemIndex])) { + $app.grid[gridItemIndex].data.actions = newActions + } + } else { + const { subgridKey, subgridItemIndex } = location + if (itemHasActions($app.subgrids?.[subgridKey]?.[subgridItemIndex])) { + $app.subgrids[subgridKey][subgridItemIndex].data.actions = newActions + } + } } } }} @@ -116,17 +204,44 @@ {#key menuItemsSettings?.item?.id} menuItemsSettings, + (cs) => { + if (menuItemsSettings) { + if (menuItemsSettings.gridItemLocation.type === 'grid') { + const { gridItemIndex } = menuItemsSettings.gridItemLocation + if ($app.grid[gridItemIndex]?.data?.type === 'menucomponent') { + $app.grid[gridItemIndex].data.menuItems[cs.index] = cs.item.data + } + } else if (menuItemsSettings.gridItemLocation.type === 'subgrid') { + const { subgridKey, subgridItemIndex } = menuItemsSettings.gridItemLocation + if ($app.subgrids?.[subgridKey]?.[subgridItemIndex]?.data?.type === 'menucomponent') { + $app.subgrids[subgridKey][subgridItemIndex].data.menuItems[cs.index] = cs.item.data + } + } + } + } + } onDelete={() => { if (menuItemsSettings) { - const parent = findGridItem($app, menuItemsSettings.parent) - if (!parent) return - + const item = findGridItemWithLocation($app, menuItemsSettings.parent) + if (!item) return + const { item: parent, location } = item if (parent.data.type === 'menucomponent') { - parent.data.menuItems = parent.data.menuItems.filter( + const newItems = parent.data.menuItems.filter( (x) => x.id !== menuItemsSettings?.item.id ) + if (location.type === 'grid') { + const { gridItemIndex } = location + if ($app.grid[gridItemIndex]?.data?.type === 'menucomponent') { + $app.grid[gridItemIndex].data.menuItems = newItems + } + } else if (location.type === 'subgrid') { + const { subgridKey, subgridItemIndex } = location + if ($app.subgrids?.[subgridKey]?.[subgridItemIndex]?.data?.type === 'menucomponent') { + $app.subgrids[subgridKey][subgridItemIndex].data.menuItems = newItems + } + } } } }} @@ -135,8 +250,15 @@ {:else if hiddenInlineScript} {@const id = BG_PREFIX + hiddenInlineScript.index} {#key id} - - + hiddenInlineScript.script, + (r) => { + $app.hiddenInlineScripts[hiddenInlineScript.index] = r + } + } + {id} + /> {#if Object.keys(hiddenInlineScript.script.fields ?? {}).length > 0}
@@ -145,7 +267,14 @@ displayType {id} shouldCapitalize={false} - bind:inputSpecs={hiddenInlineScript.script.fields} + bind:inputSpecs={ + () => hiddenInlineScript.script.fields, + (is) => { + if ($app.hiddenInlineScripts[hiddenInlineScript.index]) { + $app.hiddenInlineScripts[hiddenInlineScript.index].fields = is + } + } + } userInputEnabled={false} recomputeOnInputChanged={hiddenInlineScript.script.recomputeOnInputChanged} showOnDemandOnlyToggle @@ -163,7 +292,14 @@ title="on success" tooltip="This event is triggered when the script runs successfully." items={Object.keys($runnableComponents).filter((_id) => _id !== id)} - bind:value={hiddenInlineScript.script.recomputeIds} + bind:value={ + () => hiddenInlineScript.script.recomputeIds, + (v) => { + if ($app.hiddenInlineScripts[hiddenInlineScript.index]) { + $app.hiddenInlineScripts[hiddenInlineScript.index].recomputeIds = v + } + } + } />
diff --git a/frontend/src/lib/components/apps/editor/appUtils.ts b/frontend/src/lib/components/apps/editor/appUtils.ts index 6045061e59..77ddb84f27 100644 --- a/frontend/src/lib/components/apps/editor/appUtils.ts +++ b/frontend/src/lib/components/apps/editor/appUtils.ts @@ -36,6 +36,91 @@ import { getNextId } from '$lib/components/flows/idUtils' import { enterpriseLicense } from '$lib/stores' import gridHelp from '../svelte-grid/utils/helper' +type GridItemLocation = + | { + type: 'grid' + gridItemIndex: number + } + | { + type: 'subgrid' + subgridItemIndex: number + subgridKey: string + } +interface GridItemWithLocation { + location: GridItemLocation + item: GridItem + parent: string | undefined +} + +export function allItemsWithLocation( + grid: GridItem[], + subgrids: Record | undefined +): GridItemWithLocation[] { + const gridItems: GridItemWithLocation[] = grid.map((x, i) => ({ + location: { + type: 'grid', + gridItemIndex: i + }, + item: x, + parent: undefined + })) + if (subgrids) { + for (const key of Object.keys(subgrids)) { + gridItems.push( + ...subgrids[key].map((x, i) => ({ + location: { + type: 'subgrid' as const, + subgridItemIndex: i, + subgridKey: key + }, + item: x, + parent: key + })) + ) + } + } + return gridItems +} + +export function findGridItemWithLocation( + app: App, + id: string | undefined +): GridItemWithLocation | undefined { + if (!id) return undefined + if (app?.grid) { + const gridItemIndex = app.grid.findIndex((x) => x.data?.id === id) + if (gridItemIndex > -1) { + return { + location: { + type: 'grid', + gridItemIndex: gridItemIndex + }, + item: app.grid[gridItemIndex], + parent: undefined + } + } + } + + if (app?.subgrids) { + for (const key of Object.keys(app.subgrids ?? {})) { + const subGridItemIndex = app.subgrids[key].findIndex((x) => x.data?.id === id) + if (subGridItemIndex > -1) { + return { + location: { + subgridItemIndex: subGridItemIndex, + subgridKey: key, + type: 'subgrid' + }, + item: app.subgrids[key][subGridItemIndex], + parent: key + } + } + } + } + + return undefined +} + export function findComponentSettings(app: App, id: string | undefined) { if (!id) return undefined if (app?.grid) { @@ -772,20 +857,20 @@ export type InitConfig< [Property in keyof T]: T[Property] extends StaticAppInput ? T[Property]['value'] | undefined : T[Property] extends { type: 'oneOf' } - ? { - type: 'oneOf' - selected: keyof T[Property]['configuration'] - configuration: { - [Choice in keyof T[Property]['configuration']]: { - [IT in keyof T[Property]['configuration'][Choice]]: T[Property]['configuration'][Choice][IT] extends StaticAppInput - ? T[Property]['configuration'][Choice][IT] extends StaticAppInputOnDemand - ? () => Promise - : T[Property]['configuration'][Choice][IT]['value'] | undefined - : undefined + ? { + type: 'oneOf' + selected: keyof T[Property]['configuration'] + configuration: { + [Choice in keyof T[Property]['configuration']]: { + [IT in keyof T[Property]['configuration'][Choice]]: T[Property]['configuration'][Choice][IT] extends StaticAppInput + ? T[Property]['configuration'][Choice][IT] extends StaticAppInputOnDemand + ? () => Promise + : T[Property]['configuration'][Choice][IT]['value'] | undefined + : undefined + } } } - } - : undefined + : undefined } export function initConfig< @@ -827,27 +912,30 @@ export function initConfig< ? [ key, configuration?.[key]?.type == 'static' ? configuration?.[key]?.['value'] : undefined - ] + ] : value.type == 'oneOf' - ? [ - key, - { - selected: value.selected, - type: 'oneOf', - configuration: Object.fromEntries( - Object.entries(value.configuration).map(([choice, config]) => { - const conf = initConfig(config, configuration?.[key]?.configuration?.[choice]) - Object.entries(config).forEach(([innerKey, innerValue]) => { - if (innerValue.type === 'static' && !(innerKey in conf)) { - conf[innerKey] = innerValue.value - } + ? [ + key, + { + selected: value.selected, + type: 'oneOf', + configuration: Object.fromEntries( + Object.entries(value.configuration).map(([choice, config]) => { + const conf = initConfig( + config, + configuration?.[key]?.configuration?.[choice] + ) + Object.entries(config).forEach(([innerKey, innerValue]) => { + if (innerValue.type === 'static' && !(innerKey in conf)) { + conf[innerKey] = innerValue.value + } + }) + return [choice, conf] }) - return [choice, conf] - }) - ) - } - ] - : [key, undefined] + ) + } + ] + : [key, undefined] ) ) as any ) diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte index 14eac95957..e9fe80912d 100644 --- a/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte +++ b/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte @@ -14,7 +14,7 @@ import AlignmentEditor from './AlignmentEditor.svelte' import RunnableInputEditor from './inputEditor/RunnableInputEditor.svelte' import TemplateEditor from '$lib/components/TemplateEditor.svelte' - import { ccomponents, components, type AppComponent } from '../component' + import { ccomponents, components } from '../component' import CssProperty from '../componentsPanel/CssProperty.svelte' import GridTab from './GridTab.svelte' import { deleteGridItem, isTableAction } from '../appUtils' @@ -45,7 +45,6 @@ import Badge from '$lib/components/common/badge/Badge.svelte' import { twMerge } from 'tailwind-merge' import Popover from '$lib/components/Popover.svelte' - import { createOnObjChange } from '../../components/helpers/onObjChange' export let componentSettings: { item: GridItem; parent: string | undefined } | undefined = undefined @@ -141,9 +140,6 @@ ? ccomponents[componentSettings?.item?.data?.type]?.initialData?.componentInput : undefined - const onDataChange = createOnObjChange() - $: onDataChange(componentSettings?.item?.data, () => ($app = $app)) - const hasInteraction = componentSettings?.item.data.type ? isTriggerable(componentSettings?.item.data.type) : false diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/script/BackgroundScriptSettings.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/script/BackgroundScriptSettings.svelte index 1b143cfbf0..89ff504f6e 100644 --- a/frontend/src/lib/components/apps/editor/settingsPanel/script/BackgroundScriptSettings.svelte +++ b/frontend/src/lib/components/apps/editor/settingsPanel/script/BackgroundScriptSettings.svelte @@ -6,12 +6,11 @@ import { getContext } from 'svelte' import ScriptSettingsSection from './shared/ScriptSettingsSection.svelte' import ScriptTransformer from './shared/ScriptTransformer.svelte' - import { createOnObjChange } from '$lib/components/apps/components/helpers/onObjChange' export let runnable: HiddenRunnable export let id: string - const { runnableComponents, app } = getContext('AppViewerContext') + const { runnableComponents } = getContext('AppViewerContext') function updateAutoRefresh() { const autoRefresh = runnable.autoRefresh @@ -22,9 +21,6 @@ } } } - - const onDataChange = createOnObjChange() - $: onDataChange(runnable, () => ($app = $app))
diff --git a/frontend/src/lib/components/flows/content/FlowModuleWrapper.svelte b/frontend/src/lib/components/flows/content/FlowModuleWrapper.svelte index 09261baf7d..db5b6f1674 100644 --- a/frontend/src/lib/components/flows/content/FlowModuleWrapper.svelte +++ b/frontend/src/lib/components/flows/content/FlowModuleWrapper.svelte @@ -233,7 +233,7 @@ {#if $selectedId === `${flowModule?.id}-branch-${branchIndex}`} + {:else} {#each branch.modules as _, index} Date: Fri, 4 Apr 2025 19:55:50 +0200 Subject: [PATCH 163/739] fix: app editor svelte 5 fixes (#5570) * fix: properly bind to array elements in Svelte each loops This commit fixes an issue where binding directly to loop variables in Svelte's #each loops doesn't properly update the original array. Instead of binding directly to the loop variable, we now bind to the array elements using index variables. The pattern used is: - Change: {#each arr as el} -> {#each arr as _, index} - Change: bind:value={el} -> bind:value={arr[index]} Modified files: - frontend/src/lib/components/ArrayTypeNarrowing.svelte - frontend/src/lib/components/apps/editor/AppInputs.svelte - frontend/src/lib/components/flows/content/FlowModuleWrapper.svelte * better app settings panel reactivity * fix: app editor table svelte 5 fixes --------- Co-authored-by: Guilhem Co-authored-by: Ruben Fiszel --- .../table/AppAggridExplorerTable.svelte | 3 +- .../display/table/AppAggridTable.svelte | 13 ++------- .../table/AppAggridTableActions.svelte | 29 ++----------------- 3 files changed, 5 insertions(+), 40 deletions(-) diff --git a/frontend/src/lib/components/apps/components/display/table/AppAggridExplorerTable.svelte b/frontend/src/lib/components/apps/components/display/table/AppAggridExplorerTable.svelte index 38a7af9759..e9e5c9599e 100644 --- a/frontend/src/lib/components/apps/components/display/table/AppAggridExplorerTable.svelte +++ b/frontend/src/lib/components/apps/components/display/table/AppAggridExplorerTable.svelte @@ -109,8 +109,7 @@ function refreshActions(actions: TableAction[]) { if (!deepEqual(actions, lastActions)) { - lastActions = [...actions] - + lastActions = structuredClone(actions) updateOptions() } } diff --git a/frontend/src/lib/components/apps/components/display/table/AppAggridTable.svelte b/frontend/src/lib/components/apps/components/display/table/AppAggridTable.svelte index a3e7b9b007..cfe10b8991 100644 --- a/frontend/src/lib/components/apps/components/display/table/AppAggridTable.svelte +++ b/frontend/src/lib/components/apps/components/display/table/AppAggridTable.svelte @@ -202,12 +202,8 @@ function refreshActions(actions: TableAction[]) { if (!deepEqual(actions, lastActions)) { - // structuredClone did not work because it did not copy the array's - // prototype, causing deepEqual to return false although the objects were - // semantically the same - lastActions = [...actions] - // HACK: without setTimeout, the actions mount but aren't visible - setTimeout(updateOptions, 0.5) + lastActions = structuredClone(actions) + updateOptions() } } @@ -459,7 +455,6 @@ } } - let lastComputedColumnDefs: [Record[] | undefined, TableAction[] | undefined] function updateOptions() { try { const columnDefs = @@ -481,10 +476,6 @@ }) } - // Don't update if the columns - if (deepEqual(lastComputedColumnDefs, [columnDefs, actions])) return - lastComputedColumnDefs = [columnDefs, actions] - api?.updateGridOptions({ rowData: value, columnDefs: columnDefs.map((fields) => { diff --git a/frontend/src/lib/components/apps/components/display/table/AppAggridTableActions.svelte b/frontend/src/lib/components/apps/components/display/table/AppAggridTableActions.svelte index 129e534ce2..732569cb69 100644 --- a/frontend/src/lib/components/apps/components/display/table/AppAggridTableActions.svelte +++ b/frontend/src/lib/components/apps/components/display/table/AppAggridTableActions.svelte @@ -1,5 +1,5 @@ {#each actions as action, actionIndex} From 5bd66b3f1fb06f16c601b991a44e9e6f3db7fe00 Mon Sep 17 00:00:00 2001 From: HugoCasa Date: Fri, 4 Apr 2025 20:17:40 +0200 Subject: [PATCH 164/739] select border (#5571) * fix: properly bind to array elements in Svelte each loops This commit fixes an issue where binding directly to loop variables in Svelte's #each loops doesn't properly update the original array. Instead of binding directly to the loop variable, we now bind to the array elements using index variables. The pattern used is: - Change: {#each arr as el} -> {#each arr as _, index} - Change: bind:value={el} -> bind:value={arr[index]} Modified files: - frontend/src/lib/components/ArrayTypeNarrowing.svelte - frontend/src/lib/components/apps/editor/AppInputs.svelte - frontend/src/lib/components/flows/content/FlowModuleWrapper.svelte * better app settings panel reactivity * fix: app editor table svelte 5 fixes * fix: select border --------- Co-authored-by: Guilhem Co-authored-by: Ruben Fiszel --- frontend/src/lib/components/apps/svelte-select/lib/Select.svelte | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/lib/components/apps/svelte-select/lib/Select.svelte b/frontend/src/lib/components/apps/svelte-select/lib/Select.svelte index 3e9684fbbe..41c69cc00a 100644 --- a/frontend/src/lib/components/apps/svelte-select/lib/Select.svelte +++ b/frontend/src/lib/components/apps/svelte-select/lib/Select.svelte @@ -845,6 +845,7 @@ left: 0; background: transparent !important; font-size: var(--font-size, 16px); + border: 0 !important; } :not(.multi) > .value-container > input { From b47c15165f93ca68a58f81cf2b86fc9467155482 Mon Sep 17 00:00:00 2001 From: centdix <40307056+centdix@users.noreply.github.com> Date: Fri, 4 Apr 2025 20:33:57 +0200 Subject: [PATCH 165/739] feat: add windmill context to autocomplete (#5548) * add windmill context to autocomplete * fix formatting * remove console log * do not mention tool call for autocomplete * apply logic to php --------- Co-authored-by: HugoCasa --- frontend/src/lib/components/Editor.svelte | 6 ++++- .../copilot/autocomplete/monaco-adapter.ts | 11 ++++++-- .../copilot/autocomplete/request.ts | 12 ++++++++- .../src/lib/components/copilot/chat/core.ts | 27 ++++++++++++------- 4 files changed, 42 insertions(+), 14 deletions(-) diff --git a/frontend/src/lib/components/Editor.svelte b/frontend/src/lib/components/Editor.svelte index d7be9ec884..c03666b2fe 100644 --- a/frontend/src/lib/components/Editor.svelte +++ b/frontend/src/lib/components/Editor.svelte @@ -635,7 +635,10 @@ if (completorDisposable) { completorDisposable.dispose() } - autocompletor = new Autocompletor(editor, lang) + if (!scriptLang) { + throw new Error('No script lang') + } + autocompletor = new Autocompletor(editor, lang, scriptLang) // last user events (currently disabled): // let lastTs = Date.now() @@ -690,6 +693,7 @@ $codeCompletionSessionEnabled && initialized && editor && + scriptLang && addSuperCompletor(editor) $: $copilotInfo.enabled && initialized && editor && addChatHandler(editor) diff --git a/frontend/src/lib/components/copilot/autocomplete/monaco-adapter.ts b/frontend/src/lib/components/copilot/autocomplete/monaco-adapter.ts index 9c108cc655..8d421b450f 100644 --- a/frontend/src/lib/components/copilot/autocomplete/monaco-adapter.ts +++ b/frontend/src/lib/components/copilot/autocomplete/monaco-adapter.ts @@ -3,6 +3,7 @@ import { type editor as meditor } from 'monaco-editor' import { autocompleteRequest } from './request' import { sleep } from '$lib/utils' import { displayVisualChanges, getLines, setGlobalCSS, type VisualChange } from '../shared' +import type { ScriptLang } from '$lib/gen' function lineChangesToVisualChanges(changes: Change[], startLineNumber: number) { let originalLineNumber = startLineNumber @@ -153,7 +154,7 @@ const MAX_PATCHES = 4 export class Autocompletor { editor: meditor.IStandaloneCodeEditor language: string - + scriptLang: ScriptLang | 'bunnative' viewZoneIds: string[] = [] decorationsCollection: meditor.IEditorDecorationsCollection | undefined = undefined visualChanges: VisualChange[] = [] @@ -188,9 +189,14 @@ export class Autocompletor { | undefined = undefined tabWidget: meditor.IContentWidget | undefined = undefined - constructor(editor: meditor.IStandaloneCodeEditor, language: string) { + constructor( + editor: meditor.IStandaloneCodeEditor, + language: string, + scriptLang: ScriptLang | 'bunnative' + ) { this.editor = editor this.language = language + this.scriptLang = scriptLang this.lastCodeValue = editor.getModel()?.getValue() || '' } @@ -445,6 +451,7 @@ export class Autocompletor { modifiableSuffix, suffix, language: this.language, + scriptLang: this.scriptLang, events: this.patches }, this.abortController diff --git a/frontend/src/lib/components/copilot/autocomplete/request.ts b/frontend/src/lib/components/copilot/autocomplete/request.ts index 1c552e0ce6..b670f5ed06 100644 --- a/frontend/src/lib/components/copilot/autocomplete/request.ts +++ b/frontend/src/lib/components/copilot/autocomplete/request.ts @@ -2,6 +2,8 @@ import { codeCompletionLoading, copilotInfo } from '$lib/stores' import { get } from 'svelte/store' import { getNonStreamingCompletion } from '../lib' +import { getLangContext } from '../chat/core' +import { type ScriptLang } from '$lib/gen/types.gen' const AUTOCOMPLETE_SYSTEM_PROMPT = `You're a code assistant. Your task is to help the user write code by suggesting the next edit for the user. @@ -31,6 +33,9 @@ Follow the following criteria. - Never remove line breaks inside the section.` const AUTOCOMPLETE_USER_PROMPT = ` +WINDMILL LANGUAGE CONTEXT: +{lang_context} + {prefix} {modifiablePrefix}{modifiableSuffix} @@ -59,13 +64,18 @@ export async function autocompleteRequest( modifiableSuffix: string suffix: string language: string + scriptLang: ScriptLang | 'bunnative' events: string[] }, abortController: AbortController ) { codeCompletionLoading.set(true) const systemPrompt = AUTOCOMPLETE_SYSTEM_PROMPT - const userPrompt = AUTOCOMPLETE_USER_PROMPT.replace('{prefix}', context.prefix) + const userPrompt = AUTOCOMPLETE_USER_PROMPT.replace( + '{lang_context}', + getLangContext(context.scriptLang) + ) + .replace('{prefix}', context.prefix) .replace('{modifiablePrefix}', context.modifiablePrefix) .replace('{modifiableSuffix}', context.modifiableSuffix) .replace('{suffix}', context.suffix) diff --git a/frontend/src/lib/components/copilot/chat/core.ts b/frontend/src/lib/components/copilot/chat/core.ts index d315b7c65d..ed5c968b88 100644 --- a/frontend/src/lib/components/copilot/chat/core.ts +++ b/frontend/src/lib/components/copilot/chat/core.ts @@ -58,12 +58,10 @@ async function getResourceTypes(prompt: string, workspace: string) { const TS_RESOURCE_TYPE_SYSTEM = `On Windmill, credentials and configuration are stored in resources and passed as parameters to main. If you need credentials, you should add a parameter to \`main\` with the corresponding resource type inside the \`RT\` namespace: for instance \`RT.Stripe\`. -You should only them if you need them to satisfy the user's instructions. Always use the RT namespace. -To query the RT namespace, you can use the \`search_resource_types\` function.` +You should only use them if you need them to satisfy the user's instructions. Always use the RT namespace.` const PYTHON_RESOURCE_TYPE_SYSTEM = `On Windmill, credentials and configuration are stored in resources and passed as parameters to main. If you need credentials, you should add a parameter to \`main\` with the corresponding resource type. -To query the available resource types, you can use the \`search_resource_types\` function. You need to **redefine** the type of the resources that are needed before the main function as TypedDict, but only include them if they are actually needed to achieve the function purpose. The resource type name has to be exactly as specified (has to be IN LOWERCASE). If an import conflicts with a resource type name, **you have to rename the imported object, not the type name**. @@ -71,7 +69,6 @@ Make sure to import TypedDict from typing **if you're using it**` const PHP_RESOURCE_TYPE_SYSTEM = `On Windmill, credentials and configuration are stored in resources and passed as parameters to main. If you need credentials, you should add a parameter to \`main\` with the corresponding resource type -The available resource types are provided by the user under the \`RESOURCE_TYPE_CONTEXT\` key. You need to **redefine** the type of the resources that are needed before the main function, but only include them if they are actually needed to achieve the function purpose. Before defining each type, check if the class already exists using class_exists. The resource type name has to be exactly as specified.` @@ -95,34 +92,44 @@ export const SUPPORTED_CHAT_SCRIPT_LANGUAGES = [ 'powershell' ] -function getLangContext(lang: ScriptLang | 'bunnative') { +export function getLangContext( + lang: ScriptLang | 'bunnative', + { allowResourcesFetch = false }: { allowResourcesFetch?: boolean } = {} +) { + const tsContext = + TS_RESOURCE_TYPE_SYSTEM + + (allowResourcesFetch + ? `\nTo query the RT namespace, you can use the \`search_resource_types\` function.` + : '') switch (lang) { case 'bunnative': case 'nativets': return ( 'The user is coding in TypeScript. On Windmill, it is expected that the script exports a single **async** function called `main`. You should use fetch (available globally, no need to import) and are not allowed to import any libraries.\n' + - TS_RESOURCE_TYPE_SYSTEM + tsContext ) case 'bun': return ( 'The user is coding in TypeScript (bun runtime). On Windmill, it is expected that the script exports a single **async** function called `main`. Do not call the main function. Libraries are installed automatically, do not show how to install them.\n' + - TS_RESOURCE_TYPE_SYSTEM + tsContext ) case 'deno': return ( 'The user is coding in TypeScript (deno runtime). On Windmill, it is expected that the script exports a single **async** function called `main`. Do not call the main function. Libraries are installed automatically, do not show how to install them.\n' + - TS_RESOURCE_TYPE_SYSTEM + + tsContext + '\nYou can import deno libraries or you can import npm libraries like that: `import ... from "npm:{package}";`.' ) case 'python3': return ( 'The user is coding in Python. On Windmill, it is expected the script contains at least one function called `main`. Do not call the main function. Libraries are installed automatically, do not show how to install them.' + - PYTHON_RESOURCE_TYPE_SYSTEM + PYTHON_RESOURCE_TYPE_SYSTEM + + `${allowResourcesFetch ? `\nTo query the available resource types, you can use the \`search_resource_types\` function.` : ''}` ) case 'php': return ( 'The user is coding in PHP. On Windmill, it is expected the script contains at least one function called `main`. The script must start with Date: Fri, 4 Apr 2025 19:50:17 +0000 Subject: [PATCH 166/739] fix tabs selected behavior change from svelte 5 --- frontend/src/lib/components/common/tabs/Tabs.svelte | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/frontend/src/lib/components/common/tabs/Tabs.svelte b/frontend/src/lib/components/common/tabs/Tabs.svelte index ef7ffb00a3..d6778d334d 100644 --- a/frontend/src/lib/components/common/tabs/Tabs.svelte +++ b/frontend/src/lib/components/common/tabs/Tabs.svelte @@ -28,7 +28,16 @@ const selectedStore = writable(selected) - $: $selectedStore && dispatch('selected', $selectedStore) + $: $selectedStore && onSelectedStoreChange() + + let initial = true + function onSelectedStoreChange() { + if (initial) { + initial = false + return + } + dispatch('selected', $selectedStore) + } $: hashValues = values ? values.map((x) => '#' + x) : undefined setContext('Tabs', { From 0c3cb3700a3fb9b69e396487bd7491dbbd8861c0 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Sat, 5 Apr 2025 10:50:28 +0000 Subject: [PATCH 167/739] fix: fix list jobs by tag --- backend/windmill-api/src/jobs.rs | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/backend/windmill-api/src/jobs.rs b/backend/windmill-api/src/jobs.rs index 15da4f29c8..d2f09cfdc9 100644 --- a/backend/windmill-api/src/jobs.rs +++ b/backend/windmill-api/src/jobs.rs @@ -1447,7 +1447,7 @@ pub fn filter_list_queue_query( sqlb.and_where_eq("created_by", "?".bind(cb)); } if let Some(t) = &lq.tag { - sqlb.and_where_eq("tag", "?".bind(t)); + sqlb.and_where_eq("v2_job.tag", "?".bind(t)); } if let Some(r) = &lq.running { sqlb.and_where_eq("running", &r); @@ -1539,7 +1539,10 @@ pub fn list_queue_jobs_query( .clone(); if let Some(tags) = tags { - sqlb.and_where_in("tag", &tags.iter().map(|x| quote(x)).collect::>()); + sqlb.and_where_in( + "v2_job.tag", + &tags.iter().map(|x| quote(x)).collect::>(), + ); } filter_list_queue_query(sqlb, lq, w_id, join_outstanding_wait_times) @@ -1746,7 +1749,10 @@ async fn list_filtered_uuids( .or_where_is_null("v2_job.trigger_kind"); if let Some(tags) = get_scope_tags(&authed) { - sqlb.and_where_in("tag", &tags.iter().map(|x| quote(x)).collect::>()); + sqlb.and_where_in( + "v2_job.tag", + &tags.iter().map(|x| quote(x)).collect::>(), + ); } sqlb = filter_list_queue_query(sqlb, &lq, w_id.as_str(), false); @@ -1829,7 +1835,7 @@ async fn count_completed_jobs_detail( if let Some(tags) = query.tags { sqlb.and_where_in( - "tag", + "v2_job.tag", &tags .split(",") .map(|t| format!("'{}'", t)) @@ -5469,7 +5475,7 @@ pub fn filter_list_completed_query( sqlb.and_where_eq("runnable_id", "?".bind(h)); } if let Some(t) = &lq.tag { - sqlb.and_where_eq("tag", "?".bind(t)); + sqlb.and_where_eq("v2_job.tag", "?".bind(t)); } if let Some(cb) = &lq.created_by { sqlb.and_where_eq("created_by", "?".bind(cb)); @@ -5570,7 +5576,10 @@ pub fn list_completed_jobs_query( .clone(); if let Some(tags) = tags { - sqlb.and_where_in("tag", &tags.iter().map(|x| quote(x)).collect::>()); + sqlb.and_where_in( + "v2_job.tag", + &tags.iter().map(|x| quote(x)).collect::>(), + ); } filter_list_completed_query(sqlb, lq, w_id, join_outstanding_wait_times) From 102b58a5f40dde22f15700d4b6c11eb7f3fbf4bb Mon Sep 17 00:00:00 2001 From: Alexander Petric Date: Sat, 5 Apr 2025 08:17:26 -0400 Subject: [PATCH 168/739] fix: tenant id to never be undefined on teams (#5572) * fix: tenant id to never be undefined * simplify azure oauth * simplify azure oauth * update ee ref * sqlx prepare * sqlx prepare --- ...4c79b3cbc6413046c3b6099d19f675d8a395b.json | 23 +++++++++++++++++++ ...5ef114772f7d2ee0f60cb1358cdb7f0b5cd0c.json | 23 ------------------- ...508835affcb7679a48f2a443777e829bd1e74.json | 10 ++++---- backend/ee-repo-ref.txt | 2 +- .../lib/components/AzureOauthSettings.svelte | 2 +- .../src/lib/components/OAuthSetting.svelte | 6 ++++- 6 files changed, 35 insertions(+), 31 deletions(-) create mode 100644 backend/.sqlx/query-f955a01779f5441efc6aa9364b24c79b3cbc6413046c3b6099d19f675d8a395b.json delete mode 100644 backend/.sqlx/query-fa59674af1d1a4ceb696fc883005ef114772f7d2ee0f60cb1358cdb7f0b5cd0c.json diff --git a/backend/.sqlx/query-f955a01779f5441efc6aa9364b24c79b3cbc6413046c3b6099d19f675d8a395b.json b/backend/.sqlx/query-f955a01779f5441efc6aa9364b24c79b3cbc6413046c3b6099d19f675d8a395b.json new file mode 100644 index 0000000000..925d8c39f1 --- /dev/null +++ b/backend/.sqlx/query-f955a01779f5441efc6aa9364b24c79b3cbc6413046c3b6099d19f675d8a395b.json @@ -0,0 +1,23 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT EXISTS (SELECT 1\n FROM workspace_settings\n WHERE workspace_id <> $1\n AND slack_command_script IS NOT NULL\n AND slack_team_id = $2\n AND (SELECT slack_command_script IS NOT NULL FROM workspace_settings WHERE workspace_id = $1))\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "exists", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [ + null + ] + }, + "hash": "f955a01779f5441efc6aa9364b24c79b3cbc6413046c3b6099d19f675d8a395b" +} diff --git a/backend/.sqlx/query-fa59674af1d1a4ceb696fc883005ef114772f7d2ee0f60cb1358cdb7f0b5cd0c.json b/backend/.sqlx/query-fa59674af1d1a4ceb696fc883005ef114772f7d2ee0f60cb1358cdb7f0b5cd0c.json deleted file mode 100644 index 917a0910cc..0000000000 --- a/backend/.sqlx/query-fa59674af1d1a4ceb696fc883005ef114772f7d2ee0f60cb1358cdb7f0b5cd0c.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT EXISTS (SELECT 1 \n FROM workspace_settings \n WHERE workspace_id <> $1 \n AND slack_command_script IS NOT NULL\n AND slack_team_id = $2\n AND (SELECT slack_command_script IS NOT NULL FROM workspace_settings WHERE workspace_id = $1))\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "exists", - "type_info": "Bool" - } - ], - "parameters": { - "Left": [ - "Text", - "Text" - ] - }, - "nullable": [ - null - ] - }, - "hash": "fa59674af1d1a4ceb696fc883005ef114772f7d2ee0f60cb1358cdb7f0b5cd0c" -} diff --git a/backend/.sqlx/query-fec6d5674dc6b5a6a0ece419c40508835affcb7679a48f2a443777e829bd1e74.json b/backend/.sqlx/query-fec6d5674dc6b5a6a0ece419c40508835affcb7679a48f2a443777e829bd1e74.json index 649ab85650..de2e819af2 100644 --- a/backend/.sqlx/query-fec6d5674dc6b5a6a0ece419c40508835affcb7679a48f2a443777e829bd1e74.json +++ b/backend/.sqlx/query-fec6d5674dc6b5a6a0ece419c40508835affcb7679a48f2a443777e829bd1e74.json @@ -41,11 +41,11 @@ ] }, "nullable": [ - false, - false, - false, - false, - false, + true, + true, + true, + true, + true, true ] }, diff --git a/backend/ee-repo-ref.txt b/backend/ee-repo-ref.txt index 933b24a492..fa6472967e 100644 --- a/backend/ee-repo-ref.txt +++ b/backend/ee-repo-ref.txt @@ -1 +1 @@ -94cbac33756c1fba56da037456f44a4d294475b1 \ No newline at end of file +619f7dcd1097bfcd2f8b85f2075782219ff76be1 \ No newline at end of file diff --git a/frontend/src/lib/components/AzureOauthSettings.svelte b/frontend/src/lib/components/AzureOauthSettings.svelte index 8cb7cb91c8..47f6390a82 100644 --- a/frontend/src/lib/components/AzureOauthSettings.svelte +++ b/frontend/src/lib/components/AzureOauthSettings.svelte @@ -10,7 +10,7 @@ extra_params: { tenant_id: string } extra_params_callback: Record } = { - scopes: [], + scopes: ['offline_access'], auth_url: '', token_url: '', req_body_auth: true, diff --git a/frontend/src/lib/components/OAuthSetting.svelte b/frontend/src/lib/components/OAuthSetting.svelte index ad097fd7c1..5d25c26ead 100644 --- a/frontend/src/lib/components/OAuthSetting.svelte +++ b/frontend/src/lib/components/OAuthSetting.svelte @@ -71,7 +71,11 @@ disabled={eeOnly && !$enterpriseLicense} on:change={(e) => { if (e.detail) { - value = { id: '', secret: '' } + if (name === 'teams' || name === 'microsoft') { + value = { id: '', secret: '', tenant: '' } + } else { + value = { id: '', secret: '' } + } } else { value = undefined } From 3507925624a43804a3be463b6f7913cea5821384 Mon Sep 17 00:00:00 2001 From: HugoCasa Date: Sat, 5 Apr 2025 15:35:04 +0200 Subject: [PATCH 169/739] fix: legacy script gen model selection (#5574) --- .../lib/components/copilot/ScriptGen.svelte | 41 +++---------------- 1 file changed, 5 insertions(+), 36 deletions(-) diff --git a/frontend/src/lib/components/copilot/ScriptGen.svelte b/frontend/src/lib/components/copilot/ScriptGen.svelte index a9f342eaa1..a0b141d86d 100644 --- a/frontend/src/lib/components/copilot/ScriptGen.svelte +++ b/frontend/src/lib/components/copilot/ScriptGen.svelte @@ -8,13 +8,7 @@ import type Editor from '../Editor.svelte' import Popover from '$lib/components/meltComponents/Popover.svelte' import TooltipV2 from '$lib/components/meltComponents/Tooltip.svelte' - import { - dbSchemas, - copilotInfo, - type DBSchema, - workspaceStore, - copilotSessionModel - } from '$lib/stores' + import { dbSchemas, copilotInfo, type DBSchema, workspaceStore } from '$lib/stores' import type DiffEditor from '../DiffEditor.svelte' import { scriptLangToEditorLang } from '$lib/scripts' import type SimpleEditor from '../SimpleEditor.svelte' @@ -31,6 +25,7 @@ import { isInitialCode } from '$lib/script_helpers' import { twMerge } from 'tailwind-merge' import { onDestroy } from 'svelte' + import ProviderModelSelector from './chat/ProviderModelSelector.svelte' // props export let iconOnly: boolean = false @@ -333,7 +328,7 @@ setTimeout(() => { autoResize() }, 0) - }} + }} bind:element={button} iconOnly title="Generate code from prompt" @@ -366,7 +361,7 @@ setTimeout(() => { autoResize() }, 0) - }} + }} bind:element={button} {iconOnly} > @@ -404,33 +399,7 @@ -
- - {#if $copilotInfo.aiModels.length > 1} - - {:else if $copilotInfo.aiModels.length === 1} -
- {$copilotInfo.aiModels[0].model} -
- {/if} - - {$copilotInfo.aiModels.length > 1 - ? $copilotSessionModel - : $copilotInfo.aiModels[0].model} - -
-
+
+ {:else if fieldType === 'date'} {:else if fieldType === 'time'} @@ -135,7 +141,72 @@ {:else if fieldType === 'color'} {:else if fieldType === 'object' || fieldType == 'labeledselect'} - {#if format?.startsWith('resource-') && (componentInput.value == undefined || typeof componentInput.value == 'string')} + {#if format && format.split('-').length > 1 && format + .replace('resource-', '') + .replace('_', '') + .toLowerCase() == 's3object'} +
+ + {#if s3FileUploadRawMode} + {#await import('$lib/components/JsonEditor.svelte')} + + {:then Module} + + {/await} + {:else} + { + if (componentInput) { + componentInput.value = { + s3: evt.detail?.path ?? '', + filename: evt.detail?.filename ?? '' + } + s3FileUploadRawMode = true + } + }} + on:deletion={(evt) => { + if (componentInput) { + componentInput.value = { + s3: '' + } + } + }} + /> + {/if} + +
+ { + if (componentInput?.value?.s3) { + s3FileUploadRawMode = true + } + }} + bind:selectedFileKey={componentInput.value} + /> + {:else if format?.startsWith('resource-') && (componentInput.value == undefined || typeof componentInput.value == 'string')} { diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/inputEditor/UploadInputEditor.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/inputEditor/UploadInputEditor.svelte index 4758d1f357..85d975278b 100644 --- a/frontend/src/lib/components/apps/editor/settingsPanel/inputEditor/UploadInputEditor.svelte +++ b/frontend/src/lib/components/apps/editor/settingsPanel/inputEditor/UploadInputEditor.svelte @@ -15,6 +15,7 @@ export let s3: boolean | undefined = false export let prefix: string | undefined = undefined export let workspace: string | undefined = undefined + export let s3FileUploadRawMode: boolean = false let fileUploads: Writable = writable([]) @@ -38,11 +39,13 @@ return `${cleanPrefix}${file.name}` }} on:addition={({ detail }) => { + // @ts-ignore componentInput = { ...componentInput, - type: 'static', - value: `s3://${detail.path}` + type: 'uploadS3', + value: { s3: detail.path } } + s3FileUploadRawMode = true }} /> {:else} diff --git a/frontend/src/lib/components/apps/inputType.ts b/frontend/src/lib/components/apps/inputType.ts index 4bc2fc8532..e348300628 100644 --- a/frontend/src/lib/components/apps/inputType.ts +++ b/frontend/src/lib/components/apps/inputType.ts @@ -78,7 +78,7 @@ export type UploadInput = { export type UploadS3Input = { type: 'uploadS3' - value: string + value: any } export type FileUploadData = { diff --git a/frontend/src/lib/components/common/fileDownload/FileDownload.svelte b/frontend/src/lib/components/common/fileDownload/FileDownload.svelte index 519acbb1d9..ec94243179 100644 --- a/frontend/src/lib/components/common/fileDownload/FileDownload.svelte +++ b/frontend/src/lib/components/common/fileDownload/FileDownload.svelte @@ -15,9 +15,9 @@ focus-within:border-blue-500 hover:bg-blue-50 dark:hover:bg-frost-900 focus-with duration-200 rounded-lg p-1 gap-2" href={`${base}/api/w/${workspaceId ?? $workspaceStore}${ appPath ? `/apps_u/download_s3_file/${appPath}` : '/job_helpers/download_s3_file' - }?file_key=${encodeURIComponent(s3object?.s3 ?? '')}${ + }?${appPath ? 's3' : 'file_key'}=${encodeURIComponent(s3object?.s3 ?? '')}${ s3object?.storage ? `&storage=${s3object.storage}` : '' - }`} + }${appPath && s3object?.presigned ? `&${s3object.presigned}` : ''}`} download={s3object?.s3.split('/').pop() ?? 'unnamed_download.file'} > diff --git a/frontend/src/lib/components/common/fileUpload/FileUpload.svelte b/frontend/src/lib/components/common/fileUpload/FileUpload.svelte index 1d2555f577..9e5180b76c 100644 --- a/frontend/src/lib/components/common/fileUpload/FileUpload.svelte +++ b/frontend/src/lib/components/common/fileUpload/FileUpload.svelte @@ -19,8 +19,8 @@ export let containerText: string = folderOnly ? 'Drag and drop a folder here or click to browse' : allowMultiple - ? 'Drag and drop files here or click to browse' - : 'Drag and drop a file here or click to browse' + ? 'Drag and drop files here or click to browse' + : 'Drag and drop a file here or click to browse' export let customResourcePath: string | undefined = undefined export let customResourceType: 's3' | 'azure_blob' | undefined = undefined // when customResourcePath is provided, this should be provided as well. Will default to S3 if not export let customClass: string = '' @@ -70,7 +70,10 @@ | undefined) | undefined = undefined - const dispatch = createEventDispatcher() + const dispatch = createEventDispatcher<{ + addition: { path?: string; filename?: string } + deletion: { path: string } + }>() type FileUploadData = { name: string @@ -146,9 +149,9 @@ } else { path = typeof pathTransformer == 'function' - ? (await pathTransformer?.({ + ? ((await pathTransformer?.({ file: fileToUpload - })) ?? fileToUploadKey + })) ?? fileToUploadKey) : fileToUploadKey } const uploadData: FileUploadData = { @@ -269,10 +272,10 @@ appPath ? `/api/w/${ workspace ?? $workspaceStore - }/apps_u/upload_s3_file/${appPath}?${params.toString()}` + }/apps_u/upload_s3_file/${appPath}?${params.toString()}` : `/api/w/${ workspace ?? $workspaceStore - }/job_helpers/upload_s3_file?${params.toString()}`, + }/job_helpers/upload_s3_file?${params.toString()}`, true ) xhr?.setRequestHeader('Content-Type', 'application/octet-stream') @@ -469,10 +472,10 @@ color={fileUpload.errorMessage ? '#ef4444' : fileUpload.cancelled - ? '#eab308' - : fileUpload.progress === 100 - ? '#22c55e' - : '#3b82f6'} + ? '#eab308' + : fileUpload.progress === 100 + ? '#22c55e' + : '#3b82f6'} ended={fileUpload.cancelled || fileUpload.errorMessage !== undefined} > {#if fileUpload.errorMessage} diff --git a/frontend/src/lib/components/multiselect/MultiSelect.svelte b/frontend/src/lib/components/multiselect/MultiSelect.svelte index 5bf1a96ed3..1e4f00c66d 100644 --- a/frontend/src/lib/components/multiselect/MultiSelect.svelte +++ b/frontend/src/lib/components/multiselect/MultiSelect.svelte @@ -572,7 +572,7 @@ {/if} {/if} - {#if (searchText && noMatchingOptionsMsg) || options?.length > 0} + {#if allowUserOptions || (searchText && noMatchingOptionsMsg) || options?.length > 0}
0) { + $: if (portalRef && outerDiv && (allowUserOptions || items?.length > 0)) { tick().then(() => { moveOptionsToPortal() }) @@ -53,6 +53,7 @@ {#if !value || Array.isArray(value)}
{/if} @@ -385,20 +385,6 @@ code={JSON.stringify(static_asset_config ?? { s3: '' }, null, 2)} /> {/if} - {#if can_write} - - {/if} {:else} {#key is_static_website} {/key} {/if} + {#if can_write} + + {/if}
{:else} @@ -612,10 +612,10 @@ href={itemKind === 'flow' ? `/flows/add?${SECRET_KEY_PATH}=${encodeURIComponent(variable_path)}&hub=${ HubFlow.SIGNATURE_TEMPLATE - }` + }` : `/scripts/add?${SECRET_KEY_PATH}=${encodeURIComponent( variable_path - )}&hub=hub%2F${HUB_SCRIPT_ID}`} + )}&hub=hub%2F${HUB_SCRIPT_ID}`} target="_blank">Create from template
diff --git a/frontend/src/lib/components/workspaceSettings/AISettings.svelte b/frontend/src/lib/components/workspaceSettings/AISettings.svelte index 614d74faaf..d4ed2d7dd8 100644 --- a/frontend/src/lib/components/workspaceSettings/AISettings.svelte +++ b/frontend/src/lib/components/workspaceSettings/AISettings.svelte @@ -2,7 +2,6 @@ import { WorkspaceService, type AIConfig, type AIProvider } from '$lib/gen' import { setCopilotInfo, workspaceStore } from '$lib/stores' import { sendUserToast } from '$lib/toast' - import MultiSelect from 'svelte-multiselect' import { AI_DEFAULT_MODELS } from '../copilot/lib' import TestAiKey from '../copilot/TestAIKey.svelte' import Description from '../Description.svelte' @@ -11,6 +10,7 @@ import Toggle from '../Toggle.svelte' import ArgEnum from '../ArgEnum.svelte' import Button from '../common/button/Button.svelte' + import MultiSelectWrapper from '../multiselect/MultiSelectWrapper.svelte' const aiProviderLabels: [AIProvider, string][] = [ ['openai', 'OpenAI'], @@ -122,6 +122,22 @@ aiProviders = Object.fromEntries( Object.entries(aiProviders).filter(([key]) => key !== provider) ) + if (defaultModel) { + const currentDefaultModel = Object.values(aiProviders).find( + (p) => defaultModel && p.models.includes(defaultModel) + ) + if (!currentDefaultModel) { + defaultModel = undefined + } + } + if (codeCompletionModel) { + const currentCodeCompletionModel = Object.values(aiProviders).find( + (p) => codeCompletionModel && p.models.includes(codeCompletionModel) + ) + if (!currentCodeCompletionModel) { + codeCompletionModel = undefined + } + } } }} /> @@ -139,8 +155,8 @@ bind:value={aiProviders[provider].resource_path} on:change={() => { if ( - aiProviders[provider].resource_path && - aiProviders[provider].models.length === 0 && + aiProviders[provider]?.resource_path && + aiProviders[provider]?.models.length === 0 && AI_DEFAULT_MODELS[provider].length > 0 ) { aiProviders[provider].models = AI_DEFAULT_MODELS[provider].slice(0, 1) @@ -158,11 +174,11 @@
@@ -177,16 +193,18 @@

Settings

diff --git a/frontend/src/lib/components/workspaceSettings/StorageSettings.svelte b/frontend/src/lib/components/workspaceSettings/StorageSettings.svelte new file mode 100644 index 0000000000..51caaa1a42 --- /dev/null +++ b/frontend/src/lib/components/workspaceSettings/StorageSettings.svelte @@ -0,0 +1,252 @@ + + + + + + +
+
+
Workspace Object Storage (S3/Azure Blob)
+ + Connect your Windmill workspace to your S3 bucket or your Azure Blob storage to enable users + to read and write from S3 without having to have access to the credentials. + +
+
+{#if !$enterpriseLicense} + + Windmill S3 bucket browser will not work for buckets containing more than 20 files and uploads + are limited to files {'<'} 50MB. Consider upgrading to Windmill EE to use this feature with large + buckets. + +{:else} + + This setting is only for storage of large files allowing to upload files directly to object + storage using S3Object and use the wmill sdk to read and write large files backed by an object + storage. Large-scale log management and distributed dependency caching is under
Instance object storage, set by the superadmins in the instance settings UI. + +{/if} +{#if s3ResourceSettings} +
+
+ + + + S3 + Azure Blob + AWS OIDC + Azure Workload Identity + +
+
+ + + + +
+
+ {#if s3ResourceSettings.resourceType == 's3'} +
+ + + + {#if s3ResourceSettings.publicResource === true} +
+ + + S3 resource public access is ON, which means that the entire content of the S3 bucket will + be accessible to all the users of this workspace regardless of whether they have access + the resource or not. Similarly, certain Windmill SDK endpoints can be used in scripts to + access the resource details, including public and private keys. + + {/if} +
+ {:else} +
+ + + + {#if s3ResourceSettings.publicResource === true} +
+ + object public access is ON, which means that the entire content of the object store will + be accessible to all the users of this workspace regardless of whether they have access + the resource or not. + + {/if} +
+ {/if} +
+
+ {#each s3ResourceSettings.secondaryStorage ?? [] as _, idx} +
+ s3ResourceSettings.secondaryStorage?.[idx]?.[0] || '', + (v) => { + if (s3ResourceSettings.secondaryStorage?.[idx]) { + s3ResourceSettings.secondaryStorage[idx][0] = v + } + } + } + placeholder="Storage name" + /> + + + + s3ResourceSettings.secondaryStorage?.[idx]?.[1].resourcePath || '', + (v) => { + if (s3ResourceSettings.secondaryStorage?.[idx]) { + s3ResourceSettings.secondaryStorage[idx][1].resourcePath = v + } + } + } + /> + + +
+ {/each} +
+ + + Secondary storage is a feature that allows you to read and write from storage that isn't + your main storage by specifying it in the s3 object as "secondary_storage" with the name + of it + +
+
+
+
+ +
+{/if} diff --git a/frontend/src/routes/(root)/(logged)/workspace_settings/+page.svelte b/frontend/src/routes/(root)/(logged)/workspace_settings/+page.svelte index 2809592688..a672288ff2 100644 --- a/frontend/src/routes/(root)/(logged)/workspace_settings/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/workspace_settings/+page.svelte @@ -10,7 +10,6 @@ import PageHeader from '$lib/components/PageHeader.svelte' import ResourcePicker from '$lib/components/ResourcePicker.svelte' import ScriptPicker from '$lib/components/ScriptPicker.svelte' - import S3FilePicker from '$lib/components/S3FilePicker.svelte' import Tooltip from '$lib/components/Tooltip.svelte' import WorkspaceUserSettings from '$lib/components/settings/WorkspaceUserSettings.svelte' @@ -46,7 +45,6 @@ import PremiumInfo from '$lib/components/settings/PremiumInfo.svelte' import Toggle from '$lib/components/Toggle.svelte' - import Portal from '$lib/components/Portal.svelte' import { fade } from 'svelte/transition' import ChangeWorkspaceName from '$lib/components/settings/ChangeWorkspaceName.svelte' @@ -54,14 +52,14 @@ import ChangeWorkspaceColor from '$lib/components/settings/ChangeWorkspaceColor.svelte' import { convertBackendSettingsToFrontendSettings, - convertFrontendToBackendSetting, type S3ResourceSettings } from '$lib/workspace_settings' import { base } from '$lib/base' import { hubPaths } from '$lib/hub' import Description from '$lib/components/Description.svelte' import ConnectionSection from '$lib/components/ConnectionSection.svelte' - import AiSettings from '$lib/components/workspaceSettings/AISettings.svelte' + import AISettings from '$lib/components/workspaceSettings/AISettings.svelte' + import StorageSettings from '$lib/components/workspaceSettings/StorageSettings.svelte' type GitSyncTypeMap = { scripts: boolean @@ -89,8 +87,6 @@ | 'user' | 'group' - let s3FileViewer: S3FilePicker - let slackInitialPath: string let slackScriptPath: string let teamsInitialPath: string @@ -212,18 +208,6 @@ } } - async function editWindmillLFSSettings(): Promise { - const large_file_storage = convertFrontendToBackendSetting(s3ResourceSettings) - await WorkspaceService.editLargeFileStorageConfig({ - workspace: $workspaceStore!, - requestBody: { - large_file_storage: large_file_storage - } - }) - console.log('Large file storage settings changed', large_file_storage) - sendUserToast(`Large file storage settings changed`) - } - async function editWindmillGitSyncSettings(): Promise { let alreadySeenResource: string[] = [] let repositories = gitSyncSettings.repositories.map((elmt) => { @@ -629,10 +613,6 @@ $: updateFromSearchTab($page.url.searchParams.get('tab')) - - - - {#if $userStore?.is_admin || $superadmin}
{:else if tab == 'ai'} - {:else if tab == 'windmill_lfs'} -
-
-
Workspace Object Storage (S3/Azure Blob)
- - Connect your Windmill workspace to your S3 bucket or your Azure Blob storage to enable - users to read and write from S3 without having to have access to the credentials. - -
-
- {#if !$enterpriseLicense} - - Windmill S3 bucket browser will not work for buckets containing more than 20 files and - uploads are limited to files {'<'} 50MB. Consider upgrading to Windmill EE to use this feature - with large buckets. - - {:else} - - This setting is only for storage of large files allowing to upload files directly to - object storage using S3Object and use the wmill sdk to read and write large files backed - by an object storage. Large-scale log management and distributed dependency caching is - under Instance object storage, set by the superadmins in the instance settings UI. - - {/if} - {#if s3ResourceSettings} -
-
- - S3 - Azure Blob - AWS OIDC - Azure Workload Identity - -
-
- - -
-
- {#if s3ResourceSettings.resourceType == 's3'} -
- - {#if s3ResourceSettings.publicResource === true} -
- - - S3 resource public access is ON, which means that the entire content of the S3 - bucket will be accessible to all the users of this workspace regardless of whether - they have access the resource or not. Similarly, certain Windmill SDK endpoints can - be used in scripts to access the resource details, including public and private - keys. - - {/if} -
- {:else} -
- - {#if s3ResourceSettings.publicResource === true} -
- - object public access is ON, which means that the entire content of the object store - will be accessible to all the users of this workspace regardless of whether they - have access the resource or not. - - {/if} -
- {/if} -
-
- {#each s3ResourceSettings.secondaryStorage ?? [] as secondaryStorage, idx} -
- - - - - -
- {/each} -
- - - Secondary storage is a feature that allows you to read and write from storage that - isn't your main storage by specifying it in the s3 object as "secondary_storage" - with the name of it - -
-
-
-
- -
- {/if} + {:else if tab == 'git_sync'}
diff --git a/python-client/wmill/wmill/client.py b/python-client/wmill/wmill/client.py index e1f16765ff..bca007b438 100644 --- a/python-client/wmill/wmill/client.py +++ b/python-client/wmill/wmill/client.py @@ -586,6 +586,12 @@ class Windmill: raise Exception("Could not write file to S3") from e return S3Object(s3=response["file_key"]) + def sign_s3_objects(self, s3_objects: list[S3Object]) -> list[S3Object]: + return self.post(f"/w/{self.workspace}/apps/sign_s3_objects", json={"s3_objects": s3_objects}).json() + + def sign_s3_object(self, s3_object: S3Object) -> S3Object: + return self.post(f"/w/{self.workspace}/apps/sign_s3_objects", json={"s3_objects": [s3_object]}).json()[0] + def __boto3_connection_settings(self, s3_resource) -> Boto3ConnectionSettings: endpoint_url_prefix = "https://" if s3_resource["useSSL"] else "http://" return Boto3ConnectionSettings( @@ -974,6 +980,24 @@ def write_s3_file( return _client.write_s3_file(s3object, file_content, s3_resource_path if s3_resource_path != "" else None, content_type, content_disposition) +@init_global_client +def sign_s3_objects(s3_objects: list[S3Object]) -> list[S3Object]: + """ + Sign S3 objects to be used by anonymous users in public apps + Returns a list of signed s3 tokens + """ + return _client.sign_s3_objects(s3_objects) + + +@init_global_client +def sign_s3_object(s3_object: S3Object) -> S3Object: + """ + Sign S3 object to be used by anonymous users in public apps + Returns a signed s3 object + """ + return _client.sign_s3_object(s3_object) + + @init_global_client def whoami() -> dict: """ diff --git a/python-client/wmill/wmill/s3_types.py b/python-client/wmill/wmill/s3_types.py index f633532591..b1736db9e9 100644 --- a/python-client/wmill/wmill/s3_types.py +++ b/python-client/wmill/wmill/s3_types.py @@ -1,6 +1,7 @@ class S3Object(dict): s3: str storage: str | None + presigned: str | None def __getattr__(self, attr): return self[attr] diff --git a/typescript-client/build.jsr.sh b/typescript-client/build.jsr.sh index 4d2859f204..06dae6605b 100755 --- a/typescript-client/build.jsr.sh +++ b/typescript-client/build.jsr.sh @@ -14,5 +14,5 @@ cp "${script_dirpath}/s3Types.ts" "${script_dirpath}/src/" echo "" >> "${script_dirpath}/src/index.ts" echo 'export type { S3Object, DenoS3LightClientSettings } from "./s3Types";' >> "${script_dirpath}/src/index.ts" echo "" >> "${script_dirpath}/src/index.ts" -echo 'export { type Base64, setClient, getVariable, setVariable, getResource, setResource, getResumeUrls, setState, getState, getIdToken, denoS3LightClientSettings, loadS3FileStream, loadS3File, writeS3File, task, runScript, runScriptAsync, runFlow, runFlowAsync, waitJob, getRootJobId, setFlowUserState, getFlowUserState, usernameToEmail, requestInteractiveSlackApproval, Sql } from "./client";' >> "${script_dirpath}/src/index.ts" +echo 'export { type Base64, setClient, getVariable, setVariable, getResource, setResource, getResumeUrls, setState, getState, getIdToken, denoS3LightClientSettings, loadS3FileStream, loadS3File, writeS3File, signS3Objects, signS3Object, task, runScript, runScriptAsync, runFlow, runFlowAsync, waitJob, getRootJobId, setFlowUserState, getFlowUserState, usernameToEmail, requestInteractiveSlackApproval, Sql } from "./client";' >> "${script_dirpath}/src/index.ts" diff --git a/typescript-client/build.sh b/typescript-client/build.sh index 73e2486d6b..5f9cdbc4ec 100755 --- a/typescript-client/build.sh +++ b/typescript-client/build.sh @@ -39,4 +39,4 @@ cp "${script_dirpath}/s3Types.ts" "${script_dirpath}/src/" echo "" >> "${script_dirpath}/src/index.ts" echo 'export type { S3Object, DenoS3LightClientSettings } from "./s3Types";' >> "${script_dirpath}/src/index.ts" echo "" >> "${script_dirpath}/src/index.ts" -echo 'export { type Base64, setClient, getVariable, setVariable, getResource, setResource, getResumeUrls, setState, setProgress, getProgress, getState, getIdToken, denoS3LightClientSettings, loadS3FileStream, loadS3File, writeS3File, task, runScript, runScriptAsync, runFlow, runFlowAsync, waitJob, getRootJobId, setFlowUserState, getFlowUserState, usernameToEmail, requestInteractiveSlackApproval, Sql } from "./client";' >> "${script_dirpath}/src/index.ts" +echo 'export { type Base64, setClient, getVariable, setVariable, getResource, setResource, getResumeUrls, setState, setProgress, getProgress, getState, getIdToken, denoS3LightClientSettings, loadS3FileStream, loadS3File, writeS3File, signS3Objects, signS3Object, task, runScript, runScriptAsync, runFlow, runFlowAsync, waitJob, getRootJobId, setFlowUserState, getFlowUserState, usernameToEmail, requestInteractiveSlackApproval, Sql } from "./client";' >> "${script_dirpath}/src/index.ts" diff --git a/typescript-client/client.ts b/typescript-client/client.ts index 37fd4c9df6..258ea76215 100644 --- a/typescript-client/client.ts +++ b/typescript-client/client.ts @@ -3,10 +3,11 @@ import { VariableService, JobService, HelpersService, + AppService, MetricsService, OidcService, UserService, - TeamsService + TeamsService, } from "./index"; import { OpenAPI } from "./index"; // import type { DenoS3LightClientSettings } from "./index"; @@ -770,6 +771,33 @@ export async function writeS3File( }; } +/** + * Sign S3 objects to be used by anonymous users in public apps + * @param s3objects s3 objects to sign + * @returns signed s3 objects + */ +export async function signS3Objects( + s3objects: S3Object[] +): Promise { + const signedKeys = await AppService.signS3Objects({ + workspace: getWorkspace(), + requestBody: { + s3_objects: s3objects, + }, + }); + return signedKeys; +} + +/** + * Sign S3 object to be used by anonymous users in public apps + * @param s3object s3 object to sign + * @returns signed s3 object + */ +export async function signS3Object(s3object: S3Object): Promise { + const [signedObject] = await signS3Objects([s3object]); + return signedObject; +} + /** * Get URLs needed for resuming a flow after this step * @param approver approver name diff --git a/typescript-client/s3Types.ts b/typescript-client/s3Types.ts index 16641477d4..a46248d778 100644 --- a/typescript-client/s3Types.ts +++ b/typescript-client/s3Types.ts @@ -1,6 +1,7 @@ export type S3Object = { s3: string; storage?: string; + presigned?: string; }; export type DenoS3LightClientSettings = { From 39ebe18607c21fe1806618c5063e691e2da3e124 Mon Sep 17 00:00:00 2001 From: Guilhem Date: Fri, 11 Apr 2025 17:20:24 +0100 Subject: [PATCH 198/739] allow 0ms duration for flows (#5608) --- frontend/src/lib/components/FlowTimeline.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/lib/components/FlowTimeline.svelte b/frontend/src/lib/components/FlowTimeline.svelte index a5a444ac54..968b1bc612 100644 --- a/frontend/src/lib/components/FlowTimeline.svelte +++ b/frontend/src/lib/components/FlowTimeline.svelte @@ -72,7 +72,7 @@ } if (!isStillRunning) { - if (v.started_at && v.duration_ms) { + if (v.started_at && v.duration_ms != undefined) { let lmax = v.started_at + v.duration_ms if (!nmax) { nmax = lmax From 177e16bb18eed0d1c454b967aaa59547f61e8d26 Mon Sep 17 00:00:00 2001 From: Alexander Petric Date: Fri, 11 Apr 2025 13:42:22 -0400 Subject: [PATCH 199/739] feat(frontend): app editor code input component (monaco) (#5566) * feat(frontend): app editor code input component (monaco) * only import when needed + svelte 5 * simple editor -> svelte5 * removing unneccessary rename * fix vimMode * nit fixes * fix height * rm global * add html support --------- Co-authored-by: Ruben Fiszel --- frontend/package-lock.json | 10 + frontend/package.json | 1 + .../src/lib/components/SimpleEditor.svelte | 186 ++++++++++++++---- .../inputs/AppCodeInputComponent.svelte | 104 ++++++++++ .../editor/component/ComponentInner.svelte | 3 + .../apps/editor/component/components.ts | 64 +++++- .../components/apps/editor/component/sets.ts | 1 + .../componentsPanel/componentControlUtils.ts | 1 + .../apps/editor/componentsPanel/cssUtils.ts | 13 ++ .../componentsPanel/quickStyleProperties.ts | 3 + 10 files changed, 344 insertions(+), 42 deletions(-) create mode 100644 frontend/src/lib/components/apps/components/inputs/AppCodeInputComponent.svelte diff --git a/frontend/package-lock.json b/frontend/package-lock.json index c7127b4173..4ca3ed9a53 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -12,6 +12,7 @@ "@aws-crypto/sha256-js": "^4.0.0", "@codingame/monaco-vscode-configuration-service-override": "~11.1.2", "@codingame/monaco-vscode-standalone-css-language-features": "~11.1.2", + "@codingame/monaco-vscode-standalone-html-language-features": "^11.1.2", "@codingame/monaco-vscode-standalone-json-language-features": "~11.1.2", "@codingame/monaco-vscode-standalone-languages": "~11.1.2", "@codingame/monaco-vscode-standalone-typescript-language-features": "~11.1.2", @@ -567,6 +568,15 @@ "monaco-editor": "npm:@codingame/monaco-vscode-editor-api@11.1.2" } }, + "node_modules/@codingame/monaco-vscode-standalone-html-language-features": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-standalone-html-language-features/-/monaco-vscode-standalone-html-language-features-11.1.2.tgz", + "integrity": "sha512-PHRiZRH9ENI7hBJ7b+VSk78TCfQNqGVaS/fbr3jHcS98ohHdlfTRry/Kl1CT7aRIZj7yV9iNWX57hN+lzPp2vg==", + "license": "MIT", + "dependencies": { + "monaco-editor": "npm:@codingame/monaco-vscode-editor-api@11.1.2" + } + }, "node_modules/@codingame/monaco-vscode-standalone-json-language-features": { "version": "11.1.2", "license": "MIT", diff --git a/frontend/package.json b/frontend/package.json index d2cb878ce5..f8ceffa287 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -85,6 +85,7 @@ "@aws-crypto/sha256-js": "^4.0.0", "@codingame/monaco-vscode-configuration-service-override": "~11.1.2", "@codingame/monaco-vscode-standalone-css-language-features": "~11.1.2", + "@codingame/monaco-vscode-standalone-html-language-features": "^11.1.2", "@codingame/monaco-vscode-standalone-json-language-features": "~11.1.2", "@codingame/monaco-vscode-standalone-languages": "~11.1.2", "@codingame/monaco-vscode-standalone-typescript-language-features": "~11.1.2", diff --git a/frontend/src/lib/components/SimpleEditor.svelte b/frontend/src/lib/components/SimpleEditor.svelte index cc3f120092..a7f390170c 100644 --- a/frontend/src/lib/components/SimpleEditor.svelte +++ b/frontend/src/lib/components/SimpleEditor.svelte @@ -1,12 +1,12 @@ - + + + + + +{#each Object.keys(components['codeinputcomponent'].initialData.configuration) as key (key)} + +{/each} + +{#if render} +
{ + e.stopPropagation() + if (!$connectingInput.opened) { + $selectedComponent = [id] + } + }} + > + {#await import('$lib/components/SimpleEditor.svelte')} +
+
Loading editor...
+
+ {:then Module} + + {/await} +
+{/if} + + diff --git a/frontend/src/lib/components/apps/editor/component/ComponentInner.svelte b/frontend/src/lib/components/apps/editor/component/ComponentInner.svelte index 71e3b3cf43..acbe2d5b83 100644 --- a/frontend/src/lib/components/apps/editor/component/ComponentInner.svelte +++ b/frontend/src/lib/components/apps/editor/component/ComponentInner.svelte @@ -44,6 +44,7 @@ import AppTable from '../../components/display/table/AppTable.svelte' import AppAggridTable from '../../components/display/table/AppAggridTable.svelte' import AppText from '../../components/display/AppText.svelte' + import AppCodeInputComponent from '../../components/inputs/AppCodeInputComponent.svelte' import AppButton from '../../components/buttons/AppButton.svelte' import AppForm from '../../components/buttons/AppForm.svelte' import AppFormButton from '../../components/buttons/AppFormButton.svelte' @@ -295,6 +296,8 @@ componentInput={component.componentInput} {render} /> +{:else if component.type === 'codeinputcomponent'} + {:else if component.type === 'buttoncomponent'} export type TextInputComponent = BaseComponent<'textinputcomponent'> export type QuillComponent = BaseComponent<'quillcomponent'> +export type CodeInputComponent = BaseComponent<'codeinputcomponent'> export type TextareaInputComponent = BaseComponent<'textareainputcomponent'> export type PasswordInputComponent = BaseComponent<'passwordinputcomponent'> export type EmailInputComponent = BaseComponent<'emailinputcomponent'> @@ -304,6 +306,7 @@ export type TypedComponent = | JobIdFlowStatusComponent | TextInputComponent | QuillComponent + | CodeInputComponent | TextareaInputComponent | PasswordInputComponent | EmailInputComponent @@ -1204,6 +1207,65 @@ export const components = { } } }, + codeinputcomponent: { + name: 'Code Input', + icon: Code, + dims: '2:1-4:4' as AppComponentDimensions, + documentationLink: `${documentationBaseUrl}/code`, + customCss: { + text: { class: '', style: '' }, + container: { class: '', style: '' } + }, + initialData: { + componentInput: undefined, + configuration: { + placeholder: { + type: 'static', + value: 'Type...', + fieldType: 'text' + }, + defaultValue: { + type: 'static', + value: undefined, + fieldType: 'text' + }, + lang: { + type: 'static', + fieldType: 'select', + value: 'javascript', + selectOptions: [ + 'javascript', + 'typescript', + 'python', + 'sql', + 'json', + 'html', + 'css', + 'markdown', + 'yaml' + ] + }, + disableSuggestions: { + type: 'static', + fieldType: 'boolean', + value: false, + tooltip: 'Disable code completion suggestions' + }, + disableLinting: { + type: 'static', + fieldType: 'boolean', + value: false, + tooltip: 'Disable code validation/linting (keeps only syntax highlighting)' + }, + hideLineNumbers: { + type: 'static', + fieldType: 'boolean', + value: false, + tooltip: 'Hide line numbers in the editor' + } + } + } + }, buttoncomponent: { name: 'Button', icon: Inspect, diff --git a/frontend/src/lib/components/apps/editor/component/sets.ts b/frontend/src/lib/components/apps/editor/component/sets.ts index 999db0b63a..370e2703b2 100644 --- a/frontend/src/lib/components/apps/editor/component/sets.ts +++ b/frontend/src/lib/components/apps/editor/component/sets.ts @@ -37,6 +37,7 @@ const inputs: ComponentSet = { components: [ 'schemaformcomponent', 'textinputcomponent', + 'codeinputcomponent', 'textareainputcomponent', 'quillcomponent', 'passwordinputcomponent', diff --git a/frontend/src/lib/components/apps/editor/componentsPanel/componentControlUtils.ts b/frontend/src/lib/components/apps/editor/componentsPanel/componentControlUtils.ts index c8a6e06dbd..0df79e01f4 100644 --- a/frontend/src/lib/components/apps/editor/componentsPanel/componentControlUtils.ts +++ b/frontend/src/lib/components/apps/editor/componentsPanel/componentControlUtils.ts @@ -121,6 +121,7 @@ export function getComponentControl(type: keyof typeof components): Array Date: Fri, 11 Apr 2025 20:00:57 +0200 Subject: [PATCH 200/739] improve public app performances --- .../flows/propPicker/OutputPickerInner.svelte | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/frontend/src/lib/components/flows/propPicker/OutputPickerInner.svelte b/frontend/src/lib/components/flows/propPicker/OutputPickerInner.svelte index 468101ea64..4b820e08f9 100644 --- a/frontend/src/lib/components/flows/propPicker/OutputPickerInner.svelte +++ b/frontend/src/lib/components/flows/propPicker/OutputPickerInner.svelte @@ -18,7 +18,6 @@ import Button from '$lib/components/common/button/Button.svelte' import { Pin, History, Pen, Check, X, Loader2 } from 'lucide-svelte' import ObjectViewer from '$lib/components/propertyPicker/ObjectViewer.svelte' - import JsonEditor from '$lib/components/JsonEditor.svelte' import StepHistory from './StepHistory.svelte' import { Popover } from '$lib/components/meltComponents' import { createEventDispatcher } from 'svelte' @@ -535,9 +534,12 @@ {allowCopy} /> {:else if jsonView} - + {:then Module} + { if (mock?.enabled) { const newMock = { @@ -552,8 +554,9 @@ null, 2 )} - class="h-full" - /> + class="h-full" + /> + {/await} {:else if (mock?.enabled || preview == 'mock') && preview != 'job'} {#if fullResult}
From cdb0e42979c527142f413dcabc43b5fc67d2b8a5 Mon Sep 17 00:00:00 2001 From: Alexander Petric Date: Fri, 11 Apr 2025 16:35:27 -0400 Subject: [PATCH 201/739] github app linking: do the redirect via browser (#5611) --- frontend/src/routes/gh_success/+page.svelte | 105 ++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 frontend/src/routes/gh_success/+page.svelte diff --git a/frontend/src/routes/gh_success/+page.svelte b/frontend/src/routes/gh_success/+page.svelte new file mode 100644 index 0000000000..01234945d5 --- /dev/null +++ b/frontend/src/routes/gh_success/+page.svelte @@ -0,0 +1,105 @@ + + +
+
+ {#if isLoading} +
+
+

Processing GitHub app installation...

+
+ {:else if isSuccess} +
+

+ + Windmill GitHub app installation completed successfully +

+

+ The GitHub app has been successfully installed. You can now close this window and return to Windmill to start using the GitHub integration. +

+ +
+ {:else} +
+

+ + Failed to install Windmill GitHub app +

+

There was an error during the installation process:

+
+ {errorMessage} +
+

+ Please try again or contact your administrator for assistance. +

+ +
+ {/if} +
+
From d5186da27129f77f302d3fed54ecdc333cdceeab Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Fri, 11 Apr 2025 23:19:29 +0200 Subject: [PATCH 202/739] allow multiple workers on agent mode (#5607) --- ...05d394a7cbcf0038c72a78add5c7b02ef5927.json | 2 +- ...1fe2dce615ff76a53f72cb5386dc17e4e07aa.json | 21 +++++ backend/Cargo.lock | 11 +++ backend/Cargo.toml | 2 + backend/ee-repo-ref.txt | 2 +- backend/src/main.rs | 84 +++++++++-------- backend/windmill-api/src/jobs.rs | 15 +++ backend/windmill-api/src/lib.rs | 6 +- backend/windmill-worker/Cargo.toml | 1 + .../windmill-worker/src/result_processor.rs | 31 ++++-- backend/windmill-worker/src/worker.rs | 94 +++++++++++-------- 11 files changed, 176 insertions(+), 93 deletions(-) create mode 100644 backend/.sqlx/query-fe7221651a982861dede4116bc71fe2dce615ff76a53f72cb5386dc17e4e07aa.json diff --git a/backend/.sqlx/query-ddf2eccb78a310ed00c7d8b9c3f05d394a7cbcf0038c72a78add5c7b02ef5927.json b/backend/.sqlx/query-ddf2eccb78a310ed00c7d8b9c3f05d394a7cbcf0038c72a78add5c7b02ef5927.json index 5bfff47576..c2dfed73a2 100644 --- a/backend/.sqlx/query-ddf2eccb78a310ed00c7d8b9c3f05d394a7cbcf0038c72a78add5c7b02ef5927.json +++ b/backend/.sqlx/query-ddf2eccb78a310ed00c7d8b9c3f05d394a7cbcf0038c72a78add5c7b02ef5927.json @@ -15,7 +15,7 @@ ] }, "nullable": [ - true + null ] }, "hash": "ddf2eccb78a310ed00c7d8b9c3f05d394a7cbcf0038c72a78add5c7b02ef5927" diff --git a/backend/.sqlx/query-fe7221651a982861dede4116bc71fe2dce615ff76a53f72cb5386dc17e4e07aa.json b/backend/.sqlx/query-fe7221651a982861dede4116bc71fe2dce615ff76a53f72cb5386dc17e4e07aa.json new file mode 100644 index 0000000000..1ca60067d0 --- /dev/null +++ b/backend/.sqlx/query-fe7221651a982861dede4116bc71fe2dce615ff76a53f72cb5386dc17e4e07aa.json @@ -0,0 +1,21 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO job_perms (job_id, email, username, is_admin, is_operator, folders, groups, workspace_id) \n SELECT unnest($1::uuid[]), $2, $3, $4, $5, $6, $7, $8", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "UuidArray", + "Varchar", + "Varchar", + "Bool", + "Bool", + "JsonbArray", + "TextArray", + "Varchar" + ] + }, + "nullable": [] + }, + "hash": "fe7221651a982861dede4116bc71fe2dce615ff76a53f72cb5386dc17e4e07aa" +} diff --git a/backend/Cargo.lock b/backend/Cargo.lock index 46ef0b5b2d..4737d318f6 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -4804,6 +4804,7 @@ checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" dependencies = [ "futures-core", "futures-sink", + "nanorand", "spin 0.9.8", ] @@ -7519,6 +7520,15 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "nanorand" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" +dependencies = [ + "getrandom 0.2.15", +] + [[package]] name = "napi_sym" version = "0.120.0" @@ -14480,6 +14490,7 @@ dependencies = [ "deno_webidl", "dotenv", "dyn-iter", + "flume", "futures", "gcp_auth", "git-version", diff --git a/backend/Cargo.toml b/backend/Cargo.toml index 4ca7a5fa49..ef4d7c5712 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -365,6 +365,8 @@ tantivy = "0.22.0" backon = "1.3.0" +flume = { version = "0.11.1", features = ["async"] } + # Macro-related proc-macro2 = "1.0" pulldown-cmark = "0.9" diff --git a/backend/ee-repo-ref.txt b/backend/ee-repo-ref.txt index b9a3d2881d..9c55ceeb81 100644 --- a/backend/ee-repo-ref.txt +++ b/backend/ee-repo-ref.txt @@ -1 +1 @@ -85c37983ffb8f622458425c182613206625c6cee +44c3e23922097d4386183e56b6b3dc540c70d71b \ No newline at end of file diff --git a/backend/src/main.rs b/backend/src/main.rs index a076b4c63f..7f4bcda628 100644 --- a/backend/src/main.rs +++ b/backend/src/main.rs @@ -329,26 +329,16 @@ async fn windmill_main() -> anyhow::Result<()> { IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)) }; - let mut first_worker_suffix = None; - let mut worker_names = vec![]; - - for _ in 0..num_workers { + let (conn, first_suffix) = if mode == Mode::Agent { + tracing::info!( + "Creating http client for cluster using base internal url {}", + std::env::var("BASE_INTERNAL_URL").unwrap_or_default() + ); let suffix = windmill_common::utils::worker_suffix(&hostname, &rd_string(5)); - worker_names.push(windmill_common::utils::worker_name_with_suffix( - mode == Mode::Agent, - WORKER_GROUP.as_str(), - &suffix, - )); - if first_worker_suffix.is_none() { - first_worker_suffix = Some(suffix); - } - } - - let conn = if mode == Mode::Agent { - let worker_suffix = first_worker_suffix.unwrap_or_else(|| { - panic!("there must be at least one worker in agent mode"); - }); - Connection::Http(build_agent_http_client(&worker_suffix)) + ( + Connection::Http(build_agent_http_client(&suffix)), + Some(suffix), + ) } else { println!("Connecting to database..."); @@ -366,7 +356,7 @@ async fn windmill_main() -> anyhow::Result<()> { load_otel(&db).await; tracing::info!("Database connected"); - Connection::Sql(db) + (Connection::Sql(db), None) }; let environment = load_base_url(&conn) @@ -409,6 +399,7 @@ async fn windmill_main() -> anyhow::Result<()> { let conn = if mode == Mode::Agent { conn } else { + // This time we use a pool of connections let db = windmill_common::connect_db(server_mode, indexer_mode, worker_mode).await?; Connection::Sql(db) }; @@ -439,16 +430,6 @@ Windmill Community Edition {GIT_VERSION} display_config(&ENV_SETTINGS); - if let Err(e) = reload_base_url_setting(&conn).await { - tracing::error!("Error loading base url: {:?}", e) - } - - if let Some(db) = conn.as_sql() { - if let Err(e) = reload_critical_error_channels_setting(&db).await { - tracing::error!("Could loading critical error emails setting: {:?}", e); - } - } - #[cfg(feature = "enterprise")] { // load the license key and check if it's valid @@ -686,14 +667,34 @@ Windmill Community Edition {GIT_VERSION} if !killpill_rx.try_recv().is_ok() { let base_internal_url = base_internal_rx.await?; if worker_mode { + let mut workers = vec![]; + for i in 0..num_workers { + let suffix: String = if i == 0 && first_suffix.as_ref().is_some() { + first_suffix.as_ref().unwrap().clone() + } else { + windmill_common::utils::worker_suffix(&hostname, &rd_string(5)) + }; + let worker_conn = WorkerConn { + conn: if i == 0 || mode != Mode::Agent { + conn.clone() + } else { + Connection::Http(build_agent_http_client(&suffix)) + }, + worker_name: windmill_common::utils::worker_name_with_suffix( + mode == Mode::Agent, + WORKER_GROUP.as_str(), + &suffix, + ), + }; + workers.push(worker_conn); + } + run_workers( - conn.clone(), rx, killpill_tx.clone(), - num_workers, base_internal_url.clone(), hostname.clone(), - &worker_names, + &workers, ) .await?; tracing::info!("All workers exited."); @@ -1134,16 +1135,20 @@ fn display_config(envs: &[&str]) { ) } +pub struct WorkerConn { + conn: Connection, + worker_name: String, +} + pub async fn run_workers( - db: Connection, mut rx: tokio::sync::broadcast::Receiver<()>, tx: KillpillSender, - num_workers: i32, base_internal_url: String, hostname: String, - worker_names: &[String], + workers: &[WorkerConn], ) -> anyhow::Result<()> { let mut killpill_rxs = vec![]; + let num_workers = workers.len(); for _ in 0..num_workers { killpill_rxs.push(rx.resubscribe()); } @@ -1202,8 +1207,9 @@ pub async fn run_workers( *windmill_worker::SLEEP_QUEUE ); for i in 1..(num_workers + 1) { - let db1 = db.clone(); - let worker_name = worker_names[i as usize - 1].clone(); + let wk_conf = &workers[i as usize - 1]; + let conn1 = wk_conf.conn.clone(); + let worker_name = wk_conf.worker_name.clone(); let ip = ip.clone(); let rx = killpill_rxs.pop().unwrap(); let tx = tx.clone(); @@ -1216,7 +1222,7 @@ pub async fn run_workers( } let f = windmill_worker::run_worker( - &db1, + &conn1, &hostname, worker_name, i as u64, diff --git a/backend/windmill-api/src/jobs.rs b/backend/windmill-api/src/jobs.rs index 71ec9c6c8f..4111f28b6b 100644 --- a/backend/windmill-api/src/jobs.rs +++ b/backend/windmill-api/src/jobs.rs @@ -5095,6 +5095,21 @@ async fn add_batch_jobs( .execute(&mut *tx) .await?; + sqlx::query!( + "INSERT INTO job_perms (job_id, email, username, is_admin, is_operator, folders, groups, workspace_id) + SELECT unnest($1::uuid[]), $2, $3, $4, $5, $6, $7, $8", + &uuids, + authed.email, + authed.username, + authed.is_admin, + authed.is_operator, + &[], + &[], + w_id, + ) + .execute(&mut *tx) + .await?; + if let Some(flow_status) = flow_status { sqlx::query!( "INSERT INTO v2_job_status (id, flow_status) diff --git a/backend/windmill-api/src/lib.rs b/backend/windmill-api/src/lib.rs index 922cb57ceb..ece80c64b1 100644 --- a/backend/windmill-api/src/lib.rs +++ b/backend/windmill-api/src/lib.rs @@ -728,10 +728,10 @@ pub async fn run_server( server.await?; #[cfg(feature = "agent_worker_server")] - if let Some(bg_processor) = agent_workers_bg_processor { - tracing::info!("server off. shutting down agent workers bg processor"); + for (i, bg_processor) in agent_workers_bg_processor.into_iter().enumerate() { + tracing::info!("server off. shutting down agent worker bg processor {i}"); bg_processor.await?; - tracing::info!("agent workers bg processor shut down"); + tracing::info!("agent worker bg processor {i} shut down"); } Ok(()) } diff --git a/backend/windmill-worker/Cargo.toml b/backend/windmill-worker/Cargo.toml index cad3ccc84a..e4de400d84 100644 --- a/backend/windmill-worker/Cargo.toml +++ b/backend/windmill-worker/Cargo.toml @@ -52,6 +52,7 @@ windmill-parser-sql.workspace = true windmill-parser-graphql.workspace = true windmill-parser-php = { workspace = true, optional = true } windmill-git-sync.workspace = true +flume.workspace = true sqlx.workspace = true uuid.workspace = true tracing.workspace = true diff --git a/backend/windmill-worker/src/result_processor.rs b/backend/windmill-worker/src/result_processor.rs index 141c886fe0..389bd067a8 100644 --- a/backend/windmill-worker/src/result_processor.rs +++ b/backend/windmill-worker/src/result_processor.rs @@ -34,7 +34,7 @@ use windmill_queue::{ use serde_json::{json, value::RawValue}; -use tokio::{sync::mpsc::Receiver, task::JoinHandle}; +use tokio::{sync::broadcast, task::JoinHandle}; use windmill_queue::{add_completed_job, add_completed_job_error}; @@ -118,7 +118,7 @@ async fn process_jc( } pub fn start_background_processor( - mut job_completed_rx: Receiver, + job_completed_rx: flume::Receiver, job_completed_sender: JobCompletedSender, same_worker_queue_size: Arc, job_completed_processor_is_done: Arc, @@ -127,6 +127,7 @@ pub fn start_background_processor( worker_dir: String, same_worker_tx: SameWorkerSender, worker_name: String, + mut killpill_rx: broadcast::Receiver<()>, killpill_tx: KillpillSender, is_dedicated_worker: bool, ) -> JoinHandle<()> { @@ -136,19 +137,33 @@ pub fn start_background_processor( #[cfg(feature = "benchmark")] let mut infos = BenchmarkInfo::new(); + enum JobCompletedRx { + JobCompleted(SendResult), + Killpill, + } //if we have been killed, we want to drain the queue of jobs while let Some(sr) = { if has_been_killed && same_worker_queue_size.load(Ordering::SeqCst) == 0 { - job_completed_rx.try_recv().ok() + job_completed_rx + .try_recv() + .ok() + .map(JobCompletedRx::JobCompleted) } else { - job_completed_rx.recv().await + tokio::select! { + result = job_completed_rx.recv_async() => { + result.ok().map(JobCompletedRx::JobCompleted) + } + _ = killpill_rx.recv() => { + Some(JobCompletedRx::Killpill) + } + } } } { #[cfg(feature = "benchmark")] let mut bench = BenchmarkIter::new(); match sr { - SendResult::JobCompleted(jc) => { + JobCompletedRx::JobCompleted(SendResult::JobCompleted(jc)) => { let is_init_script_and_failure = !jc.success && jc.job.tag.as_str() == INIT_SCRIPT_TAG; let is_dependency_job = matches!( @@ -192,7 +207,7 @@ pub fn start_background_processor( infos.add_iter(bench, true); } } - SendResult::UpdateFlow { + JobCompletedRx::JobCompleted(SendResult::UpdateFlow { flow, w_id, success, @@ -200,7 +215,7 @@ pub fn start_background_processor( worker_dir, stop_early_override, token, - } => { + }) => { // let r; tracing::info!(parent_flow = %flow, "updating flow status"); if let Err(e) = update_flow_status_after_job_completion( @@ -230,7 +245,7 @@ pub fn start_background_processor( tracing::error!("Error updating flow status after job completion for {flow} on {worker_name}: {e:#}"); } } - SendResult::Kill => { + JobCompletedRx::Killpill => { has_been_killed = true; } } diff --git a/backend/windmill-worker/src/worker.rs b/backend/windmill-worker/src/worker.rs index 46420fb73e..2081b90f5f 100644 --- a/backend/windmill-worker/src/worker.rs +++ b/backend/windmill-worker/src/worker.rs @@ -85,6 +85,7 @@ use tokio::fs::symlink_file as symlink; use tokio::{ sync::{ + broadcast, mpsc::{self, Receiver, Sender}, RwLock, }, @@ -210,8 +211,8 @@ pub const DEFAULT_NATIVE_JOBS: usize = 1; const VACUUM_PERIOD: u32 = 50000; -#[cfg(any(target_os = "linux"))] -const DROP_CACHE_PERIOD: u32 = 1000; +// #[cfg(any(target_os = "linux"))] +// const DROP_CACHE_PERIOD: u32 = 1000; pub const MAX_BUFFERED_DEDICATED_JOBS: usize = 3; @@ -518,20 +519,33 @@ impl AuthedClient { } } +#[derive(Clone)] +pub struct SameWorkerSender(pub Sender, pub Arc); + #[allow(dead_code)] #[derive(Clone)] pub enum JobCompletedSender { - Sql(Sender), + Sql(flume::Sender, broadcast::Sender<()>), Http(HttpClient), NeverUsed, } impl JobCompletedSender { - pub fn new(conn: &Connection, buffer_size: usize) -> (Self, Option>) { + pub fn new( + conn: &Connection, + buffer_size: usize, + ) -> ( + Self, + Option<(flume::Receiver, broadcast::Receiver<()>)>, + ) { match conn { Connection::Sql(_) => { - let (sender, receiver) = mpsc::channel::(buffer_size); - (Self::Sql(sender), Some(receiver)) + let (sender, receiver) = flume::bounded::(buffer_size); + let (killpill_tx, killpill_rx) = broadcast::channel::<()>(buffer_size); + ( + Self::Sql(sender, killpill_tx), + Some((receiver, killpill_rx)), + ) } Connection::Http(client) => (Self::Http(client.clone()), None), } @@ -539,16 +553,11 @@ impl JobCompletedSender { pub fn new_never_used() -> (Self, Option>) { (Self::NeverUsed, None) } -} -#[derive(Clone)] -pub struct SameWorkerSender(pub Sender, pub Arc); - -impl JobCompletedSender { pub async fn send_job(&self, jc: JobCompleted) -> anyhow::Result<()> { match self { - Self::Sql(sender) => sender - .send(SendResult::JobCompleted(jc)) + Self::Sql(sender, _) => sender + .send_async(SendResult::JobCompleted(jc)) .await .map_err(|_e| { anyhow::anyhow!("Failed to send job completed to background processor") @@ -566,12 +575,9 @@ impl JobCompletedSender { } } - pub async fn send( - &self, - send_result: SendResult, - ) -> Result<(), tokio::sync::mpsc::error::SendError> { + pub async fn send(&self, send_result: SendResult) -> Result<(), flume::SendError> { match self { - Self::Sql(sender) => sender.send(send_result).await, + Self::Sql(sender, _) => sender.send_async(send_result).await, Self::Http(_) => { tracing::error!("Sending job completed to http client, this should not happen"); Ok(()) @@ -585,9 +591,13 @@ impl JobCompletedSender { } } - pub async fn kill(&self) -> Result<(), tokio::sync::mpsc::error::SendError> { + pub async fn kill(&self) -> Result<(), broadcast::error::SendError<()>> { match self { - Self::Sql(sender) => sender.send(SendResult::Kill).await, + Self::Sql(_, killpill_tx) => { + tracing::info!("Sending killpill to bg processors"); + killpill_tx.send(())?; + Ok(()) + } Self::Http(_) => { tracing::error!("Sending kill to http client, this should not happen"); Ok(()) @@ -627,11 +637,11 @@ pub async fn drop_cache() { Ok(mut file) => { // Write '3' to the file to drop caches if let Err(e) = tokio::io::AsyncWriteExt::write_all(&mut file, b"3").await { - tracing::warn!("Failed to write to /proc/sys/vm/drop_caches (expected to not work in not in privileged mode, only required to forcefully drop the cache to avoid spurrious oom killer): {}", e); + tracing::warn!("Failed to write to /proc/sys/vm/drop_caches (expected to work only in privileged mode, only required to forcefully drop the cache to avoid spurrious oom killer): {}", e); } } Err(e) => { - tracing::warn!("Failed to open /proc/sys/vm/drop_caches (expected to not work in not in privileged mode, only required to forcefully drop the cache to avoid spurrious oom killer):: {}", e); + tracing::warn!("Failed to open /proc/sys/vm/drop_caches (expected to work only in privileged mode, only required to forcefully drop the cache to avoid spurrious oom killer):: {}", e); } } } @@ -1012,19 +1022,22 @@ pub async fn run_worker( Arc::new(AtomicBool::new(matches!(conn, Connection::Http(_)))); let send_result = match (conn, job_completed_rx) { - (Connection::Sql(db), Some(job_completed_rx)) => Some(start_background_processor( - job_completed_rx, - job_completed_tx.clone(), - same_worker_queue_size.clone(), - job_completed_processor_is_done.clone(), - base_internal_url.to_string(), - db.clone(), - worker_dir.clone(), - same_worker_tx.clone(), - worker_name.clone(), - killpill_tx.clone(), - is_dedicated_worker, - )), + (Connection::Sql(db), Some((job_completed_rx, bg_killpill_rx))) => { + Some(start_background_processor( + job_completed_rx, + job_completed_tx.clone(), + same_worker_queue_size.clone(), + job_completed_processor_is_done.clone(), + base_internal_url.to_string(), + db.clone(), + worker_dir.clone(), + same_worker_tx.clone(), + worker_name.clone(), + bg_killpill_rx, + killpill_tx.clone(), + is_dedicated_worker, + )) + } _ => None, }; @@ -1190,11 +1203,11 @@ pub async fn run_worker( jobs_executed += 1; } - #[cfg(any(target_os = "linux"))] - if (jobs_executed as u32 + 1) % DROP_CACHE_PERIOD == 0 { - drop_cache().await; - jobs_executed += 1; - } + // #[cfg(any(target_os = "linux"))] + // if (jobs_executed as u32 + 1) % DROP_CACHE_PERIOD == 0 { + // drop_cache().await; + // jobs_executed += 1; + // } #[cfg(feature = "benchmark")] if benchmark_jobs > 0 && infos.iters == benchmark_jobs as u64 { @@ -1843,7 +1856,6 @@ pub enum SendResult { stop_early_override: Option, token: String, }, - Kill, } async fn do_nativets( From 0b6d017fedc31e790a76cf29a1adaaf2a72acc61 Mon Sep 17 00:00:00 2001 From: pyranota <92104930+pyranota@users.noreply.github.com> Date: Fri, 11 Apr 2025 23:31:51 +0200 Subject: [PATCH 203/739] feat(python): per import requirement pin (#5520) * implement single line pin * make panic-safe * use pin even if multiple modules imported withing single statement * add repins and make imports respect pins * keep all pins * Allow multiple pins * add comments + handle stuff more safely * fix fully qualified imports * remove ignore * sort nested * apply unique to output requirements list * fix typo * remove mut * update sqlx * sort imports * sort imports * fix formatter and format * refactor * fix comptime error * write tests * perf: do not capture if string is empty --- ...43c98104529879f991c49585cd181e34aa827.json | 23 + ...9e631efb65c3d326b6b6ae8361a2116bff145.json | 23 - .../windmill-parser-py-imports/src/lib.rs | 412 ++++++++++++++---- .../windmill-parser-py-imports/tests/tests.rs | 6 +- backend/tests/fixtures/lockfile_python.sql | 51 +++ backend/tests/worker.rs | 203 +++++++++ .../windmill-worker/src/python_executor.rs | 36 +- .../windmill-worker/src/worker_lockfiles.rs | 1 + 8 files changed, 638 insertions(+), 117 deletions(-) create mode 100644 backend/.sqlx/query-443bd83bcea1d37c79cb080095343c98104529879f991c49585cd181e34aa827.json delete mode 100644 backend/.sqlx/query-ac01e45d3335015f53f3d63fe159e631efb65c3d326b6b6ae8361a2116bff145.json create mode 100644 backend/tests/fixtures/lockfile_python.sql diff --git a/backend/.sqlx/query-443bd83bcea1d37c79cb080095343c98104529879f991c49585cd181e34aa827.json b/backend/.sqlx/query-443bd83bcea1d37c79cb080095343c98104529879f991c49585cd181e34aa827.json new file mode 100644 index 0000000000..65b21050c0 --- /dev/null +++ b/backend/.sqlx/query-443bd83bcea1d37c79cb080095343c98104529879f991c49585cd181e34aa827.json @@ -0,0 +1,23 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT content FROM script WHERE path = $1 AND workspace_id = $2\n AND created_at = (SELECT max(created_at) FROM script WHERE path = $1 AND\n workspace_id = $2)\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "content", + "type_info": "Text" + } + ], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [ + false + ] + }, + "hash": "443bd83bcea1d37c79cb080095343c98104529879f991c49585cd181e34aa827" +} diff --git a/backend/.sqlx/query-ac01e45d3335015f53f3d63fe159e631efb65c3d326b6b6ae8361a2116bff145.json b/backend/.sqlx/query-ac01e45d3335015f53f3d63fe159e631efb65c3d326b6b6ae8361a2116bff145.json deleted file mode 100644 index 929157b5d7..0000000000 --- a/backend/.sqlx/query-ac01e45d3335015f53f3d63fe159e631efb65c3d326b6b6ae8361a2116bff145.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT content FROM script WHERE path = $1 AND workspace_id = $2\n AND created_at = (SELECT max(created_at) FROM script WHERE path = $1 AND\n workspace_id = $2)\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "content", - "type_info": "Text" - } - ], - "parameters": { - "Left": [ - "Text", - "Text" - ] - }, - "nullable": [ - false - ] - }, - "hash": "ac01e45d3335015f53f3d63fe159e631efb65c3d326b6b6ae8361a2116bff145" -} diff --git a/backend/parsers/windmill-parser-py-imports/src/lib.rs b/backend/parsers/windmill-parser-py-imports/src/lib.rs index f0c8a4c41a..2f18b74d6b 100644 --- a/backend/parsers/windmill-parser-py-imports/src/lib.rs +++ b/backend/parsers/windmill-parser-py-imports/src/lib.rs @@ -11,6 +11,7 @@ mod mapping; use async_recursion::async_recursion; use itertools::Itertools; use lazy_static::lazy_static; +use std::collections::HashMap; use mapping::{FULL_IMPORTS_MAP, SHORT_IMPORTS_MAP}; #[cfg(not(target_arch = "wasm32"))] @@ -20,6 +21,7 @@ use regex_lite::Regex; use rustpython_parser::{ ast::{Stmt, StmtImport, StmtImportFrom, Suite}, + text_size::TextRange, Parse, }; use sqlx::{Pool, Postgres}; @@ -41,9 +43,10 @@ fn replace_full_import(x: &str) -> Option { lazy_static! { static ref RE: Regex = Regex::new(r"^\#\s?(\S+)\s*$").unwrap(); + static ref PIN_RE: Regex = Regex::new(r"(?:\s*#\s*(pin|repin):\s*)(\S*)").unwrap(); } -fn process_import(module: Option, path: &str, level: usize) -> Vec { +fn process_import(module: Option, path: &str, level: usize) -> Vec { if level > 0 { let mut imports = vec![]; let splitted_path = path.split("/"); @@ -52,17 +55,18 @@ fn process_import(module: Option, path: &str, level: usize) -> Vec error::Result Some(path), + _ => None, }) .collect()); } -fn parse_code_for_imports(code: &str, path: &str) -> error::Result> { +#[derive(Clone, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)] +enum NImport { + // Order matters! First we want to resolve all repins + + // manually repinned requirement + // e.g.: + // import pandas # repin: pandas==x.y.z + Repin { + pin: ImportPin, + key: String, + }, + // manually pinned requirements + // e.g.: + // import pandas # pin: pandas>=x.y.z + // import pandas # pin: pandas<=x.y.z + // + // NOTE: It is possible for multiple pins exist on same import + // That's why we store vector of pins + Pin { + pins: Vec, + key: String, + }, + // Automatically inferred requirement + // e.g.: + // import pandas + Auto { + // Take `x.y.z` for example + // x is going to be the `root` + // and x.y.z is `full` + // + // `full` will be None if it is equal to root + // + // We will use `root` as a requirement name and pass to `uv pip compile` if it was not replaced with any pin + pkg: String, + + // However we still need full, since all pins pin against full import names + key: Option, + }, + // Relative imports + Relative(String), +} +#[derive(Clone, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)] +enum NImportResolved { + Repin { pin: ImportPin, key: String }, + Pin { pins: Vec, key: String }, + Auto { pkg: String, key: Option }, +} + +#[derive(Clone, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)] +struct ImportPin { + pkg: String, + path: String, +} + +fn parse_code_for_imports(code: &str, path: &str) -> error::Result> { let mut code = code.split(DEF_MAIN).next().unwrap_or("").to_string(); // remove main function decorator from end of file if it exists @@ -104,19 +159,56 @@ fn parse_code_for_imports(code: &str, path: &str) -> error::Result> let ast = Suite::parse(&code, "main.py").map_err(|e| { error::Error::ExecutionErr(format!("Error parsing code for imports: {}", e.to_string())) })?; - let nimports: Vec = ast + + let find_pin = |range: TextRange, key: String| { + let hs = code + .chars() + .skip(range.end().to_usize()) + .take_while(|e| *e != '\n') + .collect::(); + + if hs.trim_start().is_empty(){ + return None; + } + + PIN_RE + .captures(&hs) + .and_then(|x| { + x.get(1).zip(x.get(2)).and_then(|(ty_m, pkg_m)| { + let pkg = pkg_m.as_str().to_owned(); + if ty_m.as_str() == "pin" { + Some(vec![NImport::Pin { + pins: vec![ImportPin { pkg, path: path.to_owned() }], + key, + }]) + } else if ty_m.as_str() == "repin" { + Some(vec![NImport::Repin { + pin: ImportPin { pkg, path: path.to_owned() }, + key, + }]) + } else { + None + } + }) + }) + }; + + let mut nimports: Vec = ast .into_iter() .filter_map(|x| match x { - Stmt::Import(StmtImport { names, .. }) => Some( - names - .into_iter() - .map(|x| { - let name = x.name.to_string(); - process_import(Some(name), path, 0) - }) - .flatten() - .collect::>(), - ), + Stmt::Import(StmtImport { names, range }) => names + .get(0) + .and_then(|al| find_pin(range, al.name.to_string())) + .or(Some( + names + .into_iter() + .map(|x| { + let name = x.name.to_string(); + process_import(Some(name), path, 0) + }) + .flatten() + .collect::>(), + )), Stmt::ImportFrom(StmtImportFrom { level: Some(i), module, .. }) if i.to_u32() > 0 => { Some(process_import( module.map(|x| x.to_string()), @@ -124,15 +216,25 @@ fn parse_code_for_imports(code: &str, path: &str) -> error::Result> i.to_usize(), )) } - Stmt::ImportFrom(StmtImportFrom { level: _, module, .. }) => { - Some(process_import(module.map(|x| x.to_string()), path, 0)) - } + Stmt::ImportFrom(StmtImportFrom { level: _, module, range, .. }) => find_pin( + range, + module.clone().map(|x| x.to_string()).unwrap_or_default(), + ) + .or(Some(process_import(module.map(|x| x.to_string()), path, 0))), _ => None, }) .flatten() - .filter(|x| !STDIMPORTS.contains(&x.as_str())) + .filter(|x| { + if let NImport::Auto { ref pkg, .. } = x { + !STDIMPORTS.contains(&(*pkg).as_str()) + } else { + true + } + }) .unique() .collect(); + + nimports.sort(); return Ok(nimports); } @@ -143,8 +245,9 @@ pub async fn parse_python_imports( db: &Pool, already_visited: &mut Vec, annotated_pyv_numeric: &mut Option, -) -> error::Result> { - parse_python_imports_inner( +) -> error::Result<(Vec, Option)> { + let mut compile_error_hint: Option = None; + let mut imports = parse_python_imports_inner( code, w_id, path, @@ -153,7 +256,32 @@ pub async fn parse_python_imports( annotated_pyv_numeric, &mut annotated_pyv_numeric.and_then(|_| Some(path.to_owned())), ) - .await + .await? + .into_values() + .map(|nimport| match nimport { + NImportResolved::Pin { pins, .. } => pins.into_iter().map(|p| { + if let Some(hint) = &mut compile_error_hint{ + hint.push_str(&format!("\n - pin to {} in {}", p.pkg, p.path)); + } else { + compile_error_hint = Some("\n\nMultiple pins can cause problems during lockfile resolution.\nMake sure you checked every pin for conflicts:\n".into()) + }; + Ok(p.pkg) + }).collect_vec(), + NImportResolved::Repin { pin: ImportPin { pkg, .. }, .. } => vec![Ok(pkg)], + NImportResolved::Auto { pkg, ..} => vec![Ok(pkg)], + }) + .flatten() + .collect::>>()? + .into_iter() + .unique() + .collect_vec(); + + imports.sort(); + + compile_error_hint + .as_mut() + .map(|e| e.push_str("\n\nNOTE: You can also `repin` to override all pins")); + Ok((imports, compile_error_hint)) } #[async_recursion] @@ -165,7 +293,7 @@ async fn parse_python_imports_inner( already_visited: &mut Vec, annotated_pyv_numeric: &mut Option, path_where_annotated_pyv: &mut Option, -) -> error::Result> { +) -> error::Result> { let PythonAnnotations { py310, py311, py312, py313, .. } = PythonAnnotations::parse(&code); // we pass only if there is none or only one annotation @@ -194,7 +322,6 @@ async fn parse_python_imports_inner( } else { *annotated_pyv_numeric = Some(numeric); } - *path_where_annotated_pyv = Some(path.to_owned()); } Ok(()) @@ -209,74 +336,205 @@ async fn parse_python_imports_inner( .lines() .find_position(|x| x.starts_with("#requirements:") || x.starts_with("# requirements:")); if let Some((pos, _)) = find_requirements { - let lines = code - .lines() + let mut requirements = HashMap::new(); + code.lines() .skip(pos + 1) .map_while(|x| { - RE.captures(x) - .map(|x| x.get(1).unwrap().as_str().to_string()) + RE.captures(x).and_then(|x| { + x.get(1).map(|m| { + let requirement = m.as_str().to_string(); + requirements.insert( + requirement.clone(), + NImportResolved::Repin { + pin: ImportPin { pkg: requirement, path: Default::default() }, + key: Default::default(), + }, + ); + }) + }) }) - .collect(); - Ok(lines) + .collect_vec(); + + Ok(requirements) } else { let find_extra_requirements = code.lines().find_position(|x| { x.starts_with("#extra_requirements:") || x.starts_with("# extra_requirements:") }); - let mut imports: Vec = vec![]; + let mut imports: HashMap = HashMap::new(); if let Some((pos, _)) = find_extra_requirements { - let lines: Vec = code - .lines() + code.lines() .skip(pos + 1) .map_while(|x| { - RE.captures(x) - .map(|x| x.get(1).unwrap().as_str().to_string()) + RE.captures(x).and_then(|x| { + x.get(1).map(|m| { + let requirement = m.as_str().to_string(); + imports.insert( + requirement.clone(), + NImportResolved::Auto { key: None, pkg: requirement }, + ); + }) + }) }) - .collect(); - imports.extend(lines); + .collect_vec(); } - let nimports = parse_code_for_imports(code, path)?; - for n in nimports.iter() { - let nested = if n.starts_with("relative:") { - let rpath = n.replace("relative:", ""); - let code = sqlx::query_scalar!( - r#" - SELECT content FROM script WHERE path = $1 AND workspace_id = $2 - AND created_at = (SELECT max(created_at) FROM script WHERE path = $1 AND - workspace_id = $2) - "#, - &rpath, - w_id - ) - .fetch_optional(db) - .await? - .unwrap_or_else(|| "".to_string()); + // Will get unsorted vector of imports found in current script + let mut nimports = parse_code_for_imports(code, path)?; - if already_visited.contains(&rpath) { - vec![] - } else { - already_visited.push(rpath.clone()); - parse_python_imports_inner( - &code, - w_id, + // It is important to note, that sorting is important and will always result in this pattern: + // 1. All Repins go first + // 2. All Pins go second + // 3. All Auto go third + // 4. All relative imports go the last + // + // This way we make sure all repins are resolved before (re)pins inside imported relative scripts. + nimports.sort(); + + for n in nimports.into_iter() { + let mut nested = match n { + NImport::Relative(rpath) => { + let code = sqlx::query_scalar!( + r#" + SELECT content FROM script WHERE path = $1 AND workspace_id = $2 + AND created_at = (SELECT max(created_at) FROM script WHERE path = $1 AND + workspace_id = $2) + "#, &rpath, - db, - already_visited, - annotated_pyv_numeric, - path_where_annotated_pyv, + w_id ) + .fetch_optional(db) .await? + .unwrap_or_else(|| "".to_string()); + + if already_visited.contains(&rpath) { + vec![] + } else { + already_visited.push(rpath.clone()); + // Because the algo goes depth first, this function will never return relative import + // This why we can safely assume later, that there is no relative imports + parse_python_imports_inner( + &code, + w_id, + &rpath, + db, + already_visited, + annotated_pyv_numeric, + path_where_annotated_pyv, + ) + .await? + .into_values() + .collect_vec() + } } - } else { - vec![n.to_string()] + NImport::Repin { pin, key } => vec![NImportResolved::Repin { pin, key }], + NImport::Pin { pins, key } => vec![NImportResolved::Pin { pins, key }], + NImport::Auto { pkg, key } => vec![NImportResolved::Auto { pkg, key }], }; + + // Nested should also be sorted for the same reason + nested.sort(); + + // At this point there should be no NImport::Relative in `nested` for imp in nested { - if !imports.contains(&imp) { - imports.push(imp); + let key = match imp.clone() { + NImportResolved::Pin { key, .. } => key, + NImportResolved::Repin { key, .. } => key, + NImportResolved::Auto { key, pkg } => key.unwrap_or(pkg), + }; + // Handled cases: + // + // 1. + // Error: Imported windmill scripts have different pins + // + // auto + // ├── pin:2 + // └── pin:1 + // + // Fix 1: + // + // auto + // ├── pin:1 + // └── pin:1 + // + // Fix 2: + // + // repin:1 + // ├── pin:2 + // └── pin:1 + // + // 2. + // Error: Imported windmill scripts have different pins + // + // pin:2 + // └── pin:1 + // + // Fix 1: + // + // auto + // └── pin:1 + // + // Fix 2: + // + // repin:2 + // └── pin:1 + // + // 3. repins allowed to be repinned again + // + // repin:2 + // └── repin:1 + // + match imp.clone() { + NImportResolved::Repin { .. } => { + if let Some(existing_import) = imports.get(&key) { + match existing_import { + // replace + p if matches!( + p, + NImportResolved::Pin { .. } | NImportResolved::Auto { .. } + ) => + { + imports.insert(key, imp); + } + // do nothing (older repins have greater precedence) + NImportResolved::Repin { .. } => {} + // Should not be possible + _ => { + return Err(anyhow::anyhow!( + "Internal error: cannot resolve requirement pins", + ) + .into()); + } + } + } else { + imports.insert(key, imp.clone()); + } + } + NImportResolved::Pin { pins: new_pins, .. } => { + if let Some(existing_import) = imports.get_mut(&key) { + match existing_import { + // Check if pin is the same version, if same, do nothing, if not error + NImportResolved::Pin { pins: existing_pins, .. } => { + existing_pins.extend(new_pins) + } + // do nothing + NImportResolved::Repin { .. } => {} + // Replace with new pin + NImportResolved::Auto { .. } => { + imports.insert(key, imp); + } + } + } else { + imports.insert(key, imp.clone()); + } + } + NImportResolved::Auto { .. } => { + if !imports.contains_key(&key) { + imports.insert(key, imp); + } + } } } } - imports.sort(); Ok(imports) } } diff --git a/backend/parsers/windmill-parser-py-imports/tests/tests.rs b/backend/parsers/windmill-parser-py-imports/tests/tests.rs index a634f247dd..d734cb8ead 100644 --- a/backend/parsers/windmill-parser-py-imports/tests/tests.rs +++ b/backend/parsers/windmill-parser-py-imports/tests/tests.rs @@ -19,7 +19,7 @@ def main(): "; let mut already_visited = vec![]; - let r = parse_python_imports( + let (r, ..) = parse_python_imports( code, "test-workspace", "f/foo/bar", @@ -52,7 +52,7 @@ def main(): "; let mut already_visited = vec![]; - let r = parse_python_imports( + let (r, ..) = parse_python_imports( code, "test-workspace", "f/foo/bar", @@ -83,7 +83,7 @@ def main(): "; let mut already_visited = vec![]; - let r = parse_python_imports( + let (r, ..) = parse_python_imports( code, "test-workspace", "f/foo/bar", diff --git a/backend/tests/fixtures/lockfile_python.sql b/backend/tests/fixtures/lockfile_python.sql new file mode 100644 index 0000000000..27f7b103f0 --- /dev/null +++ b/backend/tests/fixtures/lockfile_python.sql @@ -0,0 +1,51 @@ +INSERT INTO public.script(workspace_id, created_by, content, schema, summary, description, path, hash, language, lock) VALUES ( +'test-workspace', +'test-user', +' +# requirements: +# microdot==2.2.0 + +import pandas +import requests +import tiny # pin: tiny==0.1.2 + +def main(): + pass +', +'{"$schema":"https://json-schema.org/draft/2020-12/schema","properties":{},"required":[],"type":"object"}', +'', +'', +'f/system/requirements', 12346, 'python3', ''); + +INSERT INTO public.script(workspace_id, created_by, content, schema, summary, description, path, hash, language, lock) VALUES ( +'test-workspace', +'test-user', +' +# extra_requirements: +# bottle==0.13.2 + +import tiny + +def main(): + pass +', +'{"$schema":"https://json-schema.org/draft/2020-12/schema","properties":{},"required":[],"type":"object"}', +'', +'', +'f/system/extra_requirements', 12347, 'python3', ''); + + +INSERT INTO public.script(workspace_id, created_by, content, schema, summary, description, path, hash, language, lock) VALUES ( +'test-workspace', +'test-user', +' +import tiny # pin: bottle==0.13.2 +import simplejson # pin: simplejson==3.19.3 + +def main(): + return [test1(), test2(), test3(), test4()] +', +'{"$schema":"https://json-schema.org/draft/2020-12/schema","properties":{},"required":[],"type":"object"}', +'', +'', +'f/system/pins', 12348, 'python3', ''); diff --git a/backend/tests/worker.rs b/backend/tests/worker.rs index c93256a450..182ed60f2e 100644 --- a/backend/tests/worker.rs +++ b/backend/tests/worker.rs @@ -3831,6 +3831,209 @@ def main(): run_preview_relative_imports(&db, content, ScriptLang::Python3).await; } +async fn assert_lockfile( + db: &Pool, + script_content: String, + language: ScriptLang, + expected_lines: Vec<&str>, +) { + initialize_tracing().await; + let server = ApiServer::start(db.clone()).await; + let port = server.addr.port(); + let client = windmill_api_client::create_client( + &format!("http://localhost:{port}"), + "SECRET_TOKEN".to_string(), + ); + + client + .create_script( + "test-workspace", + &NewScript { + language: NewScriptLanguage::from_str(language.as_str()).unwrap(), + content: script_content, + path: "f/system/test_import".to_string(), + concurrent_limit: None, + concurrency_time_window_s: None, + cache_ttl: None, + dedicated_worker: None, + description: "".to_string(), + draft_only: None, + envs: vec![], + is_template: None, + kind: None, + parent_hash: None, + lock: None, + summary: "".to_string(), + tag: None, + schema: std::collections::HashMap::new(), + ws_error_handler_muted: Some(false), + priority: None, + delete_after_use: None, + timeout: None, + restart_unless_cancelled: None, + deployment_message: None, + concurrency_key: None, + visible_to_runner_only: None, + no_main_func: None, + codebase: None, + has_preprocessor: None, + on_behalf_of_email: None, + }, + ) + .await + .unwrap(); + + let mut completed = listen_for_completed_jobs(&db).await; + let db2 = db.clone(); + in_test_worker( + &db, + async move { + completed.next().await; // deployed script + + let script = sqlx::query!( + "SELECT hash FROM script WHERE path = $1", + "f/system/test_import".to_string() + ) + .fetch_one(&db2) + .await + .unwrap(); + + let job = RunJob::from(JobPayload::Dependencies { + path: "f/system/test_import".to_string(), + hash: ScriptHash(script.hash), + dedicated_worker: None, + language, + }) + .push(&db2) + .await; + + completed.next().await; // completed job + + let result = completed_job(job, &db2).await.json_result().unwrap(); + + assert_eq!( + result, + json!({ + "lock": expected_lines.join("\n"), + "status": "Successful lock file generation" + }) + ); + }, + port, + ) + .await; +} +#[sqlx::test(fixtures("base", "lockfile_python"))] +async fn test_requirements_python(db: Pool) { + let content = r#" +# py311 +# requirements: +# tiny==0.1.3 + +import bar +import baz # pin: foo +import baz # repin: fee +import bug # repin: free + +def main(): + pass +"# + .to_string(); + + assert_lockfile( + &db, + content, + ScriptLang::Python3, + vec!["# py311", "tiny==0.1.3"], + ) + .await; +} +#[sqlx::test(fixtures("base", "lockfile_python"))] +async fn test_extra_requirements_python(db: Pool) { + { + let content = r#" +# py311 +# extra_requirements: +# tiny + +import f.system.extra_requirements +import tiny # pin: tiny==0.1.0 +import tiny # pin: tiny==0.1.1 +import tiny # repin: tiny==0.1.2 + +def main(): + pass + "# + .to_string(); + + assert_lockfile( + &db, + content, + ScriptLang::Python3, + vec!["# py311", "bottle==0.13.2", "tiny==0.1.2"], + ) + .await; + } +} +#[sqlx::test(fixtures("base", "lockfile_python"))] +async fn test_extra_requirements_python2(db: Pool) { + + let content = r#" +# py311 +# extra_requirements: +# tiny==0.1.3 + +import simplejson # pin: simplejson==3.20.1 +def main(): + pass +"# + .to_string(); + + assert_lockfile( + &db, + content, + ScriptLang::Python3, + vec![ + "# py311", + "simplejson==3.20.1", + "tiny==0.1.3" + ], + ) + .await; + +} + +#[sqlx::test(fixtures("base", "lockfile_python"))] +async fn test_pins_python(db: Pool) { + let content = r#" +# py311 +# extra_requirements: +# tiny==0.1.3 + +import f.system.requirements +import f.system.pins +import tiny # repin: bottle==0.13.0 +import simplejson + +def main(): + pass +"# + .to_string(); + + assert_lockfile( + &db, + content, + ScriptLang::Python3, + vec![ + "# py311", + "bottle==0.13.0", + "microdot==2.2.0", + "simplejson==3.19.3", + "tiny==0.1.3" + ], + ) + .await; +} #[sqlx::test(fixtures("base", "result_format"))] async fn test_result_format(db: Pool) { let ordered_result_job_id = "1eecb96a-c8b0-4a3d-b1b6-087878c55e41"; diff --git a/backend/windmill-worker/src/python_executor.rs b/backend/windmill-worker/src/python_executor.rs index f07b9abfe2..c642abae49 100644 --- a/backend/windmill-worker/src/python_executor.rs +++ b/backend/windmill-worker/src/python_executor.rs @@ -1439,6 +1439,7 @@ async fn handle_python_deps( .clone(); let mut requirements; + let compilation_error_hint; let mut annotated_pyv = None; let mut annotated_pyv_numeric = None; let is_deployed = requirements_o.is_some(); @@ -1449,23 +1450,26 @@ async fn handle_python_deps( None => { let mut already_visited = vec![]; - requirements = match conn { - Connection::Sql(db) => windmill_parser_py_imports::parse_python_imports( - inner_content, - w_id, - script_path, - db, - &mut already_visited, - &mut annotated_pyv_numeric, - ) - .await? - .join("\n"), + (requirements, compilation_error_hint) = match conn { + Connection::Sql(db) => { + let (r, h) = windmill_parser_py_imports::parse_python_imports( + inner_content, + w_id, + script_path, + db, + &mut already_visited, + &mut annotated_pyv_numeric, + ) + .await?; + + (r.join("\n"), h) + } Connection::Http(_) => match precomputed_agent_info { Some(PrecomputedAgentInfo::Python { py_version, requirements }) => { annotated_pyv_numeric = py_version; - requirements.clone().unwrap_or_else(|| "".to_string()) + (requirements.clone().unwrap_or_else(|| "".to_string()), None) } - _ => "".to_string(), + _ => ("".to_string(), None), }, }; @@ -1487,7 +1491,11 @@ async fn handle_python_deps( ) .await .map_err(|e| { - Error::ExecutionErr(format!("pip compile failed: {}", e.to_string())) + Error::ExecutionErr(format!( + "pip compile failed: {}{}", + e.to_string(), + compilation_error_hint.unwrap_or_default() + )) })?; } &requirements diff --git a/backend/windmill-worker/src/worker_lockfiles.rs b/backend/windmill-worker/src/worker_lockfiles.rs index 8ba9ee501a..6c56f1acef 100644 --- a/backend/windmill-worker/src/worker_lockfiles.rs +++ b/backend/windmill-worker/src/worker_lockfiles.rs @@ -1853,6 +1853,7 @@ async fn capture_dependency_job( &mut annotated_pyv_numeric, ) .await? + .0 .join("\n") }; From 591bb4b6a878fdf6598d6525e69a5de65a5f3863 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Fri, 11 Apr 2025 22:35:52 +0000 Subject: [PATCH 204/739] update ee repo ref --- backend/ee-repo-ref.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/ee-repo-ref.txt b/backend/ee-repo-ref.txt index 9c55ceeb81..6081d9fd35 100644 --- a/backend/ee-repo-ref.txt +++ b/backend/ee-repo-ref.txt @@ -1 +1 @@ -44c3e23922097d4386183e56b6b3dc540c70d71b \ No newline at end of file +47869a5803b421a754173250fed79b63fe001ebd \ No newline at end of file From 5010850cdca1d7536c58d80957201d630203aa54 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Fri, 11 Apr 2025 23:05:10 +0000 Subject: [PATCH 205/739] fix inline script update effect --- .../InlineScriptEditor.svelte | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/frontend/src/lib/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte b/frontend/src/lib/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte index 8c29c5bdc8..cdf071618e 100644 --- a/frontend/src/lib/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte +++ b/frontend/src/lib/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte @@ -63,11 +63,16 @@ return schema } - $: inlineScript && - (inlineScript.path = `${defaultIfEmptyString( - $appPath, - `u/${$userStore?.username ?? 'unknown'}/newapp` - )}/${name?.replaceAll(' ', '_')}`) + $: name && onNameChange() + + function onNameChange() { + if (inlineScript) { + inlineScript.path = `${defaultIfEmptyString( + $appPath, + `u/${$userStore?.username ?? 'unknown'}/newapp` + )}/${name?.replaceAll(' ', '_')}` + } + } onMount(async () => { if (inlineScript && !inlineScript.schema) { @@ -85,6 +90,9 @@ if (inlineScript?.language == 'frontend' && inlineScript.content) { inferSuggestions(inlineScript.content) } + if (!inlineScript?.path) { + onNameChange() + } }) const dispatch = createEventDispatcher() From 12ba15c92863faae50b95f83dc396821cba3bc09 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Sat, 12 Apr 2025 11:09:21 +0000 Subject: [PATCH 206/739] improve benchmarks --- backend/pg_log_tail | 0 backend/plot2.py | 33 +++++++++++++++++++ backend/src/monitor.rs | 2 +- .../src/bench.rs | 12 +++---- backend/windmill-common/src/lib.rs | 3 ++ backend/windmill-queue/src/jobs.rs | 14 ++++++++ backend/windmill-worker/src/lib.rs | 2 -- .../windmill-worker/src/result_processor.rs | 4 ++- backend/windmill-worker/src/worker.rs | 18 +++++++--- backend/windmill-worker/src/worker_flow.rs | 4 +-- 10 files changed, 76 insertions(+), 16 deletions(-) delete mode 100644 backend/pg_log_tail create mode 100644 backend/plot2.py rename backend/{windmill-worker => windmill-common}/src/bench.rs (98%) diff --git a/backend/pg_log_tail b/backend/pg_log_tail deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/backend/plot2.py b/backend/plot2.py new file mode 100644 index 0000000000..5a6624bc14 --- /dev/null +++ b/backend/plot2.py @@ -0,0 +1,33 @@ +import json +import matplotlib.pyplot as plt + +# Path to the profiling JSON file +# file_path = "/tmp/windmill/profiling_main.json" +file_path = "/tmp/profiling.json" + +# Load the JSON data +with open(file_path, "r") as f: + data = json.load(f) + +# Extract timings for "pre pull->post pull" +pre_post_pull_timings = [ + timing / 1000000.0 for entry in data["timings"] + for step, timing in entry["timings"] + # if step == "pre pull->post pull" + if step == "->job pulled from DB" +] + +# Plotting the distribution +plt.figure(figsize=(10, 6)) +# plt.hist(pre_post_pull_timings, bins=10, edgecolor='black') +plt.scatter(range(len(pre_post_pull_timings)), pre_post_pull_timings, + alpha=1.0, # Transparency level + s=40) # Size of the dots`) +plt.title("Distribution of 'pre pull->post pull' timings") +# plt.xlabel("Time (ms)") +# plt.ylabel("Frequency") +plt.xlabel("Sample Index") +plt.ylabel("Time (ms)") +plt.grid(True) +plt.tight_layout() +plt.show() \ No newline at end of file diff --git a/backend/src/monitor.rs b/backend/src/monitor.rs index 6b609dc9a1..8dae3f8c5e 100644 --- a/backend/src/monitor.rs +++ b/backend/src/monitor.rs @@ -1914,7 +1914,7 @@ async fn handle_zombie_jobs(db: &Pool, base_internal_url: &str, worker worker_name, send_result_never_used, #[cfg(feature = "benchmark")] - &mut windmill_worker::bench::BenchmarkIter::new(), + &mut windmill_common::bench::BenchmarkIter::new(), ) .await; } diff --git a/backend/windmill-worker/src/bench.rs b/backend/windmill-common/src/bench.rs similarity index 98% rename from backend/windmill-worker/src/bench.rs rename to backend/windmill-common/src/bench.rs index 5006d5a34c..c851198b2a 100644 --- a/backend/windmill-worker/src/bench.rs +++ b/backend/windmill-common/src/bench.rs @@ -1,9 +1,9 @@ -use serde::Serialize; -use tokio::time::Instant; -use windmill_common::{ +use crate::{ worker::{write_file, TMP_DIR}, DB, }; +use serde::Serialize; +use tokio::time::Instant; #[derive(Serialize)] pub struct BenchmarkInfo { @@ -41,8 +41,8 @@ impl BenchmarkInfo { self.total_duration = Some(total_duration as u64); println!( - "Writing benchmark {path}, duration of benchmark: {total_duration}s and RPS: {}", - self.iters as f64 / total_duration as f64 + "Writing benchmark {path}, duration of benchmark: {total_duration}ms and RPS: {}", + self.iters as f64 / total_duration as f64 * 1000.0 ); write_file(TMP_DIR, path, &serde_json::to_string(&self).unwrap()).expect("write profiling"); Ok(()) @@ -79,7 +79,7 @@ impl BenchmarkIter { } pub async fn benchmark_init(benchmark_jobs: i32, db: &DB) { - use windmill_common::{jobs::JobKind, scripts::ScriptLang}; + use crate::{jobs::JobKind, scripts::ScriptLang}; let benchmark_kind = std::env::var("BENCHMARK_KIND").unwrap_or("noop".to_string()); diff --git a/backend/windmill-common/src/lib.rs b/backend/windmill-common/src/lib.rs index fd43db2f7c..0d2c746d3e 100644 --- a/backend/windmill-common/src/lib.rs +++ b/backend/windmill-common/src/lib.rs @@ -25,6 +25,8 @@ use sqlx::{Pool, Postgres}; pub mod agent_workers; pub mod apps; pub mod auth; +#[cfg(feature = "benchmark")] +pub mod bench; pub mod cache; pub mod db; pub mod ee; @@ -38,6 +40,7 @@ pub mod indexer; pub mod job_metrics; #[cfg(feature = "parquet")] pub mod job_s3_helpers_ee; + pub mod jobs; pub mod jwt; pub mod more_serde; diff --git a/backend/windmill-queue/src/jobs.rs b/backend/windmill-queue/src/jobs.rs index cf0fb8ce8b..4fb7210048 100644 --- a/backend/windmill-queue/src/jobs.rs +++ b/backend/windmill-queue/src/jobs.rs @@ -29,7 +29,11 @@ use uuid::Uuid; use windmill_audit::audit_ee::{audit_log, AuditAuthor}; use windmill_audit::ActionKind; +#[cfg(feature = "benchmark")] +use windmill_common::add_time; use windmill_common::auth::JobPerms; +#[cfg(feature = "benchmark")] +use windmill_common::bench::BenchmarkIter; use windmill_common::utils::now_from_db; use windmill_common::worker::{Connection, SCRIPT_TOKEN_EXPIRY}; use windmill_common::{ @@ -2310,6 +2314,7 @@ pub async fn pull( suspend_first: bool, worker_name: &str, query_o: Option<(String, String)>, + #[cfg(feature = "benchmark")] bench: &mut BenchmarkIter, ) -> windmill_common::error::Result { loop { if let Some((query_suspended, query_no_suspend)) = query_o.as_ref() { @@ -2351,6 +2356,7 @@ pub async fn pull( db, suspend_first, worker_name, + #[cfg(feature = "benchmark")] bench, ) .await?; @@ -2549,6 +2555,7 @@ async fn pull_single_job_and_mark_as_running_no_concurrency_limit<'c>( db: &Pool, suspend_first: bool, worker_name: &str, + #[cfg(feature = "benchmark")] bench: &mut BenchmarkIter, ) -> windmill_common::error::Result<(Option, bool)> { let job_and_suspended: (Option, bool) = { /* Jobs can be started if they: @@ -2589,11 +2596,18 @@ async fn pull_single_job_and_mark_as_running_no_concurrency_limit<'c>( for query in queries.iter() { // tracing::info!("Pulling job with query: {}", query); // let instant = std::time::Instant::now(); + + #[cfg(feature = "benchmark")] + add_time!(bench, "pre pull"); + let r = sqlx::query_as::<_, PulledJob>(query) .bind(worker_name) .fetch_optional(db) .await?; + #[cfg(feature = "benchmark")] + add_time!(bench, "post pull"); + if let Some(pulled_job) = r { // tracing::info!("pulled job: {:?}", instant.elapsed().as_micros()); diff --git a/backend/windmill-worker/src/lib.rs b/backend/windmill-worker/src/lib.rs index a9380c52e9..2b0a5d6f4a 100644 --- a/backend/windmill-worker/src/lib.rs +++ b/backend/windmill-worker/src/lib.rs @@ -13,8 +13,6 @@ mod bash_executor; #[cfg(feature = "java")] mod java_executor; -#[cfg(feature = "benchmark")] -pub mod bench; mod bun_executor; pub mod common; mod config; diff --git a/backend/windmill-worker/src/result_processor.rs b/backend/windmill-worker/src/result_processor.rs index 389bd067a8..e1b2a763f6 100644 --- a/backend/windmill-worker/src/result_processor.rs +++ b/backend/windmill-worker/src/result_processor.rs @@ -26,7 +26,7 @@ use windmill_common::{ }; #[cfg(feature = "benchmark")] -use crate::bench::{BenchmarkInfo, BenchmarkIter}; +use windmill_common::bench::{BenchmarkInfo, BenchmarkIter}; use windmill_queue::{ append_logs, get_queued_job, CanceledBy, JobCompleted, MiniPulledJob, WrappedError, @@ -507,6 +507,8 @@ pub async fn process_completed_job( })?; } + add_time!(bench, "pre add_completed_job"); + add_completed_job( db, &job, diff --git a/backend/windmill-worker/src/worker.rs b/backend/windmill-worker/src/worker.rs index 2081b90f5f..d6b96fd1c8 100644 --- a/backend/windmill-worker/src/worker.rs +++ b/backend/windmill-worker/src/worker.rs @@ -158,7 +158,7 @@ use crate::mssql_executor::do_mssql; use crate::bigquery_executor::do_bigquery; #[cfg(feature = "benchmark")] -use crate::bench::{benchmark_init, BenchmarkInfo, BenchmarkIter}; +use windmill_common::bench::{benchmark_init, BenchmarkInfo, BenchmarkIter}; use windmill_common::add_time; @@ -1002,8 +1002,10 @@ pub async fn run_worker( #[cfg(feature = "benchmark")] { - if let Some(db) = conn.as_sql() { - benchmark_init(benchmark_jobs, db).await; + if i_worker == 1 { + if let Some(db) = conn.as_sql() { + benchmark_init(benchmark_jobs, db).await; + } } } @@ -1322,7 +1324,15 @@ pub async fn run_worker( last_suspend_first = Instant::now(); } - let job = pull(&db, suspend_first, &worker_name, None).await; + let job = pull( + &db, + suspend_first, + &worker_name, + None, + #[cfg(feature = "benchmark")] + &mut bench, + ) + .await; add_time!(bench, "job pulled from DB"); let duration_pull_s = pull_time.elapsed().as_secs_f64(); diff --git a/backend/windmill-worker/src/worker_flow.rs b/backend/windmill-worker/src/worker_flow.rs index 27aef9d1f9..63cf414c53 100644 --- a/backend/windmill-worker/src/worker_flow.rs +++ b/backend/windmill-worker/src/worker_flow.rs @@ -11,8 +11,6 @@ use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::Arc; use std::time::Duration; -#[cfg(feature = "benchmark")] -use crate::bench::BenchmarkIter; use crate::common::{cached_result_path, save_in_cache}; use crate::js_eval::{eval_timeout, IdContext}; use crate::{ @@ -30,6 +28,8 @@ use tracing::instrument; use uuid::Uuid; use windmill_common::add_time; use windmill_common::auth::JobPerms; +#[cfg(feature = "benchmark")] +use windmill_common::bench::BenchmarkIter; use windmill_common::cache::{self, RawData}; use windmill_common::db::Authed; use windmill_common::flow_status::{ From 8c6e620f5cce53dac1d99aa5ecb7b562db4b226e Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Sat, 12 Apr 2025 12:54:05 +0000 Subject: [PATCH 207/739] nit benchmarks --- backend/windmill-worker/src/worker.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/backend/windmill-worker/src/worker.rs b/backend/windmill-worker/src/worker.rs index d6b96fd1c8..ef13510a30 100644 --- a/backend/windmill-worker/src/worker.rs +++ b/backend/windmill-worker/src/worker.rs @@ -1002,10 +1002,8 @@ pub async fn run_worker( #[cfg(feature = "benchmark")] { - if i_worker == 1 { - if let Some(db) = conn.as_sql() { - benchmark_init(benchmark_jobs, db).await; - } + if let Some(db) = conn.as_sql() { + benchmark_init(benchmark_jobs, db).await; } } From fd47cd60163a736d7b12108a208fb6fd044b4130 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Sat, 12 Apr 2025 14:47:48 +0000 Subject: [PATCH 208/739] improve perf of setting api roles --- ...50412144540_improve_perf_api_role.down.sql | 1 + ...0250412144540_improve_perf_api_role.up.sql | 22 ++++ backend/windmill-common/src/db.rs | 105 +++++++++++------- backend/windmill-common/src/tracing_init.rs | 7 +- 4 files changed, 92 insertions(+), 43 deletions(-) create mode 100644 backend/migrations/20250412144540_improve_perf_api_role.down.sql create mode 100644 backend/migrations/20250412144540_improve_perf_api_role.up.sql diff --git a/backend/migrations/20250412144540_improve_perf_api_role.down.sql b/backend/migrations/20250412144540_improve_perf_api_role.down.sql new file mode 100644 index 0000000000..d2f607c5b8 --- /dev/null +++ b/backend/migrations/20250412144540_improve_perf_api_role.down.sql @@ -0,0 +1 @@ +-- Add down migration script here diff --git a/backend/migrations/20250412144540_improve_perf_api_role.up.sql b/backend/migrations/20250412144540_improve_perf_api_role.up.sql new file mode 100644 index 0000000000..8a521849fb --- /dev/null +++ b/backend/migrations/20250412144540_improve_perf_api_role.up.sql @@ -0,0 +1,22 @@ +-- Add up migration script here + CREATE OR REPLACE FUNCTION set_session_context( + admin BOOLEAN, + username TEXT, + groups TEXT, + pgroups TEXT, + folders_read TEXT, + folders_write TEXT +) RETURNS void AS $$ +BEGIN + IF admin THEN + SET LOCAL ROLE windmill_admin; + ELSE + SET LOCAL ROLE windmill_user; + END IF; + PERFORM set_config('session.user', username, true); + PERFORM set_config('session.groups', groups, true); + PERFORM set_config('session.pgroups', pgroups, true); + PERFORM set_config('session.folders_read', folders_read, true); + PERFORM set_config('session.folders_write', folders_write, true); +END; +$$ LANGUAGE plpgsql; \ No newline at end of file diff --git a/backend/windmill-common/src/db.rs b/backend/windmill-common/src/db.rs index 96be430e73..47c698b05c 100644 --- a/backend/windmill-common/src/db.rs +++ b/backend/windmill-common/src/db.rs @@ -72,12 +72,6 @@ impl UserDB { where T: Authable, { - let user = if authed.is_admin() { - "windmill_admin" - } else { - "windmill_user" - }; - let (folders_write, folders_read): &(Vec<_>, Vec<_>) = &authed.folders().into_iter().partition(|x| x.1); @@ -95,10 +89,6 @@ impl UserDB { let mut tx = self.db.begin().await?; - sqlx::query(&format!("SET LOCAL ROLE {}", user)) - .execute(&mut *tx) - .await?; - if let Some(schema) = PG_SCHEMA.as_ref() { sqlx::query(&format!("SET LOCAL search_path TO {}", schema)) .execute(&mut *tx) @@ -106,53 +96,86 @@ impl UserDB { } sqlx::query!( - "SELECT set_config('session.user', $1, true)", - authed.username() - ) - .fetch_optional(&mut *tx) - .await?; - - sqlx::query!( - "SELECT set_config('session.groups', $1, true)", - &authed.groups().join(",") - ) - .fetch_optional(&mut *tx) - .await?; - - sqlx::query!( - "SELECT set_config('session.pgroups', $1, true)", - &authed + "SELECT set_session_context($1, $2, $3, $4, $5, $6)", + authed.is_admin(), + authed.username(), + authed.groups().join(","), + authed .groups() .iter() .map(|x| format!("g/{}", x)) .collect::>() - .join(",") - ) - .fetch_optional(&mut *tx) - .await?; - - sqlx::query!( - "SELECT set_config('session.folders_read', $1, true)", + .join(","), folders_read .iter() .map(|x| x.0.clone()) .collect::>() - .join(",") - ) - .fetch_optional(&mut *tx) - .await?; - - sqlx::query!( - "SELECT set_config('session.folders_write', $1, true)", + .join(","), folders_write .iter() .map(|x| x.0.clone()) .collect::>() .join(",") ) - .fetch_optional(&mut *tx) + .execute(&mut *tx) .await?; + // set_session_context( + // username TEXT, + // groups TEXT, + // pgroups TEXT, + // folders_read TEXT, + // folders_write TEXT + // ) + + // sqlx::query!( + // "SELECT set_config('session.user', $1, true)", + // authed.username() + // ) + // .fetch_optional(&mut *tx) + // .await?; + + // sqlx::query!( + // "SELECT set_config('session.groups', $1, true)", + // &authed.groups().join(",") + // ) + // .fetch_optional(&mut *tx) + // .await?; + + // sqlx::query!( + // "SELECT set_config('session.pgroups', $1, true)", + // &authed + // .groups() + // .iter() + // .map(|x| format!("g/{}", x)) + // .collect::>() + // .join(",") + // ) + // .fetch_optional(&mut *tx) + // .await?; + + // sqlx::query!( + // "SELECT set_config('session.folders_read', $1, true)", + // folders_read + // .iter() + // .map(|x| x.0.clone()) + // .collect::>() + // .join(",") + // ) + // .fetch_optional(&mut *tx) + // .await?; + + // sqlx::query!( + // "SELECT set_config('session.folders_write', $1, true)", + // folders_write + // .iter() + // .map(|x| x.0.clone()) + // .collect::>() + // .join(",") + // ) + // .fetch_optional(&mut *tx) + // .await?; + Ok(tx) } } diff --git a/backend/windmill-common/src/tracing_init.rs b/backend/windmill-common/src/tracing_init.rs index 5e6ef6940e..5ed5cec752 100644 --- a/backend/windmill-common/src/tracing_init.rs +++ b/backend/windmill-common/src/tracing_init.rs @@ -60,8 +60,11 @@ pub fn initialize_tracing( "RUST_LOG", &format!("windmill={}", rust_log_env.as_ref().unwrap()), ) - } - let default_env_filter = if rust_log_env.is_ok_and(|x| x == "debug") { + } else if rust_log_env.as_ref().is_ok_and(|x| x == "sqlxdebug") { + std::env::set_var("RUST_LOG", "windmill=debug,sqlx=debug"); + }; + + let default_env_filter = if rust_log_env.is_ok_and(|x| x == "debug" || x == "sqlxdebug") { LevelFilter::DEBUG } else { LevelFilter::INFO From 496960d349885a9dc33165ebf09e593e9773e5e8 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Sat, 12 Apr 2025 15:02:43 +0000 Subject: [PATCH 209/739] improve last_job_suspended_history --- backend/windmill-worker/src/worker.rs | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/backend/windmill-worker/src/worker.rs b/backend/windmill-worker/src/worker.rs index ef13510a30..b92a3bc560 100644 --- a/backend/windmill-worker/src/worker.rs +++ b/backend/windmill-worker/src/worker.rs @@ -1127,7 +1127,7 @@ pub async fn run_worker( }; let mut suspend_first_success = false; let mut last_reading = Instant::now() - Duration::from_secs(NUM_SECS_READINGS + 1); - let mut last_30jobs_suspended: Vec = vec![false; 30]; + let mut last_30jobs_suspended = 0; let mut last_suspend_first = Instant::now(); let mut killed_but_draining_same_worker_jobs = false; @@ -1311,9 +1311,7 @@ pub async fn run_worker( match &conn { Connection::Sql(db) => { let pull_time = Instant::now(); - let likelihood_of_suspend = (1.0 - + last_30jobs_suspended.iter().filter(|&&x| x).count() as f64) - / 31.0; + let likelihood_of_suspend = last_30jobs_suspended as f64 / 30.0; let suspend_first = suspend_first_success || rand::random::() < likelihood_of_suspend || last_suspend_first.elapsed().as_secs_f64() > 5.0; @@ -1364,10 +1362,11 @@ pub async fn run_worker( if let Ok(j) = job.as_ref() { let suspend_success = j.suspended; if suspend_first { - last_30jobs_suspended.push(suspend_success); - if last_30jobs_suspended.len() > 30 { - last_30jobs_suspended.remove(0); + if last_30jobs_suspended < 30 { + last_30jobs_suspended += 1; } + } else { + last_30jobs_suspended -= 1; } suspend_first_success = suspend_first && suspend_success; #[cfg(feature = "prometheus")] From 7a4f64b92d9bdd2ff51f437702a897cbfff71f12 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Sat, 12 Apr 2025 15:26:56 +0000 Subject: [PATCH 210/739] improve perf of push --- ...24582fdb302883aebd2da187ac0084e767ea3.json | 22 -- ...34546cddaf1029618ed14015fd7b0a7017441.json | 27 +++ ...7b9cc3c82d815d99b3d435adcfbb5a9246124.json | 22 -- ...06caccb849db9e0f71d86da655b01c6a3e8d0.json | 27 --- ...0f0b76dc38476670f9fc0667b057d2766d42e.json | 22 -- ...2c25f8768b220e53bf469550a3a3697ab756a.json | 22 -- ...0a72f5d341b053218e7aec83a834cf7ccc98f.json | 21 -- ...5711a40924ec551a7589a64ee96f8aa7f6a21.json | 22 -- ...5d76ae2223d59e9f321a8b6d0c27adc09f741.json | 14 -- ...98b2f2d92a6d7f687a9dd5a70edb3d5a63e6.json} | 16 +- backend/ee-repo-ref.txt | 2 +- backend/windmill-queue/src/jobs.rs | 212 ++++++++++-------- 12 files changed, 158 insertions(+), 271 deletions(-) delete mode 100644 backend/.sqlx/query-122090a0f89e5248a0a0f199ebd24582fdb302883aebd2da187ac0084e767ea3.json create mode 100644 backend/.sqlx/query-18ddbb9eb4c0ec03e6170f8c70634546cddaf1029618ed14015fd7b0a7017441.json delete mode 100644 backend/.sqlx/query-29fbc3a8c35845a997cd548ed417b9cc3c82d815d99b3d435adcfbb5a9246124.json delete mode 100644 backend/.sqlx/query-31df83e9eb6078e93ec5fe4168306caccb849db9e0f71d86da655b01c6a3e8d0.json delete mode 100644 backend/.sqlx/query-6199e8be5cb13db71108e555ea20f0b76dc38476670f9fc0667b057d2766d42e.json delete mode 100644 backend/.sqlx/query-6c90d5ea2a09b47b81fdab465062c25f8768b220e53bf469550a3a3697ab756a.json delete mode 100644 backend/.sqlx/query-7d78efab0a588f56a13a7b5251f0a72f5d341b053218e7aec83a834cf7ccc98f.json delete mode 100644 backend/.sqlx/query-9897705b7c265333559df757a725711a40924ec551a7589a64ee96f8aa7f6a21.json delete mode 100644 backend/.sqlx/query-ca8bf3dda133556ee7051d5436a5d76ae2223d59e9f321a8b6d0c27adc09f741.json rename backend/.sqlx/{query-29624682d687790dd199c4af759132d79fdb2982de111cb5fd43e3d9ecd0f15e.json => query-cccdcb7fe7968eadfc04d8957a8e98b2f2d92a6d7f687a9dd5a70edb3d5a63e6.json} (51%) diff --git a/backend/.sqlx/query-122090a0f89e5248a0a0f199ebd24582fdb302883aebd2da187ac0084e767ea3.json b/backend/.sqlx/query-122090a0f89e5248a0a0f199ebd24582fdb302883aebd2da187ac0084e767ea3.json deleted file mode 100644 index a329998c95..0000000000 --- a/backend/.sqlx/query-122090a0f89e5248a0a0f199ebd24582fdb302883aebd2da187ac0084e767ea3.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT set_config('session.pgroups', $1, true)", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "set_config", - "type_info": "Text" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - null - ] - }, - "hash": "122090a0f89e5248a0a0f199ebd24582fdb302883aebd2da187ac0084e767ea3" -} diff --git a/backend/.sqlx/query-18ddbb9eb4c0ec03e6170f8c70634546cddaf1029618ed14015fd7b0a7017441.json b/backend/.sqlx/query-18ddbb9eb4c0ec03e6170f8c70634546cddaf1029618ed14015fd7b0a7017441.json new file mode 100644 index 0000000000..c1258697c9 --- /dev/null +++ b/backend/.sqlx/query-18ddbb9eb4c0ec03e6170f8c70634546cddaf1029618ed14015fd7b0a7017441.json @@ -0,0 +1,27 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT set_session_context($1, $2, $3, $4, $5, $6)", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "set_session_context", + "type_info": "Void" + } + ], + "parameters": { + "Left": [ + "Bool", + "Text", + "Text", + "Text", + "Text", + "Text" + ] + }, + "nullable": [ + null + ] + }, + "hash": "18ddbb9eb4c0ec03e6170f8c70634546cddaf1029618ed14015fd7b0a7017441" +} diff --git a/backend/.sqlx/query-29fbc3a8c35845a997cd548ed417b9cc3c82d815d99b3d435adcfbb5a9246124.json b/backend/.sqlx/query-29fbc3a8c35845a997cd548ed417b9cc3c82d815d99b3d435adcfbb5a9246124.json deleted file mode 100644 index 72f3f1f469..0000000000 --- a/backend/.sqlx/query-29fbc3a8c35845a997cd548ed417b9cc3c82d815d99b3d435adcfbb5a9246124.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT set_config('session.folders_read', $1, true)", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "set_config", - "type_info": "Text" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - null - ] - }, - "hash": "29fbc3a8c35845a997cd548ed417b9cc3c82d815d99b3d435adcfbb5a9246124" -} diff --git a/backend/.sqlx/query-31df83e9eb6078e93ec5fe4168306caccb849db9e0f71d86da655b01c6a3e8d0.json b/backend/.sqlx/query-31df83e9eb6078e93ec5fe4168306caccb849db9e0f71d86da655b01c6a3e8d0.json deleted file mode 100644 index b96c05d674..0000000000 --- a/backend/.sqlx/query-31df83e9eb6078e93ec5fe4168306caccb849db9e0f71d86da655b01c6a3e8d0.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO v2_job_queue\n (workspace_id, id, running, scheduled_for, started_at, tag, priority)\n VALUES ($1, $2, $3, COALESCE($4, now()), CASE WHEN $3 THEN now() END, $5, $6) RETURNING id AS \"id!\"", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id!", - "type_info": "Uuid" - } - ], - "parameters": { - "Left": [ - "Varchar", - "Uuid", - "Bool", - "Timestamptz", - "Varchar", - "Int2" - ] - }, - "nullable": [ - false - ] - }, - "hash": "31df83e9eb6078e93ec5fe4168306caccb849db9e0f71d86da655b01c6a3e8d0" -} diff --git a/backend/.sqlx/query-6199e8be5cb13db71108e555ea20f0b76dc38476670f9fc0667b057d2766d42e.json b/backend/.sqlx/query-6199e8be5cb13db71108e555ea20f0b76dc38476670f9fc0667b057d2766d42e.json deleted file mode 100644 index 2313dd087c..0000000000 --- a/backend/.sqlx/query-6199e8be5cb13db71108e555ea20f0b76dc38476670f9fc0667b057d2766d42e.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT set_config('session.groups', $1, true)", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "set_config", - "type_info": "Text" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - null - ] - }, - "hash": "6199e8be5cb13db71108e555ea20f0b76dc38476670f9fc0667b057d2766d42e" -} diff --git a/backend/.sqlx/query-6c90d5ea2a09b47b81fdab465062c25f8768b220e53bf469550a3a3697ab756a.json b/backend/.sqlx/query-6c90d5ea2a09b47b81fdab465062c25f8768b220e53bf469550a3a3697ab756a.json deleted file mode 100644 index fb5e174ced..0000000000 --- a/backend/.sqlx/query-6c90d5ea2a09b47b81fdab465062c25f8768b220e53bf469550a3a3697ab756a.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT set_config('session.user', $1, true)", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "set_config", - "type_info": "Text" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - null - ] - }, - "hash": "6c90d5ea2a09b47b81fdab465062c25f8768b220e53bf469550a3a3697ab756a" -} diff --git a/backend/.sqlx/query-7d78efab0a588f56a13a7b5251f0a72f5d341b053218e7aec83a834cf7ccc98f.json b/backend/.sqlx/query-7d78efab0a588f56a13a7b5251f0a72f5d341b053218e7aec83a834cf7ccc98f.json deleted file mode 100644 index 07c93d0d88..0000000000 --- a/backend/.sqlx/query-7d78efab0a588f56a13a7b5251f0a72f5d341b053218e7aec83a834cf7ccc98f.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO job_perms (job_id, email, username, is_admin, is_operator, folders, groups, workspace_id) \n values ($1, $2, $3, $4, $5, $6, $7, $8) \n ON CONFLICT (job_id) DO UPDATE SET email = $2, username = $3, is_admin = $4, is_operator = $5, folders = $6, groups = $7, workspace_id = $8", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Uuid", - "Varchar", - "Varchar", - "Bool", - "Bool", - "JsonbArray", - "TextArray", - "Varchar" - ] - }, - "nullable": [] - }, - "hash": "7d78efab0a588f56a13a7b5251f0a72f5d341b053218e7aec83a834cf7ccc98f" -} diff --git a/backend/.sqlx/query-9897705b7c265333559df757a725711a40924ec551a7589a64ee96f8aa7f6a21.json b/backend/.sqlx/query-9897705b7c265333559df757a725711a40924ec551a7589a64ee96f8aa7f6a21.json deleted file mode 100644 index abad579224..0000000000 --- a/backend/.sqlx/query-9897705b7c265333559df757a725711a40924ec551a7589a64ee96f8aa7f6a21.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT set_config('session.folders_write', $1, true)", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "set_config", - "type_info": "Text" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - null - ] - }, - "hash": "9897705b7c265333559df757a725711a40924ec551a7589a64ee96f8aa7f6a21" -} diff --git a/backend/.sqlx/query-ca8bf3dda133556ee7051d5436a5d76ae2223d59e9f321a8b6d0c27adc09f741.json b/backend/.sqlx/query-ca8bf3dda133556ee7051d5436a5d76ae2223d59e9f321a8b6d0c27adc09f741.json deleted file mode 100644 index b7a302213a..0000000000 --- a/backend/.sqlx/query-ca8bf3dda133556ee7051d5436a5d76ae2223d59e9f321a8b6d0c27adc09f741.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO v2_job_runtime (id, ping) VALUES ($1, null)", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Uuid" - ] - }, - "nullable": [] - }, - "hash": "ca8bf3dda133556ee7051d5436a5d76ae2223d59e9f321a8b6d0c27adc09f741" -} diff --git a/backend/.sqlx/query-29624682d687790dd199c4af759132d79fdb2982de111cb5fd43e3d9ecd0f15e.json b/backend/.sqlx/query-cccdcb7fe7968eadfc04d8957a8e98b2f2d92a6d7f687a9dd5a70edb3d5a63e6.json similarity index 51% rename from backend/.sqlx/query-29624682d687790dd199c4af759132d79fdb2982de111cb5fd43e3d9ecd0f15e.json rename to backend/.sqlx/query-cccdcb7fe7968eadfc04d8957a8e98b2f2d92a6d7f687a9dd5a70edb3d5a63e6.json index 3ea932c5ca..412b64c480 100644 --- a/backend/.sqlx/query-29624682d687790dd199c4af759132d79fdb2982de111cb5fd43e3d9ecd0f15e.json +++ b/backend/.sqlx/query-cccdcb7fe7968eadfc04d8957a8e98b2f2d92a6d7f687a9dd5a70edb3d5a63e6.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "INSERT INTO v2_job (id, workspace_id, raw_code, raw_lock, raw_flow, tag, parent_job,\n created_by, permissioned_as, runnable_id, runnable_path, args, kind, trigger,\n script_lang, same_worker, pre_run_error, permissioned_as_email, visible_to_owner,\n flow_innermost_root_job, concurrent_limit, concurrency_time_window_s, timeout, flow_step_id,\n cache_ttl, priority, trigger_kind, script_entrypoint_override, preprocessed)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18,\n $19, $20, $21, $22, $23, $24, $25, $26,\n CASE WHEN $14::VARCHAR IS NOT NULL THEN 'schedule'::job_trigger_kind END,\n ($12::JSONB)->>'_ENTRYPOINT_OVERRIDE', $27)", + "query": "WITH inserted_job AS (\n INSERT INTO v2_job (id, workspace_id, raw_code, raw_lock, raw_flow, tag, parent_job,\n created_by, permissioned_as, runnable_id, runnable_path, args, kind, trigger,\n script_lang, same_worker, pre_run_error, permissioned_as_email, visible_to_owner,\n flow_innermost_root_job, concurrent_limit, concurrency_time_window_s, timeout, flow_step_id,\n cache_ttl, priority, trigger_kind, script_entrypoint_override, preprocessed)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18,\n $19, $20, $21, $22, $23, $24, $25, $26,\n CASE WHEN $14::VARCHAR IS NOT NULL THEN 'schedule'::job_trigger_kind END,\n ($12::JSONB)->>'_ENTRYPOINT_OVERRIDE', $27)\n ),\n inserted_runtime AS (\n INSERT INTO v2_job_runtime (id, ping) VALUES ($1, null)\n ),\n inserted_job_perms AS (\n INSERT INTO job_perms (job_id, email, username, is_admin, is_operator, folders, groups, workspace_id) \n values ($1, $32, $33, $34, $35, $36, $37, $2) \n ON CONFLICT (job_id) DO UPDATE SET email = $32, username = $33, is_admin = $34, is_operator = $35, folders = $36, groups = $37, workspace_id = $2\n )\n INSERT INTO v2_job_queue\n (workspace_id, id, running, scheduled_for, started_at, tag, priority)\n VALUES ($2, $1, $28, COALESCE($29, now()), CASE WHEN $27 THEN now() END, $30, $31)", "describe": { "columns": [], "parameters": { @@ -86,10 +86,20 @@ "Varchar", "Int4", "Int2", - "Bool" + "Bool", + "Bool", + "Timestamptz", + "Varchar", + "Int2", + "Varchar", + "Varchar", + "Bool", + "Bool", + "JsonbArray", + "TextArray" ] }, "nullable": [] }, - "hash": "29624682d687790dd199c4af759132d79fdb2982de111cb5fd43e3d9ecd0f15e" + "hash": "cccdcb7fe7968eadfc04d8957a8e98b2f2d92a6d7f687a9dd5a70edb3d5a63e6" } diff --git a/backend/ee-repo-ref.txt b/backend/ee-repo-ref.txt index 6081d9fd35..91f337034b 100644 --- a/backend/ee-repo-ref.txt +++ b/backend/ee-repo-ref.txt @@ -1 +1 @@ -47869a5803b421a754173250fed79b63fe001ebd \ No newline at end of file +1475a504133766e005ec551004c2af2283663352 \ No newline at end of file diff --git a/backend/windmill-queue/src/jobs.rs b/backend/windmill-queue/src/jobs.rs index 4fb7210048..9c7dd8a4fc 100644 --- a/backend/windmill-queue/src/jobs.rs +++ b/backend/windmill-queue/src/jobs.rs @@ -4190,93 +4190,6 @@ pub async fn push<'c, 'd>( _ => None, }); - sqlx::query!( - "INSERT INTO v2_job (id, workspace_id, raw_code, raw_lock, raw_flow, tag, parent_job, - created_by, permissioned_as, runnable_id, runnable_path, args, kind, trigger, - script_lang, same_worker, pre_run_error, permissioned_as_email, visible_to_owner, - flow_innermost_root_job, concurrent_limit, concurrency_time_window_s, timeout, flow_step_id, - cache_ttl, priority, trigger_kind, script_entrypoint_override, preprocessed) - VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, - $19, $20, $21, $22, $23, $24, $25, $26, - CASE WHEN $14::VARCHAR IS NOT NULL THEN 'schedule'::job_trigger_kind END, - ($12::JSONB)->>'_ENTRYPOINT_OVERRIDE', $27)", - job_id, - workspace_id, - raw_code, - raw_lock, - raw_flow as Option>, - tag, - parent_job, - user, - permissioned_as, - script_hash, - script_path.clone(), - Json(args) as Json, - job_kind.clone() as JobKind, - schedule_path, - language as Option, - same_worker, - pre_run_error.map(|e| e.to_string()), - email, - visible_to_owner, - root_job, - concurrent_limit, - if concurrent_limit.is_some() { - concurrency_time_window_s - } else { - None - }, - custom_timeout, - flow_step_id, - cache_ttl, - final_priority, - preprocessed, - ) - .execute(&mut *tx) - .warn_after_seconds(1) - .await?; - - tracing::debug!("Pushing job {job_id} with tag {tag}, schedule_path {schedule_path:?}, script_path: {script_path:?}, email {email}, workspace_id {workspace_id}"); - let uuid = sqlx::query_scalar!( - "INSERT INTO v2_job_queue - (workspace_id, id, running, scheduled_for, started_at, tag, priority) - VALUES ($1, $2, $3, COALESCE($4, now()), CASE WHEN $3 THEN now() END, $5, $6) \ - RETURNING id AS \"id!\"", - workspace_id, - job_id, - is_running, - scheduled_for_o, - tag, - final_priority, - ) - .fetch_one(&mut *tx) - .warn_after_seconds(1) - .await - .map_err(|e| Error::internal_err(format!("Could not insert into queue {job_id} with tag {tag}, schedule_path {schedule_path:?}, script_path: {script_path:?}, email {email}, workspace_id {workspace_id}: {e:#}")))?; - - sqlx::query!( - "INSERT INTO v2_job_runtime (id, ping) VALUES ($1, null)", - job_id - ) - .execute(&mut *tx) - .await?; - if let Some(flow_status) = flow_status { - sqlx::query!( - "INSERT INTO v2_job_status (id, flow_status) VALUES ($1, $2)", - job_id, - Json(flow_status) as Json, - ) - .execute(&mut *tx) - .await?; - } - - tracing::debug!("Pushed {job_id}"); - // TODO: technically the job isn't queued yet, as the transaction can be rolled back. Should be solved when moving these metrics to the queue abstraction. - #[cfg(feature = "prometheus")] - if METRICS_ENABLED.load(std::sync::atomic::Ordering::Relaxed) { - QUEUE_PUSH_COUNT.inc(); - } - let job_authed = match authed { Some(authed) if authed.email == email @@ -4309,21 +4222,130 @@ pub async fn push<'c, 'd>( .filter_map(|x| serde_json::to_value(x).ok()) .collect::>(); - if let Err(err) = sqlx::query!("INSERT INTO job_perms (job_id, email, username, is_admin, is_operator, folders, groups, workspace_id) - values ($1, $2, $3, $4, $5, $6, $7, $8) - ON CONFLICT (job_id) DO UPDATE SET email = $2, username = $3, is_admin = $4, is_operator = $5, folders = $6, groups = $7, workspace_id = $8", + // if let Err(err) = sqlx::query!("INSERT INTO job_perms (job_id, email, username, is_admin, is_operator, folders, groups, workspace_id) + // values ($1, $2, $3, $4, $5, $6, $7, $8) + // ON CONFLICT (job_id) DO UPDATE SET email = $2, username = $3, is_admin = $4, is_operator = $5, folders = $6, groups = $7, workspace_id = $8", + // job_id, + // job_authed.email, + // job_authed.username, + // job_authed.is_admin, + // job_authed.is_operator, + // folders.as_slice(), + // job_authed.groups.as_slice(), + // workspace_id, + // ).execute(&mut *tx).await { + // tracing::error!("Could not insert job_perms for job {job_id}: {err:#}"); + // } + + + sqlx::query!( + "WITH inserted_job AS ( + INSERT INTO v2_job (id, workspace_id, raw_code, raw_lock, raw_flow, tag, parent_job, + created_by, permissioned_as, runnable_id, runnable_path, args, kind, trigger, + script_lang, same_worker, pre_run_error, permissioned_as_email, visible_to_owner, + flow_innermost_root_job, concurrent_limit, concurrency_time_window_s, timeout, flow_step_id, + cache_ttl, priority, trigger_kind, script_entrypoint_override, preprocessed) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, + $19, $20, $21, $22, $23, $24, $25, $26, + CASE WHEN $14::VARCHAR IS NOT NULL THEN 'schedule'::job_trigger_kind END, + ($12::JSONB)->>'_ENTRYPOINT_OVERRIDE', $27) + ), + inserted_runtime AS ( + INSERT INTO v2_job_runtime (id, ping) VALUES ($1, null) + ), + inserted_job_perms AS ( + INSERT INTO job_perms (job_id, email, username, is_admin, is_operator, folders, groups, workspace_id) + values ($1, $32, $33, $34, $35, $36, $37, $2) + ON CONFLICT (job_id) DO UPDATE SET email = $32, username = $33, is_admin = $34, is_operator = $35, folders = $36, groups = $37, workspace_id = $2 + ) + INSERT INTO v2_job_queue + (workspace_id, id, running, scheduled_for, started_at, tag, priority) + VALUES ($2, $1, $28, COALESCE($29, now()), CASE WHEN $27 THEN now() END, $30, $31)", job_id, + workspace_id, + raw_code, + raw_lock, + raw_flow as Option>, + tag, + parent_job, + user, + permissioned_as, + script_hash, + script_path.clone(), + Json(args) as Json, + job_kind.clone() as JobKind, + schedule_path, + language as Option, + same_worker, + pre_run_error.map(|e| e.to_string()), + email, + visible_to_owner, + root_job, + concurrent_limit, + if concurrent_limit.is_some() { + concurrency_time_window_s + } else { + None + }, + custom_timeout, + flow_step_id, + cache_ttl, + final_priority, + preprocessed, + is_running, + scheduled_for_o, + tag, + final_priority, job_authed.email, job_authed.username, job_authed.is_admin, job_authed.is_operator, folders.as_slice(), job_authed.groups.as_slice(), - workspace_id, - ).execute(&mut *tx).await { - tracing::error!("Could not insert job_perms for job {job_id}: {err:#}"); + ) + .execute(&mut *tx) + .warn_after_seconds(1) + .await?; + +// tracing::debug!("Pushing job {job_id} with tag {tag}, schedule_path {schedule_path:?}, script_path: {script_path:?}, email {email}, workspace_id {workspace_id}"); +// let uuid = sqlx::query_scalar!( +// "INSERT INTO v2_job_queue +// (workspace_id, id, running, scheduled_for, started_at, tag, priority) +// VALUES ($1, $2, $3, COALESCE($4, now()), CASE WHEN $3 THEN now() END, $5, $6) \ +// RETURNING id AS \"id!\"", +// workspace_id, +// job_id, +// , +// ) +// .fetch_one(&mut *tx) +// .warn_after_seconds(1) +// .await +// .map_err(|e| Error::internal_err(format!("Could not insert into queue {job_id} with tag {tag}, schedule_path {schedule_path:?}, script_path: {script_path:?}, email {email}, workspace_id {workspace_id}: {e:#}")))?; + + // sqlx::query!( + // "INSERT INTO v2_job_runtime (id, ping) VALUES ($1, null)", + // job_id + // ) + // .execute(&mut *tx) + // .await?; + if let Some(flow_status) = flow_status { + sqlx::query!( + "INSERT INTO v2_job_status (id, flow_status) VALUES ($1, $2)", + job_id, + Json(flow_status) as Json, + ) + .execute(&mut *tx) + .await?; } - + + tracing::debug!("Pushed {job_id}"); + // TODO: technically the job isn't queued yet, as the transaction can be rolled back. Should be solved when moving these metrics to the queue abstraction. + #[cfg(feature = "prometheus")] + if METRICS_ENABLED.load(std::sync::atomic::Ordering::Relaxed) { + QUEUE_PUSH_COUNT.inc(); + } + + { let uuid_string = job_id.to_string(); @@ -4384,7 +4406,7 @@ pub async fn push<'c, 'd>( .await?; } - Ok((uuid, tx)) + Ok((job_id, tx)) } pub fn canceled_job_to_result(job: &MiniPulledJob) -> serde_json::Value { From 44f99653ebb6938c0b30cd060a252974efceaff3 Mon Sep 17 00:00:00 2001 From: Diego Imbert <70353967+diegoimbert@users.noreply.github.com> Date: Mon, 14 Apr 2025 12:18:08 +0200 Subject: [PATCH 211/739] fix app input not handling change when value is empty (#5615) --- .../components/apps/components/inputs/AppNumberInput.svelte | 6 +++--- .../components/apps/components/inputs/AppTextInput.svelte | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/src/lib/components/apps/components/inputs/AppNumberInput.svelte b/frontend/src/lib/components/apps/components/inputs/AppNumberInput.svelte index 29dccf3b88..567094e224 100644 --- a/frontend/src/lib/components/apps/components/inputs/AppNumberInput.svelte +++ b/frontend/src/lib/components/apps/components/inputs/AppNumberInput.svelte @@ -54,12 +54,12 @@ $: handleDefault(resolvedConfig.defaultValue) - $: value && onChangeValue() + $: value, onChangeValue() function onChangeValue() { - outputs?.result.set(value) + outputs?.result.set(value ?? undefined) if (iterContext && listInputs) { - listInputs.set(id, value) + listInputs.set(id, value ?? undefined) } } diff --git a/frontend/src/lib/components/apps/components/inputs/AppTextInput.svelte b/frontend/src/lib/components/apps/components/inputs/AppTextInput.svelte index dadc2d81d1..731ce20d07 100644 --- a/frontend/src/lib/components/apps/components/inputs/AppTextInput.svelte +++ b/frontend/src/lib/components/apps/components/inputs/AppTextInput.svelte @@ -62,7 +62,7 @@ let initialHandleDefault = true $: handleDefault(resolvedConfig.defaultValue) - $: value && onValueChange() + $: value, onValueChange() function onValueChange() { let val = value ?? '' From 4aae6ab634280adc1de9abd890100b7c12c89158 Mon Sep 17 00:00:00 2001 From: Diego Imbert <70353967+diegoimbert@users.noreply.github.com> Date: Mon, 14 Apr 2025 16:24:15 +0200 Subject: [PATCH 212/739] fix: number input in app multiselect yields NOT_NUMBER (#5616) * fix: number input in app multiselect yields NOT_NUMBER * wrong type cast --- .../components/inputs/AppMultiSelectV2.svelte | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/frontend/src/lib/components/apps/components/inputs/AppMultiSelectV2.svelte b/frontend/src/lib/components/apps/components/inputs/AppMultiSelectV2.svelte index fb21e6ba07..e7b8e82728 100644 --- a/frontend/src/lib/components/apps/components/inputs/AppMultiSelectV2.svelte +++ b/frontend/src/lib/components/apps/components/inputs/AppMultiSelectV2.svelte @@ -42,14 +42,16 @@ result: [] as string[] }) - let selectedItems: (string | { value: string; label: any })[] | undefined = [ + let selectedItems: (number | string | { value: string; label: any })[] | undefined = [ ...new Set(outputs?.result.peak()) - ] as string[] + ] as (number | string | { value: string; label: any })[] function setResultsFromSelectedItems() { outputs?.result.set([ ...(selectedItems?.map((item) => { - if (typeof item == 'object' && item.value != undefined && item.label != undefined) { + if (typeof item == 'number') { + return item.toString() + } else if (typeof item == 'object' && item.value != undefined && item.label != undefined) { return item?.value ?? `NOT_STRING` } else if (typeof item == 'string') { return item @@ -80,6 +82,9 @@ if (typeof item == 'object' && item.value != undefined && item.label != undefined) { return item } + if (typeof item == 'number') { + return item.toString() + } return typeof item === 'string' ? item : `NOT_STRING` }) } @@ -97,11 +102,13 @@ return deepEqual(item.value, value) } return item == value - }) ?? (typeof value == 'string' ? value : undefined) + }) ?? + (typeof value == 'string' ? value : undefined) ?? + (typeof value == 'number' ? value.toString() : undefined) ) }) .filter((item) => item != undefined) - selectedItems = [...new Set(nvalue)] as (string | { value: string; label: any })[] + selectedItems = [...new Set(nvalue)] setResultsFromSelectedItems() } } @@ -215,7 +222,7 @@ e.target?.['parentElement']?.dispatchEvent(newe) }} > - {typeof option == 'object' ? option?.label ?? 'NO_LABEL' : option} + {typeof option == 'object' ? (option?.label ?? 'NO_LABEL') : option}
From 54c1ed1d4fe9b8040fc69e4cbe6f35fba6973df0 Mon Sep 17 00:00:00 2001 From: HugoCasa Date: Mon, 14 Apr 2025 16:25:20 +0200 Subject: [PATCH 213/739] nit app runnable s3 input (#5609) * nit app runnable s3 input * n --- .../settingsPanel/inputEditor/StaticInputEditor.svelte | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/inputEditor/StaticInputEditor.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/inputEditor/StaticInputEditor.svelte index da0f6fbf88..078dbeb06c 100644 --- a/frontend/src/lib/components/apps/editor/settingsPanel/inputEditor/StaticInputEditor.svelte +++ b/frontend/src/lib/components/apps/editor/settingsPanel/inputEditor/StaticInputEditor.svelte @@ -200,11 +200,13 @@ bind:this={s3FilePicker} readOnlyMode={false} on:close={(e) => { - if (componentInput?.value?.s3) { + if (e.detail) { + if (componentInput) { + componentInput.value = e.detail + } s3FileUploadRawMode = true } }} - bind:selectedFileKey={componentInput.value} /> {:else if format?.startsWith('resource-') && (componentInput.value == undefined || typeof componentInput.value == 'string')} Date: Mon, 14 Apr 2025 16:25:41 +0200 Subject: [PATCH 214/739] feat: Batch re-run (#5553) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * runs on svelte 5 * Line component from svelte-chartjs * Replaced all svelte-chartjs occurrences with custom wrapper * Fix props mistake * Fix illegal table structures * self-closing-tags fix * aria labels * Fixed trivial warnings and errors * @tanstack/svelte-table fix * upgrade to vite 6 * svelte-kit sync before running svelte-check * Remove on:clear which is actually on:removeAll and already handled by on:change * fix worker tags not displaying in Autoscaling * Try to fix svelte-kit sync not working during CI * remove warnings * Fix add flow page crashing * access worldStore before assignment fix * fix infinite recursions in App Editor * Replaced JSON.stringify with proper deepEqual * component mount api changed (no longer classes) * fix ci errors * Fix infinite loops in background runnable panel * factored effect on deep equal logic in onObjChange * fix "Add" not working in AgGrid Table * Replaced legacy component.$set api * Fix multiselect infinite value reaction * Fix flow input fields resetting when opening their edit tab * fix date input resetting when typing year * Remove !p-0 affecting subgrid dotted borders * fix missing debounceTemplate causing hundreds of updates * Fix AgGrid action refreshes and disppearing * resolve getItems generating random ids every rerun * fix cannot access items before init * fix sort lambda arguments being undefined * Revert "Remove !p-0 affecting subgrid dotted borders" This reverts commit c62809bb45d682a48376b071680645ed4e1c601b. * fix input not updating in decision tree editor * Update frontend/src/lib/components/schema/EditableSchemaWrapper.svelte Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> * Re-added padding affecting subgrid dotted borders (#5479) * remove !p-0 in preset components * removed extra padding on accordion tabs subgrid * Fix non-reactive SchemaForm * dirty fix for the oneOf bug * feat: add nu-lang support (#5217) * feat: add nu (nushell) support * add worker tests * deactivate tables and non-any types below top-level full support will come in V1 for V0 it's better to keep things minimal and simple * add syntax highlighting used python's grammar, since nushell isn't supported by monaco nor svelte-highlights for V1 nu will get it`s own grammar * add logo * partially implement plugin support * change logo + ability to deploy + nsjail draft * static variables + get_resource + get_variable * lsp/dev.nu + initial nu lsp (not working yet) * make it work with nsjail * nullguard * Much more flexible signature parsing and better error-messages * add init script * rename nulsp to nu * install nu to dockerfile * fix merge * implement Default for MainArgSignature * stage NU_CACHE_DIR * improve dockerfiles * dev.nu for parser-wasm + flake.nix * update code for windows * add nushell to flake * upload Cargo.lock * make build.sh work on nixos * build wasm cli parsers * add docs to README_DEV.md * add helper script docker/dev.nu * improve docker/dev.nu * fix windows * commit frontend/package(lock).json * update cargo.lock * correctly update cargo.lock * remove lsp * update flake.nix to include svelte server and nushell * Revert base.sql to main * remove PLUGIN_USE_RE * make CARGO_PATH private * add nu to cli * Change flags to build wasm-nu-parser * remove flake.nix from parser-wasm * update wasm-build target * remove unused import * add cli support for nu * update github workflows * wasm-build 0.17 -> 0.19 * update build script * update cargo.lock * Fix typographical error * update Cargo.lock * update ENV_SETTINGS * use published nu parser * update package.lock * rewrite parser in tree-sitter * implement parser from scratch * polishing * change init script to match new parser * fix imports * fix cli build * fix cli build * merge * update wasm * use MiniPulledJob * update cli * change cli wasm schema * change cli * update deno.json * make wasm modules load lazily * regenerate parsers * remove leftover * update cargo.lock * clean up dnt.ts * add docs to cli/test.nu * add schema validation option * add Nu to try_validate_schema * reference frontend to new parser version * feat: unsafe parameters for sql queries (table names, column names) (#5488) * Make schema validation struct Schema Validation rules that are constructed from the schema or from the MainArgSig(TODO). * Make other validator builder * Fail dependency job like with lockfile failing for schema validator * Add last types + tests * Remove unused dependency * fix typos * Migration ID was colliding with another, changed it manually * Add Oneof + other fixes * fix: cache for querying scripts correclty handles ScriptMetadata * Add cache for schema validation from main arg sig * Prepare sqlx * Remove default features * Feature flags * WIP: unsafe sql params for sql langauges * Fix down migration table name * cleanup: put validation logic inside a function * Refactor to cache the should_validate boolean Changed the schemavalidators cache to take in an Option, effectively storing the `should_validate_schema` information. Also pass the schema when avaialble to construct the schema validator * Add other job kinds to u8 cache key just in case * Change sql languages to all get arguments as Values instead of RawValue * Only cache if not preview * Add last sql languages and some CI fixes * Rename after typo on `sanitized` * Finish rename * Remove unused import * Fix wrong test * Add newly published regex parser version * Remove default features from cargo.toml * Change to a cleaner syntax for the interpolated args * Update republished parser * fix win build (#5494) * add sysinfoapi feature flag for winapi dependency * add ff * add ff at the right place * fix(frontend): use stable path for capture tables + nits (#5495) * add missing capture move on first time deploy (#5496) * avoid regen client as build step * perf: cache workspace env variables to avoid one query (#5499) * perf: optimize number of queries needed for job run (#5504) * optPerf * update sqlx * update sqlx * fix: improve cancel for flows with many substeps * feat: list references upon renaming a script or a flow (#5487) * Refactored flow_workspace_runnables to more generic workspace_runnable_dependencies * list flows referencing an item upon renaming it * Refactor with two exclusive columns to avoid breaking FK constraints * Show apps depending on item upon renaming * sqlx prepare * list-disc instead of • * on delete and on update cascade * displayPathChangedWarning oneOf check instead noneOf * combine migrations + add "on update cascade" to flow fk * unique index on app dependencies to avoid duplicates * create new workspace_runnable_dependencies instead of renaming old table * Add "looking for references" loading msg * Revert "create new workspace_runnable_dependencies instead of renaming old table" This reverts commit 015c38ca8f9fbd8b4a4e817f1ad105434bfd68c5. * flow_workspace_runnables view for backwards compatibility * Add warning for script imports on rename * support import dependency tracking in deno * number of using scripts / flows / apps tooltip * forgot sqlx prepare * delete app-related rows in down migration * Made selection more generic * RunsBatchActionsDropdown refactor * started BatchReRunOptionsPane * fix overflow quirk * fetch schema * refactor to group jobs by (kind, path) * auto select * computePropertyMap * InputTransformForm works * Pickable properties * remove PropPickerWrapper and make it optional in InputTransformForm * hide help btn * available expressions info alert * extraLib for editor linting * fix selected group not updating * nit * Refactor async logic in script tag * persist changes in state * correct typing * count for each (path, kind) group * support flows * use dot operator when possible * count jobs and fix wrong number * fix selectedJobs recomputing periodically * (v0) individual api requests to re-run jobs * move batchReRunChangedArgs state upwards * Support static arg * mistake * Single confirmation modal + removed unnecessary state * change confirmation modal color * use runes in confirmation modal * listSelectedJobsSchema API endpoint * refactored batch rerun pane for listSelectedJobsSchema * eliminated selectedJobs * batch rerun works backend (v0 same args) * Static input transforms * simpler list_selected_jobs_schemas sql query with coalesce * use latest schema UI + refactor * run latest version in backend * add deno_core dependency to windmill-api * stream jobs from db * basic js evaluation * sqlx prepare * add id path and hash in editor lint * js works with job object! * moved deno_core logic to separate function * openapi yaml mistake * unnecessary bind * fix date as string * Stream re-ran uuids * handle SSE multiple values at once * don't select all by default on batch action * nit ui * check that schema has property backend * Better JobGroup query + cache * handle multi type properties * Notify user on error * stupid mistake * Fix warnings and update svelte-exmarkdown for svelte 5 * regen package-lock to fix crash on vite preview * batch re-run all filtered jobs * merge schemas to common type * more explicit tooltips * changed sse counter ui * typos * fix tutorial first part * nit mistake * package lock + elipsis nit * fix: latest_schema option still checked on the job original schema * always gotta forget sqlx prepare * fix flashing loading screen * fix batch re-run select all filtered * better tooltip * fix batch actions btn growing on wide screen * revert disableBatchActions * fix selectable step jobs --------- Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> Co-authored-by: pyranota <92104930+pyranota@users.noreply.github.com> Co-authored-by: wendrul <53628737+wendrul@users.noreply.github.com> Co-authored-by: Alexander Petric Co-authored-by: HugoCasa Co-authored-by: Ruben Fiszel --- ...4cdb6eae2e71e56bc8e5215559af967c81bd8.json | 79 ++++ ...953e3b32a9a7a73784219d48f8e8932cdb0c8.json | 23 + ...53be3a93dbe2a67bdc4d4342c84f439b5eaf9.json | 85 ++++ ...3b077c957da8455ea747b0680923d8282425b.json | 73 +++ ...7e6b3cb1d60f15fed9a24e3f05b1bd60c0fc8.json | 73 +++ ...b1ec3fc844ed286ff563f0c9a5c4778cfb718.json | 67 +++ ...bd8f537e68fabceb094fe535693fbd146eff2.json | 23 + backend/Cargo.lock | 4 + backend/Cargo.toml | 4 +- backend/windmill-api/Cargo.toml | 9 +- backend/windmill-api/openapi.yaml | 310 +++++++++---- backend/windmill-api/src/jobs.rs | 367 ++++++++++++++- .../src/lib/components/FieldHeader.svelte | 10 +- .../lib/components/InputTransformForm.svelte | 72 +-- .../src/lib/components/S3FilePicker.svelte | 4 +- .../ConfirmationModal.svelte | 54 ++- .../src/lib/components/jobs/batchReruns.ts | 110 +++++ .../runs/BatchReRunOptionsPane.svelte | 275 ++++++++++++ .../src/lib/components/runs/RunRow.svelte | 11 +- .../runs/RunsBatchActionsDropdown.svelte | 92 ++++ .../src/lib/components/runs/RunsTable.svelte | 22 +- frontend/src/lib/schema.ts | 18 +- frontend/src/lib/utils.ts | 20 +- .../(logged)/runs/[...path]/+page.svelte | 422 ++++++++++-------- 24 files changed, 1872 insertions(+), 355 deletions(-) create mode 100644 backend/.sqlx/query-3376b42d273c2499f3517c7754f4cdb6eae2e71e56bc8e5215559af967c81bd8.json create mode 100644 backend/.sqlx/query-5ea1d8c87a17690942ca9e70e0b953e3b32a9a7a73784219d48f8e8932cdb0c8.json create mode 100644 backend/.sqlx/query-ad88831c9021b79c9037a925c2b53be3a93dbe2a67bdc4d4342c84f439b5eaf9.json create mode 100644 backend/.sqlx/query-b61a00e6a8ca0a1d24e64fdc9223b077c957da8455ea747b0680923d8282425b.json create mode 100644 backend/.sqlx/query-c4f382045e5c47986e02f1e57667e6b3cb1d60f15fed9a24e3f05b1bd60c0fc8.json create mode 100644 backend/.sqlx/query-ccd4c7fe5fbdf1ab4bbbbd7d2a9b1ec3fc844ed286ff563f0c9a5c4778cfb718.json create mode 100644 backend/.sqlx/query-d1fdfabd4f3bbe93cf9667e8e76bd8f537e68fabceb094fe535693fbd146eff2.json create mode 100644 frontend/src/lib/components/jobs/batchReruns.ts create mode 100644 frontend/src/lib/components/runs/BatchReRunOptionsPane.svelte create mode 100644 frontend/src/lib/components/runs/RunsBatchActionsDropdown.svelte diff --git a/backend/.sqlx/query-3376b42d273c2499f3517c7754f4cdb6eae2e71e56bc8e5215559af967c81bd8.json b/backend/.sqlx/query-3376b42d273c2499f3517c7754f4cdb6eae2e71e56bc8e5215559af967c81bd8.json new file mode 100644 index 0000000000..7229d4053f --- /dev/null +++ b/backend/.sqlx/query-3376b42d273c2499f3517c7754f4cdb6eae2e71e56bc8e5215559af967c81bd8.json @@ -0,0 +1,79 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT \n j.id,\n j.kind AS \"kind: _\",\n COALESCE(s.path, f.path) AS \"script_path!\",\n COALESCE(s.hash, f.id) AS \"script_hash!: _\",\n COALESCE(jc.started_at, jq.scheduled_for, make_date(1970, 1, 1)) AS \"scheduled_for!: _\",\n args AS input\n FROM v2_job j\n LEFT JOIN script s ON j.runnable_id = s.hash AND j.kind = 'script'\n LEFT JOIN flow_version f ON j.runnable_id = f.id AND j.runnable_path = f.path AND j.kind = 'flow'\n LEFT JOIN v2_job_completed jc ON jc.id = j.id\n LEFT JOIN v2_job_queue jq ON jq.id = j.id\n WHERE j.id = ANY($1)\n AND j.workspace_id = $2\n AND COALESCE(s.hash, f.id) IS NOT NULL\n AND COALESCE(s.path, f.path) IS NOT NULL", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Uuid" + }, + { + "ordinal": 1, + "name": "kind: _", + "type_info": { + "Custom": { + "name": "job_kind", + "kind": { + "Enum": [ + "script", + "preview", + "flow", + "dependencies", + "flowpreview", + "script_hub", + "identity", + "flowdependencies", + "http", + "graphql", + "postgresql", + "noop", + "appdependencies", + "deploymentcallback", + "singlescriptflow", + "flowscript", + "flownode", + "appscript" + ] + } + } + } + }, + { + "ordinal": 2, + "name": "script_path!", + "type_info": "Varchar" + }, + { + "ordinal": 3, + "name": "script_hash!: _", + "type_info": "Int8" + }, + { + "ordinal": 4, + "name": "scheduled_for!: _", + "type_info": "Timestamptz" + }, + { + "ordinal": 5, + "name": "input", + "type_info": "Jsonb" + } + ], + "parameters": { + "Left": [ + "UuidArray", + "Text" + ] + }, + "nullable": [ + false, + false, + null, + null, + null, + true + ] + }, + "hash": "3376b42d273c2499f3517c7754f4cdb6eae2e71e56bc8e5215559af967c81bd8" +} diff --git a/backend/.sqlx/query-5ea1d8c87a17690942ca9e70e0b953e3b32a9a7a73784219d48f8e8932cdb0c8.json b/backend/.sqlx/query-5ea1d8c87a17690942ca9e70e0b953e3b32a9a7a73784219d48f8e8932cdb0c8.json new file mode 100644 index 0000000000..304814543b --- /dev/null +++ b/backend/.sqlx/query-5ea1d8c87a17690942ca9e70e0b953e3b32a9a7a73784219d48f8e8932cdb0c8.json @@ -0,0 +1,23 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT jsonb_build_object(\n 'kind', jb.kind,\n 'script_path', jb.runnable_path,\n 'latest_schema', COALESCE(\n (SELECT DISTINCT ON (s.path) s.schema FROM script s WHERE s.path = jb.runnable_path AND jb.kind = 'script' ORDER BY s.path, s.created_at DESC),\n (SELECT flow_version.schema FROM flow LEFT JOIN flow_version ON flow_version.id = flow.versions[array_upper(flow.versions, 1)] WHERE flow.path = jb.runnable_path AND jb.kind = 'flow')\n ),\n 'schemas', ARRAY(\n SELECT jsonb_build_object(\n 'script_hash', LPAD(TO_HEX(COALESCE(s.hash, f.id)), 16, '0'),\n 'job_ids', ARRAY_AGG(DISTINCT j.id),\n 'schema', ANY_VALUE(COALESCE(s.schema, f.schema))\n ) FROM v2_job j\n LEFT JOIN script s ON s.hash = j.runnable_id AND j.kind = 'script'\n LEFT JOIN flow_version f ON f.id = j.runnable_id AND j.kind = 'flow'\n WHERE j.id = ANY(ARRAY_AGG(jb.id))\n GROUP BY COALESCE(s.hash, f.id)\n )\n ) FROM v2_job jb\n WHERE (jb.kind = 'flow' OR jb.kind = 'script')\n AND jb.workspace_id = $1 AND jb.id = ANY($2)\n GROUP BY jb.kind, jb.runnable_path", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "jsonb_build_object", + "type_info": "Jsonb" + } + ], + "parameters": { + "Left": [ + "Text", + "UuidArray" + ] + }, + "nullable": [ + null + ] + }, + "hash": "5ea1d8c87a17690942ca9e70e0b953e3b32a9a7a73784219d48f8e8932cdb0c8" +} diff --git a/backend/.sqlx/query-ad88831c9021b79c9037a925c2b53be3a93dbe2a67bdc4d4342c84f439b5eaf9.json b/backend/.sqlx/query-ad88831c9021b79c9037a925c2b53be3a93dbe2a67bdc4d4342c84f439b5eaf9.json new file mode 100644 index 0000000000..8d51b798e9 --- /dev/null +++ b/backend/.sqlx/query-ad88831c9021b79c9037a925c2b53be3a93dbe2a67bdc4d4342c84f439b5eaf9.json @@ -0,0 +1,85 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT \n j.id,\n j.kind AS \"kind: _\",\n COALESCE(s.path, f.path) AS \"script_path!\",\n COALESCE(s.hash, f.id) AS \"script_hash!: _\",\n COALESCE(jc.started_at, jq.scheduled_for, make_date(1970, 1, 1)) AS \"scheduled_for!: _\",\n args AS input,\n COALESCE(s.schema, f.schema) AS \"schema: _\"\n FROM v2_job j\n LEFT JOIN script s ON j.runnable_id = s.hash AND j.kind = 'script'\n LEFT JOIN flow_version f ON j.runnable_id = f.id AND j.runnable_path = f.path AND j.kind = 'flow'\n LEFT JOIN v2_job_completed jc ON jc.id = j.id\n LEFT JOIN v2_job_queue jq ON jq.id = j.id\n WHERE j.id = ANY($1)\n AND j.workspace_id = $2\n AND COALESCE(s.hash, f.id) IS NOT NULL\n AND COALESCE(s.path, f.path) IS NOT NULL", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Uuid" + }, + { + "ordinal": 1, + "name": "kind: _", + "type_info": { + "Custom": { + "name": "job_kind", + "kind": { + "Enum": [ + "script", + "preview", + "flow", + "dependencies", + "flowpreview", + "script_hub", + "identity", + "flowdependencies", + "http", + "graphql", + "postgresql", + "noop", + "appdependencies", + "deploymentcallback", + "singlescriptflow", + "flowscript", + "flownode", + "appscript" + ] + } + } + } + }, + { + "ordinal": 2, + "name": "script_path!", + "type_info": "Varchar" + }, + { + "ordinal": 3, + "name": "script_hash!: _", + "type_info": "Int8" + }, + { + "ordinal": 4, + "name": "scheduled_for!: _", + "type_info": "Timestamptz" + }, + { + "ordinal": 5, + "name": "input", + "type_info": "Jsonb" + }, + { + "ordinal": 6, + "name": "schema: _", + "type_info": "Json" + } + ], + "parameters": { + "Left": [ + "UuidArray", + "Text" + ] + }, + "nullable": [ + false, + false, + null, + null, + null, + true, + null + ] + }, + "hash": "ad88831c9021b79c9037a925c2b53be3a93dbe2a67bdc4d4342c84f439b5eaf9" +} diff --git a/backend/.sqlx/query-b61a00e6a8ca0a1d24e64fdc9223b077c957da8455ea747b0680923d8282425b.json b/backend/.sqlx/query-b61a00e6a8ca0a1d24e64fdc9223b077c957da8455ea747b0680923d8282425b.json new file mode 100644 index 0000000000..80f0549739 --- /dev/null +++ b/backend/.sqlx/query-b61a00e6a8ca0a1d24e64fdc9223b077c957da8455ea747b0680923d8282425b.json @@ -0,0 +1,73 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT\n j.kind AS \"kind!: JobKind\",\n j.runnable_id AS \"script_hash: _\",\n j.runnable_path AS script_path,\n COUNT(*) AS \"count!\",\n ANY_VALUE(COALESCE(f.schema, s.schema)) AS schema\n FROM v2_job j\n LEFT JOIN script s ON s.hash = j.runnable_id AND j.kind = 'script'\n LEFT JOIN flow_version f ON f.id = j.runnable_id AND f.path = j.runnable_path AND j.kind = 'flow'\n WHERE COALESCE(s.hash, f.id) IS NOT NULL\n AND COALESCE(s.path, f.path) IS NOT NULL\n AND j.workspace_id = $1 AND j.id = ANY($2)\n GROUP BY j.runnable_id, j.runnable_path, j.kind", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "kind!: JobKind", + "type_info": { + "Custom": { + "name": "job_kind", + "kind": { + "Enum": [ + "script", + "preview", + "flow", + "dependencies", + "flowpreview", + "script_hub", + "identity", + "flowdependencies", + "http", + "graphql", + "postgresql", + "noop", + "appdependencies", + "deploymentcallback", + "singlescriptflow", + "flowscript", + "flownode", + "appscript" + ] + } + } + } + }, + { + "ordinal": 1, + "name": "script_hash: _", + "type_info": "Int8" + }, + { + "ordinal": 2, + "name": "script_path", + "type_info": "Varchar" + }, + { + "ordinal": 3, + "name": "count!", + "type_info": "Int8" + }, + { + "ordinal": 4, + "name": "schema", + "type_info": "Json" + } + ], + "parameters": { + "Left": [ + "Text", + "UuidArray" + ] + }, + "nullable": [ + false, + true, + true, + null, + null + ] + }, + "hash": "b61a00e6a8ca0a1d24e64fdc9223b077c957da8455ea747b0680923d8282425b" +} diff --git a/backend/.sqlx/query-c4f382045e5c47986e02f1e57667e6b3cb1d60f15fed9a24e3f05b1bd60c0fc8.json b/backend/.sqlx/query-c4f382045e5c47986e02f1e57667e6b3cb1d60f15fed9a24e3f05b1bd60c0fc8.json new file mode 100644 index 0000000000..e976cd0dd9 --- /dev/null +++ b/backend/.sqlx/query-c4f382045e5c47986e02f1e57667e6b3cb1d60f15fed9a24e3f05b1bd60c0fc8.json @@ -0,0 +1,73 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT DISTINCT ON (j.runnable_path, j.kind) \n j.kind AS \"kind!: JobKind\",\n j.runnable_path AS script_path,\n NULL as \"script_hash: _\",\n -1::bigint as \"count!: _\",\n COALESCE(f.schema, s.schema) AS schema\n FROM v2_job j\n LEFT JOIN script s ON s.path = j.runnable_path AND j.kind = 'script'\n LEFT JOIN flow_version f ON f.path = j.runnable_path AND j.kind = 'flow'\n WHERE COALESCE(s.hash, f.id) IS NOT NULL\n AND j.workspace_id = $1 AND j.id = ANY($2)\n ORDER BY j.runnable_path, j.kind, COALESCE(f.created_at, s.created_at) DESC", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "kind!: JobKind", + "type_info": { + "Custom": { + "name": "job_kind", + "kind": { + "Enum": [ + "script", + "preview", + "flow", + "dependencies", + "flowpreview", + "script_hub", + "identity", + "flowdependencies", + "http", + "graphql", + "postgresql", + "noop", + "appdependencies", + "deploymentcallback", + "singlescriptflow", + "flowscript", + "flownode", + "appscript" + ] + } + } + } + }, + { + "ordinal": 1, + "name": "script_path", + "type_info": "Varchar" + }, + { + "ordinal": 2, + "name": "script_hash: _", + "type_info": "Text" + }, + { + "ordinal": 3, + "name": "count!: _", + "type_info": "Int8" + }, + { + "ordinal": 4, + "name": "schema", + "type_info": "Json" + } + ], + "parameters": { + "Left": [ + "Text", + "UuidArray" + ] + }, + "nullable": [ + false, + true, + null, + null, + null + ] + }, + "hash": "c4f382045e5c47986e02f1e57667e6b3cb1d60f15fed9a24e3f05b1bd60c0fc8" +} diff --git a/backend/.sqlx/query-ccd4c7fe5fbdf1ab4bbbbd7d2a9b1ec3fc844ed286ff563f0c9a5c4778cfb718.json b/backend/.sqlx/query-ccd4c7fe5fbdf1ab4bbbbd7d2a9b1ec3fc844ed286ff563f0c9a5c4778cfb718.json new file mode 100644 index 0000000000..a457b8b2bf --- /dev/null +++ b/backend/.sqlx/query-ccd4c7fe5fbdf1ab4bbbbd7d2a9b1ec3fc844ed286ff563f0c9a5c4778cfb718.json @@ -0,0 +1,67 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT j.kind AS \"kind: _\", COALESCE(s.path, f.path) AS \"script_path!\", COALESCE(s.hash, f.id) AS \"script_hash!: _\", args\n FROM v2_job j\n LEFT JOIN script s ON j.runnable_id = s.hash AND j.kind = 'script'\n LEFT JOIN flow_version f ON j.runnable_id = f.id AND j.runnable_path = f.path AND j.kind = 'flow'\n WHERE j.id = ANY($1)\n AND j.workspace_id = $2\n AND COALESCE(s.hash, f.id) IS NOT NULL\n AND COALESCE(s.path, f.path) IS NOT NULL", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "kind: _", + "type_info": { + "Custom": { + "name": "job_kind", + "kind": { + "Enum": [ + "script", + "preview", + "flow", + "dependencies", + "flowpreview", + "script_hub", + "identity", + "flowdependencies", + "http", + "graphql", + "postgresql", + "noop", + "appdependencies", + "deploymentcallback", + "singlescriptflow", + "flowscript", + "flownode", + "appscript" + ] + } + } + } + }, + { + "ordinal": 1, + "name": "script_path!", + "type_info": "Varchar" + }, + { + "ordinal": 2, + "name": "script_hash!: _", + "type_info": "Int8" + }, + { + "ordinal": 3, + "name": "args", + "type_info": "Jsonb" + } + ], + "parameters": { + "Left": [ + "UuidArray", + "Text" + ] + }, + "nullable": [ + false, + null, + null, + true + ] + }, + "hash": "ccd4c7fe5fbdf1ab4bbbbd7d2a9b1ec3fc844ed286ff563f0c9a5c4778cfb718" +} diff --git a/backend/.sqlx/query-d1fdfabd4f3bbe93cf9667e8e76bd8f537e68fabceb094fe535693fbd146eff2.json b/backend/.sqlx/query-d1fdfabd4f3bbe93cf9667e8e76bd8f537e68fabceb094fe535693fbd146eff2.json new file mode 100644 index 0000000000..5ebf571855 --- /dev/null +++ b/backend/.sqlx/query-d1fdfabd4f3bbe93cf9667e8e76bd8f537e68fabceb094fe535693fbd146eff2.json @@ -0,0 +1,23 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT COALESCE(\n (SELECT DISTINCT ON (s.path) s.schema FROM script s WHERE s.path = jb.runnable_path AND jb.kind = 'script' ORDER BY s.path, s.created_at DESC),\n (SELECT flow_version.schema FROM flow LEFT JOIN flow_version ON flow_version.id = flow.versions[array_upper(flow.versions, 1)] WHERE flow.path = jb.runnable_path AND jb.kind = 'flow')\n ) FROM v2_job jb\n WHERE jb.id = $1 AND jb.workspace_id = $2\n GROUP BY jb.kind, jb.runnable_path", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "coalesce", + "type_info": "Json" + } + ], + "parameters": { + "Left": [ + "Uuid", + "Text" + ] + }, + "nullable": [ + null + ] + }, + "hash": "d1fdfabd4f3bbe93cf9667e8e76bd8f537e68fabceb094fe535693fbd146eff2" +} diff --git a/backend/Cargo.lock b/backend/Cargo.lock index 4737d318f6..0f9558966f 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -13941,6 +13941,7 @@ dependencies = [ "tikv-jemalloc-sys", "tikv-jemallocator", "tokio", + "tokio-stream", "tracing", "url", "uuid", @@ -13983,6 +13984,8 @@ dependencies = [ "cookie 0.17.0", "cron", "datafusion", + "deno_core", + "deno_error", "futures", "git-version", "google-cloud-googleapis", @@ -14034,6 +14037,7 @@ dependencies = [ "tokio", "tokio-native-tls", "tokio-postgres 0.7.11", + "tokio-stream", "tokio-tar", "tokio-tungstenite", "tokio-util", diff --git a/backend/Cargo.toml b/backend/Cargo.toml index ef4d7c5712..ed4155f495 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -64,6 +64,7 @@ cloud = ["windmill-queue/cloud", "windmill-worker/cloud", "windmill-common/cloud jemalloc = ["windmill-common/jemalloc", "dep:tikv-jemallocator", "dep:tikv-jemalloc-sys", "dep:tikv-jemalloc-ctl"] tantivy = ["dep:windmill-indexer", "windmill-api/tantivy", "windmill-indexer/enterprise", "windmill-indexer/parquet", "windmill-common/tantivy", "enterprise", "parquet"] sqlx = ["windmill-worker/sqlx"] +deno_core = ["windmill-worker/deno_core", "windmill-api/deno_core", "dep:deno_core", "dep:v8"] kafka = ["windmill-api/kafka"] nats = ["windmill-api/nats"] otel = ["windmill-common/otel", "windmill-worker/otel"] @@ -82,7 +83,6 @@ static_frontend = ["windmill-api/static_frontend"] scoped_cache = ["windmill-common/scoped_cache"] # Languages python = ["windmill-worker/python"] -deno_core = ["windmill-worker/deno_core", "dep:deno_core", "dep:v8"] rust = ["windmill-worker/rust"] mysql = ["windmill-worker/mysql"] oracledb = ["windmill-worker/oracledb"] @@ -98,6 +98,7 @@ all_languages = [ "python", "deno_core", "rust", "mysql", "oracledb", "mssql", " [dependencies] anyhow.workspace = true tokio.workspace = true +tokio-stream.workspace = true dotenv.workspace = true windmill-queue.workspace = true windmill-common = { workspace = true, default-features = false } @@ -181,6 +182,7 @@ axum = { version = "^0.7", features = ["multipart"] } headers = "^0" hyper = { version = "^1", features = ["full"] } tokio = { version = "^1.42.0", features = ["full", "tracing", "time"] } +tokio-stream = { version = "0.1.17" } tower = "^0" tower-http = { version = "^0.6", features = ["trace", "cors"] } tower-cookies = "^0.10" diff --git a/backend/windmill-api/Cargo.toml b/backend/windmill-api/Cargo.toml index c3d695f96e..0996b5956d 100644 --- a/backend/windmill-api/Cargo.toml +++ b/backend/windmill-api/Cargo.toml @@ -32,6 +32,7 @@ static_frontend = ["dep:rust-embed"] postgres_trigger = ["dep:rust-postgres", "dep:pg_escape", "dep:byteorder", "dep:thiserror", "dep:rust_decimal", "dep:rust-postgres-native-tls"] mqtt_trigger = ["dep:thiserror", "dep:rumqttc"] sqs_trigger = ["dep:aws-sdk-sqs", "dep:thiserror", "dep:aws-config"] +deno_core = ["dep:deno_core", "dep:deno_error"] gcp_trigger = ["dep:thiserror", "dep:google-cloud-pubsub", "dep:google-cloud-googleapis", "dep:tonic"] cloud = ["windmill-common/cloud"] @@ -47,6 +48,7 @@ windmill-git-sync.workspace = true windmill-indexer = { workspace = true, optional = true } windmill-worker.workspace = true tokio.workspace = true +tokio-stream.workspace = true anyhow.workspace = true argon2.workspace = true axum.workspace = true @@ -133,4 +135,9 @@ aws-sdk-sqs = { workspace = true, optional = true } aws-config = { workspace = true, optional = true } google-cloud-pubsub = { workspace = true, optional = true } google-cloud-googleapis = { workspace = true , optional = true } -tonic = { workspace = true, optional = true } \ No newline at end of file +tonic = { workspace = true, optional = true } +deno_error = { workspace = true, optional = true } +deno_core = { workspace = true, optional = true } + +[build-dependencies] +deno_core = { workspace = true, optional = true } \ No newline at end of file diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index f1c3e0a195..5ed6537931 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -1378,7 +1378,7 @@ paths: format: int64 description: The ID of the GitHub installation to delete responses: - '200': + "200": description: Installation successfully deleted /w/{workspace}/github_app/export/{installationId}: @@ -1400,7 +1400,7 @@ paths: schema: type: integer responses: - '200': + "200": description: Successfully exported the JWT token content: application/json: @@ -1435,7 +1435,7 @@ paths: jwt_token: type: string responses: - '200': + "200": description: Successfully imported the installation /users/accept_invite: @@ -1791,7 +1791,7 @@ paths: schema: $ref: "#/components/schemas/OperatorSettings" responses: - '200': + "200": description: Operator settings updated successfully content: text/plain: @@ -1997,7 +1997,7 @@ paths: required: - premium - owner - + /w/{workspace}/workspaces/threshold_alert: get: summary: get threshold alert info @@ -2368,7 +2368,6 @@ paths: application/json: schema: $ref: "#/components/schemas/AIConfig" - /w/{workspace}/workspaces/edit_error_handler: post: @@ -3538,14 +3537,14 @@ paths: tags: - teams responses: - '200': + "200": description: Teams information successfully synchronized content: application/json: schema: type: array items: - $ref: '#/components/schemas/TeamInfo' + $ref: "#/components/schemas/TeamInfo" /teams/activities: post: @@ -3579,7 +3578,7 @@ paths: description: The card block to be sent in the Teams card responses: - '200': + "200": description: Activity processed successfully /w/{workspace}/resources/create: @@ -4946,8 +4945,7 @@ paths: /scripts_u/tokened_raw/{workspace}/{token}/{path}: get: - summary: - raw script by path with a token (mostly used by lsp to be used with + summary: raw script by path with a token (mostly used by lsp to be used with import maps to resolve scripts) operationId: rawScriptByPathTokened tags: @@ -5041,6 +5039,63 @@ paths: lock_error_logs: type: string + /w/{workspace}/jobs/list_selected_job_groups: + # We use post because sending a huge array as a query param can produce + # URLs that may be too long + post: + summary: list selected jobs script/flow schemas grouped by (kind, path) + operationId: listSelectedJobGroups + tags: + - job + parameters: + - $ref: "#/components/parameters/WorkspaceId" + requestBody: + description: script args + required: true + content: + application/json: + schema: + type: array + items: + type: string + format: uuid + responses: + "200": + description: result + content: + text/plain: + schema: + type: array + items: + type: object + properties: + kind: + type: string + enum: ["script", "flow"] + script_path: + type: string + latest_schema: + type: object + schemas: + type: array + items: + type: object + properties: + schema: + type: object + script_hash: + type: string + job_ids: + type: array + items: + type: string + required: [schema, script_hash, job_ids] + required: + - kind + - script_path + - latest_schema + - schemas + /w/{workspace}/jobs/run/p/{path}: post: summary: run script by path @@ -5525,7 +5580,6 @@ paths: lock_error_logs: type: string - /w/{workspace}/flows/get_triggers_count/{path}: get: summary: get triggers count of flow @@ -6523,7 +6577,6 @@ paths: in: query schema: type: boolean - requestBody: description: flow args required: true @@ -6531,7 +6584,6 @@ paths: application/json: schema: $ref: "#/components/schemas/ScriptArgs" - responses: "201": description: job created @@ -6541,6 +6593,60 @@ paths: type: string format: uuid + /w/{workspace}/jobs/run/batch_rerun_jobs: + post: + summary: re-run multiple jobs + operationId: batchReRunJobs + tags: + - job + parameters: + - $ref: "#/components/parameters/WorkspaceId" + requestBody: + description: list of job ids to re run and arg tranforms + required: true + content: + application/json: + schema: + type: object + required: [job_ids, script_options_by_path, flow_options_by_path] + properties: + job_ids: + type: array + items: + type: string + script_options_by_path: + type: object + additionalProperties: + type: object + properties: + input_transforms: + type: object + additionalProperties: + $ref: "#/components/schemas/InputTransform" + use_latest_version: boolean + flow_options_by_path: + type: object + additionalProperties: + type: object + properties: + input_transforms: + type: object + additionalProperties: + $ref: "#/components/schemas/InputTransform" + use_latest_version: boolean + responses: + "201": + description: stream of created job uuids separated by \n. Lines may start with 'Error:' + example: | + a1a74c0d-708e-4539-9768-e8b3d37996bd + f0949132-5b30-48fe-bac8-873f047df810 + Error: Could not re-run 0b885808-ae89-4458-af95-c1ca3a13b0a5 + 52b9c01d-1125-4bbb-8bee-d41f26b70066 + content: + text/event-stream: + schema: + type: string + /w/{workspace}/jobs/restart/f/{id}/from/{step_id}/{branch_or_iteration_n}: post: summary: restart a completed flow at a given step @@ -6557,8 +6663,7 @@ paths: schema: type: string - name: branch_or_iteration_n - description: - for branchall or loop, the iteration at which the flow should + description: for branchall or loop, the iteration at which the flow should restart required: true in: path @@ -6926,10 +7031,82 @@ paths: schema: type: integer - /w/{workspace}/jobs/queue/list_filtered_uuids: + /w/{workspace}/jobs/list_filtered_uuids: get: summary: get the ids of all jobs matching the given filters - operationId: listFilteredUuids + operationId: listFilteredJobsUuids + tags: + - job + parameters: + - $ref: "#/components/parameters/WorkspaceId" + - $ref: "#/components/parameters/CreatedBy" + - $ref: "#/components/parameters/Label" + - $ref: "#/components/parameters/Worker" + - $ref: "#/components/parameters/ParentJob" + - $ref: "#/components/parameters/ScriptExactPath" + - $ref: "#/components/parameters/ScriptStartPath" + - $ref: "#/components/parameters/SchedulePath" + - $ref: "#/components/parameters/ScriptExactHash" + - $ref: "#/components/parameters/StartedBefore" + - $ref: "#/components/parameters/StartedAfter" + - $ref: "#/components/parameters/CreatedBefore" + - $ref: "#/components/parameters/CreatedAfter" + - $ref: "#/components/parameters/CreatedOrStartedBefore" + - $ref: "#/components/parameters/Running" + - $ref: "#/components/parameters/ScheduledForBeforeNow" + - $ref: "#/components/parameters/CreatedOrStartedAfter" + - $ref: "#/components/parameters/CreatedOrStartedAfterCompletedJob" + - $ref: "#/components/parameters/JobKinds" + - $ref: "#/components/parameters/Suspended" + - $ref: "#/components/parameters/ArgsFilter" + - $ref: "#/components/parameters/Tag" + - $ref: "#/components/parameters/ResultFilter" + - $ref: "#/components/parameters/Page" + - $ref: "#/components/parameters/PerPage" + - name: is_skipped + description: is the job skipped + in: query + schema: + type: boolean + - name: is_flow_step + description: is the job a flow step + in: query + schema: + type: boolean + - name: has_null_parent + description: has null parent + in: query + schema: + type: boolean + - name: success + description: filter on successful jobs + in: query + schema: + type: boolean + - name: all_workspaces + description: get jobs from all workspaces (only valid if request come from the `admins` workspace) + in: query + schema: + type: boolean + - name: is_not_schedule + description: is not a scheduled job + in: query + schema: + type: boolean + responses: + "200": + description: uuids of jobs + content: + application/json: + schema: + type: array + items: + type: string + + /w/{workspace}/jobs/queue/list_filtered_uuids: + get: + summary: get the ids of all queued jobs matching the given filters + operationId: listFilteredQueueUuids tags: - job parameters: @@ -8739,7 +8916,7 @@ paths: summary: delete nats trigger operationId: deleteNatsTrigger tags: - - nats_trigger + - nats_trigger parameters: - $ref: "#/components/parameters/WorkspaceId" - $ref: "#/components/parameters/Path" @@ -8768,7 +8945,6 @@ paths: schema: $ref: "#/components/schemas/NatsTrigger" - /w/{workspace}/nats_triggers/list: get: summary: list nats triggers @@ -8803,7 +8979,6 @@ paths: items: $ref: "#/components/schemas/NatsTrigger" - /w/{workspace}/nats_triggers/exists/{path}: get: summary: does nats trigger exists @@ -8850,7 +9025,6 @@ paths: schema: type: string - /w/{workspace}/nats_triggers/test: post: summary: test NATS connection @@ -9523,8 +9697,8 @@ paths: tags: - postgres_trigger parameters: - - $ref: "#/components/parameters/WorkspaceId" - - $ref: "#/components/parameters/Path" + - $ref: "#/components/parameters/WorkspaceId" + - $ref: "#/components/parameters/Path" responses: "200": description: boolean that indicates if postgres is set to logical level or not @@ -9727,7 +9901,6 @@ paths: schema: type: string - /w/{workspace}/postgres_triggers/publication/delete/{publication}/{path}: delete: summary: delete postgres publication @@ -10840,7 +11013,8 @@ paths: required: true schema: type: string - enum: [ + enum: + [ script, group_, resource, @@ -11078,7 +11252,6 @@ paths: items: $ref: "#/components/schemas/Capture" - /w/{workspace}/capture/move/{runnable_kind}/{path}: post: summary: move captures and configs for a script or flow @@ -11336,8 +11509,7 @@ paths: /w/{workspace}/job_helpers/duckdb_connection_settings: post: - summary: - Converts an S3 resource to the set of instructions necessary to connect + summary: Converts an S3 resource to the set of instructions necessary to connect DuckDB to an S3 bucket operationId: duckdbConnectionSettings tags: @@ -11366,8 +11538,7 @@ paths: type: string /w/{workspace}/job_helpers/v2/duckdb_connection_settings: post: - summary: - Converts an S3 resource to the set of instructions necessary to connect + summary: Converts an S3 resource to the set of instructions necessary to connect DuckDB to an S3 bucket operationId: duckdbConnectionSettingsV2 tags: @@ -11403,8 +11574,7 @@ paths: /w/{workspace}/job_helpers/polars_connection_settings: post: - summary: - Converts an S3 resource to the set of arguments necessary to connect + summary: Converts an S3 resource to the set of arguments necessary to connect Polars to an S3 bucket operationId: polarsConnectionSettings tags: @@ -11448,8 +11618,7 @@ paths: - client_kwargs /w/{workspace}/job_helpers/v2/polars_connection_settings: post: - summary: - Converts an S3 resource to the set of arguments necessary to connect + summary: Converts an S3 resource to the set of arguments necessary to connect Polars to an S3 bucket operationId: polarsConnectionSettingsV2 tags: @@ -11526,8 +11695,7 @@ paths: parameters: - $ref: "#/components/parameters/WorkspaceId" requestBody: - description: - S3 resource path to use. If empty, the S3 resource defined in the + description: S3 resource path to use. If empty, the S3 resource defined in the workspace settings will be used required: true content: @@ -12571,8 +12739,7 @@ components: type: string ParentJob: name: parent_job - description: - The parent job that is at the origin and responsible for the execution + description: The parent job that is at the origin and responsible for the execution of this script if any in: query schema: @@ -12592,8 +12759,7 @@ components: type: string NewJobId: name: job_id - description: - The job id to assign to the created job. if missing, job is chosen + description: The job id to assign to the created job. if missing, job is chosen randomly using the ULID scheme. If a job id already exists in the queue or as a completed job, the request to create one will fail (Bad Request) in: query @@ -12684,8 +12850,7 @@ components: format: date-time CreatedOrStartedAfter: name: created_or_started_after - description: - filter on created_at for non non started job and started_at otherwise + description: filter on created_at for non non started job and started_at otherwise after (exclusive) timestamp in: query schema: @@ -12693,8 +12858,7 @@ components: format: date-time CreatedOrStartedAfterCompletedJob: name: created_or_started_after_completed_jobs - description: - filter on created_at for non non started job and started_at otherwise + description: filter on created_at for non non started job and started_at otherwise after (exclusive) timestamp but only for the completed jobs in: query schema: @@ -12702,8 +12866,7 @@ components: format: date-time CreatedOrStartedBefore: name: created_or_started_before - description: - filter on created_at for non non started job and started_at otherwise + description: filter on created_at for non non started job and started_at otherwise before (inclusive) timestamp in: query schema: @@ -12791,8 +12954,7 @@ components: enum: [Create, Update, Delete, Execute] JobKinds: name: job_kinds - description: - filter on job kind (values 'preview', 'script', 'dependencies', 'flow') + description: filter on job kind (values 'preview', 'script', 'dependencies', 'flow') separated by, in: query schema: @@ -13200,7 +13362,7 @@ components: "singlescriptflow", "flowscript", "flownode", - "appscript", + "appscript" ] schedule_path: type: string @@ -13307,7 +13469,7 @@ components: "singlescriptflow", "flowscript", "flownode", - "appscript", + "appscript" ] schedule_path: type: string @@ -13757,7 +13919,7 @@ components: "bytes", "dict", "datetime", - "sql", + "sql" ] - type: object properties: @@ -13797,7 +13959,7 @@ components: "bytes", "dict", "datetime", - "sql", + "sql" ] - type: object properties: @@ -13823,7 +13985,7 @@ components: "bytes", "dict", "datetime", - "sql", + "sql" ] - type: object properties: @@ -13855,8 +14017,7 @@ components: ScriptLang: type: string - enum: - [ + enum: [ python3, deno, go, @@ -14293,16 +14454,15 @@ components: - edited_at - is_flow - AuthenticationMethod: type: string enum: - - none - - windmill - - api_key - - basic_http - - custom_script - - signature + - none + - windmill + - api_key + - basic_http + - custom_script + - signature HttpTrigger: allOf: @@ -14644,7 +14804,7 @@ components: MqttQoS: type: string - enum: ['qos0', 'qos1', 'qos2'] + enum: ["qos0", "qos1", "qos2"] MqttV3Config: type: object @@ -15024,7 +15184,6 @@ components: - is_flow - enabled - Slot: type: object properties: @@ -15119,8 +15278,8 @@ components: error: type: string last_server_ping: - type: string - format: date-time + type: string + format: date-time required: - enabled - postgres_resource_path @@ -15916,13 +16075,7 @@ components: properties: type: type: string - enum: - [ - "S3Storage", - "AzureBlobStorage", - "AzureWorkloadIdentity", - "S3AwsOidc", - ] + enum: ["S3Storage", "AzureBlobStorage", "AzureWorkloadIdentity", "S3AwsOidc"] s3_resource_path: type: string azure_blob_resource_path: @@ -15937,12 +16090,7 @@ components: type: type: string enum: - [ - "S3Storage", - "AzureBlobStorage", - "AzureWorkloadIdentity", - "S3AwsOidc", - ] + ["S3Storage", "AzureBlobStorage", "AzureWorkloadIdentity", "S3AwsOidc"] s3_resource_path: type: string azure_blob_resource_path: @@ -16422,7 +16570,7 @@ components: type: array description: List of channels within the team items: - $ref: '#/components/schemas/ChannelInfo' + $ref: "#/components/schemas/ChannelInfo" ChannelInfo: type: object diff --git a/backend/windmill-api/src/jobs.rs b/backend/windmill-api/src/jobs.rs index 4111f28b6b..be015f5929 100644 --- a/backend/windmill-api/src/jobs.rs +++ b/backend/windmill-api/src/jobs.rs @@ -8,7 +8,9 @@ use axum::body::Body; use axum::http::HeaderValue; -use futures::TryFutureExt; +#[cfg(feature = "deno_core")] +use deno_core::{op2, serde_v8, v8, JsRuntime, OpState}; +use futures::{StreamExt, TryFutureExt}; use http::{HeaderMap, HeaderName}; use itertools::Itertools; use quick_cache::sync::Cache; @@ -140,6 +142,13 @@ pub fn workspaced_service() -> Router { .layer(cors.clone()) .layer(ce_headers.clone()), ) + .route( + "/run/batch_rerun_jobs", + post(batch_rerun_jobs) + .head(|| async { "" }) + .layer(cors.clone()) + .layer(ce_headers.clone()), + ) .route( "/run/workflow_as_code/:job_id/:entrypoint", post(run_workflow_as_code) @@ -203,6 +212,13 @@ pub fn workspaced_service() -> Router { "/list", get(list_jobs).layer(Extension(api_list_jobs_query_duration)), ) + .route( + "/list_selected_job_groups", + // We use post because sending a huge array as a query param can produce + // URLs that may be too long + post(list_selected_job_groups), + ) + .route("/list_filtered_uuids", get(list_filtered_job_uuids)) .route("/queue/list", get(list_queue_jobs)) .route("/queue/count", get(count_queue_jobs)) .route("/queue/list_filtered_uuids", get(list_filtered_uuids)) @@ -645,6 +661,48 @@ async fn get_flow_job_debug_info( } } +async fn list_selected_job_groups( + authed: ApiAuthed, + Extension(user_db): Extension, + Path(w_id): Path, + Json(uuids): Json>, +) -> error::Result { + let mut tx = user_db.begin(&authed).await?; + + let results = sqlx::query_scalar!( + r#"SELECT jsonb_build_object( + 'kind', jb.kind, + 'script_path', jb.runnable_path, + 'latest_schema', COALESCE( + (SELECT DISTINCT ON (s.path) s.schema FROM script s WHERE s.path = jb.runnable_path AND jb.kind = 'script' ORDER BY s.path, s.created_at DESC), + (SELECT flow_version.schema FROM flow LEFT JOIN flow_version ON flow_version.id = flow.versions[array_upper(flow.versions, 1)] WHERE flow.path = jb.runnable_path AND jb.kind = 'flow') + ), + 'schemas', ARRAY( + SELECT jsonb_build_object( + 'script_hash', LPAD(TO_HEX(COALESCE(s.hash, f.id)), 16, '0'), + 'job_ids', ARRAY_AGG(DISTINCT j.id), + 'schema', ANY_VALUE(COALESCE(s.schema, f.schema)) + ) FROM v2_job j + LEFT JOIN script s ON s.hash = j.runnable_id AND j.kind = 'script' + LEFT JOIN flow_version f ON f.id = j.runnable_id AND j.kind = 'flow' + WHERE j.id = ANY(ARRAY_AGG(jb.id)) + GROUP BY COALESCE(s.hash, f.id) + ) + ) FROM v2_job jb + WHERE (jb.kind = 'flow' OR jb.kind = 'script') + AND jb.workspace_id = $1 AND jb.id = ANY($2) + GROUP BY jb.kind, jb.runnable_path"#, + &w_id, + &uuids + ) + .fetch_all(&mut *tx) + .await?; + + tx.commit().await?; + + Ok(Json(results).into_response()) +} + #[derive(Deserialize)] struct GetJobQuery { pub no_logs: Option, @@ -1745,6 +1803,37 @@ async fn cancel_selection( cancel_jobs(jobs_to_cancel, &db, authed.username.as_str(), w_id.as_str()).await } +async fn list_filtered_job_uuids( + authed: ApiAuthed, + Extension(db): Extension, + Path(w_id): Path, + Query(lq): Query, +) -> error::JsonResult> { + require_admin(authed.is_admin, &authed.username)?; + check_scopes(&authed, || format!("jobs:listjobs"))?; + + let mut sqlb = list_completed_jobs_query( + w_id.as_str(), + None, + 0, + &lq, + &["v2_job.id"], + false, + get_scope_tags(&authed), + ); + let sqlb2 = list_queue_jobs_query( + w_id.as_str(), + &lq.into(), + &["v2_job.id"], + Pagination { page: None, per_page: None }, + false, + get_scope_tags(&authed), + ); + let query = sqlb.union_all(sqlb2.subquery()?).subquery()?; + let ids = sqlx::query_scalar(query.as_str()).fetch_all(&db).await?; + Ok(Json(ids)) +} + async fn list_filtered_uuids( authed: ApiAuthed, Extension(db): Extension, @@ -1901,7 +1990,7 @@ async fn list_jobs( let sqlc = if lq.running.is_none() { Some(list_completed_jobs_query( &w_id, - per_page + offset, + Some(per_page + offset), 0, &ListCompletedQuery { order_desc: Some(true), ..lqc }, UnifiedJob::completed_job_fields(), @@ -1940,7 +2029,9 @@ async fn list_jobs( } else { if sqlc.is_none() { return Err(error::Error::BadRequest( - "cannot specify success, label, created_or_started_before, or started_before with running".to_string(), + "cannot specify success, label, created_or_started_before, or starte + d_before with running" + .to_string(), )); } sqlc.unwrap().limit(per_page).offset(offset).query()? @@ -3152,6 +3243,268 @@ pub async fn check_license_key_valid() -> error::Result<()> { Ok(()) } +use windmill_common::flows::InputTransform; + +#[derive(Deserialize)] +struct BatchReRunJobsBodyArgs { + job_ids: Vec, + script_options_by_path: HashMap, + flow_options_by_path: HashMap, +} + +#[derive(Deserialize)] +struct BatchReRunOptions { + input_transforms: Option>, + use_latest_version: Option, +} + +#[derive(sqlx::FromRow, Serialize, Clone)] +struct BatchReRunQueryReturnType { + id: Uuid, + kind: JobKind, + script_path: String, + script_hash: ScriptHash, + input: serde_json::Value, + scheduled_for: chrono::DateTime, + #[serde(skip_serializing_if = "Option::is_none")] + schema: Option, +} + +#[cfg(feature = "deno_core")] +#[op2] +#[string] +fn get_deno_core_job_value(state: &mut OpState) -> Option { + let obj = state.borrow::(); + let str = serde_json::to_string(&obj).ok()?; + Some(str) +} + +#[cfg(feature = "deno_core")] +async fn batch_rerun_compute_js_expression( + expr: String, + job: BatchReRunQueryReturnType, +) -> error::Result> { + let ext = deno_core::Extension { + name: "batch_rerun_arg_transform_ext", + ops: vec![get_deno_core_job_value()].into(), + ..Default::default() + }; + let mut isolate = + JsRuntime::new(deno_core::RuntimeOptions { extensions: vec![ext], ..Default::default() }); + + { + let op_state = isolate.op_state(); + let mut op_state = op_state.borrow_mut(); + op_state.put(BatchReRunQueryReturnType { schema: None, ..job }); + } + isolate + .execute_script( + "", + "let job = JSON.parse(Deno.core.ops.get_deno_core_job_value());", + ) + .map_err(|e| Error::ExecutionErr(e.to_string()))?; + + // Run user expr + let result = isolate + .execute_script("", expr) + .map_err(|e| Error::ExecutionErr(e.to_string()))?; + let mut scope = isolate.handle_scope(); + let result = v8::Local::new(&mut scope, result); + let result: serde_json::Value = + serde_v8::from_v8(&mut scope, result).map_err(|e| Error::ExecutionErr(e.to_string()))?; + let result = JsonRawValue::from_string(result.to_string())?; + Ok(result) +} + +async fn batch_rerun_jobs( + authed: ApiAuthed, + Extension(db): Extension, + Extension(user_db): Extension, + Path(w_id): Path, + Json(body): Json, +) -> Response { + let stream = batch_rerun_jobs_inner(authed, db, user_db, w_id, body); + + let body = axum::body::Body::from_stream(stream.map(Result::<_, std::convert::Infallible>::Ok)); + + Response::builder() + .status(201) + .header("Content-Type", "text/event-stream") + .header("Cache-Control", "no-cache") + .body(body) + .unwrap() +} + +fn batch_rerun_jobs_inner( + authed: ApiAuthed, + db: DB, + user_db: UserDB, + w_id: String, + body: BatchReRunJobsBodyArgs, +) -> impl futures::Stream { + let (tx, rx) = tokio::sync::mpsc::channel(10); + tokio::spawn(async move { + let mut job_stream = sqlx::query_as!( + BatchReRunQueryReturnType, + r#"SELECT + j.id, + j.kind AS "kind: _", + COALESCE(s.path, f.path) AS "script_path!", + COALESCE(s.hash, f.id) AS "script_hash!: _", + COALESCE(jc.started_at, jq.scheduled_for, make_date(1970, 1, 1)) AS "scheduled_for!: _", + args AS input, + COALESCE(s.schema, f.schema) AS "schema: _" + FROM v2_job j + LEFT JOIN script s ON j.runnable_id = s.hash AND j.kind = 'script' + LEFT JOIN flow_version f ON j.runnable_id = f.id AND j.runnable_path = f.path AND j.kind = 'flow' + LEFT JOIN v2_job_completed jc ON jc.id = j.id + LEFT JOIN v2_job_queue jq ON jq.id = j.id + WHERE j.id = ANY($1) + AND j.workspace_id = $2 + AND COALESCE(s.hash, f.id) IS NOT NULL + AND COALESCE(s.path, f.path) IS NOT NULL"#, + &body.job_ids, + w_id + ).fetch(&db); + while let Some(Ok(job)) = job_stream.next().await { + let job_result = + batch_rerun_handle_job(&job, &authed, &db, &user_db, &w_id, &body).await; + let send_to_stream_result = tx + .send(match job_result { + Ok(uuid) => format!("{}\n", uuid), + Err(err) => format!("Error: {}\n", err.to_string()), + }) + .await; + match send_to_stream_result { + Ok(_) => {} + Err(e) => tracing::error!("Couldn't re-run job {}: {}", job.id, e.to_string()), + } + } + }); + tokio_stream::wrappers::ReceiverStream::new(rx) +} + +async fn batch_rerun_handle_job( + job: &BatchReRunQueryReturnType, + authed: &ApiAuthed, + db: &DB, + user_db: &UserDB, + w_id: &String, + body: &BatchReRunJobsBodyArgs, +) -> error::Result { + let options = if matches!(job.kind, JobKind::Script) { + &body.script_options_by_path + } else { + &body.flow_options_by_path + } + .get(&job.script_path); + + let mut args: HashMap> = serde_json::from_value(job.input.clone())?; + let use_latest_version = options.and_then(|o| o.use_latest_version).unwrap_or(false); + let input_transforms = options + .and_then(|o| o.input_transforms.as_ref()) + .map(|t| t.iter()) + .into_iter() + .flatten(); + + let latest_schema; + let schema = if use_latest_version { + latest_schema = sqlx::query_scalar!( + r#"SELECT COALESCE( + (SELECT DISTINCT ON (s.path) s.schema FROM script s WHERE s.path = jb.runnable_path AND jb.kind = 'script' ORDER BY s.path, s.created_at DESC), + (SELECT flow_version.schema FROM flow LEFT JOIN flow_version ON flow_version.id = flow.versions[array_upper(flow.versions, 1)] WHERE flow.path = jb.runnable_path AND jb.kind = 'flow') + ) FROM v2_job jb + WHERE jb.id = $1 AND jb.workspace_id = $2 + GROUP BY jb.kind, jb.runnable_path"#, + &job.id, + &w_id + ).fetch_optional(db).await?.flatten(); + latest_schema.as_ref() + } else { + job.schema.as_ref() + }; + let schema = schema + .and_then(serde_json::Value::as_object) + .and_then(|s| s.get("properties")) + .and_then(serde_json::Value::as_object); + for (property_name, transform) in input_transforms { + let schema_has_key = schema + .map(|s| s.contains_key(property_name)) + .unwrap_or(false); + if !schema_has_key { + continue; + } + match transform { + InputTransform::Static { value } => { + args.insert(property_name.clone(), value.clone()); + } + InputTransform::Javascript { expr } => { + #[cfg(not(feature = "deno_core"))] + tracing::error!("deno_core feature is not activated, cannot evaluate: {expr}"); + #[cfg(feature = "deno_core")] + args.insert( + property_name.clone(), + batch_rerun_compute_js_expression(expr.clone(), job.clone()).await?, + ); + } + } + } + + // Call appropriate function to push job to queue + match job.kind { + JobKind::Flow => { + let result = run_flow_by_path_inner( + authed.clone(), + db.clone(), + user_db.clone(), + w_id.clone(), + StripPath(job.script_path.clone()), + RunJobQuery { ..Default::default() }, + PushArgsOwned { extra: None, args }, + None, + ) + .await; + if let Ok((_, uuid)) = result { + return Ok(uuid); + } + } + JobKind::Script => { + let result = if use_latest_version { + run_script_by_path_inner( + authed.clone(), + db.clone(), + user_db.clone(), + w_id.clone(), + StripPath(job.script_path.clone()), + RunJobQuery { ..Default::default() }, + PushArgsOwned { extra: None, args }, + None, + ) + .await + } else { + run_job_by_hash_inner( + authed.clone(), + db.clone(), + user_db.clone(), + w_id.clone(), + job.script_hash, + RunJobQuery { ..Default::default() }, + PushArgsOwned { extra: None, args }, + None, + ) + .await + }; + if let Ok((_, uuid)) = result { + return Ok(uuid); + } + } + _ => {} + } + Err(error::Error::ExecutionErr( + format!("Couldn't re-run job {}", job.id).to_string(), + )) +} + pub async fn run_flow_by_path( authed: ApiAuthed, Extension(db): Extension, @@ -5609,7 +5962,7 @@ pub fn filter_list_completed_query( pub fn list_completed_jobs_query( w_id: &str, - per_page: usize, + per_page: Option, offset: usize, lq: &ListCompletedQuery, fields: &[&str], @@ -5620,8 +5973,10 @@ pub fn list_completed_jobs_query( .fields(fields) .order_by("v2_job.created_at", lq.order_desc.unwrap_or(true)) .offset(offset) - .limit(per_page) .clone(); + if let Some(per_page) = per_page { + sqlb.limit(per_page); + } if let Some(tags) = tags { sqlb.and_where_in( @@ -5682,7 +6037,7 @@ async fn list_completed_jobs( let sql = list_completed_jobs_query( &w_id, - per_page, + Some(per_page), offset, &lq, &[ diff --git a/frontend/src/lib/components/FieldHeader.svelte b/frontend/src/lib/components/FieldHeader.svelte index 2bbbacf198..9c465f73fe 100644 --- a/frontend/src/lib/components/FieldHeader.svelte +++ b/frontend/src/lib/components/FieldHeader.svelte @@ -1,8 +1,9 @@
@@ -51,8 +54,9 @@ {/if} {#if !emptyString(simpleTooltip)} - - + + + {simpleTooltip} diff --git a/frontend/src/lib/components/InputTransformForm.svelte b/frontend/src/lib/components/InputTransformForm.svelte index 4d67f10ba3..67f88534c5 100644 --- a/frontend/src/lib/components/InputTransformForm.svelte +++ b/frontend/src/lib/components/InputTransformForm.svelte @@ -29,7 +29,7 @@ import type { InputTransform } from '$lib/gen' import TemplateEditor from './TemplateEditor.svelte' import { setInputCat as computeInputCat, isCodeInjection } from '$lib/utils' - import { FunctionSquare } from 'lucide-svelte' + import { FunctionSquare, InfoIcon } from 'lucide-svelte' import { getResourceTypes } from './resourceTypesStore' import type { FlowCopilotContext } from './copilot/flow' import StepInputGen from './copilot/StepInputGen.svelte' @@ -39,6 +39,9 @@ export let schema: Schema | { properties?: Record; required?: string[] } export let arg: InputTransform | any export let argName: string + export let headerTooltip: string | undefined = undefined + export let headerTooltipIconClass = '' + export let HeaderTooltipIcon = InfoIcon export let extraLib: string = 'missing extraLib' export let inputCheck: boolean = true export let previousModuleId: string | undefined @@ -49,6 +52,7 @@ export let argExtra: Record = {} export let pickableProperties: PickableProperties | undefined = undefined export let enableAi = false + export let hideHelpButton = false let monaco: SimpleEditor | undefined = undefined let monacoTemplate: TemplateEditor | undefined = undefined @@ -70,8 +74,9 @@ const { shouldUpdatePropertyType, exprsToSet } = getContext('FlowCopilotContext') || {} - const { inputMatches, focusProp, propPickerConfig, clearFocus } = + const propPickerWrapperContext: PropPickerWrapperContext | undefined = getContext('PropPickerWrapper') + const { inputMatches, focusProp, propPickerConfig, clearFocus } = propPickerWrapperContext ?? {} function setExpr() { const newArg = $exprsToSet?.[argName] @@ -221,7 +226,7 @@ function onFocus() { focused = true if (isStaticTemplate(inputCat)) { - focusProp(argName, 'append', (path) => { + focusProp?.(argName, 'append', (path) => { const toAppend = `\$\{${path}}` arg.value = `${arg.value ?? ''}${toAppend}` monacoTemplate?.setCode(arg.value) @@ -230,7 +235,7 @@ return false }) } else { - focusProp(argName, 'insert', (path) => { + focusProp?.(argName, 'insert', (path) => { arg.expr = path arg.type = 'javascript' propertyType = 'javascript' @@ -253,7 +258,7 @@ if (propertyType == 'static') { setPropertyType(arg?.value) codeInjectionDetected = checkCodeInjection(arg?.value) != undefined - } else if (propertyType == 'javascript' && focused) { + } else if (propertyType == 'javascript' && focused && inputMatches) { // setPropertyType(arg?.expr) $inputMatches = checkCodeInjection(arg?.expr) } @@ -266,7 +271,7 @@ } function updateFocused(newFocused: boolean) { - if (focusedPrev && !newFocused) { + if (focusedPrev && !newFocused && inputMatches) { $inputMatches = undefined } focusedPrev = focused @@ -304,6 +309,9 @@
- { - if ( - $propPickerConfig?.propName == argName && - $propPickerConfig?.insertionMode == 'connect' - ) { - clearFocus() - } else { - focusProp?.(argName, 'connect', (path) => { - connectProperty(path) - dispatch('change', { argName }) - return true - }) - } - }} - /> + {#if propPickerWrapperContext} + { + if ( + $propPickerConfig?.propName == argName && + $propPickerConfig?.insertionMode == 'connect' + ) { + clearFocus() + } else { + focusProp?.(argName, 'connect', (path) => { + connectProperty(path) + dispatch('change', { argName }) + return true + }) + } + }} + /> + {/if}
{/if}
@@ -503,7 +513,7 @@ bind:code={arg.value} fontSize={14} on:change={() => { - dispatch('change', { argName }) + dispatch('change', { argName, arg }) }} /> {/if} @@ -520,7 +530,7 @@ }} shouldDispatchChanges on:change={() => { - dispatch('change', { argName }) + dispatch('change', { argName, arg }) }} label={argName} bind:editor={monaco} @@ -554,20 +564,20 @@ bind:this={monaco} bind:code={arg.expr} on:change={() => { - dispatch('change', { argName }) + dispatch('change', { argName, arg }) }} {extraLib} lang="javascript" shouldBindKey={false} on:focus={() => { focused = true - focusProp(argName, 'insert', (path) => { + focusProp?.(argName, 'insert', (path) => { monaco?.insertAtCursor(path) return false }) }} on:change={() => { - dispatch('change', { argName }) + dispatch('change', { argName, arg }) }} on:blur={() => { focused = false @@ -575,7 +585,9 @@ autoHeight />
- + {#if !hideHelpButton} + + {/if}
{:else} Not recognized input type {argName} ({arg.expr}, {propertyType}) diff --git a/frontend/src/lib/components/S3FilePicker.svelte b/frontend/src/lib/components/S3FilePicker.svelte index 3fd2e3a309..6a184e5ab9 100644 --- a/frontend/src/lib/components/S3FilePicker.svelte +++ b/frontend/src/lib/components/S3FilePicker.svelte @@ -799,7 +799,7 @@ deleteFileFromS3(fileMetadata?.fileKey) }} keyListen={false} - bind:loading={fileDeletionInProgress} + loading={fileDeletionInProgress} >
diff --git a/frontend/src/lib/components/common/confirmationModal/ConfirmationModal.svelte b/frontend/src/lib/components/common/confirmationModal/ConfirmationModal.svelte index 49f6089a63..d334dc8c4c 100644 --- a/frontend/src/lib/components/common/confirmationModal/ConfirmationModal.svelte +++ b/frontend/src/lib/components/common/confirmationModal/ConfirmationModal.svelte @@ -3,14 +3,26 @@ import { createEventDispatcher } from 'svelte' import { fade } from 'svelte/transition' import Button from '../button/Button.svelte' - import { AlertTriangle, CornerDownLeft, Loader2 } from 'lucide-svelte' + import { AlertTriangle, CornerDownLeft, Loader2, RefreshCcw } from 'lucide-svelte' - export let title: string - export let confirmationText: string - export let keyListen: boolean = true - export let loading: boolean = false + type Props = { + title: string + confirmationText: string + keyListen?: boolean + loading?: boolean + open?: boolean + type?: 'danger' | 'reload' + } - export let open: boolean = false + const { + title, + confirmationText, + keyListen = true, + loading = false, + open = false, + type: _type + }: Props = $props() + const type = $derived(_type ?? 'danger') const dispatch = createEventDispatcher() @@ -31,6 +43,27 @@ function fadeFast(node: HTMLElement) { return fade(node, { duration: 100 }) } + + const theme = { + danger: { + Icon: AlertTriangle, + color: 'red', + classes: { + icon: 'text-red-500 dark:text-red-400', + iconWrapper: 'bg-red-100 dark:bg-red-800/50' + } + }, + + reload: { + Icon: RefreshCcw, + color: 'dark', + classes: { + icon: 'text-blue-500 dark:text-blue-400', + iconWrapper: 'bg-blue-100 dark:bg-blue-800/50' + } + } + } satisfies { [type in typeof type]: any } + const Icon = $derived(theme[type].Icon ?? AlertTriangle) @@ -60,15 +93,16 @@ >
- +

{title}

+
@@ -77,14 +111,14 @@ + {/each} + {/await} +
+ + + + + {#if selected} +
+ + Use the job object to access data about the original job + +
+ { + if (!selected) return + ;(options[selected.kind][selected.script_path] ??= {}).use_latest_version = + e.detail as boolean + }} + size="sm" + options={{ + right: 'Always use latest version', + rightTooltip: + selected.kind === 'flow' + ? 'Flow jobs will always run on the latest version of the flow' + : 'Run all jobs with the latest version of the script even if they originally ran an older version' + }} + /> + + + + {@const displayedSchema = selectedUsesLatestSchema + ? (selected.latest_schema as Schema) + : mergeSchemasForBatchReruns(selected.schemas.map((s) => s.schema as Schema))} + {@const extraLib = buildExtraLibForBatchReruns({ + schemas: selected.schemas, + script_path: selected.script_path + })} +
+ {#key [selected, displayedSchema]} + {#each Object.keys(displayedSchema.properties) as propertyName} + { + if (!selected) return + const newArg = e.detail.arg as InputTransform + ;((options[selected.kind][selected.script_path] ??= {}).input_transforms ??= + {})[propertyName] = newArg + }} + argName={propertyName} + schema={displayedSchema} + {extraLib} + previousModuleId={undefined} + pickablepropertyMap={{ + hasResume: false, + previousId: undefined, + priorIds: {}, + flow_input: {} + }} + hideHelpButton + {...propertyAlwaysExists(propertyName, selected) + ? {} + : { + headerTooltip: + 'This property does not exist on all versions of the script. You can handle different cases in the code below', + HeaderTooltipIcon: TriangleAlert, + headerTooltipIconClass: 'text-orange-500' + }} + {...propertyAlwaysHasSameType(propertyName, selected) + ? {} + : { + headerTooltip: + 'This property does not always have the same type depending on the version of the script. You can handle different cases in the code below', + HeaderTooltipIcon: TriangleAlert, + headerTooltipIconClass: 'text-orange-500' + }} + /> + {/each} + {/key} +
+ {/if} +
+
+ +
+
diff --git a/frontend/src/lib/components/runs/RunRow.svelte b/frontend/src/lib/components/runs/RunRow.svelte index 4430708091..32c2e16f3a 100644 --- a/frontend/src/lib/components/runs/RunRow.svelte +++ b/frontend/src/lib/components/runs/RunRow.svelte @@ -7,9 +7,9 @@ msToReadableTime, truncateHash, truncateRev, - isJobCancelable, isFlowPreview, - isScriptPreview + isScriptPreview, + isJobSelectable } from '$lib/utils' import { Badge, Button } from '../common' import ScheduleEditor from '../ScheduleEditor.svelte' @@ -33,6 +33,7 @@ import Portal from '$lib/components/Portal.svelte' import WaitTimeWarning from '../common/waitTimeWarning/WaitTimeWarning.svelte' + import type { RunsSelectionMode } from './RunsBatchActionsDropdown.svelte' const dispatch = createEventDispatcher() @@ -41,7 +42,7 @@ export let containerWidth: number = 0 export let containsLabel: boolean = false export let activeLabel: string | null - export let isSelectingJobsToCancel: boolean = false + export let selectionMode: RunsSelectionMode | false = false let scheduleEditor: ScheduleEditor @@ -61,13 +62,13 @@ )} style="width: {containerWidth}px" on:click={() => { - if (!isSelectingJobsToCancel || isJobCancelable(job)) { + if (!selectionMode || isJobSelectable(selectionMode)(job)) { dispatch('select') } }} >
- {#if isSelectingJobsToCancel && isJobCancelable(job)} + {#if selectionMode && isJobSelectable(selectionMode)(job)}
diff --git a/frontend/src/lib/components/runs/RunsBatchActionsDropdown.svelte b/frontend/src/lib/components/runs/RunsBatchActionsDropdown.svelte new file mode 100644 index 0000000000..1f682c4fa5 --- /dev/null +++ b/frontend/src/lib/components/runs/RunsBatchActionsDropdown.svelte @@ -0,0 +1,92 @@ + + + + +{#if isLoading} + +{:else if selectionMode} +
+ + {/if} + {#if selectionMode == 're-run'} + + {/if} +
+{:else} + onSetSelectionMode('cancel') + }, + ...($userStore?.is_admin || $superadmin + ? [{ displayName: 'Cancel all jobs matching filters', action: onCancelFilteredJobs }] + : []), + { + displayName: 'Select jobs to re-run', + action: () => onSetSelectionMode('re-run') + }, + ...($userStore?.is_admin || $superadmin + ? [{ displayName: 'Re-run all jobs matching filters', action: onReRunFilteredJobs }] + : []) + ]} + > + +
+ Batch actions + +
+
+
+{/if} diff --git a/frontend/src/lib/components/runs/RunsTable.svelte b/frontend/src/lib/components/runs/RunsTable.svelte index 112a9aa5e6..17171bb669 100644 --- a/frontend/src/lib/components/runs/RunsTable.svelte +++ b/frontend/src/lib/components/runs/RunsTable.svelte @@ -8,14 +8,15 @@ import Popover from '../Popover.svelte' import { workspaceStore } from '$lib/stores' import { twMerge } from 'tailwind-merge' - import { isJobCancelable } from '$lib/utils' + import { isJobSelectable } from '$lib/utils' + import type { RunsSelectionMode } from './RunsBatchActionsDropdown.svelte' //import InfiniteLoading from 'svelte-infinite-loading' export let jobs: Job[] | undefined = undefined export let externalJobs: Job[] = [] export let omittedObscuredJobs: boolean export let showExternalJobs: boolean = false - export let isSelectingJobsToCancel: boolean = false + export let selectionMode: RunsSelectionMode | false = false export let selectedIds: string[] = [] export let selectedWorkspace: string | undefined = undefined export let activeLabel: string | null = null @@ -143,17 +144,20 @@ let allSelected: boolean = false function selectAll() { + if (!selectionMode) return if (allSelected) { allSelected = false selectedIds = [] } else { allSelected = true - selectedIds = jobs?.filter(isJobCancelable).map((j) => j.id) ?? [] + selectedIds = jobs?.filter(isJobSelectable(selectionMode)).map((j) => j.id) ?? [] } } - let cancelableJobCount: number = 0 - $: isSelectingJobsToCancel && (allSelected = selectedIds.length === cancelableJobCount) - $: isSelectingJobsToCancel && (cancelableJobCount = jobs?.filter(isJobCancelable).length ?? 0) + $: selectionMode && (allSelected = selectedIds.length === selectableJobCount) + + let selectableJobCount: number = 0 + $: selectionMode && + (selectableJobCount = jobs?.filter(isJobSelectable(selectionMode)).length ?? 0) function jobCountString(jobCount: number | undefined, lastFetchWentToEnd: boolean): string { if (jobCount === undefined) { @@ -195,7 +199,7 @@ bind:clientWidth={containerWidth} >
- {#if isSelectingJobsToCancel && cancelableJobCount != 0} + {#if selectionMode && selectableJobCount}
{ const jobId = jobOrDate.job.id - if (isSelectingJobsToCancel) { + if (selectionMode) { if (selectedIds.includes(jobOrDate.job.id)) { selectedIds = selectedIds.filter((id) => id != jobId) } else { diff --git a/frontend/src/lib/schema.ts b/frontend/src/lib/schema.ts index ae23a678ba..b01c18a628 100644 --- a/frontend/src/lib/schema.ts +++ b/frontend/src/lib/schema.ts @@ -1,15 +1,17 @@ -import type { Schema } from './common' +import type { Schema, SchemaProperty } from './common' -export function schemaToTsType(schema: Schema): string { - if (!schema || !schema.properties) { +export function schemaToTsType(schema: Schema | SchemaProperty): string { + const schemaProperties = schema.properties + const schemaRequired = schema.required + if (!schema || !schemaProperties) { return 'any' } - const propKeys = Object.keys(schema.properties) + const propKeys = Object.keys(schemaProperties) const types = propKeys .map((key: string) => { - const prop = schema.properties[key] - const isOptional = !schema.required.includes(key) + const prop = schemaProperties[key] + const isOptional = !schemaRequired?.includes(key) const prefix = `${key}${isOptional ? '?' : ''}` let type: string = 'any' if (prop.type === 'string') { @@ -19,11 +21,13 @@ export function schemaToTsType(schema: Schema): string { } else if (prop.type === 'boolean') { type = 'boolean' } else if (prop.type === 'array') { - let type = prop.items?.type ?? 'any' + type = prop.items?.type ?? 'any' if (type === 'integer') { type = 'number' } type = `${type}[]` + } else if (prop.type === 'object' && prop.properties) { + type = schemaToTsType(prop) } return `${prefix}: ${type}` diff --git a/frontend/src/lib/utils.ts b/frontend/src/lib/utils.ts index 1e0d9cf6dc..fd1c26bb69 100644 --- a/frontend/src/lib/utils.ts +++ b/frontend/src/lib/utils.ts @@ -16,10 +16,22 @@ import type { EnumType, SchemaProperty } from './common' import type { Schema } from './common' export { sendUserToast } import type { AnyMeltElement } from '@melt-ui/svelte' +import type { RunsSelectionMode } from './components/runs/RunsBatchActionsDropdown.svelte' export function isJobCancelable(j: Job): boolean { return j.type === 'QueuedJob' && !j.schedule_path && !j.canceled } +export function isJobReRunnable(j: Job): boolean { + return (j.job_kind === 'script' || j.job_kind === 'flow') && j.parent_job === undefined +} + +export function isJobSelectable(selectionType: RunsSelectionMode) { + const f: (j: Job) => boolean = { + cancel: isJobCancelable, + 're-run': isJobReRunnable + }[selectionType] + return f +} export function validateUsername(username: string): string { if (username != '' && !/^[a-zA-Z]\w+$/.test(username)) { @@ -85,7 +97,7 @@ export function displayDate( ? { day: 'numeric', month: 'numeric' - } + } : {} return date.toLocaleString(undefined, { ...timeChoices, @@ -229,7 +241,7 @@ export function clickOutside( } } - const capture = typeof options === 'boolean' ? options : options?.capture ?? true + const capture = typeof options === 'boolean' ? options : (options?.capture ?? true) document.addEventListener('click', handleClick, capture ?? true) return { @@ -605,6 +617,10 @@ export function pluralize(quantity: number, word: string, customPlural?: string) } } +export function addDeterminant(word: string): string { + return (/^[aeiou]/i.test(word) ? 'an ' : 'a ') + word +} + export function capitalize(word: string): string { return word ? word.charAt(0).toUpperCase() + word.slice(1) : '' } diff --git a/frontend/src/routes/(root)/(logged)/runs/[...path]/+page.svelte b/frontend/src/routes/(root)/(logged)/runs/[...path]/+page.svelte index 11fc0732ac..4f57d3d1ed 100644 --- a/frontend/src/routes/(root)/(logged)/runs/[...path]/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/runs/[...path]/+page.svelte @@ -7,12 +7,13 @@ FolderService, ScriptService, FlowService, - type ExtendedJobs + type ExtendedJobs, + OpenAPI } from '$lib/gen' import { page } from '$app/stores' import { sendUserToast } from '$lib/toast' - import { superadmin, userStore, workspaceStore, userWorkspaces } from '$lib/stores' + import { userStore, workspaceStore, userWorkspaces } from '$lib/stores' import { Button, Drawer, DrawerContent, Skeleton } from '$lib/components/common' import RunChart from '$lib/components/RunChart.svelte' @@ -31,19 +32,28 @@ import { twMerge } from 'tailwind-merge' import ManuelDatePicker from '$lib/components/runs/ManuelDatePicker.svelte' import JobLoader from '$lib/components/runs/JobLoader.svelte' - import { AlertTriangle, Calendar, Check, ChevronDown, Clock, X } from 'lucide-svelte' + import { AlertTriangle, Calendar, ChevronDown, Clock } from 'lucide-svelte' import ConcurrentJobsChart from '$lib/components/ConcurrentJobsChart.svelte' import ToggleButtonGroup from '$lib/components/common/toggleButton-v2/ToggleButtonGroup.svelte' import ToggleButton from '$lib/components/common/toggleButton-v2/ToggleButton.svelte' import DropdownV2 from '$lib/components/DropdownV2.svelte' import { goto } from '$app/navigation' import { base } from '$app/paths' - import { isJobCancelable } from '$lib/utils' + import type { RunsSelectionMode } from '$lib/components/runs/RunsBatchActionsDropdown.svelte' + import RunsBatchActionsDropdown from '$lib/components/runs/RunsBatchActionsDropdown.svelte' + import { isJobSelectable } from '$lib/utils' + import BatchReRunOptionsPane, { + type BatchReRunOptions + } from '$lib/components/runs/BatchReRunOptionsPane.svelte' let jobs: Job[] | undefined let selectedIds: string[] = [] + let loadingSelectedIds = false + $: loadingSelectedIds && selectedIds.length && setTimeout(() => (loadingSelectedIds = false), 250) let selectedWorkspace: string | undefined = undefined + let batchReRunOptions: BatchReRunOptions = { flow: {}, script: {} } + // All Filters // Filter by let path: string | null = $page.params.path @@ -158,9 +168,17 @@ let selectedManualDate = 0 let autoRefresh: boolean = getAutoRefresh() let runDrawer: Drawer - let isCancelingVisibleJobs = false - let isCancelingFilteredJobs = false let lookback: number = 1 + let askingForConfirmation: + | undefined + | { + title: string + confirmBtnText: string + loading?: boolean + preContent?: string + onConfirm?: () => void + type?: ConfirmationModal['$$prop_def']['type'] + } = undefined function getAutoRefresh() { try { @@ -353,8 +371,8 @@ lastFetchWentToEnd = false selectedManualDate = 0 selectedIds = [] - jobIdsToCancel = [] - isSelectingJobsToCancel = false + batchReRunOptions = { flow: {}, script: {} } + selectionMode = false selectedWorkspace = undefined jobLoader?.loadJobs(minTs, maxTs, true) } @@ -484,22 +502,29 @@ } } - let jobIdsToCancel: string[] = [] - let isSelectingJobsToCancel = false - let fetchingFilteredJobs = false - let selectedFiltersString: string | undefined = undefined + let selectionMode: RunsSelectionMode | false = false - async function cancelVisibleJobs() { - isSelectingJobsToCancel = true - selectedIds = jobs?.filter(isJobCancelable).map((j) => j.id) ?? [] - if (selectedIds.length === 0) { - sendUserToast('There are no visible jobs that can be canceled', true) + async function onSetSelectionMode(mode: RunsSelectionMode | false) { + selectionMode = mode + if (!mode) { + selectedIds = [] + batchReRunOptions = { flow: {}, script: {} } + return + } + const selectableIds = jobs?.filter(isJobSelectable(mode)).map((j) => j.id) ?? [] + selectedIds = [] + + if (!selectableIds?.length) { + sendUserToast( + 'There are no visible jobs that can be ' + + { cancel: 'cancelled', 're-run': 're-ran' }[mode], + true + ) } } - async function cancelFilteredJobs() { - isCancelingFilteredJobs = true - fetchingFilteredJobs = true - const selectedFilters = { + + function getSelectedFilters() { + return { workspace: $workspaceStore ?? '', startedBefore: maxTs, startedAfter: minTs, @@ -536,19 +561,148 @@ allWorkspaces: allWorkspaces ? true : undefined, allowWildcards: allowWildcards ? true : undefined } - - selectedFiltersString = JSON.stringify(selectedFilters, null, 4) - jobIdsToCancel = await JobService.listFilteredUuids(selectedFilters) - fetchingFilteredJobs = false } - async function cancelSelectedJobs() { - jobIdsToCancel = selectedIds - isCancelingVisibleJobs = true + async function cancelJobs(uuidsToCancel: string[]) { + const uuids = await JobService.cancelSelection({ + workspace: $workspaceStore ?? '', + requestBody: uuidsToCancel + }) + selectedIds = [] + jobLoader?.loadJobs(minTs, maxTs, true, true) + sendUserToast(`Canceled ${uuids.length} jobs`) + selectionMode = false } - function jobCountString(count: number) { - return `${count} ${count == 1 ? 'job' : 'jobs'}` + async function onCancelFilteredJobs() { + askingForConfirmation = { + title: 'Confirm cancelling all jobs corresponding to the selected filters', + confirmBtnText: 'Loading...', + loading: true + } + + const selectedFilters = getSelectedFilters() + const selectedFiltersString = JSON.stringify(selectedFilters, null, 4) + const jobIdsToCancel = await JobService.listFilteredQueueUuids(selectedFilters) + + askingForConfirmation = { + title: `Confirm cancelling all jobs corresponding to the selected filters (${jobIdsToCancel.length} jobs)`, + confirmBtnText: `Cancel ${jobIdsToCancel.length} jobs that matched the filters`, + preContent: selectedFiltersString, + onConfirm: () => { + cancelJobs(jobIdsToCancel) + } + } + } + + async function onCancelSelectedJobs() { + askingForConfirmation = { + confirmBtnText: `Cancel ${selectedIds.length} jobs`, + title: 'Confirm cancelling the selected jobs', + onConfirm: () => { + cancelJobs(selectedIds) + } + } + } + + async function reRunJobs(jobIdsToReRun: string[]) { + if (!$workspaceStore) return + + if (askingForConfirmation) { + askingForConfirmation.loading = true + } + + const body: Parameters[0]['requestBody'] = { + job_ids: jobIdsToReRun, + script_options_by_path: batchReRunOptions.script, + flow_options_by_path: batchReRunOptions.flow + } + + // workaround because EventSource does not support POST requests + // https://medium.com/@david.richards.tech/sse-server-sent-events-using-a-post-request-without-eventsource-1c0bd6f14425 + const response = await fetch(`${OpenAPI.BASE}/w/${$workspaceStore}/jobs/run/batch_rerun_jobs`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(body) + }) + await new Promise(async (resolve) => { + const reader = response?.body?.pipeThrough(new TextDecoderStream()).getReader() + let reRanUuids: string[] = [] + if (reader) { + while (true) { + const { value, done } = await reader.read() + if (value) { + // It is possible get multiple values at once in case of buffering + const receivedUuids: string[] = [] + for (const line of value.split('\n')) { + if (!line) continue + else if (line.startsWith('Error:')) { + console.error(line) + } else { + receivedUuids.push(line) + } + } + if (receivedUuids.length) { + reRanUuids.push(...receivedUuids) + if (askingForConfirmation) { + askingForConfirmation.confirmBtnText = `${reRanUuids.length}/${jobIdsToReRun.length}` + } + } + } + + if (done || !value) { + if (reRanUuids.length) { + sendUserToast(`Re-ran ${reRanUuids.length}/${jobIdsToReRun.length} jobs`) + } + if (reRanUuids.length !== jobIdsToReRun.length) { + sendUserToast( + `Failed to re-run ${jobIdsToReRun.length - reRanUuids.length} jobs. Check console for details`, + true + ) + // We do not get explicit error from backend if the job script don't exist + for (const jobId of jobIdsToReRun) { + if (reRanUuids.includes(jobId)) continue + console.error('Could not re-run job ' + jobId) + } + } + break + } + } + } + resolve(undefined) + }) + + selectedIds = [] + batchReRunOptions = { flow: {}, script: {} } + jobLoader?.loadJobs(minTs, maxTs, true, true) + selectionMode = false + } + + async function onReRunFilteredJobs() { + const selectedFilters = getSelectedFilters() + selectedIds = [] + loadingSelectedIds = true + + if (jobKindsCat !== 'runs') { + sendUserToast('Batch re-run is only supported for scripts and flows', true) + } + selectedIds = await JobService.listFilteredJobsUuids({ + ...selectedFilters, + jobKinds: 'script,flow' + }) + selectionMode = 're-run' + } + + async function onReRunSelectedJobs() { + const jobIdsToReRun = selectedIds + askingForConfirmation = { + title: `Confirm re-running the selected jobs`, + confirmBtnText: `Re-run ${jobIdsToReRun.length} jobs`, + type: 'reload', + onConfirm: async () => { + await reRunJobs(jobIdsToReRun) + } + } } function setLookback(lookbackInDays: number) { @@ -628,50 +782,25 @@ /> { - isCancelingFilteredJobs = false - let uuids = await JobService.cancelSelection({ - workspace: $workspaceStore ?? '', - requestBody: jobIdsToCancel - }) - jobIdsToCancel = [] - selectedIds = [] - jobLoader?.loadJobs(minTs, maxTs, true, true) - sendUserToast(`Canceled ${uuids.length} jobs`) - isSelectingJobsToCancel = false + const func = askingForConfirmation?.onConfirm + await func?.() + askingForConfirmation = undefined }} - loading={fetchingFilteredJobs} + type={askingForConfirmation?.type} + loading={askingForConfirmation?.loading} on:canceled={() => { - isCancelingFilteredJobs = false + askingForConfirmation = undefined }} > -
{selectedFiltersString}
+ {#if askingForConfirmation?.preContent} +
{askingForConfirmation.preContent}
+ {/if}
- { - isCancelingVisibleJobs = false - let uuids = await JobService.cancelSelection({ - workspace: $workspaceStore ?? '', - requestBody: jobIdsToCancel - }) - jobIdsToCancel = [] - selectedIds = [] - jobLoader?.loadJobs(minTs, maxTs, true, true) - sendUserToast(`Canceled ${uuids.length} jobs`) - isSelectingJobsToCancel = false - }} - on:canceled={() => { - isCancelingVisibleJobs = false - }} -/> - {#if selectedIds.length === 1} @@ -815,7 +944,7 @@ -
- {#if isSelectingJobsToCancel} -
- -
- {:else if !$userStore?.is_admin && !$superadmin} - - -
- Cancel jobs - -
-
-
- {:else} - - -
- Cancel jobs - -
-
-
- {/if} -
+
{/if} - - {#if selectedIds.length === 1} + + {#if selectionMode === 're-run'} + + {:else if selectedIds.length === 1} {#if selectedIds[0] === '-'}
There is no information available for this job
{:else} @@ -1195,7 +1273,7 @@ {/if}
- {#if isSelectingJobsToCancel} -
- -
- {:else if !$userStore?.is_admin && !$superadmin} - - -
- Cancel jobs - -
-
-
- {:else} - - -
- Cancel jobs - -
-
-
- {/if} +
@@ -1427,13 +1453,13 @@ externalJobs={externalJobs ?? []} omittedObscuredJobs={extendedJobs?.omitted_obscured_jobs ?? false} showExternalJobs={!graphIsRunsChart} - {isSelectingJobsToCancel} + {selectionMode} bind:selectedIds bind:selectedWorkspace bind:lastFetchWentToEnd on:loadExtra={loadExtra} on:select={() => { - if (!isSelectingJobsToCancel) runDrawer.openDrawer() + if (!selectionMode) runDrawer.openDrawer() }} on:filterByPath={filterByPath} on:filterByUser={filterByUser} From 8d062c47ecd9e84a81140d5c59814da9217dd434 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Tue, 15 Apr 2025 10:14:05 +0200 Subject: [PATCH 215/739] fix(cli): wmill-locks improvement --- cli/main.ts | 36 ++++++++-------- cli/metadata.ts | 111 ++++++++++++++++++++++++++++-------------------- 2 files changed, 84 insertions(+), 63 deletions(-) diff --git a/cli/main.ts b/cli/main.ts index 000f4c6e4c..92131ce63b 100644 --- a/cli/main.ts +++ b/cli/main.ts @@ -33,6 +33,7 @@ import { pull, push } from "./sync.ts"; import { add as workspaceAdd } from "./workspace.ts"; import workers from "./workers.ts"; import queues from "./queues.ts"; +import { readLockfile } from "./metadata.ts"; export { flow, @@ -96,24 +97,25 @@ const command = new Command() .command("init", "Bootstrap a windmill project with a wmill.yaml file") .action(async () => { if (await Deno.stat("wmill.yaml").catch(() => null)) { - log.error(colors.red("wmill.yaml already exists")); - return; + log.error(colors.green("wmill.yaml already exists")); + } else { + await Deno.writeTextFile( + "wmill.yaml", + yamlStringify({ + defaultTs: "bun", + includes: ["f/**"], + excludes: [], + codebases: [], + skipVariables: true, + skipResources: true, + skipSecrets: true, + includeSchedules: false, + includeTriggers: false, + }) + ); + log.info(colors.green("wmill.yaml created")); } - await Deno.writeTextFile( - "wmill.yaml", - yamlStringify({ - defaultTs: "bun", - includes: ["f/**"], - excludes: [], - codebases: [], - skipVariables: true, - skipResources: true, - skipSecrets: true, - includeSchedules: false, - includeTriggers: false, - }) - ); - log.info(colors.green("wmill.yaml created")); + await readLockfile(); }) .command("app", app) .command("flow", flow) diff --git a/cli/metadata.ts b/cli/metadata.ts index d00ef071da..3a83143182 100644 --- a/cli/metadata.ts +++ b/cli/metadata.ts @@ -33,11 +33,11 @@ import { FlowValue } from "./gen/types.gen.ts"; export class LockfileGenerationError extends Error { constructor(message: string) { super(message); - this.name = 'LockfileGenerationError'; + this.name = "LockfileGenerationError"; } } -export async function generateAllMetadata() { } +export async function generateAllMetadata() {} function findClosestRawReqs( lang: "bun" | "python3" | "php" | undefined, @@ -259,7 +259,7 @@ export async function generateScriptMetadataInternal( rawReqs ); } else { - metadataParsedContent.lock = ''; + metadataParsedContent.lock = ""; } } else { metadataParsedContent.lock = @@ -369,11 +369,7 @@ async function updateScriptLock( ); } throw new LockfileGenerationError( - `Failed to generate lockfile: ${JSON.stringify( - response, - null, - 2 - )}` + `Failed to generate lockfile: ${JSON.stringify(response, null, 2)}` ); } const lockPath = remotePath + ".script.lock"; @@ -385,7 +381,7 @@ async function updateScriptLock( if (await Deno.stat(lockPath)) { await Deno.remove(lockPath); } - } catch { } + } catch {} metadataContent.lock = ""; } } catch (e) { @@ -427,7 +423,7 @@ export async function updateFlow( | { error: { message: string } } | undefined; if (rawResponse.status != 200) { - const msg = (res as any)?.["error"]?.["message"] + const msg = (res as any)?.["error"]?.["message"]; if (msg) { throw new LockfileGenerationError( `Failed to generate lockfile: ${msg}` @@ -441,7 +437,7 @@ export async function updateFlow( } catch (e) { try { responseText = await rawResponse.text(); - } catch { } + } catch {} throw new Error( `Failed to generate lockfile. Status was: ${rawResponse.statusText}, ${responseText}, ${e}` ); @@ -463,22 +459,26 @@ export async function inferSchema( }> { let inferedSchema: any; if (language === "python3") { - const { parse_python } = await import('./wasm/python/windmill_parser_wasm.js') + const { parse_python } = await import( + "./wasm/python/windmill_parser_wasm.js" + ); inferedSchema = JSON.parse(parse_python(content)); } else if (language === "nativets") { - const { parse_deno } = await import('./wasm/ts/windmill_parser_wasm.js') + const { parse_deno } = await import("./wasm/ts/windmill_parser_wasm.js"); inferedSchema = JSON.parse(parse_deno(content)); } else if (language === "bun") { - const { parse_deno } = await import('./wasm/ts/windmill_parser_wasm.js') + const { parse_deno } = await import("./wasm/ts/windmill_parser_wasm.js"); inferedSchema = JSON.parse(parse_deno(content)); } else if (language === "deno") { - const { parse_deno } = await import('./wasm/ts/windmill_parser_wasm.js') + const { parse_deno } = await import("./wasm/ts/windmill_parser_wasm.js"); inferedSchema = JSON.parse(parse_deno(content)); } else if (language === "go") { const { parse_go } = await import("./wasm/go/windmill_parser_wasm.js"); inferedSchema = JSON.parse(parse_go(content)); } else if (language === "mysql") { - const { parse_mysql } = await import("./wasm/regex/windmill_parser_wasm.js"); + const { parse_mysql } = await import( + "./wasm/regex/windmill_parser_wasm.js" + ); inferedSchema = JSON.parse(parse_mysql(content)); inferedSchema.args = [ @@ -486,28 +486,36 @@ export async function inferSchema( ...inferedSchema.args, ]; } else if (language === "bigquery") { - const { parse_bigquery } = await import("./wasm/regex/windmill_parser_wasm.js"); + const { parse_bigquery } = await import( + "./wasm/regex/windmill_parser_wasm.js" + ); inferedSchema = JSON.parse(parse_bigquery(content)); inferedSchema.args = [ { name: "database", typ: { resource: "bigquery" } }, ...inferedSchema.args, ]; } else if (language === "oracledb") { - const { parse_oracledb } = await import("./wasm/regex/windmill_parser_wasm.js"); + const { parse_oracledb } = await import( + "./wasm/regex/windmill_parser_wasm.js" + ); inferedSchema = JSON.parse(parse_oracledb(content)); inferedSchema.args = [ { name: "database", typ: { resource: "oracledb" } }, ...inferedSchema.args, ]; } else if (language === "snowflake") { - const { parse_snowflake } = await import("./wasm/regex/windmill_parser_wasm.js"); + const { parse_snowflake } = await import( + "./wasm/regex/windmill_parser_wasm.js" + ); inferedSchema = JSON.parse(parse_snowflake(content)); inferedSchema.args = [ { name: "database", typ: { resource: "snowflake" } }, ...inferedSchema.args, ]; } else if (language === "mssql") { - const { parse_mssql } = await import("./wasm/regex/windmill_parser_wasm.js"); + const { parse_mssql } = await import( + "./wasm/regex/windmill_parser_wasm.js" + ); inferedSchema = JSON.parse(parse_mssql(content)); inferedSchema.args = [ { name: "database", typ: { resource: "ms_sql_server" } }, @@ -521,7 +529,9 @@ export async function inferSchema( ...inferedSchema.args, ]; } else if (language === "graphql") { - const { parse_graphql } = await import("./wasm/regex/windmill_parser_wasm.js"); + const { parse_graphql } = await import( + "./wasm/regex/windmill_parser_wasm.js" + ); inferedSchema = JSON.parse(parse_graphql(content)); inferedSchema.args = [ { name: "api", typ: { resource: "graphql" } }, @@ -531,7 +541,9 @@ export async function inferSchema( const { parse_bash } = await import("./wasm/regex/windmill_parser_wasm.js"); inferedSchema = JSON.parse(parse_bash(content)); } else if (language === "powershell") { - const { parse_powershell } = await import("./wasm/regex/windmill_parser_wasm.js"); + const { parse_powershell } = await import( + "./wasm/regex/windmill_parser_wasm.js" + ); inferedSchema = JSON.parse(parse_powershell(content)); } else if (language === "php") { const { parse_php } = await import("./wasm/php/windmill_parser_wasm.js"); @@ -540,18 +552,22 @@ export async function inferSchema( const { parse_rust } = await import("./wasm/rust/windmill_parser_wasm.js"); inferedSchema = JSON.parse(parse_rust(content)); } else if (language === "csharp") { - const { parse_csharp } = await import("./wasm/csharp/windmill_parser_wasm.js"); + const { parse_csharp } = await import( + "./wasm/csharp/windmill_parser_wasm.js" + ); inferedSchema = JSON.parse(parse_csharp(content)); } else if (language === "nu") { const { parse_nu } = await import("./wasm/nu/windmill_parser_wasm.js"); inferedSchema = JSON.parse(parse_nu(content)); } else if (language === "ansible") { - const { parse_ansible } = await import("./wasm/yaml/windmill_parser_wasm.js"); + const { parse_ansible } = await import( + "./wasm/yaml/windmill_parser_wasm.js" + ); inferedSchema = JSON.parse(parse_ansible(content)); } else if (language === "java") { const { parse_java } = await import("./wasm/java/windmill_parser_wasm.js"); inferedSchema = JSON.parse(parse_java(content)); - // for related places search: ADD_NEW_LANG + // for related places search: ADD_NEW_LANG } else { throw new Error("Invalid language: " + language); } @@ -569,10 +585,12 @@ export async function inferSchema( } if (!currentSchema) { - currentSchema = {} + currentSchema = {}; } currentSchema.required = []; - const oldProperties = JSON.parse(JSON.stringify(currentSchema?.properties ?? {})); + const oldProperties = JSON.parse( + JSON.stringify(currentSchema?.properties ?? {}) + ); currentSchema.properties = {}; for (const arg of inferedSchema.args) { @@ -594,7 +612,6 @@ export async function inferSchema( } } - return { schema: currentSchema, has_preprocessor: inferedSchema.has_preprocessor, @@ -620,23 +637,23 @@ export function argSigToJsonSchemaType( | string | { resource: string | null } | { - list: - | (string | { object: { key: string; typ: any }[] }) - | { str: any } - | { object: { key: string; typ: any }[] } - | null; - } + list: + | (string | { object: { key: string; typ: any }[] }) + | { str: any } + | { object: { key: string; typ: any }[] } + | null; + } | { dynselect: string } | { str: string[] | null } | { object: { key: string; typ: any }[] } | { - oneof: [ - { - label: string; - properties: { key: string; typ: any }[]; - } - ]; - }, + oneof: [ + { + label: string; + properties: { key: string; typ: any }[]; + } + ]; + }, oldS: SchemaProperty ): void { const newS: SchemaProperty = { type: "" }; @@ -839,10 +856,10 @@ export async function parseMetadataFile( scriptPath: string, generateMetadataIfMissing: | (GlobalOptions & { - path: string; - workspaceRemote: Workspace; - schemaOnly?: boolean; - }) + path: string; + workspaceRemote: Workspace; + schemaOnly?: boolean; + }) | undefined, globalDeps: GlobalDeps, codebases: SyncCodebase[] @@ -932,7 +949,7 @@ const WMILL_LOCKFILE = "wmill-lock.yaml"; export async function readLockfile(): Promise { try { const read = await yamlParseFile(WMILL_LOCKFILE); - if (typeof read == "object") { + if (typeof read == "object" && read != null) { return read as Lock; } else { throw new Error("Invalid lockfile"); @@ -940,6 +957,8 @@ export async function readLockfile(): Promise { } catch { const lock = { locks: {} }; await Deno.writeTextFile(WMILL_LOCKFILE, yamlStringify(lock, yamlOptions)); + log.info(colors.green("wmill-lock.yaml created")); + return lock; } } From 7ede048bb5d66100f4e59d32d5b785c2b8f06295 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Tue, 15 Apr 2025 10:20:10 +0200 Subject: [PATCH 216/739] nit cli --- cli/sync.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/sync.ts b/cli/sync.ts index 884d0e667e..f31cf3f328 100644 --- a/cli/sync.ts +++ b/cli/sync.ts @@ -41,6 +41,7 @@ import { SyncCodebase, listSyncCodebases } from "./codebase.ts"; import { generateFlowLockInternal, generateScriptMetadataInternal, + readLockfile, } from "./metadata.ts"; import { FlowModule, OpenFlow, RawScript } from "./gen/types.gen.ts"; import { pushResource } from "./resource.ts"; @@ -343,7 +344,7 @@ export function newPathAssigner(defaultTs: "bun" | "deno"): PathAssigner { else if (language == "nu") ext = "nu"; else if (language == "ansible") ext = "playbook.yml"; else if (language == "java") ext = "java"; - // for related places search: ADD_NEW_LANG + // for related places search: ADD_NEW_LANG else ext = "no_ext"; return [`${name}.inline_script.`, ext]; @@ -659,9 +660,8 @@ export async function elementsToMap( path.endsWith(".nats_trigger" + ext) || path.endsWith(".postgres_trigger" + ext) || path.endsWith(".mqtt_trigger" + ext) || - path.endsWith(".sqs_trigger" + ext) || - path.endsWith(".gcp_trigger" + ext) - ) + path.endsWith(".sqs_trigger" + ext) || + path.endsWith(".gcp_trigger" + ext)) ) continue; if (!skips.includeUsers && path.endsWith(".user" + ext)) continue; @@ -695,7 +695,7 @@ export async function elementsToMap( "yml", "nu", "java", - // for related places search: ADD_NEW_LANG + // for related places search: ADD_NEW_LANG ].includes(path.split(".").pop() ?? "") && !isFileResource(path) ) @@ -1273,7 +1273,7 @@ export async function pull(opts: GlobalOptions & SyncOptions) { } } log.info("All local changes pulled, now updating wmill-lock.yaml"); - + await readLockfile(); // ensure wmill-lock.yaml exists const globalDeps = await findGlobalDeps(); const tracker: ChangeTracker = await buildTracker(changes); From cd7ab5165e0ad2884f280d20f4d2624b37e5c417 Mon Sep 17 00:00:00 2001 From: wendrul <53628737+wendrul@users.noreply.github.com> Date: Tue, 15 Apr 2025 13:07:20 +0200 Subject: [PATCH 217/739] Change port for indexer (to remove collision with prometheus) (#5619) --- Caddyfile | 2 +- docker-compose.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Caddyfile b/Caddyfile index 67925e6492..933407b98d 100644 --- a/Caddyfile +++ b/Caddyfile @@ -12,7 +12,7 @@ bind {$ADDRESS} reverse_proxy /ws/* http://lsp:3001 # reverse_proxy /ws_mp/* http://multiplayer:3002 - # reverse_proxy /api/srch/* http://windmill_indexer:8001 + # reverse_proxy /api/srch/* http://windmill_indexer:8002 reverse_proxy /* http://windmill_server:8000 # tls /certs/cert.pem /certs/key.pem } diff --git a/docker-compose.yml b/docker-compose.yml index a8ac7ba565..82c66a9e69 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -135,9 +135,9 @@ services: replicas: 0 # set to 1 to enable full-text job and log search restart: unless-stopped expose: - - 8001 + - 8002 environment: - - PORT=8001 + - PORT=8002 - DATABASE_URL=${DATABASE_URL} - MODE=indexer depends_on: From 8a4ef022c828599a7ee2de5414730f2c60b4c080 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Tue, 15 Apr 2025 16:12:14 +0200 Subject: [PATCH 218/739] remove rgossiaux dep --- frontend/package-lock.json | 9 --------- frontend/package.json | 4 ---- 2 files changed, 13 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 4ca3ed9a53..207f5b22f5 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -89,7 +89,6 @@ "@melt-ui/pp": "^0.3.2", "@melt-ui/svelte": "^0.86.2", "@playwright/test": "^1.34.3", - "@rgossiaux/svelte-headlessui": "^2.0.0", "@sveltejs/adapter-static": "^3.0.6", "@sveltejs/kit": "^2.16.0", "@sveltejs/package": "^2.3.7", @@ -1209,14 +1208,6 @@ "version": "0.0.1", "license": "SEE LICENSE IN LICENSE" }, - "node_modules/@rgossiaux/svelte-headlessui": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "peerDependencies": { - "svelte": "^3.47.0" - } - }, "node_modules/@rollup/pluginutils": { "version": "5.1.4", "dev": true, diff --git a/frontend/package.json b/frontend/package.json index f8ceffa287..5d0e13fe3f 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -22,7 +22,6 @@ "@melt-ui/pp": "^0.3.2", "@melt-ui/svelte": "^0.86.2", "@playwright/test": "^1.34.3", - "@rgossiaux/svelte-headlessui": "^2.0.0", "@sveltejs/adapter-static": "^3.0.6", "@sveltejs/kit": "^2.16.0", "@sveltejs/package": "^2.3.7", @@ -73,9 +72,6 @@ "yootils": "^0.3.1" }, "overrides": { - "@rgossiaux/svelte-headlessui": { - "svelte": "$svelte" - }, "monaco-graphql": { "monaco-editor": "$monaco-editor" } From 841391923755af5846466502bbfb3db2781520ee Mon Sep 17 00:00:00 2001 From: Diego Imbert <70353967+diegoimbert@users.noreply.github.com> Date: Tue, 15 Apr 2025 17:19:57 +0200 Subject: [PATCH 219/739] replace on click wt on pointer down on flow node click (#5620) * replace on click wt on pointer down on flow node click * pointerdown on virtualitems --------- Co-authored-by: Diego Imbert --- .../components/flows/map/FlowModuleSchemaItem.svelte | 2 +- frontend/src/lib/components/flows/map/MapItem.svelte | 12 ++++++------ .../components/flows/map/VirtualItemWrapper.svelte | 2 +- .../graph/renderers/triggers/TriggersWrapper.svelte | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/frontend/src/lib/components/flows/map/FlowModuleSchemaItem.svelte b/frontend/src/lib/components/flows/map/FlowModuleSchemaItem.svelte index e0ad53a894..84f59161da 100644 --- a/frontend/src/lib/components/flows/map/FlowModuleSchemaItem.svelte +++ b/frontend/src/lib/components/flows/map/FlowModuleSchemaItem.svelte @@ -203,7 +203,7 @@ style="width: 275px; height: 38px; background-color: {bgColor};" on:mouseenter={() => (hover = true)} on:mouseleave={() => (hover = false)} - on:click|preventDefault|stopPropagation + on:pointerdown|preventDefault|stopPropagation >
{#if retry} diff --git a/frontend/src/lib/components/flows/map/MapItem.svelte b/frontend/src/lib/components/flows/map/MapItem.svelte index 1ce5f2c918..dceff7d539 100644 --- a/frontend/src/lib/components/flows/map/MapItem.svelte +++ b/frontend/src/lib/components/flows/map/MapItem.svelte @@ -122,7 +122,7 @@ on:changeId on:move={() => dispatch('move')} on:delete={onDelete} - on:click={() => dispatch('select', mod.id)} + on:pointerdown={() => dispatch('select', mod.id)} on:updateMock={({ detail }) => { mod.mock = detail dispatch('updateMock') @@ -148,7 +148,7 @@ on:changeId on:delete={onDelete} on:move={() => dispatch('move')} - on:click={() => dispatch('select', mod.id)} + on:pointerdown={() => dispatch('select', mod.id)} {...itemProps} id={mod.id} label={mod.summary || 'Run one branch'} @@ -165,7 +165,7 @@ on:changeId on:delete={onDelete} on:move={() => dispatch('move')} - on:click={() => dispatch('select', mod.id)} + on:pointerdown={() => dispatch('select', mod.id)} id={mod.id} {...itemProps} label={mod.summary || `Run all branches${mod.value.parallel ? ' (parallel)' : ''}`} @@ -180,7 +180,7 @@ {retries} {editMode} on:changeId - on:click={() => dispatch('select', mod.id)} + on:pointerdown={() => dispatch('select', mod.id)} on:delete={onDelete} on:move={() => dispatch('move')} on:updateMock={({ detail }) => { @@ -196,8 +196,8 @@ (mod.id === 'preprocessor' ? 'Preprocessor' : mod.id.startsWith('failure') - ? 'Error Handler' - : undefined) || + ? 'Error Handler' + : undefined) || (`path` in mod.value ? mod.value.path : undefined) || (mod.value.type === 'rawscript' ? `Inline ${prettyLanguage(mod.value.language)}` diff --git a/frontend/src/lib/components/flows/map/VirtualItemWrapper.svelte b/frontend/src/lib/components/flows/map/VirtualItemWrapper.svelte index f4a136885e..f1ce5ee1bb 100644 --- a/frontend/src/lib/components/flows/map/VirtualItemWrapper.svelte +++ b/frontend/src/lib/components/flows/map/VirtualItemWrapper.svelte @@ -33,7 +33,7 @@ onTop ? 'z-[901]' : '' )} style="width: 275px; max-height: 38px; background-color: {bgColor} !important;" - on:click={() => { + on:pointerdown={() => { if (selectable) { if (id) { dispatch('select', id) diff --git a/frontend/src/lib/components/graph/renderers/triggers/TriggersWrapper.svelte b/frontend/src/lib/components/graph/renderers/triggers/TriggersWrapper.svelte index 3eab0f4d7a..ced0a81d86 100644 --- a/frontend/src/lib/components/graph/renderers/triggers/TriggersWrapper.svelte +++ b/frontend/src/lib/components/graph/renderers/triggers/TriggersWrapper.svelte @@ -25,7 +25,7 @@ class="flex w-full flex-row gap-1 px-2 p-1 items-center {selected ? 'outline outline-2 outline-gray-600 rounded-sm dark:bg-white/5 dark:outline-gray-400' : ''}" - on:click={() => { + on:pointerdown={() => { dispatch('select') }} > From 16bed593dfd0b735a92d0928df5091547b98ae79 Mon Sep 17 00:00:00 2001 From: Guilhem Date: Tue, 15 Apr 2025 18:51:18 +0100 Subject: [PATCH 220/739] fix(frontend): load all step jobs (#5617) * fecth run from deployed script * do not show job loader for fast loading jobs * format file * Add padding to step output viewer * adjust prop picker popover * update job filters --- .../lib/components/FlowPreviewContent.svelte | 2 +- .../flows/map/FlowModuleSchemaItem.svelte | 2 + .../components/flows/map/VirtualItem.svelte | 2 + .../flows/propPicker/OutputPickerInner.svelte | 58 ++++++++++++------- .../flows/propPicker/StepHistory.svelte | 2 +- 5 files changed, 43 insertions(+), 23 deletions(-) diff --git a/frontend/src/lib/components/FlowPreviewContent.svelte b/frontend/src/lib/components/FlowPreviewContent.svelte index 30edf25691..448e6e89b4 100644 --- a/frontend/src/lib/components/FlowPreviewContent.svelte +++ b/frontend/src/lib/components/FlowPreviewContent.svelte @@ -187,7 +187,7 @@ `path` in module.value ? module.value.path : ($initialPathStore == '' ? $pathStore : $initialPathStore) + '/' + module.id, - jobKinds: ['preview', 'script', 'flowpreview', 'flow'].join(','), + jobKinds: ['preview', 'script', 'flowpreview', 'flow', 'flowscript'].join(','), page: 1, perPage: 1 }) diff --git a/frontend/src/lib/components/flows/map/FlowModuleSchemaItem.svelte b/frontend/src/lib/components/flows/map/FlowModuleSchemaItem.svelte index 84f59161da..745b312a7b 100644 --- a/frontend/src/lib/components/flows/map/FlowModuleSchemaItem.svelte +++ b/frontend/src/lib/components/flows/map/FlowModuleSchemaItem.svelte @@ -338,6 +338,8 @@ {loopStatus} rightMargin bind:derivedHistoryOpen={historyOpen} + historyOffset={{ mainAxis: 12, crossAxis: -9 }} + class="p-1" /> {/if} diff --git a/frontend/src/lib/components/flows/map/VirtualItem.svelte b/frontend/src/lib/components/flows/map/VirtualItem.svelte index 909a02a120..5d61c842bc 100644 --- a/frontend/src/lib/components/flows/map/VirtualItem.svelte +++ b/frontend/src/lib/components/flows/map/VirtualItem.svelte @@ -91,6 +91,8 @@ hideHeaderBar simpleViewer={inputJson} rightMargin + historyOffset={{ mainAxis: 12, crossAxis: -9 }} + class="p-1" /> {/if} diff --git a/frontend/src/lib/components/flows/propPicker/OutputPickerInner.svelte b/frontend/src/lib/components/flows/propPicker/OutputPickerInner.svelte index 4b820e08f9..7f3bdc3b16 100644 --- a/frontend/src/lib/components/flows/propPicker/OutputPickerInner.svelte +++ b/frontend/src/lib/components/flows/propPicker/OutputPickerInner.svelte @@ -57,6 +57,7 @@ export let disableMock: boolean = false export let disableHistory: boolean = false export let derivedHistoryOpen: boolean = false // derived from historyOpen + export let historyOffset = { mainAxis: 8, crossAxis: -4.5 } type SelectedJob = | Job @@ -211,7 +212,7 @@
@@ -234,8 +235,9 @@ { + isLoading = true + }, 200) + + try { + const fullJob = await detail.getFullJob() + if (fullJob) { + selectJob(fullJob) + togglePreview('job') + } + } finally { + // Clear the timeout if operation completed before 200ms + clearTimeout(loadingTimeout) + isLoading = false } - isLoading = false }} mockValue={mock?.return_value} mockEnabled={mock?.enabled} @@ -540,20 +556,20 @@ { - if (mock?.enabled) { - const newMock = { - enabled: true, - return_value: structuredClone(detail) + on:changeValue={({ detail }) => { + if (mock?.enabled) { + const newMock = { + enabled: true, + return_value: structuredClone(detail) + } + tmpMock = newMock } - tmpMock = newMock - } - }} - code={JSON.stringify( - mock?.enabled && mock.return_value ? mock.return_value : '', - null, - 2 - )} + }} + code={JSON.stringify( + mock?.enabled && mock.return_value ? mock.return_value : '', + null, + 2 + )} class="h-full" /> {/await} diff --git a/frontend/src/lib/components/flows/propPicker/StepHistory.svelte b/frontend/src/lib/components/flows/propPicker/StepHistory.svelte index 1fb5448801..c94876d343 100644 --- a/frontend/src/lib/components/flows/propPicker/StepHistory.svelte +++ b/frontend/src/lib/components/flows/propPicker/StepHistory.svelte @@ -27,7 +27,7 @@ const previousJobs = await JobService.listCompletedJobs({ workspace: $workspaceStore!, scriptPathExact: path === '' ? $pathStore + '/' + moduleId : path, - jobKinds: ['preview', 'script', 'flowpreview', 'flow'].join(','), + jobKinds: ['preview', 'script', 'flowpreview', 'flow', 'flowscript'].join(','), page, perPage }) From 1d0f5291f9978f5f45ea3f9757e4cf9321b1d0ce Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Tue, 15 Apr 2025 21:57:34 +0200 Subject: [PATCH 221/739] chore(main): release 1.482.0 (#5561) * chore(main): release 1.482.0 * Apply automatic changes --------- Co-authored-by: rubenfiszel <275584+rubenfiszel@users.noreply.github.com> --- CHANGELOG.md | 45 +++ backend/Cargo.lock | 338 +++++++++--------- backend/Cargo.toml | 4 +- backend/windmill-api/openapi.yaml | 6 +- benchmarks/lib.ts | 2 +- cli/main.ts | 2 +- frontend/package-lock.json | 4 +- frontend/package.json | 2 +- lsp/Pipfile | 4 +- openflow.openapi.yaml | 2 +- .../WindmillClient/WindmillClient.psd1 | 2 +- python-client/wmill/pyproject.toml | 2 +- python-client/wmill_pg/pyproject.toml | 2 +- typescript-client/jsr.json | 2 +- typescript-client/package.json | 2 +- version.txt | 2 +- 16 files changed, 224 insertions(+), 197 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a133b737a..8b440e9a04 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,50 @@ # Changelog +## [1.482.0](https://github.com/windmill-labs/windmill/compare/v1.481.0...v1.482.0) (2025-04-15) + + +### Features + +* add diff toggle to flow inline scripts ([#5550](https://github.com/windmill-labs/windmill/issues/5550)) ([b3ecde3](https://github.com/windmill-labs/windmill/commit/b3ecde3316252bcd7323de98149786349019ba7e)) +* add gcp trigger ([#5501](https://github.com/windmill-labs/windmill/issues/5501)) ([6339775](https://github.com/windmill-labs/windmill/commit/63397754046eed41d32e28d4698db37b4c9b9710)) +* add wildcards filter for worker/label/tags ([62f14d1](https://github.com/windmill-labs/windmill/commit/62f14d1cb95e3f1c7de85c46e1c6bb092247656c)) +* add windmill context to autocomplete ([#5548](https://github.com/windmill-labs/windmill/issues/5548)) ([b47c151](https://github.com/windmill-labs/windmill/commit/b47c15165f93ca68a58f81cf2b86fc9467155482)) +* agent workers v2 using http ([#5588](https://github.com/windmill-labs/windmill/issues/5588)) ([63fa499](https://github.com/windmill-labs/windmill/commit/63fa4990153f33434b49269922f7803d04e407cd)) +* Batch re-run ([#5553](https://github.com/windmill-labs/windmill/issues/5553)) ([26b5ea5](https://github.com/windmill-labs/windmill/commit/26b5ea5023a100c57d077910c99a5e5703edf1c1)) +* **frontend:** app editor code input component (monaco) ([#5566](https://github.com/windmill-labs/windmill/issues/5566)) ([177e16b](https://github.com/windmill-labs/windmill/commit/177e16bb18eed0d1c454b967aaa59547f61e8d26)) +* handle sending selected lines to ai context ([#5527](https://github.com/windmill-labs/windmill/issues/5527)) ([5abdc3e](https://github.com/windmill-labs/windmill/commit/5abdc3e4403b5c604309bd99a24d7a2847a17b9b)) +* Implement sending diff to ai ([#5510](https://github.com/windmill-labs/windmill/issues/5510)) ([e118d2c](https://github.com/windmill-labs/windmill/commit/e118d2cd5f9c641884a76229802a5228ef41f1a5)) +* make azure a standalone AI provider ([#5558](https://github.com/windmill-labs/windmill/issues/5558)) ([2c5e58c](https://github.com/windmill-labs/windmill/commit/2c5e58cf1ab9225d516540b38d9e4dde482a3a7f)) +* migrate to svelte5 + vite6 ([#4813](https://github.com/windmill-labs/windmill/issues/4813)) ([3c99b3f](https://github.com/windmill-labs/windmill/commit/3c99b3fdc7b78b1cdc7d8fb21d999296695f7889)) +* **postgres-trigger:** postgres trigger fix circular dependencies and add remove associate resource ([#5606](https://github.com/windmill-labs/windmill/issues/5606)) ([1daeb2f](https://github.com/windmill-labs/windmill/commit/1daeb2f48f3026621b3ffc58e10f048d5911906c)) +* **python:** per import requirement pin ([#5520](https://github.com/windmill-labs/windmill/issues/5520)) ([0b6d017](https://github.com/windmill-labs/windmill/commit/0b6d017fedc31e790a76cf29a1adaaf2a72acc61)) +* signed s3 objects ([#5593](https://github.com/windmill-labs/windmill/issues/5593)) ([b9e8796](https://github.com/windmill-labs/windmill/commit/b9e879618bc223ce17effde8bb4c5d1df2ad6df5)) + + +### Bug Fixes + +* add support for ${} syntax without default in bash ([#5594](https://github.com/windmill-labs/windmill/issues/5594)) ([3950cfd](https://github.com/windmill-labs/windmill/commit/3950cfd7e3297d7f8ec56430d6462f6b67ecd3c2)) +* app editor svelte 5 fixes ([#5570](https://github.com/windmill-labs/windmill/issues/5570)) ([b926076](https://github.com/windmill-labs/windmill/commit/b9260769883348ecd5aeb5684f527a8bf0073928)) +* binding not working in nested array script arg ([#5585](https://github.com/windmill-labs/windmill/issues/5585)) ([f5d46d5](https://github.com/windmill-labs/windmill/commit/f5d46d5751bc875b7f4da1db06be40571ac55ab8)) +* **cli:** properly handle enabled/disabled updates of schedules ([2629458](https://github.com/windmill-labs/windmill/commit/26294584d6c2ca02bbc4fc5f28cb8df6a5fb3790)) +* **cli:** wmill-locks improvement ([8d062c4](https://github.com/windmill-labs/windmill/commit/8d062c47ecd9e84a81140d5c59814da9217dd434)) +* Dynamic select does not work with tag //native ([#5576](https://github.com/windmill-labs/windmill/issues/5576)) ([1f3e7d9](https://github.com/windmill-labs/windmill/commit/1f3e7d9029051832db6ab1755b3cad38176a9e96)), closes [#5490](https://github.com/windmill-labs/windmill/issues/5490) +* fix list jobs by tag ([0c3cb37](https://github.com/windmill-labs/windmill/commit/0c3cb3700a3fb9b69e396487bd7491dbbd8861c0)) +* flow editor svelte 5 issues ([#5567](https://github.com/windmill-labs/windmill/issues/5567)) ([4f6be6e](https://github.com/windmill-labs/windmill/commit/4f6be6ed340e26bf1ed95398a9dc9f1eb41b33dd)) +* freeze when clicking script history diff button ([#5581](https://github.com/windmill-labs/windmill/issues/5581)) ([07094b6](https://github.com/windmill-labs/windmill/commit/07094b6aa21f10688b138d2a81d4fd5833f003fc)) +* **frontend:** app builder - force json configuration in rich result ([#5565](https://github.com/windmill-labs/windmill/issues/5565)) ([6fae3a5](https://github.com/windmill-labs/windmill/commit/6fae3a566be06dae88ece8ec23f5723cd8f3f2b9)) +* **frontend:** load all step jobs ([#5617](https://github.com/windmill-labs/windmill/issues/5617)) ([16bed59](https://github.com/windmill-labs/windmill/commit/16bed593dfd0b735a92d0928df5091547b98ae79)) +* **frontend:** prevent deploy popover to show if deploy dropdown is open ([#5542](https://github.com/windmill-labs/windmill/issues/5542)) ([c2180c6](https://github.com/windmill-labs/windmill/commit/c2180c6eb34e14fe2292ff40aa6a99c627698d5e)) +* **frontend:** proper each block binding + better app settings reactivity ([#5568](https://github.com/windmill-labs/windmill/issues/5568)) ([4c71af8](https://github.com/windmill-labs/windmill/commit/4c71af8a74627d0ba76917e0dac0ac9e5e984cca)) +* improve app image picker UX ([#5589](https://github.com/windmill-labs/windmill/issues/5589)) ([f497a4b](https://github.com/windmill-labs/windmill/commit/f497a4bfae8d1bff097e0c2c9df8381a531dfeb9)) +* legacy script gen model selection ([#5574](https://github.com/windmill-labs/windmill/issues/5574)) ([3507925](https://github.com/windmill-labs/windmill/commit/3507925624a43804a3be463b6f7913cea5821384)) +* mssql ca_cert deserializing ([#5587](https://github.com/windmill-labs/windmill/issues/5587)) ([b4f8c88](https://github.com/windmill-labs/windmill/commit/b4f8c88c19bd4f844c3ecb53ececc340ee326b0e)) +* number input in app multiselect yields NOT_NUMBER ([#5616](https://github.com/windmill-labs/windmill/issues/5616)) ([4aae6ab](https://github.com/windmill-labs/windmill/commit/4aae6ab634280adc1de9abd890100b7c12c89158)) +* prevent invalid returned ai completion object errors ([#5564](https://github.com/windmill-labs/windmill/issues/5564)) ([9276c71](https://github.com/windmill-labs/windmill/commit/9276c717a21aaee3241845a9cc00d3fb6bce9eb9)) +* Remaining svelte 5 bugs ([#5563](https://github.com/windmill-labs/windmill/issues/5563)) ([6e9ec63](https://github.com/windmill-labs/windmill/commit/6e9ec6323c265a747ef8696865297e6d47abb016)) +* tenant id to never be undefined on teams ([#5572](https://github.com/windmill-labs/windmill/issues/5572)) ([102b58a](https://github.com/windmill-labs/windmill/commit/102b58a5f40dde22f15700d4b6c11eb7f3fbf4bb)) +* validate saved module before passing to flow module editor ([#5580](https://github.com/windmill-labs/windmill/issues/5580)) ([2eb1a16](https://github.com/windmill-labs/windmill/commit/2eb1a161d15627b440195b65eec54998561f4ef6)) + ## [1.481.0](https://github.com/windmill-labs/windmill/compare/v1.480.1...v1.481.0) (2025-04-02) diff --git a/backend/Cargo.lock b/backend/Cargo.lock index 0f9558966f..90ccbcfd85 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -225,9 +225,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.97" +version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" +checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" [[package]] name = "arc-swap" @@ -421,7 +421,7 @@ dependencies = [ "arrow-schema", "chrono", "half", - "indexmap 2.8.0", + "indexmap 2.9.0", "lexical-core", "num", "serde", @@ -986,7 +986,7 @@ dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", "aws-smithy-types", - "h2 0.4.8", + "h2 0.4.9", "http 0.2.12", "http 1.3.1", "http-body 0.4.6", @@ -997,7 +997,7 @@ dependencies = [ "hyper-util", "pin-project-lite", "rustls 0.21.12", - "rustls 0.23.25", + "rustls 0.23.26", "rustls-native-certs 0.8.1", "rustls-pki-types", "tokio", @@ -1189,9 +1189,9 @@ checksum = "7b7e4c2464d97fe331d41de9d5db0def0a96f4d823b8b32a2efd503578988973" [[package]] name = "backon" -version = "1.4.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "970d91570c01a8a5959b36ad7dd1c30642df24b6b3068710066f6809f7033bb7" +checksum = "fd0b50b1b78dbadd44ab18b3c794e496f3a139abb9fbc27d9c94c4eebbb96496" dependencies = [ "fastrand", "gloo-timers", @@ -1207,7 +1207,7 @@ dependencies = [ "addr2line", "cfg-if", "libc", - "miniz_oxide 0.8.5", + "miniz_oxide 0.8.8", "object", "rustc-demangle", "windows-targets 0.52.6", @@ -1419,9 +1419,9 @@ dependencies = [ [[package]] name = "blake3" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34a796731680be7931955498a16a10b2270c7762963d5d570fdbfe02dcbf314f" +checksum = "389a099b34312839e16420d499a9cad9650541715937ffbdd40d36f49e77eeb3" dependencies = [ "arrayref", "arrayvec", @@ -1591,9 +1591,9 @@ dependencies = [ [[package]] name = "bstr" -version = "1.11.3" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "531a9155a481e2ee699d4f98f43c0ca4ff8ee1bfd55c31e9e98fb29d2b176fe0" +checksum = "234113d19d0d7d613b40e86fb654acf958910802bcceab913a4f9e7cda03b1a4" dependencies = [ "memchr", "serde", @@ -1833,9 +1833,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.17" +version = "1.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fcb57c740ae1daf453ae85f16e37396f672b039e00d9d866e07ddb24e328e3a" +checksum = "8e3a13707ac958681c13b39b458c073d0d9bc8a22cb1b2f4c8e55eb72c13f362" dependencies = [ "jobserver", "libc", @@ -1975,9 +1975,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.35" +version = "4.5.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8aa86934b44c19c50f87cc2790e19f54f7a67aedb64101c2e1a2e5ecfb73944" +checksum = "2df961d8c8a0d08aa9945718ccf584145eee3f3aa06cddbeac12933781102e04" dependencies = [ "clap_builder", "clap_derive", @@ -1985,9 +1985,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.35" +version = "4.5.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2414dbb2dd0695280da6ea9261e327479e9d37b0630f6b53ba2a11c60c679fd9" +checksum = "132dbda40fb6753878316a489d5a1242a8ef2f0d9e47ba01c951ea8aa7d013a5" dependencies = [ "anstream", "anstyle", @@ -2321,9 +2321,9 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.14" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" dependencies = [ "crossbeam-utils", ] @@ -2588,9 +2588,9 @@ dependencies = [ [[package]] name = "data-encoding" -version = "2.8.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "575f75dfd25738df5b91b8e43e14d44bda14637a58fae779fd2b064f8bf3e010" +checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" [[package]] name = "data-url" @@ -2632,7 +2632,7 @@ dependencies = [ "glob", "half", "hashbrown 0.14.5", - "indexmap 2.8.0", + "indexmap 2.9.0", "itertools 0.12.1", "log", "num_cpus", @@ -2801,7 +2801,7 @@ dependencies = [ "datafusion-expr", "datafusion-physical-expr", "hashbrown 0.14.5", - "indexmap 2.8.0", + "indexmap 2.9.0", "itertools 0.12.1", "log", "regex-syntax 0.8.5", @@ -2830,7 +2830,7 @@ dependencies = [ "half", "hashbrown 0.14.5", "hex", - "indexmap 2.8.0", + "indexmap 2.9.0", "itertools 0.12.1", "log", "paste", @@ -2874,7 +2874,7 @@ dependencies = [ "futures", "half", "hashbrown 0.14.5", - "indexmap 2.8.0", + "indexmap 2.9.0", "itertools 0.12.1", "log", "once_cell", @@ -3006,7 +3006,7 @@ dependencies = [ "deno_media_type", "deno_path_util", "http 1.3.1", - "indexmap 2.8.0", + "indexmap 2.9.0", "log", "once_cell", "parking_lot 0.12.3", @@ -3047,7 +3047,7 @@ dependencies = [ "glob", "ignore", "import_map", - "indexmap 2.8.0", + "indexmap 2.9.0", "jsonc-parser", "log", "percent-encoding", @@ -3088,7 +3088,7 @@ dependencies = [ "deno_path_util", "deno_unsync", "futures", - "indexmap 2.8.0", + "indexmap 2.9.0", "libc", "memoffset", "parking_lot 0.12.3", @@ -3211,7 +3211,7 @@ dependencies = [ "deno_tls", "dyn-clone", "error_reporter", - "h2 0.4.8", + "h2 0.4.9", "hickory-resolver", "http 1.3.1", "http-body-util", @@ -3492,14 +3492,14 @@ dependencies = [ "elliptic-curve", "errno", "faster-hex", - "h2 0.4.8", + "h2 0.4.9", "hkdf", "http 1.3.1", "http-body-util", "hyper 1.6.0", "hyper-util", "idna", - "indexmap 2.8.0", + "indexmap 2.9.0", "ipnetwork", "k256", "lazy-regex", @@ -3575,7 +3575,7 @@ version = "0.212.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2d328067139909aa81522a5d90f119368b541fbddd73ab630e4d9f777865f0d" dependencies = [ - "indexmap 2.8.0", + "indexmap 2.9.0", "proc-macro-rules", "proc-macro2", "quote", @@ -3619,7 +3619,7 @@ dependencies = [ "deno_error", "deno_path_util", "deno_semver", - "indexmap 2.8.0", + "indexmap 2.9.0", "serde", "serde_json", "sys_traits", @@ -3856,7 +3856,7 @@ dependencies = [ "deno_core", "deno_error", "deno_native_certs", - "rustls 0.23.25", + "rustls 0.23.26", "rustls-pemfile 2.2.0", "rustls-tokio-stream", "rustls-webpki 0.102.8", @@ -3948,7 +3948,7 @@ dependencies = [ "deno_permissions", "deno_tls", "fastwebsockets", - "h2 0.4.8", + "h2 0.4.9", "http 1.3.1", "http-body-util", "hyper 1.6.0", @@ -4089,9 +4089,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.4.1" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cfac68e08048ae1883171632c2aef3ebc555621ae56fbccce1cbf22dd7f058" +checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" dependencies = [ "powerfmt", "serde", @@ -4424,9 +4424,9 @@ dependencies = [ [[package]] name = "ecow" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e42fc0a93992b20c58b99e59d61eaf1635a25bfbe49e4275c34ba0aee98119ba" +checksum = "ef5eeffa816451f3a6a4cce9cd796e3e5ba6018638d3ce5cc7f87b73bababf60" dependencies = [ "serde", ] @@ -4573,9 +4573,9 @@ dependencies = [ [[package]] name = "errno" -version = "0.3.10" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" dependencies = [ "libc", "windows-sys 0.59.0", @@ -4784,7 +4784,7 @@ checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" dependencies = [ "crc32fast", "libz-sys", - "miniz_oxide 0.8.5", + "miniz_oxide 0.8.8", ] [[package]] @@ -5536,7 +5536,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.8.0", + "indexmap 2.9.0", "slab", "tokio", "tokio-util", @@ -5545,9 +5545,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5017294ff4bb30944501348f6f8e42e6ad28f42c8bbef7a74029aff064a4e3c2" +checksum = "75249d144030531f8dee69fe9cea04d3edf809a017ae445e2abdff6629e86633" dependencies = [ "atomic-waker", "bytes", @@ -5555,7 +5555,7 @@ dependencies = [ "futures-core", "futures-sink", "http 1.3.1", - "indexmap 2.8.0", + "indexmap 2.9.0", "slab", "tokio", "tokio-util", @@ -5794,13 +5794,13 @@ dependencies = [ [[package]] name = "hostname" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9c7c7c8ac16c798734b8a24560c1362120597c40d5e1459f09498f8f6c8f2ba" +checksum = "a56f203cd1c76362b69e3863fd987520ac36cf70a8c92627449b2f64a8cf7d65" dependencies = [ "cfg-if", "libc", - "windows 0.52.0", + "windows-link", ] [[package]] @@ -5930,7 +5930,7 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "h2 0.4.8", + "h2 0.4.9", "http 1.3.1", "http-body 1.0.1", "httparse", @@ -5983,7 +5983,7 @@ dependencies = [ "http 1.3.1", "hyper 1.6.0", "hyper-util", - "rustls 0.23.25", + "rustls 0.23.26", "rustls-native-certs 0.8.1", "rustls-pki-types", "tokio", @@ -6281,7 +6281,7 @@ checksum = "1215d4d92511fbbdaea50e750e91f2429598ef817f02b579158e92803b52c00a" dependencies = [ "boxed_error", "deno_error", - "indexmap 2.8.0", + "indexmap 2.9.0", "log", "percent-encoding", "serde", @@ -6303,9 +6303,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.8.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" dependencies = [ "equivalent", "hashbrown 0.15.2", @@ -6587,7 +6587,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ee7893dab2e44ae5f9d0173f26ff4aa327c10b01b06a72b52dd9405b628640d" dependencies = [ - "indexmap 2.8.0", + "indexmap 2.9.0", ] [[package]] @@ -6758,9 +6758,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.171" +version = "0.2.172" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" [[package]] name = "libffi" @@ -6826,7 +6826,7 @@ checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ "bitflags 2.9.0", "libc", - "redox_syscall 0.5.10", + "redox_syscall 0.5.11", ] [[package]] @@ -6877,9 +6877,9 @@ checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "linux-raw-sys" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe7db12097d22ec582439daf8618b8fdd1a7bef6270e9af3b1ebcd30893cf413" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" [[package]] name = "litemap" @@ -7041,7 +7041,7 @@ dependencies = [ "base64 0.22.1", "gethostname", "mail-builder", - "rustls 0.23.25", + "rustls 0.23.26", "rustls-pki-types", "smtp-proto", "tokio", @@ -7310,9 +7310,9 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.8.5" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" +checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" dependencies = [ "adler2", "simd-adler32", @@ -7509,7 +7509,7 @@ dependencies = [ "bitflags 2.9.0", "codespan-reporting", "hexf-parse", - "indexmap 2.8.0", + "indexmap 2.9.0", "log", "num-traits", "rustc-hash 1.1.0", @@ -7798,7 +7798,7 @@ dependencies = [ "dirs-sys 0.4.1", "fancy-regex", "heck 0.5.0", - "indexmap 2.8.0", + "indexmap 2.9.0", "log", "lru", "miette", @@ -8186,9 +8186,9 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.71" +version = "0.10.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e14130c6a98cd258fdcb0fb6d744152343ff729cbfcb28c656a9d12b999fbcd" +checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" dependencies = [ "bitflags 2.9.0", "cfg-if", @@ -8218,18 +8218,18 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-src" -version = "300.4.2+3.4.1" +version = "300.5.0+3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168ce4e058f975fe43e89d9ccf78ca668601887ae736090aacc23ae353c298e2" +checksum = "e8ce546f549326b0e6052b649198487d91320875da901e7bd11a06d1ee3f9c2f" dependencies = [ "cc", ] [[package]] name = "openssl-sys" -version = "0.9.106" +version = "0.9.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bb61ea9811cc39e3c2069f40b8b8e2e70d8569b361f879786cc7ed48b777cdd" +checksum = "8288979acd84749c744a9014b4382d42b8f7b2592847b5afb2ed29e5d16ede07" dependencies = [ "cc", "libc", @@ -8522,7 +8522,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.10", + "redox_syscall 0.5.11", "smallvec", "windows-targets 0.52.6", ] @@ -8652,7 +8652,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset 0.4.2", - "indexmap 2.8.0", + "indexmap 2.9.0", ] [[package]] @@ -8662,7 +8662,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772" dependencies = [ "fixedbitset 0.5.7", - "indexmap 2.8.0", + "indexmap 2.9.0", ] [[package]] @@ -8824,7 +8824,7 @@ dependencies = [ "crc32fast", "fdeflate", "flate2", - "miniz_oxide 0.8.5", + "miniz_oxide 0.8.8", ] [[package]] @@ -8953,9 +8953,9 @@ checksum = "c6fa0831dd7cc608c38a5e323422a0077678fa5744aa2be4ad91c4ece8eec8d5" [[package]] name = "prettyplease" -version = "0.2.31" +version = "0.2.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5316f57387668042f561aae71480de936257848f9c43ce528e311d89a07cadeb" +checksum = "664ec5419c51e34154eec046ebcba56312d5a2fc3b09a06da188e1ad21afadf6" dependencies = [ "proc-macro2", "syn 2.0.100", @@ -9281,7 +9281,7 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash 2.1.1", - "rustls 0.23.25", + "rustls 0.23.26", "socket2", "thiserror 2.0.12", "tokio", @@ -9300,7 +9300,7 @@ dependencies = [ "rand 0.9.0", "ring 0.17.14", "rustc-hash 2.1.1", - "rustls 0.23.25", + "rustls 0.23.26", "rustls-pki-types", "slab", "thiserror 2.0.12", @@ -9534,9 +9534,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.10" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" +checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3" dependencies = [ "bitflags 2.9.0", ] @@ -9691,7 +9691,7 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", - "h2 0.4.8", + "h2 0.4.9", "http 1.3.1", "http-body 1.0.1", "http-body-util", @@ -9708,7 +9708,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.25", + "rustls 0.23.26", "rustls-native-certs 0.8.1", "rustls-pemfile 2.2.0", "rustls-pki-types", @@ -9734,9 +9734,9 @@ dependencies = [ [[package]] name = "reqwest-middleware" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64e8975513bd9a7a43aad01030e79b3498e05db14e9d945df6483e8cf9b8c4c4" +checksum = "57f17d28a6e6acfe1733fe24bcd30774d13bffa4b8a22535b4c8c98423088d4e" dependencies = [ "anyhow", "async-trait", @@ -10065,7 +10065,7 @@ dependencies = [ "bitflags 2.9.0", "errno", "libc", - "linux-raw-sys 0.9.3", + "linux-raw-sys 0.9.4", "windows-sys 0.59.0", ] @@ -10097,9 +10097,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.25" +version = "0.23.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "822ee9188ac4ec04a2f0531e55d035fb2de73f18b41a63c70c2712503b6fb13c" +checksum = "df51b5869f3a441595eac5e8ff14d486ff285f7b8c0df8770e49c3b56351f0f0" dependencies = [ "aws-lc-rs", "log", @@ -10182,7 +10182,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22557157d7395bc30727745b365d923f1ecc230c4c80b176545f3f4f08c46e33" dependencies = [ "futures", - "rustls 0.23.25", + "rustls 0.23.26", "socket2", "tokio", ] @@ -10618,7 +10618,7 @@ version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ - "indexmap 2.8.0", + "indexmap 2.9.0", "itoa", "memchr", "ryu", @@ -10709,7 +10709,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.8.0", + "indexmap 2.9.0", "serde", "serde_derive", "serde_json", @@ -10947,9 +10947,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.14.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" +checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" dependencies = [ "serde", ] @@ -11132,9 +11132,9 @@ dependencies = [ [[package]] name = "sqlx" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4410e73b3c0d8442c5f99b425d7a435b5ee0ae4167b3196771dd3f7a01be745f" +checksum = "14e22987355fbf8cfb813a0cf8cd97b1b4ec834b94dbd759a9e8679d41fabe83" dependencies = [ "sqlx-core", "sqlx-macros", @@ -11145,10 +11145,11 @@ dependencies = [ [[package]] name = "sqlx-core" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a007b6936676aa9ab40207cde35daab0a04b823be8ae004368c0793b96a61e0" +checksum = "55c4720d7d4cd3d5b00f61d03751c685ad09c33ae8290c8a2c11335e0604300b" dependencies = [ + "base64 0.22.1", "bigdecimal", "bytes", "chrono", @@ -11162,13 +11163,12 @@ dependencies = [ "futures-util", "hashbrown 0.15.2", "hashlink 0.10.0", - "indexmap 2.8.0", + "indexmap 2.9.0", "log", "memchr", "once_cell", "percent-encoding", - "rustls 0.23.25", - "rustls-pemfile 2.2.0", + "rustls 0.23.26", "serde", "serde_json", "sha2 0.10.8", @@ -11184,9 +11184,9 @@ dependencies = [ [[package]] name = "sqlx-macros" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3112e2ad78643fef903618d78cf0aec1cb3134b019730edb039b69eaf531f310" +checksum = "175147fcb75f353ac7675509bc58abb2cb291caf0fd24a3623b8f7e3eb0a754b" dependencies = [ "proc-macro2", "quote", @@ -11197,9 +11197,9 @@ dependencies = [ [[package]] name = "sqlx-macros-core" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e9f90acc5ab146a99bf5061a7eb4976b573f560bc898ef3bf8435448dd5e7ad" +checksum = "1cde983058e53bfa75998e1982086c5efe3c370f3250bf0357e344fa3352e32b" dependencies = [ "dotenvy", "either", @@ -11223,9 +11223,9 @@ dependencies = [ [[package]] name = "sqlx-mysql" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4560278f0e00ce64938540546f59f590d60beee33fffbd3b9cd47851e5fff233" +checksum = "847d2e5393a4f39e47e4f36cab419709bc2b83cbe4223c60e86e1471655be333" dependencies = [ "atoi", "base64 0.22.1", @@ -11268,9 +11268,9 @@ dependencies = [ [[package]] name = "sqlx-postgres" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5b98a57f363ed6764d5b3a12bfedf62f07aa16e1856a7ddc2a0bb190a959613" +checksum = "cc35947a541b9e0a2e3d85da444f1c4137c13040267141b208395a0d0ca4659f" dependencies = [ "atoi", "base64 0.22.1", @@ -11309,9 +11309,9 @@ dependencies = [ [[package]] name = "sqlx-sqlite" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f85ca71d3a5b24e64e1d08dd8fe36c6c95c339a896cc33068148906784620540" +checksum = "6c48291dac4e5ed32da0927a0b981788be65674aeb62666d19873ab4289febde" dependencies = [ "atoi", "chrono", @@ -11327,6 +11327,7 @@ dependencies = [ "serde", "serde_urlencoded", "sqlx-core", + "thiserror 2.0.12", "tracing", "url", "uuid", @@ -11561,7 +11562,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4740e53eaf68b101203c1df0937d5161a29f3c13bceed0836ddfe245b72dd000" dependencies = [ "anyhow", - "indexmap 2.8.0", + "indexmap 2.9.0", "serde", "serde_json", "swc_cached", @@ -11673,7 +11674,7 @@ checksum = "65f21494e75d0bd8ef42010b47cabab9caaed8f2207570e809f6f4eb51a710d1" dependencies = [ "better_scoped_tls", "bitflags 2.9.0", - "indexmap 2.8.0", + "indexmap 2.9.0", "once_cell", "phf", "rustc-hash 1.1.0", @@ -11742,7 +11743,7 @@ checksum = "76c76d8b9792ce51401d38da0fa62158d61f6d80d16d68fe5b03ce4bf5fba383" dependencies = [ "base64 0.21.7", "dashmap", - "indexmap 2.8.0", + "indexmap 2.9.0", "once_cell", "serde", "sha1", @@ -11782,7 +11783,7 @@ version = "0.134.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "029eec7dd485923a75b5a45befd04510288870250270292fc2c1b3a9e7547408" dependencies = [ - "indexmap 2.8.0", + "indexmap 2.9.0", "num_cpus", "once_cell", "rustc-hash 1.1.0", @@ -12466,9 +12467,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.44.1" +version = "1.44.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f382da615b842244d4b8738c82ed1275e6c5dd90c459a30941cd07080b06c91a" +checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" dependencies = [ "backtrace", "bytes", @@ -12614,7 +12615,7 @@ version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" dependencies = [ - "rustls 0.23.25", + "rustls 0.23.26", "tokio", ] @@ -12735,7 +12736,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.8.0", + "indexmap 2.9.0", "serde", "serde_spanned", "toml_datetime", @@ -12748,9 +12749,9 @@ version = "0.22.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" dependencies = [ - "indexmap 2.8.0", + "indexmap 2.9.0", "toml_datetime", - "winnow 0.7.4", + "winnow 0.7.6", ] [[package]] @@ -12765,7 +12766,7 @@ dependencies = [ "base64 0.22.1", "bytes", "flate2", - "h2 0.4.8", + "h2 0.4.9", "http 1.3.1", "http-body 1.0.1", "http-body-util", @@ -13373,7 +13374,7 @@ dependencies = [ "log", "native-tls", "once_cell", - "rustls 0.23.25", + "rustls 0.23.26", "rustls-pki-types", "serde", "serde_json", @@ -13482,7 +13483,7 @@ checksum = "97599c400fc79925922b58303e98fcb8fa88f573379a08ddb652e72cbd2e70f6" dependencies = [ "bitflags 2.9.0", "encoding_rs", - "indexmap 2.8.0", + "indexmap 2.9.0", "num-bigint", "serde", "thiserror 1.0.69", @@ -13766,7 +13767,7 @@ dependencies = [ "cfg_aliases 0.1.1", "codespan-reporting", "document-features", - "indexmap 2.8.0", + "indexmap 2.9.0", "log", "naga", "once_cell", @@ -13867,7 +13868,7 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6994d13118ab492c3c80c1f81928718159254c53c472bf9ce36f8dae4add02a7" dependencies = [ - "redox_syscall 0.5.10", + "redox_syscall 0.5.11", "wasite", "web-sys", ] @@ -13911,7 +13912,7 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windmill" -version = "1.481.0" +version = "1.482.0" dependencies = [ "anyhow", "axum", @@ -13931,7 +13932,7 @@ dependencies = [ "quote", "rand 0.9.0", "reqwest 0.12.15", - "rustls 0.23.25", + "rustls 0.23.26", "serde", "serde_json", "sha1", @@ -13958,7 +13959,7 @@ dependencies = [ [[package]] name = "windmill-api" -version = "1.481.0" +version = "1.482.0" dependencies = [ "anyhow", "argon2", @@ -14065,7 +14066,7 @@ dependencies = [ [[package]] name = "windmill-api-client" -version = "1.481.0" +version = "1.482.0" dependencies = [ "base64 0.22.1", "chrono", @@ -14080,7 +14081,7 @@ dependencies = [ [[package]] name = "windmill-audit" -version = "1.481.0" +version = "1.482.0" dependencies = [ "chrono", "serde", @@ -14093,7 +14094,7 @@ dependencies = [ [[package]] name = "windmill-autoscaling" -version = "1.481.0" +version = "1.482.0" dependencies = [ "anyhow", "serde", @@ -14107,7 +14108,7 @@ dependencies = [ [[package]] name = "windmill-common" -version = "1.481.0" +version = "1.482.0" dependencies = [ "anyhow", "async-stream", @@ -14129,7 +14130,7 @@ dependencies = [ "hex", "hmac", "hyper 1.6.0", - "indexmap 2.8.0", + "indexmap 2.9.0", "itertools 0.14.0", "jsonwebtoken 8.3.0", "lazy_static", @@ -14171,7 +14172,7 @@ dependencies = [ [[package]] name = "windmill-git-sync" -version = "1.481.0" +version = "1.482.0" dependencies = [ "regex", "serde", @@ -14185,7 +14186,7 @@ dependencies = [ [[package]] name = "windmill-indexer" -version = "1.481.0" +version = "1.482.0" dependencies = [ "anyhow", "bytes", @@ -14208,7 +14209,7 @@ dependencies = [ [[package]] name = "windmill-macros" -version = "1.481.0" +version = "1.482.0" dependencies = [ "itertools 0.14.0", "lazy_static", @@ -14220,7 +14221,7 @@ dependencies = [ [[package]] name = "windmill-parser" -version = "1.481.0" +version = "1.482.0" dependencies = [ "convert_case 0.6.0", "serde", @@ -14229,7 +14230,7 @@ dependencies = [ [[package]] name = "windmill-parser-bash" -version = "1.481.0" +version = "1.482.0" dependencies = [ "anyhow", "lazy_static", @@ -14241,7 +14242,7 @@ dependencies = [ [[package]] name = "windmill-parser-csharp" -version = "1.481.0" +version = "1.482.0" dependencies = [ "anyhow", "serde_json", @@ -14253,7 +14254,7 @@ dependencies = [ [[package]] name = "windmill-parser-go" -version = "1.481.0" +version = "1.482.0" dependencies = [ "anyhow", "gosyn", @@ -14265,7 +14266,7 @@ dependencies = [ [[package]] name = "windmill-parser-graphql" -version = "1.481.0" +version = "1.482.0" dependencies = [ "anyhow", "lazy_static", @@ -14277,7 +14278,7 @@ dependencies = [ [[package]] name = "windmill-parser-java" -version = "1.481.0" +version = "1.482.0" dependencies = [ "anyhow", "serde_json", @@ -14289,7 +14290,7 @@ dependencies = [ [[package]] name = "windmill-parser-nu" -version = "1.481.0" +version = "1.482.0" dependencies = [ "anyhow", "nu-parser", @@ -14300,7 +14301,7 @@ dependencies = [ [[package]] name = "windmill-parser-php" -version = "1.481.0" +version = "1.482.0" dependencies = [ "anyhow", "itertools 0.14.0", @@ -14311,7 +14312,7 @@ dependencies = [ [[package]] name = "windmill-parser-py" -version = "1.481.0" +version = "1.482.0" dependencies = [ "anyhow", "itertools 0.14.0", @@ -14322,7 +14323,7 @@ dependencies = [ [[package]] name = "windmill-parser-py-imports" -version = "1.481.0" +version = "1.482.0" dependencies = [ "anyhow", "async-recursion", @@ -14342,7 +14343,7 @@ dependencies = [ [[package]] name = "windmill-parser-rust" -version = "1.481.0" +version = "1.482.0" dependencies = [ "anyhow", "convert_case 0.6.0", @@ -14359,7 +14360,7 @@ dependencies = [ [[package]] name = "windmill-parser-sql" -version = "1.481.0" +version = "1.482.0" dependencies = [ "anyhow", "lazy_static", @@ -14371,7 +14372,7 @@ dependencies = [ [[package]] name = "windmill-parser-ts" -version = "1.481.0" +version = "1.482.0" dependencies = [ "anyhow", "lazy_static", @@ -14389,7 +14390,7 @@ dependencies = [ [[package]] name = "windmill-parser-wasm" -version = "1.481.0" +version = "1.482.0" dependencies = [ "anyhow", "getrandom 0.2.15", @@ -14413,7 +14414,7 @@ dependencies = [ [[package]] name = "windmill-parser-yaml" -version = "1.481.0" +version = "1.482.0" dependencies = [ "anyhow", "serde_json", @@ -14423,7 +14424,7 @@ dependencies = [ [[package]] name = "windmill-queue" -version = "1.481.0" +version = "1.482.0" dependencies = [ "anyhow", "async-recursion", @@ -14456,7 +14457,7 @@ dependencies = [ [[package]] name = "windmill-sql-datatype-parser-wasm" -version = "1.481.0" +version = "1.482.0" dependencies = [ "wasm-bindgen", "wasm-bindgen-test", @@ -14466,7 +14467,7 @@ dependencies = [ [[package]] name = "windmill-worker" -version = "1.481.0" +version = "1.482.0" dependencies = [ "anyhow", "async-recursion", @@ -14554,16 +14555,6 @@ dependencies = [ "yaml-rust", ] -[[package]] -name = "windows" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" -dependencies = [ - "windows-core 0.52.0", - "windows-targets 0.52.6", -] - [[package]] name = "windows" version = "0.56.0" @@ -14594,15 +14585,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "windows-core" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" -dependencies = [ - "windows-targets 0.52.6", -] - [[package]] name = "windows-core" version = "0.56.0" @@ -15045,9 +15027,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.7.4" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e97b544156e9bebe1a0ffbc03484fc1ffe3100cbce3ffb17eac35f7cdd7ab36" +checksum = "63d3fcd9bba44b03821e7d699eeee959f3126dcc4aa8e4ae18ec617c2a5cea10" dependencies = [ "memchr", ] @@ -15145,9 +15127,9 @@ dependencies = [ [[package]] name = "xml-rs" -version = "0.8.25" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5b940ebc25896e71dd073bad2dbaa2abfe97b0a391415e22ad1326d9c54e3c4" +checksum = "a62ce76d9b56901b19a74f19431b0d8b3bc7ca4ad685a746dfd78ca8f4fc6bda" [[package]] name = "xmlparser" diff --git a/backend/Cargo.toml b/backend/Cargo.toml index ed4155f495..8e718debba 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "windmill" -version = "1.481.0" +version = "1.482.0" authors.workspace = true edition.workspace = true @@ -32,7 +32,7 @@ members = [ ] [workspace.package] -version = "1.481.0" +version = "1.482.0" authors = ["Ruben Fiszel "] edition = "2021" diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index 5ed6537931..55eea24d23 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.481.0 + version: 1.482.0 title: Windmill API contact: @@ -6623,7 +6623,7 @@ paths: type: object additionalProperties: $ref: "#/components/schemas/InputTransform" - use_latest_version: boolean + use_latest_version: 1.482.0 flow_options_by_path: type: object additionalProperties: @@ -6633,7 +6633,7 @@ paths: type: object additionalProperties: $ref: "#/components/schemas/InputTransform" - use_latest_version: boolean + use_latest_version: 1.482.0 responses: "201": description: stream of created job uuids separated by \n. Lines may start with 'Error:' diff --git a/benchmarks/lib.ts b/benchmarks/lib.ts index a4fc35045b..3f4a8ed24e 100644 --- a/benchmarks/lib.ts +++ b/benchmarks/lib.ts @@ -2,7 +2,7 @@ import { sleep } from "https://deno.land/x/sleep@v1.2.1/mod.ts"; import * as windmill from "https://deno.land/x/windmill@v1.174.0/mod.ts"; import * as api from "https://deno.land/x/windmill@v1.174.0/windmill-api/index.ts"; -export const VERSION = "v1.481.0"; +export const VERSION = "v1.482.0"; export async function login(email: string, password: string): Promise { return await windmill.UserService.login({ diff --git a/cli/main.ts b/cli/main.ts index 92131ce63b..84e30a4bdb 100644 --- a/cli/main.ts +++ b/cli/main.ts @@ -63,7 +63,7 @@ export { // } // }); -export const VERSION = "1.481.0"; +export const VERSION = "1.482.0"; const command = new Command() .name("wmill") diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 207f5b22f5..69cfe8c20a 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "windmill-components", - "version": "1.481.0", + "version": "1.482.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "windmill-components", - "version": "1.481.0", + "version": "1.482.0", "license": "AGPL-3.0", "dependencies": { "@aws-crypto/sha256-js": "^4.0.0", diff --git a/frontend/package.json b/frontend/package.json index 5d0e13fe3f..e37e03865a 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "windmill-components", - "version": "1.481.0", + "version": "1.482.0", "scripts": { "dev": "vite dev", "build": "vite build", diff --git a/lsp/Pipfile b/lsp/Pipfile index 4128f31f60..45e4c17df2 100644 --- a/lsp/Pipfile +++ b/lsp/Pipfile @@ -4,8 +4,8 @@ verify_ssl = true name = "pypi" [packages] -wmill = ">=1.481.0" -wmill_pg = ">=1.481.0" +wmill = ">=1.482.0" +wmill_pg = ">=1.482.0" sendgrid = "*" mysql-connector-python = "*" pymongo = "*" diff --git a/openflow.openapi.yaml b/openflow.openapi.yaml index de1b475a94..6724dce66b 100644 --- a/openflow.openapi.yaml +++ b/openflow.openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.481.0 + version: 1.482.0 title: OpenFlow Spec contact: name: Ruben Fiszel diff --git a/powershell-client/WindmillClient/WindmillClient.psd1 b/powershell-client/WindmillClient/WindmillClient.psd1 index 7a205b98f7..220bbd7a30 100644 --- a/powershell-client/WindmillClient/WindmillClient.psd1 +++ b/powershell-client/WindmillClient/WindmillClient.psd1 @@ -12,7 +12,7 @@ RootModule = 'WindmillClient.psm1' # Version number of this module. - ModuleVersion = '1.481.0' + ModuleVersion = '1.482.0' # Supported PSEditions # CompatiblePSEditions = @() diff --git a/python-client/wmill/pyproject.toml b/python-client/wmill/pyproject.toml index aa01391777..0d460bfc45 100644 --- a/python-client/wmill/pyproject.toml +++ b/python-client/wmill/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "wmill" -version = "1.481.0" +version = "1.482.0" description = "A client library for accessing Windmill server wrapping the Windmill client API" license = "Apache-2.0" homepage = "https://windmill.dev" diff --git a/python-client/wmill_pg/pyproject.toml b/python-client/wmill_pg/pyproject.toml index 60c0cbd728..24aff1ad80 100644 --- a/python-client/wmill_pg/pyproject.toml +++ b/python-client/wmill_pg/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "wmill-pg" -version = "1.481.0" +version = "1.482.0" description = "An extension client for the wmill client library focused on pg" license = "Apache-2.0" homepage = "https://windmill.dev" diff --git a/typescript-client/jsr.json b/typescript-client/jsr.json index e37ca23e7f..6ad1b20d4f 100644 --- a/typescript-client/jsr.json +++ b/typescript-client/jsr.json @@ -1,6 +1,6 @@ { "name": "@windmill/windmill", - "version": "1.481.0", + "version": "1.482.0", "exports": "./src/index.ts", "publish": { "exclude": ["!src", "./s3Types.ts", "./client.ts"] diff --git a/typescript-client/package.json b/typescript-client/package.json index 14be6fa471..5970770b2b 100644 --- a/typescript-client/package.json +++ b/typescript-client/package.json @@ -1,7 +1,7 @@ { "name": "windmill-client", "description": "Windmill SDK client for browsers and Node.js", - "version": "1.481.0", + "version": "1.482.0", "author": "Ruben Fiszel", "license": "Apache 2.0", "devDependencies": { diff --git a/version.txt b/version.txt index 11ccffe4f9..5645e944ef 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.481.0 +1.482.0 From 24e893b8c50fafdb41f4b6e1777cb34aceafc466 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Wed, 16 Apr 2025 00:44:49 +0000 Subject: [PATCH 222/739] fix: flow editor workspace script test use actual workspace script hash --- backend/windmill-api/openapi.yaml | 2 ++ backend/windmill-api/src/jobs.rs | 8 ++++-- backend/windmill-worker/src/worker.rs | 26 ++++++++++++------- .../src/lib/components/ModulePreview.svelte | 4 ++- .../src/lib/components/TestJobLoader.svelte | 3 ++- 5 files changed, 29 insertions(+), 14 deletions(-) diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index 55eea24d23..2fd46fea08 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -14048,6 +14048,8 @@ components: type: string path: type: string + script_hash: + type: string args: $ref: "#/components/schemas/ScriptArgs" language: diff --git a/backend/windmill-api/src/jobs.rs b/backend/windmill-api/src/jobs.rs index be015f5929..1e5758d646 100644 --- a/backend/windmill-api/src/jobs.rs +++ b/backend/windmill-api/src/jobs.rs @@ -3095,16 +3095,17 @@ struct CancelJob { enum PreviewKind { Code, Identity, - Http, Noop, Bundle, Tarbundle, + ScriptHash, } #[derive(Deserialize)] struct Preview { content: Option, kind: Option, + script_hash: Option, path: Option, args: Option>>, language: Option, @@ -4851,7 +4852,10 @@ async fn run_preview_script( Some(PreviewKind::Identity) => JobPayload::Identity, Some(PreviewKind::Noop) => JobPayload::Noop, _ => JobPayload::Code(RawCode { - hash: None, + hash: preview + .script_hash + .as_ref() + .and_then(|s| windmill_common::scripts::to_i64(s).ok()), content: preview.content.unwrap_or_default(), path: preview.path, language: preview.language.unwrap_or(ScriptLang::Deno), diff --git a/backend/windmill-worker/src/worker.rs b/backend/windmill-worker/src/worker.rs index b92a3bc560..e8eff2f1cd 100644 --- a/backend/windmill-worker/src/worker.rs +++ b/backend/windmill-worker/src/worker.rs @@ -2456,16 +2456,22 @@ async fn handle_code_execution_job( _ => None, }; - arc_data = - preview.ok_or_else(|| Error::internal_err("expected preview".to_string()))?; - metadata = ScriptMetadata { - language: job.script_lang, - codebase, - envs: None, - schema: None, - schema_validator: None, - }; - (arc_data.as_ref(), &metadata) + if codebase.is_none() && job.runnable_id.is_some() { + (arc_data, arc_metadata) = + cache::script::fetch(conn, job.runnable_id.unwrap()).await?; + (arc_data.as_ref(), arc_metadata.as_ref()) + } else { + arc_data = + preview.ok_or_else(|| Error::internal_err("expected preview".to_string()))?; + metadata = ScriptMetadata { + language: job.script_lang, + codebase, + envs: None, + schema: None, + schema_validator: None, + }; + (arc_data.as_ref(), &metadata) + } } JobKind::Script_Hub => { let ContentReqLangEnvs { content, lockfile, language, envs, codebase, schema } = diff --git a/frontend/src/lib/components/ModulePreview.svelte b/frontend/src/lib/components/ModulePreview.svelte index d58a48e316..4d6c433bd8 100644 --- a/frontend/src/lib/components/ModulePreview.svelte +++ b/frontend/src/lib/components/ModulePreview.svelte @@ -68,7 +68,9 @@ script.content, script.language, args, - $flowStore?.tag ?? (val.tag_override ? val.tag_override : script.tag) + $flowStore?.tag ?? (val.tag_override ? val.tag_override : script.tag), + script.lock, + val.hash ) } else if (val.type == 'flow') { await testJobLoader?.abstractRun(() => diff --git a/frontend/src/lib/components/TestJobLoader.svelte b/frontend/src/lib/components/TestJobLoader.svelte index e16ea23dc3..a7f911aff7 100644 --- a/frontend/src/lib/components/TestJobLoader.svelte +++ b/frontend/src/lib/components/TestJobLoader.svelte @@ -126,7 +126,8 @@ lang: SupportedLanguage | undefined, args: Record, tag: string | undefined, - lock?: string + lock?: string, + hash?: string ): Promise { // Reset in case we rerun job without reloading scriptProgress = undefined From cb8731e7e37fb6cd052f5dae6fdce46e6ca2409c Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Wed, 16 Apr 2025 08:54:20 +0000 Subject: [PATCH 223/739] fix(openapi): fix openapi def of batch re-run jobs --- backend/windmill-api/openapi.yaml | 6 +- cli/.gitignore | 1 + cli/gen/core/ApiError.ts | 21 - cli/gen/core/ApiRequestOptions.ts | 21 - cli/gen/core/ApiResult.ts | 7 - cli/gen/core/CancelablePromise.ts | 126 - cli/gen/core/OpenAPI.ts | 63 - cli/gen/core/request.ts | 350 -- cli/gen/index.ts | 6 - cli/gen/services.gen.ts | 8995 ----------------------------- cli/gen/types.gen.ts | 7828 ------------------------- 11 files changed, 5 insertions(+), 17419 deletions(-) delete mode 100644 cli/gen/core/ApiError.ts delete mode 100644 cli/gen/core/ApiRequestOptions.ts delete mode 100644 cli/gen/core/ApiResult.ts delete mode 100644 cli/gen/core/CancelablePromise.ts delete mode 100644 cli/gen/core/OpenAPI.ts delete mode 100644 cli/gen/core/request.ts delete mode 100644 cli/gen/index.ts delete mode 100644 cli/gen/services.gen.ts delete mode 100644 cli/gen/types.gen.ts diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index 2fd46fea08..5f677f5f58 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -6623,7 +6623,8 @@ paths: type: object additionalProperties: $ref: "#/components/schemas/InputTransform" - use_latest_version: 1.482.0 + use_latest_version: + type: boolean flow_options_by_path: type: object additionalProperties: @@ -6633,7 +6634,8 @@ paths: type: object additionalProperties: $ref: "#/components/schemas/InputTransform" - use_latest_version: 1.482.0 + use_latest_version: + type: boolean responses: "201": description: stream of created job uuids separated by \n. Lines may start with 'Error:' diff --git a/cli/.gitignore b/cli/.gitignore index 409ee189ef..d0b1f2c514 100644 --- a/cli/.gitignore +++ b/cli/.gitignore @@ -1 +1,2 @@ npm/ +gen/ \ No newline at end of file diff --git a/cli/gen/core/ApiError.ts b/cli/gen/core/ApiError.ts deleted file mode 100644 index 81aa78a668..0000000000 --- a/cli/gen/core/ApiError.ts +++ /dev/null @@ -1,21 +0,0 @@ -import type { ApiRequestOptions } from './ApiRequestOptions.ts'; -import type { ApiResult } from './ApiResult.ts'; - -export class ApiError extends Error { - public readonly url: string; - public readonly status: number; - public readonly statusText: string; - public readonly body: unknown; - public readonly request: ApiRequestOptions; - - constructor(request: ApiRequestOptions, response: ApiResult, message: string) { - super(message); - - this.name = 'ApiError'; - this.url = response.url; - this.status = response.status; - this.statusText = response.statusText; - this.body = response.body; - this.request = request; - } -} \ No newline at end of file diff --git a/cli/gen/core/ApiRequestOptions.ts b/cli/gen/core/ApiRequestOptions.ts deleted file mode 100644 index 939a0aa4c8..0000000000 --- a/cli/gen/core/ApiRequestOptions.ts +++ /dev/null @@ -1,21 +0,0 @@ -export type ApiRequestOptions = { - readonly body?: any; - readonly cookies?: Record; - readonly errors?: Record; - readonly formData?: Record | any[] | Blob | File; - readonly headers?: Record; - readonly mediaType?: string; - readonly method: - | 'DELETE' - | 'GET' - | 'HEAD' - | 'OPTIONS' - | 'PATCH' - | 'POST' - | 'PUT'; - readonly path?: Record; - readonly query?: Record; - readonly responseHeader?: string; - readonly responseTransformer?: (data: unknown) => Promise; - readonly url: string; -}; \ No newline at end of file diff --git a/cli/gen/core/ApiResult.ts b/cli/gen/core/ApiResult.ts deleted file mode 100644 index 4c58e39138..0000000000 --- a/cli/gen/core/ApiResult.ts +++ /dev/null @@ -1,7 +0,0 @@ -export type ApiResult = { - readonly body: TData; - readonly ok: boolean; - readonly status: number; - readonly statusText: string; - readonly url: string; -}; \ No newline at end of file diff --git a/cli/gen/core/CancelablePromise.ts b/cli/gen/core/CancelablePromise.ts deleted file mode 100644 index ccc082e8f2..0000000000 --- a/cli/gen/core/CancelablePromise.ts +++ /dev/null @@ -1,126 +0,0 @@ -export class CancelError extends Error { - constructor(message: string) { - super(message); - this.name = 'CancelError'; - } - - public get isCancelled(): boolean { - return true; - } -} - -export interface OnCancel { - readonly isResolved: boolean; - readonly isRejected: boolean; - readonly isCancelled: boolean; - - (cancelHandler: () => void): void; -} - -export class CancelablePromise implements Promise { - private _isResolved: boolean; - private _isRejected: boolean; - private _isCancelled: boolean; - readonly cancelHandlers: (() => void)[]; - readonly promise: Promise; - private _resolve?: (value: T | PromiseLike) => void; - private _reject?: (reason?: unknown) => void; - - constructor( - executor: ( - resolve: (value: T | PromiseLike) => void, - reject: (reason?: unknown) => void, - onCancel: OnCancel - ) => void - ) { - this._isResolved = false; - this._isRejected = false; - this._isCancelled = false; - this.cancelHandlers = []; - this.promise = new Promise((resolve, reject) => { - this._resolve = resolve; - this._reject = reject; - - const onResolve = (value: T | PromiseLike): void => { - if (this._isResolved || this._isRejected || this._isCancelled) { - return; - } - this._isResolved = true; - if (this._resolve) this._resolve(value); - }; - - const onReject = (reason?: unknown): void => { - if (this._isResolved || this._isRejected || this._isCancelled) { - return; - } - this._isRejected = true; - if (this._reject) this._reject(reason); - }; - - const onCancel = (cancelHandler: () => void): void => { - if (this._isResolved || this._isRejected || this._isCancelled) { - return; - } - this.cancelHandlers.push(cancelHandler); - }; - - Object.defineProperty(onCancel, 'isResolved', { - get: (): boolean => this._isResolved, - }); - - Object.defineProperty(onCancel, 'isRejected', { - get: (): boolean => this._isRejected, - }); - - Object.defineProperty(onCancel, 'isCancelled', { - get: (): boolean => this._isCancelled, - }); - - return executor(onResolve, onReject, onCancel as OnCancel); - }); - } - - get [Symbol.toStringTag]() { - return "Cancellable Promise"; - } - - public then( - onFulfilled?: ((value: T) => TResult1 | PromiseLike) | null, - onRejected?: ((reason: unknown) => TResult2 | PromiseLike) | null - ): Promise { - return this.promise.then(onFulfilled, onRejected); - } - - public catch( - onRejected?: ((reason: unknown) => TResult | PromiseLike) | null - ): Promise { - return this.promise.catch(onRejected); - } - - public finally(onFinally?: (() => void) | null): Promise { - return this.promise.finally(onFinally); - } - - public cancel(): void { - if (this._isResolved || this._isRejected || this._isCancelled) { - return; - } - this._isCancelled = true; - if (this.cancelHandlers.length) { - try { - for (const cancelHandler of this.cancelHandlers) { - cancelHandler(); - } - } catch (error) { - console.warn('Cancellation threw an error', error); - return; - } - } - this.cancelHandlers.length = 0; - if (this._reject) this._reject(new CancelError('Request aborted')); - } - - public get isCancelled(): boolean { - return this._isCancelled; - } -} \ No newline at end of file diff --git a/cli/gen/core/OpenAPI.ts b/cli/gen/core/OpenAPI.ts deleted file mode 100644 index 2938820ca7..0000000000 --- a/cli/gen/core/OpenAPI.ts +++ /dev/null @@ -1,63 +0,0 @@ -const getEnv = (key: string) => { - return Deno.env.get(key) -}; - -const baseUrl = getEnv("BASE_INTERNAL_URL") ?? getEnv("BASE_URL") ?? "http://localhost:8000"; -const baseUrlApi = (baseUrl ?? '') + "/api"; - -import type { ApiRequestOptions } from './ApiRequestOptions.ts'; - -type Headers = Record; -type Middleware = (value: T) => T | Promise; -type Resolver = (options: ApiRequestOptions) => Promise; - -export class Interceptors { - _fns: Middleware[]; - - constructor() { - this._fns = []; - } - - eject(fn: Middleware): void { - const index = this._fns.indexOf(fn); - if (index !== -1) { - this._fns = [...this._fns.slice(0, index), ...this._fns.slice(index + 1)]; - } - } - - use(fn: Middleware): void { - this._fns = [...this._fns, fn]; - } -} - -export type OpenAPIConfig = { - BASE: string; - CREDENTIALS: 'include' | 'omit' | 'same-origin'; - ENCODE_PATH?: ((path: string) => string) | undefined; - HEADERS?: Headers | Resolver | undefined; - PASSWORD?: string | Resolver | undefined; - TOKEN?: string | Resolver | undefined; - USERNAME?: string | Resolver | undefined; - VERSION: string; - WITH_CREDENTIALS: boolean; - interceptors: { - request: Interceptors; - response: Interceptors; - }; -}; - -export const OpenAPI: OpenAPIConfig = { - BASE: baseUrlApi, - CREDENTIALS: 'include', - ENCODE_PATH: undefined, - HEADERS: undefined, - PASSWORD: undefined, - TOKEN: getEnv("WM_TOKEN"), - USERNAME: undefined, - VERSION: '1.481.0', - WITH_CREDENTIALS: true, - interceptors: { - request: new Interceptors(), - response: new Interceptors(), - }, -}; \ No newline at end of file diff --git a/cli/gen/core/request.ts b/cli/gen/core/request.ts deleted file mode 100644 index ed11eb4482..0000000000 --- a/cli/gen/core/request.ts +++ /dev/null @@ -1,350 +0,0 @@ -import { ApiError } from './ApiError.ts'; -import type { ApiRequestOptions } from './ApiRequestOptions.ts'; -import type { ApiResult } from './ApiResult.ts'; -import { CancelablePromise } from './CancelablePromise.ts'; -import type { OnCancel } from './CancelablePromise.ts'; -import type { OpenAPIConfig } from './OpenAPI.ts'; - -export const isString = (value: unknown): value is string => { - return typeof value === 'string'; -}; - -export const isStringWithValue = (value: unknown): value is string => { - return isString(value) && value !== ''; -}; - -export const isBlob = (value: any): value is Blob => { - return value instanceof Blob; -}; - -export const isFormData = (value: unknown): value is FormData => { - return value instanceof FormData; -}; - -export const base64 = (str: string): string => { - try { - return btoa(str); - } catch (err) { - // @ts-ignore - return Buffer.from(str).toString('base64'); - } -}; - -export const getQueryString = (params: Record): string => { - const qs: string[] = []; - - const append = (key: string, value: unknown) => { - qs.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`); - }; - - const encodePair = (key: string, value: unknown) => { - if (value === undefined || value === null) { - return; - } - - if (value instanceof Date) { - append(key, value.toISOString()); - } else if (Array.isArray(value)) { - value.forEach(v => encodePair(key, v)); - } else if (typeof value === 'object') { - Object.entries(value).forEach(([k, v]) => encodePair(`${key}[${k}]`, v)); - } else { - append(key, value); - } - }; - - Object.entries(params).forEach(([key, value]) => encodePair(key, value)); - - return qs.length ? `?${qs.join('&')}` : ''; -}; - -const getUrl = (config: OpenAPIConfig, options: ApiRequestOptions): string => { - const encoder = config.ENCODE_PATH || encodeURI; - - const path = options.url - .replace('{api-version}', config.VERSION) - .replace(/{(.*?)}/g, (substring: string, group: string) => { - if (options.path?.hasOwnProperty(group)) { - return encoder(String(options.path[group])); - } - return substring; - }); - - const url = config.BASE + path; - return options.query ? url + getQueryString(options.query) : url; -}; - -export const getFormData = (options: ApiRequestOptions): FormData | undefined => { - if (options.formData) { - const formData = new FormData(); - - const process = (key: string, value: unknown) => { - if (isString(value) || isBlob(value)) { - formData.append(key, value); - } else { - formData.append(key, JSON.stringify(value)); - } - }; - - Object.entries(options.formData) - .filter(([, value]) => value !== undefined && value !== null) - .forEach(([key, value]) => { - if (Array.isArray(value)) { - value.forEach(v => process(key, v)); - } else { - process(key, value); - } - }); - - return formData; - } - return undefined; -}; - -type Resolver = (options: ApiRequestOptions) => Promise; - -export const resolve = async (options: ApiRequestOptions, resolver?: T | Resolver): Promise => { - if (typeof resolver === 'function') { - return (resolver as Resolver)(options); - } - return resolver; -}; - -export const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptions): Promise => { - const [token, username, password, additionalHeaders] = await Promise.all([ - // @ts-ignore - resolve(options, config.TOKEN), - // @ts-ignore - resolve(options, config.USERNAME), - // @ts-ignore - resolve(options, config.PASSWORD), - // @ts-ignore - resolve(options, config.HEADERS), - ]); - - const headers = Object.entries({ - Accept: 'application/json', - ...additionalHeaders, - ...options.headers, - }) - .filter(([, value]) => value !== undefined && value !== null) - .reduce((headers, [key, value]) => ({ - ...headers, - [key]: String(value), - }), {} as Record); - - if (isStringWithValue(token)) { - headers['Authorization'] = `Bearer ${token}`; - } - - if (isStringWithValue(username) && isStringWithValue(password)) { - const credentials = base64(`${username}:${password}`); - headers['Authorization'] = `Basic ${credentials}`; - } - - if (options.body !== undefined) { - if (options.mediaType) { - headers['Content-Type'] = options.mediaType; - } else if (isBlob(options.body)) { - headers['Content-Type'] = options.body.type || 'application/octet-stream'; - } else if (isString(options.body)) { - headers['Content-Type'] = 'text/plain'; - } else if (!isFormData(options.body)) { - headers['Content-Type'] = 'application/json'; - } - } - - return new Headers(headers); -}; - -export const getRequestBody = (options: ApiRequestOptions): unknown => { - if (options.body !== undefined) { - if (options.mediaType?.includes('application/json') || options.mediaType?.includes('+json')) { - return JSON.stringify(options.body); - } else if (isString(options.body) || isBlob(options.body) || isFormData(options.body)) { - return options.body; - } else { - return JSON.stringify(options.body); - } - } - return undefined; -}; - -export const sendRequest = async ( - config: OpenAPIConfig, - options: ApiRequestOptions, - url: string, - body: any, - formData: FormData | undefined, - headers: Headers, - onCancel: OnCancel -): Promise => { - const controller = new AbortController(); - - let request: RequestInit = { - headers, - body: body ?? formData, - method: options.method, - signal: controller.signal, - }; - - if (config.WITH_CREDENTIALS) { - request.credentials = config.CREDENTIALS; - } - - for (const fn of config.interceptors.request._fns) { - request = await fn(request); - } - - onCancel(() => controller.abort()); - - return await fetch(url, request); -}; - -export const getResponseHeader = (response: Response, responseHeader?: string): string | undefined => { - if (responseHeader) { - const content = response.headers.get(responseHeader); - if (isString(content)) { - return content; - } - } - return undefined; -}; - -export const getResponseBody = async (response: Response): Promise => { - if (response.status !== 204) { - try { - const contentType = response.headers.get('Content-Type'); - if (contentType) { - const binaryTypes = ['application/octet-stream', 'application/pdf', 'application/zip', 'audio/', 'image/', 'video/']; - if (contentType.includes('application/json') || contentType.includes('+json')) { - return await response.json(); - } else if (binaryTypes.some(type => contentType.includes(type))) { - return await response.blob(); - } else if (contentType.includes('multipart/form-data')) { - return await response.formData(); - } else if (contentType.includes('text/')) { - return await response.text(); - } - } - } catch (error) { - console.error(error); - } - } - return undefined; -}; - -export const catchErrorCodes = (options: ApiRequestOptions, result: ApiResult): void => { - const errors: Record = { - 400: 'Bad Request', - 401: 'Unauthorized', - 402: 'Payment Required', - 403: 'Forbidden', - 404: 'Not Found', - 405: 'Method Not Allowed', - 406: 'Not Acceptable', - 407: 'Proxy Authentication Required', - 408: 'Request Timeout', - 409: 'Conflict', - 410: 'Gone', - 411: 'Length Required', - 412: 'Precondition Failed', - 413: 'Payload Too Large', - 414: 'URI Too Long', - 415: 'Unsupported Media Type', - 416: 'Range Not Satisfiable', - 417: 'Expectation Failed', - 418: 'Im a teapot', - 421: 'Misdirected Request', - 422: 'Unprocessable Content', - 423: 'Locked', - 424: 'Failed Dependency', - 425: 'Too Early', - 426: 'Upgrade Required', - 428: 'Precondition Required', - 429: 'Too Many Requests', - 431: 'Request Header Fields Too Large', - 451: 'Unavailable For Legal Reasons', - 500: 'Internal Server Error', - 501: 'Not Implemented', - 502: 'Bad Gateway', - 503: 'Service Unavailable', - 504: 'Gateway Timeout', - 505: 'HTTP Version Not Supported', - 506: 'Variant Also Negotiates', - 507: 'Insufficient Storage', - 508: 'Loop Detected', - 510: 'Not Extended', - 511: 'Network Authentication Required', - ...options.errors, - } - - const error = errors[result.status]; - if (error) { - throw new ApiError(options, result, error); - } - - if (!result.ok) { - const errorStatus = result.status ?? 'unknown'; - const errorStatusText = result.statusText ?? 'unknown'; - const errorBody = (() => { - try { - return JSON.stringify(result.body, null, 2); - } catch (e) { - return undefined; - } - })(); - - throw new ApiError(options, result, - `Generic Error: status: ${errorStatus}; status text: ${errorStatusText}; body: ${errorBody}` - ); - } -}; - -/** - * Request method - * @param config The OpenAPI configuration object - * @param options The request options from the service - * @returns CancelablePromise - * @throws ApiError - */ -export const request = (config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise => { - return new CancelablePromise(async (resolve, reject, onCancel) => { - try { - const url = getUrl(config, options); - const formData = getFormData(options); - const body = getRequestBody(options); - const headers = await getHeaders(config, options); - - if (!onCancel.isCancelled) { - let response = await sendRequest(config, options, url, body, formData, headers, onCancel); - - for (const fn of config.interceptors.response._fns) { - response = await fn(response); - } - - const responseBody = await getResponseBody(response); - const responseHeader = getResponseHeader(response, options.responseHeader); - - let transformedBody = responseBody; - if (options.responseTransformer && response.ok) { - transformedBody = await options.responseTransformer(responseBody) - } - - const result: ApiResult = { - url, - ok: response.ok, - status: response.status, - statusText: response.statusText, - body: responseHeader ?? transformedBody, - }; - - catchErrorCodes(options, result); - - resolve(result.body); - } - } catch (error) { - reject(error); - } - }); -}; \ No newline at end of file diff --git a/cli/gen/index.ts b/cli/gen/index.ts deleted file mode 100644 index 77b08aeebb..0000000000 --- a/cli/gen/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -// This file is auto-generated by @hey-api/openapi-ts -export { ApiError } from './core/ApiError.ts'; -export { CancelablePromise, CancelError } from './core/CancelablePromise.ts'; -export { OpenAPI, type OpenAPIConfig } from './core/OpenAPI.ts'; -export * from './services.gen.ts'; -export * from './types.gen.ts'; \ No newline at end of file diff --git a/cli/gen/services.gen.ts b/cli/gen/services.gen.ts deleted file mode 100644 index a94a3a544d..0000000000 --- a/cli/gen/services.gen.ts +++ /dev/null @@ -1,8995 +0,0 @@ -// This file is auto-generated by @hey-api/openapi-ts - -import type { CancelablePromise } from './core/CancelablePromise.ts'; -import { OpenAPI } from './core/OpenAPI.ts'; -import { request as __request } from './core/request.ts'; -import type { BackendVersionResponse, BackendUptodateResponse, GetLicenseIdResponse, GetOpenApiYamlResponse, GetAuditLogData, GetAuditLogResponse, ListAuditLogsData, ListAuditLogsResponse, LoginData, LoginResponse, LogoutResponse, GetUserData, GetUserResponse, UpdateUserData, UpdateUserResponse, IsOwnerOfPathData, IsOwnerOfPathResponse, SetPasswordData, SetPasswordResponse, SetPasswordForUserData, SetPasswordForUserResponse, SetLoginTypeForUserData, SetLoginTypeForUserResponse, CreateUserGloballyData, CreateUserGloballyResponse, GlobalUserUpdateData, GlobalUserUpdateResponse, GlobalUsernameInfoData, GlobalUsernameInfoResponse, GlobalUserRenameData, GlobalUserRenameResponse, GlobalUserDeleteData, GlobalUserDeleteResponse, GlobalUsersOverwriteData, GlobalUsersOverwriteResponse, GlobalUsersExportResponse, DeleteUserData, DeleteUserResponse, GetGlobalConnectedRepositoriesResponse, ListWorkspacesResponse, IsDomainAllowedResponse, ListUserWorkspacesResponse, ListWorkspacesAsSuperAdminData, ListWorkspacesAsSuperAdminResponse, CreateWorkspaceData, CreateWorkspaceResponse, ExistsWorkspaceData, ExistsWorkspaceResponse, ExistsUsernameData, ExistsUsernameResponse, GetGlobalData, GetGlobalResponse, SetGlobalData, SetGlobalResponse, GetLocalResponse, TestSmtpData, TestSmtpResponse, TestCriticalChannelsData, TestCriticalChannelsResponse, GetCriticalAlertsData, GetCriticalAlertsResponse, AcknowledgeCriticalAlertData, AcknowledgeCriticalAlertResponse, AcknowledgeAllCriticalAlertsResponse, TestLicenseKeyData, TestLicenseKeyResponse, TestObjectStorageConfigData, TestObjectStorageConfigResponse, SendStatsResponse, GetLatestKeyRenewalAttemptResponse, RenewLicenseKeyData, RenewLicenseKeyResponse, CreateCustomerPortalSessionData, CreateCustomerPortalSessionResponse, TestMetadataData, TestMetadataResponse, ListGlobalSettingsResponse, GetCurrentEmailResponse, RefreshUserTokenData, RefreshUserTokenResponse, GetTutorialProgressResponse, UpdateTutorialProgressData, UpdateTutorialProgressResponse, LeaveInstanceResponse, GetUsageResponse, GetRunnableResponse, GlobalWhoamiResponse, ListWorkspaceInvitesResponse, WhoamiData, WhoamiResponse, GetGithubAppTokenData, GetGithubAppTokenResponse, InstallFromWorkspaceData, InstallFromWorkspaceResponse, DeleteFromWorkspaceData, DeleteFromWorkspaceResponse, ExportInstallationData, ExportInstallationResponse, ImportInstallationData, ImportInstallationResponse, AcceptInviteData, AcceptInviteResponse, DeclineInviteData, DeclineInviteResponse, InviteUserData, InviteUserResponse, AddUserData, AddUserResponse, DeleteInviteData, DeleteInviteResponse, ArchiveWorkspaceData, ArchiveWorkspaceResponse, UnarchiveWorkspaceData, UnarchiveWorkspaceResponse, DeleteWorkspaceData, DeleteWorkspaceResponse, LeaveWorkspaceData, LeaveWorkspaceResponse, GetWorkspaceNameData, GetWorkspaceNameResponse, ChangeWorkspaceNameData, ChangeWorkspaceNameResponse, ChangeWorkspaceIdData, ChangeWorkspaceIdResponse, ChangeWorkspaceColorData, ChangeWorkspaceColorResponse, WhoisData, WhoisResponse, UpdateOperatorSettingsData, UpdateOperatorSettingsResponse, ExistsEmailData, ExistsEmailResponse, ListUsersAsSuperAdminData, ListUsersAsSuperAdminResponse, ListPendingInvitesData, ListPendingInvitesResponse, GetSettingsData, GetSettingsResponse, GetDeployToData, GetDeployToResponse, GetIsPremiumData, GetIsPremiumResponse, GetPremiumInfoData, GetPremiumInfoResponse, GetThresholdAlertData, GetThresholdAlertResponse, SetThresholdAlertData, SetThresholdAlertResponse, EditSlackCommandData, EditSlackCommandResponse, EditTeamsCommandData, EditTeamsCommandResponse, ListAvailableTeamsIdsData, ListAvailableTeamsIdsResponse, ListAvailableTeamsChannelsData, ListAvailableTeamsChannelsResponse, ConnectTeamsData, ConnectTeamsResponse, RunSlackMessageTestJobData, RunSlackMessageTestJobResponse, RunTeamsMessageTestJobData, RunTeamsMessageTestJobResponse, EditDeployToData, EditDeployToResponse, EditAutoInviteData, EditAutoInviteResponse, EditWebhookData, EditWebhookResponse, EditCopilotConfigData, EditCopilotConfigResponse, GetCopilotInfoData, GetCopilotInfoResponse, EditErrorHandlerData, EditErrorHandlerResponse, EditLargeFileStorageConfigData, EditLargeFileStorageConfigResponse, EditWorkspaceGitSyncConfigData, EditWorkspaceGitSyncConfigResponse, EditWorkspaceDeployUiSettingsData, EditWorkspaceDeployUiSettingsResponse, EditWorkspaceDefaultAppData, EditWorkspaceDefaultAppResponse, EditDefaultScriptsData, EditDefaultScriptsResponse, GetDefaultScriptsData, GetDefaultScriptsResponse, SetEnvironmentVariableData, SetEnvironmentVariableResponse, GetWorkspaceEncryptionKeyData, GetWorkspaceEncryptionKeyResponse, SetWorkspaceEncryptionKeyData, SetWorkspaceEncryptionKeyResponse, GetWorkspaceDefaultAppData, GetWorkspaceDefaultAppResponse, GetLargeFileStorageConfigData, GetLargeFileStorageConfigResponse, GetWorkspaceUsageData, GetWorkspaceUsageResponse, GetUsedTriggersData, GetUsedTriggersResponse, ListUsersData, ListUsersResponse, ListUsersUsageData, ListUsersUsageResponse, ListUsernamesData, ListUsernamesResponse, UsernameToEmailData, UsernameToEmailResponse, CreateTokenData, CreateTokenResponse, CreateTokenImpersonateData, CreateTokenImpersonateResponse, DeleteTokenData, DeleteTokenResponse, ListTokensData, ListTokensResponse, GetOidcTokenData, GetOidcTokenResponse, CreateVariableData, CreateVariableResponse, EncryptValueData, EncryptValueResponse, DeleteVariableData, DeleteVariableResponse, UpdateVariableData, UpdateVariableResponse, GetVariableData, GetVariableResponse, GetVariableValueData, GetVariableValueResponse, ExistsVariableData, ExistsVariableResponse, ListVariableData, ListVariableResponse, ListContextualVariablesData, ListContextualVariablesResponse, WorkspaceGetCriticalAlertsData, WorkspaceGetCriticalAlertsResponse, WorkspaceAcknowledgeCriticalAlertData, WorkspaceAcknowledgeCriticalAlertResponse, WorkspaceAcknowledgeAllCriticalAlertsData, WorkspaceAcknowledgeAllCriticalAlertsResponse, WorkspaceMuteCriticalAlertsUiData, WorkspaceMuteCriticalAlertsUiResponse, LoginWithOauthData, LoginWithOauthResponse, ConnectSlackCallbackData, ConnectSlackCallbackResponse, ConnectSlackCallbackInstanceData, ConnectSlackCallbackInstanceResponse, ConnectCallbackData, ConnectCallbackResponse, CreateAccountData, CreateAccountResponse, RefreshTokenData, RefreshTokenResponse, DisconnectAccountData, DisconnectAccountResponse, DisconnectSlackData, DisconnectSlackResponse, DisconnectTeamsData, DisconnectTeamsResponse, ListOauthLoginsResponse, ListOauthConnectsResponse, GetOauthConnectData, GetOauthConnectResponse, SyncTeamsResponse, SendMessageToConversationData, SendMessageToConversationResponse, CreateResourceData, CreateResourceResponse, DeleteResourceData, DeleteResourceResponse, UpdateResourceData, UpdateResourceResponse, UpdateResourceValueData, UpdateResourceValueResponse, GetResourceData, GetResourceResponse, GetResourceValueInterpolatedData, GetResourceValueInterpolatedResponse, GetResourceValueData, GetResourceValueResponse, ExistsResourceData, ExistsResourceResponse, ListResourceData, ListResourceResponse, ListSearchResourceData, ListSearchResourceResponse, ListResourceNamesData, ListResourceNamesResponse, CreateResourceTypeData, CreateResourceTypeResponse, FileResourceTypeToFileExtMapData, FileResourceTypeToFileExtMapResponse, DeleteResourceTypeData, DeleteResourceTypeResponse, UpdateResourceTypeData, UpdateResourceTypeResponse, GetResourceTypeData, GetResourceTypeResponse, ExistsResourceTypeData, ExistsResourceTypeResponse, ListResourceTypeData, ListResourceTypeResponse, ListResourceTypeNamesData, ListResourceTypeNamesResponse, QueryResourceTypesData, QueryResourceTypesResponse, ListHubIntegrationsData, ListHubIntegrationsResponse, ListHubFlowsResponse, GetHubFlowByIdData, GetHubFlowByIdResponse, ListHubAppsResponse, GetHubAppByIdData, GetHubAppByIdResponse, GetPublicAppByCustomPathData, GetPublicAppByCustomPathResponse, GetHubScriptContentByPathData, GetHubScriptContentByPathResponse, GetHubScriptByPathData, GetHubScriptByPathResponse, GetTopHubScriptsData, GetTopHubScriptsResponse, QueryHubScriptsData, QueryHubScriptsResponse, ListSearchScriptData, ListSearchScriptResponse, ListScriptsData, ListScriptsResponse, ListScriptPathsData, ListScriptPathsResponse, CreateDraftData, CreateDraftResponse, DeleteDraftData, DeleteDraftResponse, CreateScriptData, CreateScriptResponse, ToggleWorkspaceErrorHandlerForScriptData, ToggleWorkspaceErrorHandlerForScriptResponse, GetCustomTagsData, GetCustomTagsResponse, GeDefaultTagsResponse, IsDefaultTagsPerWorkspaceResponse, ArchiveScriptByPathData, ArchiveScriptByPathResponse, ArchiveScriptByHashData, ArchiveScriptByHashResponse, DeleteScriptByHashData, DeleteScriptByHashResponse, DeleteScriptByPathData, DeleteScriptByPathResponse, GetScriptByPathData, GetScriptByPathResponse, GetTriggersCountOfScriptData, GetTriggersCountOfScriptResponse, ListTokensOfScriptData, ListTokensOfScriptResponse, GetScriptByPathWithDraftData, GetScriptByPathWithDraftResponse, GetScriptHistoryByPathData, GetScriptHistoryByPathResponse, ListScriptPathsFromWorkspaceRunnableData, ListScriptPathsFromWorkspaceRunnableResponse, GetScriptLatestVersionData, GetScriptLatestVersionResponse, UpdateScriptHistoryData, UpdateScriptHistoryResponse, RawScriptByPathData, RawScriptByPathResponse, RawScriptByPathTokenedData, RawScriptByPathTokenedResponse, ExistsScriptByPathData, ExistsScriptByPathResponse, GetScriptByHashData, GetScriptByHashResponse, RawScriptByHashData, RawScriptByHashResponse, GetScriptDeploymentStatusData, GetScriptDeploymentStatusResponse, RunScriptByPathData, RunScriptByPathResponse, OpenaiSyncScriptByPathData, OpenaiSyncScriptByPathResponse, RunWaitResultScriptByPathData, RunWaitResultScriptByPathResponse, RunWaitResultScriptByPathGetData, RunWaitResultScriptByPathGetResponse, OpenaiSyncFlowByPathData, OpenaiSyncFlowByPathResponse, RunWaitResultFlowByPathData, RunWaitResultFlowByPathResponse, ResultByIdData, ResultByIdResponse, ListFlowPathsData, ListFlowPathsResponse, ListSearchFlowData, ListSearchFlowResponse, ListFlowsData, ListFlowsResponse, GetFlowHistoryData, GetFlowHistoryResponse, GetFlowLatestVersionData, GetFlowLatestVersionResponse, ListFlowPathsFromWorkspaceRunnableData, ListFlowPathsFromWorkspaceRunnableResponse, GetFlowVersionData, GetFlowVersionResponse, UpdateFlowHistoryData, UpdateFlowHistoryResponse, GetFlowByPathData, GetFlowByPathResponse, GetFlowDeploymentStatusData, GetFlowDeploymentStatusResponse, GetTriggersCountOfFlowData, GetTriggersCountOfFlowResponse, ListTokensOfFlowData, ListTokensOfFlowResponse, ToggleWorkspaceErrorHandlerForFlowData, ToggleWorkspaceErrorHandlerForFlowResponse, GetFlowByPathWithDraftData, GetFlowByPathWithDraftResponse, ExistsFlowByPathData, ExistsFlowByPathResponse, CreateFlowData, CreateFlowResponse, UpdateFlowData, UpdateFlowResponse, ArchiveFlowByPathData, ArchiveFlowByPathResponse, DeleteFlowByPathData, DeleteFlowByPathResponse, ListRawAppsData, ListRawAppsResponse, ExistsRawAppData, ExistsRawAppResponse, GetRawAppDataData, GetRawAppDataResponse, ListSearchAppData, ListSearchAppResponse, ListAppsData, ListAppsResponse, CreateAppData, CreateAppResponse, ExistsAppData, ExistsAppResponse, GetAppByPathData, GetAppByPathResponse, GetAppLiteByPathData, GetAppLiteByPathResponse, GetAppByPathWithDraftData, GetAppByPathWithDraftResponse, GetAppHistoryByPathData, GetAppHistoryByPathResponse, GetAppLatestVersionData, GetAppLatestVersionResponse, ListAppPathsFromWorkspaceRunnableData, ListAppPathsFromWorkspaceRunnableResponse, UpdateAppHistoryData, UpdateAppHistoryResponse, GetPublicAppBySecretData, GetPublicAppBySecretResponse, GetPublicResourceData, GetPublicResourceResponse, GetPublicSecretOfAppData, GetPublicSecretOfAppResponse, GetAppByVersionData, GetAppByVersionResponse, CreateRawAppData, CreateRawAppResponse, UpdateRawAppData, UpdateRawAppResponse, DeleteRawAppData, DeleteRawAppResponse, DeleteAppData, DeleteAppResponse, UpdateAppData, UpdateAppResponse, CustomPathExistsData, CustomPathExistsResponse, ExecuteComponentData, ExecuteComponentResponse, UploadS3FileFromAppData, UploadS3FileFromAppResponse, DeleteS3FileFromAppData, DeleteS3FileFromAppResponse, RunFlowByPathData, RunFlowByPathResponse, RestartFlowAtStepData, RestartFlowAtStepResponse, RunScriptByHashData, RunScriptByHashResponse, RunScriptPreviewData, RunScriptPreviewResponse, RunCodeWorkflowTaskData, RunCodeWorkflowTaskResponse, RunRawScriptDependenciesData, RunRawScriptDependenciesResponse, RunFlowPreviewData, RunFlowPreviewResponse, ListQueueData, ListQueueResponse, GetQueueCountData, GetQueueCountResponse, GetCompletedCountData, GetCompletedCountResponse, CountCompletedJobsData, CountCompletedJobsResponse, ListFilteredUuidsData, ListFilteredUuidsResponse, CancelSelectionData, CancelSelectionResponse, ListCompletedJobsData, ListCompletedJobsResponse, ListJobsData, ListJobsResponse, GetDbClockResponse, CountJobsByTagData, CountJobsByTagResponse, GetJobData, GetJobResponse, GetRootJobIdData, GetRootJobIdResponse, GetJobLogsData, GetJobLogsResponse, GetJobArgsData, GetJobArgsResponse, GetJobUpdatesData, GetJobUpdatesResponse, GetLogFileFromStoreData, GetLogFileFromStoreResponse, GetFlowDebugInfoData, GetFlowDebugInfoResponse, GetCompletedJobData, GetCompletedJobResponse, GetCompletedJobResultData, GetCompletedJobResultResponse, GetCompletedJobResultMaybeData, GetCompletedJobResultMaybeResponse, DeleteCompletedJobData, DeleteCompletedJobResponse, CancelQueuedJobData, CancelQueuedJobResponse, CancelPersistentQueuedJobsData, CancelPersistentQueuedJobsResponse, ForceCancelQueuedJobData, ForceCancelQueuedJobResponse, CreateJobSignatureData, CreateJobSignatureResponse, GetResumeUrlsData, GetResumeUrlsResponse, GetSlackApprovalPayloadData, GetSlackApprovalPayloadResponse, ResumeSuspendedJobGetData, ResumeSuspendedJobGetResponse, ResumeSuspendedJobPostData, ResumeSuspendedJobPostResponse, SetFlowUserStateData, SetFlowUserStateResponse, GetFlowUserStateData, GetFlowUserStateResponse, ResumeSuspendedFlowAsOwnerData, ResumeSuspendedFlowAsOwnerResponse, CancelSuspendedJobGetData, CancelSuspendedJobGetResponse, CancelSuspendedJobPostData, CancelSuspendedJobPostResponse, GetSuspendedJobFlowData, GetSuspendedJobFlowResponse, PreviewScheduleData, PreviewScheduleResponse, CreateScheduleData, CreateScheduleResponse, UpdateScheduleData, UpdateScheduleResponse, SetScheduleEnabledData, SetScheduleEnabledResponse, DeleteScheduleData, DeleteScheduleResponse, GetScheduleData, GetScheduleResponse, ExistsScheduleData, ExistsScheduleResponse, ListSchedulesData, ListSchedulesResponse, ListSchedulesWithJobsData, ListSchedulesWithJobsResponse, SetDefaultErrorOrRecoveryHandlerData, SetDefaultErrorOrRecoveryHandlerResponse, CreateHttpTriggerData, CreateHttpTriggerResponse, UpdateHttpTriggerData, UpdateHttpTriggerResponse, DeleteHttpTriggerData, DeleteHttpTriggerResponse, GetHttpTriggerData, GetHttpTriggerResponse, ListHttpTriggersData, ListHttpTriggersResponse, ExistsHttpTriggerData, ExistsHttpTriggerResponse, ExistsRouteData, ExistsRouteResponse, CreateWebsocketTriggerData, CreateWebsocketTriggerResponse, UpdateWebsocketTriggerData, UpdateWebsocketTriggerResponse, DeleteWebsocketTriggerData, DeleteWebsocketTriggerResponse, GetWebsocketTriggerData, GetWebsocketTriggerResponse, ListWebsocketTriggersData, ListWebsocketTriggersResponse, ExistsWebsocketTriggerData, ExistsWebsocketTriggerResponse, SetWebsocketTriggerEnabledData, SetWebsocketTriggerEnabledResponse, TestWebsocketConnectionData, TestWebsocketConnectionResponse, CreateKafkaTriggerData, CreateKafkaTriggerResponse, UpdateKafkaTriggerData, UpdateKafkaTriggerResponse, DeleteKafkaTriggerData, DeleteKafkaTriggerResponse, GetKafkaTriggerData, GetKafkaTriggerResponse, ListKafkaTriggersData, ListKafkaTriggersResponse, ExistsKafkaTriggerData, ExistsKafkaTriggerResponse, SetKafkaTriggerEnabledData, SetKafkaTriggerEnabledResponse, TestKafkaConnectionData, TestKafkaConnectionResponse, CreateNatsTriggerData, CreateNatsTriggerResponse, UpdateNatsTriggerData, UpdateNatsTriggerResponse, DeleteNatsTriggerData, DeleteNatsTriggerResponse, GetNatsTriggerData, GetNatsTriggerResponse, ListNatsTriggersData, ListNatsTriggersResponse, ExistsNatsTriggerData, ExistsNatsTriggerResponse, SetNatsTriggerEnabledData, SetNatsTriggerEnabledResponse, TestNatsConnectionData, TestNatsConnectionResponse, CreateSqsTriggerData, CreateSqsTriggerResponse, UpdateSqsTriggerData, UpdateSqsTriggerResponse, DeleteSqsTriggerData, DeleteSqsTriggerResponse, GetSqsTriggerData, GetSqsTriggerResponse, ListSqsTriggersData, ListSqsTriggersResponse, ExistsSqsTriggerData, ExistsSqsTriggerResponse, SetSqsTriggerEnabledData, SetSqsTriggerEnabledResponse, TestSqsConnectionData, TestSqsConnectionResponse, CreateMqttTriggerData, CreateMqttTriggerResponse, UpdateMqttTriggerData, UpdateMqttTriggerResponse, DeleteMqttTriggerData, DeleteMqttTriggerResponse, GetMqttTriggerData, GetMqttTriggerResponse, ListMqttTriggersData, ListMqttTriggersResponse, ExistsMqttTriggerData, ExistsMqttTriggerResponse, SetMqttTriggerEnabledData, SetMqttTriggerEnabledResponse, TestMqttConnectionData, TestMqttConnectionResponse, CreateGcpTriggerData, CreateGcpTriggerResponse, UpdateGcpTriggerData, UpdateGcpTriggerResponse, DeleteGcpTriggerData, DeleteGcpTriggerResponse, GetGcpTriggerData, GetGcpTriggerResponse, ListGcpTriggersData, ListGcpTriggersResponse, ExistsGcpTriggerData, ExistsGcpTriggerResponse, SetGcpTriggerEnabledData, SetGcpTriggerEnabledResponse, TestGcpConnectionData, TestGcpConnectionResponse, DeleteGcpSubscriptionData, DeleteGcpSubscriptionResponse, ListGoogleTopicsData, ListGoogleTopicsResponse, ListAllTgoogleTopicSubscriptionsData, ListAllTgoogleTopicSubscriptionsResponse, IsValidPostgresConfigurationData, IsValidPostgresConfigurationResponse, CreateTemplateScriptData, CreateTemplateScriptResponse, GetTemplateScriptData, GetTemplateScriptResponse, ListPostgresReplicationSlotData, ListPostgresReplicationSlotResponse, CreatePostgresReplicationSlotData, CreatePostgresReplicationSlotResponse, DeletePostgresReplicationSlotData, DeletePostgresReplicationSlotResponse, ListPostgresPublicationData, ListPostgresPublicationResponse, GetPostgresPublicationData, GetPostgresPublicationResponse, CreatePostgresPublicationData, CreatePostgresPublicationResponse, UpdatePostgresPublicationData, UpdatePostgresPublicationResponse, DeletePostgresPublicationData, DeletePostgresPublicationResponse, CreatePostgresTriggerData, CreatePostgresTriggerResponse, UpdatePostgresTriggerData, UpdatePostgresTriggerResponse, DeletePostgresTriggerData, DeletePostgresTriggerResponse, GetPostgresTriggerData, GetPostgresTriggerResponse, ListPostgresTriggersData, ListPostgresTriggersResponse, ExistsPostgresTriggerData, ExistsPostgresTriggerResponse, SetPostgresTriggerEnabledData, SetPostgresTriggerEnabledResponse, TestPostgresConnectionData, TestPostgresConnectionResponse, ListInstanceGroupsResponse, GetInstanceGroupData, GetInstanceGroupResponse, CreateInstanceGroupData, CreateInstanceGroupResponse, UpdateInstanceGroupData, UpdateInstanceGroupResponse, DeleteInstanceGroupData, DeleteInstanceGroupResponse, AddUserToInstanceGroupData, AddUserToInstanceGroupResponse, RemoveUserFromInstanceGroupData, RemoveUserFromInstanceGroupResponse, ExportInstanceGroupsResponse, OverwriteInstanceGroupsData, OverwriteInstanceGroupsResponse, ListGroupsData, ListGroupsResponse, ListGroupNamesData, ListGroupNamesResponse, CreateGroupData, CreateGroupResponse, UpdateGroupData, UpdateGroupResponse, DeleteGroupData, DeleteGroupResponse, GetGroupData, GetGroupResponse, AddUserToGroupData, AddUserToGroupResponse, RemoveUserToGroupData, RemoveUserToGroupResponse, ListFoldersData, ListFoldersResponse, ListFolderNamesData, ListFolderNamesResponse, CreateFolderData, CreateFolderResponse, UpdateFolderData, UpdateFolderResponse, DeleteFolderData, DeleteFolderResponse, GetFolderData, GetFolderResponse, ExistsFolderData, ExistsFolderResponse, GetFolderUsageData, GetFolderUsageResponse, AddOwnerToFolderData, AddOwnerToFolderResponse, RemoveOwnerToFolderData, RemoveOwnerToFolderResponse, ListWorkersData, ListWorkersResponse, ExistsWorkerWithTagData, ExistsWorkerWithTagResponse, GetQueueMetricsResponse, GetCountsOfJobsWaitingPerTagResponse, ListWorkerGroupsResponse, GetConfigData, GetConfigResponse, UpdateConfigData, UpdateConfigResponse, DeleteConfigData, DeleteConfigResponse, ListConfigsResponse, ListAutoscalingEventsData, ListAutoscalingEventsResponse, GetGranularAclsData, GetGranularAclsResponse, AddGranularAclsData, AddGranularAclsResponse, RemoveGranularAclsData, RemoveGranularAclsResponse, SetCaptureConfigData, SetCaptureConfigResponse, PingCaptureConfigData, PingCaptureConfigResponse, GetCaptureConfigsData, GetCaptureConfigsResponse, ListCapturesData, ListCapturesResponse, MoveCapturesAndConfigsData, MoveCapturesAndConfigsResponse, GetCaptureData, GetCaptureResponse, DeleteCaptureData, DeleteCaptureResponse, StarData, StarResponse, UnstarData, UnstarResponse, GetInputHistoryData, GetInputHistoryResponse, GetArgsFromHistoryOrSavedInputData, GetArgsFromHistoryOrSavedInputResponse, ListInputsData, ListInputsResponse, CreateInputData, CreateInputResponse, UpdateInputData, UpdateInputResponse, DeleteInputData, DeleteInputResponse, DuckdbConnectionSettingsData, DuckdbConnectionSettingsResponse, DuckdbConnectionSettingsV2Data, DuckdbConnectionSettingsV2Response, PolarsConnectionSettingsData, PolarsConnectionSettingsResponse, PolarsConnectionSettingsV2Data, PolarsConnectionSettingsV2Response, S3ResourceInfoData, S3ResourceInfoResponse, DatasetStorageTestConnectionData, DatasetStorageTestConnectionResponse, ListStoredFilesData, ListStoredFilesResponse, LoadFileMetadataData, LoadFileMetadataResponse, LoadFilePreviewData, LoadFilePreviewResponse, LoadParquetPreviewData, LoadParquetPreviewResponse, LoadTableRowCountData, LoadTableRowCountResponse, LoadCsvPreviewData, LoadCsvPreviewResponse, DeleteS3FileData, DeleteS3FileResponse, MoveS3FileData, MoveS3FileResponse, FileUploadData, FileUploadResponse, FileDownloadData, FileDownloadResponse, FileDownloadParquetAsCsvData, FileDownloadParquetAsCsvResponse, GetJobMetricsData, GetJobMetricsResponse, SetJobProgressData, SetJobProgressResponse, GetJobProgressData, GetJobProgressResponse, ListLogFilesData, ListLogFilesResponse, GetLogFileData, GetLogFileResponse, ListConcurrencyGroupsResponse, DeleteConcurrencyGroupData, DeleteConcurrencyGroupResponse, GetConcurrencyKeyData, GetConcurrencyKeyResponse, ListExtendedJobsData, ListExtendedJobsResponse, SearchJobsIndexData, SearchJobsIndexResponse, SearchLogsIndexData, SearchLogsIndexResponse, CountSearchLogsIndexData, CountSearchLogsIndexResponse, ClearIndexData, ClearIndexResponse } from './types.gen.ts'; - -/** - * get backend version - * @returns string git version of backend - * @throws ApiError - */ -export const backendVersion = (): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/version' -}); }; - -/** - * is backend up to date - * @returns string is backend up to date - * @throws ApiError - */ -export const backendUptodate = (): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/uptodate' -}); }; - -/** - * get license id - * @returns string get license id (empty if not ee) - * @throws ApiError - */ -export const getLicenseId = (): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/ee_license' -}); }; - -/** - * get openapi yaml spec - * @returns string openapi yaml file content - * @throws ApiError - */ -export const getOpenApiYaml = (): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/openapi.yaml' -}); }; - -/** - * get audit log (requires admin privilege) - * @param data The data for the request. - * @param data.workspace - * @param data.id - * @returns AuditLog an audit log - * @throws ApiError - */ -export const getAuditLog = (data: GetAuditLogData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/audit/get/{id}', - path: { - workspace: data.workspace, - id: data.id - } -}); }; - -/** - * list audit logs (requires admin privilege) - * @param data The data for the request. - * @param data.workspace - * @param data.page which page to return (start at 1, default 1) - * @param data.perPage number of items to return for a given page (default 30, max 100) - * @param data.before filter on started before (inclusive) timestamp - * @param data.after filter on created after (exclusive) timestamp - * @param data.username filter on exact username of user - * @param data.operation filter on exact or prefix name of operation - * @param data.operations comma separated list of exact operations to include - * @param data.excludeOperations comma separated list of operations to exclude - * @param data.resource filter on exact or prefix name of resource - * @param data.actionKind filter on type of operation - * @param data.allWorkspaces get audit logs for all workspaces - * @returns AuditLog a list of audit logs - * @throws ApiError - */ -export const listAuditLogs = (data: ListAuditLogsData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/audit/list', - path: { - workspace: data.workspace - }, - query: { - page: data.page, - per_page: data.perPage, - before: data.before, - after: data.after, - username: data.username, - operation: data.operation, - operations: data.operations, - exclude_operations: data.excludeOperations, - resource: data.resource, - action_kind: data.actionKind, - all_workspaces: data.allWorkspaces - } -}); }; - -/** - * login with password - * @param data The data for the request. - * @param data.requestBody credentials - * @returns string Successfully authenticated. The session ID is returned in a cookie named `token` and as plaintext response. Preferred method of authorization is through the bearer token. The cookie is only for browser convenience. - * - * @throws ApiError - */ -export const login = (data: LoginData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/auth/login', - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * logout - * @returns string clear cookies and clear token (if applicable) - * @throws ApiError - */ -export const logout = (): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/auth/logout' -}); }; - -/** - * get user (require admin privilege) - * @param data The data for the request. - * @param data.workspace - * @param data.username - * @returns User user created - * @throws ApiError - */ -export const getUser = (data: GetUserData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/users/get/{username}', - path: { - workspace: data.workspace, - username: data.username - } -}); }; - -/** - * update user (require admin privilege) - * @param data The data for the request. - * @param data.workspace - * @param data.username - * @param data.requestBody new user - * @returns string edited user - * @throws ApiError - */ -export const updateUser = (data: UpdateUserData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/users/update/{username}', - path: { - workspace: data.workspace, - username: data.username - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * is owner of path - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns boolean is owner - * @throws ApiError - */ -export const isOwnerOfPath = (data: IsOwnerOfPathData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/users/is_owner/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * set password - * @param data The data for the request. - * @param data.requestBody set password - * @returns string password set - * @throws ApiError - */ -export const setPassword = (data: SetPasswordData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/users/setpassword', - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * set password for a specific user (require super admin) - * @param data The data for the request. - * @param data.user - * @param data.requestBody set password - * @returns string password set - * @throws ApiError - */ -export const setPasswordForUser = (data: SetPasswordForUserData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/users/set_password_of/{user}', - path: { - user: data.user - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * set login type for a specific user (require super admin) - * @param data The data for the request. - * @param data.user - * @param data.requestBody set login type - * @returns string login type set - * @throws ApiError - */ -export const setLoginTypeForUser = (data: SetLoginTypeForUserData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/users/set_login_type/{user}', - path: { - user: data.user - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * create user - * @param data The data for the request. - * @param data.requestBody user info - * @returns string user created - * @throws ApiError - */ -export const createUserGlobally = (data: CreateUserGloballyData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/users/create', - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * global update user (require super admin) - * @param data The data for the request. - * @param data.email - * @param data.requestBody new user info - * @returns string user updated - * @throws ApiError - */ -export const globalUserUpdate = (data: GlobalUserUpdateData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/users/update/{email}', - path: { - email: data.email - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * global username info (require super admin) - * @param data The data for the request. - * @param data.email - * @returns unknown user renamed - * @throws ApiError - */ -export const globalUsernameInfo = (data: GlobalUsernameInfoData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/users/username_info/{email}', - path: { - email: data.email - } -}); }; - -/** - * global rename user (require super admin) - * @param data The data for the request. - * @param data.email - * @param data.requestBody new username - * @returns string user renamed - * @throws ApiError - */ -export const globalUserRename = (data: GlobalUserRenameData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/users/rename/{email}', - path: { - email: data.email - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * global delete user (require super admin) - * @param data The data for the request. - * @param data.email - * @returns string user deleted - * @throws ApiError - */ -export const globalUserDelete = (data: GlobalUserDeleteData): CancelablePromise => { return __request(OpenAPI, { - method: 'DELETE', - url: '/users/delete/{email}', - path: { - email: data.email - } -}); }; - -/** - * global overwrite users (require super admin and EE) - * @param data The data for the request. - * @param data.requestBody List of users - * @returns string Success message - * @throws ApiError - */ -export const globalUsersOverwrite = (data: GlobalUsersOverwriteData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/users/overwrite', - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * global export users (require super admin and EE) - * @returns ExportedUser exported users - * @throws ApiError - */ -export const globalUsersExport = (): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/users/export' -}); }; - -/** - * delete user (require admin privilege) - * @param data The data for the request. - * @param data.workspace - * @param data.username - * @returns string delete user - * @throws ApiError - */ -export const deleteUser = (data: DeleteUserData): CancelablePromise => { return __request(OpenAPI, { - method: 'DELETE', - url: '/w/{workspace}/users/delete/{username}', - path: { - workspace: data.workspace, - username: data.username - } -}); }; - -/** - * get connected repositories - * @returns GithubInstallations connected repositories - * @throws ApiError - */ -export const getGlobalConnectedRepositories = (): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/github_app/connected_repositories' -}); }; - -/** - * list all workspaces visible to me - * @returns Workspace all workspaces - * @throws ApiError - */ -export const listWorkspaces = (): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/workspaces/list' -}); }; - -/** - * is domain allowed for auto invi - * @returns boolean domain allowed or not - * @throws ApiError - */ -export const isDomainAllowed = (): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/workspaces/allowed_domain_auto_invite' -}); }; - -/** - * list all workspaces visible to me with user info - * @returns UserWorkspaceList workspace with associated username - * @throws ApiError - */ -export const listUserWorkspaces = (): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/workspaces/users' -}); }; - -/** - * list all workspaces as super admin (require to be super admin) - * @param data The data for the request. - * @param data.page which page to return (start at 1, default 1) - * @param data.perPage number of items to return for a given page (default 30, max 100) - * @returns Workspace workspaces - * @throws ApiError - */ -export const listWorkspacesAsSuperAdmin = (data: ListWorkspacesAsSuperAdminData = {}): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/workspaces/list_as_superadmin', - query: { - page: data.page, - per_page: data.perPage - } -}); }; - -/** - * create workspace - * @param data The data for the request. - * @param data.requestBody new token - * @returns string token created - * @throws ApiError - */ -export const createWorkspace = (data: CreateWorkspaceData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/workspaces/create', - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * exists workspace - * @param data The data for the request. - * @param data.requestBody id of workspace - * @returns boolean status - * @throws ApiError - */ -export const existsWorkspace = (data: ExistsWorkspaceData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/workspaces/exists', - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * exists username - * @param data The data for the request. - * @param data.requestBody - * @returns boolean status - * @throws ApiError - */ -export const existsUsername = (data: ExistsUsernameData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/workspaces/exists_username', - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * get global settings - * @param data The data for the request. - * @param data.key - * @returns unknown status - * @throws ApiError - */ -export const getGlobal = (data: GetGlobalData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/settings/global/{key}', - path: { - key: data.key - } -}); }; - -/** - * post global settings - * @param data The data for the request. - * @param data.key - * @param data.requestBody value set - * @returns string status - * @throws ApiError - */ -export const setGlobal = (data: SetGlobalData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/settings/global/{key}', - path: { - key: data.key - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * get local settings - * @returns unknown status - * @throws ApiError - */ -export const getLocal = (): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/settings/local' -}); }; - -/** - * test smtp - * @param data The data for the request. - * @param data.requestBody test smtp payload - * @returns string status - * @throws ApiError - */ -export const testSmtp = (data: TestSmtpData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/settings/test_smtp', - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * test critical channels - * @param data The data for the request. - * @param data.requestBody test critical channel payload - * @returns string status - * @throws ApiError - */ -export const testCriticalChannels = (data: TestCriticalChannelsData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/settings/test_critical_channels', - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * Get all critical alerts - * @param data The data for the request. - * @param data.page - * @param data.pageSize - * @param data.acknowledged - * @returns unknown Successfully retrieved all critical alerts - * @throws ApiError - */ -export const getCriticalAlerts = (data: GetCriticalAlertsData = {}): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/settings/critical_alerts', - query: { - page: data.page, - page_size: data.pageSize, - acknowledged: data.acknowledged - } -}); }; - -/** - * Acknowledge a critical alert - * @param data The data for the request. - * @param data.id The ID of the critical alert to acknowledge - * @returns string Successfully acknowledged the critical alert - * @throws ApiError - */ -export const acknowledgeCriticalAlert = (data: AcknowledgeCriticalAlertData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/settings/critical_alerts/{id}/acknowledge', - path: { - id: data.id - } -}); }; - -/** - * Acknowledge all unacknowledged critical alerts - * @returns string Successfully acknowledged all unacknowledged critical alerts. - * @throws ApiError - */ -export const acknowledgeAllCriticalAlerts = (): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/settings/critical_alerts/acknowledge_all' -}); }; - -/** - * test license key - * @param data The data for the request. - * @param data.requestBody test license key - * @returns string status - * @throws ApiError - */ -export const testLicenseKey = (data: TestLicenseKeyData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/settings/test_license_key', - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * test object storage config - * @param data The data for the request. - * @param data.requestBody test object storage config - * @returns string status - * @throws ApiError - */ -export const testObjectStorageConfig = (data: TestObjectStorageConfigData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/settings/test_object_storage_config', - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * send stats - * @returns string status - * @throws ApiError - */ -export const sendStats = (): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/settings/send_stats' -}); }; - -/** - * get latest key renewal attempt - * @returns unknown status - * @throws ApiError - */ -export const getLatestKeyRenewalAttempt = (): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/settings/latest_key_renewal_attempt' -}); }; - -/** - * renew license key - * @param data The data for the request. - * @param data.licenseKey - * @returns string status - * @throws ApiError - */ -export const renewLicenseKey = (data: RenewLicenseKeyData = {}): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/settings/renew_license_key', - query: { - license_key: data.licenseKey - } -}); }; - -/** - * create customer portal session - * @param data The data for the request. - * @param data.licenseKey - * @returns string url to portal - * @throws ApiError - */ -export const createCustomerPortalSession = (data: CreateCustomerPortalSessionData = {}): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/settings/customer_portal', - query: { - license_key: data.licenseKey - } -}); }; - -/** - * test metadata - * @param data The data for the request. - * @param data.requestBody test metadata - * @returns string status - * @throws ApiError - */ -export const testMetadata = (data: TestMetadataData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/saml/test_metadata', - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * list global settings - * @returns GlobalSetting list of settings - * @throws ApiError - */ -export const listGlobalSettings = (): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/settings/list_global' -}); }; - -/** - * get current user email (if logged in) - * @returns string user email - * @throws ApiError - */ -export const getCurrentEmail = (): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/users/email' -}); }; - -/** - * refresh the current token - * @param data The data for the request. - * @param data.ifExpiringInLessThanS - * @returns string new token - * @throws ApiError - */ -export const refreshUserToken = (data: RefreshUserTokenData = {}): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/users/refresh_token', - query: { - if_expiring_in_less_than_s: data.ifExpiringInLessThanS - } -}); }; - -/** - * get tutorial progress - * @returns unknown tutorial progress - * @throws ApiError - */ -export const getTutorialProgress = (): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/users/tutorial_progress' -}); }; - -/** - * update tutorial progress - * @param data The data for the request. - * @param data.requestBody progress update - * @returns string tutorial progress - * @throws ApiError - */ -export const updateTutorialProgress = (data: UpdateTutorialProgressData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/users/tutorial_progress', - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * leave instance - * @returns string status - * @throws ApiError - */ -export const leaveInstance = (): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/users/leave_instance' -}); }; - -/** - * get current usage outside of premium workspaces - * @returns number free usage - * @throws ApiError - */ -export const getUsage = (): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/users/usage' -}); }; - -/** - * get all runnables in every workspace - * @returns unknown free all runnables - * @throws ApiError - */ -export const getRunnable = (): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/users/all_runnables' -}); }; - -/** - * get current global whoami (if logged in) - * @returns GlobalUserInfo user email - * @throws ApiError - */ -export const globalWhoami = (): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/users/whoami' -}); }; - -/** - * list all workspace invites - * @returns WorkspaceInvite list all workspace invites - * @throws ApiError - */ -export const listWorkspaceInvites = (): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/users/list_invites' -}); }; - -/** - * whoami - * @param data The data for the request. - * @param data.workspace - * @returns User user - * @throws ApiError - */ -export const whoami = (data: WhoamiData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/users/whoami', - path: { - workspace: data.workspace - } -}); }; - -/** - * get github app token - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody jwt job token - * @returns unknown github app token - * @throws ApiError - */ -export const getGithubAppToken = (data: GetGithubAppTokenData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/github_app/token', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * Install a GitHub installation from another workspace - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody - * @returns unknown Installation successfully copied - * @throws ApiError - */ -export const installFromWorkspace = (data: InstallFromWorkspaceData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/github_app/install_from_workspace', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * Delete a GitHub installation from a workspace - * Removes a GitHub installation from the specified workspace. Requires admin privileges. - * @param data The data for the request. - * @param data.workspace - * @param data.installationId The ID of the GitHub installation to delete - * @returns unknown Installation successfully deleted - * @throws ApiError - */ -export const deleteFromWorkspace = (data: DeleteFromWorkspaceData): CancelablePromise => { return __request(OpenAPI, { - method: 'DELETE', - url: '/w/{workspace}/github_app/installation/{installation_id}', - path: { - workspace: data.workspace, - installation_id: data.installationId - } -}); }; - -/** - * Export GitHub installation JWT token - * Exports the JWT token for a specific GitHub installation in the workspace - * @param data The data for the request. - * @param data.workspace - * @param data.installationId - * @returns unknown Successfully exported the JWT token - * @throws ApiError - */ -export const exportInstallation = (data: ExportInstallationData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/github_app/export/{installationId}', - path: { - workspace: data.workspace, - installationId: data.installationId - } -}); }; - -/** - * Import GitHub installation from JWT token - * Imports a GitHub installation from a JWT token exported from another instance - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody - * @returns unknown Successfully imported the installation - * @throws ApiError - */ -export const importInstallation = (data: ImportInstallationData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/github_app/import', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * accept invite to workspace - * @param data The data for the request. - * @param data.requestBody accept invite - * @returns string status - * @throws ApiError - */ -export const acceptInvite = (data: AcceptInviteData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/users/accept_invite', - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * decline invite to workspace - * @param data The data for the request. - * @param data.requestBody decline invite - * @returns string status - * @throws ApiError - */ -export const declineInvite = (data: DeclineInviteData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/users/decline_invite', - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * invite user to workspace - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody WorkspaceInvite - * @returns string status - * @throws ApiError - */ -export const inviteUser = (data: InviteUserData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/workspaces/invite_user', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * add user to workspace - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody WorkspaceInvite - * @returns string status - * @throws ApiError - */ -export const addUser = (data: AddUserData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/workspaces/add_user', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * delete user invite - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody WorkspaceInvite - * @returns string status - * @throws ApiError - */ -export const deleteInvite = (data: DeleteInviteData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/workspaces/delete_invite', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * archive workspace - * @param data The data for the request. - * @param data.workspace - * @returns string status - * @throws ApiError - */ -export const archiveWorkspace = (data: ArchiveWorkspaceData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/workspaces/archive', - path: { - workspace: data.workspace - } -}); }; - -/** - * unarchive workspace - * @param data The data for the request. - * @param data.workspace - * @returns string status - * @throws ApiError - */ -export const unarchiveWorkspace = (data: UnarchiveWorkspaceData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/workspaces/unarchive/{workspace}', - path: { - workspace: data.workspace - } -}); }; - -/** - * delete workspace (require super admin) - * @param data The data for the request. - * @param data.workspace - * @returns string status - * @throws ApiError - */ -export const deleteWorkspace = (data: DeleteWorkspaceData): CancelablePromise => { return __request(OpenAPI, { - method: 'DELETE', - url: '/workspaces/delete/{workspace}', - path: { - workspace: data.workspace - } -}); }; - -/** - * leave workspace - * @param data The data for the request. - * @param data.workspace - * @returns string status - * @throws ApiError - */ -export const leaveWorkspace = (data: LeaveWorkspaceData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/workspaces/leave', - path: { - workspace: data.workspace - } -}); }; - -/** - * get workspace name - * @param data The data for the request. - * @param data.workspace - * @returns string status - * @throws ApiError - */ -export const getWorkspaceName = (data: GetWorkspaceNameData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/workspaces/get_workspace_name', - path: { - workspace: data.workspace - } -}); }; - -/** - * change workspace name - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody - * @returns string status - * @throws ApiError - */ -export const changeWorkspaceName = (data: ChangeWorkspaceNameData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/workspaces/change_workspace_name', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * change workspace id - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody - * @returns string status - * @throws ApiError - */ -export const changeWorkspaceId = (data: ChangeWorkspaceIdData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/workspaces/change_workspace_id', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * change workspace id - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody - * @returns string status - * @throws ApiError - */ -export const changeWorkspaceColor = (data: ChangeWorkspaceColorData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/workspaces/change_workspace_color', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * whois - * @param data The data for the request. - * @param data.workspace - * @param data.username - * @returns User user - * @throws ApiError - */ -export const whois = (data: WhoisData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/users/whois/{username}', - path: { - workspace: data.workspace, - username: data.username - } -}); }; - -/** - * Update operator settings for a workspace - * Updates the operator settings for a specific workspace. Requires workspace admin privileges. - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody - * @returns string Operator settings updated successfully - * @throws ApiError - */ -export const updateOperatorSettings = (data: UpdateOperatorSettingsData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/workspaces/operator_settings', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * exists email - * @param data The data for the request. - * @param data.email - * @returns boolean user - * @throws ApiError - */ -export const existsEmail = (data: ExistsEmailData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/users/exists/{email}', - path: { - email: data.email - } -}); }; - -/** - * list all users as super admin (require to be super amdin) - * @param data The data for the request. - * @param data.page which page to return (start at 1, default 1) - * @param data.perPage number of items to return for a given page (default 30, max 100) - * @param data.activeOnly filter only active users - * @returns GlobalUserInfo user - * @throws ApiError - */ -export const listUsersAsSuperAdmin = (data: ListUsersAsSuperAdminData = {}): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/users/list_as_super_admin', - query: { - page: data.page, - per_page: data.perPage, - active_only: data.activeOnly - } -}); }; - -/** - * list pending invites for a workspace - * @param data The data for the request. - * @param data.workspace - * @returns WorkspaceInvite user - * @throws ApiError - */ -export const listPendingInvites = (data: ListPendingInvitesData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/workspaces/list_pending_invites', - path: { - workspace: data.workspace - } -}); }; - -/** - * get settings - * @param data The data for the request. - * @param data.workspace - * @returns unknown status - * @throws ApiError - */ -export const getSettings = (data: GetSettingsData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/workspaces/get_settings', - path: { - workspace: data.workspace - } -}); }; - -/** - * get deploy to - * @param data The data for the request. - * @param data.workspace - * @returns unknown status - * @throws ApiError - */ -export const getDeployTo = (data: GetDeployToData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/workspaces/get_deploy_to', - path: { - workspace: data.workspace - } -}); }; - -/** - * get if workspace is premium - * @param data The data for the request. - * @param data.workspace - * @returns boolean status - * @throws ApiError - */ -export const getIsPremium = (data: GetIsPremiumData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/workspaces/is_premium', - path: { - workspace: data.workspace - } -}); }; - -/** - * get premium info - * @param data The data for the request. - * @param data.workspace - * @returns unknown status - * @throws ApiError - */ -export const getPremiumInfo = (data: GetPremiumInfoData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/workspaces/premium_info', - path: { - workspace: data.workspace - } -}); }; - -/** - * get threshold alert info - * @param data The data for the request. - * @param data.workspace - * @returns unknown status - * @throws ApiError - */ -export const getThresholdAlert = (data: GetThresholdAlertData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/workspaces/threshold_alert', - path: { - workspace: data.workspace - } -}); }; - -/** - * set threshold alert info - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody threshold alert info - * @returns string status - * @throws ApiError - */ -export const setThresholdAlert = (data: SetThresholdAlertData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/workspaces/threshold_alert', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * edit slack command - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody WorkspaceInvite - * @returns string status - * @throws ApiError - */ -export const editSlackCommand = (data: EditSlackCommandData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/workspaces/edit_slack_command', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * edit teams command - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody WorkspaceInvite - * @returns string status - * @throws ApiError - */ -export const editTeamsCommand = (data: EditTeamsCommandData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/workspaces/edit_teams_command', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * list available teams ids - * @param data The data for the request. - * @param data.workspace - * @returns unknown status - * @throws ApiError - */ -export const listAvailableTeamsIds = (data: ListAvailableTeamsIdsData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/workspaces/available_teams_ids', - path: { - workspace: data.workspace - } -}); }; - -/** - * list available teams channels - * @param data The data for the request. - * @param data.workspace - * @returns unknown status - * @throws ApiError - */ -export const listAvailableTeamsChannels = (data: ListAvailableTeamsChannelsData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/workspaces/available_teams_channels', - path: { - workspace: data.workspace - } -}); }; - -/** - * connect teams - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody connect teams - * @returns string status - * @throws ApiError - */ -export const connectTeams = (data: ConnectTeamsData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/workspaces/connect_teams', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * run a job that sends a message to Slack - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody path to hub script to run and its corresponding args - * @returns unknown status - * @throws ApiError - */ -export const runSlackMessageTestJob = (data: RunSlackMessageTestJobData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/workspaces/run_slack_message_test_job', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * run a job that sends a message to Teams - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody path to hub script to run and its corresponding args - * @returns unknown status - * @throws ApiError - */ -export const runTeamsMessageTestJob = (data: RunTeamsMessageTestJobData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/workspaces/run_teams_message_test_job', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * edit deploy to - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody - * @returns string status - * @throws ApiError - */ -export const editDeployTo = (data: EditDeployToData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/workspaces/edit_deploy_to', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * edit auto invite - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody WorkspaceInvite - * @returns string status - * @throws ApiError - */ -export const editAutoInvite = (data: EditAutoInviteData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/workspaces/edit_auto_invite', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * edit webhook - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody WorkspaceWebhook - * @returns string status - * @throws ApiError - */ -export const editWebhook = (data: EditWebhookData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/workspaces/edit_webhook', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * edit copilot config - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody WorkspaceCopilotConfig - * @returns string status - * @throws ApiError - */ -export const editCopilotConfig = (data: EditCopilotConfigData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/workspaces/edit_copilot_config', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * get copilot info - * @param data The data for the request. - * @param data.workspace - * @returns AIConfig status - * @throws ApiError - */ -export const getCopilotInfo = (data: GetCopilotInfoData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/workspaces/get_copilot_info', - path: { - workspace: data.workspace - } -}); }; - -/** - * edit error handler - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody WorkspaceErrorHandler - * @returns string status - * @throws ApiError - */ -export const editErrorHandler = (data: EditErrorHandlerData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/workspaces/edit_error_handler', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * edit large file storage settings - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody LargeFileStorage info - * @returns unknown status - * @throws ApiError - */ -export const editLargeFileStorageConfig = (data: EditLargeFileStorageConfigData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/workspaces/edit_large_file_storage_config', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * edit workspace git sync settings - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody Workspace Git sync settings - * @returns unknown status - * @throws ApiError - */ -export const editWorkspaceGitSyncConfig = (data: EditWorkspaceGitSyncConfigData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/workspaces/edit_git_sync_config', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * edit workspace deploy ui settings - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody Workspace deploy UI settings - * @returns unknown status - * @throws ApiError - */ -export const editWorkspaceDeployUiSettings = (data: EditWorkspaceDeployUiSettingsData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/workspaces/edit_deploy_ui_config', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * edit default app for workspace - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody Workspace default app - * @returns string status - * @throws ApiError - */ -export const editWorkspaceDefaultApp = (data: EditWorkspaceDefaultAppData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/workspaces/edit_default_app', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * edit default scripts for workspace - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody Workspace default app - * @returns string status - * @throws ApiError - */ -export const editDefaultScripts = (data: EditDefaultScriptsData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/workspaces/default_scripts', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * get default scripts for workspace - * @param data The data for the request. - * @param data.workspace - * @returns WorkspaceDefaultScripts status - * @throws ApiError - */ -export const getDefaultScripts = (data: GetDefaultScriptsData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/workspaces/default_scripts', - path: { - workspace: data.workspace - } -}); }; - -/** - * set environment variable - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody Workspace default app - * @returns string status - * @throws ApiError - */ -export const setEnvironmentVariable = (data: SetEnvironmentVariableData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/workspaces/set_environment_variable', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * retrieves the encryption key for this workspace - * @param data The data for the request. - * @param data.workspace - * @returns unknown status - * @throws ApiError - */ -export const getWorkspaceEncryptionKey = (data: GetWorkspaceEncryptionKeyData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/workspaces/encryption_key', - path: { - workspace: data.workspace - } -}); }; - -/** - * update the encryption key for this workspace - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody New encryption key - * @returns string status - * @throws ApiError - */ -export const setWorkspaceEncryptionKey = (data: SetWorkspaceEncryptionKeyData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/workspaces/encryption_key', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * get default app for workspace - * @param data The data for the request. - * @param data.workspace - * @returns unknown status - * @throws ApiError - */ -export const getWorkspaceDefaultApp = (data: GetWorkspaceDefaultAppData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/workspaces/default_app', - path: { - workspace: data.workspace - } -}); }; - -/** - * get large file storage config - * @param data The data for the request. - * @param data.workspace - * @returns LargeFileStorage status - * @throws ApiError - */ -export const getLargeFileStorageConfig = (data: GetLargeFileStorageConfigData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/workspaces/get_large_file_storage_config', - path: { - workspace: data.workspace - } -}); }; - -/** - * get usage - * @param data The data for the request. - * @param data.workspace - * @returns number usage - * @throws ApiError - */ -export const getWorkspaceUsage = (data: GetWorkspaceUsageData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/workspaces/usage', - path: { - workspace: data.workspace - } -}); }; - -/** - * get used triggers - * @param data The data for the request. - * @param data.workspace - * @returns unknown status - * @throws ApiError - */ -export const getUsedTriggers = (data: GetUsedTriggersData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/workspaces/used_triggers', - path: { - workspace: data.workspace - } -}); }; - -/** - * list users - * @param data The data for the request. - * @param data.workspace - * @returns User user - * @throws ApiError - */ -export const listUsers = (data: ListUsersData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/users/list', - path: { - workspace: data.workspace - } -}); }; - -/** - * list users usage - * @param data The data for the request. - * @param data.workspace - * @returns UserUsage user - * @throws ApiError - */ -export const listUsersUsage = (data: ListUsersUsageData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/users/list_usage', - path: { - workspace: data.workspace - } -}); }; - -/** - * list usernames - * @param data The data for the request. - * @param data.workspace - * @returns string user - * @throws ApiError - */ -export const listUsernames = (data: ListUsernamesData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/users/list_usernames', - path: { - workspace: data.workspace - } -}); }; - -/** - * get email from username - * @param data The data for the request. - * @param data.workspace - * @param data.username - * @returns string email - * @throws ApiError - */ -export const usernameToEmail = (data: UsernameToEmailData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/users/username_to_email/{username}', - path: { - workspace: data.workspace, - username: data.username - } -}); }; - -/** - * create token - * @param data The data for the request. - * @param data.requestBody new token - * @returns string token created - * @throws ApiError - */ -export const createToken = (data: CreateTokenData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/users/tokens/create', - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * create token to impersonate a user (require superadmin) - * @param data The data for the request. - * @param data.requestBody new token - * @returns string token created - * @throws ApiError - */ -export const createTokenImpersonate = (data: CreateTokenImpersonateData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/users/tokens/impersonate', - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * delete token - * @param data The data for the request. - * @param data.tokenPrefix - * @returns string delete token - * @throws ApiError - */ -export const deleteToken = (data: DeleteTokenData): CancelablePromise => { return __request(OpenAPI, { - method: 'DELETE', - url: '/users/tokens/delete/{token_prefix}', - path: { - token_prefix: data.tokenPrefix - } -}); }; - -/** - * list token - * @param data The data for the request. - * @param data.excludeEphemeral - * @param data.page which page to return (start at 1, default 1) - * @param data.perPage number of items to return for a given page (default 30, max 100) - * @returns TruncatedToken truncated token - * @throws ApiError - */ -export const listTokens = (data: ListTokensData = {}): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/users/tokens/list', - query: { - exclude_ephemeral: data.excludeEphemeral, - page: data.page, - per_page: data.perPage - } -}); }; - -/** - * get OIDC token (ee only) - * @param data The data for the request. - * @param data.workspace - * @param data.audience - * @returns string new oidc token - * @throws ApiError - */ -export const getOidcToken = (data: GetOidcTokenData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/oidc/token/{audience}', - path: { - workspace: data.workspace, - audience: data.audience - } -}); }; - -/** - * create variable - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody new variable - * @param data.alreadyEncrypted - * @returns string variable created - * @throws ApiError - */ -export const createVariable = (data: CreateVariableData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/variables/create', - path: { - workspace: data.workspace - }, - query: { - already_encrypted: data.alreadyEncrypted - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * encrypt value - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody new variable - * @returns string encrypted value - * @throws ApiError - */ -export const encryptValue = (data: EncryptValueData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/variables/encrypt', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * delete variable - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns string variable deleted - * @throws ApiError - */ -export const deleteVariable = (data: DeleteVariableData): CancelablePromise => { return __request(OpenAPI, { - method: 'DELETE', - url: '/w/{workspace}/variables/delete/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * update variable - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.requestBody updated variable - * @param data.alreadyEncrypted - * @returns string variable updated - * @throws ApiError - */ -export const updateVariable = (data: UpdateVariableData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/variables/update/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - query: { - already_encrypted: data.alreadyEncrypted - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * get variable - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.decryptSecret ask to decrypt secret if this variable is secret - * (if not secret no effect, default: true) - * - * @param data.includeEncrypted ask to include the encrypted value if secret and decrypt secret is not true (default: false) - * - * @returns ListableVariable variable - * @throws ApiError - */ -export const getVariable = (data: GetVariableData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/variables/get/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - query: { - decrypt_secret: data.decryptSecret, - include_encrypted: data.includeEncrypted - } -}); }; - -/** - * get variable value - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns string variable - * @throws ApiError - */ -export const getVariableValue = (data: GetVariableValueData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/variables/get_value/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * does variable exists at path - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns boolean variable - * @throws ApiError - */ -export const existsVariable = (data: ExistsVariableData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/variables/exists/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * list variables - * @param data The data for the request. - * @param data.workspace - * @param data.pathStart - * @param data.page which page to return (start at 1, default 1) - * @param data.perPage number of items to return for a given page (default 30, max 100) - * @returns ListableVariable variable list - * @throws ApiError - */ -export const listVariable = (data: ListVariableData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/variables/list', - path: { - workspace: data.workspace - }, - query: { - path_start: data.pathStart, - page: data.page, - per_page: data.perPage - } -}); }; - -/** - * list contextual variables - * @param data The data for the request. - * @param data.workspace - * @returns ContextualVariable contextual variable list - * @throws ApiError - */ -export const listContextualVariables = (data: ListContextualVariablesData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/variables/list_contextual', - path: { - workspace: data.workspace - } -}); }; - -/** - * Get all critical alerts for this workspace - * @param data The data for the request. - * @param data.workspace - * @param data.page - * @param data.pageSize - * @param data.acknowledged - * @returns unknown Successfully retrieved all critical alerts - * @throws ApiError - */ -export const workspaceGetCriticalAlerts = (data: WorkspaceGetCriticalAlertsData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/workspaces/critical_alerts', - path: { - workspace: data.workspace - }, - query: { - page: data.page, - page_size: data.pageSize, - acknowledged: data.acknowledged - } -}); }; - -/** - * Acknowledge a critical alert for this workspace - * @param data The data for the request. - * @param data.workspace - * @param data.id The ID of the critical alert to acknowledge - * @returns string Successfully acknowledged the critical alert - * @throws ApiError - */ -export const workspaceAcknowledgeCriticalAlert = (data: WorkspaceAcknowledgeCriticalAlertData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/workspaces/critical_alerts/{id}/acknowledge', - path: { - workspace: data.workspace, - id: data.id - } -}); }; - -/** - * Acknowledge all unacknowledged critical alerts for this workspace - * @param data The data for the request. - * @param data.workspace - * @returns string Successfully acknowledged all unacknowledged critical alerts. - * @throws ApiError - */ -export const workspaceAcknowledgeAllCriticalAlerts = (data: WorkspaceAcknowledgeAllCriticalAlertsData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/workspaces/critical_alerts/acknowledge_all', - path: { - workspace: data.workspace - } -}); }; - -/** - * Mute critical alert UI for this workspace - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody Boolean flag to mute critical alerts. - * @returns string Successfully updated mute critical alert settings. - * @throws ApiError - */ -export const workspaceMuteCriticalAlertsUi = (data: WorkspaceMuteCriticalAlertsUiData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/workspaces/critical_alerts/mute', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * login with oauth authorization flow - * @param data The data for the request. - * @param data.clientName - * @param data.requestBody Partially filled script - * @returns string Successfully authenticated. The session ID is returned in a cookie named `token` and as plaintext response. Preferred method of authorization is through the bearer token. The cookie is only for browser convenience. - * - * @throws ApiError - */ -export const loginWithOauth = (data: LoginWithOauthData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/oauth/login_callback/{client_name}', - path: { - client_name: data.clientName - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * connect slack callback - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody code endpoint - * @returns string slack token - * @throws ApiError - */ -export const connectSlackCallback = (data: ConnectSlackCallbackData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/oauth/connect_slack_callback', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * connect slack callback instance - * @param data The data for the request. - * @param data.requestBody code endpoint - * @returns string success message - * @throws ApiError - */ -export const connectSlackCallbackInstance = (data: ConnectSlackCallbackInstanceData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/oauth/connect_slack_callback', - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * connect callback - * @param data The data for the request. - * @param data.clientName - * @param data.requestBody code endpoint - * @returns TokenResponse oauth token - * @throws ApiError - */ -export const connectCallback = (data: ConnectCallbackData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/oauth/connect_callback/{client_name}', - path: { - client_name: data.clientName - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * create OAuth account - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody code endpoint - * @returns string account set - * @throws ApiError - */ -export const createAccount = (data: CreateAccountData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/oauth/create_account', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * refresh token - * @param data The data for the request. - * @param data.workspace - * @param data.id - * @param data.requestBody variable path - * @returns string token refreshed - * @throws ApiError - */ -export const refreshToken = (data: RefreshTokenData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/oauth/refresh_token/{id}', - path: { - workspace: data.workspace, - id: data.id - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * disconnect account - * @param data The data for the request. - * @param data.workspace - * @param data.id - * @returns string disconnected client - * @throws ApiError - */ -export const disconnectAccount = (data: DisconnectAccountData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/oauth/disconnect/{id}', - path: { - workspace: data.workspace, - id: data.id - } -}); }; - -/** - * disconnect slack - * @param data The data for the request. - * @param data.workspace - * @returns string disconnected slack - * @throws ApiError - */ -export const disconnectSlack = (data: DisconnectSlackData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/oauth/disconnect_slack', - path: { - workspace: data.workspace - } -}); }; - -/** - * disconnect teams - * @param data The data for the request. - * @param data.workspace - * @returns string disconnected teams - * @throws ApiError - */ -export const disconnectTeams = (data: DisconnectTeamsData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/oauth/disconnect_teams', - path: { - workspace: data.workspace - } -}); }; - -/** - * list oauth logins - * @returns unknown list of oauth and saml login clients - * @throws ApiError - */ -export const listOauthLogins = (): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/oauth/list_logins' -}); }; - -/** - * list oauth connects - * @returns string list of oauth connects clients - * @throws ApiError - */ -export const listOauthConnects = (): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/oauth/list_connects' -}); }; - -/** - * get oauth connect - * @param data The data for the request. - * @param data.client client name - * @returns unknown get - * @throws ApiError - */ -export const getOauthConnect = (data: GetOauthConnectData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/oauth/get_connect/{client}', - path: { - client: data.client - } -}); }; - -/** - * synchronize Microsoft Teams information (teams/channels) - * @returns TeamInfo Teams information successfully synchronized - * @throws ApiError - */ -export const syncTeams = (): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/teams/sync' -}); }; - -/** - * send update to Microsoft Teams activity - * Respond to a Microsoft Teams activity after a workspace command is run - * @param data The data for the request. - * @param data.requestBody - * @returns unknown Activity processed successfully - * @throws ApiError - */ -export const sendMessageToConversation = (data: SendMessageToConversationData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/teams/activities', - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * create resource - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody new resource - * @param data.updateIfExists - * @returns string resource created - * @throws ApiError - */ -export const createResource = (data: CreateResourceData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/resources/create', - path: { - workspace: data.workspace - }, - query: { - update_if_exists: data.updateIfExists - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * delete resource - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns string resource deleted - * @throws ApiError - */ -export const deleteResource = (data: DeleteResourceData): CancelablePromise => { return __request(OpenAPI, { - method: 'DELETE', - url: '/w/{workspace}/resources/delete/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * update resource - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.requestBody updated resource - * @returns string resource updated - * @throws ApiError - */ -export const updateResource = (data: UpdateResourceData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/resources/update/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * update resource value - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.requestBody updated resource - * @returns string resource value updated - * @throws ApiError - */ -export const updateResourceValue = (data: UpdateResourceValueData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/resources/update_value/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * get resource - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns Resource resource - * @throws ApiError - */ -export const getResource = (data: GetResourceData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/resources/get/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * get resource interpolated (variables and resources are fully unrolled) - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.jobId job id - * @returns unknown resource value - * @throws ApiError - */ -export const getResourceValueInterpolated = (data: GetResourceValueInterpolatedData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/resources/get_value_interpolated/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - query: { - job_id: data.jobId - } -}); }; - -/** - * get resource value - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns unknown resource value - * @throws ApiError - */ -export const getResourceValue = (data: GetResourceValueData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/resources/get_value/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * does resource exists - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns boolean does resource exists - * @throws ApiError - */ -export const existsResource = (data: ExistsResourceData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/resources/exists/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * list resources - * @param data The data for the request. - * @param data.workspace - * @param data.page which page to return (start at 1, default 1) - * @param data.perPage number of items to return for a given page (default 30, max 100) - * @param data.resourceType resource_types to list from, separated by ',', - * @param data.resourceTypeExclude resource_types to not list from, separated by ',', - * @param data.pathStart - * @returns ListableResource resource list - * @throws ApiError - */ -export const listResource = (data: ListResourceData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/resources/list', - path: { - workspace: data.workspace - }, - query: { - page: data.page, - per_page: data.perPage, - resource_type: data.resourceType, - resource_type_exclude: data.resourceTypeExclude, - path_start: data.pathStart - } -}); }; - -/** - * list resources for search - * @param data The data for the request. - * @param data.workspace - * @returns unknown resource list - * @throws ApiError - */ -export const listSearchResource = (data: ListSearchResourceData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/resources/list_search', - path: { - workspace: data.workspace - } -}); }; - -/** - * list resource names - * @param data The data for the request. - * @param data.workspace - * @param data.name - * @returns unknown resource list names - * @throws ApiError - */ -export const listResourceNames = (data: ListResourceNamesData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/resources/list_names/{name}', - path: { - workspace: data.workspace, - name: data.name - } -}); }; - -/** - * create resource_type - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody new resource_type - * @returns string resource_type created - * @throws ApiError - */ -export const createResourceType = (data: CreateResourceTypeData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/resources/type/create', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * get map from resource type to format extension - * @param data The data for the request. - * @param data.workspace - * @returns unknown map from resource type to file ext - * @throws ApiError - */ -export const fileResourceTypeToFileExtMap = (data: FileResourceTypeToFileExtMapData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/resources/file_resource_type_to_file_ext_map', - path: { - workspace: data.workspace - } -}); }; - -/** - * delete resource_type - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns string resource_type deleted - * @throws ApiError - */ -export const deleteResourceType = (data: DeleteResourceTypeData): CancelablePromise => { return __request(OpenAPI, { - method: 'DELETE', - url: '/w/{workspace}/resources/type/delete/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * update resource_type - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.requestBody updated resource_type - * @returns string resource_type updated - * @throws ApiError - */ -export const updateResourceType = (data: UpdateResourceTypeData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/resources/type/update/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * get resource_type - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns ResourceType resource_type deleted - * @throws ApiError - */ -export const getResourceType = (data: GetResourceTypeData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/resources/type/get/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * does resource_type exists - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns boolean does resource_type exist - * @throws ApiError - */ -export const existsResourceType = (data: ExistsResourceTypeData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/resources/type/exists/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * list resource_types - * @param data The data for the request. - * @param data.workspace - * @returns ResourceType resource_type list - * @throws ApiError - */ -export const listResourceType = (data: ListResourceTypeData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/resources/type/list', - path: { - workspace: data.workspace - } -}); }; - -/** - * list resource_types names - * @param data The data for the request. - * @param data.workspace - * @returns string resource_type list - * @throws ApiError - */ -export const listResourceTypeNames = (data: ListResourceTypeNamesData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/resources/type/listnames', - path: { - workspace: data.workspace - } -}); }; - -/** - * query resource types by similarity - * @param data The data for the request. - * @param data.workspace - * @param data.text query text - * @param data.limit query limit - * @returns unknown resource type details - * @throws ApiError - */ -export const queryResourceTypes = (data: QueryResourceTypesData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/embeddings/query_resource_types', - path: { - workspace: data.workspace - }, - query: { - text: data.text, - limit: data.limit - } -}); }; - -/** - * list hub integrations - * @param data The data for the request. - * @param data.kind query integrations kind - * @returns unknown integrations details - * @throws ApiError - */ -export const listHubIntegrations = (data: ListHubIntegrationsData = {}): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/integrations/hub/list', - query: { - kind: data.kind - } -}); }; - -/** - * list all hub flows - * @returns unknown hub flows list - * @throws ApiError - */ -export const listHubFlows = (): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/flows/hub/list' -}); }; - -/** - * get hub flow by id - * @param data The data for the request. - * @param data.id - * @returns unknown flow - * @throws ApiError - */ -export const getHubFlowById = (data: GetHubFlowByIdData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/flows/hub/get/{id}', - path: { - id: data.id - } -}); }; - -/** - * list all hub apps - * @returns unknown hub apps list - * @throws ApiError - */ -export const listHubApps = (): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/apps/hub/list' -}); }; - -/** - * get hub app by id - * @param data The data for the request. - * @param data.id - * @returns unknown app - * @throws ApiError - */ -export const getHubAppById = (data: GetHubAppByIdData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/apps/hub/get/{id}', - path: { - id: data.id - } -}); }; - -/** - * get public app by custom path - * @param data The data for the request. - * @param data.customPath - * @returns unknown app details - * @throws ApiError - */ -export const getPublicAppByCustomPath = (data: GetPublicAppByCustomPathData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/apps_u/public_app_by_custom_path/{custom_path}', - path: { - custom_path: data.customPath - } -}); }; - -/** - * get hub script content by path - * @param data The data for the request. - * @param data.path - * @returns string script details - * @throws ApiError - */ -export const getHubScriptContentByPath = (data: GetHubScriptContentByPathData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/scripts/hub/get/{path}', - path: { - path: data.path - } -}); }; - -/** - * get full hub script by path - * @param data The data for the request. - * @param data.path - * @returns unknown script details - * @throws ApiError - */ -export const getHubScriptByPath = (data: GetHubScriptByPathData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/scripts/hub/get_full/{path}', - path: { - path: data.path - } -}); }; - -/** - * get top hub scripts - * @param data The data for the request. - * @param data.limit query limit - * @param data.app query scripts app - * @param data.kind query scripts kind - * @returns unknown hub scripts list - * @throws ApiError - */ -export const getTopHubScripts = (data: GetTopHubScriptsData = {}): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/scripts/hub/top', - query: { - limit: data.limit, - app: data.app, - kind: data.kind - } -}); }; - -/** - * query hub scripts by similarity - * @param data The data for the request. - * @param data.text query text - * @param data.kind query scripts kind - * @param data.limit query limit - * @param data.app query scripts app - * @returns unknown script details - * @throws ApiError - */ -export const queryHubScripts = (data: QueryHubScriptsData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/embeddings/query_hub_scripts', - query: { - text: data.text, - kind: data.kind, - limit: data.limit, - app: data.app - } -}); }; - -/** - * list scripts for search - * @param data The data for the request. - * @param data.workspace - * @returns unknown script list - * @throws ApiError - */ -export const listSearchScript = (data: ListSearchScriptData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/scripts/list_search', - path: { - workspace: data.workspace - } -}); }; - -/** - * list all scripts - * @param data The data for the request. - * @param data.workspace - * @param data.page which page to return (start at 1, default 1) - * @param data.perPage number of items to return for a given page (default 30, max 100) - * @param data.orderDesc order by desc order (default true) - * @param data.createdBy mask to filter exact matching user creator - * @param data.pathStart mask to filter matching starting path - * @param data.pathExact mask to filter exact matching path - * @param data.firstParentHash mask to filter scripts whom first direct parent has exact hash - * @param data.lastParentHash mask to filter scripts whom last parent in the chain has exact hash. - * Beware that each script stores only a limited number of parents. Hence - * the last parent hash for a script is not necessarily its top-most parent. - * To find the top-most parent you will have to jump from last to last hash - * until finding the parent - * - * @param data.parentHash is the hash present in the array of stored parent hashes for this script. - * The same warning applies than for last_parent_hash. A script only store a - * limited number of direct parent - * - * @param data.showArchived (default false) - * show only the archived files. - * when multiple archived hash share the same path, only the ones with the latest create_at - * are - * ed. - * - * @param data.includeWithoutMain (default false) - * include scripts without an exported main function - * - * @param data.includeDraftOnly (default false) - * include scripts that have no deployed version - * - * @param data.isTemplate (default regardless) - * if true show only the templates - * if false show only the non templates - * if not defined, show all regardless of if the script is a template - * - * @param data.kinds (default regardless) - * script kinds to filter, split by comma - * - * @param data.starredOnly (default false) - * show only the starred items - * - * @param data.withDeploymentMsg (default false) - * include deployment message - * - * @returns Script All scripts - * @throws ApiError - */ -export const listScripts = (data: ListScriptsData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/scripts/list', - path: { - workspace: data.workspace - }, - query: { - page: data.page, - per_page: data.perPage, - order_desc: data.orderDesc, - created_by: data.createdBy, - path_start: data.pathStart, - path_exact: data.pathExact, - first_parent_hash: data.firstParentHash, - last_parent_hash: data.lastParentHash, - parent_hash: data.parentHash, - show_archived: data.showArchived, - include_without_main: data.includeWithoutMain, - include_draft_only: data.includeDraftOnly, - is_template: data.isTemplate, - kinds: data.kinds, - starred_only: data.starredOnly, - with_deployment_msg: data.withDeploymentMsg - } -}); }; - -/** - * list all scripts paths - * @param data The data for the request. - * @param data.workspace - * @returns string list of script paths - * @throws ApiError - */ -export const listScriptPaths = (data: ListScriptPathsData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/scripts/list_paths', - path: { - workspace: data.workspace - } -}); }; - -/** - * create draft - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody - * @returns string draft created - * @throws ApiError - */ -export const createDraft = (data: CreateDraftData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/drafts/create', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * delete draft - * @param data The data for the request. - * @param data.workspace - * @param data.kind - * @param data.path - * @returns string draft deleted - * @throws ApiError - */ -export const deleteDraft = (data: DeleteDraftData): CancelablePromise => { return __request(OpenAPI, { - method: 'DELETE', - url: '/w/{workspace}/drafts/delete/{kind}/{path}', - path: { - workspace: data.workspace, - kind: data.kind, - path: data.path - } -}); }; - -/** - * create script - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody Partially filled script - * @returns string script created - * @throws ApiError - */ -export const createScript = (data: CreateScriptData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/scripts/create', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * Toggle ON and OFF the workspace error handler for a given script - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.requestBody Workspace error handler enabled - * @returns string error handler toggled - * @throws ApiError - */ -export const toggleWorkspaceErrorHandlerForScript = (data: ToggleWorkspaceErrorHandlerForScriptData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/scripts/toggle_workspace_error_handler/p/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * get all instance custom tags (tags are used to dispatch jobs to different worker groups) - * @param data The data for the request. - * @param data.workspace - * @param data.showWorkspaceRestriction - * @returns string list of custom tags - * @throws ApiError - */ -export const getCustomTags = (data: GetCustomTagsData = {}): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/workers/custom_tags', - query: { - workspace: data.workspace, - show_workspace_restriction: data.showWorkspaceRestriction - } -}); }; - -/** - * get all instance default tags - * @returns string list of default tags - * @throws ApiError - */ -export const geDefaultTags = (): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/workers/get_default_tags' -}); }; - -/** - * is default tags per workspace - * @returns boolean is the default tags per workspace - * @throws ApiError - */ -export const isDefaultTagsPerWorkspace = (): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/workers/is_default_tags_per_workspace' -}); }; - -/** - * archive script by path - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns string script archived - * @throws ApiError - */ -export const archiveScriptByPath = (data: ArchiveScriptByPathData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/scripts/archive/p/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * archive script by hash - * @param data The data for the request. - * @param data.workspace - * @param data.hash - * @returns Script script details - * @throws ApiError - */ -export const archiveScriptByHash = (data: ArchiveScriptByHashData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/scripts/archive/h/{hash}', - path: { - workspace: data.workspace, - hash: data.hash - } -}); }; - -/** - * delete script by hash (erase content but keep hash, require admin) - * @param data The data for the request. - * @param data.workspace - * @param data.hash - * @returns Script script details - * @throws ApiError - */ -export const deleteScriptByHash = (data: DeleteScriptByHashData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/scripts/delete/h/{hash}', - path: { - workspace: data.workspace, - hash: data.hash - } -}); }; - -/** - * delete script at a given path (require admin) - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.keepCaptures keep captures - * @returns string script path - * @throws ApiError - */ -export const deleteScriptByPath = (data: DeleteScriptByPathData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/scripts/delete/p/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - query: { - keep_captures: data.keepCaptures - } -}); }; - -/** - * get script by path - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.withStarredInfo - * @returns Script script details - * @throws ApiError - */ -export const getScriptByPath = (data: GetScriptByPathData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/scripts/get/p/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - query: { - with_starred_info: data.withStarredInfo - } -}); }; - -/** - * get triggers count of script - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns TriggersCount triggers count - * @throws ApiError - */ -export const getTriggersCountOfScript = (data: GetTriggersCountOfScriptData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/scripts/get_triggers_count/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * get tokens with script scope - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns TruncatedToken tokens list - * @throws ApiError - */ -export const listTokensOfScript = (data: ListTokensOfScriptData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/scripts/list_tokens/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * get script by path with draft - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns NewScriptWithDraft script details - * @throws ApiError - */ -export const getScriptByPathWithDraft = (data: GetScriptByPathWithDraftData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/scripts/get/draft/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * get history of a script by path - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns ScriptHistory script history - * @throws ApiError - */ -export const getScriptHistoryByPath = (data: GetScriptHistoryByPathData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/scripts/history/p/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * list script paths using provided script as a relative import - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns string list of script paths - * @throws ApiError - */ -export const listScriptPathsFromWorkspaceRunnable = (data: ListScriptPathsFromWorkspaceRunnableData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/scripts/list_paths_from_workspace_runnable/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * get scripts's latest version (hash) - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns ScriptHistory Script version/hash - * @throws ApiError - */ -export const getScriptLatestVersion = (data: GetScriptLatestVersionData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/scripts/get_latest_version/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * update history of a script - * @param data The data for the request. - * @param data.workspace - * @param data.hash - * @param data.path - * @param data.requestBody Script deployment message - * @returns string success - * @throws ApiError - */ -export const updateScriptHistory = (data: UpdateScriptHistoryData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/scripts/history_update/h/{hash}/p/{path}', - path: { - workspace: data.workspace, - hash: data.hash, - path: data.path - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * raw script by path - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns string script content - * @throws ApiError - */ -export const rawScriptByPath = (data: RawScriptByPathData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/scripts/raw/p/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * raw script by path with a token (mostly used by lsp to be used with import maps to resolve scripts) - * @param data The data for the request. - * @param data.workspace - * @param data.token - * @param data.path - * @returns string script content - * @throws ApiError - */ -export const rawScriptByPathTokened = (data: RawScriptByPathTokenedData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/scripts_u/tokened_raw/{workspace}/{token}/{path}', - path: { - workspace: data.workspace, - token: data.token, - path: data.path - } -}); }; - -/** - * exists script by path - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns boolean does it exists - * @throws ApiError - */ -export const existsScriptByPath = (data: ExistsScriptByPathData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/scripts/exists/p/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * get script by hash - * @param data The data for the request. - * @param data.workspace - * @param data.hash - * @param data.withStarredInfo - * @returns Script script details - * @throws ApiError - */ -export const getScriptByHash = (data: GetScriptByHashData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/scripts/get/h/{hash}', - path: { - workspace: data.workspace, - hash: data.hash - }, - query: { - with_starred_info: data.withStarredInfo - } -}); }; - -/** - * raw script by hash - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns string script content - * @throws ApiError - */ -export const rawScriptByHash = (data: RawScriptByHashData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/scripts/raw/h/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * get script deployment status - * @param data The data for the request. - * @param data.workspace - * @param data.hash - * @returns unknown script details - * @throws ApiError - */ -export const getScriptDeploymentStatus = (data: GetScriptDeploymentStatusData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/scripts/deployment_status/h/{hash}', - path: { - workspace: data.workspace, - hash: data.hash - } -}); }; - -/** - * run script by path - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.requestBody script args - * @param data.scheduledFor when to schedule this job (leave empty for immediate run) - * @param data.scheduledInSecs schedule the script to execute in the number of seconds starting now - * @param data.skipPreprocessor skip the preprocessor - * @param data.parentJob The parent job that is at the origin and responsible for the execution of this script if any - * @param data.tag Override the tag to use - * @param data.cacheTtl Override the cache time to live (in seconds). Can not be used to disable caching, only override with a new cache ttl - * @param data.jobId The job id to assign to the created job. if missing, job is chosen randomly using the ULID scheme. If a job id already exists in the queue or as a completed job, the request to create one will fail (Bad Request) - * @param data.invisibleToOwner make the run invisible to the the script owner (default false) - * @returns string job created - * @throws ApiError - */ -export const runScriptByPath = (data: RunScriptByPathData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/jobs/run/p/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - query: { - scheduled_for: data.scheduledFor, - scheduled_in_secs: data.scheduledInSecs, - skip_preprocessor: data.skipPreprocessor, - parent_job: data.parentJob, - tag: data.tag, - cache_ttl: data.cacheTtl, - job_id: data.jobId, - invisible_to_owner: data.invisibleToOwner - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * run script by path in openai format - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.requestBody script args - * @param data.parentJob The parent job that is at the origin and responsible for the execution of this script if any - * @param data.jobId The job id to assign to the created job. if missing, job is chosen randomly using the ULID scheme. If a job id already exists in the queue or as a completed job, the request to create one will fail (Bad Request) - * @param data.includeHeader List of headers's keys (separated with ',') whove value are added to the args - * Header's key lowercased and '-'' replaced to '_' such that 'Content-Type' becomes the 'content_type' arg key - * - * @param data.queueLimit The maximum size of the queue for which the request would get rejected if that job would push it above that limit - * - * @returns unknown job result - * @throws ApiError - */ -export const openaiSyncScriptByPath = (data: OpenaiSyncScriptByPathData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/jobs/openai_sync/p/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - query: { - parent_job: data.parentJob, - job_id: data.jobId, - include_header: data.includeHeader, - queue_limit: data.queueLimit - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * run script by path - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.requestBody script args - * @param data.parentJob The parent job that is at the origin and responsible for the execution of this script if any - * @param data.tag Override the tag to use - * @param data.cacheTtl Override the cache time to live (in seconds). Can not be used to disable caching, only override with a new cache ttl - * @param data.jobId The job id to assign to the created job. if missing, job is chosen randomly using the ULID scheme. If a job id already exists in the queue or as a completed job, the request to create one will fail (Bad Request) - * @param data.includeHeader List of headers's keys (separated with ',') whove value are added to the args - * Header's key lowercased and '-'' replaced to '_' such that 'Content-Type' becomes the 'content_type' arg key - * - * @param data.queueLimit The maximum size of the queue for which the request would get rejected if that job would push it above that limit - * - * @returns unknown job result - * @throws ApiError - */ -export const runWaitResultScriptByPath = (data: RunWaitResultScriptByPathData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/jobs/run_wait_result/p/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - query: { - parent_job: data.parentJob, - tag: data.tag, - cache_ttl: data.cacheTtl, - job_id: data.jobId, - include_header: data.includeHeader, - queue_limit: data.queueLimit - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * run script by path with get - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.parentJob The parent job that is at the origin and responsible for the execution of this script if any - * @param data.tag Override the tag to use - * @param data.cacheTtl Override the cache time to live (in seconds). Can not be used to disable caching, only override with a new cache ttl - * @param data.jobId The job id to assign to the created job. if missing, job is chosen randomly using the ULID scheme. If a job id already exists in the queue or as a completed job, the request to create one will fail (Bad Request) - * @param data.includeHeader List of headers's keys (separated with ',') whove value are added to the args - * Header's key lowercased and '-'' replaced to '_' such that 'Content-Type' becomes the 'content_type' arg key - * - * @param data.queueLimit The maximum size of the queue for which the request would get rejected if that job would push it above that limit - * - * @param data.payload The base64 encoded payload that has been encoded as a JSON. e.g how to encode such payload encodeURIComponent - * `encodeURIComponent(btoa(JSON.stringify({a: 2})))` - * - * @returns unknown job result - * @throws ApiError - */ -export const runWaitResultScriptByPathGet = (data: RunWaitResultScriptByPathGetData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/jobs/run_wait_result/p/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - query: { - parent_job: data.parentJob, - tag: data.tag, - cache_ttl: data.cacheTtl, - job_id: data.jobId, - include_header: data.includeHeader, - queue_limit: data.queueLimit, - payload: data.payload - } -}); }; - -/** - * run flow by path and wait until completion in openai format - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.requestBody script args - * @param data.includeHeader List of headers's keys (separated with ',') whove value are added to the args - * Header's key lowercased and '-'' replaced to '_' such that 'Content-Type' becomes the 'content_type' arg key - * - * @param data.queueLimit The maximum size of the queue for which the request would get rejected if that job would push it above that limit - * - * @param data.jobId The job id to assign to the created job. if missing, job is chosen randomly using the ULID scheme. If a job id already exists in the queue or as a completed job, the request to create one will fail (Bad Request) - * @returns unknown job result - * @throws ApiError - */ -export const openaiSyncFlowByPath = (data: OpenaiSyncFlowByPathData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/jobs/openai_sync/f/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - query: { - include_header: data.includeHeader, - queue_limit: data.queueLimit, - job_id: data.jobId - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * run flow by path and wait until completion - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.requestBody script args - * @param data.includeHeader List of headers's keys (separated with ',') whove value are added to the args - * Header's key lowercased and '-'' replaced to '_' such that 'Content-Type' becomes the 'content_type' arg key - * - * @param data.queueLimit The maximum size of the queue for which the request would get rejected if that job would push it above that limit - * - * @param data.jobId The job id to assign to the created job. if missing, job is chosen randomly using the ULID scheme. If a job id already exists in the queue or as a completed job, the request to create one will fail (Bad Request) - * @returns unknown job result - * @throws ApiError - */ -export const runWaitResultFlowByPath = (data: RunWaitResultFlowByPathData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/jobs/run_wait_result/f/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - query: { - include_header: data.includeHeader, - queue_limit: data.queueLimit, - job_id: data.jobId - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * get job result by id - * @param data The data for the request. - * @param data.workspace - * @param data.flowJobId - * @param data.nodeId - * @returns unknown job result - * @throws ApiError - */ -export const resultById = (data: ResultByIdData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/jobs/result_by_id/{flow_job_id}/{node_id}', - path: { - workspace: data.workspace, - flow_job_id: data.flowJobId, - node_id: data.nodeId - } -}); }; - -/** - * list all flow paths - * @param data The data for the request. - * @param data.workspace - * @returns string list of flow paths - * @throws ApiError - */ -export const listFlowPaths = (data: ListFlowPathsData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/flows/list_paths', - path: { - workspace: data.workspace - } -}); }; - -/** - * list flows for search - * @param data The data for the request. - * @param data.workspace - * @returns unknown flow list - * @throws ApiError - */ -export const listSearchFlow = (data: ListSearchFlowData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/flows/list_search', - path: { - workspace: data.workspace - } -}); }; - -/** - * list all flows - * @param data The data for the request. - * @param data.workspace - * @param data.page which page to return (start at 1, default 1) - * @param data.perPage number of items to return for a given page (default 30, max 100) - * @param data.orderDesc order by desc order (default true) - * @param data.createdBy mask to filter exact matching user creator - * @param data.pathStart mask to filter matching starting path - * @param data.pathExact mask to filter exact matching path - * @param data.showArchived (default false) - * show only the archived files. - * when multiple archived hash share the same path, only the ones with the latest create_at - * are displayed. - * - * @param data.starredOnly (default false) - * show only the starred items - * - * @param data.includeDraftOnly (default false) - * include items that have no deployed version - * - * @param data.withDeploymentMsg (default false) - * include deployment message - * - * @returns unknown All flow - * @throws ApiError - */ -export const listFlows = (data: ListFlowsData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/flows/list', - path: { - workspace: data.workspace - }, - query: { - page: data.page, - per_page: data.perPage, - order_desc: data.orderDesc, - created_by: data.createdBy, - path_start: data.pathStart, - path_exact: data.pathExact, - show_archived: data.showArchived, - starred_only: data.starredOnly, - include_draft_only: data.includeDraftOnly, - with_deployment_msg: data.withDeploymentMsg - } -}); }; - -/** - * get flow history by path - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns FlowVersion Flow history - * @throws ApiError - */ -export const getFlowHistory = (data: GetFlowHistoryData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/flows/history/p/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * get flow's latest version - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns FlowVersion Flow version - * @throws ApiError - */ -export const getFlowLatestVersion = (data: GetFlowLatestVersionData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/flows/get_latest_version/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * list flow paths from workspace runnable - * @param data The data for the request. - * @param data.workspace - * @param data.runnableKind - * @param data.path - * @returns string list of flow paths - * @throws ApiError - */ -export const listFlowPathsFromWorkspaceRunnable = (data: ListFlowPathsFromWorkspaceRunnableData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/flows/list_paths_from_workspace_runnable/{runnable_kind}/{path}', - path: { - workspace: data.workspace, - runnable_kind: data.runnableKind, - path: data.path - } -}); }; - -/** - * get flow version - * @param data The data for the request. - * @param data.workspace - * @param data.version - * @param data.path - * @returns Flow flow details - * @throws ApiError - */ -export const getFlowVersion = (data: GetFlowVersionData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/flows/get/v/{version}/p/{path}', - path: { - workspace: data.workspace, - version: data.version, - path: data.path - } -}); }; - -/** - * update flow history - * @param data The data for the request. - * @param data.workspace - * @param data.version - * @param data.path - * @param data.requestBody Flow deployment message - * @returns string success - * @throws ApiError - */ -export const updateFlowHistory = (data: UpdateFlowHistoryData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/flows/history_update/v/{version}/p/{path}', - path: { - workspace: data.workspace, - version: data.version, - path: data.path - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * get flow by path - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.withStarredInfo - * @returns Flow flow details - * @throws ApiError - */ -export const getFlowByPath = (data: GetFlowByPathData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/flows/get/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - query: { - with_starred_info: data.withStarredInfo - } -}); }; - -/** - * get flow deployment status - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns unknown flow status - * @throws ApiError - */ -export const getFlowDeploymentStatus = (data: GetFlowDeploymentStatusData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/flows/deployment_status/p/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * get triggers count of flow - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns TriggersCount triggers count - * @throws ApiError - */ -export const getTriggersCountOfFlow = (data: GetTriggersCountOfFlowData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/flows/get_triggers_count/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * get tokens with flow scope - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns TruncatedToken tokens list - * @throws ApiError - */ -export const listTokensOfFlow = (data: ListTokensOfFlowData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/flows/list_tokens/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * Toggle ON and OFF the workspace error handler for a given flow - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.requestBody Workspace error handler enabled - * @returns string error handler toggled - * @throws ApiError - */ -export const toggleWorkspaceErrorHandlerForFlow = (data: ToggleWorkspaceErrorHandlerForFlowData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/flows/toggle_workspace_error_handler/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * get flow by path with draft - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns unknown flow details with draft - * @throws ApiError - */ -export const getFlowByPathWithDraft = (data: GetFlowByPathWithDraftData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/flows/get/draft/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * exists flow by path - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns boolean flow details - * @throws ApiError - */ -export const existsFlowByPath = (data: ExistsFlowByPathData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/flows/exists/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * create flow - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody Partially filled flow - * @returns string flow created - * @throws ApiError - */ -export const createFlow = (data: CreateFlowData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/flows/create', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * update flow - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.requestBody Partially filled flow - * @returns string flow updated - * @throws ApiError - */ -export const updateFlow = (data: UpdateFlowData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/flows/update/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * archive flow by path - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.requestBody archiveFlow - * @returns string flow archived - * @throws ApiError - */ -export const archiveFlowByPath = (data: ArchiveFlowByPathData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/flows/archive/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * delete flow by path - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.keepCaptures keep captures - * @returns string flow delete - * @throws ApiError - */ -export const deleteFlowByPath = (data: DeleteFlowByPathData): CancelablePromise => { return __request(OpenAPI, { - method: 'DELETE', - url: '/w/{workspace}/flows/delete/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - query: { - keep_captures: data.keepCaptures - } -}); }; - -/** - * list all raw apps - * @param data The data for the request. - * @param data.workspace - * @param data.page which page to return (start at 1, default 1) - * @param data.perPage number of items to return for a given page (default 30, max 100) - * @param data.orderDesc order by desc order (default true) - * @param data.createdBy mask to filter exact matching user creator - * @param data.pathStart mask to filter matching starting path - * @param data.pathExact mask to filter exact matching path - * @param data.starredOnly (default false) - * show only the starred items - * - * @returns ListableRawApp All raw apps - * @throws ApiError - */ -export const listRawApps = (data: ListRawAppsData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/raw_apps/list', - path: { - workspace: data.workspace - }, - query: { - page: data.page, - per_page: data.perPage, - order_desc: data.orderDesc, - created_by: data.createdBy, - path_start: data.pathStart, - path_exact: data.pathExact, - starred_only: data.starredOnly - } -}); }; - -/** - * does an app exisst at path - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns boolean app exists - * @throws ApiError - */ -export const existsRawApp = (data: ExistsRawAppData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/raw_apps/exists/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * get app by path - * @param data The data for the request. - * @param data.workspace - * @param data.version - * @param data.path - * @returns string app details - * @throws ApiError - */ -export const getRawAppData = (data: GetRawAppDataData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/apps/get_data/{version}/{path}', - path: { - workspace: data.workspace, - version: data.version, - path: data.path - } -}); }; - -/** - * list apps for search - * @param data The data for the request. - * @param data.workspace - * @returns unknown app list - * @throws ApiError - */ -export const listSearchApp = (data: ListSearchAppData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/apps/list_search', - path: { - workspace: data.workspace - } -}); }; - -/** - * list all apps - * @param data The data for the request. - * @param data.workspace - * @param data.page which page to return (start at 1, default 1) - * @param data.perPage number of items to return for a given page (default 30, max 100) - * @param data.orderDesc order by desc order (default true) - * @param data.createdBy mask to filter exact matching user creator - * @param data.pathStart mask to filter matching starting path - * @param data.pathExact mask to filter exact matching path - * @param data.starredOnly (default false) - * show only the starred items - * - * @param data.includeDraftOnly (default false) - * include items that have no deployed version - * - * @param data.withDeploymentMsg (default false) - * include deployment message - * - * @returns ListableApp All apps - * @throws ApiError - */ -export const listApps = (data: ListAppsData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/apps/list', - path: { - workspace: data.workspace - }, - query: { - page: data.page, - per_page: data.perPage, - order_desc: data.orderDesc, - created_by: data.createdBy, - path_start: data.pathStart, - path_exact: data.pathExact, - starred_only: data.starredOnly, - include_draft_only: data.includeDraftOnly, - with_deployment_msg: data.withDeploymentMsg - } -}); }; - -/** - * create app - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody new app - * @returns string app created - * @throws ApiError - */ -export const createApp = (data: CreateAppData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/apps/create', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * does an app exisst at path - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns boolean app exists - * @throws ApiError - */ -export const existsApp = (data: ExistsAppData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/apps/exists/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * get app by path - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.withStarredInfo - * @returns AppWithLastVersion app details - * @throws ApiError - */ -export const getAppByPath = (data: GetAppByPathData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/apps/get/p/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - query: { - with_starred_info: data.withStarredInfo - } -}); }; - -/** - * get app lite by path - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns AppWithLastVersion app lite details - * @throws ApiError - */ -export const getAppLiteByPath = (data: GetAppLiteByPathData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/apps/get/lite/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * get app by path with draft - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns AppWithLastVersionWDraft app details with draft - * @throws ApiError - */ -export const getAppByPathWithDraft = (data: GetAppByPathWithDraftData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/apps/get/draft/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * get app history by path - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns AppHistory app history - * @throws ApiError - */ -export const getAppHistoryByPath = (data: GetAppHistoryByPathData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/apps/history/p/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * get apps's latest version - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns AppHistory App version - * @throws ApiError - */ -export const getAppLatestVersion = (data: GetAppLatestVersionData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/apps/get_latest_version/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * list app paths from workspace runnable - * @param data The data for the request. - * @param data.workspace - * @param data.runnableKind - * @param data.path - * @returns string list of app paths - * @throws ApiError - */ -export const listAppPathsFromWorkspaceRunnable = (data: ListAppPathsFromWorkspaceRunnableData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/apps/list_paths_from_workspace_runnable/{runnable_kind}/{path}', - path: { - workspace: data.workspace, - runnable_kind: data.runnableKind, - path: data.path - } -}); }; - -/** - * update app history - * @param data The data for the request. - * @param data.workspace - * @param data.id - * @param data.version - * @param data.requestBody App deployment message - * @returns string success - * @throws ApiError - */ -export const updateAppHistory = (data: UpdateAppHistoryData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/apps/history_update/a/{id}/v/{version}', - path: { - workspace: data.workspace, - id: data.id, - version: data.version - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * get public app by secret - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns AppWithLastVersion app details - * @throws ApiError - */ -export const getPublicAppBySecret = (data: GetPublicAppBySecretData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/apps_u/public_app/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * get public resource - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns unknown resource value - * @throws ApiError - */ -export const getPublicResource = (data: GetPublicResourceData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/apps_u/public_resource/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * get public secret of app - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns string app secret - * @throws ApiError - */ -export const getPublicSecretOfApp = (data: GetPublicSecretOfAppData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/apps/secret_of/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * get app by version - * @param data The data for the request. - * @param data.workspace - * @param data.id - * @returns AppWithLastVersion app details - * @throws ApiError - */ -export const getAppByVersion = (data: GetAppByVersionData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/apps/get/v/{id}', - path: { - workspace: data.workspace, - id: data.id - } -}); }; - -/** - * create raw app - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody new raw app - * @returns string raw app created - * @throws ApiError - */ -export const createRawApp = (data: CreateRawAppData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/raw_apps/create', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * update app - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.requestBody updateraw app - * @returns string app updated - * @throws ApiError - */ -export const updateRawApp = (data: UpdateRawAppData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/raw_apps/update/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * delete raw app - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns string app deleted - * @throws ApiError - */ -export const deleteRawApp = (data: DeleteRawAppData): CancelablePromise => { return __request(OpenAPI, { - method: 'DELETE', - url: '/w/{workspace}/raw_apps/delete/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * delete app - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns string app deleted - * @throws ApiError - */ -export const deleteApp = (data: DeleteAppData): CancelablePromise => { return __request(OpenAPI, { - method: 'DELETE', - url: '/w/{workspace}/apps/delete/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * update app - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.requestBody update app - * @returns string app updated - * @throws ApiError - */ -export const updateApp = (data: UpdateAppData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/apps/update/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * check if custom path exists - * @param data The data for the request. - * @param data.workspace - * @param data.customPath - * @returns boolean custom path exists - * @throws ApiError - */ -export const customPathExists = (data: CustomPathExistsData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/apps/custom_path_exists/{custom_path}', - path: { - workspace: data.workspace, - custom_path: data.customPath - } -}); }; - -/** - * executeComponent - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.requestBody update app - * @returns string job uuid - * @throws ApiError - */ -export const executeComponent = (data: ExecuteComponentData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/apps_u/execute_component/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * upload s3 file from app - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.requestBody File content - * @param data.fileKey - * @param data.fileExtension - * @param data.s3ResourcePath - * @param data.resourceType - * @param data.storage - * @param data.contentType - * @param data.contentDisposition - * @returns unknown file uploaded - * @throws ApiError - */ -export const uploadS3FileFromApp = (data: UploadS3FileFromAppData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/apps_u/upload_s3_file/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - query: { - file_key: data.fileKey, - file_extension: data.fileExtension, - s3_resource_path: data.s3ResourcePath, - resource_type: data.resourceType, - storage: data.storage, - content_type: data.contentType, - content_disposition: data.contentDisposition - }, - body: data.requestBody, - mediaType: 'application/octet-stream' -}); }; - -/** - * delete s3 file from app - * @param data The data for the request. - * @param data.workspace - * @param data.deleteToken - * @returns string file deleted - * @throws ApiError - */ -export const deleteS3FileFromApp = (data: DeleteS3FileFromAppData): CancelablePromise => { return __request(OpenAPI, { - method: 'DELETE', - url: '/w/{workspace}/apps_u/delete_s3_file', - path: { - workspace: data.workspace - }, - query: { - delete_token: data.deleteToken - } -}); }; - -/** - * run flow by path - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.requestBody flow args - * @param data.scheduledFor when to schedule this job (leave empty for immediate run) - * @param data.scheduledInSecs schedule the script to execute in the number of seconds starting now - * @param data.skipPreprocessor skip the preprocessor - * @param data.parentJob The parent job that is at the origin and responsible for the execution of this script if any - * @param data.tag Override the tag to use - * @param data.jobId The job id to assign to the created job. if missing, job is chosen randomly using the ULID scheme. If a job id already exists in the queue or as a completed job, the request to create one will fail (Bad Request) - * @param data.includeHeader List of headers's keys (separated with ',') whove value are added to the args - * Header's key lowercased and '-'' replaced to '_' such that 'Content-Type' becomes the 'content_type' arg key - * - * @param data.invisibleToOwner make the run invisible to the the flow owner (default false) - * @returns string job created - * @throws ApiError - */ -export const runFlowByPath = (data: RunFlowByPathData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/jobs/run/f/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - query: { - scheduled_for: data.scheduledFor, - scheduled_in_secs: data.scheduledInSecs, - skip_preprocessor: data.skipPreprocessor, - parent_job: data.parentJob, - tag: data.tag, - job_id: data.jobId, - include_header: data.includeHeader, - invisible_to_owner: data.invisibleToOwner - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * restart a completed flow at a given step - * @param data The data for the request. - * @param data.workspace - * @param data.id - * @param data.stepId step id to restart the flow from - * @param data.branchOrIterationN for branchall or loop, the iteration at which the flow should restart - * @param data.requestBody flow args - * @param data.scheduledFor when to schedule this job (leave empty for immediate run) - * @param data.scheduledInSecs schedule the script to execute in the number of seconds starting now - * @param data.parentJob The parent job that is at the origin and responsible for the execution of this script if any - * @param data.tag Override the tag to use - * @param data.jobId The job id to assign to the created job. if missing, job is chosen randomly using the ULID scheme. If a job id already exists in the queue or as a completed job, the request to create one will fail (Bad Request) - * @param data.includeHeader List of headers's keys (separated with ',') whove value are added to the args - * Header's key lowercased and '-'' replaced to '_' such that 'Content-Type' becomes the 'content_type' arg key - * - * @param data.invisibleToOwner make the run invisible to the the flow owner (default false) - * @returns string job created - * @throws ApiError - */ -export const restartFlowAtStep = (data: RestartFlowAtStepData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/jobs/restart/f/{id}/from/{step_id}/{branch_or_iteration_n}', - path: { - workspace: data.workspace, - id: data.id, - step_id: data.stepId, - branch_or_iteration_n: data.branchOrIterationN - }, - query: { - scheduled_for: data.scheduledFor, - scheduled_in_secs: data.scheduledInSecs, - parent_job: data.parentJob, - tag: data.tag, - job_id: data.jobId, - include_header: data.includeHeader, - invisible_to_owner: data.invisibleToOwner - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * run script by hash - * @param data The data for the request. - * @param data.workspace - * @param data.hash - * @param data.requestBody Partially filled args - * @param data.scheduledFor when to schedule this job (leave empty for immediate run) - * @param data.scheduledInSecs schedule the script to execute in the number of seconds starting now - * @param data.skipPreprocessor skip the preprocessor - * @param data.parentJob The parent job that is at the origin and responsible for the execution of this script if any - * @param data.tag Override the tag to use - * @param data.cacheTtl Override the cache time to live (in seconds). Can not be used to disable caching, only override with a new cache ttl - * @param data.jobId The job id to assign to the created job. if missing, job is chosen randomly using the ULID scheme. If a job id already exists in the queue or as a completed job, the request to create one will fail (Bad Request) - * @param data.includeHeader List of headers's keys (separated with ',') whove value are added to the args - * Header's key lowercased and '-'' replaced to '_' such that 'Content-Type' becomes the 'content_type' arg key - * - * @param data.invisibleToOwner make the run invisible to the the script owner (default false) - * @returns string job created - * @throws ApiError - */ -export const runScriptByHash = (data: RunScriptByHashData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/jobs/run/h/{hash}', - path: { - workspace: data.workspace, - hash: data.hash - }, - query: { - scheduled_for: data.scheduledFor, - scheduled_in_secs: data.scheduledInSecs, - skip_preprocessor: data.skipPreprocessor, - parent_job: data.parentJob, - tag: data.tag, - cache_ttl: data.cacheTtl, - job_id: data.jobId, - include_header: data.includeHeader, - invisible_to_owner: data.invisibleToOwner - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * run script preview - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody preview - * @param data.includeHeader List of headers's keys (separated with ',') whove value are added to the args - * Header's key lowercased and '-'' replaced to '_' such that 'Content-Type' becomes the 'content_type' arg key - * - * @param data.invisibleToOwner make the run invisible to the the script owner (default false) - * @param data.jobId The job id to assign to the created job. if missing, job is chosen randomly using the ULID scheme. If a job id already exists in the queue or as a completed job, the request to create one will fail (Bad Request) - * @returns string job created - * @throws ApiError - */ -export const runScriptPreview = (data: RunScriptPreviewData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/jobs/run/preview', - path: { - workspace: data.workspace - }, - query: { - include_header: data.includeHeader, - invisible_to_owner: data.invisibleToOwner, - job_id: data.jobId - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * run code-workflow task - * @param data The data for the request. - * @param data.workspace - * @param data.jobId - * @param data.entrypoint - * @param data.requestBody preview - * @returns string job created - * @throws ApiError - */ -export const runCodeWorkflowTask = (data: RunCodeWorkflowTaskData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/jobs/workflow_as_code/{job_id}/{entrypoint}', - path: { - workspace: data.workspace, - job_id: data.jobId, - entrypoint: data.entrypoint - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * run a one-off dependencies job - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody raw script content - * @returns unknown dependency job result - * @throws ApiError - */ -export const runRawScriptDependencies = (data: RunRawScriptDependenciesData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/jobs/run/dependencies', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * run flow preview - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody preview - * @param data.includeHeader List of headers's keys (separated with ',') whove value are added to the args - * Header's key lowercased and '-'' replaced to '_' such that 'Content-Type' becomes the 'content_type' arg key - * - * @param data.invisibleToOwner make the run invisible to the the script owner (default false) - * @param data.jobId The job id to assign to the created job. if missing, job is chosen randomly using the ULID scheme. If a job id already exists in the queue or as a completed job, the request to create one will fail (Bad Request) - * @returns string job created - * @throws ApiError - */ -export const runFlowPreview = (data: RunFlowPreviewData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/jobs/run/preview_flow', - path: { - workspace: data.workspace - }, - query: { - include_header: data.includeHeader, - invisible_to_owner: data.invisibleToOwner, - job_id: data.jobId - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * list all queued jobs - * @param data The data for the request. - * @param data.workspace - * @param data.orderDesc order by desc order (default true) - * @param data.createdBy mask to filter exact matching user creator - * @param data.parentJob The parent job that is at the origin and responsible for the execution of this script if any - * @param data.worker worker this job was ran on - * @param data.scriptPathExact mask to filter exact matching path - * @param data.scriptPathStart mask to filter matching starting path - * @param data.schedulePath mask to filter by schedule path - * @param data.scriptHash mask to filter exact matching path - * @param data.startedBefore filter on started before (inclusive) timestamp - * @param data.startedAfter filter on started after (exclusive) timestamp - * @param data.success filter on successful jobs - * @param data.scheduledForBeforeNow filter on jobs scheduled_for before now (hence waitinf for a worker) - * @param data.jobKinds filter on job kind (values 'preview', 'script', 'dependencies', 'flow') separated by, - * @param data.suspended filter on suspended jobs - * @param data.running filter on running jobs - * @param data.args filter on jobs containing those args as a json subset (@> in postgres) - * @param data.result filter on jobs containing those result as a json subset (@> in postgres) - * @param data.allowWildcards allow wildcards (*) in the filter of label, tag, worker - * @param data.tag filter on jobs with a given tag/worker group - * @param data.page which page to return (start at 1, default 1) - * @param data.perPage number of items to return for a given page (default 30, max 100) - * @param data.allWorkspaces get jobs from all workspaces (only valid if request come from the `admins` workspace) - * @param data.isNotSchedule is not a scheduled job - * @returns QueuedJob All queued jobs - * @throws ApiError - */ -export const listQueue = (data: ListQueueData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/jobs/queue/list', - path: { - workspace: data.workspace - }, - query: { - order_desc: data.orderDesc, - created_by: data.createdBy, - parent_job: data.parentJob, - worker: data.worker, - script_path_exact: data.scriptPathExact, - script_path_start: data.scriptPathStart, - schedule_path: data.schedulePath, - script_hash: data.scriptHash, - started_before: data.startedBefore, - started_after: data.startedAfter, - success: data.success, - scheduled_for_before_now: data.scheduledForBeforeNow, - job_kinds: data.jobKinds, - suspended: data.suspended, - running: data.running, - args: data.args, - result: data.result, - allow_wildcards: data.allowWildcards, - tag: data.tag, - page: data.page, - per_page: data.perPage, - all_workspaces: data.allWorkspaces, - is_not_schedule: data.isNotSchedule - } -}); }; - -/** - * get queue count - * @param data The data for the request. - * @param data.workspace - * @param data.allWorkspaces get jobs from all workspaces (only valid if request come from the `admins` workspace) - * @returns unknown queue count - * @throws ApiError - */ -export const getQueueCount = (data: GetQueueCountData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/jobs/queue/count', - path: { - workspace: data.workspace - }, - query: { - all_workspaces: data.allWorkspaces - } -}); }; - -/** - * get completed count - * @param data The data for the request. - * @param data.workspace - * @returns unknown completed count - * @throws ApiError - */ -export const getCompletedCount = (data: GetCompletedCountData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/jobs/completed/count', - path: { - workspace: data.workspace - } -}); }; - -/** - * count number of completed jobs with filter - * @param data The data for the request. - * @param data.workspace - * @param data.completedAfterSAgo - * @param data.success - * @param data.tags - * @param data.allWorkspaces - * @returns number Count of completed jobs - * @throws ApiError - */ -export const countCompletedJobs = (data: CountCompletedJobsData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/jobs/completed/count_jobs', - path: { - workspace: data.workspace - }, - query: { - completed_after_s_ago: data.completedAfterSAgo, - success: data.success, - tags: data.tags, - all_workspaces: data.allWorkspaces - } -}); }; - -/** - * get the ids of all jobs matching the given filters - * @param data The data for the request. - * @param data.workspace - * @param data.orderDesc order by desc order (default true) - * @param data.createdBy mask to filter exact matching user creator - * @param data.parentJob The parent job that is at the origin and responsible for the execution of this script if any - * @param data.scriptPathExact mask to filter exact matching path - * @param data.scriptPathStart mask to filter matching starting path - * @param data.schedulePath mask to filter by schedule path - * @param data.scriptHash mask to filter exact matching path - * @param data.startedBefore filter on started before (inclusive) timestamp - * @param data.startedAfter filter on started after (exclusive) timestamp - * @param data.success filter on successful jobs - * @param data.scheduledForBeforeNow filter on jobs scheduled_for before now (hence waitinf for a worker) - * @param data.jobKinds filter on job kind (values 'preview', 'script', 'dependencies', 'flow') separated by, - * @param data.suspended filter on suspended jobs - * @param data.running filter on running jobs - * @param data.args filter on jobs containing those args as a json subset (@> in postgres) - * @param data.result filter on jobs containing those result as a json subset (@> in postgres) - * @param data.allowWildcards allow wildcards (*) in the filter of label, tag, worker - * @param data.tag filter on jobs with a given tag/worker group - * @param data.page which page to return (start at 1, default 1) - * @param data.perPage number of items to return for a given page (default 30, max 100) - * @param data.concurrencyKey - * @param data.allWorkspaces get jobs from all workspaces (only valid if request come from the `admins` workspace) - * @param data.isNotSchedule is not a scheduled job - * @returns string uuids of jobs - * @throws ApiError - */ -export const listFilteredUuids = (data: ListFilteredUuidsData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/jobs/queue/list_filtered_uuids', - path: { - workspace: data.workspace - }, - query: { - order_desc: data.orderDesc, - created_by: data.createdBy, - parent_job: data.parentJob, - script_path_exact: data.scriptPathExact, - script_path_start: data.scriptPathStart, - schedule_path: data.schedulePath, - script_hash: data.scriptHash, - started_before: data.startedBefore, - started_after: data.startedAfter, - success: data.success, - scheduled_for_before_now: data.scheduledForBeforeNow, - job_kinds: data.jobKinds, - suspended: data.suspended, - running: data.running, - args: data.args, - result: data.result, - allow_wildcards: data.allowWildcards, - tag: data.tag, - page: data.page, - per_page: data.perPage, - concurrency_key: data.concurrencyKey, - all_workspaces: data.allWorkspaces, - is_not_schedule: data.isNotSchedule - } -}); }; - -/** - * cancel jobs based on the given uuids - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody uuids of the jobs to cancel - * @returns string uuids of canceled jobs - * @throws ApiError - */ -export const cancelSelection = (data: CancelSelectionData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/jobs/queue/cancel_selection', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * list all completed jobs - * @param data The data for the request. - * @param data.workspace - * @param data.orderDesc order by desc order (default true) - * @param data.createdBy mask to filter exact matching user creator - * @param data.label mask to filter exact matching job's label (job labels are completed jobs with as a result an object containing a string in the array at key 'wm_labels') - * @param data.worker worker this job was ran on - * @param data.parentJob The parent job that is at the origin and responsible for the execution of this script if any - * @param data.scriptPathExact mask to filter exact matching path - * @param data.scriptPathStart mask to filter matching starting path - * @param data.schedulePath mask to filter by schedule path - * @param data.scriptHash mask to filter exact matching path - * @param data.startedBefore filter on started before (inclusive) timestamp - * @param data.startedAfter filter on started after (exclusive) timestamp - * @param data.success filter on successful jobs - * @param data.jobKinds filter on job kind (values 'preview', 'script', 'dependencies', 'flow') separated by, - * @param data.args filter on jobs containing those args as a json subset (@> in postgres) - * @param data.result filter on jobs containing those result as a json subset (@> in postgres) - * @param data.allowWildcards allow wildcards (*) in the filter of label, tag, worker - * @param data.tag filter on jobs with a given tag/worker group - * @param data.page which page to return (start at 1, default 1) - * @param data.perPage number of items to return for a given page (default 30, max 100) - * @param data.isSkipped is the job skipped - * @param data.isFlowStep is the job a flow step - * @param data.hasNullParent has null parent - * @param data.isNotSchedule is not a scheduled job - * @returns CompletedJob All completed jobs - * @throws ApiError - */ -export const listCompletedJobs = (data: ListCompletedJobsData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/jobs/completed/list', - path: { - workspace: data.workspace - }, - query: { - order_desc: data.orderDesc, - created_by: data.createdBy, - label: data.label, - worker: data.worker, - parent_job: data.parentJob, - script_path_exact: data.scriptPathExact, - script_path_start: data.scriptPathStart, - schedule_path: data.schedulePath, - script_hash: data.scriptHash, - started_before: data.startedBefore, - started_after: data.startedAfter, - success: data.success, - job_kinds: data.jobKinds, - args: data.args, - result: data.result, - allow_wildcards: data.allowWildcards, - tag: data.tag, - page: data.page, - per_page: data.perPage, - is_skipped: data.isSkipped, - is_flow_step: data.isFlowStep, - has_null_parent: data.hasNullParent, - is_not_schedule: data.isNotSchedule - } -}); }; - -/** - * list all jobs - * @param data The data for the request. - * @param data.workspace - * @param data.createdBy mask to filter exact matching user creator - * @param data.label mask to filter exact matching job's label (job labels are completed jobs with as a result an object containing a string in the array at key 'wm_labels') - * @param data.worker worker this job was ran on - * @param data.parentJob The parent job that is at the origin and responsible for the execution of this script if any - * @param data.scriptPathExact mask to filter exact matching path - * @param data.scriptPathStart mask to filter matching starting path - * @param data.schedulePath mask to filter by schedule path - * @param data.scriptHash mask to filter exact matching path - * @param data.startedBefore filter on started before (inclusive) timestamp - * @param data.startedAfter filter on started after (exclusive) timestamp - * @param data.createdBefore filter on created before (inclusive) timestamp - * @param data.createdAfter filter on created after (exclusive) timestamp - * @param data.createdOrStartedBefore filter on created_at for non non started job and started_at otherwise before (inclusive) timestamp - * @param data.running filter on running jobs - * @param data.scheduledForBeforeNow filter on jobs scheduled_for before now (hence waitinf for a worker) - * @param data.createdOrStartedAfter filter on created_at for non non started job and started_at otherwise after (exclusive) timestamp - * @param data.createdOrStartedAfterCompletedJobs filter on created_at for non non started job and started_at otherwise after (exclusive) timestamp but only for the completed jobs - * @param data.jobKinds filter on job kind (values 'preview', 'script', 'dependencies', 'flow') separated by, - * @param data.suspended filter on suspended jobs - * @param data.args filter on jobs containing those args as a json subset (@> in postgres) - * @param data.tag filter on jobs with a given tag/worker group - * @param data.result filter on jobs containing those result as a json subset (@> in postgres) - * @param data.allowWildcards allow wildcards (*) in the filter of label, tag, worker - * @param data.page which page to return (start at 1, default 1) - * @param data.perPage number of items to return for a given page (default 30, max 100) - * @param data.isSkipped is the job skipped - * @param data.isFlowStep is the job a flow step - * @param data.hasNullParent has null parent - * @param data.success filter on successful jobs - * @param data.allWorkspaces get jobs from all workspaces (only valid if request come from the `admins` workspace) - * @param data.isNotSchedule is not a scheduled job - * @returns Job All jobs - * @throws ApiError - */ -export const listJobs = (data: ListJobsData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/jobs/list', - path: { - workspace: data.workspace - }, - query: { - created_by: data.createdBy, - label: data.label, - worker: data.worker, - parent_job: data.parentJob, - script_path_exact: data.scriptPathExact, - script_path_start: data.scriptPathStart, - schedule_path: data.schedulePath, - script_hash: data.scriptHash, - started_before: data.startedBefore, - started_after: data.startedAfter, - created_before: data.createdBefore, - created_after: data.createdAfter, - created_or_started_before: data.createdOrStartedBefore, - running: data.running, - scheduled_for_before_now: data.scheduledForBeforeNow, - created_or_started_after: data.createdOrStartedAfter, - created_or_started_after_completed_jobs: data.createdOrStartedAfterCompletedJobs, - job_kinds: data.jobKinds, - suspended: data.suspended, - args: data.args, - tag: data.tag, - result: data.result, - allow_wildcards: data.allowWildcards, - page: data.page, - per_page: data.perPage, - is_skipped: data.isSkipped, - is_flow_step: data.isFlowStep, - has_null_parent: data.hasNullParent, - success: data.success, - all_workspaces: data.allWorkspaces, - is_not_schedule: data.isNotSchedule - } -}); }; - -/** - * get db clock - * @returns number the timestamp of the db that can be used to compute the drift - * @throws ApiError - */ -export const getDbClock = (): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/jobs/db_clock' -}); }; - -/** - * Count jobs by tag - * @param data The data for the request. - * @param data.horizonSecs Past Time horizon in seconds (when to start the count = now - horizon) (default is 3600) - * @param data.workspaceId Specific workspace ID to filter results (optional) - * @returns unknown Job counts by tag - * @throws ApiError - */ -export const countJobsByTag = (data: CountJobsByTagData = {}): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/jobs/completed/count_by_tag', - query: { - horizon_secs: data.horizonSecs, - workspace_id: data.workspaceId - } -}); }; - -/** - * get job - * @param data The data for the request. - * @param data.workspace - * @param data.id - * @param data.noLogs - * @returns Job job details - * @throws ApiError - */ -export const getJob = (data: GetJobData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/jobs_u/get/{id}', - path: { - workspace: data.workspace, - id: data.id - }, - query: { - no_logs: data.noLogs - } -}); }; - -/** - * get root job id - * @param data The data for the request. - * @param data.workspace - * @param data.id - * @returns string get root job id - * @throws ApiError - */ -export const getRootJobId = (data: GetRootJobIdData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/jobs_u/get_root_job_id/{id}', - path: { - workspace: data.workspace, - id: data.id - } -}); }; - -/** - * get job logs - * @param data The data for the request. - * @param data.workspace - * @param data.id - * @returns string job details - * @throws ApiError - */ -export const getJobLogs = (data: GetJobLogsData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/jobs_u/get_logs/{id}', - path: { - workspace: data.workspace, - id: data.id - } -}); }; - -/** - * get job args - * @param data The data for the request. - * @param data.workspace - * @param data.id - * @returns unknown job args - * @throws ApiError - */ -export const getJobArgs = (data: GetJobArgsData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/jobs_u/get_args/{id}', - path: { - workspace: data.workspace, - id: data.id - } -}); }; - -/** - * get job updates - * @param data The data for the request. - * @param data.workspace - * @param data.id - * @param data.running - * @param data.logOffset - * @param data.getProgress - * @returns unknown job details - * @throws ApiError - */ -export const getJobUpdates = (data: GetJobUpdatesData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/jobs_u/getupdate/{id}', - path: { - workspace: data.workspace, - id: data.id - }, - query: { - running: data.running, - log_offset: data.logOffset, - get_progress: data.getProgress - } -}); }; - -/** - * get log file from object store - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns unknown job log - * @throws ApiError - */ -export const getLogFileFromStore = (data: GetLogFileFromStoreData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/jobs_u/get_log_file/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * get flow debug info - * @param data The data for the request. - * @param data.workspace - * @param data.id - * @returns unknown flow debug info details - * @throws ApiError - */ -export const getFlowDebugInfo = (data: GetFlowDebugInfoData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/jobs_u/get_flow_debug_info/{id}', - path: { - workspace: data.workspace, - id: data.id - } -}); }; - -/** - * get completed job - * @param data The data for the request. - * @param data.workspace - * @param data.id - * @returns CompletedJob job details - * @throws ApiError - */ -export const getCompletedJob = (data: GetCompletedJobData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/jobs_u/completed/get/{id}', - path: { - workspace: data.workspace, - id: data.id - } -}); }; - -/** - * get completed job result - * @param data The data for the request. - * @param data.workspace - * @param data.id - * @param data.suspendedJob - * @param data.resumeId - * @param data.secret - * @param data.approver - * @returns unknown result - * @throws ApiError - */ -export const getCompletedJobResult = (data: GetCompletedJobResultData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/jobs_u/completed/get_result/{id}', - path: { - workspace: data.workspace, - id: data.id - }, - query: { - suspended_job: data.suspendedJob, - resume_id: data.resumeId, - secret: data.secret, - approver: data.approver - } -}); }; - -/** - * get completed job result if job is completed - * @param data The data for the request. - * @param data.workspace - * @param data.id - * @param data.getStarted - * @returns unknown result - * @throws ApiError - */ -export const getCompletedJobResultMaybe = (data: GetCompletedJobResultMaybeData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/jobs_u/completed/get_result_maybe/{id}', - path: { - workspace: data.workspace, - id: data.id - }, - query: { - get_started: data.getStarted - } -}); }; - -/** - * delete completed job (erase content but keep run id) - * @param data The data for the request. - * @param data.workspace - * @param data.id - * @returns CompletedJob job details - * @throws ApiError - */ -export const deleteCompletedJob = (data: DeleteCompletedJobData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/jobs/completed/delete/{id}', - path: { - workspace: data.workspace, - id: data.id - } -}); }; - -/** - * cancel queued or running job - * @param data The data for the request. - * @param data.workspace - * @param data.id - * @param data.requestBody reason - * @returns string job canceled - * @throws ApiError - */ -export const cancelQueuedJob = (data: CancelQueuedJobData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/jobs_u/queue/cancel/{id}', - path: { - workspace: data.workspace, - id: data.id - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * cancel all queued jobs for persistent script - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.requestBody reason - * @returns string persistent job scaled down to zero - * @throws ApiError - */ -export const cancelPersistentQueuedJobs = (data: CancelPersistentQueuedJobsData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/jobs_u/queue/cancel_persistent/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * force cancel queued job - * @param data The data for the request. - * @param data.workspace - * @param data.id - * @param data.requestBody reason - * @returns string job canceled - * @throws ApiError - */ -export const forceCancelQueuedJob = (data: ForceCancelQueuedJobData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/jobs_u/queue/force_cancel/{id}', - path: { - workspace: data.workspace, - id: data.id - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * create an HMac signature given a job id and a resume id - * @param data The data for the request. - * @param data.workspace - * @param data.id - * @param data.resumeId - * @param data.approver - * @returns string job signature - * @throws ApiError - */ -export const createJobSignature = (data: CreateJobSignatureData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/jobs/job_signature/{id}/{resume_id}', - path: { - workspace: data.workspace, - id: data.id, - resume_id: data.resumeId - }, - query: { - approver: data.approver - } -}); }; - -/** - * get resume urls given a job_id, resume_id and a nonce to resume a flow - * @param data The data for the request. - * @param data.workspace - * @param data.id - * @param data.resumeId - * @param data.approver - * @returns unknown url endpoints - * @throws ApiError - */ -export const getResumeUrls = (data: GetResumeUrlsData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/jobs/resume_urls/{id}/{resume_id}', - path: { - workspace: data.workspace, - id: data.id, - resume_id: data.resumeId - }, - query: { - approver: data.approver - } -}); }; - -/** - * generate interactive slack approval for suspended job - * @param data The data for the request. - * @param data.workspace - * @param data.id - * @param data.slackResourcePath - * @param data.channelId - * @param data.flowStepId - * @param data.approver - * @param data.message - * @param data.defaultArgsJson - * @param data.dynamicEnumsJson - * @returns unknown Interactive slack approval message sent successfully - * @throws ApiError - */ -export const getSlackApprovalPayload = (data: GetSlackApprovalPayloadData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/jobs/slack_approval/{id}', - path: { - workspace: data.workspace, - id: data.id - }, - query: { - approver: data.approver, - message: data.message, - slack_resource_path: data.slackResourcePath, - channel_id: data.channelId, - flow_step_id: data.flowStepId, - default_args_json: data.defaultArgsJson, - dynamic_enums_json: data.dynamicEnumsJson - } -}); }; - -/** - * resume a job for a suspended flow - * @param data The data for the request. - * @param data.workspace - * @param data.id - * @param data.resumeId - * @param data.signature - * @param data.payload The base64 encoded payload that has been encoded as a JSON. e.g how to encode such payload encodeURIComponent - * `encodeURIComponent(btoa(JSON.stringify({a: 2})))` - * - * @param data.approver - * @returns string job resumed - * @throws ApiError - */ -export const resumeSuspendedJobGet = (data: ResumeSuspendedJobGetData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/jobs_u/resume/{id}/{resume_id}/{signature}', - path: { - workspace: data.workspace, - id: data.id, - resume_id: data.resumeId, - signature: data.signature - }, - query: { - payload: data.payload, - approver: data.approver - } -}); }; - -/** - * resume a job for a suspended flow - * @param data The data for the request. - * @param data.workspace - * @param data.id - * @param data.resumeId - * @param data.signature - * @param data.requestBody - * @param data.approver - * @returns string job resumed - * @throws ApiError - */ -export const resumeSuspendedJobPost = (data: ResumeSuspendedJobPostData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/jobs_u/resume/{id}/{resume_id}/{signature}', - path: { - workspace: data.workspace, - id: data.id, - resume_id: data.resumeId, - signature: data.signature - }, - query: { - approver: data.approver - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * set flow user state at a given key - * @param data The data for the request. - * @param data.workspace - * @param data.id - * @param data.key - * @param data.requestBody new value - * @returns string flow user state updated - * @throws ApiError - */ -export const setFlowUserState = (data: SetFlowUserStateData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/jobs/flow/user_states/{id}/{key}', - path: { - workspace: data.workspace, - id: data.id, - key: data.key - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * get flow user state at a given key - * @param data The data for the request. - * @param data.workspace - * @param data.id - * @param data.key - * @returns unknown flow user state updated - * @throws ApiError - */ -export const getFlowUserState = (data: GetFlowUserStateData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/jobs/flow/user_states/{id}/{key}', - path: { - workspace: data.workspace, - id: data.id, - key: data.key - } -}); }; - -/** - * resume a job for a suspended flow as an owner - * @param data The data for the request. - * @param data.workspace - * @param data.id - * @param data.requestBody - * @returns string job resumed - * @throws ApiError - */ -export const resumeSuspendedFlowAsOwner = (data: ResumeSuspendedFlowAsOwnerData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/jobs/flow/resume/{id}', - path: { - workspace: data.workspace, - id: data.id - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * cancel a job for a suspended flow - * @param data The data for the request. - * @param data.workspace - * @param data.id - * @param data.resumeId - * @param data.signature - * @param data.approver - * @returns string job canceled - * @throws ApiError - */ -export const cancelSuspendedJobGet = (data: CancelSuspendedJobGetData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/jobs_u/cancel/{id}/{resume_id}/{signature}', - path: { - workspace: data.workspace, - id: data.id, - resume_id: data.resumeId, - signature: data.signature - }, - query: { - approver: data.approver - } -}); }; - -/** - * cancel a job for a suspended flow - * @param data The data for the request. - * @param data.workspace - * @param data.id - * @param data.resumeId - * @param data.signature - * @param data.requestBody - * @param data.approver - * @returns string job canceled - * @throws ApiError - */ -export const cancelSuspendedJobPost = (data: CancelSuspendedJobPostData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/jobs_u/cancel/{id}/{resume_id}/{signature}', - path: { - workspace: data.workspace, - id: data.id, - resume_id: data.resumeId, - signature: data.signature - }, - query: { - approver: data.approver - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * get parent flow job of suspended job - * @param data The data for the request. - * @param data.workspace - * @param data.id - * @param data.resumeId - * @param data.signature - * @param data.approver - * @returns unknown parent flow details - * @throws ApiError - */ -export const getSuspendedJobFlow = (data: GetSuspendedJobFlowData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/jobs_u/get_flow/{id}/{resume_id}/{signature}', - path: { - workspace: data.workspace, - id: data.id, - resume_id: data.resumeId, - signature: data.signature - }, - query: { - approver: data.approver - } -}); }; - -/** - * preview schedule - * @param data The data for the request. - * @param data.requestBody schedule - * @returns string List of 5 estimated upcoming execution events (in UTC) - * @throws ApiError - */ -export const previewSchedule = (data: PreviewScheduleData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/schedules/preview', - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * create schedule - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody new schedule - * @returns string schedule created - * @throws ApiError - */ -export const createSchedule = (data: CreateScheduleData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/schedules/create', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * update schedule - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.requestBody updated schedule - * @returns string schedule updated - * @throws ApiError - */ -export const updateSchedule = (data: UpdateScheduleData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/schedules/update/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * set enabled schedule - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.requestBody updated schedule enable - * @returns string schedule enabled set - * @throws ApiError - */ -export const setScheduleEnabled = (data: SetScheduleEnabledData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/schedules/setenabled/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * delete schedule - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns string schedule deleted - * @throws ApiError - */ -export const deleteSchedule = (data: DeleteScheduleData): CancelablePromise => { return __request(OpenAPI, { - method: 'DELETE', - url: '/w/{workspace}/schedules/delete/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * get schedule - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns Schedule schedule deleted - * @throws ApiError - */ -export const getSchedule = (data: GetScheduleData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/schedules/get/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * does schedule exists - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns boolean schedule exists - * @throws ApiError - */ -export const existsSchedule = (data: ExistsScheduleData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/schedules/exists/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * list schedules - * @param data The data for the request. - * @param data.workspace - * @param data.page which page to return (start at 1, default 1) - * @param data.perPage number of items to return for a given page (default 30, max 100) - * @param data.args filter on jobs containing those args as a json subset (@> in postgres) - * @param data.path filter by path - * @param data.isFlow - * @param data.pathStart - * @returns Schedule schedule list - * @throws ApiError - */ -export const listSchedules = (data: ListSchedulesData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/schedules/list', - path: { - workspace: data.workspace - }, - query: { - page: data.page, - per_page: data.perPage, - args: data.args, - path: data.path, - is_flow: data.isFlow, - path_start: data.pathStart - } -}); }; - -/** - * list schedules with last 20 jobs - * @param data The data for the request. - * @param data.workspace - * @param data.page which page to return (start at 1, default 1) - * @param data.perPage number of items to return for a given page (default 30, max 100) - * @returns ScheduleWJobs schedule list - * @throws ApiError - */ -export const listSchedulesWithJobs = (data: ListSchedulesWithJobsData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/schedules/list_with_jobs', - path: { - workspace: data.workspace - }, - query: { - page: data.page, - per_page: data.perPage - } -}); }; - -/** - * Set default error or recoevery handler - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody Handler description - * @returns unknown default error handler set - * @throws ApiError - */ -export const setDefaultErrorOrRecoveryHandler = (data: SetDefaultErrorOrRecoveryHandlerData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/schedules/setdefaulthandler', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * create http trigger - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody new http trigger - * @returns string http trigger created - * @throws ApiError - */ -export const createHttpTrigger = (data: CreateHttpTriggerData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/http_triggers/create', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * update http trigger - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.requestBody updated trigger - * @returns string http trigger updated - * @throws ApiError - */ -export const updateHttpTrigger = (data: UpdateHttpTriggerData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/http_triggers/update/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * delete http trigger - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns string http trigger deleted - * @throws ApiError - */ -export const deleteHttpTrigger = (data: DeleteHttpTriggerData): CancelablePromise => { return __request(OpenAPI, { - method: 'DELETE', - url: '/w/{workspace}/http_triggers/delete/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * get http trigger - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns HttpTrigger http trigger deleted - * @throws ApiError - */ -export const getHttpTrigger = (data: GetHttpTriggerData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/http_triggers/get/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * list http triggers - * @param data The data for the request. - * @param data.workspace - * @param data.page which page to return (start at 1, default 1) - * @param data.perPage number of items to return for a given page (default 30, max 100) - * @param data.path filter by path - * @param data.isFlow - * @param data.pathStart - * @returns HttpTrigger http trigger list - * @throws ApiError - */ -export const listHttpTriggers = (data: ListHttpTriggersData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/http_triggers/list', - path: { - workspace: data.workspace - }, - query: { - page: data.page, - per_page: data.perPage, - path: data.path, - is_flow: data.isFlow, - path_start: data.pathStart - } -}); }; - -/** - * does http trigger exists - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns boolean http trigger exists - * @throws ApiError - */ -export const existsHttpTrigger = (data: ExistsHttpTriggerData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/http_triggers/exists/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * does route exists - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody route exists request - * @returns boolean route exists - * @throws ApiError - */ -export const existsRoute = (data: ExistsRouteData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/http_triggers/route_exists', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * create websocket trigger - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody new websocket trigger - * @returns string websocket trigger created - * @throws ApiError - */ -export const createWebsocketTrigger = (data: CreateWebsocketTriggerData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/websocket_triggers/create', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * update websocket trigger - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.requestBody updated trigger - * @returns string websocket trigger updated - * @throws ApiError - */ -export const updateWebsocketTrigger = (data: UpdateWebsocketTriggerData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/websocket_triggers/update/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * delete websocket trigger - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns string websocket trigger deleted - * @throws ApiError - */ -export const deleteWebsocketTrigger = (data: DeleteWebsocketTriggerData): CancelablePromise => { return __request(OpenAPI, { - method: 'DELETE', - url: '/w/{workspace}/websocket_triggers/delete/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * get websocket trigger - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns WebsocketTrigger websocket trigger deleted - * @throws ApiError - */ -export const getWebsocketTrigger = (data: GetWebsocketTriggerData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/websocket_triggers/get/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * list websocket triggers - * @param data The data for the request. - * @param data.workspace - * @param data.page which page to return (start at 1, default 1) - * @param data.perPage number of items to return for a given page (default 30, max 100) - * @param data.path filter by path - * @param data.isFlow - * @param data.pathStart - * @returns WebsocketTrigger websocket trigger list - * @throws ApiError - */ -export const listWebsocketTriggers = (data: ListWebsocketTriggersData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/websocket_triggers/list', - path: { - workspace: data.workspace - }, - query: { - page: data.page, - per_page: data.perPage, - path: data.path, - is_flow: data.isFlow, - path_start: data.pathStart - } -}); }; - -/** - * does websocket trigger exists - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns boolean websocket trigger exists - * @throws ApiError - */ -export const existsWebsocketTrigger = (data: ExistsWebsocketTriggerData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/websocket_triggers/exists/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * set enabled websocket trigger - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.requestBody updated websocket trigger enable - * @returns string websocket trigger enabled set - * @throws ApiError - */ -export const setWebsocketTriggerEnabled = (data: SetWebsocketTriggerEnabledData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/websocket_triggers/setenabled/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * test websocket connection - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody test websocket connection - * @returns string successfuly connected to websocket - * @throws ApiError - */ -export const testWebsocketConnection = (data: TestWebsocketConnectionData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/websocket_triggers/test', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * create kafka trigger - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody new kafka trigger - * @returns string kafka trigger created - * @throws ApiError - */ -export const createKafkaTrigger = (data: CreateKafkaTriggerData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/kafka_triggers/create', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * update kafka trigger - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.requestBody updated trigger - * @returns string kafka trigger updated - * @throws ApiError - */ -export const updateKafkaTrigger = (data: UpdateKafkaTriggerData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/kafka_triggers/update/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * delete kafka trigger - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns string kafka trigger deleted - * @throws ApiError - */ -export const deleteKafkaTrigger = (data: DeleteKafkaTriggerData): CancelablePromise => { return __request(OpenAPI, { - method: 'DELETE', - url: '/w/{workspace}/kafka_triggers/delete/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * get kafka trigger - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns KafkaTrigger kafka trigger deleted - * @throws ApiError - */ -export const getKafkaTrigger = (data: GetKafkaTriggerData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/kafka_triggers/get/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * list kafka triggers - * @param data The data for the request. - * @param data.workspace - * @param data.page which page to return (start at 1, default 1) - * @param data.perPage number of items to return for a given page (default 30, max 100) - * @param data.path filter by path - * @param data.isFlow - * @param data.pathStart - * @returns KafkaTrigger kafka trigger list - * @throws ApiError - */ -export const listKafkaTriggers = (data: ListKafkaTriggersData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/kafka_triggers/list', - path: { - workspace: data.workspace - }, - query: { - page: data.page, - per_page: data.perPage, - path: data.path, - is_flow: data.isFlow, - path_start: data.pathStart - } -}); }; - -/** - * does kafka trigger exists - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns boolean kafka trigger exists - * @throws ApiError - */ -export const existsKafkaTrigger = (data: ExistsKafkaTriggerData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/kafka_triggers/exists/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * set enabled kafka trigger - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.requestBody updated kafka trigger enable - * @returns string kafka trigger enabled set - * @throws ApiError - */ -export const setKafkaTriggerEnabled = (data: SetKafkaTriggerEnabledData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/kafka_triggers/setenabled/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * test kafka connection - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody test kafka connection - * @returns string successfuly connected to kafka brokers - * @throws ApiError - */ -export const testKafkaConnection = (data: TestKafkaConnectionData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/kafka_triggers/test', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * create nats trigger - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody new nats trigger - * @returns string nats trigger created - * @throws ApiError - */ -export const createNatsTrigger = (data: CreateNatsTriggerData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/nats_triggers/create', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * update nats trigger - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.requestBody updated trigger - * @returns string nats trigger updated - * @throws ApiError - */ -export const updateNatsTrigger = (data: UpdateNatsTriggerData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/nats_triggers/update/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * delete nats trigger - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns string nats trigger deleted - * @throws ApiError - */ -export const deleteNatsTrigger = (data: DeleteNatsTriggerData): CancelablePromise => { return __request(OpenAPI, { - method: 'DELETE', - url: '/w/{workspace}/nats_triggers/delete/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * get nats trigger - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns NatsTrigger nats trigger deleted - * @throws ApiError - */ -export const getNatsTrigger = (data: GetNatsTriggerData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/nats_triggers/get/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * list nats triggers - * @param data The data for the request. - * @param data.workspace - * @param data.page which page to return (start at 1, default 1) - * @param data.perPage number of items to return for a given page (default 30, max 100) - * @param data.path filter by path - * @param data.isFlow - * @param data.pathStart - * @returns NatsTrigger nats trigger list - * @throws ApiError - */ -export const listNatsTriggers = (data: ListNatsTriggersData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/nats_triggers/list', - path: { - workspace: data.workspace - }, - query: { - page: data.page, - per_page: data.perPage, - path: data.path, - is_flow: data.isFlow, - path_start: data.pathStart - } -}); }; - -/** - * does nats trigger exists - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns boolean nats trigger exists - * @throws ApiError - */ -export const existsNatsTrigger = (data: ExistsNatsTriggerData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/nats_triggers/exists/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * set enabled nats trigger - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.requestBody updated nats trigger enable - * @returns string nats trigger enabled set - * @throws ApiError - */ -export const setNatsTriggerEnabled = (data: SetNatsTriggerEnabledData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/nats_triggers/setenabled/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * test NATS connection - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody test nats connection - * @returns string successfuly connected to NATS servers - * @throws ApiError - */ -export const testNatsConnection = (data: TestNatsConnectionData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/nats_triggers/test', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * create sqs trigger - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody new sqs trigger - * @returns string sqs trigger created - * @throws ApiError - */ -export const createSqsTrigger = (data: CreateSqsTriggerData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/sqs_triggers/create', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * update sqs trigger - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.requestBody updated trigger - * @returns string sqs trigger updated - * @throws ApiError - */ -export const updateSqsTrigger = (data: UpdateSqsTriggerData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/sqs_triggers/update/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * delete sqs trigger - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns string sqs trigger deleted - * @throws ApiError - */ -export const deleteSqsTrigger = (data: DeleteSqsTriggerData): CancelablePromise => { return __request(OpenAPI, { - method: 'DELETE', - url: '/w/{workspace}/sqs_triggers/delete/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * get sqs trigger - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns SqsTrigger sqs trigger deleted - * @throws ApiError - */ -export const getSqsTrigger = (data: GetSqsTriggerData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/sqs_triggers/get/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * list sqs triggers - * @param data The data for the request. - * @param data.workspace - * @param data.page which page to return (start at 1, default 1) - * @param data.perPage number of items to return for a given page (default 30, max 100) - * @param data.path filter by path - * @param data.isFlow - * @param data.pathStart - * @returns SqsTrigger sqs trigger list - * @throws ApiError - */ -export const listSqsTriggers = (data: ListSqsTriggersData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/sqs_triggers/list', - path: { - workspace: data.workspace - }, - query: { - page: data.page, - per_page: data.perPage, - path: data.path, - is_flow: data.isFlow, - path_start: data.pathStart - } -}); }; - -/** - * does sqs trigger exists - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns boolean sqs trigger exists - * @throws ApiError - */ -export const existsSqsTrigger = (data: ExistsSqsTriggerData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/sqs_triggers/exists/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * set enabled sqs trigger - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.requestBody updated sqs trigger enable - * @returns string sqs trigger enabled set - * @throws ApiError - */ -export const setSqsTriggerEnabled = (data: SetSqsTriggerEnabledData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/sqs_triggers/setenabled/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * test sqs connection - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody test sqs connection - * @returns string successfuly connected to sqs - * @throws ApiError - */ -export const testSqsConnection = (data: TestSqsConnectionData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/sqs_triggers/test', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * create mqtt trigger - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody new mqtt trigger - * @returns string mqtt trigger created - * @throws ApiError - */ -export const createMqttTrigger = (data: CreateMqttTriggerData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/mqtt_triggers/create', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * update mqtt trigger - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.requestBody updated trigger - * @returns string mqtt trigger updated - * @throws ApiError - */ -export const updateMqttTrigger = (data: UpdateMqttTriggerData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/mqtt_triggers/update/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * delete mqtt trigger - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns string mqtt trigger deleted - * @throws ApiError - */ -export const deleteMqttTrigger = (data: DeleteMqttTriggerData): CancelablePromise => { return __request(OpenAPI, { - method: 'DELETE', - url: '/w/{workspace}/mqtt_triggers/delete/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * get mqtt trigger - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns MqttTrigger mqtt trigger deleted - * @throws ApiError - */ -export const getMqttTrigger = (data: GetMqttTriggerData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/mqtt_triggers/get/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * list mqtt triggers - * @param data The data for the request. - * @param data.workspace - * @param data.page which page to return (start at 1, default 1) - * @param data.perPage number of items to return for a given page (default 30, max 100) - * @param data.path filter by path - * @param data.isFlow - * @param data.pathStart - * @returns MqttTrigger mqtt trigger list - * @throws ApiError - */ -export const listMqttTriggers = (data: ListMqttTriggersData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/mqtt_triggers/list', - path: { - workspace: data.workspace - }, - query: { - page: data.page, - per_page: data.perPage, - path: data.path, - is_flow: data.isFlow, - path_start: data.pathStart - } -}); }; - -/** - * does mqtt trigger exists - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns boolean mqtt trigger exists - * @throws ApiError - */ -export const existsMqttTrigger = (data: ExistsMqttTriggerData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/mqtt_triggers/exists/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * set enabled mqtt trigger - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.requestBody updated mqtt trigger enable - * @returns string mqtt trigger enabled set - * @throws ApiError - */ -export const setMqttTriggerEnabled = (data: SetMqttTriggerEnabledData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/mqtt_triggers/setenabled/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * test mqtt connection - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody test mqtt connection - * @returns string successfully connected to mqtt - * @throws ApiError - */ -export const testMqttConnection = (data: TestMqttConnectionData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/mqtt_triggers/test', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * create gcp trigger - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody new gcp trigger - * @returns string gcp trigger created - * @throws ApiError - */ -export const createGcpTrigger = (data: CreateGcpTriggerData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/gcp_triggers/create', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * update gcp trigger - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.requestBody updated trigger - * @returns string gcp trigger updated - * @throws ApiError - */ -export const updateGcpTrigger = (data: UpdateGcpTriggerData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/gcp_triggers/update/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * delete gcp trigger - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns string gcp trigger deleted - * @throws ApiError - */ -export const deleteGcpTrigger = (data: DeleteGcpTriggerData): CancelablePromise => { return __request(OpenAPI, { - method: 'DELETE', - url: '/w/{workspace}/gcp_triggers/delete/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * get gcp trigger - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns GcpTrigger gcp trigger deleted - * @throws ApiError - */ -export const getGcpTrigger = (data: GetGcpTriggerData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/gcp_triggers/get/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * list gcp triggers - * @param data The data for the request. - * @param data.workspace - * @param data.page which page to return (start at 1, default 1) - * @param data.perPage number of items to return for a given page (default 30, max 100) - * @param data.path filter by path - * @param data.isFlow - * @param data.pathStart - * @returns GcpTrigger gcp trigger list - * @throws ApiError - */ -export const listGcpTriggers = (data: ListGcpTriggersData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/gcp_triggers/list', - path: { - workspace: data.workspace - }, - query: { - page: data.page, - per_page: data.perPage, - path: data.path, - is_flow: data.isFlow, - path_start: data.pathStart - } -}); }; - -/** - * does gcp trigger exists - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns boolean gcp trigger exists - * @throws ApiError - */ -export const existsGcpTrigger = (data: ExistsGcpTriggerData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/gcp_triggers/exists/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * set enabled gcp trigger - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.requestBody updated gcp trigger enable - * @returns string gcp trigger enabled set - * @throws ApiError - */ -export const setGcpTriggerEnabled = (data: SetGcpTriggerEnabledData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/gcp_triggers/setenabled/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * test gcp connection - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody test gcp connection - * @returns string try to connect to a gcp broker - * @throws ApiError - */ -export const testGcpConnection = (data: TestGcpConnectionData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/gcp_triggers/test', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * delete gcp trigger - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.requestBody args to delete subscription from google cloud - * @returns string gcp trigger deleted - * @throws ApiError - */ -export const deleteGcpSubscription = (data: DeleteGcpSubscriptionData): CancelablePromise => { return __request(OpenAPI, { - method: 'DELETE', - url: '/w/{workspace}/gcp_triggers/subscriptions/delete/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * list all topics of google cloud service - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns string get all google topics - * @throws ApiError - */ -export const listGoogleTopics = (data: ListGoogleTopicsData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/gcp_triggers/topics/list/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * list all subscription of a give topic from google cloud service - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.requestBody args to get subscription's topic from google cloud - * @returns string get all google topic subscriptions name - * @throws ApiError - */ -export const listAllTgoogleTopicSubscriptions = (data: ListAllTgoogleTopicSubscriptionsData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/gcp_triggers/subscriptions/list/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * check if postgres configuration is set to logical - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns boolean boolean that indicates if postgres is set to logical level or not - * @throws ApiError - */ -export const isValidPostgresConfiguration = (data: IsValidPostgresConfigurationData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/postgres_triggers/is_valid_postgres_configuration/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * create template script - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody template script - * @returns string custom id to retrieve template script - * @throws ApiError - */ -export const createTemplateScript = (data: CreateTemplateScriptData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/postgres_triggers/create_template_script', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * get template script - * @param data The data for the request. - * @param data.workspace - * @param data.id - * @returns string template script - * @throws ApiError - */ -export const getTemplateScript = (data: GetTemplateScriptData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/postgres_triggers/get_template_script/{id}', - path: { - workspace: data.workspace, - id: data.id - } -}); }; - -/** - * list postgres replication slot - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns SlotList list postgres slot - * @throws ApiError - */ -export const listPostgresReplicationSlot = (data: ListPostgresReplicationSlotData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/postgres_triggers/slot/list/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * create replication slot for postgres - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.requestBody new slot for postgres - * @returns string slot created - * @throws ApiError - */ -export const createPostgresReplicationSlot = (data: CreatePostgresReplicationSlotData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/postgres_triggers/slot/create/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * delete postgres replication slot - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.requestBody replication slot of postgres - * @returns string postgres replication slot deleted - * @throws ApiError - */ -export const deletePostgresReplicationSlot = (data: DeletePostgresReplicationSlotData): CancelablePromise => { return __request(OpenAPI, { - method: 'DELETE', - url: '/w/{workspace}/postgres_triggers/slot/delete/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * list postgres publication - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns string database publication list - * @throws ApiError - */ -export const listPostgresPublication = (data: ListPostgresPublicationData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/postgres_triggers/publication/list/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * get postgres publication - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.publication - * @returns PublicationData postgres publication get - * @throws ApiError - */ -export const getPostgresPublication = (data: GetPostgresPublicationData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/postgres_triggers/publication/get/{publication}/{path}', - path: { - workspace: data.workspace, - path: data.path, - publication: data.publication - } -}); }; - -/** - * create publication for postgres - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.publication - * @param data.requestBody new publication for postgres - * @returns string publication created - * @throws ApiError - */ -export const createPostgresPublication = (data: CreatePostgresPublicationData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/postgres_triggers/publication/create/{publication}/{path}', - path: { - workspace: data.workspace, - path: data.path, - publication: data.publication - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * update publication for postgres - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.publication - * @param data.requestBody update publication for postgres - * @returns string publication updated - * @throws ApiError - */ -export const updatePostgresPublication = (data: UpdatePostgresPublicationData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/postgres_triggers/publication/update/{publication}/{path}', - path: { - workspace: data.workspace, - path: data.path, - publication: data.publication - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * delete postgres publication - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.publication - * @returns string postgres publication deleted - * @throws ApiError - */ -export const deletePostgresPublication = (data: DeletePostgresPublicationData): CancelablePromise => { return __request(OpenAPI, { - method: 'DELETE', - url: '/w/{workspace}/postgres_triggers/publication/delete/{publication}/{path}', - path: { - workspace: data.workspace, - path: data.path, - publication: data.publication - } -}); }; - -/** - * create postgres trigger - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody new postgres trigger - * @returns string postgres trigger created - * @throws ApiError - */ -export const createPostgresTrigger = (data: CreatePostgresTriggerData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/postgres_triggers/create', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * update postgres trigger - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.requestBody updated trigger - * @returns string postgres trigger updated - * @throws ApiError - */ -export const updatePostgresTrigger = (data: UpdatePostgresTriggerData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/postgres_triggers/update/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * delete postgres trigger - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns string postgres trigger deleted - * @throws ApiError - */ -export const deletePostgresTrigger = (data: DeletePostgresTriggerData): CancelablePromise => { return __request(OpenAPI, { - method: 'DELETE', - url: '/w/{workspace}/postgres_triggers/delete/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * get postgres trigger - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns PostgresTrigger get postgres trigger - * @throws ApiError - */ -export const getPostgresTrigger = (data: GetPostgresTriggerData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/postgres_triggers/get/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * list postgres triggers - * @param data The data for the request. - * @param data.workspace - * @param data.page which page to return (start at 1, default 1) - * @param data.perPage number of items to return for a given page (default 30, max 100) - * @param data.path filter by path - * @param data.isFlow - * @param data.pathStart - * @returns PostgresTrigger postgres trigger list - * @throws ApiError - */ -export const listPostgresTriggers = (data: ListPostgresTriggersData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/postgres_triggers/list', - path: { - workspace: data.workspace - }, - query: { - page: data.page, - per_page: data.perPage, - path: data.path, - is_flow: data.isFlow, - path_start: data.pathStart - } -}); }; - -/** - * does postgres trigger exists - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @returns boolean postgres trigger exists - * @throws ApiError - */ -export const existsPostgresTrigger = (data: ExistsPostgresTriggerData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/postgres_triggers/exists/{path}', - path: { - workspace: data.workspace, - path: data.path - } -}); }; - -/** - * set enabled postgres trigger - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.requestBody updated postgres trigger enable - * @returns string postgres trigger enabled set - * @throws ApiError - */ -export const setPostgresTriggerEnabled = (data: SetPostgresTriggerEnabledData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/postgres_triggers/setenabled/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * test postgres connection - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody test postgres connection - * @returns string successfuly connected to postgres - * @throws ApiError - */ -export const testPostgresConnection = (data: TestPostgresConnectionData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/postgres_triggers/test', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * list instance groups - * @returns InstanceGroup instance group list - * @throws ApiError - */ -export const listInstanceGroups = (): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/groups/list' -}); }; - -/** - * get instance group - * @param data The data for the request. - * @param data.name - * @returns InstanceGroup instance group - * @throws ApiError - */ -export const getInstanceGroup = (data: GetInstanceGroupData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/groups/get/{name}', - path: { - name: data.name - } -}); }; - -/** - * create instance group - * @param data The data for the request. - * @param data.requestBody create instance group - * @returns string instance group created - * @throws ApiError - */ -export const createInstanceGroup = (data: CreateInstanceGroupData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/groups/create', - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * update instance group - * @param data The data for the request. - * @param data.name - * @param data.requestBody update instance group - * @returns string instance group updated - * @throws ApiError - */ -export const updateInstanceGroup = (data: UpdateInstanceGroupData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/groups/update/{name}', - path: { - name: data.name - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * delete instance group - * @param data The data for the request. - * @param data.name - * @returns string instance group deleted - * @throws ApiError - */ -export const deleteInstanceGroup = (data: DeleteInstanceGroupData): CancelablePromise => { return __request(OpenAPI, { - method: 'DELETE', - url: '/groups/delete/{name}', - path: { - name: data.name - } -}); }; - -/** - * add user to instance group - * @param data The data for the request. - * @param data.name - * @param data.requestBody user to add to instance group - * @returns string user added to instance group - * @throws ApiError - */ -export const addUserToInstanceGroup = (data: AddUserToInstanceGroupData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/groups/adduser/{name}', - path: { - name: data.name - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * remove user from instance group - * @param data The data for the request. - * @param data.name - * @param data.requestBody user to remove from instance group - * @returns string user removed from instance group - * @throws ApiError - */ -export const removeUserFromInstanceGroup = (data: RemoveUserFromInstanceGroupData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/groups/removeuser/{name}', - path: { - name: data.name - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * export instance groups - * @returns ExportedInstanceGroup exported instance groups - * @throws ApiError - */ -export const exportInstanceGroups = (): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/groups/export' -}); }; - -/** - * overwrite instance groups - * @param data The data for the request. - * @param data.requestBody overwrite instance groups - * @returns string success message - * @throws ApiError - */ -export const overwriteInstanceGroups = (data: OverwriteInstanceGroupsData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/groups/overwrite', - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * list groups - * @param data The data for the request. - * @param data.workspace - * @param data.page which page to return (start at 1, default 1) - * @param data.perPage number of items to return for a given page (default 30, max 100) - * @returns Group group list - * @throws ApiError - */ -export const listGroups = (data: ListGroupsData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/groups/list', - path: { - workspace: data.workspace - }, - query: { - page: data.page, - per_page: data.perPage - } -}); }; - -/** - * list group names - * @param data The data for the request. - * @param data.workspace - * @param data.onlyMemberOf only list the groups the user is member of (default false) - * @returns string group list - * @throws ApiError - */ -export const listGroupNames = (data: ListGroupNamesData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/groups/listnames', - path: { - workspace: data.workspace - }, - query: { - only_member_of: data.onlyMemberOf - } -}); }; - -/** - * create group - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody create group - * @returns string group created - * @throws ApiError - */ -export const createGroup = (data: CreateGroupData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/groups/create', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * update group - * @param data The data for the request. - * @param data.workspace - * @param data.name - * @param data.requestBody updated group - * @returns string group updated - * @throws ApiError - */ -export const updateGroup = (data: UpdateGroupData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/groups/update/{name}', - path: { - workspace: data.workspace, - name: data.name - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * delete group - * @param data The data for the request. - * @param data.workspace - * @param data.name - * @returns string group deleted - * @throws ApiError - */ -export const deleteGroup = (data: DeleteGroupData): CancelablePromise => { return __request(OpenAPI, { - method: 'DELETE', - url: '/w/{workspace}/groups/delete/{name}', - path: { - workspace: data.workspace, - name: data.name - } -}); }; - -/** - * get group - * @param data The data for the request. - * @param data.workspace - * @param data.name - * @returns Group group - * @throws ApiError - */ -export const getGroup = (data: GetGroupData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/groups/get/{name}', - path: { - workspace: data.workspace, - name: data.name - } -}); }; - -/** - * add user to group - * @param data The data for the request. - * @param data.workspace - * @param data.name - * @param data.requestBody added user to group - * @returns string user added to group - * @throws ApiError - */ -export const addUserToGroup = (data: AddUserToGroupData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/groups/adduser/{name}', - path: { - workspace: data.workspace, - name: data.name - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * remove user to group - * @param data The data for the request. - * @param data.workspace - * @param data.name - * @param data.requestBody added user to group - * @returns string user removed from group - * @throws ApiError - */ -export const removeUserToGroup = (data: RemoveUserToGroupData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/groups/removeuser/{name}', - path: { - workspace: data.workspace, - name: data.name - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * list folders - * @param data The data for the request. - * @param data.workspace - * @param data.page which page to return (start at 1, default 1) - * @param data.perPage number of items to return for a given page (default 30, max 100) - * @returns Folder folder list - * @throws ApiError - */ -export const listFolders = (data: ListFoldersData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/folders/list', - path: { - workspace: data.workspace - }, - query: { - page: data.page, - per_page: data.perPage - } -}); }; - -/** - * list folder names - * @param data The data for the request. - * @param data.workspace - * @param data.onlyMemberOf only list the folders the user is member of (default false) - * @returns string folder list - * @throws ApiError - */ -export const listFolderNames = (data: ListFolderNamesData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/folders/listnames', - path: { - workspace: data.workspace - }, - query: { - only_member_of: data.onlyMemberOf - } -}); }; - -/** - * create folder - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody create folder - * @returns string folder created - * @throws ApiError - */ -export const createFolder = (data: CreateFolderData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/folders/create', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * update folder - * @param data The data for the request. - * @param data.workspace - * @param data.name - * @param data.requestBody update folder - * @returns string folder updated - * @throws ApiError - */ -export const updateFolder = (data: UpdateFolderData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/folders/update/{name}', - path: { - workspace: data.workspace, - name: data.name - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * delete folder - * @param data The data for the request. - * @param data.workspace - * @param data.name - * @returns string folder deleted - * @throws ApiError - */ -export const deleteFolder = (data: DeleteFolderData): CancelablePromise => { return __request(OpenAPI, { - method: 'DELETE', - url: '/w/{workspace}/folders/delete/{name}', - path: { - workspace: data.workspace, - name: data.name - } -}); }; - -/** - * get folder - * @param data The data for the request. - * @param data.workspace - * @param data.name - * @returns Folder folder - * @throws ApiError - */ -export const getFolder = (data: GetFolderData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/folders/get/{name}', - path: { - workspace: data.workspace, - name: data.name - } -}); }; - -/** - * exists folder - * @param data The data for the request. - * @param data.workspace - * @param data.name - * @returns boolean folder exists - * @throws ApiError - */ -export const existsFolder = (data: ExistsFolderData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/folders/exists/{name}', - path: { - workspace: data.workspace, - name: data.name - } -}); }; - -/** - * get folder usage - * @param data The data for the request. - * @param data.workspace - * @param data.name - * @returns unknown folder - * @throws ApiError - */ -export const getFolderUsage = (data: GetFolderUsageData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/folders/getusage/{name}', - path: { - workspace: data.workspace, - name: data.name - } -}); }; - -/** - * add owner to folder - * @param data The data for the request. - * @param data.workspace - * @param data.name - * @param data.requestBody owner user to folder - * @returns string owner added to folder - * @throws ApiError - */ -export const addOwnerToFolder = (data: AddOwnerToFolderData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/folders/addowner/{name}', - path: { - workspace: data.workspace, - name: data.name - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * remove owner to folder - * @param data The data for the request. - * @param data.workspace - * @param data.name - * @param data.requestBody added owner to folder - * @returns string owner removed from folder - * @throws ApiError - */ -export const removeOwnerToFolder = (data: RemoveOwnerToFolderData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/folders/removeowner/{name}', - path: { - workspace: data.workspace, - name: data.name - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * list workers - * @param data The data for the request. - * @param data.page which page to return (start at 1, default 1) - * @param data.perPage number of items to return for a given page (default 30, max 100) - * @param data.pingSince number of seconds the worker must have had a last ping more recent of (default to 300) - * @returns WorkerPing a list of workers - * @throws ApiError - */ -export const listWorkers = (data: ListWorkersData = {}): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/workers/list', - query: { - page: data.page, - per_page: data.perPage, - ping_since: data.pingSince - } -}); }; - -/** - * exists worker with tag - * @param data The data for the request. - * @param data.tag - * @returns boolean whether a worker with the tag exists - * @throws ApiError - */ -export const existsWorkerWithTag = (data: ExistsWorkerWithTagData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/workers/exists_worker_with_tag', - query: { - tag: data.tag - } -}); }; - -/** - * get queue metrics - * @returns unknown metrics - * @throws ApiError - */ -export const getQueueMetrics = (): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/workers/queue_metrics' -}); }; - -/** - * get counts of jobs waiting for an executor per tag - * @returns number queue counts - * @throws ApiError - */ -export const getCountsOfJobsWaitingPerTag = (): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/workers/queue_counts' -}); }; - -/** - * list worker groups - * @returns unknown a list of worker group configs - * @throws ApiError - */ -export const listWorkerGroups = (): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/configs/list_worker_groups' -}); }; - -/** - * get config - * @param data The data for the request. - * @param data.name - * @returns unknown a config - * @throws ApiError - */ -export const getConfig = (data: GetConfigData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/configs/get/{name}', - path: { - name: data.name - } -}); }; - -/** - * Update config - * @param data The data for the request. - * @param data.name - * @param data.requestBody worker group - * @returns string Update a worker group - * @throws ApiError - */ -export const updateConfig = (data: UpdateConfigData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/configs/update/{name}', - path: { - name: data.name - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * Delete Config - * @param data The data for the request. - * @param data.name - * @returns string Delete config - * @throws ApiError - */ -export const deleteConfig = (data: DeleteConfigData): CancelablePromise => { return __request(OpenAPI, { - method: 'DELETE', - url: '/configs/update/{name}', - path: { - name: data.name - } -}); }; - -/** - * list configs - * @returns Config list of configs - * @throws ApiError - */ -export const listConfigs = (): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/configs/list' -}); }; - -/** - * List autoscaling events - * @param data The data for the request. - * @param data.workerGroup - * @returns AutoscalingEvent List of autoscaling events - * @throws ApiError - */ -export const listAutoscalingEvents = (data: ListAutoscalingEventsData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/configs/list_autoscaling_events/{worker_group}', - path: { - worker_group: data.workerGroup - } -}); }; - -/** - * get granular acls - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.kind - * @returns boolean acls - * @throws ApiError - */ -export const getGranularAcls = (data: GetGranularAclsData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/acls/get/{kind}/{path}', - path: { - workspace: data.workspace, - path: data.path, - kind: data.kind - } -}); }; - -/** - * add granular acls - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.kind - * @param data.requestBody acl to add - * @returns string granular acl added - * @throws ApiError - */ -export const addGranularAcls = (data: AddGranularAclsData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/acls/add/{kind}/{path}', - path: { - workspace: data.workspace, - path: data.path, - kind: data.kind - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * remove granular acls - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.kind - * @param data.requestBody acl to add - * @returns string granular acl removed - * @throws ApiError - */ -export const removeGranularAcls = (data: RemoveGranularAclsData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/acls/remove/{kind}/{path}', - path: { - workspace: data.workspace, - path: data.path, - kind: data.kind - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * set capture config - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody capture config - * @returns unknown capture config set - * @throws ApiError - */ -export const setCaptureConfig = (data: SetCaptureConfigData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/capture/set_config', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * ping capture config - * @param data The data for the request. - * @param data.workspace - * @param data.triggerKind - * @param data.runnableKind - * @param data.path - * @returns unknown capture config pinged - * @throws ApiError - */ -export const pingCaptureConfig = (data: PingCaptureConfigData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/capture/ping_config/{trigger_kind}/{runnable_kind}/{path}', - path: { - workspace: data.workspace, - trigger_kind: data.triggerKind, - runnable_kind: data.runnableKind, - path: data.path - } -}); }; - -/** - * get capture configs for a script or flow - * @param data The data for the request. - * @param data.workspace - * @param data.runnableKind - * @param data.path - * @returns CaptureConfig capture configs for a script or flow - * @throws ApiError - */ -export const getCaptureConfigs = (data: GetCaptureConfigsData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/capture/get_configs/{runnable_kind}/{path}', - path: { - workspace: data.workspace, - runnable_kind: data.runnableKind, - path: data.path - } -}); }; - -/** - * list captures for a script or flow - * @param data The data for the request. - * @param data.workspace - * @param data.runnableKind - * @param data.path - * @param data.triggerKind - * @param data.page which page to return (start at 1, default 1) - * @param data.perPage number of items to return for a given page (default 30, max 100) - * @returns Capture list of captures for a script or flow - * @throws ApiError - */ -export const listCaptures = (data: ListCapturesData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/capture/list/{runnable_kind}/{path}', - path: { - workspace: data.workspace, - runnable_kind: data.runnableKind, - path: data.path - }, - query: { - trigger_kind: data.triggerKind, - page: data.page, - per_page: data.perPage - } -}); }; - -/** - * move captures and configs for a script or flow - * @param data The data for the request. - * @param data.workspace - * @param data.runnableKind - * @param data.path - * @param data.requestBody move captures and configs to a new path - * @returns string captures and configs moved - * @throws ApiError - */ -export const moveCapturesAndConfigs = (data: MoveCapturesAndConfigsData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/capture/move/{runnable_kind}/{path}', - path: { - workspace: data.workspace, - runnable_kind: data.runnableKind, - path: data.path - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * get a capture - * @param data The data for the request. - * @param data.workspace - * @param data.id - * @returns Capture capture - * @throws ApiError - */ -export const getCapture = (data: GetCaptureData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/capture/{id}', - path: { - workspace: data.workspace, - id: data.id - } -}); }; - -/** - * delete a capture - * @param data The data for the request. - * @param data.workspace - * @param data.id - * @returns unknown capture deleted - * @throws ApiError - */ -export const deleteCapture = (data: DeleteCaptureData): CancelablePromise => { return __request(OpenAPI, { - method: 'DELETE', - url: '/w/{workspace}/capture/{id}', - path: { - workspace: data.workspace, - id: data.id - } -}); }; - -/** - * star item - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody - * @returns unknown star item - * @throws ApiError - */ -export const star = (data: StarData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/favorites/star', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * unstar item - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody - * @returns unknown unstar item - * @throws ApiError - */ -export const unstar = (data: UnstarData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/favorites/unstar', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * List Inputs used in previously completed jobs - * @param data The data for the request. - * @param data.workspace - * @param data.runnableId - * @param data.runnableType - * @param data.page which page to return (start at 1, default 1) - * @param data.perPage number of items to return for a given page (default 30, max 100) - * @param data.args filter on jobs containing those args as a json subset (@> in postgres) - * @param data.includePreview - * @returns Input Input history for completed jobs - * @throws ApiError - */ -export const getInputHistory = (data: GetInputHistoryData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/inputs/history', - path: { - workspace: data.workspace - }, - query: { - runnable_id: data.runnableId, - runnable_type: data.runnableType, - page: data.page, - per_page: data.perPage, - args: data.args, - include_preview: data.includePreview - } -}); }; - -/** - * Get args from history or saved input - * @param data The data for the request. - * @param data.workspace - * @param data.jobOrInputId - * @param data.input - * @param data.allowLarge - * @returns unknown args - * @throws ApiError - */ -export const getArgsFromHistoryOrSavedInput = (data: GetArgsFromHistoryOrSavedInputData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/inputs/{jobOrInputId}/args', - path: { - workspace: data.workspace, - jobOrInputId: data.jobOrInputId - }, - query: { - input: data.input, - allow_large: data.allowLarge - } -}); }; - -/** - * List saved Inputs for a Runnable - * @param data The data for the request. - * @param data.workspace - * @param data.runnableId - * @param data.runnableType - * @param data.page which page to return (start at 1, default 1) - * @param data.perPage number of items to return for a given page (default 30, max 100) - * @returns Input Saved Inputs for a Runnable - * @throws ApiError - */ -export const listInputs = (data: ListInputsData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/inputs/list', - path: { - workspace: data.workspace - }, - query: { - runnable_id: data.runnableId, - runnable_type: data.runnableType, - page: data.page, - per_page: data.perPage - } -}); }; - -/** - * Create an Input for future use in a script or flow - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody Input - * @param data.runnableId - * @param data.runnableType - * @returns string Input created - * @throws ApiError - */ -export const createInput = (data: CreateInputData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/inputs/create', - path: { - workspace: data.workspace - }, - query: { - runnable_id: data.runnableId, - runnable_type: data.runnableType - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * Update an Input - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody UpdateInput - * @returns string Input updated - * @throws ApiError - */ -export const updateInput = (data: UpdateInputData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/inputs/update', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * Delete a Saved Input - * @param data The data for the request. - * @param data.workspace - * @param data.input - * @returns string Input deleted - * @throws ApiError - */ -export const deleteInput = (data: DeleteInputData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/inputs/delete/{input}', - path: { - workspace: data.workspace, - input: data.input - } -}); }; - -/** - * Converts an S3 resource to the set of instructions necessary to connect DuckDB to an S3 bucket - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody S3 resource to connect to - * @returns unknown Connection settings - * @throws ApiError - */ -export const duckdbConnectionSettings = (data: DuckdbConnectionSettingsData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/job_helpers/duckdb_connection_settings', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * Converts an S3 resource to the set of instructions necessary to connect DuckDB to an S3 bucket - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody S3 resource path to use to generate the connection settings. If empty, the S3 resource defined in the workspace settings will be used - * @returns unknown Connection settings - * @throws ApiError - */ -export const duckdbConnectionSettingsV2 = (data: DuckdbConnectionSettingsV2Data): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/job_helpers/v2/duckdb_connection_settings', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * Converts an S3 resource to the set of arguments necessary to connect Polars to an S3 bucket - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody S3 resource to connect to - * @returns unknown Connection settings - * @throws ApiError - */ -export const polarsConnectionSettings = (data: PolarsConnectionSettingsData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/job_helpers/polars_connection_settings', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * Converts an S3 resource to the set of arguments necessary to connect Polars to an S3 bucket - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody S3 resource path to use to generate the connection settings. If empty, the S3 resource defined in the workspace settings will be used - * @returns unknown Connection settings - * @throws ApiError - */ -export const polarsConnectionSettingsV2 = (data: PolarsConnectionSettingsV2Data): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/job_helpers/v2/polars_connection_settings', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * Returns the s3 resource associated to the provided path, or the workspace default S3 resource - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody S3 resource path to use. If empty, the S3 resource defined in the workspace settings will be used - * @returns S3Resource Connection settings - * @throws ApiError - */ -export const s3ResourceInfo = (data: S3ResourceInfoData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/job_helpers/v2/s3_resource_info', - path: { - workspace: data.workspace - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * Test connection to the workspace object storage - * @param data The data for the request. - * @param data.workspace - * @param data.storage - * @returns unknown Connection settings - * @throws ApiError - */ -export const datasetStorageTestConnection = (data: DatasetStorageTestConnectionData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/job_helpers/test_connection', - path: { - workspace: data.workspace - }, - query: { - storage: data.storage - } -}); }; - -/** - * List the file keys available in a workspace object storage - * @param data The data for the request. - * @param data.workspace - * @param data.maxKeys - * @param data.marker - * @param data.prefix - * @param data.storage - * @returns unknown List of file keys - * @throws ApiError - */ -export const listStoredFiles = (data: ListStoredFilesData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/job_helpers/list_stored_files', - path: { - workspace: data.workspace - }, - query: { - max_keys: data.maxKeys, - marker: data.marker, - prefix: data.prefix, - storage: data.storage - } -}); }; - -/** - * Load metadata of the file - * @param data The data for the request. - * @param data.workspace - * @param data.fileKey - * @param data.storage - * @returns WindmillFileMetadata FileMetadata - * @throws ApiError - */ -export const loadFileMetadata = (data: LoadFileMetadataData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/job_helpers/load_file_metadata', - path: { - workspace: data.workspace - }, - query: { - file_key: data.fileKey, - storage: data.storage - } -}); }; - -/** - * Load a preview of the file - * @param data The data for the request. - * @param data.workspace - * @param data.fileKey - * @param data.fileSizeInBytes - * @param data.fileMimeType - * @param data.csvSeparator - * @param data.csvHasHeader - * @param data.readBytesFrom - * @param data.readBytesLength - * @param data.storage - * @returns WindmillFilePreview FilePreview - * @throws ApiError - */ -export const loadFilePreview = (data: LoadFilePreviewData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/job_helpers/load_file_preview', - path: { - workspace: data.workspace - }, - query: { - file_key: data.fileKey, - file_size_in_bytes: data.fileSizeInBytes, - file_mime_type: data.fileMimeType, - csv_separator: data.csvSeparator, - csv_has_header: data.csvHasHeader, - read_bytes_from: data.readBytesFrom, - read_bytes_length: data.readBytesLength, - storage: data.storage - } -}); }; - -/** - * Load a preview of a parquet file - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.offset - * @param data.limit - * @param data.sortCol - * @param data.sortDesc - * @param data.searchCol - * @param data.searchTerm - * @param data.storage - * @returns unknown Parquet Preview - * @throws ApiError - */ -export const loadParquetPreview = (data: LoadParquetPreviewData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/job_helpers/load_parquet_preview/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - query: { - offset: data.offset, - limit: data.limit, - sort_col: data.sortCol, - sort_desc: data.sortDesc, - search_col: data.searchCol, - search_term: data.searchTerm, - storage: data.storage - } -}); }; - -/** - * Load the table row count - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.searchCol - * @param data.searchTerm - * @param data.storage - * @returns unknown Table count - * @throws ApiError - */ -export const loadTableRowCount = (data: LoadTableRowCountData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/job_helpers/load_table_count/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - query: { - search_col: data.searchCol, - search_term: data.searchTerm, - storage: data.storage - } -}); }; - -/** - * Load a preview of a csv file - * @param data The data for the request. - * @param data.workspace - * @param data.path - * @param data.offset - * @param data.limit - * @param data.sortCol - * @param data.sortDesc - * @param data.searchCol - * @param data.searchTerm - * @param data.storage - * @param data.csvSeparator - * @returns unknown Csv Preview - * @throws ApiError - */ -export const loadCsvPreview = (data: LoadCsvPreviewData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/job_helpers/load_csv_preview/{path}', - path: { - workspace: data.workspace, - path: data.path - }, - query: { - offset: data.offset, - limit: data.limit, - sort_col: data.sortCol, - sort_desc: data.sortDesc, - search_col: data.searchCol, - search_term: data.searchTerm, - storage: data.storage, - csv_separator: data.csvSeparator - } -}); }; - -/** - * Permanently delete file from S3 - * @param data The data for the request. - * @param data.workspace - * @param data.fileKey - * @param data.storage - * @returns unknown Confirmation - * @throws ApiError - */ -export const deleteS3File = (data: DeleteS3FileData): CancelablePromise => { return __request(OpenAPI, { - method: 'DELETE', - url: '/w/{workspace}/job_helpers/delete_s3_file', - path: { - workspace: data.workspace - }, - query: { - file_key: data.fileKey, - storage: data.storage - } -}); }; - -/** - * Move a S3 file from one path to the other within the same bucket - * @param data The data for the request. - * @param data.workspace - * @param data.srcFileKey - * @param data.destFileKey - * @param data.storage - * @returns unknown Confirmation - * @throws ApiError - */ -export const moveS3File = (data: MoveS3FileData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/job_helpers/move_s3_file', - path: { - workspace: data.workspace - }, - query: { - src_file_key: data.srcFileKey, - dest_file_key: data.destFileKey, - storage: data.storage - } -}); }; - -/** - * Upload file to S3 bucket - * @param data The data for the request. - * @param data.workspace - * @param data.requestBody File content - * @param data.fileKey - * @param data.fileExtension - * @param data.s3ResourcePath - * @param data.resourceType - * @param data.storage - * @param data.contentType - * @param data.contentDisposition - * @returns unknown File upload status - * @throws ApiError - */ -export const fileUpload = (data: FileUploadData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/job_helpers/upload_s3_file', - path: { - workspace: data.workspace - }, - query: { - file_key: data.fileKey, - file_extension: data.fileExtension, - s3_resource_path: data.s3ResourcePath, - resource_type: data.resourceType, - storage: data.storage, - content_type: data.contentType, - content_disposition: data.contentDisposition - }, - body: data.requestBody, - mediaType: 'application/octet-stream' -}); }; - -/** - * Download file from S3 bucket - * @param data The data for the request. - * @param data.workspace - * @param data.fileKey - * @param data.s3ResourcePath - * @param data.resourceType - * @param data.storage - * @returns binary Chunk of the downloaded file - * @throws ApiError - */ -export const fileDownload = (data: FileDownloadData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/job_helpers/download_s3_file', - path: { - workspace: data.workspace - }, - query: { - file_key: data.fileKey, - s3_resource_path: data.s3ResourcePath, - resource_type: data.resourceType, - storage: data.storage - } -}); }; - -/** - * Download file to S3 bucket - * @param data The data for the request. - * @param data.workspace - * @param data.fileKey - * @param data.s3ResourcePath - * @param data.resourceType - * @returns string The downloaded file - * @throws ApiError - */ -export const fileDownloadParquetAsCsv = (data: FileDownloadParquetAsCsvData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/job_helpers/download_s3_parquet_file_as_csv', - path: { - workspace: data.workspace - }, - query: { - file_key: data.fileKey, - s3_resource_path: data.s3ResourcePath, - resource_type: data.resourceType - } -}); }; - -/** - * get job metrics - * @param data The data for the request. - * @param data.workspace - * @param data.id - * @param data.requestBody parameters for statistics retrieval - * @returns unknown job details - * @throws ApiError - */ -export const getJobMetrics = (data: GetJobMetricsData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/job_metrics/get/{id}', - path: { - workspace: data.workspace, - id: data.id - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * set job metrics - * @param data The data for the request. - * @param data.workspace - * @param data.id - * @param data.requestBody parameters for statistics retrieval - * @returns unknown Job progress updated - * @throws ApiError - */ -export const setJobProgress = (data: SetJobProgressData): CancelablePromise => { return __request(OpenAPI, { - method: 'POST', - url: '/w/{workspace}/job_metrics/set_progress/{id}', - path: { - workspace: data.workspace, - id: data.id - }, - body: data.requestBody, - mediaType: 'application/json' -}); }; - -/** - * get job progress - * @param data The data for the request. - * @param data.workspace - * @param data.id - * @returns number job progress between 0 and 99 - * @throws ApiError - */ -export const getJobProgress = (data: GetJobProgressData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/job_metrics/get_progress/{id}', - path: { - workspace: data.workspace, - id: data.id - } -}); }; - -/** - * list log files ordered by timestamp - * @param data The data for the request. - * @param data.before filter on started before (inclusive) timestamp - * @param data.after filter on created after (exclusive) timestamp - * @param data.withError - * @returns unknown time - * @throws ApiError - */ -export const listLogFiles = (data: ListLogFilesData = {}): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/service_logs/list_files', - query: { - before: data.before, - after: data.after, - with_error: data.withError - } -}); }; - -/** - * get log file by path - * @param data The data for the request. - * @param data.path - * @returns string log stream - * @throws ApiError - */ -export const getLogFile = (data: GetLogFileData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/service_logs/get_log_file/{path}', - path: { - path: data.path - } -}); }; - -/** - * List all concurrency groups - * @returns ConcurrencyGroup all concurrency groups - * @throws ApiError - */ -export const listConcurrencyGroups = (): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/concurrency_groups/list' -}); }; - -/** - * Delete concurrency group - * @param data The data for the request. - * @param data.concurrencyId - * @returns unknown concurrency group removed - * @throws ApiError - */ -export const deleteConcurrencyGroup = (data: DeleteConcurrencyGroupData): CancelablePromise => { return __request(OpenAPI, { - method: 'DELETE', - url: '/concurrency_groups/prune/{concurrency_id}', - path: { - concurrency_id: data.concurrencyId - } -}); }; - -/** - * Get the concurrency key for a job that has concurrency limits enabled - * @param data The data for the request. - * @param data.id - * @returns string concurrency key for given job - * @throws ApiError - */ -export const getConcurrencyKey = (data: GetConcurrencyKeyData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/concurrency_groups/{id}/key', - path: { - id: data.id - } -}); }; - -/** - * Get intervals of job runtime concurrency - * @param data The data for the request. - * @param data.workspace - * @param data.concurrencyKey - * @param data.rowLimit - * @param data.createdBy mask to filter exact matching user creator - * @param data.label mask to filter exact matching job's label (job labels are completed jobs with as a result an object containing a string in the array at key 'wm_labels') - * @param data.parentJob The parent job that is at the origin and responsible for the execution of this script if any - * @param data.scriptPathExact mask to filter exact matching path - * @param data.scriptPathStart mask to filter matching starting path - * @param data.schedulePath mask to filter by schedule path - * @param data.scriptHash mask to filter exact matching path - * @param data.startedBefore filter on started before (inclusive) timestamp - * @param data.startedAfter filter on started after (exclusive) timestamp - * @param data.createdOrStartedBefore filter on created_at for non non started job and started_at otherwise before (inclusive) timestamp - * @param data.running filter on running jobs - * @param data.scheduledForBeforeNow filter on jobs scheduled_for before now (hence waitinf for a worker) - * @param data.createdOrStartedAfter filter on created_at for non non started job and started_at otherwise after (exclusive) timestamp - * @param data.createdOrStartedAfterCompletedJobs filter on created_at for non non started job and started_at otherwise after (exclusive) timestamp but only for the completed jobs - * @param data.jobKinds filter on job kind (values 'preview', 'script', 'dependencies', 'flow') separated by, - * @param data.args filter on jobs containing those args as a json subset (@> in postgres) - * @param data.tag filter on jobs with a given tag/worker group - * @param data.result filter on jobs containing those result as a json subset (@> in postgres) - * @param data.allowWildcards allow wildcards (*) in the filter of label, tag, worker - * @param data.page which page to return (start at 1, default 1) - * @param data.perPage number of items to return for a given page (default 30, max 100) - * @param data.isSkipped is the job skipped - * @param data.isFlowStep is the job a flow step - * @param data.hasNullParent has null parent - * @param data.success filter on successful jobs - * @param data.allWorkspaces get jobs from all workspaces (only valid if request come from the `admins` workspace) - * @param data.isNotSchedule is not a scheduled job - * @returns ExtendedJobs time - * @throws ApiError - */ -export const listExtendedJobs = (data: ListExtendedJobsData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/w/{workspace}/concurrency_groups/list_jobs', - path: { - workspace: data.workspace - }, - query: { - concurrency_key: data.concurrencyKey, - row_limit: data.rowLimit, - created_by: data.createdBy, - label: data.label, - parent_job: data.parentJob, - script_path_exact: data.scriptPathExact, - script_path_start: data.scriptPathStart, - schedule_path: data.schedulePath, - script_hash: data.scriptHash, - started_before: data.startedBefore, - started_after: data.startedAfter, - created_or_started_before: data.createdOrStartedBefore, - running: data.running, - scheduled_for_before_now: data.scheduledForBeforeNow, - created_or_started_after: data.createdOrStartedAfter, - created_or_started_after_completed_jobs: data.createdOrStartedAfterCompletedJobs, - job_kinds: data.jobKinds, - args: data.args, - tag: data.tag, - result: data.result, - allow_wildcards: data.allowWildcards, - page: data.page, - per_page: data.perPage, - is_skipped: data.isSkipped, - is_flow_step: data.isFlowStep, - has_null_parent: data.hasNullParent, - success: data.success, - all_workspaces: data.allWorkspaces, - is_not_schedule: data.isNotSchedule - } -}); }; - -/** - * Search through jobs with a string query - * @param data The data for the request. - * @param data.workspace - * @param data.searchQuery - * @returns unknown search results - * @throws ApiError - */ -export const searchJobsIndex = (data: SearchJobsIndexData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/srch/w/{workspace}/index/search/job', - path: { - workspace: data.workspace - }, - query: { - search_query: data.searchQuery - } -}); }; - -/** - * Search through service logs with a string query - * @param data The data for the request. - * @param data.searchQuery - * @param data.mode - * @param data.hostname - * @param data.workerGroup - * @param data.minTs - * @param data.maxTs - * @returns unknown search results - * @throws ApiError - */ -export const searchLogsIndex = (data: SearchLogsIndexData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/srch/index/search/service_logs', - query: { - search_query: data.searchQuery, - mode: data.mode, - worker_group: data.workerGroup, - hostname: data.hostname, - min_ts: data.minTs, - max_ts: data.maxTs - } -}); }; - -/** - * Search and count the log line hits on every provided host - * @param data The data for the request. - * @param data.searchQuery - * @param data.minTs - * @param data.maxTs - * @returns unknown search results - * @throws ApiError - */ -export const countSearchLogsIndex = (data: CountSearchLogsIndexData): CancelablePromise => { return __request(OpenAPI, { - method: 'GET', - url: '/srch/index/search/count_service_logs', - query: { - search_query: data.searchQuery, - min_ts: data.minTs, - max_ts: data.maxTs - } -}); }; - -/** - * Restart container and delete the index to recreate it. - * @param data The data for the request. - * @param data.idxName - * @returns string idx to be deleted and container restarting - * @throws ApiError - */ -export const clearIndex = (data: ClearIndexData): CancelablePromise => { return __request(OpenAPI, { - method: 'DELETE', - url: '/srch/index/delete/{idx_name}', - path: { - idx_name: data.idxName - } -}); }; \ No newline at end of file diff --git a/cli/gen/types.gen.ts b/cli/gen/types.gen.ts deleted file mode 100644 index a7924d0b90..0000000000 --- a/cli/gen/types.gen.ts +++ /dev/null @@ -1,7828 +0,0 @@ -// This file is auto-generated by @hey-api/openapi-ts - -export type AIProvider = 'openai' | 'azure_openai' | 'anthropic' | 'mistral' | 'deepseek' | 'googleai' | 'groq' | 'openrouter' | 'togetherai' | 'customai'; - -export type AIProviderModel = { - model: string; - provider: AIProvider; -}; - -export type AIProviderConfig = { - resource_path: string; - models: Array<(string)>; -}; - -export type AIConfig = { - providers?: { - [key: string]: AIProviderConfig; - }; - default_model?: AIProviderModel; - code_completion_model?: AIProviderModel; -}; - -export type Script = { - workspace_id?: string; - hash: string; - path: string; - /** - * The first element is the direct parent of the script, the second is the parent of the first, etc - * - */ - parent_hashes?: Array<(string)>; - summary: string; - description: string; - content: string; - created_by: string; - created_at: string; - archived: boolean; - schema?: { - [key: string]: unknown; - }; - deleted: boolean; - is_template: boolean; - extra_perms: { - [key: string]: (boolean); - }; - lock?: string; - lock_error_logs?: string; - language: ScriptLang; - kind: 'script' | 'failure' | 'trigger' | 'command' | 'approval' | 'preprocessor'; - starred: boolean; - tag?: string; - has_draft?: boolean; - draft_only?: boolean; - envs?: Array<(string)>; - concurrent_limit?: number; - concurrency_time_window_s?: number; - concurrency_key?: string; - cache_ttl?: number; - dedicated_worker?: boolean; - ws_error_handler_muted?: boolean; - priority?: number; - restart_unless_cancelled?: boolean; - timeout?: number; - delete_after_use?: boolean; - visible_to_runner_only?: boolean; - no_main_func: boolean; - codebase?: string; - has_preprocessor: boolean; - on_behalf_of_email?: string; -}; - -export type kind = 'script' | 'failure' | 'trigger' | 'command' | 'approval' | 'preprocessor'; - -export type NewScript = { - path: string; - parent_hash?: string; - summary: string; - description: string; - content: string; - schema?: { - [key: string]: unknown; - }; - is_template?: boolean; - lock?: string; - language: ScriptLang; - kind?: 'script' | 'failure' | 'trigger' | 'command' | 'approval' | 'preprocessor'; - tag?: string; - draft_only?: boolean; - envs?: Array<(string)>; - concurrent_limit?: number; - concurrency_time_window_s?: number; - cache_ttl?: number; - dedicated_worker?: boolean; - ws_error_handler_muted?: boolean; - priority?: number; - restart_unless_cancelled?: boolean; - timeout?: number; - delete_after_use?: boolean; - deployment_message?: string; - concurrency_key?: string; - visible_to_runner_only?: boolean; - no_main_func?: boolean; - codebase?: string; - has_preprocessor?: boolean; - on_behalf_of_email?: string; -}; - -export type NewScriptWithDraft = NewScript & { - draft?: NewScript; - hash: string; -}; - -export type ScriptHistory = { - script_hash: string; - deployment_msg?: string; -}; - -export type ScriptArgs = { - [key: string]: unknown; -}; - -export type Input = { - id: string; - name: string; - created_by: string; - created_at: string; - is_public: boolean; - success?: boolean; -}; - -export type CreateInput = { - name: string; - args: { - [key: string]: unknown; - }; -}; - -export type UpdateInput = { - id: string; - name: string; - is_public: boolean; -}; - -export type RunnableType = 'ScriptHash' | 'ScriptPath' | 'FlowPath'; - -export type QueuedJob = { - workspace_id?: string; - id: string; - parent_job?: string; - created_by?: string; - created_at?: string; - started_at?: string; - scheduled_for?: string; - running: boolean; - script_path?: string; - script_hash?: string; - args?: ScriptArgs; - logs?: string; - raw_code?: string; - canceled: boolean; - canceled_by?: string; - canceled_reason?: string; - last_ping?: string; - job_kind: 'script' | 'preview' | 'dependencies' | 'flowdependencies' | 'appdependencies' | 'flow' | 'flowpreview' | 'script_hub' | 'identity' | 'deploymentcallback' | 'singlescriptflow' | 'flowscript' | 'flownode' | 'appscript'; - schedule_path?: string; - /** - * The user (u/userfoo) or group (g/groupfoo) whom - * the execution of this script will be permissioned_as and by extension its DT_TOKEN. - * - */ - permissioned_as: string; - flow_status?: FlowStatus; - raw_flow?: FlowValue; - is_flow_step: boolean; - language?: ScriptLang; - email: string; - visible_to_owner: boolean; - mem_peak?: number; - tag: string; - priority?: number; - self_wait_time_ms?: number; - aggregate_wait_time_ms?: number; - suspend?: number; - preprocessed?: boolean; - worker?: string; -}; - -export type job_kind = 'script' | 'preview' | 'dependencies' | 'flowdependencies' | 'appdependencies' | 'flow' | 'flowpreview' | 'script_hub' | 'identity' | 'deploymentcallback' | 'singlescriptflow' | 'flowscript' | 'flownode' | 'appscript'; - -export type CompletedJob = { - workspace_id?: string; - id: string; - parent_job?: string; - created_by: string; - created_at: string; - started_at: string; - duration_ms: number; - success: boolean; - script_path?: string; - script_hash?: string; - args?: ScriptArgs; - result?: unknown; - logs?: string; - deleted?: boolean; - raw_code?: string; - canceled: boolean; - canceled_by?: string; - canceled_reason?: string; - job_kind: 'script' | 'preview' | 'dependencies' | 'flow' | 'flowdependencies' | 'appdependencies' | 'flowpreview' | 'script_hub' | 'identity' | 'deploymentcallback' | 'singlescriptflow' | 'flowscript' | 'flownode' | 'appscript'; - schedule_path?: string; - /** - * The user (u/userfoo) or group (g/groupfoo) whom - * the execution of this script will be permissioned_as and by extension its DT_TOKEN. - * - */ - permissioned_as: string; - flow_status?: FlowStatus; - raw_flow?: FlowValue; - is_flow_step: boolean; - language?: ScriptLang; - is_skipped: boolean; - email: string; - visible_to_owner: boolean; - mem_peak?: number; - tag: string; - priority?: number; - labels?: Array<(string)>; - self_wait_time_ms?: number; - aggregate_wait_time_ms?: number; - preprocessed?: boolean; - worker?: string; -}; - -export type ObscuredJob = { - typ?: string; - started_at?: string; - duration_ms?: number; -}; - -export type Job = (CompletedJob & { - type?: 'CompletedJob'; -}) | (QueuedJob & { - type?: 'QueuedJob'; -}); - -export type type = 'CompletedJob'; - -export type User = { - email: string; - username: string; - is_admin: boolean; - name?: string; - is_super_admin: boolean; - created_at: string; - operator: boolean; - disabled: boolean; - groups?: Array<(string)>; - folders: Array<(string)>; - folders_owners: Array<(string)>; -}; - -export type UserUsage = { - email?: string; - executions?: number; -}; - -export type Login = { - email: string; - password: string; -}; - -export type EditWorkspaceUser = { - is_admin?: boolean; - operator?: boolean; - disabled?: boolean; -}; - -export type TruncatedToken = { - label?: string; - expiration?: string; - token_prefix: string; - created_at: string; - last_used_at: string; - scopes?: Array<(string)>; - email?: string; -}; - -export type NewToken = { - label?: string; - expiration?: string; - scopes?: Array<(string)>; - workspace_id?: string; -}; - -export type NewTokenImpersonate = { - label?: string; - expiration?: string; - impersonate_email: string; - workspace_id?: string; -}; - -export type ListableVariable = { - workspace_id: string; - path: string; - value?: string; - is_secret: boolean; - description?: string; - account?: number; - is_oauth?: boolean; - extra_perms: { - [key: string]: (boolean); - }; - is_expired?: boolean; - refresh_error?: string; - is_linked?: boolean; - is_refreshed?: boolean; - expires_at?: string; -}; - -export type ContextualVariable = { - name: string; - value: string; - description: string; - is_custom: boolean; -}; - -export type CreateVariable = { - path: string; - value: string; - is_secret: boolean; - description: string; - account?: number; - is_oauth?: boolean; - expires_at?: string; -}; - -export type EditVariable = { - path?: string; - value?: string; - is_secret?: boolean; - description?: string; -}; - -export type AuditLog = { - id: number; - timestamp: string; - username: string; - operation: 'jobs.run' | 'jobs.run.script' | 'jobs.run.preview' | 'jobs.run.flow' | 'jobs.run.flow_preview' | 'jobs.run.script_hub' | 'jobs.run.dependencies' | 'jobs.run.identity' | 'jobs.run.noop' | 'jobs.flow_dependencies' | 'jobs' | 'jobs.cancel' | 'jobs.force_cancel' | 'jobs.disapproval' | 'jobs.delete' | 'account.delete' | 'ai.request' | 'resources.create' | 'resources.update' | 'resources.delete' | 'resource_types.create' | 'resource_types.update' | 'resource_types.delete' | 'schedule.create' | 'schedule.setenabled' | 'schedule.edit' | 'schedule.delete' | 'scripts.create' | 'scripts.update' | 'scripts.archive' | 'scripts.delete' | 'users.create' | 'users.delete' | 'users.update' | 'users.login' | 'users.login_failure' | 'users.logout' | 'users.accept_invite' | 'users.decline_invite' | 'users.token.create' | 'users.token.delete' | 'users.add_to_workspace' | 'users.add_global' | 'users.setpassword' | 'users.impersonate' | 'users.leave_workspace' | 'oauth.login' | 'oauth.login_failure' | 'oauth.signup' | 'variables.create' | 'variables.delete' | 'variables.update' | 'flows.create' | 'flows.update' | 'flows.delete' | 'flows.archive' | 'apps.create' | 'apps.update' | 'apps.delete' | 'folder.create' | 'folder.update' | 'folder.delete' | 'folder.add_owner' | 'folder.remove_owner' | 'group.create' | 'group.delete' | 'group.edit' | 'group.adduser' | 'group.removeuser' | 'igroup.create' | 'igroup.delete' | 'igroup.adduser' | 'igroup.removeuser' | 'variables.decrypt_secret' | 'workspaces.edit_command_script' | 'workspaces.edit_deploy_to' | 'workspaces.edit_auto_invite_domain' | 'workspaces.edit_webhook' | 'workspaces.edit_copilot_config' | 'workspaces.edit_error_handler' | 'workspaces.create' | 'workspaces.update' | 'workspaces.archive' | 'workspaces.unarchive' | 'workspaces.delete'; - action_kind: 'Created' | 'Updated' | 'Delete' | 'Execute'; - resource?: string; - parameters?: { - [key: string]: unknown; - }; -}; - -export type operation = 'jobs.run' | 'jobs.run.script' | 'jobs.run.preview' | 'jobs.run.flow' | 'jobs.run.flow_preview' | 'jobs.run.script_hub' | 'jobs.run.dependencies' | 'jobs.run.identity' | 'jobs.run.noop' | 'jobs.flow_dependencies' | 'jobs' | 'jobs.cancel' | 'jobs.force_cancel' | 'jobs.disapproval' | 'jobs.delete' | 'account.delete' | 'ai.request' | 'resources.create' | 'resources.update' | 'resources.delete' | 'resource_types.create' | 'resource_types.update' | 'resource_types.delete' | 'schedule.create' | 'schedule.setenabled' | 'schedule.edit' | 'schedule.delete' | 'scripts.create' | 'scripts.update' | 'scripts.archive' | 'scripts.delete' | 'users.create' | 'users.delete' | 'users.update' | 'users.login' | 'users.login_failure' | 'users.logout' | 'users.accept_invite' | 'users.decline_invite' | 'users.token.create' | 'users.token.delete' | 'users.add_to_workspace' | 'users.add_global' | 'users.setpassword' | 'users.impersonate' | 'users.leave_workspace' | 'oauth.login' | 'oauth.login_failure' | 'oauth.signup' | 'variables.create' | 'variables.delete' | 'variables.update' | 'flows.create' | 'flows.update' | 'flows.delete' | 'flows.archive' | 'apps.create' | 'apps.update' | 'apps.delete' | 'folder.create' | 'folder.update' | 'folder.delete' | 'folder.add_owner' | 'folder.remove_owner' | 'group.create' | 'group.delete' | 'group.edit' | 'group.adduser' | 'group.removeuser' | 'igroup.create' | 'igroup.delete' | 'igroup.adduser' | 'igroup.removeuser' | 'variables.decrypt_secret' | 'workspaces.edit_command_script' | 'workspaces.edit_deploy_to' | 'workspaces.edit_auto_invite_domain' | 'workspaces.edit_webhook' | 'workspaces.edit_copilot_config' | 'workspaces.edit_error_handler' | 'workspaces.create' | 'workspaces.update' | 'workspaces.archive' | 'workspaces.unarchive' | 'workspaces.delete'; - -export type action_kind = 'Created' | 'Updated' | 'Delete' | 'Execute'; - -export type MainArgSignature = { - type: 'Valid' | 'Invalid'; - error: string; - star_args: boolean; - star_kwargs?: boolean; - args: Array<{ - name: string; - typ: ('float' | 'int' | 'bool' | 'email' | 'unknown' | 'bytes' | 'dict' | 'datetime' | 'sql' | { - resource: (string) | null; -} | { - str: Array<(string)> | null; -} | { - object: Array<{ - key: string; - typ: ('float' | 'int' | 'bool' | 'email' | 'unknown' | 'bytes' | 'dict' | 'datetime' | 'sql' | { - str: unknown; -}); - }>; -} | { - list: (('float' | 'int' | 'bool' | 'email' | 'unknown' | 'bytes' | 'dict' | 'datetime' | 'sql' | { - str: unknown; -}) | null); -}); - has_default?: boolean; - default?: unknown; - }>; - no_main_func: (boolean) | null; - has_preprocessor: (boolean) | null; -}; - -export type type2 = 'Valid' | 'Invalid'; - -export type ScriptLang = 'python3' | 'deno' | 'go' | 'bash' | 'powershell' | 'postgresql' | 'mysql' | 'bigquery' | 'snowflake' | 'mssql' | 'oracledb' | 'graphql' | 'nativets' | 'bun' | 'php' | 'rust' | 'ansible' | 'csharp' | 'nu' | 'java'; - -export type Preview = { - content?: string; - path?: string; - args: ScriptArgs; - language?: ScriptLang; - tag?: string; - kind?: 'code' | 'identity' | 'http'; - dedicated_worker?: boolean; - lock?: string; -}; - -export type kind2 = 'code' | 'identity' | 'http'; - -export type WorkflowTask = { - args: ScriptArgs; -}; - -export type WorkflowStatusRecord = { - [key: string]: WorkflowStatus; -}; - -export type WorkflowStatus = { - scheduled_for?: string; - started_at?: string; - duration_ms?: number; - name?: string; -}; - -export type CreateResource = { - path: string; - value: unknown; - description?: string; - resource_type: string; -}; - -export type EditResource = { - path?: string; - description?: string; - value?: unknown; -}; - -export type Resource = { - workspace_id?: string; - path: string; - description?: string; - resource_type: string; - value?: unknown; - is_oauth: boolean; - extra_perms?: { - [key: string]: (boolean); - }; - created_by?: string; - edited_at?: string; -}; - -export type ListableResource = { - workspace_id?: string; - path: string; - description?: string; - resource_type: string; - value?: unknown; - is_oauth: boolean; - extra_perms?: { - [key: string]: (boolean); - }; - is_expired?: boolean; - refresh_error?: string; - is_linked: boolean; - is_refreshed: boolean; - account?: number; - created_by?: string; - edited_at?: string; -}; - -export type ResourceType = { - workspace_id?: string; - name: string; - schema?: unknown; - description?: string; - created_by?: string; - edited_at?: string; - format_extension?: string; -}; - -export type EditResourceType = { - schema?: unknown; - description?: string; -}; - -export type Schedule = { - path: string; - edited_by: string; - edited_at: string; - schedule: string; - timezone: string; - enabled: boolean; - script_path: string; - is_flow: boolean; - args?: ScriptArgs; - extra_perms: { - [key: string]: (boolean); - }; - email: string; - error?: string; - on_failure?: string; - on_failure_times?: number; - on_failure_exact?: boolean; - on_failure_extra_args?: ScriptArgs; - on_recovery?: string; - on_recovery_times?: number; - on_recovery_extra_args?: ScriptArgs; - on_success?: string; - on_success_extra_args?: ScriptArgs; - ws_error_handler_muted?: boolean; - retry?: Retry; - summary?: string; - description?: string; - no_flow_overlap?: boolean; - tag?: string; - paused_until?: string; - cron_version?: string; -}; - -export type ScheduleWJobs = Schedule & { - jobs?: Array<{ - id: string; - success: boolean; - duration_ms: number; - }>; -}; - -export type NewSchedule = { - path: string; - schedule: string; - timezone: string; - script_path: string; - is_flow: boolean; - args: ScriptArgs; - enabled?: boolean; - on_failure?: string; - on_failure_times?: number; - on_failure_exact?: boolean; - on_failure_extra_args?: ScriptArgs; - on_recovery?: string; - on_recovery_times?: number; - on_recovery_extra_args?: ScriptArgs; - on_success?: string; - on_success_extra_args?: ScriptArgs; - ws_error_handler_muted?: boolean; - retry?: Retry; - no_flow_overlap?: boolean; - summary?: string; - description?: string; - tag?: string; - paused_until?: string; - cron_version?: string; -}; - -export type EditSchedule = { - schedule: string; - timezone: string; - args: ScriptArgs; - on_failure?: string; - on_failure_times?: number; - on_failure_exact?: boolean; - on_failure_extra_args?: ScriptArgs; - on_recovery?: string; - on_recovery_times?: number; - on_recovery_extra_args?: ScriptArgs; - on_success?: string; - on_success_extra_args?: ScriptArgs; - ws_error_handler_muted?: boolean; - retry?: Retry; - no_flow_overlap?: boolean; - summary?: string; - description?: string; - tag?: string; - paused_until?: string; - cron_version?: string; -}; - -export type TriggerExtraProperty = { - path: string; - script_path: string; - email: string; - extra_perms: { - [key: string]: (boolean); - }; - workspace_id: string; - edited_by: string; - edited_at: string; - is_flow: boolean; -}; - -export type AuthenticationMethod = 'none' | 'windmill' | 'api_key' | 'basic_http' | 'custom_script' | 'signature'; - -export type HttpTrigger = TriggerExtraProperty & { - route_path: string; - static_asset_config?: { - s3: string; - storage?: string; - filename?: string; - }; - http_method: 'get' | 'post' | 'put' | 'delete' | 'patch'; - authentication_resource_path?: string; - is_async: boolean; - authentication_method: AuthenticationMethod; - is_static_website: boolean; - workspaced_route: boolean; - wrap_body: boolean; - raw_string: boolean; -}; - -export type http_method = 'get' | 'post' | 'put' | 'delete' | 'patch'; - -export type NewHttpTrigger = { - path: string; - script_path: string; - route_path: string; - workspaced_route?: boolean; - static_asset_config?: { - s3: string; - storage?: string; - filename?: string; - }; - is_flow: boolean; - http_method: 'get' | 'post' | 'put' | 'delete' | 'patch'; - authentication_resource_path?: string; - is_async: boolean; - authentication_method: AuthenticationMethod; - is_static_website: boolean; - wrap_body?: boolean; - raw_string?: boolean; -}; - -export type EditHttpTrigger = { - path: string; - script_path: string; - route_path?: string; - workspaced_route?: boolean; - static_asset_config?: { - s3: string; - storage?: string; - filename?: string; - }; - authentication_resource_path?: string; - is_flow: boolean; - http_method: 'get' | 'post' | 'put' | 'delete' | 'patch'; - is_async: boolean; - authentication_method: AuthenticationMethod; - is_static_website: boolean; - wrap_body?: boolean; - raw_string?: boolean; -}; - -export type TriggersCount = { - primary_schedule?: { - schedule?: string; - }; - schedule_count?: number; - http_routes_count?: number; - webhook_count?: number; - email_count?: number; - websocket_count?: number; - postgres_count?: number; - kafka_count?: number; - nats_count?: number; - mqtt_count?: number; - gcp_count?: number; - sqs_count?: number; -}; - -export type WebsocketTrigger = TriggerExtraProperty & { - url: string; - server_id?: string; - last_server_ping?: string; - error?: string; - enabled: boolean; - filters: Array<{ - key: string; - value: unknown; - }>; - initial_messages?: Array; - url_runnable_args?: ScriptArgs; - can_return_message: boolean; -}; - -export type NewWebsocketTrigger = { - path: string; - script_path: string; - is_flow: boolean; - url: string; - enabled?: boolean; - filters: Array<{ - key: string; - value: unknown; - }>; - initial_messages?: Array; - url_runnable_args?: ScriptArgs; - can_return_message: boolean; -}; - -export type EditWebsocketTrigger = { - url: string; - path: string; - script_path: string; - is_flow: boolean; - filters: Array<{ - key: string; - value: unknown; - }>; - initial_messages?: Array; - url_runnable_args?: ScriptArgs; - can_return_message: boolean; -}; - -export type WebsocketTriggerInitialMessage = { - raw_message: string; -} | { - runnable_result: { - path: string; - args: ScriptArgs; - is_flow: boolean; - }; -}; - -export type MqttQoS = 'qos0' | 'qos1' | 'qos2'; - -export type MqttV3Config = { - clean_session?: boolean; -}; - -export type MqttV5Config = { - clean_start?: boolean; - topic_alias?: number; - session_expiry_interval?: number; -}; - -export type MqttSubscribeTopic = { - qos: MqttQoS; - topic: string; -}; - -export type MqttClientVersion = 'v3' | 'v5'; - -export type MqttTrigger = TriggerExtraProperty & { - mqtt_resource_path: string; - subscribe_topics: Array; - v3_config?: MqttV3Config; - v5_config?: MqttV5Config; - client_id?: string; - client_version?: MqttClientVersion; - server_id?: string; - last_server_ping?: string; - error?: string; - enabled: boolean; -}; - -export type NewMqttTrigger = { - mqtt_resource_path: string; - subscribe_topics: Array; - client_id?: string; - v3_config?: MqttV3Config; - v5_config?: MqttV5Config; - client_version?: MqttClientVersion; - path: string; - script_path: string; - is_flow: boolean; - enabled?: boolean; -}; - -export type EditMqttTrigger = { - mqtt_resource_path: string; - subscribe_topics: Array; - client_id?: string; - v3_config?: MqttV3Config; - v5_config?: MqttV5Config; - client_version?: MqttClientVersion; - path: string; - script_path: string; - is_flow: boolean; - enabled: boolean; -}; - -export type DeliveryType = 'push' | 'pull'; - -export type PushConfig = { - audience?: string; - authenticate: boolean; - base_endpoint: string; -}; - -export type GcpTrigger = TriggerExtraProperty & { - gcp_resource_path: string; - topic_id: string; - subscription_id: string; - server_id?: string; - delivery_type: DeliveryType; - delivery_config?: PushConfig; - last_server_ping?: string; - error?: string; - enabled: boolean; -}; - -/** - * The mode of subscription. 'existing' means using an existing GCP subscription, while 'create_update' involves creating or updating a new subscription. - */ -export type SubscriptionMode = 'existing' | 'create_update'; - -export type GcpExistingSubscription = { - subscription_id: string; - base_endpoint: string; -}; - -export type GcpCreateUpdateSubscription = { - subscription_id?: string; - delivery_type: DeliveryType; - delivery_config?: PushConfig; -}; - -/** - * "This is a union type representing the subscription mode. - * - 'existing': Represents an existing GCP subscription, and should be accompanied by an 'ExistingGcpSubscription' object. - * - 'create_update': Represents a new or updated GCP subscription, and should be accompanied by a 'CreateUpdateConfig' object." - * - */ -export type GcpSubscriptionModeConfig = (GcpExistingSubscription | GcpCreateUpdateSubscription) & { - subscription_mode: SubscriptionMode; -}; - -export type NewGcpTrigger = { - gcp_resource_path: string; - topic_id: string; - subscription_mode: GcpSubscriptionModeConfig; - path: string; - script_path: string; - is_flow: boolean; - enabled?: boolean; -}; - -export type EditGcpTrigger = { - gcp_resource_path?: string; - topic_id: string; - subscription_mode: GcpSubscriptionModeConfig; - path: string; - script_path: string; - is_flow: boolean; - enabled: boolean; -}; - -export type GetAllTopicSubscription = { - topic_id: string; -}; - -export type DeleteGcpSubscription = { - subscription_id: string; -}; - -export type SqsTrigger = TriggerExtraProperty & { - queue_url: string; - aws_resource_path: string; - message_attributes?: Array<(string)>; - server_id?: string; - last_server_ping?: string; - error?: string; - enabled: boolean; -}; - -export type NewSqsTrigger = { - queue_url: string; - aws_resource_path: string; - message_attributes?: Array<(string)>; - path: string; - script_path: string; - is_flow: boolean; - enabled?: boolean; -}; - -export type EditSqsTrigger = { - queue_url: string; - aws_resource_path: string; - message_attributes?: Array<(string)>; - path: string; - script_path: string; - is_flow: boolean; - enabled: boolean; -}; - -export type Slot = { - name?: string; -}; - -export type SlotList = { - slot_name?: string; - active?: boolean; -}; - -export type PublicationData = { - table_to_track?: Array; - transaction_to_track: Array<(string)>; -}; - -export type TableToTrack = Array<{ - table_name: string; - columns_name?: Array<(string)>; - where_clause?: string; -}>; - -export type Relations = { - schema_name: string; - table_to_track: TableToTrack; -}; - -export type Language = 'Typescript'; - -export type TemplateScript = { - postgres_resource_path: string; - relations: Array; - language: Language; -}; - -export type PostgresTrigger = TriggerExtraProperty & { - enabled: boolean; - postgres_resource_path: string; - publication_name: string; - server_id?: string; - replication_slot_name: string; - error?: string; - last_server_ping?: string; -}; - -export type NewPostgresTrigger = { - replication_slot_name?: string; - publication_name?: string; - path: string; - script_path: string; - is_flow: boolean; - enabled: boolean; - postgres_resource_path: string; - publication?: PublicationData; -}; - -export type EditPostgresTrigger = { - replication_slot_name: string; - publication_name: string; - path: string; - script_path: string; - is_flow: boolean; - enabled: boolean; - postgres_resource_path: string; - publication?: PublicationData; -}; - -export type KafkaTrigger = TriggerExtraProperty & { - kafka_resource_path: string; - group_id: string; - topics: Array<(string)>; - server_id?: string; - last_server_ping?: string; - error?: string; - enabled: boolean; -}; - -export type NewKafkaTrigger = { - path: string; - script_path: string; - is_flow: boolean; - kafka_resource_path: string; - group_id: string; - topics: Array<(string)>; - enabled?: boolean; -}; - -export type EditKafkaTrigger = { - kafka_resource_path: string; - group_id: string; - topics: Array<(string)>; - path: string; - script_path: string; - is_flow: boolean; -}; - -export type NatsTrigger = TriggerExtraProperty & { - nats_resource_path: string; - use_jetstream: boolean; - stream_name?: string; - consumer_name?: string; - subjects: Array<(string)>; - server_id?: string; - last_server_ping?: string; - error?: string; - enabled: boolean; -}; - -export type NewNatsTrigger = { - path: string; - script_path: string; - is_flow: boolean; - nats_resource_path: string; - use_jetstream: boolean; - stream_name?: string; - consumer_name?: string; - subjects: Array<(string)>; - enabled?: boolean; -}; - -export type EditNatsTrigger = { - nats_resource_path: string; - use_jetstream: boolean; - stream_name?: string; - consumer_name?: string; - subjects: Array<(string)>; - path: string; - script_path: string; - is_flow: boolean; -}; - -export type Group = { - name: string; - summary?: string; - members?: Array<(string)>; - extra_perms?: { - [key: string]: (boolean); - }; -}; - -export type InstanceGroup = { - name: string; - summary?: string; - emails?: Array<(string)>; -}; - -export type Folder = { - name: string; - owners: Array<(string)>; - extra_perms: { - [key: string]: (boolean); - }; - summary?: string; - created_by?: string; - edited_at?: string; -}; - -export type WorkerPing = { - worker: string; - worker_instance: string; - last_ping?: number; - started_at: string; - ip: string; - jobs_executed: number; - custom_tags?: Array<(string)>; - worker_group: string; - wm_version: string; - last_job_id?: string; - last_job_workspace_id?: string; - occupancy_rate?: number; - occupancy_rate_15s?: number; - occupancy_rate_5m?: number; - occupancy_rate_30m?: number; - memory?: number; - vcpus?: number; - memory_usage?: number; - wm_memory_usage?: number; -}; - -export type UserWorkspaceList = { - email: string; - workspaces: Array<{ - id: string; - name: string; - username: string; - color: string; - operator_settings?: OperatorSettings; - }>; -}; - -export type CreateWorkspace = { - id: string; - name: string; - username?: string; - color?: string; -}; - -export type Workspace = { - id: string; - name: string; - owner: string; - domain?: string; - color?: string; -}; - -export type WorkspaceInvite = { - workspace_id: string; - email: string; - is_admin: boolean; - operator: boolean; -}; - -export type GlobalUserInfo = { - email: string; - login_type: 'password' | 'github'; - super_admin: boolean; - devops?: boolean; - verified: boolean; - name?: string; - company?: string; - username?: string; - operator_only?: boolean; -}; - -export type login_type = 'password' | 'github'; - -export type Flow = OpenFlow & FlowMetadata & { - lock_error_logs?: string; -}; - -export type ExtraPerms = { - [key: string]: (boolean); -}; - -export type FlowMetadata = { - workspace_id?: string; - path: string; - edited_by: string; - edited_at: string; - archived: boolean; - extra_perms: ExtraPerms; - starred?: boolean; - draft_only?: boolean; - tag?: string; - ws_error_handler_muted?: boolean; - priority?: number; - dedicated_worker?: boolean; - timeout?: number; - visible_to_runner_only?: boolean; - on_behalf_of_email?: string; -}; - -export type OpenFlowWPath = OpenFlow & { - path: string; - tag?: string; - ws_error_handler_muted?: boolean; - priority?: number; - dedicated_worker?: boolean; - timeout?: number; - visible_to_runner_only?: boolean; - on_behalf_of_email?: string; -}; - -export type FlowPreview = { - value: FlowValue; - path?: string; - args: ScriptArgs; - tag?: string; - restarted_from?: RestartedFrom; -}; - -export type RestartedFrom = { - flow_job_id?: string; - step_id?: string; - branch_or_iteration_n?: number; -}; - -export type Policy = { - triggerables?: { - [key: string]: { - [key: string]: unknown; - }; - }; - triggerables_v2?: { - [key: string]: { - [key: string]: unknown; - }; - }; - s3_inputs?: Array<{ - [key: string]: unknown; - }>; - allowed_s3_keys?: Array<{ - s3_path?: string; - resource?: string; - }>; - execution_mode?: 'viewer' | 'publisher' | 'anonymous'; - on_behalf_of?: string; - on_behalf_of_email?: string; -}; - -export type execution_mode = 'viewer' | 'publisher' | 'anonymous'; - -export type ListableApp = { - id: number; - workspace_id: string; - path: string; - summary: string; - version: number; - extra_perms: { - [key: string]: (boolean); - }; - starred?: boolean; - edited_at: string; - execution_mode: 'viewer' | 'publisher' | 'anonymous'; -}; - -export type ListableRawApp = { - workspace_id: string; - path: string; - summary: string; - extra_perms: { - [key: string]: (boolean); - }; - starred?: boolean; - version: number; - edited_at: string; -}; - -export type AppWithLastVersion = { - id: number; - workspace_id: string; - path: string; - summary: string; - versions: Array<(number)>; - created_by: string; - created_at: string; - value: { - [key: string]: unknown; - }; - policy: Policy; - execution_mode: 'viewer' | 'publisher' | 'anonymous'; - extra_perms: { - [key: string]: (boolean); - }; - custom_path?: string; -}; - -export type AppWithLastVersionWDraft = AppWithLastVersion & { - draft_only?: boolean; - draft?: unknown; -}; - -export type AppHistory = { - version: number; - deployment_msg?: string; -}; - -export type FlowVersion = { - id: number; - created_at: string; - deployment_msg?: string; -}; - -export type SlackToken = { - access_token: string; - team_id: string; - team_name: string; - bot: { - bot_access_token?: string; - }; -}; - -export type TokenResponse = { - access_token: string; - expires_in?: number; - refresh_token?: string; - scope?: Array<(string)>; -}; - -export type HubScriptKind = unknown; - -export type PolarsClientKwargs = { - region_name: string; -}; - -export type LargeFileStorage = { - type?: 'S3Storage' | 'AzureBlobStorage' | 'AzureWorkloadIdentity' | 'S3AwsOidc'; - s3_resource_path?: string; - azure_blob_resource_path?: string; - public_resource?: boolean; - secondary_storage?: { - [key: string]: { - type?: 'S3Storage' | 'AzureBlobStorage' | 'AzureWorkloadIdentity' | 'S3AwsOidc'; - s3_resource_path?: string; - azure_blob_resource_path?: string; - public_resource?: boolean; - }; - }; -}; - -export type type3 = 'S3Storage' | 'AzureBlobStorage' | 'AzureWorkloadIdentity' | 'S3AwsOidc'; - -export type WindmillLargeFile = { - s3: string; -}; - -export type WindmillFileMetadata = { - mime_type?: string; - size_in_bytes?: number; - last_modified?: string; - expires?: string; - version_id?: string; -}; - -export type WindmillFilePreview = { - msg?: string; - content?: string; - content_type: 'RawText' | 'Csv' | 'Parquet' | 'Unknown'; -}; - -export type content_type = 'RawText' | 'Csv' | 'Parquet' | 'Unknown'; - -export type S3Resource = { - bucket: string; - region: string; - endPoint: string; - useSSL: boolean; - accessKey?: string; - secretKey?: string; - pathStyle: boolean; -}; - -export type WorkspaceGitSyncSettings = { - include_path?: Array<(string)>; - include_type?: Array<('script' | 'flow' | 'app' | 'folder' | 'resource' | 'variable' | 'secret' | 'resourcetype' | 'schedule' | 'user' | 'group')>; - repositories?: Array; -}; - -export type WorkspaceDeployUISettings = { - include_path?: Array<(string)>; - include_type?: Array<('script' | 'flow' | 'app' | 'resource' | 'variable' | 'secret' | 'trigger')>; -}; - -export type WorkspaceDefaultScripts = { - order?: Array<(string)>; - hidden?: Array<(string)>; - default_script_content?: { - [key: string]: (string); - }; -}; - -export type GitRepositorySettings = { - script_path: string; - git_repo_resource_path: string; - use_individual_branch?: boolean; - group_by_folder?: boolean; - exclude_types_override?: Array<('script' | 'flow' | 'app' | 'folder' | 'resource' | 'variable' | 'secret' | 'resourcetype' | 'schedule' | 'user' | 'group')>; -}; - -export type UploadFilePart = { - part_number: number; - tag: string; -}; - -export type MetricMetadata = { - id: string; - name?: string; -}; - -export type ScalarMetric = { - metric_id?: string; - value: number; -}; - -export type TimeseriesMetric = { - metric_id?: string; - values: Array; -}; - -export type MetricDataPoint = { - timestamp: string; - value: number; -}; - -export type RawScriptForDependencies = { - raw_code: string; - path: string; - language: ScriptLang; -}; - -export type ConcurrencyGroup = { - concurrency_key: string; - total_running: number; -}; - -export type ExtendedJobs = { - jobs: Array; - obscured_jobs: Array; - /** - * Obscured jobs omitted for security because of too specific filtering - */ - omitted_obscured_jobs?: boolean; -}; - -export type ExportedUser = { - email: string; - password_hash?: string; - super_admin: boolean; - verified: boolean; - name?: string; - company?: string; - first_time_user: boolean; - username?: string; -}; - -export type GlobalSetting = { - name: string; - value: { - [key: string]: unknown; - }; -}; - -export type Config = { - name: string; - config?: { - [key: string]: unknown; - }; -}; - -export type ExportedInstanceGroup = { - name: string; - summary?: string; - emails?: Array<(string)>; - id?: string; - scim_display_name?: string; - external_id?: string; -}; - -export type JobSearchHit = { - dancer?: string; -}; - -export type LogSearchHit = { - dancer?: string; -}; - -export type AutoscalingEvent = { - id?: number; - worker_group?: string; - event_type?: string; - desired_workers?: number; - reason?: string; - applied_at?: string; -}; - -export type CriticalAlert = { - /** - * Unique identifier for the alert - */ - id?: number; - /** - * Type of alert (e.g., critical_error) - */ - alert_type?: string; - /** - * The message content of the alert - */ - message?: string; - /** - * Time when the alert was created - */ - created_at?: string; - /** - * Acknowledgment status of the alert, can be true, false, or null if not set - */ - acknowledged?: (boolean) | null; - /** - * Workspace id if the alert is in the scope of a workspace - */ - workspace_id?: (string) | null; -}; - -export type CaptureTriggerKind = 'webhook' | 'http' | 'websocket' | 'kafka' | 'email' | 'nats' | 'postgres' | 'sqs' | 'mqtt' | 'gcp'; - -export type Capture = { - trigger_kind: CaptureTriggerKind; - payload: unknown; - trigger_extra?: unknown; - id: number; - created_at: string; -}; - -export type CaptureConfig = { - trigger_config?: unknown; - trigger_kind: CaptureTriggerKind; - error?: string; - last_server_ping?: string; -}; - -export type OperatorSettings = { - /** - * Whether operators can view runs - */ - runs: boolean; - /** - * Whether operators can view schedules - */ - schedules: boolean; - /** - * Whether operators can view resources - */ - resources: boolean; - /** - * Whether operators can view variables - */ - variables: boolean; - /** - * Whether operators can view audit logs - */ - audit_logs: boolean; - /** - * Whether operators can view triggers - */ - triggers: boolean; - /** - * Whether operators can view groups page - */ - groups: boolean; - /** - * Whether operators can view folders page - */ - folders: boolean; - /** - * Whether operators can view workers page - */ - workers: boolean; -} | null; - -export type TeamInfo = { - /** - * The unique identifier of the Microsoft Teams team - */ - team_id: string; - /** - * The display name of the Microsoft Teams team - */ - team_name: string; - /** - * List of channels within the team - */ - channels: Array; -}; - -export type ChannelInfo = { - /** - * The unique identifier of the channel - */ - channel_id: string; - /** - * The display name of the channel - */ - channel_name: string; - /** - * The Microsoft Teams tenant identifier - */ - tenant_id: string; - /** - * The service URL for the channel - */ - service_url: string; -}; - -export type GithubInstallations = Array<{ - workspace_id?: string; - installation_id: number; - account_id: string; - repositories: Array<{ - name: string; - url: string; - }>; -}>; - -export type WorkspaceGithubInstallation = { - account_id: string; - installation_id: number; -}; - -export type OpenFlow = { - summary: string; - description?: string; - value: FlowValue; - schema?: { - [key: string]: unknown; - }; -}; - -export type FlowValue = { - modules: Array; - failure_module?: FlowModule; - preprocessor_module?: FlowModule; - same_worker?: boolean; - concurrent_limit?: number; - concurrency_key?: string; - concurrency_time_window_s?: number; - skip_expr?: string; - cache_ttl?: number; - priority?: number; - early_return?: string; -}; - -export type Retry = { - constant?: { - attempts?: number; - seconds?: number; - }; - exponential?: { - attempts?: number; - multiplier?: number; - seconds?: number; - random_factor?: number; - }; -}; - -export type FlowModule = { - id: string; - value: FlowModuleValue; - stop_after_if?: { - skip_if_stopped?: boolean; - expr: string; - }; - stop_after_all_iters_if?: { - skip_if_stopped?: boolean; - expr: string; - }; - skip_if?: { - expr: string; - }; - sleep?: InputTransform; - cache_ttl?: number; - timeout?: number; - delete_after_use?: boolean; - summary?: string; - mock?: { - enabled?: boolean; - return_value?: unknown; - }; - suspend?: { - required_events?: number; - timeout?: number; - resume_form?: { - schema?: { - [key: string]: unknown; - }; - }; - user_auth_required?: boolean; - user_groups_required?: InputTransform; - self_approval_disabled?: boolean; - hide_cancel?: boolean; - continue_on_disapprove_timeout?: boolean; - }; - priority?: number; - continue_on_error?: boolean; - retry?: Retry; -}; - -export type InputTransform = StaticTransform | JavascriptTransform; - -export type StaticTransform = { - value?: unknown; - type: 'static'; -}; - -export type JavascriptTransform = { - expr: string; - type: 'javascript'; -}; - -export type FlowModuleValue = RawScript | PathScript | PathFlow | ForloopFlow | WhileloopFlow | BranchOne | BranchAll | Identity; - -export type RawScript = { - input_transforms: { - [key: string]: InputTransform; - }; - content: string; - language: 'deno' | 'bun' | 'python3' | 'go' | 'bash' | 'powershell' | 'postgresql' | 'mysql' | 'bigquery' | 'snowflake' | 'mssql' | 'oracledb' | 'graphql' | 'nativets' | 'php'; - path?: string; - lock?: string; - type: 'rawscript'; - tag?: string; - concurrent_limit?: number; - concurrency_time_window_s?: number; - custom_concurrency_key?: string; - is_trigger?: boolean; -}; - -export type language = 'deno' | 'bun' | 'python3' | 'go' | 'bash' | 'powershell' | 'postgresql' | 'mysql' | 'bigquery' | 'snowflake' | 'mssql' | 'oracledb' | 'graphql' | 'nativets' | 'php'; - -export type PathScript = { - input_transforms: { - [key: string]: InputTransform; - }; - path: string; - hash?: string; - type: 'script'; - tag_override?: string; - is_trigger?: boolean; -}; - -export type PathFlow = { - input_transforms: { - [key: string]: InputTransform; - }; - path: string; - type: 'flow'; -}; - -export type ForloopFlow = { - modules: Array; - iterator: InputTransform; - skip_failures: boolean; - type: 'forloopflow'; - parallel?: boolean; - parallelism?: number; -}; - -export type WhileloopFlow = { - modules: Array; - skip_failures: boolean; - type: 'whileloopflow'; - parallel?: boolean; - parallelism?: number; -}; - -export type BranchOne = { - branches: Array<{ - summary?: string; - expr: string; - modules: Array; - }>; - default: Array; - type: 'branchone'; -}; - -export type BranchAll = { - branches: Array<{ - summary?: string; - skip_failure?: boolean; - modules: Array; - }>; - type: 'branchall'; - parallel?: boolean; -}; - -export type Identity = { - type: 'identity'; - flow?: boolean; -}; - -export type FlowStatus = { - step: number; - modules: Array; - user_states?: { - [key: string]: unknown; - }; - preprocessor_module?: (FlowStatusModule); - failure_module: (FlowStatusModule & { - parent_module?: string; -}); - retry?: { - fail_count?: number; - failed_jobs?: Array<(string)>; - }; -}; - -export type FlowStatusModule = { - type: 'WaitingForPriorSteps' | 'WaitingForEvents' | 'WaitingForExecutor' | 'InProgress' | 'Success' | 'Failure'; - id?: string; - job?: string; - count?: number; - progress?: number; - iterator?: { - index?: number; - itered?: Array; - args?: unknown; - }; - flow_jobs?: Array<(string)>; - flow_jobs_success?: Array<(boolean)>; - branch_chosen?: { - type: 'branch' | 'default'; - branch?: number; - }; - branchall?: { - branch: number; - len: number; - }; - approvers?: Array<{ - resume_id: number; - approver: string; - }>; - failed_retries?: Array<(string)>; - skipped?: boolean; -}; - -export type type4 = 'WaitingForPriorSteps' | 'WaitingForEvents' | 'WaitingForExecutor' | 'InProgress' | 'Success' | 'Failure'; - -export type ParameterId = string; - -export type ParameterKey = string; - -export type ParameterWorkspaceId = string; - -export type ParameterPublicationName = string; - -export type ParameterVersionId = number; - -export type ParameterToken = string; - -export type ParameterAccountId = number; - -export type ParameterClientName = string; - -export type ParameterScriptPath = string; - -export type ParameterScriptHash = string; - -export type ParameterJobId = string; - -export type ParameterPath = string; - -export type ParameterCustomPath = string; - -export type ParameterPathId = number; - -export type ParameterPathVersion = number; - -export type ParameterName = string; - -/** - * which page to return (start at 1, default 1) - */ -export type ParameterPage = number; - -/** - * number of items to return for a given page (default 30, max 100) - */ -export type ParameterPerPage = number; - -/** - * order by desc order (default true) - */ -export type ParameterOrderDesc = boolean; - -/** - * mask to filter exact matching user creator - */ -export type ParameterCreatedBy = string; - -/** - * mask to filter exact matching job's label (job labels are completed jobs with as a result an object containing a string in the array at key 'wm_labels') - */ -export type ParameterLabel = string; - -/** - * worker this job was ran on - */ -export type ParameterWorker = string; - -/** - * The parent job that is at the origin and responsible for the execution of this script if any - */ -export type ParameterParentJob = string; - -/** - * Override the tag to use - */ -export type ParameterWorkerTag = string; - -/** - * Override the cache time to live (in seconds). Can not be used to disable caching, only override with a new cache ttl - */ -export type ParameterCacheTtl = string; - -/** - * The job id to assign to the created job. if missing, job is chosen randomly using the ULID scheme. If a job id already exists in the queue or as a completed job, the request to create one will fail (Bad Request) - */ -export type ParameterNewJobId = string; - -/** - * List of headers's keys (separated with ',') whove value are added to the args - * Header's key lowercased and '-'' replaced to '_' such that 'Content-Type' becomes the 'content_type' arg key - * - */ -export type ParameterIncludeHeader = string; - -/** - * The maximum size of the queue for which the request would get rejected if that job would push it above that limit - * - */ -export type ParameterQueueLimit = string; - -/** - * The base64 encoded payload that has been encoded as a JSON. e.g how to encode such payload encodeURIComponent - * `encodeURIComponent(btoa(JSON.stringify({a: 2})))` - * - */ -export type ParameterPayload = string; - -/** - * mask to filter matching starting path - */ -export type ParameterScriptStartPath = string; - -/** - * mask to filter by schedule path - */ -export type ParameterSchedulePath = string; - -/** - * mask to filter exact matching path - */ -export type ParameterScriptExactPath = string; - -/** - * mask to filter exact matching path - */ -export type ParameterScriptExactHash = string; - -/** - * filter on created before (inclusive) timestamp - */ -export type ParameterCreatedBefore = string; - -/** - * filter on created after (exclusive) timestamp - */ -export type ParameterCreatedAfter = string; - -/** - * filter on started before (inclusive) timestamp - */ -export type ParameterStartedBefore = string; - -/** - * filter on started after (exclusive) timestamp - */ -export type ParameterStartedAfter = string; - -/** - * filter on started before (inclusive) timestamp - */ -export type ParameterBefore = string; - -/** - * filter on created_at for non non started job and started_at otherwise after (exclusive) timestamp - */ -export type ParameterCreatedOrStartedAfter = string; - -/** - * filter on created_at for non non started job and started_at otherwise after (exclusive) timestamp but only for the completed jobs - */ -export type ParameterCreatedOrStartedAfterCompletedJob = string; - -/** - * filter on created_at for non non started job and started_at otherwise before (inclusive) timestamp - */ -export type ParameterCreatedOrStartedBefore = string; - -/** - * filter on successful jobs - */ -export type ParameterSuccess = boolean; - -/** - * filter on jobs scheduled_for before now (hence waitinf for a worker) - */ -export type ParameterScheduledForBeforeNow = boolean; - -/** - * filter on suspended jobs - */ -export type ParameterSuspended = boolean; - -/** - * filter on running jobs - */ -export type ParameterRunning = boolean; - -/** - * allow wildcards (*) in the filter of label, tag, worker - */ -export type ParameterAllowWildcards = boolean; - -/** - * filter on jobs containing those args as a json subset (@> in postgres) - */ -export type ParameterArgsFilter = string; - -/** - * filter on jobs with a given tag/worker group - */ -export type ParameterTag = string; - -/** - * filter on jobs containing those result as a json subset (@> in postgres) - */ -export type ParameterResultFilter = string; - -/** - * filter on created after (exclusive) timestamp - */ -export type ParameterAfter = string; - -/** - * filter on exact username of user - */ -export type ParameterUsername = string; - -/** - * filter on exact or prefix name of operation - */ -export type ParameterOperation = string; - -/** - * filter on exact or prefix name of resource - */ -export type ParameterResourceName = string; - -/** - * filter on type of operation - */ -export type ParameterActionKind = 'Create' | 'Update' | 'Delete' | 'Execute'; - -/** - * filter on job kind (values 'preview', 'script', 'dependencies', 'flow') separated by, - */ -export type ParameterJobKinds = string; - -export type ParameterRunnableId = string; - -export type ParameterRunnableTypeQuery = RunnableType; - -export type ParameterInputId = string; - -export type ParameterGetStarted = boolean; - -export type ParameterConcurrencyId = string; - -export type ParameterRunnableKind = 'script' | 'flow'; - -export type BackendVersionResponse = (string); - -export type BackendUptodateResponse = (string); - -export type GetLicenseIdResponse = (string); - -export type GetOpenApiYamlResponse = (string); - -export type GetAuditLogData = { - id: number; - workspace: string; -}; - -export type GetAuditLogResponse = (AuditLog); - -export type ListAuditLogsData = { - /** - * filter on type of operation - */ - actionKind?: 'Create' | 'Update' | 'Delete' | 'Execute'; - /** - * filter on created after (exclusive) timestamp - */ - after?: string; - /** - * get audit logs for all workspaces - */ - allWorkspaces?: boolean; - /** - * filter on started before (inclusive) timestamp - */ - before?: string; - /** - * comma separated list of operations to exclude - */ - excludeOperations?: string; - /** - * filter on exact or prefix name of operation - */ - operation?: string; - /** - * comma separated list of exact operations to include - */ - operations?: string; - /** - * which page to return (start at 1, default 1) - */ - page?: number; - /** - * number of items to return for a given page (default 30, max 100) - */ - perPage?: number; - /** - * filter on exact or prefix name of resource - */ - resource?: string; - /** - * filter on exact username of user - */ - username?: string; - workspace: string; -}; - -export type ListAuditLogsResponse = (Array); - -export type LoginData = { - /** - * credentials - */ - requestBody: Login; -}; - -export type LoginResponse = (string); - -export type LogoutResponse = (string); - -export type GetUserData = { - username: string; - workspace: string; -}; - -export type GetUserResponse = (User); - -export type UpdateUserData = { - /** - * new user - */ - requestBody: EditWorkspaceUser; - username: string; - workspace: string; -}; - -export type UpdateUserResponse = (string); - -export type IsOwnerOfPathData = { - path: string; - workspace: string; -}; - -export type IsOwnerOfPathResponse = (boolean); - -export type SetPasswordData = { - /** - * set password - */ - requestBody: { - password: string; - }; -}; - -export type SetPasswordResponse = (string); - -export type SetPasswordForUserData = { - /** - * set password - */ - requestBody: { - password: string; - }; - user: string; -}; - -export type SetPasswordForUserResponse = (string); - -export type SetLoginTypeForUserData = { - /** - * set login type - */ - requestBody: { - login_type: string; - }; - user: string; -}; - -export type SetLoginTypeForUserResponse = (string); - -export type CreateUserGloballyData = { - /** - * user info - */ - requestBody: { - email: string; - password: string; - super_admin: boolean; - name?: string; - company?: string; - }; -}; - -export type CreateUserGloballyResponse = (string); - -export type GlobalUserUpdateData = { - email: string; - /** - * new user info - */ - requestBody: { - is_super_admin?: boolean; - is_devops?: boolean; - name?: string; - }; -}; - -export type GlobalUserUpdateResponse = (string); - -export type GlobalUsernameInfoData = { - email: string; -}; - -export type GlobalUsernameInfoResponse = ({ - username: string; - workspace_usernames: Array<{ - workspace_id: string; - username: string; - }>; -}); - -export type GlobalUserRenameData = { - email: string; - /** - * new username - */ - requestBody: { - new_username: string; - }; -}; - -export type GlobalUserRenameResponse = (string); - -export type GlobalUserDeleteData = { - email: string; -}; - -export type GlobalUserDeleteResponse = (string); - -export type GlobalUsersOverwriteData = { - /** - * List of users - */ - requestBody: Array; -}; - -export type GlobalUsersOverwriteResponse = (string); - -export type GlobalUsersExportResponse = (Array); - -export type DeleteUserData = { - username: string; - workspace: string; -}; - -export type DeleteUserResponse = (string); - -export type GetGlobalConnectedRepositoriesResponse = (GithubInstallations); - -export type ListWorkspacesResponse = (Array); - -export type IsDomainAllowedResponse = (boolean); - -export type ListUserWorkspacesResponse = (UserWorkspaceList); - -export type ListWorkspacesAsSuperAdminData = { - /** - * which page to return (start at 1, default 1) - */ - page?: number; - /** - * number of items to return for a given page (default 30, max 100) - */ - perPage?: number; -}; - -export type ListWorkspacesAsSuperAdminResponse = (Array); - -export type CreateWorkspaceData = { - /** - * new token - */ - requestBody: CreateWorkspace; -}; - -export type CreateWorkspaceResponse = (string); - -export type ExistsWorkspaceData = { - /** - * id of workspace - */ - requestBody: { - id: string; - }; -}; - -export type ExistsWorkspaceResponse = (boolean); - -export type ExistsUsernameData = { - requestBody: { - id: string; - username: string; - }; -}; - -export type ExistsUsernameResponse = (boolean); - -export type GetGlobalData = { - key: string; -}; - -export type GetGlobalResponse = (unknown); - -export type SetGlobalData = { - key: string; - /** - * value set - */ - requestBody: { - value?: unknown; - }; -}; - -export type SetGlobalResponse = (string); - -export type GetLocalResponse = (unknown); - -export type TestSmtpData = { - /** - * test smtp payload - */ - requestBody: { - to: string; - smtp: { - host: string; - username: string; - password: string; - port: number; - from: string; - tls_implicit: boolean; - disable_tls: boolean; - }; - }; -}; - -export type TestSmtpResponse = (string); - -export type TestCriticalChannelsData = { - /** - * test critical channel payload - */ - requestBody: Array<{ - email?: string; - slack_channel?: string; - }>; -}; - -export type TestCriticalChannelsResponse = (string); - -export type GetCriticalAlertsData = { - acknowledged?: (boolean) | null; - page?: number; - pageSize?: number; -}; - -export type GetCriticalAlertsResponse = ({ - alerts?: Array; - /** - * Total number of rows matching the query. - */ - total_rows?: number; - /** - * Total number of pages based on the page size. - */ - total_pages?: number; -}); - -export type AcknowledgeCriticalAlertData = { - /** - * The ID of the critical alert to acknowledge - */ - id: number; -}; - -export type AcknowledgeCriticalAlertResponse = (string); - -export type AcknowledgeAllCriticalAlertsResponse = (string); - -export type TestLicenseKeyData = { - /** - * test license key - */ - requestBody: { - license_key: string; - }; -}; - -export type TestLicenseKeyResponse = (string); - -export type TestObjectStorageConfigData = { - /** - * test object storage config - */ - requestBody: { - [key: string]: unknown; - }; -}; - -export type TestObjectStorageConfigResponse = (string); - -export type SendStatsResponse = (string); - -export type GetLatestKeyRenewalAttemptResponse = ({ - result: string; - attempted_at: string; -} | null); - -export type RenewLicenseKeyData = { - licenseKey?: string; -}; - -export type RenewLicenseKeyResponse = (string); - -export type CreateCustomerPortalSessionData = { - licenseKey?: string; -}; - -export type CreateCustomerPortalSessionResponse = (string); - -export type TestMetadataData = { - /** - * test metadata - */ - requestBody: string; -}; - -export type TestMetadataResponse = (string); - -export type ListGlobalSettingsResponse = (Array); - -export type GetCurrentEmailResponse = (string); - -export type RefreshUserTokenData = { - ifExpiringInLessThanS?: number; -}; - -export type RefreshUserTokenResponse = (string); - -export type GetTutorialProgressResponse = ({ - progress?: number; -}); - -export type UpdateTutorialProgressData = { - /** - * progress update - */ - requestBody: { - progress?: number; - }; -}; - -export type UpdateTutorialProgressResponse = (string); - -export type LeaveInstanceResponse = (string); - -export type GetUsageResponse = (number); - -export type GetRunnableResponse = ({ - workspace: string; - endpoint_async: string; - endpoint_sync: string; - endpoint_openai_sync: string; - summary: string; - description?: string; - kind: string; -}); - -export type GlobalWhoamiResponse = (GlobalUserInfo); - -export type ListWorkspaceInvitesResponse = (Array); - -export type WhoamiData = { - workspace: string; -}; - -export type WhoamiResponse = (User); - -export type GetGithubAppTokenData = { - /** - * jwt job token - */ - requestBody: { - job_token: string; - }; - workspace: string; -}; - -export type GetGithubAppTokenResponse = ({ - token: string; -}); - -export type InstallFromWorkspaceData = { - requestBody: { - /** - * The ID of the workspace containing the installation to copy - */ - source_workspace_id: string; - /** - * The ID of the GitHub installation to copy - */ - installation_id: number; - }; - workspace: string; -}; - -export type InstallFromWorkspaceResponse = (unknown); - -export type DeleteFromWorkspaceData = { - /** - * The ID of the GitHub installation to delete - */ - installationId: number; - workspace: string; -}; - -export type DeleteFromWorkspaceResponse = (unknown); - -export type ExportInstallationData = { - installationId: number; - workspace: string; -}; - -export type ExportInstallationResponse = ({ - jwt_token?: string; -}); - -export type ImportInstallationData = { - requestBody: { - jwt_token: string; - }; - workspace: string; -}; - -export type ImportInstallationResponse = (unknown); - -export type AcceptInviteData = { - /** - * accept invite - */ - requestBody: { - workspace_id: string; - username?: string; - }; -}; - -export type AcceptInviteResponse = (string); - -export type DeclineInviteData = { - /** - * decline invite - */ - requestBody: { - workspace_id: string; - }; -}; - -export type DeclineInviteResponse = (string); - -export type InviteUserData = { - /** - * WorkspaceInvite - */ - requestBody: { - email: string; - is_admin: boolean; - operator: boolean; - }; - workspace: string; -}; - -export type InviteUserResponse = (string); - -export type AddUserData = { - /** - * WorkspaceInvite - */ - requestBody: { - email: string; - is_admin: boolean; - username?: string; - operator: boolean; - }; - workspace: string; -}; - -export type AddUserResponse = (string); - -export type DeleteInviteData = { - /** - * WorkspaceInvite - */ - requestBody: { - email: string; - is_admin: boolean; - operator: boolean; - }; - workspace: string; -}; - -export type DeleteInviteResponse = (string); - -export type ArchiveWorkspaceData = { - workspace: string; -}; - -export type ArchiveWorkspaceResponse = (string); - -export type UnarchiveWorkspaceData = { - workspace: string; -}; - -export type UnarchiveWorkspaceResponse = (string); - -export type DeleteWorkspaceData = { - workspace: string; -}; - -export type DeleteWorkspaceResponse = (string); - -export type LeaveWorkspaceData = { - workspace: string; -}; - -export type LeaveWorkspaceResponse = (string); - -export type GetWorkspaceNameData = { - workspace: string; -}; - -export type GetWorkspaceNameResponse = (string); - -export type ChangeWorkspaceNameData = { - requestBody?: { - new_name?: string; - }; - workspace: string; -}; - -export type ChangeWorkspaceNameResponse = (string); - -export type ChangeWorkspaceIdData = { - requestBody?: { - new_id?: string; - new_name?: string; - }; - workspace: string; -}; - -export type ChangeWorkspaceIdResponse = (string); - -export type ChangeWorkspaceColorData = { - requestBody?: { - color?: string; - }; - workspace: string; -}; - -export type ChangeWorkspaceColorResponse = (string); - -export type WhoisData = { - username: string; - workspace: string; -}; - -export type WhoisResponse = (User); - -export type UpdateOperatorSettingsData = { - requestBody: OperatorSettings; - workspace: string; -}; - -export type UpdateOperatorSettingsResponse = (string); - -export type ExistsEmailData = { - email: string; -}; - -export type ExistsEmailResponse = (boolean); - -export type ListUsersAsSuperAdminData = { - /** - * filter only active users - */ - activeOnly?: boolean; - /** - * which page to return (start at 1, default 1) - */ - page?: number; - /** - * number of items to return for a given page (default 30, max 100) - */ - perPage?: number; -}; - -export type ListUsersAsSuperAdminResponse = (Array); - -export type ListPendingInvitesData = { - workspace: string; -}; - -export type ListPendingInvitesResponse = (Array); - -export type GetSettingsData = { - workspace: string; -}; - -export type GetSettingsResponse = ({ - workspace_id?: string; - slack_name?: string; - slack_team_id?: string; - slack_command_script?: string; - teams_team_id?: string; - teams_command_script?: string; - teams_team_name?: string; - auto_invite_domain?: string; - auto_invite_operator?: boolean; - auto_add?: boolean; - plan?: string; - customer_id?: string; - webhook?: string; - deploy_to?: string; - ai_config?: AIConfig; - error_handler?: string; - error_handler_extra_args?: ScriptArgs; - error_handler_muted_on_cancel: boolean; - large_file_storage?: LargeFileStorage; - git_sync?: WorkspaceGitSyncSettings; - deploy_ui?: WorkspaceDeployUISettings; - default_app?: string; - default_scripts?: WorkspaceDefaultScripts; - mute_critical_alerts?: boolean; - color?: string; - operator_settings?: OperatorSettings; -}); - -export type GetDeployToData = { - workspace: string; -}; - -export type GetDeployToResponse = ({ - deploy_to?: string; -}); - -export type GetIsPremiumData = { - workspace: string; -}; - -export type GetIsPremiumResponse = (boolean); - -export type GetPremiumInfoData = { - workspace: string; -}; - -export type GetPremiumInfoResponse = ({ - premium: boolean; - usage?: number; - owner: string; - status?: string; -}); - -export type GetThresholdAlertData = { - workspace: string; -}; - -export type GetThresholdAlertResponse = ({ - threshold_alert_amount?: number; - last_alert_sent?: string; -}); - -export type SetThresholdAlertData = { - /** - * threshold alert info - */ - requestBody: { - threshold_alert_amount?: number; - }; - workspace: string; -}; - -export type SetThresholdAlertResponse = (string); - -export type EditSlackCommandData = { - /** - * WorkspaceInvite - */ - requestBody: { - slack_command_script?: string; - }; - workspace: string; -}; - -export type EditSlackCommandResponse = (string); - -export type EditTeamsCommandData = { - /** - * WorkspaceInvite - */ - requestBody: { - slack_command_script?: string; - }; - workspace: string; -}; - -export type EditTeamsCommandResponse = (string); - -export type ListAvailableTeamsIdsData = { - workspace: string; -}; - -export type ListAvailableTeamsIdsResponse = (Array<{ - team_name?: string; - team_id?: string; -}>); - -export type ListAvailableTeamsChannelsData = { - workspace: string; -}; - -export type ListAvailableTeamsChannelsResponse = (Array<{ - channel_name?: string; - channel_id?: string; - service_url?: string; - tenant_id?: string; -}>); - -export type ConnectTeamsData = { - /** - * connect teams - */ - requestBody: { - team_id?: string; - team_name?: string; - }; - workspace: string; -}; - -export type ConnectTeamsResponse = (string); - -export type RunSlackMessageTestJobData = { - /** - * path to hub script to run and its corresponding args - */ - requestBody: { - hub_script_path?: string; - channel?: string; - test_msg?: string; - }; - workspace: string; -}; - -export type RunSlackMessageTestJobResponse = ({ - job_uuid?: string; -}); - -export type RunTeamsMessageTestJobData = { - /** - * path to hub script to run and its corresponding args - */ - requestBody: { - hub_script_path?: string; - channel?: string; - test_msg?: string; - }; - workspace: string; -}; - -export type RunTeamsMessageTestJobResponse = ({ - job_uuid?: string; -}); - -export type EditDeployToData = { - requestBody: { - deploy_to?: string; - }; - workspace: string; -}; - -export type EditDeployToResponse = (string); - -export type EditAutoInviteData = { - /** - * WorkspaceInvite - */ - requestBody: { - operator?: boolean; - invite_all?: boolean; - auto_add?: boolean; - }; - workspace: string; -}; - -export type EditAutoInviteResponse = (string); - -export type EditWebhookData = { - /** - * WorkspaceWebhook - */ - requestBody: { - webhook?: string; - }; - workspace: string; -}; - -export type EditWebhookResponse = (string); - -export type EditCopilotConfigData = { - /** - * WorkspaceCopilotConfig - */ - requestBody: AIConfig; - workspace: string; -}; - -export type EditCopilotConfigResponse = (string); - -export type GetCopilotInfoData = { - workspace: string; -}; - -export type GetCopilotInfoResponse = (AIConfig); - -export type EditErrorHandlerData = { - /** - * WorkspaceErrorHandler - */ - requestBody: { - error_handler?: string; - error_handler_extra_args?: ScriptArgs; - error_handler_muted_on_cancel?: boolean; - }; - workspace: string; -}; - -export type EditErrorHandlerResponse = (string); - -export type EditLargeFileStorageConfigData = { - /** - * LargeFileStorage info - */ - requestBody: { - large_file_storage?: LargeFileStorage; - }; - workspace: string; -}; - -export type EditLargeFileStorageConfigResponse = (unknown); - -export type EditWorkspaceGitSyncConfigData = { - /** - * Workspace Git sync settings - */ - requestBody: { - git_sync_settings?: WorkspaceGitSyncSettings; - }; - workspace: string; -}; - -export type EditWorkspaceGitSyncConfigResponse = (unknown); - -export type EditWorkspaceDeployUiSettingsData = { - /** - * Workspace deploy UI settings - */ - requestBody: { - deploy_ui_settings?: WorkspaceDeployUISettings; - }; - workspace: string; -}; - -export type EditWorkspaceDeployUiSettingsResponse = (unknown); - -export type EditWorkspaceDefaultAppData = { - /** - * Workspace default app - */ - requestBody: { - default_app_path?: string; - }; - workspace: string; -}; - -export type EditWorkspaceDefaultAppResponse = (string); - -export type EditDefaultScriptsData = { - /** - * Workspace default app - */ - requestBody?: WorkspaceDefaultScripts; - workspace: string; -}; - -export type EditDefaultScriptsResponse = (string); - -export type GetDefaultScriptsData = { - workspace: string; -}; - -export type GetDefaultScriptsResponse = (WorkspaceDefaultScripts); - -export type SetEnvironmentVariableData = { - /** - * Workspace default app - */ - requestBody: { - name: string; - value?: string; - }; - workspace: string; -}; - -export type SetEnvironmentVariableResponse = (string); - -export type GetWorkspaceEncryptionKeyData = { - workspace: string; -}; - -export type GetWorkspaceEncryptionKeyResponse = ({ - key: string; -}); - -export type SetWorkspaceEncryptionKeyData = { - /** - * New encryption key - */ - requestBody: { - new_key: string; - skip_reencrypt?: boolean; - }; - workspace: string; -}; - -export type SetWorkspaceEncryptionKeyResponse = (string); - -export type GetWorkspaceDefaultAppData = { - workspace: string; -}; - -export type GetWorkspaceDefaultAppResponse = ({ - default_app_path?: string; -}); - -export type GetLargeFileStorageConfigData = { - workspace: string; -}; - -export type GetLargeFileStorageConfigResponse = (LargeFileStorage); - -export type GetWorkspaceUsageData = { - workspace: string; -}; - -export type GetWorkspaceUsageResponse = (number); - -export type GetUsedTriggersData = { - workspace: string; -}; - -export type GetUsedTriggersResponse = ({ - http_routes_used: boolean; - websocket_used: boolean; - kafka_used: boolean; - nats_used: boolean; - postgres_used: boolean; - mqtt_used: boolean; - gcp_used: boolean; - sqs_used: boolean; -}); - -export type ListUsersData = { - workspace: string; -}; - -export type ListUsersResponse = (Array); - -export type ListUsersUsageData = { - workspace: string; -}; - -export type ListUsersUsageResponse = (Array); - -export type ListUsernamesData = { - workspace: string; -}; - -export type ListUsernamesResponse = (Array<(string)>); - -export type UsernameToEmailData = { - username: string; - workspace: string; -}; - -export type UsernameToEmailResponse = (string); - -export type CreateTokenData = { - /** - * new token - */ - requestBody: NewToken; -}; - -export type CreateTokenResponse = (string); - -export type CreateTokenImpersonateData = { - /** - * new token - */ - requestBody: NewTokenImpersonate; -}; - -export type CreateTokenImpersonateResponse = (string); - -export type DeleteTokenData = { - tokenPrefix: string; -}; - -export type DeleteTokenResponse = (string); - -export type ListTokensData = { - excludeEphemeral?: boolean; - /** - * which page to return (start at 1, default 1) - */ - page?: number; - /** - * number of items to return for a given page (default 30, max 100) - */ - perPage?: number; -}; - -export type ListTokensResponse = (Array); - -export type GetOidcTokenData = { - audience: string; - workspace: string; -}; - -export type GetOidcTokenResponse = (string); - -export type CreateVariableData = { - alreadyEncrypted?: boolean; - /** - * new variable - */ - requestBody: CreateVariable; - workspace: string; -}; - -export type CreateVariableResponse = (string); - -export type EncryptValueData = { - /** - * new variable - */ - requestBody: string; - workspace: string; -}; - -export type EncryptValueResponse = (string); - -export type DeleteVariableData = { - path: string; - workspace: string; -}; - -export type DeleteVariableResponse = (string); - -export type UpdateVariableData = { - alreadyEncrypted?: boolean; - path: string; - /** - * updated variable - */ - requestBody: EditVariable; - workspace: string; -}; - -export type UpdateVariableResponse = (string); - -export type GetVariableData = { - /** - * ask to decrypt secret if this variable is secret - * (if not secret no effect, default: true) - * - */ - decryptSecret?: boolean; - /** - * ask to include the encrypted value if secret and decrypt secret is not true (default: false) - * - */ - includeEncrypted?: boolean; - path: string; - workspace: string; -}; - -export type GetVariableResponse = (ListableVariable); - -export type GetVariableValueData = { - path: string; - workspace: string; -}; - -export type GetVariableValueResponse = (string); - -export type ExistsVariableData = { - path: string; - workspace: string; -}; - -export type ExistsVariableResponse = (boolean); - -export type ListVariableData = { - /** - * which page to return (start at 1, default 1) - */ - page?: number; - pathStart?: string; - /** - * number of items to return for a given page (default 30, max 100) - */ - perPage?: number; - workspace: string; -}; - -export type ListVariableResponse = (Array); - -export type ListContextualVariablesData = { - workspace: string; -}; - -export type ListContextualVariablesResponse = (Array); - -export type WorkspaceGetCriticalAlertsData = { - acknowledged?: (boolean) | null; - page?: number; - pageSize?: number; - workspace: string; -}; - -export type WorkspaceGetCriticalAlertsResponse = ({ - alerts?: Array; - /** - * Total number of rows matching the query. - */ - total_rows?: number; - /** - * Total number of pages based on the page size. - */ - total_pages?: number; -}); - -export type WorkspaceAcknowledgeCriticalAlertData = { - /** - * The ID of the critical alert to acknowledge - */ - id: number; - workspace: string; -}; - -export type WorkspaceAcknowledgeCriticalAlertResponse = (string); - -export type WorkspaceAcknowledgeAllCriticalAlertsData = { - workspace: string; -}; - -export type WorkspaceAcknowledgeAllCriticalAlertsResponse = (string); - -export type WorkspaceMuteCriticalAlertsUiData = { - /** - * Boolean flag to mute critical alerts. - */ - requestBody: { - /** - * Whether critical alerts should be muted. - */ - mute_critical_alerts?: boolean; - }; - workspace: string; -}; - -export type WorkspaceMuteCriticalAlertsUiResponse = (string); - -export type LoginWithOauthData = { - clientName: string; - /** - * Partially filled script - */ - requestBody: { - code?: string; - state?: string; - }; -}; - -export type LoginWithOauthResponse = (string); - -export type ConnectSlackCallbackData = { - /** - * code endpoint - */ - requestBody: { - code: string; - state: string; - }; - workspace: string; -}; - -export type ConnectSlackCallbackResponse = (string); - -export type ConnectSlackCallbackInstanceData = { - /** - * code endpoint - */ - requestBody: { - code: string; - state: string; - }; -}; - -export type ConnectSlackCallbackInstanceResponse = (string); - -export type ConnectCallbackData = { - clientName: string; - /** - * code endpoint - */ - requestBody: { - code: string; - state: string; - }; -}; - -export type ConnectCallbackResponse = (TokenResponse); - -export type CreateAccountData = { - /** - * code endpoint - */ - requestBody: { - refresh_token?: string; - expires_in: number; - client: string; - }; - workspace: string; -}; - -export type CreateAccountResponse = (string); - -export type RefreshTokenData = { - id: number; - /** - * variable path - */ - requestBody: { - path: string; - }; - workspace: string; -}; - -export type RefreshTokenResponse = (string); - -export type DisconnectAccountData = { - id: number; - workspace: string; -}; - -export type DisconnectAccountResponse = (string); - -export type DisconnectSlackData = { - workspace: string; -}; - -export type DisconnectSlackResponse = (string); - -export type DisconnectTeamsData = { - workspace: string; -}; - -export type DisconnectTeamsResponse = (string); - -export type ListOauthLoginsResponse = ({ - oauth: Array<{ - type: string; - display_name?: string; - }>; - saml?: string; -}); - -export type ListOauthConnectsResponse = (Array<(string)>); - -export type GetOauthConnectData = { - /** - * client name - */ - client: string; -}; - -export type GetOauthConnectResponse = ({ - extra_params?: { - [key: string]: unknown; - }; - scopes?: Array<(string)>; -}); - -export type SyncTeamsResponse = (Array); - -export type SendMessageToConversationData = { - requestBody: { - /** - * The ID of the Teams conversation/activity - */ - conversation_id: string; - /** - * Used for styling the card conditionally - */ - success?: boolean; - /** - * The message text to be sent in the Teams card - */ - text: string; - /** - * The card block to be sent in the Teams card - */ - card_block?: { - [key: string]: unknown; - }; - }; -}; - -export type SendMessageToConversationResponse = (unknown); - -export type CreateResourceData = { - /** - * new resource - */ - requestBody: CreateResource; - updateIfExists?: boolean; - workspace: string; -}; - -export type CreateResourceResponse = (string); - -export type DeleteResourceData = { - path: string; - workspace: string; -}; - -export type DeleteResourceResponse = (string); - -export type UpdateResourceData = { - path: string; - /** - * updated resource - */ - requestBody: EditResource; - workspace: string; -}; - -export type UpdateResourceResponse = (string); - -export type UpdateResourceValueData = { - path: string; - /** - * updated resource - */ - requestBody: { - value?: unknown; - }; - workspace: string; -}; - -export type UpdateResourceValueResponse = (string); - -export type GetResourceData = { - path: string; - workspace: string; -}; - -export type GetResourceResponse = (Resource); - -export type GetResourceValueInterpolatedData = { - /** - * job id - */ - jobId?: string; - path: string; - workspace: string; -}; - -export type GetResourceValueInterpolatedResponse = (unknown); - -export type GetResourceValueData = { - path: string; - workspace: string; -}; - -export type GetResourceValueResponse = (unknown); - -export type ExistsResourceData = { - path: string; - workspace: string; -}; - -export type ExistsResourceResponse = (boolean); - -export type ListResourceData = { - /** - * which page to return (start at 1, default 1) - */ - page?: number; - pathStart?: string; - /** - * number of items to return for a given page (default 30, max 100) - */ - perPage?: number; - /** - * resource_types to list from, separated by ',', - */ - resourceType?: string; - /** - * resource_types to not list from, separated by ',', - */ - resourceTypeExclude?: string; - workspace: string; -}; - -export type ListResourceResponse = (Array); - -export type ListSearchResourceData = { - workspace: string; -}; - -export type ListSearchResourceResponse = (Array<{ - path: string; - value: unknown; -}>); - -export type ListResourceNamesData = { - name: string; - workspace: string; -}; - -export type ListResourceNamesResponse = (Array<{ - name: string; - path: string; -}>); - -export type CreateResourceTypeData = { - /** - * new resource_type - */ - requestBody: ResourceType; - workspace: string; -}; - -export type CreateResourceTypeResponse = (string); - -export type FileResourceTypeToFileExtMapData = { - workspace: string; -}; - -export type FileResourceTypeToFileExtMapResponse = (unknown); - -export type DeleteResourceTypeData = { - path: string; - workspace: string; -}; - -export type DeleteResourceTypeResponse = (string); - -export type UpdateResourceTypeData = { - path: string; - /** - * updated resource_type - */ - requestBody: EditResourceType; - workspace: string; -}; - -export type UpdateResourceTypeResponse = (string); - -export type GetResourceTypeData = { - path: string; - workspace: string; -}; - -export type GetResourceTypeResponse = (ResourceType); - -export type ExistsResourceTypeData = { - path: string; - workspace: string; -}; - -export type ExistsResourceTypeResponse = (boolean); - -export type ListResourceTypeData = { - workspace: string; -}; - -export type ListResourceTypeResponse = (Array); - -export type ListResourceTypeNamesData = { - workspace: string; -}; - -export type ListResourceTypeNamesResponse = (Array<(string)>); - -export type QueryResourceTypesData = { - /** - * query limit - */ - limit?: number; - /** - * query text - */ - text: string; - workspace: string; -}; - -export type QueryResourceTypesResponse = (Array<{ - name: string; - score: number; - schema?: unknown; -}>); - -export type ListHubIntegrationsData = { - /** - * query integrations kind - */ - kind?: string; -}; - -export type ListHubIntegrationsResponse = (Array<{ - name: string; -}>); - -export type ListHubFlowsResponse = ({ - flows?: Array<{ - id: number; - flow_id: number; - summary: string; - apps: Array<(string)>; - approved: boolean; - votes: number; - }>; -}); - -export type GetHubFlowByIdData = { - id: number; -}; - -export type GetHubFlowByIdResponse = ({ - flow?: OpenFlow; -}); - -export type ListHubAppsResponse = ({ - apps?: Array<{ - id: number; - app_id: number; - summary: string; - apps: Array<(string)>; - approved: boolean; - votes: number; - }>; -}); - -export type GetHubAppByIdData = { - id: number; -}; - -export type GetHubAppByIdResponse = ({ - app: { - summary: string; - value: unknown; - }; -}); - -export type GetPublicAppByCustomPathData = { - customPath: string; -}; - -export type GetPublicAppByCustomPathResponse = ((AppWithLastVersion & { - workspace_id?: string; -})); - -export type GetHubScriptContentByPathData = { - path: string; -}; - -export type GetHubScriptContentByPathResponse = (string); - -export type GetHubScriptByPathData = { - path: string; -}; - -export type GetHubScriptByPathResponse = ({ - content: string; - lockfile?: string; - schema?: unknown; - language: string; - summary?: string; -}); - -export type GetTopHubScriptsData = { - /** - * query scripts app - */ - app?: string; - /** - * query scripts kind - */ - kind?: string; - /** - * query limit - */ - limit?: number; -}; - -export type GetTopHubScriptsResponse = ({ - asks?: Array<{ - id: number; - ask_id: number; - summary: string; - app: string; - version_id: number; - kind: HubScriptKind; - votes: number; - views: number; - }>; -}); - -export type QueryHubScriptsData = { - /** - * query scripts app - */ - app?: string; - /** - * query scripts kind - */ - kind?: string; - /** - * query limit - */ - limit?: number; - /** - * query text - */ - text: string; -}; - -export type QueryHubScriptsResponse = (Array<{ - ask_id: number; - id: number; - version_id: number; - summary: string; - app: string; - kind: HubScriptKind; - score: number; -}>); - -export type ListSearchScriptData = { - workspace: string; -}; - -export type ListSearchScriptResponse = (Array<{ - path: string; - content: string; -}>); - -export type ListScriptsData = { - /** - * mask to filter exact matching user creator - */ - createdBy?: string; - /** - * mask to filter scripts whom first direct parent has exact hash - */ - firstParentHash?: string; - /** - * (default false) - * include scripts that have no deployed version - * - */ - includeDraftOnly?: boolean; - /** - * (default false) - * include scripts without an exported main function - * - */ - includeWithoutMain?: boolean; - /** - * (default regardless) - * if true show only the templates - * if false show only the non templates - * if not defined, show all regardless of if the script is a template - * - */ - isTemplate?: boolean; - /** - * (default regardless) - * script kinds to filter, split by comma - * - */ - kinds?: string; - /** - * mask to filter scripts whom last parent in the chain has exact hash. - * Beware that each script stores only a limited number of parents. Hence - * the last parent hash for a script is not necessarily its top-most parent. - * To find the top-most parent you will have to jump from last to last hash - * until finding the parent - * - */ - lastParentHash?: string; - /** - * order by desc order (default true) - */ - orderDesc?: boolean; - /** - * which page to return (start at 1, default 1) - */ - page?: number; - /** - * is the hash present in the array of stored parent hashes for this script. - * The same warning applies than for last_parent_hash. A script only store a - * limited number of direct parent - * - */ - parentHash?: string; - /** - * mask to filter exact matching path - */ - pathExact?: string; - /** - * mask to filter matching starting path - */ - pathStart?: string; - /** - * number of items to return for a given page (default 30, max 100) - */ - perPage?: number; - /** - * (default false) - * show only the archived files. - * when multiple archived hash share the same path, only the ones with the latest create_at - * are - * ed. - * - */ - showArchived?: boolean; - /** - * (default false) - * show only the starred items - * - */ - starredOnly?: boolean; - /** - * (default false) - * include deployment message - * - */ - withDeploymentMsg?: boolean; - workspace: string; -}; - -export type ListScriptsResponse = (Array @@ -55,10 +54,10 @@

Workspace color

- {#if savedWorkspaceColor} + {#if $workspaceColor}
{:else} No color set @@ -76,9 +75,7 @@ }} />
-

- Color to identify the current workspace in the list of workspaces -

+

Color to identify the current workspace in the list of workspaces

@@ -88,12 +85,12 @@
{#if colorEnabled} - + {/if} diff --git a/frontend/src/lib/components/settings/ChangeWorkspaceName.svelte b/frontend/src/lib/components/settings/ChangeWorkspaceName.svelte index 52b9dfb2de..1fabd3b231 100644 --- a/frontend/src/lib/components/settings/ChangeWorkspaceName.svelte +++ b/frontend/src/lib/components/settings/ChangeWorkspaceName.svelte @@ -6,15 +6,21 @@ import Modal from '../common/modal/Modal.svelte' import { Pen } from 'lucide-svelte' - let newName = '' - let currentName = '' + let { open = false } = $props<{ open?: boolean }>() + + let newName = $state('') + let currentName = $state('') + + $effect(() => { + if ($workspaceStore) { + getWorkspaceName() + } + }) async function getWorkspaceName() { currentName = await WorkspaceService.getWorkspaceName({ workspace: $workspaceStore! }) } - getWorkspaceName() - async function renameWorkspace() { open = false await WorkspaceService.changeWorkspaceName({ @@ -28,8 +34,6 @@ newName = '' getWorkspaceName() } - - export let open = false
@@ -50,9 +54,7 @@ />
-

- Displayable name -

+

Displayable name

diff --git a/frontend/src/lib/components/sidebar/WorkspaceMenu.svelte b/frontend/src/lib/components/sidebar/WorkspaceMenu.svelte index c110f5df4f..f7e481b7cb 100644 --- a/frontend/src/lib/components/sidebar/WorkspaceMenu.svelte +++ b/frontend/src/lib/components/sidebar/WorkspaceMenu.svelte @@ -5,7 +5,8 @@ userStore, userWorkspaces, workspaceStore, - workspaceUsageStore + workspaceUsageStore, + workspaceColor } from '$lib/stores' import { Building, Plus, Settings } from 'lucide-svelte' import MenuButton from '$lib/components/sidebar/MenuButton.svelte' @@ -61,7 +62,7 @@ icon={Building} label={$workspaceStore ?? ''} {isCollapsed} - color={$userWorkspaces.find((w) => w.id === $workspaceStore)?.color} + color={$workspaceColor} {trigger} /> @@ -153,9 +154,7 @@ >{$workspaceUsageStore}/1000 free workspace execs
-
{/if} diff --git a/frontend/src/lib/stores.ts b/frontend/src/lib/stores.ts index 5168b184c4..20e48d235c 100644 --- a/frontend/src/lib/stores.ts +++ b/frontend/src/lib/stores.ts @@ -9,7 +9,8 @@ import { type OperatorSettings, type TokenResponse, type UserWorkspaceList, - type WorkspaceDefaultScripts + type WorkspaceDefaultScripts, + WorkspaceService } from './gen' import { getLocalSetting } from './utils' @@ -202,3 +203,32 @@ export const dbSchemas = writable({}) export const instanceSettingsSelectedTab = writable('Core') export const isCriticalAlertsUIOpen = writable(false) + +export const workspaceColor: Readable = derived( + [workspaceStore, usersWorkspaceStore, superadmin], + ([workspaceStore, usersWorkspaceStore, superadmin], set: (value: string | undefined) => void) => { + if (!workspaceStore) { + set(undefined) + return + } + + // First try to get the color from usersWorkspaceStore + const color = usersWorkspaceStore?.workspaces.find((w) => w.id === workspaceStore)?.color + + if (color) { + set(color) + return + } + + // If not found and user is superadmin, try to get it from superadmin list + if (!superadmin) { + set(undefined) + return + } + + WorkspaceService.listWorkspacesAsSuperAdmin().then((workspaces) => { + const superadminColor = workspaces.find((w) => w.id === workspaceStore)?.color + set(superadminColor) + }) + } +) From ab7511e75f508ed5298a66e2ed5cd23b5ec783f2 Mon Sep 17 00:00:00 2001 From: Guilhem Date: Wed, 16 Apr 2025 22:57:52 +0100 Subject: [PATCH 225/739] ensure schedule is deployed to edit and open advanced (#5626) --- frontend/src/lib/components/RunPageSchedules.svelte | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/lib/components/RunPageSchedules.svelte b/frontend/src/lib/components/RunPageSchedules.svelte index 18083513bd..de392dd4d9 100644 --- a/frontend/src/lib/components/RunPageSchedules.svelte +++ b/frontend/src/lib/components/RunPageSchedules.svelte @@ -92,7 +92,7 @@ right: 'Enabled' }} on:change={async (e) => { - if (!newItem) { + if (!newItem && $initialPrimarySchedule != false) { await ScheduleService.setScheduleEnabled({ path: path, workspace: $workspaceStore ?? '', @@ -143,7 +143,7 @@

Define a schedule frequency first

{/if} - {#if $initialPrimarySchedule != false} + {#if $initialPrimarySchedule != false && !newItem}
Date: Thu, 17 Apr 2025 00:05:40 +0200 Subject: [PATCH 226/739] improve no_proxy value by default --- backend/windmill-worker/src/worker.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backend/windmill-worker/src/worker.rs b/backend/windmill-worker/src/worker.rs index e8eff2f1cd..fed83e07e0 100644 --- a/backend/windmill-worker/src/worker.rs +++ b/backend/windmill-worker/src/worker.rs @@ -284,6 +284,8 @@ lazy_static::lazy_static! { let mut proxy_env = Vec::new(); if let Some(no_proxy) = NO_PROXY.as_ref() { proxy_env.push(("NO_PROXY", no_proxy.to_string())); + } else if HTTPS_PROXY.is_some() || HTTP_PROXY.is_some() { + proxy_env.push(("NO_PROXY", "localhost,127.0.0.1".to_string())); } if let Some(http_proxy) = HTTP_PROXY.as_ref() { proxy_env.push(("HTTP_PROXY", http_proxy.to_string())); From 11e316519124bf5dd995fc0e50f2c1fdb549114a Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 17 Apr 2025 00:15:10 +0200 Subject: [PATCH 227/739] fix gcp trigger types issue temporarily by disabling them on cli --- cli/trigger.ts | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/cli/trigger.ts b/cli/trigger.ts index f099885615..2edd6b1674 100644 --- a/cli/trigger.ts +++ b/cli/trigger.ts @@ -28,7 +28,7 @@ type Trigger = { postgres: PostgresTrigger; mqtt: MqttTrigger; sqs: SqsTrigger; - gcp: GcpTrigger + gcp: GcpTrigger; }; type TriggerFile = Omit< @@ -62,7 +62,7 @@ async function getTrigger( postgres: wmill.getPostgresTrigger, mqtt: wmill.getMqttTrigger, sqs: wmill.getSqsTrigger, - gcp: wmill.getGcpTrigger + gcp: wmill.getGcpTrigger, }; const triggerFunction = triggerFunctions[triggerType]; @@ -90,7 +90,9 @@ async function updateTrigger( postgres: wmill.updatePostgresTrigger, mqtt: wmill.updateMqttTrigger, sqs: wmill.updateSqsTrigger, - gcp: wmill.updateGcpTrigger + gcp: async (args) => { + throw new Error("GCP triggers are not supported yet"); + }, }; const triggerFunction = triggerFunctions[triggerType]; await triggerFunction({ workspace, path, requestBody: trigger }); @@ -116,7 +118,9 @@ async function createTrigger( postgres: wmill.createPostgresTrigger, mqtt: wmill.createMqttTrigger, sqs: wmill.createSqsTrigger, - gcp: wmill.createGcpTrigger + gcp: async (args) => { + throw new Error("GCP triggers are not supported yet"); + }, }; const triggerFunction = triggerFunctions[triggerType]; await triggerFunction({ workspace, path, requestBody: trigger }); @@ -197,8 +201,8 @@ async function list(opts: GlobalOptions) { workspace: workspace.workspaceId, }); const gcpTriggers = await wmill.listGcpTriggers({ - workspace: workspace.workspaceId - }) + workspace: workspace.workspaceId, + }); const triggers = [ ...httpTriggers.map((x) => ({ path: x.path, kind: "http" })), ...websocketTriggers.map((x) => ({ path: x.path, kind: "websocket" })), @@ -207,7 +211,7 @@ async function list(opts: GlobalOptions) { ...postgresTriggers.map((x) => ({ path: x.path, kind: "postgres" })), ...mqttTriggers.map((x) => ({ path: x.path, kind: "mqtt" })), ...sqsTriggers.map((x) => ({ path: x.path, kind: "sqs" })), - ...gcpTriggers.map((x) => ({ path: x.path, kind: "gcp" })) + ...gcpTriggers.map((x) => ({ path: x.path, kind: "gcp" })), ]; new Table() @@ -221,7 +225,16 @@ async function list(opts: GlobalOptions) { function checkIfValidTrigger(kind: string | undefined): kind is TriggerType { if ( kind && - ["http", "websocket", "kafka", "nats", "postgres", "mqtt", "sqs", "gcp"].includes(kind) + [ + "http", + "websocket", + "kafka", + "nats", + "postgres", + "mqtt", + "sqs", + "gcp", + ].includes(kind) ) { return true; } else { From bd7c6a2a46047de5fe89753decdfdf1f4851ee3f Mon Sep 17 00:00:00 2001 From: Guilhem Date: Wed, 16 Apr 2025 23:21:00 +0100 Subject: [PATCH 228/739] fix(frontend): postgres remove selectedTable (#5386) * remove selectedTable * add deletion options * fix select * add delete option for replication slot and fixed type conversion for timestampz * fix delete active slot * fix undefined error and add schema display --------- Co-authored-by: dieriba Co-authored-by: dieriba --- backend/windmill-api/src/postgres_triggers/handler.rs | 7 ++++--- .../triggers/postgres/PostgresEditorConfigSection.svelte | 1 - .../triggers/postgres/PostgresTriggerEditorInner.svelte | 7 +++---- .../lib/components/triggers/postgres/RelationPicker.svelte | 7 ++++--- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/backend/windmill-api/src/postgres_triggers/handler.rs b/backend/windmill-api/src/postgres_triggers/handler.rs index 69fe8604f2..fcb5a934ff 100644 --- a/backend/windmill-api/src/postgres_triggers/handler.rs +++ b/backend/windmill-api/src/postgres_triggers/handler.rs @@ -30,9 +30,10 @@ use windmill_common::{ }; use super::{ - create_logical_replication_slot_query, create_publication_query, drop_publication_query, - generate_random_string, get_database_connection, get_raw_postgres_connection, - ERROR_PUBLICATION_NAME_NOT_EXISTS, ERROR_REPLICATION_SLOT_NOT_EXISTS, + create_logical_replication_slot_query, create_publication_query, + drop_logical_replication_slot_query, drop_publication_query, generate_random_string, + get_database_connection, get_raw_postgres_connection, ERROR_PUBLICATION_NAME_NOT_EXISTS, + ERROR_REPLICATION_SLOT_NOT_EXISTS, }; use lazy_static::lazy_static; diff --git a/frontend/src/lib/components/triggers/postgres/PostgresEditorConfigSection.svelte b/frontend/src/lib/components/triggers/postgres/PostgresEditorConfigSection.svelte index 29172d031a..9ed430bcee 100644 --- a/frontend/src/lib/components/triggers/postgres/PostgresEditorConfigSection.svelte +++ b/frontend/src/lib/components/triggers/postgres/PostgresEditorConfigSection.svelte @@ -35,7 +35,6 @@ export let publication: PublicationData = DEFAULT_PUBLICATION function updateValidity(publication: PublicationData) { - console.log({ publication }) isValid = !emptyString(postgres_resource_path) && (!publication.table_to_track || publication.table_to_track.length === 0) diff --git a/frontend/src/lib/components/triggers/postgres/PostgresTriggerEditorInner.svelte b/frontend/src/lib/components/triggers/postgres/PostgresTriggerEditorInner.svelte index 4956808907..988152f00c 100644 --- a/frontend/src/lib/components/triggers/postgres/PostgresTriggerEditorInner.svelte +++ b/frontend/src/lib/components/triggers/postgres/PostgresTriggerEditorInner.svelte @@ -45,7 +45,7 @@ let postgres_resource_path = '' let publication_name: string = '' let replication_slot_name: string = '' - let relations: Relations[] = [] + let relations: Relations[] | undefined = [] let transaction_to_track: string[] = [] let language: Language = 'Typescript' let loading = false @@ -247,11 +247,10 @@ } const getTemplateScript = async () => { - if (relations.length === 0 || emptyString(postgres_resource_path)) { + if (!relations || relations.length === 0 || emptyString(postgres_resource_path)) { sendUserToast('You must pick a database resource and choose at least one schema', true) return } - try { loading = true let templateId = await PostgresTriggerService.createTemplateScript({ @@ -359,7 +358,7 @@ allowRefresh /> - {#if script_path === undefined && is_flow === false} + {#if emptyStringTrimmed(script_path) && is_flow === false}
{/each}
- {:else if relations} + {/if} + {#if selected === 'specific'}
Date: Thu, 17 Apr 2025 00:23:55 +0200 Subject: [PATCH 229/739] chore(main): release 1.482.1 (#5623) * chore(main): release 1.482.1 * Apply automatic changes --------- Co-authored-by: rubenfiszel <275584+rubenfiszel@users.noreply.github.com> --- CHANGELOG.md | 10 +++ backend/Cargo.lock | 90 +++++++++---------- backend/Cargo.toml | 4 +- backend/windmill-api/openapi.yaml | 2 +- benchmarks/lib.ts | 2 +- cli/main.ts | 2 +- frontend/package-lock.json | 4 +- frontend/package.json | 2 +- lsp/Pipfile | 4 +- openflow.openapi.yaml | 2 +- .../WindmillClient/WindmillClient.psd1 | 2 +- python-client/wmill/pyproject.toml | 2 +- python-client/wmill_pg/pyproject.toml | 2 +- typescript-client/jsr.json | 2 +- typescript-client/package.json | 2 +- version.txt | 2 +- 16 files changed, 72 insertions(+), 62 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b440e9a04..29ef5a0eb2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## [1.482.1](https://github.com/windmill-labs/windmill/compare/v1.482.0...v1.482.1) (2025-04-16) + + +### Bug Fixes + +* flow editor workspace script test use actual workspace script hash ([24e893b](https://github.com/windmill-labs/windmill/commit/24e893b8c50fafdb41f4b6e1777cb34aceafc466)) +* **frontend:** postgres remove selectedTable ([#5386](https://github.com/windmill-labs/windmill/issues/5386)) ([bd7c6a2](https://github.com/windmill-labs/windmill/commit/bd7c6a2a46047de5fe89753decdfdf1f4851ee3f)) +* **openapi:** fix openapi def of batch re-run jobs ([cb8731e](https://github.com/windmill-labs/windmill/commit/cb8731e7e37fb6cd052f5dae6fdce46e6ca2409c)) +* show workspace color if superadmin and not in workspace + change workspace name when switching workspace ([#5625](https://github.com/windmill-labs/windmill/issues/5625)) ([cc4384f](https://github.com/windmill-labs/windmill/commit/cc4384f48cc89f883237a2082d854d69a7b5dc56)) + ## [1.482.0](https://github.com/windmill-labs/windmill/compare/v1.481.0...v1.482.0) (2025-04-15) diff --git a/backend/Cargo.lock b/backend/Cargo.lock index 90ccbcfd85..c1a86edbb3 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -9050,9 +9050,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.94" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" dependencies = [ "unicode-ident", ] @@ -9259,9 +9259,9 @@ dependencies = [ [[package]] name = "quick_cache" -version = "0.6.12" +version = "0.6.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f8ed0655cbaf18a26966142ad23b95d8ab47221c50c4f73a1db7d0d2d6e3da8" +checksum = "287e56aac5a2b4fb25a6fb050961d157635924c8696305a5c937a76f29841a0f" dependencies = [ "ahash 0.8.11", "equivalent", @@ -11132,9 +11132,9 @@ dependencies = [ [[package]] name = "sqlx" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14e22987355fbf8cfb813a0cf8cd97b1b4ec834b94dbd759a9e8679d41fabe83" +checksum = "f3c3a85280daca669cfd3bcb68a337882a8bc57ec882f72c5d13a430613a738e" dependencies = [ "sqlx-core", "sqlx-macros", @@ -11145,9 +11145,9 @@ dependencies = [ [[package]] name = "sqlx-core" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55c4720d7d4cd3d5b00f61d03751c685ad09c33ae8290c8a2c11335e0604300b" +checksum = "f743f2a3cea30a58cd479013f75550e879009e3a02f616f18ca699335aa248c3" dependencies = [ "base64 0.22.1", "bigdecimal", @@ -11184,9 +11184,9 @@ dependencies = [ [[package]] name = "sqlx-macros" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175147fcb75f353ac7675509bc58abb2cb291caf0fd24a3623b8f7e3eb0a754b" +checksum = "7f4200e0fde19834956d4252347c12a083bdcb237d7a1a1446bffd8768417dce" dependencies = [ "proc-macro2", "quote", @@ -11197,9 +11197,9 @@ dependencies = [ [[package]] name = "sqlx-macros-core" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cde983058e53bfa75998e1982086c5efe3c370f3250bf0357e344fa3352e32b" +checksum = "882ceaa29cade31beca7129b6beeb05737f44f82dbe2a9806ecea5a7093d00b7" dependencies = [ "dotenvy", "either", @@ -11223,9 +11223,9 @@ dependencies = [ [[package]] name = "sqlx-mysql" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "847d2e5393a4f39e47e4f36cab419709bc2b83cbe4223c60e86e1471655be333" +checksum = "0afdd3aa7a629683c2d750c2df343025545087081ab5942593a5288855b1b7a7" dependencies = [ "atoi", "base64 0.22.1", @@ -11268,9 +11268,9 @@ dependencies = [ [[package]] name = "sqlx-postgres" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc35947a541b9e0a2e3d85da444f1c4137c13040267141b208395a0d0ca4659f" +checksum = "a0bedbe1bbb5e2615ef347a5e9d8cd7680fb63e77d9dafc0f29be15e53f1ebe6" dependencies = [ "atoi", "base64 0.22.1", @@ -11309,9 +11309,9 @@ dependencies = [ [[package]] name = "sqlx-sqlite" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c48291dac4e5ed32da0927a0b981788be65674aeb62666d19873ab4289febde" +checksum = "c26083e9a520e8eb87a06b12347679b142dc2ea29e6e409f805644a7a979a5bc" dependencies = [ "atoi", "chrono", @@ -13912,7 +13912,7 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windmill" -version = "1.482.0" +version = "1.482.1" dependencies = [ "anyhow", "axum", @@ -13959,7 +13959,7 @@ dependencies = [ [[package]] name = "windmill-api" -version = "1.482.0" +version = "1.482.1" dependencies = [ "anyhow", "argon2", @@ -14066,7 +14066,7 @@ dependencies = [ [[package]] name = "windmill-api-client" -version = "1.482.0" +version = "1.482.1" dependencies = [ "base64 0.22.1", "chrono", @@ -14081,7 +14081,7 @@ dependencies = [ [[package]] name = "windmill-audit" -version = "1.482.0" +version = "1.482.1" dependencies = [ "chrono", "serde", @@ -14094,7 +14094,7 @@ dependencies = [ [[package]] name = "windmill-autoscaling" -version = "1.482.0" +version = "1.482.1" dependencies = [ "anyhow", "serde", @@ -14108,7 +14108,7 @@ dependencies = [ [[package]] name = "windmill-common" -version = "1.482.0" +version = "1.482.1" dependencies = [ "anyhow", "async-stream", @@ -14172,7 +14172,7 @@ dependencies = [ [[package]] name = "windmill-git-sync" -version = "1.482.0" +version = "1.482.1" dependencies = [ "regex", "serde", @@ -14186,7 +14186,7 @@ dependencies = [ [[package]] name = "windmill-indexer" -version = "1.482.0" +version = "1.482.1" dependencies = [ "anyhow", "bytes", @@ -14209,7 +14209,7 @@ dependencies = [ [[package]] name = "windmill-macros" -version = "1.482.0" +version = "1.482.1" dependencies = [ "itertools 0.14.0", "lazy_static", @@ -14221,7 +14221,7 @@ dependencies = [ [[package]] name = "windmill-parser" -version = "1.482.0" +version = "1.482.1" dependencies = [ "convert_case 0.6.0", "serde", @@ -14230,7 +14230,7 @@ dependencies = [ [[package]] name = "windmill-parser-bash" -version = "1.482.0" +version = "1.482.1" dependencies = [ "anyhow", "lazy_static", @@ -14242,7 +14242,7 @@ dependencies = [ [[package]] name = "windmill-parser-csharp" -version = "1.482.0" +version = "1.482.1" dependencies = [ "anyhow", "serde_json", @@ -14254,7 +14254,7 @@ dependencies = [ [[package]] name = "windmill-parser-go" -version = "1.482.0" +version = "1.482.1" dependencies = [ "anyhow", "gosyn", @@ -14266,7 +14266,7 @@ dependencies = [ [[package]] name = "windmill-parser-graphql" -version = "1.482.0" +version = "1.482.1" dependencies = [ "anyhow", "lazy_static", @@ -14278,7 +14278,7 @@ dependencies = [ [[package]] name = "windmill-parser-java" -version = "1.482.0" +version = "1.482.1" dependencies = [ "anyhow", "serde_json", @@ -14290,7 +14290,7 @@ dependencies = [ [[package]] name = "windmill-parser-nu" -version = "1.482.0" +version = "1.482.1" dependencies = [ "anyhow", "nu-parser", @@ -14301,7 +14301,7 @@ dependencies = [ [[package]] name = "windmill-parser-php" -version = "1.482.0" +version = "1.482.1" dependencies = [ "anyhow", "itertools 0.14.0", @@ -14312,7 +14312,7 @@ dependencies = [ [[package]] name = "windmill-parser-py" -version = "1.482.0" +version = "1.482.1" dependencies = [ "anyhow", "itertools 0.14.0", @@ -14323,7 +14323,7 @@ dependencies = [ [[package]] name = "windmill-parser-py-imports" -version = "1.482.0" +version = "1.482.1" dependencies = [ "anyhow", "async-recursion", @@ -14343,7 +14343,7 @@ dependencies = [ [[package]] name = "windmill-parser-rust" -version = "1.482.0" +version = "1.482.1" dependencies = [ "anyhow", "convert_case 0.6.0", @@ -14360,7 +14360,7 @@ dependencies = [ [[package]] name = "windmill-parser-sql" -version = "1.482.0" +version = "1.482.1" dependencies = [ "anyhow", "lazy_static", @@ -14372,7 +14372,7 @@ dependencies = [ [[package]] name = "windmill-parser-ts" -version = "1.482.0" +version = "1.482.1" dependencies = [ "anyhow", "lazy_static", @@ -14390,7 +14390,7 @@ dependencies = [ [[package]] name = "windmill-parser-wasm" -version = "1.482.0" +version = "1.482.1" dependencies = [ "anyhow", "getrandom 0.2.15", @@ -14414,7 +14414,7 @@ dependencies = [ [[package]] name = "windmill-parser-yaml" -version = "1.482.0" +version = "1.482.1" dependencies = [ "anyhow", "serde_json", @@ -14424,7 +14424,7 @@ dependencies = [ [[package]] name = "windmill-queue" -version = "1.482.0" +version = "1.482.1" dependencies = [ "anyhow", "async-recursion", @@ -14457,7 +14457,7 @@ dependencies = [ [[package]] name = "windmill-sql-datatype-parser-wasm" -version = "1.482.0" +version = "1.482.1" dependencies = [ "wasm-bindgen", "wasm-bindgen-test", @@ -14467,7 +14467,7 @@ dependencies = [ [[package]] name = "windmill-worker" -version = "1.482.0" +version = "1.482.1" dependencies = [ "anyhow", "async-recursion", diff --git a/backend/Cargo.toml b/backend/Cargo.toml index 8e718debba..16e919618a 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "windmill" -version = "1.482.0" +version = "1.482.1" authors.workspace = true edition.workspace = true @@ -32,7 +32,7 @@ members = [ ] [workspace.package] -version = "1.482.0" +version = "1.482.1" authors = ["Ruben Fiszel "] edition = "2021" diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index 5f677f5f58..c73797244c 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.482.0 + version: 1.482.1 title: Windmill API contact: diff --git a/benchmarks/lib.ts b/benchmarks/lib.ts index 3f4a8ed24e..592cf6a006 100644 --- a/benchmarks/lib.ts +++ b/benchmarks/lib.ts @@ -2,7 +2,7 @@ import { sleep } from "https://deno.land/x/sleep@v1.2.1/mod.ts"; import * as windmill from "https://deno.land/x/windmill@v1.174.0/mod.ts"; import * as api from "https://deno.land/x/windmill@v1.174.0/windmill-api/index.ts"; -export const VERSION = "v1.482.0"; +export const VERSION = "v1.482.1"; export async function login(email: string, password: string): Promise { return await windmill.UserService.login({ diff --git a/cli/main.ts b/cli/main.ts index 84e30a4bdb..b6f88d5a9e 100644 --- a/cli/main.ts +++ b/cli/main.ts @@ -63,7 +63,7 @@ export { // } // }); -export const VERSION = "1.482.0"; +export const VERSION = "1.482.1"; const command = new Command() .name("wmill") diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 69cfe8c20a..01990d9d44 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "windmill-components", - "version": "1.482.0", + "version": "1.482.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "windmill-components", - "version": "1.482.0", + "version": "1.482.1", "license": "AGPL-3.0", "dependencies": { "@aws-crypto/sha256-js": "^4.0.0", diff --git a/frontend/package.json b/frontend/package.json index e37e03865a..e192984785 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "windmill-components", - "version": "1.482.0", + "version": "1.482.1", "scripts": { "dev": "vite dev", "build": "vite build", diff --git a/lsp/Pipfile b/lsp/Pipfile index 45e4c17df2..2df2f0ee4e 100644 --- a/lsp/Pipfile +++ b/lsp/Pipfile @@ -4,8 +4,8 @@ verify_ssl = true name = "pypi" [packages] -wmill = ">=1.482.0" -wmill_pg = ">=1.482.0" +wmill = ">=1.482.1" +wmill_pg = ">=1.482.1" sendgrid = "*" mysql-connector-python = "*" pymongo = "*" diff --git a/openflow.openapi.yaml b/openflow.openapi.yaml index 6724dce66b..ab00748a74 100644 --- a/openflow.openapi.yaml +++ b/openflow.openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.482.0 + version: 1.482.1 title: OpenFlow Spec contact: name: Ruben Fiszel diff --git a/powershell-client/WindmillClient/WindmillClient.psd1 b/powershell-client/WindmillClient/WindmillClient.psd1 index 220bbd7a30..c6c64b9bb2 100644 --- a/powershell-client/WindmillClient/WindmillClient.psd1 +++ b/powershell-client/WindmillClient/WindmillClient.psd1 @@ -12,7 +12,7 @@ RootModule = 'WindmillClient.psm1' # Version number of this module. - ModuleVersion = '1.482.0' + ModuleVersion = '1.482.1' # Supported PSEditions # CompatiblePSEditions = @() diff --git a/python-client/wmill/pyproject.toml b/python-client/wmill/pyproject.toml index 0d460bfc45..b205777dbc 100644 --- a/python-client/wmill/pyproject.toml +++ b/python-client/wmill/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "wmill" -version = "1.482.0" +version = "1.482.1" description = "A client library for accessing Windmill server wrapping the Windmill client API" license = "Apache-2.0" homepage = "https://windmill.dev" diff --git a/python-client/wmill_pg/pyproject.toml b/python-client/wmill_pg/pyproject.toml index 24aff1ad80..3de477865b 100644 --- a/python-client/wmill_pg/pyproject.toml +++ b/python-client/wmill_pg/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "wmill-pg" -version = "1.482.0" +version = "1.482.1" description = "An extension client for the wmill client library focused on pg" license = "Apache-2.0" homepage = "https://windmill.dev" diff --git a/typescript-client/jsr.json b/typescript-client/jsr.json index 6ad1b20d4f..caa472284e 100644 --- a/typescript-client/jsr.json +++ b/typescript-client/jsr.json @@ -1,6 +1,6 @@ { "name": "@windmill/windmill", - "version": "1.482.0", + "version": "1.482.1", "exports": "./src/index.ts", "publish": { "exclude": ["!src", "./s3Types.ts", "./client.ts"] diff --git a/typescript-client/package.json b/typescript-client/package.json index 5970770b2b..f3ce3e5b22 100644 --- a/typescript-client/package.json +++ b/typescript-client/package.json @@ -1,7 +1,7 @@ { "name": "windmill-client", "description": "Windmill SDK client for browsers and Node.js", - "version": "1.482.0", + "version": "1.482.1", "author": "Ruben Fiszel", "license": "Apache 2.0", "devDependencies": { diff --git a/version.txt b/version.txt index 5645e944ef..1afef9f22a 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.482.0 +1.482.1 From 4198a574d475db8ca97ec6c878fd5b2bb6cddd55 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 17 Apr 2025 09:22:20 +0200 Subject: [PATCH 230/739] fix checks --- backend/windmill-api/src/postgres_triggers/handler.rs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/backend/windmill-api/src/postgres_triggers/handler.rs b/backend/windmill-api/src/postgres_triggers/handler.rs index fcb5a934ff..d1cd92e8c3 100644 --- a/backend/windmill-api/src/postgres_triggers/handler.rs +++ b/backend/windmill-api/src/postgres_triggers/handler.rs @@ -30,10 +30,9 @@ use windmill_common::{ }; use super::{ - create_logical_replication_slot_query, create_publication_query, - drop_logical_replication_slot_query, drop_publication_query, generate_random_string, - get_database_connection, get_raw_postgres_connection, ERROR_PUBLICATION_NAME_NOT_EXISTS, - ERROR_REPLICATION_SLOT_NOT_EXISTS, + create_logical_replication_slot_query, create_publication_query, drop_publication_query, + generate_random_string, get_database_connection, get_raw_postgres_connection, + ERROR_PUBLICATION_NAME_NOT_EXISTS, ERROR_REPLICATION_SLOT_NOT_EXISTS, }; use lazy_static::lazy_static; @@ -396,7 +395,7 @@ pub async fn create_postgres_trigger( "Missing replication slot name".to_string(), )); } - (publication_name.unwrap(), replication_slot_name.unwrap(), ) + (publication_name.unwrap(), replication_slot_name.unwrap()) }; let mut tx = user_db.begin(&authed).await?; From 081145726a5d4ab81510a7637126a036823a1565 Mon Sep 17 00:00:00 2001 From: Diego Imbert <70353967+diegoimbert@users.noreply.github.com> Date: Thu, 17 Apr 2025 09:33:30 +0200 Subject: [PATCH 231/739] fix: fix click outside popover fullscreen (#5631) Co-authored-by: Diego Imbert --- frontend/src/lib/components/meltComponents/Popover.svelte | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frontend/src/lib/components/meltComponents/Popover.svelte b/frontend/src/lib/components/meltComponents/Popover.svelte index fc8c2c4153..4a451213a3 100644 --- a/frontend/src/lib/components/meltComponents/Popover.svelte +++ b/frontend/src/lib/components/meltComponents/Popover.svelte @@ -115,7 +115,8 @@ }} on:pointerdown_outside={() => { if (usePointerDownOutside) { - close() + if (fullScreen) fullScreen = false + else close() } }} data-popover From 2fa0717ee0f4c856ff43276e49a492f47930559d Mon Sep 17 00:00:00 2001 From: Diego Imbert <70353967+diegoimbert@users.noreply.github.com> Date: Thu, 17 Apr 2025 09:33:52 +0200 Subject: [PATCH 232/739] Fix batch rerun not working on pg 14 (#5624) * fix sql query for postgres 14 * deno_core when building backend image in github workflows * sqlx prepare --------- Co-authored-by: Diego Imbert --- .github/workflows/build-publish-rh-image.yml | 7 +++-- .github/workflows/docker-image-rpi4.yml | 2 +- .github/workflows/docker-image.yml | 26 +++++++------------ ...70fcffccd5fae8e2e352de3e1eb104e7fc3a6.json | 23 ++++++++++++++++ backend/windmill-api/src/jobs.rs | 8 ++++-- 5 files changed, 43 insertions(+), 23 deletions(-) create mode 100644 backend/.sqlx/query-264da6a89d005aebf4d5cd5f05e70fcffccd5fae8e2e352de3e1eb104e7fc3a6.json diff --git a/.github/workflows/build-publish-rh-image.yml b/.github/workflows/build-publish-rh-image.yml index 10d2fe43d9..030c617777 100644 --- a/.github/workflows/build-publish-rh-image.yml +++ b/.github/workflows/build-publish-rh-image.yml @@ -64,7 +64,7 @@ jobs: platforms: linux/amd64 push: true build-args: | - features=enterprise,enterprise_saml,stripe,embedding,parquet,prometheus,openidconnect,cloud,jemalloc,license,otel,http_trigger,zip,oauth2,kafka,sqs_trigger,nats,postgres_trigger,gcp_trigger,mqtt_trigger,websocket,smtp,static_frontend,all_languages + features=enterprise,enterprise_saml,stripe,embedding,parquet,prometheus,openidconnect,cloud,jemalloc,license,otel,http_trigger,zip,oauth2,kafka,sqs_trigger,nats,postgres_trigger,gcp_trigger,mqtt_trigger,websocket,smtp,static_frontend,all_languages,deno_core secrets: | rh_username=${{ secrets.RH_USERNAME }} rh_password=${{ secrets.RH_PASSWORD }} @@ -81,7 +81,7 @@ jobs: platforms: linux/arm64 push: true build-args: | - features=enterprise,enterprise_saml,stripe,embedding,parquet,prometheus,openidconnect,cloud,jemalloc,license,otel,http_trigger,zip,oauth2,kafka,sqs_trigger,nats,postgres_trigger,gcp_trigger,mqtt_trigger,websocket,smtp,static_frontend,all_languages + features=enterprise,enterprise_saml,stripe,embedding,parquet,prometheus,openidconnect,cloud,jemalloc,license,otel,http_trigger,zip,oauth2,kafka,sqs_trigger,nats,postgres_trigger,gcp_trigger,mqtt_trigger,websocket,smtp,static_frontend,all_languages,deno_core secrets: | rh_username=${{ secrets.RH_USERNAME }} rh_password=${{ secrets.RH_PASSWORD }} @@ -111,8 +111,7 @@ jobs: - uses: actions/upload-artifact@v4 with: name: RHEL9-amd64 build - path: - ${{ steps.extract-ee-amd64.outputs.destination + path: ${{ steps.extract-ee-amd64.outputs.destination }}/windmill-ee-amd64-rhel9 # - uses: actions/upload-artifact@v4 diff --git a/.github/workflows/docker-image-rpi4.yml b/.github/workflows/docker-image-rpi4.yml index ed4fd7810b..b275ad2154 100644 --- a/.github/workflows/docker-image-rpi4.yml +++ b/.github/workflows/docker-image-rpi4.yml @@ -67,7 +67,7 @@ jobs: platforms: linux/amd64,linux/arm64 push: true build-args: | - features=embedding,parquet,openidconnect,license,http_trigger,zip,oauth2,postgres_trigger,mqtt_trigger,websocket,smtp,static_frontend,all_languages + features=embedding,parquet,openidconnect,license,http_trigger,zip,oauth2,postgres_trigger,mqtt_trigger,websocket,smtp,static_frontend,all_languages,deno_core tags: | ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:dev ${{ steps.meta-public.outputs.tags }} diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index 4b5b19c74a..06f8003c96 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -1,10 +1,8 @@ env: REGISTRY: ghcr.io - IMAGE_NAME: - ${{ github.event_name != 'pull_request' && github.event_name != + IMAGE_NAME: ${{ github.event_name != 'pull_request' && github.event_name != 'workflow_dispatch' && github.repository || 'windmill-labs/windmill-test' }} - DEV_SHA: - ${{ github.event_name != 'pull_request' && github.event_name != + DEV_SHA: ${{ github.event_name != 'pull_request' && github.event_name != 'workflow_dispatch' && 'dev' || github.event.inputs.tag || github.sha }} name: Build windmill:main on: @@ -40,8 +38,7 @@ permissions: write-all jobs: build: runs-on: ubicloud - if: - (github.event_name != 'workflow_dispatch') || (github.event.inputs && + if: (github.event_name != 'workflow_dispatch') || (github.event.inputs && !github.event.inputs.ee) steps: - uses: actions/checkout@v4 @@ -95,7 +92,7 @@ jobs: platforms: linux/amd64,linux/arm64 push: true build-args: | - features=embedding,parquet,openidconnect,jemalloc,license,http_trigger,zip,oauth2,dind,postgres_trigger,mqtt_trigger,websocket,smtp,static_frontend,agent_worker_server,all_languages + features=embedding,parquet,openidconnect,jemalloc,license,http_trigger,zip,oauth2,dind,postgres_trigger,mqtt_trigger,websocket,smtp,static_frontend,agent_worker_server,all_languages,deno_core tags: | ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.DEV_SHA }} ${{ steps.meta-public.outputs.tags }} @@ -157,7 +154,7 @@ jobs: platforms: linux/amd64,linux/arm64 push: true build-args: | - features=enterprise,enterprise_saml,stripe,embedding,parquet,prometheus,openidconnect,cloud,jemalloc,agent_worker_server,tantivy,license,http_trigger,zip,oauth2,kafka,sqs_trigger,nats,otel,dind,postgres_trigger,mqtt_trigger,gcp_trigger,websocket,smtp,static_frontend,all_languages + features=enterprise,enterprise_saml,stripe,embedding,parquet,prometheus,openidconnect,cloud,jemalloc,agent_worker_server,tantivy,license,http_trigger,zip,oauth2,kafka,sqs_trigger,nats,otel,dind,postgres_trigger,mqtt_trigger,gcp_trigger,websocket,smtp,static_frontend,all_languages,deno_core tags: | ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}-ee:${{ env.DEV_SHA }} ${{ steps.meta-ee-public.outputs.tags }} @@ -315,7 +312,7 @@ jobs: needs: [run_integration_test, build] if: github.event_name != 'pull_request' && (github.ref == 'refs/heads/main' || - startsWith(github.ref, 'refs/tags/v')) && (github.event_name != 'workflow_dispatch') + startsWith(github.ref, 'refs/tags/v')) && (github.event_name != 'workflow_dispatch') steps: - uses: actions/checkout@v4 with: @@ -355,7 +352,7 @@ jobs: verify_ee_image_vulnerabilities: runs-on: ubicloud needs: [tag_latest_ee] - if: startsWith(github.ref, 'refs/tags/v') && (github.event_name != 'workflow_dispatch') + if: startsWith(github.ref, 'refs/tags/v') && (github.event_name != 'workflow_dispatch') steps: - name: Checkout code uses: actions/checkout@v4 @@ -397,8 +394,7 @@ jobs: build_ee_nsjail: needs: [build_ee] runs-on: ubicloud - if: - (github.event_name != 'pull_request') && ((github.event_name != 'workflow_dispatch') || (github.event.inputs.ee || github.event.inputs.nsjail)) + if: (github.event_name != 'pull_request') && ((github.event_name != 'workflow_dispatch') || (github.event.inputs.ee || github.event.inputs.nsjail)) steps: - uses: actions/checkout@v4 @@ -437,7 +433,7 @@ jobs: run: | sed -i 's|FROM ghcr.io/windmill-labs/windmill-ee:dev|FROM ghcr.io/${{ env.IMAGE_NAME }}-ee:${{ env.DEV_SHA }}|' ./docker/DockerfileNsjail cat ./docker/DockerfileNsjail | grep "FROM" - + - name: Build and push publicly ee uses: depot/build-push-action@v1 with: @@ -451,12 +447,10 @@ jobs: ${{ steps.meta-ee-public.outputs.labels }} org.opencontainers.image.licenses=Windmill-Enterprise-License - publish_ecr_s3: needs: [build_ee_nsjail] runs-on: ubicloud-standard-2-arm - if: - (github.event_name != 'pull_request') && (github.event_name != + if: (github.event_name != 'pull_request') && (github.event_name != 'workflow_dispatch') env: AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} diff --git a/backend/.sqlx/query-264da6a89d005aebf4d5cd5f05e70fcffccd5fae8e2e352de3e1eb104e7fc3a6.json b/backend/.sqlx/query-264da6a89d005aebf4d5cd5f05e70fcffccd5fae8e2e352de3e1eb104e7fc3a6.json new file mode 100644 index 0000000000..f43524a12a --- /dev/null +++ b/backend/.sqlx/query-264da6a89d005aebf4d5cd5f05e70fcffccd5fae8e2e352de3e1eb104e7fc3a6.json @@ -0,0 +1,23 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT jsonb_build_object(\n 'kind', jb.kind,\n 'script_path', jb.runnable_path,\n 'latest_schema', COALESCE(\n (SELECT DISTINCT ON (s.path) s.schema FROM script s WHERE s.path = jb.runnable_path AND jb.kind = 'script' ORDER BY s.path, s.created_at DESC),\n (SELECT flow_version.schema FROM flow LEFT JOIN flow_version ON flow_version.id = flow.versions[array_upper(flow.versions, 1)] WHERE flow.path = jb.runnable_path AND jb.kind = 'flow')\n ),\n 'schemas', ARRAY(\n SELECT jsonb_build_object(\n 'script_hash', LPAD(TO_HEX(COALESCE(s.hash, f.id)), 16, '0'),\n 'job_ids', ARRAY_AGG(DISTINCT j.id),\n 'schema', (ARRAY_AGG(COALESCE(s.schema, f.schema)))[1]\n ) FROM v2_job j\n LEFT JOIN script s ON s.hash = j.runnable_id AND j.kind = 'script'\n LEFT JOIN flow_version f ON f.id = j.runnable_id AND j.kind = 'flow'\n WHERE j.id = ANY(ARRAY_AGG(jb.id))\n GROUP BY COALESCE(s.hash, f.id)\n )\n ) FROM v2_job jb\n WHERE (jb.kind = 'flow' OR jb.kind = 'script')\n AND jb.workspace_id = $1 AND jb.id = ANY($2)\n GROUP BY jb.kind, jb.runnable_path", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "jsonb_build_object", + "type_info": "Jsonb" + } + ], + "parameters": { + "Left": [ + "Text", + "UuidArray" + ] + }, + "nullable": [ + null + ] + }, + "hash": "264da6a89d005aebf4d5cd5f05e70fcffccd5fae8e2e352de3e1eb104e7fc3a6" +} diff --git a/backend/windmill-api/src/jobs.rs b/backend/windmill-api/src/jobs.rs index 1e5758d646..0948e44497 100644 --- a/backend/windmill-api/src/jobs.rs +++ b/backend/windmill-api/src/jobs.rs @@ -681,7 +681,7 @@ async fn list_selected_job_groups( SELECT jsonb_build_object( 'script_hash', LPAD(TO_HEX(COALESCE(s.hash, f.id)), 16, '0'), 'job_ids', ARRAY_AGG(DISTINCT j.id), - 'schema', ANY_VALUE(COALESCE(s.schema, f.schema)) + 'schema', (ARRAY_AGG(COALESCE(s.schema, f.schema)))[1] ) FROM v2_job j LEFT JOIN script s ON s.hash = j.runnable_id AND j.kind = 'script' LEFT JOIN flow_version f ON f.id = j.runnable_id AND j.kind = 'flow' @@ -3441,7 +3441,11 @@ async fn batch_rerun_handle_job( } InputTransform::Javascript { expr } => { #[cfg(not(feature = "deno_core"))] - tracing::error!("deno_core feature is not activated, cannot evaluate: {expr}"); + Err(error::Error::ExecutionErr( + format!("deno_core feature is not activated, cannot evaluate: {expr}") + .to_string(), + ))?; + #[cfg(feature = "deno_core")] args.insert( property_name.clone(), From 2655da07965e1a0627ad0eb53760e3708dd34088 Mon Sep 17 00:00:00 2001 From: dieriba Date: Thu, 17 Apr 2025 15:12:34 +0200 Subject: [PATCH 233/739] add old row (#5633) --- .../src/postgres_triggers/mapper.rs | 6 +- .../src/postgres_triggers/relation.rs | 2 +- .../src/postgres_triggers/trigger.rs | 90 ++++++++++++++----- frontend/src/lib/script_helpers.ts | 8 +- 4 files changed, 75 insertions(+), 31 deletions(-) diff --git a/backend/windmill-api/src/postgres_triggers/mapper.rs b/backend/windmill-api/src/postgres_triggers/mapper.rs index 817a2e8cf6..bbc7b9c011 100644 --- a/backend/windmill-api/src/postgres_triggers/mapper.rs +++ b/backend/windmill-api/src/postgres_triggers/mapper.rs @@ -124,11 +124,13 @@ export async function main( transaction_type: "insert" | "update" | "delete", schema_name: string, table_name: string, - row: {} + row: {}, + old_row?: {} ) {{ }} "#, - struct_definition + &struct_definition, + &struct_definition ) } } diff --git a/backend/windmill-api/src/postgres_triggers/relation.rs b/backend/windmill-api/src/postgres_triggers/relation.rs index f893f0ed5b..f313efb893 100644 --- a/backend/windmill-api/src/postgres_triggers/relation.rs +++ b/backend/windmill-api/src/postgres_triggers/relation.rs @@ -47,7 +47,7 @@ impl RelationConverter { .ok_or(RelationConversionError::FailToFindMatchingTable) } - pub fn body_to_json( + pub fn row_to_json( &self, to_decode: (Oid, Vec), ) -> Result, RelationConversionError> { diff --git a/backend/windmill-api/src/postgres_triggers/trigger.rs b/backend/windmill-api/src/postgres_triggers/trigger.rs index 2ba161b268..746dca99eb 100644 --- a/backend/windmill-api/src/postgres_triggers/trigger.rs +++ b/backend/windmill-api/src/postgres_triggers/trigger.rs @@ -650,37 +650,79 @@ async fn listen_to_transactions( None } Insert(insert) => { - Some((insert.o_id, relations.body_to_json((insert.o_id, insert.tuple)), "insert")) + Some((insert.o_id, Ok(None), relations.row_to_json((insert.o_id, insert.tuple)), "insert")) } Update(update) => { - Some((update.o_id, relations.body_to_json((update.o_id, update.new_tuple)), "update")) + let old_row = update.old_tuple.map(|old_tuple| relations.row_to_json((update.o_id, old_tuple))).transpose(); + let row = relations.row_to_json((update.o_id, update.new_tuple)); + Some((update.o_id, old_row, row, "update")) } Delete(delete) => { - let body = delete.old_tuple.unwrap_or_else(|| delete.key_tuple.unwrap()); - Some((delete.o_id, relations.body_to_json((delete.o_id, body)), "delete")) + let row = delete.old_tuple.unwrap_or_else(|| delete.key_tuple.unwrap()); + Some((delete.o_id, Ok(None), relations.row_to_json((delete.o_id, row)), "delete")) } }; - if let Some((o_id, Ok(body), transaction_type)) = json { - let relation = match relations.get_relation(o_id) { - Ok(relation) => relation, - Err(err) => { - tracing::error!("Postgres trigger named: {}, error: {}", pg.get_path(), err.to_string()); - continue; + match json { + Some((o_id, Ok(old_row), Ok(row), transaction_type)) => { + let relation = match relations.get_relation(o_id) { + Ok(relation) => relation, + Err(err) => { + tracing::error!("Postgres trigger named: {}, error: {}", pg.get_path(), err.to_string()); + continue; + } + }; + let database_info = HashMap::from([ + ("schema_name".to_string(), to_raw_value(&relation.namespace)), + ("table_name".to_string(), to_raw_value(&relation.name)), + ("transaction_type".to_string(), to_raw_value(&transaction_type)), + ("old_row".to_string(), to_raw_value(&old_row)), + ("row".to_string(), to_raw_value(&row)), + ]); + let extra = Some(HashMap::from([( + "wm_trigger".to_string(), + to_raw_value(&serde_json::json!({"kind": "postgres", })), + )])); + + + let _ = pg.handle(&db, Some(database_info), extra).await; + } + Some((o_id, old_row, row, transaction_type)) => { + let relation = match relations.get_relation(o_id) { + Ok(relation) => relation, + Err(err) => { + tracing::error!("Postgres trigger named: {}, error: {}", pg.get_path(), err.to_string()); + continue; + } + }; + + if let Err(err) = old_row { + tracing::error!( + transaction_type = ?transaction_type, + schema = %relation.namespace, + table = %relation.name, + error = %err, + "Failed to decode OLD row for {} transaction on {}.{}", + transaction_type, + relation.namespace, + relation.name, + ); } - }; - let database_info = HashMap::from([ - ("schema_name".to_string(), to_raw_value(&relation.namespace)), - ("table_name".to_string(), to_raw_value(&relation.name)), - ("transaction_type".to_string(), to_raw_value(&transaction_type)), - ("row".to_string(), to_raw_value(&body)), - ]); - let extra = Some(HashMap::from([( - "wm_trigger".to_string(), - to_raw_value(&serde_json::json!({"kind": "postgres", })), - )])); - - - let _ = pg.handle(&db, Some(database_info), extra).await; + + if let Err(err) = row { + tracing::error!( + transaction_type = ?transaction_type, + schema = %relation.namespace, + table = %relation.name, + error = %err, + "Failed to decode NEW row for {} transaction on {}.{}", + transaction_type, + relation.namespace, + relation.name, + ); + } + + } + _ => {} } } diff --git a/frontend/src/lib/script_helpers.ts b/frontend/src/lib/script_helpers.ts index a32f31e5ee..9e90ebe74c 100644 --- a/frontend/src/lib/script_helpers.ts +++ b/frontend/src/lib/script_helpers.ts @@ -634,7 +634,7 @@ export const TS_PREPROCESSOR_SCRIPT_INTRO = `/** * The preprocessor receives trigger metadata (\`wm_trigger\`) along with the main trigger arguments. * The structure of \`wm_trigger\` and the main trigger arguments are specific to each trigger type: * - Webhook/HTTP: \`(wm_trigger: { kind: 'http' | 'webhook', http?: { ... } }, body_key_1: any, body_key_2: any, ...)\` - * - Postgres: \`(wm_trigger: { kind: 'postgres' }, transaction_type: string, schema_name: string, table_name: string, row: any)\` + * - Postgres: \`(wm_trigger: { kind: 'postgres' }, transaction_type: string, schema_name: string, table_name: string, old_row?: any, row: any)\` * - WebSocket/Kafka/NATS/SQS: \`(wm_trigger: { kind: 'websocket' | 'kafka' | 'nats' | 'sqs', [kind]: { ... } }, msg: string)\` * - MQTT: \`(wm_trigger: { kind: 'mqtt', [kind]: { ... } }, payload: Array)\` * - GCP: \`(wm_trigger: { kind: 'gcp', [kind]: { ... } }, payload: string)\` @@ -656,7 +656,7 @@ export const TS_PREPROCESSOR_FLOW_INTRO = `/** * The preprocessor receives trigger metadata (\`wm_trigger\`) along with the main trigger arguments. * The structure of \`wm_trigger\` and the main trigger arguments are specific to each trigger type: * - Webhook/HTTP: \`(wm_trigger: { kind: 'http' | 'webhook', http?: { ... } }, body_key_1: any, body_key_2: any, ...)\` - * - Postgres: \`(wm_trigger: { kind: 'postgres' }, transaction_type: string, schema_name: string, table_name: string, row: any)\` + * - Postgres: \`(wm_trigger: { kind: 'postgres' }, transaction_type: string, schema_name: string, table_name: string, old_row?: any, row: any)\` * - WebSocket/Kafka/NATS/SQS: \`(wm_trigger: { kind: 'websocket' | 'kafka' | 'nats' | 'sqs', [kind]: { ... } }, msg: string)\` * - MQTT: \`(wm_trigger: { kind: 'mqtt', [kind]: { ... } }, payload: Array)\` * - GCP: \`(wm_trigger: { kind: 'gcp', [kind]: { ... } }, payload: string)\`* @@ -781,7 +781,7 @@ export const PYTHON_PREPROCESSOR_SCRIPT_INTRO = `# Trigger preprocessor # The preprocessor receives trigger metadata (\`wm_trigger\`) along with the main trigger arguments. # The structure of \`wm_trigger\` and the main trigger arguments are specific to each trigger type: # - Webhook/HTTP: \`(wm_trigger: { kind: 'http' | 'webhook', http?: { ... } }, body_key_1: any, body_key_2: any, ...)\` -# - Postgres: \`(wm_trigger: { kind: 'postgres' }, transaction_type: string, schema_name: string, table_name: string, row: any)\` +# - Postgres: \`(wm_trigger: { kind: 'postgres' }, transaction_type: string, schema_name: string, table_name: string, old_row?: any, row: any)\` # - WebSocket/Kafka/NATS/SQS: \`(wm_trigger: { kind: 'websocket' | 'kafka' | 'nats' | 'sqs', [kind]: { ... } }, msg: string)\` # - MQTT: \`(wm_trigger: { kind: 'mqtt', [kind]: { ... } }, payload: Array)\` # - GCP: \`(wm_trigger: { kind: 'gcp', [kind]: { ... } }, payload: string)\` @@ -801,7 +801,7 @@ export const PYTHON_PREPROCESSOR_FLOW_INTRO = `# Trigger preprocessor # The preprocessor receives the same data the flow would if no preprocessor was used, # plus trigger metadata in the \`wm_trigger\` object: # - Webhook/HTTP: \`(wm_trigger: { kind: 'http' | 'webhook', http?: { ... } }, body_key_1: any, body_key_2: any, ...)\` -# - Postgres: \`(wm_trigger: { kind: 'postgres' }, transaction_type: string, schema_name: string, table_name: string, row: any)\` +# - Postgres: \`(wm_trigger: { kind: 'postgres' }, transaction_type: string, schema_name: string, table_name: string, old_row?:any, row: any)\` # - WebSocket/Kafka/NATS/SQS: \`(wm_trigger: { kind: 'websocket' | 'kafka' | 'nats' | 'sqs', [kind]: { ... } }, msg: string)\` # - MQTT: \`(wm_trigger: { kind: 'mqtt', [kind]: { ... } }, payload: Array)\` # - GCP: \`(wm_trigger: { kind: 'gcp', [kind]: { ... } }, payload: string)\` From 34b307b2be1f6cf92a81694325f4c333bdd7b055 Mon Sep 17 00:00:00 2001 From: dieriba Date: Thu, 17 Apr 2025 15:36:17 +0200 Subject: [PATCH 234/739] feat: oidc support for sqs trigger (#5614) * feat: oidc auth with sqs * rafctor * update: add id token struct * update has_expired function * fix duration * fix typo * Update backend/windmill-common/src/auth.rs Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com> * Update backend/windmill-common/src/auth.rs Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> * update ref * update sqlx * update resource type * update repo ref * Update settings.json --------- Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com> Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> --- ...b65cdcd277257192ee0a6d18a00f41bce49d4.json | 22 --- ...543252891c53351bdc98da66cc30ffc895866.json | 22 --- ...4cdb6eae2e71e56bc8e5215559af967c81bd8.json | 79 ---------- ...4809e7b7f2c1b0d53b10da3b5578d337e28ec.json | 14 ++ ...0d206b722ec4192368599c3a5027f50a89c80.json | 14 -- ...4844b4c1a38701190795a801fa43c74a0beeb.json | 22 --- ...ff808ba646f4f99d0c8837097e747b481f03a.json | 22 --- ...deb0ee6b62cf1d8ae1a02b28c23255d377b3d.json | 22 --- ...f1bfbe4e2db85da9a478a07460733999e9beb.json | 20 --- ...8c456a3c165f7f2a107cf7fa6a4cdd30d55c0.json | 28 ---- ...3b077c957da8455ea747b0680923d8282425b.json | 73 --------- ...75b58d65ca93d68b29124d04bd526239b9df2.json | 15 -- ...7e6b3cb1d60f15fed9a24e3f05b1bd60c0fc8.json | 73 --------- ...b1ec3fc844ed286ff563f0c9a5c4778cfb718.json | 67 --------- ...110efa11a7731ad0f0e5509f55efabdf535cd.json | 22 --- ...05d394a7cbcf0038c72a78add5c7b02ef5927.json | 2 +- ...32580dc7f7a9e5a67026f8c0b3077f371fc62.json | 22 --- backend/.vscode/settings.json | 2 +- backend/Cargo.lock | 1 + backend/Cargo.toml | 2 +- backend/ee-repo-ref.txt | 2 +- backend/windmill-api/Cargo.toml | 1 + backend/windmill-common/Cargo.toml | 1 + backend/windmill-common/src/auth.rs | 138 ++++++++++++++++++ .../sqs/SqsTriggerEditorConfigSection.svelte | 2 +- 25 files changed, 160 insertions(+), 528 deletions(-) delete mode 100644 backend/.sqlx/query-12828c9b2964f2b484a68de1e01b65cdcd277257192ee0a6d18a00f41bce49d4.json delete mode 100644 backend/.sqlx/query-280a361076d1c6317610765960f543252891c53351bdc98da66cc30ffc895866.json delete mode 100644 backend/.sqlx/query-3376b42d273c2499f3517c7754f4cdb6eae2e71e56bc8e5215559af967c81bd8.json create mode 100644 backend/.sqlx/query-65e6aa50db7cb878ce456d6665a4809e7b7f2c1b0d53b10da3b5578d337e28ec.json delete mode 100644 backend/.sqlx/query-85c116da4a43a5ade37bb9ab2660d206b722ec4192368599c3a5027f50a89c80.json delete mode 100644 backend/.sqlx/query-867d5c75ddc6c5d20136880c7294844b4c1a38701190795a801fa43c74a0beeb.json delete mode 100644 backend/.sqlx/query-99f74bf675120daf965e063e5eaff808ba646f4f99d0c8837097e747b481f03a.json delete mode 100644 backend/.sqlx/query-9d518842a9ad90ff9c28dc39690deb0ee6b62cf1d8ae1a02b28c23255d377b3d.json delete mode 100644 backend/.sqlx/query-a0c35cb515a842067b294343c90f1bfbe4e2db85da9a478a07460733999e9beb.json delete mode 100644 backend/.sqlx/query-a56eef5f5ecbe1a8d309ff65d9a8c456a3c165f7f2a107cf7fa6a4cdd30d55c0.json delete mode 100644 backend/.sqlx/query-b61a00e6a8ca0a1d24e64fdc9223b077c957da8455ea747b0680923d8282425b.json delete mode 100644 backend/.sqlx/query-bd5a0c06e2f2361c9fc670eb0b975b58d65ca93d68b29124d04bd526239b9df2.json delete mode 100644 backend/.sqlx/query-c4f382045e5c47986e02f1e57667e6b3cb1d60f15fed9a24e3f05b1bd60c0fc8.json delete mode 100644 backend/.sqlx/query-ccd4c7fe5fbdf1ab4bbbbd7d2a9b1ec3fc844ed286ff563f0c9a5c4778cfb718.json delete mode 100644 backend/.sqlx/query-cd5f02cf10cbf92dd1df53a54f2110efa11a7731ad0f0e5509f55efabdf535cd.json delete mode 100644 backend/.sqlx/query-ef6795d93423f98eea82eb18e6332580dc7f7a9e5a67026f8c0b3077f371fc62.json diff --git a/backend/.sqlx/query-12828c9b2964f2b484a68de1e01b65cdcd277257192ee0a6d18a00f41bce49d4.json b/backend/.sqlx/query-12828c9b2964f2b484a68de1e01b65cdcd277257192ee0a6d18a00f41bce49d4.json deleted file mode 100644 index 84c0804c95..0000000000 --- a/backend/.sqlx/query-12828c9b2964f2b484a68de1e01b65cdcd277257192ee0a6d18a00f41bce49d4.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT suspend > 0 AS \"r!\" FROM v2_job_queue WHERE id = $1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "r!", - "type_info": "Bool" - } - ], - "parameters": { - "Left": [ - "Uuid" - ] - }, - "nullable": [ - null - ] - }, - "hash": "12828c9b2964f2b484a68de1e01b65cdcd277257192ee0a6d18a00f41bce49d4" -} diff --git a/backend/.sqlx/query-280a361076d1c6317610765960f543252891c53351bdc98da66cc30ffc895866.json b/backend/.sqlx/query-280a361076d1c6317610765960f543252891c53351bdc98da66cc30ffc895866.json deleted file mode 100644 index e9705c23a6..0000000000 --- a/backend/.sqlx/query-280a361076d1c6317610765960f543252891c53351bdc98da66cc30ffc895866.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT script_path FROM v2_as_completed_job WHERE id = $1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "script_path", - "type_info": "Varchar" - } - ], - "parameters": { - "Left": [ - "Uuid" - ] - }, - "nullable": [ - true - ] - }, - "hash": "280a361076d1c6317610765960f543252891c53351bdc98da66cc30ffc895866" -} diff --git a/backend/.sqlx/query-3376b42d273c2499f3517c7754f4cdb6eae2e71e56bc8e5215559af967c81bd8.json b/backend/.sqlx/query-3376b42d273c2499f3517c7754f4cdb6eae2e71e56bc8e5215559af967c81bd8.json deleted file mode 100644 index 7229d4053f..0000000000 --- a/backend/.sqlx/query-3376b42d273c2499f3517c7754f4cdb6eae2e71e56bc8e5215559af967c81bd8.json +++ /dev/null @@ -1,79 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT \n j.id,\n j.kind AS \"kind: _\",\n COALESCE(s.path, f.path) AS \"script_path!\",\n COALESCE(s.hash, f.id) AS \"script_hash!: _\",\n COALESCE(jc.started_at, jq.scheduled_for, make_date(1970, 1, 1)) AS \"scheduled_for!: _\",\n args AS input\n FROM v2_job j\n LEFT JOIN script s ON j.runnable_id = s.hash AND j.kind = 'script'\n LEFT JOIN flow_version f ON j.runnable_id = f.id AND j.runnable_path = f.path AND j.kind = 'flow'\n LEFT JOIN v2_job_completed jc ON jc.id = j.id\n LEFT JOIN v2_job_queue jq ON jq.id = j.id\n WHERE j.id = ANY($1)\n AND j.workspace_id = $2\n AND COALESCE(s.hash, f.id) IS NOT NULL\n AND COALESCE(s.path, f.path) IS NOT NULL", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Uuid" - }, - { - "ordinal": 1, - "name": "kind: _", - "type_info": { - "Custom": { - "name": "job_kind", - "kind": { - "Enum": [ - "script", - "preview", - "flow", - "dependencies", - "flowpreview", - "script_hub", - "identity", - "flowdependencies", - "http", - "graphql", - "postgresql", - "noop", - "appdependencies", - "deploymentcallback", - "singlescriptflow", - "flowscript", - "flownode", - "appscript" - ] - } - } - } - }, - { - "ordinal": 2, - "name": "script_path!", - "type_info": "Varchar" - }, - { - "ordinal": 3, - "name": "script_hash!: _", - "type_info": "Int8" - }, - { - "ordinal": 4, - "name": "scheduled_for!: _", - "type_info": "Timestamptz" - }, - { - "ordinal": 5, - "name": "input", - "type_info": "Jsonb" - } - ], - "parameters": { - "Left": [ - "UuidArray", - "Text" - ] - }, - "nullable": [ - false, - false, - null, - null, - null, - true - ] - }, - "hash": "3376b42d273c2499f3517c7754f4cdb6eae2e71e56bc8e5215559af967c81bd8" -} diff --git a/backend/.sqlx/query-65e6aa50db7cb878ce456d6665a4809e7b7f2c1b0d53b10da3b5578d337e28ec.json b/backend/.sqlx/query-65e6aa50db7cb878ce456d6665a4809e7b7f2c1b0d53b10da3b5578d337e28ec.json new file mode 100644 index 0000000000..7a7b066e97 --- /dev/null +++ b/backend/.sqlx/query-65e6aa50db7cb878ce456d6665a4809e7b7f2c1b0d53b10da3b5578d337e28ec.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "\n INSERT INTO global_settings (name, value)\n VALUES ('rsa_keys', $1)\n ON CONFLICT (name) DO UPDATE\n SET value = EXCLUDED.value\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Jsonb" + ] + }, + "nullable": [] + }, + "hash": "65e6aa50db7cb878ce456d6665a4809e7b7f2c1b0d53b10da3b5578d337e28ec" +} diff --git a/backend/.sqlx/query-85c116da4a43a5ade37bb9ab2660d206b722ec4192368599c3a5027f50a89c80.json b/backend/.sqlx/query-85c116da4a43a5ade37bb9ab2660d206b722ec4192368599c3a5027f50a89c80.json deleted file mode 100644 index a54cdf49ab..0000000000 --- a/backend/.sqlx/query-85c116da4a43a5ade37bb9ab2660d206b722ec4192368599c3a5027f50a89c80.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO global_settings (name, value) VALUES ('rsa_keys', $1)", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Jsonb" - ] - }, - "nullable": [] - }, - "hash": "85c116da4a43a5ade37bb9ab2660d206b722ec4192368599c3a5027f50a89c80" -} diff --git a/backend/.sqlx/query-867d5c75ddc6c5d20136880c7294844b4c1a38701190795a801fa43c74a0beeb.json b/backend/.sqlx/query-867d5c75ddc6c5d20136880c7294844b4c1a38701190795a801fa43c74a0beeb.json deleted file mode 100644 index 9232baf39c..0000000000 --- a/backend/.sqlx/query-867d5c75ddc6c5d20136880c7294844b4c1a38701190795a801fa43c74a0beeb.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT workflow_as_code_status FROM v2_job_completed WHERE id = $1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "workflow_as_code_status", - "type_info": "Jsonb" - } - ], - "parameters": { - "Left": [ - "Uuid" - ] - }, - "nullable": [ - true - ] - }, - "hash": "867d5c75ddc6c5d20136880c7294844b4c1a38701190795a801fa43c74a0beeb" -} diff --git a/backend/.sqlx/query-99f74bf675120daf965e063e5eaff808ba646f4f99d0c8837097e747b481f03a.json b/backend/.sqlx/query-99f74bf675120daf965e063e5eaff808ba646f4f99d0c8837097e747b481f03a.json deleted file mode 100644 index 68982a2183..0000000000 --- a/backend/.sqlx/query-99f74bf675120daf965e063e5eaff808ba646f4f99d0c8837097e747b481f03a.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT id FROM v2_job WHERE parent_job = $1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Uuid" - } - ], - "parameters": { - "Left": [ - "Uuid" - ] - }, - "nullable": [ - false - ] - }, - "hash": "99f74bf675120daf965e063e5eaff808ba646f4f99d0c8837097e747b481f03a" -} diff --git a/backend/.sqlx/query-9d518842a9ad90ff9c28dc39690deb0ee6b62cf1d8ae1a02b28c23255d377b3d.json b/backend/.sqlx/query-9d518842a9ad90ff9c28dc39690deb0ee6b62cf1d8ae1a02b28c23255d377b3d.json deleted file mode 100644 index 79bd8d0666..0000000000 --- a/backend/.sqlx/query-9d518842a9ad90ff9c28dc39690deb0ee6b62cf1d8ae1a02b28c23255d377b3d.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT labels FROM v2_job WHERE id = $1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "labels", - "type_info": "TextArray" - } - ], - "parameters": { - "Left": [ - "Uuid" - ] - }, - "nullable": [ - true - ] - }, - "hash": "9d518842a9ad90ff9c28dc39690deb0ee6b62cf1d8ae1a02b28c23255d377b3d" -} diff --git a/backend/.sqlx/query-a0c35cb515a842067b294343c90f1bfbe4e2db85da9a478a07460733999e9beb.json b/backend/.sqlx/query-a0c35cb515a842067b294343c90f1bfbe4e2db85da9a478a07460733999e9beb.json deleted file mode 100644 index 298a66c89c..0000000000 --- a/backend/.sqlx/query-a0c35cb515a842067b294343c90f1bfbe4e2db85da9a478a07460733999e9beb.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT count(*) AS \"count!\" FROM resume_job", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "count!", - "type_info": "Int8" - } - ], - "parameters": { - "Left": [] - }, - "nullable": [ - null - ] - }, - "hash": "a0c35cb515a842067b294343c90f1bfbe4e2db85da9a478a07460733999e9beb" -} diff --git a/backend/.sqlx/query-a56eef5f5ecbe1a8d309ff65d9a8c456a3c165f7f2a107cf7fa6a4cdd30d55c0.json b/backend/.sqlx/query-a56eef5f5ecbe1a8d309ff65d9a8c456a3c165f7f2a107cf7fa6a4cdd30d55c0.json deleted file mode 100644 index eb852c75ee..0000000000 --- a/backend/.sqlx/query-a56eef5f5ecbe1a8d309ff65d9a8c456a3c165f7f2a107cf7fa6a4cdd30d55c0.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT preprocessed, script_entrypoint_override FROM v2_job WHERE id = $1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "preprocessed", - "type_info": "Bool" - }, - { - "ordinal": 1, - "name": "script_entrypoint_override", - "type_info": "Varchar" - } - ], - "parameters": { - "Left": [ - "Uuid" - ] - }, - "nullable": [ - true, - true - ] - }, - "hash": "a56eef5f5ecbe1a8d309ff65d9a8c456a3c165f7f2a107cf7fa6a4cdd30d55c0" -} diff --git a/backend/.sqlx/query-b61a00e6a8ca0a1d24e64fdc9223b077c957da8455ea747b0680923d8282425b.json b/backend/.sqlx/query-b61a00e6a8ca0a1d24e64fdc9223b077c957da8455ea747b0680923d8282425b.json deleted file mode 100644 index 80f0549739..0000000000 --- a/backend/.sqlx/query-b61a00e6a8ca0a1d24e64fdc9223b077c957da8455ea747b0680923d8282425b.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT\n j.kind AS \"kind!: JobKind\",\n j.runnable_id AS \"script_hash: _\",\n j.runnable_path AS script_path,\n COUNT(*) AS \"count!\",\n ANY_VALUE(COALESCE(f.schema, s.schema)) AS schema\n FROM v2_job j\n LEFT JOIN script s ON s.hash = j.runnable_id AND j.kind = 'script'\n LEFT JOIN flow_version f ON f.id = j.runnable_id AND f.path = j.runnable_path AND j.kind = 'flow'\n WHERE COALESCE(s.hash, f.id) IS NOT NULL\n AND COALESCE(s.path, f.path) IS NOT NULL\n AND j.workspace_id = $1 AND j.id = ANY($2)\n GROUP BY j.runnable_id, j.runnable_path, j.kind", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "kind!: JobKind", - "type_info": { - "Custom": { - "name": "job_kind", - "kind": { - "Enum": [ - "script", - "preview", - "flow", - "dependencies", - "flowpreview", - "script_hub", - "identity", - "flowdependencies", - "http", - "graphql", - "postgresql", - "noop", - "appdependencies", - "deploymentcallback", - "singlescriptflow", - "flowscript", - "flownode", - "appscript" - ] - } - } - } - }, - { - "ordinal": 1, - "name": "script_hash: _", - "type_info": "Int8" - }, - { - "ordinal": 2, - "name": "script_path", - "type_info": "Varchar" - }, - { - "ordinal": 3, - "name": "count!", - "type_info": "Int8" - }, - { - "ordinal": 4, - "name": "schema", - "type_info": "Json" - } - ], - "parameters": { - "Left": [ - "Text", - "UuidArray" - ] - }, - "nullable": [ - false, - true, - true, - null, - null - ] - }, - "hash": "b61a00e6a8ca0a1d24e64fdc9223b077c957da8455ea747b0680923d8282425b" -} diff --git a/backend/.sqlx/query-bd5a0c06e2f2361c9fc670eb0b975b58d65ca93d68b29124d04bd526239b9df2.json b/backend/.sqlx/query-bd5a0c06e2f2361c9fc670eb0b975b58d65ca93d68b29124d04bd526239b9df2.json deleted file mode 100644 index 81a97984ee..0000000000 --- a/backend/.sqlx/query-bd5a0c06e2f2361c9fc670eb0b975b58d65ca93d68b29124d04bd526239b9df2.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE v2_job SET labels = $2 WHERE id = $1 AND $2::TEXT[] IS NOT NULL", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Uuid", - "TextArray" - ] - }, - "nullable": [] - }, - "hash": "bd5a0c06e2f2361c9fc670eb0b975b58d65ca93d68b29124d04bd526239b9df2" -} diff --git a/backend/.sqlx/query-c4f382045e5c47986e02f1e57667e6b3cb1d60f15fed9a24e3f05b1bd60c0fc8.json b/backend/.sqlx/query-c4f382045e5c47986e02f1e57667e6b3cb1d60f15fed9a24e3f05b1bd60c0fc8.json deleted file mode 100644 index e976cd0dd9..0000000000 --- a/backend/.sqlx/query-c4f382045e5c47986e02f1e57667e6b3cb1d60f15fed9a24e3f05b1bd60c0fc8.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT DISTINCT ON (j.runnable_path, j.kind) \n j.kind AS \"kind!: JobKind\",\n j.runnable_path AS script_path,\n NULL as \"script_hash: _\",\n -1::bigint as \"count!: _\",\n COALESCE(f.schema, s.schema) AS schema\n FROM v2_job j\n LEFT JOIN script s ON s.path = j.runnable_path AND j.kind = 'script'\n LEFT JOIN flow_version f ON f.path = j.runnable_path AND j.kind = 'flow'\n WHERE COALESCE(s.hash, f.id) IS NOT NULL\n AND j.workspace_id = $1 AND j.id = ANY($2)\n ORDER BY j.runnable_path, j.kind, COALESCE(f.created_at, s.created_at) DESC", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "kind!: JobKind", - "type_info": { - "Custom": { - "name": "job_kind", - "kind": { - "Enum": [ - "script", - "preview", - "flow", - "dependencies", - "flowpreview", - "script_hub", - "identity", - "flowdependencies", - "http", - "graphql", - "postgresql", - "noop", - "appdependencies", - "deploymentcallback", - "singlescriptflow", - "flowscript", - "flownode", - "appscript" - ] - } - } - } - }, - { - "ordinal": 1, - "name": "script_path", - "type_info": "Varchar" - }, - { - "ordinal": 2, - "name": "script_hash: _", - "type_info": "Text" - }, - { - "ordinal": 3, - "name": "count!: _", - "type_info": "Int8" - }, - { - "ordinal": 4, - "name": "schema", - "type_info": "Json" - } - ], - "parameters": { - "Left": [ - "Text", - "UuidArray" - ] - }, - "nullable": [ - false, - true, - null, - null, - null - ] - }, - "hash": "c4f382045e5c47986e02f1e57667e6b3cb1d60f15fed9a24e3f05b1bd60c0fc8" -} diff --git a/backend/.sqlx/query-ccd4c7fe5fbdf1ab4bbbbd7d2a9b1ec3fc844ed286ff563f0c9a5c4778cfb718.json b/backend/.sqlx/query-ccd4c7fe5fbdf1ab4bbbbd7d2a9b1ec3fc844ed286ff563f0c9a5c4778cfb718.json deleted file mode 100644 index a457b8b2bf..0000000000 --- a/backend/.sqlx/query-ccd4c7fe5fbdf1ab4bbbbd7d2a9b1ec3fc844ed286ff563f0c9a5c4778cfb718.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT j.kind AS \"kind: _\", COALESCE(s.path, f.path) AS \"script_path!\", COALESCE(s.hash, f.id) AS \"script_hash!: _\", args\n FROM v2_job j\n LEFT JOIN script s ON j.runnable_id = s.hash AND j.kind = 'script'\n LEFT JOIN flow_version f ON j.runnable_id = f.id AND j.runnable_path = f.path AND j.kind = 'flow'\n WHERE j.id = ANY($1)\n AND j.workspace_id = $2\n AND COALESCE(s.hash, f.id) IS NOT NULL\n AND COALESCE(s.path, f.path) IS NOT NULL", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "kind: _", - "type_info": { - "Custom": { - "name": "job_kind", - "kind": { - "Enum": [ - "script", - "preview", - "flow", - "dependencies", - "flowpreview", - "script_hub", - "identity", - "flowdependencies", - "http", - "graphql", - "postgresql", - "noop", - "appdependencies", - "deploymentcallback", - "singlescriptflow", - "flowscript", - "flownode", - "appscript" - ] - } - } - } - }, - { - "ordinal": 1, - "name": "script_path!", - "type_info": "Varchar" - }, - { - "ordinal": 2, - "name": "script_hash!: _", - "type_info": "Int8" - }, - { - "ordinal": 3, - "name": "args", - "type_info": "Jsonb" - } - ], - "parameters": { - "Left": [ - "UuidArray", - "Text" - ] - }, - "nullable": [ - false, - null, - null, - true - ] - }, - "hash": "ccd4c7fe5fbdf1ab4bbbbd7d2a9b1ec3fc844ed286ff563f0c9a5c4778cfb718" -} diff --git a/backend/.sqlx/query-cd5f02cf10cbf92dd1df53a54f2110efa11a7731ad0f0e5509f55efabdf535cd.json b/backend/.sqlx/query-cd5f02cf10cbf92dd1df53a54f2110efa11a7731ad0f0e5509f55efabdf535cd.json deleted file mode 100644 index f5eb13f1fd..0000000000 --- a/backend/.sqlx/query-cd5f02cf10cbf92dd1df53a54f2110efa11a7731ad0f0e5509f55efabdf535cd.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT preprocessed FROM v2_job WHERE id = $1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "preprocessed", - "type_info": "Bool" - } - ], - "parameters": { - "Left": [ - "Uuid" - ] - }, - "nullable": [ - true - ] - }, - "hash": "cd5f02cf10cbf92dd1df53a54f2110efa11a7731ad0f0e5509f55efabdf535cd" -} diff --git a/backend/.sqlx/query-ddf2eccb78a310ed00c7d8b9c3f05d394a7cbcf0038c72a78add5c7b02ef5927.json b/backend/.sqlx/query-ddf2eccb78a310ed00c7d8b9c3f05d394a7cbcf0038c72a78add5c7b02ef5927.json index c2dfed73a2..5bfff47576 100644 --- a/backend/.sqlx/query-ddf2eccb78a310ed00c7d8b9c3f05d394a7cbcf0038c72a78add5c7b02ef5927.json +++ b/backend/.sqlx/query-ddf2eccb78a310ed00c7d8b9c3f05d394a7cbcf0038c72a78add5c7b02ef5927.json @@ -15,7 +15,7 @@ ] }, "nullable": [ - null + true ] }, "hash": "ddf2eccb78a310ed00c7d8b9c3f05d394a7cbcf0038c72a78add5c7b02ef5927" diff --git a/backend/.sqlx/query-ef6795d93423f98eea82eb18e6332580dc7f7a9e5a67026f8c0b3077f371fc62.json b/backend/.sqlx/query-ef6795d93423f98eea82eb18e6332580dc7f7a9e5a67026f8c0b3077f371fc62.json deleted file mode 100644 index 08c5851944..0000000000 --- a/backend/.sqlx/query-ef6795d93423f98eea82eb18e6332580dc7f7a9e5a67026f8c0b3077f371fc62.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT hash FROM script WHERE path = $1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "hash", - "type_info": "Int8" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - false - ] - }, - "hash": "ef6795d93423f98eea82eb18e6332580dc7f7a9e5a67026f8c0b3077f371fc62" -} diff --git a/backend/.vscode/settings.json b/backend/.vscode/settings.json index ab8340f5c8..6ebd36cf07 100644 --- a/backend/.vscode/settings.json +++ b/backend/.vscode/settings.json @@ -11,5 +11,5 @@ "remote.autoForwardPorts": true, "conventionalCommits.scopes": [ "restructring triggers, decoding trigger message on work" - ], + ] } diff --git a/backend/Cargo.lock b/backend/Cargo.lock index c1a86edbb3..abcb8cf486 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -13970,6 +13970,7 @@ dependencies = [ "async_zip", "aws-config", "aws-sdk-sqs", + "aws-sdk-sts", "axum", "base32", "base64 0.22.1", diff --git a/backend/Cargo.toml b/backend/Cargo.toml index 16e919618a..73c7214f1d 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -73,7 +73,7 @@ websocket = ["windmill-api/websocket"] http_trigger = ["windmill-api/http_trigger"] postgres_trigger = ["windmill-api/postgres_trigger"] mqtt_trigger = ["windmill-api/mqtt_trigger"] -sqs_trigger = ["windmill-api/sqs_trigger"] +sqs_trigger = ["windmill-api/sqs_trigger", "windmill-common/aws_auth", "windmill-api/openidconnect"] gcp_trigger = ["windmill-api/gcp_trigger"] smtp = ["windmill-api/smtp", "windmill-common/smtp"] license = ["windmill-api/license"] diff --git a/backend/ee-repo-ref.txt b/backend/ee-repo-ref.txt index 91f337034b..d64168d898 100644 --- a/backend/ee-repo-ref.txt +++ b/backend/ee-repo-ref.txt @@ -1 +1 @@ -1475a504133766e005ec551004c2af2283663352 \ No newline at end of file +29a22d49c710bf21abcfe0e4c081e7eace4ac21e \ No newline at end of file diff --git a/backend/windmill-api/Cargo.toml b/backend/windmill-api/Cargo.toml index 0996b5956d..09f6dac049 100644 --- a/backend/windmill-api/Cargo.toml +++ b/backend/windmill-api/Cargo.toml @@ -133,6 +133,7 @@ rust-postgres-native-tls = { workspace = true, optional = true} rumqttc = { workspace = true, optional = true } aws-sdk-sqs = { workspace = true, optional = true } aws-config = { workspace = true, optional = true } +aws-sdk-sts = { workspace = true, optional = true } google-cloud-pubsub = { workspace = true, optional = true } google-cloud-googleapis = { workspace = true , optional = true } tonic = { workspace = true, optional = true } diff --git a/backend/windmill-common/Cargo.toml b/backend/windmill-common/Cargo.toml index 140d3e2b74..a0278a4c2e 100644 --- a/backend/windmill-common/Cargo.toml +++ b/backend/windmill-common/Cargo.toml @@ -13,6 +13,7 @@ prometheus = ["dep:prometheus"] loki = ["dep:tracing-loki"] benchmark = [] parquet = ["dep:object_store", "dep:aws-config", "dep:aws-sdk-sts"] +aws_auth = ["dep:aws-sdk-sts", "dep:aws-config"] otel = ["dep:opentelemetry-semantic-conventions", "dep:opentelemetry-otlp", "dep:opentelemetry_sdk", "dep:opentelemetry", "dep:tracing-opentelemetry", "dep:opentelemetry-appender-tracing", "dep:tonic"] smtp = ["dep:mail-send"] diff --git a/backend/windmill-common/src/auth.rs b/backend/windmill-common/src/auth.rs index 0266498773..cbbda52588 100644 --- a/backend/windmill-common/src/auth.rs +++ b/backend/windmill-common/src/auth.rs @@ -1,4 +1,5 @@ use anyhow::Context; +use chrono::{DateTime, Duration, Utc}; use serde::{Deserialize, Serialize}; use uuid::Uuid; @@ -10,6 +11,48 @@ use crate::{ DB, }; +#[derive(Debug)] +pub struct IdToken { + token: String, + expiration: DateTime, +} + +pub fn has_expired(expiration_time: DateTime, take: Option) -> bool { + let now = Utc::now(); + + let expiration = match take { + Some(duration) => expiration_time - duration, + None => expiration_time, + }; + + now > expiration +} + +impl From for String { + fn from(value: IdToken) -> Self { + value.token + } +} + +impl ToString for IdToken { + fn to_string(&self) -> String { + self.token.clone() + } +} + +impl IdToken { + pub fn new(token: String, expiration: DateTime) -> Self { + Self { token, expiration } + } + + pub fn token(&self) -> &str { + &self.token + } + pub fn expiration(&self) -> &DateTime { + &self.expiration + } +} + #[derive(Deserialize, Serialize)] pub struct JWTAuthClaims { pub email: String, @@ -267,3 +310,98 @@ pub async fn create_token_for_owner( Ok(format!("jwt_{}", token)) } + +#[cfg(feature = "aws_auth")] +pub mod aws { + + use crate::error::to_anyhow; + + use super::*; + use crate::utils::empty_string_as_none; + use aws_config::{BehaviorVersion, Region}; + use aws_sdk_sts::{ + config::Credentials as AwsCredentials, + operation::{ + assume_role_with_saml::AssumeRoleWithSamlOutput, + assume_role_with_web_identity::AssumeRoleWithWebIdentityOutput, + }, + types::Credentials, + Client, + }; + + pub const AWS_OIDC_AUDIENCE: &'static str = "sts.amazonaws.com"; + + pub trait GetAuthenticationOutput { + fn get_credentials(&self) -> Result<&Credentials>; + } + + impl GetAuthenticationOutput for AssumeRoleWithSamlOutput { + fn get_credentials(&self) -> Result<&Credentials> { + let credentials = self.credentials.as_ref().ok_or(Error::BadGateway( + "Error fetching credentials from AWS STS".to_string(), + ))?; + Ok(credentials) + } + } + + impl GetAuthenticationOutput for AssumeRoleWithWebIdentityOutput { + fn get_credentials(&self) -> Result<&Credentials> { + let credentials = self.credentials.as_ref().ok_or(Error::BadGateway( + "Error fetching credentials from AWS STS".to_string(), + ))?; + Ok(credentials) + } + } + + #[derive(Debug, Deserialize)] + pub struct CredentialsAuth { + #[serde(deserialize_with = "empty_string_as_none")] + pub region: Option, + pub access_key_id: String, + pub secret_access_key: String, + } + + #[derive(Clone, Debug, Deserialize)] + pub struct OidcAuth { + #[serde(deserialize_with = "empty_string_as_none")] + pub region: Option, + pub role_arn: String, + } + + #[derive(Debug, Deserialize)] + #[serde(untagged)] + pub enum AWSAuthConfig { + Credentials(CredentialsAuth), + Oidc(OidcAuth), + } + + pub async fn get_oidc_authentication_data( + oidc_auth: OidcAuth, + role_session_name: Option, + token: String, + ) -> Result { + let region = oidc_auth.region.unwrap_or_else(|| "us-east-1".to_string()); + + let credentials = AwsCredentials::new("", "", None, None, "UserInput"); + + let config = aws_config::defaults(BehaviorVersion::latest()) + .credentials_provider(credentials) + .region(Region::new(region.clone())) + .load() + .await; + + let assume_role_with_web_identity_fluent_builder = Client::new(&config) + .assume_role_with_web_identity() + .set_role_arn(Some(oidc_auth.role_arn)) + .set_role_session_name(role_session_name.map(|str| str.to_string())) + .set_web_identity_token(Some(token)); + + let resp = assume_role_with_web_identity_fluent_builder + .clone() + .send() + .await + .map_err(to_anyhow)?; + + Ok(resp) + } +} diff --git a/frontend/src/lib/components/triggers/sqs/SqsTriggerEditorConfigSection.svelte b/frontend/src/lib/components/triggers/sqs/SqsTriggerEditorConfigSection.svelte index 48f89730ab..80b6d4f513 100644 --- a/frontend/src/lib/components/triggers/sqs/SqsTriggerEditorConfigSection.svelte +++ b/frontend/src/lib/components/triggers/sqs/SqsTriggerEditorConfigSection.svelte @@ -64,7 +64,7 @@ required={true} />

- + {#if isValid} {/if} From 58fa4c80062a5704bbd13ddda1b2f00c7c9e40dd Mon Sep 17 00:00:00 2001 From: Diego Imbert <70353967+diegoimbert@users.noreply.github.com> Date: Thu, 17 Apr 2025 15:41:41 +0200 Subject: [PATCH 235/739] fix: improve flow editor step switch performance * replace on click wt on pointer down on flow node click * pointerdown on virtualitems * Load monaco async with a placeholder to avoid size flash * monaco placeholder for editor * less flashing * simulate first line bg * better match to monaco * more fine tune * fix for increased browser font sizes * flow nodes feel much better to click on * move setTimeout upwards * only load async in flow editor * load async monaco in app * lots of components dont respect the type and pass undefined * weird outline when opening and closing OutputPicker * fixed hover flow nodes * moved setTimeout upwards * hover color for virtual items * wrong Cargo.lock * disable interaction if not selectable * pixel perfect editor placeholder * fake monaco editor perfect in flow editor * fake monaco for app json editor * (temp) never load editor monaco * os dependant constants in monaco * Revert " (temp) never load editor monaco" This reverts commit c20fca134d9369032cd6375c514dcc4beabec97b. --------- Co-authored-by: Diego Imbert --- frontend/src/lib/components/Editor.svelte | 16 ++- .../components/FakeMonacoPlaceHolder.svelte | 112 ++++++++++++++++++ .../lib/components/InputTransformForm.svelte | 2 + frontend/src/lib/components/JsonEditor.svelte | 2 + .../src/lib/components/ResourcePicker.svelte | 2 +- .../src/lib/components/SimpleEditor.svelte | 38 ++++-- .../src/lib/components/TemplateEditor.svelte | 27 ++++- .../inputEditor/EvalV2InputEditor.svelte | 6 +- .../inputEditor/StaticInputEditor.svelte | 1 + .../flows/content/FlowModuleComponent.svelte | 3 +- .../flows/map/FlowConstantsItem.svelte | 5 +- .../flows/map/FlowModuleSchemaItem.svelte | 11 +- .../flows/map/FlowSettingsItem.svelte | 3 +- .../lib/components/flows/map/MapItem.svelte | 5 + .../components/flows/map/VirtualItem.svelte | 2 + .../flows/map/VirtualItemWrapper.svelte | 18 +-- .../flows/propPicker/OutputPicker.svelte | 1 + .../renderers/nodes/BranchAllStart.svelte | 7 +- .../renderers/nodes/BranchOneStart.svelte | 6 +- .../renderers/nodes/ForLoopEndNode.svelte | 4 +- .../renderers/nodes/ForLoopStartNode.svelte | 11 +- .../graph/renderers/nodes/InputNode.svelte | 7 +- .../graph/renderers/nodes/ModuleNode.svelte | 13 +- .../graph/renderers/nodes/NoBranchNode.svelte | 5 +- .../graph/renderers/nodes/ResultNode.svelte | 8 +- .../graph/renderers/nodes/SubflowBound.svelte | 5 +- .../graph/renderers/nodes/TriggersNode.svelte | 3 +- .../renderers/nodes/branchAllEndNode.svelte | 3 +- .../renderers/nodes/branchOneEndNode.svelte | 5 +- .../renderers/triggers/TriggersWrapper.svelte | 7 +- frontend/src/lib/components/graph/util.ts | 23 ++++ frontend/src/lib/utils.ts | 21 ++++ 32 files changed, 318 insertions(+), 64 deletions(-) create mode 100644 frontend/src/lib/components/FakeMonacoPlaceHolder.svelte diff --git a/frontend/src/lib/components/Editor.svelte b/frontend/src/lib/components/Editor.svelte index c03666b2fe..76c3e8071b 100644 --- a/frontend/src/lib/components/Editor.svelte +++ b/frontend/src/lib/components/Editor.svelte @@ -175,6 +175,7 @@ import GlobalReviewButtons from './copilot/chat/GlobalReviewButtons.svelte' import { writable } from 'svelte/store' import { formatResourceTypes } from './copilot/chat/core' + import FakeMonacoPlaceHolder from './FakeMonacoPlaceHolder.svelte' // import EditorTheme from './EditorTheme.svelte' let divEl: HTMLDivElement | null = null @@ -221,6 +222,7 @@ export let disabled: boolean = false export let lineNumbersMinChars = 3 export let isAiPanelOpen: boolean = false + export let loadAsync = false const rHash = randomHash() $: filePath = computePath(path) @@ -1374,9 +1376,14 @@ }) } - onMount(() => { + onMount(async () => { if (BROWSER) { - loadMonaco().then((x) => (disposeMethod = x)) + if (loadAsync) { + setTimeout(() => loadMonaco().then((x) => (disposeMethod = x)), 0) + } else { + let m = await loadMonaco() + disposeMethod = m + } } }) @@ -1408,6 +1415,11 @@ +{#if !editor} +
+ +
+{/if}
{#if $vimMode}
diff --git a/frontend/src/lib/components/FakeMonacoPlaceHolder.svelte b/frontend/src/lib/components/FakeMonacoPlaceHolder.svelte new file mode 100644 index 0000000000..315f4dcc3e --- /dev/null +++ b/frontend/src/lib/components/FakeMonacoPlaceHolder.svelte @@ -0,0 +1,112 @@ + + + + + + +
+
+
+ +
+
+
+ {#each lines as line, i} +
+ {line} +
+ {/each} +
+
+
+
+
+
diff --git a/frontend/src/lib/components/InputTransformForm.svelte b/frontend/src/lib/components/InputTransformForm.svelte index 67f88534c5..a12b4026a8 100644 --- a/frontend/src/lib/components/InputTransformForm.svelte +++ b/frontend/src/lib/components/InputTransformForm.svelte @@ -515,6 +515,7 @@ on:change={() => { dispatch('change', { argName, arg }) }} + loadAsync /> {/if}
@@ -583,6 +584,7 @@ focused = false }} autoHeight + loadAsync />
{#if !hideHelpButton} diff --git a/frontend/src/lib/components/JsonEditor.svelte b/frontend/src/lib/components/JsonEditor.svelte index 93481027e7..24b41f9e55 100644 --- a/frontend/src/lib/components/JsonEditor.svelte +++ b/frontend/src/lib/components/JsonEditor.svelte @@ -9,6 +9,7 @@ export let error = '' export let editor: SimpleEditor | undefined = undefined export let small = false + export let loadAsync = false $: tooBig = code && code?.length > 1000000 @@ -38,6 +39,7 @@
-
+
{#if collection?.length > 0} -
+
+ + +
+
+ + x + +
+
From 8f7854dc633d590aa5a718fd32d3f2b7b33b12a6 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Fri, 18 Apr 2025 15:48:33 +0200 Subject: [PATCH 241/739] update vite, rm circular deps --- frontend/package-lock.json | 127 ++++++++++++++++++++++--------------- frontend/package.json | 3 +- frontend/vite.config.js | 3 +- 3 files changed, 78 insertions(+), 55 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 01990d9d44..655a72a6be 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -133,8 +133,7 @@ "tailwindcss": "^3.4.1", "tslib": "^2.6.1", "typescript": "^5.5.0", - "vite": "^6.2.1", - "vite-plugin-circular-dependency": "^0.2.1", + "vite": "^6.3.2", "vite-plugin-mkcert": "^1.17.5", "yootils": "^0.3.1" }, @@ -1208,43 +1207,6 @@ "version": "0.0.1", "license": "SEE LICENSE IN LICENSE" }, - "node_modules/@rollup/pluginutils": { - "version": "5.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/pluginutils/node_modules/estree-walker": { - "version": "2.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/pluginutils/node_modules/picomatch": { - "version": "4.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.35.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.35.0.tgz", @@ -10197,6 +10159,48 @@ "dev": true, "license": "MIT" }, + "node_modules/tinyglobby": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz", + "integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==", + "dev": true, + "dependencies": { + "fdir": "^6.4.3", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", + "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", + "dev": true, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "dev": true, @@ -10505,13 +10509,17 @@ } }, "node_modules/vite": { - "version": "6.2.1", + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.2.tgz", + "integrity": "sha512-ZSvGOXKGceizRQIZSz7TGJ0pS3QLlVY/9hwxVh17W3re67je1RKYzFHivZ/t0tubU78Vkyb9WnHPENSBCzbckg==", "dev": true, - "license": "MIT", "dependencies": { "esbuild": "^0.25.0", + "fdir": "^6.4.3", + "picomatch": "^4.0.2", "postcss": "^8.5.3", - "rollup": "^4.30.1" + "rollup": "^4.34.9", + "tinyglobby": "^0.2.12" }, "bin": { "vite": "bin/vite.js" @@ -10574,15 +10582,6 @@ } } }, - "node_modules/vite-plugin-circular-dependency": { - "version": "0.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.0.2", - "chalk": "^4.1.2" - } - }, "node_modules/vite-plugin-mkcert": { "version": "1.17.7", "dev": true, @@ -10599,6 +10598,32 @@ "vite": ">=3" } }, + "node_modules/vite/node_modules/fdir": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", + "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", + "dev": true, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/vitefu": { "version": "1.0.6", "dev": true, diff --git a/frontend/package.json b/frontend/package.json index e192984785..ced0b2d46d 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -66,8 +66,7 @@ "tailwindcss": "^3.4.1", "tslib": "^2.6.1", "typescript": "^5.5.0", - "vite": "^6.2.1", - "vite-plugin-circular-dependency": "^0.2.1", + "vite": "^6.3.2", "vite-plugin-mkcert": "^1.17.5", "yootils": "^0.3.1" }, diff --git a/frontend/vite.config.js b/frontend/vite.config.js index 873a68c042..4c33d61234 100644 --- a/frontend/vite.config.js +++ b/frontend/vite.config.js @@ -1,7 +1,6 @@ import { sveltekit } from '@sveltejs/kit/vite' import { readFileSync } from 'fs' import { fileURLToPath } from 'url' -import circleDependency from 'vite-plugin-circular-dependency' // import mkcert from 'vite-plugin-mkcert' import importMetaUrlPlugin from '@windmill-labs/esbuild-import-meta-url-plugin' @@ -35,7 +34,7 @@ const config = { preview: { port: 3000 }, - plugins: [sveltekit(), circleDependency({ circleImportThrowErr: false })], + plugins: [sveltekit()], define: { __pkg__: version }, From ab3ff1d7015061b263152fd51e955df80552ba02 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Fri, 18 Apr 2025 19:04:02 +0200 Subject: [PATCH 242/739] fix run script preview for bundle scripts --- frontend/src/lib/components/ModulePreview.svelte | 2 +- frontend/src/lib/components/TestJobLoader.svelte | 3 ++- frontend/src/lib/scripts.ts | 8 +++++--- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/frontend/src/lib/components/ModulePreview.svelte b/frontend/src/lib/components/ModulePreview.svelte index 4d6c433bd8..2abcb938ee 100644 --- a/frontend/src/lib/components/ModulePreview.svelte +++ b/frontend/src/lib/components/ModulePreview.svelte @@ -70,7 +70,7 @@ args, $flowStore?.tag ?? (val.tag_override ? val.tag_override : script.tag), script.lock, - val.hash + val.hash ?? script.hash ) } else if (val.type == 'flow') { await testJobLoader?.abstractRun(() => diff --git a/frontend/src/lib/components/TestJobLoader.svelte b/frontend/src/lib/components/TestJobLoader.svelte index a7f911aff7..10b0fcfb7f 100644 --- a/frontend/src/lib/components/TestJobLoader.svelte +++ b/frontend/src/lib/components/TestJobLoader.svelte @@ -142,7 +142,8 @@ args, language: lang as Preview['language'], tag, - lock + lock, + script_hash: hash } }) ) diff --git a/frontend/src/lib/scripts.ts b/frontend/src/lib/scripts.ts index d5516a69bc..3d8299bf09 100644 --- a/frontend/src/lib/scripts.ts +++ b/frontend/src/lib/scripts.ts @@ -47,7 +47,7 @@ export function scriptLangToEditorLang( return 'nu' } else if (lang == 'java') { return 'java' - // for related places search: ADD_NEW_LANG + // for related places search: ADD_NEW_LANG } else if (lang == undefined) { return 'typescript' } else { @@ -130,7 +130,7 @@ const scriptLanguagesArray: [SupportedLanguage | 'docker' | 'bunnative', string] ['docker', 'Docker'], ['nu', 'Nu'], ['java', 'Java'] - // for related places search: ADD_NEW_LANG + // for related places search: ADD_NEW_LANG ] export function processLangs(selected: string | undefined, langs: string[]): string[] { if (selected === 'nativets') { @@ -140,7 +140,7 @@ export function processLangs(selected: string | undefined, langs: string[]): str //those languages are newer and may not be in the saved list let nl = ['bunnative', 'rust', 'ansible', 'csharp', 'nu', 'java'] - // for related places search: ADD_NEW_LANG + // for related places search: ADD_NEW_LANG nl.forEach((lang) => { if (!ls.includes(lang)) { ls.push(lang) @@ -162,6 +162,7 @@ export async function getScriptByPath(path: string): Promise<{ concurrency_time_window_s: number | undefined lock?: string created_at?: string + hash?: string }> { if (path.startsWith('hub/')) { const { content, language, schema, lockfile } = await ScriptService.getHubScriptByPath({ path }) @@ -190,6 +191,7 @@ export async function getScriptByPath(path: string): Promise<{ concurrent_limit: script.concurrent_limit, concurrency_time_window_s: script.concurrency_time_window_s, lock: script.lock, + hash: script.hash, created_at: script.created_at } } From 02a25ba62e2fdf55ac2a10e5e04b9d75ae2feb1a Mon Sep 17 00:00:00 2001 From: dieriba Date: Sat, 19 Apr 2025 00:51:42 +0200 Subject: [PATCH 243/739] rename zoom key for http auth (#5640) --- backend/windmill-api/src/http_trigger_auth.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/windmill-api/src/http_trigger_auth.rs b/backend/windmill-api/src/http_trigger_auth.rs index fd15927b69..b4fac32925 100644 --- a/backend/windmill-api/src/http_trigger_auth.rs +++ b/backend/windmill-api/src/http_trigger_auth.rs @@ -253,8 +253,8 @@ mod zoom { use super::*; #[derive(Debug, Deserialize)] - #[serde(rename_all = "snake_case")] struct ZoomPayload { + #[serde(rename = "plainToken")] plain_token: String, } From 64c72b6fce669e47f04dc620750840857cbe66cf Mon Sep 17 00:00:00 2001 From: Diego Imbert <70353967+diegoimbert@users.noreply.github.com> Date: Sat, 19 Apr 2025 11:00:39 +0200 Subject: [PATCH 244/739] fix: output picker output opening doesn't change id (#5641) --- .../src/lib/components/flows/propPicker/OutputPicker.svelte | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/frontend/src/lib/components/flows/propPicker/OutputPicker.svelte b/frontend/src/lib/components/flows/propPicker/OutputPicker.svelte index 968d124c00..d30a3cc87b 100644 --- a/frontend/src/lib/components/flows/propPicker/OutputPicker.svelte +++ b/frontend/src/lib/components/flows/propPicker/OutputPicker.svelte @@ -91,6 +91,10 @@ 'shadow-[inset_0_1px_5px_0_rgba(0,0,0,0.05)] rounded-b-sm', 'group' )} + on:pointerdown={(e) => { + e.preventDefault() + e.stopPropagation() + }} data-prop-picker title={`${isOpen ? 'Close' : 'Open'} step output`} > From 236762641f5a6f1089ac71a7b5ff116d4af88fdd Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Sat, 19 Apr 2025 11:06:30 +0200 Subject: [PATCH 245/739] chore(main): release 1.483.0 (#5632) * chore(main): release 1.483.0 * Apply automatic changes --------- Co-authored-by: rubenfiszel <275584+rubenfiszel@users.noreply.github.com> --- CHANGELOG.md | 16 +++ backend/Cargo.lock | 97 +++++++++++-------- backend/Cargo.toml | 4 +- backend/windmill-api/openapi.yaml | 2 +- benchmarks/lib.ts | 2 +- cli/main.ts | 2 +- frontend/package-lock.json | 4 +- frontend/package.json | 2 +- lsp/Pipfile | 4 +- openflow.openapi.yaml | 2 +- .../WindmillClient/WindmillClient.psd1 | 2 +- python-client/wmill/pyproject.toml | 2 +- python-client/wmill_pg/pyproject.toml | 2 +- typescript-client/jsr.json | 2 +- typescript-client/package.json | 2 +- version.txt | 2 +- 16 files changed, 91 insertions(+), 56 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 29ef5a0eb2..1ecce76eb4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,21 @@ # Changelog +## [1.483.0](https://github.com/windmill-labs/windmill/compare/v1.482.1...v1.483.0) (2025-04-19) + + +### Features + +* handle different aws auth resource type ([#5637](https://github.com/windmill-labs/windmill/issues/5637)) ([5b123b0](https://github.com/windmill-labs/windmill/commit/5b123b01a1318208450789b5bcade447a0b331c7)) +* oidc support for sqs trigger ([#5614](https://github.com/windmill-labs/windmill/issues/5614)) ([34b307b](https://github.com/windmill-labs/windmill/commit/34b307b2be1f6cf92a81694325f4c333bdd7b055)) + + +### Bug Fixes + +* fix click outside popover fullscreen ([#5631](https://github.com/windmill-labs/windmill/issues/5631)) ([0811457](https://github.com/windmill-labs/windmill/commit/081145726a5d4ab81510a7637126a036823a1565)) +* improve flow editor step switch performance ([58fa4c8](https://github.com/windmill-labs/windmill/commit/58fa4c80062a5704bbd13ddda1b2f00c7c9e40dd)) +* linter in early stop doesn't include flow_input ([#5638](https://github.com/windmill-labs/windmill/issues/5638)) ([6a9bdfd](https://github.com/windmill-labs/windmill/commit/6a9bdfd3bd52ff802b6a71c3ae9504bfe7d0421f)) +* output picker output opening doesn't change id ([#5641](https://github.com/windmill-labs/windmill/issues/5641)) ([64c72b6](https://github.com/windmill-labs/windmill/commit/64c72b6fce669e47f04dc620750840857cbe66cf)) + ## [1.482.1](https://github.com/windmill-labs/windmill/compare/v1.482.0...v1.482.1) (2025-04-16) diff --git a/backend/Cargo.lock b/backend/Cargo.lock index abcb8cf486..5849506c72 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -793,9 +793,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.28.0" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9f7720b74ed28ca77f90769a71fd8c637a0137f6fae4ae947e1050229cff57f" +checksum = "0ddeb19ee86cb16ecfc871e5b0660aff6285760957aaedda6284cf0e790d3769" dependencies = [ "bindgen 0.69.5", "cc", @@ -1342,6 +1342,24 @@ dependencies = [ "syn 2.0.100", ] +[[package]] +name = "bindgen" +version = "0.71.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f58bf3d7db68cfbac37cfc485a8d711e87e064c3d0fe0435b92f7a407f9d6b3" +dependencies = [ + "bitflags 2.9.0", + "cexpr", + "clang-sys", + "itertools 0.13.0", + "proc-macro2", + "quote", + "regex", + "rustc-hash 2.1.1", + "shlex", + "syn 2.0.100", +] + [[package]] name = "bit-set" version = "0.5.3" @@ -1581,9 +1599,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "4.0.2" +version = "4.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74fa05ad7d803d413eb8380983b092cbbaf9a85f151b871360e7b00cd7060b37" +checksum = "a334ef7c9e23abf0ce748e8cd309037da93e606ad52eb372e4ce327a0dcfbdfd" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -1975,9 +1993,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.36" +version = "4.5.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2df961d8c8a0d08aa9945718ccf584145eee3f3aa06cddbeac12933781102e04" +checksum = "eccb054f56cbd38340b380d4a8e69ef1f02f1af43db2f0cc817a4774d80ae071" dependencies = [ "clap_builder", "clap_derive", @@ -1985,9 +2003,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.36" +version = "4.5.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "132dbda40fb6753878316a489d5a1242a8ef2f0d9e47ba01c951ea8aa7d013a5" +checksum = "efd9466fac8543255d3b1fcad4762c5e116ffe808c8a3043d4263cd4fd4862a2" dependencies = [ "anstream", "anstyle", @@ -4052,9 +4070,9 @@ dependencies = [ [[package]] name = "der" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" dependencies = [ "const-oid", "der_derive", @@ -6842,10 +6860,11 @@ dependencies = [ [[package]] name = "libxml" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fe73cdec2bcb36d25a9fe3f607ffcd44bb8907ca0100c4098d1aa342d1e7bec" +checksum = "86119bbd85c39c7f890fe970a18f77e9a599467fa613d44929aea4acecb9a031" dependencies = [ + "bindgen 0.71.1", "libc", "pkg-config", "vcpkg", @@ -13912,7 +13931,7 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windmill" -version = "1.482.1" +version = "1.483.0" dependencies = [ "anyhow", "axum", @@ -13959,7 +13978,7 @@ dependencies = [ [[package]] name = "windmill-api" -version = "1.482.1" +version = "1.483.0" dependencies = [ "anyhow", "argon2", @@ -14067,7 +14086,7 @@ dependencies = [ [[package]] name = "windmill-api-client" -version = "1.482.1" +version = "1.483.0" dependencies = [ "base64 0.22.1", "chrono", @@ -14082,7 +14101,7 @@ dependencies = [ [[package]] name = "windmill-audit" -version = "1.482.1" +version = "1.483.0" dependencies = [ "chrono", "serde", @@ -14095,7 +14114,7 @@ dependencies = [ [[package]] name = "windmill-autoscaling" -version = "1.482.1" +version = "1.483.0" dependencies = [ "anyhow", "serde", @@ -14109,7 +14128,7 @@ dependencies = [ [[package]] name = "windmill-common" -version = "1.482.1" +version = "1.483.0" dependencies = [ "anyhow", "async-stream", @@ -14173,7 +14192,7 @@ dependencies = [ [[package]] name = "windmill-git-sync" -version = "1.482.1" +version = "1.483.0" dependencies = [ "regex", "serde", @@ -14187,7 +14206,7 @@ dependencies = [ [[package]] name = "windmill-indexer" -version = "1.482.1" +version = "1.483.0" dependencies = [ "anyhow", "bytes", @@ -14210,7 +14229,7 @@ dependencies = [ [[package]] name = "windmill-macros" -version = "1.482.1" +version = "1.483.0" dependencies = [ "itertools 0.14.0", "lazy_static", @@ -14222,7 +14241,7 @@ dependencies = [ [[package]] name = "windmill-parser" -version = "1.482.1" +version = "1.483.0" dependencies = [ "convert_case 0.6.0", "serde", @@ -14231,7 +14250,7 @@ dependencies = [ [[package]] name = "windmill-parser-bash" -version = "1.482.1" +version = "1.483.0" dependencies = [ "anyhow", "lazy_static", @@ -14243,7 +14262,7 @@ dependencies = [ [[package]] name = "windmill-parser-csharp" -version = "1.482.1" +version = "1.483.0" dependencies = [ "anyhow", "serde_json", @@ -14255,7 +14274,7 @@ dependencies = [ [[package]] name = "windmill-parser-go" -version = "1.482.1" +version = "1.483.0" dependencies = [ "anyhow", "gosyn", @@ -14267,7 +14286,7 @@ dependencies = [ [[package]] name = "windmill-parser-graphql" -version = "1.482.1" +version = "1.483.0" dependencies = [ "anyhow", "lazy_static", @@ -14279,7 +14298,7 @@ dependencies = [ [[package]] name = "windmill-parser-java" -version = "1.482.1" +version = "1.483.0" dependencies = [ "anyhow", "serde_json", @@ -14291,7 +14310,7 @@ dependencies = [ [[package]] name = "windmill-parser-nu" -version = "1.482.1" +version = "1.483.0" dependencies = [ "anyhow", "nu-parser", @@ -14302,7 +14321,7 @@ dependencies = [ [[package]] name = "windmill-parser-php" -version = "1.482.1" +version = "1.483.0" dependencies = [ "anyhow", "itertools 0.14.0", @@ -14313,7 +14332,7 @@ dependencies = [ [[package]] name = "windmill-parser-py" -version = "1.482.1" +version = "1.483.0" dependencies = [ "anyhow", "itertools 0.14.0", @@ -14324,7 +14343,7 @@ dependencies = [ [[package]] name = "windmill-parser-py-imports" -version = "1.482.1" +version = "1.483.0" dependencies = [ "anyhow", "async-recursion", @@ -14344,7 +14363,7 @@ dependencies = [ [[package]] name = "windmill-parser-rust" -version = "1.482.1" +version = "1.483.0" dependencies = [ "anyhow", "convert_case 0.6.0", @@ -14361,7 +14380,7 @@ dependencies = [ [[package]] name = "windmill-parser-sql" -version = "1.482.1" +version = "1.483.0" dependencies = [ "anyhow", "lazy_static", @@ -14373,7 +14392,7 @@ dependencies = [ [[package]] name = "windmill-parser-ts" -version = "1.482.1" +version = "1.483.0" dependencies = [ "anyhow", "lazy_static", @@ -14391,7 +14410,7 @@ dependencies = [ [[package]] name = "windmill-parser-wasm" -version = "1.482.1" +version = "1.483.0" dependencies = [ "anyhow", "getrandom 0.2.15", @@ -14415,7 +14434,7 @@ dependencies = [ [[package]] name = "windmill-parser-yaml" -version = "1.482.1" +version = "1.483.0" dependencies = [ "anyhow", "serde_json", @@ -14425,7 +14444,7 @@ dependencies = [ [[package]] name = "windmill-queue" -version = "1.482.1" +version = "1.483.0" dependencies = [ "anyhow", "async-recursion", @@ -14458,7 +14477,7 @@ dependencies = [ [[package]] name = "windmill-sql-datatype-parser-wasm" -version = "1.482.1" +version = "1.483.0" dependencies = [ "wasm-bindgen", "wasm-bindgen-test", @@ -14468,7 +14487,7 @@ dependencies = [ [[package]] name = "windmill-worker" -version = "1.482.1" +version = "1.483.0" dependencies = [ "anyhow", "async-recursion", diff --git a/backend/Cargo.toml b/backend/Cargo.toml index 73c7214f1d..d20ad2f7ed 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "windmill" -version = "1.482.1" +version = "1.483.0" authors.workspace = true edition.workspace = true @@ -32,7 +32,7 @@ members = [ ] [workspace.package] -version = "1.482.1" +version = "1.483.0" authors = ["Ruben Fiszel "] edition = "2021" diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index 3132b9346d..d868df1ec8 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.482.1 + version: 1.483.0 title: Windmill API contact: diff --git a/benchmarks/lib.ts b/benchmarks/lib.ts index 592cf6a006..1c3e98816e 100644 --- a/benchmarks/lib.ts +++ b/benchmarks/lib.ts @@ -2,7 +2,7 @@ import { sleep } from "https://deno.land/x/sleep@v1.2.1/mod.ts"; import * as windmill from "https://deno.land/x/windmill@v1.174.0/mod.ts"; import * as api from "https://deno.land/x/windmill@v1.174.0/windmill-api/index.ts"; -export const VERSION = "v1.482.1"; +export const VERSION = "v1.483.0"; export async function login(email: string, password: string): Promise { return await windmill.UserService.login({ diff --git a/cli/main.ts b/cli/main.ts index b6f88d5a9e..453121c095 100644 --- a/cli/main.ts +++ b/cli/main.ts @@ -63,7 +63,7 @@ export { // } // }); -export const VERSION = "1.482.1"; +export const VERSION = "1.483.0"; const command = new Command() .name("wmill") diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 655a72a6be..f55eaf68bf 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "windmill-components", - "version": "1.482.1", + "version": "1.483.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "windmill-components", - "version": "1.482.1", + "version": "1.483.0", "license": "AGPL-3.0", "dependencies": { "@aws-crypto/sha256-js": "^4.0.0", diff --git a/frontend/package.json b/frontend/package.json index ced0b2d46d..204e0bf652 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "windmill-components", - "version": "1.482.1", + "version": "1.483.0", "scripts": { "dev": "vite dev", "build": "vite build", diff --git a/lsp/Pipfile b/lsp/Pipfile index 2df2f0ee4e..26ff602d84 100644 --- a/lsp/Pipfile +++ b/lsp/Pipfile @@ -4,8 +4,8 @@ verify_ssl = true name = "pypi" [packages] -wmill = ">=1.482.1" -wmill_pg = ">=1.482.1" +wmill = ">=1.483.0" +wmill_pg = ">=1.483.0" sendgrid = "*" mysql-connector-python = "*" pymongo = "*" diff --git a/openflow.openapi.yaml b/openflow.openapi.yaml index ab00748a74..a52ce585b7 100644 --- a/openflow.openapi.yaml +++ b/openflow.openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.482.1 + version: 1.483.0 title: OpenFlow Spec contact: name: Ruben Fiszel diff --git a/powershell-client/WindmillClient/WindmillClient.psd1 b/powershell-client/WindmillClient/WindmillClient.psd1 index c6c64b9bb2..1b4e923310 100644 --- a/powershell-client/WindmillClient/WindmillClient.psd1 +++ b/powershell-client/WindmillClient/WindmillClient.psd1 @@ -12,7 +12,7 @@ RootModule = 'WindmillClient.psm1' # Version number of this module. - ModuleVersion = '1.482.1' + ModuleVersion = '1.483.0' # Supported PSEditions # CompatiblePSEditions = @() diff --git a/python-client/wmill/pyproject.toml b/python-client/wmill/pyproject.toml index b205777dbc..37b1a053ff 100644 --- a/python-client/wmill/pyproject.toml +++ b/python-client/wmill/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "wmill" -version = "1.482.1" +version = "1.483.0" description = "A client library for accessing Windmill server wrapping the Windmill client API" license = "Apache-2.0" homepage = "https://windmill.dev" diff --git a/python-client/wmill_pg/pyproject.toml b/python-client/wmill_pg/pyproject.toml index 3de477865b..5f295ab328 100644 --- a/python-client/wmill_pg/pyproject.toml +++ b/python-client/wmill_pg/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "wmill-pg" -version = "1.482.1" +version = "1.483.0" description = "An extension client for the wmill client library focused on pg" license = "Apache-2.0" homepage = "https://windmill.dev" diff --git a/typescript-client/jsr.json b/typescript-client/jsr.json index caa472284e..6776d9019e 100644 --- a/typescript-client/jsr.json +++ b/typescript-client/jsr.json @@ -1,6 +1,6 @@ { "name": "@windmill/windmill", - "version": "1.482.1", + "version": "1.483.0", "exports": "./src/index.ts", "publish": { "exclude": ["!src", "./s3Types.ts", "./client.ts"] diff --git a/typescript-client/package.json b/typescript-client/package.json index f3ce3e5b22..bd33cd481c 100644 --- a/typescript-client/package.json +++ b/typescript-client/package.json @@ -1,7 +1,7 @@ { "name": "windmill-client", "description": "Windmill SDK client for browsers and Node.js", - "version": "1.482.1", + "version": "1.483.0", "author": "Ruben Fiszel", "license": "Apache 2.0", "devDependencies": { diff --git a/version.txt b/version.txt index 1afef9f22a..12147b22f6 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.482.1 +1.483.0 From e5595e41b5c87704d814eff95bc00b82195728ba Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Sat, 19 Apr 2025 11:20:00 +0200 Subject: [PATCH 246/739] fix: pin libxml to 0.3.3 --- backend/Cargo.lock | 24 +++--------------------- backend/Cargo.toml | 1 + backend/windmill-api/Cargo.toml | 3 ++- 3 files changed, 6 insertions(+), 22 deletions(-) diff --git a/backend/Cargo.lock b/backend/Cargo.lock index 5849506c72..b3cd9500ff 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -1342,24 +1342,6 @@ dependencies = [ "syn 2.0.100", ] -[[package]] -name = "bindgen" -version = "0.71.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f58bf3d7db68cfbac37cfc485a8d711e87e064c3d0fe0435b92f7a407f9d6b3" -dependencies = [ - "bitflags 2.9.0", - "cexpr", - "clang-sys", - "itertools 0.13.0", - "proc-macro2", - "quote", - "regex", - "rustc-hash 2.1.1", - "shlex", - "syn 2.0.100", -] - [[package]] name = "bit-set" version = "0.5.3" @@ -6860,11 +6842,10 @@ dependencies = [ [[package]] name = "libxml" -version = "0.3.4" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86119bbd85c39c7f890fe970a18f77e9a599467fa613d44929aea4acecb9a031" +checksum = "5fe73cdec2bcb36d25a9fe3f607ffcd44bb8907ca0100c4098d1aa342d1e7bec" dependencies = [ - "bindgen 0.71.1", "libc", "pkg-config", "vcpkg", @@ -14020,6 +14001,7 @@ dependencies = [ "itertools 0.14.0", "jsonwebtoken 8.3.0", "lazy_static", + "libxml", "magic-crypt", "mail-parser", "matchit", diff --git a/backend/Cargo.toml b/backend/Cargo.toml index d20ad2f7ed..fbe8ef430d 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -304,6 +304,7 @@ postgres-native-tls = "^0" native-tls = "^0" # samael will break compilation on MacOS. Use this fork instead to make it work # samael = { git="https://github.com/njaremko/samael", rev="464d015e3ae393e4b5dd00b4d6baa1b617de0dd6", features = ["xmlsec"] } +libxml = { version = "=0.3.3" } samael = { version="0.0.14", features = ["xmlsec"] } gcp_auth = "0.9.0" rust_decimal = { version = "^1", features = ["db-postgres", "serde-float"]} diff --git a/backend/windmill-api/Cargo.toml b/backend/windmill-api/Cargo.toml index 09f6dac049..c6702b8ac3 100644 --- a/backend/windmill-api/Cargo.toml +++ b/backend/windmill-api/Cargo.toml @@ -13,7 +13,7 @@ default = [] enterprise = ["windmill-queue/enterprise", "windmill-audit/enterprise", "windmill-git-sync/enterprise", "windmill-common/enterprise", "windmill-worker/enterprise"] stripe = [] agent_worker_server = [] -enterprise_saml = ["dep:samael"] +enterprise_saml = ["dep:samael", "dep:libxml"] benchmark = [] embedding = ["dep:tinyvector", "dep:hf-hub", "dep:tokenizers", "dep:candle-core", "dep:candle-transformers", "dep:candle-nn", "dep:half"] parquet = ["dep:datafusion", "dep:object_store", "dep:url", "windmill-common/parquet", "windmill-worker/parquet"] @@ -100,6 +100,7 @@ async_zip = { workspace = true, optional = true } regex.workspace = true bytes.workspace = true samael = { workspace = true, optional = true } +libxml = { workspace = true, optional = true } async-recursion.workspace = true rsa = { workspace = true, optional = true} uuid.workspace = true From 2bf070ee5c8b18e6565e5c3736692b97ae4edc9f Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Sat, 19 Apr 2025 11:31:27 +0200 Subject: [PATCH 247/739] chore(main): release 1.483.1 (#5642) * chore(main): release 1.483.1 * change versions --- CHANGELOG.md | 7 +++ backend/Cargo.lock | 54 +++++++++---------- backend/Cargo.toml | 4 +- backend/windmill-api/openapi.yaml | 2 +- benchmarks/lib.ts | 2 +- cli/main.ts | 2 +- frontend/package-lock.json | 4 +- frontend/package.json | 2 +- lsp/Pipfile | 4 +- openflow.openapi.yaml | 2 +- .../WindmillClient/WindmillClient.psd1 | 2 +- python-client/wmill/pyproject.toml | 2 +- python-client/wmill_pg/pyproject.toml | 2 +- typescript-client/jsr.json | 2 +- typescript-client/package.json | 2 +- version.txt | 2 +- 16 files changed, 51 insertions(+), 44 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1ecce76eb4..6c5ee479f4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [1.483.1](https://github.com/windmill-labs/windmill/compare/v1.483.0...v1.483.1) (2025-04-19) + + +### Bug Fixes + +* pin libxml to 0.3.3 ([e5595e4](https://github.com/windmill-labs/windmill/commit/e5595e41b5c87704d814eff95bc00b82195728ba)) + ## [1.483.0](https://github.com/windmill-labs/windmill/compare/v1.482.1...v1.483.0) (2025-04-19) diff --git a/backend/Cargo.lock b/backend/Cargo.lock index b3cd9500ff..247f2cc5ba 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -13912,7 +13912,7 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windmill" -version = "1.483.0" +version = "1.483.1" dependencies = [ "anyhow", "axum", @@ -13959,7 +13959,7 @@ dependencies = [ [[package]] name = "windmill-api" -version = "1.483.0" +version = "1.483.1" dependencies = [ "anyhow", "argon2", @@ -14068,7 +14068,7 @@ dependencies = [ [[package]] name = "windmill-api-client" -version = "1.483.0" +version = "1.483.1" dependencies = [ "base64 0.22.1", "chrono", @@ -14083,7 +14083,7 @@ dependencies = [ [[package]] name = "windmill-audit" -version = "1.483.0" +version = "1.483.1" dependencies = [ "chrono", "serde", @@ -14096,7 +14096,7 @@ dependencies = [ [[package]] name = "windmill-autoscaling" -version = "1.483.0" +version = "1.483.1" dependencies = [ "anyhow", "serde", @@ -14110,7 +14110,7 @@ dependencies = [ [[package]] name = "windmill-common" -version = "1.483.0" +version = "1.483.1" dependencies = [ "anyhow", "async-stream", @@ -14174,7 +14174,7 @@ dependencies = [ [[package]] name = "windmill-git-sync" -version = "1.483.0" +version = "1.483.1" dependencies = [ "regex", "serde", @@ -14188,7 +14188,7 @@ dependencies = [ [[package]] name = "windmill-indexer" -version = "1.483.0" +version = "1.483.1" dependencies = [ "anyhow", "bytes", @@ -14211,7 +14211,7 @@ dependencies = [ [[package]] name = "windmill-macros" -version = "1.483.0" +version = "1.483.1" dependencies = [ "itertools 0.14.0", "lazy_static", @@ -14223,7 +14223,7 @@ dependencies = [ [[package]] name = "windmill-parser" -version = "1.483.0" +version = "1.483.1" dependencies = [ "convert_case 0.6.0", "serde", @@ -14232,7 +14232,7 @@ dependencies = [ [[package]] name = "windmill-parser-bash" -version = "1.483.0" +version = "1.483.1" dependencies = [ "anyhow", "lazy_static", @@ -14244,7 +14244,7 @@ dependencies = [ [[package]] name = "windmill-parser-csharp" -version = "1.483.0" +version = "1.483.1" dependencies = [ "anyhow", "serde_json", @@ -14256,7 +14256,7 @@ dependencies = [ [[package]] name = "windmill-parser-go" -version = "1.483.0" +version = "1.483.1" dependencies = [ "anyhow", "gosyn", @@ -14268,7 +14268,7 @@ dependencies = [ [[package]] name = "windmill-parser-graphql" -version = "1.483.0" +version = "1.483.1" dependencies = [ "anyhow", "lazy_static", @@ -14280,7 +14280,7 @@ dependencies = [ [[package]] name = "windmill-parser-java" -version = "1.483.0" +version = "1.483.1" dependencies = [ "anyhow", "serde_json", @@ -14292,7 +14292,7 @@ dependencies = [ [[package]] name = "windmill-parser-nu" -version = "1.483.0" +version = "1.483.1" dependencies = [ "anyhow", "nu-parser", @@ -14303,7 +14303,7 @@ dependencies = [ [[package]] name = "windmill-parser-php" -version = "1.483.0" +version = "1.483.1" dependencies = [ "anyhow", "itertools 0.14.0", @@ -14314,7 +14314,7 @@ dependencies = [ [[package]] name = "windmill-parser-py" -version = "1.483.0" +version = "1.483.1" dependencies = [ "anyhow", "itertools 0.14.0", @@ -14325,7 +14325,7 @@ dependencies = [ [[package]] name = "windmill-parser-py-imports" -version = "1.483.0" +version = "1.483.1" dependencies = [ "anyhow", "async-recursion", @@ -14345,7 +14345,7 @@ dependencies = [ [[package]] name = "windmill-parser-rust" -version = "1.483.0" +version = "1.483.1" dependencies = [ "anyhow", "convert_case 0.6.0", @@ -14362,7 +14362,7 @@ dependencies = [ [[package]] name = "windmill-parser-sql" -version = "1.483.0" +version = "1.483.1" dependencies = [ "anyhow", "lazy_static", @@ -14374,7 +14374,7 @@ dependencies = [ [[package]] name = "windmill-parser-ts" -version = "1.483.0" +version = "1.483.1" dependencies = [ "anyhow", "lazy_static", @@ -14392,7 +14392,7 @@ dependencies = [ [[package]] name = "windmill-parser-wasm" -version = "1.483.0" +version = "1.483.1" dependencies = [ "anyhow", "getrandom 0.2.15", @@ -14416,7 +14416,7 @@ dependencies = [ [[package]] name = "windmill-parser-yaml" -version = "1.483.0" +version = "1.483.1" dependencies = [ "anyhow", "serde_json", @@ -14426,7 +14426,7 @@ dependencies = [ [[package]] name = "windmill-queue" -version = "1.483.0" +version = "1.483.1" dependencies = [ "anyhow", "async-recursion", @@ -14459,7 +14459,7 @@ dependencies = [ [[package]] name = "windmill-sql-datatype-parser-wasm" -version = "1.483.0" +version = "1.483.1" dependencies = [ "wasm-bindgen", "wasm-bindgen-test", @@ -14469,7 +14469,7 @@ dependencies = [ [[package]] name = "windmill-worker" -version = "1.483.0" +version = "1.483.1" dependencies = [ "anyhow", "async-recursion", diff --git a/backend/Cargo.toml b/backend/Cargo.toml index fbe8ef430d..52f6f39ce6 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "windmill" -version = "1.483.0" +version = "1.483.1" authors.workspace = true edition.workspace = true @@ -32,7 +32,7 @@ members = [ ] [workspace.package] -version = "1.483.0" +version = "1.483.1" authors = ["Ruben Fiszel "] edition = "2021" diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index d868df1ec8..4ad0ecc65d 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.483.0 + version: 1.483.1 title: Windmill API contact: diff --git a/benchmarks/lib.ts b/benchmarks/lib.ts index 1c3e98816e..ee61b90d51 100644 --- a/benchmarks/lib.ts +++ b/benchmarks/lib.ts @@ -2,7 +2,7 @@ import { sleep } from "https://deno.land/x/sleep@v1.2.1/mod.ts"; import * as windmill from "https://deno.land/x/windmill@v1.174.0/mod.ts"; import * as api from "https://deno.land/x/windmill@v1.174.0/windmill-api/index.ts"; -export const VERSION = "v1.483.0"; +export const VERSION = "v1.483.1"; export async function login(email: string, password: string): Promise { return await windmill.UserService.login({ diff --git a/cli/main.ts b/cli/main.ts index 453121c095..ab60532ce1 100644 --- a/cli/main.ts +++ b/cli/main.ts @@ -63,7 +63,7 @@ export { // } // }); -export const VERSION = "1.483.0"; +export const VERSION = "1.483.1"; const command = new Command() .name("wmill") diff --git a/frontend/package-lock.json b/frontend/package-lock.json index f55eaf68bf..467211a069 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "windmill-components", - "version": "1.483.0", + "version": "1.483.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "windmill-components", - "version": "1.483.0", + "version": "1.483.1", "license": "AGPL-3.0", "dependencies": { "@aws-crypto/sha256-js": "^4.0.0", diff --git a/frontend/package.json b/frontend/package.json index 204e0bf652..f4012baed1 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "windmill-components", - "version": "1.483.0", + "version": "1.483.1", "scripts": { "dev": "vite dev", "build": "vite build", diff --git a/lsp/Pipfile b/lsp/Pipfile index 26ff602d84..572e02ad91 100644 --- a/lsp/Pipfile +++ b/lsp/Pipfile @@ -4,8 +4,8 @@ verify_ssl = true name = "pypi" [packages] -wmill = ">=1.483.0" -wmill_pg = ">=1.483.0" +wmill = ">=1.483.1" +wmill_pg = ">=1.483.1" sendgrid = "*" mysql-connector-python = "*" pymongo = "*" diff --git a/openflow.openapi.yaml b/openflow.openapi.yaml index a52ce585b7..560bcad877 100644 --- a/openflow.openapi.yaml +++ b/openflow.openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.483.0 + version: 1.483.1 title: OpenFlow Spec contact: name: Ruben Fiszel diff --git a/powershell-client/WindmillClient/WindmillClient.psd1 b/powershell-client/WindmillClient/WindmillClient.psd1 index 1b4e923310..a0f2ebc8b1 100644 --- a/powershell-client/WindmillClient/WindmillClient.psd1 +++ b/powershell-client/WindmillClient/WindmillClient.psd1 @@ -12,7 +12,7 @@ RootModule = 'WindmillClient.psm1' # Version number of this module. - ModuleVersion = '1.483.0' + ModuleVersion = '1.483.1' # Supported PSEditions # CompatiblePSEditions = @() diff --git a/python-client/wmill/pyproject.toml b/python-client/wmill/pyproject.toml index 37b1a053ff..e8e8749dec 100644 --- a/python-client/wmill/pyproject.toml +++ b/python-client/wmill/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "wmill" -version = "1.483.0" +version = "1.483.1" description = "A client library for accessing Windmill server wrapping the Windmill client API" license = "Apache-2.0" homepage = "https://windmill.dev" diff --git a/python-client/wmill_pg/pyproject.toml b/python-client/wmill_pg/pyproject.toml index 5f295ab328..dcc137a381 100644 --- a/python-client/wmill_pg/pyproject.toml +++ b/python-client/wmill_pg/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "wmill-pg" -version = "1.483.0" +version = "1.483.1" description = "An extension client for the wmill client library focused on pg" license = "Apache-2.0" homepage = "https://windmill.dev" diff --git a/typescript-client/jsr.json b/typescript-client/jsr.json index 6776d9019e..532504ea0f 100644 --- a/typescript-client/jsr.json +++ b/typescript-client/jsr.json @@ -1,6 +1,6 @@ { "name": "@windmill/windmill", - "version": "1.483.0", + "version": "1.483.1", "exports": "./src/index.ts", "publish": { "exclude": ["!src", "./s3Types.ts", "./client.ts"] diff --git a/typescript-client/package.json b/typescript-client/package.json index bd33cd481c..fb6018f26b 100644 --- a/typescript-client/package.json +++ b/typescript-client/package.json @@ -1,7 +1,7 @@ { "name": "windmill-client", "description": "Windmill SDK client for browsers and Node.js", - "version": "1.483.0", + "version": "1.483.1", "author": "Ruben Fiszel", "license": "Apache 2.0", "devDependencies": { diff --git a/version.txt b/version.txt index 12147b22f6..f4f7573b1b 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.483.0 +1.483.1 From e88909aa93acb2181fca64103b4795bb52ea8d6f Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Sat, 19 Apr 2025 12:09:11 +0200 Subject: [PATCH 248/739] add missing sqlx files for tests --- ...b65cdcd277257192ee0a6d18a00f41bce49d4.json | 22 +++++++++++++++ ...543252891c53351bdc98da66cc30ffc895866.json | 22 +++++++++++++++ ...4844b4c1a38701190795a801fa43c74a0beeb.json | 22 +++++++++++++++ ...ff808ba646f4f99d0c8837097e747b481f03a.json | 22 +++++++++++++++ ...deb0ee6b62cf1d8ae1a02b28c23255d377b3d.json | 22 +++++++++++++++ ...f1bfbe4e2db85da9a478a07460733999e9beb.json | 20 +++++++++++++ ...8c456a3c165f7f2a107cf7fa6a4cdd30d55c0.json | 28 +++++++++++++++++++ ...75b58d65ca93d68b29124d04bd526239b9df2.json | 15 ++++++++++ ...110efa11a7731ad0f0e5509f55efabdf535cd.json | 22 +++++++++++++++ ...05d394a7cbcf0038c72a78add5c7b02ef5927.json | 2 +- ...32580dc7f7a9e5a67026f8c0b3077f371fc62.json | 22 +++++++++++++++ 11 files changed, 218 insertions(+), 1 deletion(-) create mode 100644 backend/.sqlx/query-12828c9b2964f2b484a68de1e01b65cdcd277257192ee0a6d18a00f41bce49d4.json create mode 100644 backend/.sqlx/query-280a361076d1c6317610765960f543252891c53351bdc98da66cc30ffc895866.json create mode 100644 backend/.sqlx/query-867d5c75ddc6c5d20136880c7294844b4c1a38701190795a801fa43c74a0beeb.json create mode 100644 backend/.sqlx/query-99f74bf675120daf965e063e5eaff808ba646f4f99d0c8837097e747b481f03a.json create mode 100644 backend/.sqlx/query-9d518842a9ad90ff9c28dc39690deb0ee6b62cf1d8ae1a02b28c23255d377b3d.json create mode 100644 backend/.sqlx/query-a0c35cb515a842067b294343c90f1bfbe4e2db85da9a478a07460733999e9beb.json create mode 100644 backend/.sqlx/query-a56eef5f5ecbe1a8d309ff65d9a8c456a3c165f7f2a107cf7fa6a4cdd30d55c0.json create mode 100644 backend/.sqlx/query-bd5a0c06e2f2361c9fc670eb0b975b58d65ca93d68b29124d04bd526239b9df2.json create mode 100644 backend/.sqlx/query-cd5f02cf10cbf92dd1df53a54f2110efa11a7731ad0f0e5509f55efabdf535cd.json create mode 100644 backend/.sqlx/query-ef6795d93423f98eea82eb18e6332580dc7f7a9e5a67026f8c0b3077f371fc62.json diff --git a/backend/.sqlx/query-12828c9b2964f2b484a68de1e01b65cdcd277257192ee0a6d18a00f41bce49d4.json b/backend/.sqlx/query-12828c9b2964f2b484a68de1e01b65cdcd277257192ee0a6d18a00f41bce49d4.json new file mode 100644 index 0000000000..84c0804c95 --- /dev/null +++ b/backend/.sqlx/query-12828c9b2964f2b484a68de1e01b65cdcd277257192ee0a6d18a00f41bce49d4.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT suspend > 0 AS \"r!\" FROM v2_job_queue WHERE id = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "r!", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [ + "Uuid" + ] + }, + "nullable": [ + null + ] + }, + "hash": "12828c9b2964f2b484a68de1e01b65cdcd277257192ee0a6d18a00f41bce49d4" +} diff --git a/backend/.sqlx/query-280a361076d1c6317610765960f543252891c53351bdc98da66cc30ffc895866.json b/backend/.sqlx/query-280a361076d1c6317610765960f543252891c53351bdc98da66cc30ffc895866.json new file mode 100644 index 0000000000..e9705c23a6 --- /dev/null +++ b/backend/.sqlx/query-280a361076d1c6317610765960f543252891c53351bdc98da66cc30ffc895866.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT script_path FROM v2_as_completed_job WHERE id = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "script_path", + "type_info": "Varchar" + } + ], + "parameters": { + "Left": [ + "Uuid" + ] + }, + "nullable": [ + true + ] + }, + "hash": "280a361076d1c6317610765960f543252891c53351bdc98da66cc30ffc895866" +} diff --git a/backend/.sqlx/query-867d5c75ddc6c5d20136880c7294844b4c1a38701190795a801fa43c74a0beeb.json b/backend/.sqlx/query-867d5c75ddc6c5d20136880c7294844b4c1a38701190795a801fa43c74a0beeb.json new file mode 100644 index 0000000000..9232baf39c --- /dev/null +++ b/backend/.sqlx/query-867d5c75ddc6c5d20136880c7294844b4c1a38701190795a801fa43c74a0beeb.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT workflow_as_code_status FROM v2_job_completed WHERE id = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "workflow_as_code_status", + "type_info": "Jsonb" + } + ], + "parameters": { + "Left": [ + "Uuid" + ] + }, + "nullable": [ + true + ] + }, + "hash": "867d5c75ddc6c5d20136880c7294844b4c1a38701190795a801fa43c74a0beeb" +} diff --git a/backend/.sqlx/query-99f74bf675120daf965e063e5eaff808ba646f4f99d0c8837097e747b481f03a.json b/backend/.sqlx/query-99f74bf675120daf965e063e5eaff808ba646f4f99d0c8837097e747b481f03a.json new file mode 100644 index 0000000000..68982a2183 --- /dev/null +++ b/backend/.sqlx/query-99f74bf675120daf965e063e5eaff808ba646f4f99d0c8837097e747b481f03a.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT id FROM v2_job WHERE parent_job = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Uuid" + } + ], + "parameters": { + "Left": [ + "Uuid" + ] + }, + "nullable": [ + false + ] + }, + "hash": "99f74bf675120daf965e063e5eaff808ba646f4f99d0c8837097e747b481f03a" +} diff --git a/backend/.sqlx/query-9d518842a9ad90ff9c28dc39690deb0ee6b62cf1d8ae1a02b28c23255d377b3d.json b/backend/.sqlx/query-9d518842a9ad90ff9c28dc39690deb0ee6b62cf1d8ae1a02b28c23255d377b3d.json new file mode 100644 index 0000000000..79bd8d0666 --- /dev/null +++ b/backend/.sqlx/query-9d518842a9ad90ff9c28dc39690deb0ee6b62cf1d8ae1a02b28c23255d377b3d.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT labels FROM v2_job WHERE id = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "labels", + "type_info": "TextArray" + } + ], + "parameters": { + "Left": [ + "Uuid" + ] + }, + "nullable": [ + true + ] + }, + "hash": "9d518842a9ad90ff9c28dc39690deb0ee6b62cf1d8ae1a02b28c23255d377b3d" +} diff --git a/backend/.sqlx/query-a0c35cb515a842067b294343c90f1bfbe4e2db85da9a478a07460733999e9beb.json b/backend/.sqlx/query-a0c35cb515a842067b294343c90f1bfbe4e2db85da9a478a07460733999e9beb.json new file mode 100644 index 0000000000..298a66c89c --- /dev/null +++ b/backend/.sqlx/query-a0c35cb515a842067b294343c90f1bfbe4e2db85da9a478a07460733999e9beb.json @@ -0,0 +1,20 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT count(*) AS \"count!\" FROM resume_job", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "count!", + "type_info": "Int8" + } + ], + "parameters": { + "Left": [] + }, + "nullable": [ + null + ] + }, + "hash": "a0c35cb515a842067b294343c90f1bfbe4e2db85da9a478a07460733999e9beb" +} diff --git a/backend/.sqlx/query-a56eef5f5ecbe1a8d309ff65d9a8c456a3c165f7f2a107cf7fa6a4cdd30d55c0.json b/backend/.sqlx/query-a56eef5f5ecbe1a8d309ff65d9a8c456a3c165f7f2a107cf7fa6a4cdd30d55c0.json new file mode 100644 index 0000000000..eb852c75ee --- /dev/null +++ b/backend/.sqlx/query-a56eef5f5ecbe1a8d309ff65d9a8c456a3c165f7f2a107cf7fa6a4cdd30d55c0.json @@ -0,0 +1,28 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT preprocessed, script_entrypoint_override FROM v2_job WHERE id = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "preprocessed", + "type_info": "Bool" + }, + { + "ordinal": 1, + "name": "script_entrypoint_override", + "type_info": "Varchar" + } + ], + "parameters": { + "Left": [ + "Uuid" + ] + }, + "nullable": [ + true, + true + ] + }, + "hash": "a56eef5f5ecbe1a8d309ff65d9a8c456a3c165f7f2a107cf7fa6a4cdd30d55c0" +} diff --git a/backend/.sqlx/query-bd5a0c06e2f2361c9fc670eb0b975b58d65ca93d68b29124d04bd526239b9df2.json b/backend/.sqlx/query-bd5a0c06e2f2361c9fc670eb0b975b58d65ca93d68b29124d04bd526239b9df2.json new file mode 100644 index 0000000000..81a97984ee --- /dev/null +++ b/backend/.sqlx/query-bd5a0c06e2f2361c9fc670eb0b975b58d65ca93d68b29124d04bd526239b9df2.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE v2_job SET labels = $2 WHERE id = $1 AND $2::TEXT[] IS NOT NULL", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Uuid", + "TextArray" + ] + }, + "nullable": [] + }, + "hash": "bd5a0c06e2f2361c9fc670eb0b975b58d65ca93d68b29124d04bd526239b9df2" +} diff --git a/backend/.sqlx/query-cd5f02cf10cbf92dd1df53a54f2110efa11a7731ad0f0e5509f55efabdf535cd.json b/backend/.sqlx/query-cd5f02cf10cbf92dd1df53a54f2110efa11a7731ad0f0e5509f55efabdf535cd.json new file mode 100644 index 0000000000..f5eb13f1fd --- /dev/null +++ b/backend/.sqlx/query-cd5f02cf10cbf92dd1df53a54f2110efa11a7731ad0f0e5509f55efabdf535cd.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT preprocessed FROM v2_job WHERE id = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "preprocessed", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [ + "Uuid" + ] + }, + "nullable": [ + true + ] + }, + "hash": "cd5f02cf10cbf92dd1df53a54f2110efa11a7731ad0f0e5509f55efabdf535cd" +} diff --git a/backend/.sqlx/query-ddf2eccb78a310ed00c7d8b9c3f05d394a7cbcf0038c72a78add5c7b02ef5927.json b/backend/.sqlx/query-ddf2eccb78a310ed00c7d8b9c3f05d394a7cbcf0038c72a78add5c7b02ef5927.json index 5bfff47576..c2dfed73a2 100644 --- a/backend/.sqlx/query-ddf2eccb78a310ed00c7d8b9c3f05d394a7cbcf0038c72a78add5c7b02ef5927.json +++ b/backend/.sqlx/query-ddf2eccb78a310ed00c7d8b9c3f05d394a7cbcf0038c72a78add5c7b02ef5927.json @@ -15,7 +15,7 @@ ] }, "nullable": [ - true + null ] }, "hash": "ddf2eccb78a310ed00c7d8b9c3f05d394a7cbcf0038c72a78add5c7b02ef5927" diff --git a/backend/.sqlx/query-ef6795d93423f98eea82eb18e6332580dc7f7a9e5a67026f8c0b3077f371fc62.json b/backend/.sqlx/query-ef6795d93423f98eea82eb18e6332580dc7f7a9e5a67026f8c0b3077f371fc62.json new file mode 100644 index 0000000000..08c5851944 --- /dev/null +++ b/backend/.sqlx/query-ef6795d93423f98eea82eb18e6332580dc7f7a9e5a67026f8c0b3077f371fc62.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT hash FROM script WHERE path = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "hash", + "type_info": "Int8" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + false + ] + }, + "hash": "ef6795d93423f98eea82eb18e6332580dc7f7a9e5a67026f8c0b3077f371fc62" +} From 3c68fef2abcb380c146a809106e1dbb3aef766df Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Sun, 20 Apr 2025 01:19:02 +0200 Subject: [PATCH 249/739] ui code builder v0 (at secret path) (#4964) --- ...e0dbed634f3b12dedaa5fee0362d670887f6.json} | 7 +- ...8b9bbef26008803f2dd2a043bdb091b2ff20.json} | 7 +- .../20241223155748_raw_apps_v2.down.sql | 2 + .../20241223155748_raw_apps_v2.up.sql | 2 + backend/parsers/windmill-parser-ts/src/lib.rs | 6 +- backend/windmill-api/openapi.yaml | 94 + backend/windmill-api/src/apps.rs | 301 +- backend/windmill-api/src/workspaces_export.rs | 2 +- backend/windmill-common/src/apps.rs | 7 + backend/windmill-common/src/s3_helpers.rs | 4 + backend/windmill-common/src/utils.rs | 3 +- backend/windmill-queue/src/jobs.rs | 1 + .../windmill-worker/src/worker_lockfiles.rs | 84 + frontend/.gitignore | 4 +- frontend/package-lock.json | 406 +- frontend/package.json | 4 +- frontend/scripts/untar_ui_builder.js | 48 + frontend/src/lib/ata/index.ts | 67 +- frontend/src/lib/components/ArgInput.svelte | 7 +- frontend/src/lib/components/DiffEditor.svelte | 2 +- .../lib/components/EditableSchemaForm.svelte | 4 +- frontend/src/lib/components/Editor.svelte | 377 +- .../components/ErrorOrRecoveryHandler.svelte | 2 +- .../lib/components/GraphqlSchemaViewer.svelte | 2 +- .../src/lib/components/ModulePreview.svelte | 12 +- frontend/src/lib/components/RunButton.svelte | 33 + frontend/src/lib/components/SchemaForm.svelte | 5 +- .../src/lib/components/ScriptEditor.svelte | 1 - .../src/lib/components/SimpleEditor.svelte | 3 +- .../src/lib/components/TemplateEditor.svelte | 2 +- .../src/lib/components/WorkerGroup.svelte | 1 - .../helpers/RunnableComponent.svelte | 144 +- .../components/helpers/executeRunnable.ts | 50 + .../apps/editor/AppEditorHeader.svelte | 332 +- .../apps/editor/AppExportButton.svelte | 5 +- .../apps/editor/AppJobsDrawer.svelte | 299 + .../components/apps/editor/AppTimeline.svelte | 13 +- .../components/apps/editor/commonAppUtils.ts | 37 + .../inlineScriptsPanel/AppRunButton.svelte | 39 + .../EmptyInlineScript.svelte | 104 +- .../InlineScriptEditor.svelte | 21 +- .../InlineScriptEditorDrawer.svelte | 4 +- .../InlineScriptEditorPanel.svelte | 2 +- .../InlineScriptHiddenRunnable.svelte | 12 +- .../InlineScriptRunnableByPath.svelte | 57 +- .../InlineScriptsPanel.svelte | 77 +- .../InlineScriptsPanelList.svelte | 6 +- .../apps/editor/inlineScriptsPanel/utils.ts | 50 +- .../settingsPanel/ComponentPanel.svelte | 1 - .../editor/settingsPanel/HideButton.svelte | 3 +- .../settingsPanel/SelectedRunnable.svelte | 49 +- .../inputEditor/RunnableInputEditor.svelte | 4 +- .../inputEditor/StaticInputEditor.svelte | 5 +- .../mainInput/RunnableSelector.svelte | 48 +- frontend/src/lib/components/apps/inputType.ts | 2 + frontend/src/lib/components/apps/store.ts | 3 +- frontend/src/lib/components/apps/types.ts | 27 +- frontend/src/lib/components/apps/utils.ts | 8 +- .../lib/components/common/modal/Modal.svelte | 36 +- .../lib/components/common/table/AppRow.svelte | 23 +- .../copilot/autocomplete/monaco-adapter.ts | 38 +- .../copilot/autocomplete/request.ts | 2 +- .../src/lib/components/copilot/chat/core.ts | 2 +- .../components/flows/CreateActionsApp.svelte | 75 +- .../src/lib/components/icons/CssIcon.svelte | 0 .../components/icons/JavaScriptIcon.svelte | 16 + .../src/lib/components/icons/JsonIcon.svelte | 11 + .../src/lib/components/icons/ReactIcon.svelte | 18 + .../lib/components/icons/SvelteIcon.svelte | 15 + .../src/lib/components/icons/VueIcon.svelte | 13 + .../components/raw_apps/FileEditorIcon.svelte | 26 + .../raw_apps/RawAppBackgroundRunner.svelte | 90 + .../components/raw_apps/RawAppEditor.svelte | 197 + .../raw_apps/RawAppEditorHeader.svelte | 1078 + .../raw_apps/RawAppInlineScriptEditor.svelte | 219 + .../RawAppInlineScriptPanelList.svelte | 90 + .../RawAppInlineScriptRunnable.svelte | 214 + .../raw_apps/RawAppInlineScriptsPanel.svelte | 61 + .../raw_apps/RawAppInputsSpecEditor.svelte | 113 + .../components/raw_apps/RawAppPreview.svelte | 23 + frontend/src/lib/components/raw_apps/utils.ts | 109 + .../components/schema/SchemaFormDND.svelte | 4 +- .../src/lib/components/tutorials/utils.ts | 2 +- frontend/src/lib/components/vscode.ts | 5 +- frontend/src/lib/editorUtils.ts | 59 +- .../monaco_workers/graphql.worker.bundle.js | 27441 +--------------- frontend/src/lib/schema.ts | 2 +- frontend/src/lib/scripts.ts | 19 +- frontend/src/lib/svelteMonarch.ts | 313 + frontend/src/lib/vueMonarch.ts | 270 + .../(logged)/apps/edit/[...path]/+page.svelte | 15 +- .../(root)/(logged)/apps_raw/add/+page.svelte | 190 + .../(root)/(logged)/apps_raw/add/templates.ts | 585 + .../(logged)/apps_raw/edit/[...path]/+page.js | 5 + .../apps_raw/edit/[...path]/+page.svelte | 226 + .../(logged)/apps_raw/get/[...path]/+page.js | 5 + .../apps_raw/get/[...path]/+page.svelte | 58 + .../(root)/(logged)/run/[...run]/+page.svelte | 28 +- .../[workspace]/[...version]/+page.js | 5 + .../[workspace]/[...version]/+page.svelte | 11 + .../src/routes/test_dev_page_2/+page.svelte | 4 +- frontend/static/_headers | 3 + frontend/svelte.config.js | 6 +- frontend/use_latest_ui_builder.sh | 5 + frontend/vite.config.js | 21 +- functions/api/[[path]].ts | 4 + 106 files changed, 6029 insertions(+), 28628 deletions(-) rename backend/.sqlx/{query-2a3992b5e9abcfbb032d10e142d98efa969dae26a7242eb7ac12593ed5421ef3.json => query-56264b88a9f428e79c6e531a0011e0dbed634f3b12dedaa5fee0362d670887f6.json} (62%) rename backend/.sqlx/{query-83d18f4e1cda2c1867168551d855d5626e766b5469c6976c986bdafc8b9407c5.json => query-a9f6e5720f748418ae52cf0e31778b9bbef26008803f2dd2a043bdb091b2ff20.json} (63%) create mode 100644 backend/migrations/20241223155748_raw_apps_v2.down.sql create mode 100644 backend/migrations/20241223155748_raw_apps_v2.up.sql create mode 100644 frontend/scripts/untar_ui_builder.js create mode 100644 frontend/src/lib/components/RunButton.svelte create mode 100644 frontend/src/lib/components/apps/components/helpers/executeRunnable.ts create mode 100644 frontend/src/lib/components/apps/editor/AppJobsDrawer.svelte create mode 100644 frontend/src/lib/components/apps/editor/commonAppUtils.ts create mode 100644 frontend/src/lib/components/apps/editor/inlineScriptsPanel/AppRunButton.svelte create mode 100644 frontend/src/lib/components/icons/CssIcon.svelte create mode 100644 frontend/src/lib/components/icons/JavaScriptIcon.svelte create mode 100644 frontend/src/lib/components/icons/JsonIcon.svelte create mode 100644 frontend/src/lib/components/icons/ReactIcon.svelte create mode 100644 frontend/src/lib/components/icons/SvelteIcon.svelte create mode 100644 frontend/src/lib/components/icons/VueIcon.svelte create mode 100644 frontend/src/lib/components/raw_apps/FileEditorIcon.svelte create mode 100644 frontend/src/lib/components/raw_apps/RawAppBackgroundRunner.svelte create mode 100644 frontend/src/lib/components/raw_apps/RawAppEditor.svelte create mode 100644 frontend/src/lib/components/raw_apps/RawAppEditorHeader.svelte create mode 100644 frontend/src/lib/components/raw_apps/RawAppInlineScriptEditor.svelte create mode 100644 frontend/src/lib/components/raw_apps/RawAppInlineScriptPanelList.svelte create mode 100644 frontend/src/lib/components/raw_apps/RawAppInlineScriptRunnable.svelte create mode 100644 frontend/src/lib/components/raw_apps/RawAppInlineScriptsPanel.svelte create mode 100644 frontend/src/lib/components/raw_apps/RawAppInputsSpecEditor.svelte create mode 100644 frontend/src/lib/components/raw_apps/RawAppPreview.svelte create mode 100644 frontend/src/lib/components/raw_apps/utils.ts create mode 100644 frontend/src/lib/svelteMonarch.ts create mode 100644 frontend/src/lib/vueMonarch.ts create mode 100644 frontend/src/routes/(root)/(logged)/apps_raw/add/+page.svelte create mode 100644 frontend/src/routes/(root)/(logged)/apps_raw/add/templates.ts create mode 100644 frontend/src/routes/(root)/(logged)/apps_raw/edit/[...path]/+page.js create mode 100644 frontend/src/routes/(root)/(logged)/apps_raw/edit/[...path]/+page.svelte create mode 100644 frontend/src/routes/(root)/(logged)/apps_raw/get/[...path]/+page.js create mode 100644 frontend/src/routes/(root)/(logged)/apps_raw/get/[...path]/+page.svelte create mode 100644 frontend/src/routes/apps_raw/[workspace]/[...version]/+page.js create mode 100644 frontend/src/routes/apps_raw/[workspace]/[...version]/+page.svelte create mode 100644 frontend/static/_headers create mode 100755 frontend/use_latest_ui_builder.sh diff --git a/backend/.sqlx/query-2a3992b5e9abcfbb032d10e142d98efa969dae26a7242eb7ac12593ed5421ef3.json b/backend/.sqlx/query-56264b88a9f428e79c6e531a0011e0dbed634f3b12dedaa5fee0362d670887f6.json similarity index 62% rename from backend/.sqlx/query-2a3992b5e9abcfbb032d10e142d98efa969dae26a7242eb7ac12593ed5421ef3.json rename to backend/.sqlx/query-56264b88a9f428e79c6e531a0011e0dbed634f3b12dedaa5fee0362d670887f6.json index 326e45bf24..e5e1ecd5de 100644 --- a/backend/.sqlx/query-2a3992b5e9abcfbb032d10e142d98efa969dae26a7242eb7ac12593ed5421ef3.json +++ b/backend/.sqlx/query-56264b88a9f428e79c6e531a0011e0dbed634f3b12dedaa5fee0362d670887f6.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "INSERT INTO app_version\n (app_id, value, created_by)\n VALUES ($1, $2::text::json, $3) RETURNING id", + "query": "INSERT INTO app_version\n (app_id, value, created_by, raw_app)\n VALUES ($1, $2::text::json, $3, $4) RETURNING id", "describe": { "columns": [ { @@ -13,12 +13,13 @@ "Left": [ "Int8", "Text", - "Varchar" + "Varchar", + "Bool" ] }, "nullable": [ false ] }, - "hash": "2a3992b5e9abcfbb032d10e142d98efa969dae26a7242eb7ac12593ed5421ef3" + "hash": "56264b88a9f428e79c6e531a0011e0dbed634f3b12dedaa5fee0362d670887f6" } diff --git a/backend/.sqlx/query-83d18f4e1cda2c1867168551d855d5626e766b5469c6976c986bdafc8b9407c5.json b/backend/.sqlx/query-a9f6e5720f748418ae52cf0e31778b9bbef26008803f2dd2a043bdb091b2ff20.json similarity index 63% rename from backend/.sqlx/query-83d18f4e1cda2c1867168551d855d5626e766b5469c6976c986bdafc8b9407c5.json rename to backend/.sqlx/query-a9f6e5720f748418ae52cf0e31778b9bbef26008803f2dd2a043bdb091b2ff20.json index 24cabff562..0310f2197b 100644 --- a/backend/.sqlx/query-83d18f4e1cda2c1867168551d855d5626e766b5469c6976c986bdafc8b9407c5.json +++ b/backend/.sqlx/query-a9f6e5720f748418ae52cf0e31778b9bbef26008803f2dd2a043bdb091b2ff20.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "INSERT INTO app_version\n (app_id, value, created_by)\n VALUES ($1, $2::text::json, $3) RETURNING id", + "query": "INSERT INTO app_version\n (app_id, value, created_by, raw_app)\n VALUES ($1, $2::text::json, $3, $4) RETURNING id", "describe": { "columns": [ { @@ -13,12 +13,13 @@ "Left": [ "Int8", "Text", - "Varchar" + "Varchar", + "Bool" ] }, "nullable": [ false ] }, - "hash": "83d18f4e1cda2c1867168551d855d5626e766b5469c6976c986bdafc8b9407c5" + "hash": "a9f6e5720f748418ae52cf0e31778b9bbef26008803f2dd2a043bdb091b2ff20" } diff --git a/backend/migrations/20241223155748_raw_apps_v2.down.sql b/backend/migrations/20241223155748_raw_apps_v2.down.sql new file mode 100644 index 0000000000..7e7dbecf84 --- /dev/null +++ b/backend/migrations/20241223155748_raw_apps_v2.down.sql @@ -0,0 +1,2 @@ +-- Add down migration script here +ALTER TABLE app_version DROP COLUMN IF EXISTS raw_app; \ No newline at end of file diff --git a/backend/migrations/20241223155748_raw_apps_v2.up.sql b/backend/migrations/20241223155748_raw_apps_v2.up.sql new file mode 100644 index 0000000000..02b1124957 --- /dev/null +++ b/backend/migrations/20241223155748_raw_apps_v2.up.sql @@ -0,0 +1,2 @@ +-- Add up migration script here +ALTER TABLE app_version ADD COLUMN IF NOT EXISTS raw_app BOOLEAN NOT NULL DEFAULT FALSE; \ No newline at end of file diff --git a/backend/parsers/windmill-parser-ts/src/lib.rs b/backend/parsers/windmill-parser-ts/src/lib.rs index 24c9eefab3..d4d34cecd6 100644 --- a/backend/parsers/windmill-parser-ts/src/lib.rs +++ b/backend/parsers/windmill-parser-ts/src/lib.rs @@ -49,8 +49,12 @@ impl Visit for ImportsFinder { pub fn parse_expr_for_imports(code: &str) -> anyhow::Result> { let cm: Lrc = Default::default(); let fm = cm.new_source_file(FileName::Custom("main.d.ts".into()).into(), code.into()); + let mut tss = TsSyntax::default(); + tss.disallow_ambiguous_jsx_like; + tss.tsx = true; + tss.no_early_errors = true; let lexer = Lexer::new( - Syntax::Typescript(TsSyntax::default()), + Syntax::Typescript(tss), // EsVersion defaults to es5 Default::default(), StringInput::from(&*fm), diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index 4ad0ecc65d..329cd80968 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -5985,6 +5985,55 @@ paths: schema: type: string + /w/{workspace}/apps/create_raw: + post: + summary: create app raw + operationId: createAppRaw + tags: + - app + parameters: + - $ref: "#/components/parameters/WorkspaceId" + requestBody: + description: new app + required: true + content: + multipart/form-data: + schema: + type: object + properties: + app: + type: object + properties: + path: + type: string + value: {} + summary: + type: string + policy: + $ref: "#/components/schemas/Policy" + draft_only: + type: boolean + deployment_message: + type: string + custom_path: + type: string + required: + - path + - value + - summary + - policy + js: + type: string + css: + type: string + responses: + "201": + description: app created + content: + text/plain: + schema: + type: string + /w/{workspace}/apps/exists/{path}: get: summary: does an app exisst at path @@ -6344,6 +6393,49 @@ paths: schema: type: string + /w/{workspace}/apps/update_raw/{path}: + post: + summary: update app + operationId: updateAppRaw + tags: + - app + parameters: + - $ref: "#/components/parameters/WorkspaceId" + - $ref: "#/components/parameters/ScriptPath" + requestBody: + description: update app + required: true + content: + multipart/form-data: + schema: + type: object + properties: + app: + type: object + properties: + path: + type: string + summary: + type: string + value: {} + policy: + $ref: "#/components/schemas/Policy" + deployment_message: + type: string + custom_path: + type: string + js: + type: string + css: + type: string + responses: + "200": + description: app updated + content: + text/plain: + schema: + type: string + /w/{workspace}/apps/custom_path_exists/{custom_path}: get: summary: check if custom path exists @@ -15921,6 +16013,8 @@ components: execution_mode: type: string enum: [viewer, publisher, anonymous] + raw_app: + type: boolean required: - id - workspace_id diff --git a/backend/windmill-api/src/apps.rs b/backend/windmill-api/src/apps.rs index b3ffdb896b..533da11d1c 100644 --- a/backend/windmill-api/src/apps.rs +++ b/backend/windmill-api/src/apps.rs @@ -24,10 +24,10 @@ use crate::{ }, users::fetch_api_authed_from_permissioned_as, }; -#[cfg(feature = "parquet")] use axum::response::Response; use axum::{ - extract::{Extension, Json, Path, Query}, + body::Body, + extract::{Extension, Json, Multipart, Path, Query}, response::IntoResponse, routing::{delete, get, post}, Router, @@ -88,10 +88,13 @@ pub fn workspaced_service() -> Router { .route("/get/draft/*path", get(get_app_w_draft)) .route("/secret_of/*path", get(get_secret_id)) .route("/get/v/*id", get(get_app_by_id)) + .route("/get_data/v/*id", get(get_raw_app_data)) .route("/exists/*path", get(exists_app)) .route("/update/*path", post(update_app)) + .route("/update_raw/*path", post(update_app_raw)) .route("/delete/*path", delete(delete_app)) .route("/create", post(create_app)) + .route("/create_raw", post(create_app_raw)) .route("/history/p/*path", get(get_app_history)) .route("/get_latest_version/*path", get(get_latest_version)) .route("/history_update/a/:id/v/:version", post(update_app_history)) @@ -135,6 +138,12 @@ pub struct ListableApp { #[sqlx(default)] #[serde(skip_serializing_if = "Option::is_none")] pub deployment_msg: Option, + #[serde(skip_serializing_if = "is_false")] + pub raw_app: bool, +} + +fn is_false(b: &bool) -> bool { + !b } #[derive(FromRow, Serialize, Deserialize)] @@ -328,7 +337,8 @@ async fn list_apps( "app.extra_perms", "favorite.path IS NOT NULL as starred", "draft.path IS NOT NULL as has_draft", - "draft_only" + "draft_only", + "app_version.raw_app", ]) .left() .join("favorite") @@ -387,6 +397,44 @@ async fn list_apps( Ok(Json(rows)) } +async fn get_raw_app_data(Path((w_id, version_id)): Path<(String, String)>) -> Result { + let file_path = format!("/tmp/wmill/{}/{}", w_id, version_id); + let file = tokio::fs::File::open(file_path).await?; + let stream = tokio_util::io::ReaderStream::new(file); + let res = Response::builder().header( + http::header::CONTENT_TYPE, + if version_id.ends_with(".css") { + "text/css" + } else { + "text/javascript" + }, + ); + Ok(res.body(Body::from_stream(stream)).unwrap()) +} + +// async fn get_app_version( +// authed: ApiAuthed, +// Extension(user_db): Extension, +// Path((w_id, path)): Path<(String, StripPath)>, +// ) -> JsonResult { +// let path = path.to_path(); +// let mut tx = user_db.begin(&authed).await?; + +// let version_o = sqlx::query_scalar!( +// "SELECT app.versions[array_upper(app.versions, 1)] as version FROM app +// WHERE app.path = $1 AND app.workspace_id = $2", +// path, +// &w_id, +// ) +// .fetch_optional(&mut *tx) +// .await? +// .flatten(); +// tx.commit().await?; + +// let version = not_found_if_none(version_o, "App", path)?; +// Ok(Json(version)) +// } + async fn get_app( authed: ApiAuthed, Extension(user_db): Extension, @@ -727,6 +775,97 @@ async fn get_secret_id( Ok(hx) } +macro_rules! process_app_multipart { + ($authed:expr, $user_db:expr, $db:expr, $w_id:expr, $path:expr, $multipart:expr, $internal_fn:expr) => { + async { + let mut saved_app = None; + let mut uploaded_js = false; + + //todo: use s3 instead + let file_path = format!("/tmp/wmill/{}", $w_id); + std::fs::create_dir_all(&file_path).unwrap(); + + let mut multipart = $multipart; + while let Some(field) = multipart.next_field().await.unwrap() { + let name = field.name().unwrap().to_string(); + let data = field.bytes().await.unwrap(); + if name == "app" { + let app = serde_json::from_slice(&data).map_err(to_anyhow)?; + let (ntx, npath, nid) = $internal_fn( + $authed.clone(), + $db.clone(), + $user_db.clone(), + $w_id, + $path, + true, + app, + ) + .await?; + saved_app = Some((npath, nid, ntx)); + } else if name == "js" { + if let Some((_npath, id, _tx)) = saved_app.as_ref() { + let file_path = format!("{}/{}.js", file_path, id); + std::fs::write(file_path, data).unwrap(); + uploaded_js = true; + } else { + return Err(Error::BadRequest( + "App payload need to be created first".to_string(), + )); + } + } else if name == "css" { + if let Some((_npath, id, _tx)) = saved_app.as_ref() { + let file_path = format!("{}/{}.css", file_path, id); + std::fs::write(file_path, data).unwrap(); + } else { + return Err(Error::BadRequest( + "App payload need to be created first".to_string(), + )); + } + } else { + return Err(Error::BadRequest(format!("Unsupported field: {}", name))); + } + } + if !uploaded_js { + return Err(Error::BadRequest("js or css file not uploaded".to_string())); + } + if let Some((npath, id, tx)) = saved_app { + tx.commit().await?; + Ok((npath, id)) + } else { + Err(Error::BadRequest("App not created".to_string())) + } + } + }; +} + +async fn create_app_raw<'a>( + authed: ApiAuthed, + Extension(user_db): Extension, + Extension(db): Extension, + Extension(webhook): Extension, + Path(w_id): Path, + multipart: Multipart, +) -> Result<(StatusCode, String)> { + let (path, _id) = process_app_multipart!( + authed, + user_db, + db, + &w_id, + "", + multipart, + |authed, db, user_db, w_id, _path, raw_app, app| create_app_internal( + authed, db, user_db, w_id, raw_app, app + ) + ) + .await?; + + webhook.send_message( + w_id.clone(), + WebhookMessage::CreateApp { workspace: w_id, path: path.clone() }, + ); + Ok((StatusCode::CREATED, path)) +} + async fn list_paths_from_workspace_runnable( authed: ApiAuthed, Extension(user_db): Extension, @@ -755,17 +894,36 @@ async fn create_app( Extension(db): Extension, Extension(webhook): Extension, Path(w_id): Path, - Json(mut app): Json, + Json(app): Json, ) -> Result<(StatusCode, String)> { - let mut tx = user_db.clone().begin(&authed).await?; + let path = app.path.clone(); + let (new_tx, _path, _id) = create_app_internal(authed, db, user_db, &w_id, false, app).await?; + new_tx.commit().await?; + + webhook.send_message( + w_id.clone(), + WebhookMessage::CreateApp { workspace: w_id, path: path.clone() }, + ); + + Ok((StatusCode::CREATED, path)) +} + +async fn create_app_internal<'a>( + authed: ApiAuthed, + db: sqlx::Pool, + user_db: UserDB, + w_id: &String, + raw_app: bool, + mut app: CreateApp, +) -> Result<(sqlx::Transaction<'a, sqlx::Postgres>, String, i64)> { + let mut tx = user_db.clone().begin(&authed).await?; app.policy.on_behalf_of = Some(username_to_permissioned_as(&authed.username)); app.policy.on_behalf_of_email = Some(authed.email.clone()); - + let path = app.path.clone(); if &app.path == "" { return Err(Error::BadRequest("App path cannot be empty".to_string())); } - let exists = sqlx::query_scalar!( "SELECT EXISTS(SELECT 1 FROM app WHERE path = $1 AND workspace_id = $2)", &app.path, @@ -774,21 +932,19 @@ async fn create_app( .fetch_one(&mut *tx) .await? .unwrap_or(false); - if exists { return Err(Error::BadRequest(format!( "App with path {} already exists", &app.path ))); } - if let Some(custom_path) = &app.custom_path { require_admin(authed.is_admin, &authed.username)?; let exists = sqlx::query_scalar!( "SELECT EXISTS(SELECT 1 FROM app WHERE custom_path = $1 AND ($2::TEXT IS NULL OR workspace_id = $2))", custom_path, - if *CLOUD_HOSTED { Some(&w_id) } else { None } + if *CLOUD_HOSTED { Some(w_id) } else { None } ) .fetch_one(&mut *tx) .await?.unwrap_or(false); @@ -800,7 +956,6 @@ async fn create_app( ))); } } - sqlx::query!( "DELETE FROM draft WHERE path = $1 AND workspace_id = $2 AND typ = 'app'", &app.path, @@ -808,7 +963,6 @@ async fn create_app( ) .execute(&mut *tx) .await?; - let id = sqlx::query_scalar!( "INSERT INTO app (workspace_id, path, summary, policy, versions, draft_only, custom_path) @@ -819,24 +973,24 @@ async fn create_app( json!(app.policy), app.draft_only, app.custom_path + .as_ref() .map(|s| if s.is_empty() { None } else { Some(s) }) .flatten() ) .fetch_one(&mut *tx) .await?; - let v_id = sqlx::query_scalar!( "INSERT INTO app_version - (app_id, value, created_by) - VALUES ($1, $2::text::json, $3) RETURNING id", + (app_id, value, created_by, raw_app) + VALUES ($1, $2::text::json, $3, $4) RETURNING id", id, //to preserve key orders serde_json::to_string(&app.value).unwrap(), authed.username, + raw_app ) .fetch_one(&mut *tx) .await?; - sqlx::query!( "UPDATE app SET versions = array_append(versions, $1::bigint) WHERE id = $2", v_id, @@ -850,22 +1004,20 @@ async fn create_app( &authed, "apps.create", ActionKind::Create, - &w_id, + w_id, Some(&app.path), None, ) .await?; - let mut args: HashMap> = HashMap::new(); - if let Some(dm) = app.deployment_message { + if let Some(dm) = &app.deployment_message { args.insert("deployment_message".to_string(), to_raw_value(&dm)); } - let tx = PushIsolationLevel::Transaction(tx); let (dependency_job_uuid, new_tx) = push( &db, tx, - &w_id, + w_id, JobPayload::AppDependencies { path: app.path.clone(), version: v_id }, PushArgs { args: &args, extra: None }, &authed.username, @@ -889,14 +1041,7 @@ async fn create_app( .await?; tracing::info!("Pushed app dependency job {}", dependency_job_uuid); - new_tx.commit().await?; - - webhook.send_message( - w_id.clone(), - WebhookMessage::CreateApp { workspace: w_id, path: app.path.clone() }, - ); - - Ok((StatusCode::CREATED, app.path)) + Ok((new_tx, path, v_id)) } async fn list_hub_apps(Extension(db): Extension) -> impl IntoResponse { @@ -1017,12 +1162,76 @@ async fn update_app( Path((w_id, path)): Path<(String, StripPath)>, Json(ns): Json, ) -> Result { - use sql_builder::prelude::*; - + // create_app_internal(authed, user_db, db, &w_id, &mut app).await?; let path = path.to_path(); + let opath = path.to_string(); + let (new_tx, npath, _v_id) = + update_app_internal(authed, db, user_db, &w_id, path, false, ns).await?; + new_tx.commit().await?; + webhook.send_message( + w_id.clone(), + WebhookMessage::UpdateApp { + workspace: w_id.clone(), + old_path: opath.clone(), + new_path: npath.clone(), + }, + ); + + Ok(format!("app {} updated (npath: {:?})", opath, npath)) +} + +async fn update_app_raw<'a>( + authed: ApiAuthed, + Extension(user_db): Extension, + Extension(db): Extension, + Extension(webhook): Extension, + Path((w_id, path)): Path<(String, StripPath)>, + multipart: Multipart, +) -> Result { + let path = path.to_path(); + let opath = path.to_string(); + let (npath, _id) = process_app_multipart!( + authed, + user_db, + db, + &w_id, + path, + multipart, + update_app_internal + ) + .await?; + + webhook.send_message( + w_id.clone(), + WebhookMessage::UpdateApp { + workspace: w_id.clone(), + old_path: opath.to_owned(), + new_path: npath.clone(), + }, + ); + + Ok(format!("app {} updated (npath: {:?})", opath, npath)) +} +// async fn create_app_internal<'a>( +// authed: ApiAuthed, +// db: sqlx::Pool, +// user_db: UserDB, +// w_id: &String, +// app: &mut CreateApp, +// ) + +async fn update_app_internal<'a>( + authed: ApiAuthed, + db: sqlx::Pool, + user_db: UserDB, + w_id: &str, + path: &str, + raw_app: bool, + ns: EditApp, +) -> Result<(sqlx::Transaction<'a, sqlx::Postgres>, String, i64)> { + use sql_builder::prelude::*; let mut tx = user_db.clone().begin(&authed).await?; - let npath = if ns.policy.is_some() || ns.path.is_some() || ns.summary.is_some() @@ -1069,7 +1278,7 @@ async fn update_app( let exists = sqlx::query_scalar!( "SELECT EXISTS(SELECT 1 FROM app WHERE custom_path = $1 AND ($2::TEXT IS NULL OR workspace_id = $2) AND NOT (path = $3 AND workspace_id = $4))", ncustom_path, - if *CLOUD_HOSTED { Some(&w_id) } else { None }, + if *CLOUD_HOSTED { Some(w_id) } else { None }, path, w_id ) @@ -1116,12 +1325,13 @@ async fn update_app( let v_id = sqlx::query_scalar!( "INSERT INTO app_version - (app_id, value, created_by) - VALUES ($1, $2::text::json, $3) RETURNING id", + (app_id, value, created_by, raw_app) + VALUES ($1, $2::text::json, $3, $4) RETURNING id", app_id, //to preserve key orders serde_json::to_string(&nvalue).unwrap(), authed.username, + raw_app ) .fetch_one(&mut *tx) .await?; @@ -1152,7 +1362,6 @@ async fn update_app( ))); } }; - sqlx::query!( "DELETE FROM draft WHERE path = $1 AND workspace_id = $2 AND typ = 'app'", path, @@ -1160,29 +1369,26 @@ async fn update_app( ) .execute(&mut *tx) .await?; - audit_log( &mut *tx, &authed, "apps.update", ActionKind::Update, - &w_id, + w_id, Some(&npath), None, ) .await?; - let tx = PushIsolationLevel::Transaction(tx); let mut args: HashMap> = HashMap::new(); if let Some(dm) = ns.deployment_message { args.insert("deployment_message".to_string(), to_raw_value(&dm)); } args.insert("parent_path".to_string(), to_raw_value(&path)); - let (dependency_job_uuid, new_tx) = push( &db, tx, - &w_id, + w_id, JobPayload::AppDependencies { path: npath.clone(), version: v_id }, PushArgs { args: &args, extra: None }, &authed.username, @@ -1205,18 +1411,7 @@ async fn update_app( ) .await?; tracing::info!("Pushed app dependency job {}", dependency_job_uuid); - new_tx.commit().await?; - - webhook.send_message( - w_id.clone(), - WebhookMessage::UpdateApp { - workspace: w_id, - old_path: path.to_owned(), - new_path: npath.clone(), - }, - ); - - Ok(format!("app {} updated (npath: {:?})", path, npath)) + Ok((new_tx, npath, v_id)) } #[derive(Debug, Deserialize, Clone)] diff --git a/backend/windmill-api/src/workspaces_export.rs b/backend/windmill-api/src/workspaces_export.rs index 22357f2ed6..b799313933 100644 --- a/backend/windmill-api/src/workspaces_export.rs +++ b/backend/windmill-api/src/workspaces_export.rs @@ -501,7 +501,7 @@ pub(crate) async fn tarball_workspace( "SELECT app.id, app.path, app.summary, app.versions, app.policy, app.custom_path, app.extra_perms, app_version.value, app_version.created_at, app_version.created_by from app, app_version - WHERE app.workspace_id = $1 AND app_version.id = app.versions[array_upper(app.versions, 1)]", + WHERE app.workspace_id = $1 AND app_version.id = app.versions[array_upper(app.versions, 1)] AND app_version.raw_app IS false", ) .bind(&w_id) .fetch_all(&mut *tx) diff --git a/backend/windmill-common/src/apps.rs b/backend/windmill-common/src/apps.rs index bc8429c279..c5b22d434c 100644 --- a/backend/windmill-common/src/apps.rs +++ b/backend/windmill-common/src/apps.rs @@ -6,6 +6,8 @@ * LICENSE-AGPL for a copy of the license. */ +use std::collections::HashMap; + use serde::{Deserialize, Serialize}; /// Id in the `app_script` table. @@ -21,3 +23,8 @@ pub struct ListAppQuery { pub include_draft_only: Option, pub with_deployment_msg: Option, } + +#[derive(Deserialize)] +pub struct RawAppValue { + pub files: HashMap, +} diff --git a/backend/windmill-common/src/s3_helpers.rs b/backend/windmill-common/src/s3_helpers.rs index e3dff5350c..495f45912e 100644 --- a/backend/windmill-common/src/s3_helpers.rs +++ b/backend/windmill-common/src/s3_helpers.rs @@ -476,3 +476,7 @@ impl CredentialProvider for AwsCredentialAdapter { pub fn bundle(w_id: &str, hash: &str) -> String { format!("script_bundle/{}/{}", w_id, hash) } + +pub fn raw_app(w_id: &str, version: &i64) -> String { + format!("/home/rfiszel/raw_app/{}/{}", w_id, version) +} diff --git a/backend/windmill-common/src/utils.rs b/backend/windmill-common/src/utils.rs index 5018591072..62c193031a 100644 --- a/backend/windmill-common/src/utils.rs +++ b/backend/windmill-common/src/utils.rs @@ -19,8 +19,7 @@ use git_version::git_version; use chrono::Utc; use croner::Cron; -use rand::distr::Alphanumeric; -use rand::{rng, Rng}; +use rand::{distr::Alphanumeric, rng, Rng}; use reqwest::Client; use semver::Version; use serde::{Deserialize, Deserializer, Serialize}; diff --git a/backend/windmill-queue/src/jobs.rs b/backend/windmill-queue/src/jobs.rs index 9c7dd8a4fc..c92933ef92 100644 --- a/backend/windmill-queue/src/jobs.rs +++ b/backend/windmill-queue/src/jobs.rs @@ -4101,6 +4101,7 @@ pub async fn push<'c, 'd>( } else if job_kind == JobKind::Dependencies || job_kind == JobKind::FlowDependencies || job_kind == JobKind::DeploymentCallback + || job_kind == JobKind::AppDependencies { // using the dependency tag for deployment callback for now. We can create a separate tag when we need "dependency".to_string() diff --git a/backend/windmill-worker/src/worker_lockfiles.rs b/backend/windmill-worker/src/worker_lockfiles.rs index 6c56f1acef..cab717a94f 100644 --- a/backend/windmill-worker/src/worker_lockfiles.rs +++ b/backend/windmill-worker/src/worker_lockfiles.rs @@ -1731,6 +1731,90 @@ pub async fn handle_app_dependency_job( } } +// async fn upload_raw_app( +// app_value: &RawAppValue, +// job: &QueuedJob, +// mem_peak: &mut i32, +// canceled_by: &mut Option, +// job_dir: &str, +// db: &sqlx::Pool, +// worker_name: &str, +// occupancy_metrics: &mut Option<&mut OccupancyMetrics>, +// version: i64, +// ) -> Result<()> { +// let mut entrypoint = "index.ts"; +// for file in app_value.files.iter() { +// if file.0 == "/index.tsx" { +// entrypoint = "index.tsx"; +// } else if file.0 == "/index.js" { +// entrypoint = "index.js"; +// } +// write_file(&job_dir, file.0, &file.1)?; +// } +// let common_bun_proc_envs: HashMap = get_common_bun_proc_envs(None).await; + +// install_bun_lockfile( +// mem_peak, +// canceled_by, +// &job.id, +// &job.workspace_id, +// Some(db), +// job_dir, +// worker_name, +// common_bun_proc_envs, +// false, +// occupancy_metrics, +// ) +// .await?; +// let mut cmd = tokio::process::Command::new("esbuild"); +// let mut args = "--bundle --minify --outdir=dist/" +// .split(' ') +// .collect::>(); +// args.push(entrypoint); +// cmd.current_dir(job_dir) +// .env_clear() +// .args(args) +// .stdout(Stdio::piped()) +// .stderr(Stdio::piped()); +// let child = start_child_process(cmd, "esbuild").await?; + +// crate::handle_child::handle_child( +// &job.id, +// db, +// mem_peak, +// canceled_by, +// child, +// false, +// worker_name, +// &job.workspace_id, +// "esbuild", +// Some(30), +// false, +// occupancy_metrics, +// ) +// .await?; +// let output_dir = format!("{}/dist", job_dir); +// let target_dir = format!("/home/rfiszel/wmill/{}/{}", job.workspace_id, version); + +// tokio::fs::create_dir_all(&target_dir).await?; + +// tracing::info!("Copying files from {} to {}", output_dir, target_dir); + +// let index_ts = format!("{}/index.js", output_dir); +// let index_css = format!("{}/index.css", output_dir); + +// if tokio::fs::metadata(&index_ts).await.is_ok() { +// tokio::fs::copy(&index_ts, format!("{}/index.js", target_dir)).await?; +// } + +// if tokio::fs::metadata(&index_css).await.is_ok() { +// tokio::fs::copy(&index_css, format!("{}/index.css", target_dir)).await?; +// } +// // let file_path = format!("/home/rfiszel/wmill/{}/{}", job.workspace_id, version); + +// Ok(()) +// } + #[cfg(feature = "python")] async fn python_dep( reqs: String, diff --git a/frontend/.gitignore b/frontend/.gitignore index 32ae7e5b89..f11fc8c669 100644 --- a/frontend/.gitignore +++ b/frontend/.gitignore @@ -9,4 +9,6 @@ tests-out/ storageState.json .env.production dist/ -static/tsdocs/ \ No newline at end of file +static/tsdocs/ +static/ui_builder/ +ui_builder.tar.gz \ No newline at end of file diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 467211a069..149b11d498 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -7,6 +7,7 @@ "": { "name": "windmill-components", "version": "1.483.1", + "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { "@aws-crypto/sha256-js": "^4.0.0", @@ -74,7 +75,7 @@ "windmill-parser-wasm-py": "^1.477.1", "windmill-parser-wasm-regex": "^1.481.0", "windmill-parser-wasm-rust": "^1.429.0", - "windmill-parser-wasm-ts": "^1.429.0", + "windmill-parser-wasm-ts": "^1.438.2", "windmill-parser-wasm-yaml": "^1.429.0", "windmill-sql-datatype-parser-wasm": "^1.318.0", "y-monaco": "^0.1.4", @@ -131,6 +132,7 @@ "svelte-splitpanes": "^8.0.9", "svelte2tsx": "^0.6.16", "tailwindcss": "^3.4.1", + "tar": "^7.4.3", "tslib": "^2.6.1", "typescript": "^5.5.0", "vite": "^6.3.2", @@ -988,6 +990,27 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@isaacs/fs-minipass/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.8", "license": "MIT", @@ -1207,200 +1230,6 @@ "version": "0.0.1", "license": "SEE LICENSE IN LICENSE" }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.35.0.tgz", - "integrity": "sha512-uYQ2WfPaqz5QtVgMxfN6NpLD+no0MYHDBywl7itPYd3K5TjjSghNKmX8ic9S8NU8w81NVhJv/XojcHptRly7qQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.35.0.tgz", - "integrity": "sha512-FtKddj9XZudurLhdJnBl9fl6BwCJ3ky8riCXjEw3/UIbjmIY58ppWwPEvU3fNu+W7FUsAsB1CdH+7EQE6CXAPA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.35.0.tgz", - "integrity": "sha512-Uk+GjOJR6CY844/q6r5DR/6lkPFOw0hjfOIzVx22THJXMxktXG6CbejseJFznU8vHcEBLpiXKY3/6xc+cBm65Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.35.0.tgz", - "integrity": "sha512-3IrHjfAS6Vkp+5bISNQnPogRAW5GAV1n+bNCrDwXmfMHbPl5EhTmWtfmwlJxFRUCBZ+tZ/OxDyU08aF6NI/N5Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.35.0.tgz", - "integrity": "sha512-sxjoD/6F9cDLSELuLNnY0fOrM9WA0KrM0vWm57XhrIMf5FGiN8D0l7fn+bpUeBSU7dCgPV2oX4zHAsAXyHFGcQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.35.0.tgz", - "integrity": "sha512-2mpHCeRuD1u/2kruUiHSsnjWtHjqVbzhBkNVQ1aVD63CcexKVcQGwJ2g5VphOd84GvxfSvnnlEyBtQCE5hxVVw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.35.0.tgz", - "integrity": "sha512-mrA0v3QMy6ZSvEuLs0dMxcO2LnaCONs1Z73GUDBHWbY8tFFocM6yl7YyMu7rz4zS81NDSqhrUuolyZXGi8TEqg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.35.0.tgz", - "integrity": "sha512-DnYhhzcvTAKNexIql8pFajr0PiDGrIsBYPRvCKlA5ixSS3uwo/CWNZxB09jhIapEIg945KOzcYEAGGSmTSpk7A==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.35.0", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.35.0.tgz", - "integrity": "sha512-XQxVOCd6VJeHQA/7YcqyV0/88N6ysSVzRjJ9I9UA/xXpEsjvAgDTgH3wQYz5bmr7SPtVK2TsP2fQ2N9L4ukoUg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.35.0.tgz", - "integrity": "sha512-5pMT5PzfgwcXEwOaSrqVsz/LvjDZt+vQ8RT/70yhPU06PTuq8WaHhfT1LW+cdD7mW6i/J5/XIkX/1tCAkh1W6g==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.35.0.tgz", - "integrity": "sha512-c+zkcvbhbXF98f4CtEIP1EBA/lCic5xB0lToneZYvMeKu5Kamq3O8gqrxiYYLzlZH6E3Aq+TSW86E4ay8iD8EA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.35.0.tgz", - "integrity": "sha512-s91fuAHdOwH/Tad2tzTtPX7UZyytHIRR6V4+2IGlV0Cej5rkG0R61SX4l4y9sh0JBibMiploZx3oHKPnQBKe4g==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.35.0.tgz", - "integrity": "sha512-hQRkPQPLYJZYGP+Hj4fR9dDBMIM7zrzJDWFEMPdTnTy95Ljnv0/4w/ixFw3pTBMEuuEuoqtBINYND4M7ujcuQw==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, "node_modules/@rollup/rollup-linux-x64-gnu": { "version": "4.39.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.39.0.tgz", @@ -1428,48 +1257,6 @@ "linux" ] }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.35.0.tgz", - "integrity": "sha512-OUOlGqPkVJCdJETKOCEf1mw848ZyJ5w50/rZ/3IBQVdLfR5jk/6Sr5m3iO2tdPgwo0x7VcncYuOvMhBWZq8ayg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.35.0.tgz", - "integrity": "sha512-2/lsgejMrtwQe44glq7AFFHLfJBPafpsTa6JvP2NGef/ifOa4KBoglVf7AKN7EV9o32evBPRqfg96fEHzWo5kw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.35.0.tgz", - "integrity": "sha512-PIQeY5XDkrOysbQblSW7v3l1MDZzkTEzAfTPkj5VAu3FW8fS4ynyLg2sINp0fp3SjZ8xkRYpLqoKcYqAkhU1dw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, "node_modules/@smithy/types": { "version": "4.1.0", "license": "Apache-2.0", @@ -2887,11 +2674,12 @@ } }, "node_modules/chownr": { - "version": "2.0.0", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true, - "license": "ISC", "engines": { - "node": ">=10" + "node": ">=18" } }, "node_modules/citty": { @@ -4396,8 +4184,9 @@ }, "node_modules/fs-minipass": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "dev": true, - "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -4407,8 +4196,9 @@ }, "node_modules/fs-minipass/node_modules/minipass": { "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -4426,7 +4216,6 @@ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "hasInstallScript": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -4516,11 +4305,74 @@ "giget": "dist/cli.mjs" } }, + "node_modules/giget/node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/giget/node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/giget/node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/giget/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/giget/node_modules/pathe": { "version": "2.0.3", "dev": true, "license": "MIT" }, + "node_modules/giget/node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/glob": { "version": "7.2.3", "dev": true, @@ -6504,37 +6356,39 @@ } }, "node_modules/minizlib": { - "version": "2.1.2", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", + "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", "dev": true, - "license": "MIT", "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" + "minipass": "^7.1.2" }, "engines": { - "node": ">= 8" + "node": ">= 18" } }, "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" } }, "node_modules/mkdirp": { - "version": "1.0.4", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", "dev": true, - "license": "MIT", "bin": { - "mkdirp": "bin/cmd.js" + "mkdirp": "dist/cjs/src/bin.js" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/mlly": { @@ -7885,7 +7739,6 @@ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "hasInstallScript": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -10115,19 +9968,38 @@ } }, "node_modules/tar": { - "version": "6.2.1", + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", "dev": true, - "license": "ISC", "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "engines": { + "node": ">=18" } }, "node_modules/text-table": { diff --git a/frontend/package.json b/frontend/package.json index f4012baed1..9ba7dd084d 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -5,6 +5,7 @@ "dev": "vite dev", "build": "vite build", "preview": "vite preview", + "postinstall": "node scripts/untar_ui_builder.js", "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --threshold warning", "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", "lint": "prettier --ignore-path .gitignore --check --plugin-search-dir=. . && eslint --ignore-path .gitignore .", @@ -64,6 +65,7 @@ "svelte-splitpanes": "^8.0.9", "svelte2tsx": "^0.6.16", "tailwindcss": "^3.4.1", + "tar": "^7.4.3", "tslib": "^2.6.1", "typescript": "^5.5.0", "vite": "^6.3.2", @@ -142,7 +144,7 @@ "windmill-parser-wasm-py": "^1.477.1", "windmill-parser-wasm-regex": "^1.481.0", "windmill-parser-wasm-rust": "^1.429.0", - "windmill-parser-wasm-ts": "^1.429.0", + "windmill-parser-wasm-ts": "^1.438.2", "windmill-parser-wasm-yaml": "^1.429.0", "windmill-sql-datatype-parser-wasm": "^1.318.0", "y-monaco": "^0.1.4", diff --git a/frontend/scripts/untar_ui_builder.js b/frontend/scripts/untar_ui_builder.js new file mode 100644 index 0000000000..c64b1b1484 --- /dev/null +++ b/frontend/scripts/untar_ui_builder.js @@ -0,0 +1,48 @@ +import path from 'path' +import fs from 'fs' + +import { x } from 'tar' + +const tarUrl = 'https://pub-06154ed168a24e73a86ab84db6bf15d8.r2.dev/ui_builder-d44b577.tar.gz' +const outputTarPath = path.join(process.cwd(), 'ui_builder.tar.gz') +const extractTo = path.join(process.cwd(), 'static/ui_builder/') + +import { fileURLToPath } from 'url' +import { dirname } from 'path' + +const __filename = fileURLToPath(import.meta.url) +const __dirname = dirname(__filename) + +// Download the tar file +const response = await fetch(tarUrl) +const buffer = await response.arrayBuffer() +await fs.promises.writeFile(outputTarPath, Buffer.from(buffer)) + +// Check if this script is being run from the package root +const isRootInstall = process.cwd() + '/scripts' === __dirname + +if (isRootInstall) { + console.log('Running postinstall: direct install') + // Your postinstall logic here +} else { + console.log('Skipping postinstall: installed as dependency') + process.exit(0) +} + +// Create extract directory if it doesn't exist +try { + await fs.promises.mkdir(extractTo, { recursive: true }) +} catch (err) { + if (err.code !== 'EEXIST') { + throw err + } +} + +await x({ + file: outputTarPath, + cwd: extractTo, + sync: false, + gzip: true +}) + +await fs.promises.unlink(outputTarPath) diff --git a/frontend/src/lib/ata/index.ts b/frontend/src/lib/ata/index.ts index 5414df8b18..3099094bf5 100644 --- a/frontend/src/lib/ata/index.ts +++ b/frontend/src/lib/ata/index.ts @@ -38,6 +38,30 @@ export interface ATABootstrapConfig { type ModuleMeta = { state: 'loading' } +export type DepsToGet = { + raw: string + module: string + version: string | undefined +}[] + +function getVersionFromRaw(d: string) { + if (d.lastIndexOf('@') > 0) { + const splitted = d.split('@') + let version = splitted.pop() + if (version?.startsWith('^') || version?.startsWith('~')) { + version = version.slice(1) + } + return version + } + return 'latest' +} + +export function versionRangeToVersion(version: string) { + if (version.startsWith('^') || version.startsWith('~')) { + return version.slice(1) + } + return version +} /** * The function which starts up type acquisition, * returns a function which you then pass the initial @@ -57,11 +81,11 @@ export const setupTypeAcquisition = (config: ATABootstrapConfig) => { let resLimit = { usage: 0 } - return async (initialSourceFile: string) => { + return async (initialSourceFile: string | DepsToGet) => { estimatedToDownload = 0 estimatedDownloaded = 0 - let todo: string[] = [initialSourceFile] + let todo: (string | DepsToGet)[] = [initialSourceFile] let next: string[] = [] let i = 0 let nb = 0 @@ -84,34 +108,25 @@ export const setupTypeAcquisition = (config: ATABootstrapConfig) => { } } - function getVersion(d: string) { - if (d.lastIndexOf('@') > 0) { - const splitted = d.split('@') - let version = splitted.pop() - if (version?.startsWith('^') || version?.startsWith('~')) { - version = version.slice(1) - } - return version - } - return 'latest' - } - async function resolveDeps( - initialSourceFile: string, + depsSource: string | DepsToGet, depth: number, resLimit: ResLimit ): Promise { - let depsToGet = config - .depsParser(initialSourceFile) - .map((d: string) => { - let raw = mapModuleNameToModule(d) - return { - raw, - module: raw.lastIndexOf('@') > 0 ? raw.split('@').slice(0, -1).join('@') : raw, - version: getVersion(d) - } - }) - .filter((f) => !moduleMap.has(f.raw)) + let depsToGet = + typeof depsSource == 'object' + ? depsSource + : config + .depsParser(depsSource) + .map((d: string) => { + let raw = mapModuleNameToModule(d) + return { + raw, + module: raw.lastIndexOf('@') > 0 ? raw.split('@').slice(0, -1).join('@') : raw, + version: getVersionFromRaw(raw) + } + }) + .filter((f) => !moduleMap.has(f.raw)) if (depth == 0) { const relativeDeps = depsToGet.filter((f) => isTypescriptRelativePath(f.raw)) diff --git a/frontend/src/lib/components/ArgInput.svelte b/frontend/src/lib/components/ArgInput.svelte index f7d100c1a4..dbbf7e9e89 100644 --- a/frontend/src/lib/components/ArgInput.svelte +++ b/frontend/src/lib/components/ArgInput.svelte @@ -375,6 +375,9 @@ (e.ctrlKey || e.metaKey) && (e.key == 'Enter' || e.key == 'c' || e.key == 'v' || e.key == 'x') ) { + if (e.key == 'Enter') { + dispatch('keydownCmdEnter') + } return } e.stopPropagation() @@ -846,7 +849,7 @@ }} bind:args={value} dndType={`nested-${title}`} - schemaSkippedValues={['label']} + hiddenArgs={['label']} on:reorder={(e) => { if (oneOf && oneOf[objIdx]) { const keys = e.detail @@ -865,7 +868,7 @@ {onlyMaskPassword} {disablePortal} {disabled} - schemaSkippedValues={['label']} + hiddenArgs={['label']} schema={{ properties: obj.properties, order: obj.order, diff --git a/frontend/src/lib/components/DiffEditor.svelte b/frontend/src/lib/components/DiffEditor.svelte index 92acf052e6..3b24ce9180 100644 --- a/frontend/src/lib/components/DiffEditor.svelte +++ b/frontend/src/lib/components/DiffEditor.svelte @@ -2,7 +2,7 @@ import { BROWSER } from 'esm-env' import { createEventDispatcher, onMount } from 'svelte' - import '@codingame/monaco-vscode-standalone-languages' + // import '@codingame/monaco-vscode-standalone-languages' import '@codingame/monaco-vscode-standalone-json-language-features' import '@codingame/monaco-vscode-standalone-typescript-language-features' import { editor as meditor } from 'monaco-editor' diff --git a/frontend/src/lib/components/EditableSchemaForm.svelte b/frontend/src/lib/components/EditableSchemaForm.svelte index 8af0b2bcbd..a39314824c 100644 --- a/frontend/src/lib/components/EditableSchemaForm.svelte +++ b/frontend/src/lib/components/EditableSchemaForm.svelte @@ -27,7 +27,7 @@ import { createDispatcherIfMounted } from '$lib/createDispatcherIfMounted' export let schema: Schema | any - export let schemaSkippedValues: string[] = [] + export let hiddenArgs: string[] = [] export let args: Record = {} export let shouldHideNoInputs: boolean = false export let noVariablePicker = false @@ -439,7 +439,7 @@
{#if opened === argName}
- {#if !schemaSkippedValues.includes(argName) && Object.keys(schema?.properties ?? {}).includes(argName)} + {#if !hiddenArgs.includes(argName) && Object.keys(schema?.properties ?? {}).includes(argName)} {#if typeof args == 'object' && schema?.properties[argName]} + +{#if !isLoading} + +{:else} + +{/if} diff --git a/frontend/src/lib/components/SchemaForm.svelte b/frontend/src/lib/components/SchemaForm.svelte index a3aa090914..f9852cf3a5 100644 --- a/frontend/src/lib/components/SchemaForm.svelte +++ b/frontend/src/lib/components/SchemaForm.svelte @@ -18,7 +18,7 @@ import type { ComponentCustomCSS } from './apps/types' export let schema: Schema | any - export let schemaSkippedValues: string[] = [] + export let hiddenArgs: string[] = [] export let schemaFieldTooltip: Record = {} export let args: Record = {} export let disabledArgs: string[] = [] @@ -204,7 +204,7 @@ : ''} > - {#if !schemaSkippedValues.includes(argName) && keys.includes(argName)} + {#if !hiddenArgs.includes(argName) && keys.includes(argName)} {#if typeof diff[argName] === 'object' && diff[argName].oldSchema} {@const formerProperty = diff[argName].oldSchema}
@@ -278,6 +278,7 @@ }} on:acceptChange={(e) => dispatch('acceptChange', e.detail)} on:rejectChange={(e) => dispatch('rejectChange', e.detail)} + on:keydownCmdEnter={() => dispatch('keydownCmdEnter')} {disablePortal} {resourceTypes} {prettifyHeader} diff --git a/frontend/src/lib/components/ScriptEditor.svelte b/frontend/src/lib/components/ScriptEditor.svelte index 67943052b8..b464baece4 100644 --- a/frontend/src/lib/components/ScriptEditor.svelte +++ b/frontend/src/lib/components/ScriptEditor.svelte @@ -535,7 +535,6 @@ dispatch('format') }} class="flex flex-1 h-full !overflow-visible" - lang={scriptLangToEditorLang(lang)} scriptLang={lang} automaticLayout={true} {fixedOverflowWidgets} diff --git a/frontend/src/lib/components/SimpleEditor.svelte b/frontend/src/lib/components/SimpleEditor.svelte index ecd40cf5b8..2a7f3f37ae 100644 --- a/frontend/src/lib/components/SimpleEditor.svelte +++ b/frontend/src/lib/components/SimpleEditor.svelte @@ -2,7 +2,7 @@ let cssClassesLoaded = $state(false) let tailwindClassesLoaded = $state(false) - import '@codingame/monaco-vscode-standalone-languages' + // import '@codingame/monaco-vscode-standalone-languages' import '@codingame/monaco-vscode-standalone-json-language-features' import '@codingame/monaco-vscode-standalone-css-language-features' import '@codingame/monaco-vscode-standalone-typescript-language-features' @@ -54,6 +54,7 @@ type IDisposable } from 'monaco-editor' + import { allClasses } from './apps/editor/componentsPanel/cssUtils' import { createEventDispatcher, onDestroy, onMount } from 'svelte' diff --git a/frontend/src/lib/components/TemplateEditor.svelte b/frontend/src/lib/components/TemplateEditor.svelte index a8d312a1f5..1d82563e38 100644 --- a/frontend/src/lib/components/TemplateEditor.svelte +++ b/frontend/src/lib/components/TemplateEditor.svelte @@ -13,7 +13,7 @@ import { createEventDispatcher, getContext, onDestroy, onMount } from 'svelte' import type { AppViewerContext } from './apps/types' import { writable } from 'svelte/store' - import '@codingame/monaco-vscode-standalone-languages' + // import '@codingame/monaco-vscode-standalone-languages' import '@codingame/monaco-vscode-standalone-typescript-language-features' import { initializeVscode } from './vscode' diff --git a/frontend/src/lib/components/WorkerGroup.svelte b/frontend/src/lib/components/WorkerGroup.svelte index fbb6154e19..017584d57f 100644 --- a/frontend/src/lib/components/WorkerGroup.svelte +++ b/frontend/src/lib/components/WorkerGroup.svelte @@ -748,7 +748,6 @@ disabled={!$superadmin} class="flex flex-1 grow h-full w-full" automaticLayout - lang="shell" scriptLang={'bash'} useWebsockets={false} fixedOverflowWidgets={false} diff --git a/frontend/src/lib/components/apps/components/helpers/RunnableComponent.svelte b/frontend/src/lib/components/apps/components/helpers/RunnableComponent.svelte index d1f191fe08..8ff15f0832 100644 --- a/frontend/src/lib/components/apps/components/helpers/RunnableComponent.svelte +++ b/frontend/src/lib/components/apps/components/helpers/RunnableComponent.svelte @@ -2,7 +2,7 @@ import type { Schema } from '$lib/common' import Alert from '$lib/components/common/alert/Alert.svelte' import Popover from '$lib/components/Popover.svelte' - import { AppService, type ExecuteComponentData } from '$lib/gen' + import { type ExecuteComponentData } from '$lib/gen' import { classNames, defaultIfEmptyString, emptySchema, sendUserToast } from '$lib/utils' import { deepEqual } from 'fast-equals' import { Bug } from 'lucide-svelte' @@ -26,6 +26,7 @@ import RefreshButton from '$lib/components/apps/components/helpers/RefreshButton.svelte' import { ctxRegex } from '../../utils' import { computeWorkspaceS3FileInputPolicy } from '../../editor/appUtilsS3' + import { executeRunnable } from './executeRunnable' import SchemaForm from '$lib/components/SchemaForm.svelte' import { createDispatcherIfMounted } from '$lib/createDispatcherIfMounted' @@ -40,7 +41,6 @@ export let forceSchemaDisplay: boolean = false export let wrapperClass = '' export let wrapperStyle = '' - export let initializing: boolean | undefined = undefined export let render: boolean export let outputs: { result: Output @@ -48,6 +48,7 @@ jobId?: Output | undefined } export let extraKey = '' + export let initializing: boolean = false export let recomputeOnInputChanged: boolean = true export let loading = false export let refreshOnStart: boolean = false @@ -350,84 +351,22 @@ try { jobId = await resultJobLoader?.abstractRun(async () => { - const nonStaticRunnableInputs = dynamicArgsOverride ?? {} - const staticRunnableInputs = {} - const allowUserResources: string[] = [] - for (const k of Object.keys(fields ?? {})) { - let field = fields[k] - if (field?.type == 'static' && fields[k]) { - if (isEditor) { - staticRunnableInputs[k] = field.value - } - } else if (field?.type == 'user') { - nonStaticRunnableInputs[k] = args?.[k] - if (isEditor && field.allowUserResources) { - allowUserResources.push(k) - } - } else if (field?.type == 'eval' || (field?.type == 'evalv2' && inputValues[k])) { - const ctxMatch = field.expr.match(ctxRegex) - if (ctxMatch) { - nonStaticRunnableInputs[k] = '$ctx:' + ctxMatch[1] - } else { - nonStaticRunnableInputs[k] = await inputValues[k]?.computeExpr() - } - if (isEditor && field?.type == 'evalv2' && field.allowUserResources) { - allowUserResources.push(k) - } - } else { - if (isEditor && field?.type == 'connected' && field.allowUserResources) { - allowUserResources.push(k) - } - nonStaticRunnableInputs[k] = runnableInputValues[k] - } - } - - const oneOfRunnableInputs = isEditor ? collectOneOfFields(fields, $app) : {} - - const requestBody: ExecuteComponentData['requestBody'] = { - args: nonStaticRunnableInputs, - component: id, - force_viewer_static_fields: !isEditor ? undefined : staticRunnableInputs, - force_viewer_one_of_fields: !isEditor ? undefined : oneOfRunnableInputs, - force_viewer_allow_user_resources: !isEditor ? undefined : allowUserResources - } - - if (runnable?.type === 'runnableByName') { - const { inlineScript } = inlineScriptOverride - ? { inlineScript: inlineScriptOverride } - : runnable - - if (inlineScript) { - if (inlineScript.id !== undefined) { - requestBody['id'] = inlineScript.id - } - requestBody['raw_code'] = { - content: inlineScript.id === undefined ? inlineScript.content : '', - language: inlineScript.language ?? '', - path: inlineScript.path, - lock: inlineScript.id === undefined ? inlineScript.lock : undefined, - cache_ttl: inlineScript.cache_ttl - } - } - } else if (runnable?.type === 'runnableByPath') { - const { path, runType } = runnable - requestBody['path'] = runType !== 'hubscript' ? `${runType}/${path}` : `script/${path}` - } - - if ($app.version !== undefined) { - requestBody['version'] = $app.version - } - - const uuid = await AppService.executeComponent({ + const uuid = await executeRunnable( + runnable, workspace, - path: defaultIfEmptyString($appPath, `u/${$userStore?.username ?? 'unknown'}/newapp`), - requestBody - }) + $app.version, + $userStore?.username, + $appPath, + id, + await buildRequestBody(dynamicArgsOverride), + inlineScriptOverride + ) if (isEditor) { addJob(uuid) } return uuid }, callbacks) + if (setRunnableJobEditorPanel && editorContext) { editorContext.runnableJobEditorPanel.update((p) => { return { @@ -449,6 +388,51 @@ } type Callbacks = { done: (x: any) => void; cancel: () => void; error: (e: any) => void } + export async function buildRequestBody(dynamicArgsOverride: Record | undefined) { + const nonStaticRunnableInputs = dynamicArgsOverride ?? {} + const staticRunnableInputs = {} + const allowUserResources: string[] = [] + for (const k of Object.keys(fields ?? {})) { + let field = fields[k] + if (field?.type == 'static' && fields[k]) { + if (isEditor) { + staticRunnableInputs[k] = field.value + } + } else if (field?.type == 'user') { + nonStaticRunnableInputs[k] = args?.[k] + if (isEditor && field.allowUserResources) { + allowUserResources.push(k) + } + } else if (field?.type == 'eval' || (field?.type == 'evalv2' && inputValues[k])) { + const ctxMatch = field.expr.match(ctxRegex) + if (ctxMatch) { + nonStaticRunnableInputs[k] = '$ctx:' + ctxMatch[1] + } else { + nonStaticRunnableInputs[k] = await inputValues[k]?.computeExpr() + } + if (isEditor && field?.type == 'evalv2' && field.allowUserResources) { + allowUserResources.push(k) + } + } else { + if (isEditor && field?.type == 'connected' && field.allowUserResources) { + allowUserResources.push(k) + } + nonStaticRunnableInputs[k] = runnableInputValues[k] + } + } + + const oneOfRunnableInputs = isEditor ? collectOneOfFields(fields, $app) : {} + + const requestBody: ExecuteComponentData['requestBody'] = { + args: nonStaticRunnableInputs, + component: id, + force_viewer_static_fields: !isEditor ? undefined : staticRunnableInputs, + force_viewer_one_of_fields: !isEditor ? undefined : oneOfRunnableInputs, + force_viewer_allow_user_resources: !isEditor ? undefined : allowUserResources + } + return requestBody + } + export async function runComponent( noToast = true, inlineScriptOverride?: InlineScript, @@ -647,15 +631,16 @@ } } + const nautoRefresh = (autoRefresh && recomputableByRefreshButton) || overrideAutoRefresh if (replaceCallback) { $runnableComponents[id] = { - autoRefresh: (autoRefresh && recomputableByRefreshButton) || overrideAutoRefresh, + autoRefresh: nautoRefresh, refreshOnStart: refreshOnStart, cb: [cancellableRun] } } else { $runnableComponents[id] = { - autoRefresh: (autoRefresh && recomputableByRefreshButton) || overrideAutoRefresh, + autoRefresh: nautoRefresh, refreshOnStart: refreshOnStart, cb: [...($runnableComponents[id]?.cb ?? []), cancellableRun] } @@ -664,6 +649,10 @@ if (!noInitialize && !$initialized.initializedComponents.includes(id)) { $initialized.initializedComponents = [...$initialized.initializedComponents, id] } + // console.log(initializing, $initialized.initialized, refreshOnStart) + if (initializing && $initialized.initialized && (refreshOnStart || nautoRefresh)) { + setDebouncedExecute() + } }) onDestroy(() => { @@ -850,7 +839,8 @@
{/if} - {#if render && !initializing && autoRefresh === true && !hideRefreshButton} + + {#if render && autoRefresh === true && !hideRefreshButton}
diff --git a/frontend/src/lib/components/apps/components/helpers/executeRunnable.ts b/frontend/src/lib/components/apps/components/helpers/executeRunnable.ts new file mode 100644 index 0000000000..397f690ae2 --- /dev/null +++ b/frontend/src/lib/components/apps/components/helpers/executeRunnable.ts @@ -0,0 +1,50 @@ +import { AppService, type ExecuteComponentData } from '$lib/gen' +import { defaultIfEmptyString } from '$lib/utils' +import type { Runnable } from '../../inputType' +import type { InlineScript } from '../../types' + +export async function executeRunnable( + runnable: Runnable, + workspace: string, + version: number | undefined, + username: string | undefined, + path: string, + id: string, + requestBody: ExecuteComponentData['requestBody'], + inlineScriptOverride?: InlineScript +) { + let appPath = defaultIfEmptyString(path, `u/${username ?? 'unknown'}/newapp`) + if (runnable?.type === 'runnableByName') { + const { inlineScript } = inlineScriptOverride + ? { inlineScript: inlineScriptOverride } + : runnable + + if (inlineScript) { + if (inlineScript.id !== undefined) { + requestBody['id'] = inlineScript.id + } + requestBody['raw_code'] = { + content: inlineScript.id === undefined ? inlineScript.content : '', + language: inlineScript.language ?? '', + path: appPath + '/' + id, + lock: inlineScript.id === undefined ? inlineScript.lock : undefined, + cache_ttl: inlineScript.cache_ttl + } + } + } else if (runnable?.type === 'runnableByPath') { + const { path, runType } = runnable + requestBody['path'] = runType !== 'hubscript' ? `${runType}/${path}` : `script/${path}` + } + + if (version !== undefined) { + requestBody['version'] = version + } + + const uuid = await AppService.executeComponent({ + workspace, + path: appPath, + requestBody + }) + + return uuid +} diff --git a/frontend/src/lib/components/apps/editor/AppEditorHeader.svelte b/frontend/src/lib/components/apps/editor/AppEditorHeader.svelte index 46fde6f024..48bbfc0288 100644 --- a/frontend/src/lib/components/apps/editor/AppEditorHeader.svelte +++ b/frontend/src/lib/components/apps/editor/AppEditorHeader.svelte @@ -1,15 +1,10 @@ + + + + + { + open = false + }} + tooltip="Look at latests runs to spot potential bugs." + documentationLink="https://www.windmill.dev/docs/apps/app_debugging" + > + + + +
+ {#if jobs.length > 0} +
+ {#each jobs ?? [] as id} + {@const selectedJob = jobsById[id]} + {#if selectedJob} + + +
{ + selectedJobId = id + rightColumnSelect = 'detail' + }} + > + {truncateRev(selectedJob.job, 20)} + {selectedJob.component} +
+ {/if} + {/each} +
+ {:else} +
No items
+ {/if} +
+
+
+ +
+
+ + Timeline + Details + +
+ {#if rightColumnSelect == 'timeline'} +
+ +
+ {:else if rightColumnSelect == 'detail'} +
+ {#if selectedJobId} + {#if selectedJobId?.includes('Frontend')} + {@const jobResult = jobsById[selectedJobId]} + {#if jobResult?.error !== undefined} + + + + + +
+ +
+
+
+ {:else if jobResult !== undefined} + + + + + +
+ +
+
+
+ {:else} + + {/if} + {:else} +
+ {#if job?.['running']} +
+ +
+ {/if} + {#if job?.args} +
+ +
+ {/if} + {#if job?.raw_code} +
+ +
+ {/if} + + {#if job?.job_kind !== 'flow' && !isFlowPreview(job?.job_kind)} + {@const jobResult = jobsById[selectedJobId]} + + + + + + {#if job != undefined && 'result' in job && job.result != undefined}
+ {:else if testIsLoading} +
+ {:else if job != undefined && 'result' in job && job?.['result'] == undefined} +
Result is undefined
+ {:else} +
+ +
+ {/if} +
+ {#if jobResult?.transformer} + +
Transformer results
+ {#if job != undefined && 'result' in job && job.result != undefined} +
+ +
+ {:else if testIsLoading} +
+ {:else if job != undefined && 'result' in job && job?.['result'] == undefined} +
Result is undefined
+ {:else} +
+ +
+ {/if} +
+ {/if} +
+ {:else} +
+ +
+ {#if job?.id} + { + job = detail + }} + /> + {:else} + + {/if} +
+ {/if} +
+ {/if} + {:else} +
Select a job to see its details
+ {/if} +
+ {/if} +
+ + + + {#if refreshComponents} + + {/if} + + {#if hasErrors} + + {/if} + + + diff --git a/frontend/src/lib/components/apps/editor/AppTimeline.svelte b/frontend/src/lib/components/apps/editor/AppTimeline.svelte index 7d2f4b06f1..bf41491c29 100644 --- a/frontend/src/lib/components/apps/editor/AppTimeline.svelte +++ b/frontend/src/lib/components/apps/editor/AppTimeline.svelte @@ -1,18 +1,19 @@ + +{#if runnableComponents && $runnableComponents[id] != undefined} + +{/if} diff --git a/frontend/src/lib/components/apps/editor/inlineScriptsPanel/EmptyInlineScript.svelte b/frontend/src/lib/components/apps/editor/inlineScriptsPanel/EmptyInlineScript.svelte index 4e02887b4f..12cfedd2cf 100644 --- a/frontend/src/lib/components/apps/editor/inlineScriptsPanel/EmptyInlineScript.svelte +++ b/frontend/src/lib/components/apps/editor/inlineScriptsPanel/EmptyInlineScript.svelte @@ -10,26 +10,25 @@ import { defaultScriptLanguages, getScriptByPath, processLangs } from '$lib/scripts' import { Building, GitFork, Globe2 } from 'lucide-svelte' - import { createEventDispatcher, getContext } from 'svelte' + import { createEventDispatcher } from 'svelte' import { fly } from 'svelte/transition' - import type { AppViewerContext } from '../../types' import { defaultCode } from '../component' - import InlineScriptList from '../settingsPanel/mainInput/InlineScriptList.svelte' import WorkspaceScriptList from '../settingsPanel/mainInput/WorkspaceScriptList.svelte' import RunnableSelector from '../settingsPanel/mainInput/RunnableSelector.svelte' import { defaultScripts } from '$lib/stores' import DefaultScripts from '$lib/components/DefaultScripts.svelte' import type { Preview } from '$lib/gen' + import type { InlineScript } from '../../types' - export let name: string export let componentType: string | undefined = undefined export let showScriptPicker = false + export let rawApps = false + export let unusedInlineScripts: { name: string; inlineScript: InlineScript }[] - let tab = 'inlinescripts' + let tab = 'workspacescripts' let filter: string = '' let picker: Drawer - const { appPath, app } = getContext('AppViewerContext') const dispatch = createEventDispatcher() async function inferInlineScriptSchema( @@ -48,26 +47,22 @@ async function createInlineScriptByLanguage( language: Preview['language'], - path: string, subkind: 'pgsql' | 'mysql' | 'fetch' | undefined = undefined ) { const content = defaultCode(componentType ?? '', (subkind || language) ?? '') ?? initialCode(language, 'script', subkind ?? 'flow') - return newInlineScript(content, language, path) + return newInlineScript(content, language) } - async function newInlineScript(content: string, language: Preview['language'], path: string) { - const fullPath = `${$appPath}/${path}` - + async function newInlineScript(content: string, language: Preview['language']) { let schema: Schema = emptySchema() schema = await inferInlineScriptSchema(language, content, schema) const newInlineScript = { content, language, - path: fullPath, schema } dispatch('new', newInlineScript) @@ -75,23 +70,12 @@ async function pickScript(path: string) { const script = await getScriptByPath(path) - newInlineScript(script.content, script.language, path) + newInlineScript(script.content, script.language) } async function pickHubScript(path: string) { const script = await getScriptByPath(path) - newInlineScript(script.content, script.language, path) - } - - function pickInlineScript(name: string) { - const unusedInlineScriptIndex = $app.unusedInlineScripts?.findIndex( - (script) => script.name === name - ) - const unusedInlineScript = $app.unusedInlineScripts?.[unusedInlineScriptIndex] - - $app.unusedInlineScripts.splice(unusedInlineScriptIndex, 1) - $app = $app - dispatch('new', unusedInlineScript.inlineScript) + newInlineScript(script.content, script.language) } $: langs = processLangs(undefined, $defaultScripts?.order ?? Object.keys(defaultScriptLanguages)) @@ -108,12 +92,6 @@
- -
- - Detached Inline Scripts -
-
@@ -131,14 +109,7 @@
- {#if tab == 'inlinescripts'} - pickInlineScript(e.detail)} - inlineScripts={$app.unusedInlineScripts - ? $app.unusedInlineScripts.map((uis) => uis.name) - : []} - /> - {:else if tab == 'workspacescripts'} + {#if tab == 'workspacescripts'} pickScript(e.detail)} /> {:else if tab == 'hubscripts'} pickHubScript(e.detail.path)} /> @@ -159,7 +130,7 @@
Choose a language
{#if showScriptPicker} - + {/if}
-
-
- Frontend - - Frontend scripts are executed in the browser and can manipulate the app context directly. - -
+ {#if !rawApps} +
+
+ Frontend + + Frontend scripts are executed in the browser and can manipulate the app context + directly. + +
-
- { - const newInlineScript = { - content: `// read outputs and ctx +
+ { + const newInlineScript = { + content: `// read outputs and ctx console.log(ctx.email) // access a global state store @@ -235,14 +208,15 @@ state.foo += 1 // all helpers can be found at https://www.windmill.dev/docs/apps/app-runnable-panel#frontend-scripts-helpers return state.foo`, - language: 'frontend', - path: 'frontend script', - schema: undefined - } - dispatch('new', newInlineScript) - }} - /> + language: 'frontend', + path: 'frontend script', + schema: undefined + } + dispatch('new', newInlineScript) + }} + /> +
-
+ {/if}
diff --git a/frontend/src/lib/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte b/frontend/src/lib/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte index cdf071618e..670ebb2445 100644 --- a/frontend/src/lib/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte +++ b/frontend/src/lib/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte @@ -14,13 +14,13 @@ import type { AppInput } from '../../inputType' import SimpleEditor from '$lib/components/SimpleEditor.svelte' import { buildExtraLib } from '../../utils' - import RunButton from './RunButton.svelte' + import RunButton from './AppRunButton.svelte' import { scriptLangToEditorLang } from '$lib/scripts' import ScriptGen from '$lib/components/copilot/ScriptGen.svelte' import DiffEditor from '$lib/components/DiffEditor.svelte' - import { userStore } from '$lib/stores' import CacheTtlPopup from './CacheTtlPopup.svelte' import EditorSettings from '$lib/components/EditorSettings.svelte' + import { userStore } from '$lib/stores' let inlineScriptEditorDrawer: InlineScriptEditorDrawer @@ -179,7 +179,9 @@ if (!deepEqual(newFields, fields)) { fields = newFields - $stateId++ + if (stateId) { + $stateId++ + } } } } @@ -211,7 +213,9 @@ ] } } - $stateId++ + if (stateId) { + $stateId++ + } } } @@ -219,6 +223,8 @@ {#if inlineScript} {#if inlineScript.language != 'frontend'} { $app = $app - $stateId++ + if (stateId) { + $stateId++ + } }} />
{:else} { if ( diff --git a/frontend/src/lib/components/apps/editor/inlineScriptsPanel/InlineScriptHiddenRunnable.svelte b/frontend/src/lib/components/apps/editor/inlineScriptsPanel/InlineScriptHiddenRunnable.svelte index 3a04c55389..aca0f9c043 100644 --- a/frontend/src/lib/components/apps/editor/inlineScriptsPanel/InlineScriptHiddenRunnable.svelte +++ b/frontend/src/lib/components/apps/editor/inlineScriptsPanel/InlineScriptHiddenRunnable.svelte @@ -10,7 +10,7 @@ export let id: string export let transformer: boolean - const { runnableComponents } = getContext('AppViewerContext') + const { runnableComponents, app } = getContext('AppViewerContext') async function fork(nrunnable: Runnable) { runnable = { ...runnable, ...nrunnable, autoRefresh: true, recomputeOnInputChanged: true } } @@ -37,9 +37,11 @@ bind:inlineScript={runnable.transformer} name="Transformer" on:delete={() => { - delete $runnableComponents[id] - runnable.transformer = undefined - runnable = runnable + if (runnableComponents) { + delete $runnableComponents[id] + runnable.transformer = undefined + runnable = runnable + } }} /> {:else} @@ -67,8 +69,8 @@ /> {:else} onPick(e.detail)} - name={runnable.name} on:delete showScriptPicker on:new={(e) => { diff --git a/frontend/src/lib/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte b/frontend/src/lib/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte index 16fe10c594..866141b231 100644 --- a/frontend/src/lib/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte +++ b/frontend/src/lib/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte @@ -18,18 +18,26 @@ import { deepEqual } from 'fast-equals' import { computeFields } from './utils' import { inferArgs, loadSchema } from '$lib/infer' - import RunButton from './RunButton.svelte' + import AppRunButton from './AppRunButton.svelte' import { getScriptByPath } from '$lib/scripts' import { sendUserToast } from '$lib/toast' import { autoPlacement } from '@floating-ui/core' import { ExternalLink, Eye, GitFork, Pen, RefreshCw, Trash } from 'lucide-svelte' + import { get } from 'svelte/store' + import RunButton from '$lib/components/RunButton.svelte' import Popover from '$lib/components/meltComponents/Popover.svelte' export let runnable: RunnableByPath - export let fields: Record + export let fields: + | Record + | undefined export let id: string + export let rawApps = false + export let isLoading = false + export let onRun = async () => {} + export let onCancel = async () => {} - const { stateId } = getContext('AppViewerContext') + const viewerContext = getContext('AppViewerContext') let drawerFlowViewer: Drawer let flowPath: string = '' @@ -37,15 +45,16 @@ const dispatch = createEventDispatcher() - async function refreshScript(x: RunnableByPath) { + async function refreshScript(runnable: RunnableByPath) { try { - let { schema } = await getScriptByPath(x.path) - if (!deepEqual(x.schema, schema)) { - x.schema = schema - if (!x.schema.order) { - x.schema.order = Object.keys(x.schema.properties ?? {}) + let { schema } = await getScriptByPath(runnable.path) + console.log('schema1', schema) + if (!deepEqual(runnable.schema, schema)) { + runnable.schema = schema + if (!runnable.schema.order) { + runnable.schema.order = Object.keys(runnable.schema.properties ?? {}) } - fields = computeFields(schema, false, fields) + fields = computeFields(schema, false, fields ?? {}) } } catch (e) { notFound = true @@ -53,15 +62,16 @@ } } - async function refreshFlow(x: RunnableByPath) { + async function refreshFlow(runnable: RunnableByPath) { try { - const { schema } = (await loadSchema($workspaceStore ?? '', x.path, 'flow')) ?? emptySchema() - if (!deepEqual(x.schema, schema)) { - x.schema = schema - if (!x.schema.order) { - x.schema.order = Object.keys(x.schema.properties ?? {}) + const { schema } = + (await loadSchema($workspaceStore ?? '', runnable.path, 'flow')) ?? emptySchema() + if (!deepEqual(runnable.schema, schema)) { + runnable.schema = schema + if (!runnable.schema.order) { + runnable.schema.order = Object.keys(runnable.schema.properties ?? {}) } - fields = computeFields(schema, false, fields) + fields = computeFields(schema, false, fields ?? {}) } } catch (e) { notFound = true @@ -92,6 +102,7 @@ if (deepEqual(runnable, lastRunnable)) { return } + console.log('runnable', runnable) notFound = false if (runnable.runType == 'script') { refreshScript(runnable) @@ -111,7 +122,11 @@
- + {#if !rawApps} + + {:else} + + {/if}
- {#key $stateId} + {#key viewerContext?.stateId ? get(viewerContext.stateId) : 0} {#if notFound}
{runnable.runType} not found at {runnable.path} in workspace {$workspaceStore}
import { getContext } from 'svelte' - import type { AppEditorContext, AppViewerContext, HiddenRunnable } from '../../types' + import type { AppEditorContext, AppViewerContext } from '../../types' import { Pane, Splitpanes } from 'svelte-splitpanes' import InlineScriptsPanelList from './InlineScriptsPanelList.svelte' import InlineScriptEditor from './InlineScriptEditor.svelte' @@ -9,13 +9,11 @@ import InlineScriptHiddenRunnable from './InlineScriptHiddenRunnable.svelte' import { BG_PREFIX } from '../../utils' import { sendUserToast } from '$lib/toast' - import type { RunnableByName } from '../../inputType' - import { ScriptService } from '$lib/gen' import { workspaceStore } from '$lib/stores' - import { findNextAvailablePath } from '$lib/path' import { twMerge } from 'tailwind-merge' + import { createScriptFromInlineScript } from './utils' - const { app, runnableComponents } = getContext('AppViewerContext') + const { app, runnableComponents, appPath } = getContext('AppViewerContext') const { selectedComponentInEditor } = getContext('AppEditorContext') function deleteBackgroundScript(index: number) { @@ -36,8 +34,10 @@ } $selectedComponentInEditor = undefined - delete $runnableComponents[BG_PREFIX + index] - $runnableComponents = $runnableComponents + if (runnableComponents) { + delete $runnableComponents[BG_PREFIX + index] + $runnableComponents = $runnableComponents + } } $: gridItem = @@ -57,50 +57,6 @@ (k_, index) => `unused-${index}` === $selectedComponentInEditor ) - async function createScriptFromInlineScript( - id: string, - runnable: HiddenRunnable | RunnableByName - ) { - if (runnable.type != 'runnableByName') { - sendUserToast('Only inline scripts can be saved to workspace', true) - return - } - if (!runnable.inlineScript) { - sendUserToast('No inline script found', true) - return - } - let path = `${runnable.inlineScript.path}/inline_${id}` - path = await findNextAvailablePath(path) - let language = runnable.inlineScript.language - if (language == 'frontend') { - sendUserToast('Frontend scripts can not be saved to workspace', true) - return - } - await ScriptService.createScript({ - workspace: $workspaceStore!, - requestBody: { - path: path, - summary: runnable.name ?? '', - description: '', - content: runnable.inlineScript.content, - parent_hash: undefined, - schema: runnable.inlineScript.schema, - is_template: false, - language: language! - } - }) - - Object.assign(runnable, { - type: 'runnableByPath', - schema: runnable.inlineScript.schema, - runType: 'script', - recomputeIds: undefined, - path - }) - - $app = $app - } - export let width: number | undefined = undefined @@ -114,13 +70,18 @@ {#if !$selectedComponentInEditor}
- Select a script on the left panel + Select a runnable on the left panel
{:else if gridItem} {#key gridItem?.id} { - createScriptFromInlineScript(gridItem?.id ?? 'unknown', e.detail) + createScriptFromInlineScript( + gridItem?.id ?? 'unknown', + e.detail, + $workspaceStore ?? '', + $appPath + ) }} bind:gridItem /> @@ -145,7 +106,13 @@ {#if $app.hiddenInlineScripts?.[hiddenInlineScript]} { - createScriptFromInlineScript(BG_PREFIX + hiddenInlineScript, e.detail) + createScriptFromInlineScript( + BG_PREFIX + hiddenInlineScript, + e.detail, + $workspaceStore ?? '', + $appPath + ) + $app = $app }} transformer={$selectedComponentInEditor?.endsWith('_transformer')} on:delete={() => deleteBackgroundScript(hiddenInlineScript)} @@ -154,7 +121,7 @@ />{/if}{/key} {:else}
- No script found at id {$selectedComponentInEditor} + No runnable found at id {$selectedComponentInEditor}
{/if}
diff --git a/frontend/src/lib/components/apps/editor/inlineScriptsPanel/InlineScriptsPanelList.svelte b/frontend/src/lib/components/apps/editor/inlineScriptsPanel/InlineScriptsPanelList.svelte index e5a83cc178..4ba20786dc 100644 --- a/frontend/src/lib/components/apps/editor/inlineScriptsPanel/InlineScriptsPanelList.svelte +++ b/frontend/src/lib/components/apps/editor/inlineScriptsPanel/InlineScriptsPanelList.svelte @@ -21,7 +21,7 @@ function selectScript(id: string) { $selectedComponentInEditor = id - if (!id.startsWith('unused-') || !id.startsWith(BG_PREFIX)) { + if ((selectedComponent && !id.startsWith('unused-')) || !id.startsWith(BG_PREFIX)) { $selectedComponent = [$selectedComponentInEditor.split('_transformer')[0]] } } @@ -29,7 +29,7 @@ $: runnables = getAppScripts($app.grid, $app.subgrids) // When selected component changes, update selectedScriptComponentId - $: handleSelectedComponent($selectedComponent) + $: selectedComponent && handleSelectedComponent($selectedComponent) function handleSelectedComponent(selectedComponent: string[] | undefined) { if ( @@ -184,11 +184,11 @@ {/if}
-
Background Runnables + diff --git a/frontend/src/lib/components/apps/editor/inlineScriptsPanel/utils.ts b/frontend/src/lib/components/apps/editor/inlineScriptsPanel/utils.ts index 15b7c44237..7609ce4beb 100644 --- a/frontend/src/lib/components/apps/editor/inlineScriptsPanel/utils.ts +++ b/frontend/src/lib/components/apps/editor/inlineScriptsPanel/utils.ts @@ -1,6 +1,8 @@ import type { Schema } from '$lib/common' -import type { AppInputs, Runnable } from '../../inputType' -import type { GridItem, InlineScript } from '../../types' +import { ScriptService } from '$lib/gen' +import { sendUserToast } from '$lib/toast' +import type { AppInputs, Runnable, RunnableByName } from '../../inputType' +import type { GridItem, HiddenRunnable, InlineScript } from '../../types' import { fieldTypeToTsType, schemaToInputsSpec } from '../../utils' import type { AppComponent } from '../component' @@ -111,7 +113,7 @@ export function getAppScripts( grid: GridItem[], subgrids: Record | undefined ): AppScriptsList { - const scriptsList = grid.reduce( + const scriptsList = (grid ?? []).reduce( (acc, gridComponent) => processGridItemRunnable(gridComponent, acc), { inline: [], imported: [], transformer: false } as AppScriptsList ) @@ -143,3 +145,45 @@ function processRunnable( transformer: transformer !== undefined }) } + +export async function createScriptFromInlineScript( + id: string, + runnable: HiddenRunnable | RunnableByName, + workspace: string, + appPath: string +) { + if (runnable.type != 'runnableByName') { + sendUserToast('Only inline scripts can be saved to workspace', true) + return + } + if (!runnable.inlineScript) { + sendUserToast('No inline script found', true) + return + } + let language = runnable.inlineScript.language + if (language == 'frontend') { + sendUserToast('Frontend scripts can not be saved to workspace', true) + return + } + await ScriptService.createScript({ + workspace, + requestBody: { + path: appPath + '/' + id, + summary: runnable.name ?? '', + description: '', + content: runnable.inlineScript.content, + parent_hash: undefined, + schema: runnable.inlineScript.schema, + is_template: false, + language: language! + } + }) + + Object.assign(runnable, { + type: 'runnableByPath', + schema: runnable.inlineScript.schema, + runType: 'script', + recomputeIds: undefined, + path: appPath + '/' + id + }) +} diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte index e9fe80912d..b706095172 100644 --- a/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte +++ b/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte @@ -156,7 +156,6 @@ type: 'runnableByName', name: `Eval of ${id}`, inlineScript: { - path: `${id}_eval`, content: `return ${componentSettings?.item.data.componentInput?.['expr']}`, language: 'frontend', refreshOn: componentSettings?.item.data.componentInput?.['connections']?.map((c) => { diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/HideButton.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/HideButton.svelte index 2a998e75e3..f473894312 100644 --- a/frontend/src/lib/components/apps/editor/settingsPanel/HideButton.svelte +++ b/frontend/src/lib/components/apps/editor/settingsPanel/HideButton.svelte @@ -41,7 +41,8 @@ const shortcuts = { left: 'B', right: 'U', - bottom: 'L' + bottom: 'L', + top: 'T' } diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/SelectedRunnable.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/SelectedRunnable.svelte index 84cec1ed75..94c0af27cf 100644 --- a/frontend/src/lib/components/apps/editor/settingsPanel/SelectedRunnable.svelte +++ b/frontend/src/lib/components/apps/editor/settingsPanel/SelectedRunnable.svelte @@ -46,36 +46,25 @@ appInput?.runnable?.type === 'runnableByPath' || (appInput?.runnable?.type === 'runnableByName' && appInput.runnable?.inlineScript !== undefined) - function getActions(hasScript: boolean): ActionType[] { - if (hasScript) { - return [ - ...(appInput.runnable?.type === 'runnableByName' && appInput.runnable.inlineScript - ? ([ - { - label: 'Detach', - icon: ExternalLink, - color: 'light', - callback: detach - } - ] as const) - : []), - { - label: 'Clear', - icon: X, - color: 'red', - callback: clear - } - ] - } else { - return [ - { - label: 'Clear', - icon: X, - color: 'red', - callback: clear - } - ] - } + function getActions(_hasScript: boolean): ActionType[] { + return [ + ...(appInput.runnable?.type === 'runnableByName' && appInput.runnable.inlineScript + ? ([ + { + label: 'Detach', + icon: ExternalLink, + color: 'light', + callback: detach + } + ] as const) + : []), + { + label: 'Clear', + icon: X, + color: 'red', + callback: clear + } + ] } $: actions = getActions(hasScript) diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/inputEditor/RunnableInputEditor.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/inputEditor/RunnableInputEditor.svelte index 6f9a629261..8028ea9657 100644 --- a/frontend/src/lib/components/apps/editor/settingsPanel/inputEditor/RunnableInputEditor.svelte +++ b/frontend/src/lib/components/apps/editor/settingsPanel/inputEditor/RunnableInputEditor.svelte @@ -5,13 +5,14 @@ import type { AppComponent } from '../../component' import RunnableSelector from '../mainInput/RunnableSelector.svelte' import SelectedRunnable from '../SelectedRunnable.svelte' - import type { AppEditorContext } from '$lib/components/apps/types' + import type { AppEditorContext, AppViewerContext } from '$lib/components/apps/types' export let appInput: ResultAppInput export let defaultUserInput = false export let appComponent: AppComponent const { selectedComponentInEditor } = getContext('AppEditorContext') + const { app } = getContext('AppViewerContext') function onPick({ runnable, @@ -33,6 +34,7 @@ {:else if appInput !== undefined} ('AppViewerContext') + const appContext = getContext('AppViewerContext') + $: componentInput && appContext?.onchange?.() let s3FileUploadRawMode = false let s3FilePicker: S3FilePicker | undefined = undefined - - $: componentInput && onchange?.() {#key subFieldType} diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/mainInput/RunnableSelector.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/mainInput/RunnableSelector.svelte index 3934666353..176b8c670b 100644 --- a/frontend/src/lib/components/apps/editor/settingsPanel/mainInput/RunnableSelector.svelte +++ b/frontend/src/lib/components/apps/editor/settingsPanel/mainInput/RunnableSelector.svelte @@ -6,12 +6,13 @@ import type { Runnable, StaticAppInput } from '$lib/components/apps/inputType' import WorkspaceScriptList from './WorkspaceScriptList.svelte' import WorkspaceFlowList from './WorkspaceFlowList.svelte' - import type { AppViewerContext } from '$lib/components/apps/types' - import { createEventDispatcher, getContext } from 'svelte' + import { createEventDispatcher } from 'svelte' import type { Schema } from '$lib/common' - import { getAllScriptNames, schemaToInputsSpec } from '$lib/components/apps/utils' + import { schemaToInputsSpec } from '$lib/components/apps/utils' import { defaultIfEmptyString, emptySchema } from '$lib/utils' import { loadSchema } from '$lib/infer' + import { workspaceStore } from '$lib/stores' + import type { InlineScript } from '$lib/components/apps/types' type Tab = 'hubscripts' | 'workspacescripts' | 'workspaceflows' | 'inlinescripts' @@ -19,14 +20,15 @@ export let hideCreateScript = false export let onlyFlow = false export let rawApps = false + export let unusedInlineScripts: { name: string; inlineScript: InlineScript }[] - const { app, workspace } = getContext('AppViewerContext') + // const { app, workspace } = getContext('AppViewerContext') let tab: Tab = onlyFlow ? 'workspaceflows' - : $app?.unusedInlineScripts?.length > 0 - ? 'inlinescripts' - : 'workspacescripts' + : unusedInlineScripts?.length > 0 + ? 'inlinescripts' + : 'workspacescripts' let filter: string = '' let picker: Drawer @@ -41,7 +43,7 @@ path: string, runType: 'script' | 'flow' | 'hubscript' ): Promise<{ schema: Schema; summary: string | undefined }> { - const schema = await loadSchema(workspace, path, runType) + const schema = await loadSchema($workspaceStore!, path, runType) if (!schema.schema.order) { schema.schema.order = Object.keys(schema.schema.properties ?? {}) } @@ -88,7 +90,7 @@ type: 'runnableByPath', path, runType: 'hubscript', - schema, + schema: schema.schema, name: defaultIfEmptyString(schema.summary, path) } as const dispatch('pick', { @@ -98,10 +100,8 @@ } function pickInlineScript(name: string) { - const unusedInlineScriptIndex = $app.unusedInlineScripts?.findIndex( - (script) => script.name === name - ) - const unusedInlineScript = $app.unusedInlineScripts?.[unusedInlineScriptIndex] + const unusedInlineScriptIndex = unusedInlineScripts?.findIndex((script) => script.name === name) + const unusedInlineScript = unusedInlineScripts?.[unusedInlineScriptIndex] dispatch('pick', { runnable: { type: 'runnableByName', @@ -111,25 +111,17 @@ fields: {} }) - $app.unusedInlineScripts.splice(unusedInlineScriptIndex, 1) - $app.unusedInlineScripts = $app.unusedInlineScripts + unusedInlineScripts.splice(unusedInlineScriptIndex, 1) + unusedInlineScripts = unusedInlineScripts } function createScript() { - let index = 0 - let newScriptPath = `Inline Script ${index}` - - const names = getAllScriptNames($app) - - // Find a name that is not used by any other inline script - while (names.includes(newScriptPath)) { - newScriptPath = `Inline Script ${++index}` - } + let newScriptName = `Inline Script` dispatch('pick', { runnable: { type: 'runnableByName', - name: newScriptPath, + name: newScriptName, inlineScript: undefined }, fields: {} @@ -179,8 +171,8 @@ {#if tab == 'inlinescripts'} pickInlineScript(e.detail)} - inlineScripts={$app.unusedInlineScripts - ? $app.unusedInlineScripts.map((uis) => uis.name) + inlineScripts={unusedInlineScripts + ? unusedInlineScripts.map((uis) => uis.name) : []} /> {:else if tab == 'workspacescripts'} @@ -215,7 +207,7 @@ on:click={() => picker?.openDrawer()} size="xs" color="blue" - variant="border" + variant={rawApps ? 'contained' : 'border'} startIcon={{ icon: MousePointer }} btnClasses="truncate w-full" > diff --git a/frontend/src/lib/components/apps/inputType.ts b/frontend/src/lib/components/apps/inputType.ts index e348300628..96e051a90a 100644 --- a/frontend/src/lib/components/apps/inputType.ts +++ b/frontend/src/lib/components/apps/inputType.ts @@ -142,6 +142,8 @@ export type RunnableByName = { export type Runnable = RunnableByPath | RunnableByName | undefined +export type RunnableWithFields = Runnable & { fields?: Record } + // Runnable input, set by the developer in the component panel export type ResultInput = { runnable: Runnable diff --git a/frontend/src/lib/components/apps/store.ts b/frontend/src/lib/components/apps/store.ts index 54356aa2a5..69b064e2f9 100644 --- a/frontend/src/lib/components/apps/store.ts +++ b/frontend/src/lib/components/apps/store.ts @@ -1,7 +1,6 @@ import type { Policy } from '$lib/gen' import { writable } from 'svelte/store' -import type { App } from './types' -export const importStore = writable<{ summary: string; value: App; policy: Policy } | undefined>( +export const importStore = writable<{ summary: string; value: any; policy: Policy } | undefined>( undefined ) diff --git a/frontend/src/lib/components/apps/types.ts b/frontend/src/lib/components/apps/types.ts index e58618f99b..b000fc2326 100644 --- a/frontend/src/lib/components/apps/types.ts +++ b/frontend/src/lib/components/apps/types.ts @@ -196,6 +196,17 @@ export type ListInputs = { export type GroupContext = { id: string; context: Writable> } +export type JobById = { + job: string + component: string + result?: any + error?: any + transformer?: { result?: any; error?: string } + created_at?: number + started_at?: number + duration_ms?: number +} + export type AppViewerContext = { worldStore: Writable app: Writable @@ -227,21 +238,7 @@ export type AppViewerContext = { isEditor: boolean jobs: Writable // jobByComponent: Writable>, - jobsById: Writable< - Record< - string, - { - job: string - component: string - result?: string - error?: any - transformer?: { result?: string; error?: string } - created_at?: number - started_at?: number - duration_ms?: number - } - > - > + jobsById: Writable> noBackend: boolean errorByComponent: Writable> openDebugRun: Writable<((jobID: string) => void) | undefined> diff --git a/frontend/src/lib/components/apps/utils.ts b/frontend/src/lib/components/apps/utils.ts index cf9e218c4d..dc512b8645 100644 --- a/frontend/src/lib/components/apps/utils.ts +++ b/frontend/src/lib/components/apps/utils.ts @@ -42,9 +42,9 @@ export function allItems( subgrids: Record | undefined ): GridItem[] { if (subgrids == undefined) { - return grid + return grid ?? [] } - return [...grid, ...Object.values(subgrids).flat()] + return [...(grid ?? []), ...Object.values(subgrids).flat()] } export function schemaToInputsSpec( @@ -377,7 +377,7 @@ declare const result: any; } export function getAllScriptNames(app: App): string[] { - const names = allItems(app.grid, app?.subgrids).reduce((acc, gridItem: GridItem) => { + const names = (allItems(app.grid, app?.subgrids) ?? []).reduce((acc, gridItem: GridItem) => { const { componentInput } = gridItem.data if ( @@ -426,7 +426,7 @@ export function getAllScriptNames(app: App): string[] { return acc }, [] as string[]) - const unusedNames = app.unusedInlineScripts.map((x) => x.name) + const unusedNames = app.unusedInlineScripts?.map((x) => x.name) ?? [] const backgroundNames = app.hiddenInlineScripts?.map((x) => x.name) ?? [] return [...names, ...unusedNames, ...backgroundNames] diff --git a/frontend/src/lib/components/common/modal/Modal.svelte b/frontend/src/lib/components/common/modal/Modal.svelte index 46593e49cd..47a2fe09a0 100644 --- a/frontend/src/lib/components/common/modal/Modal.svelte +++ b/frontend/src/lib/components/common/modal/Modal.svelte @@ -4,6 +4,7 @@ import Button from '../button/Button.svelte' import Badge from '../badge/Badge.svelte' import { twMerge } from 'tailwind-merge' + import CloseButton from '../CloseButton.svelte' export let title: string export let open: boolean = false @@ -11,6 +12,7 @@ export { c as class } export let style = '' export let cancelText: string | undefined = undefined + export let kind: 'button' | 'X' = 'button' const dispatch = createEventDispatcher() @@ -69,6 +71,10 @@ )} {style} > + {#if kind == 'X'} +
(open = false)} />
+ {/if}
@@ -81,21 +87,23 @@
-
- - -
+ {cancelText ?? 'Cancel'}Escape + +
+ {/if}
diff --git a/frontend/src/lib/components/common/table/AppRow.svelte b/frontend/src/lib/components/common/table/AppRow.svelte index 4e629dc205..12d13cbf38 100644 --- a/frontend/src/lib/components/common/table/AppRow.svelte +++ b/frontend/src/lib/components/common/table/AppRow.svelte @@ -23,8 +23,7 @@ Pen, Share, Trash, - Clipboard, - Loader2 + Clipboard } from 'lucide-svelte' import { goto as gotoUrl } from '$app/navigation' import { page } from '$app/stores' @@ -55,16 +54,14 @@ {#if menuOpen} - {#await import('$lib/components/apps/editor/AppJsonEditor.svelte')} - - {:then Module} + {#await import('$lib/components/apps/editor/AppJsonEditor.svelte') then Module} {/await} {/if} {/if} + {#if app.raw_app} + +
+ + Raw +
+ {/if}
@@ -98,7 +103,7 @@ size="xs" variant="border" startIcon={{ icon: Pen }} - href="{base}/apps/edit/{app.path}?nodraft=true" + href="{base}/apps{app.raw_app ? '_raw' : ''}/edit/{app.path}?nodraft=true" > Edit @@ -110,7 +115,7 @@ size="xs" variant="border" startIcon={{ icon: GitFork }} - href="{base}/apps/add?template={app.path}" + href="{base}/apps{app.raw_app ? '_raw' : ''}/add?template={app.path}" > Fork @@ -157,7 +162,7 @@ { displayName: 'Duplicate/Fork', icon: GitFork, - href: `${base}/apps/add?template=${path}`, + href: `${base}/apps${app.raw_app ? '_raw' : ''}/add?template=${path}`, hide: $userStore?.operator }, { diff --git a/frontend/src/lib/components/copilot/autocomplete/monaco-adapter.ts b/frontend/src/lib/components/copilot/autocomplete/monaco-adapter.ts index 8d421b450f..9952199fd2 100644 --- a/frontend/src/lib/components/copilot/autocomplete/monaco-adapter.ts +++ b/frontend/src/lib/components/copilot/autocomplete/monaco-adapter.ts @@ -154,22 +154,22 @@ const MAX_PATCHES = 4 export class Autocompletor { editor: meditor.IStandaloneCodeEditor language: string - scriptLang: ScriptLang | 'bunnative' + scriptLang: ScriptLang | 'bunnative' | 'jsx' | 'tsx' | 'json' viewZoneIds: string[] = [] decorationsCollection: meditor.IEditorDecorationsCollection | undefined = undefined visualChanges: VisualChange[] = [] modifiedCode: string = '' applyZone: | { - startLineNumber: number - endLineNumber: number - } + startLineNumber: number + endLineNumber: number + } | undefined = undefined lastChangePosition: | { - lineNumber: number - column: number - } + lineNumber: number + column: number + } | undefined = undefined abortController: AbortController | undefined = undefined @@ -180,19 +180,19 @@ export class Autocompletor { predictedChange: | { - position: { - lineNumber: number - column: number - } - distance: number - } + position: { + lineNumber: number + column: number + } + distance: number + } | undefined = undefined tabWidget: meditor.IContentWidget | undefined = undefined constructor( editor: meditor.IStandaloneCodeEditor, language: string, - scriptLang: ScriptLang | 'bunnative' + scriptLang: ScriptLang | 'bunnative' | 'jsx' | 'tsx' | 'json' ) { this.editor = editor this.language = language @@ -240,18 +240,18 @@ export class Autocompletor { let closestPosition: | { - lineNumber: number - column: number - } + lineNumber: number + column: number + } | undefined = undefined let closestDistance = Infinity for (const change of this.visualChanges) { if (change.type === 'deleted') { const distance = Math.min( Math.abs(change.range.startLine - position.lineNumber) + - Math.abs(change.range.startColumn - position.column) / 10000, + Math.abs(change.range.startColumn - position.column) / 10000, Math.abs(change.range.endLine - position.lineNumber) + - Math.abs(change.range.endColumn - position.column) / 10000 + Math.abs(change.range.endColumn - position.column) / 10000 ) if (distance < closestDistance) { closestDistance = distance diff --git a/frontend/src/lib/components/copilot/autocomplete/request.ts b/frontend/src/lib/components/copilot/autocomplete/request.ts index b670f5ed06..0d6700a2b4 100644 --- a/frontend/src/lib/components/copilot/autocomplete/request.ts +++ b/frontend/src/lib/components/copilot/autocomplete/request.ts @@ -64,7 +64,7 @@ export async function autocompleteRequest( modifiableSuffix: string suffix: string language: string - scriptLang: ScriptLang | 'bunnative' + scriptLang: ScriptLang | 'bunnative' | 'jsx' | 'tsx' | 'json' events: string[] }, abortController: AbortController diff --git a/frontend/src/lib/components/copilot/chat/core.ts b/frontend/src/lib/components/copilot/chat/core.ts index ed5c968b88..ee0b67c710 100644 --- a/frontend/src/lib/components/copilot/chat/core.ts +++ b/frontend/src/lib/components/copilot/chat/core.ts @@ -93,7 +93,7 @@ export const SUPPORTED_CHAT_SCRIPT_LANGUAGES = [ ] export function getLangContext( - lang: ScriptLang | 'bunnative', + lang: ScriptLang | 'bunnative' | 'jsx' | 'tsx' | 'json', { allowResourcesFetch = false }: { allowResourcesFetch?: boolean } = {} ) { const tsContext = diff --git a/frontend/src/lib/components/flows/CreateActionsApp.svelte b/frontend/src/lib/components/flows/CreateActionsApp.svelte index c8260b0fc0..d68356e786 100644 --- a/frontend/src/lib/components/flows/CreateActionsApp.svelte +++ b/frontend/src/lib/components/flows/CreateActionsApp.svelte @@ -2,24 +2,16 @@ import { goto } from '$lib/navigation' import { base } from '$lib/base' - import { Button, FileInput } from '$lib/components/common' + import { Button } from '$lib/components/common' import Drawer from '$lib/components/common/drawer/Drawer.svelte' import DrawerContent from '$lib/components/common/drawer/DrawerContent.svelte' import { LayoutDashboard, Loader2, Plus } from 'lucide-svelte' import { importStore } from '../apps/store' - import { RawAppService } from '$lib/gen' - import { workspaceStore } from '$lib/stores' - import Path from '../Path.svelte' - import Tooltip from '../Tooltip.svelte' + import YAML from 'yaml' let drawer: Drawer | undefined = undefined - let rawAppDrawer: Drawer | undefined = undefined let pendingRaw: string = '' - let pendingCode: string = '' - let summary: string = '' - let path: string = '' - let pathError: string = '' let importType: 'yaml' | 'json' = 'yaml' @@ -28,19 +20,6 @@ await goto('/apps/add?nodraft=true') drawer?.closeDrawer?.() } - - async function importRawApp() { - await RawAppService.createRawApp({ - workspace: $workspaceStore!, - requestBody: { - path, - summary, - value: pendingCode - } - }) - await goto(`/apps/get_raw/0/${path}`) - rawAppDrawer?.closeDrawer?.() - } @@ -65,11 +44,11 @@ drawer?.toggleDrawer?.() importType = 'json' } - }, - { - label: 'Import app in React/Vue/Svelte', - onClick: () => rawAppDrawer?.toggleDrawer?.() } + // { + // label: 'Build app in React/Vue/Svelte (alpha)', + // onClick: () => goto('/apps_raw/add?nodraft=true') + // } ]} >
@@ -99,45 +78,3 @@ - - - - rawAppDrawer?.toggleDrawer?.()} - > - -

Summary

- - - -

IIFE JS code Bundle that contains an IIFE code that will mount itself to a "root" element. Any framework - or vanilla JS can be used to create an app and templates are provided for the major - frameworks: React/Vue/Svelte. In those frontend apps, it is possible to inline scripts - directly to be executed by windmill backend which makes it a convenient way of building apps - with both frontend and backend all-in-one.

- { - pendingCode = detail?.[0] - }} - /> - - - - -
-
diff --git a/frontend/src/lib/components/icons/CssIcon.svelte b/frontend/src/lib/components/icons/CssIcon.svelte new file mode 100644 index 0000000000..e69de29bb2 diff --git a/frontend/src/lib/components/icons/JavaScriptIcon.svelte b/frontend/src/lib/components/icons/JavaScriptIcon.svelte new file mode 100644 index 0000000000..23dce0a347 --- /dev/null +++ b/frontend/src/lib/components/icons/JavaScriptIcon.svelte @@ -0,0 +1,16 @@ + + + + + + + diff --git a/frontend/src/lib/components/icons/JsonIcon.svelte b/frontend/src/lib/components/icons/JsonIcon.svelte new file mode 100644 index 0000000000..2736d80406 --- /dev/null +++ b/frontend/src/lib/components/icons/JsonIcon.svelte @@ -0,0 +1,11 @@ + + + diff --git a/frontend/src/lib/components/icons/ReactIcon.svelte b/frontend/src/lib/components/icons/ReactIcon.svelte new file mode 100644 index 0000000000..fc286af4e0 --- /dev/null +++ b/frontend/src/lib/components/icons/ReactIcon.svelte @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + diff --git a/frontend/src/lib/components/icons/SvelteIcon.svelte b/frontend/src/lib/components/icons/SvelteIcon.svelte new file mode 100644 index 0000000000..6f6dfcc528 --- /dev/null +++ b/frontend/src/lib/components/icons/SvelteIcon.svelte @@ -0,0 +1,15 @@ + + + + + + diff --git a/frontend/src/lib/components/icons/VueIcon.svelte b/frontend/src/lib/components/icons/VueIcon.svelte new file mode 100644 index 0000000000..a04b3dd918 --- /dev/null +++ b/frontend/src/lib/components/icons/VueIcon.svelte @@ -0,0 +1,13 @@ + + + + + + + diff --git a/frontend/src/lib/components/raw_apps/FileEditorIcon.svelte b/frontend/src/lib/components/raw_apps/FileEditorIcon.svelte new file mode 100644 index 0000000000..f1419b32c7 --- /dev/null +++ b/frontend/src/lib/components/raw_apps/FileEditorIcon.svelte @@ -0,0 +1,26 @@ + + +{#if file.endsWith('.tsx')} + +{:else if file.endsWith('.json')} + +{:else if file.endsWith('.ts')} + +{:else if file.endsWith('.js')} + +{:else if file.endsWith('.vue')} + +{:else if file.endsWith('.css')} + # +{:else if file.endsWith('.svelte')} + +{/if} diff --git a/frontend/src/lib/components/raw_apps/RawAppBackgroundRunner.svelte b/frontend/src/lib/components/raw_apps/RawAppBackgroundRunner.svelte new file mode 100644 index 0000000000..c80bd2c41b --- /dev/null +++ b/frontend/src/lib/components/raw_apps/RawAppBackgroundRunner.svelte @@ -0,0 +1,90 @@ + + + diff --git a/frontend/src/lib/components/raw_apps/RawAppEditor.svelte b/frontend/src/lib/components/raw_apps/RawAppEditor.svelte new file mode 100644 index 0000000000..019d442fee --- /dev/null +++ b/frontend/src/lib/components/raw_apps/RawAppEditor.svelte @@ -0,0 +1,197 @@ + + + + + + +
+ + + + + + + + +
+ { + appPanelSize = 100 + }} + appPath={path} + bind:selectedRunnable + {runnables} + /> +
+ +
+
+ {#if appPanelSize == 100} +
+ { + appPanelSize = 70 + }} + direction="bottom" + hidden + btnClasses="border bg-surface" + /> +
+ {/if} +
diff --git a/frontend/src/lib/components/raw_apps/RawAppEditorHeader.svelte b/frontend/src/lib/components/raw_apps/RawAppEditorHeader.svelte new file mode 100644 index 0000000000..a7bb51be65 --- /dev/null +++ b/frontend/src/lib/components/raw_apps/RawAppEditorHeader.svelte @@ -0,0 +1,1078 @@ + + + + + + +{#if appPath == ''} + + closeDraftDrawer()}> + + Choose a path to save the initial draft of the app. + +

Summary

+
+ + { + if (appPath == '' && summary?.length > 0 && !dirtyPath) { + path?.setName( + summary + .toLowerCase() + .replace(/[^a-z0-9_]/g, '_') + .replace(/-+/g, '_') + .replace(/^-|-$/g, '') + ) + } + }} + /> +
+
+ +
+ +
+ +
+ + +{/if} + + closeSaveDrawer()}> + {#if !onLatest} + + By deploying, you may overwrite changes made by other users. Press 'Deploy' to see diff. + +
+ {/if} + Summary +
+ + { + if (appPath == '' && summary?.length > 0 && !dirtyPath) { + path?.setName( + summary + .toLowerCase() + .replace(/[^a-z0-9_]/g, '_') + .replace(/-+/g, '_') + .replace(/^-|-$/g, '') + ) + } + }} + /> +
+
+ Deployment message +
+ + +
+
+ Path + + +
+ + +
+
+ {#if appPath == ''} + + Save this app once before you can publish it + + {:else} + + A viewer of the app will execute the runnables of the app on behalf of the publisher (you) + + It ensures that all required resources/runnable visible for publisher but not for viewer + at time of creating the app would prevent the execution of the app. To guarantee tight + security, a policy is computed at time of deployment of the app which only allow the + scripts/flows referred to in the app to be called on behalf of. Furthermore, static + parameters are not overridable. Hence, users will only be able to use the app as intended + by the publisher without risk for leaking resources not used in the app. + + + +
+ +

Public URL

+
+ +
+ { + policy.execution_mode = e.detail ? 'anonymous' : 'publisher' + setPublishState() + }} + /> +
+ +
+
+
Public URL
+
+ {#if secretUrl} + {@const href = `${window.location.origin}${base}/public/${$workspaceStore}/${secretUrl}`} + + {:else} + {/if} +
+ Share this url directly or embed it using an iframe (if requiring login, top-level domain + of embedding app must be the same as the one of Windmill) +
+ +
+ {#if !$enterpriseLicense} + + Custom path is an enterprise only feature. + +
+ {:else if !($userStore?.is_admin || $userStore?.is_super_admin)} + + Custom path can only be set by workspace admins + +
+ {/if} + { + customPath = detail ? '' : undefined + }} + checked={customPath !== undefined} + options={{ + right: 'Use a custom URL' + }} + disabled={!$enterpriseLicense || !($userStore?.is_admin || $userStore?.is_super_admin)} + /> + + {#if customPath !== undefined} +
+
Custom path
+
+ { + dirtyCustomPath = true + }} + /> +
+
Custom public URL
+
+ + +
{dirtyCustomPath ? customPathError : ''} +
+ {/if} +
+
+ + You will still need to deploy the app to make visible the latest changes + + + Embed this app in your own product to be used by your own users + {/if} + + + + + (historyBrowserDrawerOpen = false)}> + + + + + { + jobs = [] + }} + on:clearErrors={() => { + console.log('todo clear errors') + }} + {jobs} + hasErrors={false} + {jobsById} + errorByComponent={{}} +/> + +
+
+ +
+ +
+ {#if newPath || newEditedPath} +
+
+ +
+ { + currentTarget.select() + }} + /> +
+ {/if} +
+ {#if $enterpriseLicense && appPath != ''} + + {/if} +
+ + + + + + + + + + +
+
diff --git a/frontend/src/lib/components/raw_apps/RawAppInlineScriptEditor.svelte b/frontend/src/lib/components/raw_apps/RawAppInlineScriptEditor.svelte new file mode 100644 index 0000000000..7754e965e3 --- /dev/null +++ b/frontend/src/lib/components/raw_apps/RawAppInlineScriptEditor.svelte @@ -0,0 +1,219 @@ + + +{#if inlineScript} + {#if inlineScript.language != 'frontend'} + { + dispatch('createScriptFromInlineScript') + drawerIsOpen = false + }} + /> + {/if} +
+
+ {#if name !== undefined} +
+ { + // $app = $app + // if (stateId) { + // $stateId++ + // } + }} + /> +
+
+ {/if} +
+ {#if inlineScript} + + {/if} + { + acc[key] = obj.type === 'static' ? obj.value : undefined + return acc + }, {})} + /> + + + + +
+
+ + + +
+ {#if !drawerIsOpen && inlineScript.language != 'frontend'} + onRun()} + on:change={async (e) => { + if (inlineScript && inlineScript.language != 'frontend') { + if (inlineScript.lock != undefined) { + inlineScript.lock = undefined + } + const oldSchema = JSON.stringify(inlineScript.schema) + if (inlineScript.schema == undefined) { + inlineScript.schema = emptySchema() + } + await inferInlineScriptSchema(inlineScript?.language, e.detail, inlineScript.schema) + if (JSON.stringify(inlineScript.schema) != oldSchema) { + inlineScript = inlineScript + syncFields() + } + } + // $app = $app + }} + args={Object.entries(fields ?? {}).reduce((acc, [key, obj]) => { + acc[key] = obj.type === 'static' ? obj.value : undefined + return acc + }, {})} + /> + + + {/if} +
+
+{/if} diff --git a/frontend/src/lib/components/raw_apps/RawAppInlineScriptPanelList.svelte b/frontend/src/lib/components/raw_apps/RawAppInlineScriptPanelList.svelte new file mode 100644 index 0000000000..8bece2ea3a --- /dev/null +++ b/frontend/src/lib/components/raw_apps/RawAppInlineScriptPanelList.svelte @@ -0,0 +1,90 @@ + + + + +
+ { + dispatch('hidePanel') + }} + /> + + +
+
+
+
+
+ {#if Object.keys($runnables ?? {}).length > 0} + {#each Object.entries($runnables ?? {}) as [id, runnable]} + {#if runnable} + + {/if} + {/each} + {:else} +
No backend runnable
+ {/if} +
+
+
+
+ + diff --git a/frontend/src/lib/components/raw_apps/RawAppInlineScriptRunnable.svelte b/frontend/src/lib/components/raw_apps/RawAppInlineScriptRunnable.svelte new file mode 100644 index 0000000000..1c96d7b9c9 --- /dev/null +++ b/frontend/src/lib/components/raw_apps/RawAppInlineScriptRunnable.svelte @@ -0,0 +1,214 @@ + + + +{#if runnable?.type == 'runnableByPath' || (runnable?.type == 'runnableByName' && runnable.inlineScript)} + + + {#if runnable?.type === 'runnableByName' && runnable.inlineScript} + {#if runnable.inlineScript.language == 'frontend'} +
Frontend scripts not supported for raw apps
+ {:else} + + dispatch('createScriptFromInlineScript', runnable)} + {id} + bind:inlineScript={runnable.inlineScript} + bind:name={runnable.name} + bind:fields={runnable.fields} + isLoading={testIsLoading} + onRun={testPreview} + onCancel={async () => { + if (testJobLoader) { + await testJobLoader.cancelJob() + } + }} + on:delete + path={appPath} + /> + {/if} + {:else if runnable?.type == 'runnableByPath'} + fork(e.detail)} + on:delete + {id} + isLoading={testIsLoading} + onRun={testPreview} + onCancel={async () => { + if (testJobLoader) { + await testJobLoader.cancelJob() + } + }} + /> + {/if} +
+ + + Inputs + Test + + {#if selectedTab == 'inputs'} + {#if runnable?.fields} +
+ {#each Object.keys(runnable.fields) as k} + {@const meta = runnable.fields[k]} + + {/each} +
+ {:else} +
No inputs
+ {/if} + {:else if selectedTab == 'test'} + + + +
+ v.type == 'static') + .map(([k]) => k)} + schema={getSchema(runnable)} + bind:args + shouldCapitalize + /> +
+
+ + + +
+
+ {/if} +
+
+
+
+{:else} + onPick(e.detail)} + on:delete + showScriptPicker + on:new={(e) => { + runnable = { + type: 'runnableByName', + inlineScript: e.detail, + name: runnable?.name ?? 'Background Runnable' + } + }} + /> +{/if} diff --git a/frontend/src/lib/components/raw_apps/RawAppInlineScriptsPanel.svelte b/frontend/src/lib/components/raw_apps/RawAppInlineScriptsPanel.svelte new file mode 100644 index 0000000000..b3c00b5cc6 --- /dev/null +++ b/frontend/src/lib/components/raw_apps/RawAppInlineScriptsPanel.svelte @@ -0,0 +1,61 @@ + + + + + + + + {#if !selectedRunnable} +
+ Select a runnable on the left panel +
+ {:else if $runnables?.[selectedRunnable]} + {#key selectedRunnable} + { + createScriptFromInlineScript( + selectedRunnable ?? '', + e.detail, + $workspaceStore ?? '', + appPath + ) + }} + on:delete={() => { + runnables.update((runnables) => { + if (selectedRunnable) { + delete runnables[selectedRunnable] + } + selectedRunnable = undefined + return { ...runnables } + }) + }} + id={selectedRunnable} + bind:runnable={$runnables[selectedRunnable]} + />{/key} + {:else} +
+ No runnable at id {selectedRunnable} +
+ {/if} +
+
diff --git a/frontend/src/lib/components/raw_apps/RawAppInputsSpecEditor.svelte b/frontend/src/lib/components/raw_apps/RawAppInputsSpecEditor.svelte new file mode 100644 index 0000000000..7160917bcb --- /dev/null +++ b/frontend/src/lib/components/raw_apps/RawAppInputsSpecEditor.svelte @@ -0,0 +1,113 @@ + + +{#if !(resourceOnly && (fieldType !== 'object' || !format?.startsWith('resource-')))} +
+
+
+
+ + {customTitle + ? customTitle + : shouldCapitalize + ? capitalize(addWhitespaceBeforeCapitals(key)) + : key} + + {#if loading} + + {/if} + {#if tooltip || markdownTooltip} + + {tooltip} + + {/if} +
+ {#if displayType} +
+ {fieldType === 'array' && subFieldType + ? `${fieldTypeToTsType(subFieldType)}[]` + : fieldTypeToTsType(fieldType)} +
+ {/if} +
+ +
+ {#if componentInput?.type && allowTypeChange !== false} + + + + + {/if} +
+
+ + {#if componentInput?.type === 'static'} +
+ +
+ {:else if componentInput?.type === 'user' || componentInput?.type == undefined} + Field's value is a frontend input + {/if} + {#if componentInput?.type === 'user' && ((fieldType == 'object' && format?.startsWith('resource-') && format !== 'resource-s3_object') || fieldType == 'resource')} +
+ + Apps are executed on behalf of publishers. If you want to accept resources from user, you + need to enable this (potentially dangerous!) +
+ {/if} +
+{/if} diff --git a/frontend/src/lib/components/raw_apps/RawAppPreview.svelte b/frontend/src/lib/components/raw_apps/RawAppPreview.svelte new file mode 100644 index 0000000000..4957a520ba --- /dev/null +++ b/frontend/src/lib/components/raw_apps/RawAppPreview.svelte @@ -0,0 +1,23 @@ + + + + + From 5bca8f60e970cc67839edb5dc491685f36cf0499 Mon Sep 17 00:00:00 2001 From: Diego Imbert <70353967+diegoimbert@users.noreply.github.com> Date: Mon, 21 Apr 2025 14:46:28 +0200 Subject: [PATCH 259/739] fix: improve MySQL datetime parser timezone handling (WIN-1155) (#5645) * fix mysql datetime parser for non tz dates * static regexes --- backend/windmill-worker/src/mysql_executor.rs | 34 +++++++++++++------ 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/backend/windmill-worker/src/mysql_executor.rs b/backend/windmill-worker/src/mysql_executor.rs index a1309395a7..7148e7b961 100644 --- a/backend/windmill-worker/src/mysql_executor.rs +++ b/backend/windmill-worker/src/mysql_executor.rs @@ -6,8 +6,10 @@ use itertools::Itertools; use mysql_async::{ consts::ColumnType, prelude::*, FromValueError, OptsBuilder, Params, Row, SslOpts, }; +use once_cell::sync::Lazy; use serde::{Deserialize, Serialize}; use serde_json::{json, value::RawValue, Value}; +use std::str::FromStr; use tokio::sync::Mutex; use windmill_common::{ error::{to_anyhow, Error}, @@ -303,26 +305,38 @@ pub async fn do_mysql( return Ok(raw_result); } +// 2023-12-01T16:18:00.000Z +static DATE_REGEX_TZ: Lazy = Lazy::new(|| { + regex::Regex::new(r"(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})\.(\d+)Z").unwrap() +}); +// 2025-04-21 10:08:00 +static DATE_REGEX: Lazy = + Lazy::new(|| regex::Regex::new(r"(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})").unwrap()); + fn string_date_to_mysql_date(s: &str) -> mysql_async::Value { - // 2023-12-01T16:18:00.000Z - let re = regex::Regex::new(r"(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})\.(\d+)Z").unwrap(); - let caps = re.captures(s); + let caps = DATE_REGEX_TZ.captures(s).or_else(|| DATE_REGEX.captures(s)); if let Some(caps) = caps { mysql_async::Value::Date( - caps.get(1).unwrap().as_str().parse().unwrap_or_default(), - caps.get(2).unwrap().as_str().parse().unwrap_or_default(), - caps.get(3).unwrap().as_str().parse().unwrap_or_default(), - caps.get(4).unwrap().as_str().parse().unwrap_or_default(), - caps.get(5).unwrap().as_str().parse().unwrap_or_default(), - caps.get(6).unwrap().as_str().parse().unwrap_or_default(), - caps.get(7).unwrap().as_str().parse().unwrap_or_default(), + get_capture_by_index(&caps, 1), + get_capture_by_index(&caps, 2), + get_capture_by_index(&caps, 3), + get_capture_by_index(&caps, 4), + get_capture_by_index(&caps, 5), + get_capture_by_index(&caps, 6), + get_capture_by_index(&caps, 7), ) } else { mysql_async::Value::Date(0, 0, 0, 0, 0, 0, 0) } } +fn get_capture_by_index(caps: ®ex::Captures, n: usize) -> T { + caps.get(n) + .and_then(|s| s.as_str().parse::().ok()) + .unwrap_or_default() +} + fn convert_row_to_value(row: Row) -> serde_json::Value { let mut map = serde_json::Map::new(); From 2620300ce9f2d432451e06d7461a4c2c7f7764c8 Mon Sep 17 00:00:00 2001 From: Alexander Petric Date: Mon, 21 Apr 2025 10:26:28 -0400 Subject: [PATCH 260/739] AWS cloudformation quicklaunch (#5650) --- .../deploy/aws-eks-cloudformation/README.md | 46 ++ .../aws-eks-cloudformation/quicklaunch.yaml | 688 ++++++++++++++++++ 2 files changed, 734 insertions(+) create mode 100644 examples/deploy/aws-eks-cloudformation/README.md create mode 100644 examples/deploy/aws-eks-cloudformation/quicklaunch.yaml diff --git a/examples/deploy/aws-eks-cloudformation/README.md b/examples/deploy/aws-eks-cloudformation/README.md new file mode 100644 index 0000000000..16c1a372eb --- /dev/null +++ b/examples/deploy/aws-eks-cloudformation/README.md @@ -0,0 +1,46 @@ +# windmill-cloudformation +Cloudformation Template for Windmill on AWS EKS + +## Overview + +This CloudFormation template automatically deploys Windmill on AWS EKS. The deployment includes: + +- An EKS cluster with configurable node types and sizes +- An RDS PostgreSQL database for Windmill data +- AWS Load Balancer Controller for handling ingress traffic +- Proper network configuration with VPC, subnets, and security groups +- A fully automated installation of Windmill via Helm + +## Parameters + +The template accepts various parameters to customize your deployment: + +- **NodeInstanceType**: EC2 instance type for EKS worker nodes (t3.small to r5.2xlarge) +- **NodeGroupSize**: Number of EKS worker nodes +- **RdsInstanceClass**: RDS instance class for the PostgreSQL database (db.t3.micro to db.r5.2xlarge) +- **DBPassword**: Password for the PostgreSQL database +- **WorkerReplicas**: Number of Windmill worker replicas +- **NativeWorkerReplicas**: Number of Windmill native worker replicas +- **Enterprise**: Enable Windmill [Enterprise features](https://www.windmill.dev/docs/misc/plans_details#upgrading-to-enterprise-edition) (requires license key) + +## Customization + +To modify the Helm chart configuration or update the template, refer to the official Windmill Helm chart repository: +[https://github.com/windmill-labs/windmill-helm-charts](https://github.com/windmill-labs/windmill-helm-charts) + +## Documentation + +For more information about Windmill's Helm chart deployment options, see: +[https://www.windmill.dev/docs/advanced/self_host#helm-chart](https://www.windmill.dev/docs/advanced/self_host#helm-chart) + +For detailed information about setting up RDS for Windmill on AWS: +[https://www.windmill.dev/docs/advanced/self_host/aws_ecs#create-a-rds-database](https://www.windmill.dev/docs/advanced/self_host/aws_ecs#create-a-rds-database) + +## Deployment + +1. Upload the CloudFormation template to your AWS account +2. Fill in the required parameters +3. Deploy the stack +4. Access Windmill using the URL provided in the Outputs section of the stack + +After deployment, you can access Windmill via the LoadBalancer URL shown in the CloudFormation stack outputs. diff --git a/examples/deploy/aws-eks-cloudformation/quicklaunch.yaml b/examples/deploy/aws-eks-cloudformation/quicklaunch.yaml new file mode 100644 index 0000000000..3dda495ebe --- /dev/null +++ b/examples/deploy/aws-eks-cloudformation/quicklaunch.yaml @@ -0,0 +1,688 @@ +AWSTemplateFormatVersion: "2010-09-09" +Description: Deploy Windmill on EKS with Helm + +Parameters: + NodeInstanceType: + Type: String + Default: t3.medium + AllowedValues: + - t3.small + - t3.medium + - t3.large + - t3.xlarge + - t3.2xlarge + - m5.large + - m5.xlarge + - m5.2xlarge + - m5.4xlarge + - c5.large + - c5.xlarge + - c5.2xlarge + - r5.large + - r5.xlarge + - r5.2xlarge + Description: EC2 instance type for the EKS worker nodes + NodeGroupSize: + Type: Number + Default: 2 + RdsInstanceClass: + Type: String + Default: db.t3.small + AllowedValues: + - db.t3.micro + - db.t3.small + - db.t3.medium + - db.t3.large + - db.t3.xlarge + - db.m5.large + - db.m5.xlarge + - db.m5.2xlarge + - db.r5.large + - db.r5.xlarge + - db.r5.2xlarge + Description: RDS instance class for the PostgreSQL database + DBPassword: + Type: String + NoEcho: true + WorkerReplicas: + Type: Number + Default: 2 + NativeWorkerReplicas: + Type: Number + Default: 1 + Enterprise: + Type: String + Default: false + AllowedValues: + - true + - false + Description: Enable Windmill Enterprise features (requires license key) + +Mappings: + RegionMap: + us-east-1: + AMI: ami-0cff7528ff583bf9a + us-east-2: + AMI: ami-0cd3c7f72edd5b06d + us-west-1: + AMI: ami-0d9858aa3c6322f73 + us-west-2: + AMI: ami-098e42ae54c764c35 + ca-central-1: + AMI: ami-00f881f027a6d74a0 + eu-west-1: + AMI: ami-04dd4500af104442f + eu-west-2: + AMI: ami-0eb260c4d5475b901 + eu-west-3: + AMI: ami-05e8e20cef0eaa9d0 + eu-central-1: + AMI: ami-0bad4a5e987bdebde + ap-northeast-1: + AMI: ami-0b7546e839d7ace12 + ap-northeast-2: + AMI: ami-0fd0765afb77bcca7 + ap-southeast-1: + AMI: ami-0c802847a7dd848c0 + ap-southeast-2: + AMI: ami-07620139298af599e + ap-south-1: + AMI: ami-0851b76e8b1bce90b + sa-east-1: + AMI: ami-054a31f1b3bf90920 + +Resources: + VPC: + Type: AWS::EC2::VPC + Properties: + CidrBlock: 10.0.0.0/16 + EnableDnsSupport: true + EnableDnsHostnames: true + Tags: + - Key: Name + Value: !Sub "${AWS::StackName}-vpc" + - Key: !Sub "kubernetes.io/cluster/${AWS::StackName}-cluster" + Value: shared + + InternetGateway: + Type: AWS::EC2::InternetGateway + + AttachGateway: + Type: AWS::EC2::VPCGatewayAttachment + Properties: + VpcId: !Ref VPC + InternetGatewayId: !Ref InternetGateway + + PublicSubnet1: + Type: AWS::EC2::Subnet + Properties: + VpcId: !Ref VPC + CidrBlock: 10.0.1.0/24 + AvailabilityZone: !Select [0, !GetAZs ""] + MapPublicIpOnLaunch: true + Tags: + - Key: kubernetes.io/role/elb + Value: "1" + - Key: !Sub "kubernetes.io/cluster/${AWS::StackName}-cluster" + Value: shared + - Key: Name + Value: !Sub ${AWS::StackName}-public-subnet-1 + + PublicSubnet2: + Type: AWS::EC2::Subnet + Properties: + VpcId: !Ref VPC + CidrBlock: 10.0.2.0/24 + AvailabilityZone: !Select [1, !GetAZs ""] + MapPublicIpOnLaunch: true + Tags: + - Key: kubernetes.io/role/elb + Value: "1" + - Key: !Sub "kubernetes.io/cluster/${AWS::StackName}-cluster" + Value: shared + - Key: Name + Value: !Sub ${AWS::StackName}-public-subnet-2 + + RouteTable: + Type: AWS::EC2::RouteTable + Properties: + VpcId: !Ref VPC + + PublicRoute: + Type: AWS::EC2::Route + DependsOn: AttachGateway + Properties: + RouteTableId: !Ref RouteTable + DestinationCidrBlock: 0.0.0.0/0 + GatewayId: !Ref InternetGateway + + SubnetRouteTableAssociation1: + Type: AWS::EC2::SubnetRouteTableAssociation + DependsOn: PublicRoute + Properties: + SubnetId: !Ref PublicSubnet1 + RouteTableId: !Ref RouteTable + + SubnetRouteTableAssociation2: + Type: AWS::EC2::SubnetRouteTableAssociation + DependsOn: PublicRoute + Properties: + SubnetId: !Ref PublicSubnet2 + RouteTableId: !Ref RouteTable + + EKSClusterRole: + Type: AWS::IAM::Role + Properties: + AssumeRolePolicyDocument: + Version: "2012-10-17" + Statement: + - Effect: Allow + Principal: + Service: + - eks.amazonaws.com + - ec2.amazonaws.com + Action: + - sts:AssumeRole + ManagedPolicyArns: + - arn:aws:iam::aws:policy/AmazonEKSClusterPolicy + - arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy + Policies: + - PolicyName: EKSAccess + PolicyDocument: + Version: "2012-10-17" + Statement: + - Effect: Allow + Action: + - eks:* + - ec2:DescribeInstances + - ec2:DescribeRouteTables + - ec2:DescribeSecurityGroups + - ec2:DescribeSubnets + - ec2:DescribeVpcs + - iam:GetRole + - iam:ListRoles + Resource: "*" + - Effect: Allow + Action: + - ssm:GetParameter + - ssm:PutParameter + Resource: !Sub "arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter/${AWS::StackName}/*" + - PolicyName: KubernetesAccess + PolicyDocument: + Version: "2012-10-17" + Statement: + - Effect: Allow + Action: + - eks:DescribeCluster + - eks:ListClusters + - eks:AccessKubernetesApi + Resource: !Sub "arn:aws:eks:${AWS::Region}:${AWS::AccountId}:cluster/${AWS::StackName}-cluster" + + EKSNodeRole: + Type: AWS::IAM::Role + Properties: + AssumeRolePolicyDocument: + Version: "2012-10-17" + Statement: + - Effect: Allow + Principal: + Service: + - ec2.amazonaws.com + Action: + - sts:AssumeRole + ManagedPolicyArns: + - arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy + - arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly + - arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy + + EKSCluster: + Type: AWS::EKS::Cluster + Properties: + Name: !Sub "${AWS::StackName}-cluster" + RoleArn: !GetAtt EKSClusterRole.Arn + ResourcesVpcConfig: + SubnetIds: + - !Ref PublicSubnet1 + - !Ref PublicSubnet2 + EndpointPublicAccess: true + AccessConfig: + AuthenticationMode: API_AND_CONFIG_MAP + BootstrapClusterCreatorAdminPermissions: true + DependsOn: + - PublicRoute + - VPCCleanup + + EKSClusterAccess: + Type: AWS::EKS::AccessEntry + Properties: + ClusterName: !Ref EKSCluster + PrincipalArn: !GetAtt EKSClusterRole.Arn + Type: STANDARD + Username: admin + AccessPolicies: + - PolicyArn: arn:aws:eks::aws:cluster-access-policy/AmazonEKSClusterAdminPolicy + AccessScope: + Type: cluster + + EKSNodeGroup: + Type: AWS::EKS::Nodegroup + DependsOn: + - WindmillDB + - EKSCluster + Properties: + ClusterName: !Ref EKSCluster + NodeRole: !GetAtt EKSNodeRole.Arn + Subnets: + - !Ref PublicSubnet1 + - !Ref PublicSubnet2 + ScalingConfig: + MinSize: 1 + DesiredSize: !Ref NodeGroupSize + MaxSize: 4 + InstanceTypes: + - !Ref NodeInstanceType + + WindmillDBSubnetGroup: + Type: AWS::RDS::DBSubnetGroup + Properties: + DBSubnetGroupDescription: Subnet group for RDS instance + SubnetIds: + - !Ref PublicSubnet1 + - !Ref PublicSubnet2 + + WindmillDBSecurityGroup: + Type: AWS::EC2::SecurityGroup + Properties: + GroupDescription: Allow PostgreSQL access from EKS nodes + VpcId: !Ref VPC + SecurityGroupIngress: + - IpProtocol: tcp + FromPort: 5432 + ToPort: 5432 + CidrIp: 10.0.0.0/16 + + WindmillDB: + Type: AWS::RDS::DBInstance + Properties: + DBInstanceIdentifier: !Sub "${AWS::StackName}-db" + AllocatedStorage: 20 + DBInstanceClass: !Ref RdsInstanceClass + Engine: postgres + EngineVersion: 17.2 + MasterUsername: postgres + MasterUserPassword: !Ref DBPassword + DBName: windmill + PubliclyAccessible: false + DBSubnetGroupName: !Ref WindmillDBSubnetGroup + VPCSecurityGroups: + - !Ref WindmillDBSecurityGroup + DependsOn: + - WindmillDBSubnetGroup + + WindmillInstallerInstanceProfile: + Type: AWS::IAM::InstanceProfile + Properties: + Roles: + - !Ref EKSClusterRole + + WindmillInstallerSecurityGroup: + Type: AWS::EC2::SecurityGroup + Properties: + GroupDescription: Security group for Windmill installer instance + VpcId: !Ref VPC + SecurityGroupEgress: + - IpProtocol: -1 + FromPort: -1 + ToPort: -1 + CidrIp: 0.0.0.0/0 + + WindmillInstaller: + Type: AWS::EC2::Instance + CreationPolicy: + ResourceSignal: + Timeout: PT30M # Gives 30 minutes for the installation to complete + DependsOn: + - EKSNodeGroup + - WindmillDB + Properties: + ImageId: !FindInMap [RegionMap, !Ref "AWS::Region", AMI] + InstanceType: t3.micro + IamInstanceProfile: !Ref WindmillInstallerInstanceProfile + SubnetId: !Ref PublicSubnet1 + SecurityGroupIds: + - !Ref WindmillInstallerSecurityGroup + UserData: + Fn::Base64: !Sub | + #!/bin/bash + set -e # Exit on any error + + # Install required tools + yum update -y + yum install -y aws-cli jq postgresql15 aws-cfn-bootstrap + + # Set up logging directory with correct permissions + mkdir -p /var/log/windmill-installer + touch /var/log/windmill-installer/install.log + + # Create installation directory + mkdir -p /opt/windmill-installer + + # Install kubectl + curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" + chmod +x kubectl + mv kubectl /usr/local/bin/ + + # Install helm + curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 + chmod +x get_helm.sh + ./get_helm.sh + + # Create the installation script + cat << 'EOF' > /opt/windmill-installer/install.sh + #!/bin/bash + set -e + + # Configure kubectl + aws sts get-caller-identity > /dev/null + export AWS_SDK_LOAD_CONFIG=1 + export KUBECONFIG=/root/.kube/config + aws eks update-kubeconfig --name ${AWS::StackName}-cluster --region ${AWS::Region} + + # Add debugging for each kubectl attempt + echo "HOME: $HOME" + echo "KUBECONFIG: $KUBECONFIG" + echo "User: $(whoami)" + echo "AWS Identity: $(aws sts get-caller-identity)" + echo "Trying kubectl command..." + kubectl get nodes || echo "Command failed with status $?" + + echo "Waiting for EKS nodes to be ready..." + while true; do + # Force credential refresh on each attempt + aws sts get-caller-identity > /dev/null + aws eks update-kubeconfig --name ${AWS::StackName}-cluster --region ${AWS::Region} + + if kubectl get nodes &>/dev/null; then + READY_NODES=$(kubectl get nodes -o json | jq -r '.items[] | select(.status.conditions[] | select(.type=="Ready" and .status=="True")) | .metadata.name' | wc -l) + DESIRED_NODES=${NodeGroupSize} + if [ "$READY_NODES" -eq "$DESIRED_NODES" ]; then + echo "All nodes are ready" + break + fi + echo "Found $READY_NODES ready nodes out of $DESIRED_NODES desired nodes" + else + echo "Waiting for cluster access..." + fi + sleep 30 + done + + echo "Installing AWS Load Balancer Controller..." + # Install AWS Load Balancer Controller + helm repo add eks https://aws.github.io/eks-charts + helm repo update + + helm install aws-load-balancer-controller eks/aws-load-balancer-controller \ + -n kube-system \ + --set clusterName=${AWS::StackName}-cluster \ + --set region=${AWS::Region} \ + --set vpcId=${VPC} + + echo "Waiting for AWS Load Balancer Controller to be ready..." + kubectl wait --namespace kube-system \ + --for=condition=ready pod \ + --selector=app.kubernetes.io/name=aws-load-balancer-controller \ + --timeout=300s + + echo "Waiting for RDS to be available..." + while true; do + if pg_isready -h ${WindmillDB.Endpoint.Address} -p 5432 -U postgres 2>/dev/null; then + echo "Database is ready" + break + fi + echo "Database not ready yet..." + sleep 30 + done + + echo "Creating namespace and installing Windmill..." + kubectl create namespace windmill + + # Add helm repo and install Windmill + helm repo add windmill https://windmill-labs.github.io/windmill-helm-charts + helm repo update + + helm install ${AWS::StackName} windmill/windmill \ + --namespace windmill \ + --set windmill.databaseUrl="postgres://postgres:${DBPassword}@${WindmillDB.Endpoint.Address}/windmill?sslmode=require" \ + --set windmill.baseDomain=windmill.local \ + --set windmill.baseProtocol=http \ + --set windmill.appReplicas=${WorkerReplicas} \ + --set windmill.lspReplicas=2 \ + --set windmill.workerGroups[0].name=default \ + --set windmill.workerGroups[0].mode=worker \ + --set windmill.workerGroups[0].replicas=${WorkerReplicas} \ + --set windmill.workerGroups[1].name=native \ + --set windmill.workerGroups[1].mode=worker \ + --set windmill.workerGroups[1].replicas=${NativeWorkerReplicas} \ + --set windmill.app.service.spec.type=LoadBalancer \ + --set windmill.app.service.spec.sessionAffinity=None \ + --set windmill.app.service.port=8000 \ + --set windmill.app.service.ports[0].port=8000 \ + --set windmill.app.service.ports[0].targetPort=8000 \ + --set windmill.app.service.ports[0].protocol=TCP \ + --set postgresql.enabled=false \ + --set enterprise.enabled=${Enterprise} + + # Change service to LoadBalancer + echo "Changing service to LoadBalancer" + kubectl patch service windmill-app -n windmill -p '{"spec":{"type":"LoadBalancer","sessionAffinity":"None"}}' + kubectl patch service windmill-app -n windmill -p '{"spec":{"ports":[{"name":"api","port":8000,"targetPort":8000,"protocol":"TCP"},{"name":"http","port":80,"targetPort":8000,"protocol":"TCP"}]}}' + + # Wait for LoadBalancer to get an address + echo "Waiting for LoadBalancer address..." + while true; do + LB_HOSTNAME=$(kubectl get svc -n windmill windmill-app -o jsonpath='{.status.loadBalancer.ingress[0].hostname}' 2>/dev/null) + if [ ! -z "$LB_HOSTNAME" ]; then + break + fi + echo "Waiting for LoadBalancer hostname..." + sleep 30 + done + + # Store the LoadBalancer hostname in SSM + aws ssm put-parameter \ + --region ${AWS::Region} \ + --name "/${AWS::StackName}/loadbalancer-hostname" \ + --value "$LB_HOSTNAME" \ + --type "String" \ + --overwrite + + # Signal CloudFormation that installation is complete + echo "Signal CloudFormation that installation is complete" + /opt/aws/bin/cfn-signal -e $? \ + --stack ${AWS::StackName} \ + --resource WindmillInstaller \ + --region ${AWS::Region} + + # Self-terminate this instance + echo "Self-terminating instance" + aws ec2 terminate-instances --instance-ids $(curl -s http://169.254.169.254/latest/meta-data/instance-id) --region ${AWS::Region} + EOF + + # Set permissions and run the installation script + chmod +x /opt/windmill-installer/install.sh + + # Run the installation script directly (not as ec2-user) + cd /opt/windmill-installer && ./install.sh > /var/log/windmill-installer/install.log 2>&1 + + LoadBalancerHostnameLookup: + Type: Custom::SSMParameterLookup + DependsOn: WindmillInstaller + Properties: + ServiceToken: !GetAtt LookupSSMParameterFunction.Arn + ParameterName: !Sub "/${AWS::StackName}/loadbalancer-hostname" + + LookupSSMParameterFunction: + Type: AWS::Lambda::Function + Properties: + Handler: index.handler + Role: !GetAtt LambdaExecutionRole.Arn + Timeout: 300 + Runtime: nodejs18.x + Code: + ZipFile: !Sub | + const { SSMClient, GetParameterCommand } = require('@aws-sdk/client-ssm'); + const response = require('cfn-response'); + + exports.handler = async (event, context) => { + if (event.RequestType === 'Delete') { + return response.send(event, context, response.SUCCESS); + } + + try { + const ssmClient = new SSMClient(); + + // Loop to check for the parameter until it's not "pending" + let tries = 0; + let paramValue = "pending"; + + while (paramValue === "pending" && tries < 20) { + const params = { + Name: event.ResourceProperties.ParameterName, + WithDecryption: false + }; + + const result = await ssmClient.send(new GetParameterCommand(params)); + paramValue = result.Parameter.Value; + + if (paramValue === "pending") { + await new Promise(resolve => setTimeout(resolve, 15000)); // wait 15 seconds + tries++; + } + } + + return response.send(event, context, response.SUCCESS, { + HostnameValue: paramValue + }); + } catch (error) { + console.error(error); + return response.send(event, context, response.FAILED, { error: error.message }); + } + }; + + LambdaExecutionRole: + Type: AWS::IAM::Role + Properties: + AssumeRolePolicyDocument: + Version: "2012-10-17" + Statement: + - Effect: Allow + Principal: + Service: lambda.amazonaws.com + Action: sts:AssumeRole + ManagedPolicyArns: + - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole + Policies: + - PolicyName: SSMParameterAccess + PolicyDocument: + Version: "2012-10-17" + Statement: + - Effect: Allow + Action: + - ssm:GetParameter + Resource: !Sub "arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter/${AWS::StackName}/*" + + VPCCleanupFunction: + Type: AWS::Lambda::Function + Properties: + Handler: index.handler + Role: !GetAtt VPCCleanupRole.Arn + Timeout: 300 + Runtime: nodejs18.x + Code: + ZipFile: | + const { ElasticLoadBalancingClient, DescribeLoadBalancersCommand, + DeleteLoadBalancerCommand } = require('@aws-sdk/client-elastic-load-balancing'); + const response = require('cfn-response'); + + exports.handler = async (event, context) => { + if (event.RequestType !== 'Delete') { + return response.send(event, context, response.SUCCESS); + } + + try { + const elb = new ElasticLoadBalancingClient(); + const vpcId = event.ResourceProperties.VpcId; + + // Find and delete Classic Load Balancers in the VPC + const lbResponse = await elb.send(new DescribeLoadBalancersCommand({})); + let deleted = false; + + for (const lb of lbResponse.LoadBalancerDescriptions || []) { + if (lb.VPCId === vpcId) { + console.log(`Deleting Classic Load Balancer: ${lb.LoadBalancerName}`); + await elb.send(new DeleteLoadBalancerCommand({ + LoadBalancerName: lb.LoadBalancerName + })); + deleted = true; + } + } + + if (deleted) { + // Wait for deletion to complete + console.log('Waiting 30 seconds for load balancer deletion to complete...'); + await new Promise(r => setTimeout(r, 30000)); + } + + return response.send(event, context, response.SUCCESS); + } catch (error) { + console.error('Error deleting load balancers:', error); + return response.send(event, context, response.FAILED, {error: error.message}); + } + }; + + VPCCleanupRole: + Type: AWS::IAM::Role + Properties: + AssumeRolePolicyDocument: + Version: "2012-10-17" + Statement: + - Effect: Allow + Principal: + Service: lambda.amazonaws.com + Action: sts:AssumeRole + ManagedPolicyArns: + - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole + Policies: + - PolicyName: VPCCleanupPolicy + PolicyDocument: + Version: "2012-10-17" + Statement: + - Effect: Allow + Action: + - ec2:DescribeAddresses + - ec2:DisassociateAddress + - ec2:DescribeNetworkInterfaces + - elasticloadbalancing:DescribeLoadBalancers + - elasticloadbalancing:DeleteLoadBalancer + - elasticloadbalancingv2:DescribeLoadBalancers + - elasticloadbalancingv2:DeleteLoadBalancer + Resource: "*" + + VPCCleanup: + Type: Custom::VPCCleanup + Properties: + ServiceToken: !GetAtt VPCCleanupFunction.Arn + VpcId: !Ref VPC + +Outputs: + ClusterName: + Description: EKS cluster name + Value: !Sub "${AWS::StackName}-cluster" + + DatabaseEndpoint: + Description: RDS instance endpoint + Value: !GetAtt WindmillDB.Endpoint.Address + + LoadBalancerHostname: + Description: Windmill LoadBalancer hostname + Value: !Sub "http://${LoadBalancerHostnameLookup.HostnameValue}" From 42514f2b1d014996b1fb9131881716e19d9f9331 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Mon, 21 Apr 2025 16:45:13 +0200 Subject: [PATCH 261/739] add event handlers to more components --- .../components/inputs/AppDateInput.svelte | 10 ++- .../components/inputs/AppDateTimeInput.svelte | 11 +++- .../components/inputs/AppNumberInput.svelte | 11 +++- .../components/inputs/AppTextInput.svelte | 18 +++++- .../components/inputs/AppTimeInput.svelte | 10 ++- .../editor/component/ComponentInner.svelte | 8 +++ .../apps/editor/component/components.ts | 64 ++++++++++++++----- .../editor/settingsPanel/EventHandlers.svelte | 22 ++++++- 8 files changed, 127 insertions(+), 27 deletions(-) diff --git a/frontend/src/lib/components/apps/components/inputs/AppDateInput.svelte b/frontend/src/lib/components/apps/components/inputs/AppDateInput.svelte index a17cb29ce2..4544432ae2 100644 --- a/frontend/src/lib/components/apps/components/inputs/AppDateInput.svelte +++ b/frontend/src/lib/components/apps/components/inputs/AppDateInput.svelte @@ -17,8 +17,9 @@ export let verticalAlignment: 'top' | 'center' | 'bottom' | undefined = undefined export let customCss: ComponentCustomCSS<'dateinputcomponent'> | undefined = undefined export let render: boolean + export let onChange: string[] | undefined = undefined - const { app, worldStore, selectedComponent, componentControl } = + const { app, worldStore, selectedComponent, componentControl, runnableComponents } = getContext('AppViewerContext') let resolvedConfig = initConfig( @@ -64,6 +65,13 @@ } else { outputs?.result.set(undefined) } + fireOnChange() + } + + function fireOnChange() { + if (onChange) { + onChange.forEach((id) => $runnableComponents?.[id]?.cb?.forEach((cb) => cb())) + } } function handleDefault(defaultValue: string | undefined) { diff --git a/frontend/src/lib/components/apps/components/inputs/AppDateTimeInput.svelte b/frontend/src/lib/components/apps/components/inputs/AppDateTimeInput.svelte index 276d542b79..5c8f3f77b3 100644 --- a/frontend/src/lib/components/apps/components/inputs/AppDateTimeInput.svelte +++ b/frontend/src/lib/components/apps/components/inputs/AppDateTimeInput.svelte @@ -25,8 +25,8 @@ export let verticalAlignment: VerticalAlignment | undefined = undefined export let customCss: ComponentCustomCSS<'datetimeinputcomponent'> | undefined = undefined export let render: boolean - - const { app, worldStore, componentControl, selectedComponent } = + export let onChange: string[] | undefined = undefined + const { app, worldStore, componentControl, selectedComponent, runnableComponents } = getContext('AppViewerContext') const iterContext = getContext('ListWrapperContext') @@ -119,6 +119,13 @@ listInputs.set(id, undefined) } } + fireOnChange() + } + + function fireOnChange() { + if (onChange) { + onChange.forEach((id) => $runnableComponents?.[id]?.cb?.forEach((cb) => cb())) + } } function handleDefault(defaultValue: string | undefined) { diff --git a/frontend/src/lib/components/apps/components/inputs/AppNumberInput.svelte b/frontend/src/lib/components/apps/components/inputs/AppNumberInput.svelte index 567094e224..0022fa0885 100644 --- a/frontend/src/lib/components/apps/components/inputs/AppNumberInput.svelte +++ b/frontend/src/lib/components/apps/components/inputs/AppNumberInput.svelte @@ -21,8 +21,8 @@ export let verticalAlignment: 'top' | 'center' | 'bottom' | undefined = undefined export let customCss: ComponentCustomCSS<'numberinputcomponent'> | undefined = undefined export let render: boolean - - const { app, worldStore, selectedComponent, componentControl } = + export let onChange: string[] | undefined = undefined + const { app, worldStore, selectedComponent, componentControl, runnableComponents } = getContext('AppViewerContext') const iterContext = getContext('ListWrapperContext') const listInputs: ListInputs | undefined = getContext('ListInputs') @@ -61,6 +61,13 @@ if (iterContext && listInputs) { listInputs.set(id, value ?? undefined) } + fireOnChange() + } + + function fireOnChange() { + if (onChange) { + onChange.forEach((id) => $runnableComponents?.[id]?.cb?.forEach((cb) => cb())) + } } function handleDefault(defaultValue: number | undefined) { diff --git a/frontend/src/lib/components/apps/components/inputs/AppTextInput.svelte b/frontend/src/lib/components/apps/components/inputs/AppTextInput.svelte index 731ce20d07..9eba5c8323 100644 --- a/frontend/src/lib/components/apps/components/inputs/AppTextInput.svelte +++ b/frontend/src/lib/components/apps/components/inputs/AppTextInput.svelte @@ -28,9 +28,16 @@ | 'emailinputcomponent' | 'textareainputcomponent' = 'textinputcomponent' export let render: boolean + export let onChange: string[] | undefined = undefined - const { app, worldStore, selectedComponent, connectingInput, componentControl } = - getContext('AppViewerContext') + const { + app, + worldStore, + selectedComponent, + connectingInput, + componentControl, + runnableComponents + } = getContext('AppViewerContext') let resolvedConfig = initConfig( components['textinputcomponent'].initialData.configuration, @@ -70,6 +77,13 @@ if (iterContext && listInputs) { listInputs.set(id, val) } + fireOnChange() + } + + function fireOnChange() { + if (onChange) { + onChange.forEach((id) => $runnableComponents?.[id]?.cb?.forEach((cb) => cb())) + } } function handleDefault(defaultValue: string | undefined) { diff --git a/frontend/src/lib/components/apps/components/inputs/AppTimeInput.svelte b/frontend/src/lib/components/apps/components/inputs/AppTimeInput.svelte index 60a888113f..cfee4a193c 100644 --- a/frontend/src/lib/components/apps/components/inputs/AppTimeInput.svelte +++ b/frontend/src/lib/components/apps/components/inputs/AppTimeInput.svelte @@ -15,8 +15,9 @@ export let verticalAlignment: 'top' | 'center' | 'bottom' | undefined = undefined export let customCss: ComponentCustomCSS<'timeinputcomponent'> | undefined = undefined export let render: boolean + export let onChange: string[] | undefined = undefined - const { app, worldStore, selectedComponent, componentControl } = + const { app, worldStore, selectedComponent, componentControl, runnableComponents } = getContext('AppViewerContext') let resolvedConfig = initConfig( @@ -78,6 +79,13 @@ // At the end, set the validity outputs?.validity.set(isValid) } + fireOnChange() + } + + function fireOnChange() { + if (onChange) { + onChange.forEach((id) => $runnableComponents?.[id]?.cb?.forEach((cb) => cb())) + } } function handleDefault(defaultValue: string | undefined) { diff --git a/frontend/src/lib/components/apps/editor/component/ComponentInner.svelte b/frontend/src/lib/components/apps/editor/component/ComponentInner.svelte index acbe2d5b83..c69cd9f178 100644 --- a/frontend/src/lib/components/apps/editor/component/ComponentInner.svelte +++ b/frontend/src/lib/components/apps/editor/component/ComponentInner.svelte @@ -393,6 +393,7 @@ verticalAlignment={component.verticalAlignment} configuration={component.configuration} customCss={component.customCss} + onChange={component.onChange} {render} /> {:else if component.type === 'quillcomponent'} @@ -405,6 +406,7 @@ customCss={component.customCss} inputType="textarea" appCssKey="textareainputcomponent" + onChange={component.onChange} {render} /> {:else if component.type === 'emailinputcomponent'} @@ -415,6 +417,7 @@ appCssKey="emailinputcomponent" id={component.id} customCss={component.customCss} + onChange={component.onChange} {render} /> {:else if component.type === 'passwordinputcomponent'} @@ -425,6 +428,7 @@ appCssKey="passwordinputcomponent" id={component.id} customCss={component.customCss} + onChange={component.onChange} {render} /> {:else if component.type === 'dateinputcomponent'} @@ -434,6 +438,7 @@ inputType="date" id={component.id} customCss={component.customCss} + onChange={component.onChange} {render} /> {:else if component.type === 'timeinputcomponent'} @@ -442,6 +447,7 @@ configuration={component.configuration} id={component.id} customCss={component.customCss} + onChange={component.onChange} {render} /> {:else if component.type === 'datetimeinputcomponent'} @@ -451,6 +457,7 @@ inputType="date" id={component.id} customCss={component.customCss} + onChange={component.onChange} {render} /> {:else if component.type === 'numberinputcomponent'} @@ -459,6 +466,7 @@ configuration={component.configuration} id={component.id} customCss={component.customCss} + onChange={component.onChange} {render} /> {:else if component.type === 'currencycomponent'} diff --git a/frontend/src/lib/components/apps/editor/component/components.ts b/frontend/src/lib/components/apps/editor/component/components.ts index a0b99e4805..bc66fdab8f 100644 --- a/frontend/src/lib/components/apps/editor/component/components.ts +++ b/frontend/src/lib/components/apps/editor/component/components.ts @@ -91,21 +91,51 @@ export type CustomComponentConfig = { reactVersion?: string } } -export type TextComponent = BaseComponent<'textcomponent'> -export type TextInputComponent = BaseComponent<'textinputcomponent'> -export type QuillComponent = BaseComponent<'quillcomponent'> -export type CodeInputComponent = BaseComponent<'codeinputcomponent'> -export type TextareaInputComponent = BaseComponent<'textareainputcomponent'> -export type PasswordInputComponent = BaseComponent<'passwordinputcomponent'> -export type EmailInputComponent = BaseComponent<'emailinputcomponent'> -export type DateInputComponent = BaseComponent<'dateinputcomponent'> -export type TimeInputComponent = BaseComponent<'timeinputcomponent'> -export type DateTimeInputComponent = BaseComponent<'datetimeinputcomponent'> -export type NumberInputComponent = BaseComponent<'numberinputcomponent'> -export type CurrencyComponent = BaseComponent<'currencycomponent'> -export type SliderComponent = BaseComponent<'slidercomponent'> -export type DateSliderComponent = BaseComponent<'dateslidercomponent'> -export type RangeComponent = BaseComponent<'rangecomponent'> +export type TextComponent = BaseComponent<'textcomponent'> & { + onChange?: string[] +} +export type TextInputComponent = BaseComponent<'textinputcomponent'> & { + onChange?: string[] +} +export type QuillComponent = BaseComponent<'quillcomponent'> & { + onChange?: string[] +} +export type CodeInputComponent = BaseComponent<'codeinputcomponent'> & { + onChange?: string[] +} +export type TextareaInputComponent = BaseComponent<'textareainputcomponent'> & { + onChange?: string[] +} +export type PasswordInputComponent = BaseComponent<'passwordinputcomponent'> & { + onChange?: string[] +} +export type EmailInputComponent = BaseComponent<'emailinputcomponent'> & { + onChange?: string[] +} +export type DateInputComponent = BaseComponent<'dateinputcomponent'> & { + onChange?: string[] +} +export type TimeInputComponent = BaseComponent<'timeinputcomponent'> & { + onChange?: string[] +} +export type DateTimeInputComponent = BaseComponent<'datetimeinputcomponent'> & { + onChange?: string[] +} +export type NumberInputComponent = BaseComponent<'numberinputcomponent'> & { + onChange?: string[] +} +export type CurrencyComponent = BaseComponent<'currencycomponent'> & { + onChange?: string[] +} +export type SliderComponent = BaseComponent<'slidercomponent'> & { + onChange?: string[] +} +export type DateSliderComponent = BaseComponent<'dateslidercomponent'> & { + onChange?: string[] +} +export type RangeComponent = BaseComponent<'rangecomponent'> & { + onChange?: string[] +} export type HtmlComponent = BaseComponent<'htmlcomponent'> export type CustomComponent = BaseComponent<'customcomponent'> & { customComponent: CustomComponentConfig @@ -293,7 +323,9 @@ export type NavBarComponent = BaseComponent<'navbarcomponent'> & { navbarItems: NavbarItem[] } -export type DateSelectComponent = BaseComponent<'dateselectcomponent'> +export type DateSelectComponent = BaseComponent<'dateselectcomponent'> & { + onChange?: string[] +} export type RecomputeAllComponent = BaseComponent<'recomputeallcomponent'> diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/EventHandlers.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/EventHandlers.svelte index a048a4fb20..8a0e4acafc 100644 --- a/frontend/src/lib/components/apps/editor/settingsPanel/EventHandlers.svelte +++ b/frontend/src/lib/components/apps/editor/settingsPanel/EventHandlers.svelte @@ -23,7 +23,15 @@ 'conditionalwrapper', 'fileinputcomponent', 's3fileinputcomponent', - 'steppercomponent' + 'steppercomponent', + 'dateinputcomponent', + 'datetimeinputcomponent', + 'timeinputcomponent', + 'numberinputcomponent', + 'textinputcomponent', + 'textareainputcomponent', + 'passwordinputcomponent', + 'emailinputcomponent' ] @@ -49,7 +57,7 @@ bind:value={item.data.onCloseRecomputeIds} /> {/if} - {#if (`recomputeIds` in item.data && Array.isArray(item.data.recomputeIds)) || item.data.type === 'buttoncomponent' || item.data.type === 'formcomponent' || item.data.type === 'formbuttoncomponent' || item.data.type === 'checkboxcomponent'} + {#if (`recomputeIds` in item.data && Array.isArray(item.data.recomputeIds)) || item.data.type === 'buttoncomponent' || item.data.type === 'formbuttoncomponent'} id !== ownId)} bind:value={item.data.onToggle} /> {/if} + {#if item.data.type === 'dateinputcomponent' || item.data.type === 'datetimeinputcomponent' || item.data.type === 'timeinputcomponent' || item.data.type === 'numberinputcomponent' || item.data.type === 'textinputcomponent' || item.data.type === 'textareainputcomponent' || item.data.type === 'passwordinputcomponent' || item.data.type === 'emailinputcomponent'} + id !== ownId)} + bind:value={item.data.onChange} + /> + {/if} {#if item.data.type === 'resourceselectcomponent' || item.data.type === 'selectcomponent' || item.data.type == 'userresourcecomponent'} Date: Mon, 21 Apr 2025 16:46:37 +0200 Subject: [PATCH 262/739] add disabled to date component --- .../components/apps/components/inputs/AppDateInput.svelte | 1 + .../src/lib/components/apps/editor/component/components.ts | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/frontend/src/lib/components/apps/components/inputs/AppDateInput.svelte b/frontend/src/lib/components/apps/components/inputs/AppDateInput.svelte index 4544432ae2..697c0d040e 100644 --- a/frontend/src/lib/components/apps/components/inputs/AppDateInput.svelte +++ b/frontend/src/lib/components/apps/components/inputs/AppDateInput.svelte @@ -108,6 +108,7 @@ on:pointerdown|stopPropagation type="date" bind:value + disabled={resolvedConfig.disabled} min={resolvedConfig.minDate} max={resolvedConfig.maxDate} placeholder="Type..." diff --git a/frontend/src/lib/components/apps/editor/component/components.ts b/frontend/src/lib/components/apps/editor/component/components.ts index bc66fdab8f..2ff364f44a 100644 --- a/frontend/src/lib/components/apps/editor/component/components.ts +++ b/frontend/src/lib/components/apps/editor/component/components.ts @@ -2801,6 +2801,11 @@ See date-fns format for more information. By default, it is 'yyyy-MM-dd' documentationLink: 'https://date-fns.org/v2.30.0/docs/format', placeholder: 'yyyy-MM-dd' + }, + disabled: { + type: 'static', + value: false, + fieldType: 'boolean' } } } From 855a079744e7aca4f8c8859331a2a3cd8dfe2bb1 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Mon, 21 Apr 2025 16:53:23 +0200 Subject: [PATCH 263/739] fix .env --- .env | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/.env b/.env index f09d57bc24..ad887513cd 100644 --- a/.env +++ b/.env @@ -1,5 +1,13 @@ -DATABASE_URL=postgres://postgres:changeme@localhost:5432/windmill?sslmode=disable -DENO_PATH=/opt/homebrew/bin/deno -BUN_PATH=/opt/homebrew/bin/bun +DATABASE_URL=postgres://postgres:changeme@db/windmill?sslmode=disable -WM_IMAGE=ghcr.io/windmill-labs/windmill:main \ No newline at end of file +# For Enterprise Edition, use: +# WM_IMAGE=ghcr.io/windmill-labs/windmill-ee:main +WM_IMAGE=ghcr.io/windmill-labs/windmill:main + + +# To use another port than :80, setup the Caddyfile and the caddy section of the docker-compose to your needs: https://caddyserver.com/docs/getting-started +# To have caddy take care of automatic TLS + +# To rotate logs, set the following variables: +#LOG_MAX_SIZE=10m +#LOG_MAX_FILE=3 \ No newline at end of file From 128f6c1383bef72dd95d96b463f9cf6526c3dff8 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Mon, 21 Apr 2025 17:41:24 +0200 Subject: [PATCH 264/739] fix e2e test --- .github/change-versions.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/change-versions.sh b/.github/change-versions.sh index 699b87b0d7..454f373038 100755 --- a/.github/change-versions.sh +++ b/.github/change-versions.sh @@ -24,4 +24,4 @@ sed -i -e "/^wmill_pg =/s/= .*/= \">=$VERSION\"/" ${root_dirpath}/lsp/Pipfile sed -i -zE "s/name = \"windmill\"\nversion = \"[^\"]*\"\\n(.*)/name = \"windmill\"\nversion = \"$VERSION\"\\n\\1/" ${root_dirpath}/backend/Cargo.lock -cd ${root_dirpath}/frontend && npm i --package-lock-only +cd ${root_dirpath}/frontend && npm i --package-lock-only --ignore-scripts From 444a6abad670114c52e44f3606bf6fefc5d3fd98 Mon Sep 17 00:00:00 2001 From: Diego Imbert <70353967+diegoimbert@users.noreply.github.com> Date: Tue, 22 Apr 2025 11:37:18 +0200 Subject: [PATCH 265/739] fix: batch reruns query missing workspace_id check in subquery (#5652) --- ...94e0f4ab2bb96a6d838f1b1fdce4b58a8f5d4.json | 23 +++++++++++++++++++ backend/windmill-api/src/jobs.rs | 4 ++-- 2 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 backend/.sqlx/query-26761fbd7953416eb391de47b1694e0f4ab2bb96a6d838f1b1fdce4b58a8f5d4.json diff --git a/backend/.sqlx/query-26761fbd7953416eb391de47b1694e0f4ab2bb96a6d838f1b1fdce4b58a8f5d4.json b/backend/.sqlx/query-26761fbd7953416eb391de47b1694e0f4ab2bb96a6d838f1b1fdce4b58a8f5d4.json new file mode 100644 index 0000000000..b14dab2503 --- /dev/null +++ b/backend/.sqlx/query-26761fbd7953416eb391de47b1694e0f4ab2bb96a6d838f1b1fdce4b58a8f5d4.json @@ -0,0 +1,23 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT jsonb_build_object(\n 'kind', jb.kind,\n 'script_path', jb.runnable_path,\n 'latest_schema', COALESCE(\n (SELECT DISTINCT ON (s.path) s.schema FROM script s WHERE s.workspace_id = $1 AND s.path = jb.runnable_path AND jb.kind = 'script' ORDER BY s.path, s.created_at DESC),\n (SELECT flow_version.schema FROM flow LEFT JOIN flow_version ON flow_version.id = flow.versions[array_upper(flow.versions, 1)] WHERE flow.workspace_id = $1 AND flow.path = jb.runnable_path AND jb.kind = 'flow')\n ),\n 'schemas', ARRAY(\n SELECT jsonb_build_object(\n 'script_hash', LPAD(TO_HEX(COALESCE(s.hash, f.id)), 16, '0'),\n 'job_ids', ARRAY_AGG(DISTINCT j.id),\n 'schema', (ARRAY_AGG(COALESCE(s.schema, f.schema)))[1]\n ) FROM v2_job j\n LEFT JOIN script s ON s.hash = j.runnable_id AND j.kind = 'script'\n LEFT JOIN flow_version f ON f.id = j.runnable_id AND j.kind = 'flow'\n WHERE j.id = ANY(ARRAY_AGG(jb.id))\n GROUP BY COALESCE(s.hash, f.id)\n )\n ) FROM v2_job jb\n WHERE (jb.kind = 'flow' OR jb.kind = 'script')\n AND jb.workspace_id = $1 AND jb.id = ANY($2)\n GROUP BY jb.kind, jb.runnable_path", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "jsonb_build_object", + "type_info": "Jsonb" + } + ], + "parameters": { + "Left": [ + "Text", + "UuidArray" + ] + }, + "nullable": [ + null + ] + }, + "hash": "26761fbd7953416eb391de47b1694e0f4ab2bb96a6d838f1b1fdce4b58a8f5d4" +} diff --git a/backend/windmill-api/src/jobs.rs b/backend/windmill-api/src/jobs.rs index 0948e44497..5317b78fbc 100644 --- a/backend/windmill-api/src/jobs.rs +++ b/backend/windmill-api/src/jobs.rs @@ -674,8 +674,8 @@ async fn list_selected_job_groups( 'kind', jb.kind, 'script_path', jb.runnable_path, 'latest_schema', COALESCE( - (SELECT DISTINCT ON (s.path) s.schema FROM script s WHERE s.path = jb.runnable_path AND jb.kind = 'script' ORDER BY s.path, s.created_at DESC), - (SELECT flow_version.schema FROM flow LEFT JOIN flow_version ON flow_version.id = flow.versions[array_upper(flow.versions, 1)] WHERE flow.path = jb.runnable_path AND jb.kind = 'flow') + (SELECT DISTINCT ON (s.path) s.schema FROM script s WHERE s.workspace_id = $1 AND s.path = jb.runnable_path AND jb.kind = 'script' ORDER BY s.path, s.created_at DESC), + (SELECT flow_version.schema FROM flow LEFT JOIN flow_version ON flow_version.id = flow.versions[array_upper(flow.versions, 1)] WHERE flow.workspace_id = $1 AND flow.path = jb.runnable_path AND jb.kind = 'flow') ), 'schemas', ARRAY( SELECT jsonb_build_object( From e316dbd9bdd5c59e9aaba6a4472bb7d832834e84 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Wed, 23 Apr 2025 08:40:22 +0200 Subject: [PATCH 266/739] fix: track relative imports in python and ts even if lockfile is provided --- backend/windmill-api/src/scripts.rs | 20 ++++ backend/windmill-worker/src/lib.rs | 2 + .../windmill-worker/src/worker_lockfiles.rs | 105 +++++++++++------- 3 files changed, 89 insertions(+), 38 deletions(-) diff --git a/backend/windmill-api/src/scripts.rs b/backend/windmill-api/src/scripts.rs index 8e707a15d2..2c372a0d95 100644 --- a/backend/windmill-api/src/scripts.rs +++ b/backend/windmill-api/src/scripts.rs @@ -40,6 +40,7 @@ use std::{ }; use windmill_audit::audit_ee::audit_log; use windmill_audit::ActionKind; +use windmill_worker::process_relative_imports; use windmill_common::error::to_anyhow; @@ -894,6 +895,25 @@ async fn create_script_internal<'c>( .await?; Ok((hash, new_tx)) } else { + if let Err(e) = process_relative_imports( + &db, + None, + None, + &w_id, + &ns.path, + p_path_opt.clone(), + ns.deployment_message.clone(), + &ns.content, + &Some(ns.language.clone()), + &authed.email, + &authed.username, + &permissioned_as, + ) + .await + { + tracing::error!(%e, "error processing relative imports"); + } + handle_deployment_metadata( &authed.email, &authed.username, diff --git a/backend/windmill-worker/src/lib.rs b/backend/windmill-worker/src/lib.rs index 2b0a5d6f4a..64a9cf2c88 100644 --- a/backend/windmill-worker/src/lib.rs +++ b/backend/windmill-worker/src/lib.rs @@ -49,6 +49,8 @@ mod worker_flow; mod worker_lockfiles; mod worker_utils; +pub use worker_lockfiles::process_relative_imports; + pub use worker::*; pub use result_processor::handle_job_error; diff --git a/backend/windmill-worker/src/worker_lockfiles.rs b/backend/windmill-worker/src/worker_lockfiles.rs index cab717a94f..93cc355eb0 100644 --- a/backend/windmill-worker/src/worker_lockfiles.rs +++ b/backend/windmill-worker/src/worker_lockfiles.rs @@ -364,44 +364,21 @@ pub async fn handle_dependency_job( tracing::error!(%e, "error handling deployment metadata"); } - let relative_imports = - extract_relative_imports(&script_data.code, script_path, &job.script_lang); - if let Some(relative_imports) = relative_imports { - update_script_dependency_map( - &job.id, - db, - w_id, - &parent_path, - script_path, - relative_imports, - ) - .await?; - let already_visited = job - .args - .as_ref() - .map(|x| { - x.get("already_visited") - .map(|v| serde_json::from_str::>(v.get()).ok()) - .flatten() - }) - .flatten() - .unwrap_or_default(); - if let Err(e) = trigger_dependents_to_recompute_dependencies( - w_id, - script_path, - deployment_message, - parent_path, - &job.permissioned_as_email, - &job.created_by, - &job.permissioned_as, - db, - already_visited, - ) - .await - { - tracing::error!(%e, "error triggering dependents to recompute dependencies"); - } - } + process_relative_imports( + db, + Some(job.id), + job.args.as_ref(), + &job.workspace_id, + script_path, + parent_path, + deployment_message, + &script_data.code, + &job.script_lang, + &job.permissioned_as_email, + &job.created_by, + &job.permissioned_as, + ) + .await?; Ok(to_raw_value_owned( json!({ "status": "Successful lock file generation", "lock": content }), @@ -439,6 +416,58 @@ fn remove_ansi_codes(s: &str) -> String { ANSI_REGEX.replace_all(s, "").to_string() } +pub async fn process_relative_imports( + db: &sqlx::Pool, + job_id: Option, + args: Option<&Json>>>, + w_id: &str, + script_path: &str, + parent_path: Option, + deployment_message: Option, + code: &str, + script_lang: &Option, + permissioned_as_email: &str, + created_by: &str, + permissioned_as: &str, +) -> error::Result<()> { + let relative_imports = extract_relative_imports(&code, script_path, script_lang); + if let Some(relative_imports) = relative_imports { + update_script_dependency_map( + &job_id.unwrap_or_else(|| Uuid::nil()), + db, + w_id, + &parent_path, + script_path, + relative_imports, + ) + .await?; + let already_visited = args + .map(|x| { + x.get("already_visited") + .map(|v| serde_json::from_str::>(v.get()).ok()) + .flatten() + }) + .flatten() + .unwrap_or_default(); + if let Err(e) = trigger_dependents_to_recompute_dependencies( + w_id, + script_path, + deployment_message, + parent_path, + permissioned_as_email, + created_by, + permissioned_as, + db, + already_visited, + ) + .await + { + tracing::error!(%e, "error triggering dependents to recompute dependencies"); + } + } + Ok(()) +} + async fn trigger_dependents_to_recompute_dependencies( w_id: &str, script_path: &str, From 0a866da274396327eae9a0c1190a4ae99483cf37 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Wed, 23 Apr 2025 09:28:31 +0200 Subject: [PATCH 267/739] delay triggering dependent script when lockfile is present to account for CLI push --- backend/windmill-api/src/scripts.rs | 49 ++++++++++++++++++----------- 1 file changed, 31 insertions(+), 18 deletions(-) diff --git a/backend/windmill-api/src/scripts.rs b/backend/windmill-api/src/scripts.rs index 2c372a0d95..a1ca9c3322 100644 --- a/backend/windmill-api/src/scripts.rs +++ b/backend/windmill-api/src/scripts.rs @@ -895,24 +895,37 @@ async fn create_script_internal<'c>( .await?; Ok((hash, new_tx)) } else { - if let Err(e) = process_relative_imports( - &db, - None, - None, - &w_id, - &ns.path, - p_path_opt.clone(), - ns.deployment_message.clone(), - &ns.content, - &Some(ns.language.clone()), - &authed.email, - &authed.username, - &permissioned_as, - ) - .await - { - tracing::error!(%e, "error processing relative imports"); - } + let db2 = db.clone(); + let w_id2 = w_id.clone(); + let authed2 = authed.clone(); + let permissioned_as2 = permissioned_as.clone(); + let script_path2 = script_path.clone(); + let parent_path = p_path_opt.clone(); + let deployment_message = ns.deployment_message.clone(); + let content = ns.content.clone(); + let language = ns.language.clone(); + tokio::spawn(async move { + // wait for 10 seconds to make sure the script is deployed and that the CLI sync that pushed it (f one) is complete + tokio::time::sleep(std::time::Duration::from_secs(10)).await; + if let Err(e) = process_relative_imports( + &db2, + None, + None, + &w_id2, + &script_path2, + parent_path, + deployment_message, + &content, + &Some(language), + &authed2.email, + &authed2.username, + &permissioned_as2, + ) + .await + { + tracing::error!(%e, "error processing relative imports"); + } + }); handle_deployment_metadata( &authed.email, From 494d662b2d398ee6ad20f291c90001b844d90c6b Mon Sep 17 00:00:00 2001 From: dieriba Date: Wed, 23 Apr 2025 12:18:36 +0200 Subject: [PATCH 268/739] fix cli gcp types (#5644) * update types * fix types cli * fix ci * fix gcp types and fix used triggers * update repo ref revert .env and nits * fix build * Update frontend/src/lib/utils.ts Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com> * fix type and deploy to * update ee-repo-ref * update .sqlx * add missing fields * fix: add sqlx derive macro * hanfle missing field, fix deploy to other workspace and update ee-repo-ref * update repo ref --------- Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com> Co-authored-by: Ruben Fiszel --- ...61f003c29185c267642cfd898075ebda855d.json} | 40 ++++++--- ...f578a21813f038d75184a5034c37d4daf36e.json} | 40 ++++++--- ...588fc040c7a29ae6d9bab1f05af0b535e2ac.json} | 40 ++++++--- backend/ee-repo-ref.txt | 2 +- ...035_add-new-column-to-gcp-trigger.down.sql | 3 + ...44035_add-new-column-to-gcp-trigger.up.sql | 3 + backend/windmill-api/openapi.yaml | 85 +++---------------- backend/windmill-api/src/capture.rs | 26 ++++-- backend/windmill-api/src/gcp_triggers_ee.rs | 14 ++- backend/windmill-api/src/workspaces_export.rs | 1 + .../gcp/GcpTriggerEditorConfigSection.svelte | 31 +++---- .../triggers/gcp/GcpTriggerEditorInner.svelte | 29 +++---- frontend/src/lib/utils.ts | 14 ++- frontend/src/lib/utils_deployable.ts | 83 ++++++++---------- .../(root)/(logged)/gcp_triggers/+page.svelte | 6 +- .../(logged)/kafka_triggers/+page.svelte | 26 ++++-- .../(logged)/mqtt_triggers/+page.svelte | 20 +++-- .../(logged)/nats_triggers/+page.svelte | 26 ++++-- .../(logged)/postgres_triggers/+page.svelte | 6 +- .../(root)/(logged)/routes/+page.svelte | 26 ++++-- .../(root)/(logged)/sqs_triggers/+page.svelte | 20 +++-- .../(logged)/websocket_triggers/+page.svelte | 24 +++--- 22 files changed, 307 insertions(+), 258 deletions(-) rename backend/.sqlx/{query-f4f6336fc671b00bed7835124892f7a4d3bbe673f7c48153819dab385a5cb357.json => query-1312b7fd622cc814a406c85dbbff61f003c29185c267642cfd898075ebda855d.json} (74%) rename backend/.sqlx/{query-15fbe481789a7817bf37415fb935f9ed537fd7d3b266d928af4d5d3dd8bb5c18.json => query-2dcff8b16da75740c362015b2293f578a21813f038d75184a5034c37d4daf36e.json} (85%) rename backend/.sqlx/{query-0102308ffa1c0dbfba54d29246535bb81146a4cfae0ec408435570e0813a3bef.json => query-c2925a28212265bd9ac8e2d498b3588fc040c7a29ae6d9bab1f05af0b535e2ac.json} (73%) create mode 100644 backend/migrations/20250420144035_add-new-column-to-gcp-trigger.down.sql create mode 100644 backend/migrations/20250420144035_add-new-column-to-gcp-trigger.up.sql diff --git a/backend/.sqlx/query-f4f6336fc671b00bed7835124892f7a4d3bbe673f7c48153819dab385a5cb357.json b/backend/.sqlx/query-1312b7fd622cc814a406c85dbbff61f003c29185c267642cfd898075ebda855d.json similarity index 74% rename from backend/.sqlx/query-f4f6336fc671b00bed7835124892f7a4d3bbe673f7c48153819dab385a5cb357.json rename to backend/.sqlx/query-1312b7fd622cc814a406c85dbbff61f003c29185c267642cfd898075ebda855d.json index b20ae56e30..582896cc65 100644 --- a/backend/.sqlx/query-f4f6336fc671b00bed7835124892f7a4d3bbe673f7c48153819dab385a5cb357.json +++ b/backend/.sqlx/query-1312b7fd622cc814a406c85dbbff61f003c29185c267642cfd898075ebda855d.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT\n gcp_resource_path,\n subscription_id,\n topic_id,\n workspace_id,\n delivery_type AS \"delivery_type: _\",\n delivery_config AS \"delivery_config: _\",\n path,\n script_path,\n is_flow,\n edited_by,\n email,\n edited_at,\n server_id,\n last_server_ping,\n extra_perms,\n error,\n enabled\n FROM \n gcp_trigger\n WHERE \n workspace_id = $1 AND \n path = $2\n ", + "query": "\n SELECT\n gcp_resource_path,\n subscription_id,\n topic_id,\n workspace_id,\n delivery_type AS \"delivery_type: _\",\n delivery_config AS \"delivery_config: _\",\n subscription_mode AS \"subscription_mode: _\",\n path,\n script_path,\n is_flow,\n edited_by,\n email,\n edited_at,\n server_id,\n last_server_ping,\n extra_perms,\n error,\n enabled\n FROM \n gcp_trigger\n WHERE \n workspace_id = $1 AND \n path = $2\n ", "describe": { "columns": [ { @@ -45,56 +45,71 @@ }, { "ordinal": 6, + "name": "subscription_mode: _", + "type_info": { + "Custom": { + "name": "gcp_subscription_mode", + "kind": { + "Enum": [ + "create_update", + "existing" + ] + } + } + } + }, + { + "ordinal": 7, "name": "path", "type_info": "Varchar" }, { - "ordinal": 7, + "ordinal": 8, "name": "script_path", "type_info": "Varchar" }, { - "ordinal": 8, + "ordinal": 9, "name": "is_flow", "type_info": "Bool" }, { - "ordinal": 9, + "ordinal": 10, "name": "edited_by", "type_info": "Varchar" }, { - "ordinal": 10, + "ordinal": 11, "name": "email", "type_info": "Varchar" }, { - "ordinal": 11, + "ordinal": 12, "name": "edited_at", "type_info": "Timestamptz" }, { - "ordinal": 12, + "ordinal": 13, "name": "server_id", "type_info": "Varchar" }, { - "ordinal": 13, + "ordinal": 14, "name": "last_server_ping", "type_info": "Timestamptz" }, { - "ordinal": 14, + "ordinal": 15, "name": "extra_perms", "type_info": "Jsonb" }, { - "ordinal": 15, + "ordinal": 16, "name": "error", "type_info": "Text" }, { - "ordinal": 16, + "ordinal": 17, "name": "enabled", "type_info": "Bool" } @@ -118,6 +133,7 @@ false, false, false, + false, true, true, false, @@ -125,5 +141,5 @@ false ] }, - "hash": "f4f6336fc671b00bed7835124892f7a4d3bbe673f7c48153819dab385a5cb357" + "hash": "1312b7fd622cc814a406c85dbbff61f003c29185c267642cfd898075ebda855d" } diff --git a/backend/.sqlx/query-15fbe481789a7817bf37415fb935f9ed537fd7d3b266d928af4d5d3dd8bb5c18.json b/backend/.sqlx/query-2dcff8b16da75740c362015b2293f578a21813f038d75184a5034c37d4daf36e.json similarity index 85% rename from backend/.sqlx/query-15fbe481789a7817bf37415fb935f9ed537fd7d3b266d928af4d5d3dd8bb5c18.json rename to backend/.sqlx/query-2dcff8b16da75740c362015b2293f578a21813f038d75184a5034c37d4daf36e.json index 5f76c31d8b..5622b3691e 100644 --- a/backend/.sqlx/query-15fbe481789a7817bf37415fb935f9ed537fd7d3b266d928af4d5d3dd8bb5c18.json +++ b/backend/.sqlx/query-2dcff8b16da75740c362015b2293f578a21813f038d75184a5034c37d4daf36e.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT\n gcp_resource_path,\n subscription_id,\n topic_id,\n workspace_id,\n delivery_type AS \"delivery_type: _\",\n delivery_config AS \"delivery_config: _\",\n path,\n script_path,\n is_flow,\n edited_by,\n email,\n edited_at,\n server_id,\n last_server_ping,\n extra_perms,\n error,\n enabled\n FROM\n gcp_trigger\n WHERE\n delivery_type != 'push'::DELIVERY_MODE AND\n enabled IS TRUE\n AND (last_server_ping IS NULL OR\n last_server_ping < now() - interval '15 seconds'\n )\n ", + "query": "\n SELECT\n gcp_resource_path,\n subscription_id,\n topic_id,\n workspace_id,\n delivery_type AS \"delivery_type: _\",\n delivery_config AS \"delivery_config: _\",\n subscription_mode AS \"subscription_mode: _\",\n path,\n script_path,\n is_flow,\n edited_by,\n email,\n edited_at,\n server_id,\n last_server_ping,\n extra_perms,\n error,\n enabled\n FROM\n gcp_trigger\n WHERE\n delivery_type != 'push'::DELIVERY_MODE AND\n enabled IS TRUE\n AND (last_server_ping IS NULL OR\n last_server_ping < now() - interval '15 seconds'\n )\n ", "describe": { "columns": [ { @@ -45,56 +45,71 @@ }, { "ordinal": 6, + "name": "subscription_mode: _", + "type_info": { + "Custom": { + "name": "gcp_subscription_mode", + "kind": { + "Enum": [ + "create_update", + "existing" + ] + } + } + } + }, + { + "ordinal": 7, "name": "path", "type_info": "Varchar" }, { - "ordinal": 7, + "ordinal": 8, "name": "script_path", "type_info": "Varchar" }, { - "ordinal": 8, + "ordinal": 9, "name": "is_flow", "type_info": "Bool" }, { - "ordinal": 9, + "ordinal": 10, "name": "edited_by", "type_info": "Varchar" }, { - "ordinal": 10, + "ordinal": 11, "name": "email", "type_info": "Varchar" }, { - "ordinal": 11, + "ordinal": 12, "name": "edited_at", "type_info": "Timestamptz" }, { - "ordinal": 12, + "ordinal": 13, "name": "server_id", "type_info": "Varchar" }, { - "ordinal": 13, + "ordinal": 14, "name": "last_server_ping", "type_info": "Timestamptz" }, { - "ordinal": 14, + "ordinal": 15, "name": "extra_perms", "type_info": "Jsonb" }, { - "ordinal": 15, + "ordinal": 16, "name": "error", "type_info": "Text" }, { - "ordinal": 16, + "ordinal": 17, "name": "enabled", "type_info": "Bool" } @@ -115,6 +130,7 @@ false, false, false, + false, true, true, false, @@ -122,5 +138,5 @@ false ] }, - "hash": "15fbe481789a7817bf37415fb935f9ed537fd7d3b266d928af4d5d3dd8bb5c18" + "hash": "2dcff8b16da75740c362015b2293f578a21813f038d75184a5034c37d4daf36e" } diff --git a/backend/.sqlx/query-0102308ffa1c0dbfba54d29246535bb81146a4cfae0ec408435570e0813a3bef.json b/backend/.sqlx/query-c2925a28212265bd9ac8e2d498b3588fc040c7a29ae6d9bab1f05af0b535e2ac.json similarity index 73% rename from backend/.sqlx/query-0102308ffa1c0dbfba54d29246535bb81146a4cfae0ec408435570e0813a3bef.json rename to backend/.sqlx/query-c2925a28212265bd9ac8e2d498b3588fc040c7a29ae6d9bab1f05af0b535e2ac.json index 06390d0ce9..eec208dbbb 100644 --- a/backend/.sqlx/query-0102308ffa1c0dbfba54d29246535bb81146a4cfae0ec408435570e0813a3bef.json +++ b/backend/.sqlx/query-c2925a28212265bd9ac8e2d498b3588fc040c7a29ae6d9bab1f05af0b535e2ac.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT\n gcp_resource_path,\n subscription_id,\n topic_id,\n workspace_id,\n delivery_type AS \"delivery_type: _\",\n delivery_config AS \"delivery_config: _\",\n path,\n script_path,\n is_flow,\n edited_by,\n email,\n edited_at,\n server_id,\n last_server_ping,\n extra_perms,\n error,\n enabled\n FROM \n gcp_trigger\n WHERE \n workspace_id = $1\n ", + "query": "\n SELECT\n gcp_resource_path,\n subscription_id,\n topic_id,\n workspace_id,\n delivery_type AS \"delivery_type: _\",\n delivery_config AS \"delivery_config: _\",\n subscription_mode AS \"subscription_mode: _\",\n path,\n script_path,\n is_flow,\n edited_by,\n email,\n edited_at,\n server_id,\n last_server_ping,\n extra_perms,\n error,\n enabled\n FROM \n gcp_trigger\n WHERE \n workspace_id = $1\n ", "describe": { "columns": [ { @@ -45,56 +45,71 @@ }, { "ordinal": 6, + "name": "subscription_mode: _", + "type_info": { + "Custom": { + "name": "gcp_subscription_mode", + "kind": { + "Enum": [ + "create_update", + "existing" + ] + } + } + } + }, + { + "ordinal": 7, "name": "path", "type_info": "Varchar" }, { - "ordinal": 7, + "ordinal": 8, "name": "script_path", "type_info": "Varchar" }, { - "ordinal": 8, + "ordinal": 9, "name": "is_flow", "type_info": "Bool" }, { - "ordinal": 9, + "ordinal": 10, "name": "edited_by", "type_info": "Varchar" }, { - "ordinal": 10, + "ordinal": 11, "name": "email", "type_info": "Varchar" }, { - "ordinal": 11, + "ordinal": 12, "name": "edited_at", "type_info": "Timestamptz" }, { - "ordinal": 12, + "ordinal": 13, "name": "server_id", "type_info": "Varchar" }, { - "ordinal": 13, + "ordinal": 14, "name": "last_server_ping", "type_info": "Timestamptz" }, { - "ordinal": 14, + "ordinal": 15, "name": "extra_perms", "type_info": "Jsonb" }, { - "ordinal": 15, + "ordinal": 16, "name": "error", "type_info": "Text" }, { - "ordinal": 16, + "ordinal": 17, "name": "enabled", "type_info": "Bool" } @@ -117,6 +132,7 @@ false, false, false, + false, true, true, false, @@ -124,5 +140,5 @@ false ] }, - "hash": "0102308ffa1c0dbfba54d29246535bb81146a4cfae0ec408435570e0813a3bef" + "hash": "c2925a28212265bd9ac8e2d498b3588fc040c7a29ae6d9bab1f05af0b535e2ac" } diff --git a/backend/ee-repo-ref.txt b/backend/ee-repo-ref.txt index 668c3a7485..cd49b42813 100644 --- a/backend/ee-repo-ref.txt +++ b/backend/ee-repo-ref.txt @@ -1 +1 @@ -4c4db954d9de775905a2e207a5969d5feff23455 \ No newline at end of file +b9ca3ccdd188683c81832fd3ed41c8dd632a0c9c \ No newline at end of file diff --git a/backend/migrations/20250420144035_add-new-column-to-gcp-trigger.down.sql b/backend/migrations/20250420144035_add-new-column-to-gcp-trigger.down.sql new file mode 100644 index 0000000000..076f1891b6 --- /dev/null +++ b/backend/migrations/20250420144035_add-new-column-to-gcp-trigger.down.sql @@ -0,0 +1,3 @@ +-- Add down migration script here +ALTER TABLE gcp_trigger DROP COLUMN subscription_mode; +DROP TYPE GCP_SUBSCRIPTION_MODE; \ No newline at end of file diff --git a/backend/migrations/20250420144035_add-new-column-to-gcp-trigger.up.sql b/backend/migrations/20250420144035_add-new-column-to-gcp-trigger.up.sql new file mode 100644 index 0000000000..529d9580db --- /dev/null +++ b/backend/migrations/20250420144035_add-new-column-to-gcp-trigger.up.sql @@ -0,0 +1,3 @@ +-- Add up migration script here +CREATE TYPE GCP_SUBSCRIPTION_MODE AS ENUM ('create_update', 'existing'); +ALTER TABLE gcp_trigger ADD COLUMN subscription_mode GCP_SUBSCRIPTION_MODE NOT NULL DEFAULT 'create_update'::GCP_SUBSCRIPTION_MODE; \ No newline at end of file diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index 329cd80968..cd3eea2850 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -9539,7 +9539,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/NewGcpTrigger" + $ref: "#/components/schemas/GcpTriggerData" responses: "201": description: gcp trigger created @@ -9563,7 +9563,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/EditGcpTrigger" + $ref: "#/components/schemas/GcpTriggerData" responses: "200": description: gcp trigger updated @@ -15045,8 +15045,6 @@ components: type: string authenticate: type: boolean - base_endpoint: - type: string required: - authenticate - base_endpoint @@ -15068,6 +15066,8 @@ components: $ref: "#/components/schemas/DeliveryType" delivery_config: $ref: "#/components/schemas/PushConfig" + subscription_mode: + $ref: "#/components/schemas/SubscriptionMode" last_server_ping: type: string format: date-time @@ -15081,6 +15081,8 @@ components: - subscription_id - enabled - delivery_type + - subscription_mode + SubscriptionMode: type: string @@ -15089,55 +15091,24 @@ components: - create_update description: "The mode of subscription. 'existing' means using an existing GCP subscription, while 'create_update' involves creating or updating a new subscription." - GcpExistingSubscription: + + GcpTriggerData: type: object properties: + gcp_resource_path: + type: string + subscription_mode: + $ref: "#/components/schemas/SubscriptionMode" + topic_id: + type: string subscription_id: type: string base_endpoint: type: string - required: - - subscription_id - - base_endpoint - - GcpCreateUpdateSubscription: - type: object - properties: - subscription_id: - type: string delivery_type: $ref: "#/components/schemas/DeliveryType" delivery_config: $ref: "#/components/schemas/PushConfig" - required: - - delivery_type - - - GcpSubscriptionModeConfig: - type: object - properties: - subscription_mode: - $ref: "#/components/schemas/SubscriptionMode" - required: - - subscription_mode - allOf: - - oneOf: - - $ref: "#/components/schemas/GcpExistingSubscription" - - $ref: "#/components/schemas/GcpCreateUpdateSubscription" - description: | - "This is a union type representing the subscription mode. - - 'existing': Represents an existing GCP subscription, and should be accompanied by an 'ExistingGcpSubscription' object. - - 'create_update': Represents a new or updated GCP subscription, and should be accompanied by a 'CreateUpdateConfig' object." - - NewGcpTrigger: - type: object - properties: - gcp_resource_path: - type: string - topic_id: - type: string - subscription_mode: - $ref: "#/components/schemas/GcpSubscriptionModeConfig" path: type: string script_path: @@ -15154,34 +15125,6 @@ components: - topic_id - subscription_mode - EditGcpTrigger: - type: object - properties: - gcp_resource_path: - type: string - topic_id: - type: string - subscription_mode: - $ref: "#/components/schemas/GcpSubscriptionModeConfig" - path: - type: string - script_path: - type: string - is_flow: - type: boolean - enabled: - type: boolean - required: - - path - - script_path - - is_flow - - enabled - - mqtt_resource_path - - subscription_id - - delivery_type - - topic_id - - subscription_mode - GetAllTopicSubscription: type: object properties: diff --git a/backend/windmill-api/src/capture.rs b/backend/windmill-api/src/capture.rs index 1247dd78a7..547b56954b 100644 --- a/backend/windmill-api/src/capture.rs +++ b/backend/windmill-api/src/capture.rs @@ -18,7 +18,8 @@ use { #[cfg(all(feature = "enterprise", feature = "gcp_trigger"))] use crate::gcp_triggers_ee::{ - manage_google_subscription, process_google_push_request, validate_jwt_token, SubscriptionMode, + manage_google_subscription, process_google_push_request, validate_jwt_token, + CreateUpdateConfig, SubscriptionMode, }; #[cfg(all(feature = "enterprise", feature = "sqs_trigger"))] @@ -29,8 +30,10 @@ use windmill_common::auth::aws::AwsAuthResourceType; all(feature = "enterprise", feature = "gcp_trigger") ))] use { - axum::extract::Request, http::HeaderMap, serde::de::DeserializeOwned, - windmill_common::error::Error, + axum::extract::Request, + http::HeaderMap, + serde::de::DeserializeOwned, + windmill_common::{error::Error, utils::empty_string_as_none}, }; #[cfg(all(feature = "enterprise", feature = "kafka"))] @@ -160,8 +163,13 @@ pub struct SqsTriggerConfig { #[derive(Debug, Serialize, Deserialize)] pub struct GcpTriggerConfig { pub gcp_resource_path: String, - #[serde(flatten)] pub subscription_mode: SubscriptionMode, + #[serde(default, deserialize_with = "empty_string_as_none")] + pub subscription_id: Option, + #[serde(default, deserialize_with = "empty_string_as_none")] + pub base_endpoint: Option, + #[serde(flatten)] + pub create_update: Option, pub topic_id: String, } @@ -370,11 +378,15 @@ async fn set_gcp_trigger_config( &gcp_config.gcp_resource_path, &capture_config.path, &gcp_config.topic_id, + &mut gcp_config.subscription_id, + &mut gcp_config.base_endpoint, gcp_config.subscription_mode, + gcp_config.create_update, + false, ) .await?; - - gcp_config.subscription_mode = SubscriptionMode::CreateUpdate(config); + gcp_config.create_update = Some(config); + gcp_config.subscription_mode = SubscriptionMode::CreateUpdate; capture_config.trigger_config = Some(TriggerConfig::Gcp(gcp_config)); Ok(capture_config) @@ -891,7 +903,7 @@ async fn gcp_payload( let authed = fetch_api_authed(owner.clone(), email, &w_id, &db, None).await?; - let SubscriptionMode::CreateUpdate(config) = &gcp_trigger_config.subscription_mode else { + let Some(config) = &gcp_trigger_config.create_update else { return Err(Error::BadConfig("Bad config".to_string())); }; diff --git a/backend/windmill-api/src/gcp_triggers_ee.rs b/backend/windmill-api/src/gcp_triggers_ee.rs index ec0a6ec115..4c8c72a4e4 100644 --- a/backend/windmill-api/src/gcp_triggers_ee.rs +++ b/backend/windmill-api/src/gcp_triggers_ee.rs @@ -52,11 +52,12 @@ pub struct ExistingGcpSubscription { pub base_endpoint: String, } -#[derive(Debug, Deserialize, Serialize)] -#[serde(tag = "subscription_mode", rename_all = "snake_case")] +#[derive(Debug, Deserialize, Serialize, sqlx::Type)] +#[serde(rename_all = "snake_case")] +#[sqlx(type_name = "GCP_SUBSCRIPTION_MODE", rename_all = "snake_case")] pub enum SubscriptionMode { - Existing(ExistingGcpSubscription), - CreateUpdate(CreateUpdateConfig), + Existing, + CreateUpdate, } pub fn workspaced_service() -> Router { @@ -77,7 +78,11 @@ pub async fn manage_google_subscription( _gcp_resource_path: &str, _path: &str, _topic_id: &str, + _subscription_id: &mut Option, + _base_endpoint: &mut Option, _subscription_mode: SubscriptionMode, + _create_update_config: Option, + _trigger_mode: bool, ) -> WindmillResult { Ok(CreateUpdateConfig::default()) } @@ -117,6 +122,7 @@ pub struct GcpTrigger { pub subscription_id: String, pub delivery_type: DeliveryType, pub delivery_config: Option>, + pub subscription_mode: SubscriptionMode, pub topic_id: String, pub path: String, pub script_path: String, diff --git a/backend/windmill-api/src/workspaces_export.rs b/backend/windmill-api/src/workspaces_export.rs index b799313933..fea688c78a 100644 --- a/backend/windmill-api/src/workspaces_export.rs +++ b/backend/windmill-api/src/workspaces_export.rs @@ -692,6 +692,7 @@ pub(crate) async fn tarball_workspace( workspace_id, delivery_type AS "delivery_type: _", delivery_config AS "delivery_config: _", + subscription_mode AS "subscription_mode: _", path, script_path, is_flow, diff --git a/frontend/src/lib/components/triggers/gcp/GcpTriggerEditorConfigSection.svelte b/frontend/src/lib/components/triggers/gcp/GcpTriggerEditorConfigSection.svelte index d359085122..816dffd90f 100644 --- a/frontend/src/lib/components/triggers/gcp/GcpTriggerEditorConfigSection.svelte +++ b/frontend/src/lib/components/triggers/gcp/GcpTriggerEditorConfigSection.svelte @@ -50,7 +50,6 @@ const DEFAULT_PUSH_CONFIG: PushConfig = { audience: '', authenticate: false, - base_endpoint } async function loadAllPubSubTopicsFromProject() { @@ -87,7 +86,7 @@ function getBaseUrl(captureInfo: CaptureInfo | undefined) { if (captureInfo) { - return `${location.origin}${base}/api/w/${$workspaceStore}/capture_u/gcp/${ + return `${window.location.origin}${base}/api/w/${$workspaceStore}/capture_u/gcp/${ captureInfo.isFlow ? 'flow' : 'script' }` } else { @@ -271,19 +270,6 @@
- - -

Enable Google Cloud authentication for push delivery using a verified token. + {#if delivery_config.authenticate} + + + + {/if}

{/if}
diff --git a/frontend/src/lib/components/triggers/gcp/GcpTriggerEditorInner.svelte b/frontend/src/lib/components/triggers/gcp/GcpTriggerEditorInner.svelte index 45a74ec93d..b59fb4c60f 100644 --- a/frontend/src/lib/components/triggers/gcp/GcpTriggerEditorInner.svelte +++ b/frontend/src/lib/components/triggers/gcp/GcpTriggerEditorInner.svelte @@ -103,6 +103,7 @@ delivery_type = s.delivery_type subscription_id = s.subscription_id delivery_config = s.delivery_config + subscription_mode = s.subscription_mode is_flow = s.is_flow path = s.path enabled = s.enabled @@ -116,12 +117,12 @@ async function updateTrigger(): Promise { try { is_loading = true + const base_endpoint = `${window.location.origin}${base}` if (delivery_type === 'push') { if (!delivery_config) { sendUserToast('Must set route path when delivery type is push', true) return } - delivery_config.base_endpoint = `${window.location.origin}${base}` } else { delivery_config = undefined } @@ -131,13 +132,11 @@ path: initialPath, requestBody: { gcp_resource_path, - subscription_mode: { - subscription_mode, - subscription_id, - delivery_type, - delivery_config, - base_endpoint: `${window.location.origin}${base}` - }, + subscription_mode, + subscription_id, + delivery_type, + delivery_config, + base_endpoint, topic_id, path, script_path, @@ -151,13 +150,11 @@ workspace: $workspaceStore!, requestBody: { gcp_resource_path, - subscription_mode: { - subscription_mode, - subscription_id, - delivery_type, - delivery_config: delivery_config, - base_endpoint: `${window.location.origin}${base}` - }, + subscription_mode, + subscription_id, + delivery_type, + delivery_config, + base_endpoint, topic_id, path, script_path, @@ -281,7 +278,7 @@ bind:delivery_config bind:topic_id bind:subscription_mode - bind:path={path} + bind:path cloud_subscription_id={subscription_id} create_update_subscription_id={subscription_id} {can_write} diff --git a/frontend/src/lib/utils.ts b/frontend/src/lib/utils.ts index f5da07ee38..7ee8e1edd6 100644 --- a/frontend/src/lib/utils.ts +++ b/frontend/src/lib/utils.ts @@ -9,7 +9,7 @@ import { deepEqual } from 'fast-equals' import YAML from 'yaml' -import type { UserExt } from './stores' +import { type UserExt } from './stores' import { sendUserToast } from './toast' import type { Job, Script } from './gen' import type { EnumType, SchemaProperty } from './common' @@ -17,6 +17,7 @@ import type { Schema } from './common' export { sendUserToast } import type { AnyMeltElement } from '@melt-ui/svelte' import type { RunsSelectionMode } from './components/runs/RunsBatchActionsDropdown.svelte' +import type { TriggerKind } from './components/triggers' export function isJobCancelable(j: Job): boolean { return j.type === 'QueuedJob' && !j.schedule_path && !j.canceled @@ -141,6 +142,17 @@ export function msToSec(ms: number | undefined, maximumFractionDigits?: number): }) } +export function removeTriggerKindIfUnused( + length: number, + triggerKind: TriggerKind, + usedTriggerKinds: string[] +) { + if (length === 0 && usedTriggerKinds.includes(triggerKind)) { + return usedTriggerKinds.filter((kind) => kind != triggerKind) + } + return usedTriggerKinds +} + export function msToReadableTime(ms: number | undefined): string { if (ms === undefined) return '?' diff --git a/frontend/src/lib/utils_deployable.ts b/frontend/src/lib/utils_deployable.ts index 355fe79071..2a81423b47 100644 --- a/frontend/src/lib/utils_deployable.ts +++ b/frontend/src/lib/utils_deployable.ts @@ -9,7 +9,7 @@ import { ScheduleService, SqsTriggerService, WebsocketTriggerService, - type NewGcpTrigger, + type GcpTriggerData, type WorkspaceDeployUISettings } from './gen' import type { TriggerKind } from './components/triggers' @@ -78,11 +78,9 @@ export async function existsTrigger( return await PostgresTriggerService.existsPostgresTrigger(data) } else if (triggerKind === 'sqs') { return await SqsTriggerService.existsSqsTrigger(data) - } - else if (triggerKind === 'gcp') { + } else if (triggerKind === 'gcp') { return await GcpTriggerService.existsGcpTrigger(data) - } - else if (triggerKind === 'websockets') { + } else if (triggerKind === 'websockets') { return await WebsocketTriggerService.existsWebsocketTrigger(data) } else if (triggerKind === 'nats') { return await NatsTriggerService.existsNatsTrigger(data) @@ -140,36 +138,31 @@ export async function getTriggersDeployData(kind: TriggerKind, path: string, wor createFn: NatsTriggerService.createNatsTrigger, updateFn: NatsTriggerService.updateNatsTrigger } - } - else if (kind === 'gcp') { + } else if (kind === 'gcp') { const gcpTrigger = await GcpTriggerService.getGcpTrigger({ workspace: workspace!, path: path }) gcpTrigger.subscription_id = '' + gcpTrigger.subscription_mode = 'create_update' + if (gcpTrigger.delivery_config) { gcpTrigger.delivery_config.audience = '' } - const data: NewGcpTrigger = { - subscription_mode: { - subscription_mode: 'create_update', - subscription_id: gcpTrigger.subscription_id, - delivery_type: gcpTrigger.delivery_type, - delivery_config: gcpTrigger.delivery_config, - base_endpoint: `${window.location.origin}${base}` - }, - ...gcpTrigger + const data: GcpTriggerData = { + ...gcpTrigger, + base_endpoint: + gcpTrigger.delivery_type === 'push' ? `${window.location.origin}${base}` : undefined } return { data, createFn: GcpTriggerService.createGcpTrigger, updateFn: GcpTriggerService.updateGcpTrigger - } - } - else if (kind === 'postgres') { + } + } else if (kind === 'postgres') { const postgresTrigger = await PostgresTriggerService.getPostgresTrigger({ workspace: workspace!, path: path @@ -321,26 +314,20 @@ export async function getTriggerValue(kind: TriggerKind, path: string, workspace replication_slot_name, publication_name } - } - else if (kind === 'gcp') { - const { - enabled, - script_path, - is_flow, - gcp_resource_path, - } = await GcpTriggerService.getGcpTrigger({ - workspace: workspace!, - path: path - }) + } else if (kind === 'gcp') { + const { enabled, script_path, is_flow, gcp_resource_path } = + await GcpTriggerService.getGcpTrigger({ + workspace: workspace!, + path: path + }) return { enabled, script_path, is_flow, - gcp_resource_path, + gcp_resource_path } - } - else if (kind === 'websockets') { + } else if (kind === 'websockets') { const { enabled, script_path, @@ -511,17 +498,14 @@ export async function getTriggerDependency(kind: TriggerKind, path: string, work }) result = retrieveKindsValues({ resource_path: postgres_resource_path, script_path, is_flow }) - } - else if (kind === 'gcp') { - const { gcp_resource_path, script_path, is_flow } = - await GcpTriggerService.getGcpTrigger({ - workspace: workspace!, - path: path - }) + } else if (kind === 'gcp') { + const { gcp_resource_path, script_path, is_flow } = await GcpTriggerService.getGcpTrigger({ + workspace: workspace!, + path: path + }) result = retrieveKindsValues({ resource_path: gcp_resource_path, script_path, is_flow }) - } - else if (kind === 'websockets') { + } else if (kind === 'websockets') { const { script_path, is_flow, url, initial_messages } = await WebsocketTriggerService.getWebsocketTrigger({ workspace: workspace!, @@ -546,12 +530,17 @@ export async function getTriggerDependency(kind: TriggerKind, path: string, work } }) } else if (kind === 'routes') { - const { script_path, is_flow, authentication_resource_path} = await HttpTriggerService.getHttpTrigger({ - workspace: workspace!, - path: path - }) + const { script_path, is_flow, authentication_resource_path } = + await HttpTriggerService.getHttpTrigger({ + workspace: workspace!, + path: path + }) - result = retrieveKindsValues({ script_path, is_flow, resource_path: authentication_resource_path}) + result = retrieveKindsValues({ + script_path, + is_flow, + resource_path: authentication_resource_path + }) } else if (kind === 'schedules') { const { script_path, is_flow } = await ScheduleService.getSchedule({ workspace: workspace!, diff --git a/frontend/src/routes/(root)/(logged)/gcp_triggers/+page.svelte b/frontend/src/routes/(root)/(logged)/gcp_triggers/+page.svelte index c5fadefa4e..9fcaa0f202 100644 --- a/frontend/src/routes/(root)/(logged)/gcp_triggers/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/gcp_triggers/+page.svelte @@ -11,7 +11,8 @@ displayDate, getLocalSetting, sendUserToast, - storeLocalSetting + storeLocalSetting, + removeTriggerKindIfUnused } from '$lib/utils' import { base } from '$app/paths' import CenteredPage from '$lib/components/CenteredPage.svelte' @@ -21,7 +22,7 @@ import SharedBadge from '$lib/components/SharedBadge.svelte' import ShareModal from '$lib/components/ShareModal.svelte' import Toggle from '$lib/components/Toggle.svelte' - import { enterpriseLicense, userStore, workspaceStore } from '$lib/stores' + import { enterpriseLicense, usedTriggerKinds, userStore, workspaceStore } from '$lib/stores' import { Code, Eye, Pen, Plus, Share, Trash, Circle, FileUp, ClipboardCopy } from 'lucide-svelte' import { goto } from '$lib/navigation' import SearchItems from '$lib/components/SearchItems.svelte' @@ -64,6 +65,7 @@ return { canWrite: canWrite(x.path, x.extra_perms!, $userStore), ...x } } ) + $usedTriggerKinds = removeTriggerKindIfUnused(triggers.length, 'gcp', $usedTriggerKinds) loading = false } diff --git a/frontend/src/routes/(root)/(logged)/kafka_triggers/+page.svelte b/frontend/src/routes/(root)/(logged)/kafka_triggers/+page.svelte index 14a9c4b6f5..5d8c6ba86e 100644 --- a/frontend/src/routes/(root)/(logged)/kafka_triggers/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/kafka_triggers/+page.svelte @@ -10,7 +10,8 @@ displayDate, getLocalSetting, sendUserToast, - storeLocalSetting + storeLocalSetting, + removeTriggerKindIfUnused } from '$lib/utils' import { base } from '$app/paths' import CenteredPage from '$lib/components/CenteredPage.svelte' @@ -20,7 +21,13 @@ import SharedBadge from '$lib/components/SharedBadge.svelte' import ShareModal from '$lib/components/ShareModal.svelte' import Toggle from '$lib/components/Toggle.svelte' - import { userStore, workspaceStore, userWorkspaces, enterpriseLicense } from '$lib/stores' + import { + userStore, + workspaceStore, + userWorkspaces, + enterpriseLicense, + usedTriggerKinds + } from '$lib/stores' import { Code, Eye, Pen, Plus, Share, Trash, Circle, FileUp } from 'lucide-svelte' import { goto } from '$lib/navigation' import SearchItems from '$lib/components/SearchItems.svelte' @@ -62,6 +69,7 @@ return { canWrite: canWrite(x.path, x.extra_perms!, $userStore), ...x } } ) + $usedTriggerKinds = removeTriggerKindIfUnused(triggers.length, 'kafka', $usedTriggerKinds) loading = false } @@ -160,15 +168,15 @@ (x) => x.path.startsWith(ownerFilter + '/') && filterItemsPathsBaseOnUserFilters(x, selectedFilterKind, filterUserFolders) - ) + ) : triggers?.filter( (x) => x.script_path.startsWith(ownerFilter + '/') && filterItemsPathsBaseOnUserFilters(x, selectedFilterKind, filterUserFolders) - ) + ) : triggers?.filter((x) => filterItemsPathsBaseOnUserFilters(x, selectedFilterKind, filterUserFolders) - ) + ) $: if ($workspaceStore) { ownerFilter = undefined @@ -178,10 +186,10 @@ selectedFilterKind === 'trigger' ? Array.from( new Set(filteredItems?.map((x) => x.path.split('/').slice(0, 2).join('/')) ?? []) - ).sort() + ).sort() : Array.from( new Set(filteredItems?.map((x) => x.script_path.split('/').slice(0, 2).join('/')) ?? []) - ).sort() + ).sort() $: items = filter !== '' ? filteredItems : preFilteredItems @@ -380,7 +388,7 @@ ? { icon: Pen } : { icon: Eye - }} + }} color="dark" > {canWrite ? 'Edit' : 'View'} @@ -427,7 +435,7 @@ }) } } - ] + ] : []), { displayName: 'Audit logs', diff --git a/frontend/src/routes/(root)/(logged)/mqtt_triggers/+page.svelte b/frontend/src/routes/(root)/(logged)/mqtt_triggers/+page.svelte index 7c2cc2a87e..4a78f7e35e 100644 --- a/frontend/src/routes/(root)/(logged)/mqtt_triggers/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/mqtt_triggers/+page.svelte @@ -10,7 +10,8 @@ displayDate, getLocalSetting, sendUserToast, - storeLocalSetting + storeLocalSetting, + removeTriggerKindIfUnused } from '$lib/utils' import { base } from '$app/paths' import CenteredPage from '$lib/components/CenteredPage.svelte' @@ -20,7 +21,7 @@ import SharedBadge from '$lib/components/SharedBadge.svelte' import ShareModal from '$lib/components/ShareModal.svelte' import Toggle from '$lib/components/Toggle.svelte' - import { enterpriseLicense, userStore, workspaceStore } from '$lib/stores' + import { enterpriseLicense, usedTriggerKinds, userStore, workspaceStore } from '$lib/stores' import { Code, Eye, Pen, Plus, Share, Trash, Circle, FileUp } from 'lucide-svelte' import { goto } from '$lib/navigation' import SearchItems from '$lib/components/SearchItems.svelte' @@ -62,6 +63,7 @@ return { canWrite: canWrite(x.path, x.extra_perms!, $userStore), ...x } } ) + $usedTriggerKinds = removeTriggerKindIfUnused(triggers.length, 'mqtt', $usedTriggerKinds) loading = false } @@ -160,15 +162,15 @@ (x) => x.path.startsWith(ownerFilter + '/') && filterItemsPathsBaseOnUserFilters(x, selectedFilterKind, filterUserFolders) - ) + ) : triggers?.filter( (x) => x.script_path.startsWith(ownerFilter + '/') && filterItemsPathsBaseOnUserFilters(x, selectedFilterKind, filterUserFolders) - ) + ) : triggers?.filter((x) => filterItemsPathsBaseOnUserFilters(x, selectedFilterKind, filterUserFolders) - ) + ) $: if ($workspaceStore) { ownerFilter = undefined @@ -178,10 +180,10 @@ selectedFilterKind === 'trigger' ? Array.from( new Set(filteredItems?.map((x) => x.path.split('/').slice(0, 2).join('/')) ?? []) - ).sort() + ).sort() : Array.from( new Set(filteredItems?.map((x) => x.script_path.split('/').slice(0, 2).join('/')) ?? []) - ).sort() + ).sort() $: items = filter !== '' ? filteredItems : preFilteredItems @@ -360,7 +362,7 @@ ? { icon: Pen } : { icon: Eye - }} + }} color="dark" > {canWrite ? 'Edit' : 'View'} @@ -407,7 +409,7 @@ }) } } - ] + ] : []), { displayName: 'Audit logs', diff --git a/frontend/src/routes/(root)/(logged)/nats_triggers/+page.svelte b/frontend/src/routes/(root)/(logged)/nats_triggers/+page.svelte index 54d8496cb3..9e18225165 100644 --- a/frontend/src/routes/(root)/(logged)/nats_triggers/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/nats_triggers/+page.svelte @@ -10,7 +10,8 @@ displayDate, getLocalSetting, sendUserToast, - storeLocalSetting + storeLocalSetting, + removeTriggerKindIfUnused } from '$lib/utils' import { base } from '$app/paths' import CenteredPage from '$lib/components/CenteredPage.svelte' @@ -20,7 +21,13 @@ import SharedBadge from '$lib/components/SharedBadge.svelte' import ShareModal from '$lib/components/ShareModal.svelte' import Toggle from '$lib/components/Toggle.svelte' - import { userStore, workspaceStore, userWorkspaces, enterpriseLicense } from '$lib/stores' + import { + userStore, + workspaceStore, + userWorkspaces, + enterpriseLicense, + usedTriggerKinds + } from '$lib/stores' import { Code, Eye, Pen, Plus, Share, Trash, Circle, FileUp } from 'lucide-svelte' import { goto } from '$lib/navigation' import SearchItems from '$lib/components/SearchItems.svelte' @@ -61,6 +68,7 @@ return { canWrite: canWrite(x.path, x.extra_perms!, $userStore), ...x } } ) + $usedTriggerKinds = removeTriggerKindIfUnused(triggers.length, 'nats', $usedTriggerKinds) loading = false } @@ -159,15 +167,15 @@ (x) => x.path.startsWith(ownerFilter + '/') && filterItemsPathsBaseOnUserFilters(x, selectedFilterKind, filterUserFolders) - ) + ) : triggers?.filter( (x) => x.script_path.startsWith(ownerFilter + '/') && filterItemsPathsBaseOnUserFilters(x, selectedFilterKind, filterUserFolders) - ) + ) : triggers?.filter((x) => filterItemsPathsBaseOnUserFilters(x, selectedFilterKind, filterUserFolders) - ) + ) $: if ($workspaceStore) { ownerFilter = undefined @@ -177,10 +185,10 @@ selectedFilterKind === 'trigger' ? Array.from( new Set(filteredItems?.map((x) => x.path.split('/').slice(0, 2).join('/')) ?? []) - ).sort() + ).sort() : Array.from( new Set(filteredItems?.map((x) => x.script_path.split('/').slice(0, 2).join('/')) ?? []) - ).sort() + ).sort() $: items = filter !== '' ? filteredItems : preFilteredItems @@ -379,7 +387,7 @@ ? { icon: Pen } : { icon: Eye - }} + }} color="dark" > {canWrite ? 'Edit' : 'View'} @@ -426,7 +434,7 @@ }) } } - ] + ] : []), { displayName: 'Audit logs', diff --git a/frontend/src/routes/(root)/(logged)/postgres_triggers/+page.svelte b/frontend/src/routes/(root)/(logged)/postgres_triggers/+page.svelte index 7af681c309..a23c23381e 100644 --- a/frontend/src/routes/(root)/(logged)/postgres_triggers/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/postgres_triggers/+page.svelte @@ -10,7 +10,8 @@ displayDate, getLocalSetting, sendUserToast, - storeLocalSetting + storeLocalSetting, + removeTriggerKindIfUnused } from '$lib/utils' import { base } from '$app/paths' import CenteredPage from '$lib/components/CenteredPage.svelte' @@ -20,7 +21,7 @@ import SharedBadge from '$lib/components/SharedBadge.svelte' import ShareModal from '$lib/components/ShareModal.svelte' import Toggle from '$lib/components/Toggle.svelte' - import { enterpriseLicense, userStore, workspaceStore } from '$lib/stores' + import { enterpriseLicense, usedTriggerKinds, userStore, workspaceStore } from '$lib/stores' import { Code, Eye, Pen, Plus, Share, Trash, Circle, Database, FileUp } from 'lucide-svelte' import { goto } from '$lib/navigation' import SearchItems from '$lib/components/SearchItems.svelte' @@ -61,6 +62,7 @@ ).map((x) => { return { canWrite: canWrite(x.path, x.extra_perms!, $userStore), ...x } }) + $usedTriggerKinds = removeTriggerKindIfUnused(triggers.length, 'postgres', $usedTriggerKinds) loading = false } diff --git a/frontend/src/routes/(root)/(logged)/routes/+page.svelte b/frontend/src/routes/(root)/(logged)/routes/+page.svelte index 1a33fae1be..89163b464a 100644 --- a/frontend/src/routes/(root)/(logged)/routes/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/routes/+page.svelte @@ -10,7 +10,8 @@ copyToClipboard, displayDate, getLocalSetting, - storeLocalSetting + storeLocalSetting, + removeTriggerKindIfUnused } from '$lib/utils' import { base } from '$app/paths' import CenteredPage from '$lib/components/CenteredPage.svelte' @@ -20,7 +21,13 @@ import SharedBadge from '$lib/components/SharedBadge.svelte' import ShareModal from '$lib/components/ShareModal.svelte' import Toggle from '$lib/components/Toggle.svelte' - import { userStore, workspaceStore, userWorkspaces, enterpriseLicense } from '$lib/stores' + import { + userStore, + workspaceStore, + userWorkspaces, + enterpriseLicense, + usedTriggerKinds + } from '$lib/stores' import { Route, Code, Eye, Pen, Plus, Share, Trash, FileUp, ClipboardCopy } from 'lucide-svelte' import { goto } from '$lib/navigation' import SearchItems from '$lib/components/SearchItems.svelte' @@ -60,6 +67,7 @@ return { canWrite: canWrite(x.path, x.extra_perms!, $userStore), ...x } } ) + $usedTriggerKinds = removeTriggerKindIfUnused(triggers.length, 'routes', $usedTriggerKinds) loading = false } @@ -115,15 +123,15 @@ (x) => x.path.startsWith(ownerFilter + '/') && filterItemsPathsBaseOnUserFilters(x, selectedFilterKind, filterUserFolders) - ) + ) : triggers?.filter( (x) => x.script_path.startsWith(ownerFilter + '/') && filterItemsPathsBaseOnUserFilters(x, selectedFilterKind, filterUserFolders) - ) + ) : triggers?.filter((x) => filterItemsPathsBaseOnUserFilters(x, selectedFilterKind, filterUserFolders) - ) + ) $: if ($workspaceStore) { ownerFilter = undefined @@ -133,14 +141,14 @@ selectedFilterKind === 'trigger' ? Array.from( new Set(filteredItems?.map((x) => x.path.split('/').slice(0, 2).join('/')) ?? []) - ).sort() + ).sort() : Array.from( new Set( filteredItems ?.filter((x) => x.script_path) .map((x) => x.script_path.split('/').slice(0, 2).join('/')) ?? [] ) - ).sort() + ).sort() $: items = filter !== '' ? filteredItems : preFilteredItems @@ -299,7 +307,7 @@ ? { icon: Pen } : { icon: Eye - }} + }} color="dark" > {canWrite ? 'Edit' : 'View'} @@ -347,7 +355,7 @@ }) } } - ] + ] : []), { displayName: 'Audit logs', diff --git a/frontend/src/routes/(root)/(logged)/sqs_triggers/+page.svelte b/frontend/src/routes/(root)/(logged)/sqs_triggers/+page.svelte index 91869fc2a5..b5a5522652 100644 --- a/frontend/src/routes/(root)/(logged)/sqs_triggers/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/sqs_triggers/+page.svelte @@ -10,7 +10,8 @@ displayDate, getLocalSetting, sendUserToast, - storeLocalSetting + storeLocalSetting, + removeTriggerKindIfUnused } from '$lib/utils' import { base } from '$app/paths' import CenteredPage from '$lib/components/CenteredPage.svelte' @@ -20,7 +21,7 @@ import SharedBadge from '$lib/components/SharedBadge.svelte' import ShareModal from '$lib/components/ShareModal.svelte' import Toggle from '$lib/components/Toggle.svelte' - import { enterpriseLicense, userStore, workspaceStore } from '$lib/stores' + import { enterpriseLicense, usedTriggerKinds, userStore, workspaceStore } from '$lib/stores' import { Code, Eye, Pen, Plus, Share, Trash, Circle, FileUp } from 'lucide-svelte' import { goto } from '$lib/navigation' import SearchItems from '$lib/components/SearchItems.svelte' @@ -61,6 +62,7 @@ return { canWrite: canWrite(x.path, x.extra_perms!, $userStore), ...x } } ) + $usedTriggerKinds = removeTriggerKindIfUnused(triggers.length, 'sqs', $usedTriggerKinds) loading = false } @@ -159,15 +161,15 @@ (x) => x.path.startsWith(ownerFilter + '/') && filterItemsPathsBaseOnUserFilters(x, selectedFilterKind, filterUserFolders) - ) + ) : triggers?.filter( (x) => x.script_path.startsWith(ownerFilter + '/') && filterItemsPathsBaseOnUserFilters(x, selectedFilterKind, filterUserFolders) - ) + ) : triggers?.filter((x) => filterItemsPathsBaseOnUserFilters(x, selectedFilterKind, filterUserFolders) - ) + ) $: if ($workspaceStore) { ownerFilter = undefined @@ -177,10 +179,10 @@ selectedFilterKind === 'trigger' ? Array.from( new Set(filteredItems?.map((x) => x.path.split('/').slice(0, 2).join('/')) ?? []) - ).sort() + ).sort() : Array.from( new Set(filteredItems?.map((x) => x.script_path.split('/').slice(0, 2).join('/')) ?? []) - ).sort() + ).sort() $: items = filter !== '' ? filteredItems : preFilteredItems @@ -357,7 +359,7 @@ ? { icon: Pen } : { icon: Eye - }} + }} color="dark" > {canWrite ? 'Edit' : 'View'} @@ -408,7 +410,7 @@ }) } } - ] + ] : []), { displayName: 'Audit logs', diff --git a/frontend/src/routes/(root)/(logged)/websocket_triggers/+page.svelte b/frontend/src/routes/(root)/(logged)/websocket_triggers/+page.svelte index 9aaa45728f..ceaf3950c4 100644 --- a/frontend/src/routes/(root)/(logged)/websocket_triggers/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/websocket_triggers/+page.svelte @@ -10,7 +10,8 @@ displayDate, getLocalSetting, sendUserToast, - storeLocalSetting + storeLocalSetting, + removeTriggerKindIfUnused } from '$lib/utils' import { base } from '$app/paths' import CenteredPage from '$lib/components/CenteredPage.svelte' @@ -20,7 +21,7 @@ import SharedBadge from '$lib/components/SharedBadge.svelte' import ShareModal from '$lib/components/ShareModal.svelte' import Toggle from '$lib/components/Toggle.svelte' - import { enterpriseLicense, userStore, workspaceStore } from '$lib/stores' + import { enterpriseLicense, usedTriggerKinds, userStore, workspaceStore } from '$lib/stores' import { Unplug, Code, Eye, Pen, Plus, Share, Trash, Circle, FileUp } from 'lucide-svelte' import { goto } from '$lib/navigation' import SearchItems from '$lib/components/SearchItems.svelte' @@ -60,6 +61,7 @@ ).map((x) => { return { canWrite: canWrite(x.path, x.extra_perms!, $userStore), ...x } }) + $usedTriggerKinds = removeTriggerKindIfUnused(triggers.length, 'websockets', $usedTriggerKinds) loading = false } @@ -158,15 +160,15 @@ (x) => x.path.startsWith(ownerFilter + '/') && filterItemsPathsBaseOnUserFilters(x, selectedFilterKind, filterUserFolders) - ) + ) : triggers?.filter( (x) => x.script_path.startsWith(ownerFilter + '/') && filterItemsPathsBaseOnUserFilters(x, selectedFilterKind, filterUserFolders) - ) + ) : triggers?.filter((x) => filterItemsPathsBaseOnUserFilters(x, selectedFilterKind, filterUserFolders) - ) + ) $: if ($workspaceStore) { ownerFilter = undefined @@ -176,10 +178,10 @@ selectedFilterKind === 'trigger' ? Array.from( new Set(filteredItems?.map((x) => x.path.split('/').slice(0, 2).join('/')) ?? []) - ).sort() + ).sort() : Array.from( new Set(filteredItems?.map((x) => x.script_path.split('/').slice(0, 2).join('/')) ?? []) - ).sort() + ).sort() $: items = filter !== '' ? filteredItems : preFilteredItems @@ -304,8 +306,8 @@ {url.startsWith('$script:') ? 'URL: ' + url.replace('$script:', 'result of script ') : url.startsWith('$flow:') - ? 'URL: ' + url.replace('$flow:', 'result of flow ') - : url} + ? 'URL: ' + url.replace('$flow:', 'result of flow ') + : url} {/if}
@@ -370,7 +372,7 @@ ? { icon: Pen } : { icon: Eye - }} + }} color="dark" > {canWrite ? 'Edit' : 'View'} @@ -417,7 +419,7 @@ }) } } - ] + ] : []), { displayName: 'Audit logs', From 60a848af489653bfe0309242fddc0907f5e393d4 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Wed, 23 Apr 2025 16:05:34 +0200 Subject: [PATCH 269/739] improve label filtering with wildcards --- ...70fcffccd5fae8e2e352de3e1eb104e7fc3a6.json | 23 ------------------- backend/windmill-api/src/jobs.rs | 2 +- 2 files changed, 1 insertion(+), 24 deletions(-) delete mode 100644 backend/.sqlx/query-264da6a89d005aebf4d5cd5f05e70fcffccd5fae8e2e352de3e1eb104e7fc3a6.json diff --git a/backend/.sqlx/query-264da6a89d005aebf4d5cd5f05e70fcffccd5fae8e2e352de3e1eb104e7fc3a6.json b/backend/.sqlx/query-264da6a89d005aebf4d5cd5f05e70fcffccd5fae8e2e352de3e1eb104e7fc3a6.json deleted file mode 100644 index f43524a12a..0000000000 --- a/backend/.sqlx/query-264da6a89d005aebf4d5cd5f05e70fcffccd5fae8e2e352de3e1eb104e7fc3a6.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT jsonb_build_object(\n 'kind', jb.kind,\n 'script_path', jb.runnable_path,\n 'latest_schema', COALESCE(\n (SELECT DISTINCT ON (s.path) s.schema FROM script s WHERE s.path = jb.runnable_path AND jb.kind = 'script' ORDER BY s.path, s.created_at DESC),\n (SELECT flow_version.schema FROM flow LEFT JOIN flow_version ON flow_version.id = flow.versions[array_upper(flow.versions, 1)] WHERE flow.path = jb.runnable_path AND jb.kind = 'flow')\n ),\n 'schemas', ARRAY(\n SELECT jsonb_build_object(\n 'script_hash', LPAD(TO_HEX(COALESCE(s.hash, f.id)), 16, '0'),\n 'job_ids', ARRAY_AGG(DISTINCT j.id),\n 'schema', (ARRAY_AGG(COALESCE(s.schema, f.schema)))[1]\n ) FROM v2_job j\n LEFT JOIN script s ON s.hash = j.runnable_id AND j.kind = 'script'\n LEFT JOIN flow_version f ON f.id = j.runnable_id AND j.kind = 'flow'\n WHERE j.id = ANY(ARRAY_AGG(jb.id))\n GROUP BY COALESCE(s.hash, f.id)\n )\n ) FROM v2_job jb\n WHERE (jb.kind = 'flow' OR jb.kind = 'script')\n AND jb.workspace_id = $1 AND jb.id = ANY($2)\n GROUP BY jb.kind, jb.runnable_path", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "jsonb_build_object", - "type_info": "Jsonb" - } - ], - "parameters": { - "Left": [ - "Text", - "UuidArray" - ] - }, - "nullable": [ - null - ] - }, - "hash": "264da6a89d005aebf4d5cd5f05e70fcffccd5fae8e2e352de3e1eb104e7fc3a6" -} diff --git a/backend/windmill-api/src/jobs.rs b/backend/windmill-api/src/jobs.rs index 5317b78fbc..1ed0871a7c 100644 --- a/backend/windmill-api/src/jobs.rs +++ b/backend/windmill-api/src/jobs.rs @@ -5839,7 +5839,7 @@ pub fn filter_list_completed_query( if let Some(label) = &lq.label { if lq.allow_wildcards.unwrap_or(false) { let wh = format!( - "EXISTS (SELECT 1 FROM jsonb_array_elements_text(result->'wm_labels') label WHERE label LIKE '{}')", + "EXISTS (SELECT 1 FROM jsonb_array_elements_text(result->'wm_labels') label WHERE jsonb_typeof(result->'wm_labels') = 'array' AND label LIKE '{}')", &label.replace("*", "%").replace("'", "''") ); sqlb.and_where("result ? 'wm_labels'"); From b146de281b3d6e24a43ca594f4e5cedfcafb0d04 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Wed, 23 Apr 2025 19:07:16 +0200 Subject: [PATCH 270/739] improve warning message for self-approval for superadmins --- .../approve/[workspace]/[job]/[resume]/[hmac]/+page.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/routes/approve/[workspace]/[job]/[resume]/[hmac]/+page.svelte b/frontend/src/routes/approve/[workspace]/[job]/[resume]/[hmac]/+page.svelte index 826e0f0bb4..bdb984fdc8 100644 --- a/frontend/src/routes/approve/[workspace]/[job]/[resume]/[hmac]/+page.svelte +++ b/frontend/src/routes/approve/[workspace]/[job]/[resume]/[hmac]/+page.svelte @@ -266,7 +266,7 @@ >
{/if} - {#if !completed && !alreadyResumed && job?.raw_flow?.modules?.[approvalStep]?.suspend?.user_auth_required && job?.raw_flow?.modules?.[approvalStep]?.suspend?.self_approval_disabled && $userStore && $userStore.email === job.email && $userStore.is_admin} + {#if !completed && !alreadyResumed && job?.raw_flow?.modules?.[approvalStep]?.suspend?.user_auth_required && job?.raw_flow?.modules?.[approvalStep]?.suspend?.self_approval_disabled && $userStore && $userStore.email === job.email && ($userStore.is_admin || $userStore.is_super_admin)}
As an administrator, by resuming or cancelling this stage of the flow, you bypass the From c41c1eb587bf22364f1202310a0c64b6040ab968 Mon Sep 17 00:00:00 2001 From: Guilhem Date: Wed, 23 Apr 2025 18:20:46 +0100 Subject: [PATCH 271/739] fix(frontend): fix validity check (#5654) --- .../triggers/postgres/PostgresEditorConfigSection.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/lib/components/triggers/postgres/PostgresEditorConfigSection.svelte b/frontend/src/lib/components/triggers/postgres/PostgresEditorConfigSection.svelte index 9ed430bcee..00018eca3c 100644 --- a/frontend/src/lib/components/triggers/postgres/PostgresEditorConfigSection.svelte +++ b/frontend/src/lib/components/triggers/postgres/PostgresEditorConfigSection.svelte @@ -37,7 +37,7 @@ function updateValidity(publication: PublicationData) { isValid = !emptyString(postgres_resource_path) && - (!publication.table_to_track || publication.table_to_track.length === 0) + (!publication.table_to_track || publication.table_to_track.length !== 0) } $: updateValidity(publication) From 8d4d2db5073c52a8b05f2e001445deabe4d0988e Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Wed, 23 Apr 2025 19:24:48 +0200 Subject: [PATCH 272/739] chore(main): release 1.483.2 (#5648) * chore(main): release 1.483.2 * Apply automatic changes --------- Co-authored-by: rubenfiszel <275584+rubenfiszel@users.noreply.github.com> --- CHANGELOG.md | 10 ++ backend/Cargo.lock | 114 +++++++++--------- backend/Cargo.toml | 4 +- backend/windmill-api/openapi.yaml | 2 +- benchmarks/lib.ts | 2 +- cli/main.ts | 2 +- frontend/package-lock.json | 4 +- frontend/package.json | 2 +- lsp/Pipfile | 4 +- openflow.openapi.yaml | 2 +- .../WindmillClient/WindmillClient.psd1 | 2 +- python-client/wmill/pyproject.toml | 2 +- python-client/wmill_pg/pyproject.toml | 2 +- typescript-client/jsr.json | 2 +- typescript-client/package.json | 2 +- version.txt | 2 +- 16 files changed, 84 insertions(+), 74 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c5ee479f4..12c7a5399f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## [1.483.2](https://github.com/windmill-labs/windmill/compare/v1.483.1...v1.483.2) (2025-04-23) + + +### Bug Fixes + +* batch reruns query missing workspace_id check in subquery ([#5652](https://github.com/windmill-labs/windmill/issues/5652)) ([444a6ab](https://github.com/windmill-labs/windmill/commit/444a6abad670114c52e44f3606bf6fefc5d3fd98)) +* **frontend:** fix validity check ([#5654](https://github.com/windmill-labs/windmill/issues/5654)) ([c41c1eb](https://github.com/windmill-labs/windmill/commit/c41c1eb587bf22364f1202310a0c64b6040ab968)) +* improve MySQL datetime parser timezone handling (WIN-1155) ([#5645](https://github.com/windmill-labs/windmill/issues/5645)) ([5bca8f6](https://github.com/windmill-labs/windmill/commit/5bca8f60e970cc67839edb5dc491685f36cf0499)) +* track relative imports in python and ts even if lockfile is provided ([e316dbd](https://github.com/windmill-labs/windmill/commit/e316dbd9bdd5c59e9aaba6a4472bb7d832834e84)) + ## [1.483.1](https://github.com/windmill-labs/windmill/compare/v1.483.0...v1.483.1) (2025-04-19) diff --git a/backend/Cargo.lock b/backend/Cargo.lock index 247f2cc5ba..c0256d1816 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -109,7 +109,7 @@ version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", "once_cell", "version_check", ] @@ -122,7 +122,7 @@ checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", "const-random", - "getrandom 0.2.15", + "getrandom 0.2.16", "once_cell", "version_check", "zerocopy 0.7.35", @@ -793,9 +793,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.28.1" +version = "0.28.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ddeb19ee86cb16ecfc871e5b0660aff6285760957aaedda6284cf0e790d3769" +checksum = "bfa9b6986f250236c27e5a204062434a773a13243d2ffc2955f37bdba4c5c6a1" dependencies = [ "bindgen 0.69.5", "cc", @@ -1419,9 +1419,9 @@ dependencies = [ [[package]] name = "blake3" -version = "1.8.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389a099b34312839e16420d499a9cad9650541715937ffbdd40d36f49e77eeb3" +checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" dependencies = [ "arrayref", "arrayvec", @@ -2133,7 +2133,7 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", "once_cell", "tiny-keccak", ] @@ -5241,9 +5241,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "js-sys", @@ -6803,9 +6803,9 @@ dependencies = [ [[package]] name = "libm" -version = "0.2.11" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" +checksum = "c9627da5196e5d8ed0b0495e61e518847578da83483c37288316d9b2e03a7f72" [[package]] name = "libproc" @@ -7526,7 +7526,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", ] [[package]] @@ -7624,7 +7624,7 @@ dependencies = [ "data-encoding", "ed25519", "ed25519-dalek", - "getrandom 0.2.15", + "getrandom 0.2.16", "log", "rand 0.8.5", "signatory", @@ -8018,7 +8018,7 @@ checksum = "51e219e79014df21a225b1860a479e2dcd7cbd9130f4defd4bd0e191ea31d67d" dependencies = [ "base64 0.22.1", "chrono", - "getrandom 0.2.15", + "getrandom 0.2.16", "http 1.3.1", "rand 0.8.5", "reqwest 0.12.15", @@ -9291,9 +9291,9 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.10" +version = "0.11.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b820744eb4dc9b57a3398183639c511b5a26d2ed702cedd3febaa1393caa22cc" +checksum = "bcbafbbdbb0f638fe3f35f3c56739f77a8a1d070cb25603226c83339b391472b" dependencies = [ "bytes", "getrandom 0.3.2", @@ -9402,7 +9402,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", ] [[package]] @@ -9547,7 +9547,7 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", "libredox", "thiserror 1.0.69", ] @@ -9756,7 +9756,7 @@ dependencies = [ "anyhow", "async-trait", "futures", - "getrandom 0.2.15", + "getrandom 0.2.16", "http 1.3.1", "hyper 1.6.0", "parking_lot 0.11.2", @@ -9826,7 +9826,7 @@ checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.15", + "getrandom 0.2.16", "libc", "untrusted 0.9.0", "windows-sys 0.52.0", @@ -10550,9 +10550,9 @@ dependencies = [ [[package]] name = "serde-aux" -version = "4.6.0" +version = "4.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5290c39c5f6992b9dddbda28541d965dba46468294e6018a408fa297e6c602de" +checksum = "207f67b28fe90fb596503a9bf0bf1ea5e831e21307658e177c5dfcdfc3ab8a0a" dependencies = [ "chrono", "serde", @@ -10820,9 +10820,9 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.2" +version = "1.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" dependencies = [ "libc", ] @@ -10870,7 +10870,7 @@ version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa2bcf6c6e164e81bc7a5d49fc6988b3d515d9e8c07457d7b74ffb9324b9cd40" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", "halfbrown", "ref-cast", "serde", @@ -12442,7 +12442,7 @@ dependencies = [ "clap", "derive_builder", "esaxx-rs", - "getrandom 0.2.15", + "getrandom 0.2.16", "indicatif", "itertools 0.11.0", "lazy_static", @@ -12673,16 +12673,16 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.14" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b9590b93e6fcc1739458317cccd391ad3955e2bde8913edf6f95f9e65a8f034" +checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" dependencies = [ "bytes", "futures-core", "futures-io", "futures-sink", "futures-util", - "hashbrown 0.14.5", + "hashbrown 0.15.2", "pin-project-lite", "slab", "tokio", @@ -13912,7 +13912,7 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windmill" -version = "1.483.1" +version = "1.483.2" dependencies = [ "anyhow", "axum", @@ -13959,7 +13959,7 @@ dependencies = [ [[package]] name = "windmill-api" -version = "1.483.1" +version = "1.483.2" dependencies = [ "anyhow", "argon2", @@ -14068,7 +14068,7 @@ dependencies = [ [[package]] name = "windmill-api-client" -version = "1.483.1" +version = "1.483.2" dependencies = [ "base64 0.22.1", "chrono", @@ -14083,7 +14083,7 @@ dependencies = [ [[package]] name = "windmill-audit" -version = "1.483.1" +version = "1.483.2" dependencies = [ "chrono", "serde", @@ -14096,7 +14096,7 @@ dependencies = [ [[package]] name = "windmill-autoscaling" -version = "1.483.1" +version = "1.483.2" dependencies = [ "anyhow", "serde", @@ -14110,7 +14110,7 @@ dependencies = [ [[package]] name = "windmill-common" -version = "1.483.1" +version = "1.483.2" dependencies = [ "anyhow", "async-stream", @@ -14174,7 +14174,7 @@ dependencies = [ [[package]] name = "windmill-git-sync" -version = "1.483.1" +version = "1.483.2" dependencies = [ "regex", "serde", @@ -14188,7 +14188,7 @@ dependencies = [ [[package]] name = "windmill-indexer" -version = "1.483.1" +version = "1.483.2" dependencies = [ "anyhow", "bytes", @@ -14211,7 +14211,7 @@ dependencies = [ [[package]] name = "windmill-macros" -version = "1.483.1" +version = "1.483.2" dependencies = [ "itertools 0.14.0", "lazy_static", @@ -14223,7 +14223,7 @@ dependencies = [ [[package]] name = "windmill-parser" -version = "1.483.1" +version = "1.483.2" dependencies = [ "convert_case 0.6.0", "serde", @@ -14232,7 +14232,7 @@ dependencies = [ [[package]] name = "windmill-parser-bash" -version = "1.483.1" +version = "1.483.2" dependencies = [ "anyhow", "lazy_static", @@ -14244,7 +14244,7 @@ dependencies = [ [[package]] name = "windmill-parser-csharp" -version = "1.483.1" +version = "1.483.2" dependencies = [ "anyhow", "serde_json", @@ -14256,7 +14256,7 @@ dependencies = [ [[package]] name = "windmill-parser-go" -version = "1.483.1" +version = "1.483.2" dependencies = [ "anyhow", "gosyn", @@ -14268,7 +14268,7 @@ dependencies = [ [[package]] name = "windmill-parser-graphql" -version = "1.483.1" +version = "1.483.2" dependencies = [ "anyhow", "lazy_static", @@ -14280,7 +14280,7 @@ dependencies = [ [[package]] name = "windmill-parser-java" -version = "1.483.1" +version = "1.483.2" dependencies = [ "anyhow", "serde_json", @@ -14292,7 +14292,7 @@ dependencies = [ [[package]] name = "windmill-parser-nu" -version = "1.483.1" +version = "1.483.2" dependencies = [ "anyhow", "nu-parser", @@ -14303,7 +14303,7 @@ dependencies = [ [[package]] name = "windmill-parser-php" -version = "1.483.1" +version = "1.483.2" dependencies = [ "anyhow", "itertools 0.14.0", @@ -14314,7 +14314,7 @@ dependencies = [ [[package]] name = "windmill-parser-py" -version = "1.483.1" +version = "1.483.2" dependencies = [ "anyhow", "itertools 0.14.0", @@ -14325,7 +14325,7 @@ dependencies = [ [[package]] name = "windmill-parser-py-imports" -version = "1.483.1" +version = "1.483.2" dependencies = [ "anyhow", "async-recursion", @@ -14345,7 +14345,7 @@ dependencies = [ [[package]] name = "windmill-parser-rust" -version = "1.483.1" +version = "1.483.2" dependencies = [ "anyhow", "convert_case 0.6.0", @@ -14362,7 +14362,7 @@ dependencies = [ [[package]] name = "windmill-parser-sql" -version = "1.483.1" +version = "1.483.2" dependencies = [ "anyhow", "lazy_static", @@ -14374,7 +14374,7 @@ dependencies = [ [[package]] name = "windmill-parser-ts" -version = "1.483.1" +version = "1.483.2" dependencies = [ "anyhow", "lazy_static", @@ -14392,10 +14392,10 @@ dependencies = [ [[package]] name = "windmill-parser-wasm" -version = "1.483.1" +version = "1.483.2" dependencies = [ "anyhow", - "getrandom 0.2.15", + "getrandom 0.2.16", "serde_json", "wasm-bindgen", "wasm-bindgen-test", @@ -14416,7 +14416,7 @@ dependencies = [ [[package]] name = "windmill-parser-yaml" -version = "1.483.1" +version = "1.483.2" dependencies = [ "anyhow", "serde_json", @@ -14426,7 +14426,7 @@ dependencies = [ [[package]] name = "windmill-queue" -version = "1.483.1" +version = "1.483.2" dependencies = [ "anyhow", "async-recursion", @@ -14459,7 +14459,7 @@ dependencies = [ [[package]] name = "windmill-sql-datatype-parser-wasm" -version = "1.483.1" +version = "1.483.2" dependencies = [ "wasm-bindgen", "wasm-bindgen-test", @@ -14469,7 +14469,7 @@ dependencies = [ [[package]] name = "windmill-worker" -version = "1.483.1" +version = "1.483.2" dependencies = [ "anyhow", "async-recursion", diff --git a/backend/Cargo.toml b/backend/Cargo.toml index 52f6f39ce6..e1f4403506 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "windmill" -version = "1.483.1" +version = "1.483.2" authors.workspace = true edition.workspace = true @@ -32,7 +32,7 @@ members = [ ] [workspace.package] -version = "1.483.1" +version = "1.483.2" authors = ["Ruben Fiszel "] edition = "2021" diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index cd3eea2850..0dae5e223a 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.483.1 + version: 1.483.2 title: Windmill API contact: diff --git a/benchmarks/lib.ts b/benchmarks/lib.ts index ee61b90d51..96c5771001 100644 --- a/benchmarks/lib.ts +++ b/benchmarks/lib.ts @@ -2,7 +2,7 @@ import { sleep } from "https://deno.land/x/sleep@v1.2.1/mod.ts"; import * as windmill from "https://deno.land/x/windmill@v1.174.0/mod.ts"; import * as api from "https://deno.land/x/windmill@v1.174.0/windmill-api/index.ts"; -export const VERSION = "v1.483.1"; +export const VERSION = "v1.483.2"; export async function login(email: string, password: string): Promise { return await windmill.UserService.login({ diff --git a/cli/main.ts b/cli/main.ts index ab60532ce1..a5dad4a285 100644 --- a/cli/main.ts +++ b/cli/main.ts @@ -63,7 +63,7 @@ export { // } // }); -export const VERSION = "1.483.1"; +export const VERSION = "1.483.2"; const command = new Command() .name("wmill") diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 2cea18aab6..3f75cdd606 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "windmill-components", - "version": "1.483.1", + "version": "1.483.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "windmill-components", - "version": "1.483.1", + "version": "1.483.2", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/frontend/package.json b/frontend/package.json index 9ba7dd084d..49c9aab002 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "windmill-components", - "version": "1.483.1", + "version": "1.483.2", "scripts": { "dev": "vite dev", "build": "vite build", diff --git a/lsp/Pipfile b/lsp/Pipfile index 572e02ad91..a261d308a7 100644 --- a/lsp/Pipfile +++ b/lsp/Pipfile @@ -4,8 +4,8 @@ verify_ssl = true name = "pypi" [packages] -wmill = ">=1.483.1" -wmill_pg = ">=1.483.1" +wmill = ">=1.483.2" +wmill_pg = ">=1.483.2" sendgrid = "*" mysql-connector-python = "*" pymongo = "*" diff --git a/openflow.openapi.yaml b/openflow.openapi.yaml index 560bcad877..1be14fd156 100644 --- a/openflow.openapi.yaml +++ b/openflow.openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.483.1 + version: 1.483.2 title: OpenFlow Spec contact: name: Ruben Fiszel diff --git a/powershell-client/WindmillClient/WindmillClient.psd1 b/powershell-client/WindmillClient/WindmillClient.psd1 index a0f2ebc8b1..9dbaba6de3 100644 --- a/powershell-client/WindmillClient/WindmillClient.psd1 +++ b/powershell-client/WindmillClient/WindmillClient.psd1 @@ -12,7 +12,7 @@ RootModule = 'WindmillClient.psm1' # Version number of this module. - ModuleVersion = '1.483.1' + ModuleVersion = '1.483.2' # Supported PSEditions # CompatiblePSEditions = @() diff --git a/python-client/wmill/pyproject.toml b/python-client/wmill/pyproject.toml index e8e8749dec..58adf9b51e 100644 --- a/python-client/wmill/pyproject.toml +++ b/python-client/wmill/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "wmill" -version = "1.483.1" +version = "1.483.2" description = "A client library for accessing Windmill server wrapping the Windmill client API" license = "Apache-2.0" homepage = "https://windmill.dev" diff --git a/python-client/wmill_pg/pyproject.toml b/python-client/wmill_pg/pyproject.toml index dcc137a381..1d155b23e0 100644 --- a/python-client/wmill_pg/pyproject.toml +++ b/python-client/wmill_pg/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "wmill-pg" -version = "1.483.1" +version = "1.483.2" description = "An extension client for the wmill client library focused on pg" license = "Apache-2.0" homepage = "https://windmill.dev" diff --git a/typescript-client/jsr.json b/typescript-client/jsr.json index 532504ea0f..071d935988 100644 --- a/typescript-client/jsr.json +++ b/typescript-client/jsr.json @@ -1,6 +1,6 @@ { "name": "@windmill/windmill", - "version": "1.483.1", + "version": "1.483.2", "exports": "./src/index.ts", "publish": { "exclude": ["!src", "./s3Types.ts", "./client.ts"] diff --git a/typescript-client/package.json b/typescript-client/package.json index fb6018f26b..e7c9f89a25 100644 --- a/typescript-client/package.json +++ b/typescript-client/package.json @@ -1,7 +1,7 @@ { "name": "windmill-client", "description": "Windmill SDK client for browsers and Node.js", - "version": "1.483.1", + "version": "1.483.2", "author": "Ruben Fiszel", "license": "Apache 2.0", "devDependencies": { diff --git a/version.txt b/version.txt index f4f7573b1b..236eaf0673 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.483.1 +1.483.2 From a34ac4fa24c2a5482e45724e76316d57f64f7040 Mon Sep 17 00:00:00 2001 From: centdix <40307056+centdix@users.noreply.github.com> Date: Wed, 23 Apr 2025 23:28:41 +0200 Subject: [PATCH 273/739] feat: Add MCP endpoints (#5639) --- backend/Cargo.lock | 89 ++- backend/Cargo.toml | 1 + backend/windmill-api/Cargo.toml | 2 + backend/windmill-api/src/jobs.rs | 1 - backend/windmill-api/src/lib.rs | 52 +- backend/windmill-api/src/mcp.rs | 642 ++++++++++++++++++ .../src/lib/components/TokensTable.svelte | 295 ++++++++ .../src/lib/components/UserSettings.svelte | 222 ++---- .../details/EmailTriggerConfigSection.svelte | 7 +- .../webhook/WebhooksConfigSection.svelte | 17 +- .../src/routes/(root)/(logged)/+layout.svelte | 7 +- .../svix/create-webhook/+page@(root).svelte | 2 +- .../user/(user)/workspaces/+page.svelte | 22 +- 13 files changed, 1102 insertions(+), 257 deletions(-) create mode 100644 backend/windmill-api/src/mcp.rs create mode 100644 frontend/src/lib/components/TokensTable.svelte diff --git a/backend/Cargo.lock b/backend/Cargo.lock index c0256d1816..4f3ca231e6 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -6081,7 +6081,7 @@ dependencies = [ "js-sys", "log", "wasm-bindgen", - "windows-core 0.61.0", + "windows-core 0.57.0", ] [[package]] @@ -6798,7 +6798,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-targets 0.48.5", ] [[package]] @@ -9870,6 +9870,40 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "rmcp" +version = "0.1.5" +source = "git+https://github.com/windmill-labs/rust-sdk#e6c368965711a2afe45218149d1be5324b098a4d" +dependencies = [ + "async-stream", + "axum", + "base64 0.21.7", + "chrono", + "futures", + "paste", + "pin-project-lite", + "rand 0.9.0", + "rmcp-macros", + "schemars", + "serde", + "serde_json", + "thiserror 2.0.12", + "tokio", + "tokio-stream", + "tokio-util", + "tracing", +] + +[[package]] +name = "rmcp-macros" +version = "0.1.5" +source = "git+https://github.com/windmill-labs/rust-sdk#e6c368965711a2afe45218149d1be5324b098a4d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + [[package]] name = "ron" version = "0.8.1" @@ -13771,7 +13805,7 @@ dependencies = [ "log", "naga", "once_cell", - "parking_lot 0.12.3", + "parking_lot 0.11.2", "profiling", "raw-window-handle", "ron", @@ -13813,7 +13847,7 @@ dependencies = [ "ndk-sys", "objc", "once_cell", - "parking_lot 0.12.3", + "parking_lot 0.11.2", "profiling", "range-alloc", "raw-window-handle", @@ -14020,6 +14054,7 @@ dependencies = [ "rdkafka", "regex", "reqwest 0.12.15", + "rmcp", "rsa", "rumqttc", "rust-embed", @@ -14045,7 +14080,7 @@ dependencies = [ "tokio-tungstenite", "tokio-util", "tonic", - "tower 0.5.2", + "tower 0.4.13", "tower-cookies", "tower-http", "tracing", @@ -14624,19 +14659,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "windows-core" -version = "0.61.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" -dependencies = [ - "windows-implement 0.60.0", - "windows-interface 0.59.1", - "windows-link", - "windows-result 0.3.2", - "windows-strings 0.4.0", -] - [[package]] name = "windows-implement" version = "0.56.0" @@ -14670,17 +14692,6 @@ dependencies = [ "syn 2.0.100", ] -[[package]] -name = "windows-implement" -version = "0.60.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.100", -] - [[package]] name = "windows-interface" version = "0.56.0" @@ -14714,17 +14725,6 @@ dependencies = [ "syn 2.0.100", ] -[[package]] -name = "windows-interface" -version = "0.59.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.100", -] - [[package]] name = "windows-link" version = "0.1.1" @@ -14788,15 +14788,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "windows-strings" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97" -dependencies = [ - "windows-link", -] - [[package]] name = "windows-sys" version = "0.48.0" diff --git a/backend/Cargo.toml b/backend/Cargo.toml index e1f4403506..ec8ab26f84 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -72,6 +72,7 @@ dind = ["windmill-worker/dind"] websocket = ["windmill-api/websocket"] http_trigger = ["windmill-api/http_trigger"] postgres_trigger = ["windmill-api/postgres_trigger"] +mcp = ["windmill-api/mcp"] mqtt_trigger = ["windmill-api/mqtt_trigger"] sqs_trigger = ["windmill-api/sqs_trigger", "windmill-common/aws_auth", "windmill-api/openidconnect"] gcp_trigger = ["windmill-api/gcp_trigger"] diff --git a/backend/windmill-api/Cargo.toml b/backend/windmill-api/Cargo.toml index c6702b8ac3..404eb4660e 100644 --- a/backend/windmill-api/Cargo.toml +++ b/backend/windmill-api/Cargo.toml @@ -35,8 +35,10 @@ sqs_trigger = ["dep:aws-sdk-sqs", "dep:thiserror", "dep:aws-config"] deno_core = ["dep:deno_core", "dep:deno_error"] gcp_trigger = ["dep:thiserror", "dep:google-cloud-pubsub", "dep:google-cloud-googleapis", "dep:tonic"] cloud = ["windmill-common/cloud"] +mcp = ["dep:rmcp"] [dependencies] +rmcp = { git = "https://github.com/windmill-labs/rust-sdk", features = ["transport-sse-server"], optional = true } windmill-queue.workspace = true windmill-common = { workspace = true, default-features = false } windmill-audit.workspace = true diff --git a/backend/windmill-api/src/jobs.rs b/backend/windmill-api/src/jobs.rs index 1ed0871a7c..7913796441 100644 --- a/backend/windmill-api/src/jobs.rs +++ b/backend/windmill-api/src/jobs.rs @@ -4622,7 +4622,6 @@ pub async fn run_wait_result_script_by_hash( check_license_key_valid().await?; let args = args.to_push_args_owned(&authed, &db, &w_id).await?; - check_queue_too_long(&db, run_query.queue_limit).await?; let hash = script_hash.0; diff --git a/backend/windmill-api/src/lib.rs b/backend/windmill-api/src/lib.rs index ece80c64b1..d773cc8615 100644 --- a/backend/windmill-api/src/lib.rs +++ b/backend/windmill-api/src/lib.rs @@ -18,6 +18,8 @@ use crate::oauth2_ee::SlackVerifier; #[cfg(feature = "smtp")] use crate::smtp_server_ee::SmtpServer; +#[cfg(feature = "mcp")] +use crate::mcp::{setup_mcp_server, Runner as McpRunner}; use crate::tracing_init::MyOnFailure; use crate::{ tracing_init::{MyMakeSpan, MyOnResponse}, @@ -27,6 +29,7 @@ use crate::{ #[cfg(feature = "agent_worker_server")] use agent_workers_ee::AgentCache; + use anyhow::Context; use argon2::Argon2; use axum::extract::DefaultBodyLimit; @@ -139,6 +142,9 @@ mod workspaces_ee; mod workspaces_export; mod workspaces_extra; +#[cfg(feature = "mcp")] +mod mcp; + pub const DEFAULT_BODY_LIMIT: usize = 2097152 * 100; // 200MB lazy_static::lazy_static! { @@ -448,6 +454,23 @@ pub async fn run_server( } } + let listener = tokio::net::TcpListener::bind(addr) + .await + .context("binding main windmill server")?; + let port = listener.local_addr().map(|x| x.port()).unwrap_or(8000); + let ip = listener + .local_addr() + .map(|x| x.ip().to_string()) + .unwrap_or("localhost".to_string()); + + // Setup MCP server + #[cfg(feature = "mcp")] + let (mcp_sse_server, mcp_router) = setup_mcp_server(addr, "/api/w/:workspace_id/mcp")?; + #[cfg(feature = "mcp")] + let mcp_main_ct = mcp_sse_server.config.ct.clone(); // Token to signal shutdown *to* MCP + #[cfg(feature = "mcp")] + let mcp_service_ct = mcp_sse_server.with_service(McpRunner::new); // Token to wait for MCP *service* shutdown + #[cfg(feature = "agent_worker_server")] let (agent_workers_router, agent_workers_bg_processor, agent_workers_killpill_tx) = agent_workers_ee::workspaced_service(db.clone(), _base_internal_url.clone()); @@ -586,6 +609,17 @@ pub async fn run_server( .layer(from_extractor::()) .layer(cors.clone()), ) + .nest("/w/:workspace_id/mcp", { + #[cfg(feature = "mcp")] + { + mcp_router + } + #[cfg(not(feature = "mcp"))] + { + Router::new() + } + }) + .layer(from_extractor::()) .nest( "/w/:workspace_id/jobs_u", jobs::workspace_unauthed_service().layer(cors.clone()), @@ -694,14 +728,6 @@ pub async fn run_server( .on_failure(MyOnFailure {}), ) }; - let listener = tokio::net::TcpListener::bind(addr) - .await - .context("binding main windmill server")?; - let port = listener.local_addr().map(|x| x.port()).unwrap_or(8000); - let ip = listener - .local_addr() - .map(|x| x.ip().to_string()) - .unwrap_or("localhost".to_string()); let server = axum::serve(listener, app.into_make_service()); @@ -723,10 +749,18 @@ pub async fn run_server( tracing::error!("Error killing agent workers: {e:#}"); } tracing::info!("Graceful shutdown of server"); + + #[cfg(feature = "mcp")] + { + tracing::info!("Received shutdown signal, cancelling MCP server..."); + mcp_main_ct.cancel(); + tracing::info!("Waiting for MCP service cancellation..."); + mcp_service_ct.cancelled().await; + tracing::info!("MCP service cancelled."); + } }); server.await?; - #[cfg(feature = "agent_worker_server")] for (i, bg_processor) in agent_workers_bg_processor.into_iter().enumerate() { tracing::info!("server off. shutting down agent worker bg processor {i}"); diff --git a/backend/windmill-api/src/mcp.rs b/backend/windmill-api/src/mcp.rs new file mode 100644 index 0000000000..b30f80d643 --- /dev/null +++ b/backend/windmill-api/src/mcp.rs @@ -0,0 +1,642 @@ +use std::borrow::Cow; +use std::collections::HashMap; +use std::net::SocketAddr; +use std::sync::Arc; + +use axum::body::to_bytes; +use axum::Router; +use rmcp::transport::sse_server::{SseServer, SseServerConfig}; +use rmcp::{ + handler::server::ServerHandler, + model::*, + service::{RequestContext, RoleServer}, + Error, +}; +use serde::{Deserialize, Serialize}; +use serde_json::Value; +use sql_builder::prelude::*; +use sqlx::FromRow; +use tokio::try_join; +use tokio_util::sync::CancellationToken; +use windmill_common::db::UserDB; +use windmill_common::worker::to_raw_value; +use windmill_common::DB; + +use crate::db::ApiAuthed; +use crate::jobs::{ + run_wait_result_flow_by_path_internal, run_wait_result_script_by_path_internal, RunJobQuery, +}; +use windmill_common::utils::StripPath; + +#[derive(Clone)] +pub struct Runner {} + +#[derive(Serialize, Deserialize, Debug, Clone, Default)] +struct Schema { + #[serde(default)] + properties: HashMap, + #[serde(flatten)] + other: HashMap, +} + +#[derive(Serialize, Deserialize, Debug, Clone, Default)] +struct SchemaProperty { + #[serde(skip_serializing_if = "Option::is_none")] + format: Option, + #[serde(skip_serializing_if = "Option::is_none")] + description: Option, + #[serde(skip_serializing_if = "Option::is_none")] + r#type: Option, + #[serde(skip_serializing_if = "Option::is_none")] + #[allow(non_snake_case)] + oneOf: Option>, + #[serde(flatten)] + other: HashMap, +} + +#[derive(Serialize, FromRow)] +struct ScriptInfo { + path: String, + summary: Option, + description: Option, + schema: Option, +} + +#[derive(Serialize, FromRow, Debug)] +struct FlowInfo { + path: String, + summary: Option, + description: Option, + schema: Option, +} + +#[derive(Serialize, FromRow, Debug)] +struct ResourceInfo { + path: String, + description: Option, + resource_type: String, +} + +#[derive(Serialize, FromRow, Debug)] +struct ResourceType { + name: String, + description: Option, +} + +#[derive(Serialize, FromRow, Debug)] +struct ResourceCache { + resource_type: ResourceType, + resources: Vec, +} + +impl Runner { + pub fn new() -> Self { + Self {} + } + + fn transform_path(path: &str, type_str: &str) -> Result { + if type_str != "script" && type_str != "flow" { + return Err(format!("Invalid type: {}", type_str)); + } + + // Only apply special underscore escaping for paths starting with "f/" + let transformed = if path.starts_with("f/") { + let escaped_path = path.replace('_', "__"); + escaped_path.replace('/', "_") + } else { + path.replace('/', "_") + }; + + Ok(format!("{}-{}", type_str, transformed)) + } + + fn reverse_transform(transformed_path: &str) -> Result<(&str, String), String> { + let prefix = if transformed_path.starts_with("script-") { + "script-" + } else if transformed_path.starts_with("flow-") { + "flow-" + } else { + return Err(format!( + "Invalid prefix in transformed path: {}", + transformed_path + )); + }; + + let type_str = &prefix[..prefix.len() - 1]; // "script" or "flow" + let mangled_path = &transformed_path[prefix.len()..]; + + // Check if this path was previously transformed with special underscore handling + let is_special_path = mangled_path.starts_with("f_"); + + let original_path = if is_special_path { + const TEMP_PLACEHOLDER: &str = "@@UNDERSCORE@@"; + let path_with_placeholder = mangled_path.replace("__", TEMP_PLACEHOLDER); + let path_with_slashes = path_with_placeholder.replace('_', "/"); + path_with_slashes.replace(TEMP_PLACEHOLDER, "_") + } else { + mangled_path.replacen('_', "/", 2) + }; + + Ok((type_str, original_path)) + } + + async fn inner_get_resource_type_info( + user_db: &UserDB, + authed: &ApiAuthed, + workspace_id: &str, + resource_type: &str, + ) -> Result { + let mut sqlb = SqlBuilder::select_from("resource_type as o"); + sqlb.fields(&["o.name", "o.description"]); + sqlb.and_where("o.workspace_id = ?".bind(&workspace_id)); + sqlb.and_where("o.name = ?".bind(&resource_type)); + let sql = sqlb.sql().map_err(|_e| { + tracing::error!("failed to build sql: {}", _e); + Error::internal_error("failed to build sql", None) + })?; + let mut tx = user_db + .clone() + .begin(authed) + .await + .map_err(|_e| Error::internal_error("failed to begin transaction", None))?; + let rows = sqlx::query_as::<_, ResourceType>(&sql) + .fetch_one(&mut *tx) + .await + .map_err(|_e| { + tracing::error!("Failed to fetch resource info: {}", _e); + Error::internal_error("failed to fetch resource info", None) + })?; + tx.commit() + .await + .map_err(|_e| Error::internal_error("failed to commit transaction", None))?; + Ok(rows) + } + + async fn inner_get_resources( + user_db: &UserDB, + authed: &ApiAuthed, + workspace_id: &str, + resource_type: &str, + ) -> Result, Error> { + let mut sqlb = SqlBuilder::select_from("resource as o"); + sqlb.fields(&["o.path", "o.description", "o.resource_type"]); + sqlb.and_where("o.workspace_id = ?".bind(&workspace_id)); + sqlb.and_where("o.resource_type = ?".bind(&resource_type)); + let sql = sqlb.sql().map_err(|_e| { + tracing::error!("failed to build sql: {}", _e); + Error::internal_error("failed to build sql", None) + })?; + let mut tx = user_db + .clone() + .begin(authed) + .await + .map_err(|_e| Error::internal_error("failed to begin transaction", None))?; + let rows = sqlx::query_as::<_, ResourceInfo>(&sql) + .fetch_all(&mut *tx) + .await + .map_err(|_e| { + tracing::error!("Failed to fetch resources: {}", _e); + Error::internal_error("failed to fetch resources", None) + })?; + tx.commit() + .await + .map_err(|_e| Error::internal_error("failed to commit transaction", None))?; + + Ok(rows) + } + + async fn inner_get_flows( + user_db: &UserDB, + authed: &ApiAuthed, + workspace_id: &str, + scope_type: &str, + ) -> Result, Error> { + let mut sqlb = SqlBuilder::select_from("flow as o"); + sqlb.fields(&["o.path", "o.summary", "o.description", "o.schema"]); + if scope_type == "favorites" { + sqlb.join("favorite") + .on("favorite.favorite_kind = 'flow' AND favorite.workspace_id = o.workspace_id AND favorite.path = o.path AND favorite.usr = ?" + .bind(&authed.username)); + } + sqlb.and_where("o.workspace_id = ?".bind(&workspace_id)) + .and_where("o.archived = false") + .and_where("o.draft_only IS NOT TRUE") + .order_by("o.edited_at", false) + .limit(100); + let sql = sqlb.sql().map_err(|_e| { + tracing::error!("failed to build sql: {}", _e); + Error::internal_error("failed to build sql", None) + })?; + let mut tx = user_db + .clone() + .begin(authed) + .await + .map_err(|_e| Error::internal_error("failed to begin transaction", None))?; + let rows = sqlx::query_as::<_, FlowInfo>(&sql) + .fetch_all(&mut *tx) + .await + .map_err(|_e| { + tracing::error!("Failed to fetch flows: {}", _e); + Error::internal_error("failed to fetch flows", None) + })?; + tx.commit() + .await + .map_err(|_e| Error::internal_error("failed to commit transaction", None))?; + Ok(rows) + } + + async fn inner_get_scripts( + user_db: &UserDB, + authed: &ApiAuthed, + workspace_id: &str, + scope_type: &str, + ) -> Result, Error> { + let mut sqlb = SqlBuilder::select_from("script as o"); + sqlb.fields(&["o.path", "o.summary", "o.description", "o.schema"]); + if scope_type == "favorites" { + sqlb.join("favorite") + .on("favorite.favorite_kind = 'script' AND favorite.workspace_id = o.workspace_id AND favorite.path = o.path AND favorite.usr = ?" + .bind(&authed.username)); + } + sqlb.and_where("o.workspace_id = ?".bind(&workspace_id)) + .and_where("o.archived = false") + .and_where("o.draft_only IS NOT TRUE") + .order_by("o.created_at", false) + .limit(100); + let sql = sqlb.sql().map_err(|_e| { + tracing::error!("failed to build sql: {}", _e); + Error::internal_error("failed to build sql", None) + })?; + let mut tx = user_db + .clone() + .begin(authed) + .await + .map_err(|_e| Error::internal_error("failed to begin transaction", None))?; + let rows = sqlx::query_as::<_, ScriptInfo>(&sql) + .fetch_all(&mut *tx) + .await + .map_err(|_e| { + tracing::error!("Failed to fetch scripts: {}", _e); + Error::internal_error("failed to fetch scripts", None) + })?; + tx.commit() + .await + .map_err(|_e| Error::internal_error("failed to commit transaction", None))?; + Ok(rows) + } + + async fn transform_schema_for_resources( + schema: &mut Schema, + user_db: &UserDB, + authed: &ApiAuthed, + w_id: &str, + resources_info: &mut HashMap, + ) -> Result<(), Error> { + for (_key, prop) in schema.properties.iter_mut() { + if let Some(format) = &prop.format { + if format.contains("resource") { + let resource_type_key = + format.split("-").last().unwrap_or_default().to_string(); + + if !resources_info.contains_key(&resource_type_key) { + let fetch_result = async { + let resource_type_info_future = Runner::inner_get_resource_type_info( + user_db, + authed, + &w_id, + &resource_type_key, + ); + let resources_data_future = Runner::inner_get_resources( + user_db, + authed, + &w_id, + &resource_type_key, + ); + let (resource_type_info, resources_data) = + try_join!(resource_type_info_future, resources_data_future)?; + Ok::<_, Error>(ResourceCache { + resource_type: resource_type_info, + resources: resources_data, + }) + } + .await; + + match fetch_result { + Ok(cache_data) => { + resources_info.insert(resource_type_key.clone(), cache_data); + } + Err(e) => { + tracing::error!("Failed to fetch resource cache data: {}", e); + return Err(e); + } + } + } + + if let Some(resource_cache) = resources_info.get(&resource_type_key) { + let resources_count = resource_cache.resources.len(); + + prop.r#type = Some("string".to_string()); + prop.description = Some(format!( + "This is a resource named {} with the following description: {}.\nThe path of the resource should be used to specify the resource.\n{}", + resource_cache.resource_type.name, + resource_cache.resource_type.description.as_deref().unwrap_or("No description"), + if resources_count == 0 { + "This resource does not have any available instances, you should create one from your windmill workspace" + } else if resources_count > 1 { + "This resource has multiple available instances, you should precisely select the one you want to use" + } else { + "There is 1 resource available" + } + )); + + if resources_count > 0 { + prop.oneOf = Some( + resource_cache + .resources + .iter() + .map(|resource| { + serde_json::Value::Object(serde_json::Map::from_iter( + [ + ( + "const".to_string(), + serde_json::Value::String(format!( + "$res:{}", + resource.path.clone() + )), + ), + ( + "title".to_string(), + serde_json::Value::String( + resource + .description + .as_deref() + .unwrap_or("No description") + .to_string(), + ), + ), + ] + .into_iter(), + )) + }) + .collect(), + ); + } + } else { + tracing::error!( + "Resource cache entry unexpectedly missing for key: {}", + resource_type_key + ); + } + } + } + } + Ok(()) + } +} + +impl ServerHandler for Runner { + async fn call_tool( + &self, + request: CallToolRequestParam, + context: RequestContext, + ) -> Result { + let parse_args = |args_opt: Option| -> Result { + args_opt.map(Value::Object).ok_or_else(|| { + Error::invalid_params( + "Missing arguments for tool", + Some(request.name.clone().into()), + ) + }) + }; + + let authed = context + .req_extensions + .get::() + .ok_or_else(|| Error::internal_error("ApiAuthed not found", None))?; + let db = context + .req_extensions + .get::() + .ok_or_else(|| Error::internal_error("DB not found", None))?; + let user_db = context + .req_extensions + .get::() + .ok_or_else(|| Error::internal_error("UserDB not found", None))?; + let args = parse_args(request.arguments)?; + + let (tool_type, path) = Runner::reverse_transform(&request.name).unwrap_or_default(); + + // Convert Value to PushArgsOwned + let push_args = if let Value::Object(map) = args.clone() { + let mut args_hash = HashMap::new(); + for (k, v) in map { + args_hash.insert(k, to_raw_value(&v)); + } + windmill_queue::PushArgsOwned { extra: None, args: args_hash } + } else { + windmill_queue::PushArgsOwned::default() + }; + + let w_id = context.workspace_id.clone(); + let script_or_flow_path = StripPath(path); + let run_query = RunJobQuery::default(); + + let result = if tool_type == "script" { + run_wait_result_script_by_path_internal( + db.clone(), + run_query, + script_or_flow_path, + authed.clone(), + user_db.clone(), + w_id.clone(), + push_args, + None, + ) + .await + } else { + run_wait_result_flow_by_path_internal( + db.clone(), + run_query, + script_or_flow_path, + authed.clone(), + user_db.clone(), + push_args, + w_id.clone(), + None, + ) + .await + }; + + match result { + Ok(response) => { + // Extract the response body as bytes, then convert to a string + let body_bytes = to_bytes(response.into_body(), usize::MAX) + .await + .map_err(|e| { + Error::internal_error(format!("Failed to read response body: {}", e), None) + })?; + let body_str = String::from_utf8(body_bytes.to_vec()).map_err(|e| { + Error::internal_error(format!("Failed to decode response body: {}", e), None) + })?; + Ok(CallToolResult::success(vec![Content::text(body_str)])) + } + Err(e) => Err(Error::internal_error( + format!("Failed to run script: {}", e), + None, + )), + } + } + + async fn list_tools( + &self, + _request: Option, + mut _context: RequestContext, + ) -> Result { + let workspace_id = _context.workspace_id.clone(); + let user_db = _context + .req_extensions + .get::() + .ok_or_else(|| Error::internal_error("UserDB not found", None))?; + let authed = _context + .req_extensions + .get::() + .ok_or_else(|| Error::internal_error("ApiAuthed not found", None))?; + let scope = authed + .scopes + .as_ref() + .and_then(|scopes| scopes.iter().find(|scope| scope.starts_with("mcp:"))); + let scope_type = scope.map_or("all", |scope| scope.split(":").last().unwrap_or("all")); + let mut resources_info: HashMap = HashMap::new(); + + let scripts_fn = Runner::inner_get_scripts(user_db, authed, &workspace_id, scope_type); + let flows_fn = Runner::inner_get_flows(user_db, authed, &workspace_id, scope_type); + let (scripts, flows) = try_join!(scripts_fn, flows_fn)?; + + let mut script_tools: Vec = Vec::with_capacity(scripts.len()); + for script in scripts { + let name = Runner::transform_path(&script.path, "script").unwrap_or_default(); + let description = format!( + "This is a script named {} with the following description: {}.", + script.summary.unwrap_or_default(), + script.description.unwrap_or_default() + ); + let mut schema: Schema = script.schema.map_or_else(Schema::default, |v| { + serde_json::from_value(v).unwrap_or_default() + }); + Runner::transform_schema_for_resources( + &mut schema, + user_db, + authed, + &workspace_id, + &mut resources_info, + ) + .await?; + script_tools.push(Tool { + name: Cow::Owned(name), + description: Some(Cow::Owned(description)), + input_schema: { + let value = serde_json::to_value(schema).unwrap_or_default(); + if let serde_json::Value::Object(map) = value { + Arc::new(map) + } else { + Arc::new(serde_json::Map::new()) + } + }, + annotations: None, + }); + } + + let mut flow_tools: Vec = Vec::with_capacity(flows.len()); + for flow in flows { + let name = Runner::transform_path(&flow.path, "flow").unwrap_or_default(); + let description = format!( + "This is a flow named {} with the following description: {}.", + flow.summary.unwrap_or_default(), + flow.description.unwrap_or_default() + ); + let mut schema: Schema = flow.schema.map_or_else(Schema::default, |v| { + serde_json::from_value(v).unwrap_or_default() + }); + Runner::transform_schema_for_resources( + &mut schema, + user_db, + authed, + &workspace_id, + &mut resources_info, + ) + .await?; + flow_tools.push(Tool { + name: Cow::Owned(name), + description: Some(Cow::Owned(description)), + input_schema: { + let value = serde_json::to_value(schema).unwrap_or_default(); + if let serde_json::Value::Object(map) = value { + Arc::new(map) + } else { + Arc::new(serde_json::Map::new()) + } + }, + annotations: None, + }); + } + + let tools = [script_tools, flow_tools].concat(); + Ok(ListToolsResult { tools, next_cursor: None }) + } + + fn get_info(&self) -> ServerInfo { + ServerInfo { + protocol_version: Default::default(), + capabilities: ServerCapabilities::builder() + .enable_tools() + .enable_tool_list_changed() + .build(), + server_info: Implementation::from_build_env(), + instructions: Some("This server provides a runner tool that can run scripts. Use 'get_scripts' to get the list of scripts.".to_string()), + } + } + + async fn initialize( + &self, + _request: InitializeRequestParam, + _context: RequestContext, + ) -> Result { + Ok(self.get_info()) + } + + async fn list_resources( + &self, + _request: Option, + _context: RequestContext, + ) -> Result { + Ok(ListResourcesResult { resources: vec![], next_cursor: None }) + } + + async fn list_prompts( + &self, + _request: Option, + _context: RequestContext, + ) -> Result { + Ok(ListPromptsResult::default()) + } + + async fn list_resource_templates( + &self, + _request: Option, + _context: RequestContext, + ) -> Result { + Ok(ListResourceTemplatesResult::default()) + } +} + +pub fn setup_mcp_server(addr: SocketAddr, path: &str) -> anyhow::Result<(SseServer, Router)> { + let config = SseServerConfig { + bind: addr, + sse_path: "/sse".to_string(), + post_path: "/message".to_string(), + full_message_path: path.to_string(), + ct: CancellationToken::new(), + sse_keep_alive: None, + }; + + Ok(SseServer::new(config)) +} diff --git a/frontend/src/lib/components/TokensTable.svelte b/frontend/src/lib/components/TokensTable.svelte new file mode 100644 index 0000000000..9058a99e1c --- /dev/null +++ b/frontend/src/lib/components/TokensTable.svelte @@ -0,0 +1,295 @@ + + +
+

Tokens

+
+ +
+
+
+ Authenticate to the Windmill API with access tokens. +
+ +
+ {#if newToken} +
+
+ Added token: +
+
+ Make sure to copy your personal access token now. You won't be able to see it again! +
+
+ {/if} + + {#if newMcpToken} +
+

New MCP URL:

+ +

+ Make sure to copy this URL now. You won't be able to see it again! +

+
+ {/if} + + {#if displayCreateToken} +
+

Add a new token

+ {#if scopes != undefined} + {#each scopes as scope} +
+ + +
+ {/each} + {/if} + {#if showMcpMode} + { + mcpCreationMode = e.detail + if (e.detail) { + newTokenLabel = 'MCP token' + newTokenExpiration = undefined + newTokenWorkspace = $workspaceStore + } + }} + checked={mcpCreationMode} + options={{ + right: 'Generate MCP URL', + rightTooltip: + 'Generate a new MCP URL to make your scripts and flows available as tools.' + }} + class="mb-4" + size="xs" + /> + {/if} +
+ {#if mcpCreationMode} +
+ + + + + +
+
+ + +
+ {/if} +
+ + +
+
+ + +
+
+ +
+
+
+ {/if} +
+ +
+ + + prefix + label + expiration + scopes + + + + {#if tokens && tokens.length > 0} + {#each tokens as { token_prefix, expiration, label, scopes }} + + {token_prefix}**** + {label ?? ''} + {displayDate(expiration ?? '')} + {scopes?.join(', ') ?? ''} + + + + + {/each} + {:else if tokens && tokens.length === 0} + + There are no tokens yet + + {:else} + Loading... + {/if} + + +
+ {#if tokens?.length == 100} + + {/if} + {#if tokenPage > 1} + + {/if} +
+
diff --git a/frontend/src/lib/components/UserSettings.svelte b/frontend/src/lib/components/UserSettings.svelte index c02f998331..7ed78507a5 100644 --- a/frontend/src/lib/components/UserSettings.svelte +++ b/frontend/src/lib/components/UserSettings.svelte @@ -5,38 +5,38 @@ stepInputCompletionEnabled, usersWorkspaceStore } from '$lib/stores' - import type { TruncatedToken, NewToken } from '$lib/gen' + import type { TruncatedToken } from '$lib/gen' import { UserService } from '$lib/gen' - import { displayDate, copyToClipboard, getLocalSetting, storeLocalSetting } from '$lib/utils' - import TableCustom from '$lib/components/TableCustom.svelte' + import { getLocalSetting, storeLocalSetting } from '$lib/utils' import { Button } from '$lib/components/common' import Drawer from '$lib/components/common/drawer/Drawer.svelte' import DrawerContent from '$lib/components/common/drawer/DrawerContent.svelte' import { sendUserToast } from '$lib/toast' - import Tooltip from './Tooltip.svelte' import Version from './Version.svelte' - import { Clipboard, Plus } from 'lucide-svelte' import DarkModeToggle from './sidebar/DarkModeToggle.svelte' import Toggle from './Toggle.svelte' import type { Writable } from 'svelte/store' + import TokensTable from './TokensTable.svelte' import { createEventDispatcher } from 'svelte' export let scopes: string[] | undefined = undefined export let newTokenLabel: string | undefined = undefined export let newTokenWorkspace: string | undefined = undefined export let newToken: string | undefined = undefined + export let showMcpMode: boolean = false let newPassword: string | undefined let passwordError: string | undefined let tokens: TruncatedToken[] - let newTokenExpiration: number | undefined - let displayCreateToken = scopes != undefined let login_type = 'none' let drawer: Drawer + let tokenPage = 1 + let openWithMcpMode = false const dispatch = createEventDispatcher() - export function openDrawer() { + export function openDrawer(mcpMode: boolean = false) { + openWithMcpMode = mcpMode loadLoginType() listTokens() drawer?.openDrawer() @@ -68,28 +68,12 @@ login_type = (await UserService.globalWhoami()).login_type } - async function createToken(): Promise { - newToken = undefined - let date: Date | undefined - if (newTokenExpiration) { - date = new Date(new Date().getTime() + newTokenExpiration * 1000) - } - newToken = await UserService.createToken({ - requestBody: { - label: newTokenLabel, - expiration: date?.toISOString(), - scopes, - workspace_id: newTokenWorkspace - } as NewToken - }) - dispatch('tokenCreated', newToken) - listTokens() - displayCreateToken = false - } - - let tokenPage = 1 async function listTokens(): Promise { - tokens = await UserService.listTokens({ excludeEphemeral: true, page: tokenPage, perPage: 100 }) + tokens = await UserService.listTokens({ + excludeEphemeral: true, + page: tokenPage, + perPage: 100 + }) } async function deleteToken(tokenPrefix: string) { @@ -111,6 +95,21 @@ storeLocalSetting(setting, value.toString()) } + function handleNextPage() { + tokenPage += 1 + listTokens() + } + + function handlePreviousPage() { + tokenPage -= 1 + listTokens() + } + + function handleTokenCreated(event: CustomEvent) { + newToken = event.detail + dispatch('tokenCreated', newToken) + } + loadSettings() @@ -221,157 +220,20 @@
{/if} -
-

Tokens

-
- -
-
-
- Authentify to the Windmill API with access tokens. -
- -
-
-
- Added token: -
-
- Make sure to copy your personal access token now. You won’t be able to see it again! -
-
- - -
-

Add a new token

- {#if scopes != undefined} - {#each scopes as scope} -
- - -
- {/each} - {/if} -
-
- - -
-
- - -
-
- -
-
-
-
-
- - - prefix - label - expiration - scopes - - - - {#if tokens && tokens.length > 0} - {#each tokens as { token_prefix, expiration, label, scopes }} - - {token_prefix}**** - {label ?? ''} - {displayDate(expiration ?? '')} - {scopes?.join(', ') ?? ''} - - - {/each} - {:else if tokens && tokens.length === 0} - There are no tokens yet - {:else} - Loading... - {/if} - - -
- {#if tokens?.length == 100} - - {/if} - {#if tokenPage > 1} - - {/if} -
-
+
diff --git a/frontend/src/lib/components/details/EmailTriggerConfigSection.svelte b/frontend/src/lib/components/details/EmailTriggerConfigSection.svelte index e85e4f9de0..eba48136aa 100644 --- a/frontend/src/lib/components/details/EmailTriggerConfigSection.svelte +++ b/frontend/src/lib/components/details/EmailTriggerConfigSection.svelte @@ -89,7 +89,12 @@ placeholder="paste your token here once created to alter examples below" class="!text-xs" /> - diff --git a/frontend/src/routes/(root)/(logged)/user/(user)/workspaces/+page.svelte b/frontend/src/routes/(root)/(logged)/user/(user)/workspaces/+page.svelte index dc5e4a0c19..016e923464 100644 --- a/frontend/src/routes/(root)/(logged)/user/(user)/workspaces/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/user/(user)/workspaces/+page.svelte @@ -28,15 +28,18 @@ let invites: WorkspaceInvite[] = [] let list_all_as_super_admin: boolean = false - let workspaces: { id: string; name: string; username: string; color?: string | null }[] | undefined = undefined + let workspaces: + | { id: string; name: string; username: string; color?: string | null }[] + | undefined = undefined let userSettings: UserSettings let superadminSettings: SuperadminSettings $: rd = $page.url.searchParams.get('rd') - $: if (userSettings && $page.url.hash === USER_SETTINGS_HASH) { - userSettings.openDrawer() + $: if (userSettings && $page.url.hash.startsWith(USER_SETTINGS_HASH)) { + const mcpMode = $page.url.hash.includes('-mcp') + userSettings.openDrawer(mcpMode) } async function loadInvites() { @@ -197,8 +200,8 @@ > {#if workspace.color} {/if} {workspace.id} - {workspace.name} as @@ -295,7 +298,12 @@ Superadmin settings {/if} - @@ -321,4 +329,4 @@

--> - + From b199a77d486c5bfd086ca73a58a14bb747e386b5 Mon Sep 17 00:00:00 2001 From: centdix <40307056+centdix@users.noreply.github.com> Date: Thu, 24 Apr 2025 14:14:22 +0200 Subject: [PATCH 274/739] fix: Fix CI for MCP + optimization (#5657) * add mcp feature to docker build * avoid deserializing value * apply fix to flows --- .github/workflows/docker-image.yml | 4 +- backend/windmill-api/src/mcp.rs | 301 +++++++++++++++-------------- 2 files changed, 162 insertions(+), 143 deletions(-) diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index 06f8003c96..216d7cefea 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -92,7 +92,7 @@ jobs: platforms: linux/amd64,linux/arm64 push: true build-args: | - features=embedding,parquet,openidconnect,jemalloc,license,http_trigger,zip,oauth2,dind,postgres_trigger,mqtt_trigger,websocket,smtp,static_frontend,agent_worker_server,all_languages,deno_core + features=embedding,parquet,openidconnect,jemalloc,license,http_trigger,zip,oauth2,dind,postgres_trigger,mqtt_trigger,websocket,smtp,static_frontend,agent_worker_server,all_languages,deno_core,mcp tags: | ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.DEV_SHA }} ${{ steps.meta-public.outputs.tags }} @@ -154,7 +154,7 @@ jobs: platforms: linux/amd64,linux/arm64 push: true build-args: | - features=enterprise,enterprise_saml,stripe,embedding,parquet,prometheus,openidconnect,cloud,jemalloc,agent_worker_server,tantivy,license,http_trigger,zip,oauth2,kafka,sqs_trigger,nats,otel,dind,postgres_trigger,mqtt_trigger,gcp_trigger,websocket,smtp,static_frontend,all_languages,deno_core + features=enterprise,enterprise_saml,stripe,embedding,parquet,prometheus,openidconnect,cloud,jemalloc,agent_worker_server,tantivy,license,http_trigger,zip,oauth2,kafka,sqs_trigger,nats,otel,dind,postgres_trigger,mqtt_trigger,gcp_trigger,websocket,smtp,static_frontend,all_languages,deno_core,mcp tags: | ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}-ee:${{ env.DEV_SHA }} ${{ steps.meta-ee-public.outputs.tags }} diff --git a/backend/windmill-api/src/mcp.rs b/backend/windmill-api/src/mcp.rs index b30f80d643..b7301d7538 100644 --- a/backend/windmill-api/src/mcp.rs +++ b/backend/windmill-api/src/mcp.rs @@ -12,13 +12,14 @@ use rmcp::{ service::{RequestContext, RoleServer}, Error, }; -use serde::{Deserialize, Serialize}; +use serde::Serialize; use serde_json::Value; use sql_builder::prelude::*; use sqlx::FromRow; use tokio::try_join; use tokio_util::sync::CancellationToken; use windmill_common::db::UserDB; +use windmill_common::scripts::Schema; use windmill_common::worker::to_raw_value; use windmill_common::DB; @@ -31,43 +32,20 @@ use windmill_common::utils::StripPath; #[derive(Clone)] pub struct Runner {} -#[derive(Serialize, Deserialize, Debug, Clone, Default)] -struct Schema { - #[serde(default)] - properties: HashMap, - #[serde(flatten)] - other: HashMap, -} - -#[derive(Serialize, Deserialize, Debug, Clone, Default)] -struct SchemaProperty { - #[serde(skip_serializing_if = "Option::is_none")] - format: Option, - #[serde(skip_serializing_if = "Option::is_none")] - description: Option, - #[serde(skip_serializing_if = "Option::is_none")] - r#type: Option, - #[serde(skip_serializing_if = "Option::is_none")] - #[allow(non_snake_case)] - oneOf: Option>, - #[serde(flatten)] - other: HashMap, -} - #[derive(Serialize, FromRow)] struct ScriptInfo { path: String, - summary: Option, - description: Option, - schema: Option, + summary: String, + description: String, + schema: Schema, } #[derive(Serialize, FromRow, Debug)] struct FlowInfo { path: String, - summary: Option, - description: Option, - schema: Option, + summary: String, + description: String, + schema: Schema, } #[derive(Serialize, FromRow, Debug)] @@ -286,111 +264,162 @@ impl Runner { } async fn transform_schema_for_resources( - schema: &mut Schema, + schema: &Schema, user_db: &UserDB, authed: &ApiAuthed, w_id: &str, resources_info: &mut HashMap, - ) -> Result<(), Error> { - for (_key, prop) in schema.properties.iter_mut() { - if let Some(format) = &prop.format { - if format.contains("resource") { - let resource_type_key = - format.split("-").last().unwrap_or_default().to_string(); + ) -> Result { + let mut schema_obj: serde_json::Value = match serde_json::from_str(schema.0.get()) { + Ok(val) => val, + Err(_) => serde_json::Value::Object(serde_json::Map::new()), // Default if JSON is empty/invalid + }; - if !resources_info.contains_key(&resource_type_key) { - let fetch_result = async { - let resource_type_info_future = Runner::inner_get_resource_type_info( - user_db, - authed, - &w_id, - &resource_type_key, - ); - let resources_data_future = Runner::inner_get_resources( - user_db, - authed, - &w_id, - &resource_type_key, - ); - let (resource_type_info, resources_data) = - try_join!(resource_type_info_future, resources_data_future)?; - Ok::<_, Error>(ResourceCache { - resource_type: resource_type_info, - resources: resources_data, - }) - } - .await; + if let serde_json::Value::Object(schema_map) = &mut schema_obj { + if let Some(serde_json::Value::Object(properties_map)) = + schema_map.get_mut("properties") + { + for (_key, prop_value) in properties_map.iter_mut() { + if let serde_json::Value::Object(prop_map) = prop_value { + if let Some(format_value) = prop_map.get("format") { + if let serde_json::Value::String(format_str) = format_value { + if format_str.contains("resource") { + let resource_type_key = format_str + .split("-") + .last() + .unwrap_or_default() + .to_string(); - match fetch_result { - Ok(cache_data) => { - resources_info.insert(resource_type_key.clone(), cache_data); + if !resources_info.contains_key(&resource_type_key) { + let fetch_result = async { + let resource_type_info_future = + Runner::inner_get_resource_type_info( + user_db, + authed, + &w_id, + &resource_type_key, + ); + let resources_data_future = Runner::inner_get_resources( + user_db, + authed, + &w_id, + &resource_type_key, + ); + let (resource_type_info, resources_data) = try_join!( + resource_type_info_future, + resources_data_future + )?; + Ok::<_, Error>(ResourceCache { + resource_type: resource_type_info, + resources: resources_data, + }) + } + .await; + + match fetch_result { + Ok(cache_data) => { + resources_info + .insert(resource_type_key.clone(), cache_data); + } + Err(e) => { + tracing::error!( + "Failed to fetch resource cache data: {}", + e + ); + continue; // Skip this property if fetching failed + } + } + } + + if let Some(resource_cache) = + resources_info.get(&resource_type_key) + { + let resources_count = resource_cache.resources.len(); + + prop_map.insert( + "type".to_string(), + serde_json::Value::String("string".to_string()), + ); + let description = format!( + "This is a resource named {} with the following description: {}.\nThe path of the resource should be used to specify the resource.\n{}", + resource_cache.resource_type.name, + resource_cache.resource_type.description.as_deref().unwrap_or("No description"), + if resources_count == 0 { + "This resource does not have any available instances, you should create one from your windmill workspace" + } else if resources_count > 1 { + "This resource has multiple available instances, you should precisely select the one you want to use" + } else { + "There is 1 resource available" + } + ); + prop_map.insert( + "description".to_string(), + serde_json::Value::String(description), + ); + + if resources_count > 0 { + let one_of_values: Vec = resource_cache + .resources + .iter() + .map(|resource| { + serde_json::Value::Object( + serde_json::Map::from_iter( + [ + ( + "const".to_string(), + serde_json::Value::String( + format!( + "$res:{}", + resource.path + ), + ), + ), + ( + "title".to_string(), + serde_json::Value::String( + resource + .description + .as_deref() + .unwrap_or( + "No description", + ) + .to_string(), + ), + ), + ] + .into_iter(), + ), + ) + }) + .collect(); + prop_map.insert( + "oneOf".to_string(), + serde_json::Value::Array(one_of_values), + ); + } else { + prop_map.remove("oneOf"); // Remove oneOf if it exists and count is 0 + } + } + } } - Err(e) => { - tracing::error!("Failed to fetch resource cache data: {}", e); - return Err(e); - } - } - } - - if let Some(resource_cache) = resources_info.get(&resource_type_key) { - let resources_count = resource_cache.resources.len(); - - prop.r#type = Some("string".to_string()); - prop.description = Some(format!( - "This is a resource named {} with the following description: {}.\nThe path of the resource should be used to specify the resource.\n{}", - resource_cache.resource_type.name, - resource_cache.resource_type.description.as_deref().unwrap_or("No description"), - if resources_count == 0 { - "This resource does not have any available instances, you should create one from your windmill workspace" - } else if resources_count > 1 { - "This resource has multiple available instances, you should precisely select the one you want to use" - } else { - "There is 1 resource available" - } - )); - - if resources_count > 0 { - prop.oneOf = Some( - resource_cache - .resources - .iter() - .map(|resource| { - serde_json::Value::Object(serde_json::Map::from_iter( - [ - ( - "const".to_string(), - serde_json::Value::String(format!( - "$res:{}", - resource.path.clone() - )), - ), - ( - "title".to_string(), - serde_json::Value::String( - resource - .description - .as_deref() - .unwrap_or("No description") - .to_string(), - ), - ), - ] - .into_iter(), - )) - }) - .collect(), - ); } } else { - tracing::error!( - "Resource cache entry unexpectedly missing for key: {}", - resource_type_key + tracing::warn!( + "Schema property value is not a JSON object: {:?}", + prop_value ); } } + } else { + tracing::info!( + "Schema does not contain a 'properties' object or it's not an object." + ); } + } else { + tracing::warn!("Top-level schema value is not a JSON object."); } - Ok(()) + + Ok(schema_obj) } } @@ -425,7 +454,6 @@ impl ServerHandler for Runner { let (tool_type, path) = Runner::reverse_transform(&request.name).unwrap_or_default(); - // Convert Value to PushArgsOwned let push_args = if let Value::Object(map) = args.clone() { let mut args_hash = HashMap::new(); for (k, v) in map { @@ -468,7 +496,6 @@ impl ServerHandler for Runner { match result { Ok(response) => { - // Extract the response body as bytes, then convert to a string let body_bytes = to_bytes(response.into_body(), usize::MAX) .await .map_err(|e| { @@ -516,14 +543,11 @@ impl ServerHandler for Runner { let name = Runner::transform_path(&script.path, "script").unwrap_or_default(); let description = format!( "This is a script named {} with the following description: {}.", - script.summary.unwrap_or_default(), - script.description.unwrap_or_default() + script.summary, script.description ); - let mut schema: Schema = script.schema.map_or_else(Schema::default, |v| { - serde_json::from_value(v).unwrap_or_default() - }); - Runner::transform_schema_for_resources( - &mut schema, + let schema: Schema = script.schema; + let schema_obj = Runner::transform_schema_for_resources( + &schema, user_db, authed, &workspace_id, @@ -534,8 +558,7 @@ impl ServerHandler for Runner { name: Cow::Owned(name), description: Some(Cow::Owned(description)), input_schema: { - let value = serde_json::to_value(schema).unwrap_or_default(); - if let serde_json::Value::Object(map) = value { + if let serde_json::Value::Object(map) = schema_obj { Arc::new(map) } else { Arc::new(serde_json::Map::new()) @@ -550,14 +573,11 @@ impl ServerHandler for Runner { let name = Runner::transform_path(&flow.path, "flow").unwrap_or_default(); let description = format!( "This is a flow named {} with the following description: {}.", - flow.summary.unwrap_or_default(), - flow.description.unwrap_or_default() + flow.summary, flow.description ); - let mut schema: Schema = flow.schema.map_or_else(Schema::default, |v| { - serde_json::from_value(v).unwrap_or_default() - }); - Runner::transform_schema_for_resources( - &mut schema, + let schema: Schema = flow.schema; + let schema_obj = Runner::transform_schema_for_resources( + &schema, user_db, authed, &workspace_id, @@ -568,8 +588,7 @@ impl ServerHandler for Runner { name: Cow::Owned(name), description: Some(Cow::Owned(description)), input_schema: { - let value = serde_json::to_value(schema).unwrap_or_default(); - if let serde_json::Value::Object(map) = value { + if let serde_json::Value::Object(map) = schema_obj { Arc::new(map) } else { Arc::new(serde_json::Map::new()) From c4148d77564c3558ea7aeb54cc9fa7126f43d64c Mon Sep 17 00:00:00 2001 From: centdix <40307056+centdix@users.noreply.github.com> Date: Thu, 24 Apr 2025 14:37:56 +0200 Subject: [PATCH 275/739] add missing ci (#5659) --- .github/workflows/build-publish-rh-image.yml | 4 ++-- .github/workflows/build_windows_worker_.yml | 2 +- .github/workflows/docker-image-rpi4.yml | 2 +- .github/workflows/publish_windows_worker.yml | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build-publish-rh-image.yml b/.github/workflows/build-publish-rh-image.yml index 030c617777..b919de6e18 100644 --- a/.github/workflows/build-publish-rh-image.yml +++ b/.github/workflows/build-publish-rh-image.yml @@ -64,7 +64,7 @@ jobs: platforms: linux/amd64 push: true build-args: | - features=enterprise,enterprise_saml,stripe,embedding,parquet,prometheus,openidconnect,cloud,jemalloc,license,otel,http_trigger,zip,oauth2,kafka,sqs_trigger,nats,postgres_trigger,gcp_trigger,mqtt_trigger,websocket,smtp,static_frontend,all_languages,deno_core + features=enterprise,enterprise_saml,stripe,embedding,parquet,prometheus,openidconnect,cloud,jemalloc,license,otel,http_trigger,zip,oauth2,kafka,sqs_trigger,nats,postgres_trigger,gcp_trigger,mqtt_trigger,websocket,smtp,static_frontend,all_languages,deno_core,mcp secrets: | rh_username=${{ secrets.RH_USERNAME }} rh_password=${{ secrets.RH_PASSWORD }} @@ -81,7 +81,7 @@ jobs: platforms: linux/arm64 push: true build-args: | - features=enterprise,enterprise_saml,stripe,embedding,parquet,prometheus,openidconnect,cloud,jemalloc,license,otel,http_trigger,zip,oauth2,kafka,sqs_trigger,nats,postgres_trigger,gcp_trigger,mqtt_trigger,websocket,smtp,static_frontend,all_languages,deno_core + features=enterprise,enterprise_saml,stripe,embedding,parquet,prometheus,openidconnect,cloud,jemalloc,license,otel,http_trigger,zip,oauth2,kafka,sqs_trigger,nats,postgres_trigger,gcp_trigger,mqtt_trigger,websocket,smtp,static_frontend,all_languages,deno_core,mcp secrets: | rh_username=${{ secrets.RH_USERNAME }} rh_password=${{ secrets.RH_PASSWORD }} diff --git a/.github/workflows/build_windows_worker_.yml b/.github/workflows/build_windows_worker_.yml index 785ade3201..ac1476d76e 100644 --- a/.github/workflows/build_windows_worker_.yml +++ b/.github/workflows/build_windows_worker_.yml @@ -51,7 +51,7 @@ jobs: $env:OPENSSL_DIR="${Env:VCPKG_INSTALLATION_ROOT}\installed\x64-windows-static" mkdir frontend/build && cd backend New-Item -Path . -Name "windmill-api/openapi-deref.yaml" -ItemType "File" -Force - cargo build --release --features=enterprise,stripe,embedding,parquet,prometheus,openidconnect,cloud,jemalloc,tantivy,license,http_trigger,zip,oauth2,kafka,nats,sqs_trigger,postgres_trigger,gcp_trigger,mqtt_trigger,websocket,smtp,static_frontend,all_languages + cargo build --release --features=enterprise,stripe,embedding,parquet,prometheus,openidconnect,cloud,jemalloc,tantivy,license,http_trigger,zip,oauth2,kafka,nats,sqs_trigger,postgres_trigger,gcp_trigger,mqtt_trigger,websocket,smtp,static_frontend,all_languages,mcp - name: Rename binary with corresponding architecture run: | Rename-Item -Path ".\backend\target\release\windmill.exe" -NewName "windmill-ee.exe" diff --git a/.github/workflows/docker-image-rpi4.yml b/.github/workflows/docker-image-rpi4.yml index b275ad2154..bb270aac8a 100644 --- a/.github/workflows/docker-image-rpi4.yml +++ b/.github/workflows/docker-image-rpi4.yml @@ -67,7 +67,7 @@ jobs: platforms: linux/amd64,linux/arm64 push: true build-args: | - features=embedding,parquet,openidconnect,license,http_trigger,zip,oauth2,postgres_trigger,mqtt_trigger,websocket,smtp,static_frontend,all_languages,deno_core + features=embedding,parquet,openidconnect,license,http_trigger,zip,oauth2,postgres_trigger,mqtt_trigger,websocket,smtp,static_frontend,all_languages,deno_core,mcp tags: | ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:dev ${{ steps.meta-public.outputs.tags }} diff --git a/.github/workflows/publish_windows_worker.yml b/.github/workflows/publish_windows_worker.yml index 5b591abc3c..057a858881 100644 --- a/.github/workflows/publish_windows_worker.yml +++ b/.github/workflows/publish_windows_worker.yml @@ -53,7 +53,7 @@ jobs: $env:OPENSSL_DIR="${Env:VCPKG_INSTALLATION_ROOT}\installed\x64-windows-static" mkdir frontend/build && cd backend New-Item -Path . -Name "windmill-api/openapi-deref.yaml" -ItemType "File" -Force - cargo build --release --features=enterprise,stripe,embedding,parquet,prometheus,openidconnect,cloud,jemalloc,tantivy,license,http_trigger,zip,oauth2,kafka,sqs_trigger,nats,postgres_trigger,mqtt_trigger,gcp_trigger,websocket,smtp,static_frontend,all_languages + cargo build --release --features=enterprise,stripe,embedding,parquet,prometheus,openidconnect,cloud,jemalloc,tantivy,license,http_trigger,zip,oauth2,kafka,sqs_trigger,nats,postgres_trigger,mqtt_trigger,gcp_trigger,websocket,smtp,static_frontend,all_languages,mcp - name: Rename binary with corresponding architecture run: | Rename-Item -Path ".\backend\target\release\windmill.exe" -NewName "windmill-ee.exe" From fdd1642ce10866da1d8d373bda44f050e2e0f403 Mon Sep 17 00:00:00 2001 From: wendrul <53628737+wendrul@users.noreply.github.com> Date: Thu, 24 Apr 2025 16:04:28 +0200 Subject: [PATCH 276/739] feat: Ansible improvements (vault, roles and git repos) (#5655) * Ansible vault + roles * Clone arbitrary repos * Fix cloning logic after merge * Make function for cloning without history any commit * Cloning repos and lockfile on the commit * Improve error messages * Create lockfile for roles and collections * Simplify ansible ssh identity interface * Ansible vault password: pass just a variable instead of 2 step approach * Lock lockfiles for roles and collections * fix typo * Change git ssh identity section name * Rename variable * Update init script for ansible * Suppress error when no roles --------- Co-authored-by: Ruben Fiszel --- .../parsers/windmill-parser-yaml/src/lib.rs | 216 +++++- backend/windmill-common/src/worker.rs | 16 +- .../windmill-worker/src/ansible_executor.rs | 716 +++++++++++++++++- backend/windmill-worker/src/worker.rs | 1 + .../windmill-worker/src/worker_lockfiles.rs | 132 +++- flake.nix | 6 +- frontend/src/lib/script_helpers.ts | 10 + 7 files changed, 1043 insertions(+), 54 deletions(-) diff --git a/backend/parsers/windmill-parser-yaml/src/lib.rs b/backend/parsers/windmill-parser-yaml/src/lib.rs index c2d417eb6c..06adac1ee3 100644 --- a/backend/parsers/windmill-parser-yaml/src/lib.rs +++ b/backend/parsers/windmill-parser-yaml/src/lib.rs @@ -1,3 +1,5 @@ +use std::collections::HashMap; + use anyhow::anyhow; use serde_json::json; use windmill_parser::{Arg, MainArgSignature, ObjectProperty, Typ}; @@ -208,15 +210,52 @@ pub struct AnsibleInventory { resource_type: Option, pub pinned_resource: Option, } + +#[derive(Debug, Clone)] +pub struct GitRepo { + pub url: String, + pub commit: Option, + pub branch: Option, + pub target_path: String, +} + #[derive(Debug, Clone)] pub struct AnsibleRequirements { pub python_reqs: Vec, - pub collections: Option, + pub roles_and_collections: Option, pub file_resources: Vec, pub inventories: Vec, pub vars: Vec<(String, String)>, pub resources: Vec<(String, String)>, pub options: AnsiblePlaybookOptions, + pub vault_password: Option, + pub vault_id: Vec, + pub git_repos: Vec, + pub git_ssh_identity: Vec, +} + +impl Default for AnsibleRequirements { + fn default() -> Self { + Self { + python_reqs: vec![], + roles_and_collections: None, + file_resources: vec![], + inventories: vec![], + vars: vec![], + resources: vec![], + options: AnsiblePlaybookOptions { + verbosity: None, + forks: None, + timeout: None, + flush_cache: None, + force_handlers: None, + }, + vault_password: None, + vault_id: vec![], + git_repos: vec![], + git_ssh_identity: vec![], + } + } } fn parse_inventories(inventory_yaml: &Yaml) -> anyhow::Result> { @@ -275,22 +314,7 @@ pub fn parse_ansible_reqs( return Ok((logs, None, inner_content.to_string())); } - let opts = AnsiblePlaybookOptions { - verbosity: None, - forks: None, - timeout: None, - flush_cache: None, - force_handlers: None, - }; - let mut ret = AnsibleRequirements { - python_reqs: vec![], - collections: None, - file_resources: vec![], - inventories: vec![], - vars: vec![], - resources: vec![], - options: opts, - }; + let mut ret = AnsibleRequirements::default(); if let Yaml::Hash(doc) = &docs[0] { for (key, value) in doc { @@ -303,7 +327,7 @@ pub fn parse_ansible_reqs( let mut out_str = String::new(); let mut emitter = YamlEmitter::new(&mut out_str); emitter.dump(galaxy_requirements)?; - ret.collections = Some(out_str); + ret.roles_and_collections = Some(out_str); } if let Some(Yaml::Array(py_reqs)) = deps.get(&Yaml::String("python".to_string())) @@ -345,11 +369,60 @@ pub fn parse_ansible_reqs( Yaml::String(key) if key == "inventory" => { ret.inventories = parse_inventories(value)?; } + Yaml::String(key) if key == "vault_password" => { + let Yaml::String(filename) = value else { + return Err(anyhow!( + "Vault Password File expects a String containing the file name" + )); + }; + ret.vault_password = Some(filename.to_string()); + } + Yaml::String(key) if key == "vault_id" => { + let Yaml::Array(filenames) = value else { + return Err(anyhow!("Vault ID field expects an array of strings in the format: `label@filename`")); + }; + + for f in filenames { + let Yaml::String(filename) = f else { + return Err(anyhow!("The elements of the vault_id field should be strings in the format: `label@filename`")); + }; + ret.vault_id.push(filename.to_string()); + } + } Yaml::String(key) if key == "options" => { if let Yaml::Array(opts) = &value { ret.options = parse_ansible_options(opts); } } + Yaml::String(key) if key == "git_repos" => { + let Yaml::Array(repos) = &value else { + return Err(anyhow!("git_repos field expects an array of repos")); + }; + + for r in repos { + ret.git_repos.push( + parse_git_repo(r) + .map_err(|e| anyhow!("Failed to parse git repo: {e}"))?, + ); + } + } + Yaml::String(key) if key == "git_ssh_identity" => { + let Yaml::Array(indentities) = &value else { + return Err(anyhow!( + "git_ssh_identity expects an array of windmill variables (or secrets) containing ssh IDs" + )); + }; + + for r in indentities { + let Yaml::String(file_name) = r else { + return Err(anyhow!( + "Git ssh identity file must be a string path to a Windmill variable/secret" + )); + }; + + ret.git_ssh_identity.push(file_name.clone()); + } + } Yaml::String(key) => logs.push_str(&format!("\nUnknown field `{}`. Ignoring", key)), _ => (), } @@ -364,6 +437,38 @@ pub fn parse_ansible_reqs( Ok((logs, Some(ret), out_str)) } +fn parse_git_repo(r: &Yaml) -> anyhow::Result { + let Yaml::Hash(repo) = r else { + return Err(anyhow!("Should be a Map")); + }; + + let url = repo + .get(&Yaml::String("url".to_string())) + .and_then(|v| v.as_str()) + .map(|s| s.to_string()) + .ok_or(anyhow!("Expected `url` field"))?; + + let target_path = repo + .get(&Yaml::String("target".to_string())) + .and_then(|v| v.as_str()) + .map(|s| s.to_string()) + .ok_or(anyhow!( + "Expected `target` field (target directory for cloning the repo)" + ))?; + + let branch = repo + .get(&Yaml::String("branch".to_string())) + .and_then(|v| v.as_str()) + .map(|s| s.to_string()); + + let commit = repo + .get(&Yaml::String("commit".to_string())) + .and_then(|v| v.as_str()) + .map(|s| s.to_string()); + + Ok(GitRepo { url, commit, branch, target_path }) +} + fn parse_ansible_options(opts: &Vec) -> AnsiblePlaybookOptions { let mut ret = AnsiblePlaybookOptions { verbosity: None, @@ -529,3 +634,78 @@ fn yaml_to_json(yaml: &Yaml) -> serde_json::Value { _ => serde_json::Value::Null, } } + +fn update_versions( + section: &str, + yaml: &mut Yaml, + versions: &HashMap, +) -> anyhow::Result { + let mut logs = String::new(); + + let Yaml::Hash(ref mut m) = yaml else { + return Err(anyhow!("{section} dependency should be a map")); + }; + + if let Some(Yaml::Array(elements)) = m.get_mut(&Yaml::String(section.to_string())) { + for el in elements { + let Yaml::Hash(ref mut h) = el else { + return Err(anyhow!("{section} dependency element should be a map")); + }; + + if let Some(name) = h + .get(&Yaml::String("name".to_string())) + .and_then(|n| n.as_str()) + { + if let Some(version) = versions.get(name) { + h.insert( + Yaml::String("version".to_string()), + Yaml::String(version.to_string()), + ); + } else { + logs.push_str(&format!("WARNING: {section} dependency `{name}` has no locked version, using the latest or system installed version.\n")); + } + } else { + return Err(anyhow!( + "{section} dependency element: missing or invalid `name` field" + )); + } + } + } + + Ok(logs) +} + +pub fn add_versions_to_requirements_yaml( + input: &str, + role_versions: &HashMap, + collection_versions: &HashMap, +) -> anyhow::Result<(String,String)> { + let mut docs = + YamlLoader::load_from_str(input).map_err(|e| anyhow!("YAML parse error: {}", e))?; + let doc = &mut docs[0]; + + let mut logs = String::new(); + + logs.push_str( + &update_versions("roles", doc, role_versions) + .map_err(|e| anyhow!("Error updating role versions: {e}"))?, + ); + logs.push_str( + &update_versions("collections", doc, collection_versions) + .map_err(|e| anyhow!("Error updating collection versions: {e}"))?, + ); + + if !logs.is_empty() { + logs.push_str("WARNING: You might want to try adding manual versions for these, otherwise there could be breaking changes on deployed scripts\n"); + } + + let mut out_str = String::new(); + { + let mut emitter = YamlEmitter::new(&mut out_str); + emitter + .dump(doc) + .map_err(|e| anyhow!("YAML emit error: {}", e))?; + } + + Ok((out_str, logs)) +} diff --git a/backend/windmill-common/src/worker.rs b/backend/windmill-common/src/worker.rs index cdffe6f6a1..b65b50a33a 100644 --- a/backend/windmill-common/src/worker.rs +++ b/backend/windmill-common/src/worker.rs @@ -381,11 +381,10 @@ fn normalize_path(path: &Path) -> PathBuf { } ret } -pub fn write_file_at_user_defined_location( + +pub fn is_allowed_file_location( job_dir: &str, user_defined_path: &str, - content: &str, - mode: Option, ) -> error::Result { let job_dir = Path::new(job_dir); let user_path = PathBuf::from(user_defined_path); @@ -405,6 +404,17 @@ pub fn write_file_at_user_defined_location( .into()); } + Ok(normalized_full_path) +} + +pub fn write_file_at_user_defined_location( + job_dir: &str, + user_defined_path: &str, + content: &str, + mode: Option, +) -> error::Result { + let normalized_full_path = is_allowed_file_location(job_dir, user_defined_path)?; + let full_path = normalized_full_path.as_path(); if let Some(parent_dir) = full_path.parent() { std::fs::create_dir_all(parent_dir)?; diff --git a/backend/windmill-worker/src/ansible_executor.rs b/backend/windmill-worker/src/ansible_executor.rs index 7e0d1bd09c..785d1fc868 100644 --- a/backend/windmill-worker/src/ansible_executor.rs +++ b/backend/windmill-worker/src/ansible_executor.rs @@ -5,19 +5,22 @@ use std::{collections::HashMap, os::unix::fs::PermissionsExt, path::PathBuf, pro use std::{collections::HashMap, path::PathBuf, process::Stdio}; use anyhow::anyhow; +use futures::future::try_join_all; use itertools::Itertools; +use serde::{Deserialize, Serialize}; use serde_json::value::RawValue; use tokio::process::Command; use uuid::Uuid; use windmill_common::{ error, worker::{ - to_raw_value, write_file, write_file_at_user_defined_location, Connection, WORKER_CONFIG, + is_allowed_file_location, to_raw_value, write_file, write_file_at_user_defined_location, + Connection, WORKER_CONFIG, }, }; use windmill_queue::MiniPulledJob; -use windmill_parser_yaml::{AnsibleRequirements, ResourceOrVariablePath}; +use windmill_parser_yaml::{AnsibleRequirements, GitRepo, ResourceOrVariablePath}; use windmill_queue::{append_logs, CanceledBy}; use crate::{ @@ -28,8 +31,8 @@ use crate::{ }, handle_child::handle_child, python_executor::{create_dependencies_dir, handle_python_reqs, uv_pip_compile, PyVersion}, - AuthedClient, DISABLE_NSJAIL, DISABLE_NUSER, HOME_ENV, NSJAIL_PATH, PATH_ENV, PROXY_ENVS, - PY_INSTALL_DIR, TZ_ENV, + AuthedClient, DISABLE_NSJAIL, DISABLE_NUSER, GIT_PATH, HOME_ENV, NSJAIL_PATH, PATH_ENV, + PROXY_ENVS, PY_INSTALL_DIR, TZ_ENV, }; lazy_static::lazy_static! { @@ -41,7 +44,294 @@ lazy_static::lazy_static! { } const NSJAIL_CONFIG_RUN_ANSIBLE_CONTENT: &str = include_str!("../nsjail/run.ansible.config.proto"); +const WINDMILL_ANSIBLE_PASSWORD_FILENAME: &str = ".windmill.ansible_vault_password_file"; +async fn clone_repo( + repo: &GitRepo, + job_dir: &str, + job_id: &Uuid, + worker_name: &str, + conn: &Connection, + mem_peak: &mut i32, + canceled_by: &mut Option, + w_id: &str, + occupancy_metrics: &mut OccupancyMetrics, + git_ssh_cmd: &str, +) -> error::Result { + let target_path = is_allowed_file_location(job_dir, &repo.target_path)?; + + let mut clone_cmd = Command::new(GIT_PATH.as_str()); + clone_cmd + .current_dir(job_dir) + .env_clear() + .envs(PROXY_ENVS.clone()) + .env("PATH", PATH_ENV.as_str()) + .env("TZ", TZ_ENV.as_str()) + .env("GIT_SSH_COMMAND", git_ssh_cmd) + .args(["clone", "--quiet"]) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()); + if let Some(branch) = &repo.branch { + clone_cmd.args(["--branch", branch]); + } + clone_cmd.arg(&repo.url); + clone_cmd.arg(&target_path); + + let clone_cmd_child = start_child_process(clone_cmd, GIT_PATH.as_str()).await?; + handle_child( + job_id, + conn, + mem_peak, + canceled_by, + clone_cmd_child, + false, + worker_name, + w_id, + "git clone", + None, + false, + &mut Some(occupancy_metrics), + None, + ) + .await?; + + // Checkout specific commit if provided + if let Some(commit) = &repo.commit { + let mut checkout_cmd = Command::new(GIT_PATH.as_str()); + checkout_cmd + .current_dir(job_dir) + .env_clear() + .envs(PROXY_ENVS.clone()) + .env("PATH", PATH_ENV.as_str()) + .env("TZ", TZ_ENV.as_str()) + .env("GIT_SSH_COMMAND", git_ssh_cmd) + .arg("-C") + .arg(&target_path) + .args(["checkout", "--quiet", commit]) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()); + + let checkout_cmd_child = start_child_process(checkout_cmd, GIT_PATH.as_str()).await?; + handle_child( + job_id, + conn, + mem_peak, + canceled_by, + checkout_cmd_child, + false, + worker_name, + w_id, + "git checkout", + None, + false, + &mut Some(occupancy_metrics), + None, + ) + .await?; + } + + let mut rev_parse_cmd = Command::new(GIT_PATH.as_str()); + + let commit_hash_output = rev_parse_cmd + .current_dir(job_dir) + .env_clear() + .envs(PROXY_ENVS.clone()) + .env("PATH", PATH_ENV.as_str()) + .env("TZ", TZ_ENV.as_str()) + .env("GIT_SSH_COMMAND", git_ssh_cmd) + .arg("-C") + .arg(&target_path) + .args(["rev-parse", "HEAD"]) + .stderr(Stdio::piped()) + .output() + .await?; + + if !commit_hash_output.status.success() { + let stderr = String::from_utf8(commit_hash_output.stderr)?; + return Err(anyhow!("Error getting git repo commit hash: {stderr}").into()); + } + + let commit_hash = String::from_utf8(commit_hash_output.stdout)? + .trim() + .to_string(); + + Ok(commit_hash) +} + +pub fn create_empty_dir(path: &PathBuf) -> std::io::Result<()> { + if path.exists() { + if path.is_dir() { + let mut entries = std::fs::read_dir(&path)?; + if entries.next().is_some() { + return Err(std::io::Error::new( + std::io::ErrorKind::AlreadyExists, + format!( + "Directory '{}' already exists and is not empty", + path.display() + ), + )); + } + Ok(()) + } else { + Err(std::io::Error::new( + std::io::ErrorKind::AlreadyExists, + format!("Path '{}' exists and is not a directory", path.display()), + )) + } + } else { + std::fs::create_dir_all(path) + } +} + +async fn clone_repo_without_history( + repo: &GitRepo, + full_commit: &str, + job_dir: &str, + job_id: &Uuid, + worker_name: &str, + conn: &Connection, + mem_peak: &mut i32, + canceled_by: &mut Option, + w_id: &str, + occupancy_metrics: &mut OccupancyMetrics, + git_ssh_cmd: &str, +) -> error::Result<()> { + let target_path = is_allowed_file_location(job_dir, &repo.target_path)?; + + create_empty_dir(&target_path)?; + + let mut init_cmd = Command::new(GIT_PATH.as_str()); + init_cmd + .current_dir(job_dir) + .env_clear() + .envs(PROXY_ENVS.clone()) + .env("PATH", PATH_ENV.as_str()) + .env("TZ", TZ_ENV.as_str()) + .arg("-C") + .arg(&target_path) + .args(["init", "--quiet"]) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()); + if let Some(branch) = &repo.branch { + init_cmd.args(["--initial-branch", branch]); + } + + let init_cmd_child = start_child_process(init_cmd, GIT_PATH.as_str()).await?; + handle_child( + job_id, + conn, + mem_peak, + canceled_by, + init_cmd_child, + false, + worker_name, + w_id, + "git init", + None, + false, + &mut Some(occupancy_metrics), + None, + ) + .await?; + + let mut add_remote_cmd = Command::new(GIT_PATH.as_str()); + add_remote_cmd + .current_dir(job_dir) + .env_clear() + .envs(PROXY_ENVS.clone()) + .env("PATH", PATH_ENV.as_str()) + .env("TZ", TZ_ENV.as_str()) + .env("GIT_SSH_COMMAND", git_ssh_cmd) + .arg("-C") + .arg(&target_path) + .args(vec!["remote", "add", "origin", &repo.url]) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()); + + let add_remote_cmd_child = start_child_process(add_remote_cmd, GIT_PATH.as_str()).await?; + handle_child( + job_id, + conn, + mem_peak, + canceled_by, + add_remote_cmd_child, + false, + worker_name, + w_id, + "git add remote", + None, + false, + &mut Some(occupancy_metrics), + None, + ) + .await?; + + let mut fetch_cmd = Command::new(GIT_PATH.as_str()); + fetch_cmd + .current_dir(job_dir) + .env_clear() + .envs(PROXY_ENVS.clone()) + .env("PATH", PATH_ENV.as_str()) + .env("TZ", TZ_ENV.as_str()) + .env("GIT_SSH_COMMAND", git_ssh_cmd) + .arg("-C") + .arg(&target_path) + .args(vec!["fetch", "--depth=1", "--quiet", "origin", full_commit]) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()); + + let fetch_cmd_child = start_child_process(fetch_cmd, GIT_PATH.as_str()).await?; + handle_child( + job_id, + conn, + mem_peak, + canceled_by, + fetch_cmd_child, + false, + worker_name, + w_id, + "git fetch", + None, + false, + &mut Some(occupancy_metrics), + None, + ) + .await?; + + let mut checkout_cmd = Command::new(GIT_PATH.as_str()); + checkout_cmd + .current_dir(job_dir) + .env_clear() + .envs(PROXY_ENVS.clone()) + .env("PATH", PATH_ENV.as_str()) + .env("TZ", TZ_ENV.as_str()) + .env("GIT_SSH_COMMAND", git_ssh_cmd) + .arg("-C") + .arg(&target_path) + .args(["checkout", "--quiet", "FETCH_HEAD"]) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()); + + let checkout_cmd_child = start_child_process(checkout_cmd, GIT_PATH.as_str()).await?; + handle_child( + job_id, + conn, + mem_peak, + canceled_by, + checkout_cmd_child, + false, + worker_name, + w_id, + "git checkout", + None, + false, + &mut Some(occupancy_metrics), + None, + ) + .await?; + + Ok(()) +} async fn handle_ansible_python_deps( job_dir: &str, requirements_o: Option<&String>, @@ -118,7 +408,7 @@ async fn handle_ansible_python_deps( Ok(additional_python_paths) } -async fn install_galaxy_collections( +pub async fn install_galaxy_collections( collections_yml: &str, job_dir: &str, job_id: &Uuid, @@ -128,6 +418,7 @@ async fn install_galaxy_collections( canceled_by: &mut Option, conn: &Connection, occupancy_metrics: &mut OccupancyMetrics, + git_ssh_cmd: &str, ) -> anyhow::Result<()> { write_file(job_dir, "requirements.yml", collections_yml)?; @@ -138,15 +429,52 @@ async fn install_galaxy_collections( conn, ) .await; - let mut galaxy_command = Command::new(ANSIBLE_GALAXY_PATH.as_str()); - galaxy_command + + let mut galaxy_roles_cmd = Command::new(ANSIBLE_GALAXY_PATH.as_str()); + galaxy_roles_cmd .current_dir(job_dir) .env_clear() .envs(PROXY_ENVS.clone()) .env("PATH", PATH_ENV.as_str()) .env("TZ", TZ_ENV.as_str()) - // .env("BASE_INTERNAL_URL", base_internal_url) - // .env("HOME", HOME_ENV.as_str()) + .env("GIT_SSH_COMMAND", git_ssh_cmd) + .args(vec![ + "role", + "install", + "-r", + "requirements.yml", + "-p", + "./roles", + ]) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()); + + let child = start_child_process(galaxy_roles_cmd, ANSIBLE_GALAXY_PATH.as_str()).await?; + handle_child( + job_id, + conn, + mem_peak, + canceled_by, + child, + !*DISABLE_NSJAIL, + worker_name, + w_id, + "ansible-galaxy role install", + None, + false, + &mut Some(occupancy_metrics), + None, + ) + .await?; + + let mut galaxy_collections_cmd = Command::new(ANSIBLE_GALAXY_PATH.as_str()); + galaxy_collections_cmd + .current_dir(job_dir) + .env_clear() + .envs(PROXY_ENVS.clone()) + .env("PATH", PATH_ENV.as_str()) + .env("TZ", TZ_ENV.as_str()) + .env("GIT_SSH_COMMAND", git_ssh_cmd) .args(vec![ "collection", "install", @@ -158,7 +486,7 @@ async fn install_galaxy_collections( .stdout(Stdio::piped()) .stderr(Stdio::piped()); - let child = start_child_process(galaxy_command, ANSIBLE_GALAXY_PATH.as_str()).await?; + let child = start_child_process(galaxy_collections_cmd, ANSIBLE_GALAXY_PATH.as_str()).await?; handle_child( job_id, conn, @@ -168,7 +496,7 @@ async fn install_galaxy_collections( !*DISABLE_NSJAIL, worker_name, w_id, - "ansible galaxy install", + "ansible-galaxy collection install", None, false, &mut Some(occupancy_metrics), @@ -179,6 +507,258 @@ async fn install_galaxy_collections( Ok(()) } +#[derive(Serialize, Deserialize)] +pub struct AnsibleDependencyLocks { + pub python_lockfile: String, + pub git_repos: HashMap, // URL to full commit hash + pub collections_and_roles: String, + pub collections_and_roles_logs: String, + // pub collection_versions: HashMap, // + // pub role_versions: HashMap, +} + +pub async fn get_collection_locks( + job_dir: &str, +) -> anyhow::Result<(HashMap, String)> { + let mut ansible_cmd = Command::new(ANSIBLE_GALAXY_PATH.as_str()); + + ansible_cmd + .current_dir(job_dir) + .args(["collection", "list", "--format", "json", "-p", "./"]); + + let output = ansible_cmd.output().await?; + + let mut ret = HashMap::new(); + let mut logs = String::new(); + + if !output.status.success() { + let stderr = String::from_utf8(output.stderr)?; + return Err(anyhow!( + "Error getting ansible collection versions: {stderr}" + )); + } + + let stdout = String::from_utf8(output.stdout)?; + + let val: serde_json::Value = serde_json::from_str(&stdout)?; + + let Some(own_collections) = val.get(format!("{}/ansible_collections", job_dir)) else { + return Ok((ret, logs)); + }; + + let collections = own_collections.as_object().ok_or(anyhow!( + "Expected an object (map) for the `ansible-galaxy collection list` command output and got {}", + own_collections + ))?; + + for (c_name, c) in collections.iter() { + if let Some(v) = c.get("version").and_then(|v| v.as_str()) { + // TODO: Check if version is not something like `(undefined)` + ret.insert(c_name.clone(), v.to_string()); + } else { + logs.push_str(&format!("Failed to get version for collection `{}`. Expected an object with a string in the `version` field but received {}\n", c_name, c)); + } + } + + Ok((ret, logs)) +} + +pub async fn get_role_locks(job_dir: &str) -> anyhow::Result<(HashMap, String)> { + let mut ansible_cmd = Command::new(ANSIBLE_GALAXY_PATH.as_str()); + + ansible_cmd + .current_dir(job_dir) + .args(["role", "list", "-p", "./roles"]); + + let output = ansible_cmd.output().await?; + let mut ret = HashMap::new(); + let mut logs = String::new(); + + if !output.status.success() { + let stderr = String::from_utf8(output.stderr)?; + logs.push_str(&format!("Error getting ansible role versions: {stderr}")); + return Ok((ret, logs)); + } + + let stdout = String::from_utf8(output.stdout)?; + + let mut lines = stdout.lines(); + + while let Some(line) = lines.next() { + if line == format!("# {}/roles", job_dir) { + break; + } + } + + for line in lines { + let line = line.strip_prefix("-").unwrap_or(line); + let mut cols = line.split(","); + + if let Some(name) = cols.next().map(|n| n.trim()) { + if let Some(version) = cols.next().map(|v| v.trim()) { + // TODO: Check if version is not something like `(undefined)` + ret.insert(name.to_string(), version.to_string()); + } else { + logs.push_str(&format!("Failed to get version for role `{}`.", name)); + } + } + } + + Ok((ret, logs)) +} + +pub async fn get_git_repo_full_head_commit_hash( + repo: &GitRepo, + git_ssh_cmd: &str, +) -> anyhow::Result { + let mut git_cmd = Command::new(GIT_PATH.as_str()); + + git_cmd + .env("GIT_SSH_COMMAND", git_ssh_cmd) + .args(["ls-remote", &repo.url, "HEAD"]); + + let output = git_cmd.stderr(Stdio::piped()).output().await?; + + if !output.status.success() { + let stderr = String::from_utf8(output.stderr)?; + return Err(anyhow!("Error getting git repo commit hash: {stderr}")); + } + + let stdout = String::from_utf8(output.stdout)?; + + let lines: Vec<&str> = stdout.lines().collect(); + + if lines.len() != 1 { + return Err(anyhow!("Unexpected output format for git ls-remote",)); + } + + Ok(lines + .first() + .ok_or(anyhow!( + "The HEAD commit hash was not found for repo `{}`", + &repo.url + ))? + .split_whitespace() + .next() + .map(|s| s.to_string()) + .ok_or(anyhow!("Unexpected output format for git ls-remote"))?) +} + +pub async fn get_git_repos_lock( + repos: &Vec, + job_dir: &str, + job_id: &Uuid, + worker_name: &str, + conn: &Connection, + mem_peak: &mut i32, + canceled_by: &mut Option, + w_id: &str, + occupancy_metrics: &mut OccupancyMetrics, + git_ssh_cmd: &str, +) -> anyhow::Result> { + let mut ret = HashMap::new(); + + for repo in repos { + if repo.commit.is_some() { + ret.insert( + repo.url.to_string(), + clone_repo( + repo, + job_dir, + job_id, + worker_name, + conn, + mem_peak, + canceled_by, + w_id, + occupancy_metrics, + git_ssh_cmd, + ) + .await?, + ); + } else { + ret.insert( + repo.url.to_string(), + get_git_repo_full_head_commit_hash(repo, git_ssh_cmd).await?, + ); + } + } + + Ok(ret) +} + +pub fn create_ansible_cfg( + reqs: Option<&AnsibleRequirements>, + job_dir: &str, + vault_password_file_exists: bool, +) -> error::Result<()> { + let mut passwords_cfg = String::new(); + if vault_password_file_exists { + passwords_cfg.push_str(&format!( + "vault_password_file = {WINDMILL_ANSIBLE_PASSWORD_FILENAME}\n" + )); + } + if let Some(vault_ids) = reqs.as_ref().map(|r| &r.vault_id) { + if !vault_ids.is_empty() { + let password_files = vault_ids.join(","); + + passwords_cfg.push_str(&format!("vault_identity_list = {password_files}\n")); + } + } + let ansible_cfg_content = format!( + r#" +[defaults] +collections_path = ./ +roles_path = ./roles +home={job_dir}/.ansible +local_tmp={job_dir}/.ansible/tmp +remote_tmp={job_dir}/.ansible/tmp +{passwords_cfg} +"# + ); + + write_file(job_dir, "ansible.cfg", &ansible_cfg_content)?; + + Ok(()) +} + +pub async fn get_git_ssh_cmd( + reqs: &AnsibleRequirements, + job_dir: &str, + client: &AuthedClient, +) -> error::Result { + let ssh_id_files = try_join_all(reqs.git_ssh_identity.iter().enumerate().map( + async |(i, var_path)| -> error::Result { + let id_file_name = format!(".ssh_id_priv_{}", i); + let loc = is_allowed_file_location(job_dir, &id_file_name)?; + + let mut content = client.get_variable_value(var_path).await.map_err(|e| { + error::Error::NotFound(format!( + "Variable {var_path} not found for git ssh identity: {e:#}" + )) + })?; + content.push_str("\n"); + + let file = write_file(job_dir, &id_file_name, &content)?; + + #[cfg(unix)] + { + let perm = std::os::unix::fs::PermissionsExt::from_mode(0o600); + file.set_permissions(perm)?; + } + + Ok(format!( + " -i '{}'", + loc.to_string_lossy().replace('\'', r"'\''") + )) + }, + )) + .await?; + + let git_ssh_cmd = format!("ssh -o StrictHostKeyChecking=no{}", ssh_id_files.join("")); + Ok(git_ssh_cmd) +} + pub async fn handle_ansible_job( requirements_o: Option<&String>, job_dir: &str, @@ -202,13 +782,17 @@ pub async fn handle_ansible_job( "ansible", )?; + let req_lockfiles: Option = requirements_o + .map(|s| serde_json::from_str(s)) + .transpose()?; + let (logs, reqs, playbook) = windmill_parser_yaml::parse_ansible_reqs(inner_content)?; append_logs(&job.id, &job.workspace_id, logs, conn).await; write_file(job_dir, "main.yml", &playbook)?; let additional_python_paths = handle_ansible_python_deps( job_dir, - requirements_o, + req_lockfiles.as_ref().map(|r| &r.python_lockfile), reqs.as_ref(), &job.workspace_id, &job.id, @@ -221,6 +805,11 @@ pub async fn handle_ansible_job( ) .await?; + let git_ssh_cmd = &match &reqs { + Some(r) => get_git_ssh_cmd(r, job_dir, client).await?, + None => "ssh".to_string(), + }; + let interpolated_args; if let Some(args) = &job.args { let mut args = args.0.clone(); @@ -268,7 +857,7 @@ pub async fn handle_ansible_job( .unwrap_or_else(|| vec![]); let mut nsjail_extra_mounts = vec![]; - if let Some(r) = reqs { + if let Some(r) = reqs.as_ref() { if let Some(db) = conn.as_sql() { nsjail_extra_mounts = create_file_resources( &job.id, @@ -282,9 +871,82 @@ pub async fn handle_ansible_job( .await?; } - if let Some(collections) = r.collections { + for repo in &r.git_repos { + append_logs( + &job.id, + &job.workspace_id, + format!("\nCloning {}...\n", &repo.url), + conn, + ) + .await; + if let Some(full_commit_hash) = req_lockfiles + .as_ref() + .and_then(|r| r.git_repos.get(&repo.url)) + { + clone_repo_without_history( + repo, + full_commit_hash, + job_dir, + &job.id, + worker_name, + conn, + mem_peak, + canceled_by, + &job.workspace_id, + occupancy_metrics, + git_ssh_cmd, + ) + .await + .map_err(|e| anyhow!("Failed to clone git repo `{}`: {e}", repo.url))?; + } else { + if req_lockfiles.is_some() { + append_logs( + &job.id, + &job.workspace_id, + format!("Warning: `{}` is using latest commit because the lockfile didn't store a commit hash for this repo. Updates to the repo could break the deployed playbook.\n", &repo.url), + conn, + ) + .await; + } + clone_repo( + repo, + job_dir, + &job.id, + worker_name, + conn, + mem_peak, + canceled_by, + &job.workspace_id, + occupancy_metrics, + git_ssh_cmd, + ) + .await + .map_err(|e| anyhow!("Failed to clone git repo `{}`: {e}", repo.url))?; + } + + append_logs( + &job.id, + &job.workspace_id, + format!("Cloned {} into {}\n", &repo.url, &repo.target_path), + conn, + ) + .await; + } + + if let Some(collections) = r.roles_and_collections.as_ref() { + let empty = String::new(); + let (lockfile, logs) = + req_lockfiles + .as_ref() + .map(|r| (&r.collections_and_roles, &r.collections_and_roles_logs)) + .unwrap_or((collections, &empty)); + + if !logs.is_empty() { + append_logs(&job.id, &job.workspace_id, logs, conn).await; + } + install_galaxy_collections( - collections.as_str(), + lockfile, job_dir, &job.id, worker_name, @@ -293,10 +955,12 @@ pub async fn handle_ansible_job( canceled_by, conn, occupancy_metrics, + git_ssh_cmd, ) .await?; } } + append_logs( &job.id, &job.workspace_id, @@ -304,17 +968,17 @@ pub async fn handle_ansible_job( conn, ) .await; - let ansible_cfg_content = format!( - r#" -[defaults] -collections_path = ./ -roles_path = ./roles -home={job_dir}/.ansible -local_tmp={job_dir}/.ansible/tmp -remote_tmp={job_dir}/.ansible/tmp -"# - ); - write_file(job_dir, "ansible.cfg", &ansible_cfg_content)?; + + let vault_password_file_exists = match reqs.as_ref().and_then(|x| x.vault_password.as_ref()) { + Some(var_path) => { + let password = client.get_variable_value(&var_path).await?; + write_file(job_dir, WINDMILL_ANSIBLE_PASSWORD_FILENAME, &password)?; + true + } + None => false, + }; + + create_ansible_cfg(reqs.as_ref(), job_dir, vault_password_file_exists)?; let mut reserved_variables = get_reserved_variables(job, &client.token, conn, parent_runnable_path).await?; diff --git a/backend/windmill-worker/src/worker.rs b/backend/windmill-worker/src/worker.rs index fed83e07e0..df80b2cb36 100644 --- a/backend/windmill-worker/src/worker.rs +++ b/backend/windmill-worker/src/worker.rs @@ -306,6 +306,7 @@ lazy_static::lazy_static! { pub static ref NSJAIL_PATH: String = std::env::var("NSJAIL_PATH").unwrap_or_else(|_| "nsjail".to_string()); pub static ref PATH_ENV: String = std::env::var("PATH").unwrap_or_else(|_| String::new()); pub static ref HOME_ENV: String = std::env::var("HOME").unwrap_or_else(|_| "/tmp".to_string()); + pub static ref GIT_PATH: String = std::env::var("GIT_PATH").unwrap_or_else(|_| "/usr/bin/git".to_string()); pub static ref NODE_PATH: Option = std::env::var("NODE_PATH").ok(); diff --git a/backend/windmill-worker/src/worker_lockfiles.rs b/backend/windmill-worker/src/worker_lockfiles.rs index 93cc355eb0..80dec9a70a 100644 --- a/backend/windmill-worker/src/worker_lockfiles.rs +++ b/backend/windmill-worker/src/worker_lockfiles.rs @@ -3,6 +3,8 @@ use std::collections::HashMap; use std::fs::{create_dir_all, remove_dir_all}; use std::path::{Component, Path, PathBuf}; +#[cfg(feature = "python")] +use crate::ansible_executor::{get_git_repos_lock, AnsibleDependencyLocks}; use async_recursion::async_recursion; use serde_json::value::RawValue; use serde_json::{json, Value}; @@ -18,6 +20,8 @@ use windmill_common::scripts::ScriptHash; #[cfg(feature = "python")] use windmill_common::worker::PythonAnnotations; use windmill_common::worker::{to_raw_value, to_raw_value_owned, write_file, Connection}; +#[cfg(feature = "python")] +use windmill_parser_yaml::AnsibleRequirements; use windmill_common::{ apps::AppScriptId, @@ -1917,6 +1921,123 @@ async fn python_dep( req } +#[cfg(feature = "python")] +async fn ansible_dep( + reqs: AnsibleRequirements, + job_id: &Uuid, + mem_peak: &mut i32, + canceled_by: &mut Option, + job_dir: &str, + db: &sqlx::Pool, + worker_name: &str, + w_id: &str, + worker_dir: &str, + occupancy_metrics: &mut OccupancyMetrics, + token: &str, + base_internal_url: &str, +) -> std::result::Result { + use windmill_parser_yaml::add_versions_to_requirements_yaml; + + use crate::{ + ansible_executor::{ + create_ansible_cfg, get_collection_locks, get_git_ssh_cmd, get_role_locks, + install_galaxy_collections, + }, + AuthedClient, + }; + + let python_lockfile = python_dep( + reqs.python_reqs.join("\n").to_string(), + job_id, + mem_peak, + canceled_by, + job_dir, + db, + worker_name, + w_id, + worker_dir, + &mut Some(occupancy_metrics), + None, + PythonAnnotations::default(), + ) + .await?; + + let conn = &Connection::Sql(db.clone()); + + let authed_client = AuthedClient { + base_internal_url: base_internal_url.to_string(), + token: token.to_string(), + workspace: w_id.to_string(), + force_client: None, + }; + + let git_ssh_cmd = get_git_ssh_cmd(&reqs, job_dir, &authed_client).await?; + + let git_repos = get_git_repos_lock( + &reqs.git_repos, + job_dir, + job_id, + worker_name, + conn, + mem_peak, + canceled_by, + w_id, + occupancy_metrics, + &git_ssh_cmd, + ) + .await?; + + let ansible_lockfile; + + create_ansible_cfg(Some(&reqs), job_dir, false)?; + + if let Some(collections) = reqs.roles_and_collections.as_ref() { + install_galaxy_collections( + collections, + job_dir, + job_id, + worker_name, + w_id, + mem_peak, + canceled_by, + conn, + occupancy_metrics, + &git_ssh_cmd, + ) + .await?; + + let (collection_versions, logs1) = get_collection_locks(job_dir).await?; + + let (role_versions, logs2) = if collections.contains("roles:") { + get_role_locks(job_dir).await? + } else { + (HashMap::new(), String::new()) + }; + + let (reqs_yaml, logs3) = add_versions_to_requirements_yaml(&collections, &role_versions, &collection_versions)?; + + let logs = format!("\n{logs1}\n{logs2}\n{logs3}\n"); + + append_logs(job_id, w_id, &logs, conn).await; + + ansible_lockfile = AnsibleDependencyLocks { + python_lockfile, + git_repos, + collections_and_roles: reqs_yaml, + collections_and_roles_logs: logs, + }; + } else { + ansible_lockfile = AnsibleDependencyLocks { + python_lockfile, + git_repos, + collections_and_roles: String::new(), + collections_and_roles_logs: String::new(), + }; + } + + serde_json::to_string(&ansible_lockfile).map_err(|e| e.into()) +} + async fn capture_dependency_job( job_id: &Uuid, job_language: &ScriptLang, @@ -2001,10 +2122,9 @@ async fn capture_dependency_job( )); } let (_logs, reqs, _) = windmill_parser_yaml::parse_ansible_reqs(job_raw_code)?; - let reqs = reqs.map(|r| r.python_reqs.join("\n")).unwrap_or_default(); - python_dep( - reqs, + ansible_dep( + reqs.unwrap_or_default(), job_id, mem_peak, canceled_by, @@ -2013,9 +2133,9 @@ async fn capture_dependency_job( worker_name, w_id, worker_dir, - &mut Some(occupancy_metrics), - None, - PythonAnnotations::default(), + occupancy_metrics, + token, + base_internal_url, ) .await } diff --git a/flake.nix b/flake.nix index f821279959..5e50c9fc0e 100644 --- a/flake.nix +++ b/flake.nix @@ -94,6 +94,7 @@ oracle-instantclient # LSP/Local dev svelte-language-server + ansible taplo ]); packages = [ @@ -158,6 +159,7 @@ ]; inherit PKG_CONFIG_PATH RUSTY_V8_ARCHIVE; + GIT_PATH = "${pkgs.git}/bin/git"; NODE_ENV = "development"; NODE_OPTIONS = "--max-old-space-size=16384"; DATABASE_URL = "postgres://postgres:changeme@127.0.0.1:5432/"; @@ -172,12 +174,14 @@ JAVA_PATH = "${pkgs.jdk21}/bin/java"; JAVAC_PATH = "${pkgs.jdk21}/bin/javac"; COURSIER_PATH = "${coursier}/coursier"; - # for related places search: ADD_NEW_LANG + # for related places search: ADD_NEW_LANG FLOCK_PATH = "${pkgs.flock}/bin/flock"; CARGO_PATH = "${rust}/bin/cargo"; DOTNET_PATH = "${pkgs.dotnet-sdk_9}/bin/dotnet"; DOTNET_ROOT = "${pkgs.dotnet-sdk_9}/share/dotnet"; ORACLE_LIB_DIR = "${pkgs.oracle-instantclient.lib}/lib"; + ANSIBLE_PLAYBOOK_PATH = "${pkgs.ansible}/bin/ansible-playbook"; + ANSIBLE_GALAXY_PATH = "${pkgs.ansible}/bin/ansible-galaxy"; RUST_LOG = "debug"; }; packages.default = self.packages.${system}.windmill; diff --git a/frontend/src/lib/script_helpers.ts b/frontend/src/lib/script_helpers.ts index 9e90ebe74c..a9a0ceb4de 100644 --- a/frontend/src/lib/script_helpers.ts +++ b/frontend/src/lib/script_helpers.ts @@ -931,6 +931,12 @@ inventory: - resource_type: ansible_inventory # You can pin an inventory to this script by hardcoding the resource path: # resource: u/user/your_resource +# - name: hcloud.yml +# resource_type: dynamic_inventory + +options: + - verbosity: vvv + # File resources will be written in the relative \`target\` location before # running the playbook @@ -946,11 +952,15 @@ extra_vars: world_qualifier: type: string +# If using Ansible Vault: +# vault_password: u/user/ansible_vault_password + dependencies: galaxy: collections: - name: community.general - name: community.vmware + roles: python: - jmespath --- From 162552431138d68002c7060cad4ae31f1ec4c69c Mon Sep 17 00:00:00 2001 From: centdix <40307056+centdix@users.noreply.github.com> Date: Fri, 25 Apr 2025 14:22:45 +0200 Subject: [PATCH 277/739] feat: Add MCP only mode (#5661) * add mcp mode * fix flag usage * change mcp path * do not migrate db in mcp mode * handle null values --- backend/src/main.rs | 34 +++++++---- backend/tests/worker.rs | 11 +--- backend/windmill-api/src/auth.rs | 7 +++ backend/windmill-api/src/lib.rs | 32 +++++++++- backend/windmill-api/src/mcp.rs | 60 +++++++++++-------- backend/windmill-common/src/utils.rs | 8 ++- .../src/lib/components/TokensTable.svelte | 2 +- 7 files changed, 101 insertions(+), 53 deletions(-) diff --git a/backend/src/main.rs b/backend/src/main.rs index 7f4bcda628..b2d77f352b 100644 --- a/backend/src/main.rs +++ b/backend/src/main.rs @@ -265,6 +265,8 @@ async fn windmill_main() -> anyhow::Result<()> { if mode == Mode::Standalone { println!("Running in standalone mode"); + } else if mode == Mode::MCP { + println!("Running in MCP mode"); } #[cfg(all(not(target_env = "msvc"), feature = "jemalloc"))] @@ -297,7 +299,7 @@ async fn windmill_main() -> anyhow::Result<()> { } #[allow(unused_mut)] - let mut num_workers = if mode == Mode::Server || mode == Mode::Indexer { + let mut num_workers = if mode == Mode::Server || mode == Mode::Indexer || mode == Mode::MCP { 0 } else { std::env::var("NUM_WORKERS") @@ -316,11 +318,12 @@ async fn windmill_main() -> anyhow::Result<()> { .ok() .and_then(|x| x.parse::().ok()) .unwrap_or(false) - && (mode == Mode::Server || mode == Mode::Standalone); + && (mode == Mode::Server || mode == Mode::Standalone || mode == Mode::MCP); let indexer_mode = mode == Mode::Indexer; + let mcp_mode = mode == Mode::MCP; - let server_bind_address: IpAddr = if server_mode || indexer_mode { + let server_bind_address: IpAddr = if server_mode || indexer_mode || mcp_mode { std::env::var("SERVER_BIND_ADDR") .ok() .and_then(|x| x.parse().ok()) @@ -380,7 +383,7 @@ async fn windmill_main() -> anyhow::Result<()> { .is_some_and(|x| x == "1" || x == "true"); if let Some(db) = conn.as_sql() { - if !is_agent && !indexer_mode { + if !is_agent && !indexer_mode && !mcp_mode { let skip_migration = std::env::var("SKIP_MIGRATION") .map(|val| val == "true") .unwrap_or(false); @@ -647,6 +650,7 @@ Windmill Community Edition {GIT_VERSION} server_killpill_rx, base_internal_tx, server_mode, + mcp_mode, base_internal_url.clone(), ) .await?; @@ -1049,15 +1053,19 @@ Windmill Community Edition {GIT_VERSION} } } - futures::try_join!( - shutdown_signal, - workers_f, - monitor_f, - server_f, - metrics_f, - indexer_f, - log_indexer_f - )?; + if mcp_mode { + futures::try_join!(shutdown_signal, workers_f, server_f)?; + } else { + futures::try_join!( + shutdown_signal, + workers_f, + monitor_f, + server_f, + metrics_f, + indexer_f, + log_indexer_f + )?; + } } else { tracing::info!("Nothing to do, exiting."); } diff --git a/backend/tests/worker.rs b/backend/tests/worker.rs index 182ed60f2e..50f17c26b9 100644 --- a/backend/tests/worker.rs +++ b/backend/tests/worker.rs @@ -137,6 +137,7 @@ impl ApiServer { rx, port_tx, false, + false, format!("http://localhost:{}", addr.port()), )); @@ -3977,7 +3978,6 @@ def main(): } #[sqlx::test(fixtures("base", "lockfile_python"))] async fn test_extra_requirements_python2(db: Pool) { - let content = r#" # py311 # extra_requirements: @@ -3993,14 +3993,9 @@ def main(): &db, content, ScriptLang::Python3, - vec![ - "# py311", - "simplejson==3.20.1", - "tiny==0.1.3" - ], + vec!["# py311", "simplejson==3.20.1", "tiny==0.1.3"], ) .await; - } #[sqlx::test(fixtures("base", "lockfile_python"))] @@ -4029,7 +4024,7 @@ def main(): "bottle==0.13.0", "microdot==2.2.0", "simplejson==3.19.3", - "tiny==0.1.3" + "tiny==0.1.3", ], ) .await; diff --git a/backend/windmill-api/src/auth.rs b/backend/windmill-api/src/auth.rs index 8175e0eae5..2936b74957 100644 --- a/backend/windmill-api/src/auth.rs +++ b/backend/windmill-api/src/auth.rs @@ -511,6 +511,13 @@ where let path_vec: Vec<&str> = original_uri.path().split("/").collect(); let workspace_id = if path_vec.len() >= 4 && path_vec[0] == "" && path_vec[2] == "w" { Some(path_vec[3].to_owned()) + } else if path_vec.len() >= 5 + && path_vec[0] == "" + && path_vec[1] == "api" + && path_vec[2] == "mcp" + && path_vec[3] == "w" + { + Some(path_vec[4].to_string()) } else { if path_vec.len() >= 5 && path_vec[0] == "" diff --git a/backend/windmill-api/src/lib.rs b/backend/windmill-api/src/lib.rs index d773cc8615..4245d0d736 100644 --- a/backend/windmill-api/src/lib.rs +++ b/backend/windmill-api/src/lib.rs @@ -225,6 +225,7 @@ pub async fn run_server( mut killpill_rx: tokio::sync::broadcast::Receiver<()>, port_tx: tokio::sync::oneshot::Sender, server_mode: bool, + mcp_mode: bool, _base_internal_url: String, ) -> anyhow::Result<()> { let user_db = UserDB::new(db.clone()); @@ -465,7 +466,7 @@ pub async fn run_server( // Setup MCP server #[cfg(feature = "mcp")] - let (mcp_sse_server, mcp_router) = setup_mcp_server(addr, "/api/w/:workspace_id/mcp")?; + let (mcp_sse_server, mcp_router) = setup_mcp_server(addr, "/api/mcp/w/:workspace_id")?; #[cfg(feature = "mcp")] let mcp_main_ct = mcp_sse_server.config.ct.clone(); // Token to signal shutdown *to* MCP #[cfg(feature = "mcp")] @@ -478,6 +479,15 @@ pub async fn run_server( #[cfg(feature = "agent_worker_server")] let agent_cache = Arc::new(AgentCache::new()); + // used on mcp mode only + #[cfg(feature = "mcp")] + let mcp_app = Router::new() + .nest("/api/mcp/w/:workspace_id", mcp_router.clone()) + .layer(from_extractor::()) + .layer(middleware_stack.clone()); + #[cfg(not(feature = "mcp"))] + let mcp_app = Router::new(); + // build our application with a route let app = Router::new() .nest( @@ -609,7 +619,7 @@ pub async fn run_server( .layer(from_extractor::()) .layer(cors.clone()), ) - .nest("/w/:workspace_id/mcp", { + .nest("/mcp/w/:workspace_id", { #[cfg(feature = "mcp")] { mcp_router @@ -729,7 +739,23 @@ pub async fn run_server( ) }; - let server = axum::serve(listener, app.into_make_service()); + let mcp_app = if disable_response_logs { + mcp_app + } else { + mcp_app.layer( + TraceLayer::new_for_http() + .on_response(MyOnResponse {}) + .make_span_with(MyMakeSpan {}) + .on_request(()) + .on_failure(MyOnFailure {}), + ) + }; + + let server = if mcp_mode { + axum::serve(listener, mcp_app.into_make_service()) + } else { + axum::serve(listener, app.into_make_service()) + }; tracing::info!( instance = %*INSTANCE_NAME, diff --git a/backend/windmill-api/src/mcp.rs b/backend/windmill-api/src/mcp.rs index b7301d7538..b1c0d8b785 100644 --- a/backend/windmill-api/src/mcp.rs +++ b/backend/windmill-api/src/mcp.rs @@ -35,17 +35,17 @@ pub struct Runner {} #[derive(Serialize, FromRow)] struct ScriptInfo { path: String, - summary: String, - description: String, - schema: Schema, + summary: Option, + description: Option, + schema: Option, } #[derive(Serialize, FromRow, Debug)] struct FlowInfo { path: String, - summary: String, - description: String, - schema: Schema, + summary: Option, + description: Option, + schema: Option, } #[derive(Serialize, FromRow, Debug)] @@ -543,17 +543,21 @@ impl ServerHandler for Runner { let name = Runner::transform_path(&script.path, "script").unwrap_or_default(); let description = format!( "This is a script named {} with the following description: {}.", - script.summary, script.description + script.summary.as_deref().unwrap_or("No summary"), + script.description.as_deref().unwrap_or("No description") ); - let schema: Schema = script.schema; - let schema_obj = Runner::transform_schema_for_resources( - &schema, - user_db, - authed, - &workspace_id, - &mut resources_info, - ) - .await?; + let schema_obj = if let Some(schema) = script.schema { + Runner::transform_schema_for_resources( + &schema, + user_db, + authed, + &workspace_id, + &mut resources_info, + ) + .await? + } else { + serde_json::Value::Object(serde_json::Map::new()) + }; script_tools.push(Tool { name: Cow::Owned(name), description: Some(Cow::Owned(description)), @@ -573,17 +577,21 @@ impl ServerHandler for Runner { let name = Runner::transform_path(&flow.path, "flow").unwrap_or_default(); let description = format!( "This is a flow named {} with the following description: {}.", - flow.summary, flow.description + flow.summary.as_deref().unwrap_or("No summary"), + flow.description.as_deref().unwrap_or("No description") ); - let schema: Schema = flow.schema; - let schema_obj = Runner::transform_schema_for_resources( - &schema, - user_db, - authed, - &workspace_id, - &mut resources_info, - ) - .await?; + let schema_obj = if let Some(schema) = flow.schema { + Runner::transform_schema_for_resources( + &schema, + user_db, + authed, + &workspace_id, + &mut resources_info, + ) + .await? + } else { + serde_json::Value::Object(serde_json::Map::new()) + }; flow_tools.push(Tool { name: Cow::Owned(name), description: Some(Cow::Owned(description)), diff --git a/backend/windmill-common/src/utils.rs b/backend/windmill-common/src/utils.rs index 62c193031a..ff3aea9a19 100644 --- a/backend/windmill-common/src/utils.rs +++ b/backend/windmill-common/src/utils.rs @@ -97,8 +97,10 @@ lazy_static::lazy_static! { search_addon = true; println!("Binary is in 'standalone' mode with search enabled"); Mode::Standalone - } - else { + } else if &x == "mcp" { + println!("Binary is in 'mcp' mode"); + Mode::MCP + } else { if &x != "standalone" { eprintln!("mode not recognized, defaulting to standalone: {x}"); } else { @@ -346,6 +348,7 @@ pub enum Mode { Server, Standalone, Indexer, + MCP, } impl std::fmt::Display for Mode { @@ -356,6 +359,7 @@ impl std::fmt::Display for Mode { Mode::Server => write!(f, "server"), Mode::Standalone => write!(f, "standalone"), Mode::Indexer => write!(f, "indexer"), + Mode::MCP => write!(f, "mcp"), } } } diff --git a/frontend/src/lib/components/TokensTable.svelte b/frontend/src/lib/components/TokensTable.svelte index 9058a99e1c..3efbe53e89 100644 --- a/frontend/src/lib/components/TokensTable.svelte +++ b/frontend/src/lib/components/TokensTable.svelte @@ -51,7 +51,7 @@ let newMcpScope = $state('favorites') let newMcpToken = $state(undefined) - const mcpBaseUrl = $derived(`${window.location.origin}/api/w/${$workspaceStore}/mcp/sse?token=`) + const mcpBaseUrl = $derived(`${window.location.origin}/api/mcp/w/${newTokenWorkspace}/sse?token=`) const dispatch = createEventDispatcher() $effect(() => { From dc5c8d8c5f8577b7ded3da1d684cdb735fa7a936 Mon Sep 17 00:00:00 2001 From: Alexander Petric Date: Fri, 25 Apr 2025 08:27:33 -0400 Subject: [PATCH 278/739] fix: check for valid teams_channel config when saving critical alerts settings (#5660) * fix: check for valid teams_channel config when saving critical alerts settings * Update frontend/src/lib/components/InstanceSettings.svelte Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> * sqlx prepare * Update InstanceSettings.svelte * Update InstanceSettings.svelte --------- Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> Co-authored-by: Ruben Fiszel --- ...5216e915c7649698687a00d47da55c70349f.json} | 4 +-- ...0613f9e651540a279bd7d75e5e7d79f676a8.json} | 4 +-- ...53c43903f929ae5d62fbba12610f89c36d55.json} | 4 +-- ...0cb549a34b96554ae1872355b90304f5dcb76.json | 4 +-- ...719616a614d77e726433737e5f5d9bd60134.json} | 4 +-- ...508835affcb7679a48f2a443777e829bd1e74.json | 10 +++--- backend/src/monitor.rs | 24 ++++++------- backend/windmill-api/openapi.yaml | 35 ++++++++++++++++--- .../lib/components/InstanceSettings.svelte | 25 ++++++++++++- 9 files changed, 81 insertions(+), 33 deletions(-) rename backend/.sqlx/{query-f822df86bf511fe0d3044b69525a6ff2524167877929886adca9b0fa3d3fee45.json => query-00c4a602aa6a50f2f922851ce63b5216e915c7649698687a00d47da55c70349f.json} (69%) rename backend/.sqlx/{query-ebd25047d14bec8457465ba6ed9b6b15b8f2303157b4c6e80ac9e3d84a57d8b1.json => query-3e261911cc4c5289da49865f54350613f9e651540a279bd7d75e5e7d79f676a8.json} (68%) rename backend/.sqlx/{query-ddf2eccb78a310ed00c7d8b9c3f05d394a7cbcf0038c72a78add5c7b02ef5927.json => query-5a219a2532517869578c4504ff3153c43903f929ae5d62fbba12610f89c36d55.json} (50%) rename backend/.sqlx/{query-abfc6b530565f125bd0b8ac99cd67fd22f14f8fce89e59890ba21e87fe323af5.json => query-daf9674838fb3e3653a356c7434c719616a614d77e726433737e5f5d9bd60134.json} (76%) diff --git a/backend/.sqlx/query-f822df86bf511fe0d3044b69525a6ff2524167877929886adca9b0fa3d3fee45.json b/backend/.sqlx/query-00c4a602aa6a50f2f922851ce63b5216e915c7649698687a00d47da55c70349f.json similarity index 69% rename from backend/.sqlx/query-f822df86bf511fe0d3044b69525a6ff2524167877929886adca9b0fa3d3fee45.json rename to backend/.sqlx/query-00c4a602aa6a50f2f922851ce63b5216e915c7649698687a00d47da55c70349f.json index 3adc1f8cd5..a3ec5fbabe 100644 --- a/backend/.sqlx/query-f822df86bf511fe0d3044b69525a6ff2524167877929886adca9b0fa3d3fee45.json +++ b/backend/.sqlx/query-00c4a602aa6a50f2f922851ce63b5216e915c7649698687a00d47da55c70349f.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n DELETE\n FROM parallel_monitor_lock\n WHERE last_ping IS NOT NULL AND last_ping < NOW() - ($1 || ' seconds')::interval \n RETURNING parent_flow_id, job_id, last_ping, (SELECT workspace_id FROM v2_job_queue q\n WHERE q.id = parent_flow_id AND q.running = true AND q.canceled_by IS NULL\n ) AS workspace_id\n ", + "query": "\n DELETE\n FROM parallel_monitor_lock\n WHERE last_ping IS NOT NULL AND last_ping < NOW() - ($1 || ' seconds')::interval\n RETURNING parent_flow_id, job_id, last_ping, (SELECT workspace_id FROM v2_job_queue q\n WHERE q.id = parent_flow_id AND q.running = true AND q.canceled_by IS NULL\n ) AS workspace_id\n ", "describe": { "columns": [ { @@ -36,5 +36,5 @@ null ] }, - "hash": "f822df86bf511fe0d3044b69525a6ff2524167877929886adca9b0fa3d3fee45" + "hash": "00c4a602aa6a50f2f922851ce63b5216e915c7649698687a00d47da55c70349f" } diff --git a/backend/.sqlx/query-ebd25047d14bec8457465ba6ed9b6b15b8f2303157b4c6e80ac9e3d84a57d8b1.json b/backend/.sqlx/query-3e261911cc4c5289da49865f54350613f9e651540a279bd7d75e5e7d79f676a8.json similarity index 68% rename from backend/.sqlx/query-ebd25047d14bec8457465ba6ed9b6b15b8f2303157b4c6e80ac9e3d84a57d8b1.json rename to backend/.sqlx/query-3e261911cc4c5289da49865f54350613f9e651540a279bd7d75e5e7d79f676a8.json index 6c92e12f6a..321831d724 100644 --- a/backend/.sqlx/query-ebd25047d14bec8457465ba6ed9b6b15b8f2303157b4c6e80ac9e3d84a57d8b1.json +++ b/backend/.sqlx/query-3e261911cc4c5289da49865f54350613f9e651540a279bd7d75e5e7d79f676a8.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT worker, array_agg(v2_job_queue.id) as ids FROM v2_job_queue LEFT JOIN v2_job ON v2_job_queue.id = v2_job.id LEFT JOIN v2_job_runtime ON v2_job_queue.id = v2_job_runtime.id WHERE v2_job_queue.created_at < now() - ('60 seconds')::interval \n AND running = true AND ping IS NULL AND same_worker = true AND worker IS NOT NULL GROUP BY worker", + "query": "SELECT worker, array_agg(v2_job_queue.id) as ids FROM v2_job_queue LEFT JOIN v2_job ON v2_job_queue.id = v2_job.id LEFT JOIN v2_job_runtime ON v2_job_queue.id = v2_job_runtime.id WHERE v2_job_queue.created_at < now() - ('60 seconds')::interval\n AND running = true AND ping IS NULL AND same_worker = true AND worker IS NOT NULL GROUP BY worker", "describe": { "columns": [ { @@ -22,5 +22,5 @@ null ] }, - "hash": "ebd25047d14bec8457465ba6ed9b6b15b8f2303157b4c6e80ac9e3d84a57d8b1" + "hash": "3e261911cc4c5289da49865f54350613f9e651540a279bd7d75e5e7d79f676a8" } diff --git a/backend/.sqlx/query-ddf2eccb78a310ed00c7d8b9c3f05d394a7cbcf0038c72a78add5c7b02ef5927.json b/backend/.sqlx/query-5a219a2532517869578c4504ff3153c43903f929ae5d62fbba12610f89c36d55.json similarity index 50% rename from backend/.sqlx/query-ddf2eccb78a310ed00c7d8b9c3f05d394a7cbcf0038c72a78add5c7b02ef5927.json rename to backend/.sqlx/query-5a219a2532517869578c4504ff3153c43903f929ae5d62fbba12610f89c36d55.json index c2dfed73a2..713ccb9dd3 100644 --- a/backend/.sqlx/query-ddf2eccb78a310ed00c7d8b9c3f05d394a7cbcf0038c72a78add5c7b02ef5927.json +++ b/backend/.sqlx/query-5a219a2532517869578c4504ff3153c43903f929ae5d62fbba12610f89c36d55.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "WITH worker_ids AS (SELECT unnest($1::text[]) as worker) \n SELECT worker_ids.worker FROM worker_ids \n LEFT JOIN worker_ping ON worker_ids.worker = worker_ping.worker \n WHERE worker_ping.worker IS NULL OR worker_ping.ping_at < now() - ('60 seconds')::interval", + "query": "WITH worker_ids AS (SELECT unnest($1::text[]) as worker)\n SELECT worker_ids.worker FROM worker_ids\n LEFT JOIN worker_ping ON worker_ids.worker = worker_ping.worker\n WHERE worker_ping.worker IS NULL OR worker_ping.ping_at < now() - ('60 seconds')::interval", "describe": { "columns": [ { @@ -18,5 +18,5 @@ null ] }, - "hash": "ddf2eccb78a310ed00c7d8b9c3f05d394a7cbcf0038c72a78add5c7b02ef5927" + "hash": "5a219a2532517869578c4504ff3153c43903f929ae5d62fbba12610f89c36d55" } diff --git a/backend/.sqlx/query-b3dbdfb50ee8118bdaed3164b210cb549a34b96554ae1872355b90304f5dcb76.json b/backend/.sqlx/query-b3dbdfb50ee8118bdaed3164b210cb549a34b96554ae1872355b90304f5dcb76.json index 54e94cfb8f..99269c9851 100644 --- a/backend/.sqlx/query-b3dbdfb50ee8118bdaed3164b210cb549a34b96554ae1872355b90304f5dcb76.json +++ b/backend/.sqlx/query-b3dbdfb50ee8118bdaed3164b210cb549a34b96554ae1872355b90304f5dcb76.json @@ -18,8 +18,8 @@ "Left": [] }, "nullable": [ - false, - true + true, + false ] }, "hash": "b3dbdfb50ee8118bdaed3164b210cb549a34b96554ae1872355b90304f5dcb76" diff --git a/backend/.sqlx/query-abfc6b530565f125bd0b8ac99cd67fd22f14f8fce89e59890ba21e87fe323af5.json b/backend/.sqlx/query-daf9674838fb3e3653a356c7434c719616a614d77e726433737e5f5d9bd60134.json similarity index 76% rename from backend/.sqlx/query-abfc6b530565f125bd0b8ac99cd67fd22f14f8fce89e59890ba21e87fe323af5.json rename to backend/.sqlx/query-daf9674838fb3e3653a356c7434c719616a614d77e726433737e5f5d9bd60134.json index 55039055c8..2e2a9ba027 100644 --- a/backend/.sqlx/query-abfc6b530565f125bd0b8ac99cd67fd22f14f8fce89e59890ba21e87fe323af5.json +++ b/backend/.sqlx/query-daf9674838fb3e3653a356c7434c719616a614d77e726433737e5f5d9bd60134.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "WITH to_update AS (\n SELECT q.id, q.workspace_id, r.ping, COALESCE(zjc.counter, 0) as counter\n FROM v2_job_queue q\n JOIN v2_job j ON j.id = q.id\n JOIN v2_job_runtime r ON r.id = j.id\n LEFT JOIN zombie_job_counter zjc ON zjc.job_id = q.id\n WHERE ping < now() - ($1 || ' seconds')::interval\n AND running = true\n AND kind NOT IN ('flow', 'flowpreview', 'flownode', 'singlescriptflow')\n AND same_worker = false\n AND (zjc.counter IS NULL OR zjc.counter <= $2)\n FOR UPDATE of q SKIP LOCKED\n ),\n zombie_jobs AS (\n UPDATE v2_job_queue q\n SET running = false, started_at = null\n FROM to_update tu\n WHERE q.id = tu.id AND (tu.counter IS NULL OR tu.counter < $2)\n RETURNING q.id, q.workspace_id, ping, tu.counter\n ),\n update_ping AS (\n UPDATE v2_job_runtime r\n SET ping = null\n FROM zombie_jobs zj\n WHERE r.id = zj.id\n ),\n increment_counter AS (\n INSERT INTO zombie_job_counter (job_id, counter)\n SELECT id, 1 FROM to_update WHERE counter < $2\n ON CONFLICT (job_id) DO UPDATE \n SET counter = zombie_job_counter.counter + 1\n ),\n update_concurrency AS (\n UPDATE concurrency_counter cc\n SET job_uuids = job_uuids - zj.id::text\n FROM zombie_jobs zj\n INNER JOIN concurrency_key ck ON ck.job_id = zj.id\n WHERE cc.concurrency_id = ck.key\n )\n SELECT id AS \"id!\", workspace_id AS \"workspace_id!\", ping, counter + 1 AS counter FROM to_update", + "query": "WITH to_update AS (\n SELECT q.id, q.workspace_id, r.ping, COALESCE(zjc.counter, 0) as counter\n FROM v2_job_queue q\n JOIN v2_job j ON j.id = q.id\n JOIN v2_job_runtime r ON r.id = j.id\n LEFT JOIN zombie_job_counter zjc ON zjc.job_id = q.id\n WHERE ping < now() - ($1 || ' seconds')::interval\n AND running = true\n AND kind NOT IN ('flow', 'flowpreview', 'flownode', 'singlescriptflow')\n AND same_worker = false\n AND (zjc.counter IS NULL OR zjc.counter <= $2)\n FOR UPDATE of q SKIP LOCKED\n ),\n zombie_jobs AS (\n UPDATE v2_job_queue q\n SET running = false, started_at = null\n FROM to_update tu\n WHERE q.id = tu.id AND (tu.counter IS NULL OR tu.counter < $2)\n RETURNING q.id, q.workspace_id, ping, tu.counter\n ),\n update_ping AS (\n UPDATE v2_job_runtime r\n SET ping = null\n FROM zombie_jobs zj\n WHERE r.id = zj.id\n ),\n increment_counter AS (\n INSERT INTO zombie_job_counter (job_id, counter)\n SELECT id, 1 FROM to_update WHERE counter < $2\n ON CONFLICT (job_id) DO UPDATE\n SET counter = zombie_job_counter.counter + 1\n ),\n update_concurrency AS (\n UPDATE concurrency_counter cc\n SET job_uuids = job_uuids - zj.id::text\n FROM zombie_jobs zj\n INNER JOIN concurrency_key ck ON ck.job_id = zj.id\n WHERE cc.concurrency_id = ck.key\n )\n SELECT id AS \"id!\", workspace_id AS \"workspace_id!\", ping, counter + 1 AS counter FROM to_update", "describe": { "columns": [ { @@ -37,5 +37,5 @@ null ] }, - "hash": "abfc6b530565f125bd0b8ac99cd67fd22f14f8fce89e59890ba21e87fe323af5" + "hash": "daf9674838fb3e3653a356c7434c719616a614d77e726433737e5f5d9bd60134" } diff --git a/backend/.sqlx/query-fec6d5674dc6b5a6a0ece419c40508835affcb7679a48f2a443777e829bd1e74.json b/backend/.sqlx/query-fec6d5674dc6b5a6a0ece419c40508835affcb7679a48f2a443777e829bd1e74.json index 649ab85650..de2e819af2 100644 --- a/backend/.sqlx/query-fec6d5674dc6b5a6a0ece419c40508835affcb7679a48f2a443777e829bd1e74.json +++ b/backend/.sqlx/query-fec6d5674dc6b5a6a0ece419c40508835affcb7679a48f2a443777e829bd1e74.json @@ -41,11 +41,11 @@ ] }, "nullable": [ - false, - false, - false, - false, - false, + true, + true, + true, + true, + true, true ] }, diff --git a/backend/src/monitor.rs b/backend/src/monitor.rs index 8dae3f8c5e..e8bb9be822 100644 --- a/backend/src/monitor.rs +++ b/backend/src/monitor.rs @@ -135,7 +135,7 @@ pub async fn initial_load( } } - + if let Err(e) = load_metrics_enabled(conn).await { tracing::error!("Error loading expose metrics: {e:#}"); } @@ -176,7 +176,7 @@ pub async fn initial_load( } } } - + if let Err(e) = reload_hub_base_url_setting(conn, server_mode).await { tracing::error!("Error reloading hub base url: {:?}", e) @@ -612,7 +612,7 @@ async fn send_log_file_to_object_store( let (ok_lines, err_lines) = read_log_counters(ts_str); if let Some(db) = conn.as_sql() { - if let Err(e) = sqlx::query!("INSERT INTO log_file (hostname, mode, worker_group, log_ts, file_path, ok_lines, err_lines, json_fmt) VALUES ($1, $2::text::LOG_MODE, $3, $4, $5, $6, $7, $8)", + if let Err(e) = sqlx::query!("INSERT INTO log_file (hostname, mode, worker_group, log_ts, file_path, ok_lines, err_lines, json_fmt) VALUES ($1, $2::text::LOG_MODE, $3, $4, $5, $6, $7, $8)", hostname, mode.to_string(), worker_group.clone(), ts, highest_file, ok_lines as i64, err_lines as i64, *JSON_FMT) .execute(db) .await { @@ -1652,7 +1652,7 @@ async fn handle_zombie_jobs(db: &Pool, base_internal_url: &str, worker increment_counter AS ( INSERT INTO zombie_job_counter (job_id, counter) SELECT id, 1 FROM to_update WHERE counter < $2 - ON CONFLICT (job_id) DO UPDATE + ON CONFLICT (job_id) DO UPDATE SET counter = zombie_job_counter.counter + 1 ), update_concurrency AS ( @@ -1744,7 +1744,7 @@ async fn handle_zombie_jobs(db: &Pool, base_internal_url: &str, worker let same_worker_timeout_jobs = { let long_same_worker_jobs = sqlx::query!( - "SELECT worker, array_agg(v2_job_queue.id) as ids FROM v2_job_queue LEFT JOIN v2_job ON v2_job_queue.id = v2_job.id LEFT JOIN v2_job_runtime ON v2_job_queue.id = v2_job_runtime.id WHERE v2_job_queue.created_at < now() - ('60 seconds')::interval + "SELECT worker, array_agg(v2_job_queue.id) as ids FROM v2_job_queue LEFT JOIN v2_job ON v2_job_queue.id = v2_job.id LEFT JOIN v2_job_runtime ON v2_job_queue.id = v2_job_runtime.id WHERE v2_job_queue.created_at < now() - ('60 seconds')::interval AND running = true AND ping IS NULL AND same_worker = true AND worker IS NOT NULL GROUP BY worker", ) .fetch_all(db) @@ -1758,9 +1758,9 @@ async fn handle_zombie_jobs(db: &Pool, base_internal_url: &str, worker .collect::>(); let long_dead_workers: std::collections::HashSet = sqlx::query_scalar!( - "WITH worker_ids AS (SELECT unnest($1::text[]) as worker) - SELECT worker_ids.worker FROM worker_ids - LEFT JOIN worker_ping ON worker_ids.worker = worker_ping.worker + "WITH worker_ids AS (SELECT unnest($1::text[]) as worker) + SELECT worker_ids.worker FROM worker_ids + LEFT JOIN worker_ping ON worker_ids.worker = worker_ping.worker WHERE worker_ping.worker IS NULL OR worker_ping.ping_at < now() - ('60 seconds')::interval", &worker_ids[..] ) @@ -1804,7 +1804,7 @@ async fn handle_zombie_jobs(db: &Pool, base_internal_url: &str, worker let non_restartable_jobs = if *RESTART_ZOMBIE_JOBS { vec![] } else { - sqlx::query_as::<_, QueuedJob>("SELECT * FROM v2_as_queue WHERE last_ping < now() - ($1 || ' seconds')::interval + sqlx::query_as::<_, QueuedJob>("SELECT * FROM v2_as_queue WHERE last_ping < now() - ($1 || ' seconds')::interval AND running = true AND job_kind NOT IN ('flow', 'flowpreview', 'flownode', 'singlescriptflow') AND same_worker = false") .bind(ZOMBIE_JOB_TIMEOUT.as_str()) .fetch_all(db) @@ -2001,7 +2001,7 @@ async fn handle_zombie_flows(db: &DB) -> error::Result<()> { } ); report_critical_error(reason.clone(), db.clone(), Some(&flow.workspace_id), None).await; - cancel_zombie_flow_job(db, flow.id, &flow.workspace_id, + cancel_zombie_flow_job(db, flow.id, &flow.workspace_id, format!(r#"{reason} This would happen if a worker was interrupted, killed or crashed while doing a state transition at the end of a job which is always an unexpected behavior that should never happen. Please check your worker logs for more details and feel free to report it to the Windmill team on our Discord or support@windmill.dev (response for non EE customers will be best effort) with as much context as possible, ideally: @@ -2018,7 +2018,7 @@ Please check your worker logs for more details and feel free to report it to the r#" DELETE FROM parallel_monitor_lock - WHERE last_ping IS NOT NULL AND last_ping < NOW() - ($1 || ' seconds')::interval + WHERE last_ping IS NOT NULL AND last_ping < NOW() - ($1 || ' seconds')::interval RETURNING parent_flow_id, job_id, last_ping, (SELECT workspace_id FROM v2_job_queue q WHERE q.id = parent_flow_id AND q.running = true AND q.canceled_by IS NULL ) AS workspace_id @@ -2126,7 +2126,7 @@ pub async fn reload_critical_error_channels_setting(conn: &DB) -> error::Result< v } else { tracing::error!( - "Could not parse critical_error_emails setting as an array of channels, found: {:#?}", + "Could not parse critical_error_channels setting as an array of channels, found: {:#?}", &q ); vec![] diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index 0dae5e223a..772430b468 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -9757,7 +9757,7 @@ paths: type: array items: type: string - + /w/{workspace}/gcp_triggers/subscriptions/list/{path}: post: summary: list all subscription of a give topic from google cloud service @@ -14132,7 +14132,7 @@ components: csharp, nu, java - # for related places search: ADD_NEW_LANG + # for related places search: ADD_NEW_LANG ] Preview: @@ -15083,7 +15083,7 @@ components: - delivery_type - subscription_mode - + SubscriptionMode: type: string enum: @@ -15147,7 +15147,7 @@ components: enum: - oidc - credentials - + SqsTrigger: allOf: - $ref: "#/components/schemas/TriggerExtraProperty" @@ -16704,4 +16704,29 @@ components: presigned: type: string required: - - s3 \ No newline at end of file + - s3 + + TeamsChannel: + type: object + required: + - team_id + - team_name + - channel_id + - channel_name + properties: + team_id: + type: string + description: Microsoft Teams team ID + minLength: 1 + team_name: + type: string + description: Microsoft Teams team name + minLength: 1 + channel_id: + type: string + description: Microsoft Teams channel ID + minLength: 1 + channel_name: + type: string + description: Microsoft Teams channel name + minLength: 1 \ No newline at end of file diff --git a/frontend/src/lib/components/InstanceSettings.svelte b/frontend/src/lib/components/InstanceSettings.svelte index 32e48d4f2f..78e28f02bb 100644 --- a/frontend/src/lib/components/InstanceSettings.svelte +++ b/frontend/src/lib/components/InstanceSettings.svelte @@ -2,7 +2,7 @@ import { scimSamlSetting, settings, settingsKeys, type SettingStorage } from './instanceSettings' import { Button, Tab, TabContent, Tabs } from '$lib/components/common' import { SettingService, SettingsService } from '$lib/gen' - import type { TeamInfo } from '$lib/gen/types.gen' + import type { TeamInfo, TeamsChannel } from '$lib/gen/types.gen' import { sendUserToast } from '$lib/toast' import { deepEqual } from 'fast-equals' @@ -132,6 +132,14 @@ setupSnowflakeUrls() } + // Remove empty or invalid teams_channel entries + $values.critical_error_channels = $values.critical_error_channels.filter((entry) => { + if (entry && typeof entry == 'object' && 'teams_channel' in entry) { + return isValidTeamsChannel(entry.teams_channel) + } + return true + }) + let shouldReloadPage = false if ($values) { const allSettings = [...Object.values(settings), scimSamlSetting].flatMap((x) => @@ -214,6 +222,21 @@ await SettingService.sendStats() sendUserToast('Usage sent') } + + function isValidTeamsChannel(value: any): value is TeamsChannel { + return ( + typeof value === 'object' && + value !== null && + typeof value.team_id === 'string' && + value.team_id.trim() !== '' && + typeof value.team_name === 'string' && + value.team_name.trim() !== '' && + typeof value.channel_id === 'string' && + value.channel_id.trim() !== '' && + typeof value.channel_name === 'string' && + value.channel_name.trim() !== '' + ) + }
From 2b5dfcfb251471dcc39b04c54e25008d617cc34f Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Fri, 25 Apr 2025 19:20:21 +0200 Subject: [PATCH 279/739] fix: fix token creation after mcp mode change to make it non workspace specific --- frontend/src/lib/components/TokensTable.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/lib/components/TokensTable.svelte b/frontend/src/lib/components/TokensTable.svelte index 3efbe53e89..a4e73b0470 100644 --- a/frontend/src/lib/components/TokensTable.svelte +++ b/frontend/src/lib/components/TokensTable.svelte @@ -75,7 +75,7 @@ label: newTokenLabel, expiration: date?.toISOString(), scopes: tokenScopes, - workspace_id: newTokenWorkspace || $workspaceStore + workspace_id: mcpMode ? (newTokenWorkspace || $workspaceStore) : undefined } as NewToken }) From 58140cde2fe95b42d70f8cdb87b5b31a0dc502d5 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Fri, 25 Apr 2025 19:25:54 +0200 Subject: [PATCH 280/739] nit fix token --- frontend/src/lib/components/TokensTable.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/lib/components/TokensTable.svelte b/frontend/src/lib/components/TokensTable.svelte index a4e73b0470..08455444b1 100644 --- a/frontend/src/lib/components/TokensTable.svelte +++ b/frontend/src/lib/components/TokensTable.svelte @@ -75,7 +75,7 @@ label: newTokenLabel, expiration: date?.toISOString(), scopes: tokenScopes, - workspace_id: mcpMode ? (newTokenWorkspace || $workspaceStore) : undefined + workspace_id: mcpMode ? (newTokenWorkspace || $workspaceStore) : newTokenWorkspace } as NewToken }) From 6e833cbf2f71a25f941c66d1e04866495b1cb7cc Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Fri, 25 Apr 2025 19:30:29 +0200 Subject: [PATCH 281/739] nit fix token --- frontend/src/lib/components/TokensTable.svelte | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/frontend/src/lib/components/TokensTable.svelte b/frontend/src/lib/components/TokensTable.svelte index 08455444b1..6f7fe73a83 100644 --- a/frontend/src/lib/components/TokensTable.svelte +++ b/frontend/src/lib/components/TokensTable.svelte @@ -181,6 +181,10 @@ newTokenLabel = 'MCP token' newTokenExpiration = undefined newTokenWorkspace = $workspaceStore + } else { + newTokenLabel = undefined + newTokenExpiration = undefined + newTokenWorkspace = undefined } }} checked={mcpCreationMode} From ac129d9b65fd99d990549b7065c89e177a7abf7a Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Fri, 25 Apr 2025 19:32:05 +0200 Subject: [PATCH 282/739] nit fix token --- frontend/src/lib/components/TokensTable.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/lib/components/TokensTable.svelte b/frontend/src/lib/components/TokensTable.svelte index 6f7fe73a83..720f1d481f 100644 --- a/frontend/src/lib/components/TokensTable.svelte +++ b/frontend/src/lib/components/TokensTable.svelte @@ -184,7 +184,7 @@ } else { newTokenLabel = undefined newTokenExpiration = undefined - newTokenWorkspace = undefined + newTokenWorkspace = defaultNewTokenWorkspace } }} checked={mcpCreationMode} From 8435eb3adff8429a73db88b12204f7cf8f14d3d2 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Fri, 25 Apr 2025 20:04:21 +0200 Subject: [PATCH 283/739] fix: improve full-scaleout of autoscaling event logging --- backend/ee-repo-ref.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/ee-repo-ref.txt b/backend/ee-repo-ref.txt index cd49b42813..36a5d30796 100644 --- a/backend/ee-repo-ref.txt +++ b/backend/ee-repo-ref.txt @@ -1 +1 @@ -b9ca3ccdd188683c81832fd3ed41c8dd632a0c9c \ No newline at end of file +4a18fa9f4994766085c44637b9aed614b07d22b4 \ No newline at end of file From 7264618ad89fbc0f594138fdd04312a3b8185abc Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Sat, 26 Apr 2025 00:56:01 +0200 Subject: [PATCH 284/739] improve flow script editor responsivity --- .../flows/content/FlowModuleComponent.svelte | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/frontend/src/lib/components/flows/content/FlowModuleComponent.svelte b/frontend/src/lib/components/flows/content/FlowModuleComponent.svelte index 139223cb1c..67bbb76197 100644 --- a/frontend/src/lib/components/flows/content/FlowModuleComponent.svelte +++ b/frontend/src/lib/components/flows/content/FlowModuleComponent.svelte @@ -102,6 +102,7 @@ $: lastDeployedCode = onModulesChange(savedModule, flowModule) function onModulesChange(savedModule: FlowModule | undefined, flowModule: FlowModule) { + // console.log('onModulesChange', savedModule, flowModule) return savedModule?.value?.type === 'rawscript' && flowModule.value.type === 'rawscript' && savedModule.value.content !== flowModule.value.content @@ -167,12 +168,16 @@ flowModule.value.type == 'script' || flowModule.value.type == 'flow' ) { - flowModule.value.input_transforms = input_transforms + if (!deepEqual(flowModule.value.input_transforms, input_transforms)) { + flowModule.value.input_transforms = input_transforms + } } } if (flowModule.value.type == 'rawscript' && flowModule.value.lock != undefined) { - flowModule.value.lock = undefined + if (flowModule.value.lock != undefined) { + flowModule.value.lock = undefined + } } await tick() if (!deepEqual(schema, $flowStateStore[flowModule.id]?.schema)) { @@ -369,7 +374,7 @@ bind:websocketAlive bind:this={editor} class="h-full relative" - bind:code={flowModule.value.content} + code={flowModule.value.content} lang={scriptLangToEditorLang(flowModule.value.language)} scriptLang={flowModule.value.language} automaticLayout={true} @@ -384,10 +389,13 @@ } }} on:change={async (event) => { + const content = event.detail if (flowModule.value.type === 'rawscript') { - flowModule.value.content = event.detail + if (flowModule.value.content !== content) { + flowModule.value.content = content + } + // await reload(flowModule) } - await reload(flowModule) }} formatAction={() => { reload(flowModule) From 42edbfac663a431c9830d427e9b55b5e2882a203 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Sat, 26 Apr 2025 07:56:05 +0200 Subject: [PATCH 285/739] nit reactiveness --- .../src/lib/components/flows/content/FlowModuleComponent.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/lib/components/flows/content/FlowModuleComponent.svelte b/frontend/src/lib/components/flows/content/FlowModuleComponent.svelte index 67bbb76197..69502ec1e4 100644 --- a/frontend/src/lib/components/flows/content/FlowModuleComponent.svelte +++ b/frontend/src/lib/components/flows/content/FlowModuleComponent.svelte @@ -394,7 +394,7 @@ if (flowModule.value.content !== content) { flowModule.value.content = content } - // await reload(flowModule) + await reload(flowModule) } }} formatAction={() => { From 4bb9d64d4fe482f41c83a6ec4256f0c3173b3064 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Sat, 26 Apr 2025 20:42:20 +0200 Subject: [PATCH 286/739] improve flow script editor performances --- frontend/src/lib/assets/app.css | 32 +++++++-- .../components/FlowBuilderTutorials.svelte | 14 ---- .../components/FlowHistoryJobPicker.svelte | 5 +- .../lib/components/FlowPreviewContent.svelte | 38 +++++++++-- .../lib/components/FlowStatusViewer.svelte | 4 +- .../components/FlowStatusViewerInner.svelte | 11 +-- .../src/lib/components/WorkerTagSelect.svelte | 55 +++++++++++++-- .../apps/editor/AppEditorTutorial.svelte | 14 ---- .../DecisionTreeGraphNode.svelte | 2 +- .../apps/svelte-select/lib/Select.svelte | 67 +------------------ .../components/flows/common/FlowCard.svelte | 8 +-- .../flows/common/FlowCardHeader.svelte | 51 +++++++------- .../flows/content/FlowModuleComponent.svelte | 18 ++++- .../flows/content/FlowModuleHeader.svelte | 18 +++-- .../content/FlowModuleWorkerTagSelect.svelte | 13 ++-- .../flows/header/FlowPreviewButtons.svelte | 15 +++++ .../flows/map/FlowModuleSchemaItem.svelte | 6 +- .../map/FlowModuleSchemaItemViewer.svelte | 2 +- .../flows/map/InsertModuleButton.svelte | 10 +-- .../flows/propPicker/FlowPropPicker.svelte | 2 +- .../flows/propPicker/OutputPicker.svelte | 1 - .../renderers/nodes/BranchAllStart.svelte | 2 +- .../renderers/nodes/BranchOneStart.svelte | 2 +- .../graph/renderers/nodes/ModuleNode.svelte | 2 +- .../graph/renderers/nodes/SubflowBound.svelte | 2 +- .../graph/renderers/nodes/TriggersNode.svelte | 2 +- .../components/meltComponents/Popover.svelte | 5 +- .../meltComponents/SideBarTab.svelte | 2 +- .../lib/components/tutorials/Tutorial.svelte | 14 ++-- .../components/tutorials/TutorialInner.svelte | 3 + frontend/src/lib/editorUtils.ts | 2 +- frontend/src/lib/utils.ts | 7 ++ 32 files changed, 236 insertions(+), 193 deletions(-) create mode 100644 frontend/src/lib/components/tutorials/TutorialInner.svelte diff --git a/frontend/src/lib/assets/app.css b/frontend/src/lib/assets/app.css index 6a386c559d..2787103d5b 100644 --- a/frontend/src/lib/assets/app.css +++ b/frontend/src/lib/assets/app.css @@ -4,10 +4,21 @@ @tailwind utilities; @layer base { - *, - ::before, - ::after { - @apply dark:border-gray-600; + + /* Light mode: default border color */ + .border, .border-t, .border-r, .border-b, .border-l, + .border-x, .border-y, + .divide-x > :not([hidden]) ~ :not([hidden]), + .divide-y > :not([hidden]) ~ :not([hidden]) { + border-color: #e5e7eb; /* gray-200 */ + } + + /* Dark mode: change border color */ + .dark .border, .dark .border-t, .dark .border-r, .dark .border-b, .dark .border-l, + .dark .border-x, .dark .border-y, + .dark .divide-x > :not([hidden]) ~ :not([hidden]), + .dark .divide-y > :not([hidden]) ~ :not([hidden]) { + border-color: #4b5563; /* gray-700 */ } /* Chrome, Edge, and Safari */ @@ -82,6 +93,18 @@ } } +.driver-popover-title { + @apply leading-6 !text-primary !text-base; +} + +.driver-popover-description { + @apply !text-secondary !text-sm; +} + +.driver-popover { + @apply p-6 !bg-surface !max-w-2xl; +} + .splitpanes--vertical > .splitpanes__pane { transition: none !important; } @@ -165,3 +188,4 @@ svelte-virtual-list-contents > * + * { rgba(0, 0, 192, 0.6) 20px ); } + diff --git a/frontend/src/lib/components/FlowBuilderTutorials.svelte b/frontend/src/lib/components/FlowBuilderTutorials.svelte index 3f483a4ff9..f482081157 100644 --- a/frontend/src/lib/components/FlowBuilderTutorials.svelte +++ b/frontend/src/lib/components/FlowBuilderTutorials.svelte @@ -81,17 +81,3 @@ You need to create a new flow before starting the tutorial.
- - diff --git a/frontend/src/lib/components/FlowHistoryJobPicker.svelte b/frontend/src/lib/components/FlowHistoryJobPicker.svelte index 5a9a661a74..293a4af24c 100644 --- a/frontend/src/lib/components/FlowHistoryJobPicker.svelte +++ b/frontend/src/lib/components/FlowHistoryJobPicker.svelte @@ -8,6 +8,7 @@ export let path: string export let selected: string | undefined = undefined + export let selectInitial: boolean = false const dispatch = createEventDispatcher() async function loadInitial() { @@ -19,7 +20,9 @@ perPage: 1 }) if (jobs.length > 0) { - dispatch('select', { jobId: jobs[0].id, initial: true }) + if (selectInitial) { + dispatch('select', { jobId: jobs[0].id, initial: true }) + } } else { dispatch('nohistory') } diff --git a/frontend/src/lib/components/FlowPreviewContent.svelte b/frontend/src/lib/components/FlowPreviewContent.svelte index 448e6e89b4..5829d4c8a3 100644 --- a/frontend/src/lib/components/FlowPreviewContent.svelte +++ b/frontend/src/lib/components/FlowPreviewContent.svelte @@ -26,12 +26,18 @@ export let jobId: string | undefined = undefined export let job: Job | undefined = undefined - let selectedJobStep: string | undefined = undefined - let branchOrIterationN: number = 0 - let restartBranchNames: [number, string][] = [] + export let initial: boolean = false - let selectedJobStepIsTopLevel: boolean | undefined = undefined - let selectedJobStepType: 'single' | 'forloop' | 'branchall' = 'single' + export let selectedJobStep: string | undefined = undefined + export let selectedJobStepIsTopLevel: boolean | undefined = undefined + export let selectedJobStepType: 'single' | 'forloop' | 'branchall' = 'single' + export let rightColumnSelect: 'timeline' | 'node_status' | 'node_definition' | 'user_states' = + 'timeline' + + export let branchOrIterationN: number = 0 + export let scrollTop: number = 0 + + let restartBranchNames: [number, string][] = [] let isRunning: boolean = false let jobProgressReset: () => void @@ -59,7 +65,6 @@ const dispatch = createEventDispatcher() let renderCount: number = 0 - let initial: boolean = false let schemaFormWithArgPicker: SchemaFormWithArgPicker | undefined = undefined let currentJobId: string | undefined = undefined @@ -210,6 +215,19 @@ } }) } + + let scrollableDiv: HTMLDivElement | undefined = undefined + function handleScroll() { + scrollTop = scrollableDiv?.scrollTop ?? 0 + } + + $: scrollableDiv && onScrollableDivChange() + + function onScrollableDivChange() { + if (scrollTop != 0 && scrollableDiv) { + scrollableDiv.scrollTop = scrollTop + } + } @@ -375,7 +393,11 @@
-
+
handleScroll()} + >
{ loadIndividualStepsStates() }} @@ -499,6 +522,7 @@ } }} bind:selectedJobStep + bind:rightColumnSelect /> {:else}
Flow status will be displayed here
diff --git a/frontend/src/lib/components/FlowStatusViewer.svelte b/frontend/src/lib/components/FlowStatusViewer.svelte index b6eb933af7..9584ddb926 100644 --- a/frontend/src/lib/components/FlowStatusViewer.svelte +++ b/frontend/src/lib/components/FlowStatusViewer.svelte @@ -19,7 +19,8 @@ export let hideNodeDefinition = false export let hideJobId = false export let hideDownloadLogs = false - + export let rightColumnSelect: 'timeline' | 'node_status' | 'node_definition' | 'user_states' = + 'timeline' export let isOwner = false export let wideResults = false @@ -77,4 +78,5 @@ {workspaceId} {isOwner} {wideResults} + bind:rightColumnSelect /> diff --git a/frontend/src/lib/components/FlowStatusViewerInner.svelte b/frontend/src/lib/components/FlowStatusViewerInner.svelte index 4e64417e5a..291c1fc2e2 100644 --- a/frontend/src/lib/components/FlowStatusViewerInner.svelte +++ b/frontend/src/lib/components/FlowStatusViewerInner.svelte @@ -13,7 +13,7 @@ import FlowPreviewStatus from './preview/FlowPreviewStatus.svelte' import { createEventDispatcher, getContext, tick } from 'svelte' import { onDestroy } from 'svelte' - import { Badge, Button, Tab } from './common' + import { Badge, Button, Skeleton, Tab } from './common' import DisplayResult from './DisplayResult.svelte' import Tabs from './common/tabs/Tabs.svelte' import { type DurationStatus, type FlowStatusViewerContext, type GraphModuleState } from './graph' @@ -81,6 +81,8 @@ export let isForloopSelected = false export let parentRecursiveRefresh: Record Promise> = {} export let job: Job | undefined = undefined + export let rightColumnSelect: 'timeline' | 'node_status' | 'node_definition' | 'user_states' = + 'timeline' let recursiveRefresh: Record Promise> = {} @@ -96,6 +98,8 @@ $: flowJobIds?.moduleId && onFlowModuleId() + let selectedId: Writable = writable(selectedNode) + function onFlowModuleId() { if (globalRefreshes) { let modId = flowJobIds?.moduleId @@ -793,8 +797,6 @@ let flowTimeline: FlowTimeline - let rightColumnSelect: 'timeline' | 'node_status' | 'node_definition' | 'user_states' = 'timeline' - function loadPreviousIters(lenToAdd: number) { let r = $localDurationStatuses[flowJobIds?.moduleId ?? ''] if (r.iteration_from) { @@ -1244,6 +1246,7 @@
+ {/if} diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/DecisionTreeGraphNode.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/DecisionTreeGraphNode.svelte index a72d54356b..f066647fa0 100644 --- a/frontend/src/lib/components/apps/editor/settingsPanel/DecisionTreeGraphNode.svelte +++ b/frontend/src/lib/components/apps/editor/settingsPanel/DecisionTreeGraphNode.svelte @@ -70,7 +70,7 @@ {#if !loading} - + Date: Sat, 26 Apr 2025 21:01:12 +0200 Subject: [PATCH 289/739] improve flow history picker --- frontend/src/lib/components/HistoricInputs.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/lib/components/HistoricInputs.svelte b/frontend/src/lib/components/HistoricInputs.svelte index d52a56d56d..1acd9a9e28 100644 --- a/frontend/src/lib/components/HistoricInputs.svelte +++ b/frontend/src/lib/components/HistoricInputs.svelte @@ -39,7 +39,7 @@ } onDestroy(() => { - resetSelected(true) + resetSelected(false) }) function handleKeydown(event: KeyboardEvent) { From 02ab233a85bce33d8365df135cddd3c908915d75 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Sat, 26 Apr 2025 22:03:44 +0200 Subject: [PATCH 290/739] persist flow state better between drawer close/open --- frontend/src/lib/components/FlowPreviewContent.svelte | 8 ++++++++ frontend/src/lib/components/FlowStatusViewer.svelte | 10 ++++++++-- .../src/lib/components/FlowStatusViewerInner.svelte | 5 +++-- .../components/flows/header/FlowPreviewButtons.svelte | 7 +++++++ 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/frontend/src/lib/components/FlowPreviewContent.svelte b/frontend/src/lib/components/FlowPreviewContent.svelte index 5829d4c8a3..73ac4ddced 100644 --- a/frontend/src/lib/components/FlowPreviewContent.svelte +++ b/frontend/src/lib/components/FlowPreviewContent.svelte @@ -19,6 +19,8 @@ import JsonInputs from './JsonInputs.svelte' import FlowHistoryJobPicker from './FlowHistoryJobPicker.svelte' import { NEVER_TESTED_THIS_FAR } from './flows/models' + import { writable, type Writable } from 'svelte/store' + import type { DurationStatus, GraphModuleState } from './graph' export let previewMode: 'upTo' | 'whole' export let open: boolean @@ -37,6 +39,9 @@ export let branchOrIterationN: number = 0 export let scrollTop: number = 0 + export let localModuleStates: Writable> = writable({}) + export let localDurationStatuses: Writable> = writable({}) + let restartBranchNames: [number, string][] = [] let isRunning: boolean = false @@ -507,6 +512,9 @@
{/if} > = writable({}) + export let localDurationStatuses: Writable> = writable({}) + export let job: Job | undefined = undefined let lastJobId: string = jobId @@ -68,11 +71,14 @@ } dispatch('jobsLoaded', job) }} - globalDurationStatuses={[]} globalModuleStates={[]} + globalDurationStatuses={[]} + bind:localModuleStates + bind:localDurationStatuses bind:selectedNode={selectedJobStep} on:start on:done + bind:job {initialJob} {jobId} {workspaceId} diff --git a/frontend/src/lib/components/FlowStatusViewerInner.svelte b/frontend/src/lib/components/FlowStatusViewerInner.svelte index 291c1fc2e2..d25bf607da 100644 --- a/frontend/src/lib/components/FlowStatusViewerInner.svelte +++ b/frontend/src/lib/components/FlowStatusViewerInner.svelte @@ -84,6 +84,8 @@ export let rightColumnSelect: 'timeline' | 'node_status' | 'node_definition' | 'user_states' = 'timeline' + export let localModuleStates: Writable> = writable({}) + export let localDurationStatuses: Writable> = writable({}) let recursiveRefresh: Record Promise> = {} let jobResults: any[] = @@ -92,8 +94,6 @@ let retry_selected = '' let timeout: NodeJS.Timeout | undefined = undefined - let localModuleStates: Writable> = writable({}) - let localDurationStatuses: Writable> = writable({}) let expandedSubflows: Record = {} $: flowJobIds?.moduleId && onFlowModuleId() @@ -495,6 +495,7 @@ async function updateJobId() { if (jobId !== job?.id) { + console.log('updating job id', globalDurationStatuses.length) $localModuleStates = {} flowTimeline?.reset() timeout && clearTimeout(timeout) diff --git a/frontend/src/lib/components/flows/header/FlowPreviewButtons.svelte b/frontend/src/lib/components/flows/header/FlowPreviewButtons.svelte index 643e81dbde..f053c6cb62 100644 --- a/frontend/src/lib/components/flows/header/FlowPreviewButtons.svelte +++ b/frontend/src/lib/components/flows/header/FlowPreviewButtons.svelte @@ -10,6 +10,8 @@ import { getContext } from 'svelte' import type { FlowEditorContext } from '../types' import { Play } from 'lucide-svelte' + import { writable, type Writable } from 'svelte/store' + import type { DurationStatus, GraphModuleState } from '$lib/components/graph' export let loading = false @@ -41,6 +43,9 @@ let rightColumnSelect: 'timeline' | 'node_status' | 'node_definition' | 'user_states' = 'timeline' + let localModuleStates: Writable> = writable({}) + let localDurationStatuses: Writable> = writable({}) + $: upToDisabled = $selectedId == undefined || [ @@ -106,6 +111,8 @@ Date: Sat, 26 Apr 2025 22:15:13 +0200 Subject: [PATCH 291/739] nit flow bind --- frontend/src/lib/components/FlowPreviewContent.svelte | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/frontend/src/lib/components/FlowPreviewContent.svelte b/frontend/src/lib/components/FlowPreviewContent.svelte index 73ac4ddced..23efc93695 100644 --- a/frontend/src/lib/components/FlowPreviewContent.svelte +++ b/frontend/src/lib/components/FlowPreviewContent.svelte @@ -522,8 +522,7 @@ on:done={() => { $executionCount = $executionCount + 1 }} - on:jobsLoaded={({ detail }) => { - job = detail + on:jobsLoaded={() => { if (initial) { console.log('loading initial steps after initial job loaded') loadIndividualStepsStates() From a7b2b51444d757964560de3a89024b1c9b0fefe9 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Sun, 27 Apr 2025 00:37:25 +0200 Subject: [PATCH 292/739] fix: improve skip failure on parallel branchall --- backend/windmill-worker/src/worker_flow.rs | 103 ++++++++++++--------- 1 file changed, 59 insertions(+), 44 deletions(-) diff --git a/backend/windmill-worker/src/worker_flow.rs b/backend/windmill-worker/src/worker_flow.rs index 63cf414c53..8ed62b515b 100644 --- a/backend/windmill-worker/src/worker_flow.rs +++ b/backend/windmill-worker/src/worker_flow.rs @@ -389,20 +389,15 @@ pub async fn update_flow_status_after_job_completion_internal( (false, false, false) }; - let skip_branch_failure = match module_status { + let skip_seq_branch_failure = match module_status { FlowStatusModule::InProgress { branchall: Some(BranchAllStatus { branch, .. }), - parallel, + parallel: false, .. - } => compute_skip_branchall_failure( - job_id_for_status, - *branch, - *parallel, - db, - current_module, - ) - .await? - .unwrap_or(false), + } => { + compute_skip_branchall_failure(branch.to_owned(), false, current_module, &None) + .await? + } _ => false, }; @@ -696,7 +691,7 @@ pub async fn update_flow_status_after_job_completion_internal( flow_jobs_success, flow_jobs, .. - } if branch.to_owned() < len - 1 && (success || skip_branch_failure) => { + } if branch.to_owned() < len - 1 && (success || skip_seq_branch_failure) => { if let Some(jobs) = flow_jobs { set_success_in_flow_job_success( flow_jobs_success, @@ -736,7 +731,9 @@ pub async fn update_flow_status_after_job_completion_internal( } } } - if success || (flow_jobs.is_some() && (skip_loop_failures || skip_branch_failure)) { + if success + || (flow_jobs.is_some() && (skip_loop_failures || skip_seq_branch_failure)) + { let is_skipped = if current_module.as_ref().is_some_and(|m| m.skip_if.is_some()) { sqlx::query_scalar!( @@ -793,6 +790,17 @@ pub async fn update_flow_status_after_job_completion_internal( } }; + let skip_parallel_branchall_failure = match (module_status, new_status.as_ref()) { + ( + FlowStatusModule::InProgress { branchall: Some(_), parallel: true, .. }, + Some(FlowStatusModule::Success { flow_jobs_success, .. }), + ) => compute_skip_branchall_failure(0, true, current_module, flow_jobs_success).await?, + ( + FlowStatusModule::InProgress { branchall: Some(_), parallel: true, .. }, + Some(FlowStatusModule::Failure { flow_jobs_success, .. }), + ) => compute_skip_branchall_failure(0, true, current_module, flow_jobs_success).await?, + _ => false, + }; let step_counter = if inc_step_counter { sqlx::query!( "UPDATE v2_job_status @@ -985,7 +993,12 @@ pub async fn update_flow_status_after_job_completion_internal( _ if flow_job.is_canceled() => false, true => !is_last_step, false if unrecoverable => false, - false if skip_branch_failure || skip_loop_failures || continue_on_error => { + false + if skip_seq_branch_failure + || skip_parallel_branchall_failure + || skip_loop_failures + || continue_on_error => + { !is_last_step } false @@ -1280,41 +1293,43 @@ async fn retrieve_flow_jobs_results( } async fn compute_skip_branchall_failure<'c>( - job: &Uuid, branch: usize, parallel: bool, - db: &DB, flow_module: Option<&FlowModule>, -) -> Result, Error> { - let branch = if parallel { - sqlx::query_scalar!("SELECT runnable_path FROM v2_job WHERE id = $1", job) - .fetch_one(db) - .await - .map_err(|e| { - Error::internal_err(format!("error during retrieval of branchall index: {e:#}")) - })? - .map(|p| { - BRANCHALL_INDEX_RE - .captures(&p) - .map(|x| x.get(1).unwrap().as_str().parse::().ok()) - .flatten() - .ok_or(Error::internal_err(format!( - "could not parse branchall index from path: {p}" - ))) - }) - .ok_or_else(|| { - Error::internal_err(format!("no branchall script path found for job {job}")) - })?? - } else { - branch as i32 - }; - Ok(flow_module + successes: &Option>>, +) -> windmill_common::error::Result { + let branches = flow_module .and_then(|x| x.get_branches_skip_failures().ok()) - .and_then(|x| { + .map(|x| { x.branches - .get(branch as usize) - .map(|x| x.skip_failure.unwrap_or(false)) - })) + .iter() + .map(|b| b.skip_failure.unwrap_or(false)) + .collect::>() + }); + if parallel { + if let Some(successes) = successes { + for (i, success) in successes.iter().enumerate() { + if branches + .as_ref() + .and_then(|x| x.get(i)) + .unwrap_or(&false) + .to_owned() + { + continue; + } + if !(success.unwrap_or(false)) { + return Ok(false); + } + } + Ok(true) + } else { + Ok(false) + } + } else { + Ok(branches + .and_then(|x| x.get(branch as usize).map(|b| b.to_owned())) + .unwrap_or(false)) + } } // async fn retrieve_cleanup_module<'c>(flow_uuid: Uuid, db: &DB) -> Result { From 03553f7f495e561d7f160b29cff501ec6158ba47 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Sun, 27 Apr 2025 00:48:47 +0200 Subject: [PATCH 293/739] chore(main): release 1.484.0 (#5656) * chore(main): release 1.484.0 * Apply automatic changes --------- Co-authored-by: rubenfiszel <275584+rubenfiszel@users.noreply.github.com> --- CHANGELOG.md | 18 + backend/Cargo.lock | 471 +++++++++--------- backend/Cargo.toml | 4 +- backend/windmill-api/openapi.yaml | 2 +- benchmarks/lib.ts | 2 +- cli/main.ts | 2 +- frontend/package-lock.json | 4 +- frontend/package.json | 2 +- lsp/Pipfile | 4 +- openflow.openapi.yaml | 2 +- .../WindmillClient/WindmillClient.psd1 | 2 +- python-client/wmill/pyproject.toml | 2 +- python-client/wmill_pg/pyproject.toml | 2 +- typescript-client/jsr.json | 2 +- typescript-client/package.json | 2 +- version.txt | 2 +- 16 files changed, 280 insertions(+), 243 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 12c7a5399f..3bd149934c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,23 @@ # Changelog +## [1.484.0](https://github.com/windmill-labs/windmill/compare/v1.483.2...v1.484.0) (2025-04-26) + + +### Features + +* Add MCP endpoints ([#5639](https://github.com/windmill-labs/windmill/issues/5639)) ([a34ac4f](https://github.com/windmill-labs/windmill/commit/a34ac4fa24c2a5482e45724e76316d57f64f7040)) +* Add MCP only mode ([#5661](https://github.com/windmill-labs/windmill/issues/5661)) ([1625524](https://github.com/windmill-labs/windmill/commit/162552431138d68002c7060cad4ae31f1ec4c69c)) +* Ansible improvements (vault, roles and git repos) ([#5655](https://github.com/windmill-labs/windmill/issues/5655)) ([fdd1642](https://github.com/windmill-labs/windmill/commit/fdd1642ce10866da1d8d373bda44f050e2e0f403)) + + +### Bug Fixes + +* check for valid teams_channel config when saving critical alerts settings ([#5660](https://github.com/windmill-labs/windmill/issues/5660)) ([dc5c8d8](https://github.com/windmill-labs/windmill/commit/dc5c8d8c5f8577b7ded3da1d684cdb735fa7a936)) +* Fix CI for MCP + optimization ([#5657](https://github.com/windmill-labs/windmill/issues/5657)) ([b199a77](https://github.com/windmill-labs/windmill/commit/b199a77d486c5bfd086ca73a58a14bb747e386b5)) +* fix token creation after mcp mode change to make it non workspace specific ([2b5dfcf](https://github.com/windmill-labs/windmill/commit/2b5dfcfb251471dcc39b04c54e25008d617cc34f)) +* improve full-scaleout of autoscaling event logging ([8435eb3](https://github.com/windmill-labs/windmill/commit/8435eb3adff8429a73db88b12204f7cf8f14d3d2)) +* improve skip failure on parallel branchall ([a7b2b51](https://github.com/windmill-labs/windmill/commit/a7b2b51444d757964560de3a89024b1c9b0fefe9)) + ## [1.483.2](https://github.com/windmill-labs/windmill/compare/v1.483.1...v1.483.2) (2025-04-23) diff --git a/backend/Cargo.lock b/backend/Cargo.lock index 4f3ca231e6..f1935fc044 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -551,7 +551,7 @@ dependencies = [ "proc-macro2", "quote", "swc_macros_common", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -653,7 +653,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -675,7 +675,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -686,7 +686,7 @@ checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -741,9 +741,9 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "aws-config" -version = "1.6.1" +version = "1.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c39646d1a6b51240a1a23bb57ea4eebede7e16fbc237fdc876980233dcecb4f" +checksum = "b6fcc63c9860579e4cb396239570e979376e70aab79e496621748a09913f8b36" dependencies = [ "aws-credential-types", "aws-runtime", @@ -771,9 +771,9 @@ dependencies = [ [[package]] name = "aws-credential-types" -version = "1.2.2" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4471bef4c22a06d2c7a1b6492493d3fdf24a805323109d6874f9c94d5906ac14" +checksum = "687bc16bc431a8533fe0097c7f0182874767f920989d7260950172ae8e3c4465" dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", @@ -806,9 +806,9 @@ dependencies = [ [[package]] name = "aws-runtime" -version = "1.5.6" +version = "1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0aff45ffe35196e593ea3b9dd65b320e51e2dda95aff4390bc459e461d09c6ad" +checksum = "6c4063282c69991e57faab9e5cb21ae557e59f5b0fb285c196335243df8dc25c" dependencies = [ "aws-credential-types", "aws-sigv4", @@ -822,7 +822,6 @@ dependencies = [ "fastrand", "http 0.2.12", "http-body 0.4.6", - "once_cell", "percent-encoding", "pin-project-lite", "tracing", @@ -831,9 +830,9 @@ dependencies = [ [[package]] name = "aws-sdk-sqs" -version = "1.64.0" +version = "1.65.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514d007ac4d5b156b408d8dd623a57b37ae77425810e0fedcffab57b0dabaded" +checksum = "f6c5fb5d108c518c3bfc077d39a3cd5120e0115ac60aba8085dc79e2d08ab6b1" dependencies = [ "aws-credential-types", "aws-runtime", @@ -854,9 +853,9 @@ dependencies = [ [[package]] name = "aws-sdk-sso" -version = "1.64.0" +version = "1.65.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02d4bdb0e5f80f0689e61c77ab678b2b9304af329616af38aef5b6b967b8e736" +checksum = "8efec445fb78df585327094fcef4cad895b154b58711e504db7a93c41aa27151" dependencies = [ "aws-credential-types", "aws-runtime", @@ -877,9 +876,9 @@ dependencies = [ [[package]] name = "aws-sdk-ssooidc" -version = "1.65.0" +version = "1.66.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbbb3ce8da257aedbccdcb1aadafbbb6a5fe9adf445db0e1ea897bdc7e22d08" +checksum = "5e49cca619c10e7b002dc8e66928ceed66ab7f56c1a3be86c5437bf2d8d89bba" dependencies = [ "aws-credential-types", "aws-runtime", @@ -900,9 +899,9 @@ dependencies = [ [[package]] name = "aws-sdk-sts" -version = "1.65.0" +version = "1.66.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96a78a8f50a1630db757b60f679c8226a8a70ee2ab5f5e6e51dc67f6c61c7cfd" +checksum = "7420479eac0a53f776cc8f0d493841ffe58ad9d9783f3947be7265784471b47a" dependencies = [ "aws-credential-types", "aws-runtime", @@ -924,9 +923,9 @@ dependencies = [ [[package]] name = "aws-sigv4" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69d03c3c05ff80d54ff860fe38c726f6f494c639ae975203a101335f223386db" +checksum = "3503af839bd8751d0bdc5a46b9cac93a003a353e635b0c12cf2376b5b53e41ea" dependencies = [ "aws-credential-types", "aws-smithy-http", @@ -938,7 +937,6 @@ dependencies = [ "hmac", "http 0.2.12", "http 1.3.1", - "once_cell", "percent-encoding", "sha2 0.10.8", "time", @@ -958,9 +956,9 @@ dependencies = [ [[package]] name = "aws-smithy-http" -version = "0.62.0" +version = "0.62.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5949124d11e538ca21142d1fba61ab0a2a2c1bc3ed323cdb3e4b878bfb83166" +checksum = "99335bec6cdc50a346fda1437f9fefe33abf8c99060739a546a16457f2862ca9" dependencies = [ "aws-smithy-runtime-api", "aws-smithy-types", @@ -970,7 +968,6 @@ dependencies = [ "http 0.2.12", "http 1.3.1", "http-body 0.4.6", - "once_cell", "percent-encoding", "pin-project-lite", "pin-utils", @@ -1016,12 +1013,11 @@ dependencies = [ [[package]] name = "aws-smithy-observability" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445d065e76bc1ef54963db400319f1dd3ebb3e0a74af20f7f7630625b0cc7cc0" +checksum = "9364d5989ac4dd918e5cc4c4bdcc61c9be17dcd2586ea7f69e348fc7c6cab393" dependencies = [ "aws-smithy-runtime-api", - "once_cell", ] [[package]] @@ -1036,9 +1032,9 @@ dependencies = [ [[package]] name = "aws-smithy-runtime" -version = "1.8.1" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0152749e17ce4d1b47c7747bdfec09dac1ccafdcbc741ebf9daa2a373356730f" +checksum = "14302f06d1d5b7d333fd819943075b13d27c7700b414f574c3c35859bfb55d5e" dependencies = [ "aws-smithy-async", "aws-smithy-http", @@ -1052,7 +1048,6 @@ dependencies = [ "http 1.3.1", "http-body 0.4.6", "http-body 1.0.1", - "once_cell", "pin-project-lite", "pin-utils", "tokio", @@ -1061,9 +1056,9 @@ dependencies = [ [[package]] name = "aws-smithy-runtime-api" -version = "1.7.4" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3da37cf5d57011cb1753456518ec76e31691f1f474b73934a284eb2a1c76510f" +checksum = "a1e5d9e3a80a18afa109391fb5ad09c3daf887b516c6fd805a157c6ea7994a57" dependencies = [ "aws-smithy-async", "aws-smithy-types", @@ -1078,9 +1073,9 @@ dependencies = [ [[package]] name = "aws-smithy-types" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836155caafba616c0ff9b07944324785de2ab016141c3550bd1c07882f8cee8f" +checksum = "40076bd09fadbc12d5e026ae080d0930defa606856186e31d83ccc6a255eeaf3" dependencies = [ "base64-simd 0.8.0", "bytes", @@ -1113,9 +1108,9 @@ dependencies = [ [[package]] name = "aws-types" -version = "1.3.6" +version = "1.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3873f8deed8927ce8d04487630dc9ff73193bab64742a61d050e57a68dec4125" +checksum = "8a322fec39e4df22777ed3ad8ea868ac2f94cd15e1a55f6ee8d8d6305057689a" dependencies = [ "aws-credential-types", "aws-smithy-async", @@ -1318,7 +1313,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.100", + "syn 2.0.101", "which 4.4.2", ] @@ -1339,7 +1334,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -1544,7 +1539,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -1554,7 +1549,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17d4f95e880cfd28c4ca5a006cf7f6af52b4bcb7b5866f573b2faa126fb7affb" dependencies = [ "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -1667,7 +1662,7 @@ checksum = "7ecc273b49b3205b83d648f0690daa588925572cc5063745bfe547fe7ec8e1a1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -1819,7 +1814,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b4a6cae9efc04cc6cbb8faf338d2c497c165c83e74509cf4dbedea948bbf6e5" dependencies = [ "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -1833,9 +1828,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.19" +version = "1.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e3a13707ac958681c13b39b458c073d0d9bc8a22cb1b2f4c8e55eb72c13f362" +checksum = "04da6a0d40b948dfc4fa8f5bbf402b0fc1a64a28dbf7d12ffd683550f2c1b63a" dependencies = [ "jobserver", "libc", @@ -2004,7 +1999,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -2059,7 +2054,7 @@ dependencies = [ "nom 7.1.3", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -2306,19 +2301,6 @@ dependencies = [ "chrono", ] -[[package]] -name = "crossbeam" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8" -dependencies = [ - "crossbeam-channel", - "crossbeam-deque", - "crossbeam-epoch", - "crossbeam-queue", - "crossbeam-utils", -] - [[package]] name = "crossbeam-channel" version = "0.5.15" @@ -2454,7 +2436,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -2537,7 +2519,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -2570,7 +2552,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core 0.20.11", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -3191,7 +3173,7 @@ checksum = "babccedee31ce7e57c3e6dff2cb3ab8d68c49d0df8222fe0d11d628e65192790" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -3582,7 +3564,7 @@ dependencies = [ "stringcase", "strum 0.25.0", "strum_macros 0.25.3", - "syn 2.0.100", + "syn 2.0.101", "thiserror 2.0.12", ] @@ -4084,7 +4066,7 @@ checksum = "8034092389675178f570469e6c3b0465d3d30b4505c294a6550db47f3c17ad18" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -4130,15 +4112,15 @@ dependencies = [ [[package]] name = "derive_more" -version = "0.99.19" +version = "0.99.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3da29a38df43d6f156149c9b43ded5e018ddff2a855cf2cfd62e8cd7d079c69f" +checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" dependencies = [ "convert_case 0.4.0", "proc-macro2", "quote", "rustc_version 0.4.1", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -4243,7 +4225,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -4278,7 +4260,7 @@ checksum = "f2b99bf03862d7f545ebc28ddd33a665b50865f4dfd84031a393823879bd4c54" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -4424,9 +4406,9 @@ dependencies = [ [[package]] name = "ecow" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef5eeffa816451f3a6a4cce9cd796e3e5ba6018638d3ce5cc7f87b73bababf60" +checksum = "b92b481eb5d59fd8e80e92ff11d057d1ca8d144b2cd8c66cc8d5bd177a3c0dc5" dependencies = [ "serde", ] @@ -4532,7 +4514,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -4552,7 +4534,7 @@ checksum = "fc4caf64a58d7a6d65ab00639b046ff54399a39f5f2554728895ace4b297cd79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -4847,7 +4829,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -4885,7 +4867,7 @@ checksum = "32016f1242eb82af5474752d00fd8ebcd9004bd69b462b1c91de833972d08ed4" dependencies = [ "proc-macro2", "swc_macros_common", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -5020,7 +5002,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -5299,7 +5281,7 @@ checksum = "53010ccb100b96a67bc32c0175f0ed1426b31b655d562898e57325f81c023ac0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -5624,7 +5606,7 @@ checksum = "f208758247e68e239acaa059e72e4ce1f30f2a4b6523f19c1b923d25b7e9cceb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -6081,7 +6063,7 @@ dependencies = [ "js-sys", "log", "wasm-bindgen", - "windows-core 0.57.0", + "windows-core 0.61.0", ] [[package]] @@ -6208,7 +6190,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -6418,7 +6400,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -6668,7 +6650,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -6798,7 +6780,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ "cfg-if", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] @@ -6941,6 +6923,15 @@ dependencies = [ "hashbrown 0.15.2", ] +[[package]] +name = "lru" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f8cc7106155f10bdf99a6f379688f543ad6596a415375b36a59a054ceda1198" +dependencies = [ + "hashbrown 0.15.2", +] + [[package]] name = "lscolors" version = "0.17.0" @@ -7264,7 +7255,7 @@ checksum = "bf45bf44ab49be92fd1227a3be6fc6f617f1a337c06af54981048574d8783147" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -7384,7 +7375,7 @@ checksum = "c402a4092d5e204f32c9e155431046831fa712637043c58cb73bc6bc6c9663b5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -7418,9 +7409,9 @@ checksum = "2195bf6aa996a481483b29d62a7663eed3fe39600c460e323f8ff41e90bdd89b" [[package]] name = "mysql-common-derive" -version = "0.32.0" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "deb6d9ff4094f6d58d3f892fc558e60048476213dd17dcf904b62202e9029da6" +checksum = "66f62cad7623a9cb6f8f64037f0c4f69c8db8e82914334a83c9788201c2c1bfa" dependencies = [ "darling 0.20.11", "heck 0.5.0", @@ -7429,31 +7420,30 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", "termcolor", - "thiserror 1.0.69", + "thiserror 2.0.12", ] [[package]] name = "mysql_async" -version = "0.35.1" +version = "0.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d14cf024116ba8fef4a7fec5abf0bd5de89b9fb29a7e55818a119ac5ec745077" +checksum = "20d0d6385c37d331a4502565a1be2a06b23d4ada08ee5177c6374272cd8980a6" dependencies = [ "bytes", - "crossbeam", + "crossbeam-queue", "flate2", "futures-core", "futures-sink", "futures-util", "keyed_priority_queue", - "lru", + "lru 0.14.0", "mysql_common", "native-tls", "pem 3.0.5", "percent-encoding", - "pin-project", - "rand 0.8.5", + "rand 0.9.0", "serde", "serde_json", "socket2", @@ -7467,24 +7457,21 @@ dependencies = [ [[package]] name = "mysql_common" -version = "0.34.1" +version = "0.35.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34a9141e735d5bb02414a7ac03add09522466d4db65bdd827069f76ae0850e58" +checksum = "4351dce0b6634a60d6f1f40fae5cfcfe0f6c6a4a1e87e8da7babe4c37c522460" dependencies = [ "base64 0.22.1", "bitflags 2.9.0", "btoi", "byteorder", "bytes", - "cc", - "cmake", "crc32fast", "flate2", - "lazy_static", + "getrandom 0.3.2", "mysql-common-derive", "num-bigint", "num-traits", - "rand 0.8.5", "regex", "rust_decimal", "saturating", @@ -7492,10 +7479,8 @@ dependencies = [ "serde_json", "sha1", "sha2 0.10.8", - "subprocess", - "thiserror 1.0.69", + "thiserror 2.0.12", "uuid", - "zstd", ] [[package]] @@ -7538,7 +7523,7 @@ dependencies = [ "quote", "serde", "serde_json", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -7733,7 +7718,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -7800,7 +7785,7 @@ dependencies = [ "heck 0.5.0", "indexmap 2.9.0", "log", - "lru", + "lru 0.12.5", "miette", "nix 0.29.0", "nu-derive-value", @@ -8001,7 +7986,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -8207,7 +8192,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -8714,7 +8699,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -8755,7 +8740,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -8942,7 +8927,7 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ - "zerocopy 0.8.24", + "zerocopy 0.8.25", ] [[package]] @@ -8958,7 +8943,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "664ec5419c51e34154eec046ebcba56312d5a2fc3b09a06da188e1ad21afadf6" dependencies = [ "proc-macro2", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -8976,7 +8961,7 @@ version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" dependencies = [ - "toml_edit 0.22.24", + "toml_edit 0.22.25", ] [[package]] @@ -9022,7 +9007,7 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -9033,7 +9018,7 @@ checksum = "07c277e4e643ef00c1233393c673f655e3672cf7eb3ba08a00bdd0ea59139b5f" dependencies = [ "proc-macro-rules-macros", "proc-macro2", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -9045,7 +9030,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -9142,7 +9127,7 @@ dependencies = [ "prost", "prost-types", "regex", - "syn 2.0.100", + "syn 2.0.101", "tempfile", ] @@ -9156,7 +9141,7 @@ dependencies = [ "itertools 0.14.0", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -9170,9 +9155,9 @@ dependencies = [ [[package]] name = "psm" -version = "0.1.25" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f58e5423e24c18cc840e1c98370b3993c6649cd1678b4d24318bcf0a083cbe88" +checksum = "6e944464ec8536cd1beb0bbfd96987eb5e3b72f2ecdafdc5c769a37f1fa2ae1f" dependencies = [ "cc", ] @@ -9373,7 +9358,7 @@ checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.3", - "zerocopy 0.8.24", + "zerocopy 0.8.25", ] [[package]] @@ -9569,7 +9554,7 @@ checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -9873,7 +9858,7 @@ dependencies = [ [[package]] name = "rmcp" version = "0.1.5" -source = "git+https://github.com/windmill-labs/rust-sdk#e6c368965711a2afe45218149d1be5324b098a4d" +source = "git+https://github.com/windmill-labs/rust-sdk#9142b40202e49ca0b6530fa49a3abc8bd1b2fcf0" dependencies = [ "async-stream", "axum", @@ -9897,11 +9882,11 @@ dependencies = [ [[package]] name = "rmcp-macros" version = "0.1.5" -source = "git+https://github.com/windmill-labs/rust-sdk#e6c368965711a2afe45218149d1be5324b098a4d" +source = "git+https://github.com/windmill-labs/rust-sdk#9142b40202e49ca0b6530fa49a3abc8bd1b2fcf0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -9991,7 +9976,7 @@ dependencies = [ "quote", "rust-embed-utils", "shellexpand", - "syn 2.0.100", + "syn 2.0.101", "walkdir", ] @@ -10452,7 +10437,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -10632,7 +10617,7 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -10643,7 +10628,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -10695,7 +10680,7 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -10760,7 +10745,7 @@ dependencies = [ "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -11161,7 +11146,7 @@ checksum = "01b2e185515564f15375f593fb966b5718bc624ba77fe49fa4616ad619690554" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -11226,7 +11211,7 @@ dependencies = [ "quote", "sqlx-core", "sqlx-macros-core", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -11249,7 +11234,7 @@ dependencies = [ "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn 2.0.100", + "syn 2.0.101", "tempfile", "tokio", "url", @@ -11375,9 +11360,9 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "stacker" -version = "0.1.20" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601f9201feb9b09c00266478bf459952b9ef9a6b94edb2f21eba14ab681a60a9" +checksum = "cddb07e32ddb770749da91081d8d0ac3a16f1a569a18b20348cd371f5dead06b" dependencies = [ "cc", "cfg-if", @@ -11401,7 +11386,7 @@ dependencies = [ "proc-macro2", "quote", "swc_macros_common", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -11470,7 +11455,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -11483,17 +11468,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.100", -] - -[[package]] -name = "subprocess" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c2e86926081dda636c546d8c5e641661049d7562a68f5488be4a1f7f66f6086" -dependencies = [ - "libc", - "winapi", + "syn 2.0.101", ] [[package]] @@ -11612,7 +11587,7 @@ dependencies = [ "proc-macro2", "quote", "swc_macros_common", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -11661,7 +11636,7 @@ dependencies = [ "proc-macro2", "quote", "swc_macros_common", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -11746,7 +11721,7 @@ dependencies = [ "proc-macro2", "quote", "swc_macros_common", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -11853,7 +11828,7 @@ checksum = "63db0adcff29d220c3d151c5b25c0eabe7e32dd936212b84cdaa1392e3130497" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -11864,7 +11839,7 @@ checksum = "f486687bfb7b5c560868f69ed2d458b880cebc9babebcb67e49f31b55c5bf847" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -11887,7 +11862,7 @@ dependencies = [ "proc-macro2", "quote", "swc_macros_common", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -11903,9 +11878,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.100" +version = "2.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" +checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" dependencies = [ "proc-macro2", "quote", @@ -11947,7 +11922,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -12067,7 +12042,7 @@ dependencies = [ "itertools 0.12.1", "levenshtein_automata", "log", - "lru", + "lru 0.12.5", "lz4_flex", "measure_time", "memmap2 0.9.5", @@ -12280,7 +12255,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -12291,7 +12266,7 @@ checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -12536,7 +12511,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -12757,9 +12732,9 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" dependencies = [ "serde", ] @@ -12779,13 +12754,13 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.24" +version = "0.22.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" +checksum = "10558ed0bd2a1562e630926a2d1f0b98c827da99fabd3fe20920a59642504485" dependencies = [ "indexmap 2.9.0", "toml_datetime", - "winnow 0.7.6", + "winnow 0.7.7", ] [[package]] @@ -12941,7 +12916,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -13185,7 +13160,7 @@ checksum = "35f5380909ffc31b4de4f4bdf96b877175a016aa2ca98cee39fcfd8c4d53d952" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -13631,7 +13606,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", "wasm-bindgen-shared", ] @@ -13666,7 +13641,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -13701,7 +13676,7 @@ checksum = "17d5042cc5fa009658f9a7333ef24291b1291a25b6382dd68862a7f3b969f69b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -13805,7 +13780,7 @@ dependencies = [ "log", "naga", "once_cell", - "parking_lot 0.11.2", + "parking_lot 0.12.3", "profiling", "raw-window-handle", "ron", @@ -13847,7 +13822,7 @@ dependencies = [ "ndk-sys", "objc", "once_cell", - "parking_lot 0.11.2", + "parking_lot 0.12.3", "profiling", "range-alloc", "raw-window-handle", @@ -13946,7 +13921,7 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windmill" -version = "1.483.2" +version = "1.484.0" dependencies = [ "anyhow", "axum", @@ -13993,7 +13968,7 @@ dependencies = [ [[package]] name = "windmill-api" -version = "1.483.2" +version = "1.484.0" dependencies = [ "anyhow", "argon2", @@ -14080,7 +14055,7 @@ dependencies = [ "tokio-tungstenite", "tokio-util", "tonic", - "tower 0.4.13", + "tower 0.5.2", "tower-cookies", "tower-http", "tracing", @@ -14103,7 +14078,7 @@ dependencies = [ [[package]] name = "windmill-api-client" -version = "1.483.2" +version = "1.484.0" dependencies = [ "base64 0.22.1", "chrono", @@ -14118,7 +14093,7 @@ dependencies = [ [[package]] name = "windmill-audit" -version = "1.483.2" +version = "1.484.0" dependencies = [ "chrono", "serde", @@ -14131,7 +14106,7 @@ dependencies = [ [[package]] name = "windmill-autoscaling" -version = "1.483.2" +version = "1.484.0" dependencies = [ "anyhow", "serde", @@ -14145,7 +14120,7 @@ dependencies = [ [[package]] name = "windmill-common" -version = "1.483.2" +version = "1.484.0" dependencies = [ "anyhow", "async-stream", @@ -14209,7 +14184,7 @@ dependencies = [ [[package]] name = "windmill-git-sync" -version = "1.483.2" +version = "1.484.0" dependencies = [ "regex", "serde", @@ -14223,7 +14198,7 @@ dependencies = [ [[package]] name = "windmill-indexer" -version = "1.483.2" +version = "1.484.0" dependencies = [ "anyhow", "bytes", @@ -14246,19 +14221,19 @@ dependencies = [ [[package]] name = "windmill-macros" -version = "1.483.2" +version = "1.484.0" dependencies = [ "itertools 0.14.0", "lazy_static", "proc-macro2", "quote", "regex", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] name = "windmill-parser" -version = "1.483.2" +version = "1.484.0" dependencies = [ "convert_case 0.6.0", "serde", @@ -14267,7 +14242,7 @@ dependencies = [ [[package]] name = "windmill-parser-bash" -version = "1.483.2" +version = "1.484.0" dependencies = [ "anyhow", "lazy_static", @@ -14279,7 +14254,7 @@ dependencies = [ [[package]] name = "windmill-parser-csharp" -version = "1.483.2" +version = "1.484.0" dependencies = [ "anyhow", "serde_json", @@ -14291,7 +14266,7 @@ dependencies = [ [[package]] name = "windmill-parser-go" -version = "1.483.2" +version = "1.484.0" dependencies = [ "anyhow", "gosyn", @@ -14303,7 +14278,7 @@ dependencies = [ [[package]] name = "windmill-parser-graphql" -version = "1.483.2" +version = "1.484.0" dependencies = [ "anyhow", "lazy_static", @@ -14315,7 +14290,7 @@ dependencies = [ [[package]] name = "windmill-parser-java" -version = "1.483.2" +version = "1.484.0" dependencies = [ "anyhow", "serde_json", @@ -14327,7 +14302,7 @@ dependencies = [ [[package]] name = "windmill-parser-nu" -version = "1.483.2" +version = "1.484.0" dependencies = [ "anyhow", "nu-parser", @@ -14338,7 +14313,7 @@ dependencies = [ [[package]] name = "windmill-parser-php" -version = "1.483.2" +version = "1.484.0" dependencies = [ "anyhow", "itertools 0.14.0", @@ -14349,7 +14324,7 @@ dependencies = [ [[package]] name = "windmill-parser-py" -version = "1.483.2" +version = "1.484.0" dependencies = [ "anyhow", "itertools 0.14.0", @@ -14360,7 +14335,7 @@ dependencies = [ [[package]] name = "windmill-parser-py-imports" -version = "1.483.2" +version = "1.484.0" dependencies = [ "anyhow", "async-recursion", @@ -14380,7 +14355,7 @@ dependencies = [ [[package]] name = "windmill-parser-rust" -version = "1.483.2" +version = "1.484.0" dependencies = [ "anyhow", "convert_case 0.6.0", @@ -14390,14 +14365,14 @@ dependencies = [ "quote", "regex", "serde_json", - "syn 2.0.100", + "syn 2.0.101", "toml", "windmill-parser", ] [[package]] name = "windmill-parser-sql" -version = "1.483.2" +version = "1.484.0" dependencies = [ "anyhow", "lazy_static", @@ -14409,7 +14384,7 @@ dependencies = [ [[package]] name = "windmill-parser-ts" -version = "1.483.2" +version = "1.484.0" dependencies = [ "anyhow", "lazy_static", @@ -14427,7 +14402,7 @@ dependencies = [ [[package]] name = "windmill-parser-wasm" -version = "1.483.2" +version = "1.484.0" dependencies = [ "anyhow", "getrandom 0.2.16", @@ -14451,7 +14426,7 @@ dependencies = [ [[package]] name = "windmill-parser-yaml" -version = "1.483.2" +version = "1.484.0" dependencies = [ "anyhow", "serde_json", @@ -14461,7 +14436,7 @@ dependencies = [ [[package]] name = "windmill-queue" -version = "1.483.2" +version = "1.484.0" dependencies = [ "anyhow", "async-recursion", @@ -14494,7 +14469,7 @@ dependencies = [ [[package]] name = "windmill-sql-datatype-parser-wasm" -version = "1.483.2" +version = "1.484.0" dependencies = [ "wasm-bindgen", "wasm-bindgen-test", @@ -14504,7 +14479,7 @@ dependencies = [ [[package]] name = "windmill-worker" -version = "1.483.2" +version = "1.484.0" dependencies = [ "anyhow", "async-recursion", @@ -14659,6 +14634,19 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-core" +version = "0.61.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" +dependencies = [ + "windows-implement 0.60.0", + "windows-interface 0.59.1", + "windows-link", + "windows-result 0.3.2", + "windows-strings 0.4.0", +] + [[package]] name = "windows-implement" version = "0.56.0" @@ -14667,7 +14655,7 @@ checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -14678,7 +14666,7 @@ checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -14689,7 +14677,18 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", +] + +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", ] [[package]] @@ -14700,7 +14699,7 @@ checksum = "08990546bf4edef8f431fa6326e032865f27138718c587dc21bc0265bbcb57cc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -14711,7 +14710,7 @@ checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -14722,7 +14721,18 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", ] [[package]] @@ -14788,6 +14798,15 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-strings" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.48.0" @@ -15020,9 +15039,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.7.6" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63d3fcd9bba44b03821e7d699eeee959f3126dcc4aa8e4ae18ec617c2a5cea10" +checksum = "6cb8234a863ea0e8cd7284fcdd4f145233eb00fee02bbdd9861aec44e6477bc5" dependencies = [ "memchr", ] @@ -15174,7 +15193,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", "synstructure 0.13.1", ] @@ -15189,11 +15208,11 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.24" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" +checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" dependencies = [ - "zerocopy-derive 0.8.24", + "zerocopy-derive 0.8.25", ] [[package]] @@ -15204,18 +15223,18 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] name = "zerocopy-derive" -version = "0.8.24" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" +checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -15235,7 +15254,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", "synstructure 0.13.1", ] @@ -15256,7 +15275,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -15278,7 +15297,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] diff --git a/backend/Cargo.toml b/backend/Cargo.toml index ec8ab26f84..cdcf83ec5d 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "windmill" -version = "1.483.2" +version = "1.484.0" authors.workspace = true edition.workspace = true @@ -32,7 +32,7 @@ members = [ ] [workspace.package] -version = "1.483.2" +version = "1.484.0" authors = ["Ruben Fiszel "] edition = "2021" diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index 772430b468..1a93c1dce8 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.483.2 + version: 1.484.0 title: Windmill API contact: diff --git a/benchmarks/lib.ts b/benchmarks/lib.ts index 96c5771001..79704f1f2a 100644 --- a/benchmarks/lib.ts +++ b/benchmarks/lib.ts @@ -2,7 +2,7 @@ import { sleep } from "https://deno.land/x/sleep@v1.2.1/mod.ts"; import * as windmill from "https://deno.land/x/windmill@v1.174.0/mod.ts"; import * as api from "https://deno.land/x/windmill@v1.174.0/windmill-api/index.ts"; -export const VERSION = "v1.483.2"; +export const VERSION = "v1.484.0"; export async function login(email: string, password: string): Promise { return await windmill.UserService.login({ diff --git a/cli/main.ts b/cli/main.ts index a5dad4a285..c0929ed46a 100644 --- a/cli/main.ts +++ b/cli/main.ts @@ -63,7 +63,7 @@ export { // } // }); -export const VERSION = "1.483.2"; +export const VERSION = "1.484.0"; const command = new Command() .name("wmill") diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 3f75cdd606..c1f08825b6 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "windmill-components", - "version": "1.483.2", + "version": "1.484.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "windmill-components", - "version": "1.483.2", + "version": "1.484.0", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/frontend/package.json b/frontend/package.json index 49c9aab002..3069332fd4 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "windmill-components", - "version": "1.483.2", + "version": "1.484.0", "scripts": { "dev": "vite dev", "build": "vite build", diff --git a/lsp/Pipfile b/lsp/Pipfile index a261d308a7..05a6839539 100644 --- a/lsp/Pipfile +++ b/lsp/Pipfile @@ -4,8 +4,8 @@ verify_ssl = true name = "pypi" [packages] -wmill = ">=1.483.2" -wmill_pg = ">=1.483.2" +wmill = ">=1.484.0" +wmill_pg = ">=1.484.0" sendgrid = "*" mysql-connector-python = "*" pymongo = "*" diff --git a/openflow.openapi.yaml b/openflow.openapi.yaml index 1be14fd156..9db120aa4c 100644 --- a/openflow.openapi.yaml +++ b/openflow.openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.483.2 + version: 1.484.0 title: OpenFlow Spec contact: name: Ruben Fiszel diff --git a/powershell-client/WindmillClient/WindmillClient.psd1 b/powershell-client/WindmillClient/WindmillClient.psd1 index 9dbaba6de3..a360723658 100644 --- a/powershell-client/WindmillClient/WindmillClient.psd1 +++ b/powershell-client/WindmillClient/WindmillClient.psd1 @@ -12,7 +12,7 @@ RootModule = 'WindmillClient.psm1' # Version number of this module. - ModuleVersion = '1.483.2' + ModuleVersion = '1.484.0' # Supported PSEditions # CompatiblePSEditions = @() diff --git a/python-client/wmill/pyproject.toml b/python-client/wmill/pyproject.toml index 58adf9b51e..0233ce4f6f 100644 --- a/python-client/wmill/pyproject.toml +++ b/python-client/wmill/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "wmill" -version = "1.483.2" +version = "1.484.0" description = "A client library for accessing Windmill server wrapping the Windmill client API" license = "Apache-2.0" homepage = "https://windmill.dev" diff --git a/python-client/wmill_pg/pyproject.toml b/python-client/wmill_pg/pyproject.toml index 1d155b23e0..0bd5a2d31a 100644 --- a/python-client/wmill_pg/pyproject.toml +++ b/python-client/wmill_pg/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "wmill-pg" -version = "1.483.2" +version = "1.484.0" description = "An extension client for the wmill client library focused on pg" license = "Apache-2.0" homepage = "https://windmill.dev" diff --git a/typescript-client/jsr.json b/typescript-client/jsr.json index 071d935988..7772a51147 100644 --- a/typescript-client/jsr.json +++ b/typescript-client/jsr.json @@ -1,6 +1,6 @@ { "name": "@windmill/windmill", - "version": "1.483.2", + "version": "1.484.0", "exports": "./src/index.ts", "publish": { "exclude": ["!src", "./s3Types.ts", "./client.ts"] diff --git a/typescript-client/package.json b/typescript-client/package.json index e7c9f89a25..4a7cc5380b 100644 --- a/typescript-client/package.json +++ b/typescript-client/package.json @@ -1,7 +1,7 @@ { "name": "windmill-client", "description": "Windmill SDK client for browsers and Node.js", - "version": "1.483.2", + "version": "1.484.0", "author": "Ruben Fiszel", "license": "Apache 2.0", "devDependencies": { diff --git a/version.txt b/version.txt index 236eaf0673..67c0061506 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.483.2 +1.484.0 From 1b1691837a7e6b88afbacf7d88c14ca5e475b493 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Sun, 27 Apr 2025 14:11:49 +0200 Subject: [PATCH 294/739] fix: add svelte 5 boundaries to app components to contain errors --- frontend/package-lock.json | 16 +- .../display/table/AppAggridTable.svelte | 1 + .../editor/component/ComponentInner.svelte | 1425 +++++++++-------- 3 files changed, 728 insertions(+), 714 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index c1f08825b6..2c400609c7 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -2309,10 +2309,6 @@ "ag-grid-community": "31.3.4" } }, - "node_modules/ag-grid-enterprise/node_modules/ag-charts-community": { - "version": "9.3.2", - "license": "MIT" - }, "node_modules/agentkeepalive": { "version": "4.6.0", "license": "MIT", @@ -4127,8 +4123,9 @@ } }, "node_modules/esrap": { - "version": "1.4.5", - "license": "MIT", + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/esrap/-/esrap-1.4.6.tgz", + "integrity": "sha512-F/D2mADJ9SHY3IwksD4DAXjTt7qt7GWUf3/8RhCNWmC/67tyb55dpimHmy7EplakFaflV0R/PC+fdSPqrRHAQw==", "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" } @@ -9716,8 +9713,9 @@ } }, "node_modules/svelte": { - "version": "5.22.6", - "license": "MIT", + "version": "5.28.2", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.28.2.tgz", + "integrity": "sha512-FbWBxgWOpQfhKvoGJv/TFwzqb4EhJbwCD17dB0tEpQiw1XyUEKZJtgm4nA4xq3LLsMo7hu5UY/BOFmroAxKTMg==", "dependencies": { "@ampproject/remapping": "^2.3.0", "@jridgewell/sourcemap-codec": "^1.5.0", @@ -9728,7 +9726,7 @@ "axobject-query": "^4.1.0", "clsx": "^2.1.1", "esm-env": "^1.2.1", - "esrap": "^1.4.3", + "esrap": "^1.4.6", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", diff --git a/frontend/src/lib/components/apps/components/display/table/AppAggridTable.svelte b/frontend/src/lib/components/apps/components/display/table/AppAggridTable.svelte index 38de9a4dc3..a35e322a59 100644 --- a/frontend/src/lib/components/apps/components/display/table/AppAggridTable.svelte +++ b/frontend/src/lib/components/apps/components/display/table/AppAggridTable.svelte @@ -88,6 +88,7 @@ let loaded = false + async function setValues() { value = Array.isArray(result) ? (result as any[]).map((x, i) => ({ ...x, __index: i.toString() + '-' + uid })) diff --git a/frontend/src/lib/components/apps/editor/component/ComponentInner.svelte b/frontend/src/lib/components/apps/editor/component/ComponentInner.svelte index c69cd9f178..6f36d786cb 100644 --- a/frontend/src/lib/components/apps/editor/component/ComponentInner.svelte +++ b/frontend/src/lib/components/apps/editor/component/ComponentInner.svelte @@ -73,6 +73,7 @@ import AppRecomputeAll from '../../components/display/AppRecomputeAll.svelte' import AppUserResource from '../../components/inputs/AppUserResource.svelte' import type { AppComponent } from './components' + import { Button } from '$lib/components/common' export let component: AppComponent export let render: boolean @@ -82,708 +83,722 @@ export let initializing: boolean | undefined = undefined -{#if component.type === 'displaycomponent'} - -{:else if component.type === 'logcomponent'} - -{:else if component.type === 'jobidlogcomponent'} - -{:else if component.type === 'flowstatuscomponent'} - -{:else if component.type === 'jobidflowstatuscomponent'} - -{:else if component.type === 'barchartcomponent'} - -{:else if component.type === 'timeseriescomponent'} - -{:else if component.type === 'htmlcomponent'} - -{:else if component.type === 'customcomponent'} - -{:else if component.type === 'mardowncomponent'} - -{:else if component.type === 'vegalitecomponent'} - -{:else if component.type === 'plotlycomponent'} - -{:else if component.type === 'plotlycomponentv2'} - -{:else if component.type === 'scatterchartcomponent'} - -{:else if component.type === 'piechartcomponent'} - -{:else if component.type === 'agchartscomponent'} - -{:else if component.type === 'agchartscomponentee'} - -{:else if component.type === 'tablecomponent'} - -{:else if component.type === 'dbexplorercomponent'} - -{:else if component.type === 'aggridcomponent'} - -{:else if component.type === 'aggridcomponentee'} - -{:else if component.type === 'aggridinfinitecomponent'} - -{:else if component.type === 'aggridinfinitecomponentee'} - -{:else if component.type === 'textcomponent'} - -{:else if component.type === 'codeinputcomponent'} - -{:else if component.type === 'buttoncomponent'} - -{:else if component.type === 'downloadcomponent'} - -{:else if component.type === 'selectcomponent' || component.type === 'resourceselectcomponent'} - -{:else if component.type === 'userresourcecomponent'} - -{:else if component.type === 'multiselectcomponent'} - -{:else if component.type === 'multiselectcomponentv2'} - -{:else if component.type === 'formcomponent'} - -{:else if component.type === 'formbuttoncomponent'} - -{:else if component.type === 'checkboxcomponent'} - -{:else if component.type === 'textinputcomponent'} - -{:else if component.type === 'quillcomponent'} - -{:else if component.type === 'textareainputcomponent'} - -{:else if component.type === 'emailinputcomponent'} - -{:else if component.type === 'passwordinputcomponent'} - -{:else if component.type === 'dateinputcomponent'} - -{:else if component.type === 'timeinputcomponent'} - -{:else if component.type === 'datetimeinputcomponent'} - -{:else if component.type === 'numberinputcomponent'} - -{:else if component.type === 'currencycomponent'} - -{:else if component.type === 'slidercomponent'} - -{:else if component.type === 'dateslidercomponent'} - -{:else if component.type === 'horizontaldividercomponent'} - -{:else if component.type === 'verticaldividercomponent'} - -{:else if component.type === 'rangecomponent'} - -{:else if component.type === 'tabscomponent' && component.tabs} - -{:else if component.type === 'steppercomponent' && component.tabs} - -{:else if component.type === 'conditionalwrapper' && component.conditions} - -{:else if component.type === 'containercomponent'} - -{:else if component.type === 'listcomponent'} - -{:else if component.type === 'verticalsplitpanescomponent'} - -{:else if component.type === 'horizontalsplitpanescomponent'} - -{:else if component.type === 'iconcomponent'} - -{:else if component.type === 'fileinputcomponent'} - -{:else if component.type === 's3fileinputcomponent'} - -{:else if component.type === 'imagecomponent'} - -{:else if component.type === 'drawercomponent'} - -{:else if component.type === 'mapcomponent'} - -{:else if component.type === 'pdfcomponent'} - -{:else if component.type === 'modalcomponent'} - -{:else if component.type === 'schemaformcomponent'} - -{:else if component.type === 'selecttabcomponent'} - -{:else if component.type === 'selectstepcomponent'} - -{:else if component.type === 'chartjscomponent'} - -{:else if component.type === 'chartjscomponentv2'} - -{:else if component.type === 'carousellistcomponent'} - -{:else if component.type === 'accordionlistcomponent'} - -{:else if component.type === 'statcomponent'} - -{:else if component.type === 'menucomponent'} - -{:else if component.type === 'decisiontreecomponent' && component.nodes} - -{:else if component.type === 'alertcomponent'} - -{:else if component.type === 'navbarcomponent'} - -{:else if component.type === 'dateselectcomponent'} - -{:else if component.type === 'jobiddisplaycomponent'} - -{:else if component.type === 'recomputeallcomponent'} - -{/if} + + {#if component.type === 'displaycomponent'} + + {:else if component.type === 'logcomponent'} + + {:else if component.type === 'jobidlogcomponent'} + + {:else if component.type === 'flowstatuscomponent'} + + {:else if component.type === 'jobidflowstatuscomponent'} + + {:else if component.type === 'barchartcomponent'} + + {:else if component.type === 'timeseriescomponent'} + + {:else if component.type === 'htmlcomponent'} + + {:else if component.type === 'customcomponent'} + + {:else if component.type === 'mardowncomponent'} + + {:else if component.type === 'vegalitecomponent'} + + {:else if component.type === 'plotlycomponent'} + + {:else if component.type === 'plotlycomponentv2'} + + {:else if component.type === 'scatterchartcomponent'} + + {:else if component.type === 'piechartcomponent'} + + {:else if component.type === 'agchartscomponent'} + + {:else if component.type === 'agchartscomponentee'} + + {:else if component.type === 'tablecomponent'} + + {:else if component.type === 'dbexplorercomponent'} + + {:else if component.type === 'aggridcomponent'} + + {:else if component.type === 'aggridcomponentee'} + + {:else if component.type === 'aggridinfinitecomponent'} + + {:else if component.type === 'aggridinfinitecomponentee'} + + {:else if component.type === 'textcomponent'} + + {:else if component.type === 'codeinputcomponent'} + + {:else if component.type === 'buttoncomponent'} + + {:else if component.type === 'downloadcomponent'} + + {:else if component.type === 'selectcomponent' || component.type === 'resourceselectcomponent'} + + {:else if component.type === 'userresourcecomponent'} + + {:else if component.type === 'multiselectcomponent'} + + {:else if component.type === 'multiselectcomponentv2'} + + {:else if component.type === 'formcomponent'} + + {:else if component.type === 'formbuttoncomponent'} + + {:else if component.type === 'checkboxcomponent'} + + {:else if component.type === 'textinputcomponent'} + + {:else if component.type === 'quillcomponent'} + + {:else if component.type === 'textareainputcomponent'} + + {:else if component.type === 'emailinputcomponent'} + + {:else if component.type === 'passwordinputcomponent'} + + {:else if component.type === 'dateinputcomponent'} + + {:else if component.type === 'timeinputcomponent'} + + {:else if component.type === 'datetimeinputcomponent'} + + {:else if component.type === 'numberinputcomponent'} + + {:else if component.type === 'currencycomponent'} + + {:else if component.type === 'slidercomponent'} + + {:else if component.type === 'dateslidercomponent'} + + {:else if component.type === 'horizontaldividercomponent'} + + {:else if component.type === 'verticaldividercomponent'} + + {:else if component.type === 'rangecomponent'} + + {:else if component.type === 'tabscomponent' && component.tabs} + + {:else if component.type === 'steppercomponent' && component.tabs} + + {:else if component.type === 'conditionalwrapper' && component.conditions} + + {:else if component.type === 'containercomponent'} + + {:else if component.type === 'listcomponent'} + + {:else if component.type === 'verticalsplitpanescomponent'} + + {:else if component.type === 'horizontalsplitpanescomponent'} + + {:else if component.type === 'iconcomponent'} + + {:else if component.type === 'fileinputcomponent'} + + {:else if component.type === 's3fileinputcomponent'} + + {:else if component.type === 'imagecomponent'} + + {:else if component.type === 'drawercomponent'} + + {:else if component.type === 'mapcomponent'} + + {:else if component.type === 'pdfcomponent'} + + {:else if component.type === 'modalcomponent'} + + {:else if component.type === 'schemaformcomponent'} + + {:else if component.type === 'selecttabcomponent'} + + {:else if component.type === 'selectstepcomponent'} + + {:else if component.type === 'chartjscomponent'} + + {:else if component.type === 'chartjscomponentv2'} + + {:else if component.type === 'carousellistcomponent'} + + {:else if component.type === 'accordionlistcomponent'} + + {:else if component.type === 'statcomponent'} + + {:else if component.type === 'menucomponent'} + + {:else if component.type === 'decisiontreecomponent' && component.nodes} + + {:else if component.type === 'alertcomponent'} + + {:else if component.type === 'navbarcomponent'} + + {:else if component.type === 'dateselectcomponent'} + + {:else if component.type === 'jobiddisplaycomponent'} + + {:else if component.type === 'recomputeallcomponent'} + + {/if} + {#snippet failed(error, reset)} +
+

Rendering of component failed

+
{error}
+
+ +
+
+ {/snippet} +
From c599857e4acd33f7ff26cc2d8d714c8b7bde7c17 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Sun, 27 Apr 2025 14:50:27 +0200 Subject: [PATCH 295/739] improve output picker floating config --- .../src/lib/components/meltComponents/Popover.svelte | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/frontend/src/lib/components/meltComponents/Popover.svelte b/frontend/src/lib/components/meltComponents/Popover.svelte index 40ba2d9045..56945f8bb5 100644 --- a/frontend/src/lib/components/meltComponents/Popover.svelte +++ b/frontend/src/lib/components/meltComponents/Popover.svelte @@ -35,7 +35,6 @@ export let documentationLink: string | undefined = undefined let fullScreen = false - const dispatch = createEventDispatcher() const { @@ -69,11 +68,11 @@ } }) - $: $positioning = floatingConfig ?? { + $positioning = floatingConfig ?? { placement, - strategy: fullScreen ? 'fixed' : 'absolute', - x: fullScreen ? 0 : undefined, - y: fullScreen ? 0 : undefined + strategy: 'absolute', + x: undefined, + y: undefined } export let isOpen = false From 72547437fead0a071fceac27dae8628cdcae6a3e Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Sun, 27 Apr 2025 16:29:55 +0200 Subject: [PATCH 296/739] feat: add universal search to object viewer --- .../src/lib/components/SavedInputs.svelte | 11 +- .../clearableInput/ClearableInput.svelte | 6 +- .../flows/propPicker/PropPickerWrapper.svelte | 2 +- .../propertyPicker/ObjectViewer.svelte | 111 ++++++++++++++---- .../propertyPicker/PropPicker.svelte | 2 +- .../lib/components/propertyPicker/utils.ts | 25 +++- 6 files changed, 119 insertions(+), 38 deletions(-) diff --git a/frontend/src/lib/components/SavedInputs.svelte b/frontend/src/lib/components/SavedInputs.svelte index 1a2adf53ce..e16ba75c47 100644 --- a/frontend/src/lib/components/SavedInputs.svelte +++ b/frontend/src/lib/components/SavedInputs.svelte @@ -48,10 +48,10 @@ $: runnableType = scriptHash ? 'ScriptHash' : scriptPath - ? 'ScriptPath' - : flowPath - ? 'FlowPath' - : undefined + ? 'ScriptPath' + : flowPath + ? 'FlowPath' + : undefined let hasAlreadyFailed = false async function loadInputHistory() { @@ -379,7 +379,8 @@ class="w-full h-full items-center text-xs font-normal grid grid-cols-8 gap-4 min-w-0" >
-
+
{i.created_by} diff --git a/frontend/src/lib/components/common/clearableInput/ClearableInput.svelte b/frontend/src/lib/components/common/clearableInput/ClearableInput.svelte index d0f25cac69..d5a2a6b2fd 100644 --- a/frontend/src/lib/components/common/clearableInput/ClearableInput.svelte +++ b/frontend/src/lib/components/common/clearableInput/ClearableInput.svelte @@ -39,7 +39,7 @@ {value} {placeholder} rows="1" - class="resize-y duration-200 {inputClass}" + class="resize-y {inputClass}" {...$$restProps} on:input={handleInput} on:keydown|stopPropagation @@ -51,7 +51,7 @@ {type} {value} {placeholder} - class="duration-200 {(value ? '!pr-[26px] ' : '') + inputClass}" + class=" {(value ? '!pr-[26px] ' : '') + inputClass}" {...$$restProps} on:input={handleInput} on:keydown|stopPropagation @@ -63,7 +63,7 @@ +
+ {:else} + + {/if} +
+{/if} {#if keys.length > 0} {#if !fullyCollapsed} @@ -132,10 +197,10 @@ : - {#if getTypeAsString(json[key]) === 'object'} + {#if getTypeAsString(jsonFiltered[key]) === 'object'} { - selectProp(key, json[key], true) + selectProp(key, jsonFiltered[key], true) }} - title={JSON.stringify(json[key])} + title={JSON.stringify(jsonFiltered[key])} > - {#if json[key] === NEVER_TESTED_THIS_FAR} + {#if jsonFiltered[key] === NEVER_TESTED_THIS_FAR} Test the flow to see a value - {:else if json[key] == undefined} + {:else if jsonFiltered[key] == undefined} undefined - {:else if json[key] == null} + {:else if jsonFiltered[key] == null} null - {:else if typeof json[key] == 'string'} - "{truncate(json[key], 200)}" - {:else if typeof json[key] == 'number' && Number.isInteger(json[key]) && !Number.isSafeInteger(json[key])} + {:else if typeof jsonFiltered[key] == 'string'} + "{truncate(jsonFiltered[key], 200)}" + {:else if typeof jsonFiltered[key] == 'number' && Number.isInteger(jsonFiltered[key]) && !Number.isSafeInteger(jsonFiltered[key])} - {truncate(JSON.stringify(json[key]), 200)} + {truncate(JSON.stringify(jsonFiltered[key]), 200)} @@ -181,7 +246,7 @@ {:else} - {truncate(JSON.stringify(json[key]), 200)} + {truncate(JSON.stringify(jsonFiltered[key]), 200)} {/if} @@ -198,20 +263,20 @@ {#if level == 0 && topBrackets}
{closeBracket} - {#if getTypeAsString(json) === 's3object'} + {#if getTypeAsString(jsonFiltered) === 's3object'} download @@ -240,7 +305,7 @@ {/if} {:else if topBrackets} {openBracket}{closeBracket} -{:else if json == undefined} +{:else if jsonFiltered == undefined} undefined {:else} No items diff --git a/frontend/src/lib/components/propertyPicker/PropPicker.svelte b/frontend/src/lib/components/propertyPicker/PropPicker.svelte index 8faf206f95..8c4da6dc22 100644 --- a/frontend/src/lib/components/propertyPicker/PropPicker.svelte +++ b/frontend/src/lib/components/propertyPicker/PropPicker.svelte @@ -197,7 +197,7 @@
-
+
+ +
{ + // Only proceed if the click is directly on this div and not on the child elements + if (e.target === e.currentTarget) { + replResultData = undefined + } + }} + > + {#if replResultData} + {#key replResultData} + + {/key} + {/if} +
+ + dbTableOpsWithPreviewScripts({ + colDefs, + tableKey, + resourcePath, + resourceType, + workspace: $workspaceStore + })} + dbTableActionsFactory={[ + dbDeleteTableActionWithPreviewScript({ + resourcePath, + resourceType, + workspace: $workspaceStore + }) + ]} + {refresh} + dbTableEditorPropsFactory={({ selectedSchemaKey }) => ({ + resourceType, + previewSql: (values) => + makeCreateTableQuery(values, resourceType, selectedSchemaKey), + async onConfirm(values) { + await runPreviewJobAndPollResult({ + workspace: $workspaceStore, + requestBody: { + args: { database: '$res:' + resourcePath }, + content: makeCreateTableQuery(values, resourceType, selectedSchemaKey), + language: getLanguageByResourceType(resourceType) + } + }) + refresh() + } + })} + /> + + + { + replResultData = data + }} + placeholderTableName={sortArray( + Object.keys( + dbSchema?.schema[ + 'public' in dbSchema?.schema + ? 'public' + : 'dbo' in dbSchema?.schema + ? 'dbo' + : Object.keys(dbSchema?.schema)?.[0] + ] + ) + )?.[0]} + /> + + + {:else} + + + + + + {/if} + + + + - - - - - - {#if dbSchema.lang !== 'graphql' && (dbSchema.schema?.public || dbSchema.schema?.PUBLIC || dbSchema.schema?.dbo)} - - - - - {/if} - {#if dbSchema.lang === 'graphql'} - {#await import('$lib/components/GraphqlSchemaViewer.svelte')} - - {:then Module} - - {/await} - {:else} - - {/if} - - -{:else if shouldDisplayError} - - Schema could not be loaded. Please check the permissions of the resource. - + + + +{/if} +{#if dbSchema.lang === 'graphql'} + {#await import('$lib/components/GraphqlSchemaViewer.svelte')} + + {:then Module} + + {/await} +{:else} + {/if} diff --git a/frontend/src/lib/components/DBTable.svelte b/frontend/src/lib/components/DBTable.svelte new file mode 100644 index 0000000000..337f66b0fd --- /dev/null +++ b/frontend/src/lib/components/DBTable.svelte @@ -0,0 +1,206 @@ + + + + +
+
+ + {#if dbTableOps.onInsert} + { + if (!$workspaceStore) return + dbTableOps.onInsert?.({ values }).then((result) => { + refresh?.() + sendUserToast('Row inserted') + }) + }} + /> + {/if} +
+
+
+ +
{ + if ((e.ctrlKey || e.metaKey) && e.key === 'c') { + const selectedCell = api?.getFocusedCell() + if (selectedCell) { + const rowIndex = selectedCell.rowIndex + const colId = selectedCell.column?.getId() + const rowNode = api?.getDisplayedRowAtIndex(rowIndex) + const selectedValue = rowNode?.data?.[colId] + navigator.clipboard.writeText(selectedValue) + sendUserToast('Copied cell value to clipboard', false) + } + } + }} + >
+
+ +
+
+ + Download +
+ {#if rowCount} + {firstRow}{'->'}{lastRow + 1} of {rowCount} rows + {:else} + {firstRow}{'->'}{lastRow + 1} + {/if} +
+
+
diff --git a/frontend/src/lib/components/DBTableEditor.svelte b/frontend/src/lib/components/DBTableEditor.svelte new file mode 100644 index 0000000000..8381b60c45 --- /dev/null +++ b/frontend/src/lib/components/DBTableEditor.svelte @@ -0,0 +1,435 @@ + + + + + + +
+
+ + +
+ + + + + + Name + Type + Primary + + + + {#each values.columns as column, i} + + + + + + + + {#snippet trigger()} + + {/snippet} + {#snippet content()} + {#if datatypeHasLength(column.datatype)} + + {/if} + + {#if !column.primaryKey} + + {/if} + {/snippet} + + + + + + +
+
+ + + + + + Table + Columns + + + + {#each values.foreignKeys as foreignKey, foreignKeyIndex} + {@const fkErrors = errors?.foreignKeys?.[foreignKeyIndex]} + + + (column.sourceColumn = e.detail.value)} + items={values.columns.map((c) => c.name)} + clearable={false} + /> +
+ +
+ + + + + + + + ON UPDATE + + {/snippet} + + {/if} +
+
+ {/each} + +
+ + {/each} + + + + + + + +
+
+ +
+ + (askingForConfirmation = undefined)} + on:confirmed={askingForConfirmation?.onConfirm ?? (() => {})} +> + {#if askingForConfirmation?.codeContent} +
+ + {askingForConfirmation.codeContent} + + +
+ {/if} +
diff --git a/frontend/src/lib/components/ResourcePicker.svelte b/frontend/src/lib/components/ResourcePicker.svelte index f82dd888dc..4e50c13911 100644 --- a/frontend/src/lib/components/ResourcePicker.svelte +++ b/frontend/src/lib/components/ResourcePicker.svelte @@ -8,10 +8,11 @@ import ResourceEditorDrawer from './ResourceEditorDrawer.svelte' import { Button } from './common' - import DBSchemaExplorer from './DBSchemaExplorer.svelte' + import DBManagerDrawerButton from './DBManagerDrawerButton.svelte' import DarkModeObserver from './DarkModeObserver.svelte' import { Pen, Plus, RotateCw } from 'lucide-svelte' import { sendUserToast } from '$lib/toast' + import { isDbType } from './apps/components/display/dbtable/utils' import { createDispatcherIfMounted } from '$lib/createDispatcherIfMounted' const dispatch = createEventDispatcher() @@ -221,7 +222,7 @@ iconOnly />
- {#if showSchemaExplorer} - + {#if showSchemaExplorer && isDbType(resourceType) && value} + {/if}
diff --git a/frontend/src/lib/components/SimpleAgTable.svelte b/frontend/src/lib/components/SimpleAgTable.svelte new file mode 100644 index 0000000000..47da07fd0b --- /dev/null +++ b/frontend/src/lib/components/SimpleAgTable.svelte @@ -0,0 +1,94 @@ + + + + +
+
+ +
{ + if ((e.ctrlKey || e.metaKey) && e.key === 'c') { + const selectedCell = api?.getFocusedCell() + if (selectedCell) { + const rowIndex = selectedCell.rowIndex + const colId = selectedCell.column?.getId() + const rowNode = api?.getDisplayedRowAtIndex(rowIndex) + const selectedValue = rowNode?.data?.[colId] + navigator.clipboard.writeText(selectedValue) + sendUserToast('Copied cell value to clipboard', false) + } + } + }} + > +
+
+
diff --git a/frontend/src/lib/components/SqlRepl.svelte b/frontend/src/lib/components/SqlRepl.svelte new file mode 100644 index 0000000000..727334cf1d --- /dev/null +++ b/frontend/src/lib/components/SqlRepl.svelte @@ -0,0 +1,178 @@ + + + + + + + + + + + { + const data = e.detail as (typeof runHistory)[number] + editor?.setCode(data.code) + onData(data.result) + }} + /> + + diff --git a/frontend/src/lib/components/apps/components/display/InsertRowDrawerButton.svelte b/frontend/src/lib/components/apps/components/display/InsertRowDrawerButton.svelte new file mode 100644 index 0000000000..fb7d1aaf6e --- /dev/null +++ b/frontend/src/lib/components/apps/components/display/InsertRowDrawerButton.svelte @@ -0,0 +1,61 @@ + + + { + if ((e.ctrlKey || e.metaKey) && e.key === 'Enter') { + onConfirm() + } + }} +/> + + + + + + + + + + + diff --git a/frontend/src/lib/components/apps/components/display/dbtable/AppDbExplorer.svelte b/frontend/src/lib/components/apps/components/display/dbtable/AppDbExplorer.svelte index 9148ef6524..32b0ea7993 100644 --- a/frontend/src/lib/components/apps/components/display/dbtable/AppDbExplorer.svelte +++ b/frontend/src/lib/components/apps/components/display/dbtable/AppDbExplorer.svelte @@ -21,11 +21,7 @@ import { getContext, tick } from 'svelte' import UpdateCell from './UpdateCell.svelte' import { workspaceStore, type DBSchemas } from '$lib/stores' - import Button from '$lib/components/common/button/Button.svelte' - import { Plus } from 'lucide-svelte' - import { Drawer, DrawerContent } from '$lib/components/common' - import InsertRow from './InsertRow.svelte' - import Portal from '$lib/components/Portal.svelte' + import { Drawer } from '$lib/components/common' import { sendUserToast } from '$lib/toast' import type { AppInput, StaticInput } from '$lib/components/apps/inputType' @@ -41,6 +37,7 @@ import { CancelablePromise } from '$lib/gen' import RefreshButton from '$lib/components/apps/components/helpers/RefreshButton.svelte' import RunnableWrapper from '../../helpers/RunnableWrapper.svelte' + import InsertRowDrawerButton from '../InsertRowDrawerButton.svelte' export let id: string export let configuration: RichConfigurations @@ -173,8 +170,6 @@ ) } - let args: Record = {} - let outputs = initOutput($worldStore, id, { selectedRowIndex: 0, selectedRow: {}, @@ -189,7 +184,7 @@ let lastResource: string | undefined = undefined - function updateOneOfConfiguration( + function updateOneOfConfiguration( oneOfConfiguration: OneOfConfiguration, resolvedConfig: { configuration: Record @@ -249,7 +244,7 @@ resolvedConfig.type.configuration[resolvedConfig?.type?.selected].resource.split(':')[1], $workspaceStore, dbSchemas, - (message: string) => {} + () => {} ) updateOneOfConfiguration( @@ -263,7 +258,7 @@ resolvedConfig?.type?.selected, resource.split(':')[1], $workspaceStore! - ) + ) : [], loading: false } @@ -479,8 +474,6 @@ }, 1500) } - let isInsertable: boolean = false - $: $worldStore && render && connectToComponents() function connectToComponents() { @@ -521,7 +514,7 @@ } } - async function insert() { + async function insert(args: object) { try { const selected = resolvedConfig.type.selected @@ -539,8 +532,6 @@ } catch (e) { sendUserToast(e.message, true) } - - args = {} } let runnableComponent: RunnableComponent @@ -651,17 +642,11 @@
{#if hideInsert !== true} - + insert(args)} + /> {/if}
@@ -696,7 +681,7 @@
- + diff --git a/frontend/src/lib/components/apps/components/display/dbtable/queries/count.ts b/frontend/src/lib/components/apps/components/display/dbtable/queries/count.ts index 2c1960a80a..482752b844 100644 --- a/frontend/src/lib/components/apps/components/display/dbtable/queries/count.ts +++ b/frontend/src/lib/components/apps/components/display/dbtable/queries/count.ts @@ -2,7 +2,7 @@ import type { AppInput, RunnableByName } from '$lib/components/apps/inputType' import { buildParameters, type DbType } from '../utils' import { getLanguageByResourceType, type ColumnDef, buildVisibleFieldList } from '../utils' -function makeCountQuery( +export function makeCountQuery( dbType: DbType, table: string, whereClause: string | undefined = undefined, diff --git a/frontend/src/lib/components/apps/components/display/dbtable/queries/createTable.ts b/frontend/src/lib/components/apps/components/display/dbtable/queries/createTable.ts new file mode 100644 index 0000000000..06a952312a --- /dev/null +++ b/frontend/src/lib/components/apps/components/display/dbtable/queries/createTable.ts @@ -0,0 +1,93 @@ +import { dbSupportsSchemas, type DbType } from '../utils' + +export type CreateTableValues = { + name: string + columns: CreateTableValuesColumn[] + foreignKeys: { + targetTable?: string + columns: { + sourceColumn?: string + targetColumn?: string + }[] + onDelete: 'CASCADE' | 'SET NULL' | 'NO ACTION' + onUpdate: 'CASCADE' | 'SET NULL' | 'NO ACTION' + }[] +} + +type CreateTableValuesColumn = { + name: string + datatype: string + primaryKey?: boolean + defaultValue?: string + not_null?: boolean + datatype_length?: number // e.g varchar(255) +} + +export function makeCreateTableQuery( + values: CreateTableValues, + resourceType: DbType, + schema?: string +) { + const pkCount = values.columns.reduce((p, c) => p + (c.primaryKey ? 1 : 0), 0) + + function transformColumn(c: CreateTableValuesColumn): string { + const datatype = c.datatype_length ? `${c.datatype}(${c.datatype_length})` : c.datatype + const defValue = c.defaultValue && formatDefaultValue(c.defaultValue, datatype, resourceType) + + let str = ` ${c.name} ${datatype}` + if (c.not_null) str += ' NOT NULL' + if (defValue) str += ` DEFAULT ${defValue}` + if (pkCount === 1 && c.primaryKey) str += ' PRIMARY KEY' + return str + } + + function transformFk(fk: CreateTableValues['foreignKeys'][number]): string { + const sourceColumns = fk.columns.map((c) => c.sourceColumn).filter(Boolean) + const targetColumns = fk.columns.map((c) => c.targetColumn).filter(Boolean) + const targetTable = + useSchema || !fk.targetTable?.includes('.') + ? fk.targetTable + : fk.targetTable?.split('.').pop() + + let l = ` FOREIGN KEY (${sourceColumns.join(', ')}) REFERENCES ${targetTable} (${targetColumns.join( + ', ' + )})` + if (fk.onDelete !== 'NO ACTION') l += ` ON DELETE ${fk.onDelete}` + if (fk.onUpdate !== 'NO ACTION') l += ` ON UPDATE ${fk.onUpdate}` + return l + } + + const useSchema = dbSupportsSchemas(resourceType) + + const lines = values.columns.map(transformColumn) + lines.push(...values.foreignKeys.map(transformFk)) + if (pkCount > 1) { + const pks = values.columns.filter((c) => c.primaryKey) + lines.push(` PRIMARY KEY (${pks.map((c) => c.name).join(', ')})`) + } + + return `CREATE TABLE ${useSchema && schema ? schema.trim() + '.' : ''}${values.name.trim()} ( +${lines.join(',\n')} +);` +} + +function formatDefaultValue(str: string, datatype: string, resourceType: DbType): string { + if (!str) return '' + if (str.startsWith('{') && str.endsWith('}')) { + return str.slice(1, str.length - 1) + } + if (resourceType === 'postgresql') { + return `CAST('${str}' AS ${datatype})` + } + return `'${str}'` +} + +export function datatypeDefaultLength(datatype: string): number { + datatype = datatype.toLowerCase() + if (datatype == 'bit') return 1 + if (['varchar', 'char', 'nvarchar', 'nchar', 'varbinary', 'binary'].includes(datatype)) { + return 255 + } else { + return 10 + } +} diff --git a/frontend/src/lib/components/apps/components/display/dbtable/queries/delete.ts b/frontend/src/lib/components/apps/components/display/dbtable/queries/delete.ts index b74be6a3c8..bf343cb974 100644 --- a/frontend/src/lib/components/apps/components/display/dbtable/queries/delete.ts +++ b/frontend/src/lib/components/apps/components/display/dbtable/queries/delete.ts @@ -1,7 +1,7 @@ import type { AppInput, RunnableByName } from '$lib/components/apps/inputType' import { getLanguageByResourceType, type ColumnDef, buildParameters, type DbType } from '../utils' -function deleteWithAllValues(table: string, columns: ColumnDef[], dbType: DbType) { +export function makeDeleteQuery(table: string, columns: ColumnDef[], dbType: DbType) { let query = buildParameters( dbType === 'snowflake' ? columns.flatMap((c) => [c, c]) : columns, dbType @@ -71,7 +71,7 @@ export function getDeleteInput( name: 'AppDbExplorer', type: 'runnableByName', inlineScript: { - content: deleteWithAllValues(table, columns, dbType), + content: makeDeleteQuery(table, columns, dbType), language: getLanguageByResourceType(dbType), schema: { $schema: 'https://json-schema.org/draft/2020-12/schema', diff --git a/frontend/src/lib/components/apps/components/display/dbtable/queries/deleteTable.ts b/frontend/src/lib/components/apps/components/display/dbtable/queries/deleteTable.ts new file mode 100644 index 0000000000..397d9886e0 --- /dev/null +++ b/frontend/src/lib/components/apps/components/display/dbtable/queries/deleteTable.ts @@ -0,0 +1,6 @@ +import type { DbType } from '../utils' + +export function makeDeleteTableQuery(tableKey: string, resourceType: DbType): string { + // same for all sql dbs + return `DROP TABLE ${tableKey};` +} diff --git a/frontend/src/lib/components/apps/components/display/dbtable/queries/select.ts b/frontend/src/lib/components/apps/components/display/dbtable/queries/select.ts index 75fab13a13..f4453360ec 100644 --- a/frontend/src/lib/components/apps/components/display/dbtable/queries/select.ts +++ b/frontend/src/lib/components/apps/components/display/dbtable/queries/select.ts @@ -79,7 +79,7 @@ function makeSnowflakeSelectQuery( return query } -function makeSelectQuery( +export function makeSelectQuery( table: string, columnDefs: ColumnDef[], whereClause: string | undefined, @@ -155,6 +155,9 @@ CASE WHEN :order_by = '${column.field}' AND :is_desc IS true THEN \`${column.fie case 'ms_sql_server': // MSSQL uses CONCAT for string concatenation and supports OFFSET FETCH for pagination // Note: MSSQL does not have a built-in ILIKE function, so we use LIKE with a case-insensitive collation if needed + // + // Note 2: CONCAT in mssql requires 2 to 254 arguments. But we can't change this query without breaking + // existing policies const orderBy = columnDefs .map((column) => { return ` diff --git a/frontend/src/lib/components/apps/components/display/dbtable/queries/update.ts b/frontend/src/lib/components/apps/components/display/dbtable/queries/update.ts index c11c5c304f..467922b9d7 100644 --- a/frontend/src/lib/components/apps/components/display/dbtable/queries/update.ts +++ b/frontend/src/lib/components/apps/components/display/dbtable/queries/update.ts @@ -1,18 +1,15 @@ import type { AppInput, RunnableByName } from '$lib/components/apps/inputType' import { getLanguageByResourceType, type ColumnDef, buildParameters, type DbType } from '../utils' -function updateWithAllValues( +export function makeUpdateQuery( table: string, - column: ColumnDef, - columns: ColumnDef[], + column: { datatype: string; field: string }, + columns: { datatype: string; field: string }[], dbType: DbType ) { let query = buildParameters( [ - { - field: 'value_to_update', - datatype: column.datatype - }, + { field: 'value_to_update', datatype: column.datatype }, ...(dbType === 'snowflake' ? columns.flatMap((c) => [c, c]) : columns) ], dbType @@ -85,7 +82,7 @@ export function getUpdateInput( name: 'AppDbExplorer', type: 'runnableByName', inlineScript: { - content: updateWithAllValues(table, column, columns, dbType), + content: makeUpdateQuery(table, column, columns, dbType), language: getLanguageByResourceType(dbType), schema: { $schema: 'https://json-schema.org/draft/2020-12/schema', diff --git a/frontend/src/lib/components/apps/components/display/dbtable/utils.ts b/frontend/src/lib/components/apps/components/display/dbtable/utils.ts index 226561f667..0c3fce722f 100644 --- a/frontend/src/lib/components/apps/components/display/dbtable/utils.ts +++ b/frontend/src/lib/components/apps/components/display/dbtable/utils.ts @@ -8,6 +8,7 @@ import { } from 'graphql' import { tryEvery } from '$lib/utils' import { stringifySchema } from '$lib/components/copilot/lib' +import { runPreviewJobAndPollResult } from '$lib/components/jobs/utils' export enum ColumnIdentity { ByDefault = 'By Default', @@ -61,15 +62,99 @@ export async function loadTableMetaData( if (!resource || !table || !workspace) { return undefined } + const job = await JobService.runScriptPreview({ + workspace: workspace, + requestBody: { + language: getLanguageByResourceType(resourceType), + content: await makeLoadTableMetaDataQuery(resource, workspace, table, resourceType), + args: { + database: resource + } + } + }) - let code: string = '' + const maxRetries = 8 + let attempts = 0 + while (attempts < maxRetries) { + try { + await new Promise((resolve) => setTimeout(resolve, 1000 * (attempts || 0.6))) + const testResult = (await JobService.getCompletedJob({ + workspace: workspace, + id: job + })) as any + + if (testResult.success) { + attempts = maxRetries + + if (resourceType === 'ms_sql_server') { + return testResult.result[0].map(lowercaseKeys) + } else { + return testResult.result.map(lowercaseKeys) + } + } else { + attempts++ + } + } catch (error) { + attempts++ + } + } + + console.error('Failed to load table metadata after maximum retries.') + return undefined +} + +export async function loadAllTablesMetaData( + resource: string, + workspace: string | undefined, + resourceType: string +): Promise | undefined> { + if (!resource || !workspace) { + return undefined + } + + try { + let result = (await runPreviewJobAndPollResult({ + workspace: workspace, + requestBody: { + language: getLanguageByResourceType(resourceType), + content: await makeLoadTableMetaDataQuery(resource, workspace, undefined, resourceType), + args: { + database: resource + } + } + })) as ({ table_name: string; schema_name?: string } & object)[] + if (resourceType === 'ms_sql_server') { + result = (result as any)[0] + } + const map: Record = {} + + for (const _col of result) { + const col = lowercaseKeys(_col) + const tableKey = col.schema_name ? `${col.schema_name}.${col.table_name}` : col.table_name + if (!(tableKey in map)) { + map[tableKey] = [] + } + map[tableKey].push(col) + } + return map + } catch (e) { + throw new Error('Error loading all tables metadata: ' + e) + } +} + +async function makeLoadTableMetaDataQuery( + resource: string, + workspace: string, + table: string | undefined, + resourceType: string +): Promise { if (resourceType === 'mysql') { const resourceObj = (await ResourceService.getResourceValue({ workspace, path: resource.split(':')[1] })) as any - code = ` + return ` SELECT COLUMN_NAME as field, COLUMN_TYPE as DataType, @@ -77,19 +162,31 @@ export async function loadTableMetaData( CASE WHEN COLUMN_KEY = 'PRI' THEN 'YES' ELSE 'NO' END as IsPrimaryKey, CASE WHEN EXTRA like '%auto_increment%' THEN 'YES' ELSE 'NO' END as IsIdentity, CASE WHEN IS_NULLABLE = 'YES' THEN 'YES' ELSE 'NO' END as IsNullable, - CASE WHEN DATA_TYPE = 'enum' THEN true ELSE false END as IsEnum + CASE WHEN DATA_TYPE = 'enum' THEN true ELSE false END as IsEnum${ + table + ? '' + : `, + TABLE_NAME as table_name` + } FROM - INFORMATION_SCHEMA.COLUMNS - WHERE + INFORMATION_SCHEMA.COLUMNS${ + table + ? ` + WHERE TABLE_NAME = '${table.split('.').reverse()[0]}' AND TABLE_SCHEMA = '${ - table.split('.').reverse()[1] ?? resourceObj?.database ?? '' - }' - ORDER BY + table.split('.').reverse()[1] ?? resourceObj?.database ?? '' + }'` + : ` + WHERE + TABLE_SCHEMA NOT IN ('mysql', 'performance_schema', 'information_schema', 'sys')` + } + ORDER BY + TABLE_NAME, ORDINAL_POSITION; ` } else if (resourceType === 'postgresql') { - code = ` - SELECT + return ` + SELECT a.attname as field, pg_catalog.format_type(a.atttypid, a.atttypmod) as DataType, (SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid, true) for 128) @@ -110,17 +207,32 @@ export async function loadTableMetaData( END as IsNullable, (SELECT true FROM pg_catalog.pg_enum e - WHERE e.enumtypid = a.atttypid FETCH FIRST ROW ONLY) as IsEnum - FROM pg_catalog.pg_attribute a + WHERE e.enumtypid = a.atttypid FETCH FIRST ROW ONLY) as IsEnum${ + table + ? '' + : `, + ns.nspname AS schema_name, + c.relname AS table_name` + } + FROM pg_catalog.pg_attribute a${ + table + ? ` WHERE a.attrelid = (SELECT c.oid FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace ns ON c.relnamespace = ns.oid WHERE relname = '${ table.split('.').reverse()[0] }' AND ns.nspname = '${table.split('.').reverse()[1] ?? 'public'}') AND a.attnum > 0 AND NOT a.attisdropped - ORDER BY a.attnum; + ` + : ` + JOIN pg_catalog.pg_class c ON a.attrelid = c.oid + JOIN pg_catalog.pg_namespace ns ON c.relnamespace = ns.oid + WHERE c.relkind = 'r' AND a.attnum > 0 AND NOT a.attisdropped + AND ns.nspname != 'pg_catalog' AND ns.nspname != 'information_schema'` + } + ORDER BY ${table ? 'a.attnum' : 'ns.nspname, c.relname, a.attnum'}; ` } else if (resourceType === 'ms_sql_server') { - code = ` + return ` SELECT COLUMN_NAME as field, DATA_TYPE as DataType, @@ -128,32 +240,52 @@ export async function loadTableMetaData( CASE WHEN COLUMNPROPERTY(OBJECT_ID(TABLE_NAME), COLUMN_NAME, 'IsIdentity') = 1 THEN 'By Default' ELSE 'No' END as IsIdentity, CASE WHEN COLUMNPROPERTY(OBJECT_ID(TABLE_NAME), COLUMN_NAME, 'IsIdentity') = 1 THEN 1 ELSE 0 END as IsPrimaryKey, -- This line still needs correction for primary key identification CASE WHEN IS_NULLABLE = 'YES' THEN 'YES' ELSE 'NO' END as IsNullable, - CASE WHEN DATA_TYPE = 'enum' THEN 1 ELSE 0 END as IsEnum + CASE WHEN DATA_TYPE = 'enum' THEN 1 ELSE 0 END as IsEnum${ + table + ? '' + : `, + TABLE_NAME as table_name` + } FROM - INFORMATION_SCHEMA.COLUMNS + INFORMATION_SCHEMA.COLUMNS${ + table + ? ` WHERE - TABLE_NAME = '${table}' + TABLE_NAME = '${table}'` + : '' + } ORDER BY ORDINAL_POSITION; - ` } else if (resourceType === 'snowflake' || resourceType === 'snowflake_oauth') { - code = ` + return ` select COLUMN_NAME as field, DATA_TYPE as DataType, COLUMN_DEFAULT as DefaultValue, CASE WHEN COLUMN_DEFAULT like 'AUTOINCREMENT%' THEN 'By Default' ELSE 'No' END as IsIdentity, CASE WHEN COLUMN_DEFAULT like 'AUTOINCREMENT%' THEN 1 ELSE 0 END as IsPrimaryKey, CASE WHEN IS_NULLABLE = 'YES' THEN 'YES' ELSE 'NO' END as IsNullable, - CASE WHEN DATA_TYPE = 'enum' THEN 1 ELSE 0 END as IsEnum - from information_schema.columns + CASE WHEN DATA_TYPE = 'enum' THEN 1 ELSE 0 END as IsEnum${ + table + ? '' + : `, + table_name as table_name, + table_schema as schema_name` + } + from information_schema.columns${ + table + ? ` where table_name = '${table.split('.').reverse()[0]}' and table_schema = '${ - table.split('.').reverse()[1] ?? 'PUBLIC' - }' + table.split('.').reverse()[1] ?? 'PUBLIC' + }'` + : "\nwhere table_schema <> 'INFORMATION_SCHEMA'\n" + } order by ORDINAL_POSITION; ` } else if (resourceType === 'bigquery') { - code = `SELECT + // TODO: find a solution for this (query uses hardcoded dataset name) + if (!table) throw new Error('Table name is required for BigQuery') + return `SELECT c.COLUMN_NAME as field, DATA_TYPE as DataType, CASE WHEN COLUMN_DEFAULT = 'NULL' THEN '' ELSE COLUMN_DEFAULT END as DefaultValue, @@ -164,58 +296,14 @@ ORDER BY FROM ${table.split('.')[0]}.INFORMATION_SCHEMA.COLUMNS c LEFT JOIN - test_dataset.INFORMATION_SCHEMA.KEY_COLUMN_USAGE p + ${table.split('.')[0]}.INFORMATION_SCHEMA.KEY_COLUMN_USAGE p on c.table_name = p.table_name AND c.column_name = p.COLUMN_NAME WHERE - c.TABLE_NAME = "${table.split('.')[1]}" + c.TABLE_NAME = '${table.split('.')[1]}' order by c.ORDINAL_POSITION;` } else { throw new Error('Unsupported database type:' + resourceType) } - - const maxRetries = 3 - let attempts = 0 - - while (attempts < maxRetries) { - try { - const job = await JobService.runScriptPreview({ - workspace: workspace, - requestBody: { - language: getLanguageByResourceType(resourceType), - content: code, - args: { - database: resource - } - } - }) - - await new Promise((resolve) => setTimeout(resolve, 3000)) - - const testResult = (await JobService.getCompletedJob({ - workspace: workspace, - id: job - })) as any - - if (testResult.success) { - attempts = maxRetries - - if (resourceType === 'ms_sql_server') { - return lowercaseKeys(testResult.result[0]) - } else { - return lowercaseKeys(testResult.result) - } - } else { - attempts++ - } - } catch (error) { - attempts++ - } - // Exponential back-off - await new Promise((resolve) => setTimeout(resolve, 2000 * attempts)) - } - - console.error('Failed to load table metadata after maximum retries.') - return undefined } export function resourceTypeToLang(rt: string) { @@ -226,14 +314,12 @@ export function resourceTypeToLang(rt: string) { } } -function lowercaseKeys(arr: Array>): Array { - return arr.map((obj) => { - const newObj = {} - Object.keys(obj).forEach((key) => { - newObj[key.toLowerCase()] = obj[key] - }) - return newObj +function lowercaseKeys(obj: Record): any { + const newObj = {} + Object.keys(obj).forEach((key) => { + newObj[key.toLowerCase()] = obj[key] }) + return newObj } const scripts: Record< @@ -569,7 +655,9 @@ export function formatGraphqlSchema(schema: IntrospectionQuery): string { return printSchema(buildClientSchema(schema)) } -export type DbType = 'mysql' | 'ms_sql_server' | 'postgresql' | 'snowflake' | 'bigquery' +export type DbType = (typeof dbTypes)[number] +export const dbTypes = ['mysql', 'ms_sql_server', 'postgresql', 'snowflake', 'bigquery'] as const +export const isDbType = (str?: string): str is DbType => !!str && dbTypes.includes(str as DbType) export function buildVisibleFieldList(columnDefs: ColumnDef[], dbType: DbType) { // Filter out hidden columns to avoid counting the wrong number of rows @@ -714,3 +802,13 @@ export async function getTablesByResource( return [] } } + +export function dbSupportsSchemas(dbType: DbType): boolean { + return dbType === 'postgresql' || dbType === 'snowflake' || dbType === 'bigquery' +} + +export function datatypeHasLength(datatype: string): boolean { + datatype = datatype.toLowerCase() + const lengthDataTypes = ['varchar', 'char', 'nvarchar', 'nchar', 'varbinary', 'binary', 'bit'] + return lengthDataTypes.some((type) => datatype === type) +} diff --git a/frontend/src/lib/components/apps/components/display/table/utils.ts b/frontend/src/lib/components/apps/components/display/table/utils.ts index 038a2c5480..f3a2c93bb3 100644 --- a/frontend/src/lib/components/apps/components/display/table/utils.ts +++ b/frontend/src/lib/components/apps/components/display/table/utils.ts @@ -2,7 +2,12 @@ * Base class for embedding a svelte component within an AGGrid call. * See: https://stackoverflow.com/a/72608215 */ -import type { ICellRendererComp, ICellRendererParams } from 'ag-grid-community' +import type { ColDef, ColGroupDef, ICellRendererComp, ICellRendererParams } from 'ag-grid-community' +import { ColumnIdentity, type ColumnDef } from '../dbtable/utils' +import type { TableAction } from '$lib/components/apps/editor/component' +import { mount, unmount } from 'svelte' +import { Button } from '$lib/components/common' +import { Trash2 } from 'lucide-svelte' /** * Class for defining a cell renderer. @@ -110,3 +115,139 @@ export function defaultCellRenderer(cellRendererType: string) { return undefined } } + +export function transformColumnDefs({ + columnDefs, + actions, + customActionsHeader, + wrapActions, + tableActionsFactory, + onDelete, + onInvalidColumnDefs +}: { + columnDefs: ColumnDef[] + actions?: TableAction[] + customActionsHeader?: string + wrapActions?: boolean + tableActionsFactory?: ReturnType + onDelete?: (values: object) => void + onInvalidColumnDefs?: (errors: string[]) => void +}): (ColDef | ColGroupDef)[] { + if (!columnDefs) { + return [] + } + + const { isValid, errors } = validateColumnDefs(columnDefs) + + if (!isValid) { + onInvalidColumnDefs?.(errors) + return [] + } + + let r: any[] = columnDefs?.filter((x) => x && !x.ignored) ?? [] + + if (onDelete) { + r.push({ + field: 'delete', + headerName: 'Delete', + cellRenderer: cellRendererFactory((c, p) => { + const btnComponent = mount(Button, { + target: c.eGui, + props: { + btnClasses: 'w-12', + wrapperClasses: 'flex justify-end items-center h-full', + color: 'light', + size: 'sm', + variant: 'contained', + iconOnly: true, + startIcon: { icon: Trash2 }, + nonCaptureEvent: true + } + }) + return { + destroy: () => { + unmount(btnComponent) + }, + refresh(params) { + // + } + } + }), + cellRendererParams: { + onClick: (e) => { + onDelete?.(e) + } + }, + lockPosition: 'right', + editable: false, + flex: 0, + width: 100 + }) + } + + if (actions?.length) { + r.push({ + headerName: customActionsHeader ?? 'Actions', + cellRenderer: tableActionsFactory, + autoHeight: true, + cellStyle: { textAlign: 'center' }, + cellClass: 'grid-cell-centered', + lockPosition: 'right', + + ...(!wrapActions ? { minWidth: 130 * actions?.length } : {}) + }) + } + + return r.map((fields) => { + let cr = defaultCellRenderer(fields.cellRendererType) + return { + ...fields, + ...(cr ? { cellRenderer: cr } : {}) + } + }) +} + +export function validateColumnDefs(columnDefs: ColumnDef[]): { + isValid: boolean + errors: string[] +} { + let isValid = true + const errors: string[] = [] + + if (!Array.isArray(columnDefs)) { + return { isValid: false, errors: ['Column definitions must be an array.'] } + } + + // Validate each column definition + columnDefs.forEach((colDef, index) => { + let noField = !colDef.field || typeof colDef.field !== 'string' || colDef.field.trim() === '' + + if ( + (colDef.isidentity === ColumnIdentity.ByDefault || + colDef.isidentity === ColumnIdentity.Always) && + colDef.hideInsert == undefined + ) { + colDef.hideInsert = true + } + + // Check if 'field' property exists and is a non-empty string + if (noField && !(colDef.children && Array.isArray(colDef.children))) { + isValid = false + errors.push( + `Column at index ${index} is missing a valid 'field' property nor having any children.` + ) + } + + if (colDef.children && Array.isArray(colDef.children)) { + const { isValid: isChildrenValid, errors: childrenErrors } = validateColumnDefs( + colDef.children + ) + if (!isChildrenValid) { + isValid = false + errors.push(...childrenErrors.map((err) => `Error in children at index ${index}: ${err}`)) + } + } + }) + + return { isValid, errors } +} diff --git a/frontend/src/lib/components/common/CloseButton.svelte b/frontend/src/lib/components/common/CloseButton.svelte index 7bed98a57d..fea765e3ef 100644 --- a/frontend/src/lib/components/common/CloseButton.svelte +++ b/frontend/src/lib/components/common/CloseButton.svelte @@ -6,12 +6,13 @@ export let noBg = false export let small: boolean = false + export let Icon: any | undefined = undefined const dispatch = createEventDispatcher() -
+
+ +
+ +
{/if} From 8ad730b290342508db5029b3b1a2215a07e4e6db Mon Sep 17 00:00:00 2001 From: Alexander Petric Date: Thu, 1 May 2025 13:46:52 -0400 Subject: [PATCH 332/739] extra logging for agent_token flake (#5693) * extra logging for agent_token flake * extra logging for agent_token flake --- integration_tests/test/agent_workers.py | 1 + integration_tests/test/wmill_integration_test_utils.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/integration_tests/test/agent_workers.py b/integration_tests/test/agent_workers.py index 82a2cf3b52..4b0c616433 100644 --- a/integration_tests/test/agent_workers.py +++ b/integration_tests/test/agent_workers.py @@ -163,6 +163,7 @@ class TestAgentWorkers(unittest.TestCase): def test_create_agent_token(self): token = self._agent_token + print(f"Agent token tests for token: {token}") self.assertIsNotNone(token) # JWT tokens have the format: jwt_agent__ diff --git a/integration_tests/test/wmill_integration_test_utils.py b/integration_tests/test/wmill_integration_test_utils.py index bb4b2ffe22..b817cd4659 100644 --- a/integration_tests/test/wmill_integration_test_utils.py +++ b/integration_tests/test/wmill_integration_test_utils.py @@ -415,5 +415,5 @@ class WindmillClient: raise Exception(response.content.decode()) token = response.content.decode().strip('"') - print(f"Created agent token: {token[:15]}...{token[-15:]}") + print(f"Created agent token: {token}") return token From 7eb9d7d46cb48ae69a3fd3ff852a57abae450a3b Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Fri, 2 May 2025 00:37:28 +0200 Subject: [PATCH 333/739] fix: do not track relative deps for scripts with raw defined deps from CLI (#5696) --- ...f7f99067a05e9dfe270223164db8a1df2e4b.json} | 4 +- backend/src/monitor.rs | 4 +- backend/windmill-api/src/scripts.rs | 11 ++- backend/windmill-api/src/tracing_init.rs | 2 + backend/windmill-worker/src/bun_executor.rs | 19 ++++-- .../windmill-worker/src/python_executor.rs | 11 ++- .../windmill-worker/src/worker_lockfiles.rs | 67 ++++++++++++++----- 7 files changed, 92 insertions(+), 26 deletions(-) rename backend/.sqlx/{query-33c1793e55b1127d88d2509aadd0eb04e042463200f237b4c2cb176612fa16fe.json => query-92faee8714a45a403b623e04d789f7f99067a05e9dfe270223164db8a1df2e4b.json} (51%) diff --git a/backend/.sqlx/query-33c1793e55b1127d88d2509aadd0eb04e042463200f237b4c2cb176612fa16fe.json b/backend/.sqlx/query-92faee8714a45a403b623e04d789f7f99067a05e9dfe270223164db8a1df2e4b.json similarity index 51% rename from backend/.sqlx/query-33c1793e55b1127d88d2509aadd0eb04e042463200f237b4c2cb176612fa16fe.json rename to backend/.sqlx/query-92faee8714a45a403b623e04d789f7f99067a05e9dfe270223164db8a1df2e4b.json index 8728e35a0c..7df22ca7b7 100644 --- a/backend/.sqlx/query-33c1793e55b1127d88d2509aadd0eb04e042463200f237b4c2cb176612fa16fe.json +++ b/backend/.sqlx/query-92faee8714a45a403b623e04d789f7f99067a05e9dfe270223164db8a1df2e4b.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "INSERT INTO log_file (hostname, mode, worker_group, log_ts, file_path, ok_lines, err_lines, json_fmt) VALUES ($1, $2::text::LOG_MODE, $3, $4, $5, $6, $7, $8)", + "query": "INSERT INTO log_file (hostname, mode, worker_group, log_ts, file_path, ok_lines, err_lines, json_fmt)\n VALUES ($1, $2::text::LOG_MODE, $3, $4, $5, $6, $7, $8)\n ON CONFLICT (hostname, log_ts) DO UPDATE SET ok_lines = log_file.ok_lines + $6, err_lines = log_file.err_lines + $7", "describe": { "columns": [], "parameters": { @@ -17,5 +17,5 @@ }, "nullable": [] }, - "hash": "33c1793e55b1127d88d2509aadd0eb04e042463200f237b4c2cb176612fa16fe" + "hash": "92faee8714a45a403b623e04d789f7f99067a05e9dfe270223164db8a1df2e4b" } diff --git a/backend/src/monitor.rs b/backend/src/monitor.rs index 7366cb4f53..5d1532c216 100644 --- a/backend/src/monitor.rs +++ b/backend/src/monitor.rs @@ -638,7 +638,9 @@ async fn send_log_file_to_object_store( let (ok_lines, err_lines) = read_log_counters(ts_str); if let Some(db) = conn.as_sql() { - if let Err(e) = sqlx::query!("INSERT INTO log_file (hostname, mode, worker_group, log_ts, file_path, ok_lines, err_lines, json_fmt) VALUES ($1, $2::text::LOG_MODE, $3, $4, $5, $6, $7, $8)", + if let Err(e) = sqlx::query!("INSERT INTO log_file (hostname, mode, worker_group, log_ts, file_path, ok_lines, err_lines, json_fmt) + VALUES ($1, $2::text::LOG_MODE, $3, $4, $5, $6, $7, $8) + ON CONFLICT (hostname, log_ts) DO UPDATE SET ok_lines = log_file.ok_lines + $6, err_lines = log_file.err_lines + $7", hostname, mode.to_string(), worker_group.clone(), ts, highest_file, ok_lines as i64, err_lines as i64, *JSON_FMT) .execute(db) .await { diff --git a/backend/windmill-api/src/scripts.rs b/backend/windmill-api/src/scripts.rs index a1ca9c3322..aeb3686d0b 100644 --- a/backend/windmill-api/src/scripts.rs +++ b/backend/windmill-api/src/scripts.rs @@ -650,8 +650,13 @@ async fn create_script_internal<'c>( ) { Some(String::new()) } else { - ns.lock - .and_then(|e| if e.is_empty() { None } else { Some(e) }) + ns.lock.as_ref().and_then(|e| { + if e.is_empty() { + None + } else { + Some(e.to_string()) + } + }) }; let needs_lock_gen = lock.is_none() && codebase.is_none(); @@ -901,6 +906,7 @@ async fn create_script_internal<'c>( let permissioned_as2 = permissioned_as.clone(); let script_path2 = script_path.clone(); let parent_path = p_path_opt.clone(); + let lock = ns.lock.clone(); let deployment_message = ns.deployment_message.clone(); let content = ns.content.clone(); let language = ns.language.clone(); @@ -920,6 +926,7 @@ async fn create_script_internal<'c>( &authed2.email, &authed2.username, &permissioned_as2, + lock, ) .await { diff --git a/backend/windmill-api/src/tracing_init.rs b/backend/windmill-api/src/tracing_init.rs index 9f34e93592..c5c841b2dc 100644 --- a/backend/windmill-api/src/tracing_init.rs +++ b/backend/windmill-api/src/tracing_init.rs @@ -33,6 +33,8 @@ impl OnResponse for MyOnResponse { let status = response.status().as_u16(); if response.status().is_success() || response.status().is_redirection() { tracing::info!(latency = latency, status = status, "response") + } else if response.status().as_u16() == 404 { + tracing::warn!(latency = latency, status = status, "response") } else { tracing::error!(latency = latency, status = status, "response") } diff --git a/backend/windmill-worker/src/bun_executor.rs b/backend/windmill-worker/src/bun_executor.rs index 91284c9d41..6a6ad120e7 100644 --- a/backend/windmill-worker/src/bun_executor.rs +++ b/backend/windmill-worker/src/bun_executor.rs @@ -42,7 +42,7 @@ use windmill_common::{ error::{self, Result}, get_latest_hash_for_path, scripts::ScriptLang, - worker::{exists_in_cache, save_cache, write_file, Connection, DISABLE_BUNDLING}, + worker::{exists_in_cache, save_cache, to_raw_value, write_file, Connection, DISABLE_BUNDLING}, DB, }; @@ -111,7 +111,7 @@ pub async fn gen_bun_lockfile( let mut empty_deps = false; - if let Some(raw_deps) = raw_deps { + if let Some(raw_deps) = raw_deps.as_ref() { gen_bunfig(job_dir).await?; write_file(job_dir, "package.json", raw_deps.as_str())?; } else { @@ -201,10 +201,21 @@ pub async fn gen_bun_lockfile( } if export_pkg { - let mut content = "".to_string(); + let mut content; { let mut file = File::open(format!("{job_dir}/package.json")).await?; - file.read_to_string(&mut content).await?; + let mut buf = String::default(); + file.read_to_string(&mut buf).await?; + if raw_deps.is_some() { + let mut json_map: HashMap> = serde_json::from_str(&buf)?; + json_map.insert( + "generatedFromPackageJson".to_string(), + to_raw_value(&"true".to_string()), + ); + content = serde_json::to_string_pretty(&json_map)?; + } else { + content = buf; + } } if !npm_mode { #[cfg(any(target_os = "linux", target_os = "macos"))] diff --git a/backend/windmill-worker/src/python_executor.rs b/backend/windmill-worker/src/python_executor.rs index c642abae49..a776bbe7c7 100644 --- a/backend/windmill-worker/src/python_executor.rs +++ b/backend/windmill-worker/src/python_executor.rs @@ -77,6 +77,7 @@ use crate::{ start_child_process, OccupancyMetrics, }, handle_child::handle_child, + worker_lockfiles::LOCKFILE_GENERATED_FROM_REQUIREMENTS_TXT, worker_utils::ping_job_status, AuthedClient, DISABLE_NSJAIL, DISABLE_NUSER, HOME_ENV, INSTANCE_PYTHON_VERSION, NSJAIL_PATH, PATH_ENV, PIP_EXTRA_INDEX_URL, PIP_INDEX_URL, PROXY_ENVS, PY_INSTALL_DIR, TZ_ENV, UV_CACHE_DIR, @@ -2303,8 +2304,16 @@ fn split_requirements(requirements: &str) -> Vec<&str> { /// Check requirements/lockfile to figure out python version assigned to it. fn get_pyv_from_requirements_lines(requirements_lines: &[&str]) -> PyVersion { // If script is deployed we can try to parse first line to get assigned version + + let index = if requirements_lines.get(0).map_or(false, |line| { + line.starts_with(LOCKFILE_GENERATED_FROM_REQUIREMENTS_TXT) + }) { + 1 + } else { + 0 + }; if let Some(v) = requirements_lines - .get(0) + .get(index) .and_then(|line| PyVersion::parse_version(*line)) { // We have valid assigned version, we use it diff --git a/backend/windmill-worker/src/worker_lockfiles.rs b/backend/windmill-worker/src/worker_lockfiles.rs index 7db2640a92..82ad8cc77b 100644 --- a/backend/windmill-worker/src/worker_lockfiles.rs +++ b/backend/windmill-worker/src/worker_lockfiles.rs @@ -65,17 +65,17 @@ pub async fn update_script_dependency_map( relative_imports: Vec, ) -> error::Result<()> { let importer_kind = "script"; + + let mut tx = db.begin().await?; + tx = clear_dependency_parent_path(parent_path, script_path, w_id, importer_kind, tx).await?; + + tx = clear_dependency_map_for_item(script_path, w_id, importer_kind, tx, &None).await?; + if !relative_imports.is_empty() { let mut logs = "".to_string(); logs.push_str("\n--- RELATIVE IMPORTS ---\n\n"); logs.push_str(&relative_imports.join("\n")); - let mut tx = db.begin().await?; - tx = - clear_dependency_parent_path(parent_path, script_path, w_id, importer_kind, tx).await?; - - tx = clear_dependency_map_for_item(script_path, w_id, importer_kind, tx, &None).await?; - tx = add_relative_imports_to_dependency_map( script_path, w_id, @@ -86,9 +86,10 @@ pub async fn update_script_dependency_map( None, ) .await?; - tx.commit().await?; append_logs(job_id, w_id, logs, &db.into()).await; } + tx.commit().await?; + Ok(()) } @@ -381,6 +382,7 @@ pub async fn handle_dependency_job( &job.permissioned_as_email, &job.created_by, &job.permissioned_as, + None, ) .await?; @@ -433,18 +435,42 @@ pub async fn process_relative_imports( permissioned_as_email: &str, created_by: &str, permissioned_as: &str, + lock: Option, ) -> error::Result<()> { let relative_imports = extract_relative_imports(&code, script_path, script_lang); if let Some(relative_imports) = relative_imports { - update_script_dependency_map( - &job_id.unwrap_or_else(|| Uuid::nil()), - db, - w_id, - &parent_path, - script_path, - relative_imports, - ) - .await?; + if (script_lang.is_some_and(|v| v == ScriptLang::Bun) + && lock + .as_ref() + .is_some_and(|v| v.contains("generatedFromPackageJson"))) + || (script_lang.is_some_and(|v| v == ScriptLang::Python3) + && lock + .as_ref() + .is_some_and(|v| v.starts_with(LOCKFILE_GENERATED_FROM_REQUIREMENTS_TXT))) + { + // if the lock file is generated from a package.json/requirements.txt, we need to clear the dependency map + // because we do not want to have dependencies be recomputed automatically. Empty relative imports passed + // to update_script_dependency_map will clear the dependency map. + update_script_dependency_map( + &job_id.unwrap_or_else(|| Uuid::nil()), + db, + w_id, + &parent_path, + script_path, + vec![], + ) + .await?; + } else { + update_script_dependency_map( + &job_id.unwrap_or_else(|| Uuid::nil()), + db, + w_id, + &parent_path, + script_path, + relative_imports, + ) + .await?; + } let already_visited = args .map(|x| { x.get("already_visited") @@ -2050,6 +2076,8 @@ async fn ansible_dep( serde_json::to_string(&ansible_lockfile).map_err(|e| e.into()) } +pub const LOCKFILE_GENERATED_FROM_REQUIREMENTS_TXT: &str = "# from requirements.txt"; + async fn capture_dependency_job( job_id: &Uuid, job_language: &ScriptLang, @@ -2118,6 +2146,13 @@ async fn capture_dependency_job( anns, ) .await + .map(|res| { + if raw_deps { + format!("{}\n{}", LOCKFILE_GENERATED_FROM_REQUIREMENTS_TXT, res) + } else { + res + } + }) } } ScriptLang::Ansible => { From d103f5a46636ec430951acbde1abcd2733724f99 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Fri, 2 May 2025 00:58:16 +0200 Subject: [PATCH 334/739] chore(main): release 1.486.0 (#5690) * chore(main): release 1.486.0 * Apply automatic changes --------- Co-authored-by: rubenfiszel <275584+rubenfiszel@users.noreply.github.com> --- CHANGELOG.md | 16 ++ backend/Cargo.lock | 198 ++++++++---------- backend/Cargo.toml | 4 +- backend/windmill-api/openapi.yaml | 2 +- benchmarks/lib.ts | 2 +- cli/main.ts | 2 +- frontend/package-lock.json | 4 +- frontend/package.json | 2 +- lsp/Pipfile | 4 +- openflow.openapi.yaml | 2 +- .../WindmillClient/WindmillClient.psd1 | 2 +- python-client/wmill/pyproject.toml | 2 +- python-client/wmill_pg/pyproject.toml | 2 +- typescript-client/jsr.json | 2 +- typescript-client/package.json | 2 +- version.txt | 2 +- 16 files changed, 125 insertions(+), 123 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 64479c5036..b99328489d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,21 @@ # Changelog +## [1.486.0](https://github.com/windmill-labs/windmill/compare/v1.485.3...v1.486.0) (2025-05-01) + + +### Features + +* add run now directly on schedule drawer and duplicate schedule option ([#5674](https://github.com/windmill-labs/windmill/issues/5674)) ([dfb947f](https://github.com/windmill-labs/windmill/commit/dfb947ff37c688f54a32de5aa3c5c3d142cb80f4)) +* Database Manager ([#5586](https://github.com/windmill-labs/windmill/issues/5586)) ([41c15fc](https://github.com/windmill-labs/windmill/commit/41c15fc78aaf844c559d3d6c772e04ecce436e9d)) +* Integrate MCP with hub ([#5685](https://github.com/windmill-labs/windmill/issues/5685)) ([ec701a9](https://github.com/windmill-labs/windmill/commit/ec701a9ee74c9d890b54234362392deca63a77c7)) + + +### Bug Fixes + +* Ai Chat: do not send tools if empty + respond even if tool fails ([#5692](https://github.com/windmill-labs/windmill/issues/5692)) ([9c55040](https://github.com/windmill-labs/windmill/commit/9c55040e47e76af8b7e2864b82fa30505545dcb5)) +* do not track relative deps for scripts with raw defined deps from CLI ([#5696](https://github.com/windmill-labs/windmill/issues/5696)) ([7eb9d7d](https://github.com/windmill-labs/windmill/commit/7eb9d7d46cb48ae69a3fd3ff852a57abae450a3b)) +* improve CLI file scanning performances ([0916978](https://github.com/windmill-labs/windmill/commit/09169784bd2d0ab7acf5f40dc86f36f1cae967b7)) + ## [1.485.3](https://github.com/windmill-labs/windmill/compare/v1.485.2...v1.485.3) (2025-04-29) diff --git a/backend/Cargo.lock b/backend/Cargo.lock index 4ebb9a7a9a..8a358f0aa4 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -634,7 +634,7 @@ dependencies = [ "serde", "serde-aux", "serde_json", - "sha2 0.10.8", + "sha2 0.10.9", "thiserror 1.0.69", "url", ] @@ -938,7 +938,7 @@ dependencies = [ "http 0.2.12", "http 1.3.1", "percent-encoding", - "sha2 0.10.8", + "sha2 0.10.9", "time", "tracing", ] @@ -2727,7 +2727,7 @@ dependencies = [ "md-5 0.10.6", "rand 0.8.5", "regex", - "sha2 0.10.8", + "sha2 0.10.9", "unicode-segmentation", "uuid", ] @@ -2966,7 +2966,7 @@ dependencies = [ "deno_error", "rusqlite", "serde", - "sha2 0.10.8", + "sha2 0.10.9", "thiserror 2.0.12", "tokio", ] @@ -2994,7 +2994,7 @@ dependencies = [ "parking_lot 0.12.3", "serde", "serde_json", - "sha2 0.10.8", + "sha2 0.10.9", "sys_traits", "thiserror 1.0.69", "url", @@ -3142,7 +3142,7 @@ dependencies = [ "serde", "serde_bytes", "sha1", - "sha2 0.10.8", + "sha2 0.10.9", "signature", "spki", "thiserror 2.0.12", @@ -3511,7 +3511,7 @@ dependencies = [ "sec1", "serde", "sha1", - "sha2 0.10.8", + "sha2 0.10.9", "sha3", "signature", "simd-json", @@ -4322,7 +4322,7 @@ dependencies = [ "num-traits", "pkcs8", "rfc6979", - "sha2 0.10.8", + "sha2 0.10.9", "signature", "zeroize", ] @@ -4433,7 +4433,7 @@ dependencies = [ "ed25519", "rand_core 0.6.4", "serde", - "sha2 0.10.8", + "sha2 0.10.9", "signature", "subtle", "zeroize", @@ -4689,7 +4689,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ce92ff622d6dadf7349484f42c93271a0d49b7cc4d466a936405bacbe10aa78" dependencies = [ "cfg-if", - "rustix 1.0.5", + "rustix 1.0.7", "windows-sys 0.59.0", ] @@ -5474,7 +5474,7 @@ checksum = "dcf29e94d6d243368b7a56caa16bc213e4f9f8ed38c4d9557069527b5d5281ca" dependencies = [ "bitflags 2.9.0", "gpu-descriptor-types", - "hashbrown 0.15.2", + "hashbrown 0.15.3", ] [[package]] @@ -5589,9 +5589,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" dependencies = [ "allocator-api2", "equivalent", @@ -5624,7 +5624,7 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" dependencies = [ - "hashbrown 0.15.2", + "hashbrown 0.15.3", ] [[package]] @@ -5774,17 +5774,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "hostname" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56f203cd1c76362b69e3863fd987520ac36cf70a8c92627449b2f64a8cf7d65" -dependencies = [ - "cfg-if", - "libc", - "windows-link", -] - [[package]] name = "hstr" version = "0.2.17" @@ -6290,7 +6279,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" dependencies = [ "equivalent", - "hashbrown 0.15.2", + "hashbrown 0.15.3", "serde", ] @@ -6550,7 +6539,7 @@ dependencies = [ "ecdsa", "elliptic-curve", "once_cell", - "sha2 0.10.8", + "sha2 0.10.9", "signature", ] @@ -6920,7 +6909,7 @@ version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown 0.15.2", + "hashbrown 0.15.3", ] [[package]] @@ -6929,7 +6918,7 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f8cc7106155f10bdf99a6f379688f543ad6596a415375b36a59a054ceda1198" dependencies = [ - "hashbrown 0.15.2", + "hashbrown 0.15.3", ] [[package]] @@ -7477,7 +7466,7 @@ dependencies = [ "serde", "serde_json", "sha1", - "sha2 0.10.8", + "sha2 0.10.9", "thiserror 2.0.12", "uuid", ] @@ -8009,7 +7998,7 @@ dependencies = [ "serde", "serde_json", "serde_path_to_error", - "sha2 0.10.8", + "sha2 0.10.9", "thiserror 1.0.69", "url", ] @@ -8162,7 +8151,7 @@ dependencies = [ "serde_path_to_error", "serde_plain", "serde_with", - "sha2 0.10.8", + "sha2 0.10.9", "subtle", "thiserror 1.0.69", "url", @@ -8211,9 +8200,9 @@ dependencies = [ [[package]] name = "openssl-sys" -version = "0.9.107" +version = "0.9.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8288979acd84749c744a9014b4382d42b8f7b2592847b5afb2ed29e5d16ede07" +checksum = "e145e1651e858e820e4860f7b9c5e169bc1d8ce1c86043be79fa7b7634821847" dependencies = [ "cc", "libc", @@ -8416,7 +8405,7 @@ dependencies = [ "ecdsa", "elliptic-curve", "primeorder", - "sha2 0.10.8", + "sha2 0.10.9", ] [[package]] @@ -8428,7 +8417,7 @@ dependencies = [ "ecdsa", "elliptic-curve", "primeorder", - "sha2 0.10.8", + "sha2 0.10.9", ] [[package]] @@ -8440,7 +8429,7 @@ dependencies = [ "ecdsa", "elliptic-curve", "primeorder", - "sha2 0.10.8", + "sha2 0.10.9", ] [[package]] @@ -8454,7 +8443,7 @@ dependencies = [ "elliptic-curve", "primeorder", "rand_core 0.6.4", - "sha2 0.10.8", + "sha2 0.10.9", ] [[package]] @@ -8776,7 +8765,7 @@ dependencies = [ "der", "pbkdf2", "scrypt", - "sha2 0.10.8", + "sha2 0.10.9", "spki", ] @@ -8865,7 +8854,7 @@ dependencies = [ "md-5 0.10.6", "memchr", "rand 0.8.5", - "sha2 0.10.8", + "sha2 0.10.9", "stringprep", ] @@ -8883,7 +8872,7 @@ dependencies = [ "md-5 0.10.6", "memchr", "rand 0.9.0", - "sha2 0.10.8", + "sha2 0.10.9", "stringprep", ] @@ -9249,7 +9238,7 @@ checksum = "287e56aac5a2b4fb25a6fb050961d157635924c8696305a5c937a76f29841a0f" dependencies = [ "ahash 0.8.11", "equivalent", - "hashbrown 0.15.2", + "hashbrown 0.15.3", "parking_lot 0.12.3", ] @@ -9295,9 +9284,9 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.11" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "541d0f57c6ec747a90738a52741d3221f7960e8ac2f0ff4b1a63680e033b4ab5" +checksum = "ee4e529991f949c5e25755532370b8af5d114acae52326361d68d47af64aa842" dependencies = [ "cfg_aliases 0.2.1", "libc", @@ -9755,12 +9744,9 @@ dependencies = [ [[package]] name = "resolv-conf" -version = "0.7.1" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48375394603e3dd4b2d64371f7148fd8c7baa2680e28741f2cb8d23b59e3d4c4" -dependencies = [ - "hostname", -] +checksum = "fc7c8f7f733062b66dc1c63f9db168ac0b97a9210e247fa90fdc9ad08f51b302" [[package]] name = "retry-policies" @@ -9985,7 +9971,7 @@ version = "7.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d38ff6bf570dc3bb7100fce9f7b60c33fa71d80e88da3f2580df4ff2bdded74" dependencies = [ - "sha2 0.10.8", + "sha2 0.10.9", "walkdir", ] @@ -10076,9 +10062,9 @@ dependencies = [ [[package]] name = "rustix" -version = "1.0.5" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf" +checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" dependencies = [ "bitflags 2.9.0", "errno", @@ -10460,7 +10446,7 @@ dependencies = [ "password-hash", "pbkdf2", "salsa20", - "sha2 0.10.8", + "sha2 0.10.9", ] [[package]] @@ -10783,9 +10769,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.8" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures", @@ -11178,7 +11164,7 @@ dependencies = [ "futures-intrusive", "futures-io", "futures-util", - "hashbrown 0.15.2", + "hashbrown 0.15.3", "hashlink 0.10.0", "indexmap 2.9.0", "log", @@ -11188,7 +11174,7 @@ dependencies = [ "rustls 0.23.26", "serde", "serde_json", - "sha2 0.10.8", + "sha2 0.10.9", "smallvec", "thiserror 2.0.12", "tokio", @@ -11227,7 +11213,7 @@ dependencies = [ "quote", "serde", "serde_json", - "sha2 0.10.8", + "sha2 0.10.9", "sqlx-core", "sqlx-mysql", "sqlx-postgres", @@ -11273,7 +11259,7 @@ dependencies = [ "rsa", "serde", "sha1", - "sha2 0.10.8", + "sha2 0.10.9", "smallvec", "sqlx-core", "stringprep", @@ -11314,7 +11300,7 @@ dependencies = [ "rand 0.8.5", "serde", "serde_json", - "sha2 0.10.8", + "sha2 0.10.9", "smallvec", "sqlx-core", "stringprep", @@ -11914,9 +11900,9 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", @@ -12185,7 +12171,7 @@ dependencies = [ "fastrand", "getrandom 0.3.2", "once_cell", - "rustix 1.0.5", + "rustix 1.0.7", "windows-sys 0.59.0", ] @@ -12204,7 +12190,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "45c6481c4829e4cc63825e62c49186a34538b7b2750b73b266581ffb612fb5ed" dependencies = [ - "rustix 1.0.5", + "rustix 1.0.7", "windows-sys 0.59.0", ] @@ -12689,7 +12675,7 @@ dependencies = [ "futures-io", "futures-sink", "futures-util", - "hashbrown 0.15.2", + "hashbrown 0.15.3", "pin-project-lite", "slab", "tokio", @@ -12758,7 +12744,7 @@ checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" dependencies = [ "indexmap 2.9.0", "toml_datetime", - "winnow 0.7.7", + "winnow 0.7.8", ] [[package]] @@ -13746,18 +13732,18 @@ dependencies = [ [[package]] name = "webpki-root-certs" -version = "0.26.9" +version = "0.26.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180d2741b6115c3d906577e6533ad89472d48d96df00270fccb78233073d77f7" +checksum = "c99403924bc5f23afefc319b8ac67ed0e50669f6e52a413314cccb1fdbc93ba0" dependencies = [ "rustls-pki-types", ] [[package]] name = "webpki-roots" -version = "0.26.9" +version = "0.26.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29aad86cec885cafd03e8305fd727c418e970a521322c91688414d5b8efba16b" +checksum = "37493cadf42a2a939ed404698ded7fb378bf301b5011f973361779a3a74f8c93" dependencies = [ "rustls-pki-types", ] @@ -13919,7 +13905,7 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windmill" -version = "1.485.3" +version = "1.486.0" dependencies = [ "anyhow", "axum", @@ -13943,7 +13929,7 @@ dependencies = [ "serde", "serde_json", "sha1", - "sha2 0.10.8", + "sha2 0.10.9", "sqlx", "tikv-jemalloc-ctl", "tikv-jemalloc-sys", @@ -13966,7 +13952,7 @@ dependencies = [ [[package]] name = "windmill-api" -version = "1.485.3" +version = "1.486.0" dependencies = [ "anyhow", "argon2", @@ -14037,7 +14023,7 @@ dependencies = [ "serde_json", "serde_urlencoded", "sha1", - "sha2 0.10.8", + "sha2 0.10.9", "sql-builder", "sqlx", "tempfile", @@ -14076,7 +14062,7 @@ dependencies = [ [[package]] name = "windmill-api-client" -version = "1.485.3" +version = "1.486.0" dependencies = [ "base64 0.22.1", "chrono", @@ -14091,7 +14077,7 @@ dependencies = [ [[package]] name = "windmill-audit" -version = "1.485.3" +version = "1.486.0" dependencies = [ "chrono", "serde", @@ -14104,7 +14090,7 @@ dependencies = [ [[package]] name = "windmill-autoscaling" -version = "1.485.3" +version = "1.486.0" dependencies = [ "anyhow", "serde", @@ -14118,7 +14104,7 @@ dependencies = [ [[package]] name = "windmill-common" -version = "1.485.3" +version = "1.486.0" dependencies = [ "anyhow", "async-stream", @@ -14163,7 +14149,7 @@ dependencies = [ "semver 1.0.26", "serde", "serde_json", - "sha2 0.10.8", + "sha2 0.10.9", "sqlx", "tar", "tempfile", @@ -14182,7 +14168,7 @@ dependencies = [ [[package]] name = "windmill-git-sync" -version = "1.485.3" +version = "1.486.0" dependencies = [ "regex", "serde", @@ -14196,7 +14182,7 @@ dependencies = [ [[package]] name = "windmill-indexer" -version = "1.485.3" +version = "1.486.0" dependencies = [ "anyhow", "bytes", @@ -14219,7 +14205,7 @@ dependencies = [ [[package]] name = "windmill-macros" -version = "1.485.3" +version = "1.486.0" dependencies = [ "itertools 0.14.0", "lazy_static", @@ -14231,7 +14217,7 @@ dependencies = [ [[package]] name = "windmill-parser" -version = "1.485.3" +version = "1.486.0" dependencies = [ "convert_case 0.6.0", "serde", @@ -14240,7 +14226,7 @@ dependencies = [ [[package]] name = "windmill-parser-bash" -version = "1.485.3" +version = "1.486.0" dependencies = [ "anyhow", "lazy_static", @@ -14252,7 +14238,7 @@ dependencies = [ [[package]] name = "windmill-parser-csharp" -version = "1.485.3" +version = "1.486.0" dependencies = [ "anyhow", "serde_json", @@ -14264,7 +14250,7 @@ dependencies = [ [[package]] name = "windmill-parser-go" -version = "1.485.3" +version = "1.486.0" dependencies = [ "anyhow", "gosyn", @@ -14276,7 +14262,7 @@ dependencies = [ [[package]] name = "windmill-parser-graphql" -version = "1.485.3" +version = "1.486.0" dependencies = [ "anyhow", "lazy_static", @@ -14288,7 +14274,7 @@ dependencies = [ [[package]] name = "windmill-parser-java" -version = "1.485.3" +version = "1.486.0" dependencies = [ "anyhow", "serde_json", @@ -14300,7 +14286,7 @@ dependencies = [ [[package]] name = "windmill-parser-nu" -version = "1.485.3" +version = "1.486.0" dependencies = [ "anyhow", "nu-parser", @@ -14311,7 +14297,7 @@ dependencies = [ [[package]] name = "windmill-parser-php" -version = "1.485.3" +version = "1.486.0" dependencies = [ "anyhow", "itertools 0.14.0", @@ -14322,7 +14308,7 @@ dependencies = [ [[package]] name = "windmill-parser-py" -version = "1.485.3" +version = "1.486.0" dependencies = [ "anyhow", "itertools 0.14.0", @@ -14333,7 +14319,7 @@ dependencies = [ [[package]] name = "windmill-parser-py-imports" -version = "1.485.3" +version = "1.486.0" dependencies = [ "anyhow", "async-recursion", @@ -14353,7 +14339,7 @@ dependencies = [ [[package]] name = "windmill-parser-rust" -version = "1.485.3" +version = "1.486.0" dependencies = [ "anyhow", "convert_case 0.6.0", @@ -14370,7 +14356,7 @@ dependencies = [ [[package]] name = "windmill-parser-sql" -version = "1.485.3" +version = "1.486.0" dependencies = [ "anyhow", "lazy_static", @@ -14382,7 +14368,7 @@ dependencies = [ [[package]] name = "windmill-parser-ts" -version = "1.485.3" +version = "1.486.0" dependencies = [ "anyhow", "lazy_static", @@ -14400,7 +14386,7 @@ dependencies = [ [[package]] name = "windmill-parser-wasm" -version = "1.485.3" +version = "1.486.0" dependencies = [ "anyhow", "getrandom 0.2.16", @@ -14424,7 +14410,7 @@ dependencies = [ [[package]] name = "windmill-parser-yaml" -version = "1.485.3" +version = "1.486.0" dependencies = [ "anyhow", "serde_json", @@ -14434,7 +14420,7 @@ dependencies = [ [[package]] name = "windmill-queue" -version = "1.485.3" +version = "1.486.0" dependencies = [ "anyhow", "async-recursion", @@ -14467,7 +14453,7 @@ dependencies = [ [[package]] name = "windmill-sql-datatype-parser-wasm" -version = "1.485.3" +version = "1.486.0" dependencies = [ "wasm-bindgen", "wasm-bindgen-test", @@ -14477,7 +14463,7 @@ dependencies = [ [[package]] name = "windmill-worker" -version = "1.485.3" +version = "1.486.0" dependencies = [ "anyhow", "async-recursion", @@ -14531,7 +14517,7 @@ dependencies = [ "rust_decimal", "serde", "serde_json", - "sha2 0.10.8", + "sha2 0.10.9", "sqlx", "tar", "tiberius", @@ -15037,9 +15023,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cb8234a863ea0e8cd7284fcdd4f145233eb00fee02bbdd9861aec44e6477bc5" +checksum = "9e27d6ad3dac991091e4d35de9ba2d2d00647c5d0fc26c5496dee55984ae111b" dependencies = [ "memchr", ] @@ -15132,7 +15118,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d65cbf2f12c15564212d48f4e3dfb87923d25d611f2aed18f4cb23f0413d89e" dependencies = [ "libc", - "rustix 1.0.5", + "rustix 1.0.7", ] [[package]] @@ -15192,7 +15178,7 @@ dependencies = [ "proc-macro2", "quote", "syn 2.0.101", - "synstructure 0.13.1", + "synstructure 0.13.2", ] [[package]] @@ -15253,7 +15239,7 @@ dependencies = [ "proc-macro2", "quote", "syn 2.0.101", - "synstructure 0.13.1", + "synstructure 0.13.2", ] [[package]] diff --git a/backend/Cargo.toml b/backend/Cargo.toml index db0684af09..852401e1e1 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "windmill" -version = "1.485.3" +version = "1.486.0" authors.workspace = true edition.workspace = true @@ -32,7 +32,7 @@ members = [ ] [workspace.package] -version = "1.485.3" +version = "1.486.0" authors = ["Ruben Fiszel "] edition = "2021" diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index 3cb007383e..5d985a9d19 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.485.3 + version: 1.486.0 title: Windmill API contact: diff --git a/benchmarks/lib.ts b/benchmarks/lib.ts index 268cccc606..4777642b75 100644 --- a/benchmarks/lib.ts +++ b/benchmarks/lib.ts @@ -2,7 +2,7 @@ import { sleep } from "https://deno.land/x/sleep@v1.2.1/mod.ts"; import * as windmill from "https://deno.land/x/windmill@v1.174.0/mod.ts"; import * as api from "https://deno.land/x/windmill@v1.174.0/windmill-api/index.ts"; -export const VERSION = "v1.485.3"; +export const VERSION = "v1.486.0"; export async function login(email: string, password: string): Promise { return await windmill.UserService.login({ diff --git a/cli/main.ts b/cli/main.ts index bc25e83d88..5ad7c545d6 100644 --- a/cli/main.ts +++ b/cli/main.ts @@ -63,7 +63,7 @@ export { // } // }); -export const VERSION = "1.485.3"; +export const VERSION = "1.486.0"; const command = new Command() .name("wmill") diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 9c3d0635a6..5b2ceecf9f 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "windmill-components", - "version": "1.485.3", + "version": "1.486.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "windmill-components", - "version": "1.485.3", + "version": "1.486.0", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/frontend/package.json b/frontend/package.json index 23a1224ac2..181e485250 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "windmill-components", - "version": "1.485.3", + "version": "1.486.0", "scripts": { "dev": "vite dev", "build": "vite build", diff --git a/lsp/Pipfile b/lsp/Pipfile index b2bfb95919..5e3ac1edb0 100644 --- a/lsp/Pipfile +++ b/lsp/Pipfile @@ -4,8 +4,8 @@ verify_ssl = true name = "pypi" [packages] -wmill = ">=1.485.3" -wmill_pg = ">=1.485.3" +wmill = ">=1.486.0" +wmill_pg = ">=1.486.0" sendgrid = "*" mysql-connector-python = "*" pymongo = "*" diff --git a/openflow.openapi.yaml b/openflow.openapi.yaml index 05df31d934..0b56d8e8a4 100644 --- a/openflow.openapi.yaml +++ b/openflow.openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.485.3 + version: 1.486.0 title: OpenFlow Spec contact: name: Ruben Fiszel diff --git a/powershell-client/WindmillClient/WindmillClient.psd1 b/powershell-client/WindmillClient/WindmillClient.psd1 index c1216c8d6e..7ff796af4c 100644 --- a/powershell-client/WindmillClient/WindmillClient.psd1 +++ b/powershell-client/WindmillClient/WindmillClient.psd1 @@ -12,7 +12,7 @@ RootModule = 'WindmillClient.psm1' # Version number of this module. - ModuleVersion = '1.485.3' + ModuleVersion = '1.486.0' # Supported PSEditions # CompatiblePSEditions = @() diff --git a/python-client/wmill/pyproject.toml b/python-client/wmill/pyproject.toml index 26aaf3b22e..9a701d5543 100644 --- a/python-client/wmill/pyproject.toml +++ b/python-client/wmill/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "wmill" -version = "1.485.3" +version = "1.486.0" description = "A client library for accessing Windmill server wrapping the Windmill client API" license = "Apache-2.0" homepage = "https://windmill.dev" diff --git a/python-client/wmill_pg/pyproject.toml b/python-client/wmill_pg/pyproject.toml index 482c4afb2c..002153ce07 100644 --- a/python-client/wmill_pg/pyproject.toml +++ b/python-client/wmill_pg/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "wmill-pg" -version = "1.485.3" +version = "1.486.0" description = "An extension client for the wmill client library focused on pg" license = "Apache-2.0" homepage = "https://windmill.dev" diff --git a/typescript-client/jsr.json b/typescript-client/jsr.json index d8c794685e..3e4cbad81e 100644 --- a/typescript-client/jsr.json +++ b/typescript-client/jsr.json @@ -1,6 +1,6 @@ { "name": "@windmill/windmill", - "version": "1.485.3", + "version": "1.486.0", "exports": "./src/index.ts", "publish": { "exclude": ["!src", "./s3Types.ts", "./client.ts"] diff --git a/typescript-client/package.json b/typescript-client/package.json index fbe56a7af5..276e5b25e5 100644 --- a/typescript-client/package.json +++ b/typescript-client/package.json @@ -1,7 +1,7 @@ { "name": "windmill-client", "description": "Windmill SDK client for browsers and Node.js", - "version": "1.485.3", + "version": "1.486.0", "author": "Ruben Fiszel", "license": "Apache 2.0", "devDependencies": { diff --git a/version.txt b/version.txt index 3bb74a04b7..a0e9b4d5b9 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.485.3 +1.486.0 From 6b2ba3f261756d9b90933cf408cc7a5df16c7e7b Mon Sep 17 00:00:00 2001 From: Eugene Chernyavsky Date: Fri, 2 May 2025 20:50:20 +0300 Subject: [PATCH 335/739] google-genai and google.generativeai requirement from import (#5699) --- backend/parsers/windmill-parser-py-imports/src/mapping.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backend/parsers/windmill-parser-py-imports/src/mapping.rs b/backend/parsers/windmill-parser-py-imports/src/mapping.rs index 4c7d9a7212..1bd0688951 100644 --- a/backend/parsers/windmill-parser-py-imports/src/mapping.rs +++ b/backend/parsers/windmill-parser-py-imports/src/mapping.rs @@ -142,6 +142,8 @@ pub static FULL_IMPORTS_MAP: PyMap = phf_map! { "google.cloud.dns" => "google-cloud-dns", "google.cloud.runtimeconfig" => "google-cloud-runtimeconfig", "google.cloud.iot" => "google-cloud-iot", + "google.generativeai" => "google-generativeai", + "google.genai" => "google-genai", // Azure "azure.mgmt.hybridkubernetes" => "azure-mgmt-hybridkubernetes", "azure.mgmt.sql" => "azure-mgmt-sql", From d2ad2cdf339201ddd14fcc56e46db131f1d823d9 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Sun, 4 May 2025 17:58:03 +0200 Subject: [PATCH 336/739] nit feature flag better backend tests --- backend/tests/worker.rs | 57 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/backend/tests/worker.rs b/backend/tests/worker.rs index 9b059a6371..22a69ce07f 100644 --- a/backend/tests/worker.rs +++ b/backend/tests/worker.rs @@ -16,6 +16,7 @@ use tokio::sync::RwLock; #[cfg(feature = "enterprise")] use tokio::time::{timeout, Duration}; +#[cfg(feature = "python")] use windmill_api_client::types::{CreateFlowBody, RawScript}; #[cfg(feature = "enterprise")] use windmill_api_client::types::{EditSchedule, NewSchedule, ScriptArgs}; @@ -23,9 +24,12 @@ use windmill_api_client::types::{NewScript, ScriptLang as NewScriptLanguage}; use serde::Serialize; use windmill_common::worker::WORKER_CONFIG; +#[cfg(feature = "deno_core")] +use windmill_common::flows::InputTransform; + use windmill_common::{ flow_status::{FlowStatus, FlowStatusModule, RestartedFrom}, - flows::{FlowModule, FlowModuleValue, FlowValue, InputTransform}, + flows::{FlowModule, FlowModuleValue, FlowValue}, jobs::{JobKind, JobPayload, RawCode}, jwt::JWT_SECRET, scripts::{ScriptHash, ScriptLang}, @@ -167,6 +171,7 @@ impl ApiServer { // Ok(()) // } +#[cfg(feature="python")] fn get_module(cjob: &CompletedJob, id: &str) -> Option { cjob.flow_status.clone().and_then(|fs| { find_module_in_vec( @@ -176,6 +181,7 @@ fn get_module(cjob: &CompletedJob, id: &str) -> Option { }) } +#[cfg(feature="python")] fn find_module_in_vec(modules: Vec, id: &str) -> Option { modules.into_iter().find(|s| s.id() == id) } @@ -284,6 +290,7 @@ mod suspend_resume { .unwrap() } + #[cfg(feature = "deno_core")] #[sqlx::test(fixtures("base"))] async fn test(db: Pool) { initialize_tracing().await; @@ -366,6 +373,7 @@ mod suspend_resume { ); } + #[cfg(feature = "deno_core")] #[sqlx::test(fixtures("base"))] async fn cancel_from_job(db: Pool) { initialize_tracing().await; @@ -391,6 +399,7 @@ mod suspend_resume { ); } + #[cfg(feature = "deno_core")] #[sqlx::test(fixtures("base"))] async fn cancel_after_suspend(db: Pool) { initialize_tracing().await; @@ -564,6 +573,7 @@ def main(last, port): .unwrap() } + #[cfg(feature = "deno_core")] #[sqlx::test(fixtures("base"))] async fn test_pass(db: Pool) { initialize_tracing().await; @@ -609,6 +619,7 @@ def main(last, port): assert_eq!(json!([3, 5, 7, 9]), result); } + #[cfg(feature = "deno_core")] #[sqlx::test(fixtures("base"))] async fn test_fail_step_zero(db: Pool) { initialize_tracing().await; @@ -652,6 +663,7 @@ def main(last, port): ); } + #[cfg(feature = "deno_core")] #[sqlx::test(fixtures("base"))] async fn test_fail_step_one(db: Pool) { initialize_tracing().await; @@ -693,6 +705,7 @@ def main(last, port): .contains("index out of range")); } + #[cfg(feature = "python")] #[sqlx::test(fixtures("base"))] async fn test_with_failure_module(db: Pool) { initialize_tracing().await; @@ -769,6 +782,7 @@ def main(error, port): } } +#[cfg(feature = "deno_core")] #[sqlx::test(fixtures("base"))] async fn test_iteration(db: Pool) { initialize_tracing().await; @@ -827,6 +841,7 @@ async fn test_iteration(db: Pool) { .contains("2")); } +#[cfg(feature = "deno_core")] #[sqlx::test(fixtures("base"))] async fn test_iteration_parallel(db: Pool) { initialize_tracing().await; @@ -1105,6 +1120,7 @@ trait StreamFind: futures::Stream + Unpin + Sized { impl StreamFind for T {} +#[cfg(feature = "deno_core")] #[sqlx::test(fixtures("base"))] async fn test_deno_flow(db: Pool) { initialize_tracing().await; @@ -1223,6 +1239,7 @@ async fn test_deno_flow(db: Pool) { } } +#[cfg(feature = "python")] #[sqlx::test(fixtures("base"))] async fn test_identity(db: Pool) { initialize_tracing().await; @@ -1260,6 +1277,7 @@ async fn test_identity(db: Pool) { assert_eq!(result, serde_json::json!(42)); } +#[cfg(feature = "deno_core")] #[sqlx::test(fixtures("base"))] async fn test_deno_flow_same_worker(db: Pool) { initialize_tracing().await; @@ -1535,6 +1553,7 @@ async fn test_flow_result_by_id(db: Pool) { assert_eq!(result, serde_json::json!([[42]])); } +#[cfg(feature = "deno_core")] #[sqlx::test(fixtures("base"))] async fn test_stop_after_if(db: Pool) { initialize_tracing().await; @@ -1588,6 +1607,7 @@ async fn test_stop_after_if(db: Pool) { assert_eq!(json!(-123), result); } +#[cfg(feature = "deno_core")] #[sqlx::test(fixtures("base"))] async fn test_stop_after_if_nested(db: Pool) { initialize_tracing().await; @@ -1646,6 +1666,7 @@ async fn test_stop_after_if_nested(db: Pool) { assert_eq!(json!([-123]), result); } +#[cfg(all(feature = "deno_core", feature = "python"))] #[sqlx::test(fixtures("base"))] async fn test_python_flow(db: Pool) { initialize_tracing().await; @@ -1703,6 +1724,7 @@ async fn test_python_flow(db: Pool) { } } +#[cfg(feature = "python")] #[sqlx::test(fixtures("base"))] async fn test_python_flow_2(db: Pool) { initialize_tracing().await; @@ -1777,6 +1799,7 @@ func main(derp string) (string, error) { assert_eq!(result, serde_json::json!("hello world")); } +#[cfg(feature = "rust")] #[sqlx::test(fixtures("base"))] async fn test_rust_job(db: Pool) { initialize_tracing().await; @@ -2032,6 +2055,7 @@ public class Main { assert_eq!(job.json_result(), Some(json!("hello world"))); } +#[cfg(feature = "python")] #[sqlx::test(fixtures("base"))] async fn test_python_job(db: Pool) { initialize_tracing().await; @@ -2065,6 +2089,7 @@ def main(): assert_eq!(result, serde_json::json!("hello world")); } +#[cfg(feature = "python")] #[sqlx::test(fixtures("base"))] async fn test_python_job_heavy_dep(db: Pool) { initialize_tracing().await; @@ -2101,6 +2126,7 @@ def main(): assert_eq!(result, serde_json::json!(3)); } +#[cfg(feature = "python")] #[sqlx::test(fixtures("base"))] async fn test_python_job_with_imports(db: Pool) { initialize_tracing().await; @@ -2204,6 +2230,7 @@ export async function main(a: Date) { assert_eq!(result, serde_json::json!("object")); } +#[cfg(feature = "python")] #[sqlx::test(fixtures("base"))] async fn test_python_job_datetime_and_bytes(db: Pool) { initialize_tracing().await; @@ -2239,6 +2266,7 @@ def main(a: datetime, b: bytes): assert_eq!(result, serde_json::json!([true, true])); } +#[cfg(feature = "deno_core")] #[sqlx::test(fixtures("base"))] async fn test_empty_loop_1(db: Pool) { initialize_tracing().await; @@ -2295,6 +2323,7 @@ async fn test_empty_loop_1(db: Pool) { assert_eq!(result, serde_json::json!(0)); } +#[cfg(feature = "deno_core")] #[sqlx::test(fixtures("base"))] async fn test_invalid_first_step(db: Pool) { initialize_tracing().await; @@ -2375,6 +2404,7 @@ async fn test_empty_loop_2(db: Pool) { assert_eq!(result, serde_json::json!([])); } +#[cfg(feature = "deno_core")] #[sqlx::test(fixtures("base"))] async fn test_step_after_loop(db: Pool) { initialize_tracing().await; @@ -2498,6 +2528,7 @@ async fn test_branchone_simple(db: Pool) { assert_eq!(result, serde_json::json!([1, 2])); } +#[cfg(feature = "deno_core")] #[sqlx::test(fixtures("base"))] async fn test_branchone_with_cond(db: Pool) { initialize_tracing().await; @@ -2534,6 +2565,7 @@ async fn test_branchone_with_cond(db: Pool) { assert_eq!(result, serde_json::json!([1, 3])); } +#[cfg(feature = "deno_core")] #[sqlx::test(fixtures("base"))] async fn test_branchall_sequential(db: Pool) { initialize_tracing().await; @@ -2572,6 +2604,7 @@ async fn test_branchall_sequential(db: Pool) { assert_eq!(result, serde_json::json!([[1, 2], [1, 3]])); } +#[cfg(feature = "deno_core")] #[sqlx::test(fixtures("base"))] async fn test_branchall_simple(db: Pool) { initialize_tracing().await; @@ -2699,6 +2732,7 @@ async fn test_branchall_skip_failure(db: Pool) { ); } +#[cfg(feature = "deno_core")] #[sqlx::test(fixtures("base"))] async fn test_branchone_nested(db: Pool) { initialize_tracing().await; @@ -2818,6 +2852,7 @@ async fn test_branchall_nested(db: Pool) { ); } +#[cfg(feature = "deno_core")] #[sqlx::test(fixtures("base"))] async fn test_failure_module(db: Pool) { initialize_tracing().await; @@ -2930,6 +2965,7 @@ async fn test_failure_module(db: Pool) { assert_eq!(json!({ "l": [0, 1, 2] }), result); } +#[cfg(feature = "python")] #[sqlx::test(fixtures("base"))] async fn test_flow_lock_all(db: Pool) { use futures::StreamExt; @@ -3068,6 +3104,7 @@ async fn test_flow_lock_all(db: Pool) { }); } +#[cfg(feature = "deno_core")] #[sqlx::test(fixtures("base"))] async fn test_complex_flow_restart(db: Pool) { @@ -3752,6 +3789,7 @@ export async function main() { run_preview_relative_imports(&db, content, ScriptLang::Bun).await; } +#[cfg(feature = "deno_core")] #[sqlx::test(fixtures("base", "relative_bun"))] async fn test_nested_imports_bun(db: Pool) { let content = r#" @@ -3800,6 +3838,7 @@ export async function main() { run_preview_relative_imports(&db, content, ScriptLang::Deno).await; } +#[cfg(feature = "python")] #[sqlx::test(fixtures("base", "relative_python"))] async fn test_relative_imports_python(db: Pool) { let content = r#" @@ -3817,6 +3856,7 @@ def main(): run_preview_relative_imports(&db, content, ScriptLang::Python3).await; } +#[cfg(feature = "python")] #[sqlx::test(fixtures("base", "relative_python"))] async fn test_nested_imports_python(db: Pool) { let content = r#" @@ -3832,6 +3872,7 @@ def main(): run_preview_relative_imports(&db, content, ScriptLang::Python3).await; } +#[cfg(feature = "python")] async fn assert_lockfile( db: &Pool, script_content: String, @@ -3924,6 +3965,8 @@ async fn assert_lockfile( ) .await; } + +#[cfg(feature = "python")] #[sqlx::test(fixtures("base", "lockfile_python"))] async fn test_requirements_python(db: Pool) { let content = r#" @@ -3949,6 +3992,8 @@ def main(): ) .await; } + +#[cfg(feature = "python")] #[sqlx::test(fixtures("base", "lockfile_python"))] async fn test_extra_requirements_python(db: Pool) { { @@ -3976,6 +4021,8 @@ def main(): .await; } } + +#[cfg(feature = "python")] #[sqlx::test(fixtures("base", "lockfile_python"))] async fn test_extra_requirements_python2(db: Pool) { let content = r#" @@ -3998,6 +4045,7 @@ def main(): .await; } +#[cfg(feature = "python")] #[sqlx::test(fixtures("base", "lockfile_python"))] async fn test_pins_python(db: Pool) { let content = r#" @@ -4281,6 +4329,7 @@ mod job_payload { ]; } + #[cfg(feature = "deno_core")] #[sqlx::test(fixtures("base", "hello"))] async fn test_script_hash_payload(db: Pool) { initialize_tracing().await; @@ -4441,6 +4490,7 @@ mod job_payload { test_for_versions(VERSION_FLAGS.iter().cloned(), test).await; } + #[cfg(feature = "deno_core")] #[sqlx::test(fixtures("base", "hello"))] async fn test_flow_node_payload(db: Pool) { initialize_tracing().await; @@ -4625,6 +4675,7 @@ mod job_payload { test_for_versions(VERSION_FLAGS.iter().cloned(), test).await; } + #[cfg(feature = "deno_core")] #[sqlx::test(fixtures("base", "hello"))] async fn test_flow_payload(db: Pool) { initialize_tracing().await; @@ -4667,6 +4718,7 @@ mod job_payload { test_for_versions(VERSION_FLAGS.iter().cloned(), test).await; } + #[cfg(feature = "deno_core")] #[sqlx::test(fixtures("base", "hello"))] async fn test_flow_payload_with_preprocessor(db: Pool) { initialize_tracing().await; @@ -4734,6 +4786,7 @@ mod job_payload { test_for_versions(VERSION_FLAGS.iter().cloned(), test).await; } + #[cfg(feature = "deno_core")] #[sqlx::test(fixtures("base", "hello"))] async fn test_restarted_flow_payload(db: Pool) { initialize_tracing().await; @@ -4786,6 +4839,7 @@ mod job_payload { test_for_versions(VERSION_FLAGS.iter().cloned(), test).await; } + #[cfg(feature = "deno_core")] #[sqlx::test(fixtures("base", "hello"))] async fn test_raw_flow_payload(db: Pool) { initialize_tracing().await; @@ -4832,6 +4886,7 @@ mod job_payload { test_for_versions(VERSION_FLAGS.iter().cloned(), test).await; } + #[cfg(feature = "deno_core")] #[sqlx::test(fixtures("base", "hello"))] async fn test_raw_flow_payload_with_restarted_from(db: Pool) { initialize_tracing().await; From 36da8aec080742e13f23e1dee12b3954947f53dd Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Sun, 4 May 2025 18:18:58 +0200 Subject: [PATCH 337/739] fix: improve MultiSelectWrapper behavior --- .../lib/components/apps/editor/SettingsPanel.svelte | 2 +- .../editor/settingsPanel/EventHandlerItem.svelte | 13 ++++++++----- .../multiselect/MultiSelectWrapper.svelte | 4 +++- .../(logged)/user/(user)/workspaces/+page.svelte | 2 +- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/frontend/src/lib/components/apps/editor/SettingsPanel.svelte b/frontend/src/lib/components/apps/editor/SettingsPanel.svelte index ae4143dd34..b2e0a4b52e 100644 --- a/frontend/src/lib/components/apps/editor/SettingsPanel.svelte +++ b/frontend/src/lib/components/apps/editor/SettingsPanel.svelte @@ -293,7 +293,7 @@ tooltip="This event is triggered when the script runs successfully." items={Object.keys($runnableComponents).filter((_id) => _id !== id)} bind:value={ - () => hiddenInlineScript.script.recomputeIds, + () => hiddenInlineScript.script.recomputeIds ?? [], (v) => { if ($app.hiddenInlineScripts[hiddenInlineScript.index]) { $app.hiddenInlineScripts[hiddenInlineScript.index].recomputeIds = v diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/EventHandlerItem.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/EventHandlerItem.svelte index 41c29638e5..1bf94a76a4 100644 --- a/frontend/src/lib/components/apps/editor/settingsPanel/EventHandlerItem.svelte +++ b/frontend/src/lib/components/apps/editor/settingsPanel/EventHandlerItem.svelte @@ -4,12 +4,15 @@ import MultiSelect from '$lib/components/multiselect/MultiSelectWrapper.svelte' import { twMerge } from 'tailwind-merge' - export let items: string[] - export let value: string[] | undefined = undefined - export let title: string - export let tooltip: string - let width = 0 + let { items, value = $bindable(), title, tooltip } = $props<{ + items: string[] + value: string[] | undefined + title: string + tooltip: string + }>() + + let width = $state(0) const inputWidth = 280 diff --git a/frontend/src/lib/components/multiselect/MultiSelectWrapper.svelte b/frontend/src/lib/components/multiselect/MultiSelectWrapper.svelte index 1687d5ec3b..3457c0c766 100644 --- a/frontend/src/lib/components/multiselect/MultiSelectWrapper.svelte +++ b/frontend/src/lib/components/multiselect/MultiSelectWrapper.svelte @@ -9,7 +9,7 @@ let { items, - value = $bindable([]), + value = $bindable(), placeholder = undefined, target = undefined, topPlacement = false, @@ -23,6 +23,8 @@ allowUserOptions?: boolean | 'append' }>() + $effect.pre(() => { if (value === undefined) value = [] }) + const [floatingRef, floatingContent] = createFloatingActions({ strategy: 'absolute', placement: topPlacement ? 'top-start' : 'bottom-start', diff --git a/frontend/src/routes/(root)/(logged)/user/(user)/workspaces/+page.svelte b/frontend/src/routes/(root)/(logged)/user/(user)/workspaces/+page.svelte index 016e923464..abf5ce563f 100644 --- a/frontend/src/routes/(root)/(logged)/user/(user)/workspaces/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/user/(user)/workspaces/+page.svelte @@ -133,7 +133,7 @@ } else { await goto(rd ?? '/') } - console.log('Workspace selected, going to', rd) + console.log('Workspace selected going to ' + (rd ? `rd: ${rd}` : 'home')) } catch (e) { console.error('Error going to', rd, e) window.location.reload() From 815c3b6d007637cad872fe04bde47d371a373f1a Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Sun, 4 May 2025 18:24:52 +0200 Subject: [PATCH 338/739] chore(main): release 1.486.1 (#5701) * chore(main): release 1.486.1 * Apply automatic changes --------- Co-authored-by: rubenfiszel <275584+rubenfiszel@users.noreply.github.com> --- CHANGELOG.md | 7 ++ backend/Cargo.lock | 74 +++++++++---------- backend/Cargo.toml | 4 +- backend/windmill-api/openapi.yaml | 2 +- benchmarks/lib.ts | 2 +- cli/main.ts | 2 +- frontend/package-lock.json | 4 +- frontend/package.json | 2 +- lsp/Pipfile | 4 +- openflow.openapi.yaml | 2 +- .../WindmillClient/WindmillClient.psd1 | 2 +- python-client/wmill/pyproject.toml | 2 +- python-client/wmill_pg/pyproject.toml | 2 +- typescript-client/jsr.json | 2 +- typescript-client/package.json | 2 +- version.txt | 2 +- 16 files changed, 61 insertions(+), 54 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b99328489d..a2920564fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [1.486.1](https://github.com/windmill-labs/windmill/compare/v1.486.0...v1.486.1) (2025-05-04) + + +### Bug Fixes + +* improve MultiSelectWrapper behavior ([36da8ae](https://github.com/windmill-labs/windmill/commit/36da8aec080742e13f23e1dee12b3954947f53dd)) + ## [1.486.0](https://github.com/windmill-labs/windmill/compare/v1.485.3...v1.486.0) (2025-05-01) diff --git a/backend/Cargo.lock b/backend/Cargo.lock index 8a358f0aa4..b513405b77 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -1828,9 +1828,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.20" +version = "1.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04da6a0d40b948dfc4fa8f5bbf402b0fc1a64a28dbf7d12ffd683550f2c1b63a" +checksum = "8691782945451c1c383942c4874dbe63814f61cb57ef773cda2972682b7bb3c0" dependencies = [ "jobserver", "libc", @@ -6797,7 +6797,7 @@ checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ "bitflags 2.9.0", "libc", - "redox_syscall 0.5.11", + "redox_syscall 0.5.12", ] [[package]] @@ -8495,7 +8495,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.11", + "redox_syscall 0.5.12", "smallvec", "windows-targets 0.52.6", ] @@ -9507,9 +9507,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.11" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3" +checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" dependencies = [ "bitflags 2.9.0", ] @@ -12744,7 +12744,7 @@ checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" dependencies = [ "indexmap 2.9.0", "toml_datetime", - "winnow 0.7.8", + "winnow 0.7.9", ] [[package]] @@ -13861,7 +13861,7 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6994d13118ab492c3c80c1f81928718159254c53c472bf9ce36f8dae4add02a7" dependencies = [ - "redox_syscall 0.5.11", + "redox_syscall 0.5.12", "wasite", "web-sys", ] @@ -13905,7 +13905,7 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windmill" -version = "1.486.0" +version = "1.486.1" dependencies = [ "anyhow", "axum", @@ -13952,7 +13952,7 @@ dependencies = [ [[package]] name = "windmill-api" -version = "1.486.0" +version = "1.486.1" dependencies = [ "anyhow", "argon2", @@ -14062,7 +14062,7 @@ dependencies = [ [[package]] name = "windmill-api-client" -version = "1.486.0" +version = "1.486.1" dependencies = [ "base64 0.22.1", "chrono", @@ -14077,7 +14077,7 @@ dependencies = [ [[package]] name = "windmill-audit" -version = "1.486.0" +version = "1.486.1" dependencies = [ "chrono", "serde", @@ -14090,7 +14090,7 @@ dependencies = [ [[package]] name = "windmill-autoscaling" -version = "1.486.0" +version = "1.486.1" dependencies = [ "anyhow", "serde", @@ -14104,7 +14104,7 @@ dependencies = [ [[package]] name = "windmill-common" -version = "1.486.0" +version = "1.486.1" dependencies = [ "anyhow", "async-stream", @@ -14168,7 +14168,7 @@ dependencies = [ [[package]] name = "windmill-git-sync" -version = "1.486.0" +version = "1.486.1" dependencies = [ "regex", "serde", @@ -14182,7 +14182,7 @@ dependencies = [ [[package]] name = "windmill-indexer" -version = "1.486.0" +version = "1.486.1" dependencies = [ "anyhow", "bytes", @@ -14205,7 +14205,7 @@ dependencies = [ [[package]] name = "windmill-macros" -version = "1.486.0" +version = "1.486.1" dependencies = [ "itertools 0.14.0", "lazy_static", @@ -14217,7 +14217,7 @@ dependencies = [ [[package]] name = "windmill-parser" -version = "1.486.0" +version = "1.486.1" dependencies = [ "convert_case 0.6.0", "serde", @@ -14226,7 +14226,7 @@ dependencies = [ [[package]] name = "windmill-parser-bash" -version = "1.486.0" +version = "1.486.1" dependencies = [ "anyhow", "lazy_static", @@ -14238,7 +14238,7 @@ dependencies = [ [[package]] name = "windmill-parser-csharp" -version = "1.486.0" +version = "1.486.1" dependencies = [ "anyhow", "serde_json", @@ -14250,7 +14250,7 @@ dependencies = [ [[package]] name = "windmill-parser-go" -version = "1.486.0" +version = "1.486.1" dependencies = [ "anyhow", "gosyn", @@ -14262,7 +14262,7 @@ dependencies = [ [[package]] name = "windmill-parser-graphql" -version = "1.486.0" +version = "1.486.1" dependencies = [ "anyhow", "lazy_static", @@ -14274,7 +14274,7 @@ dependencies = [ [[package]] name = "windmill-parser-java" -version = "1.486.0" +version = "1.486.1" dependencies = [ "anyhow", "serde_json", @@ -14286,7 +14286,7 @@ dependencies = [ [[package]] name = "windmill-parser-nu" -version = "1.486.0" +version = "1.486.1" dependencies = [ "anyhow", "nu-parser", @@ -14297,7 +14297,7 @@ dependencies = [ [[package]] name = "windmill-parser-php" -version = "1.486.0" +version = "1.486.1" dependencies = [ "anyhow", "itertools 0.14.0", @@ -14308,7 +14308,7 @@ dependencies = [ [[package]] name = "windmill-parser-py" -version = "1.486.0" +version = "1.486.1" dependencies = [ "anyhow", "itertools 0.14.0", @@ -14319,7 +14319,7 @@ dependencies = [ [[package]] name = "windmill-parser-py-imports" -version = "1.486.0" +version = "1.486.1" dependencies = [ "anyhow", "async-recursion", @@ -14339,7 +14339,7 @@ dependencies = [ [[package]] name = "windmill-parser-rust" -version = "1.486.0" +version = "1.486.1" dependencies = [ "anyhow", "convert_case 0.6.0", @@ -14356,7 +14356,7 @@ dependencies = [ [[package]] name = "windmill-parser-sql" -version = "1.486.0" +version = "1.486.1" dependencies = [ "anyhow", "lazy_static", @@ -14368,7 +14368,7 @@ dependencies = [ [[package]] name = "windmill-parser-ts" -version = "1.486.0" +version = "1.486.1" dependencies = [ "anyhow", "lazy_static", @@ -14386,7 +14386,7 @@ dependencies = [ [[package]] name = "windmill-parser-wasm" -version = "1.486.0" +version = "1.486.1" dependencies = [ "anyhow", "getrandom 0.2.16", @@ -14410,7 +14410,7 @@ dependencies = [ [[package]] name = "windmill-parser-yaml" -version = "1.486.0" +version = "1.486.1" dependencies = [ "anyhow", "serde_json", @@ -14420,7 +14420,7 @@ dependencies = [ [[package]] name = "windmill-queue" -version = "1.486.0" +version = "1.486.1" dependencies = [ "anyhow", "async-recursion", @@ -14453,7 +14453,7 @@ dependencies = [ [[package]] name = "windmill-sql-datatype-parser-wasm" -version = "1.486.0" +version = "1.486.1" dependencies = [ "wasm-bindgen", "wasm-bindgen-test", @@ -14463,7 +14463,7 @@ dependencies = [ [[package]] name = "windmill-worker" -version = "1.486.0" +version = "1.486.1" dependencies = [ "anyhow", "async-recursion", @@ -15023,9 +15023,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.7.8" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e27d6ad3dac991091e4d35de9ba2d2d00647c5d0fc26c5496dee55984ae111b" +checksum = "d9fb597c990f03753e08d3c29efbfcf2019a003b4bf4ba19225c158e1549f0f3" dependencies = [ "memchr", ] diff --git a/backend/Cargo.toml b/backend/Cargo.toml index 852401e1e1..6a6b2e8d65 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "windmill" -version = "1.486.0" +version = "1.486.1" authors.workspace = true edition.workspace = true @@ -32,7 +32,7 @@ members = [ ] [workspace.package] -version = "1.486.0" +version = "1.486.1" authors = ["Ruben Fiszel "] edition = "2021" diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index 5d985a9d19..2b06b3a915 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.486.0 + version: 1.486.1 title: Windmill API contact: diff --git a/benchmarks/lib.ts b/benchmarks/lib.ts index 4777642b75..1020f35416 100644 --- a/benchmarks/lib.ts +++ b/benchmarks/lib.ts @@ -2,7 +2,7 @@ import { sleep } from "https://deno.land/x/sleep@v1.2.1/mod.ts"; import * as windmill from "https://deno.land/x/windmill@v1.174.0/mod.ts"; import * as api from "https://deno.land/x/windmill@v1.174.0/windmill-api/index.ts"; -export const VERSION = "v1.486.0"; +export const VERSION = "v1.486.1"; export async function login(email: string, password: string): Promise { return await windmill.UserService.login({ diff --git a/cli/main.ts b/cli/main.ts index 5ad7c545d6..7f47fe12f5 100644 --- a/cli/main.ts +++ b/cli/main.ts @@ -63,7 +63,7 @@ export { // } // }); -export const VERSION = "1.486.0"; +export const VERSION = "1.486.1"; const command = new Command() .name("wmill") diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 5b2ceecf9f..ad03d4f12d 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "windmill-components", - "version": "1.486.0", + "version": "1.486.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "windmill-components", - "version": "1.486.0", + "version": "1.486.1", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/frontend/package.json b/frontend/package.json index 181e485250..dcb3c09031 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "windmill-components", - "version": "1.486.0", + "version": "1.486.1", "scripts": { "dev": "vite dev", "build": "vite build", diff --git a/lsp/Pipfile b/lsp/Pipfile index 5e3ac1edb0..7aeb4c3641 100644 --- a/lsp/Pipfile +++ b/lsp/Pipfile @@ -4,8 +4,8 @@ verify_ssl = true name = "pypi" [packages] -wmill = ">=1.486.0" -wmill_pg = ">=1.486.0" +wmill = ">=1.486.1" +wmill_pg = ">=1.486.1" sendgrid = "*" mysql-connector-python = "*" pymongo = "*" diff --git a/openflow.openapi.yaml b/openflow.openapi.yaml index 0b56d8e8a4..b2df9da7dc 100644 --- a/openflow.openapi.yaml +++ b/openflow.openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.486.0 + version: 1.486.1 title: OpenFlow Spec contact: name: Ruben Fiszel diff --git a/powershell-client/WindmillClient/WindmillClient.psd1 b/powershell-client/WindmillClient/WindmillClient.psd1 index 7ff796af4c..a2e7dad29e 100644 --- a/powershell-client/WindmillClient/WindmillClient.psd1 +++ b/powershell-client/WindmillClient/WindmillClient.psd1 @@ -12,7 +12,7 @@ RootModule = 'WindmillClient.psm1' # Version number of this module. - ModuleVersion = '1.486.0' + ModuleVersion = '1.486.1' # Supported PSEditions # CompatiblePSEditions = @() diff --git a/python-client/wmill/pyproject.toml b/python-client/wmill/pyproject.toml index 9a701d5543..8a17f18183 100644 --- a/python-client/wmill/pyproject.toml +++ b/python-client/wmill/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "wmill" -version = "1.486.0" +version = "1.486.1" description = "A client library for accessing Windmill server wrapping the Windmill client API" license = "Apache-2.0" homepage = "https://windmill.dev" diff --git a/python-client/wmill_pg/pyproject.toml b/python-client/wmill_pg/pyproject.toml index 002153ce07..84750f699b 100644 --- a/python-client/wmill_pg/pyproject.toml +++ b/python-client/wmill_pg/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "wmill-pg" -version = "1.486.0" +version = "1.486.1" description = "An extension client for the wmill client library focused on pg" license = "Apache-2.0" homepage = "https://windmill.dev" diff --git a/typescript-client/jsr.json b/typescript-client/jsr.json index 3e4cbad81e..e631d5a984 100644 --- a/typescript-client/jsr.json +++ b/typescript-client/jsr.json @@ -1,6 +1,6 @@ { "name": "@windmill/windmill", - "version": "1.486.0", + "version": "1.486.1", "exports": "./src/index.ts", "publish": { "exclude": ["!src", "./s3Types.ts", "./client.ts"] diff --git a/typescript-client/package.json b/typescript-client/package.json index 276e5b25e5..c8d0c8e3a3 100644 --- a/typescript-client/package.json +++ b/typescript-client/package.json @@ -1,7 +1,7 @@ { "name": "windmill-client", "description": "Windmill SDK client for browsers and Node.js", - "version": "1.486.0", + "version": "1.486.1", "author": "Ruben Fiszel", "license": "Apache 2.0", "devDependencies": { diff --git a/version.txt b/version.txt index a0e9b4d5b9..5f20ebb122 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.486.0 +1.486.1 From 4fd056123907337efb5f5669975b337973a124cc Mon Sep 17 00:00:00 2001 From: pyranota <92104930+pyranota@users.noreply.github.com> Date: Mon, 5 May 2025 09:54:48 +0300 Subject: [PATCH 339/739] feat: critical alert if disk near full (#5549) * feat: critical alert if disk near full * update logic to cover edge-case * update logic * windows support * Update README.md Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> * make it periodically * add extra safety * respect killpills * do not check every 3 secs * move to monitor.rs * rework * alter readme * extending functionality * fix worker_mode * fix compilation * fix typo * make use of AI suggestion * update ee-repo-ref * update ee ref * logs are CE * update ee repo ref * remove systemstat from worker crate * fix comp error + sync cargo.lock * more comptime fixing * Update ee-repo-ref.txt * fix compilation error --------- Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> Co-authored-by: Ruben Fiszel --- README.md | 1 + backend/Cargo.lock | 24 ++++++ backend/Cargo.toml | 4 + backend/ee-repo-ref.txt | 2 +- ...34_critical_alerts_on_db_oversize.down.sql | 1 + ...4434_critical_alerts_on_db_oversize.up.sql | 3 + backend/src/main.rs | 32 +++++--- backend/src/monitor.rs | 81 +++++++++++++++---- backend/windmill-common/Cargo.toml | 2 + backend/windmill-common/src/ee.rs | 3 +- backend/windmill-common/src/flows.rs | 3 +- .../windmill-common/src/global_settings.rs | 1 + backend/windmill-common/src/lib.rs | 1 + flake.nix | 2 + .../src/lib/components/InstanceSetting.svelte | 32 +++++++- .../src/lib/components/instanceSettings.ts | 10 +++ 16 files changed, 170 insertions(+), 32 deletions(-) create mode 100644 backend/migrations/20250424144434_critical_alerts_on_db_oversize.down.sql create mode 100644 backend/migrations/20250424144434_critical_alerts_on_db_oversize.up.sql diff --git a/README.md b/README.md index a733727825..27a5aaf296 100644 --- a/README.md +++ b/README.md @@ -363,6 +363,7 @@ you to have it being synced automatically everyday. | DENO_AUTH_TOKENS | None | Custom DENO_AUTH_TOKENS to pass to worker to allow the use of private modules | Worker | | DISABLE_RESPONSE_LOGS | false | Disable response logs | Server | | CREATE_WORKSPACE_REQUIRE_SUPERADMIN | true | If true, only superadmins can create new workspaces | Server | +| MIN_FREE_DISK_SPACE_MB | 15000 | Minimum amount of free space on worker. Sends critical alert if worker has less free space. | Worker | ## Run a local dev setup diff --git a/backend/Cargo.lock b/backend/Cargo.lock index b513405b77..2d787a97ef 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -10913,6 +10913,12 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" +[[package]] +name = "size" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b6709c7b6754dca1311b3c73e79fcce40dd414c782c66d88e8823030093b02b" + [[package]] name = "sketches-ddsketch" version = "0.2.2" @@ -11998,6 +12004,20 @@ dependencies = [ "libc", ] +[[package]] +name = "systemstat" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "668a4db78b439df482c238f559e4ea869017f9e62ef0a059c8bfcd841a4df544" +dependencies = [ + "bytesize", + "lazy_static", + "libc", + "nom 7.1.3", + "time", + "winapi", +] + [[package]] name = "tagptr" version = "0.2.0" @@ -13930,7 +13950,9 @@ dependencies = [ "serde_json", "sha1", "sha2 0.10.9", + "size", "sqlx", + "systemstat", "tikv-jemalloc-ctl", "tikv-jemalloc-sys", "tikv-jemallocator", @@ -14149,8 +14171,10 @@ dependencies = [ "semver 1.0.26", "serde", "serde_json", + "size", "sha2 0.10.9", "sqlx", + "systemstat", "tar", "tempfile", "thiserror 2.0.12", diff --git a/backend/Cargo.toml b/backend/Cargo.toml index 6a6b2e8d65..ae6f136838 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -132,6 +132,8 @@ quote.workspace = true memchr.workspace = true v8 = { workspace = true, optional = true } rustls.workspace = true +systemstat.workspace = true +size.workspace = true [target.'cfg(not(target_env = "msvc"))'.dependencies] tikv-jemallocator = { optional = true, workspace = true } @@ -368,6 +370,8 @@ pin-project-lite = "^0" tantivy = "0.22.0" backon = "1.3.0" +systemstat = "0.2.4" +size = "0.5.0" flume = { version = "0.11.1", features = ["async"] } diff --git a/backend/ee-repo-ref.txt b/backend/ee-repo-ref.txt index 0dd7e7c326..bbfd4d21b0 100644 --- a/backend/ee-repo-ref.txt +++ b/backend/ee-repo-ref.txt @@ -1 +1 @@ -96a2129f585a1bc6567ef08bd27aaa4aca70543f \ No newline at end of file +d63c5908cb19c9beb670e91d6792817ea636f052 \ No newline at end of file diff --git a/backend/migrations/20250424144434_critical_alerts_on_db_oversize.down.sql b/backend/migrations/20250424144434_critical_alerts_on_db_oversize.down.sql new file mode 100644 index 0000000000..5eceb2c095 --- /dev/null +++ b/backend/migrations/20250424144434_critical_alerts_on_db_oversize.down.sql @@ -0,0 +1 @@ +DELETE FROM global_settings WHERE name = 'critical_alerts_on_db_oversize'; diff --git a/backend/migrations/20250424144434_critical_alerts_on_db_oversize.up.sql b/backend/migrations/20250424144434_critical_alerts_on_db_oversize.up.sql new file mode 100644 index 0000000000..cb1868dbba --- /dev/null +++ b/backend/migrations/20250424144434_critical_alerts_on_db_oversize.up.sql @@ -0,0 +1,3 @@ +INSERT INTO global_settings (name, value) +VALUES ('critical_alerts_on_db_oversize', '{}') +ON CONFLICT (name) DO NOTHING; diff --git a/backend/src/main.rs b/backend/src/main.rs index 7226d4a3af..e6dc72be80 100644 --- a/backend/src/main.rs +++ b/backend/src/main.rs @@ -8,11 +8,12 @@ use anyhow::Context; use monitor::{ - load_base_url, load_otel, reload_delete_logs_periodically_setting, reload_indexer_config, + load_base_url, load_otel, reload_critical_alerts_on_db_oversize, + reload_delete_logs_periodically_setting, reload_indexer_config, reload_instance_python_version_setting, reload_maven_repos_setting, reload_no_default_maven_setting, reload_nuget_config_setting, reload_timeout_wait_result_setting, send_current_log_file_to_object_store, - send_logs_to_object_store, + send_logs_to_object_store, WORKERS_NAMES, }; use rand::Rng; use sqlx::postgres::PgListener; @@ -33,15 +34,16 @@ use windmill_common::{ agent_workers::build_agent_http_client, get_database_url, global_settings::{ - BASE_URL_SETTING, BUNFIG_INSTALL_SCOPES_SETTING, CRITICAL_ALERT_MUTE_UI_SETTING, - CRITICAL_ERROR_CHANNELS_SETTING, CUSTOM_TAGS_SETTING, DEFAULT_TAGS_PER_WORKSPACE_SETTING, - DEFAULT_TAGS_WORKSPACES_SETTING, EMAIL_DOMAIN_SETTING, ENV_SETTINGS, - EXPOSE_DEBUG_METRICS_SETTING, EXPOSE_METRICS_SETTING, EXTRA_PIP_INDEX_URL_SETTING, - HUB_BASE_URL_SETTING, INDEXER_SETTING, INSTANCE_PYTHON_VERSION_SETTING, - JOB_DEFAULT_TIMEOUT_SECS_SETTING, JWT_SECRET_SETTING, KEEP_JOB_DIR_SETTING, - LICENSE_KEY_SETTING, MAVEN_REPOS_SETTING, MONITOR_LOGS_ON_OBJECT_STORE_SETTING, - NO_DEFAULT_MAVEN_SETTING, NPM_CONFIG_REGISTRY_SETTING, NUGET_CONFIG_SETTING, OAUTH_SETTING, - OTEL_SETTING, PIP_INDEX_URL_SETTING, REQUEST_SIZE_LIMIT_SETTING, + BASE_URL_SETTING, BUNFIG_INSTALL_SCOPES_SETTING, CRITICAL_ALERTS_ON_DB_OVERSIZE_SETTING, + CRITICAL_ALERT_MUTE_UI_SETTING, CRITICAL_ERROR_CHANNELS_SETTING, CUSTOM_TAGS_SETTING, + DEFAULT_TAGS_PER_WORKSPACE_SETTING, DEFAULT_TAGS_WORKSPACES_SETTING, EMAIL_DOMAIN_SETTING, + ENV_SETTINGS, EXPOSE_DEBUG_METRICS_SETTING, EXPOSE_METRICS_SETTING, + EXTRA_PIP_INDEX_URL_SETTING, HUB_BASE_URL_SETTING, INDEXER_SETTING, + INSTANCE_PYTHON_VERSION_SETTING, JOB_DEFAULT_TIMEOUT_SECS_SETTING, JWT_SECRET_SETTING, + KEEP_JOB_DIR_SETTING, LICENSE_KEY_SETTING, MAVEN_REPOS_SETTING, + MONITOR_LOGS_ON_OBJECT_STORE_SETTING, NO_DEFAULT_MAVEN_SETTING, + NPM_CONFIG_REGISTRY_SETTING, NUGET_CONFIG_SETTING, OAUTH_SETTING, OTEL_SETTING, + PIP_INDEX_URL_SETTING, REQUEST_SIZE_LIMIT_SETTING, REQUIRE_PREEXISTING_USER_FOR_OAUTH_SETTING, RETENTION_PERIOD_SECS_SETTING, SAML_METADATA_SETTING, SCIM_TOKEN_SETTING, SMTP_SETTING, TEAMS_SETTING, TIMEOUT_WAIT_RESULT_SETTING, @@ -917,6 +919,12 @@ Windmill Community Edition {GIT_VERSION} tracing::error!(error = %e, "Could not reload critical error emails setting"); } }, + CRITICAL_ALERTS_ON_DB_OVERSIZE_SETTING => { + if let Err(e) = reload_critical_alerts_on_db_oversize(&db).await { + tracing::error!(error = %e, "Could not reload critical alerts on db oversize setting"); + } + + }, JWT_SECRET_SETTING => { if let Err(e) = reload_jwt_secret_setting(&db).await { tracing::error!(error = %e, "Could not reload jwt secret setting"); @@ -1214,10 +1222,12 @@ pub async fn run_workers( "Starting {num_workers} workers and SLEEP_QUEUE={}ms", *windmill_worker::SLEEP_QUEUE ); + for i in 1..(num_workers + 1) { let wk_conf = &workers[i as usize - 1]; let conn1 = wk_conf.conn.clone(); let worker_name = wk_conf.worker_name.clone(); + WORKERS_NAMES.write().await.push(worker_name.clone()); let ip = ip.clone(); let rx = killpill_rxs.pop().unwrap(); let tx = tx.clone(); diff --git a/backend/src/monitor.rs b/backend/src/monitor.rs index 5d1532c216..393ab0615e 100644 --- a/backend/src/monitor.rs +++ b/backend/src/monitor.rs @@ -13,7 +13,7 @@ use std::{ use chrono::{NaiveDateTime, Utc}; use futures::{stream::FuturesUnordered, StreamExt}; -use serde::de::DeserializeOwned; +use serde::{de::DeserializeOwned, Deserialize}; use sqlx::{Pool, Postgres}; use tokio::{ join, @@ -31,6 +31,8 @@ use windmill_api::{ #[cfg(feature = "enterprise")] use windmill_common::ee::{jobs_waiting_alerts, worker_groups_alerts}; +use windmill_common::ee::low_disk_alerts; + #[cfg(feature = "oauth2")] use windmill_common::global_settings::OAUTH_SETTING; use windmill_common::{ @@ -40,13 +42,14 @@ use windmill_common::{ error, flow_status::{FlowStatus, FlowStatusModule}, global_settings::{ - BASE_URL_SETTING, BUNFIG_INSTALL_SCOPES_SETTING, CRITICAL_ALERT_MUTE_UI_SETTING, - CRITICAL_ERROR_CHANNELS_SETTING, DEFAULT_TAGS_PER_WORKSPACE_SETTING, - DEFAULT_TAGS_WORKSPACES_SETTING, EXPOSE_DEBUG_METRICS_SETTING, EXPOSE_METRICS_SETTING, - EXTRA_PIP_INDEX_URL_SETTING, HUB_BASE_URL_SETTING, INSTANCE_PYTHON_VERSION_SETTING, - JOB_DEFAULT_TIMEOUT_SECS_SETTING, JWT_SECRET_SETTING, KEEP_JOB_DIR_SETTING, - LICENSE_KEY_SETTING, MONITOR_LOGS_ON_OBJECT_STORE_SETTING, NPM_CONFIG_REGISTRY_SETTING, - NUGET_CONFIG_SETTING, OTEL_SETTING, PIP_INDEX_URL_SETTING, REQUEST_SIZE_LIMIT_SETTING, + BASE_URL_SETTING, BUNFIG_INSTALL_SCOPES_SETTING, CRITICAL_ALERTS_ON_DB_OVERSIZE_SETTING, + CRITICAL_ALERT_MUTE_UI_SETTING, CRITICAL_ERROR_CHANNELS_SETTING, + DEFAULT_TAGS_PER_WORKSPACE_SETTING, DEFAULT_TAGS_WORKSPACES_SETTING, + EXPOSE_DEBUG_METRICS_SETTING, EXPOSE_METRICS_SETTING, EXTRA_PIP_INDEX_URL_SETTING, + HUB_BASE_URL_SETTING, INSTANCE_PYTHON_VERSION_SETTING, JOB_DEFAULT_TIMEOUT_SECS_SETTING, + JWT_SECRET_SETTING, KEEP_JOB_DIR_SETTING, LICENSE_KEY_SETTING, + MONITOR_LOGS_ON_OBJECT_STORE_SETTING, NPM_CONFIG_REGISTRY_SETTING, NUGET_CONFIG_SETTING, + OTEL_SETTING, PIP_INDEX_URL_SETTING, REQUEST_SIZE_LIMIT_SETTING, REQUIRE_PREEXISTING_USER_FOR_OAUTH_SETTING, RETENTION_PERIOD_SECS_SETTING, SAML_METADATA_SETTING, SCIM_TOKEN_SETTING, TIMEOUT_WAIT_RESULT_SETTING, }, @@ -65,10 +68,10 @@ use windmill_common::{ DEFAULT_TAGS_WORKSPACES, INDEXER_CONFIG, SCRIPT_TOKEN_EXPIRY, SMTP_CONFIG, TMP_DIR, WORKER_CONFIG, WORKER_GROUP, }, - KillpillSender, BASE_URL, CRITICAL_ALERT_MUTE_UI_ENABLED, CRITICAL_ERROR_CHANNELS, DB, - DEFAULT_HUB_BASE_URL, HUB_BASE_URL, JOB_RETENTION_SECS, METRICS_DEBUG_ENABLED, METRICS_ENABLED, - MONITOR_LOGS_ON_OBJECT_STORE, OTEL_LOGS_ENABLED, OTEL_METRICS_ENABLED, OTEL_TRACING_ENABLED, - SERVICE_LOG_RETENTION_SECS, + KillpillSender, BASE_URL, CRITICAL_ALERTS_ON_DB_OVERSIZE, CRITICAL_ALERT_MUTE_UI_ENABLED, + CRITICAL_ERROR_CHANNELS, DB, DEFAULT_HUB_BASE_URL, HUB_BASE_URL, JOB_RETENTION_SECS, + METRICS_DEBUG_ENABLED, METRICS_ENABLED, MONITOR_LOGS_ON_OBJECT_STORE, OTEL_LOGS_ENABLED, + OTEL_METRICS_ENABLED, OTEL_TRACING_ENABLED, SERVICE_LOG_RETENTION_SECS, }; use windmill_queue::{cancel_job, MiniPulledJob, SameWorkerPayload}; use windmill_worker::{ @@ -134,7 +137,7 @@ lazy_static::lazy_static! { .and_then(|x| x.parse::().ok()) .unwrap_or(false); - + pub static ref WORKERS_NAMES: Arc>> = Arc::new(RwLock::new(Vec::new())); static ref QUEUE_COUNT_TAGS: Arc>> = Arc::new(RwLock::new(Vec::new())); static ref DISABLE_CONCURRENCY_LIMIT: bool = std::env::var("DISABLE_CONCURRENCY_LIMIT").is_ok_and(|s| s == "true"); @@ -183,6 +186,12 @@ pub async fn initial_load( if server_mode { if let Some(db) = conn.as_sql() { load_require_preexisting_user(db).await; + if let Err(e) = reload_critical_alerts_on_db_oversize(db).await { + tracing::error!( + "Error reloading critical alerts on db oversize setting: {:?}", + e + ) + } } } @@ -1347,7 +1356,7 @@ pub async fn monitor_db( conn: &Connection, base_internal_url: &str, server_mode: bool, - _worker_mode: bool, + worker_mode: bool, initial_load: bool, _killpill_tx: KillpillSender, ) { @@ -1406,6 +1415,18 @@ pub async fn monitor_db( } }; + let low_disk_alerts_f = async { + if let Some(db) = conn.as_sql() { + low_disk_alerts( + &db, + server_mode, + worker_mode, + WORKERS_NAMES.read().await.clone(), + ) + .await; + } + }; + let apply_autoscaling_f = async { #[cfg(feature = "enterprise")] if server_mode && !initial_load { @@ -1428,6 +1449,7 @@ pub async fn monitor_db( verify_license_key_f, worker_groups_alerts_f, jobs_waiting_alerts_f, + low_disk_alerts_f, apply_autoscaling_f, update_min_worker_version_f, ); @@ -2183,6 +2205,37 @@ pub async fn reload_critical_error_channels_setting(conn: &DB) -> error::Result< Ok(()) } +pub async fn reload_critical_alerts_on_db_oversize(conn: &DB) -> error::Result<()> { + #[derive(Deserialize)] + struct DBOversize { + enabled: bool, + value: f32, + } + let db_oversize_value = + load_value_from_global_settings(conn, CRITICAL_ALERTS_ON_DB_OVERSIZE_SETTING).await?; + + let db_oversize = if let Some(q) = db_oversize_value { + match serde_json::from_value::(q.clone()) { + Ok(DBOversize { enabled: true, value }) => Some(value), + Ok(_) => None, + Err(q) => { + tracing::error!( + "Could not parse critical_alerts_on_db_oversize setting, found: {:#?}", + &q + ); + None + } + } + } else { + None + }; + + let mut l = CRITICAL_ALERTS_ON_DB_OVERSIZE.write().await; + *l = db_oversize; + + Ok(()) +} + async fn generate_and_save_jwt_secret(db: &DB) -> error::Result { let secret = rd_string(32); sqlx::query!( diff --git a/backend/windmill-common/Cargo.toml b/backend/windmill-common/Cargo.toml index a0278a4c2e..76a6f16962 100644 --- a/backend/windmill-common/Cargo.toml +++ b/backend/windmill-common/Cargo.toml @@ -76,6 +76,8 @@ quick_cache.workspace = true pin-project-lite.workspace = true futures.workspace = true tempfile.workspace = true +systemstat.workspace = true +size.workspace = true opentelemetry-semantic-conventions = { workspace = true, optional = true } opentelemetry-otlp = { workspace = true, optional = true } diff --git a/backend/windmill-common/src/ee.rs b/backend/windmill-common/src/ee.rs index 2a820475f7..a5f5df9b9f 100644 --- a/backend/windmill-common/src/ee.rs +++ b/backend/windmill-common/src/ee.rs @@ -1,4 +1,3 @@ -#[cfg(feature = "enterprise")] use crate::db::DB; use crate::ee::LicensePlan::Community; #[cfg(feature = "enterprise")] @@ -98,3 +97,5 @@ pub async fn worker_groups_alerts(_db: &DB) {} #[cfg(feature = "enterprise")] pub async fn jobs_waiting_alerts(_db: &DB) {} + +pub async fn low_disk_alerts(_db: &DB, _: bool, _: bool, _: Vec) {} diff --git a/backend/windmill-common/src/flows.rs b/backend/windmill-common/src/flows.rs index 1f6c265e7d..15881850ac 100644 --- a/backend/windmill-common/src/flows.rs +++ b/backend/windmill-common/src/flows.rs @@ -22,7 +22,8 @@ use crate::{ error::Error, more_serde::{default_empty_string, default_id, default_null, default_true, is_default}, scripts::{Schema, ScriptHash, ScriptLang}, - worker::{to_raw_value, Connection}, DB, + worker::{to_raw_value, Connection}, + DB, }; #[derive(Serialize, Deserialize, sqlx::FromRow)] diff --git a/backend/windmill-common/src/global_settings.rs b/backend/windmill-common/src/global_settings.rs index 109a0f6056..61184b627c 100644 --- a/backend/windmill-common/src/global_settings.rs +++ b/backend/windmill-common/src/global_settings.rs @@ -37,6 +37,7 @@ pub const HUB_BASE_URL_SETTING: &str = "hub_base_url"; pub const HUB_ACCESSIBLE_URL_SETTING: &str = "hub_accessible_url"; pub const CRITICAL_ERROR_CHANNELS_SETTING: &str = "critical_error_channels"; pub const CRITICAL_ALERT_MUTE_UI_SETTING: &str = "critical_alert_mute_ui"; +pub const CRITICAL_ALERTS_ON_DB_OVERSIZE_SETTING: &str = "critical_alerts_on_db_oversize"; pub const DEV_INSTANCE_SETTING: &str = "dev_instance"; pub const JWT_SECRET_SETTING: &str = "jwt_secret"; pub const EMAIL_DOMAIN_SETTING: &str = "email_domain"; diff --git a/backend/windmill-common/src/lib.rs b/backend/windmill-common/src/lib.rs index 0d2c746d3e..e00e3c5c78 100644 --- a/backend/windmill-common/src/lib.rs +++ b/backend/windmill-common/src/lib.rs @@ -115,6 +115,7 @@ lazy_static::lazy_static! { pub static ref CRITICAL_ERROR_CHANNELS: Arc>> = Arc::new(RwLock::new(vec![])); + pub static ref CRITICAL_ALERTS_ON_DB_OVERSIZE: Arc>> = Arc::new(RwLock::new(None)); pub static ref JOB_RETENTION_SECS: Arc> = Arc::new(RwLock::new(0)); diff --git a/flake.nix b/flake.nix index 5e50c9fc0e..447f498531 100644 --- a/flake.nix +++ b/flake.nix @@ -17,6 +17,7 @@ extensions = [ "rust-src" # for rust-analyzer "rust-analyzer" + "rustfmt" ]; }; buildInputs = with pkgs; [ @@ -183,6 +184,7 @@ ANSIBLE_PLAYBOOK_PATH = "${pkgs.ansible}/bin/ansible-playbook"; ANSIBLE_GALAXY_PATH = "${pkgs.ansible}/bin/ansible-galaxy"; RUST_LOG = "debug"; + SQLX_OFFLINE = "true"; }; packages.default = self.packages.${system}.windmill; packages.windmill-client = pkgs.buildNpmPackage { diff --git a/frontend/src/lib/components/InstanceSetting.svelte b/frontend/src/lib/components/InstanceSetting.svelte index 91de218469..9e619db2a4 100644 --- a/frontend/src/lib/components/InstanceSetting.svelte +++ b/frontend/src/lib/components/InstanceSetting.svelte @@ -334,15 +334,15 @@ latestKeyRenewalAttempt.result === 'success' ? 'text-green-600' : isTrial - ? 'text-yellow-600' - : 'text-red-600' + ? 'text-yellow-600' + : 'text-red-600' )} > {latestKeyRenewalAttempt.result === 'success' ? 'Latest key renewal succeeded' : isTrial - ? 'Latest key renewal ignored because in trial' - : 'Latest key renewal failed'} + ? 'Latest key renewal ignored because in trial' + : 'Latest key renewal failed'} on {attemptedAt}
@@ -928,6 +928,30 @@ {:else if setting.fieldType == 'object_store_config'}
+ {:else if setting.fieldType == 'critical_alerts_on_db_oversize'} + {#if $values[setting.key]} +
+
+ +
+ {#if $values[setting.key].enabled} + + + {/if} +
+
+ {/if} {:else if setting.fieldType == 'number'} = { fieldType: 'smtp_connect', storage: 'setting', ee_only: '' + }, + { + label: 'Alert on DB oversize', + key: 'critical_alerts_on_db_oversize', + description: 'Alert if DB grows more than specified size', + fieldType: 'critical_alerts_on_db_oversize', + placeholder: '100', + storage: 'setting', + ee_only: '' } ], 'OTEL/Prom': [ From afc9cf5940cbca3fcfae410982420751f39b0cd6 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Mon, 5 May 2025 16:19:39 +0200 Subject: [PATCH 340/739] update deps versions (#5703) --- backend/Cargo.lock | 1177 +++++++++++++++++------- backend/Cargo.toml | 15 +- backend/ee-repo-ref.txt | 2 +- backend/src/monitor.rs | 11 +- backend/tests/worker.rs | 8 +- backend/windmill-api/Cargo.toml | 3 +- backend/windmill-api/src/embeddings.rs | 2 +- backend/windmill-common/src/ee.rs | 7 +- 8 files changed, 848 insertions(+), 377 deletions(-) diff --git a/backend/Cargo.lock b/backend/Cargo.lock index 2d787a97ef..7b565ee7cd 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -229,6 +229,15 @@ version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" +[[package]] +name = "arbitrary" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" +dependencies = [ + "derive_arbitrary", +] + [[package]] name = "arc-swap" version = "1.7.1" @@ -279,9 +288,9 @@ dependencies = [ [[package]] name = "arrow" -version = "52.2.0" +version = "55.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05048a8932648b63f21c37d88b552ccc8a65afb6dfe9fc9f30ce79174c2e7a85" +checksum = "3095aaf545942ff5abd46654534f15b03a90fba78299d661e045e5d587222f0d" dependencies = [ "arrow-arith", "arrow-array", @@ -300,41 +309,40 @@ dependencies = [ [[package]] name = "arrow-arith" -version = "52.2.0" +version = "55.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d8a57966e43bfe9a3277984a14c24ec617ad874e4c0e1d2a1b083a39cfbf22c" +checksum = "00752064ff47cee746e816ddb8450520c3a52cbad1e256f6fa861a35f86c45e7" dependencies = [ "arrow-array", "arrow-buffer", "arrow-data", "arrow-schema", "chrono", - "half", "num", ] [[package]] name = "arrow-array" -version = "52.2.0" +version = "55.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16f4a9468c882dc66862cef4e1fd8423d47e67972377d85d80e022786427768c" +checksum = "cebfe926794fbc1f49ddd0cdaf898956ca9f6e79541efce62dabccfd81380472" dependencies = [ "ahash 0.8.11", "arrow-buffer", "arrow-data", "arrow-schema", "chrono", - "chrono-tz 0.9.0", + "chrono-tz", "half", - "hashbrown 0.14.5", + "hashbrown 0.15.3", "num", ] [[package]] name = "arrow-buffer" -version = "52.2.0" +version = "55.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c975484888fc95ec4a632cdc98be39c085b1bb518531b0c80c5d462063e5daa1" +checksum = "0303c7ec4cf1a2c60310fc4d6bbc3350cd051a17bf9e9c0a8e47b4db79277824" dependencies = [ "bytes", "half", @@ -343,9 +351,9 @@ dependencies = [ [[package]] name = "arrow-cast" -version = "52.2.0" +version = "55.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da26719e76b81d8bc3faad1d4dbdc1bcc10d14704e63dc17fc9f3e7e1e567c8e" +checksum = "335f769c5a218ea823d3760a743feba1ef7857cba114c01399a891c2fff34285" dependencies = [ "arrow-array", "arrow-buffer", @@ -364,28 +372,25 @@ dependencies = [ [[package]] name = "arrow-csv" -version = "52.2.0" +version = "55.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c13c36dc5ddf8c128df19bab27898eea64bf9da2b555ec1cd17a8ff57fba9ec2" +checksum = "510db7dfbb4d5761826516cc611d97b3a68835d0ece95b034a052601109c0b1b" dependencies = [ "arrow-array", - "arrow-buffer", "arrow-cast", - "arrow-data", "arrow-schema", "chrono", "csv", "csv-core", "lazy_static", - "lexical-core", "regex", ] [[package]] name = "arrow-data" -version = "52.2.0" +version = "55.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd9d6f18c65ef7a2573ab498c374d8ae364b4a4edf67105357491c031f716ca5" +checksum = "e8affacf3351a24039ea24adab06f316ded523b6f8c3dbe28fbac5f18743451b" dependencies = [ "arrow-buffer", "arrow-schema", @@ -395,13 +400,12 @@ dependencies = [ [[package]] name = "arrow-ipc" -version = "52.2.0" +version = "55.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e786e1cdd952205d9a8afc69397b317cfbb6e0095e445c69cda7e8da5c1eeb0f" +checksum = "69880a9e6934d9cba2b8630dd08a3463a91db8693b16b499d54026b6137af284" dependencies = [ "arrow-array", "arrow-buffer", - "arrow-cast", "arrow-data", "arrow-schema", "flatbuffers", @@ -410,9 +414,9 @@ dependencies = [ [[package]] name = "arrow-json" -version = "52.2.0" +version = "55.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb22284c5a2a01d73cebfd88a33511a3234ab45d66086b2ca2d1228c3498e445" +checksum = "d8dafd17a05449e31e0114d740530e0ada7379d7cb9c338fd65b09a8130960b0" dependencies = [ "arrow-array", "arrow-buffer", @@ -423,33 +427,32 @@ dependencies = [ "half", "indexmap 2.9.0", "lexical-core", + "memchr", "num", "serde", "serde_json", + "simdutf8", ] [[package]] name = "arrow-ord" -version = "52.2.0" +version = "55.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42745f86b1ab99ef96d1c0bcf49180848a64fe2c7a7a0d945bc64fa2b21ba9bc" +checksum = "895644523af4e17502d42c3cb6b27cb820f0cb77954c22d75c23a85247c849e1" dependencies = [ "arrow-array", "arrow-buffer", "arrow-data", "arrow-schema", "arrow-select", - "half", - "num", ] [[package]] name = "arrow-row" -version = "52.2.0" +version = "55.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd09a518c602a55bd406bcc291a967b284cfa7a63edfbf8b897ea4748aad23c" +checksum = "9be8a2a4e5e7d9c822b2b8095ecd77010576d824f654d347817640acfc97d229" dependencies = [ - "ahash 0.8.11", "arrow-array", "arrow-buffer", "arrow-data", @@ -459,15 +462,15 @@ dependencies = [ [[package]] name = "arrow-schema" -version = "52.2.0" +version = "55.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e972cd1ff4a4ccd22f86d3e53e835c2ed92e0eea6a3e8eadb72b4f1ac802cf8" +checksum = "7450c76ab7c5a6805be3440dc2e2096010da58f7cab301fdc996a4ee3ee74e49" [[package]] name = "arrow-select" -version = "52.2.0" +version = "55.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "600bae05d43483d216fb3494f8c32fdbefd8aa4e1de237e790dbb3d9f44690a3" +checksum = "aa5f5a93c75f46ef48e4001535e7b6c922eeb0aa20b73cf58d09e13d057490d8" dependencies = [ "ahash 0.8.11", "arrow-array", @@ -479,9 +482,9 @@ dependencies = [ [[package]] name = "arrow-string" -version = "52.2.0" +version = "55.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0dc1985b67cb45f6606a248ac2b4a288849f196bab8c657ea5589f47cdd55e6" +checksum = "6e7005d858d84b56428ba2a98a107fe88c0132c61793cf6b8232a1f9bfc0452b" dependencies = [ "arrow-array", "arrow-buffer", @@ -572,7 +575,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06575e6a9673580f52661c92107baabffbf41e2141373441cbcdc47cb733003c" dependencies = [ "brotli 7.0.0", - "bzip2 0.5.2", + "bzip2", "flate2", "futures-core", "futures-io", @@ -1696,16 +1699,6 @@ version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2e93abca9e28e0a1b9877922aacb20576e05d4679ffa78c3d6dc22a26a216659" -[[package]] -name = "bzip2" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" -dependencies = [ - "bzip2-sys", - "libc", -] - [[package]] name = "bzip2" version = "0.5.2" @@ -1733,30 +1726,31 @@ checksum = "1bf2a5fb3207c12b5d208ebc145f967fea5cac41a021c37417ccc31ba40f39ee" [[package]] name = "candle-core" -version = "0.3.3" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db8659ea87ee8197d2fc627348916cce0561330ee7ae3874e771691d3cecb2f" +checksum = "a9f51e2ecf6efe9737af8f993433c839f956d2b6ed4fd2dd4a7c6d8b0fa667ff" dependencies = [ "byteorder", - "gemm", + "gemm 0.17.1", "half", "memmap2 0.9.5", "num-traits", "num_cpus", - "rand 0.8.5", - "rand_distr", + "rand 0.9.0", + "rand_distr 0.5.1", "rayon", "safetensors", "thiserror 1.0.69", + "ug", "yoke", "zip", ] [[package]] name = "candle-nn" -version = "0.3.3" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ddce8312032760a6791d6adc9c56dc54fd7c1be38d85dcc4862f1c75228bbc7" +checksum = "c1980d53280c8f9e2c6cbe1785855d7ff8010208b46e21252b978badf13ad69d" dependencies = [ "candle-core", "half", @@ -1769,21 +1763,21 @@ dependencies = [ [[package]] name = "candle-transformers" -version = "0.3.3" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68834a0cacb7e002d1f4abfe26a7cd1237e2ba342fddcf2e30913c4edb96409d" +checksum = "186cb80045dbe47e0b387ea6d3e906f02fb3056297080d9922984c90e90a72b0" dependencies = [ "byteorder", "candle-core", "candle-nn", + "fancy-regex 0.13.0", "num-traits", - "rand 0.8.5", + "rand 0.9.0", "rayon", "serde", "serde_json", "serde_plain", "tracing", - "wav", ] [[package]] @@ -1872,9 +1866,9 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrono" -version = "0.4.39" +version = "0.4.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" dependencies = [ "android-tzdata", "iana-time-zone", @@ -1883,7 +1877,7 @@ dependencies = [ "pure-rust-locales", "serde", "wasm-bindgen", - "windows-targets 0.52.6", + "windows-link", ] [[package]] @@ -1895,17 +1889,6 @@ dependencies = [ "chrono", ] -[[package]] -name = "chrono-tz" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93698b29de5e97ad0ae26447b344c482a7284c737d9ddc5f9e52b74a336671bb" -dependencies = [ - "chrono", - "chrono-tz-build 0.3.0", - "phf", -] - [[package]] name = "chrono-tz" version = "0.10.3" @@ -1913,21 +1896,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "efdce149c370f133a071ca8ef6ea340b7b88748ab0810097a9e2976eaa34b4f3" dependencies = [ "chrono", - "chrono-tz-build 0.4.1", + "chrono-tz-build", "phf", ] -[[package]] -name = "chrono-tz-build" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c088aee841df9c3041febbb73934cfc39708749bf96dc827e3359cd39ef11b1" -dependencies = [ - "parse-zoneinfo", - "phf", - "phf_codegen", -] - [[package]] name = "chrono-tz-build" version = "0.4.1" @@ -2568,6 +2540,20 @@ dependencies = [ "parking_lot_core 0.9.10", ] +[[package]] +name = "dashmap" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core 0.9.10", +] + [[package]] name = "data-encoding" version = "2.9.0" @@ -2582,52 +2568,53 @@ checksum = "5c297a1c74b71ae29df00c3e22dd9534821d60eb9af5a0192823fa2acea70c2a" [[package]] name = "datafusion" -version = "39.0.0" +version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f92d2d7a9cba4580900b32b009848d9eb35f1028ac84cdd6ddcf97612cd0068" +checksum = "ffe060b978f74ab446be722adb8a274e052e005bf6dfd171caadc3abaad10080" dependencies = [ - "ahash 0.8.11", "arrow", - "arrow-array", "arrow-ipc", "arrow-schema", - "async-compression", "async-trait", "bytes", - "bzip2 0.4.4", + "bzip2", "chrono", - "dashmap", + "datafusion-catalog", + "datafusion-catalog-listing", "datafusion-common", "datafusion-common-runtime", + "datafusion-datasource", + "datafusion-datasource-csv", + "datafusion-datasource-json", + "datafusion-datasource-parquet", "datafusion-execution", "datafusion-expr", + "datafusion-expr-common", "datafusion-functions", "datafusion-functions-aggregate", - "datafusion-functions-array", + "datafusion-functions-nested", + "datafusion-functions-table", + "datafusion-functions-window", + "datafusion-macros", "datafusion-optimizer", "datafusion-physical-expr", "datafusion-physical-expr-common", + "datafusion-physical-optimizer", "datafusion-physical-plan", + "datafusion-session", "datafusion-sql", "flate2", "futures", - "glob", - "half", - "hashbrown 0.14.5", - "indexmap 2.9.0", - "itertools 0.12.1", + "itertools 0.14.0", "log", - "num_cpus", "object_store", "parking_lot 0.12.3", "parquet", - "paste", - "pin-project-lite", "rand 0.8.5", + "regex", "sqlparser", "tempfile", "tokio", - "tokio-util", "url", "uuid", "xz2", @@ -2635,49 +2622,223 @@ dependencies = [ ] [[package]] -name = "datafusion-common" -version = "39.0.0" +name = "datafusion-catalog" +version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "effed030d2c1667eb1e11df5372d4981eaf5d11a521be32220b3985ae5ba6971" +checksum = "61fe34f401bd03724a1f96d12108144f8cd495a3cdda2bf5e091822fb80b7e66" dependencies = [ - "ahash 0.8.11", "arrow", - "arrow-array", - "arrow-buffer", - "arrow-schema", - "chrono", - "half", - "hashbrown 0.14.5", - "instant", - "libc", - "num_cpus", + "async-trait", + "dashmap 6.1.0", + "datafusion-common", + "datafusion-common-runtime", + "datafusion-datasource", + "datafusion-execution", + "datafusion-expr", + "datafusion-physical-expr", + "datafusion-physical-plan", + "datafusion-session", + "datafusion-sql", + "futures", + "itertools 0.14.0", + "log", "object_store", - "parquet", - "sqlparser", -] - -[[package]] -name = "datafusion-common-runtime" -version = "39.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0091318129dad1359f08e4c6c71f855163c35bba05d1dbf983196f727857894" -dependencies = [ + "parking_lot 0.12.3", "tokio", ] [[package]] -name = "datafusion-execution" -version = "39.0.0" +name = "datafusion-catalog-listing" +version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8385aba84fc4a06d3ebccfbcbf9b4f985e80c762fac634b49079f7cc14933fb1" +checksum = "a4411b8e3bce5e0fc7521e44f201def2e2d5d1b5f176fb56e8cdc9942c890f00" dependencies = [ "arrow", + "async-trait", + "datafusion-catalog", + "datafusion-common", + "datafusion-datasource", + "datafusion-execution", + "datafusion-expr", + "datafusion-physical-expr", + "datafusion-physical-expr-common", + "datafusion-physical-plan", + "datafusion-session", + "futures", + "log", + "object_store", + "tokio", +] + +[[package]] +name = "datafusion-common" +version = "47.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0734015d81c8375eb5d4869b7f7ecccc2ee8d6cb81948ef737cd0e7b743bd69c" +dependencies = [ + "ahash 0.8.11", + "arrow", + "arrow-ipc", + "base64 0.22.1", + "half", + "hashbrown 0.14.5", + "indexmap 2.9.0", + "libc", + "log", + "object_store", + "parquet", + "paste", + "recursive", + "sqlparser", + "tokio", + "web-time", +] + +[[package]] +name = "datafusion-common-runtime" +version = "47.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5167bb1d2ccbb87c6bc36c295274d7a0519b14afcfdaf401d53cbcaa4ef4968b" +dependencies = [ + "futures", + "log", + "tokio", +] + +[[package]] +name = "datafusion-datasource" +version = "47.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04e602dcdf2f50c2abf297cc2203c73531e6f48b29516af7695d338cf2a778b1" +dependencies = [ + "arrow", + "async-compression", + "async-trait", + "bytes", + "bzip2", "chrono", - "dashmap", + "datafusion-common", + "datafusion-common-runtime", + "datafusion-execution", + "datafusion-expr", + "datafusion-physical-expr", + "datafusion-physical-expr-common", + "datafusion-physical-plan", + "datafusion-session", + "flate2", + "futures", + "glob", + "itertools 0.14.0", + "log", + "object_store", + "parquet", + "rand 0.8.5", + "tempfile", + "tokio", + "tokio-util", + "url", + "xz2", + "zstd", +] + +[[package]] +name = "datafusion-datasource-csv" +version = "47.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bb2253952dc32296ed5b84077cb2e0257fea4be6373e1c376426e17ead4ef6" +dependencies = [ + "arrow", + "async-trait", + "bytes", + "datafusion-catalog", + "datafusion-common", + "datafusion-common-runtime", + "datafusion-datasource", + "datafusion-execution", + "datafusion-expr", + "datafusion-physical-expr", + "datafusion-physical-expr-common", + "datafusion-physical-plan", + "datafusion-session", + "futures", + "object_store", + "regex", + "tokio", +] + +[[package]] +name = "datafusion-datasource-json" +version = "47.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8c7f47a5d2fe03bfa521ec9bafdb8a5c82de8377f60967c3663f00c8790352" +dependencies = [ + "arrow", + "async-trait", + "bytes", + "datafusion-catalog", + "datafusion-common", + "datafusion-common-runtime", + "datafusion-datasource", + "datafusion-execution", + "datafusion-expr", + "datafusion-physical-expr", + "datafusion-physical-expr-common", + "datafusion-physical-plan", + "datafusion-session", + "futures", + "object_store", + "serde_json", + "tokio", +] + +[[package]] +name = "datafusion-datasource-parquet" +version = "47.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27d15868ea39ed2dc266728b554f6304acd473de2142281ecfa1294bb7415923" +dependencies = [ + "arrow", + "async-trait", + "bytes", + "datafusion-catalog", + "datafusion-common", + "datafusion-common-runtime", + "datafusion-datasource", + "datafusion-execution", + "datafusion-expr", + "datafusion-functions-aggregate", + "datafusion-physical-expr", + "datafusion-physical-expr-common", + "datafusion-physical-optimizer", + "datafusion-physical-plan", + "datafusion-session", + "futures", + "itertools 0.14.0", + "log", + "object_store", + "parking_lot 0.12.3", + "parquet", + "rand 0.8.5", + "tokio", +] + +[[package]] +name = "datafusion-doc" +version = "47.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a91f8c2c5788ef32f48ff56c68e5b545527b744822a284373ac79bba1ba47292" + +[[package]] +name = "datafusion-execution" +version = "47.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06f004d100f49a3658c9da6fb0c3a9b760062d96cd4ad82ccc3b7b69a9fb2f84" +dependencies = [ + "arrow", + "dashmap 6.1.0", "datafusion-common", "datafusion-expr", "futures", - "hashbrown 0.14.5", "log", "object_store", "parking_lot 0.12.3", @@ -2688,41 +2849,58 @@ dependencies = [ [[package]] name = "datafusion-expr" -version = "39.0.0" +version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebb192f0055d2ce64e38ac100abc18e4e6ae9734d3c28eee522bbbd6a32108a3" +checksum = "7a4e4ce3802609be38eeb607ee72f6fe86c3091460de9dbfae9e18db423b3964" dependencies = [ - "ahash 0.8.11", "arrow", - "arrow-array", - "arrow-buffer", "chrono", "datafusion-common", + "datafusion-doc", + "datafusion-expr-common", + "datafusion-functions-aggregate-common", + "datafusion-functions-window-common", + "datafusion-physical-expr-common", + "indexmap 2.9.0", "paste", + "recursive", "serde_json", "sqlparser", - "strum 0.26.3", - "strum_macros 0.26.4", +] + +[[package]] +name = "datafusion-expr-common" +version = "47.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "422ac9cf3b22bbbae8cdf8ceb33039107fde1b5492693168f13bd566b1bcc839" +dependencies = [ + "arrow", + "datafusion-common", + "indexmap 2.9.0", + "itertools 0.14.0", + "paste", ] [[package]] name = "datafusion-functions" -version = "39.0.0" +version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27c081ae5b7edd712b92767fb8ed5c0e32755682f8075707666cd70835807c0b" +checksum = "2ddf0a0a2db5d2918349c978d42d80926c6aa2459cd8a3c533a84ec4bb63479e" dependencies = [ "arrow", + "arrow-buffer", "base64 0.22.1", "blake2", "blake3", "chrono", "datafusion-common", + "datafusion-doc", "datafusion-execution", "datafusion-expr", - "datafusion-physical-expr", - "hashbrown 0.14.5", + "datafusion-expr-common", + "datafusion-macros", "hex", - "itertools 0.12.1", + "itertools 0.14.0", "log", "md-5 0.10.6", "rand 0.8.5", @@ -2734,114 +2912,195 @@ dependencies = [ [[package]] name = "datafusion-functions-aggregate" -version = "39.0.0" +version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "feb28a4ea52c28a26990646986a27c4052829a2a2572386258679e19263f8b78" +checksum = "408a05dafdc70d05a38a29005b8b15e21b0238734dab1e98483fcb58038c5aba" dependencies = [ "ahash 0.8.11", "arrow", - "arrow-schema", "datafusion-common", + "datafusion-doc", "datafusion-execution", "datafusion-expr", + "datafusion-functions-aggregate-common", + "datafusion-macros", + "datafusion-physical-expr", "datafusion-physical-expr-common", + "half", "log", "paste", - "sqlparser", ] [[package]] -name = "datafusion-functions-array" -version = "39.0.0" +name = "datafusion-functions-aggregate-common" +version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b17c02a74cdc87380a56758ec27e7d417356bf806f33062700908929aedb8a" +checksum = "756d21da2dd6c9bef97af1504970ff56cbf35d03fbd4ffd62827f02f4d2279d4" +dependencies = [ + "ahash 0.8.11", + "arrow", + "datafusion-common", + "datafusion-expr-common", + "datafusion-physical-expr-common", +] + +[[package]] +name = "datafusion-functions-nested" +version = "47.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d8d50f6334b378930d992d801a10ac5b3e93b846b39e4a05085742572844537" dependencies = [ "arrow", - "arrow-array", - "arrow-buffer", "arrow-ord", - "arrow-schema", "datafusion-common", + "datafusion-doc", "datafusion-execution", "datafusion-expr", "datafusion-functions", - "itertools 0.12.1", + "datafusion-functions-aggregate", + "datafusion-macros", + "datafusion-physical-expr-common", + "itertools 0.14.0", "log", "paste", ] +[[package]] +name = "datafusion-functions-table" +version = "47.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc9a97220736c8fff1446e936be90d57216c06f28969f9ffd3b72ac93c958c8a" +dependencies = [ + "arrow", + "async-trait", + "datafusion-catalog", + "datafusion-common", + "datafusion-expr", + "datafusion-physical-plan", + "parking_lot 0.12.3", + "paste", +] + +[[package]] +name = "datafusion-functions-window" +version = "47.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cefc2d77646e1aadd1d6a9c40088937aedec04e68c5f0465939912e1291f8193" +dependencies = [ + "datafusion-common", + "datafusion-doc", + "datafusion-expr", + "datafusion-functions-window-common", + "datafusion-macros", + "datafusion-physical-expr", + "datafusion-physical-expr-common", + "log", + "paste", +] + +[[package]] +name = "datafusion-functions-window-common" +version = "47.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd4aff082c42fa6da99ce0698c85addd5252928c908eb087ca3cfa64ff16b313" +dependencies = [ + "datafusion-common", + "datafusion-physical-expr-common", +] + +[[package]] +name = "datafusion-macros" +version = "47.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df6f88d7ee27daf8b108ba910f9015176b36fbc72902b1ca5c2a5f1d1717e1a1" +dependencies = [ + "datafusion-expr", + "quote", + "syn 2.0.101", +] + [[package]] name = "datafusion-optimizer" -version = "39.0.0" +version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12172f2a6c9eb4992a51e62d709eeba5dedaa3b5369cce37ff6c2260e100ba76" +checksum = "084d9f979c4b155346d3c34b18f4256e6904ded508e9554d90fed416415c3515" dependencies = [ "arrow", - "async-trait", "chrono", "datafusion-common", "datafusion-expr", "datafusion-physical-expr", - "hashbrown 0.14.5", "indexmap 2.9.0", - "itertools 0.12.1", + "itertools 0.14.0", "log", + "recursive", + "regex", "regex-syntax 0.8.5", ] [[package]] name = "datafusion-physical-expr" -version = "39.0.0" +version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a3fce531b623e94180f6cd33d620ef01530405751b6ddd2fd96250cdbd78e2e" +checksum = "64c536062b0076f4e30084065d805f389f9fe38af0ca75bcbac86bc5e9fbab65" dependencies = [ "ahash 0.8.11", "arrow", - "arrow-array", - "arrow-buffer", - "arrow-ord", - "arrow-schema", - "arrow-string", - "base64 0.22.1", - "chrono", "datafusion-common", - "datafusion-execution", "datafusion-expr", - "datafusion-functions-aggregate", + "datafusion-expr-common", + "datafusion-functions-aggregate-common", "datafusion-physical-expr-common", "half", "hashbrown 0.14.5", - "hex", "indexmap 2.9.0", - "itertools 0.12.1", + "itertools 0.14.0", "log", "paste", - "petgraph 0.6.5", - "regex", + "petgraph", ] [[package]] name = "datafusion-physical-expr-common" -version = "39.0.0" +version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046400b6a2cc3ed57a7c576f5ae6aecc77804ac8e0186926b278b189305b2a77" +checksum = "f8a92b53b3193fac1916a1c5b8e3f4347c526f6822e56b71faa5fb372327a863" +dependencies = [ + "ahash 0.8.11", + "arrow", + "datafusion-common", + "datafusion-expr-common", + "hashbrown 0.14.5", + "itertools 0.14.0", +] + +[[package]] +name = "datafusion-physical-optimizer" +version = "47.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fa0a5ac94c7cf3da97bedabd69d6bbca12aef84b9b37e6e9e8c25286511b5e2" dependencies = [ "arrow", "datafusion-common", + "datafusion-execution", "datafusion-expr", - "rand 0.8.5", + "datafusion-expr-common", + "datafusion-physical-expr", + "datafusion-physical-expr-common", + "datafusion-physical-plan", + "itertools 0.14.0", + "log", + "recursive", ] [[package]] name = "datafusion-physical-plan" -version = "39.0.0" +version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4aed47f5a2ad8766260befb375b201592e86a08b260256e168ae4311426a2bff" +checksum = "690c615db468c2e5fe5085b232d8b1c088299a6c63d87fd960a354a71f7acb55" dependencies = [ "ahash 0.8.11", "arrow", - "arrow-array", - "arrow-buffer", "arrow-ord", "arrow-schema", "async-trait", @@ -2850,37 +3109,59 @@ dependencies = [ "datafusion-common-runtime", "datafusion-execution", "datafusion-expr", - "datafusion-functions-aggregate", + "datafusion-functions-window-common", "datafusion-physical-expr", "datafusion-physical-expr-common", "futures", "half", "hashbrown 0.14.5", "indexmap 2.9.0", - "itertools 0.12.1", + "itertools 0.14.0", "log", - "once_cell", "parking_lot 0.12.3", "pin-project-lite", - "rand 0.8.5", + "tokio", +] + +[[package]] +name = "datafusion-session" +version = "47.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad229a134c7406c057ece00c8743c0c34b97f4e72f78b475fe17b66c5e14fa4f" +dependencies = [ + "arrow", + "async-trait", + "dashmap 6.1.0", + "datafusion-common", + "datafusion-common-runtime", + "datafusion-execution", + "datafusion-expr", + "datafusion-physical-expr", + "datafusion-physical-plan", + "datafusion-sql", + "futures", + "itertools 0.14.0", + "log", + "object_store", + "parking_lot 0.12.3", "tokio", ] [[package]] name = "datafusion-sql" -version = "39.0.0" +version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fa92bb1fd15e46ce5fb6f1c85f3ac054592560f294429a28e392b5f9cd4255e" +checksum = "64f6ab28b72b664c21a27b22a2ff815fd390ed224c26e89a93b5a8154a4e8607" dependencies = [ "arrow", - "arrow-array", - "arrow-schema", + "bigdecimal", "datafusion-common", "datafusion-expr", + "indexmap 2.9.0", "log", + "recursive", "regex", "sqlparser", - "strum 0.26.3", ] [[package]] @@ -3562,8 +3843,8 @@ dependencies = [ "proc-macro2", "quote", "stringcase", - "strum 0.25.0", - "strum_macros 0.25.3", + "strum", + "strum_macros", "syn 2.0.101", "thiserror 2.0.12", ] @@ -3684,7 +3965,7 @@ dependencies = [ "async-trait", "base32", "boxed_error", - "dashmap", + "dashmap 5.5.3", "deno_cache_dir", "deno_config", "deno_error", @@ -4079,6 +4360,17 @@ dependencies = [ "serde", ] +[[package]] +name = "derive_arbitrary" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "derive_builder" version = "0.12.0" @@ -4263,12 +4555,6 @@ dependencies = [ "syn 2.0.101", ] -[[package]] -name = "doc-comment" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" - [[package]] name = "document-features" version = "0.2.11" @@ -4355,6 +4641,15 @@ dependencies = [ "reborrow", ] +[[package]] +name = "dyn-stack" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "490bd48eb68fffcfed519b4edbfd82c69cbe741d175b84f0e0cbe8c57cbe0bdd" +dependencies = [ + "bytemuck", +] + [[package]] name = "dynasm" version = "1.2.3" @@ -4630,6 +4925,17 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" +[[package]] +name = "fancy-regex" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "531e46835a22af56d1e3b66f04844bed63158bc094a628bec1d321d9b4c44bf2" +dependencies = [ + "bit-set 0.5.3", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", +] + [[package]] name = "fancy-regex" version = "0.14.0" @@ -4736,12 +5042,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "fixedbitset" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" - [[package]] name = "fixedbitset" version = "0.5.7" @@ -4750,11 +5050,11 @@ checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" [[package]] name = "flatbuffers" -version = "24.12.23" +version = "25.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f1baf0dbf96932ec9a3038d57900329c015b0bfb7b63d904f3bc27e2b02a096" +checksum = "1045398c1bfd89168b5fd3f1fc11f6e70b34f6f66300c87d44d3de849463abf1" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.9.0", "rustc_version 0.4.1", ] @@ -4765,6 +5065,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" dependencies = [ "crc32fast", + "libz-rs-sys", "libz-sys", "miniz_oxide 0.8.8", ] @@ -5066,17 +5367,37 @@ version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ab24cc62135b40090e31a76a9b2766a501979f3070fa27f689c27ec04377d32" dependencies = [ - "dyn-stack", - "gemm-c32", - "gemm-c64", - "gemm-common", - "gemm-f16", - "gemm-f32", - "gemm-f64", + "dyn-stack 0.10.0", + "gemm-c32 0.17.1", + "gemm-c64 0.17.1", + "gemm-common 0.17.1", + "gemm-f16 0.17.1", + "gemm-f32 0.17.1", + "gemm-f64 0.17.1", "num-complex", "num-traits", "paste", - "raw-cpuid", + "raw-cpuid 10.7.0", + "seq-macro", +] + +[[package]] +name = "gemm" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab96b703d31950f1aeddded248bc95543c9efc7ac9c4a21fda8703a83ee35451" +dependencies = [ + "dyn-stack 0.13.0", + "gemm-c32 0.18.2", + "gemm-c64 0.18.2", + "gemm-common 0.18.2", + "gemm-f16 0.18.2", + "gemm-f32 0.18.2", + "gemm-f64 0.18.2", + "num-complex", + "num-traits", + "paste", + "raw-cpuid 11.5.0", "seq-macro", ] @@ -5086,12 +5407,27 @@ version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9c030d0b983d1e34a546b86e08f600c11696fde16199f971cd46c12e67512c0" dependencies = [ - "dyn-stack", - "gemm-common", + "dyn-stack 0.10.0", + "gemm-common 0.17.1", "num-complex", "num-traits", "paste", - "raw-cpuid", + "raw-cpuid 10.7.0", + "seq-macro", +] + +[[package]] +name = "gemm-c32" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6db9fd9f40421d00eea9dd0770045a5603b8d684654816637732463f4073847" +dependencies = [ + "dyn-stack 0.13.0", + "gemm-common 0.18.2", + "num-complex", + "num-traits", + "paste", + "raw-cpuid 11.5.0", "seq-macro", ] @@ -5101,12 +5437,27 @@ version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbb5f2e79fefb9693d18e1066a557b4546cd334b226beadc68b11a8f9431852a" dependencies = [ - "dyn-stack", - "gemm-common", + "dyn-stack 0.10.0", + "gemm-common 0.17.1", "num-complex", "num-traits", "paste", - "raw-cpuid", + "raw-cpuid 10.7.0", + "seq-macro", +] + +[[package]] +name = "gemm-c64" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfcad8a3d35a43758330b635d02edad980c1e143dc2f21e6fd25f9e4eada8edf" +dependencies = [ + "dyn-stack 0.13.0", + "gemm-common 0.18.2", + "num-complex", + "num-traits", + "paste", + "raw-cpuid 11.5.0", "seq-macro", ] @@ -5117,17 +5468,38 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2e7ea062c987abcd8db95db917b4ffb4ecdfd0668471d8dc54734fdff2354e8" dependencies = [ "bytemuck", - "dyn-stack", + "dyn-stack 0.10.0", "half", "num-complex", "num-traits", "once_cell", "paste", - "pulp", - "raw-cpuid", + "pulp 0.18.22", + "raw-cpuid 10.7.0", "rayon", "seq-macro", - "sysctl", + "sysctl 0.5.5", +] + +[[package]] +name = "gemm-common" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a352d4a69cbe938b9e2a9cb7a3a63b7e72f9349174a2752a558a8a563510d0f3" +dependencies = [ + "bytemuck", + "dyn-stack 0.13.0", + "half", + "libm", + "num-complex", + "num-traits", + "once_cell", + "paste", + "pulp 0.21.5", + "raw-cpuid 11.5.0", + "rayon", + "seq-macro", + "sysctl 0.6.0", ] [[package]] @@ -5136,14 +5508,32 @@ version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ca4c06b9b11952071d317604acb332e924e817bd891bec8dfb494168c7cedd4" dependencies = [ - "dyn-stack", - "gemm-common", - "gemm-f32", + "dyn-stack 0.10.0", + "gemm-common 0.17.1", + "gemm-f32 0.17.1", "half", "num-complex", "num-traits", "paste", - "raw-cpuid", + "raw-cpuid 10.7.0", + "rayon", + "seq-macro", +] + +[[package]] +name = "gemm-f16" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff95ae3259432f3c3410eaa919033cd03791d81cebd18018393dc147952e109" +dependencies = [ + "dyn-stack 0.13.0", + "gemm-common 0.18.2", + "gemm-f32 0.18.2", + "half", + "num-complex", + "num-traits", + "paste", + "raw-cpuid 11.5.0", "rayon", "seq-macro", ] @@ -5154,12 +5544,27 @@ version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e9a69f51aaefbd9cf12d18faf273d3e982d9d711f60775645ed5c8047b4ae113" dependencies = [ - "dyn-stack", - "gemm-common", + "dyn-stack 0.10.0", + "gemm-common 0.17.1", "num-complex", "num-traits", "paste", - "raw-cpuid", + "raw-cpuid 10.7.0", + "seq-macro", +] + +[[package]] +name = "gemm-f32" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc8d3d4385393304f407392f754cd2dc4b315d05063f62cf09f47b58de276864" +dependencies = [ + "dyn-stack 0.13.0", + "gemm-common 0.18.2", + "num-complex", + "num-traits", + "paste", + "raw-cpuid 11.5.0", "seq-macro", ] @@ -5169,12 +5574,27 @@ version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa397a48544fadf0b81ec8741e5c0fba0043008113f71f2034def1935645d2b0" dependencies = [ - "dyn-stack", - "gemm-common", + "dyn-stack 0.10.0", + "gemm-common 0.17.1", "num-complex", "num-traits", "paste", - "raw-cpuid", + "raw-cpuid 10.7.0", + "seq-macro", +] + +[[package]] +name = "gemm-f64" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35b2a4f76ce4b8b16eadc11ccf2e083252d8237c1b589558a49b0183545015bd" +dependencies = [ + "dyn-stack 0.13.0", + "gemm-common 0.18.2", + "num-complex", + "num-traits", + "paste", + "raw-cpuid 11.5.0", "seq-macro", ] @@ -5442,7 +5862,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5eb37859fda6792e95231aef1c5838f4043ec0ee352d8313421e311c606df612" dependencies = [ "anyhow", - "strum 0.25.0", + "strum", "thiserror 1.0.69", "unic-ucd-category", ] @@ -5546,16 +5966,16 @@ dependencies = [ [[package]] name = "half" -version = "2.4.1" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" dependencies = [ "bytemuck", "cfg-if", "crunchy", "num-traits", - "rand 0.8.5", - "rand_distr", + "rand 0.9.0", + "rand_distr 0.5.1", ] [[package]] @@ -6665,9 +7085,9 @@ checksum = "0c2cdeb66e45e9f36bfad5bbdb4d2384e70936afbee843c6f6543f0c551ebb25" [[package]] name = "lexical-core" -version = "0.8.5" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cde5de06e8d4c2faabc400238f9ae1c74d5412d03a7bd067645ccbc47070e46" +checksum = "b765c31809609075565a70b4b71402281283aeda7ecaf4818ac14a7b2ade8958" dependencies = [ "lexical-parse-float", "lexical-parse-integer", @@ -6678,9 +7098,9 @@ dependencies = [ [[package]] name = "lexical-parse-float" -version = "0.8.5" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683b3a5ebd0130b8fb52ba0bdc718cc56815b6a097e28ae5a6997d0ad17dc05f" +checksum = "de6f9cb01fb0b08060209a057c048fcbab8717b4c1ecd2eac66ebfe39a65b0f2" dependencies = [ "lexical-parse-integer", "lexical-util", @@ -6689,9 +7109,9 @@ dependencies = [ [[package]] name = "lexical-parse-integer" -version = "0.8.6" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d0994485ed0c312f6d965766754ea177d07f9c00c9b82a5ee62ed5b47945ee9" +checksum = "72207aae22fc0a121ba7b6d479e42cbfea549af1479c3f3a4f12c70dd66df12e" dependencies = [ "lexical-util", "static_assertions", @@ -6699,18 +7119,18 @@ dependencies = [ [[package]] name = "lexical-util" -version = "0.8.5" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5255b9ff16ff898710eb9eb63cb39248ea8a5bb036bea8085b1a767ff6c4e3fc" +checksum = "5a82e24bf537fd24c177ffbbdc6ebcc8d54732c35b50a3f28cc3f4e4c949a0b3" dependencies = [ "static_assertions", ] [[package]] name = "lexical-write-float" -version = "0.8.5" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accabaa1c4581f05a3923d1b4cfd124c329352288b7b9da09e766b0668116862" +checksum = "c5afc668a27f460fb45a81a757b6bf2f43c2d7e30cb5a2dcd3abf294c78d62bd" dependencies = [ "lexical-util", "lexical-write-integer", @@ -6719,9 +7139,9 @@ dependencies = [ [[package]] name = "lexical-write-integer" -version = "0.8.5" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1b6f3d1f4422866b68192d62f77bc5c700bee84f3069f2469d7bc8c77852446" +checksum = "629ddff1a914a836fb245616a7888b62903aae58fa771e1d83943035efa0f978" dependencies = [ "lexical-util", "static_assertions", @@ -6822,6 +7242,15 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "libz-rs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6489ca9bd760fe9642d7644e827b0c9add07df89857b0416ee15c1cc1a3b8c5a" +dependencies = [ + "zlib-rs", +] + [[package]] name = "libz-sys" version = "1.1.22" @@ -7612,7 +8041,7 @@ dependencies = [ "anyhow", "async-trait", "boxed_error", - "dashmap", + "dashmap 5.5.3", "deno_error", "deno_media_type", "deno_package_json", @@ -7769,7 +8198,7 @@ dependencies = [ "chrono-humanize", "dirs 5.0.1", "dirs-sys 0.4.1", - "fancy-regex", + "fancy-regex 0.14.0", "heck 0.5.0", "indexmap 2.9.0", "log", @@ -7814,7 +8243,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d1468fa8e6e12d9d53c90b44f3d11a37d87502d7a30d145f122341c5b33745" dependencies = [ "crossterm_winapi", - "fancy-regex", + "fancy-regex 0.14.0", "log", "lscolors", "nix 0.29.0", @@ -8023,28 +8452,33 @@ dependencies = [ [[package]] name = "object_store" -version = "0.10.2" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6da452820c715ce78221e8202ccc599b4a52f3e1eb3eedb487b680c81a8e3f3" +checksum = "e9ce831b09395f933addbc56d894d889e4b226eba304d4e7adbab591e26daf1e" dependencies = [ "async-trait", "base64 0.22.1", "bytes", "chrono", + "form_urlencoded", "futures", + "http 1.3.1", + "http-body-util", + "httparse", "humantime", "hyper 1.6.0", - "itertools 0.13.0", + "itertools 0.14.0", "md-5 0.10.6", "parking_lot 0.12.3", "percent-encoding", - "quick-xml 0.36.2", + "quick-xml 0.37.5", "rand 0.8.5", "reqwest 0.12.15", "ring 0.17.14", "serde", "serde_json", - "snafu", + "serde_urlencoded", + "thiserror 2.0.12", "tokio", "tracing", "url", @@ -8502,9 +8936,9 @@ dependencies = [ [[package]] name = "parquet" -version = "52.2.0" +version = "55.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e977b9066b4d3b03555c22bdc442f3fadebd96a39111249113087d0edb2691cd" +checksum = "cd31a8290ac5b19f09ad77ee7a1e6a541f1be7674ad410547d5f1eef6eef4a9c" dependencies = [ "ahash 0.8.11", "arrow-array", @@ -8515,25 +8949,25 @@ dependencies = [ "arrow-schema", "arrow-select", "base64 0.22.1", - "brotli 6.0.0", + "brotli 7.0.0", "bytes", "chrono", "flate2", "futures", "half", - "hashbrown 0.14.5", + "hashbrown 0.15.3", "lz4_flex", "num", "num-bigint", "object_store", "paste", "seq-macro", + "simdutf8", "snap", "thrift", "tokio", - "twox-hash 1.6.3", + "twox-hash 2.1.0", "zstd", - "zstd-sys", ] [[package]] @@ -8618,23 +9052,13 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" -[[package]] -name = "petgraph" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" -dependencies = [ - "fixedbitset 0.4.2", - "indexmap 2.9.0", -] - [[package]] name = "petgraph" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772" dependencies = [ - "fixedbitset 0.5.7", + "fixedbitset", "indexmap 2.9.0", ] @@ -9110,7 +9534,7 @@ dependencies = [ "log", "multimap", "once_cell", - "petgraph 0.7.1", + "petgraph", "prettyplease", "prost", "prost-types", @@ -9194,6 +9618,20 @@ dependencies = [ "reborrow", ] +[[package]] +name = "pulp" +version = "0.21.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96b86df24f0a7ddd5e4b95c94fc9ed8a98f1ca94d3b01bdce2824097e7835907" +dependencies = [ + "bytemuck", + "cfg-if", + "libm", + "num-complex", + "reborrow", + "version_check", +] + [[package]] name = "pure-rust-locales" version = "0.8.1" @@ -9222,9 +9660,9 @@ dependencies = [ [[package]] name = "quick-xml" -version = "0.36.2" +version = "0.37.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7649a7b4df05aed9ea7ec6f628c67c9953a43869b8bc50929569b2999d443fe" +checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" dependencies = [ "memchr", "serde", @@ -9397,6 +9835,16 @@ dependencies = [ "rand 0.8.5", ] +[[package]] +name = "rand_distr" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8615d50dcf34fa31f7ab52692afec947c4dd0ab803cc87cb3b0b4570ff7463" +dependencies = [ + "num-traits", + "rand 0.9.0", +] + [[package]] name = "range-alloc" version = "0.1.4" @@ -9412,6 +9860,15 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "raw-cpuid" +version = "11.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6df7ab838ed27997ba19a4664507e6f82b41fe6e20be42929332156e5e85146" +dependencies = [ + "bitflags 2.9.0", +] + [[package]] name = "raw-window-handle" version = "0.6.2" @@ -9487,6 +9944,26 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03251193000f4bd3b042892be858ee50e8b3719f2b08e5833ac4353724632430" +[[package]] +name = "recursive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0786a43debb760f491b1bc0269fe5e84155353c67482b9e60d0cfb596054b43e" +dependencies = [ + "recursive-proc-macro-impl", + "stacker", +] + +[[package]] +name = "recursive-proc-macro-impl" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76009fbe0614077fc1a2ce255e3a1881a2e3a3527097d5dc6d8212c585e7e38b" +dependencies = [ + "quote", + "syn 2.0.101", +] + [[package]] name = "redox_syscall" version = "0.2.16" @@ -9767,12 +10244,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "riff" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9b1a3d5f46d53f4a3478e2be4a5a5ce5108ea58b100dcd139830eae7f79a3a1" - [[package]] name = "ring" version = "0.16.20" @@ -10981,28 +11452,6 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7d3950ab75b03c52f2f13fd52aab91c9d62698b231b67240e85c3ef5301e63e" -[[package]] -name = "snafu" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4de37ad025c587a29e8f3f5605c00f70b98715ef90b9061a815b9e59e9042d6" -dependencies = [ - "doc-comment", - "snafu-derive", -] - -[[package]] -name = "snafu-derive" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "990079665f075b699031e9c08fd3ab99be5029b96f3b78dc0709e8f77e4efebf" -dependencies = [ - "heck 0.4.1", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "snap" version = "1.1.1" @@ -11120,19 +11569,20 @@ dependencies = [ [[package]] name = "sqlparser" -version = "0.47.0" +version = "0.55.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "295e9930cd7a97e58ca2a070541a3ca502b17f5d1fa7157376d0fabd85324f25" +checksum = "c4521174166bac1ff04fe16ef4524c70144cd29682a45978978ca3d7f4e0be11" dependencies = [ "log", + "recursive", "sqlparser_derive", ] [[package]] name = "sqlparser_derive" -version = "0.2.2" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01b2e185515564f15375f593fb966b5718bc624ba77fe49fa4616ad619690554" +checksum = "da5fc6819faabb412da764b99d3b713bb55083c11e7e0c00144d386cd6a1939c" dependencies = [ "proc-macro2", "quote", @@ -11423,16 +11873,7 @@ version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" dependencies = [ - "strum_macros 0.25.3", -] - -[[package]] -name = "strum" -version = "0.26.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" -dependencies = [ - "strum_macros 0.26.4", + "strum_macros", ] [[package]] @@ -11448,19 +11889,6 @@ dependencies = [ "syn 2.0.101", ] -[[package]] -name = "strum_macros" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.101", -] - [[package]] name = "subtle" version = "2.6.1" @@ -11521,7 +11949,7 @@ checksum = "83406221c501860fce9c27444f44125eafe9e598b8b81be7563d7036784cd05c" dependencies = [ "ahash 0.8.11", "anyhow", - "dashmap", + "dashmap 5.5.3", "once_cell", "regex", "serde", @@ -11741,7 +12169,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76c76d8b9792ce51401d38da0fa62158d61f6d80d16d68fe5b03ce4bf5fba383" dependencies = [ "base64 0.21.7", - "dashmap", + "dashmap 5.5.3", "indexmap 2.9.0", "once_cell", "serde", @@ -11948,6 +12376,20 @@ dependencies = [ "walkdir", ] +[[package]] +name = "sysctl" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01198a2debb237c62b6826ec7081082d951f46dbb64b0e8c7649a452230d1dfc" +dependencies = [ + "bitflags 2.9.0", + "byteorder", + "enum-as-inner", + "libc", + "thiserror 1.0.69", + "walkdir", +] + [[package]] name = "sysinfo" version = "0.32.1" @@ -12152,7 +12594,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c56d6ff5591fc332739b3ce7035b57995a3ce29a93ffd6012660e0949c956ea8" dependencies = [ "murmurhash32", - "rand_distr", + "rand_distr 0.4.3", "tantivy-common", ] @@ -13167,6 +13609,27 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "ug" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90b70b37e9074642bc5f60bb23247fd072a84314ca9e71cdf8527593406a0dd3" +dependencies = [ + "gemm 0.18.2", + "half", + "libloading 0.8.6", + "memmap2 0.9.5", + "num", + "num-traits", + "num_cpus", + "rayon", + "safetensors", + "serde", + "thiserror 1.0.69", + "tracing", + "yoke", +] + [[package]] name = "ulid" version = "1.2.1" @@ -13468,7 +13931,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" dependencies = [ "getrandom 0.3.2", + "js-sys", "serde", + "wasm-bindgen", ] [[package]] @@ -13721,15 +14186,6 @@ dependencies = [ "thiserror 2.0.12", ] -[[package]] -name = "wav" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d97402f69875b579ec37f2aa52d1f455a1d6224251edba32e8c18a5da2698d" -dependencies = [ - "riff", -] - [[package]] name = "web-sys" version = "0.3.77" @@ -13995,7 +14451,7 @@ dependencies = [ "candle-nn", "candle-transformers", "chrono", - "chrono-tz 0.10.3", + "chrono-tz", "const_format", "constant_time_eq", "cookie 0.17.0", @@ -14007,7 +14463,6 @@ dependencies = [ "git-version", "google-cloud-googleapis", "google-cloud-pubsub", - "half", "hex", "hf-hub", "hmac", @@ -14136,7 +14591,7 @@ dependencies = [ "backon", "bytes", "chrono", - "chrono-tz 0.10.3", + "chrono-tz", "const_format", "crc", "cron", @@ -14171,8 +14626,8 @@ dependencies = [ "semver 1.0.26", "serde", "serde_json", - "size", "sha2 0.10.9", + "size", "sqlx", "systemstat", "tar", @@ -14451,7 +14906,7 @@ dependencies = [ "axum", "backon", "chrono", - "chrono-tz 0.10.3", + "chrono-tz", "cron", "futures", "futures-core", @@ -15310,15 +15765,25 @@ dependencies = [ [[package]] name = "zip" -version = "0.6.6" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" +checksum = "9cc23c04387f4da0374be4533ad1208cbb091d5c11d070dfef13676ad6497164" dependencies = [ - "byteorder", + "arbitrary", "crc32fast", "crossbeam-utils", + "displaydoc", + "indexmap 2.9.0", + "num_enum", + "thiserror 1.0.69", ] +[[package]] +name = "zlib-rs" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "868b928d7949e09af2f6086dfc1e01936064cc7a819253bce650d4e2a2d63ba8" + [[package]] name = "zstd" version = "0.13.3" diff --git a/backend/Cargo.toml b/backend/Cargo.toml index ae6f136838..5e52488c98 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -194,7 +194,7 @@ serde_json = { version = "^1", features = ["preserve_order", "raw_value"] } uuid = { version = "^1", features = ["serde", "v4"] } thiserror = "^2" anyhow = "^1" -chrono = { version = "=0.4.39", features = ["serde"] } +chrono = { version = "^0.4", features = ["serde"] } chrono-tz = "^0.10.1" tracing = "^0" tracing-subscriber = { version = "^0", features = ["env-filter", "json"] } @@ -317,9 +317,9 @@ nix = { version = "0.27.1", features = ["process", "signal"] } tinyvector = { git = "https://github.com/windmill-labs/tinyvector", rev = "20823b94c20f2b9093f318badd24026cf54dcc85" } hf-hub = "0.3.2" tokenizers = "0.14.1" -candle-core = "0.3.0" -candle-transformers = "0.3.0" -candle-nn = "0.3.0" +candle-core = "0.9.1" +candle-transformers = "0.9.1" +candle-nn = "0.9.1" tiberius = { version = "0.12.3", default-features = false, features = ["rustls", "tds73", "chrono", "sql-browser-tokio"]} pin-project = "1" indexmap = { version = "2.2.5", features = ["serde"]} @@ -333,8 +333,8 @@ async-nats = "0.38.0" nkeys = "0.4.4" nu-parser = { version = "0.101.0", default-features = false } -datafusion = "39.0.0" -object_store = { version = "0.10.0", features = ["aws", "azure"] } +datafusion = "47.0.0" +object_store = { version = "0.12.0", features = ["aws", "azure"] } openidconnect = { version = "4.0.0-rc.1" } aws-config = "^1" aws-sdk-sqs = "1.57.0" @@ -357,9 +357,6 @@ bollard = "0.18.1" tonic = { version = "=0.12.3", features = ["tls-native-roots"] } byteorder = "1.5.0" -# todo remove -half = "=2.4.1" - tikv-jemallocator = { version = "0.5" } tikv-jemalloc-sys = { version = "^0.5" } tikv-jemalloc-ctl = { version = "^0.5" } diff --git a/backend/ee-repo-ref.txt b/backend/ee-repo-ref.txt index bbfd4d21b0..8e0364f544 100644 --- a/backend/ee-repo-ref.txt +++ b/backend/ee-repo-ref.txt @@ -1 +1 @@ -d63c5908cb19c9beb670e91d6792817ea636f052 \ No newline at end of file +868ccad87afb804fe22818ecd3d5a091199bcdbf \ No newline at end of file diff --git a/backend/src/monitor.rs b/backend/src/monitor.rs index 393ab0615e..233007c67f 100644 --- a/backend/src/monitor.rs +++ b/backend/src/monitor.rs @@ -30,7 +30,7 @@ use windmill_api::{ #[cfg(feature = "enterprise")] use windmill_common::ee::{jobs_waiting_alerts, worker_groups_alerts}; - +#[cfg(feature = "enterprise")] use windmill_common::ee::low_disk_alerts; #[cfg(feature = "oauth2")] @@ -1356,7 +1356,7 @@ pub async fn monitor_db( conn: &Connection, base_internal_url: &str, server_mode: bool, - worker_mode: bool, + _worker_mode: bool, initial_load: bool, _killpill_tx: KillpillSender, ) { @@ -1416,15 +1416,20 @@ pub async fn monitor_db( }; let low_disk_alerts_f = async { + #[cfg(feature = "enterprise")] if let Some(db) = conn.as_sql() { low_disk_alerts( &db, server_mode, - worker_mode, + _worker_mode, WORKERS_NAMES.read().await.clone(), ) .await; } + #[cfg(not(feature = "enterprise"))] + { + () + } }; let apply_autoscaling_f = async { diff --git a/backend/tests/worker.rs b/backend/tests/worker.rs index 22a69ce07f..4f33707eff 100644 --- a/backend/tests/worker.rs +++ b/backend/tests/worker.rs @@ -23,9 +23,9 @@ use windmill_api_client::types::{EditSchedule, NewSchedule, ScriptArgs}; use windmill_api_client::types::{NewScript, ScriptLang as NewScriptLanguage}; use serde::Serialize; -use windmill_common::worker::WORKER_CONFIG; #[cfg(feature = "deno_core")] use windmill_common::flows::InputTransform; +use windmill_common::worker::WORKER_CONFIG; use windmill_common::{ flow_status::{FlowStatus, FlowStatusModule, RestartedFrom}, @@ -145,7 +145,7 @@ impl ApiServer { format!("http://localhost:{}", addr.port()), )); - _port_rx.await.unwrap(); + _port_rx.await.expect("failed to receive port"); // clear the cache between tests windmill_common::cache::clear(); @@ -171,7 +171,7 @@ impl ApiServer { // Ok(()) // } -#[cfg(feature="python")] +#[cfg(feature = "python")] fn get_module(cjob: &CompletedJob, id: &str) -> Option { cjob.flow_status.clone().and_then(|fs| { find_module_in_vec( @@ -181,7 +181,7 @@ fn get_module(cjob: &CompletedJob, id: &str) -> Option { }) } -#[cfg(feature="python")] +#[cfg(feature = "python")] fn find_module_in_vec(modules: Vec, id: &str) -> Option { modules.into_iter().find(|s| s.id() == id) } diff --git a/backend/windmill-api/Cargo.toml b/backend/windmill-api/Cargo.toml index 404eb4660e..233fbeec54 100644 --- a/backend/windmill-api/Cargo.toml +++ b/backend/windmill-api/Cargo.toml @@ -15,7 +15,7 @@ stripe = [] agent_worker_server = [] enterprise_saml = ["dep:samael", "dep:libxml"] benchmark = [] -embedding = ["dep:tinyvector", "dep:hf-hub", "dep:tokenizers", "dep:candle-core", "dep:candle-transformers", "dep:candle-nn", "dep:half"] +embedding = ["dep:tinyvector", "dep:hf-hub", "dep:tokenizers", "dep:candle-core", "dep:candle-transformers", "dep:candle-nn"] parquet = ["dep:datafusion", "dep:object_store", "dep:url", "windmill-common/parquet", "windmill-worker/parquet"] prometheus = ["windmill-common/prometheus", "windmill-queue/prometheus", "dep:prometheus", "windmill-worker/prometheus"] openidconnect = ["dep:openidconnect"] @@ -54,7 +54,6 @@ tokio-stream.workspace = true anyhow.workspace = true argon2.workspace = true axum.workspace = true -half = { workspace = true, optional = true} futures.workspace = true git-version.workspace = true tower.workspace = true diff --git a/backend/windmill-api/src/embeddings.rs b/backend/windmill-api/src/embeddings.rs index 30415156ce..aba907ec16 100644 --- a/backend/windmill-api/src/embeddings.rs +++ b/backend/windmill-api/src/embeddings.rs @@ -253,7 +253,7 @@ impl ModelInstance { let token_ids = Tensor::new(&tokens[..], &Device::Cpu)?.unsqueeze(0)?; let token_type_ids = token_ids.zeros_like()?; - let embedding = self.model.forward(&token_ids, &token_type_ids)?; + let embedding = self.model.forward(&token_ids, &token_type_ids, None)?; let embedding = (embedding.sum(1)? / embedding.dim(1)? as f64)?; let embedding = normalize_l2(&embedding)?; diff --git a/backend/windmill-common/src/ee.rs b/backend/windmill-common/src/ee.rs index a5f5df9b9f..7acb430f1b 100644 --- a/backend/windmill-common/src/ee.rs +++ b/backend/windmill-common/src/ee.rs @@ -1,3 +1,4 @@ +#[cfg(feature = "enterprise")] use crate::db::DB; use crate::ee::LicensePlan::Community; #[cfg(feature = "enterprise")] @@ -98,4 +99,8 @@ pub async fn worker_groups_alerts(_db: &DB) {} #[cfg(feature = "enterprise")] pub async fn jobs_waiting_alerts(_db: &DB) {} -pub async fn low_disk_alerts(_db: &DB, _: bool, _: bool, _: Vec) {} +#[cfg(feature = "enterprise")] +pub async fn low_disk_alerts(_db: &DB, _server_mode: bool, _worker_mode: bool, _workers: Vec) { + // Implementation is not open source +} + From 9bdd301f5296fbfb631df9ff9100e92e0984ff64 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Tue, 6 May 2025 11:57:08 +0200 Subject: [PATCH 341/739] fix: ansible in agent mode can use inventory.ini --- .../windmill-worker/src/ansible_executor.rs | 29 +++++++++---------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/backend/windmill-worker/src/ansible_executor.rs b/backend/windmill-worker/src/ansible_executor.rs index 785d1fc868..a0aa683cb3 100644 --- a/backend/windmill-worker/src/ansible_executor.rs +++ b/backend/windmill-worker/src/ansible_executor.rs @@ -858,18 +858,16 @@ pub async fn handle_ansible_job( let mut nsjail_extra_mounts = vec![]; if let Some(r) = reqs.as_ref() { - if let Some(db) = conn.as_sql() { - nsjail_extra_mounts = create_file_resources( - &job.id, - &job.workspace_id, - job_dir, - interpolated_args.as_ref(), - &r, - &client, - db, - ) - .await?; - } + nsjail_extra_mounts = create_file_resources( + &job.id, + &job.workspace_id, + job_dir, + interpolated_args.as_ref(), + &r, + &client, + conn, + ) + .await?; for repo in &r.git_repos { append_logs( @@ -935,8 +933,7 @@ pub async fn handle_ansible_job( if let Some(collections) = r.roles_and_collections.as_ref() { let empty = String::new(); - let (lockfile, logs) = - req_lockfiles + let (lockfile, logs) = req_lockfiles .as_ref() .map(|r| (&r.collections_and_roles, &r.collections_and_roles_logs)) .unwrap_or((collections, &empty)); @@ -1162,7 +1159,7 @@ async fn create_file_resources( args: Option<&HashMap>>, r: &AnsibleRequirements, client: &crate::AuthedClient, - db: &sqlx::Pool, + conn: &Connection, ) -> error::Result> { let mut logs = String::new(); let mut nsjail_mounts: Vec = vec![]; @@ -1232,7 +1229,7 @@ async fn create_file_resources( file_res.target_path, file_res.resource_path )); } - append_logs(job_id, w_id, logs, &Connection::Sql(db.clone())).await; + append_logs(job_id, w_id, logs, conn).await; Ok(nsjail_mounts) } From 386ed62a4eaded2909303b37445082eb632bbcef Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Tue, 6 May 2025 13:48:54 +0200 Subject: [PATCH 342/739] chore(main): release 1.487.0 (#5702) * chore(main): release 1.487.0 * Apply automatic changes --------- Co-authored-by: rubenfiszel <275584+rubenfiszel@users.noreply.github.com> --- CHANGELOG.md | 12 ++ backend/Cargo.lock | 150 +++++++++--------- backend/Cargo.toml | 4 +- backend/windmill-api/openapi.yaml | 2 +- benchmarks/lib.ts | 2 +- cli/main.ts | 2 +- frontend/package-lock.json | 4 +- frontend/package.json | 2 +- lsp/Pipfile | 4 +- openflow.openapi.yaml | 2 +- .../WindmillClient/WindmillClient.psd1 | 2 +- python-client/wmill/pyproject.toml | 2 +- python-client/wmill_pg/pyproject.toml | 2 +- typescript-client/jsr.json | 2 +- typescript-client/package.json | 2 +- version.txt | 2 +- 16 files changed, 104 insertions(+), 92 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a2920564fa..da2f5bd6a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## [1.487.0](https://github.com/windmill-labs/windmill/compare/v1.486.1...v1.487.0) (2025-05-06) + + +### Features + +* critical alert if disk near full ([#5549](https://github.com/windmill-labs/windmill/issues/5549)) ([4fd0561](https://github.com/windmill-labs/windmill/commit/4fd056123907337efb5f5669975b337973a124cc)) + + +### Bug Fixes + +* ansible in agent mode can use inventory.ini ([9bdd301](https://github.com/windmill-labs/windmill/commit/9bdd301f5296fbfb631df9ff9100e92e0984ff64)) + ## [1.486.1](https://github.com/windmill-labs/windmill/compare/v1.486.0...v1.486.1) (2025-05-04) diff --git a/backend/Cargo.lock b/backend/Cargo.lock index 7b565ee7cd..2fd1e186e3 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -833,9 +833,9 @@ dependencies = [ [[package]] name = "aws-sdk-sqs" -version = "1.65.0" +version = "1.66.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6c5fb5d108c518c3bfc077d39a3cd5120e0115ac60aba8085dc79e2d08ab6b1" +checksum = "0e4ebe6d9cfbb2cdb6641ce776ca3bea870c12d5480ffeb6b3c3653bf9c07959" dependencies = [ "aws-credential-types", "aws-runtime", @@ -856,9 +856,9 @@ dependencies = [ [[package]] name = "aws-sdk-sso" -version = "1.65.0" +version = "1.66.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8efec445fb78df585327094fcef4cad895b154b58711e504db7a93c41aa27151" +checksum = "858007b14d0f1ade2e0124473c2126b24d334dc9486ad12eb7c0ed14757be464" dependencies = [ "aws-credential-types", "aws-runtime", @@ -879,9 +879,9 @@ dependencies = [ [[package]] name = "aws-sdk-ssooidc" -version = "1.66.0" +version = "1.67.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e49cca619c10e7b002dc8e66928ceed66ab7f56c1a3be86c5437bf2d8d89bba" +checksum = "b83abf3ae8bd10a014933cc2383964a12ca5a3ebbe1948ad26b1b808e7d0d1f2" dependencies = [ "aws-credential-types", "aws-runtime", @@ -902,9 +902,9 @@ dependencies = [ [[package]] name = "aws-sdk-sts" -version = "1.66.0" +version = "1.67.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7420479eac0a53f776cc8f0d493841ffe58ad9d9783f3947be7265784471b47a" +checksum = "74e8e9ac4a837859c8f1d747054172e1e55933f02ed34728b0b34dea0591ec84" dependencies = [ "aws-credential-types", "aws-runtime", @@ -986,7 +986,7 @@ dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", "aws-smithy-types", - "h2 0.4.9", + "h2 0.4.10", "http 0.2.12", "http 1.3.1", "http-body 0.4.6", @@ -997,7 +997,7 @@ dependencies = [ "hyper-util", "pin-project-lite", "rustls 0.21.12", - "rustls 0.23.26", + "rustls 0.23.27", "rustls-native-certs 0.8.1", "rustls-pki-types", "tokio", @@ -3474,7 +3474,7 @@ dependencies = [ "deno_tls", "dyn-clone", "error_reporter", - "h2 0.4.9", + "h2 0.4.10", "hickory-resolver", "http 1.3.1", "http-body-util", @@ -3755,7 +3755,7 @@ dependencies = [ "elliptic-curve", "errno", "faster-hex", - "h2 0.4.9", + "h2 0.4.10", "hkdf", "http 1.3.1", "http-body-util", @@ -4119,7 +4119,7 @@ dependencies = [ "deno_core", "deno_error", "deno_native_certs", - "rustls 0.23.26", + "rustls 0.23.27", "rustls-pemfile 2.2.0", "rustls-tokio-stream", "rustls-webpki 0.102.8", @@ -4211,7 +4211,7 @@ dependencies = [ "deno_permissions", "deno_tls", "fastwebsockets", - "h2 0.4.9", + "h2 0.4.10", "http 1.3.1", "http-body-util", "hyper 1.6.0", @@ -5947,9 +5947,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75249d144030531f8dee69fe9cea04d3edf809a017ae445e2abdff6629e86633" +checksum = "a9421a676d1b147b16b82c9225157dc629087ef8ec4d5e2960f9437a90dac0a5" dependencies = [ "atomic-waker", "bytes", @@ -6321,7 +6321,7 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "h2 0.4.9", + "h2 0.4.10", "http 1.3.1", "http-body 1.0.1", "httparse", @@ -6374,7 +6374,7 @@ dependencies = [ "http 1.3.1", "hyper 1.6.0", "hyper-util", - "rustls 0.23.26", + "rustls 0.23.27", "rustls-native-certs 0.8.1", "rustls-pki-types", "tokio", @@ -7015,9 +7015,9 @@ checksum = "a4933f3f57a8e9d9da04db23fb153356ecaf00cbd14aee46279c33dc80925c37" [[package]] name = "kqueue" -version = "1.0.8" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7447f1ca1b7b563588a205fe93dea8df60fd981423a768bc1c0ded35ed147d0c" +checksum = "8cf0c5a3f977f1cebd92cf05ebb14e1c941c642fb57c9a7d4302455b33ba326f" dependencies = [ "kqueue-sys", "libc", @@ -7194,9 +7194,9 @@ dependencies = [ [[package]] name = "libm" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9627da5196e5d8ed0b0495e61e518847578da83483c37288316d9b2e03a7f72" +checksum = "a25169bd5913a4b437588a7e3d127cd6e90127b60e0ffbd834a38f1599e016b8" [[package]] name = "libproc" @@ -7450,7 +7450,7 @@ dependencies = [ "base64 0.22.1", "gethostname", "mail-builder", - "rustls 0.23.26", + "rustls 0.23.27", "rustls-pki-types", "smtp-proto", "tokio", @@ -7844,9 +7844,9 @@ dependencies = [ [[package]] name = "mysql_async" -version = "0.36.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20d0d6385c37d331a4502565a1be2a06b23d4ada08ee5177c6374272cd8980a6" +checksum = "277ce2f2459b2af4cc6d0a0b7892381f80800832f57c533f03e2845f4ea331ea" dependencies = [ "bytes", "crossbeam-queue", @@ -7874,9 +7874,9 @@ dependencies = [ [[package]] name = "mysql_common" -version = "0.35.3" +version = "0.35.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4351dce0b6634a60d6f1f40fae5cfcfe0f6c6a4a1e87e8da7babe4c37c522460" +checksum = "6e0ec195e788c95f36b7cf88127d538465fc2f7773e6e47af01834738eab0aee" dependencies = [ "base64 0.22.1", "bitflags 2.9.0", @@ -9692,7 +9692,7 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash 2.1.1", - "rustls 0.23.26", + "rustls 0.23.27", "socket2", "thiserror 2.0.12", "tokio", @@ -9711,7 +9711,7 @@ dependencies = [ "rand 0.9.0", "ring 0.17.14", "rustc-hash 2.1.1", - "rustls 0.23.26", + "rustls 0.23.27", "rustls-pki-types", "slab", "thiserror 2.0.12", @@ -10141,7 +10141,7 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", - "h2 0.4.9", + "h2 0.4.10", "http 1.3.1", "http-body 1.0.1", "http-body-util", @@ -10158,7 +10158,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.26", + "rustls 0.23.27", "rustls-native-certs 0.8.1", "rustls-pemfile 2.2.0", "rustls-pki-types", @@ -10572,16 +10572,16 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.26" +version = "0.23.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df51b5869f3a441595eac5e8ff14d486ff285f7b8c0df8770e49c3b56351f0f0" +checksum = "730944ca083c1c233a75c09f199e973ca499344a2b7ba9e755c457e86fb4a321" dependencies = [ "aws-lc-rs", "log", "once_cell", "ring 0.17.14", "rustls-pki-types", - "rustls-webpki 0.103.1", + "rustls-webpki 0.103.2", "subtle", "zeroize", ] @@ -10657,7 +10657,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22557157d7395bc30727745b365d923f1ecc230c4c80b176545f3f4f08c46e33" dependencies = [ "futures", - "rustls 0.23.26", + "rustls 0.23.27", "socket2", "tokio", ] @@ -10685,9 +10685,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.1" +version = "0.103.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fef8b8769aaccf73098557a87cd1816b4f9c7c16811c9c77142aa695c16f2c03" +checksum = "7149975849f1abb3832b246010ef62ccc80d3a76169517ada7188252b9cfb437" dependencies = [ "aws-lc-rs", "ring 0.17.14", @@ -11627,7 +11627,7 @@ dependencies = [ "memchr", "once_cell", "percent-encoding", - "rustls 0.23.26", + "rustls 0.23.27", "serde", "serde_json", "sha2 0.10.9", @@ -12922,9 +12922,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.44.2" +version = "1.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" +checksum = "2513ca694ef9ede0fb23fe71a4ee4107cb102b9dc1930f6d0fd77aae068ae165" dependencies = [ "backtrace", "bytes", @@ -13070,7 +13070,7 @@ version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" dependencies = [ - "rustls 0.23.26", + "rustls 0.23.27", "tokio", ] @@ -13221,7 +13221,7 @@ dependencies = [ "base64 0.22.1", "bytes", "flate2", - "h2 0.4.9", + "h2 0.4.10", "http 1.3.1", "http-body 1.0.1", "http-body-util", @@ -13850,7 +13850,7 @@ dependencies = [ "log", "native-tls", "once_cell", - "rustls 0.23.26", + "rustls 0.23.27", "rustls-pki-types", "serde", "serde_json", @@ -14381,7 +14381,7 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windmill" -version = "1.486.1" +version = "1.487.0" dependencies = [ "anyhow", "axum", @@ -14401,7 +14401,7 @@ dependencies = [ "quote", "rand 0.9.0", "reqwest 0.12.15", - "rustls 0.23.26", + "rustls 0.23.27", "serde", "serde_json", "sha1", @@ -14430,7 +14430,7 @@ dependencies = [ [[package]] name = "windmill-api" -version = "1.486.1" +version = "1.487.0" dependencies = [ "anyhow", "argon2", @@ -14539,7 +14539,7 @@ dependencies = [ [[package]] name = "windmill-api-client" -version = "1.486.1" +version = "1.487.0" dependencies = [ "base64 0.22.1", "chrono", @@ -14554,7 +14554,7 @@ dependencies = [ [[package]] name = "windmill-audit" -version = "1.486.1" +version = "1.487.0" dependencies = [ "chrono", "serde", @@ -14567,7 +14567,7 @@ dependencies = [ [[package]] name = "windmill-autoscaling" -version = "1.486.1" +version = "1.487.0" dependencies = [ "anyhow", "serde", @@ -14581,7 +14581,7 @@ dependencies = [ [[package]] name = "windmill-common" -version = "1.486.1" +version = "1.487.0" dependencies = [ "anyhow", "async-stream", @@ -14647,7 +14647,7 @@ dependencies = [ [[package]] name = "windmill-git-sync" -version = "1.486.1" +version = "1.487.0" dependencies = [ "regex", "serde", @@ -14661,7 +14661,7 @@ dependencies = [ [[package]] name = "windmill-indexer" -version = "1.486.1" +version = "1.487.0" dependencies = [ "anyhow", "bytes", @@ -14684,7 +14684,7 @@ dependencies = [ [[package]] name = "windmill-macros" -version = "1.486.1" +version = "1.487.0" dependencies = [ "itertools 0.14.0", "lazy_static", @@ -14696,7 +14696,7 @@ dependencies = [ [[package]] name = "windmill-parser" -version = "1.486.1" +version = "1.487.0" dependencies = [ "convert_case 0.6.0", "serde", @@ -14705,7 +14705,7 @@ dependencies = [ [[package]] name = "windmill-parser-bash" -version = "1.486.1" +version = "1.487.0" dependencies = [ "anyhow", "lazy_static", @@ -14717,7 +14717,7 @@ dependencies = [ [[package]] name = "windmill-parser-csharp" -version = "1.486.1" +version = "1.487.0" dependencies = [ "anyhow", "serde_json", @@ -14729,7 +14729,7 @@ dependencies = [ [[package]] name = "windmill-parser-go" -version = "1.486.1" +version = "1.487.0" dependencies = [ "anyhow", "gosyn", @@ -14741,7 +14741,7 @@ dependencies = [ [[package]] name = "windmill-parser-graphql" -version = "1.486.1" +version = "1.487.0" dependencies = [ "anyhow", "lazy_static", @@ -14753,7 +14753,7 @@ dependencies = [ [[package]] name = "windmill-parser-java" -version = "1.486.1" +version = "1.487.0" dependencies = [ "anyhow", "serde_json", @@ -14765,7 +14765,7 @@ dependencies = [ [[package]] name = "windmill-parser-nu" -version = "1.486.1" +version = "1.487.0" dependencies = [ "anyhow", "nu-parser", @@ -14776,7 +14776,7 @@ dependencies = [ [[package]] name = "windmill-parser-php" -version = "1.486.1" +version = "1.487.0" dependencies = [ "anyhow", "itertools 0.14.0", @@ -14787,7 +14787,7 @@ dependencies = [ [[package]] name = "windmill-parser-py" -version = "1.486.1" +version = "1.487.0" dependencies = [ "anyhow", "itertools 0.14.0", @@ -14798,7 +14798,7 @@ dependencies = [ [[package]] name = "windmill-parser-py-imports" -version = "1.486.1" +version = "1.487.0" dependencies = [ "anyhow", "async-recursion", @@ -14818,7 +14818,7 @@ dependencies = [ [[package]] name = "windmill-parser-rust" -version = "1.486.1" +version = "1.487.0" dependencies = [ "anyhow", "convert_case 0.6.0", @@ -14835,7 +14835,7 @@ dependencies = [ [[package]] name = "windmill-parser-sql" -version = "1.486.1" +version = "1.487.0" dependencies = [ "anyhow", "lazy_static", @@ -14847,7 +14847,7 @@ dependencies = [ [[package]] name = "windmill-parser-ts" -version = "1.486.1" +version = "1.487.0" dependencies = [ "anyhow", "lazy_static", @@ -14865,7 +14865,7 @@ dependencies = [ [[package]] name = "windmill-parser-wasm" -version = "1.486.1" +version = "1.487.0" dependencies = [ "anyhow", "getrandom 0.2.16", @@ -14889,7 +14889,7 @@ dependencies = [ [[package]] name = "windmill-parser-yaml" -version = "1.486.1" +version = "1.487.0" dependencies = [ "anyhow", "serde_json", @@ -14899,7 +14899,7 @@ dependencies = [ [[package]] name = "windmill-queue" -version = "1.486.1" +version = "1.487.0" dependencies = [ "anyhow", "async-recursion", @@ -14932,7 +14932,7 @@ dependencies = [ [[package]] name = "windmill-sql-datatype-parser-wasm" -version = "1.486.1" +version = "1.487.0" dependencies = [ "wasm-bindgen", "wasm-bindgen-test", @@ -14942,7 +14942,7 @@ dependencies = [ [[package]] name = "windmill-worker" -version = "1.486.1" +version = "1.487.0" dependencies = [ "anyhow", "async-recursion", @@ -15795,18 +15795,18 @@ dependencies = [ [[package]] name = "zstd-safe" -version = "7.2.1" +version = "7.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54a3ab4db68cea366acc5c897c7b4d4d1b8994a9cd6e6f841f8964566a419059" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" dependencies = [ "zstd-sys", ] [[package]] name = "zstd-sys" -version = "2.0.12+zstd.1.5.6" +version = "2.0.15+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a4e40c320c3cb459d9a9ff6de98cff88f4751ee9275d140e2be94a2b74e4c13" +checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" dependencies = [ "cc", "pkg-config", diff --git a/backend/Cargo.toml b/backend/Cargo.toml index 5e52488c98..313fc9c844 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "windmill" -version = "1.486.1" +version = "1.487.0" authors.workspace = true edition.workspace = true @@ -32,7 +32,7 @@ members = [ ] [workspace.package] -version = "1.486.1" +version = "1.487.0" authors = ["Ruben Fiszel "] edition = "2021" diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index 2b06b3a915..f3426a9566 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.486.1 + version: 1.487.0 title: Windmill API contact: diff --git a/benchmarks/lib.ts b/benchmarks/lib.ts index 1020f35416..41d070e754 100644 --- a/benchmarks/lib.ts +++ b/benchmarks/lib.ts @@ -2,7 +2,7 @@ import { sleep } from "https://deno.land/x/sleep@v1.2.1/mod.ts"; import * as windmill from "https://deno.land/x/windmill@v1.174.0/mod.ts"; import * as api from "https://deno.land/x/windmill@v1.174.0/windmill-api/index.ts"; -export const VERSION = "v1.486.1"; +export const VERSION = "v1.487.0"; export async function login(email: string, password: string): Promise { return await windmill.UserService.login({ diff --git a/cli/main.ts b/cli/main.ts index 7f47fe12f5..2890e1e35b 100644 --- a/cli/main.ts +++ b/cli/main.ts @@ -63,7 +63,7 @@ export { // } // }); -export const VERSION = "1.486.1"; +export const VERSION = "1.487.0"; const command = new Command() .name("wmill") diff --git a/frontend/package-lock.json b/frontend/package-lock.json index ad03d4f12d..93d599d681 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "windmill-components", - "version": "1.486.1", + "version": "1.487.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "windmill-components", - "version": "1.486.1", + "version": "1.487.0", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/frontend/package.json b/frontend/package.json index dcb3c09031..67da8a0a99 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "windmill-components", - "version": "1.486.1", + "version": "1.487.0", "scripts": { "dev": "vite dev", "build": "vite build", diff --git a/lsp/Pipfile b/lsp/Pipfile index 7aeb4c3641..391601da0f 100644 --- a/lsp/Pipfile +++ b/lsp/Pipfile @@ -4,8 +4,8 @@ verify_ssl = true name = "pypi" [packages] -wmill = ">=1.486.1" -wmill_pg = ">=1.486.1" +wmill = ">=1.487.0" +wmill_pg = ">=1.487.0" sendgrid = "*" mysql-connector-python = "*" pymongo = "*" diff --git a/openflow.openapi.yaml b/openflow.openapi.yaml index b2df9da7dc..1f01ed7f3e 100644 --- a/openflow.openapi.yaml +++ b/openflow.openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.486.1 + version: 1.487.0 title: OpenFlow Spec contact: name: Ruben Fiszel diff --git a/powershell-client/WindmillClient/WindmillClient.psd1 b/powershell-client/WindmillClient/WindmillClient.psd1 index a2e7dad29e..3a352ceccd 100644 --- a/powershell-client/WindmillClient/WindmillClient.psd1 +++ b/powershell-client/WindmillClient/WindmillClient.psd1 @@ -12,7 +12,7 @@ RootModule = 'WindmillClient.psm1' # Version number of this module. - ModuleVersion = '1.486.1' + ModuleVersion = '1.487.0' # Supported PSEditions # CompatiblePSEditions = @() diff --git a/python-client/wmill/pyproject.toml b/python-client/wmill/pyproject.toml index 8a17f18183..5bc837e92d 100644 --- a/python-client/wmill/pyproject.toml +++ b/python-client/wmill/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "wmill" -version = "1.486.1" +version = "1.487.0" description = "A client library for accessing Windmill server wrapping the Windmill client API" license = "Apache-2.0" homepage = "https://windmill.dev" diff --git a/python-client/wmill_pg/pyproject.toml b/python-client/wmill_pg/pyproject.toml index 84750f699b..7e31934481 100644 --- a/python-client/wmill_pg/pyproject.toml +++ b/python-client/wmill_pg/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "wmill-pg" -version = "1.486.1" +version = "1.487.0" description = "An extension client for the wmill client library focused on pg" license = "Apache-2.0" homepage = "https://windmill.dev" diff --git a/typescript-client/jsr.json b/typescript-client/jsr.json index e631d5a984..69215648d2 100644 --- a/typescript-client/jsr.json +++ b/typescript-client/jsr.json @@ -1,6 +1,6 @@ { "name": "@windmill/windmill", - "version": "1.486.1", + "version": "1.487.0", "exports": "./src/index.ts", "publish": { "exclude": ["!src", "./s3Types.ts", "./client.ts"] diff --git a/typescript-client/package.json b/typescript-client/package.json index c8d0c8e3a3..76021fd576 100644 --- a/typescript-client/package.json +++ b/typescript-client/package.json @@ -1,7 +1,7 @@ { "name": "windmill-client", "description": "Windmill SDK client for browsers and Node.js", - "version": "1.486.1", + "version": "1.487.0", "author": "Ruben Fiszel", "license": "Apache 2.0", "devDependencies": { diff --git a/version.txt b/version.txt index 5f20ebb122..9b4cb9226d 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.486.1 +1.487.0 From 75d992449c845fd11c9a317d401c405e7d78e1ec Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Tue, 6 May 2025 17:59:21 +0200 Subject: [PATCH 343/739] fix: performance and stability improvement to fetch last deployed script * orderByRefactor * update * nits * nits --- ...81e066915c8397e6bbc9e408ff3dda9fec27f.json | 16 ---- ...8a5f2e75d3b12ee4718452e82c7318b1bcf4.json} | 4 +- ...f0996efe7fa7b671ac2b3b000ead0ea307de.json} | 4 +- ...a61eb8f07c54d291bb857ddd41a549cbc88dd.json | 16 ++++ ...d5ab98fa93e0382a57a698564695db6c40ac.json} | 4 +- ...00aeecdd75503bed59d80cd62091d1642d1ec.json | 29 +++++++ .../20250506151818_orderby_refactor.down.sql | 1 + .../20250506151818_orderby_refactor.up.sql | 3 + backend/windmill-api/src/scripts.rs | 78 +++++++++++++------ 9 files changed, 108 insertions(+), 47 deletions(-) delete mode 100644 backend/.sqlx/query-1182fe055306d7ea435d76b74d781e066915c8397e6bbc9e408ff3dda9fec27f.json rename backend/.sqlx/{query-ea2b88dc050aec038641ea37399d68d4385c5bdc721d1351609f27ca45e4dbdc.json => query-2a49e5b5486b650d96f3e9038cba8a5f2e75d3b12ee4718452e82c7318b1bcf4.json} (63%) rename backend/.sqlx/{query-362419eb262c83d6a98a0200b116e831ada60399fe5f55a56d930cc69aff2675.json => query-726e956cfcd3ac7c07abeecdf92cf0996efe7fa7b671ac2b3b000ead0ea307de.json} (82%) create mode 100644 backend/.sqlx/query-848c8371eeb17ebd4b36a33f7d8a61eb8f07c54d291bb857ddd41a549cbc88dd.json rename backend/.sqlx/{query-a17260a1f1ee02e786690994d98c84ddf81e2eeb883f895c9cfc47e144d422cb.json => query-b5860f6a7672a368d740dcd367a8d5ab98fa93e0382a57a698564695db6c40ac.json} (62%) create mode 100644 backend/.sqlx/query-cf2a6ad6471a40b6298775cda9300aeecdd75503bed59d80cd62091d1642d1ec.json create mode 100644 backend/migrations/20250506151818_orderby_refactor.down.sql create mode 100644 backend/migrations/20250506151818_orderby_refactor.up.sql diff --git a/backend/.sqlx/query-1182fe055306d7ea435d76b74d781e066915c8397e6bbc9e408ff3dda9fec27f.json b/backend/.sqlx/query-1182fe055306d7ea435d76b74d781e066915c8397e6bbc9e408ff3dda9fec27f.json deleted file mode 100644 index 767f5cba57..0000000000 --- a/backend/.sqlx/query-1182fe055306d7ea435d76b74d781e066915c8397e6bbc9e408ff3dda9fec27f.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE script SET ws_error_handler_muted = $3 WHERE workspace_id = $2 AND path = $1 AND created_at = (SELECT max(created_at) FROM script WHERE path = $1 AND workspace_id = $2)", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Text", - "Bool" - ] - }, - "nullable": [] - }, - "hash": "1182fe055306d7ea435d76b74d781e066915c8397e6bbc9e408ff3dda9fec27f" -} diff --git a/backend/.sqlx/query-ea2b88dc050aec038641ea37399d68d4385c5bdc721d1351609f27ca45e4dbdc.json b/backend/.sqlx/query-2a49e5b5486b650d96f3e9038cba8a5f2e75d3b12ee4718452e82c7318b1bcf4.json similarity index 63% rename from backend/.sqlx/query-ea2b88dc050aec038641ea37399d68d4385c5bdc721d1351609f27ca45e4dbdc.json rename to backend/.sqlx/query-2a49e5b5486b650d96f3e9038cba8a5f2e75d3b12ee4718452e82c7318b1bcf4.json index 1d30071300..77f61ccc47 100644 --- a/backend/.sqlx/query-ea2b88dc050aec038641ea37399d68d4385c5bdc721d1351609f27ca45e4dbdc.json +++ b/backend/.sqlx/query-2a49e5b5486b650d96f3e9038cba8a5f2e75d3b12ee4718452e82c7318b1bcf4.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT EXISTS(SELECT 1 FROM script WHERE path = $1 AND workspace_id = $2 AND\n created_at = (SELECT max(created_at) FROM script WHERE path = $1 AND workspace_id = $2))", + "query": "SELECT EXISTS(SELECT 1 FROM script WHERE path = $1 AND workspace_id = $2 ORDER BY created_at DESC LIMIT 1)", "describe": { "columns": [ { @@ -19,5 +19,5 @@ null ] }, - "hash": "ea2b88dc050aec038641ea37399d68d4385c5bdc721d1351609f27ca45e4dbdc" + "hash": "2a49e5b5486b650d96f3e9038cba8a5f2e75d3b12ee4718452e82c7318b1bcf4" } diff --git a/backend/.sqlx/query-362419eb262c83d6a98a0200b116e831ada60399fe5f55a56d930cc69aff2675.json b/backend/.sqlx/query-726e956cfcd3ac7c07abeecdf92cf0996efe7fa7b671ac2b3b000ead0ea307de.json similarity index 82% rename from backend/.sqlx/query-362419eb262c83d6a98a0200b116e831ada60399fe5f55a56d930cc69aff2675.json rename to backend/.sqlx/query-726e956cfcd3ac7c07abeecdf92cf0996efe7fa7b671ac2b3b000ead0ea307de.json index 183062aa6d..4baf932023 100644 --- a/backend/.sqlx/query-362419eb262c83d6a98a0200b116e831ada60399fe5f55a56d930cc69aff2675.json +++ b/backend/.sqlx/query-726e956cfcd3ac7c07abeecdf92cf0996efe7fa7b671ac2b3b000ead0ea307de.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT s.hash as hash, dm.deployment_msg as deployment_msg \n FROM script s LEFT JOIN deployment_metadata dm ON s.hash = dm.script_hash\n WHERE s.workspace_id = $1 AND s.path = $2\n ORDER by created_at DESC", + "query": "SELECT s.hash as hash, dm.deployment_msg as deployment_msg \n FROM script s LEFT JOIN deployment_metadata dm ON s.hash = dm.script_hash\n WHERE s.workspace_id = $1 AND s.path = $2\n ORDER by s.created_at DESC", "describe": { "columns": [ { @@ -25,5 +25,5 @@ true ] }, - "hash": "362419eb262c83d6a98a0200b116e831ada60399fe5f55a56d930cc69aff2675" + "hash": "726e956cfcd3ac7c07abeecdf92cf0996efe7fa7b671ac2b3b000ead0ea307de" } diff --git a/backend/.sqlx/query-848c8371eeb17ebd4b36a33f7d8a61eb8f07c54d291bb857ddd41a549cbc88dd.json b/backend/.sqlx/query-848c8371eeb17ebd4b36a33f7d8a61eb8f07c54d291bb857ddd41a549cbc88dd.json new file mode 100644 index 0000000000..7751c14adb --- /dev/null +++ b/backend/.sqlx/query-848c8371eeb17ebd4b36a33f7d8a61eb8f07c54d291bb857ddd41a549cbc88dd.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE script \n SET ws_error_handler_muted = $3 \n WHERE ctid = (\n SELECT ctid FROM script\n WHERE path = $1 AND workspace_id = $2\n ORDER BY created_at DESC\n LIMIT 1\n )\n", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Text", + "Bool" + ] + }, + "nullable": [] + }, + "hash": "848c8371eeb17ebd4b36a33f7d8a61eb8f07c54d291bb857ddd41a549cbc88dd" +} diff --git a/backend/.sqlx/query-a17260a1f1ee02e786690994d98c84ddf81e2eeb883f895c9cfc47e144d422cb.json b/backend/.sqlx/query-b5860f6a7672a368d740dcd367a8d5ab98fa93e0382a57a698564695db6c40ac.json similarity index 62% rename from backend/.sqlx/query-a17260a1f1ee02e786690994d98c84ddf81e2eeb883f895c9cfc47e144d422cb.json rename to backend/.sqlx/query-b5860f6a7672a368d740dcd367a8d5ab98fa93e0382a57a698564695db6c40ac.json index 5f8386be37..a08c31e743 100644 --- a/backend/.sqlx/query-a17260a1f1ee02e786690994d98c84ddf81e2eeb883f895c9cfc47e144d422cb.json +++ b/backend/.sqlx/query-b5860f6a7672a368d740dcd367a8d5ab98fa93e0382a57a698564695db6c40ac.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT content FROM script WHERE path = $1 AND workspace_id = $2 AND\n created_at = (SELECT max(created_at) FROM script WHERE path = $1 AND archived = false AND workspace_id = $2)", + "query": "SELECT content FROM script WHERE path = $1 AND workspace_id = $2 AND archived = false ORDER BY created_at DESC LIMIT 1", "describe": { "columns": [ { @@ -19,5 +19,5 @@ false ] }, - "hash": "a17260a1f1ee02e786690994d98c84ddf81e2eeb883f895c9cfc47e144d422cb" + "hash": "b5860f6a7672a368d740dcd367a8d5ab98fa93e0382a57a698564695db6c40ac" } diff --git a/backend/.sqlx/query-cf2a6ad6471a40b6298775cda9300aeecdd75503bed59d80cd62091d1642d1ec.json b/backend/.sqlx/query-cf2a6ad6471a40b6298775cda9300aeecdd75503bed59d80cd62091d1642d1ec.json new file mode 100644 index 0000000000..4e17af3ce2 --- /dev/null +++ b/backend/.sqlx/query-cf2a6ad6471a40b6298775cda9300aeecdd75503bed59d80cd62091d1642d1ec.json @@ -0,0 +1,29 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT s.hash as hash, dm.deployment_msg as deployment_msg \n FROM script s LEFT JOIN deployment_metadata dm ON s.hash = dm.script_hash\n WHERE s.workspace_id = $1 AND s.path = $2\n ORDER by s.created_at DESC LIMIT 1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "hash", + "type_info": "Int8" + }, + { + "ordinal": 1, + "name": "deployment_msg", + "type_info": "Text" + } + ], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [ + false, + true + ] + }, + "hash": "cf2a6ad6471a40b6298775cda9300aeecdd75503bed59d80cd62091d1642d1ec" +} diff --git a/backend/migrations/20250506151818_orderby_refactor.down.sql b/backend/migrations/20250506151818_orderby_refactor.down.sql new file mode 100644 index 0000000000..d2f607c5b8 --- /dev/null +++ b/backend/migrations/20250506151818_orderby_refactor.down.sql @@ -0,0 +1 @@ +-- Add down migration script here diff --git a/backend/migrations/20250506151818_orderby_refactor.up.sql b/backend/migrations/20250506151818_orderby_refactor.up.sql new file mode 100644 index 0000000000..a983639760 --- /dev/null +++ b/backend/migrations/20250506151818_orderby_refactor.up.sql @@ -0,0 +1,3 @@ +-- Add up migration script here +DROP INDEX IF EXISTS index_script_on_path_created_at; +CREATE INDEX IF NOT EXISTS index_script_on_path_created_at ON script (workspace_id, path, created_at DESC); diff --git a/backend/windmill-api/src/scripts.rs b/backend/windmill-api/src/scripts.rs index aeb3686d0b..c201e6d58b 100644 --- a/backend/windmill-api/src/scripts.rs +++ b/backend/windmill-api/src/scripts.rs @@ -265,9 +265,12 @@ async fn list_scripts( if lq.show_archived.unwrap_or(false) { sqlb.and_where_eq( - "o.created_at", - "(select max(created_at) from script where o.path = path - AND workspace_id = ?)" + "o.ctid", + "(SELECT ctid FROM script + WHERE path = o.path + AND workspace_id = ? + ORDER BY created_at DESC + LIMIT 1)" .bind(&w_id), ); sqlb.and_where_eq("archived", true); @@ -989,7 +992,7 @@ async fn get_script_by_path( AND favorite.usr = $3 WHERE s.path = $1 AND s.workspace_id = $2 - AND s.created_at = (SELECT max(created_at) FROM script WHERE path = $1 AND workspace_id = $2)", + ORDER BY s.created_at DESC LIMIT 1", ) .bind(path) .bind(w_id) @@ -998,9 +1001,7 @@ async fn get_script_by_path( .await? } else { sqlx::query_as::<_, ScriptWithStarred>( - "SELECT *, NULL as starred FROM script WHERE path = $1 AND workspace_id = $2 \ - AND created_at = (SELECT max(created_at) FROM script WHERE path = $1 AND \ - workspace_id = $2)", + "SELECT *, NULL as starred FROM script WHERE path = $1 AND workspace_id = $2 ORDER BY created_at DESC LIMIT 1", ) .bind(path) .bind(w_id) @@ -1040,9 +1041,8 @@ async fn get_script_by_path_w_draft( let script_o = sqlx::query_as::<_, ScriptWDraft>( "SELECT hash, script.path, summary, description, content, language, kind, tag, schema, draft_only, envs, concurrent_limit, concurrency_time_window_s, cache_ttl, ws_error_handler_muted, draft.value as draft, dedicated_worker, priority, restart_unless_cancelled, delete_after_use, timeout, concurrency_key, visible_to_runner_only, no_main_func, has_preprocessor, on_behalf_of_email FROM script LEFT JOIN draft ON script.path = draft.path AND script.workspace_id = draft.workspace_id AND draft.typ = 'script' - WHERE script.path = $1 AND script.workspace_id = $2 \ - AND script.created_at = (SELECT max(created_at) FROM script WHERE path = $1 AND \ - workspace_id = $2)", + WHERE script.path = $1 AND script.workspace_id = $2 + ORDER BY script.created_at DESC LIMIT 1", ) .bind(path) .bind(w_id) @@ -1064,7 +1064,7 @@ async fn get_script_history( "SELECT s.hash as hash, dm.deployment_msg as deployment_msg FROM script s LEFT JOIN deployment_metadata dm ON s.hash = dm.script_hash WHERE s.workspace_id = $1 AND s.path = $2 - ORDER by created_at DESC", + ORDER by s.created_at DESC", w_id, path.to_path(), ) @@ -1092,7 +1092,7 @@ async fn get_latest_version( "SELECT s.hash as hash, dm.deployment_msg as deployment_msg FROM script s LEFT JOIN deployment_metadata dm ON s.hash = dm.script_hash WHERE s.workspace_id = $1 AND s.path = $2 - ORDER by created_at DESC", + ORDER by s.created_at DESC LIMIT 1", w_id, path.to_path(), ) @@ -1188,7 +1188,15 @@ async fn toggle_workspace_error_handler( match error_handler_maybe { Some(_) => { sqlx::query_scalar!( - "UPDATE script SET ws_error_handler_muted = $3 WHERE workspace_id = $2 AND path = $1 AND created_at = (SELECT max(created_at) FROM script WHERE path = $1 AND workspace_id = $2)", + "UPDATE script + SET ws_error_handler_muted = $3 + WHERE ctid = ( + SELECT ctid FROM script + WHERE path = $1 AND workspace_id = $2 + ORDER BY created_at DESC + LIMIT 1 + ) +", path.to_path(), w_id, req.muted, @@ -1209,6 +1217,7 @@ async fn toggle_workspace_error_handler( async fn get_tokened_raw_script_by_path( Extension(user_db): Extension, + Extension(db): Extension, Path((w_id, token, path)): Path<(String, String, StripPath)>, Extension(cache): Extension>, ) -> Result { @@ -1216,7 +1225,13 @@ async fn get_tokened_raw_script_by_path( .get_authed(Some(w_id.clone()), &token) .await .ok_or_else(|| Error::NotAuthorized("Invalid token".to_string()))?; - return raw_script_by_path(authed, Extension(user_db), Path((w_id, path))).await; + return raw_script_by_path( + authed, + Extension(user_db), + Extension(db), + Path((w_id, path)), + ) + .await; } async fn get_empty_ts_script_by_path() -> String { @@ -1226,22 +1241,25 @@ async fn get_empty_ts_script_by_path() -> String { async fn raw_script_by_path( authed: ApiAuthed, Extension(user_db): Extension, + Extension(db): Extension, Path((w_id, path)): Path<(String, StripPath)>, ) -> Result { - raw_script_by_path_internal(path, user_db, authed, w_id, false).await + raw_script_by_path_internal(path, user_db, db, authed, w_id, false).await } async fn raw_script_by_path_unpinned( authed: ApiAuthed, Extension(user_db): Extension, + Extension(db): Extension, Path((w_id, path)): Path<(String, StripPath)>, ) -> Result { - raw_script_by_path_internal(path, user_db, authed, w_id, true).await + raw_script_by_path_internal(path, user_db, db, authed, w_id, true).await } async fn raw_script_by_path_internal( path: StripPath, user_db: UserDB, + db: DB, authed: ApiAuthed, w_id: String, unpin: bool, @@ -1267,10 +1285,7 @@ async fn raw_script_by_path_internal( let mut tx = user_db.begin(&authed).await?; let content_o = sqlx::query_scalar!( - "SELECT content FROM script WHERE path = $1 AND workspace_id = $2 \ - AND - created_at = (SELECT max(created_at) FROM script WHERE path = $1 AND archived = false AND \ - workspace_id = $2)", + "SELECT content FROM script WHERE path = $1 AND workspace_id = $2 AND archived = false ORDER BY created_at DESC LIMIT 1", path, w_id ) @@ -1278,6 +1293,22 @@ async fn raw_script_by_path_internal( .await?; tx.commit().await?; + if content_o.is_none() { + let exists = sqlx::query_scalar!( + "SELECT EXISTS(SELECT 1 FROM script WHERE path = $1 AND workspace_id = $2 ORDER BY created_at DESC LIMIT 1)", + path, + w_id + ) + .fetch_one(&db) + .await?; + if exists.unwrap_or(false) { + return Err(Error::NotFound(format!( + "Script {path} not visible to {} but exists", + authed.username + ))); + } + } + let content = not_found_if_none(content_o, "Script", path)?; if unpin { @@ -1294,8 +1325,7 @@ async fn exists_script_by_path( let path = path.to_path(); let exists = sqlx::query_scalar!( - "SELECT EXISTS(SELECT 1 FROM script WHERE path = $1 AND workspace_id = $2 AND - created_at = (SELECT max(created_at) FROM script WHERE path = $1 AND workspace_id = $2))", + "SELECT EXISTS(SELECT 1 FROM script WHERE path = $1 AND workspace_id = $2 ORDER BY created_at DESC LIMIT 1)", path, w_id ) @@ -1412,9 +1442,7 @@ pub async fn require_is_writer(authed: &ApiAuthed, path: &str, w_id: &str, db: D path, w_id, db, - "SELECT extra_perms FROM script WHERE path = $1 AND workspace_id = $2 \ - AND created_at = (SELECT max(created_at) FROM script WHERE path = $1 AND \ - workspace_id = $2)", + "SELECT extra_perms FROM script WHERE path = $1 AND workspace_id = $2 ORDER BY created_at DESC LIMIT 1", "script", ) .await; From 8a47414ca88f67ace5f3f3234ec8c3d76b803e82 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Tue, 6 May 2025 18:14:26 +0200 Subject: [PATCH 344/739] nit --- ...ad9fad00b1d77ea44c8639b7598c5953635ff.json | 23 +++++++++++++++++++ backend/windmill-api/src/scripts.rs | 2 +- 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 backend/.sqlx/query-4e07dcc1ba4396ada2f1080a400ad9fad00b1d77ea44c8639b7598c5953635ff.json diff --git a/backend/.sqlx/query-4e07dcc1ba4396ada2f1080a400ad9fad00b1d77ea44c8639b7598c5953635ff.json b/backend/.sqlx/query-4e07dcc1ba4396ada2f1080a400ad9fad00b1d77ea44c8639b7598c5953635ff.json new file mode 100644 index 0000000000..506dce48dc --- /dev/null +++ b/backend/.sqlx/query-4e07dcc1ba4396ada2f1080a400ad9fad00b1d77ea44c8639b7598c5953635ff.json @@ -0,0 +1,23 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT EXISTS(SELECT 1 FROM script WHERE path = $1 AND workspace_id = $2 AND archived = false ORDER BY created_at DESC LIMIT 1)", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "exists", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [ + null + ] + }, + "hash": "4e07dcc1ba4396ada2f1080a400ad9fad00b1d77ea44c8639b7598c5953635ff" +} diff --git a/backend/windmill-api/src/scripts.rs b/backend/windmill-api/src/scripts.rs index c201e6d58b..ffdddc8e9d 100644 --- a/backend/windmill-api/src/scripts.rs +++ b/backend/windmill-api/src/scripts.rs @@ -1295,7 +1295,7 @@ async fn raw_script_by_path_internal( if content_o.is_none() { let exists = sqlx::query_scalar!( - "SELECT EXISTS(SELECT 1 FROM script WHERE path = $1 AND workspace_id = $2 ORDER BY created_at DESC LIMIT 1)", + "SELECT EXISTS(SELECT 1 FROM script WHERE path = $1 AND workspace_id = $2 AND archived = false ORDER BY created_at DESC LIMIT 1)", path, w_id ) From e6f965c1193830845671ca75e2820c7642194c42 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Tue, 6 May 2025 19:09:01 +0200 Subject: [PATCH 345/739] improve handling of non parsable scripts on deploy --- backend/windmill-api/src/scripts.rs | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/backend/windmill-api/src/scripts.rs b/backend/windmill-api/src/scripts.rs index ffdddc8e9d..080c07cc91 100644 --- a/backend/windmill-api/src/scripts.rs +++ b/backend/windmill-api/src/scripts.rs @@ -685,12 +685,32 @@ async fn create_script_internal<'c>( let (no_main_func, has_preprocessor) = match lang { ScriptLang::Bun | ScriptLang::Bunnative | ScriptLang::Deno | ScriptLang::Nativets => { - let args = windmill_parser_ts::parse_deno_signature(&ns.content, true, true, None)?; - (args.no_main_func, args.has_preprocessor) + let args = windmill_parser_ts::parse_deno_signature(&ns.content, true, true, None); + match args { + Ok(args) => (args.no_main_func, args.has_preprocessor), + Err(e) => { + tracing::warn!( + "Error parsing deno signature when deploying script {}: {:?}", + ns.path, + e + ); + (None, None) + } + } } ScriptLang::Python3 => { - let args = windmill_parser_py::parse_python_signature(&ns.content, None, true)?; - (args.no_main_func, args.has_preprocessor) + let args = windmill_parser_py::parse_python_signature(&ns.content, None, true); + match args { + Ok(args) => (args.no_main_func, args.has_preprocessor), + Err(e) => { + tracing::warn!( + "Error parsing python signature when deploying script {}: {:?}", + ns.path, + e + ); + (None, None) + } + } } _ => (ns.no_main_func, ns.has_preprocessor), }; From df9f827d103def27166a767044373bd0754285e2 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Wed, 7 May 2025 12:59:33 +0200 Subject: [PATCH 346/739] fix: fix azure object storage regression due to object_store regression --- backend/Cargo.lock | 7 ++++--- backend/Cargo.toml | 5 ++++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/backend/Cargo.lock b/backend/Cargo.lock index 2fd1e186e3..77d2170699 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -8453,8 +8453,7 @@ dependencies = [ [[package]] name = "object_store" version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9ce831b09395f933addbc56d894d889e4b226eba304d4e7adbab591e26daf1e" +source = "git+https://github.com/apache/arrow-rs-object-store?rev=36752c975d4f29e20b57c91f81a10872dcd48ae7#36752c975d4f29e20b57c91f81a10872dcd48ae7" dependencies = [ "async-trait", "base64 0.22.1", @@ -8472,7 +8471,7 @@ dependencies = [ "parking_lot 0.12.3", "percent-encoding", "quick-xml 0.37.5", - "rand 0.8.5", + "rand 0.9.0", "reqwest 0.12.15", "ring 0.17.14", "serde", @@ -8483,6 +8482,8 @@ dependencies = [ "tracing", "url", "walkdir", + "wasm-bindgen-futures", + "web-time", ] [[package]] diff --git a/backend/Cargo.toml b/backend/Cargo.toml index 313fc9c844..a457343a1c 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -96,6 +96,9 @@ java = ["windmill-worker/java"] all_languages = [ "python", "deno_core", "rust", "mysql", "oracledb", "mssql", "bigquery", "csharp", "nu", "php", "java"] +[patch.crates-io] +object_store = { git = "https://github.com/apache/arrow-rs-object-store", rev = "36752c975d4f29e20b57c91f81a10872dcd48ae7" } + [dependencies] anyhow.workspace = true tokio.workspace = true @@ -334,7 +337,7 @@ nkeys = "0.4.4" nu-parser = { version = "0.101.0", default-features = false } datafusion = "47.0.0" -object_store = { version = "0.12.0", features = ["aws", "azure"] } +object_store = { git = "https://github.com/apache/arrow-rs-object-store", rev = "36752c975d4f29e20b57c91f81a10872dcd48ae7", features = ["aws", "azure"] } openidconnect = { version = "4.0.0-rc.1" } aws-config = "^1" aws-sdk-sqs = "1.57.0" From 06287d8a11f45ddba374f2687114ef6f145b36e5 Mon Sep 17 00:00:00 2001 From: centdix <40307056+centdix@users.noreply.github.com> Date: Wed, 7 May 2025 13:14:29 +0200 Subject: [PATCH 347/739] Add cursor rules for svelte 5 and rust (#5710) * add rules for svelte 5 and rust * add optimizations for rust * add optimizations for svelte --- .cursor/rules/rust-best-practices.mdc | 113 +++++++++++ .cursor/rules/svelte5-best-practices.mdc | 229 +++++++++++++++++++++++ 2 files changed, 342 insertions(+) create mode 100644 .cursor/rules/rust-best-practices.mdc create mode 100644 .cursor/rules/svelte5-best-practices.mdc diff --git a/.cursor/rules/rust-best-practices.mdc b/.cursor/rules/rust-best-practices.mdc new file mode 100644 index 0000000000..8ab8a35c13 --- /dev/null +++ b/.cursor/rules/rust-best-practices.mdc @@ -0,0 +1,113 @@ +--- +description: +globs: backend/**/*.rs +alwaysApply: false +--- +--- +description: Rust best practices for the Windmill backend, covering code organization, error handling, performance optimizations, and common patterns to follow when adding new code. +globs: **/*.rs +--- +# Windmill Backend - Rust Best Practices + +## Project Structure + +Windmill uses a workspace-based architecture with multiple crates: + +- **windmill-api**: API server functionality +- **windmill-worker**: Job execution +- **windmill-common**: Shared code used by all crates +- **windmill-queue**: Job & flow queuing +- **windmill-audit**: Audit logging +- Other specialized crates (git-sync, autoscaling, etc.) + +## Adding New Code + +### Module Organization + +- Place new code in the appropriate crate based on functionality +- For API endpoints, create or modify files in `windmill-api/src/` organized by domain +- For shared functionality, use `windmill-common/src/` +- Use the `_ee.rs` suffix for enterprise-only modules +- Follow existing patterns for file structure and organization + +### Error Handling + +- Use the custom `Error` enum from `windmill-common::error` +- Return `Result` or `JsonResult` for functions that can fail +- Use the `?` operator for error propagation +- Add location tracking to errors using `#[track_caller]` + +### Database Operations + +- Use `sqlx` for database operations with prepared statements +- Leverage existing database helper functions in `db.rs` modules +- Use transactions for multi-step operations +- Handle database errors properly + +### API Endpoints + +- Follow existing patterns in the `windmill-api` crate +- Use axum's routing system and extractors +- Group related routes together +- Use consistent response formats (JSON) +- Follow proper authentication and authorization patterns + +## Performance Optimizations + +When generating code, especially involving `serde`, `sqlx`, and `tokio`, prioritize performance by applying the following principles: + +### Serde Optimizations (Serialization & Deserialization) + +- **Specify Structure Explicitly:** When defining structs for Serde (`#[derive(Serialize, Deserialize)]`), use `#[serde(...` attributes extensively. This includes: + * `#[serde(rename = "...")]` or `#[serde(alias = "...")]` to map external names precisely, avoiding dynamic lookups. + * `#[serde(default)]` for optional fields with default values, reducing parsing complexity. + * `#[serde(skip_serializing_if = "...")]` to avoid writing fields that meet a certain condition (e.g., `Option::is_none()`, `Vec::is_empty()`, or a custom function), reducing output size and serialization work. + * `#[serde(skip_serializing)]` or `#[serde(skip_deserializing)]` for fields that should *not* be included. +- **Prefer Borrowing:** Where possible and safe (data lifetime allows), use `Cow<'a, str>` or `&'a str` (with `#[serde(borrow)]`) instead of `String` for string fields during deserialization. This avoids allocating new strings, enabling zero-copy reading from the input buffer. Apply this principle to byte slices (`&'a [u8]` / `Cow<'a, [u8]>`) and potentially borrowed vectors as well. +- **Avoid Intermediate `Value`:** Unless the data structure is truly dynamic or unknown at compile time, deserialize directly into a well-defined struct or enum rather than into `serde_json::Value` (or equivalent for other formats). This avoids unnecessary heap allocations and type switching. + +### SQLx Optimizations (Database Interaction) + +- **Select Only Necessary Columns:** In `SELECT` queries, list specific column names rather than using `SELECT *`. This reduces data transferred from the database and the work needed for hydration/deserialization. +- **Batch Operations:** For multiple `INSERT`, `UPDATE`, or `DELETE` statements, prefer executing them in a single query if the database and driver support it efficiently (e.g., `INSERT INTO ... VALUES (...), (...), ...`). This minimizes round trips to the database. +- **Avoid N+1 Queries:** Do not loop through results of one query and execute a separate query for each item (e.g., fetching users, then querying for each user's profile in a loop). Instead, use JOINs or a single query with an `IN` clause to fetch related data efficiently. +- **Deserialize Directly:** Use `#[derive(FromRow)]` on structs and ensure the struct fields match the selected columns in the query. This allows SQLx to hydrate objects directly, avoiding intermediate data structures. +- **Parameterize Queries:** Always use SQLx's query methods (`.bind(...)`) to pass values as parameters rather than string formatting. This prevents SQL injection and allows the database to cache query plans, improving performance on repeated executions. + +### Tokio Optimizations (Asynchronous Runtime) + +- **Avoid Blocking Operations:** **Crucially**, never perform blocking operations (synchronous file I/O, `std::thread::sleep`, CPU-bound loops, `std::sync::Mutex::lock`, blocking network calls without `tokio::net`) directly within an `async fn` or a standard `tokio::spawn` task. Blocking pauses the entire worker thread, potentially starving other tasks. Use `tokio::task::spawn_blocking` for CPU-intensive work or blocking I/O. +- **Use Tokio's Async Primitives:** Prefer `tokio::sync` (channels, mutexes, semaphores), `tokio::io`, `tokio::net`, and `tokio::time` over their `std` counterparts in asynchronous contexts. These are designed to yield control back to the scheduler. +- **Manage Concurrency:** Be mindful of how many tasks are spawned. Creating a new task for every tiny piece of work can introduce overhead. Group related asynchronous operations where appropriate. +- **Handle Shared State Efficiently:** Use `Arc` for shared ownership in concurrent tasks. When shared state needs mutation, prefer `tokio::sync::Mutex` over `std::sync::Mutex` in `async` code. Consider `tokio::sync::RwLock` if reads significantly outnumber writes. Minimize the duration for which locks are held. +- **Understand `.await`:** Place `.await` strategically to allow the runtime to switch to other ready tasks. Ensure that `.await` points to genuinely asynchronous operations. +- **Backpressure:** If dealing with data streams or queues between tasks, implement backpressure mechanisms (e.g., bounded channels like `tokio::sync::mpsc::channel`) to prevent one component from overwhelming another or critical resources like the database. + +## Enterprise Features + +- Use feature flags for enterprise functionality +- Conditionally compile with `#[cfg(feature = "enterprise")]` +- Isolate enterprise code in separate modules + +## Code Style + +- Group imports by external and internal crates +- Place struct/enum definitions before implementations +- Group similar functionality together +- Use descriptive naming consistent with the codebase +- Follow existing patterns for async code using tokio + +## Testing + +- Write unit tests for core functionality +- Use the `#[cfg(test)]` module for test code +- For database tests, use the existing test utilities + +## Common Crates Used + +- **tokio**: For async runtime +- **axum**: For web server and routing +- **sqlx**: For database operations +- **serde**: For serialization/deserialization +- **tracing**: For logging and diagnostics +- **reqwest**: For HTTP client functionality \ No newline at end of file diff --git a/.cursor/rules/svelte5-best-practices.mdc b/.cursor/rules/svelte5-best-practices.mdc new file mode 100644 index 0000000000..c2fa3baae8 --- /dev/null +++ b/.cursor/rules/svelte5-best-practices.mdc @@ -0,0 +1,229 @@ +--- +description: +globs: frontend/src/**/*.svelte +alwaysApply: false +--- +# Svelte 5 Best Practices + +This guide outlines best practices for developing with Svelte 5, incorporating the new Runes API and other modern Svelte features. They should be applied on every new files created, but not on existing svelte 4 files unless specifically asked to. + +## Reactivity with Runes + +Svelte 5 introduces Runes for more explicit and flexible reactivity. + +1. **Embrace Runes for State Management**: + * Use `$state` for reactive local component state. + ```svelte + + + + ``` + * Use `$derived` for computed values based on other reactive state. + ```svelte + + +

{count} * 2 = {doubled}

+ ``` + * Use `$effect` for side effects that need to run when reactive values change (e.g., logging, manual DOM manipulation, data fetching). Remember `$effect` does not run on the server. + ```svelte + + ``` + +2. **Props with `$props`**: + * Declare component props using `$props()`. This offers better clarity and flexibility compared to `export let`. + ```svelte + + +

Name: {name}

+

Age: {age}

+ ``` + * For bindable props, use `$bindable`. + ```svelte + + + + ``` + +## Event Handling + +* **Use direct event attributes**: Svelte 5 moves away from `on:` directives for DOM events. + * **Do**: `` + * **Don't**: `` +* **For component events, prefer callback props**: Instead of `createEventDispatcher`, pass functions as props. + ```svelte + + + +

Message from child: {message}

+ + + + + ``` + +## Snippets for Content Projection + +* **Use `{#snippet ...}` and `{@render ...}` instead of slots**: Snippets are more powerful and flexible. + ```svelte + + + + + {#snippet title()} + My Awesome Title + {/snippet} + {#snippet content()} +

Some interesting content here.

+ {/snippet} +
+ + + + +
+
{@render title()}
+
{@render content()}
+
+ ``` +* Default content is passed via the `children` prop (which is a snippet). + ```svelte + + +
+ {@render children?.()} +
+ ``` + +## Component Design + +1. **Create Small, Reusable Components**: Break down complex UIs into smaller, focused components. Each component should have a single responsibility. This also aids performance by limiting the scope of reactivity updates. +2. **Descriptive Naming**: Use clear and descriptive names for variables, functions, and components. +3. **Minimize Logic in Components**: Move complex business logic to utility functions or services. Keep components focused on presentation and interaction. + +## State Management (Stores) + +1. **Segment Stores**: Avoid a single global store. Create multiple stores, each responsible for a specific piece of global state (e.g., `userStore.js`, `themeStore.js`). This can help limit reactivity updates to only the parts of the UI that depend on specific state segments. +2. **Use Custom Stores for Complex Logic**: For stores with related methods, create custom stores. + ```javascript + // counterStore.js + import { writable } from 'svelte/store'; + + function createCounter() { + const { subscribe, set, update } = writable(0); + + return { + subscribe, + increment: () => update(n => n + 1), + decrement: () => update(n => n - 1), + reset: () => set(0) + }; + } + export const counter = createCounter(); + ``` +3. **Use Context API for Localized State**: For state shared within a component subtree, consider Svelte's context API (`setContext`, `getContext`) instead of global stores when the state doesn't need to be truly global. + +## Performance Optimizations (Svelte 5) + +When generating Svelte 5 code, prioritize frontend performance by applying the following principles: + +### General Svelte 5 Principles + +- **Leverage the Compiler:** Trust Svelte's compiler to generate optimized JavaScript. Avoid manual DOM manipulation (`document.querySelector`, etc.) unless absolutely necessary for integrating third-party libraries that lack Svelte adapters. +- **Keep Components Small and Focused:** Reinforcing from Component Design, smaller components lead to less complex reactivity graphs and more targeted, efficient updates. + +### Reactivity & State Management + +- **Optimize Computations with `$derived`:** Always use `$derived` for computed values that depend on other state. This ensures the computation only runs when its specific dependencies change, avoiding unnecessary work compared to recomputing derived values in `$effect` or less efficient methods. +- **Minimize `$effect` Usage:** Use `$effect` sparingly and only for true side effects that interact with the outside world or non-Svelte state. Avoid putting complex logic or state updates *within* an `$effect` unless those updates are explicitly intended as a reaction to external changes or non-Svelte state. Excessive or complex effects can impact rendering performance. +- **Structure State for Fine-Grained Updates:** Design your `$state` objects or variables such that updates affect only the necessary parts of the UI. Avoid putting too much unrelated state into a single large object that gets frequently updated, as this can potentially trigger broader updates than necessary. Consider normalizing complex, nested state. + +### List Rendering (`{#each}`) + +- **Mandate `key` Attribute:** Always use a `key` attribute (`{#each items as item (item.id)}`) that refers to a unique, stable identifier for each item in a list. This is critical for allowing Svelte to efficiently update, reorder, add, or remove list items without destroying and re-creating unnecessary DOM elements and component instances. + +### Component Loading & Bundling + +- **Implement Lazy Loading/Code Splitting:** For routes, components, or modules that are not immediately needed on page load, use dynamic imports (`import(...)`) to split the code bundle. SvelteKit handles this automatically for routes, but it can be applied manually to components using helper patterns if needed. +- **Be Mindful of Third-Party Libraries:** When incorporating external libraries, import only the necessary functions or components to minimize the final bundle size. Prefer libraries designed to be tree-shakeable. + +### Rendering & DOM + +- **Use CSS for Animations/Transitions:** Prefer CSS animations or transitions where possible for performance. Svelte's built-in `transition:` directive is also highly optimized and should be used for complex state-driven transitions, but simple cases can often use plain CSS. +- **Optimize Image Loading:** Implement best practices for images: use optimized formats (WebP, AVIF), lazy loading (`loading="lazy"`), and responsive images (``, `srcset`) to avoid loading unnecessarily large images. + +### Server-Side Rendering (SSR) & Hydration + +- **Ensure SSR Compatibility:** Write components that can be rendered on the server for faster initial page loads. Avoid relying on browser-specific APIs (like `window` or `document`) in the main ` + +
+ Hello +
+ ``` +5. **Stay Updated**: Keep Svelte and its related packages up to date to benefit from the latest features, performance improvements, and security fixes. \ No newline at end of file From 40f40717027341b81644c90614125c86e3b24bad Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Wed, 7 May 2025 13:36:32 +0200 Subject: [PATCH 348/739] nits --- .../lib/components/InputTransformForm.svelte | 20 ++++++------- .../src/lib/components/TestConnection.svelte | 28 +++++++++++++++++++ 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/frontend/src/lib/components/InputTransformForm.svelte b/frontend/src/lib/components/InputTransformForm.svelte index 1e0a3099a5..3154e66c63 100644 --- a/frontend/src/lib/components/InputTransformForm.svelte +++ b/frontend/src/lib/components/InputTransformForm.svelte @@ -63,11 +63,11 @@ const dispatch = createEventDispatcher() $: inputCat = computeInputCat( - schema?.properties?.[argName].type, - schema?.properties?.[argName].format, - schema?.properties?.[argName].items?.type, - schema?.properties?.[argName].enum, - schema?.properties?.[argName].contentEncoding + schema?.properties?.[argName]?.type, + schema?.properties?.[argName]?.format, + schema?.properties?.[argName]?.items?.type, + schema?.properties?.[argName]?.enum, + schema?.properties?.[argName]?.contentEncoding ) let propertyType = getPropertyType(arg) @@ -275,7 +275,7 @@ function setDefaultCode() { if (!arg?.value) { - monacoTemplate?.setCode(schema.properties?.[argName].default) + monacoTemplate?.setCode(schema.properties?.[argName]?.default) } } @@ -287,7 +287,7 @@ } $: updateFocused(focused) - $: schema?.properties?.[argName].default && setDefaultCode() + $: schema?.properties?.[argName]?.default && setDefaultCode() let resourceTypes: string[] | undefined = undefined @@ -321,10 +321,10 @@ simpleTooltip={headerTooltip} simpleTooltipIconClass={headerTooltipIconClass} SimpleTooltipIcon={HeaderTooltipIcon} - format={schema?.properties?.[argName].format} - contentEncoding={schema?.properties?.[argName].contentEncoding} + format={schema?.properties?.[argName]?.format} + contentEncoding={schema?.properties?.[argName]?.contentEncoding} required={schema.required?.includes(argName)} - type={schema.properties?.[argName].type} + type={schema.properties?.[argName]?.type} /> {#if isStaticTemplate(inputCat)} diff --git a/frontend/src/lib/components/TestConnection.svelte b/frontend/src/lib/components/TestConnection.svelte index 930a6a72de..68d66dc531 100644 --- a/frontend/src/lib/components/TestConnection.svelte +++ b/frontend/src/lib/components/TestConnection.svelte @@ -86,6 +86,34 @@ export async function main(s3: S3) { return res.text() }) } +`, + lang: 'bun', + argName: 's3' + }, + azure_blob: { + code: ` +import * as wmill from "windmill-client" + +type S3 = object + +export async function main(s3: S3) { + return fetch(process.env["BASE_URL"] + '/api/settings/test_object_storage_config', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + Authorization: 'Bearer ' + process.env["WM_TOKEN"], + }, + body: JSON.stringify({ + type: "Azure", + ...s3 + }), + }).then(async (res) => { + if (!res.ok) { + throw new Error(await res.text()) + } + return res.text() + }) +} `, lang: 'bun', argName: 's3' From 0ac8e477d6fb7c5a7699a198fce9d18a08aff68c Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Wed, 7 May 2025 13:57:02 +0200 Subject: [PATCH 349/739] feat: handle . in interpolated args --- backend/windmill-queue/src/jobs.rs | 41 ++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/backend/windmill-queue/src/jobs.rs b/backend/windmill-queue/src/jobs.rs index 9be3797c21..93ea9d0bac 100644 --- a/backend/windmill-queue/src/jobs.rs +++ b/backend/windmill-queue/src/jobs.rs @@ -2653,13 +2653,38 @@ fn interpolate_args(x: String, args: &PushArgs, workspace_id: &str) -> String { let mut interpolated = workspaced.clone(); for cap in RE_ARG_TAG.captures_iter(&workspaced) { let arg_name = cap.get(1).unwrap().as_str(); - let arg_value = args - .args - .get(arg_name) - .or(args.extra.as_ref().and_then(|x| x.get(arg_name))) - .map(|x| x.get()) - .unwrap_or_default() - .trim_matches('"'); + let arg_value = if arg_name.contains('.') { + let parts: Vec<&str> = arg_name.split('.').collect(); + let root = parts[0]; + let mut value = args + .args + .get(root) + .or(args.extra.as_ref().and_then(|x| x.get(root))) + .map(|x| x.get()) + .unwrap_or_default().to_string(); + + for part in parts.iter().skip(1) { + if let Ok(obj) = serde_json::from_str::(&value) { + value = obj.get(part) + .and_then(|v| Some(v.to_string())) + .unwrap_or_default() + .as_str().to_string(); + } else { + value = "".to_string(); // Invalid JSON or missing field + break; + } + } + value.trim_matches('"').to_string() + } else { + args.args + .get(arg_name) + .or(args.extra.as_ref().and_then(|x| x.get(arg_name))) + .map(|x| x.get()) + .unwrap_or_default() + .trim_matches('"') + .to_string() + }; + tracing::error!("arg_value: {}", arg_value); interpolated = interpolated.replace(format!("$args[{}]", arg_name).as_str(), &arg_value); } @@ -3227,7 +3252,7 @@ pub fn empty_result() -> Box { // } lazy_static::lazy_static! { - pub static ref RE_ARG_TAG: Regex = Regex::new(r#"\$args\[(\w+)\]"#).unwrap(); + pub static ref RE_ARG_TAG: Regex = Regex::new(r#"\$args\[((?:\w+\.)*\w+)\]"#).unwrap(); } // #[instrument(level = "trace", skip_all)] From 45224fec3d475bdbf2584d26725959ad534c5e09 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Wed, 7 May 2025 15:27:43 +0200 Subject: [PATCH 350/739] chore(main): release 1.488.0 (#5709) * chore(main): release 1.488.0 * Apply automatic changes --------- Co-authored-by: rubenfiszel <275584+rubenfiszel@users.noreply.github.com> --- CHANGELOG.md | 13 ++ backend/Cargo.lock | 114 ++++++++++-------- backend/Cargo.toml | 4 +- backend/windmill-api/openapi.yaml | 2 +- benchmarks/lib.ts | 2 +- cli/main.ts | 2 +- frontend/package-lock.json | 4 +- frontend/package.json | 2 +- lsp/Pipfile | 4 +- openflow.openapi.yaml | 2 +- .../WindmillClient/WindmillClient.psd1 | 2 +- python-client/wmill/pyproject.toml | 2 +- python-client/wmill_pg/pyproject.toml | 2 +- typescript-client/jsr.json | 2 +- typescript-client/package.json | 2 +- version.txt | 2 +- 16 files changed, 96 insertions(+), 65 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index da2f5bd6a0..6d39fb7dae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Changelog +## [1.488.0](https://github.com/windmill-labs/windmill/compare/v1.487.0...v1.488.0) (2025-05-07) + + +### Features + +* handle . in interpolated args ([0ac8e47](https://github.com/windmill-labs/windmill/commit/0ac8e477d6fb7c5a7699a198fce9d18a08aff68c)) + + +### Bug Fixes + +* fix azure object storage regression due to object_store regression ([df9f827](https://github.com/windmill-labs/windmill/commit/df9f827d103def27166a767044373bd0754285e2)) +* performance and stability improvement to fetch last deployed script ([75d9924](https://github.com/windmill-labs/windmill/commit/75d992449c845fd11c9a317d401c405e7d78e1ec)) + ## [1.487.0](https://github.com/windmill-labs/windmill/compare/v1.486.1...v1.487.0) (2025-05-06) diff --git a/backend/Cargo.lock b/backend/Cargo.lock index 77d2170699..9e6d454605 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -1198,9 +1198,9 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.74" +version = "0.3.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" dependencies = [ "addr2line", "cfg-if", @@ -3804,7 +3804,7 @@ dependencies = [ "tokio", "tokio-eld", "url", - "webpki-root-certs", + "webpki-root-certs 0.26.11", "winapi", "windows-sys 0.59.0", "x25519-dalek", @@ -4126,7 +4126,7 @@ dependencies = [ "serde", "thiserror 2.0.12", "tokio", - "webpki-roots", + "webpki-roots 0.26.11", ] [[package]] @@ -6380,7 +6380,7 @@ dependencies = [ "tokio", "tokio-rustls 0.26.2", "tower-service", - "webpki-roots", + "webpki-roots 0.26.11", ] [[package]] @@ -7015,9 +7015,9 @@ checksum = "a4933f3f57a8e9d9da04db23fb153356ecaf00cbd14aee46279c33dc80925c37" [[package]] name = "kqueue" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cf0c5a3f977f1cebd92cf05ebb14e1c941c642fb57c9a7d4302455b33ba326f" +checksum = "eac30106d7dce88daf4a3fcb4879ea939476d5074a9b7ddd0fb97fa4bed5596a" dependencies = [ "kqueue-sys", "libc", @@ -7194,9 +7194,9 @@ dependencies = [ [[package]] name = "libm" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a25169bd5913a4b437588a7e3d127cd6e90127b60e0ffbd834a38f1599e016b8" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "libproc" @@ -7455,7 +7455,7 @@ dependencies = [ "smtp-proto", "tokio", "tokio-rustls 0.26.2", - "webpki-roots", + "webpki-roots 0.26.11", ] [[package]] @@ -10179,7 +10179,7 @@ dependencies = [ "wasm-bindgen-futures", "wasm-streams", "web-sys", - "webpki-roots", + "webpki-roots 0.26.11", "windows-registry", ] @@ -11639,7 +11639,7 @@ dependencies = [ "tracing", "url", "uuid", - "webpki-roots", + "webpki-roots 0.26.11", ] [[package]] @@ -13207,7 +13207,7 @@ checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" dependencies = [ "indexmap 2.9.0", "toml_datetime", - "winnow 0.7.9", + "winnow 0.7.10", ] [[package]] @@ -13242,7 +13242,7 @@ dependencies = [ "tower-layer", "tower-service", "tracing", - "webpki-roots", + "webpki-roots 0.26.11", ] [[package]] @@ -13856,7 +13856,7 @@ dependencies = [ "serde", "serde_json", "url", - "webpki-roots", + "webpki-roots 0.26.11", ] [[package]] @@ -14209,18 +14209,36 @@ dependencies = [ [[package]] name = "webpki-root-certs" -version = "0.26.10" +version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c99403924bc5f23afefc319b8ac67ed0e50669f6e52a413314cccb1fdbc93ba0" +checksum = "75c7f0ef91146ebfb530314f5f1d24528d7f0767efbfd31dce919275413e393e" +dependencies = [ + "webpki-root-certs 1.0.0", +] + +[[package]] +name = "webpki-root-certs" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01a83f7e1a9f8712695c03eabe9ed3fbca0feff0152f33f12593e5a6303cb1a4" dependencies = [ "rustls-pki-types", ] [[package]] name = "webpki-roots" -version = "0.26.10" +version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37493cadf42a2a939ed404698ded7fb378bf301b5011f973361779a3a74f8c93" +checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" +dependencies = [ + "webpki-roots 1.0.0", +] + +[[package]] +name = "webpki-roots" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2853738d1cc4f2da3a225c18ec6c3721abb31961096e9dbf5ab35fa88b19cfdb" dependencies = [ "rustls-pki-types", ] @@ -14382,7 +14400,7 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windmill" -version = "1.487.0" +version = "1.488.0" dependencies = [ "anyhow", "axum", @@ -14431,7 +14449,7 @@ dependencies = [ [[package]] name = "windmill-api" -version = "1.487.0" +version = "1.488.0" dependencies = [ "anyhow", "argon2", @@ -14540,7 +14558,7 @@ dependencies = [ [[package]] name = "windmill-api-client" -version = "1.487.0" +version = "1.488.0" dependencies = [ "base64 0.22.1", "chrono", @@ -14555,7 +14573,7 @@ dependencies = [ [[package]] name = "windmill-audit" -version = "1.487.0" +version = "1.488.0" dependencies = [ "chrono", "serde", @@ -14568,7 +14586,7 @@ dependencies = [ [[package]] name = "windmill-autoscaling" -version = "1.487.0" +version = "1.488.0" dependencies = [ "anyhow", "serde", @@ -14582,7 +14600,7 @@ dependencies = [ [[package]] name = "windmill-common" -version = "1.487.0" +version = "1.488.0" dependencies = [ "anyhow", "async-stream", @@ -14648,7 +14666,7 @@ dependencies = [ [[package]] name = "windmill-git-sync" -version = "1.487.0" +version = "1.488.0" dependencies = [ "regex", "serde", @@ -14662,7 +14680,7 @@ dependencies = [ [[package]] name = "windmill-indexer" -version = "1.487.0" +version = "1.488.0" dependencies = [ "anyhow", "bytes", @@ -14685,7 +14703,7 @@ dependencies = [ [[package]] name = "windmill-macros" -version = "1.487.0" +version = "1.488.0" dependencies = [ "itertools 0.14.0", "lazy_static", @@ -14697,7 +14715,7 @@ dependencies = [ [[package]] name = "windmill-parser" -version = "1.487.0" +version = "1.488.0" dependencies = [ "convert_case 0.6.0", "serde", @@ -14706,7 +14724,7 @@ dependencies = [ [[package]] name = "windmill-parser-bash" -version = "1.487.0" +version = "1.488.0" dependencies = [ "anyhow", "lazy_static", @@ -14718,7 +14736,7 @@ dependencies = [ [[package]] name = "windmill-parser-csharp" -version = "1.487.0" +version = "1.488.0" dependencies = [ "anyhow", "serde_json", @@ -14730,7 +14748,7 @@ dependencies = [ [[package]] name = "windmill-parser-go" -version = "1.487.0" +version = "1.488.0" dependencies = [ "anyhow", "gosyn", @@ -14742,7 +14760,7 @@ dependencies = [ [[package]] name = "windmill-parser-graphql" -version = "1.487.0" +version = "1.488.0" dependencies = [ "anyhow", "lazy_static", @@ -14754,7 +14772,7 @@ dependencies = [ [[package]] name = "windmill-parser-java" -version = "1.487.0" +version = "1.488.0" dependencies = [ "anyhow", "serde_json", @@ -14766,7 +14784,7 @@ dependencies = [ [[package]] name = "windmill-parser-nu" -version = "1.487.0" +version = "1.488.0" dependencies = [ "anyhow", "nu-parser", @@ -14777,7 +14795,7 @@ dependencies = [ [[package]] name = "windmill-parser-php" -version = "1.487.0" +version = "1.488.0" dependencies = [ "anyhow", "itertools 0.14.0", @@ -14788,7 +14806,7 @@ dependencies = [ [[package]] name = "windmill-parser-py" -version = "1.487.0" +version = "1.488.0" dependencies = [ "anyhow", "itertools 0.14.0", @@ -14799,7 +14817,7 @@ dependencies = [ [[package]] name = "windmill-parser-py-imports" -version = "1.487.0" +version = "1.488.0" dependencies = [ "anyhow", "async-recursion", @@ -14819,7 +14837,7 @@ dependencies = [ [[package]] name = "windmill-parser-rust" -version = "1.487.0" +version = "1.488.0" dependencies = [ "anyhow", "convert_case 0.6.0", @@ -14836,7 +14854,7 @@ dependencies = [ [[package]] name = "windmill-parser-sql" -version = "1.487.0" +version = "1.488.0" dependencies = [ "anyhow", "lazy_static", @@ -14848,7 +14866,7 @@ dependencies = [ [[package]] name = "windmill-parser-ts" -version = "1.487.0" +version = "1.488.0" dependencies = [ "anyhow", "lazy_static", @@ -14866,7 +14884,7 @@ dependencies = [ [[package]] name = "windmill-parser-wasm" -version = "1.487.0" +version = "1.488.0" dependencies = [ "anyhow", "getrandom 0.2.16", @@ -14890,7 +14908,7 @@ dependencies = [ [[package]] name = "windmill-parser-yaml" -version = "1.487.0" +version = "1.488.0" dependencies = [ "anyhow", "serde_json", @@ -14900,7 +14918,7 @@ dependencies = [ [[package]] name = "windmill-queue" -version = "1.487.0" +version = "1.488.0" dependencies = [ "anyhow", "async-recursion", @@ -14933,7 +14951,7 @@ dependencies = [ [[package]] name = "windmill-sql-datatype-parser-wasm" -version = "1.487.0" +version = "1.488.0" dependencies = [ "wasm-bindgen", "wasm-bindgen-test", @@ -14943,7 +14961,7 @@ dependencies = [ [[package]] name = "windmill-worker" -version = "1.487.0" +version = "1.488.0" dependencies = [ "anyhow", "async-recursion", @@ -15503,9 +15521,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9fb597c990f03753e08d3c29efbfcf2019a003b4bf4ba19225c158e1549f0f3" +checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec" dependencies = [ "memchr", ] diff --git a/backend/Cargo.toml b/backend/Cargo.toml index a457343a1c..ffe4a8ee1b 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "windmill" -version = "1.487.0" +version = "1.488.0" authors.workspace = true edition.workspace = true @@ -32,7 +32,7 @@ members = [ ] [workspace.package] -version = "1.487.0" +version = "1.488.0" authors = ["Ruben Fiszel "] edition = "2021" diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index f3426a9566..961a4a9209 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.487.0 + version: 1.488.0 title: Windmill API contact: diff --git a/benchmarks/lib.ts b/benchmarks/lib.ts index 41d070e754..cc627194ca 100644 --- a/benchmarks/lib.ts +++ b/benchmarks/lib.ts @@ -2,7 +2,7 @@ import { sleep } from "https://deno.land/x/sleep@v1.2.1/mod.ts"; import * as windmill from "https://deno.land/x/windmill@v1.174.0/mod.ts"; import * as api from "https://deno.land/x/windmill@v1.174.0/windmill-api/index.ts"; -export const VERSION = "v1.487.0"; +export const VERSION = "v1.488.0"; export async function login(email: string, password: string): Promise { return await windmill.UserService.login({ diff --git a/cli/main.ts b/cli/main.ts index 2890e1e35b..6b4dc66d19 100644 --- a/cli/main.ts +++ b/cli/main.ts @@ -63,7 +63,7 @@ export { // } // }); -export const VERSION = "1.487.0"; +export const VERSION = "1.488.0"; const command = new Command() .name("wmill") diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 93d599d681..cef171497d 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "windmill-components", - "version": "1.487.0", + "version": "1.488.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "windmill-components", - "version": "1.487.0", + "version": "1.488.0", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/frontend/package.json b/frontend/package.json index 67da8a0a99..314bde7309 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "windmill-components", - "version": "1.487.0", + "version": "1.488.0", "scripts": { "dev": "vite dev", "build": "vite build", diff --git a/lsp/Pipfile b/lsp/Pipfile index 391601da0f..6b9ea07776 100644 --- a/lsp/Pipfile +++ b/lsp/Pipfile @@ -4,8 +4,8 @@ verify_ssl = true name = "pypi" [packages] -wmill = ">=1.487.0" -wmill_pg = ">=1.487.0" +wmill = ">=1.488.0" +wmill_pg = ">=1.488.0" sendgrid = "*" mysql-connector-python = "*" pymongo = "*" diff --git a/openflow.openapi.yaml b/openflow.openapi.yaml index 1f01ed7f3e..1ba95be9f5 100644 --- a/openflow.openapi.yaml +++ b/openflow.openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.487.0 + version: 1.488.0 title: OpenFlow Spec contact: name: Ruben Fiszel diff --git a/powershell-client/WindmillClient/WindmillClient.psd1 b/powershell-client/WindmillClient/WindmillClient.psd1 index 3a352ceccd..fc98395286 100644 --- a/powershell-client/WindmillClient/WindmillClient.psd1 +++ b/powershell-client/WindmillClient/WindmillClient.psd1 @@ -12,7 +12,7 @@ RootModule = 'WindmillClient.psm1' # Version number of this module. - ModuleVersion = '1.487.0' + ModuleVersion = '1.488.0' # Supported PSEditions # CompatiblePSEditions = @() diff --git a/python-client/wmill/pyproject.toml b/python-client/wmill/pyproject.toml index 5bc837e92d..3020a1c54d 100644 --- a/python-client/wmill/pyproject.toml +++ b/python-client/wmill/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "wmill" -version = "1.487.0" +version = "1.488.0" description = "A client library for accessing Windmill server wrapping the Windmill client API" license = "Apache-2.0" homepage = "https://windmill.dev" diff --git a/python-client/wmill_pg/pyproject.toml b/python-client/wmill_pg/pyproject.toml index 7e31934481..7406ae251c 100644 --- a/python-client/wmill_pg/pyproject.toml +++ b/python-client/wmill_pg/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "wmill-pg" -version = "1.487.0" +version = "1.488.0" description = "An extension client for the wmill client library focused on pg" license = "Apache-2.0" homepage = "https://windmill.dev" diff --git a/typescript-client/jsr.json b/typescript-client/jsr.json index 69215648d2..ec281c0a1d 100644 --- a/typescript-client/jsr.json +++ b/typescript-client/jsr.json @@ -1,6 +1,6 @@ { "name": "@windmill/windmill", - "version": "1.487.0", + "version": "1.488.0", "exports": "./src/index.ts", "publish": { "exclude": ["!src", "./s3Types.ts", "./client.ts"] diff --git a/typescript-client/package.json b/typescript-client/package.json index 76021fd576..09afc0282b 100644 --- a/typescript-client/package.json +++ b/typescript-client/package.json @@ -1,7 +1,7 @@ { "name": "windmill-client", "description": "Windmill SDK client for browsers and Node.js", - "version": "1.487.0", + "version": "1.488.0", "author": "Ruben Fiszel", "license": "Apache 2.0", "devDependencies": { diff --git a/version.txt b/version.txt index 9b4cb9226d..e7aea43065 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.487.0 +1.488.0 From 242a5654285b0a3bf222c80e82f6861ffafed838 Mon Sep 17 00:00:00 2001 From: dieriba Date: Wed, 7 May 2025 18:23:40 +0200 Subject: [PATCH 351/739] feat: raise error if end early in flow (#5653) * update front * handle err_msg display if enabled when stop condition is met * nits * Update backend/windmill-worker/src/worker_flow.rs Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com> * Update openflow.openapi.yaml Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> * Update worker_flow.rs * Update worker_flow.rs * update flow test * update condition * remove println * nits * fix flow test * nits and missing property on struct definition * nits * fix unsaved state * update .sqlx * cleanup sqlx --------- Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com> Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> Co-authored-by: Ruben Fiszel --- ...f1e669b60edccd260625a95094b7244f5fb83.json | 15 - ...316237eb1a547678858c1a1e45985035b3468.json | 14 + ...924a98f28b0dead245df7248a9ccb8a5f20c3.json | 16 + ...b8192924b4a938d249fae92624cd55e44f488.json | 17 + ...8197fa15efb9c78d68e3a191c01a04efe153f.json | 25 - ...4c917d27fdb6273a35a563292b1f0701dc6ed.json | 16 - ...354665dff01554549ea7bbbb9953c68231296.json | 23 - ...1babaa2fe072900b57e78e461590a6dafb682.json | 15 - ...3b72fa7c4b3c458d52a5891a61f9c53a49c6d.json | 23 - ...cd9aef958c15df1c0a7b02318a756cd3589e9.json | 15 - ...ffc14b5c8aabf5ab53384f5f2b20eafd66cb3.json | 15 + ...4da72e61eeb8e081d2e3d1ab99a4fe450350.json} | 4 +- ...6f3ab44afe0d1a7c261a626d93fb44c00bdb7.json | 14 + ...a1dac2cbcf00db116624bd2fe27a4d0dfb436.json | 15 - ...8fd60ce778c2fece27637d9985d4650778653.json | 15 - ...4aab41142897db108dc8cbc2c51abb2e30c7c.json | 16 - ...efe0ca030638ded82c2ffd2155cacdf36ec11.json | 15 + ...949e16830671a458d5a73762cd8545d26172d.json | 17 - ...8fa6fb782e9d589852e51530cdd1a38322a9d.json | 15 + ...71dd12655179f41f43896e7d30fdfb3ae5939.json | 15 + ...f887d79fb4c13b60b19c4913a8db18521958c.json | 15 + ...585d082435e0e79a09821a2045e3b550c3276.json | 16 + ...d964fda13a1091a8206ee174ed3a161248126.json | 25 - ...063db3bbfea67f4a056d6e3be1fc4255cfc06.json | 16 - ...610c0e233bca35edebe2ad1772a4a1a1d5bbe.json | 23 + ...76c160ee65eaa01b259c996f3f96ed44fcaaf.json | 15 - ...ed7e7c98780fef56f6ea6e1e1fd0458ae32f.json} | 4 +- ...725da747e6b967554eb7e088ee3a018ec1f8b.json | 25 + ...bc9de1246427bf0302c032f8bd26ff93313f7.json | 15 - ...9bb0611d0ec451b48aa1a4de309dadeb53315.json | 14 - ...913c01b5d8d27dd4251f0cabbe3e974c0b0a.json} | 4 +- ...db3a7c2f0c8f9308946b9262e14b8c584dd99.json | 14 - ...69949549a44855529f77a530f681a6e714646.json | 17 - ...de5e8c3762597e6f55f8b9575a54ccc31e085.json | 25 - ...2589075c240b16d872576a048349b56f468e5.json | 15 + ...106bb6eea8af03e350d4ba19a4aba2cb9625.json} | 4 +- ...0554a1e40d0ce9cc686ad09adca0904324cd8.json | 15 - ...bb34af450041c675b30b708fed3ef9e01d2d.json} | 4 +- ...7f3d6cebca1aa84a6f792c2a962b798f8da22.json | 15 + ...942addd4581dddc88663b6c2cbae87ec205fc.json | 25 + ...8ede5135a849e7b9108c37bfd90990a4be780.json | 23 + ...64d402d32e2b6ce925d1ebf1f60f3b688207.json} | 4 +- ...bbff779a4a62d129916dd4c3054b45e0b654e.json | 16 + ...14c4ccd1bc9b4695ca56f56ba0899b23562f.json} | 4 +- ...fb77dc03469355d2a0da0b2d6b4aeeea37d3e.json | 16 + ...ad1a66bbd8dacd12dea36608cc20197df358f.json | 16 - ...acb3e3caa02a04b084da44cdcb9103794b39e.json | 15 + ...894ea93f0eaba37874f828a733062af17640.json} | 4 +- ...60770b19c0a00cd333abc48b29c54f863149.json} | 4 +- ...97ecbfe662efb13ffdd8ee3f1930bff4cd9c4.json | 17 + ...481b170c221349a793c9608c4ccd52ba8a5af.json | 15 + ...5c70e6ebc68e4a16d02e4e36b79f3cfb1c661.json | 17 - ...77fa54ce686da9c93790420a91a0735589ac7.json | 17 - ...877a6d5bc5771b27d9e208a219a63add200f3.json | 16 + ...8254c9a832b4f660ec755f4fa14f6f7bb3353.json | 25 + ...59cc0f16d7286c3f07c27d962258022f0e04d.json | 17 + ...a1aea7f410ef204ec3465f4fb6c9acd256c95.json | 15 - ...2740141eb8b5ed07c090ae9356a970caeadd0.json | 17 + ...7184d7f4fcb04c07a8e2f07c5effc10f8fd5c.json | 16 - backend/windmill-api-client/codegen.rs | 4 + backend/windmill-api-client/src/codegen.rs | 2 + backend/windmill-api/src/flows.rs | 13 +- backend/windmill-common/src/flows.rs | 3 +- backend/windmill-worker/src/worker_flow.rs | 924 +++++++++--------- .../flows/content/FlowModuleEarlyStop.svelte | 129 ++- .../flows/content/FlowModuleSkip.svelte | 2 +- openflow.openapi.yaml | 30 +- 67 files changed, 1053 insertions(+), 954 deletions(-) delete mode 100644 backend/.sqlx/query-06731936fb073169b3a1a8a9817f1e669b60edccd260625a95094b7244f5fb83.json create mode 100644 backend/.sqlx/query-06db0e720dd59a7c52c0a98ea7b316237eb1a547678858c1a1e45985035b3468.json create mode 100644 backend/.sqlx/query-0aaec91ab06753e46c595d82469924a98f28b0dead245df7248a9ccb8a5f20c3.json create mode 100644 backend/.sqlx/query-1060c503cf8d4bb5cef9720c162b8192924b4a938d249fae92624cd55e44f488.json delete mode 100644 backend/.sqlx/query-1252ef3a652ffb99529c2ce84928197fa15efb9c78d68e3a191c01a04efe153f.json delete mode 100644 backend/.sqlx/query-173fbfd3ca2344fd08f73af75524c917d27fdb6273a35a563292b1f0701dc6ed.json delete mode 100644 backend/.sqlx/query-17851a0710b80ffd6bebe42012a354665dff01554549ea7bbbb9953c68231296.json delete mode 100644 backend/.sqlx/query-1850552883e67da181d68ff5c4e1babaa2fe072900b57e78e461590a6dafb682.json delete mode 100644 backend/.sqlx/query-28b42ab9c3ce0c2f05cf385e81f3b72fa7c4b3c458d52a5891a61f9c53a49c6d.json delete mode 100644 backend/.sqlx/query-303c7e92ce23dc367d97d813415cd9aef958c15df1c0a7b02318a756cd3589e9.json create mode 100644 backend/.sqlx/query-3325f8ed245b1bce27c3d9f5e62ffc14b5c8aabf5ab53384f5f2b20eafd66cb3.json rename backend/.sqlx/{query-ec1f31fd7628ea2e30995a0de1d8665831ee3e4ec3815e9ad90e886ffecba0f1.json => query-38b3945c04ae58aace881ed4d6aa4da72e61eeb8e081d2e3d1ab99a4fe450350.json} (68%) create mode 100644 backend/.sqlx/query-3af32856235690827a8700bb2396f3ab44afe0d1a7c261a626d93fb44c00bdb7.json delete mode 100644 backend/.sqlx/query-3d58b5861c62f0b092b6b95c17ba1dac2cbcf00db116624bd2fe27a4d0dfb436.json delete mode 100644 backend/.sqlx/query-3e0cdd500dffc3bd1d8374ca3cc8fd60ce778c2fece27637d9985d4650778653.json delete mode 100644 backend/.sqlx/query-429aef2c320a152b16fe20c1ab84aab41142897db108dc8cbc2c51abb2e30c7c.json create mode 100644 backend/.sqlx/query-4622d28e2fa09bc60b9d0c79397efe0ca030638ded82c2ffd2155cacdf36ec11.json delete mode 100644 backend/.sqlx/query-4c9cf8c3176abc2b8b9a1c3f671949e16830671a458d5a73762cd8545d26172d.json create mode 100644 backend/.sqlx/query-525a9ef57c7d9fac86cb1bf47868fa6fb782e9d589852e51530cdd1a38322a9d.json create mode 100644 backend/.sqlx/query-52ad0c838d19cbd9e90b8368abe71dd12655179f41f43896e7d30fdfb3ae5939.json create mode 100644 backend/.sqlx/query-553108ba3c0b8d579800bc8b5a4f887d79fb4c13b60b19c4913a8db18521958c.json create mode 100644 backend/.sqlx/query-5a4fa8ff2148d92946e6ac95f70585d082435e0e79a09821a2045e3b550c3276.json delete mode 100644 backend/.sqlx/query-6513c1433dbfe03f7c778963a05d964fda13a1091a8206ee174ed3a161248126.json delete mode 100644 backend/.sqlx/query-6664be80f0d72ea7b8b184c5348063db3bbfea67f4a056d6e3be1fc4255cfc06.json create mode 100644 backend/.sqlx/query-69db5305aadd911b06ecdc4eeb9610c0e233bca35edebe2ad1772a4a1a1d5bbe.json delete mode 100644 backend/.sqlx/query-69ff806066a24c60188d7547a7776c160ee65eaa01b259c996f3f96ed44fcaaf.json rename backend/.sqlx/{query-1b58b90c184ca21d777ea4e264c79aecc2361134a4817c2b9580f2680425352d.json => query-6b0347da54d1b8646ece08a5ce78ed7e7c98780fef56f6ea6e1e1fd0458ae32f.json} (71%) create mode 100644 backend/.sqlx/query-7470e7067b948509d14828c24a8725da747e6b967554eb7e088ee3a018ec1f8b.json delete mode 100644 backend/.sqlx/query-7b084617bf2de5ed9a657d2bd2cbc9de1246427bf0302c032f8bd26ff93313f7.json delete mode 100644 backend/.sqlx/query-7bd7505b008954aae6152554c1f9bb0611d0ec451b48aa1a4de309dadeb53315.json rename backend/.sqlx/{query-d988e91087695742d75946100cf2b7593cb8eed2a97411697819849958c022b3.json => query-8780a8cd6781f86041ae8df58477913c01b5d8d27dd4251f0cabbe3e974c0b0a.json} (70%) delete mode 100644 backend/.sqlx/query-8be1ddb20ffd8c375b7d1ecb14bdb3a7c2f0c8f9308946b9262e14b8c584dd99.json delete mode 100644 backend/.sqlx/query-8cb755510f2cfb23bdd0d1cf66b69949549a44855529f77a530f681a6e714646.json delete mode 100644 backend/.sqlx/query-8f3ed45a0290cd9989f40f34775de5e8c3762597e6f55f8b9575a54ccc31e085.json create mode 100644 backend/.sqlx/query-8fcf755b4a57ed4ebf10a57c0c82589075c240b16d872576a048349b56f468e5.json rename backend/.sqlx/{query-fdedd3909a97db5d43d9c46ff77b800b8efd647121b538deb023f96dbaac3715.json => query-903cf23d6b620388c645d5b8ac7d106bb6eea8af03e350d4ba19a4aba2cb9625.json} (72%) delete mode 100644 backend/.sqlx/query-90635149190c59396ca557bf1670554a1e40d0ce9cc686ad09adca0904324cd8.json rename backend/.sqlx/{query-c50b6a4a6739d6df087a3b37c209e5f4b72fc27578d988155b74b05ec5df30b9.json => query-92c7c961198e506426bf3f97a8ddbb34af450041c675b30b708fed3ef9e01d2d.json} (73%) create mode 100644 backend/.sqlx/query-94f11d70062eebce384fe0fde527f3d6cebca1aa84a6f792c2a962b798f8da22.json create mode 100644 backend/.sqlx/query-96c0e34708bbba29db162e7289a942addd4581dddc88663b6c2cbae87ec205fc.json create mode 100644 backend/.sqlx/query-a10ec229d7ed89f563b6b33e70e8ede5135a849e7b9108c37bfd90990a4be780.json rename backend/.sqlx/{query-30216cf02e972f961b7cc6054050fdc984be118df1ad68f7263c84e058bb1266.json => query-a3debece1a4171881431640f6af264d402d32e2b6ce925d1ebf1f60f3b688207.json} (51%) create mode 100644 backend/.sqlx/query-a3f315fdae54e51b56b0681fab2bbff779a4a62d129916dd4c3054b45e0b654e.json rename backend/.sqlx/{query-4507c3907bf49f93f6c17956d9cf9495f4538b20ce0299acde7578386db4278c.json => query-aa4ecf6b7ab078544c280957ad6614c4ccd1bc9b4695ca56f56ba0899b23562f.json} (66%) create mode 100644 backend/.sqlx/query-aed8bd751c3e988f422216e74acfb77dc03469355d2a0da0b2d6b4aeeea37d3e.json delete mode 100644 backend/.sqlx/query-af925931f3217bbd32313678989ad1a66bbd8dacd12dea36608cc20197df358f.json create mode 100644 backend/.sqlx/query-b01160fe44d69834ac08bbf60feacb3e3caa02a04b084da44cdcb9103794b39e.json rename backend/.sqlx/{query-47e6b25cc092ec8718a6581c76aca10b275653e10ea4aa17a8ef5091ca09294a.json => query-b1c96c527c4b263b5155d689eb88894ea93f0eaba37874f828a733062af17640.json} (67%) rename backend/.sqlx/{query-597b148ff09a1e0f369bb04781ee4e429ebce64a4d5c16b0f136142ad213cdb1.json => query-b41fa341e65ee348f468ed04ac1160770b19c0a00cd333abc48b29c54f863149.json} (52%) create mode 100644 backend/.sqlx/query-bbc2c0769bf833f4e95bfc7908897ecbfe662efb13ffdd8ee3f1930bff4cd9c4.json create mode 100644 backend/.sqlx/query-bcfe877749ff7b944fef302ea37481b170c221349a793c9608c4ccd52ba8a5af.json delete mode 100644 backend/.sqlx/query-c202f6fbae6a727f88f3ac692985c70e6ebc68e4a16d02e4e36b79f3cfb1c661.json delete mode 100644 backend/.sqlx/query-c71e12ec9d0054dd5605a4ea2ef77fa54ce686da9c93790420a91a0735589ac7.json create mode 100644 backend/.sqlx/query-cd79f4dc6a426f1c4c19c2a86dc877a6d5bc5771b27d9e208a219a63add200f3.json create mode 100644 backend/.sqlx/query-d6db1103fee4bad6831656d77a28254c9a832b4f660ec755f4fa14f6f7bb3353.json create mode 100644 backend/.sqlx/query-de2a213bc5a08d08bcd52ad630559cc0f16d7286c3f07c27d962258022f0e04d.json delete mode 100644 backend/.sqlx/query-defd99dd2427cdc54bb662d1ba3a1aea7f410ef204ec3465f4fb6c9acd256c95.json create mode 100644 backend/.sqlx/query-e3f545460bf317c3e2f34f4cbd12740141eb8b5ed07c090ae9356a970caeadd0.json delete mode 100644 backend/.sqlx/query-f3c78cb67379f9407f1f32ce3387184d7f4fcb04c07a8e2f07c5effc10f8fd5c.json diff --git a/backend/.sqlx/query-06731936fb073169b3a1a8a9817f1e669b60edccd260625a95094b7244f5fb83.json b/backend/.sqlx/query-06731936fb073169b3a1a8a9817f1e669b60edccd260625a95094b7244f5fb83.json deleted file mode 100644 index c509986552..0000000000 --- a/backend/.sqlx/query-06731936fb073169b3a1a8a9817f1e669b60edccd260625a95094b7244f5fb83.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE v2_job_status\n SET flow_status = JSONB_SET(flow_status, ARRAY['retry'], $1)\n WHERE id = $2", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Jsonb", - "Uuid" - ] - }, - "nullable": [] - }, - "hash": "06731936fb073169b3a1a8a9817f1e669b60edccd260625a95094b7244f5fb83" -} diff --git a/backend/.sqlx/query-06db0e720dd59a7c52c0a98ea7b316237eb1a547678858c1a1e45985035b3468.json b/backend/.sqlx/query-06db0e720dd59a7c52c0a98ea7b316237eb1a547678858c1a1e45985035b3468.json new file mode 100644 index 0000000000..aea8b8302b --- /dev/null +++ b/backend/.sqlx/query-06db0e720dd59a7c52c0a98ea7b316237eb1a547678858c1a1e45985035b3468.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE v2_job_status\n SET flow_status = flow_status - 'retry'\n WHERE id = $1", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Uuid" + ] + }, + "nullable": [] + }, + "hash": "06db0e720dd59a7c52c0a98ea7b316237eb1a547678858c1a1e45985035b3468" +} diff --git a/backend/.sqlx/query-0aaec91ab06753e46c595d82469924a98f28b0dead245df7248a9ccb8a5f20c3.json b/backend/.sqlx/query-0aaec91ab06753e46c595d82469924a98f28b0dead245df7248a9ccb8a5f20c3.json new file mode 100644 index 0000000000..04f5ba5b84 --- /dev/null +++ b/backend/.sqlx/query-0aaec91ab06753e46c595d82469924a98f28b0dead245df7248a9ccb8a5f20c3.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE v2_job_status\n SET flow_status = JSONB_SET(flow_status, ARRAY['modules', $1::TEXT], $2)\n WHERE id = $3", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Jsonb", + "Uuid" + ] + }, + "nullable": [] + }, + "hash": "0aaec91ab06753e46c595d82469924a98f28b0dead245df7248a9ccb8a5f20c3" +} diff --git a/backend/.sqlx/query-1060c503cf8d4bb5cef9720c162b8192924b4a938d249fae92624cd55e44f488.json b/backend/.sqlx/query-1060c503cf8d4bb5cef9720c162b8192924b4a938d249fae92624cd55e44f488.json new file mode 100644 index 0000000000..39b7179e5c --- /dev/null +++ b/backend/.sqlx/query-1060c503cf8d4bb5cef9720c162b8192924b4a938d249fae92624cd55e44f488.json @@ -0,0 +1,17 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE v2_job_status SET\n flow_status = JSONB_SET(\n flow_status,\n ARRAY['modules', $1::TEXT, 'flow_jobs_success', $3::TEXT],\n $4\n )\n WHERE id = $2", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Uuid", + "Text", + "Jsonb" + ] + }, + "nullable": [] + }, + "hash": "1060c503cf8d4bb5cef9720c162b8192924b4a938d249fae92624cd55e44f488" +} diff --git a/backend/.sqlx/query-1252ef3a652ffb99529c2ce84928197fa15efb9c78d68e3a191c01a04efe153f.json b/backend/.sqlx/query-1252ef3a652ffb99529c2ce84928197fa15efb9c78d68e3a191c01a04efe153f.json deleted file mode 100644 index d3d6dd84cf..0000000000 --- a/backend/.sqlx/query-1252ef3a652ffb99529c2ce84928197fa15efb9c78d68e3a191c01a04efe153f.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE v2_job_status SET\n flow_status = JSONB_SET(\n JSONB_SET(flow_status, ARRAY['modules', $1::TEXT, 'flow_jobs_success', $3::TEXT], $4),\n ARRAY['modules', $1::TEXT, 'iterator', 'index'],\n ((flow_status->'modules'->$1::int->'iterator'->>'index')::int + 1)::text::jsonb\n )\n WHERE id = $2\n RETURNING (flow_status->'modules'->$1::int->'iterator'->>'index')::int", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "int4", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [ - "Int4", - "Uuid", - "Text", - "Jsonb" - ] - }, - "nullable": [ - null - ] - }, - "hash": "1252ef3a652ffb99529c2ce84928197fa15efb9c78d68e3a191c01a04efe153f" -} diff --git a/backend/.sqlx/query-173fbfd3ca2344fd08f73af75524c917d27fdb6273a35a563292b1f0701dc6ed.json b/backend/.sqlx/query-173fbfd3ca2344fd08f73af75524c917d27fdb6273a35a563292b1f0701dc6ed.json deleted file mode 100644 index 214bf50c6e..0000000000 --- a/backend/.sqlx/query-173fbfd3ca2344fd08f73af75524c917d27fdb6273a35a563292b1f0701dc6ed.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE v2_job_status SET\n flow_status = JSONB_SET(\n JSONB_SET(flow_status, ARRAY['failure_module'], $1),\n ARRAY['step'],\n $2\n )\n WHERE id = $3", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Jsonb", - "Jsonb", - "Uuid" - ] - }, - "nullable": [] - }, - "hash": "173fbfd3ca2344fd08f73af75524c917d27fdb6273a35a563292b1f0701dc6ed" -} diff --git a/backend/.sqlx/query-17851a0710b80ffd6bebe42012a354665dff01554549ea7bbbb9953c68231296.json b/backend/.sqlx/query-17851a0710b80ffd6bebe42012a354665dff01554549ea7bbbb9953c68231296.json deleted file mode 100644 index eefc009b5e..0000000000 --- a/backend/.sqlx/query-17851a0710b80ffd6bebe42012a354665dff01554549ea7bbbb9953c68231296.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE v2_job_status SET\n flow_status = JSONB_SET(\n flow_status,\n ARRAY['modules', $1::TEXT, 'iterator', 'index'],\n ((flow_status->'modules'->$1::int->'iterator'->>'index')::int + 1)::text::jsonb\n )\n WHERE id = $2\n RETURNING (flow_status->'modules'->$1::int->'iterator'->>'index')::int", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "int4", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [ - "Int4", - "Uuid" - ] - }, - "nullable": [ - null - ] - }, - "hash": "17851a0710b80ffd6bebe42012a354665dff01554549ea7bbbb9953c68231296" -} diff --git a/backend/.sqlx/query-1850552883e67da181d68ff5c4e1babaa2fe072900b57e78e461590a6dafb682.json b/backend/.sqlx/query-1850552883e67da181d68ff5c4e1babaa2fe072900b57e78e461590a6dafb682.json deleted file mode 100644 index 037e63ae49..0000000000 --- a/backend/.sqlx/query-1850552883e67da181d68ff5c4e1babaa2fe072900b57e78e461590a6dafb682.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE v2_job_status\n SET flow_status = JSONB_SET(flow_status, ARRAY['preprocessor_module'], $1)\n WHERE id = $2", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Jsonb", - "Uuid" - ] - }, - "nullable": [] - }, - "hash": "1850552883e67da181d68ff5c4e1babaa2fe072900b57e78e461590a6dafb682" -} diff --git a/backend/.sqlx/query-28b42ab9c3ce0c2f05cf385e81f3b72fa7c4b3c458d52a5891a61f9c53a49c6d.json b/backend/.sqlx/query-28b42ab9c3ce0c2f05cf385e81f3b72fa7c4b3c458d52a5891a61f9c53a49c6d.json deleted file mode 100644 index 817b993d8f..0000000000 --- a/backend/.sqlx/query-28b42ab9c3ce0c2f05cf385e81f3b72fa7c4b3c458d52a5891a61f9c53a49c6d.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE v2_job_status SET\n flow_status = JSONB_SET(\n flow_status,\n ARRAY['modules', $1::TEXT, 'branchall', 'branch'],\n ((flow_status->'modules'->$1::int->'branchall'->>'branch')::int + 1)::text::jsonb\n )\n WHERE id = $2\n RETURNING (flow_status->'modules'->$1::int->'branchall'->>'branch')::int", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "int4", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [ - "Int4", - "Uuid" - ] - }, - "nullable": [ - null - ] - }, - "hash": "28b42ab9c3ce0c2f05cf385e81f3b72fa7c4b3c458d52a5891a61f9c53a49c6d" -} diff --git a/backend/.sqlx/query-303c7e92ce23dc367d97d813415cd9aef958c15df1c0a7b02318a756cd3589e9.json b/backend/.sqlx/query-303c7e92ce23dc367d97d813415cd9aef958c15df1c0a7b02318a756cd3589e9.json deleted file mode 100644 index 58cfc98b09..0000000000 --- a/backend/.sqlx/query-303c7e92ce23dc367d97d813415cd9aef958c15df1c0a7b02318a756cd3589e9.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "WITH job_result AS (\n SELECT result \n FROM v2_job_completed \n WHERE id = $1\n )\n UPDATE v2_job \n SET args = COALESCE(\n CASE \n WHEN job_result.result IS NULL THEN NULL\n WHEN jsonb_typeof(job_result.result) = 'object' \n THEN job_result.result\n WHEN jsonb_typeof(job_result.result) = 'null'\n THEN NULL\n ELSE jsonb_build_object('value', job_result.result)\n END, \n '{}'::jsonb\n ),\n preprocessed = TRUE\n FROM job_result\n WHERE v2_job.id = $2;\n ", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Uuid", - "Uuid" - ] - }, - "nullable": [] - }, - "hash": "303c7e92ce23dc367d97d813415cd9aef958c15df1c0a7b02318a756cd3589e9" -} diff --git a/backend/.sqlx/query-3325f8ed245b1bce27c3d9f5e62ffc14b5c8aabf5ab53384f5f2b20eafd66cb3.json b/backend/.sqlx/query-3325f8ed245b1bce27c3d9f5e62ffc14b5c8aabf5ab53384f5f2b20eafd66cb3.json new file mode 100644 index 0000000000..6c02ca51d6 --- /dev/null +++ b/backend/.sqlx/query-3325f8ed245b1bce27c3d9f5e62ffc14b5c8aabf5ab53384f5f2b20eafd66cb3.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE v2_job_status\n SET flow_status = JSONB_SET(flow_status, ARRAY['retry'], $1)\n WHERE id = $2", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Jsonb", + "Uuid" + ] + }, + "nullable": [] + }, + "hash": "3325f8ed245b1bce27c3d9f5e62ffc14b5c8aabf5ab53384f5f2b20eafd66cb3" +} diff --git a/backend/.sqlx/query-ec1f31fd7628ea2e30995a0de1d8665831ee3e4ec3815e9ad90e886ffecba0f1.json b/backend/.sqlx/query-38b3945c04ae58aace881ed4d6aa4da72e61eeb8e081d2e3d1ab99a4fe450350.json similarity index 68% rename from backend/.sqlx/query-ec1f31fd7628ea2e30995a0de1d8665831ee3e4ec3815e9ad90e886ffecba0f1.json rename to backend/.sqlx/query-38b3945c04ae58aace881ed4d6aa4da72e61eeb8e081d2e3d1ab99a4fe450350.json index b5629e0425..f4ed338505 100644 --- a/backend/.sqlx/query-ec1f31fd7628ea2e30995a0de1d8665831ee3e4ec3815e9ad90e886ffecba0f1.json +++ b/backend/.sqlx/query-38b3945c04ae58aace881ed4d6aa4da72e61eeb8e081d2e3d1ab99a4fe450350.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "UPDATE v2_job_runtime SET ping = NULL\n WHERE id = $1", + "query": "UPDATE v2_job_runtime SET ping = NULL\n WHERE id = $1", "describe": { "columns": [], "parameters": { @@ -10,5 +10,5 @@ }, "nullable": [] }, - "hash": "ec1f31fd7628ea2e30995a0de1d8665831ee3e4ec3815e9ad90e886ffecba0f1" + "hash": "38b3945c04ae58aace881ed4d6aa4da72e61eeb8e081d2e3d1ab99a4fe450350" } diff --git a/backend/.sqlx/query-3af32856235690827a8700bb2396f3ab44afe0d1a7c261a626d93fb44c00bdb7.json b/backend/.sqlx/query-3af32856235690827a8700bb2396f3ab44afe0d1a7c261a626d93fb44c00bdb7.json new file mode 100644 index 0000000000..73d2bc7c6a --- /dev/null +++ b/backend/.sqlx/query-3af32856235690827a8700bb2396f3ab44afe0d1a7c261a626d93fb44c00bdb7.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE v2_job_status\n SET flow_status = flow_status - 'approval_conditions'\n WHERE id = $1", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Uuid" + ] + }, + "nullable": [] + }, + "hash": "3af32856235690827a8700bb2396f3ab44afe0d1a7c261a626d93fb44c00bdb7" +} diff --git a/backend/.sqlx/query-3d58b5861c62f0b092b6b95c17ba1dac2cbcf00db116624bd2fe27a4d0dfb436.json b/backend/.sqlx/query-3d58b5861c62f0b092b6b95c17ba1dac2cbcf00db116624bd2fe27a4d0dfb436.json deleted file mode 100644 index 4f1fe255f9..0000000000 --- a/backend/.sqlx/query-3d58b5861c62f0b092b6b95c17ba1dac2cbcf00db116624bd2fe27a4d0dfb436.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE v2_job_status\n SET flow_status = JSONB_SET(flow_status, ARRAY['approval_conditions'], $1)\n WHERE id = $2", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Jsonb", - "Uuid" - ] - }, - "nullable": [] - }, - "hash": "3d58b5861c62f0b092b6b95c17ba1dac2cbcf00db116624bd2fe27a4d0dfb436" -} diff --git a/backend/.sqlx/query-3e0cdd500dffc3bd1d8374ca3cc8fd60ce778c2fece27637d9985d4650778653.json b/backend/.sqlx/query-3e0cdd500dffc3bd1d8374ca3cc8fd60ce778c2fece27637d9985d4650778653.json deleted file mode 100644 index 9f5cb1d19d..0000000000 --- a/backend/.sqlx/query-3e0cdd500dffc3bd1d8374ca3cc8fd60ce778c2fece27637d9985d4650778653.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE v2_job_status\n SET flow_status = JSONB_SET(flow_status, ARRAY['cleanup_module', 'flow_jobs_to_clean'], COALESCE(flow_status->'cleanup_module'->'flow_jobs_to_clean', '[]'::jsonb) || $1)\n WHERE id = $2", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Jsonb", - "Uuid" - ] - }, - "nullable": [] - }, - "hash": "3e0cdd500dffc3bd1d8374ca3cc8fd60ce778c2fece27637d9985d4650778653" -} diff --git a/backend/.sqlx/query-429aef2c320a152b16fe20c1ab84aab41142897db108dc8cbc2c51abb2e30c7c.json b/backend/.sqlx/query-429aef2c320a152b16fe20c1ab84aab41142897db108dc8cbc2c51abb2e30c7c.json deleted file mode 100644 index c40a18e4c9..0000000000 --- a/backend/.sqlx/query-429aef2c320a152b16fe20c1ab84aab41142897db108dc8cbc2c51abb2e30c7c.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE v2_job_status\n SET flow_status = JSONB_SET(flow_status, ARRAY['modules', $1::TEXT], $2)\n WHERE id = $3", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Jsonb", - "Uuid" - ] - }, - "nullable": [] - }, - "hash": "429aef2c320a152b16fe20c1ab84aab41142897db108dc8cbc2c51abb2e30c7c" -} diff --git a/backend/.sqlx/query-4622d28e2fa09bc60b9d0c79397efe0ca030638ded82c2ffd2155cacdf36ec11.json b/backend/.sqlx/query-4622d28e2fa09bc60b9d0c79397efe0ca030638ded82c2ffd2155cacdf36ec11.json new file mode 100644 index 0000000000..f30ab8d49d --- /dev/null +++ b/backend/.sqlx/query-4622d28e2fa09bc60b9d0c79397efe0ca030638ded82c2ffd2155cacdf36ec11.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE v2_job_status\n SET flow_status = JSONB_SET(flow_status, ARRAY['step'], $1)\n WHERE id = $2", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Jsonb", + "Uuid" + ] + }, + "nullable": [] + }, + "hash": "4622d28e2fa09bc60b9d0c79397efe0ca030638ded82c2ffd2155cacdf36ec11" +} diff --git a/backend/.sqlx/query-4c9cf8c3176abc2b8b9a1c3f671949e16830671a458d5a73762cd8545d26172d.json b/backend/.sqlx/query-4c9cf8c3176abc2b8b9a1c3f671949e16830671a458d5a73762cd8545d26172d.json deleted file mode 100644 index 0d108538dc..0000000000 --- a/backend/.sqlx/query-4c9cf8c3176abc2b8b9a1c3f671949e16830671a458d5a73762cd8545d26172d.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE v2_job_status SET\n flow_status = JSONB_SET(\n JSONB_SET(flow_status, ARRAY['modules', $1::TEXT], $2),\n ARRAY['step'],\n $3\n )\n WHERE id = $4", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Jsonb", - "Jsonb", - "Uuid" - ] - }, - "nullable": [] - }, - "hash": "4c9cf8c3176abc2b8b9a1c3f671949e16830671a458d5a73762cd8545d26172d" -} diff --git a/backend/.sqlx/query-525a9ef57c7d9fac86cb1bf47868fa6fb782e9d589852e51530cdd1a38322a9d.json b/backend/.sqlx/query-525a9ef57c7d9fac86cb1bf47868fa6fb782e9d589852e51530cdd1a38322a9d.json new file mode 100644 index 0000000000..73c1a95797 --- /dev/null +++ b/backend/.sqlx/query-525a9ef57c7d9fac86cb1bf47868fa6fb782e9d589852e51530cdd1a38322a9d.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE v2_job_status\n SET flow_status = JSONB_SET(flow_status, ARRAY['preprocessor_module'], $1)\n WHERE id = $2", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Jsonb", + "Uuid" + ] + }, + "nullable": [] + }, + "hash": "525a9ef57c7d9fac86cb1bf47868fa6fb782e9d589852e51530cdd1a38322a9d" +} diff --git a/backend/.sqlx/query-52ad0c838d19cbd9e90b8368abe71dd12655179f41f43896e7d30fdfb3ae5939.json b/backend/.sqlx/query-52ad0c838d19cbd9e90b8368abe71dd12655179f41f43896e7d30fdfb3ae5939.json new file mode 100644 index 0000000000..1fbc39ba44 --- /dev/null +++ b/backend/.sqlx/query-52ad0c838d19cbd9e90b8368abe71dd12655179f41f43896e7d30fdfb3ae5939.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "WITH job_result AS (\n SELECT result \n FROM v2_job_completed \n WHERE id = $1\n )\n UPDATE v2_job \n SET args = COALESCE(\n CASE \n WHEN job_result.result IS NULL THEN NULL\n WHEN jsonb_typeof(job_result.result) = 'object' \n THEN job_result.result\n WHEN jsonb_typeof(job_result.result) = 'null'\n THEN NULL\n ELSE jsonb_build_object('value', job_result.result)\n END, \n '{}'::jsonb\n ),\n preprocessed = TRUE\n FROM job_result\n WHERE v2_job.id = $2;\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Uuid", + "Uuid" + ] + }, + "nullable": [] + }, + "hash": "52ad0c838d19cbd9e90b8368abe71dd12655179f41f43896e7d30fdfb3ae5939" +} diff --git a/backend/.sqlx/query-553108ba3c0b8d579800bc8b5a4f887d79fb4c13b60b19c4913a8db18521958c.json b/backend/.sqlx/query-553108ba3c0b8d579800bc8b5a4f887d79fb4c13b60b19c4913a8db18521958c.json new file mode 100644 index 0000000000..e3d2e205f1 --- /dev/null +++ b/backend/.sqlx/query-553108ba3c0b8d579800bc8b5a4f887d79fb4c13b60b19c4913a8db18521958c.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE v2_job_queue q SET suspend = 0\n FROM v2_job j, v2_job_status f\n WHERE parent_job = $1\n AND f.id = j.id AND q.id = j.id\n AND suspend = $2 AND (f.flow_status->'step')::int = 0", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Uuid", + "Int4" + ] + }, + "nullable": [] + }, + "hash": "553108ba3c0b8d579800bc8b5a4f887d79fb4c13b60b19c4913a8db18521958c" +} diff --git a/backend/.sqlx/query-5a4fa8ff2148d92946e6ac95f70585d082435e0e79a09821a2045e3b550c3276.json b/backend/.sqlx/query-5a4fa8ff2148d92946e6ac95f70585d082435e0e79a09821a2045e3b550c3276.json new file mode 100644 index 0000000000..bec0922efc --- /dev/null +++ b/backend/.sqlx/query-5a4fa8ff2148d92946e6ac95f70585d082435e0e79a09821a2045e3b550c3276.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE v2_job_status SET\n flow_status = JSONB_SET(\n JSONB_SET(flow_status, ARRAY['preprocessor_module'], $1),\n ARRAY['step'],\n $2\n )\n WHERE id = $3", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Jsonb", + "Jsonb", + "Uuid" + ] + }, + "nullable": [] + }, + "hash": "5a4fa8ff2148d92946e6ac95f70585d082435e0e79a09821a2045e3b550c3276" +} diff --git a/backend/.sqlx/query-6513c1433dbfe03f7c778963a05d964fda13a1091a8206ee174ed3a161248126.json b/backend/.sqlx/query-6513c1433dbfe03f7c778963a05d964fda13a1091a8206ee174ed3a161248126.json deleted file mode 100644 index e50d2f1154..0000000000 --- a/backend/.sqlx/query-6513c1433dbfe03f7c778963a05d964fda13a1091a8206ee174ed3a161248126.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT id\n FROM v2_job j JOIN v2_job_queue USING (id)\n WHERE j.workspace_id = $2 AND trigger_kind = 'schedule' AND trigger = $1 AND runnable_path = $4\n AND parent_job IS NULL\n AND j.id != $3\n AND running = true", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Uuid" - } - ], - "parameters": { - "Left": [ - "Text", - "Text", - "Uuid", - "Text" - ] - }, - "nullable": [ - false - ] - }, - "hash": "6513c1433dbfe03f7c778963a05d964fda13a1091a8206ee174ed3a161248126" -} diff --git a/backend/.sqlx/query-6664be80f0d72ea7b8b184c5348063db3bbfea67f4a056d6e3be1fc4255cfc06.json b/backend/.sqlx/query-6664be80f0d72ea7b8b184c5348063db3bbfea67f4a056d6e3be1fc4255cfc06.json deleted file mode 100644 index 0e7ae566fd..0000000000 --- a/backend/.sqlx/query-6664be80f0d72ea7b8b184c5348063db3bbfea67f4a056d6e3be1fc4255cfc06.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE v2_job_status\n SET flow_leaf_jobs = JSONB_SET(coalesce(flow_leaf_jobs, '{}'::jsonb), ARRAY[$1::TEXT], $2)\n WHERE COALESCE((SELECT flow_innermost_root_job FROM v2_job WHERE id = $3), $3) = id", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Jsonb", - "Uuid" - ] - }, - "nullable": [] - }, - "hash": "6664be80f0d72ea7b8b184c5348063db3bbfea67f4a056d6e3be1fc4255cfc06" -} diff --git a/backend/.sqlx/query-69db5305aadd911b06ecdc4eeb9610c0e233bca35edebe2ad1772a4a1a1d5bbe.json b/backend/.sqlx/query-69db5305aadd911b06ecdc4eeb9610c0e233bca35edebe2ad1772a4a1a1d5bbe.json new file mode 100644 index 0000000000..ec22d86a79 --- /dev/null +++ b/backend/.sqlx/query-69db5305aadd911b06ecdc4eeb9610c0e233bca35edebe2ad1772a4a1a1d5bbe.json @@ -0,0 +1,23 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE v2_job_status SET\n flow_status = JSONB_SET(\n flow_status,\n ARRAY['modules', $1::TEXT, 'branchall', 'branch'],\n ((flow_status->'modules'->$1::int->'branchall'->>'branch')::int + 1)::text::jsonb\n )\n WHERE id = $2\n RETURNING (flow_status->'modules'->$1::int->'branchall'->>'branch')::int", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "int4", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Int4", + "Uuid" + ] + }, + "nullable": [ + null + ] + }, + "hash": "69db5305aadd911b06ecdc4eeb9610c0e233bca35edebe2ad1772a4a1a1d5bbe" +} diff --git a/backend/.sqlx/query-69ff806066a24c60188d7547a7776c160ee65eaa01b259c996f3f96ed44fcaaf.json b/backend/.sqlx/query-69ff806066a24c60188d7547a7776c160ee65eaa01b259c996f3f96ed44fcaaf.json deleted file mode 100644 index 75ef2996a0..0000000000 --- a/backend/.sqlx/query-69ff806066a24c60188d7547a7776c160ee65eaa01b259c996f3f96ed44fcaaf.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE v2_job_status\n SET flow_status = JSONB_SET(flow_status, ARRAY['step'], $1)\n WHERE id = $2", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Jsonb", - "Uuid" - ] - }, - "nullable": [] - }, - "hash": "69ff806066a24c60188d7547a7776c160ee65eaa01b259c996f3f96ed44fcaaf" -} diff --git a/backend/.sqlx/query-1b58b90c184ca21d777ea4e264c79aecc2361134a4817c2b9580f2680425352d.json b/backend/.sqlx/query-6b0347da54d1b8646ece08a5ce78ed7e7c98780fef56f6ea6e1e1fd0458ae32f.json similarity index 71% rename from backend/.sqlx/query-1b58b90c184ca21d777ea4e264c79aecc2361134a4817c2b9580f2680425352d.json rename to backend/.sqlx/query-6b0347da54d1b8646ece08a5ce78ed7e7c98780fef56f6ea6e1e1fd0458ae32f.json index d0b582d17b..8259c07cd0 100644 --- a/backend/.sqlx/query-1b58b90c184ca21d777ea4e264c79aecc2361134a4817c2b9580f2680425352d.json +++ b/backend/.sqlx/query-6b0347da54d1b8646ece08a5ce78ed7e7c98780fef56f6ea6e1e1fd0458ae32f.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT args AS \"args: Json>>\"\n FROM v2_job WHERE id = $1 AND workspace_id = $2", + "query": "SELECT args AS \"args: Json>>\"\n FROM v2_job WHERE id = $1 AND workspace_id = $2", "describe": { "columns": [ { @@ -19,5 +19,5 @@ true ] }, - "hash": "1b58b90c184ca21d777ea4e264c79aecc2361134a4817c2b9580f2680425352d" + "hash": "6b0347da54d1b8646ece08a5ce78ed7e7c98780fef56f6ea6e1e1fd0458ae32f" } diff --git a/backend/.sqlx/query-7470e7067b948509d14828c24a8725da747e6b967554eb7e088ee3a018ec1f8b.json b/backend/.sqlx/query-7470e7067b948509d14828c24a8725da747e6b967554eb7e088ee3a018ec1f8b.json new file mode 100644 index 0000000000..a6979f19db --- /dev/null +++ b/backend/.sqlx/query-7470e7067b948509d14828c24a8725da747e6b967554eb7e088ee3a018ec1f8b.json @@ -0,0 +1,25 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT id\n FROM v2_job j JOIN v2_job_queue USING (id)\n WHERE j.workspace_id = $2 AND trigger_kind = 'schedule' AND trigger = $1 AND runnable_path = $4\n AND parent_job IS NULL\n AND j.id != $3\n AND running = true", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Uuid" + } + ], + "parameters": { + "Left": [ + "Text", + "Text", + "Uuid", + "Text" + ] + }, + "nullable": [ + false + ] + }, + "hash": "7470e7067b948509d14828c24a8725da747e6b967554eb7e088ee3a018ec1f8b" +} diff --git a/backend/.sqlx/query-7b084617bf2de5ed9a657d2bd2cbc9de1246427bf0302c032f8bd26ff93313f7.json b/backend/.sqlx/query-7b084617bf2de5ed9a657d2bd2cbc9de1246427bf0302c032f8bd26ff93313f7.json deleted file mode 100644 index 3f72b7b760..0000000000 --- a/backend/.sqlx/query-7b084617bf2de5ed9a657d2bd2cbc9de1246427bf0302c032f8bd26ff93313f7.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE v2_job_status\n SET flow_status = JSONB_SET(flow_status, ARRAY['failure_module'], $1)\n WHERE id = $2", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Jsonb", - "Uuid" - ] - }, - "nullable": [] - }, - "hash": "7b084617bf2de5ed9a657d2bd2cbc9de1246427bf0302c032f8bd26ff93313f7" -} diff --git a/backend/.sqlx/query-7bd7505b008954aae6152554c1f9bb0611d0ec451b48aa1a4de309dadeb53315.json b/backend/.sqlx/query-7bd7505b008954aae6152554c1f9bb0611d0ec451b48aa1a4de309dadeb53315.json deleted file mode 100644 index c7f3146594..0000000000 --- a/backend/.sqlx/query-7bd7505b008954aae6152554c1f9bb0611d0ec451b48aa1a4de309dadeb53315.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE v2_job_status\n SET flow_status = flow_status - 'approval_conditions'\n WHERE id = $1", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Uuid" - ] - }, - "nullable": [] - }, - "hash": "7bd7505b008954aae6152554c1f9bb0611d0ec451b48aa1a4de309dadeb53315" -} diff --git a/backend/.sqlx/query-d988e91087695742d75946100cf2b7593cb8eed2a97411697819849958c022b3.json b/backend/.sqlx/query-8780a8cd6781f86041ae8df58477913c01b5d8d27dd4251f0cabbe3e974c0b0a.json similarity index 70% rename from backend/.sqlx/query-d988e91087695742d75946100cf2b7593cb8eed2a97411697819849958c022b3.json rename to backend/.sqlx/query-8780a8cd6781f86041ae8df58477913c01b5d8d27dd4251f0cabbe3e974c0b0a.json index 15625b26c2..2e19aa5a0e 100644 --- a/backend/.sqlx/query-d988e91087695742d75946100cf2b7593cb8eed2a97411697819849958c022b3.json +++ b/backend/.sqlx/query-8780a8cd6781f86041ae8df58477913c01b5d8d27dd4251f0cabbe3e974c0b0a.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT result AS \"result!: Json>\"\n FROM v2_job_completed WHERE id = $1 AND workspace_id = $2", + "query": "SELECT result AS \"result!: Json>\"\n FROM v2_job_completed WHERE id = $1 AND workspace_id = $2", "describe": { "columns": [ { @@ -19,5 +19,5 @@ true ] }, - "hash": "d988e91087695742d75946100cf2b7593cb8eed2a97411697819849958c022b3" + "hash": "8780a8cd6781f86041ae8df58477913c01b5d8d27dd4251f0cabbe3e974c0b0a" } diff --git a/backend/.sqlx/query-8be1ddb20ffd8c375b7d1ecb14bdb3a7c2f0c8f9308946b9262e14b8c584dd99.json b/backend/.sqlx/query-8be1ddb20ffd8c375b7d1ecb14bdb3a7c2f0c8f9308946b9262e14b8c584dd99.json deleted file mode 100644 index 60ca066b36..0000000000 --- a/backend/.sqlx/query-8be1ddb20ffd8c375b7d1ecb14bdb3a7c2f0c8f9308946b9262e14b8c584dd99.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE v2_job_status\n SET flow_status = flow_status - 'retry'\n WHERE id = $1", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Uuid" - ] - }, - "nullable": [] - }, - "hash": "8be1ddb20ffd8c375b7d1ecb14bdb3a7c2f0c8f9308946b9262e14b8c584dd99" -} diff --git a/backend/.sqlx/query-8cb755510f2cfb23bdd0d1cf66b69949549a44855529f77a530f681a6e714646.json b/backend/.sqlx/query-8cb755510f2cfb23bdd0d1cf66b69949549a44855529f77a530f681a6e714646.json deleted file mode 100644 index 82b70ebe92..0000000000 --- a/backend/.sqlx/query-8cb755510f2cfb23bdd0d1cf66b69949549a44855529f77a530f681a6e714646.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE v2_job_status SET\n flow_status = JSONB_SET(\n flow_status,\n ARRAY['modules', $1::TEXT, 'flow_jobs_success', $3::TEXT],\n $4\n )\n WHERE id = $2", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Uuid", - "Text", - "Jsonb" - ] - }, - "nullable": [] - }, - "hash": "8cb755510f2cfb23bdd0d1cf66b69949549a44855529f77a530f681a6e714646" -} diff --git a/backend/.sqlx/query-8f3ed45a0290cd9989f40f34775de5e8c3762597e6f55f8b9575a54ccc31e085.json b/backend/.sqlx/query-8f3ed45a0290cd9989f40f34775de5e8c3762597e6f55f8b9575a54ccc31e085.json deleted file mode 100644 index 4fd9cd8a4f..0000000000 --- a/backend/.sqlx/query-8f3ed45a0290cd9989f40f34775de5e8c3762597e6f55f8b9575a54ccc31e085.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE v2_job_status SET\n flow_status = JSONB_SET(\n JSONB_SET(flow_status, ARRAY['modules', $1::TEXT, 'flow_jobs_success', $3::TEXT], $4),\n ARRAY['modules', $1::TEXT, 'branchall', 'branch'],\n ((flow_status->'modules'->$1::int->'branchall'->>'branch')::int + 1)::text::jsonb\n )\n WHERE id = $2\n RETURNING (flow_status->'modules'->$1::int->'branchall'->>'branch')::int", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "int4", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [ - "Int4", - "Uuid", - "Text", - "Jsonb" - ] - }, - "nullable": [ - null - ] - }, - "hash": "8f3ed45a0290cd9989f40f34775de5e8c3762597e6f55f8b9575a54ccc31e085" -} diff --git a/backend/.sqlx/query-8fcf755b4a57ed4ebf10a57c0c82589075c240b16d872576a048349b56f468e5.json b/backend/.sqlx/query-8fcf755b4a57ed4ebf10a57c0c82589075c240b16d872576a048349b56f468e5.json new file mode 100644 index 0000000000..49153b05aa --- /dev/null +++ b/backend/.sqlx/query-8fcf755b4a57ed4ebf10a57c0c82589075c240b16d872576a048349b56f468e5.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE v2_job_queue SET\n suspend = $1,\n suspend_until = now() + interval '14 day',\n running = true\n WHERE id = $2", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4", + "Uuid" + ] + }, + "nullable": [] + }, + "hash": "8fcf755b4a57ed4ebf10a57c0c82589075c240b16d872576a048349b56f468e5" +} diff --git a/backend/.sqlx/query-fdedd3909a97db5d43d9c46ff77b800b8efd647121b538deb023f96dbaac3715.json b/backend/.sqlx/query-903cf23d6b620388c645d5b8ac7d106bb6eea8af03e350d4ba19a4aba2cb9625.json similarity index 72% rename from backend/.sqlx/query-fdedd3909a97db5d43d9c46ff77b800b8efd647121b538deb023f96dbaac3715.json rename to backend/.sqlx/query-903cf23d6b620388c645d5b8ac7d106bb6eea8af03e350d4ba19a4aba2cb9625.json index 905707255f..abef34ebc0 100644 --- a/backend/.sqlx/query-fdedd3909a97db5d43d9c46ff77b800b8efd647121b538deb023f96dbaac3715.json +++ b/backend/.sqlx/query-903cf23d6b620388c645d5b8ac7d106bb6eea8af03e350d4ba19a4aba2cb9625.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT args AS \"args: Json>>\"\n FROM v2_job WHERE id = $1", + "query": "SELECT args AS \"args: Json>>\"\n FROM v2_job WHERE id = $1", "describe": { "columns": [ { @@ -18,5 +18,5 @@ true ] }, - "hash": "fdedd3909a97db5d43d9c46ff77b800b8efd647121b538deb023f96dbaac3715" + "hash": "903cf23d6b620388c645d5b8ac7d106bb6eea8af03e350d4ba19a4aba2cb9625" } diff --git a/backend/.sqlx/query-90635149190c59396ca557bf1670554a1e40d0ce9cc686ad09adca0904324cd8.json b/backend/.sqlx/query-90635149190c59396ca557bf1670554a1e40d0ce9cc686ad09adca0904324cd8.json deleted file mode 100644 index 9dce5f08b4..0000000000 --- a/backend/.sqlx/query-90635149190c59396ca557bf1670554a1e40d0ce9cc686ad09adca0904324cd8.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE v2_job_queue q SET suspend = 0\n FROM v2_job j, v2_job_status f\n WHERE parent_job = $1\n AND f.id = j.id AND q.id = j.id\n AND suspend = $2 AND (f.flow_status->'step')::int = 0", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Uuid", - "Int4" - ] - }, - "nullable": [] - }, - "hash": "90635149190c59396ca557bf1670554a1e40d0ce9cc686ad09adca0904324cd8" -} diff --git a/backend/.sqlx/query-c50b6a4a6739d6df087a3b37c209e5f4b72fc27578d988155b74b05ec5df30b9.json b/backend/.sqlx/query-92c7c961198e506426bf3f97a8ddbb34af450041c675b30b708fed3ef9e01d2d.json similarity index 73% rename from backend/.sqlx/query-c50b6a4a6739d6df087a3b37c209e5f4b72fc27578d988155b74b05ec5df30b9.json rename to backend/.sqlx/query-92c7c961198e506426bf3f97a8ddbb34af450041c675b30b708fed3ef9e01d2d.json index eef812552b..fcb9657c8a 100644 --- a/backend/.sqlx/query-c50b6a4a6739d6df087a3b37c209e5f4b72fc27578d988155b74b05ec5df30b9.json +++ b/backend/.sqlx/query-92c7c961198e506426bf3f97a8ddbb34af450041c675b30b708fed3ef9e01d2d.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT\n kind AS \"job_kind!: JobKind\",\n runnable_id AS \"script_hash: ScriptHash\",\n flow_status AS \"flow_status!: Json>\",\n raw_flow AS \"raw_flow: Json>\"\n FROM v2_job INNER JOIN v2_job_status ON v2_job.id = v2_job_status.id WHERE v2_job.id = $1 AND v2_job.workspace_id = $2 LIMIT 1", + "query": "SELECT\n kind AS \"job_kind!: JobKind\",\n runnable_id AS \"script_hash: ScriptHash\",\n flow_status AS \"flow_status!: Json>\",\n raw_flow AS \"raw_flow: Json>\"\n FROM v2_job INNER JOIN v2_job_status ON v2_job.id = v2_job_status.id WHERE v2_job.id = $1 AND v2_job.workspace_id = $2 LIMIT 1", "describe": { "columns": [ { @@ -63,5 +63,5 @@ true ] }, - "hash": "c50b6a4a6739d6df087a3b37c209e5f4b72fc27578d988155b74b05ec5df30b9" + "hash": "92c7c961198e506426bf3f97a8ddbb34af450041c675b30b708fed3ef9e01d2d" } diff --git a/backend/.sqlx/query-94f11d70062eebce384fe0fde527f3d6cebca1aa84a6f792c2a962b798f8da22.json b/backend/.sqlx/query-94f11d70062eebce384fe0fde527f3d6cebca1aa84a6f792c2a962b798f8da22.json new file mode 100644 index 0000000000..79d7fdcf4d --- /dev/null +++ b/backend/.sqlx/query-94f11d70062eebce384fe0fde527f3d6cebca1aa84a6f792c2a962b798f8da22.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE v2_job_status\n SET flow_status = JSONB_SET(flow_status, ARRAY['failure_module'], $1)\n WHERE id = $2", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Jsonb", + "Uuid" + ] + }, + "nullable": [] + }, + "hash": "94f11d70062eebce384fe0fde527f3d6cebca1aa84a6f792c2a962b798f8da22" +} diff --git a/backend/.sqlx/query-96c0e34708bbba29db162e7289a942addd4581dddc88663b6c2cbae87ec205fc.json b/backend/.sqlx/query-96c0e34708bbba29db162e7289a942addd4581dddc88663b6c2cbae87ec205fc.json new file mode 100644 index 0000000000..0f6659264a --- /dev/null +++ b/backend/.sqlx/query-96c0e34708bbba29db162e7289a942addd4581dddc88663b6c2cbae87ec205fc.json @@ -0,0 +1,25 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE v2_job_status SET\n flow_status = JSONB_SET(\n JSONB_SET(flow_status, ARRAY['modules', $1::TEXT, 'flow_jobs_success', $3::TEXT], $4),\n ARRAY['modules', $1::TEXT, 'branchall', 'branch'],\n ((flow_status->'modules'->$1::int->'branchall'->>'branch')::int + 1)::text::jsonb\n )\n WHERE id = $2\n RETURNING (flow_status->'modules'->$1::int->'branchall'->>'branch')::int", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "int4", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Int4", + "Uuid", + "Text", + "Jsonb" + ] + }, + "nullable": [ + null + ] + }, + "hash": "96c0e34708bbba29db162e7289a942addd4581dddc88663b6c2cbae87ec205fc" +} diff --git a/backend/.sqlx/query-a10ec229d7ed89f563b6b33e70e8ede5135a849e7b9108c37bfd90990a4be780.json b/backend/.sqlx/query-a10ec229d7ed89f563b6b33e70e8ede5135a849e7b9108c37bfd90990a4be780.json new file mode 100644 index 0000000000..9c49c0794c --- /dev/null +++ b/backend/.sqlx/query-a10ec229d7ed89f563b6b33e70e8ede5135a849e7b9108c37bfd90990a4be780.json @@ -0,0 +1,23 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE v2_job_status SET\n flow_status = JSONB_SET(\n flow_status,\n ARRAY['modules', $1::TEXT, 'iterator', 'index'],\n ((flow_status->'modules'->$1::int->'iterator'->>'index')::int + 1)::text::jsonb\n )\n WHERE id = $2\n RETURNING (flow_status->'modules'->$1::int->'iterator'->>'index')::int", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "int4", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Int4", + "Uuid" + ] + }, + "nullable": [ + null + ] + }, + "hash": "a10ec229d7ed89f563b6b33e70e8ede5135a849e7b9108c37bfd90990a4be780" +} diff --git a/backend/.sqlx/query-30216cf02e972f961b7cc6054050fdc984be118df1ad68f7263c84e058bb1266.json b/backend/.sqlx/query-a3debece1a4171881431640f6af264d402d32e2b6ce925d1ebf1f60f3b688207.json similarity index 51% rename from backend/.sqlx/query-30216cf02e972f961b7cc6054050fdc984be118df1ad68f7263c84e058bb1266.json rename to backend/.sqlx/query-a3debece1a4171881431640f6af264d402d32e2b6ce925d1ebf1f60f3b688207.json index 3603ed5c5b..9448456dbb 100644 --- a/backend/.sqlx/query-30216cf02e972f961b7cc6054050fdc984be118df1ad68f7263c84e058bb1266.json +++ b/backend/.sqlx/query-a3debece1a4171881431640f6af264d402d32e2b6ce925d1ebf1f60f3b688207.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "UPDATE v2_job_status\n SET flow_status = JSONB_SET(flow_status, ARRAY['modules', $1::TEXT], $2)\n WHERE id = $3\n RETURNING flow_status AS \"flow_status: Json>\"", + "query": "UPDATE v2_job_status\n SET flow_status = JSONB_SET(flow_status, ARRAY['modules', $1::TEXT], $2)\n WHERE id = $3\n RETURNING flow_status AS \"flow_status: Json>\"", "describe": { "columns": [ { @@ -20,5 +20,5 @@ true ] }, - "hash": "30216cf02e972f961b7cc6054050fdc984be118df1ad68f7263c84e058bb1266" + "hash": "a3debece1a4171881431640f6af264d402d32e2b6ce925d1ebf1f60f3b688207" } diff --git a/backend/.sqlx/query-a3f315fdae54e51b56b0681fab2bbff779a4a62d129916dd4c3054b45e0b654e.json b/backend/.sqlx/query-a3f315fdae54e51b56b0681fab2bbff779a4a62d129916dd4c3054b45e0b654e.json new file mode 100644 index 0000000000..dc0b37ca8c --- /dev/null +++ b/backend/.sqlx/query-a3f315fdae54e51b56b0681fab2bbff779a4a62d129916dd4c3054b45e0b654e.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE v2_job_status\n SET flow_status = JSONB_SET(flow_status, ARRAY['modules', $1::TEXT, 'approvers'], $2)\n WHERE id = $3", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Jsonb", + "Uuid" + ] + }, + "nullable": [] + }, + "hash": "a3f315fdae54e51b56b0681fab2bbff779a4a62d129916dd4c3054b45e0b654e" +} diff --git a/backend/.sqlx/query-4507c3907bf49f93f6c17956d9cf9495f4538b20ce0299acde7578386db4278c.json b/backend/.sqlx/query-aa4ecf6b7ab078544c280957ad6614c4ccd1bc9b4695ca56f56ba0899b23562f.json similarity index 66% rename from backend/.sqlx/query-4507c3907bf49f93f6c17956d9cf9495f4538b20ce0299acde7578386db4278c.json rename to backend/.sqlx/query-aa4ecf6b7ab078544c280957ad6614c4ccd1bc9b4695ca56f56ba0899b23562f.json index dc57aefcdc..c231ff2bd0 100644 --- a/backend/.sqlx/query-4507c3907bf49f93f6c17956d9cf9495f4538b20ce0299acde7578386db4278c.json +++ b/backend/.sqlx/query-aa4ecf6b7ab078544c280957ad6614c4ccd1bc9b4695ca56f56ba0899b23562f.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "INSERT INTO parallel_monitor_lock (parent_flow_id, job_id)\n VALUES ($1, $2)", + "query": "INSERT INTO parallel_monitor_lock (parent_flow_id, job_id)\n VALUES ($1, $2)", "describe": { "columns": [], "parameters": { @@ -11,5 +11,5 @@ }, "nullable": [] }, - "hash": "4507c3907bf49f93f6c17956d9cf9495f4538b20ce0299acde7578386db4278c" + "hash": "aa4ecf6b7ab078544c280957ad6614c4ccd1bc9b4695ca56f56ba0899b23562f" } diff --git a/backend/.sqlx/query-aed8bd751c3e988f422216e74acfb77dc03469355d2a0da0b2d6b4aeeea37d3e.json b/backend/.sqlx/query-aed8bd751c3e988f422216e74acfb77dc03469355d2a0da0b2d6b4aeeea37d3e.json new file mode 100644 index 0000000000..d8f93f74c4 --- /dev/null +++ b/backend/.sqlx/query-aed8bd751c3e988f422216e74acfb77dc03469355d2a0da0b2d6b4aeeea37d3e.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE v2_job_status\n SET flow_leaf_jobs = JSONB_SET(coalesce(flow_leaf_jobs, '{}'::jsonb), ARRAY[$1::TEXT], $2)\n WHERE COALESCE((SELECT flow_innermost_root_job FROM v2_job WHERE id = $3), $3) = id", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Jsonb", + "Uuid" + ] + }, + "nullable": [] + }, + "hash": "aed8bd751c3e988f422216e74acfb77dc03469355d2a0da0b2d6b4aeeea37d3e" +} diff --git a/backend/.sqlx/query-af925931f3217bbd32313678989ad1a66bbd8dacd12dea36608cc20197df358f.json b/backend/.sqlx/query-af925931f3217bbd32313678989ad1a66bbd8dacd12dea36608cc20197df358f.json deleted file mode 100644 index b90300787b..0000000000 --- a/backend/.sqlx/query-af925931f3217bbd32313678989ad1a66bbd8dacd12dea36608cc20197df358f.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE v2_job_status SET\n flow_status = JSONB_SET(\n JSONB_SET(flow_status, ARRAY['preprocessor_module'], $1),\n ARRAY['step'],\n $2\n )\n WHERE id = $3", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Jsonb", - "Jsonb", - "Uuid" - ] - }, - "nullable": [] - }, - "hash": "af925931f3217bbd32313678989ad1a66bbd8dacd12dea36608cc20197df358f" -} diff --git a/backend/.sqlx/query-b01160fe44d69834ac08bbf60feacb3e3caa02a04b084da44cdcb9103794b39e.json b/backend/.sqlx/query-b01160fe44d69834ac08bbf60feacb3e3caa02a04b084da44cdcb9103794b39e.json new file mode 100644 index 0000000000..0e87ff0632 --- /dev/null +++ b/backend/.sqlx/query-b01160fe44d69834ac08bbf60feacb3e3caa02a04b084da44cdcb9103794b39e.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE v2_job_status\n SET flow_status = JSONB_SET(flow_status, ARRAY['cleanup_module', 'flow_jobs_to_clean'], COALESCE(flow_status->'cleanup_module'->'flow_jobs_to_clean', '[]'::jsonb) || $1)\n WHERE id = $2", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Jsonb", + "Uuid" + ] + }, + "nullable": [] + }, + "hash": "b01160fe44d69834ac08bbf60feacb3e3caa02a04b084da44cdcb9103794b39e" +} diff --git a/backend/.sqlx/query-47e6b25cc092ec8718a6581c76aca10b275653e10ea4aa17a8ef5091ca09294a.json b/backend/.sqlx/query-b1c96c527c4b263b5155d689eb88894ea93f0eaba37874f828a733062af17640.json similarity index 67% rename from backend/.sqlx/query-47e6b25cc092ec8718a6581c76aca10b275653e10ea4aa17a8ef5091ca09294a.json rename to backend/.sqlx/query-b1c96c527c4b263b5155d689eb88894ea93f0eaba37874f828a733062af17640.json index 3206f22bc5..8fd4c311c5 100644 --- a/backend/.sqlx/query-47e6b25cc092ec8718a6581c76aca10b275653e10ea4aa17a8ef5091ca09294a.json +++ b/backend/.sqlx/query-b1c96c527c4b263b5155d689eb88894ea93f0eaba37874f828a733062af17640.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT result, id\n FROM v2_job_completed\n WHERE id = ANY($1) AND workspace_id = $2", + "query": "SELECT result, id\n FROM v2_job_completed\n WHERE id = ANY($1) AND workspace_id = $2", "describe": { "columns": [ { @@ -25,5 +25,5 @@ false ] }, - "hash": "47e6b25cc092ec8718a6581c76aca10b275653e10ea4aa17a8ef5091ca09294a" + "hash": "b1c96c527c4b263b5155d689eb88894ea93f0eaba37874f828a733062af17640" } diff --git a/backend/.sqlx/query-597b148ff09a1e0f369bb04781ee4e429ebce64a4d5c16b0f136142ad213cdb1.json b/backend/.sqlx/query-b41fa341e65ee348f468ed04ac1160770b19c0a00cd333abc48b29c54f863149.json similarity index 52% rename from backend/.sqlx/query-597b148ff09a1e0f369bb04781ee4e429ebce64a4d5c16b0f136142ad213cdb1.json rename to backend/.sqlx/query-b41fa341e65ee348f468ed04ac1160770b19c0a00cd333abc48b29c54f863149.json index 4a704e58d8..f37bea0531 100644 --- a/backend/.sqlx/query-597b148ff09a1e0f369bb04781ee4e429ebce64a4d5c16b0f136142ad213cdb1.json +++ b/backend/.sqlx/query-b41fa341e65ee348f468ed04ac1160770b19c0a00cd333abc48b29c54f863149.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT\n args AS \"args: Json>>\"\n FROM v2_job\n WHERE id = $1", + "query": "SELECT\n args AS \"args: Json>>\"\n FROM v2_job\n WHERE id = $1", "describe": { "columns": [ { @@ -18,5 +18,5 @@ true ] }, - "hash": "597b148ff09a1e0f369bb04781ee4e429ebce64a4d5c16b0f136142ad213cdb1" + "hash": "b41fa341e65ee348f468ed04ac1160770b19c0a00cd333abc48b29c54f863149" } diff --git a/backend/.sqlx/query-bbc2c0769bf833f4e95bfc7908897ecbfe662efb13ffdd8ee3f1930bff4cd9c4.json b/backend/.sqlx/query-bbc2c0769bf833f4e95bfc7908897ecbfe662efb13ffdd8ee3f1930bff4cd9c4.json new file mode 100644 index 0000000000..e8f8de3ef8 --- /dev/null +++ b/backend/.sqlx/query-bbc2c0769bf833f4e95bfc7908897ecbfe662efb13ffdd8ee3f1930bff4cd9c4.json @@ -0,0 +1,17 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE v2_job_status SET\n flow_status = JSONB_SET(\n JSONB_SET(flow_status, ARRAY['modules', $1::TEXT], $2),\n ARRAY['step'],\n $3\n )\n WHERE id = $4", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Jsonb", + "Jsonb", + "Uuid" + ] + }, + "nullable": [] + }, + "hash": "bbc2c0769bf833f4e95bfc7908897ecbfe662efb13ffdd8ee3f1930bff4cd9c4" +} diff --git a/backend/.sqlx/query-bcfe877749ff7b944fef302ea37481b170c221349a793c9608c4ccd52ba8a5af.json b/backend/.sqlx/query-bcfe877749ff7b944fef302ea37481b170c221349a793c9608c4ccd52ba8a5af.json new file mode 100644 index 0000000000..4460ab7b36 --- /dev/null +++ b/backend/.sqlx/query-bcfe877749ff7b944fef302ea37481b170c221349a793c9608c4ccd52ba8a5af.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE v2_job_status\n SET flow_status = JSONB_SET(flow_status, ARRAY['approval_conditions'], $1)\n WHERE id = $2", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Jsonb", + "Uuid" + ] + }, + "nullable": [] + }, + "hash": "bcfe877749ff7b944fef302ea37481b170c221349a793c9608c4ccd52ba8a5af" +} diff --git a/backend/.sqlx/query-c202f6fbae6a727f88f3ac692985c70e6ebc68e4a16d02e4e36b79f3cfb1c661.json b/backend/.sqlx/query-c202f6fbae6a727f88f3ac692985c70e6ebc68e4a16d02e4e36b79f3cfb1c661.json deleted file mode 100644 index e1094f38ef..0000000000 --- a/backend/.sqlx/query-c202f6fbae6a727f88f3ac692985c70e6ebc68e4a16d02e4e36b79f3cfb1c661.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "WITH suspend AS (\n UPDATE v2_job_queue SET suspend = $2, suspend_until = now() + $3\n WHERE id = $4\n RETURNING id\n ) UPDATE v2_job_status SET flow_status = JSONB_SET(\n flow_status,\n ARRAY['modules', flow_status->>'step'::TEXT],\n $1\n ) WHERE id = (SELECT id FROM suspend)", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Jsonb", - "Int4", - "Interval", - "Uuid" - ] - }, - "nullable": [] - }, - "hash": "c202f6fbae6a727f88f3ac692985c70e6ebc68e4a16d02e4e36b79f3cfb1c661" -} diff --git a/backend/.sqlx/query-c71e12ec9d0054dd5605a4ea2ef77fa54ce686da9c93790420a91a0735589ac7.json b/backend/.sqlx/query-c71e12ec9d0054dd5605a4ea2ef77fa54ce686da9c93790420a91a0735589ac7.json deleted file mode 100644 index ecc62b1682..0000000000 --- a/backend/.sqlx/query-c71e12ec9d0054dd5605a4ea2ef77fa54ce686da9c93790420a91a0735589ac7.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE v2_job_status\n SET flow_status = JSONB_SET(JSONB_SET(flow_status, ARRAY['retry'], $1), ARRAY['modules', $3::TEXT, 'failed_retries'], $4)\n WHERE id = $2", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Jsonb", - "Uuid", - "Text", - "Jsonb" - ] - }, - "nullable": [] - }, - "hash": "c71e12ec9d0054dd5605a4ea2ef77fa54ce686da9c93790420a91a0735589ac7" -} diff --git a/backend/.sqlx/query-cd79f4dc6a426f1c4c19c2a86dc877a6d5bc5771b27d9e208a219a63add200f3.json b/backend/.sqlx/query-cd79f4dc6a426f1c4c19c2a86dc877a6d5bc5771b27d9e208a219a63add200f3.json new file mode 100644 index 0000000000..279ff511bd --- /dev/null +++ b/backend/.sqlx/query-cd79f4dc6a426f1c4c19c2a86dc877a6d5bc5771b27d9e208a219a63add200f3.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE v2_job_status SET\n flow_status = JSONB_SET(\n JSONB_SET(flow_status, ARRAY['failure_module'], $1),\n ARRAY['step'],\n $2\n )\n WHERE id = $3", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Jsonb", + "Jsonb", + "Uuid" + ] + }, + "nullable": [] + }, + "hash": "cd79f4dc6a426f1c4c19c2a86dc877a6d5bc5771b27d9e208a219a63add200f3" +} diff --git a/backend/.sqlx/query-d6db1103fee4bad6831656d77a28254c9a832b4f660ec755f4fa14f6f7bb3353.json b/backend/.sqlx/query-d6db1103fee4bad6831656d77a28254c9a832b4f660ec755f4fa14f6f7bb3353.json new file mode 100644 index 0000000000..09f24968f3 --- /dev/null +++ b/backend/.sqlx/query-d6db1103fee4bad6831656d77a28254c9a832b4f660ec755f4fa14f6f7bb3353.json @@ -0,0 +1,25 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE v2_job_status SET\n flow_status = JSONB_SET(\n JSONB_SET(flow_status, ARRAY['modules', $1::TEXT, 'flow_jobs_success', $3::TEXT], $4),\n ARRAY['modules', $1::TEXT, 'iterator', 'index'],\n ((flow_status->'modules'->$1::int->'iterator'->>'index')::int + 1)::text::jsonb\n )\n WHERE id = $2\n RETURNING (flow_status->'modules'->$1::int->'iterator'->>'index')::int", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "int4", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Int4", + "Uuid", + "Text", + "Jsonb" + ] + }, + "nullable": [ + null + ] + }, + "hash": "d6db1103fee4bad6831656d77a28254c9a832b4f660ec755f4fa14f6f7bb3353" +} diff --git a/backend/.sqlx/query-de2a213bc5a08d08bcd52ad630559cc0f16d7286c3f07c27d962258022f0e04d.json b/backend/.sqlx/query-de2a213bc5a08d08bcd52ad630559cc0f16d7286c3f07c27d962258022f0e04d.json new file mode 100644 index 0000000000..f3ef9ff937 --- /dev/null +++ b/backend/.sqlx/query-de2a213bc5a08d08bcd52ad630559cc0f16d7286c3f07c27d962258022f0e04d.json @@ -0,0 +1,17 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE v2_job_status\n SET flow_status = JSONB_SET(JSONB_SET(flow_status, ARRAY['retry'], $1), ARRAY['modules', $3::TEXT, 'failed_retries'], $4)\n WHERE id = $2", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Jsonb", + "Uuid", + "Text", + "Jsonb" + ] + }, + "nullable": [] + }, + "hash": "de2a213bc5a08d08bcd52ad630559cc0f16d7286c3f07c27d962258022f0e04d" +} diff --git a/backend/.sqlx/query-defd99dd2427cdc54bb662d1ba3a1aea7f410ef204ec3465f4fb6c9acd256c95.json b/backend/.sqlx/query-defd99dd2427cdc54bb662d1ba3a1aea7f410ef204ec3465f4fb6c9acd256c95.json deleted file mode 100644 index 6aab7bc049..0000000000 --- a/backend/.sqlx/query-defd99dd2427cdc54bb662d1ba3a1aea7f410ef204ec3465f4fb6c9acd256c95.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE v2_job_queue SET\n suspend = $1,\n suspend_until = now() + interval '14 day',\n running = true\n WHERE id = $2", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Int4", - "Uuid" - ] - }, - "nullable": [] - }, - "hash": "defd99dd2427cdc54bb662d1ba3a1aea7f410ef204ec3465f4fb6c9acd256c95" -} diff --git a/backend/.sqlx/query-e3f545460bf317c3e2f34f4cbd12740141eb8b5ed07c090ae9356a970caeadd0.json b/backend/.sqlx/query-e3f545460bf317c3e2f34f4cbd12740141eb8b5ed07c090ae9356a970caeadd0.json new file mode 100644 index 0000000000..34df271cc8 --- /dev/null +++ b/backend/.sqlx/query-e3f545460bf317c3e2f34f4cbd12740141eb8b5ed07c090ae9356a970caeadd0.json @@ -0,0 +1,17 @@ +{ + "db_name": "PostgreSQL", + "query": "WITH suspend AS (\n UPDATE v2_job_queue SET suspend = $2, suspend_until = now() + $3\n WHERE id = $4\n RETURNING id\n ) UPDATE v2_job_status SET flow_status = JSONB_SET(\n flow_status,\n ARRAY['modules', flow_status->>'step'::TEXT],\n $1\n ) WHERE id = (SELECT id FROM suspend)", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Jsonb", + "Int4", + "Interval", + "Uuid" + ] + }, + "nullable": [] + }, + "hash": "e3f545460bf317c3e2f34f4cbd12740141eb8b5ed07c090ae9356a970caeadd0" +} diff --git a/backend/.sqlx/query-f3c78cb67379f9407f1f32ce3387184d7f4fcb04c07a8e2f07c5effc10f8fd5c.json b/backend/.sqlx/query-f3c78cb67379f9407f1f32ce3387184d7f4fcb04c07a8e2f07c5effc10f8fd5c.json deleted file mode 100644 index 0cf878b15c..0000000000 --- a/backend/.sqlx/query-f3c78cb67379f9407f1f32ce3387184d7f4fcb04c07a8e2f07c5effc10f8fd5c.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE v2_job_status\n SET flow_status = JSONB_SET(flow_status, ARRAY['modules', $1::TEXT, 'approvers'], $2)\n WHERE id = $3", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Jsonb", - "Uuid" - ] - }, - "nullable": [] - }, - "hash": "f3c78cb67379f9407f1f32ce3387184d7f4fcb04c07a8e2f07c5effc10f8fd5c" -} diff --git a/backend/windmill-api-client/codegen.rs b/backend/windmill-api-client/codegen.rs index ec1a363f88..202145159e 100644 --- a/backend/windmill-api-client/codegen.rs +++ b/backend/windmill-api-client/codegen.rs @@ -2750,6 +2750,8 @@ the execution of this script will be permissioned_as and by extension its DT_TOK pub expr: String, #[serde(default, skip_serializing_if = "Option::is_none")] pub skip_if_stopped: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub error_message: Option } impl From<&FlowModuleStopAfterAllItersIf> for FlowModuleStopAfterAllItersIf { fn from(value: &FlowModuleStopAfterAllItersIf) -> Self { @@ -2761,6 +2763,8 @@ the execution of this script will be permissioned_as and by extension its DT_TOK pub expr: String, #[serde(default, skip_serializing_if = "Option::is_none")] pub skip_if_stopped: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub error_message: Option } impl From<&FlowModuleStopAfterIf> for FlowModuleStopAfterIf { fn from(value: &FlowModuleStopAfterIf) -> Self { diff --git a/backend/windmill-api-client/src/codegen.rs b/backend/windmill-api-client/src/codegen.rs index 2ee220f87d..9bc26262d5 100644 --- a/backend/windmill-api-client/src/codegen.rs +++ b/backend/windmill-api-client/src/codegen.rs @@ -1824,6 +1824,8 @@ the execution of this script will be permissioned_as and by extension its DT_TOK pub expr: String, #[serde(default, skip_serializing_if = "Option::is_none")] pub skip_if_stopped: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub error_message: Option } impl From<&FlowModuleStopAfterIf> for FlowModuleStopAfterIf { fn from(value: &FlowModuleStopAfterIf) -> Self { diff --git a/backend/windmill-api/src/flows.rs b/backend/windmill-api/src/flows.rs index 95a2145bcf..e34b2cacaf 100644 --- a/backend/windmill-api/src/flows.rs +++ b/backend/windmill-api/src/flows.rs @@ -1345,7 +1345,7 @@ mod tests { }), stop_after_if: Some(StopAfterIf { expr: "foo = 'bar'".to_string(), - skip_if_stopped: false, + ..Default::default() }), stop_after_all_iters_if: None, summary: None, @@ -1374,7 +1374,7 @@ mod tests { }), stop_after_if: Some(StopAfterIf { expr: "previous.isEmpty()".to_string(), - skip_if_stopped: false, + ..Default::default() }), stop_after_all_iters_if: None, summary: None, @@ -1402,7 +1402,7 @@ mod tests { .into(), stop_after_if: Some(StopAfterIf { expr: "previous.isEmpty()".to_string(), - skip_if_stopped: false, + ..Default::default() }), stop_after_all_iters_if: None, summary: None, @@ -1452,7 +1452,8 @@ mod tests { }, "stop_after_if": { "expr": "foo = 'bar'", - "skip_if_stopped": false + "skip_if_stopped": false, + "error_message": null } }, { @@ -1474,6 +1475,7 @@ mod tests { "stop_after_if": { "expr": "previous.isEmpty()", "skip_if_stopped": false, + "error_message": null } } ], @@ -1486,7 +1488,8 @@ mod tests { }, "stop_after_if": { "expr": "previous.isEmpty()", - "skip_if_stopped": false + "skip_if_stopped": false, + "error_message": null } }, }); diff --git a/backend/windmill-common/src/flows.rs b/backend/windmill-common/src/flows.rs index 15881850ac..443461af64 100644 --- a/backend/windmill-common/src/flows.rs +++ b/backend/windmill-common/src/flows.rs @@ -136,10 +136,11 @@ pub struct FlowValue { pub concurrency_key: Option, } -#[derive(Deserialize, Serialize, Debug, Clone)] +#[derive(Default, Deserialize, Serialize, Debug, Clone)] pub struct StopAfterIf { pub expr: String, pub skip_if_stopped: bool, + pub error_message: Option, } #[derive(Deserialize, Serialize, Debug, Clone, Default, PartialEq)] diff --git a/backend/windmill-worker/src/worker_flow.rs b/backend/windmill-worker/src/worker_flow.rs index 8ed62b515b..fe5ffcdeca 100644 --- a/backend/windmill-worker/src/worker_flow.rs +++ b/backend/windmill-worker/src/worker_flow.rs @@ -35,7 +35,7 @@ use windmill_common::db::Authed; use windmill_common::flow_status::{ ApprovalConditions, FlowStatusModuleWParent, Iterator as FlowIterator, JobResult, }; -use windmill_common::flows::{add_virtual_items_if_necessary, Branch, FlowNodeId}; +use windmill_common::flows::{add_virtual_items_if_necessary, Branch, FlowNodeId, StopAfterIf}; use windmill_common::jobs::{ script_hash_to_tag_and_limits, script_path_to_payload, JobKind, JobPayload, OnBehalfOf, RawCode, ENTRYPOINT_OVERRIDE, @@ -85,7 +85,6 @@ pub async fn update_flow_status_after_job_completion( ) -> error::Result>> { // this is manual tailrecursion because async_recursion blows up the stack potentially_crash_for_testing(); - let mut rec = RecUpdateFlowStatusAfterJobCompletion { flow, job_id_for_status: job_id_for_status.clone(), @@ -184,6 +183,30 @@ struct RecoveryObject { recover: Option, } +fn get_stop_after_if_data( + stop_early: bool, + stop_after_if: Option<&StopAfterIf>, +) -> (bool, Option) { + if let Some(stop_after_if) = stop_after_if { + let err_msg = stop_early + .then(|| { + let err_msg = stop_after_if.error_message.as_ref().and_then(|message| { + let err_start_msg = "Flow early stop"; + let s = if message.is_empty() { + format!("{}: {}", err_start_msg, &stop_after_if.expr) + } else { + format!("{}: {}", err_start_msg, message) + }; + Some(s) + }); + err_msg + }) + .flatten(); + return (stop_after_if.skip_if_stopped, err_msg); + } + return (false, None); +} + // #[instrument(level = "trace", skip_all)] pub async fn update_flow_status_after_job_completion_internal( db: &DB, @@ -208,6 +231,7 @@ pub async fn update_flow_status_after_job_completion_internal( flow_job, flow_data, stop_early, + stop_early_err_msg, skip_if_stop_early, nresult, is_failure_step, @@ -216,34 +240,34 @@ pub async fn update_flow_status_after_job_completion_internal( // tracing::debug!("UPDATE FLOW STATUS: {flow:?} {success} {result:?} {w_id} {depth}"); let (job_kind, script_hash, old_status, raw_flow) = sqlx::query!( - "SELECT - kind AS \"job_kind!: JobKind\", - runnable_id AS \"script_hash: ScriptHash\", - flow_status AS \"flow_status!: Json>\", - raw_flow AS \"raw_flow: Json>\" - FROM v2_job INNER JOIN v2_job_status ON v2_job.id = v2_job_status.id WHERE v2_job.id = $1 AND v2_job.workspace_id = $2 LIMIT 1", - flow, - w_id - ) - .fetch_one(db) - .await - .map_err(|e| { - Error::internal_err(format!( - "fetching flow status {flow} while reporting {success} {result:?}: {e:#}" - )) - }) - .and_then(|record| { - Ok(( - record.job_kind, - record.script_hash, - serde_json::from_str::(record.flow_status.0.get()).map_err(|e| { - Error::internal_err(format!( - "requiring current module to be parsable as FlowStatus: {e:?}" - )) - })?, - record.raw_flow, - )) - })?; + "SELECT + kind AS \"job_kind!: JobKind\", + runnable_id AS \"script_hash: ScriptHash\", + flow_status AS \"flow_status!: Json>\", + raw_flow AS \"raw_flow: Json>\" + FROM v2_job INNER JOIN v2_job_status ON v2_job.id = v2_job_status.id WHERE v2_job.id = $1 AND v2_job.workspace_id = $2 LIMIT 1", + flow, + w_id + ) + .fetch_one(db) + .await + .map_err(|e| { + Error::internal_err(format!( + "fetching flow status {flow} while reporting {success} {result:?}: {e:#}" + )) + }) + .and_then(|record| { + Ok(( + record.job_kind, + record.script_hash, + serde_json::from_str::(record.flow_status.0.get()).map_err(|e| { + Error::internal_err(format!( + "requiring current module to be parsable as FlowStatus: {e:?}" + )) + })?, + record.raw_flow, + )) + })?; let flow_data = cache::job::fetch_flow(db, job_kind, script_hash) .or_else(|_| cache::job::fetch_preview_flow(db, &flow, raw_flow)) @@ -299,7 +323,7 @@ pub async fn update_flow_status_after_job_completion_internal( let is_failure_step = old_status.step >= old_status.modules.len() as i32 && old_status.modules.len() > 0; - let (mut stop_early, mut skip_if_stop_early, continue_on_error) = + let (mut stop_early, mut stop_early_err_msg, mut skip_if_stop_early, continue_on_error) = if let Some(se) = stop_early_override { //do not stop early if module is a flow step let step = match module_step { @@ -315,7 +339,6 @@ pub async fn update_flow_status_after_job_completion_internal( } current_module - .as_ref() .map(|module| { serde_json::from_str::(module.value.get()) .map(|v| v.r#type == "flow") @@ -327,19 +350,19 @@ pub async fn update_flow_status_after_job_completion_internal( }; if is_flow { - (false, false, false) + (false, None, false, false) } else { - (true, se, false) + (true, None, se, false) } } else if is_failure_step || matches!(module_step, Step::PreprocessorStep) { - (false, false, false) - } else if let Some(current_module) = current_module.as_ref() { + (false, None, false, false) + } else if let Some(current_module) = current_module { let stop_early = success && !is_branch_all - && if let Some(ref expr) = current_module + && if let Some(expr) = current_module .stop_after_if .as_ref() - .map(|x| x.expr.clone()) + .map(|x| x.expr.as_str()) { let all_iters = match &module_status { @@ -352,9 +375,9 @@ pub async fn update_flow_status_after_job_completion_internal( }; let args = sqlx::query_scalar!( "SELECT - args AS \"args: Json>>\" - FROM v2_job - WHERE id = $1", + args AS \"args: Json>>\" + FROM v2_job + WHERE id = $1", flow ) .fetch_one(db) @@ -376,17 +399,16 @@ pub async fn update_flow_status_after_job_completion_internal( } else { false }; + let (skip_if_stopped, stop_early_err_msg) = + get_stop_after_if_data(stop_early, current_module.stop_after_if.as_ref()); ( stop_early, - current_module - .stop_after_if - .as_ref() - .map(|x| x.skip_if_stopped) - .unwrap_or(false), + stop_early_err_msg.filter(|_| !(is_loop || is_branch_all)), + skip_if_stopped, current_module.continue_on_error.unwrap_or(false), ) } else { - (false, false, false) + (false, None, false, false) }; let skip_seq_branch_failure = match module_status { @@ -404,26 +426,26 @@ pub async fn update_flow_status_after_job_completion_internal( if matches!(module_step, Step::PreprocessorStep) { sqlx::query!( "WITH job_result AS ( - SELECT result - FROM v2_job_completed - WHERE id = $1 - ) - UPDATE v2_job - SET args = COALESCE( - CASE - WHEN job_result.result IS NULL THEN NULL - WHEN jsonb_typeof(job_result.result) = 'object' - THEN job_result.result - WHEN jsonb_typeof(job_result.result) = 'null' - THEN NULL - ELSE jsonb_build_object('value', job_result.result) - END, - '{}'::jsonb - ), - preprocessed = TRUE - FROM job_result - WHERE v2_job.id = $2; - ", + SELECT result + FROM v2_job_completed + WHERE id = $1 + ) + UPDATE v2_job + SET args = COALESCE( + CASE + WHEN job_result.result IS NULL THEN NULL + WHEN jsonb_typeof(job_result.result) = 'object' + THEN job_result.result + WHEN jsonb_typeof(job_result.result) = 'null' + THEN NULL + ELSE jsonb_build_object('value', job_result.result) + END, + '{}'::jsonb + ), + preprocessed = TRUE + FROM job_result + WHERE v2_job.id = $2; + ", job_id_for_status, flow ) @@ -458,46 +480,46 @@ pub async fn update_flow_status_after_job_completion_internal( }; let nindex = if let Some(position) = position { - sqlx::query_scalar!( - "UPDATE v2_job_status SET - flow_status = JSONB_SET( - JSONB_SET(flow_status, ARRAY['modules', $1::TEXT, 'flow_jobs_success', $3::TEXT], $4), - ARRAY['modules', $1::TEXT, 'iterator', 'index'], - ((flow_status->'modules'->$1::int->'iterator'->>'index')::int + 1)::text::jsonb - ) - WHERE id = $2 - RETURNING (flow_status->'modules'->$1::int->'iterator'->>'index')::int", - old_status.step, - flow, - position as i32, - json!(success) - ) - } else { - sqlx::query_scalar!( - "UPDATE v2_job_status SET - flow_status = JSONB_SET( - flow_status, - ARRAY['modules', $1::TEXT, 'iterator', 'index'], - ((flow_status->'modules'->$1::int->'iterator'->>'index')::int + 1)::text::jsonb - ) - WHERE id = $2 - RETURNING (flow_status->'modules'->$1::int->'iterator'->>'index')::int", - old_status.step, - flow - ) - } - .fetch_one(&mut *tx) - .await.map_err(|e| { - Error::internal_err(format!( - "error while fetching iterator index: {e:#}" - )) - })? - .ok_or_else(|| Error::internal_err(format!("requiring an index in InProgress")))?; + sqlx::query_scalar!( + "UPDATE v2_job_status SET + flow_status = JSONB_SET( + JSONB_SET(flow_status, ARRAY['modules', $1::TEXT, 'flow_jobs_success', $3::TEXT], $4), + ARRAY['modules', $1::TEXT, 'iterator', 'index'], + ((flow_status->'modules'->$1::int->'iterator'->>'index')::int + 1)::text::jsonb + ) + WHERE id = $2 + RETURNING (flow_status->'modules'->$1::int->'iterator'->>'index')::int", + old_status.step, + flow, + position as i32, + json!(success) + ) + } else { + sqlx::query_scalar!( + "UPDATE v2_job_status SET + flow_status = JSONB_SET( + flow_status, + ARRAY['modules', $1::TEXT, 'iterator', 'index'], + ((flow_status->'modules'->$1::int->'iterator'->>'index')::int + 1)::text::jsonb + ) + WHERE id = $2 + RETURNING (flow_status->'modules'->$1::int->'iterator'->>'index')::int", + old_status.step, + flow + ) + } + .fetch_one(&mut *tx) + .await.map_err(|e| { + Error::internal_err(format!( + "error while fetching iterator index: {e:#}" + )) + })? + .ok_or_else(|| Error::internal_err(format!("requiring an index in InProgress")))?; tracing::info!( - "parallel iteration {job_id_for_status} of flow {flow} update nindex: {nindex} len: {len}", - nindex = nindex, - len = itered.len() - ); + "parallel iteration {job_id_for_status} of flow {flow} update nindex: {nindex} len: {len}", + nindex = nindex, + len = itered.len() + ); (nindex, itered.len() as i32) } (_, Some(BranchAllStatus { len, .. })) => { @@ -508,42 +530,42 @@ pub async fn update_flow_status_after_job_completion_internal( }; let nindex = if let Some(position) = position { - sqlx::query_scalar!( - "UPDATE v2_job_status SET - flow_status = JSONB_SET( - JSONB_SET(flow_status, ARRAY['modules', $1::TEXT, 'flow_jobs_success', $3::TEXT], $4), - ARRAY['modules', $1::TEXT, 'branchall', 'branch'], - ((flow_status->'modules'->$1::int->'branchall'->>'branch')::int + 1)::text::jsonb - ) - WHERE id = $2 - RETURNING (flow_status->'modules'->$1::int->'branchall'->>'branch')::int", - old_status.step, - flow, - position as i32, - json!(success) - ) - } else { - sqlx::query_scalar!( - "UPDATE v2_job_status SET - flow_status = JSONB_SET( - flow_status, - ARRAY['modules', $1::TEXT, 'branchall', 'branch'], - ((flow_status->'modules'->$1::int->'branchall'->>'branch')::int + 1)::text::jsonb - ) - WHERE id = $2 - RETURNING (flow_status->'modules'->$1::int->'branchall'->>'branch')::int", - old_status.step, - flow - ) - } - .fetch_one(&mut *tx) - .await - .map_err(|e| { - Error::internal_err(format!( - "error while fetching branchall index: {e:#}" - )) - })? - .ok_or_else(|| Error::internal_err(format!("requiring an index in InProgress")))?; + sqlx::query_scalar!( + "UPDATE v2_job_status SET + flow_status = JSONB_SET( + JSONB_SET(flow_status, ARRAY['modules', $1::TEXT, 'flow_jobs_success', $3::TEXT], $4), + ARRAY['modules', $1::TEXT, 'branchall', 'branch'], + ((flow_status->'modules'->$1::int->'branchall'->>'branch')::int + 1)::text::jsonb + ) + WHERE id = $2 + RETURNING (flow_status->'modules'->$1::int->'branchall'->>'branch')::int", + old_status.step, + flow, + position as i32, + json!(success) + ) + } else { + sqlx::query_scalar!( + "UPDATE v2_job_status SET + flow_status = JSONB_SET( + flow_status, + ARRAY['modules', $1::TEXT, 'branchall', 'branch'], + ((flow_status->'modules'->$1::int->'branchall'->>'branch')::int + 1)::text::jsonb + ) + WHERE id = $2 + RETURNING (flow_status->'modules'->$1::int->'branchall'->>'branch')::int", + old_status.step, + flow + ) + } + .fetch_one(&mut *tx) + .await + .map_err(|e| { + Error::internal_err(format!( + "error while fetching branchall index: {e:#}" + )) + })? + .ok_or_else(|| Error::internal_err(format!("requiring an index in InProgress")))?; (nindex, *len as i32) } _ => Err(Error::internal_err(format!( @@ -566,50 +588,50 @@ pub async fn update_flow_status_after_job_completion_internal( } let new_status = if skip_loop_failures - || sqlx::query_scalar!( - "SELECT status = 'success' OR status = 'skipped' AS \"success!\" FROM v2_job_completed WHERE id = ANY($1)", - jobs.as_slice() - ) - .fetch_all(&mut *tx) - .await - .map_err(|e| { - Error::internal_err(format!( - "error while fetching sucess from completed_jobs: {e:#}" - )) - })? - .into_iter() - .all(|x| x) - { - success = true; - FlowStatusModule::Success { - id: module_status.id(), - job: job_id_for_status.clone(), - flow_jobs: Some(jobs.clone()), - flow_jobs_success: flow_jobs_success.clone(), - branch_chosen: None, - approvers: vec![], - failed_retries: vec![], - skipped: false, - } - } else { - success = false; - FlowStatusModule::Failure { - id: module_status.id(), - job: job_id_for_status.clone(), - flow_jobs: Some(jobs.clone()), - flow_jobs_success: flow_jobs_success.clone(), - branch_chosen: None, - failed_retries: vec![], - } - }; + || sqlx::query_scalar!( + "SELECT status = 'success' OR status = 'skipped' AS \"success!\" FROM v2_job_completed WHERE id = ANY($1)", + jobs.as_slice() + ) + .fetch_all(&mut *tx) + .await + .map_err(|e| { + Error::internal_err(format!( + "error while fetching sucess from completed_jobs: {e:#}" + )) + })? + .into_iter() + .all(|x| x) + { + success = true; + FlowStatusModule::Success { + id: module_status.id(), + job: job_id_for_status.clone(), + flow_jobs: Some(jobs.clone()), + flow_jobs_success: flow_jobs_success.clone(), + branch_chosen: None, + approvers: vec![], + failed_retries: vec![], + skipped: false, + } + } else { + success = false; + FlowStatusModule::Failure { + id: module_status.id(), + job: job_id_for_status.clone(), + flow_jobs: Some(jobs.clone()), + flow_jobs_success: flow_jobs_success.clone(), + branch_chosen: None, + failed_retries: vec![], + } + }; let r = sqlx::query_scalar!( - "DELETE FROM parallel_monitor_lock WHERE parent_flow_id = $1 RETURNING last_ping", - flow, - ).fetch_optional(db).await.map_err(|e| { - Error::internal_err(format!( - "error while deleting parallel_monitor_lock: {e:#}" - )) - })?; + "DELETE FROM parallel_monitor_lock WHERE parent_flow_id = $1 RETURNING last_ping", + flow, + ).fetch_optional(db).await.map_err(|e| { + Error::internal_err(format!( + "error while deleting parallel_monitor_lock: {e:#}" + )) + })?; if r.is_some() { tracing::info!( @@ -628,10 +650,10 @@ pub async fn update_flow_status_after_job_completion_internal( if parallelism.is_some() { sqlx::query!( "UPDATE v2_job_queue q SET suspend = 0 - FROM v2_job j, v2_job_status f - WHERE parent_job = $1 - AND f.id = j.id AND q.id = j.id - AND suspend = $2 AND (f.flow_status->'step')::int = 0", + FROM v2_job j, v2_job_status f + WHERE parent_job = $1 + AND f.id = j.id AND q.id = j.id + AND suspend = $2 AND (f.flow_status->'step')::int = 0", flow, nindex ) @@ -645,12 +667,12 @@ pub async fn update_flow_status_after_job_completion_internal( } let r = sqlx::query_scalar!( - "DELETE FROM parallel_monitor_lock WHERE parent_flow_id = $1 and job_id = $2 RETURNING last_ping", - flow, - job_id_for_status - ).fetch_optional(db).await.map_err(|e| { - Error::internal_err(format!("error while removing parallel_monitor_lock: {e:#}")) - })?; + "DELETE FROM parallel_monitor_lock WHERE parent_flow_id = $1 and job_id = $2 RETURNING last_ping", + flow, + job_id_for_status + ).fetch_optional(db).await.map_err(|e| { + Error::internal_err(format!("error while removing parallel_monitor_lock: {e:#}")) + })?; if r.is_some() { tracing::info!( "parallel flow has removed lock on its parent, last ping was {:?}", @@ -804,8 +826,8 @@ pub async fn update_flow_status_after_job_completion_internal( let step_counter = if inc_step_counter { sqlx::query!( "UPDATE v2_job_status - SET flow_status = JSONB_SET(flow_status, ARRAY['step'], $1) - WHERE id = $2", + SET flow_status = JSONB_SET(flow_status, ARRAY['step'], $1) + WHERE id = $2", json!(old_status.step + 1), flow ) @@ -834,20 +856,20 @@ pub async fn update_flow_status_after_job_completion_internal( if let Some(new_status) = new_status.as_ref() { if is_failure_step { let parent_module = sqlx::query_scalar!( - "SELECT flow_status->'failure_module'->>'parent_module' FROM v2_job_status WHERE id = $1", - flow - ) - .fetch_one(&mut *tx) - .await.map_err(|e| { - Error::internal_err(format!( - "error while fetching failure module: {e:#}" - )) - })?; + "SELECT flow_status->'failure_module'->>'parent_module' FROM v2_job_status WHERE id = $1", + flow + ) + .fetch_one(&mut *tx) + .await.map_err(|e| { + Error::internal_err(format!( + "error while fetching failure module: {e:#}" + )) + })?; sqlx::query!( "UPDATE v2_job_status - SET flow_status = JSONB_SET(flow_status, ARRAY['failure_module'], $1) - WHERE id = $2", + SET flow_status = JSONB_SET(flow_status, ARRAY['failure_module'], $1) + WHERE id = $2", json!(FlowStatusModuleWParent { parent_module, module_status: new_status.clone() @@ -864,8 +886,8 @@ pub async fn update_flow_status_after_job_completion_internal( } else if matches!(module_step, Step::PreprocessorStep) { sqlx::query!( "UPDATE v2_job_status - SET flow_status = JSONB_SET(flow_status, ARRAY['preprocessor_module'], $1) - WHERE id = $2", + SET flow_status = JSONB_SET(flow_status, ARRAY['preprocessor_module'], $1) + WHERE id = $2", json!(new_status), flow ) @@ -879,8 +901,8 @@ pub async fn update_flow_status_after_job_completion_internal( } else { sqlx::query!( "UPDATE v2_job_status - SET flow_status = JSONB_SET(flow_status, ARRAY['modules', $1::TEXT], $2) - WHERE id = $3", + SET flow_status = JSONB_SET(flow_status, ARRAY['modules', $1::TEXT], $2) + WHERE id = $3", old_status.step.to_string(), json!(new_status), flow @@ -893,40 +915,44 @@ pub async fn update_flow_status_after_job_completion_internal( if let Some(job_result) = new_status.job_result() { sqlx::query!( - "UPDATE v2_job_status - SET flow_leaf_jobs = JSONB_SET(coalesce(flow_leaf_jobs, '{}'::jsonb), ARRAY[$1::TEXT], $2) - WHERE COALESCE((SELECT flow_innermost_root_job FROM v2_job WHERE id = $3), $3) = id", - new_status.id(), - json!(job_result), - flow - ) - .execute(&mut *tx) - .await.map_err(|e| { - Error::internal_err(format!( - "error while setting leaf jobs: {e:#}" - )) - })?; + "UPDATE v2_job_status + SET flow_leaf_jobs = JSONB_SET(coalesce(flow_leaf_jobs, '{}'::jsonb), ARRAY[$1::TEXT], $2) + WHERE COALESCE((SELECT flow_innermost_root_job FROM v2_job WHERE id = $3), $3) = id", + new_status.id(), + json!(job_result), + flow + ) + .execute(&mut *tx) + .await.map_err(|e| { + Error::internal_err(format!( + "error while setting leaf jobs: {e:#}" + )) + })?; } } } - let nresult = match &new_status { - Some(FlowStatusModule::Success { flow_jobs: Some(jobs), .. }) - | Some(FlowStatusModule::Failure { flow_jobs: Some(jobs), .. }) => { - Arc::new(retrieve_flow_jobs_results(db, w_id, jobs).await?) + let mut nresult = if let Some(stop_early_err_msg) = stop_early_err_msg.as_ref() { + Arc::new(to_raw_value(stop_early_err_msg)) + } else { + match &new_status { + Some(FlowStatusModule::Success { flow_jobs: Some(jobs), .. }) + | Some(FlowStatusModule::Failure { flow_jobs: Some(jobs), .. }) => { + Arc::new(retrieve_flow_jobs_results(db, w_id, jobs).await?) + } + _ => result.clone(), } - _ => result.clone(), }; match &new_status { Some(FlowStatusModule::Success { .. }) if is_loop || is_branch_all => { - if let Some(ref expr) = current_module + if let Some(stop_after_all_iters_if) = current_module .as_ref() - .and_then(|m| m.stop_after_all_iters_if.as_ref().map(|x| x.expr.clone())) + .and_then(|m| m.stop_after_all_iters_if.as_ref()) { let args = sqlx::query_scalar!( "SELECT args AS \"args: Json>>\" - FROM v2_job WHERE id = $1", + FROM v2_job WHERE id = $1", flow ) .fetch_one(db) @@ -936,7 +962,7 @@ pub async fn update_flow_status_after_job_completion_internal( })?; let should_stop = compute_bool_from_expr( - &expr, + &stop_after_all_iters_if.expr, Marc::new(args.unwrap_or_default().0), nresult.clone(), None, @@ -948,15 +974,14 @@ pub async fn update_flow_status_after_job_completion_internal( .await?; if should_stop { - stop_early = should_stop; - skip_if_stop_early = current_module - .as_ref() - .and_then(|m| { - m.stop_after_all_iters_if - .as_ref() - .map(|x| x.skip_if_stopped) - }) - .unwrap_or(false); + stop_early = true; + let (skip_if_stopped, err_msg_internal) = + get_stop_after_if_data(should_stop, Some(stop_after_all_iters_if)); + skip_if_stop_early = skip_if_stopped; + if err_msg_internal.is_some() { + stop_early_err_msg = err_msg_internal; + nresult = Arc::new(to_raw_value(&stop_early_err_msg)); + } } } } @@ -968,8 +993,8 @@ pub async fn update_flow_status_after_job_completion_internal( { sqlx::query!( "UPDATE v2_job_status - SET flow_status = flow_status - 'retry' - WHERE id = $1", + SET flow_status = flow_status - 'retry' + WHERE id = $1", flow ) .execute(&mut *tx) @@ -1042,6 +1067,7 @@ pub async fn update_flow_status_after_job_completion_internal( flow_job, flow_data, stop_early, + stop_early_err_msg, skip_if_stop_early, nresult, is_failure_step, @@ -1069,9 +1095,9 @@ pub async fn update_flow_status_after_job_completion_internal( // run the cleanup step only when the root job is complete if !_cleanup_module.flow_jobs_to_clean.is_empty() { tracing::debug!( - "Cleaning up jobs arguments, result and logs as they were marked as delete_after_use {:?}", - _cleanup_module.flow_jobs_to_clean - ); + "Cleaning up jobs arguments, result and logs as they were marked as delete_after_use {:?}", + _cleanup_module.flow_jobs_to_clean + ); sqlx::query!( "UPDATE v2_job SET args = '{}'::jsonb WHERE id = ANY($1)", &_cleanup_module.flow_jobs_to_clean, @@ -1120,14 +1146,15 @@ pub async fn update_flow_status_after_job_completion_internal( } let success = success && (!is_failure_step || result_has_recover_true(nresult.clone())) - && !skip_error_handler; + && !skip_error_handler + && stop_early_err_msg.is_none(); add_time!(bench, "flow status update 1"); if success { add_completed_job( db, &flow_job, - success, + true, stop_early && skip_if_stop_early, Json(&nresult), None, @@ -1141,7 +1168,7 @@ pub async fn update_flow_status_after_job_completion_internal( add_completed_job( db, &flow_job, - success, + false, stop_early && skip_if_stop_early, Json( &serde_json::from_str::(nresult.get()).unwrap_or_else( @@ -1240,12 +1267,12 @@ async fn set_success_in_flow_job_success<'c>( if let Some(position) = position { sqlx::query!( "UPDATE v2_job_status SET - flow_status = JSONB_SET( - flow_status, - ARRAY['modules', $1::TEXT, 'flow_jobs_success', $3::TEXT], - $4 - ) - WHERE id = $2", + flow_status = JSONB_SET( + flow_status, + ARRAY['modules', $1::TEXT, 'flow_jobs_success', $3::TEXT], + $4 + ) + WHERE id = $2", old_status.step as i32, flow, position as i32, @@ -1268,8 +1295,8 @@ async fn retrieve_flow_jobs_results( ) -> error::Result> { let results = sqlx::query!( "SELECT result, id - FROM v2_job_completed - WHERE id = ANY($1) AND workspace_id = $2", + FROM v2_job_completed + WHERE id = ANY($1) AND workspace_id = $2", job_uuids.as_slice(), w_id ) @@ -1287,7 +1314,6 @@ async fn retrieve_flow_jobs_results( .ok_or_else(|| Error::internal_err(format!("missing job result for {}", j))) }) .collect::, _>>()?; - tracing::debug!("Retrieved results for flow jobs {:?}", results); Ok(to_raw_value(&results)) } @@ -1659,24 +1685,24 @@ async fn push_next_flow_job( .await?; if no_flow_overlap { let overlapping = sqlx::query_scalar!( - // Query plan: - // - use of the `ix_v2_job_root_by_path` index; hence the `parent_job IS NULL` - // clause. - // - select from `v2_job` first, then join with `v2_job_queue` to avoid a full - // table scan on `running = true`. - "SELECT id - FROM v2_job j JOIN v2_job_queue USING (id) - WHERE j.workspace_id = $2 AND trigger_kind = 'schedule' AND trigger = $1 AND runnable_path = $4 - AND parent_job IS NULL - AND j.id != $3 - AND running = true", - schedule_path.as_ref().unwrap(), - flow_job.workspace_id.as_str(), - flow_job.id, - flow_job.runnable_path() - ) - .fetch_all(db) - .await?; + // Query plan: + // - use of the `ix_v2_job_root_by_path` index; hence the `parent_job IS NULL` + // clause. + // - select from `v2_job` first, then join with `v2_job_queue` to avoid a full + // table scan on `running = true`. + "SELECT id + FROM v2_job j JOIN v2_job_queue USING (id) + WHERE j.workspace_id = $2 AND trigger_kind = 'schedule' AND trigger = $1 AND runnable_path = $4 + AND parent_job IS NULL + AND j.id != $3 + AND running = true", + schedule_path.as_ref().unwrap(), + flow_job.workspace_id.as_str(), + flow_job.id, + flow_job.runnable_path() + ) + .fetch_all(db) + .await?; if overlapping.len() > 0 { let overlapping_str = overlapping .iter() @@ -1684,24 +1710,24 @@ async fn push_next_flow_job( .collect::>() .join(", "); job_completed_tx - .send(SendResult::UpdateFlow { - flow: flow_job.id, - success: true, - result: serde_json::from_str( - &format!("\"not allowed to overlap with {overlapping_str}, scheduling next iteration\""), - ) - .unwrap(), - stop_early_override: Some(true), - w_id: flow_job.workspace_id.clone(), - worker_dir: worker_dir.to_string(), - token: client.token.clone(), - }) - .await - .map_err(|e| { - Error::internal_err(format!( - "error sending update flow message to job completed channel: {e:#}" - )) - })?; + .send(SendResult::UpdateFlow { + flow: flow_job.id, + success: true, + result: serde_json::from_str( + &format!("\"not allowed to overlap with {overlapping_str}, scheduling next iteration\""), + ) + .unwrap(), + stop_early_override: Some(true), + w_id: flow_job.workspace_id.clone(), + worker_dir: worker_dir.to_string(), + token: client.token.clone(), + }) + .await + .map_err(|e| { + Error::internal_err(format!( + "error sending update flow message to job completed channel: {e:#}" + )) + })?; return Ok(None); } @@ -1793,13 +1819,13 @@ async fn push_next_flow_job( .context("lock flow in queue")?; let resumes = sqlx::query_as::<_, ResumeRow>( - "SELECT value, approver, resume_id, approved FROM resume_job WHERE job = $1 ORDER BY created_at ASC", - ) - .bind(last) - .fetch_all(&mut *tx) - .await? - .into_iter() - .collect::>(); + "SELECT value, approver, resume_id, approved FROM resume_job WHERE job = $1 ORDER BY created_at ASC", + ) + .bind(last) + .fetch_all(&mut *tx) + .await? + .into_iter() + .collect::>(); resume_messages.extend(resumes.iter().map(|r| to_raw_value(&r.value))); approvers.extend(resumes.iter().map(|r| { @@ -1829,22 +1855,22 @@ async fn push_next_flow_job( .insert("previous_result".to_string(), arc_last_job_result.clone()); let eval_result = serde_json::from_str::>( - eval_timeout( - expr.to_string(), - context, - Some(arc_flow_job_args.clone()), - None, - None, - None - ) - .await - .map_err(|e| { - Error::ExecutionErr(format!( - "Error during isolated evaluation of expression `{expr}`:\n{e:#}" - )) - })? - .get(), - ); + eval_timeout( + expr.to_string(), + context, + Some(arc_flow_job_args.clone()), + None, + None, + None + ) + .await + .map_err(|e| { + Error::ExecutionErr(format!( + "Error during isolated evaluation of expression `{expr}`:\n{e:#}" + )) + })? + .get(), + ); if eval_result.is_ok() { user_groups_required = eval_result.ok().unwrap_or(Vec::new()) } else { @@ -1863,8 +1889,8 @@ async fn push_next_flow_job( }; sqlx::query!( "UPDATE v2_job_status - SET flow_status = JSONB_SET(flow_status, ARRAY['approval_conditions'], $1) - WHERE id = $2", + SET flow_status = JSONB_SET(flow_status, ARRAY['approval_conditions'], $1) + WHERE id = $2", json!(approval_conditions), flow_job.id ) @@ -1902,42 +1928,42 @@ async fn push_next_flow_job( resume_messages.push(to_raw_value(&js)); audit_log( - &mut *tx, - &audit_author, - "jobs.suspend_resume", - ActionKind::Update, - &flow_job.workspace_id, - Some(&serde_json::json!({"approved": false, "job_id": flow_job.id, "details": "Suspend timed out without approval but can continue".to_string()}).to_string()), - None, - ) - .await?; + &mut *tx, + &audit_author, + "jobs.suspend_resume", + ActionKind::Update, + &flow_job.workspace_id, + Some(&serde_json::json!({"approved": false, "job_id": flow_job.id, "details": "Suspend timed out without approval but can continue".to_string()}).to_string()), + None, + ) + .await?; } sqlx::query!( - "UPDATE v2_job_status - SET flow_status = JSONB_SET(flow_status, ARRAY['modules', $1::TEXT, 'approvers'], $2) - WHERE id = $3", - (status.step - 1).to_string(), - json!(resumes - .into_iter() - .map(|r| Approval { - resume_id: r.resume_id as u16, - approver: r - .approver.clone() - .unwrap_or_else(|| "unknown".to_string()) - }) - .collect::>() - ), - flow_job.id - ) - .execute(&mut *tx) - .await?; + "UPDATE v2_job_status + SET flow_status = JSONB_SET(flow_status, ARRAY['modules', $1::TEXT, 'approvers'], $2) + WHERE id = $3", + (status.step - 1).to_string(), + json!(resumes + .into_iter() + .map(|r| Approval { + resume_id: r.resume_id as u16, + approver: r + .approver.clone() + .unwrap_or_else(|| "unknown".to_string()) + }) + .collect::>() + ), + flow_job.id + ) + .execute(&mut *tx) + .await?; // Remove the approval conditions from the flow status sqlx::query!( "UPDATE v2_job_status - SET flow_status = flow_status - 'approval_conditions' - WHERE id = $1", + SET flow_status = flow_status - 'approval_conditions' + WHERE id = $1", flow_job.id ) .execute(&mut *tx) @@ -1954,14 +1980,14 @@ async fn push_next_flow_job( { sqlx::query!( "WITH suspend AS ( - UPDATE v2_job_queue SET suspend = $2, suspend_until = now() + $3 - WHERE id = $4 - RETURNING id - ) UPDATE v2_job_status SET flow_status = JSONB_SET( - flow_status, - ARRAY['modules', flow_status->>'step'::TEXT], - $1 - ) WHERE id = (SELECT id FROM suspend)", + UPDATE v2_job_queue SET suspend = $2, suspend_until = now() + $3 + WHERE id = $4 + RETURNING id + ) UPDATE v2_job_status SET flow_status = JSONB_SET( + flow_status, + ARRAY['modules', flow_status->>'step'::TEXT], + $1 + ) WHERE id = (SELECT id FROM suspend)", json!(FlowStatusModule::WaitingForEvents { id: status_module.id(), count: required_events, @@ -1978,7 +2004,7 @@ async fn push_next_flow_job( sqlx::query!( "UPDATE v2_job_runtime SET ping = NULL - WHERE id = $1", + WHERE id = $1", flow_job.id, ) .execute(&mut *tx) @@ -1991,15 +2017,15 @@ async fn push_next_flow_job( } else { if is_disapproved.is_none() { audit_log( - &mut *tx, - &audit_author, - "jobs.suspend_resume", - ActionKind::Update, - &flow_job.workspace_id, - Some(&serde_json::json!({"approved": false, "job_id": flow_job.id, "details": "Suspend timed out without approval and is cancelled".to_string()}).to_string()), - None, - ) - .await?; + &mut *tx, + &audit_author, + "jobs.suspend_resume", + ActionKind::Update, + &flow_job.workspace_id, + Some(&serde_json::json!({"approved": false, "job_id": flow_job.id, "details": "Suspend timed out without approval and is cancelled".to_string()}).to_string()), + None, + ) + .await?; } tx.commit().await?; @@ -2101,22 +2127,22 @@ async fn push_next_flow_job( context.insert("previous_result".to_string(), arc_last_job_result.clone()); serde_json::from_str( - eval_timeout( - expr.to_string(), - context, - Some(arc_flow_job_args.clone()), - None, - None, - None, - ) - .await - .map_err(|e| { - Error::ExecutionErr(format!( - "Error during isolated evaluation of expression `{expr}`:\n{e:#}" - )) - })? - .get(), - ) + eval_timeout( + expr.to_string(), + context, + Some(arc_flow_job_args.clone()), + None, + None, + None, + ) + .await + .map_err(|e| { + Error::ExecutionErr(format!( + "Error during isolated evaluation of expression `{expr}`:\n{e:#}" + )) + })? + .get(), + ) } }; match json_value.and_then(|x| serde_json::from_str::(x.get())) { @@ -2165,18 +2191,18 @@ async fn push_next_flow_job( scheduled_for_o = Some(from_now(retry_in)); status.retry.failed_jobs.push(job.clone()); sqlx::query!( - "UPDATE v2_job_status - SET flow_status = JSONB_SET(JSONB_SET(flow_status, ARRAY['retry'], $1), ARRAY['modules', $3::TEXT, 'failed_retries'], $4) - WHERE id = $2", - json!(RetryStatus { fail_count, ..status.retry.clone() }), - flow_job.id, - status.step.to_string(), - json!(status.retry.failed_jobs) - ) - .execute(db) - .warn_after_seconds(2) - .await - .context("update flow retry")?; + "UPDATE v2_job_status + SET flow_status = JSONB_SET(JSONB_SET(flow_status, ARRAY['retry'], $1), ARRAY['modules', $3::TEXT, 'failed_retries'], $4) + WHERE id = $2", + json!(RetryStatus { fail_count, ..status.retry.clone() }), + flow_job.id, + status.step.to_string(), + json!(status.retry.failed_jobs) + ) + .execute(db) + .warn_after_seconds(2) + .await + .context("update flow retry")?; status_module = FlowStatusModule::WaitingForPriorSteps { id: status_module.id() }; // we get the args from the last failed job @@ -2203,8 +2229,8 @@ async fn push_next_flow_job( if module.retry.as_ref().is_some_and(|x| x.has_attempts()) { sqlx::query!( "UPDATE v2_job_status - SET flow_status = JSONB_SET(flow_status, ARRAY['retry'], $1) - WHERE id = $2", + SET flow_status = JSONB_SET(flow_status, ARRAY['retry'], $1) + WHERE id = $2", json!(RetryStatus { fail_count: 0, failed_jobs: vec![] }), flow_job.id ) @@ -2262,7 +2288,7 @@ async fn push_next_flow_job( } else if let Some(id) = get_args_from_id { let args = sqlx::query_scalar!( "SELECT args AS \"args: Json>>\" - FROM v2_job WHERE id = $1 AND workspace_id = $2", + FROM v2_job WHERE id = $1 AND workspace_id = $2", id, &flow_job.workspace_id ) @@ -2350,9 +2376,9 @@ async fn push_next_flow_job( NextFlowTransform::EmptyInnerFlows { branch_chosen } => { let raw_status = sqlx::query_scalar!( "UPDATE v2_job_status - SET flow_status = JSONB_SET(flow_status, ARRAY['modules', $1::TEXT], $2) - WHERE id = $3 - RETURNING flow_status AS \"flow_status: Json>\"", + SET flow_status = JSONB_SET(flow_status, ARRAY['modules', $1::TEXT], $2) + WHERE id = $3 + RETURNING flow_status AS \"flow_status: Json>\"", status.step.to_string(), json!(FlowStatusModule::Success { id: status_module.id(), @@ -2574,14 +2600,14 @@ async fn push_next_flow_job( .or_else(|| Some(flow_job.id)) { sqlx::query_as!( - JobPerms, - "SELECT email, username, is_admin, is_operator, groups, folders FROM job_perms WHERE job_id = $1 AND workspace_id = $2", - root_job, - flow_job.workspace_id, - ) - .fetch_optional(&mut *tx) - .await? - .map(|x| x.into()) + JobPerms, + "SELECT email, username, is_admin, is_operator, groups, folders FROM job_perms WHERE job_id = $1 AND workspace_id = $2", + root_job, + flow_job.workspace_id, + ) + .fetch_optional(&mut *tx) + .await? + .map(|x| x.into()) } else { None } @@ -2652,10 +2678,10 @@ async fn push_next_flow_job( if i as u16 >= p { sqlx::query!( "UPDATE v2_job_queue SET - suspend = $1, - suspend_until = now() + interval '14 day', - running = true - WHERE id = $2", + suspend = $1, + suspend_until = now() + interval '14 day', + running = true + WHERE id = $2", (i as u16 - p + 1) as i32, uuid, ) @@ -2672,14 +2698,14 @@ async fn push_next_flow_job( })?; sqlx::query!( - "UPDATE v2_job_status - SET flow_status = JSONB_SET(flow_status, ARRAY['cleanup_module', 'flow_jobs_to_clean'], COALESCE(flow_status->'cleanup_module'->'flow_jobs_to_clean', '[]'::jsonb) || $1) - WHERE id = $2", - uuid_singleton_json, - root_job.unwrap_or(flow_job.id) - ) - .execute(&mut *inner_tx) - .await?; + "UPDATE v2_job_status + SET flow_status = JSONB_SET(flow_status, ARRAY['cleanup_module', 'flow_jobs_to_clean'], COALESCE(flow_status->'cleanup_module'->'flow_jobs_to_clean', '[]'::jsonb) || $1) + WHERE id = $2", + uuid_singleton_json, + root_job.unwrap_or(flow_job.id) + ) + .execute(&mut *inner_tx) + .await?; } tx = inner_tx; @@ -2698,7 +2724,7 @@ async fn push_next_flow_job( for uuid in &uuids { sqlx::query!( "INSERT INTO parallel_monitor_lock (parent_flow_id, job_id) - VALUES ($1, $2)", + VALUES ($1, $2)", flow_job.id, uuid ) @@ -2802,12 +2828,12 @@ async fn push_next_flow_job( Step::FailureStep => { sqlx::query!( "UPDATE v2_job_status SET - flow_status = JSONB_SET( - JSONB_SET(flow_status, ARRAY['failure_module'], $1), - ARRAY['step'], - $2 - ) - WHERE id = $3", + flow_status = JSONB_SET( + JSONB_SET(flow_status, ARRAY['failure_module'], $1), + ARRAY['step'], + $2 + ) + WHERE id = $3", json!(FlowStatusModuleWParent { parent_module: Some(current_id.clone()), module_status: new_status @@ -2821,12 +2847,12 @@ async fn push_next_flow_job( Step::PreprocessorStep => { sqlx::query!( "UPDATE v2_job_status SET - flow_status = JSONB_SET( - JSONB_SET(flow_status, ARRAY['preprocessor_module'], $1), - ARRAY['step'], - $2 - ) - WHERE id = $3", + flow_status = JSONB_SET( + JSONB_SET(flow_status, ARRAY['preprocessor_module'], $1), + ARRAY['step'], + $2 + ) + WHERE id = $3", json!(new_status), json!(-1), flow_job.id @@ -2837,12 +2863,12 @@ async fn push_next_flow_job( Step::Step(i) => { sqlx::query!( "UPDATE v2_job_status SET - flow_status = JSONB_SET( - JSONB_SET(flow_status, ARRAY['modules', $1::TEXT], $2), - ARRAY['step'], - $3 - ) - WHERE id = $4", + flow_status = JSONB_SET( + JSONB_SET(flow_status, ARRAY['modules', $1::TEXT], $2), + ARRAY['step'], + $3 + ) + WHERE id = $4", i as i32, json!(new_status), json!(i), @@ -2865,8 +2891,8 @@ async fn push_next_flow_job( if continue_on_same_worker { if !is_one_uuid { return Err(Error::BadRequest( - "Cannot continue on same worker with multiple jobs, parallel cannot be used in conjunction with same_worker".to_string(), - )); + "Cannot continue on same worker with multiple jobs, parallel cannot be used in conjunction with same_worker".to_string(), + )); } } tx.commit().warn_after_seconds(3).await?; @@ -3717,11 +3743,11 @@ async fn next_forloop_status( itered.clone() }; let (index, next) = index - .checked_add(1) - .and_then(|i| itered_new.get(i).map(|next| (i, next))) - .with_context(|| { - format!("Could not find iteration number {index} restarting inside the for-loop flow. It's possible the itered-array has changed and this value isn't available anymore.") - })?; + .checked_add(1) + .and_then(|i| itered_new.get(i).map(|next| (i, next))) + .with_context(|| { + format!("Could not find iteration number {index} restarting inside the for-loop flow. It's possible the itered-array has changed and this value isn't available anymore.") + })?; ForLoopStatus::NextIteration(ForloopNextIteration { index, @@ -4021,7 +4047,7 @@ async fn get_previous_job_result( Some(FlowStatusModule::Success { job, .. }) => Ok(Some( sqlx::query_scalar!( "SELECT result AS \"result!: Json>\" - FROM v2_job_completed WHERE id = $1 AND workspace_id = $2", + FROM v2_job_completed WHERE id = $1 AND workspace_id = $2", job, w_id ) diff --git a/frontend/src/lib/components/flows/content/FlowModuleEarlyStop.svelte b/frontend/src/lib/components/flows/content/FlowModuleEarlyStop.svelte index 335b553bfa..845e8d877b 100644 --- a/frontend/src/lib/components/flows/content/FlowModuleEarlyStop.svelte +++ b/frontend/src/lib/components/flows/content/FlowModuleEarlyStop.svelte @@ -37,7 +37,8 @@ } return null } - + let raise_error_message_stop_after_all_if = flowModule.stop_after_all_iters_if?.error_message !== undefined + let raise_error_message_stop_after_if = flowModule.stop_after_if?.error_message !== undefined $: isLoop = flowModule.value.type === 'forloopflow' || flowModule.value.type === 'whileloopflow' $: isBranchAll = flowModule.value.type === 'branchall' $: isStopAfterIfEnabled = Boolean(flowModule.stop_after_if) @@ -71,7 +72,8 @@ } else { flowModule.stop_after_if = { expr: 'result == undefined', - skip_if_stopped: false + skip_if_stopped: false, + error_message: undefined } } }} @@ -80,12 +82,12 @@ ? 'Break loop' : parentLoopId ? 'Break parent loop module' - : 'Stop flow' + ' if condition met' + : 'Stop flow if condition met' }} />
@@ -98,12 +100,35 @@ : undefined : result} {#if !parentLoopId && !isLoop} - + + { + if (flowModule.stop_after_if) { + flowModule.stop_after_if.error_message = event.detail === false ? undefined : '' + } + }} + options={{ + right: 'Raise an error message if stopped', + rightTooltip: + 'If enabled and the stop condition is met, an error message will be raised. A custom message can be provided; otherwise, a default message will be used.' + }} + /> +
+ {/if} + {#if raise_error_message_stop_after_if} + {/if} Stop condition expression @@ -132,13 +157,20 @@
{:else} {#if !parentLoopId && !isLoop} - +
+ + +
{/if} Stop condition expression @@ -170,7 +202,8 @@ } else { flowModule.stop_after_all_iters_if = { expr: 'result == undefined', - skip_if_stopped: false + skip_if_stopped: false, + error_message: undefined } } }} @@ -180,18 +213,41 @@ />
{#if flowModule.stop_after_all_iters_if} {#if !parentLoopId} - + + { + if (flowModule.stop_after_all_iters_if) { + flowModule.stop_after_all_iters_if.error_message = event.detail === false ? undefined : '' + } + }} + options={{ + right: 'Raise an error message if stopped', + rightTooltip: + 'If enabled and the stop condition is met, an error message will be raised. A custom message can be provided; otherwise, a default message will be used.' + }} + /> +
+ {/if} + {#if raise_error_message_stop_after_all_if} + {/if} Stop condition expression @@ -218,13 +274,22 @@
{:else} {#if !parentLoopId} - +
+ + +
{/if} Stop condition expression diff --git a/frontend/src/lib/components/flows/content/FlowModuleSkip.svelte b/frontend/src/lib/components/flows/content/FlowModuleSkip.svelte index 614ebb4e6b..b87f270df0 100644 --- a/frontend/src/lib/components/flows/content/FlowModuleSkip.svelte +++ b/frontend/src/lib/components/flows/content/FlowModuleSkip.svelte @@ -55,7 +55,7 @@ }} /> -
+
{#if flowModule.skip_if} Skip condition expression
diff --git a/openflow.openapi.yaml b/openflow.openapi.yaml index 1ba95be9f5..660fe3933c 100644 --- a/openflow.openapi.yaml +++ b/openflow.openapi.yaml @@ -89,6 +89,18 @@ components: minimum: 0 maximum: 100 + StopAfterIf: + type: object + properties: + skip_if_stopped: + type: boolean + expr: + type: string + error_message: + type: string + required: + - expr + FlowModule: type: object properties: @@ -97,23 +109,9 @@ components: value: $ref: "#/components/schemas/FlowModuleValue" stop_after_if: - type: object - properties: - skip_if_stopped: - type: boolean - expr: - type: string - required: - - expr + $ref: "#/components/schemas/StopAfterIf" stop_after_all_iters_if: - type: object - properties: - skip_if_stopped: - type: boolean - expr: - type: string - required: - - expr + $ref: "#/components/schemas/StopAfterIf" skip_if: type: object properties: From 5589135cb0adb20bcd20f2f5c258fe71b4945006 Mon Sep 17 00:00:00 2001 From: Alexander Petric Date: Wed, 7 May 2025 17:42:05 -0400 Subject: [PATCH 352/739] teams improvements if there are a large number of connected teams (#5694) * teams improvements if there are a large number of connected teams / channels * move sync to backend * formatting * update ee ref --- backend/ee-repo-ref.txt | 2 +- .../src/lib/components/ChannelSelector.svelte | 86 ++++++++++++ .../lib/components/ConnectionSection.svelte | 123 ++++++++--------- .../components/ErrorOrRecoveryHandler.svelte | 57 ++++---- .../src/lib/components/InstanceSetting.svelte | 94 +++++++------ .../src/lib/components/TeamSelector.svelte | 127 ++++++++++++++++++ 6 files changed, 344 insertions(+), 145 deletions(-) create mode 100644 frontend/src/lib/components/ChannelSelector.svelte create mode 100644 frontend/src/lib/components/TeamSelector.svelte diff --git a/backend/ee-repo-ref.txt b/backend/ee-repo-ref.txt index 8e0364f544..4ba6ebd5b8 100644 --- a/backend/ee-repo-ref.txt +++ b/backend/ee-repo-ref.txt @@ -1 +1 @@ -868ccad87afb804fe22818ecd3d5a091199bcdbf \ No newline at end of file +19b5681d1985ee5214f768e3b818faf6ca7d20b2 diff --git a/frontend/src/lib/components/ChannelSelector.svelte b/frontend/src/lib/components/ChannelSelector.svelte new file mode 100644 index 0000000000..f7db63ddc2 --- /dev/null +++ b/frontend/src/lib/components/ChannelSelector.svelte @@ -0,0 +1,86 @@ + + +
+
+
+ - {#if !isFetching} - {#if teams.length === 0} - - {:else} - - {#each teams as team} - - {/each} - {/if} - {:else} - - {/if} - -
-
- -
+
+
+ {#if platform === 'teams'} + + + {#if $enterpriseLicense} + sendUserToast('Failed to load teams: ' + e.detail.message, true)} + /> + {/if} + {:else} + {/if} - {:else} - - {/if} - Not connected + Not connected +
{/if} diff --git a/frontend/src/lib/components/ErrorOrRecoveryHandler.svelte b/frontend/src/lib/components/ErrorOrRecoveryHandler.svelte index c423ba7c9e..472daa9d1e 100644 --- a/frontend/src/lib/components/ErrorOrRecoveryHandler.svelte +++ b/frontend/src/lib/components/ErrorOrRecoveryHandler.svelte @@ -3,6 +3,7 @@ import ScriptPicker from '$lib/components/ScriptPicker.svelte' import Toggle from '$lib/components/Toggle.svelte' import Tooltip from '$lib/components/Tooltip.svelte' + import ChannelSelector from '$lib/components/ChannelSelector.svelte' import type { Schema, SupportedLanguage } from '$lib/common' import { base } from '$lib/base' @@ -439,34 +440,40 @@ /> {#if workspaceConnectedToTeams} -
-
- +
+
+
+ +
+

Teams Channel

-

Teams Channel

-
- -
-
- + +
+ (handlerExtraArgs['channel'] = e.detail.channel_id)} + selectedChannel={handlerExtraArgs['channel'] + ? (teams_channels.find((ch) => ch.channel_id === handlerExtraArgs['channel']) as any) + : undefined} + /> +
+ +

- This workspace is connected to Team: {teams_team_name} + This workspace is connected to Team: {teams_team_name}

Each workspace can only be connected to one Microsoft Teams team. You can configure it under sendTeamsMessage(handlerExtraArgs['channel'] ?? '')} size="xs">Send test message {#if connectionTestJob.in_progress} - + {:else if connectionTestJob.is_success} {:else} diff --git a/frontend/src/lib/components/InstanceSetting.svelte b/frontend/src/lib/components/InstanceSetting.svelte index 9e619db2a4..958dcb9808 100644 --- a/frontend/src/lib/components/InstanceSetting.svelte +++ b/frontend/src/lib/components/InstanceSetting.svelte @@ -30,6 +30,8 @@ import ToggleButtonGroup from './common/toggleButton-v2/ToggleButtonGroup.svelte' import ToggleButton from './common/toggleButton-v2/ToggleButton.svelte' import SimpleEditor from './SimpleEditor.svelte' + import TeamSelector from './TeamSelector.svelte' + import ChannelSelector from './ChannelSelector.svelte' export let setting: Setting export let version: string @@ -134,9 +136,8 @@ } } - function handleTeamChange(event: Event, i: number) { - const teamId = (event.target as HTMLSelectElement).value - const team = $values['teams'].find((team) => team.team_id === teamId) || null + function handleTeamChange(teamItem: { team_id: string; team_name: string }, i: number) { + const team = $values['teams'].find((team) => team.team_id === teamItem.team_id) || null $values['critical_error_channels'][i] = { teams_channel: { team_id: team?.team_id, @@ -147,13 +148,9 @@ } } - function handleChannelChange(event: Event, setting: Setting, i: number) { - const channelId = (event.target as HTMLSelectElement).value - const team = $values['teams'].find( - (team) => team.team_id === $values['critical_error_channels'][i]?.teams_channel?.team_id - ) - const channel = team?.channels.find((channel) => channel.channel_id === channelId) || null - if (channelId) { + function handleChannelChange(channel: { channel_id: string; channel_name: string }, i: number) { + const team = $values['critical_error_channels'][i]?.teams_channel + if (team) { $values['critical_error_channels'][i] = { teams_channel: { team_id: team?.team_id, @@ -458,46 +455,45 @@ /> {:else if v && 'teams_channel' in v}
- + handleTeamChange(e.detail, i)} + selectedTeam={$values['critical_error_channels'][i]?.teams_channel + ? { + team_id: + $values['critical_error_channels'][i]?.teams_channel?.team_id, + team_name: + $values['critical_error_channels'][i]?.teams_channel?.team_name + } + : undefined} + /> + {#if $values['critical_error_channels'][i]?.teams_channel?.team_id} - + + team.team_id === + $values['critical_error_channels'][i]?.teams_channel?.team_id + )?.channels ?? []} + on:change={(e) => handleChannelChange(e.detail, i)} + selectedChannel={$values['critical_error_channels'][i]?.teams_channel + ?.channel_id + ? { + channel_id: + $values['critical_error_channels'][i]?.teams_channel + ?.channel_id, + channel_name: + $values['critical_error_channels'][i]?.teams_channel + ?.channel_name + } + : undefined} + /> {/if}
+ ``` + + - Use `$derived` for computed values based on other reactive state. + + ```svelte + + +

{count} * 2 = {doubled}

+ ``` + + - Use `$effect` for side effects that need to run when reactive values change (e.g., logging, manual DOM manipulation, data fetching). Remember `$effect` does not run on the server. + + ```svelte + + ``` + +2. **Props with `$props`**: + + - Declare component props using `$props()`. This offers better clarity and flexibility compared to `export let`. + + ```svelte + + +

Name: {name}

+

Age: {age}

+ ``` + + - For bindable props, use `$bindable`. + + ```svelte + + + + ``` + +## Event Handling + +- **Use direct event attributes**: Svelte 5 moves away from `on:` directives for DOM events. + - **Do**: `` + - **Don't**: `` +- **For component events, prefer callback props**: Instead of `createEventDispatcher`, pass functions as props. + + ```svelte + + + +

Message from child: {message}

+ + + + + ``` + +## Snippets for Content Projection + +- **Use `{#snippet ...}` and `{@render ...}` instead of slots**: Snippets are more powerful and flexible. + + ```svelte + + + + + {#snippet title()} + My Awesome Title + {/snippet} + {#snippet content()} +

Some interesting content here.

+ {/snippet} +
+ + + + +
+
{@render title()}
+
{@render content()}
+
+ ``` + +- Default content is passed via the `children` prop (which is a snippet). + ```svelte + + +
+ {@render children?.()} +
+ ``` + +## Component Design + +1. **Create Small, Reusable Components**: Break down complex UIs into smaller, focused components. Each component should have a single responsibility. This also aids performance by limiting the scope of reactivity updates. +2. **Descriptive Naming**: Use clear and descriptive names for variables, functions, and components. +3. **Minimize Logic in Components**: Move complex business logic to utility functions or services. Keep components focused on presentation and interaction. + +## State Management (Stores) + +1. **Segment Stores**: Avoid a single global store. Create multiple stores, each responsible for a specific piece of global state (e.g., `userStore.js`, `themeStore.js`). This can help limit reactivity updates to only the parts of the UI that depend on specific state segments. +2. **Use Custom Stores for Complex Logic**: For stores with related methods, create custom stores. + + ```javascript + // counterStore.js + import { writable } from 'svelte/store' + + function createCounter() { + const { subscribe, set, update } = writable(0) + + return { + subscribe, + increment: () => update((n) => n + 1), + decrement: () => update((n) => n - 1), + reset: () => set(0) + } + } + export const counter = createCounter() + ``` + +3. **Use Context API for Localized State**: For state shared within a component subtree, consider Svelte's context API (`setContext`, `getContext`) instead of global stores when the state doesn't need to be truly global. + +## Performance Optimizations (Svelte 5) + +When generating Svelte 5 code, prioritize frontend performance by applying the following principles: + +### General Svelte 5 Principles + +- **Leverage the Compiler:** Trust Svelte's compiler to generate optimized JavaScript. Avoid manual DOM manipulation (`document.querySelector`, etc.) unless absolutely necessary for integrating third-party libraries that lack Svelte adapters. +- **Keep Components Small and Focused:** Reinforcing from Component Design, smaller components lead to less complex reactivity graphs and more targeted, efficient updates. + +### Reactivity & State Management + +- **Optimize Computations with `$derived`:** Always use `$derived` for computed values that depend on other state. This ensures the computation only runs when its specific dependencies change, avoiding unnecessary work compared to recomputing derived values in `$effect` or less efficient methods. +- **Minimize `$effect` Usage:** Use `$effect` sparingly and only for true side effects that interact with the outside world or non-Svelte state. Avoid putting complex logic or state updates _within_ an `$effect` unless those updates are explicitly intended as a reaction to external changes or non-Svelte state. Excessive or complex effects can impact rendering performance. +- **Structure State for Fine-Grained Updates:** Design your `$state` objects or variables such that updates affect only the necessary parts of the UI. Avoid putting too much unrelated state into a single large object that gets frequently updated, as this can potentially trigger broader updates than necessary. Consider normalizing complex, nested state. + +### List Rendering (`{#each}`) + +- **Mandate `key` Attribute:** Always use a `key` attribute (`{#each items as item (item.id)}`) that refers to a unique, stable identifier for each item in a list. This is critical for allowing Svelte to efficiently update, reorder, add, or remove list items without destroying and re-creating unnecessary DOM elements and component instances. + +### Component Loading & Bundling + +- **Implement Lazy Loading/Code Splitting:** For routes, components, or modules that are not immediately needed on page load, use dynamic imports (`import(...)`) to split the code bundle. SvelteKit handles this automatically for routes, but it can be applied manually to components using helper patterns if needed. +- **Be Mindful of Third-Party Libraries:** When incorporating external libraries, import only the necessary functions or components to minimize the final bundle size. Prefer libraries designed to be tree-shakeable. + +### Rendering & DOM + +- **Use CSS for Animations/Transitions:** Prefer CSS animations or transitions where possible for performance. Svelte's built-in `transition:` directive is also highly optimized and should be used for complex state-driven transitions, but simple cases can often use plain CSS. +- **Optimize Image Loading:** Implement best practices for images: use optimized formats (WebP, AVIF), lazy loading (`loading="lazy"`), and responsive images (``, `srcset`) to avoid loading unnecessarily large images. + +### Server-Side Rendering (SSR) & Hydration + +- **Ensure SSR Compatibility:** Write components that can be rendered on the server for faster initial page loads. Avoid relying on browser-specific APIs (like `window` or `document`) in the main ` + +
+ Hello +
+ ``` + +5. **Stay Updated**: Keep Svelte and its related packages up to date to benefit from the latest features, performance improvements, and security fixes. From 5d5286d6279e2f7f01f68bc555887316d6fa1332 Mon Sep 17 00:00:00 2001 From: wendrul <53628737+wendrul@users.noreply.github.com> Date: Tue, 20 May 2025 14:25:10 +0200 Subject: [PATCH 432/739] Add missing trigger pages to quick access menu (Ctrl + K) (#5780) * Add extra menu items on ctrl+k for other triggers * Fix run search container It used to be truncated when showing the ee message --- .../search/GlobalSearchModal.svelte | 148 +++++++++++++++--- 1 file changed, 123 insertions(+), 25 deletions(-) diff --git a/frontend/src/lib/components/search/GlobalSearchModal.svelte b/frontend/src/lib/components/search/GlobalSearchModal.svelte index 9ca20adbe4..271389b007 100644 --- a/frontend/src/lib/components/search/GlobalSearchModal.svelte +++ b/frontend/src/lib/components/search/GlobalSearchModal.svelte @@ -18,13 +18,16 @@ BoxesIcon, CalendarIcon, Code2Icon, + Database, DollarSignIcon, HomeIcon, LayoutDashboardIcon, Loader2, PlayIcon, + Route, Search, - SearchCode + SearchCode, + Unplug } from 'lucide-svelte' import JobPreview from '../runs/JobPreview.svelte' import Portal from '$lib/components/Portal.svelte' @@ -33,13 +36,14 @@ import ContentSearchInner from '../ContentSearchInner.svelte' import { goto } from '$app/navigation' import QuickMenuItem from '../search/QuickMenuItem.svelte' - import { devopsRole, enterpriseLicense, workspaceStore } from '$lib/stores' + import { devopsRole, enterpriseLicense, userStore, workspaceStore } from '$lib/stores' import uFuzzy from '@leeoniya/ufuzzy' import BarsStaggered from '../icons/BarsStaggered.svelte' import { scroll_into_view_if_needed_polyfill } from '../multiselect/utils' import { Alert } from '../common' import Popover from '../Popover.svelte' import Logs from 'lucide-svelte/icons/logs' + import { AwsIcon, GoogleCloudIcon, KafkaIcon, MqttIcon, NatsIcon } from '../icons' let open: boolean = false @@ -63,43 +67,122 @@ action: () => void icon?: any shortcutKey?: string + disabled?: boolean } let switchModeItems: quickMenuItem[] = [ { search_id: 'switchto:run-search', - label: 'Search across completed runs', + label: 'Search across completed runs' + ($enterpriseLicense ? '' : ' (EE)'), action: () => switchMode('runs'), shortcutKey: RUNS_PREFIX, - icon: Search + icon: Search, + disabled: false }, { search_id: 'switchto:content-search', label: 'Search scripts/flows/apps based on content', action: () => switchMode('content'), shortcutKey: CONTENT_SEARCH_PREFIX, - icon: SearchCode + icon: SearchCode, + disabled: false } ] + + // These items are searchable but do not appear initially on the menu. + let hiddenMenuItems = [ + { + search_id: 'nav:http_routes', + label: 'Go to HTTP routes', + action: () => gotoPage('/routes'), + icon: Route, + disabled: $userStore?.operator + }, + { + search_id: 'nav:web_sockets', + label: 'Go to WebSockets', + action: () => gotoPage('/websocket_triggers'), + icon: Unplug, + disabled: $userStore?.operator + }, + { + search_id: 'nav:postgres_triggers', + label: 'Go to Postgres triggers', + action: () => gotoPage('/postgres_triggers'), + icon: Database, + disabled: $userStore?.operator + }, + { + search_id: 'nav:kafka_triggers', + label: 'Go to Kafka triggers' + ($enterpriseLicense ? '' : ' (EE)'), + action: () => gotoPage('/kafka_triggers'), + icon: KafkaIcon, + disabled: $userStore?.operator + }, + { + search_id: 'nav:nats_triggers', + label: 'Go to NATS triggers' + ($enterpriseLicense ? '' : ' (EE)'), + action: () => gotoPage('/nats_triggers'), + icon: NatsIcon, + disabled: $userStore?.operator + }, + { + search_id: 'nav:sqs_triggers', + label: 'Go to SQS triggers' + ($enterpriseLicense ? '' : ' (EE)'), + action: () => gotoPage('/sqs_triggers'), + icon: AwsIcon, + disabled: $userStore?.operator + }, + { + search_id: 'nav:gcp_pub_sub', + label: 'Go to GCP Pub/Sub' + ($enterpriseLicense ? '' : ' (EE)'), + action: () => gotoPage('/gcp_triggers'), + icon: GoogleCloudIcon, + disabled: $userStore?.operator + }, + { + search_id: 'nav:mqtt_triggers', + label: 'Go to MQTT triggers', + action: () => gotoPage('/mqtt_triggers'), + icon: MqttIcon, + disabled: $userStore?.operator + } + ] + let defaultMenuItems: quickMenuItem[] = [ - { search_id: 'nav:home', label: 'Go to Home', action: () => gotoPage('/'), icon: HomeIcon }, - { search_id: 'nav:runs', label: 'Go to Runs', action: () => gotoPage('/runs'), icon: PlayIcon }, + { + search_id: 'nav:home', + label: 'Go to Home', + action: () => gotoPage('/'), + icon: HomeIcon, + disabled: false + }, + { + search_id: 'nav:runs', + label: 'Go to Runs', + action: () => gotoPage('/runs'), + icon: PlayIcon, + disabled: false + }, { search_id: 'nav:variables', label: 'Go to Variables', action: () => gotoPage('/variables'), - icon: DollarSignIcon + icon: DollarSignIcon, + disabled: false }, { search_id: 'nav:resources', label: 'Go to Resources', action: () => gotoPage('/resources'), - icon: BoxesIcon + icon: BoxesIcon, + disabled: false }, { - search_id: 'nav:schedules', + search_id: 'nav:schedules_triggers', label: 'Go to Schedules', action: () => gotoPage('/schedules'), - icon: CalendarIcon + icon: CalendarIcon, + disabled: false }, ...switchModeItems, { @@ -107,10 +190,13 @@ label: 'Explore windmill service logs', action: () => gotoPage('/service_logs'), shortcutKey: LOGS_PREFIX, - icon: Logs + icon: Logs, + disabled: !$devopsRole } ] + let defaultMenuItemsWithHidden = [...defaultMenuItems, ...hiddenMenuItems] + let itemMap = { default: defaultMenuItems as any[], 'switch-mode': switchModeItems, @@ -152,6 +238,7 @@ let uf = new uFuzzy(opts) let defaultMenuItemLabels = defaultMenuItems.map((item) => item.label) + let defaultMenuItemAndHiddenLabels = defaultMenuItemsWithHidden.map((item) => item.label) let switchModeItemLabels = switchModeItems.map((item) => item.label) function fuzzyFilter(filter: string, items: any[], itemsPlainText: string[]) { @@ -210,7 +297,14 @@ } if (tab === 'default') { - itemMap['default'] = fuzzyFilter(searchTerm, defaultMenuItems, defaultMenuItemLabels) + if (searchTerm === '') + itemMap['default'] = fuzzyFilter(searchTerm, defaultMenuItems, defaultMenuItemLabels) + else + itemMap['default'] = fuzzyFilter( + searchTerm, + defaultMenuItemsWithHidden, + defaultMenuItemAndHiddenLabels + ) if (combinedItems) { itemMap['default'] = itemMap['default'].concat( fuzzyFilter( @@ -552,20 +646,24 @@
{#if tab === 'default' || tab === 'switch-mode'} - {@const items = (itemMap[tab] ?? []).filter((e) => defaultMenuItems.includes(e))} + {@const items = (itemMap[tab] ?? []).filter((e) => + defaultMenuItemsWithHidden.includes(e) + )} {#if items.length > 0}
{#each items as el} - (selectedItem = el)} - id={el?.search_id} - hovered={el?.search_id === selectedItem?.search_id} - label={el?.label} - icon={el?.icon} - shortcutKey={el?.shortcutKey} - bind:mouseMoved - /> + {#if !el.disabled} + (selectedItem = el)} + id={el?.search_id} + hovered={el?.search_id === selectedItem?.search_id} + label={el?.label} + icon={el?.icon} + shortcutKey={el?.shortcutKey} + bind:mouseMoved + /> + {/if} {/each}
{/if} @@ -718,7 +816,7 @@
{:else} -
+
{#if searchTerm === RUNS_PREFIX}
Enter your search terms
From 72c91ff17b2c01cb7a1512d074895ee85a7c9b41 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Tue, 20 May 2025 15:00:12 +0200 Subject: [PATCH 433/739] nit runs page filter reset --- .../src/lib/components/runs/RunsFilter.svelte | 20 +++---------------- .../(logged)/runs/[...path]/+page.svelte | 1 + 2 files changed, 4 insertions(+), 17 deletions(-) diff --git a/frontend/src/lib/components/runs/RunsFilter.svelte b/frontend/src/lib/components/runs/RunsFilter.svelte index 65860ccc53..9fa88a6c22 100644 --- a/frontend/src/lib/components/runs/RunsFilter.svelte +++ b/frontend/src/lib/components/runs/RunsFilter.svelte @@ -74,35 +74,25 @@ const dispatch = createEventDispatcher() - let autoSet = false - $: (path || user || folder || label || worker || concurrencyKey || tag || schedulePath) && autosetFilter() function autosetFilter() { if (path !== null && path !== '' && filterBy !== 'path') { - autoSet = true filterBy = 'path' } else if (user !== null && user !== '' && filterBy !== 'user') { - autoSet = true filterBy = 'user' } else if (folder !== null && folder !== '' && filterBy !== 'folder') { - autoSet = true filterBy = 'folder' } else if (label !== null && label !== '' && filterBy !== 'label') { - autoSet = true filterBy = 'label' } else if (concurrencyKey !== null && concurrencyKey !== '' && filterBy !== 'concurrencyKey') { - autoSet = true filterBy = 'concurrencyKey' } else if (tag !== null && tag !== '' && filterBy !== 'tag') { - autoSet = true filterBy = 'tag' } else if (schedulePath !== undefined && schedulePath !== '' && filterBy !== 'schedulePath') { - autoSet = true filterBy = 'schedulePath' } else if (worker !== null && worker !== '' && filterBy !== 'worker') { - autoSet = true filterBy = 'worker' } } @@ -136,8 +126,8 @@ Filter by { - if (!autoSet) { + on:selected={(e) => { + if (e.detail != filterBy) { path = null user = null folder = null @@ -145,8 +135,6 @@ concurrencyKey = null tag = null schedulePath = undefined - } else { - autoSet = false } }} let:item @@ -593,7 +581,7 @@ let:item bind:selected={filterBy} on:selected={() => { - if (!autoSet) { + if (e.detail != filterBy) { path = null user = null folder = null @@ -601,8 +589,6 @@ concurrencyKey = null tag = null schedulePath = undefined - } else { - autoSet = false } }} > diff --git a/frontend/src/routes/(root)/(logged)/runs/[...path]/+page.svelte b/frontend/src/routes/(root)/(logged)/runs/[...path]/+page.svelte index 4f57d3d1ed..291ed588fd 100644 --- a/frontend/src/routes/(root)/(logged)/runs/[...path]/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/runs/[...path]/+page.svelte @@ -371,6 +371,7 @@ lastFetchWentToEnd = false selectedManualDate = 0 selectedIds = [] + schedulePath = undefined batchReRunOptions = { flow: {}, script: {} } selectionMode = false selectedWorkspace = undefined From 70e52a5cf943d6c96bad71e75b9e7c23841d173c Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Tue, 20 May 2025 16:14:59 +0200 Subject: [PATCH 434/739] nit --- frontend/src/lib/components/runs/RunsFilter.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/lib/components/runs/RunsFilter.svelte b/frontend/src/lib/components/runs/RunsFilter.svelte index 9fa88a6c22..844eca559a 100644 --- a/frontend/src/lib/components/runs/RunsFilter.svelte +++ b/frontend/src/lib/components/runs/RunsFilter.svelte @@ -580,7 +580,7 @@ { + on:selected={(e) => { if (e.detail != filterBy) { path = null user = null From 3bd36b8096ce289a0b3c9c4b02f88ce17d880691 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Wed, 21 May 2025 00:31:48 +0200 Subject: [PATCH 435/739] monaco fix --- frontend/src/lib/components/Editor.svelte | 6 +++++- frontend/src/lib/components/InputTransformForm.svelte | 4 +--- frontend/src/lib/components/SimpleEditor.svelte | 6 ++++++ 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/frontend/src/lib/components/Editor.svelte b/frontend/src/lib/components/Editor.svelte index 5b3f48aa0a..35c4576251 100644 --- a/frontend/src/lib/components/Editor.svelte +++ b/frontend/src/lib/components/Editor.svelte @@ -217,7 +217,6 @@ console.log('uri', uri) - function computeUri(filePath: string, scriptLang: string | undefined) { let file if (filePath.includes('.')) { @@ -265,7 +264,11 @@ } } + let valueAfterDispose: string | undefined = undefined export function getCode(): string { + if (valueAfterDispose != undefined) { + return valueAfterDispose + } return editor?.getValue() ?? '' } @@ -1489,6 +1492,7 @@ onDestroy(() => { console.log('destroying editor') + valueAfterDispose = getCode() destroyed = true disposeMethod && disposeMethod() websocketInterval && clearInterval(websocketInterval) diff --git a/frontend/src/lib/components/InputTransformForm.svelte b/frontend/src/lib/components/InputTransformForm.svelte index 3154e66c63..aa66e1d88b 100644 --- a/frontend/src/lib/components/InputTransformForm.svelte +++ b/frontend/src/lib/components/InputTransformForm.svelte @@ -573,9 +573,6 @@ { - dispatch('change', { argName, arg }) - }} {extraLib} lang="javascript" shouldBindKey={false} @@ -595,6 +592,7 @@ autoHeight loadAsync /> +
{#if !hideHelpButton} diff --git a/frontend/src/lib/components/SimpleEditor.svelte b/frontend/src/lib/components/SimpleEditor.svelte index b4947f7ab4..3cc814b855 100644 --- a/frontend/src/lib/components/SimpleEditor.svelte +++ b/frontend/src/lib/components/SimpleEditor.svelte @@ -79,6 +79,7 @@ let placeholderVisible = $state(false) let mounted = $state(false) + let valueAfterDispose: string | undefined = undefined let { lang, code = $bindable(), @@ -130,6 +131,9 @@ const uri = `file:///${hash}.${langToExt(lang)}` export function getCode(): string { + if (valueAfterDispose != undefined) { + return valueAfterDispose + } return editor?.getValue() ?? '' } @@ -406,6 +410,7 @@ editor.onDidBlurEditorText(() => { dispatch('blur') + code = getCode() }) @@ -535,6 +540,7 @@ onDestroy(() => { try { + valueAfterDispose = getCode() vimDisposable?.dispose() model && model.dispose() editor && editor.dispose() From c0d18eac0f3f90ba41064b1949017cf9b34e6a7e Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Wed, 21 May 2025 00:36:28 +0200 Subject: [PATCH 436/739] template editor nit --- frontend/src/lib/components/TemplateEditor.svelte | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/frontend/src/lib/components/TemplateEditor.svelte b/frontend/src/lib/components/TemplateEditor.svelte index 1d67ef9e6e..941c72fc74 100644 --- a/frontend/src/lib/components/TemplateEditor.svelte +++ b/frontend/src/lib/components/TemplateEditor.svelte @@ -399,7 +399,11 @@ } } + let valueAfterDispose: string | undefined = undefined export function getCode(): string { + if (valueAfterDispose != undefined) { + return valueAfterDispose + } return editor?.getValue() ?? '' } @@ -622,6 +626,7 @@ onDestroy(() => { try { + valueAfterDispose = getCode() jsLoader && clearTimeout(jsLoader) model && model.dispose() editor && editor.dispose() From f837dade92d6ea09b12baa7112803528f4b4a25a Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Wed, 21 May 2025 11:45:51 +0200 Subject: [PATCH 437/739] whitelabel licenses --- .../src/lib/components/CenteredModal.svelte | 9 +++----- frontend/src/lib/stores.ts | 6 ++++++ .../src/routes/(root)/(logged)/+layout.svelte | 21 ++++++++++++++----- .../(logged)/user/(user)/login/+page.svelte | 10 +++++++-- 4 files changed, 33 insertions(+), 13 deletions(-) diff --git a/frontend/src/lib/components/CenteredModal.svelte b/frontend/src/lib/components/CenteredModal.svelte index 3548a20a8f..4380177888 100644 --- a/frontend/src/lib/components/CenteredModal.svelte +++ b/frontend/src/lib/components/CenteredModal.svelte @@ -1,20 +1,17 @@
- {#if (!disableLogo && !$enterpriseLicense) || !$enterpriseLicense?.endsWith('_whitelabel')} + {#if (!disableLogo && !$enterpriseLicense) || !$whitelabelNameStore} - @@ -258,12 +266,13 @@ invalidRelations(appendedRelations, { showError: true, trackSchemaTableError: false - }) === false + }) === '' ) { relations = appendedRelations } } }} + {disabled} >
diff --git a/frontend/src/lib/components/triggers/postgres/utils.ts b/frontend/src/lib/components/triggers/postgres/utils.ts index 6b4e3e91b5..8122da726d 100644 --- a/frontend/src/lib/components/triggers/postgres/utils.ts +++ b/frontend/src/lib/components/triggers/postgres/utils.ts @@ -1,6 +1,8 @@ -import type { Relations } from '$lib/gen' +import { PostgresTriggerService, type Relations } from '$lib/gen' import { sendUserToast } from '$lib/toast' import { emptyString } from '$lib/utils' +import type { Writable } from 'svelte/store' +import { get } from 'svelte/store' type RelationError = { schemaIndex: number @@ -18,7 +20,9 @@ export function invalidRelations( trackSchemaTableError?: boolean showError?: boolean } -): boolean { +): string { + let errorMessage: string = '' + let error: RelationError = { schemaIndex: -1, tableIndex: -1, @@ -82,8 +86,6 @@ export function invalidRelations( error.trackAllTablesInSchema && error.trackSpecificColumnsInTable) if ((options?.showError ?? false) && errorFound) { - let errorMessage: string = '' - if (error.schemaError) { errorMessage = `Schema Error: Please enter a name for schema number ${error.schemaIndex}` } else if (error.tableError) { @@ -95,8 +97,53 @@ export function invalidRelations( errorMessage = 'Configuration Error: Schema-level tracking and specific table tracking with column selection cannot be used together. Refer to the documentation for valid configurations.' } - sendUserToast(errorMessage, true) } - return errorFound + return errorMessage +} + +export async function savePostgresTriggerFromCfg( + initialPath: string, + config: Record, + edit: boolean, + workspace: string, + usedTriggerKinds: Writable +): Promise { + try { + const requestBody = { + path: config.path, + script_path: config.script_path, + is_flow: config.is_flow, + postgres_resource_path: config.postgres_resource_path, + replication_slot_name: config.replication_slot_name, + publication_name: config.publication_name, + publication: config.publication, + enabled: config.enabled + } + if (edit) { + await PostgresTriggerService.updatePostgresTrigger({ + workspace: workspace, + path: initialPath, + requestBody + }) + sendUserToast(`PostgresTrigger ${config.path} updated`) + } else { + await PostgresTriggerService.createPostgresTrigger({ + workspace: workspace, + requestBody: { + ...requestBody, + enabled: true + } + }) + sendUserToast(`PostgresTrigger ${config.path} created`) + } + + if (!get(usedTriggerKinds).includes('postgres')) { + usedTriggerKinds.update((t) => [...t, 'postgres']) + } + return true + } catch (error) { + sendUserToast(error.body || error.message, true) + return false + } } diff --git a/frontend/src/lib/components/triggers/schedules/ScheduleEditor.svelte b/frontend/src/lib/components/triggers/schedules/ScheduleEditor.svelte index f70e3a48cb..c75e215e79 100644 --- a/frontend/src/lib/components/triggers/schedules/ScheduleEditor.svelte +++ b/frontend/src/lib/components/triggers/schedules/ScheduleEditor.svelte @@ -2,7 +2,9 @@ import { tick } from 'svelte' import ScheduleEditorInner from './ScheduleEditorInner.svelte' - let open = false + let { onUpdate }: { onUpdate?: (path?: string) => void } = $props() + + let open = $state(false) export async function openEdit(ePath: string, isFlow: boolean) { open = true await tick() @@ -16,12 +18,12 @@ ) { open = true await tick() - drawer?.openNew(is_flow, initial_script_path, schedule_path) + drawer?.openNew(is_flow, initial_script_path, undefined, schedule_path) } - let drawer: ScheduleEditorInner + let drawer: ScheduleEditorInner | undefined = $state() {#if open} - + {/if} diff --git a/frontend/src/lib/components/triggers/schedules/ScheduleEditorInner.svelte b/frontend/src/lib/components/triggers/schedules/ScheduleEditorInner.svelte index 69fe6c77d4..91dc02c2b0 100644 --- a/frontend/src/lib/components/triggers/schedules/ScheduleEditorInner.svelte +++ b/frontend/src/lib/components/triggers/schedules/ScheduleEditorInner.svelte @@ -23,77 +23,122 @@ import { enterpriseLicense, userStore, workspaceStore } from '$lib/stores' import { canWrite, emptyString, formatCron, sendUserToast, cronV1toV2 } from '$lib/utils' import { base } from '$lib/base' - import { createEventDispatcher } from 'svelte' import Section from '$lib/components/Section.svelte' import { List, Loader2, Save, AlertTriangle } from 'lucide-svelte' import autosize from '$lib/autosize' + import TriggerEditorToolbar from '$lib/components/triggers/TriggerEditorToolbar.svelte' + import { saveScheduleFromCfg } from '$lib/components/flows/scheduleUtils' import DateTimeInput from '$lib/components/DateTimeInput.svelte' import FlowRetries from '$lib/components/flows/content/FlowRetries.svelte' import Label from '$lib/components/Label.svelte' import WorkerTagPicker from '$lib/components/WorkerTagPicker.svelte' import { runScheduleNow } from '../scheduled/utils' + import { handleConfigChange } from '../utils' + + let { + useDrawer = true, + hideTarget = false, + docDescription = undefined, + allowDraft = false, + hasDraft = false, + isDraftOnly = false, + primary = false, + draftSchema = undefined, + customLabel = undefined, + isDeployed = false, + onUpdate = undefined, + onConfigChange = undefined, + onDelete = undefined, + onReset = undefined + } = $props() let optionTabSelected: 'error_handler' | 'recovery_handler' | 'success_handler' | 'retries' = - 'error_handler' - - let is_flow: boolean = false - let initialPath = '' - let edit = true - let schedule: string = '0 0 12 * *' - let cronVersion: string = 'v2' - let isLatestCron = true - let initialCronVersion: string = 'v2' + $state('error_handler') + let is_flow: boolean = $state(false) + let initialPath = $state('') + let edit = $state(true) + let schedule: string = $state('0 0 12 * *') + let cronVersion: string = $state('v2') + let isLatestCron = $state(true) + let initialCronVersion: string = $state('v2') let initialSchedule: string - let timezone: string = Intl.DateTimeFormat().resolvedOptions().timeZone - let paused_until: string | undefined = undefined + let timezone: string = $state(Intl.DateTimeFormat().resolvedOptions().timeZone) + let paused_until: string | undefined = $state(undefined) + let itemKind: 'flow' | 'script' = $state('script') + let errorHandleritemKind: 'flow' | 'script' = $state('script') + let wsErrorHandlerMuted: boolean = $state(false) + let errorHandlerPath: string | undefined = $state(undefined) + let errorHandlerCustomInitialPath: string | undefined = $state(undefined) + let errorHandlerSelected: 'custom' | 'slack' | 'teams' = $state('slack') + let errorHandlerExtraArgs: Record = $state({}) + let recoveryHandlerPath: string | undefined = $state(undefined) + let recoveryHandlerCustomInitialPath: string | undefined = $state(undefined) + let recoveryHandlerSelected: 'custom' | 'slack' | 'teams' = $state('slack') + let recoveryHandlerItemKind: 'flow' | 'script' = $state('script') + let recoveryHandlerExtraArgs: Record = $state({}) + let successHandlerPath: string | undefined = $state(undefined) + let successHandlerCustomInitialPath: string | undefined = $state(undefined) + let successHandlerSelected: 'custom' | 'slack' | 'teams' = $state('slack') + let successHandlerItemKind: 'flow' | 'script' = $state('script') + let successHandlerExtraArgs: Record = $state({}) + let failedTimes = $state(1) + let failedExact = $state(false) + let recoveredTimes = $state(1) + let retry: Retry | undefined = $state(undefined) + let script_path = $state('') + let initialScriptPath = $state('') + let runnable: Script | Flow | undefined = $state() + let args: Record = $state({}) + let loading = $state(false) + let drawerLoading = $state(true) + let showLoading = $state(false) + let initialConfig: Record | undefined = undefined + let extraPerms: Record = $state({}) + let can_write = $state(true) + let initNewPath = $state(false) + let path: string = $state('') + let enabled: boolean = $state(false) + let pathError = $state('') + let summary = $state('') + let description = $state('') + let no_flow_overlap = $state(false) + let tag: string | undefined = $state(undefined) + let validCRON = $state(true) + let isValid = $state(true) + let allowSchedule = $derived(isValid && validCRON && script_path != '') + let deploymentLoading = $state(false) - let itemKind: 'flow' | 'script' = 'script' - let errorHandleritemKind: 'flow' | 'script' = 'script' - let wsErrorHandlerMuted: boolean = false - let errorHandlerPath: string | undefined = undefined - let errorHandlerCustomInitialPath: string | undefined = undefined - let errorHandlerSelected: 'custom' | 'slack' | 'teams' = 'slack' - let errorHandlerExtraArgs: Record = {} - let recoveryHandlerPath: string | undefined = undefined - let recoveryHandlerCustomInitialPath: string | undefined = undefined - let recoveryHandlerSelected: 'custom' | 'slack' | 'teams' = 'slack' - let recoveryHandlerItemKind: 'flow' | 'script' = 'script' - let recoveryHandlerExtraArgs: Record = {} - let successHandlerPath: string | undefined = undefined - let successHandlerCustomInitialPath: string | undefined = undefined - let successHandlerSelected: 'custom' | 'slack' | 'teams' = 'slack' - let successHandlerItemKind: 'flow' | 'script' = 'script' - let successHandlerExtraArgs: Record = {} - let failedTimes = 1 - let failedExact = false - let recoveredTimes = 1 - let duplicate = false - let retry: Retry | undefined = undefined + const saveDisabled = $derived( + !allowSchedule || + pathError != '' || + emptyString(script_path) || + (errorHandlerSelected == 'slack' && + !emptyString(errorHandlerPath) && + emptyString(errorHandlerExtraArgs['channel'])) || + !can_write + ) + const scheduleCfg = $derived.by(getScheduleCfg) - let script_path = '' - let initialScriptPath = '' - - let runnable: Script | Flow | undefined - let args: Record = {} - - let loading = false - - let drawerLoading = true - export function openEdit(ePath: string, isFlow: boolean) { + export async function openEdit(ePath: string, isFlow: boolean, defaultCfg?: Record) { + let loadingTimeout = setTimeout(() => { + showLoading = true + }, 100) // Do not show loading spinner for the first 100ms drawerLoading = true try { drawer?.openDrawer() is_flow = isFlow initialPath = ePath itemKind = is_flow ? 'flow' : 'script' - if (path == ePath) { - loadSchedule() - } else { - path = ePath - } + path = defaultCfg?.path ?? ePath + await loadSchedule(defaultCfg) edit = true } finally { + if (!defaultCfg) { + initialConfig = structuredClone($state.snapshot(getScheduleCfg())) + } + clearTimeout(loadingTimeout) drawerLoading = false + showLoading = false } } @@ -147,8 +192,7 @@ successHandlerSelected = 'slack' successHandlerExtraArgs = {} } - } - else { + } else { let defaultErrorHandlerMaybe = undefined let defaultRecoveryHandlerMaybe = undefined let defaultSuccessHandlerMaybe = undefined @@ -221,8 +265,12 @@ export async function openNew( nis_flow: boolean, initial_script_path?: string, + defaultValues?: Schedule, schedule_path?: string ) { + let loadingTimeout = setTimeout(() => { + showLoading = true + }, 100) // Do not show loading spinner for the first 100ms drawerLoading = true try { let s: Schedule | undefined @@ -231,7 +279,9 @@ workspace: $workspaceStore!, path: schedule_path }) - duplicate = true + initNewPath = true + } else if (defaultValues) { + s = defaultValues } drawer?.openDrawer() runnable = undefined @@ -239,7 +289,7 @@ edit = false itemKind = is_flow ? 'flow' : 'script' initialScriptPath = initial_script_path ?? '' - path = duplicate === true ? '' : initialScriptPath + path = initNewPath ? '' : (defaultValues?.path ?? initialScriptPath) initialPath = path cronVersion = s?.cron_version ?? 'v2' @@ -264,7 +314,9 @@ await setScheduleHandler(s) } finally { + clearTimeout(loadingTimeout) drawerLoading = false + showLoading = false } } @@ -274,28 +326,18 @@ } } - $: (is_flow = itemKind == 'flow') && resetRetries() - - let isValid = true - - let path: string = '' - let enabled: boolean = false - let pathError = '' - let summary = '' - let description = '' - let no_flow_overlap = false - let tag: string | undefined = undefined - - let validCRON = true - $: allowSchedule = isValid && validCRON && script_path != '' + $effect(() => { + ;(is_flow = itemKind == 'flow') && resetRetries() + }) // set isValid to true when a script/flow without any properties is selected - $: runnable?.schema && - runnable.schema.properties && - Object.keys(runnable.schema.properties).length === 0 && - (isValid = true) + $effect(() => { + setDefaultValid(draftSchema ?? runnable?.schema) + }) - const dispatch = createEventDispatcher() + function setDefaultValid(schema: Record | undefined) { + isValid = schema?.properties && Object.keys(schema.properties).length === 0 + } async function loadScript(p: string | undefined): Promise { if (p) { @@ -395,129 +437,108 @@ } } - let can_write = true - async function loadSchedule(): Promise { - loading = true - try { - const s = await ScheduleService.getSchedule({ - workspace: $workspaceStore!, - path: initialPath - }) - is_flow = s.is_flow - cronVersion = s.cron_version ?? 'v2' - initialCronVersion = cronVersion - isLatestCron = cronVersion == 'v2' - enabled = s.enabled - schedule = s.schedule - initialSchedule = schedule - timezone = s.timezone - paused_until = s.paused_until - showPauseUntil = paused_until !== undefined - summary = s.summary ?? '' - description = s.description ?? '' - script_path = s.script_path ?? '' - args = s.args ?? {} - can_write = canWrite(s.path, s.extra_perms, $userStore) - tag = s.tag - - await loadScript(script_path) - - no_flow_overlap = s.no_flow_overlap ?? false - wsErrorHandlerMuted = s.ws_error_handler_muted ?? false - retry = s.retry - await setScheduleHandler(s) - } catch (err) { - sendUserToast(`Could not load schedule: ${err}`, true) + async function loadSchedule(defaultCfg?: Record): Promise { + if (!defaultCfg) { + try { + const s = await ScheduleService.getSchedule({ + workspace: $workspaceStore!, + path: initialPath + }) + await loadScheduleCfg(s) + } catch (err) { + sendUserToast(`Could not load schedule: ${err}`, true) + } + } else { + await loadScheduleCfg(defaultCfg) } + } + + async function loadScheduleCfg(cfg: Record): Promise { + loading = true + + cronVersion = cfg.cron_version ?? 'v2' + initialCronVersion = cronVersion + isLatestCron = cronVersion == 'v2' + enabled = cfg.enabled + schedule = cfg.schedule + initialSchedule = schedule + timezone = cfg.timezone + paused_until = cfg.paused_until + showPauseUntil = paused_until !== undefined + summary = cfg.summary ?? '' + description = cfg.description ?? '' + script_path = cfg.script_path ?? '' + await loadScript(script_path) + + is_flow = cfg.is_flow + no_flow_overlap = cfg.no_flow_overlap ?? false + wsErrorHandlerMuted = cfg.ws_error_handler_muted ?? false + retry = cfg.retry + if (cfg.on_failure) { + let splitted = cfg.on_failure.split('/') + errorHandleritemKind = splitted[0] as 'flow' | 'script' + errorHandlerPath = splitted.slice(1)?.join('/') + errorHandlerCustomInitialPath = errorHandlerPath + failedTimes = cfg.on_failure_times ?? 1 + failedExact = cfg.on_failure_exact ?? false + errorHandlerExtraArgs = cfg.on_failure_extra_args ?? {} + errorHandlerSelected = getHandlerType('error', errorHandlerPath ?? '') + } else { + errorHandlerPath = undefined + errorHandleritemKind = 'script' + errorHandlerCustomInitialPath = undefined + errorHandlerExtraArgs = {} + failedExact = false + failedTimes = 1 + errorHandlerSelected = 'slack' + } + if (cfg.on_recovery) { + let splitted = cfg.on_recovery.split('/') + recoveryHandlerItemKind = splitted[0] as 'flow' | 'script' + recoveryHandlerPath = splitted.slice(1)?.join('/') + recoveryHandlerCustomInitialPath = recoveryHandlerPath + recoveredTimes = cfg.on_recovery_times ?? 1 + recoveryHandlerExtraArgs = cfg.on_recovery_extra_args ?? {} + recoveryHandlerSelected = getHandlerType('recovery', recoveryHandlerPath ?? '') + } else { + recoveryHandlerPath = undefined + recoveryHandlerItemKind = 'script' + recoveryHandlerCustomInitialPath = undefined + recoveredTimes = 1 + recoveryHandlerSelected = 'slack' + recoveryHandlerExtraArgs = {} + } + if (cfg.on_success) { + let splitted = cfg.on_success.split('/') + successHandlerItemKind = splitted[0] as 'flow' | 'script' + successHandlerPath = splitted.slice(1)?.join('/') + successHandlerCustomInitialPath = successHandlerPath + successHandlerExtraArgs = cfg.on_success_extra_args ?? {} + successHandlerSelected = getHandlerType('success', successHandlerPath ?? '') + } else { + successHandlerPath = undefined + successHandlerItemKind = 'script' + successHandlerCustomInitialPath = undefined + successHandlerSelected = 'slack' + successHandlerExtraArgs = {} + } + args = cfg.args ?? {} + extraPerms = cfg.extra_perms ?? {} + can_write = canWrite(cfg.path, cfg.extra_perms, $userStore) + tag = cfg.tag + loading = false } async function scheduleScript(): Promise { - if (errorHandlerPath !== undefined && isSlackHandler('error', errorHandlerPath)) { - errorHandlerExtraArgs['slack'] = '$res:f/slack_bot/bot_token' - } else { - errorHandlerExtraArgs['slack'] = undefined + const scheduleCfg = getScheduleCfg() + deploymentLoading = true + const isSaved = await saveScheduleFromCfg(scheduleCfg, edit, $workspaceStore!) + if (isSaved) { + onUpdate?.(scheduleCfg.path) + drawer?.closeDrawer() } - if (recoveryHandlerPath !== undefined && isSlackHandler('recovery', recoveryHandlerPath)) { - recoveryHandlerExtraArgs['slack'] = '$res:f/slack_bot/bot_token' - } else { - recoveryHandlerExtraArgs['slack'] = undefined - } - if (successHandlerPath !== undefined && isSlackHandler('success', successHandlerPath)) { - successHandlerExtraArgs['slack'] = '$res:f/slack_bot/bot_token' - } else { - successHandlerExtraArgs['slack'] = undefined - } - if (edit) { - await ScheduleService.updateSchedule({ - workspace: $workspaceStore!, - path: initialPath, - requestBody: { - schedule: formatCron(schedule), - timezone, - args, - on_failure: errorHandlerPath ? `${errorHandleritemKind}/${errorHandlerPath}` : undefined, - on_failure_times: failedTimes, - on_failure_exact: failedExact, - on_failure_extra_args: errorHandlerPath ? errorHandlerExtraArgs : undefined, - on_recovery: recoveryHandlerPath - ? `${recoveryHandlerItemKind}/${recoveryHandlerPath}` - : undefined, - on_recovery_times: recoveredTimes, - on_recovery_extra_args: recoveryHandlerPath ? recoveryHandlerExtraArgs : {}, - on_success: successHandlerPath - ? `${successHandlerItemKind}/${successHandlerPath}` - : undefined, - on_success_extra_args: successHandlerPath ? successHandlerExtraArgs : {}, - ws_error_handler_muted: wsErrorHandlerMuted, - retry: retry, - summary: summary != '' ? summary : undefined, - description: description, - no_flow_overlap: no_flow_overlap, - tag: tag, - paused_until: paused_until, - cron_version: cronVersion - } - }) - sendUserToast(`Schedule ${path} updated`) - } else { - await ScheduleService.createSchedule({ - workspace: $workspaceStore!, - requestBody: { - path, - schedule: formatCron(schedule), - timezone, - script_path, - is_flow, - args, - enabled: true, - on_failure: errorHandlerPath ? `${errorHandleritemKind}/${errorHandlerPath}` : undefined, - on_failure_times: failedTimes, - on_failure_exact: failedExact, - on_failure_extra_args: errorHandlerPath ? errorHandlerExtraArgs : undefined, - on_recovery: recoveryHandlerPath - ? `${recoveryHandlerItemKind}/${recoveryHandlerPath}` - : undefined, - on_recovery_times: recoveredTimes, - on_recovery_extra_args: recoveryHandlerPath ? recoveryHandlerExtraArgs : {}, - on_success: successHandlerPath - ? `${successHandlerItemKind}/${successHandlerPath}` - : undefined, - on_success_extra_args: successHandlerPath ? successHandlerExtraArgs : {}, - ws_error_handler_muted: wsErrorHandlerMuted, - retry: retry, - summary: summary != '' ? summary : undefined, - description: description, - no_flow_overlap: no_flow_overlap, - tag: tag, - paused_until: paused_until, - cron_version: cronVersion - } - }) - sendUserToast(`Schedule ${path} created`) - } - dispatch('update') - drawer.closeDrawer() + deploymentLoading = false } function getHandlerType( @@ -562,21 +583,15 @@ } } - $: { - if ($workspaceStore) { - if (edit && path != '') { - loadSchedule() - } - } - } + let drawer: Drawer | undefined = $state() - let drawer: Drawer + let pathC: Path | undefined = $state() + let dirtyPath = $state(false) - let pathC: Path - let dirtyPath = false - - let showPauseUntil = false - $: !showPauseUntil && (paused_until = undefined) + let showPauseUntil = $state(false) + $effect(() => { + !showPauseUntil && (paused_until = undefined) + }) function onVersionChange() { cronVersion = isLatestCron ? 'v2' : 'v1' @@ -592,20 +607,99 @@ schedule = initialSchedule } } + + function getScheduleCfg(): Record { + let errorHadlerExtraArgsDerived = structuredClone($state.snapshot(errorHandlerExtraArgs)) + if (errorHandlerPath !== undefined && isSlackHandler('error', errorHandlerPath)) { + errorHadlerExtraArgsDerived['slack'] = '$res:f/slack_bot/bot_token' + } else { + errorHadlerExtraArgsDerived['slack'] = undefined + } + + let recoveryHandlerExtraArgsDerived = structuredClone($state.snapshot(recoveryHandlerExtraArgs)) + if (recoveryHandlerPath !== undefined && isSlackHandler('recovery', recoveryHandlerPath)) { + recoveryHandlerExtraArgsDerived['slack'] = '$res:f/slack_bot/bot_token' + } else { + recoveryHandlerExtraArgsDerived['slack'] = undefined + } + + let successHandlerExtraArgsDerived = structuredClone($state.snapshot(successHandlerExtraArgs)) + if (successHandlerPath !== undefined && isSlackHandler('success', successHandlerPath)) { + successHandlerExtraArgsDerived['slack'] = '$res:f/slack_bot/bot_token' + } else { + successHandlerExtraArgsDerived['slack'] = undefined + } + return { + path: path, + schedule: formatCron(schedule), + timezone: timezone, + script_path: script_path, + is_flow: is_flow, + args: args, + enabled: enabled, + on_failure: errorHandlerPath ? `${errorHandleritemKind}/${errorHandlerPath}` : undefined, + on_failure_times: failedTimes, + on_failure_exact: failedExact, + on_failure_extra_args: errorHandlerPath ? errorHadlerExtraArgsDerived : undefined, + on_recovery: recoveryHandlerPath + ? `${recoveryHandlerItemKind}/${recoveryHandlerPath}` + : undefined, + on_recovery_times: recoveredTimes, + on_recovery_extra_args: recoveryHandlerPath ? recoveryHandlerExtraArgsDerived : {}, + on_success: successHandlerPath + ? `${successHandlerItemKind}/${successHandlerPath}` + : undefined, + on_success_extra_args: successHandlerPath ? successHandlerExtraArgsDerived : {}, + ws_error_handler_muted: wsErrorHandlerMuted, + retry: retry, + summary: summary != '' ? summary : undefined, + description: description, + no_flow_overlap: no_flow_overlap, + tag: tag, + paused_until: paused_until, + cron_version: cronVersion, + extra_perms: extraPerms + } + } + + async function handleToggleEnabled(nEnabled: boolean) { + enabled = nEnabled + if (!isDraftOnly && !hasDraft) { + await ScheduleService.setScheduleEnabled({ + path: initialPath, + workspace: $workspaceStore ?? '', + requestBody: { enabled: nEnabled } + }) + sendUserToast(`${nEnabled ? 'enabled' : 'disabled'} schedule ${initialPath}`) + } + } + + $effect(() => { + if (!drawerLoading) { + handleConfigChange(scheduleCfg, initialConfig, saveDisabled, edit, onConfigChange) + } + }) - - - - {#if !drawerLoading} - {#if edit} +{#snippet saveButton()} + {#if !drawerLoading} + + {#snippet extra()} + {#if !drawerLoading && edit}
- {#if can_write} -
- { - await ScheduleService.setScheduleEnabled({ - path: initialPath, - workspace: $workspaceStore ?? '', - requestBody: { enabled: e.detail } - }) - dispatch('update') - sendUserToast(`${e.detail ? 'enabled' : 'disabled'} schedule ${initialPath}`) - }} - /> -
- {/if} {/if} - - {/if} -
- {#if drawerLoading} - - {:else} -
-
-
-

Metadata

- -
- + {/snippet} + + {/if} +{/snippet} -
+
+
+

Metadata

+
- -
- - {#if cronVersion === 'v1'} - Schedules use CRON syntax. Seconds are mandatory. - {:else} - Schedules use extended CRON syntax. + {#if !edit && !primary} + + {:else} +
+ - {/if} - - {#if initialCronVersion !== 'v2'} -
- - + { + currentTarget.select() }} - size="xs" - bind:checked={isLatestCron} - on:change={onVersionChange} - disabled={!can_write} /> +
{/if} - + + +
+ +
+ {#snippet header()} + {#if cronVersion === 'v1'} + Schedules use CRON syntax. Seconds are mandatory. + {:else} + Schedules use extended CRON syntax. {/if} -
-
+ {/snippet} + {#if initialCronVersion !== 'v2'} +
+ + +
+ {/if} + + + {#if showPauseUntil} + + {/if} +
+ +
+ {#if !hideTarget} {#if !edit}

Pick a script or flow to be triggered by the schedule

{/if} -
- {#if !loading} - {#if runnable} - {#if runnable?.schema && runnable.schema.properties && Object.keys(runnable.schema.properties).length > 0} - {#await import('$lib/components/SchemaForm.svelte')} - - {:then Module} - - {/await} - {:else} -
- This {is_flow ? 'flow' : 'script'} takes no argument -
- {/if} - {:else if script_path != ''} -
- You cannot see the the {is_flow ? 'flow' : 'script'} input form as you do not have - access to it. -
- {:else} -
- Pick a {is_flow ? 'flow' : 'script'} and fill its argument here -
- {/if} - {:else} - - {/if} -
- - -
+ {/if} +
{#if !loading} - - Error Handler - Recovery Handler - Success Handler - {#if itemKind === 'script'} - Retries - Custom tag - {/if} - -
- {#if optionTabSelected === 'error_handler'} -
- -
- {#if !$enterpriseLicense}(ee only){/if} -
-
- -
- defaults - saveAsDefaultErrorHandler(false) - }, - { - displayName: 'Override all existing', - type: 'delete', - action: () => saveAsDefaultErrorHandler(true) - } - ]} - > - - - Set as default - - -
-
-
- 0} + {#await import('$lib/components/SchemaForm.svelte')} + + {:then Module} + + {/await} + {:else} +
+ This {is_flow ? 'flow' : 'script'} takes no argument
- - - - -
-
The following args will be passed to the error handler: -
    -
  • path: The path of the script or flow that failed.
  • -
  • is_flow: Whether the runnable is a flow.
  • -
  • schedule_path: The path of the schedule.
  • -
  • error: The error details.
  • -
  • failed_times: Minimum number of times the schedule failed - before calling the error handler.
  • -
  • started_at: The start datetime of the latest job that failed.
  • -
-
-
-
-
-
-
-
-

- Triggered when schedule failed

- - -

time{failedTimes > 1 ? 's in a row' : ''}

-
-
-
- {:else if optionTabSelected === 'recovery_handler'} - {@const disabled = !can_write || emptyString($enterpriseLicense)} -
- -
- {#if !$enterpriseLicense}(ee only){/if} -
-
- -
- defaults - saveAsDefaultRecoveryHandler(false) - }, - { - displayName: 'Override all existing', - type: 'delete', - action: () => saveAsDefaultRecoveryHandler(true) - } - ]} - > - - - Set as default - - -
-
- - - -
-
The following args will be passed to the recovery handler: -
    -
  • path: The path of the script or flow that recovered.
  • -
  • is_flow: Whether the runnable is a flow.
  • -
  • schedule_path: The path of the schedule.
  • -
  • error: The error of the last job that errored
  • -
  • error_started_at: The start datetime of the last job that - errored
  • -
  • success_times: The number of times the schedule succeeded - before calling the recovery handler.
  • -
  • success_result: The result of the latest successful job
  • -
  • success_started_at: The start datetime of the latest - successful job
  • -
-
-
-
-
-
-
-
-

Triggered when schedule recovered

- -

time{recoveredTimes > 1 ? 's in a row' : ''}

-
-
-
- {:else if optionTabSelected === 'success_handler'} - {@const disabled = !can_write || emptyString($enterpriseLicense)} -
- -
- {#if !$enterpriseLicense}(ee only){/if} -
-
- -
- defaults - saveAsDefaultSuccessHandler(false) - }, - { - displayName: 'Override all existing', - type: 'delete', - action: () => saveAsDefaultSuccessHandler(true) - } - ]} - > - - - Set as default - - -
-
- - - -
-
The following args will be passed to the success handler: -
    -
  • path: The path of the script or flow that succeeded.
  • -
  • is_flow: Whether the runnable is a flow.
  • -
  • schedule_path: The path of the schedule.
  • -
  • success_result: The result of the successful job
  • -
  • success_started_at: The start datetime of the successful job
  • -
-
-
-
-
-
-
- {:else if optionTabSelected === 'retries'} - {@const disabled = !can_write || emptyString($enterpriseLicense)} -
- -
- {#if !$enterpriseLicense}(ee only){/if} -
- - If defined, upon error this schedule will be retried with a delay and a maximum - number of attempts as defined below. -
- This is only available for individual script. For flows, retries can be set on each - flow step in the flow editor. -
-
- -
- {:else if optionTabSelected === 'tag'} -
- -
+ {/if} + {:else if script_path != ''} +
+ You cannot see the the {is_flow ? 'flow' : 'script'} input form as you do not have access + to it. +
+ {:else} +
+ Pick a {is_flow ? 'flow' : 'script'} and fill its argument here +
{/if} {:else} {/if}
-
+ + +
+ {@render errorHandler()} +
+
+ {/if} +{/snippet} + +{#snippet errorHandler()} +
+ {#if !loading} + + Error Handler + Recovery Handler + Success Handler + {#if itemKind === 'script'} + Retries + Custom tag + {/if} + +
+ {#if optionTabSelected === 'error_handler'} +
+ {#snippet header()} +
+ {#if !$enterpriseLicense}(ee only){/if} +
+ {/snippet} + {#snippet action()} +
+ defaults + saveAsDefaultErrorHandler(false) + }, + { + displayName: 'Override all existing', + type: 'delete', + action: () => saveAsDefaultErrorHandler(true) + } + ]} + > + {#snippet children()} + + Set as default + {/snippet} + +
+ {/snippet} +
+ +
+ + + + + +
+
The following args will be passed to the error handler: +
    +
  • path: The path of the script or flow that failed.
  • +
  • is_flow: Whether the runnable is a flow.
  • +
  • schedule_path: The path of the schedule.
  • +
  • error: The error details.
  • +
  • failed_times: Minimum number of times the schedule failed before + calling the error handler.
  • +
  • started_at: The start datetime of the latest job that failed.
  • +
+
+
+
+
+
+
+
+

+ Triggered when schedule failed

+ + +

time{failedTimes > 1 ? 's in a row' : ''}

+
+
+
+ {:else if optionTabSelected === 'recovery_handler'} + {@const disabled = !can_write || emptyString($enterpriseLicense)} +
+ {#snippet header()} +
+ {#if !$enterpriseLicense}(ee only){/if} +
+ {/snippet} + {#snippet action()} +
+ defaults + saveAsDefaultRecoveryHandler(false) + }, + { + displayName: 'Override all existing', + type: 'delete', + action: () => saveAsDefaultRecoveryHandler(true) + } + ]} + > + {#snippet children()} + + Set as default + {/snippet} + +
+ {/snippet} + + + + +
+
The following args will be passed to the recovery handler: +
    +
  • path: The path of the script or flow that recovered.
  • +
  • is_flow: Whether the runnable is a flow.
  • +
  • schedule_path: The path of the schedule.
  • +
  • error: The error of the last job that errored
  • +
  • error_started_at: The start datetime of the last job that errored
  • +
  • success_times: The number of times the schedule succeeded before + calling the recovery handler.
  • +
  • success_result: The result of the latest successful job
  • +
  • success_started_at: The start datetime of the latest successful job
  • +
+
+
+
+
+
+
+
+

Triggered when schedule recovered

+ +

time{recoveredTimes > 1 ? 's in a row' : ''}

+
+
+
+ {:else if optionTabSelected === 'success_handler'} + {@const disabled = !can_write || emptyString($enterpriseLicense)} +
+ {#snippet header()} +
+ {#if !$enterpriseLicense}(ee only){/if} +
+ {/snippet} + {#snippet action()} +
+ defaults + saveAsDefaultSuccessHandler(false) + }, + { + displayName: 'Override all existing', + type: 'delete', + action: () => saveAsDefaultSuccessHandler(true) + } + ]} + > + {#snippet children()} + + Set as default + {/snippet} + +
+ {/snippet} + + + + +
+
The following args will be passed to the success handler: +
    +
  • path: The path of the script or flow that succeeded.
  • +
  • is_flow: Whether the runnable is a flow.
  • +
  • schedule_path: The path of the schedule.
  • +
  • success_result: The result of the successful job
  • +
  • success_started_at: The start datetime of the successful job
  • +
+
+
+
+
+
+
+ {:else if optionTabSelected === 'retries'} + {@const disabled = !can_write || emptyString($enterpriseLicense)} +
+ {#snippet header()} +
+ {#if !$enterpriseLicense}(ee only){/if} +
+ + If defined, upon error this schedule will be retried with a delay and a maximum number + of attempts as defined below. +
+ This is only available for individual script. For flows, retries can be set on each flow + step in the flow editor. +
+ {/snippet} + +
+ {:else if optionTabSelected === 'tag'} +
+ +
+ {/if} + {:else} + {/if} - - +
+{/snippet} + +{#if useDrawer} + + + +
+ {@render saveButton()} +
+
+ {@render content()} +
+
+{:else} +
+ + {#if customLabel} + {@render customLabel()} + {/if} + + +
+ {@render saveButton()} +
+
+ {#if docDescription} + {@render docDescription()} + {/if} + {@render content()} +
+{/if} diff --git a/frontend/src/lib/components/triggers/sqs/SqsCapture.svelte b/frontend/src/lib/components/triggers/sqs/SqsCapture.svelte new file mode 100644 index 0000000000..d61e663d0c --- /dev/null +++ b/frontend/src/lib/components/triggers/sqs/SqsCapture.svelte @@ -0,0 +1,52 @@ + + +{#if captureInfo} + + {#snippet description()} + {#if captureInfo.active} +

+ Listening to SQS messages... +

+ {:else} +

+ Start capturing to listen to SQS messages. +

+ {/if} + {/snippet} +
+{/if} diff --git a/frontend/src/lib/components/triggers/sqs/SqsTriggerEditor.svelte b/frontend/src/lib/components/triggers/sqs/SqsTriggerEditor.svelte index 2de3e17567..2e1cc47727 100644 --- a/frontend/src/lib/components/triggers/sqs/SqsTriggerEditor.svelte +++ b/frontend/src/lib/components/triggers/sqs/SqsTriggerEditor.svelte @@ -2,7 +2,9 @@ import { tick } from 'svelte' import SqsTriggerEditorInner from './SqsTriggerEditorInner.svelte' - let open = false + let { onUpdate } = $props() + + let open = $state(false) export async function openEdit(ePath: string, isFlow: boolean) { open = true await tick() @@ -19,9 +21,9 @@ drawer?.openNew(is_flow, initial_script_path, defaultValues) } - let drawer: SqsTriggerEditorInner + let drawer: SqsTriggerEditorInner | undefined = $state() {#if open} - + {/if} diff --git a/frontend/src/lib/components/triggers/sqs/SqsTriggerEditorConfigSection.svelte b/frontend/src/lib/components/triggers/sqs/SqsTriggerEditorConfigSection.svelte index 3de41919fb..55282e8762 100644 --- a/frontend/src/lib/components/triggers/sqs/SqsTriggerEditorConfigSection.svelte +++ b/frontend/src/lib/components/triggers/sqs/SqsTriggerEditorConfigSection.svelte @@ -1,7 +1,5 @@
- {#if showCapture && captureInfo} - - {/if}
+ + {#if showTestingBadge} + + {/if} +
@@ -64,9 +53,13 @@ Select an AWS resource to authenticate your account.

- { - aws_resource_path = '' - }} let:item> + { + aws_resource_path = '' + }} + let:item + > diff --git a/frontend/src/lib/components/triggers/sqs/SqsTriggerEditorInner.svelte b/frontend/src/lib/components/triggers/sqs/SqsTriggerEditorInner.svelte index eee25de840..c23a683b2c 100644 --- a/frontend/src/lib/components/triggers/sqs/SqsTriggerEditorInner.svelte +++ b/frontend/src/lib/components/triggers/sqs/SqsTriggerEditorInner.svelte @@ -5,40 +5,96 @@ import Path from '$lib/components/Path.svelte' import { usedTriggerKinds, userStore, workspaceStore } from '$lib/stores' import { canWrite, emptyString, sendUserToast } from '$lib/utils' - import { createEventDispatcher } from 'svelte' - import { Loader2, Save } from 'lucide-svelte' + import { Loader2 } from 'lucide-svelte' import Label from '$lib/components/Label.svelte' - import Toggle from '$lib/components/Toggle.svelte' import { SqsTriggerService, type AwsAuthResourceType } from '$lib/gen' import SqsTriggerEditorConfigSection from './SqsTriggerEditorConfigSection.svelte' import Section from '$lib/components/Section.svelte' import ScriptPicker from '$lib/components/ScriptPicker.svelte' import Required from '$lib/components/Required.svelte' + import type { Snippet } from 'svelte' + import TriggerEditorToolbar from '../TriggerEditorToolbar.svelte' + import { saveSqsTriggerFromCfg } from './utils' + import { handleConfigChange } from '../utils' - let drawer: Drawer - let is_flow: boolean = false - let initialPath = '' - let edit = true - let itemKind: 'flow' | 'script' = 'script' - let script_path = '' - let initialScriptPath = '' - let fixedScriptPath = '' - let path: string = '' - let pathError = '' - let enabled = false - let dirtyPath = false - let can_write = true - let drawerLoading = true - let aws_resource_path: string = '' - let queue_url = '' - let message_attributes: string[] = [] - let aws_auth_resource_type: AwsAuthResourceType = 'credentials' - let isValid = false - const dispatch = createEventDispatcher() + interface Props { + useDrawer?: boolean + description?: Snippet | undefined + hideTarget?: boolean + hideTooltips?: boolean + allowDraft?: boolean + hasDraft?: boolean + isDraftOnly?: boolean + isEditor?: boolean + customLabel?: Snippet + isDeployed?: boolean + cloudDisabled?: boolean + onConfigChange?: (cfg: Record, saveDisabled: boolean, updated: boolean) => void + onCaptureConfigChange?: (cfg: Record, isValid: boolean) => void + onUpdate?: (path?: string) => void + onDelete?: () => void + onReset?: () => void + } - $: is_flow = itemKind === 'flow' + let { + useDrawer = true, + description = undefined, + hideTarget = false, + hideTooltips = false, + allowDraft = false, + hasDraft = false, + isDraftOnly = false, + isEditor = false, + customLabel = undefined, + isDeployed = false, + cloudDisabled = false, + onConfigChange = undefined, + onCaptureConfigChange = undefined, + onUpdate = undefined, + onDelete = undefined, + onReset = undefined + }: Props = $props() - export async function openEdit(ePath: string, isFlow: boolean) { + let drawer: Drawer | undefined = $state(undefined) + let is_flow: boolean = $state(false) + let initialPath = $state('') + let edit = $state(true) + let itemKind: 'flow' | 'script' = $state('script') + let script_path = $state('') + let initialScriptPath = $state('') + let fixedScriptPath = $state('') + let path: string = $state('') + let pathError = $state('') + let enabled = $state(false) + let dirtyPath = $state(false) + let can_write = $state(true) + let drawerLoading = $state(true) + let showLoading = $state(false) + let aws_resource_path: string = $state('') + let queue_url = $state('') + let message_attributes: string[] = $state([]) + let aws_auth_resource_type: AwsAuthResourceType = $state('credentials') + let isValid = $state(false) + let initialConfig: Record | undefined = undefined + let deploymentLoading = $state(false) + + const sqsConfig = $derived.by(getSaveCfg) + const captureConfig = $derived.by(getCaptureConfig) + const saveDisabled = $derived( + pathError != '' || emptyString(script_path) || !isValid || !can_write + ) + $effect(() => { + is_flow = itemKind === 'flow' + }) + + export async function openEdit( + ePath: string, + isFlow: boolean, + defaultConfig?: Record + ) { + let loadingTimeout = setTimeout(() => { + showLoading = true + }, 100) // Do not show loading spinner for the first 100ms drawerLoading = true try { drawer?.openDrawer() @@ -46,11 +102,13 @@ itemKind = isFlow ? 'flow' : 'script' edit = true dirtyPath = false - await loadTrigger() + await loadTrigger(defaultConfig) } catch (err) { sendUserToast(`Could not load sqs trigger: ${err.body}`, true) } finally { + clearTimeout(loadingTimeout) drawerLoading = false + showLoading = false } } @@ -59,6 +117,9 @@ fixedScriptPath_?: string, defaultValues?: Record ) { + let loadingTimeout = setTimeout(() => { + showLoading = true + }, 100) drawerLoading = true try { drawer?.openDrawer() @@ -69,143 +130,207 @@ script_path = fixedScriptPath aws_resource_path = defaultValues?.aws_resource_path ?? '' queue_url = defaultValues?.queue_url ?? '' - path = '' + path = defaultValues?.path ?? '' message_attributes = defaultValues?.message_attributes ?? [] aws_auth_resource_type = defaultValues?.aws_auth_resource_type ?? 'credentials' initialPath = '' edit = false dirtyPath = false + enabled = defaultValues?.enabled ?? false } finally { + initialConfig = structuredClone($state.snapshot(getSaveCfg())) + clearTimeout(loadingTimeout) drawerLoading = false + showLoading = false } } - async function loadTrigger(): Promise { + async function loadTriggerConfig(cfg?: Record): Promise { try { - const s = await SqsTriggerService.getSqsTrigger({ - workspace: $workspaceStore!, - path: initialPath - }) - script_path = s.script_path - initialScriptPath = s.script_path - aws_resource_path = s.aws_resource_path - queue_url = s.queue_url - is_flow = s.is_flow - message_attributes = s.message_attributes ?? [] - path = s.path - enabled = s.enabled - aws_auth_resource_type = s.aws_auth_resource_type - can_write = canWrite(s.path, s.extra_perms, $userStore) + script_path = cfg?.script_path + initialScriptPath = cfg?.script_path + aws_resource_path = cfg?.aws_resource_path + queue_url = cfg?.queue_url + is_flow = cfg?.is_flow + message_attributes = cfg?.message_attributes ?? [] + path = cfg?.path + enabled = cfg?.enabled + aws_auth_resource_type = cfg?.aws_auth_resource_type + can_write = canWrite(cfg?.path, cfg?.extra_perms, $userStore) + } catch (error) { + sendUserToast(`Could not load SQS trigger config: ${error.body}`, true) + } + } + + async function loadTrigger(defaultConfig?: Record): Promise { + try { + if (defaultConfig) { + loadTriggerConfig(defaultConfig) + return + } else { + const s = await SqsTriggerService.getSqsTrigger({ + workspace: $workspaceStore!, + path: initialPath + }) + loadTriggerConfig(s) + } } catch (error) { sendUserToast(`Could not load SQS trigger: ${error.body}`, true) } } - async function updateTrigger(): Promise { - if (edit) { - await SqsTriggerService.updateSqsTrigger({ - workspace: $workspaceStore!, - path: initialPath, - requestBody: { - path, - script_path, - aws_auth_resource_type, - enabled, - is_flow, - queue_url, - aws_resource_path, - message_attributes - } - }) - sendUserToast(`SQS trigger ${path} updated`) - } else { - await SqsTriggerService.createSqsTrigger({ - workspace: $workspaceStore!, - requestBody: { - enabled: true, - aws_resource_path, - queue_url, - aws_auth_resource_type, - path, - script_path, - is_flow, - message_attributes - } - }) - sendUserToast(`SQS trigger ${path} created`) + function getSaveCfg(): Record { + return { + script_path, + is_flow, + path, + aws_resource_path, + queue_url, + message_attributes, + aws_auth_resource_type, + enabled } - - if (!$usedTriggerKinds.includes('sqs')) { - $usedTriggerKinds = [...$usedTriggerKinds, 'sqs'] - } - dispatch('update') - drawer.closeDrawer() } + + async function handleToggleEnabled(nEnabled: boolean) { + enabled = nEnabled + if (!isDraftOnly && !hasDraft) { + await SqsTriggerService.setSqsTriggerEnabled({ + path: initialPath, + workspace: $workspaceStore ?? '', + requestBody: { enabled: nEnabled } + }) + sendUserToast(`${nEnabled ? 'enabled' : 'disabled'} SQS trigger ${initialPath}`) + } + } + + async function updateTrigger(): Promise { + deploymentLoading = true + const cfg = getSaveCfg() + const isSaved = await saveSqsTriggerFromCfg( + initialPath, + cfg, + edit, + $workspaceStore!, + usedTriggerKinds + ) + if (isSaved) { + onUpdate?.(cfg.path) + drawer?.closeDrawer() + } + deploymentLoading = false + } + + function getCaptureConfig(): Record { + return { + aws_resource_path, + queue_url, + message_attributes, + aws_auth_resource_type, + path + } + } + + $effect(() => { + onCaptureConfigChange?.(captureConfig, isValid) + }) + + $effect(() => { + if (!drawerLoading) { + handleConfigChange(sqsConfig, initialConfig, saveDisabled, edit, onConfigChange) + } + }) - - - - {#if !drawerLoading && can_write} - {#if edit} -
- { - sendUserToast(`${e.detail ? 'enabled' : 'disabled'} sqs trigger ${initialPath}`) - }} - /> -
- {/if} - +{#if useDrawer} + + + + {@render actions()} + + {@render config()} + + +{:else} +
+ + {#if customLabel} + {@render customLabel()} {/if} - {#if drawerLoading} -
- -

Loading...

-
- {:else} -
- + + {@render actions()} + + {@render config()} +
+{/if} + +{#snippet actions()} + {#if !drawerLoading} + + {/if} +{/snippet} + +{#snippet config()} + {#if drawerLoading} + {#if showLoading} + + {/if} + {:else} +
+ {#if description} + {@render description()} + {/if} + {#if !hideTooltips} + {#if edit} Changes can take up to 30 seconds to take effect. {:else} - New postgres triggers can take up to 30 seconds to start listening. + New SQS triggers can take up to 30 seconds to start listening. {/if} + {/if} +
+
+
+
-
-
- -
+ {#if !hideTarget}

Pick a script or flow to be triggered @@ -218,30 +343,35 @@ allowFlow={true} bind:itemKind bind:scriptPath={script_path} - allowRefresh + allowRefresh={can_write} + allowEdit={!$userStore?.operator} /> {#if emptyString(script_path)} + Create from template + {/if}

+ {/if} - -
- {/if} - - + +
+ {/if} +{/snippet} diff --git a/frontend/src/lib/components/triggers/sqs/SqsTriggerPanel.svelte b/frontend/src/lib/components/triggers/sqs/SqsTriggerPanel.svelte index e981d7dedf..24bd1137f0 100644 --- a/frontend/src/lib/components/triggers/sqs/SqsTriggerPanel.svelte +++ b/frontend/src/lib/components/triggers/sqs/SqsTriggerPanel.svelte @@ -1,135 +1,69 @@ - { - loadTriggers() - }} - bind:this={sqsTriggerEditor} -/> + onMount(() => { + sqsTriggerEditor && openSqsTriggerEditor(isFlow, selectedTrigger.isDraft ?? false) + }) + + const cloudDisabled = $derived(isCloudHosted()) + {#if !$enterpriseLicense} SQS triggers are an enterprise only feature. -{:else if isCloudHosted()} - - SQS triggers are disabled in the multi-tenant cloud. - {:else}
- - SQS triggers allow your scripts/flows to process messages from Amazon Simple Queue Service - (SQS) in real time. Each trigger listens to an SQS queue and executes a script or a flow when - new messages arrive. - - - {#if !newItem && sqsTriggers && sqsTriggers.length > 0} -
-
-
- {#each sqsTriggers as sqsTriggers (sqsTriggers.path)} -
-
{sqsTriggers.path}
-
- {sqsTriggers.queue_url} -
-
- -
-
- {/each} -
-
-
- {/if} - - { - sqsTriggerEditor?.openNew(isFlow, path, e.detail.config) - }} - on:addPreprocessor - on:updateSchema - on:testWithArgs - cloudDisabled={false} - triggerType="sqs" - {isFlow} - {path} - {isEditor} - {canHavePreprocessor} - {hasPreprocessor} - {newItem} - {openForm} - bind:showCapture={dontCloseOnLoad} - /> + {#snippet description()} + {#if cloudDisabled} + + SQS triggers are disabled in the multi-tenant cloud. + + {:else} + + SQS triggers allow you to execute scripts and flows in response to messages in an AWS + SQS queue. They can be configured to filter messages based on message attributes. + + {/if} + {/snippet} +
{/if} diff --git a/frontend/src/lib/components/triggers/sqs/utils.ts b/frontend/src/lib/components/triggers/sqs/utils.ts new file mode 100644 index 0000000000..7ef1afa60b --- /dev/null +++ b/frontend/src/lib/components/triggers/sqs/utils.ts @@ -0,0 +1,46 @@ +import { SqsTriggerService } from '$lib/gen' +import { sendUserToast } from '$lib/toast' +import { get, type Writable } from 'svelte/store' + +export async function saveSqsTriggerFromCfg( + initialPath: string, + cfg: Record, + edit: boolean, + workspace: string, + usedTriggerKinds: Writable +): Promise { + const requestBody = { + path: cfg.path, + script_path: cfg.script_path, + is_flow: cfg.is_flow, + aws_resource_path: cfg.aws_resource_path, + queue_url: cfg.queue_url, + message_attributes: cfg.message_attributes, + aws_auth_resource_type: cfg.aws_auth_resource_type, + enabled: cfg.enabled + } + try { + if (edit) { + await SqsTriggerService.updateSqsTrigger({ + workspace, + path: initialPath, + requestBody + }) + sendUserToast(`SQS trigger ${cfg.path} updated`) + } else { + await SqsTriggerService.createSqsTrigger({ + workspace, + requestBody: { ...requestBody, enabled: true } + }) + sendUserToast(`SQS trigger ${cfg.path} created`) + } + + if (!get(usedTriggerKinds).includes('sqs')) { + usedTriggerKinds.update((t) => [...t, 'sqs']) + } + return true + } catch (error) { + sendUserToast(error.body || error.message, true) + return false + } +} diff --git a/frontend/src/lib/components/triggers/testingBadge.svelte b/frontend/src/lib/components/triggers/testingBadge.svelte new file mode 100644 index 0000000000..eb8d288fbf --- /dev/null +++ b/frontend/src/lib/components/triggers/testingBadge.svelte @@ -0,0 +1,9 @@ + + + + + Config used for creating a testing endpoint + diff --git a/frontend/src/lib/components/triggers/triggers.svelte.ts b/frontend/src/lib/components/triggers/triggers.svelte.ts new file mode 100644 index 0000000000..5f40fb6126 --- /dev/null +++ b/frontend/src/lib/components/triggers/triggers.svelte.ts @@ -0,0 +1,456 @@ +import { + KafkaTriggerService, + MqttTriggerService, + NatsTriggerService, + PostgresTriggerService, + ScheduleService, + SqsTriggerService, + WebsocketTriggerService, + type GcpTrigger, + type KafkaTrigger, + type PostgresTrigger, + type Schedule, + type TriggersCount, + type HttpTrigger, + HttpTriggerService, + GcpTriggerService +} from '$lib/gen' +import { getLightConfig, sortTriggers, updateTriggersCount, type Trigger } from './utils' +import type { Writable } from 'svelte/store' +import type { TriggerType } from './utils' +import type { UserExt } from '$lib/stores' +import type { ScheduleTrigger } from '../triggers' +import { canWrite, formatCron } from '$lib/utils' + +export class Triggers { + #triggers = $state([]) + #selectedTriggerIndex = $state(undefined) + #selectedTrigger = $derived( + this.#selectedTriggerIndex !== undefined + ? this.#triggers[this.#selectedTriggerIndex] + : undefined + ) + #updateDraftCallback: (() => void) | undefined = undefined + + constructor( + triggers: Trigger[] = [], + selectedIndex?: number, + updateDraftCallback?: (() => void) | undefined + ) { + this.#triggers = triggers + this.#selectedTriggerIndex = selectedIndex + this.#updateDraftCallback = updateDraftCallback + } + + get selectedTrigger(): Trigger | undefined { + return this.#selectedTrigger + } + + get selectedTriggerIndex(): number | undefined { + return this.#selectedTriggerIndex + } + + set selectedTriggerIndex(index: number | undefined) { + if (index === undefined || index < 0 || index >= this.#triggers.length) { + this.#selectedTriggerIndex = undefined + } else { + this.#selectedTriggerIndex = index + } + this.#updateDraftCallback?.() + } + + get triggers(): Trigger[] { + return this.#triggers + } + + setTriggers(triggers: Trigger[]) { + this.#triggers = triggers + this.#updateDraftCallback?.() + } + + setDraftConfig(triggerIndex: number, draftConfig: Record | undefined) { + if (triggerIndex === undefined || triggerIndex < 0 || triggerIndex >= this.#triggers.length) { + return + } + this.#triggers[triggerIndex].draftConfig = draftConfig + this.#updateDraftCallback?.() + } + + getDraftTriggersSnapshot(): Trigger[] | undefined { + const draftTriggers = this.#triggers.filter((t) => t.draftConfig) + return draftTriggers.length > 0 ? $state.snapshot(draftTriggers) : undefined + } + + getSelectedTriggerSnapshot(): number | undefined { + return $state.snapshot(this.#selectedTriggerIndex) + } + + addDraftTrigger( + triggersCountStore: Writable, + type: TriggerType, + path?: string, + draftCfg?: Record + ): number { + const primaryScheduleExists = this.#triggers.some((t) => t.type === 'schedule' && t.isPrimary) + + // Create the new draft trigger + const draftId = crypto.randomUUID() + const isPrimary = type === 'schedule' && !primaryScheduleExists + const newTrigger = { + id: draftId, + type, + path, + isPrimary, + isDraft: true, + draftConfig: draftCfg + } + + this.#triggers.push(newTrigger) + this.#updateDraftCallback?.() + + updateTriggersCount(triggersCountStore, type, 'add', newTrigger.draftConfig) + + return this.#triggers.length - 1 + } + + deleteTrigger( + triggersCountStore: Writable, + triggerIndex: number + ): void { + if (triggerIndex === undefined || triggerIndex < 0 || triggerIndex >= this.#triggers.length) { + return + } + const { type } = this.#triggers[triggerIndex] + + this.#triggers = this.#triggers.filter((_, index) => index !== triggerIndex) + + updateTriggersCount(triggersCountStore, type, 'remove') + this.#updateDraftCallback?.() + } + + updateTriggers( + remoteTriggers: any[], + type: TriggerType, + user: UserExt | undefined = undefined + ): number { + const currentTriggers = this.#triggers + // Identify triggers with draftConfig to preserve + const configuredTriggers = currentTriggers.filter( + (t) => t.type === type && !t.isDraft && t.draftConfig + ) + + const configMap = new Map }>() + + configuredTriggers.forEach((t) => { + configMap.set(t.path ?? '', { draftConfig: t.draftConfig! }) + }) + + const backendTriggers = remoteTriggers.map((trigger) => { + const { draftConfig } = configMap.get(trigger.path) ?? {} + return { + type: type as TriggerType, + path: trigger.path, + isPrimary: type === 'schedule' && trigger.path === trigger.script_path, + isDraft: false, + canWrite: canWrite(trigger.path, trigger.extra_perms, user), + draftConfig: draftConfig, + lightConfig: getLightConfig(type, trigger) + } + }) + + const filteredTriggers = currentTriggers.filter((t) => t.type !== type || t.isDraft) + const newTriggers = sortTriggers([...filteredTriggers, ...backendTriggers]) + this.#triggers = newTriggers + + this.#updateDraftCallback?.() + return newTriggers.filter((t) => t.type === type).length + } + + async fetchSchedules( + triggersCountStore: Writable, + workspaceId: string | undefined, + path: string, + isFlow: boolean, + primarySchedule?: ScheduleTrigger | undefined | false, + user: UserExt | undefined = undefined + ): Promise { + if (!workspaceId) return + try { + //First update the store with legacy primary schedule + if (primarySchedule && !this.#triggers.some((s) => s.isPrimary)) { + const primary = { + type: 'schedule' as TriggerType, + path, + isPrimary: true, + isDraft: false, + draftConfig: { + schedule: primarySchedule.cron ? formatCron(primarySchedule.cron) : undefined, + args: primarySchedule.args, + timezone: primarySchedule.timezone, + summary: primarySchedule.summary, + description: primarySchedule.description, + enabled: primarySchedule.enabled + } + } + this.#triggers = [...this.#triggers, primary] + } + + const allDeployedSchedules: Schedule[] = await ScheduleService.listSchedules({ + workspace: workspaceId, + path, + isFlow + }) + + const scheduleCount = this.updateTriggers(allDeployedSchedules, 'schedule', user) + const updatedPrimarySchedule = this.#triggers.find((s) => s.isPrimary) + triggersCountStore.update((triggersCount) => { + return { + ...(triggersCount ?? {}), + schedule_count: scheduleCount, + primary_schedule: { + schedule: + updatedPrimarySchedule?.draftConfig?.schedule ?? + updatedPrimarySchedule?.lightConfig?.schedule + } + } + }) + + return + } catch (error) { + console.error('Failed to fetch schedules:', error) + return + } + } + + async fetchWebsocketTriggers( + triggersCountStore: Writable, + workspaceId: string | undefined, + path: string, + isFlow: boolean, + user: UserExt | undefined = undefined + ): Promise { + if (!workspaceId) return + try { + const wsTriggers = await WebsocketTriggerService.listWebsocketTriggers({ + workspace: workspaceId, + path, + isFlow + }) + const wsCount = this.updateTriggers(wsTriggers, 'websocket', user) + triggersCountStore.update((triggersCount) => { + return { + ...(triggersCount ?? {}), + websocket_count: wsCount + } + }) + } catch (error) { + console.error('Failed to fetch Websocket triggers:', error) + } + } + + async fetchPostgresTriggers( + triggersCountStore: Writable, + workspaceId: string | undefined, + path: string, + isFlow: boolean, + user: UserExt | undefined = undefined + ): Promise { + if (!workspaceId) return + try { + const pgTriggers: PostgresTrigger[] = await PostgresTriggerService.listPostgresTriggers({ + workspace: workspaceId, + path, + isFlow + }) + const pgCount = this.updateTriggers(pgTriggers, 'postgres', user) + triggersCountStore.update((triggersCount) => { + return { + ...(triggersCount ?? {}), + postgres_count: pgCount + } + }) + } catch (error) { + console.error('Failed to fetch Postgres triggers:', error) + } + } + + async fetchKafkaTriggers( + triggersCountStore: Writable, + workspaceId: string | undefined, + path: string, + isFlow: boolean, + user: UserExt | undefined = undefined + ): Promise { + if (!workspaceId) return + try { + const kafkaTriggers: KafkaTrigger[] = await KafkaTriggerService.listKafkaTriggers({ + workspace: workspaceId, + path, + isFlow + }) + const kafkaCount = this.updateTriggers(kafkaTriggers, 'kafka', user) + triggersCountStore.update((triggersCount) => { + return { + ...(triggersCount ?? {}), + kafka_count: kafkaCount + } + }) + } catch (error) { + console.error('Failed to fetch Kafka triggers:', error) + } + } + + async fetchNatsTriggers( + triggersCountStore: Writable, + workspaceId: string | undefined, + path: string, + isFlow: boolean, + user: UserExt | undefined = undefined + ): Promise { + if (!workspaceId) return + try { + const natsTriggers = await NatsTriggerService.listNatsTriggers({ + workspace: workspaceId, + path, + isFlow + }) + const natsCount = this.updateTriggers(natsTriggers, 'nats', user) + triggersCountStore.update((triggersCount) => { + return { + ...(triggersCount ?? {}), + nats_count: natsCount + } + }) + } catch (error) { + console.error('Failed to fetch NATS triggers:', error) + } + } + + async fetchMqttTriggers( + triggersCountStore: Writable, + workspaceId: string | undefined, + path: string, + isFlow: boolean, + user: UserExt | undefined = undefined + ): Promise { + if (!workspaceId) return + try { + const mqttTriggers = await MqttTriggerService.listMqttTriggers({ + workspace: workspaceId, + path, + isFlow + }) + const mqttCount = this.updateTriggers(mqttTriggers, 'mqtt', user) + triggersCountStore.update((triggersCount) => { + return { + ...(triggersCount ?? {}), + mqtt_count: mqttCount + } + }) + } catch (error) { + console.error('Failed to fetch MQTT triggers:', error) + } + } + + async fetchSqsTriggers( + triggersCountStore: Writable, + workspaceId: string | undefined, + path: string, + isFlow: boolean, + user: UserExt | undefined = undefined + ): Promise { + if (!workspaceId) return + try { + const sqsTriggers = await SqsTriggerService.listSqsTriggers({ + workspace: workspaceId, + path, + isFlow + }) + const sqsCount = this.updateTriggers(sqsTriggers, 'sqs', user) + triggersCountStore.update((triggersCount) => { + return { + ...(triggersCount ?? {}), + sqs_count: sqsCount + } + }) + } catch (error) { + console.error('Failed to fetch SQS triggers:', error) + } + } + + async fetchGcpTriggers( + triggersCountStore: Writable, + workspaceId: string | undefined, + path: string, + isFlow: boolean, + user: UserExt | undefined = undefined + ): Promise { + if (!workspaceId) return + try { + const gcpTriggers: GcpTrigger[] = await GcpTriggerService.listGcpTriggers({ + workspace: workspaceId, + path, + isFlow + }) + const gcpCount = this.updateTriggers(gcpTriggers, 'gcp', user) + triggersCountStore.update((triggersCount) => { + return { + ...(triggersCount ?? {}), + gcp_count: gcpCount + } + }) + } catch (error) { + console.error('Failed to fetch GCP Pub/Sub triggers:', error) + } + } + + async fetchHttpTriggers( + triggersCountStore: Writable, + workspaceId: string | undefined, + path: string, + isFlow: boolean, + user: UserExt | undefined = undefined + ): Promise { + if (!workspaceId) return + try { + const httpTriggers: HttpTrigger[] = await HttpTriggerService.listHttpTriggers({ + workspace: workspaceId, + path, + isFlow + }) + const httpCount = this.updateTriggers(httpTriggers, 'http', user) + triggersCountStore.update((triggersCount) => { + return { + ...(triggersCount ?? {}), + http_routes_count: httpCount + } + }) + } catch (error) { + console.error('Failed to fetch HTTP triggers:', error) + } + } + + async fetchTriggers( + triggersCountStore: Writable, + workspaceId: string | undefined, + path: string, + isFlow: boolean, + primarySchedule: ScheduleTrigger | undefined | false = undefined, + user: UserExt | undefined = undefined + ): Promise { + if (!workspaceId) return + + // Fetch each type of trigger + await Promise.all([ + this.fetchSchedules(triggersCountStore, workspaceId, path, isFlow, primarySchedule, user), + this.fetchHttpTriggers(triggersCountStore, workspaceId, path, isFlow, user), + this.fetchWebsocketTriggers(triggersCountStore, workspaceId, path, isFlow, user), + this.fetchPostgresTriggers(triggersCountStore, workspaceId, path, isFlow, user), + this.fetchKafkaTriggers(triggersCountStore, workspaceId, path, isFlow, user), + this.fetchNatsTriggers(triggersCountStore, workspaceId, path, isFlow, user), + this.fetchMqttTriggers(triggersCountStore, workspaceId, path, isFlow, user), + this.fetchSqsTriggers(triggersCountStore, workspaceId, path, isFlow, user), + this.fetchGcpTriggers(triggersCountStore, workspaceId, path, isFlow, user) + ]) + } +} diff --git a/frontend/src/lib/components/triggers/utils.ts b/frontend/src/lib/components/triggers/utils.ts new file mode 100644 index 0000000000..7daf829366 --- /dev/null +++ b/frontend/src/lib/components/triggers/utils.ts @@ -0,0 +1,529 @@ +import { Webhook, Mail, Calendar, Route, Unplug, Database, Terminal } from 'lucide-svelte' +import KafkaIcon from '$lib/components/icons/KafkaIcon.svelte' +import NatsIcon from '$lib/components/icons/NatsIcon.svelte' +import MqttIcon from '$lib/components/icons/MqttIcon.svelte' +import AwsIcon from '$lib/components/icons/AwsIcon.svelte' +import GoogleCloudIcon from '$lib/components/icons/GoogleCloudIcon.svelte' +import type { CaptureTriggerKind, Flow, NewScript, TriggersCount } from '$lib/gen/types.gen' +import type { Writable } from 'svelte/store' +import SchedulePollIcon from '../icons/SchedulePollIcon.svelte' +import { type TriggerKind } from '$lib/components/triggers' +import { saveScheduleFromCfg } from '$lib/components/flows/scheduleUtils' +import { saveHttpRouteFromCfg } from './http/utils' +import { saveWebsocketTriggerFromCfg } from './websocket/utils' +import { savePostgresTriggerFromCfg } from './postgres/utils' +import { saveKafkaTriggerFromCfg } from './kafka/utils' +import { saveSqsTriggerFromCfg } from './sqs/utils' +import { saveNatsTriggerFromCfg } from './nats/utils' +import { saveMqttTriggerFromCfg } from './mqtt/utils' +import { saveGcpTriggerFromCfg } from './gcp/utils' +import type { Triggers } from './triggers.svelte' +import { emptyString } from '$lib/utils' + +export const CLOUD_DISABLED_TRIGGER_TYPES = [ + 'nats', + 'kafka', + 'sqs', + 'mqtt', + 'gcp', + 'websocket', + 'postgres' +] + +export type TriggerType = + | 'webhook' + | 'email' + | 'schedule' + | 'http' + | 'websocket' + | 'postgres' + | 'kafka' + | 'nats' + | 'mqtt' + | 'sqs' + | 'gcp' + | 'poll' + | 'cli' + +export type Trigger = { + type: TriggerType + path?: string + isDraft?: boolean + isPrimary?: boolean + canWrite?: boolean + id?: string + draftConfig?: Record + captureConfig?: Record + extra?: Record + lightConfig?: Record +} + +// Map of trigger kinds to icons +export const triggerIconMap = { + webhook: Webhook, + email: Mail, + schedule: Calendar, + http: Route, + websocket: Unplug, + postgres: Database, + kafka: KafkaIcon, + nats: NatsIcon, + mqtt: MqttIcon, + sqs: AwsIcon, + gcp: GoogleCloudIcon, + primary_schedule: Calendar, + poll: SchedulePollIcon, + cli: Terminal +} + +/** + * Converts a TriggerType to a CaptureTriggerKind when a mapping exists + * @param triggerType The trigger type to convert + * @returns The corresponding CaptureTriggerKind or undefined if no mapping exists + */ +export function triggerTypeToCaptureKind(triggerType: TriggerType): CaptureTriggerKind | undefined { + // Define types that can be mapped to CaptureTriggerKind + const capturableTriggerTypes: TriggerType[] = [ + 'webhook', + 'email', + 'http', + 'websocket', + 'postgres', + 'kafka', + 'nats', + 'mqtt', + 'sqs', + 'gcp', + 'cli' + ] + + if (capturableTriggerTypes.includes(triggerType)) { + return triggerType as CaptureTriggerKind + } + + return undefined +} + +export function updateTriggersCount( + triggersCountStore: Writable, + type: TriggerType, + action: 'add' | 'remove', + primaryCfg?: Record, + isPrimary?: boolean +) { + // Map trigger types to their corresponding count property names + const countPropertyMap: Record = { + webhook: undefined, + email: undefined, + schedule: 'schedule_count', + http: 'http_routes_count', + websocket: 'websocket_count', + postgres: 'postgres_count', + kafka: 'kafka_count', + nats: 'nats_count', + mqtt: 'mqtt_count', + sqs: 'sqs_count', + gcp: 'gcp_count', + poll: undefined, + cli: undefined + } + + const countProperty = countPropertyMap[type] + + triggersCountStore.update((triggersCount) => { + // Handle special case for schedule + if (type === 'schedule') { + if (action === 'add' && primaryCfg) { + return { + ...(triggersCount ?? {}), + schedule_count: (triggersCount?.schedule_count ?? 0) + 1, + primary_schedule: primaryCfg?.schedule + } + } else if (action === 'remove') { + return { + ...(triggersCount ?? {}), + schedule_count: (triggersCount?.schedule_count ?? 1) - 1, + primary_schedule: isPrimary ? undefined : triggersCount?.primary_schedule + } + } + } + + // Handle standard count updates + if (countProperty && action === 'add') { + return { + ...(triggersCount ?? {}), + [countProperty]: (triggersCount?.[countProperty] ?? 0) + 1 + } + } else if (countProperty && action === 'remove') { + return { + ...(triggersCount ?? {}), + [countProperty]: (triggersCount?.[countProperty] ?? 1) - 1 + } + } + + return triggersCount + }) +} + +// TODO: Remove this once we've migrated all the trigger kinds to the new TriggerType enum +export function triggerKindToTriggerType(kind: TriggerKind): TriggerType | undefined { + switch (kind) { + case 'webhooks': + return 'webhook' + case 'emails': + return 'email' + case 'schedules': + return 'schedule' + case 'routes': + return 'http' + case 'websockets': + return 'websocket' + case 'postgres': + return 'postgres' + case 'kafka': + return 'kafka' + case 'nats': + return 'nats' + case 'mqtt': + return 'mqtt' + case 'sqs': + return 'sqs' + case 'gcp': + return 'gcp' + case 'scheduledPoll': + return 'poll' + default: + throw new Error(`Unknown TriggerKind: ${kind}`) + } +} + +export async function deployTriggers( + triggersToDeploy: Trigger[], + workspaceId: string | undefined, + isAdmin: boolean, + usedTriggerKinds: Writable, + initialPath?: string, + isNew?: boolean +) { + if (!workspaceId) return + + if (isNew && initialPath) { + triggersToDeploy.forEach((trigger) => { + trigger.draftConfig = { + ...trigger.draftConfig, + script_path: initialPath + } + }) + } + + // Map of trigger types to their save functions + const triggerSaveFunctions: Record = { + webhook: undefined, + email: undefined, + schedule: (trigger: Trigger) => { + if (trigger.isPrimary && initialPath) { + trigger.draftConfig = { + ...trigger.draftConfig, + path: initialPath, + script_path: initialPath + } + } + return saveScheduleFromCfg(trigger.draftConfig ?? {}, !trigger.isDraft, workspaceId) + }, + http: (trigger: Trigger) => + saveHttpRouteFromCfg( + trigger.path ?? trigger.draftConfig?.path ?? '', + trigger.draftConfig ?? {}, + !trigger.isDraft, + workspaceId, + isAdmin, + usedTriggerKinds + ), + websocket: (trigger: Trigger) => + saveWebsocketTriggerFromCfg( + trigger.path ?? trigger.draftConfig?.path ?? '', + trigger.draftConfig ?? {}, + !trigger.isDraft, + workspaceId, + usedTriggerKinds + ), + postgres: (trigger: Trigger) => + savePostgresTriggerFromCfg( + trigger.path ?? trigger.draftConfig?.path ?? '', + trigger.draftConfig ?? {}, + !trigger.isDraft, + workspaceId, + usedTriggerKinds + ), + kafka: (trigger: Trigger) => + saveKafkaTriggerFromCfg( + trigger.path ?? trigger.draftConfig?.path ?? '', + trigger.draftConfig ?? {}, + !trigger.isDraft, + workspaceId, + usedTriggerKinds + ), + nats: (trigger: Trigger) => + saveNatsTriggerFromCfg( + trigger.path ?? trigger.draftConfig?.path ?? '', + trigger.draftConfig ?? {}, + !trigger.isDraft, + workspaceId, + usedTriggerKinds + ), + mqtt: (trigger: Trigger) => + saveMqttTriggerFromCfg( + trigger.path ?? trigger.draftConfig?.path ?? '', + trigger.draftConfig ?? {}, + !trigger.isDraft, + workspaceId, + usedTriggerKinds + ), + sqs: (trigger: Trigger) => + saveSqsTriggerFromCfg( + trigger.path ?? trigger.draftConfig?.path ?? '', + trigger.draftConfig ?? {}, + !trigger.isDraft, + workspaceId, + usedTriggerKinds + ), + gcp: (trigger: Trigger) => + saveGcpTriggerFromCfg( + trigger.path ?? trigger.draftConfig?.path ?? '', + trigger.draftConfig ?? {}, + !trigger.isDraft, + workspaceId, + usedTriggerKinds + ), + poll: undefined, + cli: undefined + } + + await Promise.all( + triggersToDeploy.map(async (trigger) => { + const saveFunction = triggerSaveFunctions[trigger.type] + if (saveFunction) { + await saveFunction(trigger) + } else { + console.warn(`No save function defined for trigger type: ${trigger.type}`) + } + }) + ) +} + +export function handleSelectTriggerFromKind( + triggersState: Triggers, + triggersCountStore: Writable, + initialPath: string | undefined, + triggerKind: TriggerKind +) { + const triggerType = triggerKindToTriggerType(triggerKind) + + if (!triggerType) { + return + } + + const existingTriggerIndex = triggersState.triggers.findIndex( + (trigger) => trigger.type === triggerType + ) + + if (existingTriggerIndex !== -1) { + triggersState.selectedTriggerIndex = existingTriggerIndex + } else { + const newTrigger = triggersState.addDraftTrigger( + triggersCountStore, + triggerType, + triggerType === 'schedule' ? initialPath : undefined + ) + triggersState.selectedTriggerIndex = newTrigger + } +} + +export function handleConfigChange( + nCfg: Record, + initialConfig: Record | undefined, + saveDisabled: boolean, + edit: boolean, + onConfigChange?: (cfg: Record, saveDisabled: boolean, updated: boolean) => void +) { + let updated = false + if (!edit || !initialConfig) { + updated = true + } else { + // We ignore changes to enabled + let newCfg = { ...nCfg } + if ('enabled' in newCfg) { + delete newCfg.enabled + } + let initialCfg = { ...initialConfig } + if ('enabled' in initialCfg) { + delete initialCfg.enabled + } + if (JSON.stringify(newCfg) !== JSON.stringify(initialCfg)) { + updated = true + } + } + + onConfigChange?.(nCfg, saveDisabled, updated) +} + +export function getLightConfig( + triggerType: TriggerType, + trigger: Record +): Record | undefined { + if (triggerType === 'schedule') { + return { schedule: trigger.schedule, enable: trigger.enable, summary: trigger.summary } + } else if (triggerType === 'http') { + return { route_path: trigger.route_path, http_method: trigger.http_method } + } else if (triggerType === 'websocket') { + return { url: trigger.url } + } else if (triggerType === 'postgres') { + return { postgres_resource_path: trigger.postgres_resource_path } + } else if (triggerType === 'kafka') { + return { kafka_resource_path: trigger.kafka_resource_path, topics: trigger.topics } + } else if (triggerType === 'nats') { + return { nats_resource_path: trigger.nats_resource_path, subjects: trigger.subjects } + } else if (triggerType === 'mqtt') { + return { + mqtt_resource_path: trigger.mqtt_resource_path, + subscribe_topics: trigger.subscribe_topics + } + } else if (triggerType === 'sqs') { + return { queue_url: trigger.queue_url } + } else if (triggerType === 'gcp') { + return { gcp_resource_path: trigger.gcp_resource_path, topic: trigger.topic } + } else { + return undefined + } +} + +export function getTriggerLabel(trigger: Trigger): string { + const { type, isDraft, draftConfig, lightConfig, path } = trigger + const config = draftConfig ?? lightConfig + + if (type === 'webhook') { + return 'Webhook' + } else if (type === 'email') { + return 'Email' + } else if (type === 'cli') { + return 'CLI' + } else if (type === 'http' && !emptyString(config?.route_path)) { + return `${(draftConfig?.http_method ?? lightConfig?.http_method ?? 'post').toUpperCase()} ${draftConfig?.route_path ?? lightConfig?.route_path}` + } else if (type === 'schedule' && config?.summary) { + return `${config?.summary}` + } else if (type === 'kafka' && config?.topics && config?.kafka_resource_path) { + return `${config?.kafka_resource_path} - ${config?.topics.join(', ')}` + } else if (type === 'nats' && config?.subjects && config?.nats_resource_path) { + return `${config?.nats_resource_path} - ${config?.subjects.join(', ')}` + } else if (type === 'mqtt' && config?.subscribe_topics && config?.mqtt_resource_path) { + const topics = config?.subscribe_topics.map((topic: any) => topic.topic).join(', ') + return `${config?.mqtt_resource_path} - ${topics}` + } else if (type === 'sqs' && config?.queue_url) { + return `${config?.queue_url}` + } else if (type === 'gcp' && config?.gcp_resource_path && config?.topic) { + return `${config?.gcp_resource_path} - ${config?.topic}` + } else if (type === 'websocket' && config?.url) { + return `${config?.url}` + } else if (isDraft && draftConfig?.path) { + return `${draftConfig?.path}` + } else if (isDraft) { + return `New ${type.replace(/s$/, '')} trigger` + } else { + return path ?? '' + } +} + +export function sortTriggers(triggers: Trigger[]): Trigger[] { + const triggerTypeOrder = [ + 'webhook', + 'cli', + 'email', + 'poll', + 'schedule', + 'http', + 'websocket', + 'postgres', + 'kafka', + 'nats', + 'mqtt', + 'sqs', + 'gcp' + ] + + return triggers.sort((a, b) => { + // Draft triggers always come last + if (a.isDraft && !b.isDraft) return 1 + if (!a.isDraft && b.isDraft) return -1 + + // If both are drafts or both are not drafts, sort by type order + if (a.isDraft === b.isDraft) { + const aIndex = triggerTypeOrder.indexOf(a.type) + const bIndex = triggerTypeOrder.indexOf(b.type) + + // If both types are in the order array, sort by their position + if (aIndex >= 0 && bIndex >= 0) { + return aIndex - bIndex + } + + // If only one type is in the order array, it comes first + if (aIndex >= 0) return -1 + if (bIndex >= 0) return 1 + + // If neither type is in the order array, maintain original order + return 0 + } + + return 0 + }) +} + +export type FlowWithDraftAndDraftTriggers = Flow & { + draft?: Flow & { + draft_triggers?: Trigger[] + } +} + +export type NewScriptWithDraftAndDraftTriggers = NewScript & { + draft?: NewScript & { draft_triggers?: Trigger[] } + hash: string +} + +// Get rid of deployed triggers from the saved flow in the case there is a match with a deployed trigger +export function filterDraftTriggers( + savedValue: FlowWithDraftAndDraftTriggers | NewScriptWithDraftAndDraftTriggers, + triggersState: Triggers +): FlowWithDraftAndDraftTriggers | NewScriptWithDraftAndDraftTriggers { + const deployedTriggers = triggersState.triggers.filter((t) => !t.draftConfig && !t.isDraft) + let newSavedValue = savedValue + + const filterMatchingTriggers = (savedTriggers: Trigger[], deployedTriggers: Trigger[]) => { + return savedTriggers.filter( + (savedTrigger) => + !deployedTriggers.some( + (deployedTrigger) => + deployedTrigger.path === savedTrigger.draftConfig?.path && + deployedTrigger.type === savedTrigger.type + ) + ) + } + + const savedDraftTriggersFiltered = filterMatchingTriggers( + newSavedValue?.draft?.draft_triggers ?? [], + deployedTriggers + ) + if (newSavedValue?.draft?.draft_triggers) { + newSavedValue = { + ...newSavedValue, + draft: { + ...newSavedValue.draft, + draft_triggers: + savedDraftTriggersFiltered.length > 0 ? savedDraftTriggersFiltered : undefined + } + } as typeof newSavedValue + } + triggersState.setTriggers([ + ...triggersState.triggers.filter((t) => !t.draftConfig), + ...savedDraftTriggersFiltered + ]) + return newSavedValue +} diff --git a/frontend/src/lib/components/triggers/webhook/WebhooksCapture.svelte b/frontend/src/lib/components/triggers/webhook/WebhooksCapture.svelte new file mode 100644 index 0000000000..b6392bf41b --- /dev/null +++ b/frontend/src/lib/components/triggers/webhook/WebhooksCapture.svelte @@ -0,0 +1,80 @@ + + +{#if captureInfo} + + {#snippet description()} + {#if captureInfo.active} +

+ Send a POST request to the URL below to simulate a webhook event. +

+ {:else} +

+ Start capturing to listen to webhook events on this test URL. +

+ {/if} + {/snippet} + + + +
+{/if} diff --git a/frontend/src/lib/components/triggers/webhook/WebhooksConfigSection.svelte b/frontend/src/lib/components/triggers/webhook/WebhooksConfigSection.svelte index bd8bb7d044..1ee21df607 100644 --- a/frontend/src/lib/components/triggers/webhook/WebhooksConfigSection.svelte +++ b/frontend/src/lib/components/triggers/webhook/WebhooksConfigSection.svelte @@ -21,9 +21,6 @@ import { workspaceStore, userStore } from '$lib/stores' import UserSettings from '../../UserSettings.svelte' import { generateRandomString } from '$lib/utils' - import CopyableCodeBlock from '../../details/CopyableCodeBlock.svelte' - import CaptureSection, { type CaptureInfo } from '../CaptureSection.svelte' - import CaptureTable from '../CaptureTable.svelte' export let isFlow: boolean = false export let path: string = '' @@ -32,9 +29,6 @@ export let runnableArgs: any export let triggerTokens: TriggerTokens | undefined = undefined export let scopes: string[] = [] - export let showCapture: boolean = false - export let captureTable: CaptureTable | undefined = undefined - export let captureInfo: CaptureInfo | undefined = undefined let webhooks: { async: { @@ -198,17 +192,6 @@ function waitForJobCompletion(UUID) { return `${mainFunction}\n\n${triggerJobFunction}\n\n${waitForJobCompletionFunction}` } - let captureUrl = `${location.origin}/api/w/${$workspaceStore}/capture_u/webhook/${ - isFlow ? 'flow' : 'script' - }/${path}` - - function captureCurlCode() { - return `curl \\ --X POST ${captureUrl} \\ --H 'Content-Type: application/json' \\ --d '${JSON.stringify(cleanedRunnableArgs ?? {}, null, 2)}'` - } - function curlCode() { return `TOKEN='${token}' ${requestType !== 'get_path' ? `BODY='${JSON.stringify(cleanedRunnableArgs ?? {})}'` : ''} @@ -263,195 +246,162 @@ done` {scopes} /> -
- {#if showCapture && captureInfo} - - - -
+ {/if} +{/snippet} diff --git a/frontend/src/lib/components/triggers/websocket/WebsocketTriggersPanel.svelte b/frontend/src/lib/components/triggers/websocket/WebsocketTriggersPanel.svelte index 12142f8343..269d69bb94 100644 --- a/frontend/src/lib/components/triggers/websocket/WebsocketTriggersPanel.svelte +++ b/frontend/src/lib/components/triggers/websocket/WebsocketTriggersPanel.svelte @@ -1,127 +1,61 @@ - { - loadTriggers() - }} - bind:this={wsTriggerEditor} -/> - -{#if isCloudHosted()} - - WebSocket triggers are disabled in the multi-tenant cloud. - -{:else} -
- - WebSocket triggers allow real-time bidirectional communication between your scripts/flows and - external systems. Each trigger creates a unique WebSocket endpoint. - - - {#if !newItem && wsTriggers && wsTriggers.length > 0} -
-
-
- {#each wsTriggers as wsTriggers (wsTriggers.path)} -
-
{wsTriggers.path}
-
- {wsTriggers.url} -
-
- -
-
- {/each} -
-
-
- {/if} - - { - wsTriggerEditor?.openNew(isFlow, path, e.detail.config) - }} - on:addPreprocessor - on:updateSchema - on:testWithArgs - cloudDisabled={false} - triggerType="websocket" - {isFlow} - {path} - {isEditor} - {canHavePreprocessor} - {hasPreprocessor} - {newItem} - {openForm} - /> -
-{/if} +
+ + {#snippet description()} + {#if cloudDisabled} + + WebSocket triggers are disabled in the multi-tenant cloud. + + {:else} + + WebSocket triggers allow real-time bidirectional communication between your scripts/flows + and external systems. Each trigger creates a unique WebSocket endpoint. + + {/if} + {/snippet} + +
diff --git a/frontend/src/lib/components/triggers/websocket/utils.ts b/frontend/src/lib/components/triggers/websocket/utils.ts new file mode 100644 index 0000000000..c112cb0f1a --- /dev/null +++ b/frontend/src/lib/components/triggers/websocket/utils.ts @@ -0,0 +1,46 @@ +import { WebsocketTriggerService } from '$lib/gen' +import { sendUserToast } from '$lib/toast' +import type { Writable } from 'svelte/store' +import { get } from 'svelte/store' + +export async function saveWebsocketTriggerFromCfg( + initialPath: string, + triggerCfg: Record, + edit: boolean, + workspace: string, + usedTriggerKinds: Writable +): Promise { + const requestBody = { + path: triggerCfg.path, + script_path: triggerCfg.script_path, + is_flow: triggerCfg.is_flow, + url: triggerCfg.url, + filters: triggerCfg.filters, + initial_messages: triggerCfg.initial_messages, + url_runnable_args: triggerCfg.url_runnable_args, + can_return_message: triggerCfg.can_return_message + } + try { + if (edit) { + await WebsocketTriggerService.updateWebsocketTrigger({ + workspace: workspace, + path: initialPath, + requestBody: requestBody + }) + sendUserToast(`Websocket trigger ${triggerCfg.path} updated`) + } else { + await WebsocketTriggerService.createWebsocketTrigger({ + workspace: workspace, + requestBody: { ...requestBody, enabled: true } + }) + sendUserToast(`Websocket trigger ${triggerCfg.path} created`) + } + if (!get(usedTriggerKinds).includes('ws')) { + usedTriggerKinds.update((t) => [...t, 'ws']) + } + return true + } catch (error) { + sendUserToast(error.body || error.message, true) + return false + } +} diff --git a/frontend/src/lib/utils.ts b/frontend/src/lib/utils.ts index 2609eba53d..6c2bde6431 100644 --- a/frontend/src/lib/utils.ts +++ b/frontend/src/lib/utils.ts @@ -1161,6 +1161,7 @@ export type Item = { disabled?: boolean type?: 'action' | 'delete' hide?: boolean | undefined + extra?: Snippet } export function isObjectTooBig(obj: any): boolean { @@ -1245,6 +1246,15 @@ export function formatDateShort(dateString: string | undefined): string { }).format(date) } +export function toJsonStr(result: any) { + try { + // console.log(result) + return JSON.stringify(result ?? null, null, 4) ?? 'null' + } catch (e) { + return 'error stringifying object: ' + e.toString() + } +} + export function getOS() { const userAgent = window.navigator.userAgent const platform = window.navigator.platform @@ -1268,6 +1278,7 @@ export function getOS() { import { type ClassValue, clsx } from 'clsx' import { twMerge } from 'tailwind-merge' +import type { Snippet } from 'svelte' export function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs)) diff --git a/frontend/src/routes/(root)/(logged)/flows/add/+page.svelte b/frontend/src/routes/(root)/(logged)/flows/add/+page.svelte index e291917235..056424922b 100644 --- a/frontend/src/routes/(root)/(logged)/flows/add/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/flows/add/+page.svelte @@ -13,9 +13,9 @@ import { decodeState, emptySchema } from '$lib/utils' import { tick } from 'svelte' import { writable } from 'svelte/store' - import type { ScheduleTrigger } from '$lib/components/triggers' import type { GetInitialAndModifiedValues } from '$lib/components/common/confirmationModal/unsavedTypes' import { replaceScriptPlaceholderWithItsValues } from '$lib/hub' + import type { Trigger } from '$lib/components/triggers/utils' let nodraft = $page.url.searchParams.get('nodraft') @@ -43,6 +43,7 @@ initialArgs = $initialArgsStore $initialArgsStore = undefined } + let flowBuilder: FlowBuilder | undefined = undefined export const flowStore = writable({ summary: '', @@ -56,7 +57,8 @@ }) const flowStateStore = writable({}) - let savedPrimarySchedule: ScheduleTrigger | undefined = undefined + let draftTriggersFromUrl: Trigger[] | undefined = undefined + let selectedTriggerIndexFromUrl: number | undefined = undefined async function loadFlow() { loading = true let flow: Flow = { @@ -101,7 +103,10 @@ flow = state.flow pathStoreInit = state.path - savedPrimarySchedule = state.primarySchedule + draftTriggersFromUrl = state.draft_triggers + selectedTriggerIndexFromUrl = state.selected_trigger + flowBuilder?.setDraftTriggers(draftTriggersFromUrl) + flowBuilder?.setSelectedTriggerIndex(selectedTriggerIndexFromUrl) state?.selectedId && (selectedId = state?.selectedId) } else { if (templatePath) { @@ -153,7 +158,6 @@ loadFlow() let getSelectedId: (() => string) | undefined = undefined - let flowBuilder: FlowBuilder | undefined = undefined let getInitialAndModifiedValues: GetInitialAndModifiedValues | undefined = undefined @@ -181,7 +185,8 @@ {flowStateStore} {selectedId} {loading} - {savedPrimarySchedule} + {draftTriggersFromUrl} + {selectedTriggerIndexFromUrl} > diff --git a/frontend/src/routes/(root)/(logged)/flows/edit/[...path]/+page.svelte b/frontend/src/routes/(root)/(logged)/flows/edit/[...path]/+page.svelte index 51e0e9d6e3..8001ee0281 100644 --- a/frontend/src/routes/(root)/(logged)/flows/edit/[...path]/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/flows/edit/[...path]/+page.svelte @@ -15,6 +15,7 @@ import UnsavedConfirmationModal from '$lib/components/common/confirmationModal/UnsavedConfirmationModal.svelte' import type { ScheduleTrigger } from '$lib/components/triggers' import type { GetInitialAndModifiedValues } from '$lib/components/common/confirmationModal/unsavedTypes' + import type { Trigger } from '$lib/components/triggers/utils' let version: undefined | number = undefined let nodraft = $page.url.searchParams.get('nodraft') @@ -60,6 +61,9 @@ let savedPrimarySchedule: ScheduleTrigger | undefined = stateLoadedFromUrl?.primarySchedule + let draftTriggersFromUrl: Trigger[] | undefined = undefined + let selectedTriggerIndexFromUrl: number | undefined = undefined + let flowBuilder: FlowBuilder | undefined = undefined async function loadFlow(): Promise { @@ -82,12 +86,19 @@ }) const draftOrDeployed = cleanValueProperties(savedFlow?.draft || savedFlow) - const urlScript = cleanValueProperties(stateLoadedFromUrl.flow) + const urlScript = cleanValueProperties({ + ...stateLoadedFromUrl.flow, + draft_triggers: stateLoadedFromUrl.draft_triggers + }) flow = stateLoadedFromUrl.flow - savedPrimarySchedule = stateLoadedFromUrl.primarySchedule + draftTriggersFromUrl = stateLoadedFromUrl.draft_triggers + selectedTriggerIndexFromUrl = stateLoadedFromUrl.selected_trigger + flowBuilder?.setDraftTriggers(draftTriggersFromUrl) + flowBuilder?.setSelectedTriggerIndex(selectedTriggerIndexFromUrl) + const selectedId = stateLoadedFromUrl?.selectedId ?? 'settings-metadata' const reloadAction = () => { stateLoadedFromUrl = undefined - goto(`/flows/edit/${statePath}`) + goto(`/flows/edit/${statePath}?selected=${selectedId}`) loadFlow() } if (orderedJsonStringify(draftOrDeployed) === orderedJsonStringify(urlScript)) { @@ -133,15 +144,18 @@ ? { ...structuredClone(flowWithDraft.draft), path: flowWithDraft.draft.path ?? flowWithDraft.path // backward compatibility for old drafts missing path - } + } : undefined } as Flow & { - draft?: Flow + draft?: Flow & { + draft_triggers?: Trigger[] + } } if (flowWithDraft.draft != undefined && !nobackenddraft) { flow = flowWithDraft.draft savedPrimarySchedule = flowWithDraft?.draft?.['primary_schedule'] flowBuilder?.setPrimarySchedule(savedPrimarySchedule) + flowBuilder?.setDraftTriggers(flowWithDraft?.draft?.['draft_triggers']) if (!flowWithDraft.draft_only) { const deployed = cleanValueProperties(flowWithDraft) @@ -178,6 +192,7 @@ } } else { flow = flowWithDraft + flowBuilder?.setDraftTriggers(undefined) } } @@ -200,6 +215,7 @@ return } diffDrawer.closeDrawer() + stateLoadedFromUrl = undefined goto(`/flows/edit/${savedFlow.draft.path}`) loadFlow() } @@ -217,6 +233,7 @@ path: savedFlow.path }) } + stateLoadedFromUrl = undefined goto(`/flows/edit/${savedFlow.path}`) loadFlow() } @@ -251,6 +268,8 @@ bind:savedFlow {diffDrawer} {savedPrimarySchedule} + {draftTriggersFromUrl} + {selectedTriggerIndexFromUrl} bind:version bind:getInitialAndModifiedValues > diff --git a/frontend/src/routes/(root)/(logged)/flows/get/[...path]/+page.svelte b/frontend/src/routes/(root)/(logged)/flows/get/[...path]/+page.svelte index a20cfd427a..55bf1d5d1c 100644 --- a/frontend/src/routes/(root)/(logged)/flows/get/[...path]/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/flows/get/[...path]/+page.svelte @@ -41,35 +41,26 @@ } from 'lucide-svelte' import DetailPageHeader from '$lib/components/details/DetailPageHeader.svelte' - import WebhooksPanel from '$lib/components/triggers/webhook/WebhooksPanel.svelte' - import CliHelpBox from '$lib/components/CliHelpBox.svelte' import FlowGraphViewer from '$lib/components/FlowGraphViewer.svelte' - import RunPageSchedules from '$lib/components/RunPageSchedules.svelte' import { createAppFromFlow } from '$lib/components/details/createAppFromScript' import { importStore } from '$lib/components/apps/store' import TimeAgo from '$lib/components/TimeAgo.svelte' - import ClipboardPanel from '$lib/components/details/ClipboardPanel.svelte' import FlowGraphViewerStep from '$lib/components/FlowGraphViewerStep.svelte' import GfmMarkdown from '$lib/components/GfmMarkdown.svelte' import FlowHistory from '$lib/components/flows/FlowHistory.svelte' - import EmailTriggerPanel from '$lib/components/details/EmailTriggerPanel.svelte' import Star from '$lib/components/Star.svelte' - import RoutesPanel from '$lib/components/triggers/http/RoutesPanel.svelte' import { Highlight } from 'svelte-highlight' import json from 'svelte-highlight/languages/json' import { writable } from 'svelte/store' - import TriggersBadge from '$lib/components/graph/renderers/triggers/TriggersBadge.svelte' import InputSelectedBadge from '$lib/components/schema/InputSelectedBadge.svelte' - import WebsocketTriggersPanel from '$lib/components/triggers/websocket/WebsocketTriggersPanel.svelte' - import KafkaTriggersPanel from '$lib/components/triggers/kafka/KafkaTriggersPanel.svelte' - import NatsTriggersPanel from '$lib/components/triggers/nats/NatsTriggersPanel.svelte' - import PostgresTriggersPanel from '$lib/components/triggers/postgres/PostgresTriggersPanel.svelte' import Toggle from '$lib/components/Toggle.svelte' - import MqttTriggersPanel from '$lib/components/triggers/mqtt/MqttTriggersPanel.svelte' - import SqsTriggerPanel from '$lib/components/triggers/sqs/SqsTriggerPanel.svelte' - import { onDestroy } from 'svelte' + import { onDestroy, tick } from 'svelte' import LogViewer from '$lib/components/LogViewer.svelte' - import GcpTriggerPanel from '$lib/components/triggers/gcp/GcpTriggerPanel.svelte' + import TriggersEditor from '$lib/components/triggers/TriggersEditor.svelte' + import type { TriggerContext } from '$lib/components/triggers' + import { setContext } from 'svelte' + import TriggersBadge from '$lib/components/graph/renderers/triggers/TriggersBadge.svelte' + import { Triggers } from '$lib/components/triggers/triggers.svelte' let flow: Flow | undefined let can_write = false @@ -85,9 +76,29 @@ let intervalId: NodeJS.Timeout | undefined = undefined + $: { + const cliTrigger = triggersState.triggers.find((t) => t.type === 'cli') + if (cliTrigger) { + cliTrigger.extra = { + cliCommand: `wmill flow run ${flow?.path} -d '${JSON.stringify(args)}'` + } + } + } + const triggersCount = writable(undefined) - $: cliCommand = `wmill flow run ${flow?.path} -d '${JSON.stringify(args)}'` + // Add triggers context store + const triggersState = new Triggers([ + { type: 'webhook', path: '', isDraft: false }, + { type: 'email', path: '', isDraft: false }, + { type: 'cli', path: '', isDraft: false } + ]) + setContext('TriggerContext', { + triggersCount, + simplifiedPoll: writable(false), + showCaptureHint: writable(undefined), + triggersState + }) let previousPath: string | undefined = undefined $: { @@ -96,6 +107,7 @@ previousPath = path loadFlow() loadTriggersCount() + loadTriggers() } } } @@ -124,6 +136,17 @@ }) } + async function loadTriggers(): Promise { + await triggersState.fetchTriggers( + triggersCount, + $workspaceStore, + path, + true, + undefined, + $userStore + ) + } + async function loadFlow(): Promise { flow = await FlowService.getFlowByPath({ workspace: $workspaceStore!, @@ -371,7 +394,7 @@ } } let stepDetail: FlowModule | string | undefined = undefined - let token = 'TOKEN_TO_CREATE' + let rightPaneSelected = 'saved_inputs' let savedInputsV2: SavedInputsV2 | undefined = undefined let flowHistory: FlowHistory | undefined = undefined @@ -398,7 +421,6 @@ {#if flow} { + onSelect={async (triggerIndex: number) => { rightPaneSelected = 'triggers' + await tick() + triggersState.selectedTriggerIndex = triggerIndex }} + small={false} /> {#if $workspaceStore} @@ -590,89 +616,23 @@
- -
- -
-
- -
- -
-
- -
- -
-
- - -
- -
-
- - -
- -
-
- - -
- -
-
- -
- -
-
- - -
- -
-
- - -
- -
-
- - -
- -
-
- -
- -
-
- -
- - -
-
- {#if stepDetail} {/if} + + + {/if} diff --git a/frontend/src/routes/(root)/(logged)/gcp_triggers/+page.svelte b/frontend/src/routes/(root)/(logged)/gcp_triggers/+page.svelte index 9fcaa0f202..2fd36a1cc1 100644 --- a/frontend/src/routes/(root)/(logged)/gcp_triggers/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/gcp_triggers/+page.svelte @@ -263,7 +263,7 @@ - + - + - + - + - + - + - + { @@ -122,7 +120,6 @@ searchParams={$page.url.searchParams} {script} {showMeta} - {savedPrimarySchedule} replaceStateFn={(path) => replaceState(path, $page.state)} > diff --git a/frontend/src/routes/(root)/(logged)/scripts/edit/[...path]/+page.svelte b/frontend/src/routes/(root)/(logged)/scripts/edit/[...path]/+page.svelte index fbe85f83c0..803b29bce8 100644 --- a/frontend/src/routes/(root)/(logged)/scripts/edit/[...path]/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/scripts/edit/[...path]/+page.svelte @@ -12,6 +12,7 @@ import UnsavedConfirmationModal from '$lib/components/common/confirmationModal/UnsavedConfirmationModal.svelte' import type { ScheduleTrigger } from '$lib/components/triggers' import type { GetInitialAndModifiedValues } from '$lib/components/common/confirmationModal/unsavedTypes' + import type { Trigger } from '$lib/components/triggers/utils' let initialState = window.location.hash != '' ? window.location.hash.slice(1) : undefined let initialArgs = {} @@ -26,7 +27,8 @@ let scriptLoadedFromUrl = initialState != undefined ? decodeState(initialState) : undefined - let script: NewScript | undefined = undefined + + let script: (NewScript & { draft_triggers?: Trigger[] }) | undefined = undefined let initialPath: string = '' @@ -37,7 +39,7 @@ let savedScript: NewScriptWithDraft | undefined = undefined let fullyLoaded = false - let savedPrimarySchedule: ScheduleTrigger | undefined = scriptLoadedFromUrl?.primarySchedule + let savedPrimarySchedule: ScheduleTrigger | undefined = undefined async function loadScript(): Promise { fullyLoaded = false @@ -98,10 +100,12 @@ savedScript = structuredClone(scriptWithDraft) if (scriptWithDraft.draft != undefined) { script = scriptWithDraft.draft + scriptBuilder?.setDraftTriggers(script.draft_triggers) if (script['primary_schedule']) { savedPrimarySchedule = script['primary_schedule'] scriptBuilder?.setPrimarySchedule(savedPrimarySchedule) } + if (!scriptWithDraft.draft_only) { reloadAction = async () => { scriptLoadedFromUrl = undefined @@ -153,6 +157,7 @@ if (script) { initialPath = script.path + scriptBuilder?.setDraftTriggers(script.draft_triggers) scriptBuilder?.setCode(script.content) if (topHash) { script.parent_hash = topHash @@ -176,6 +181,7 @@ } diffDrawer.closeDrawer() goto(`/scripts/edit/${savedScript.draft.path}`) + scriptLoadedFromUrl = undefined loadScript() } @@ -193,6 +199,7 @@ }) } goto(`/scripts/edit/${savedScript.path}`) + scriptLoadedFromUrl = undefined loadScript() } diff --git a/frontend/src/routes/(root)/(logged)/scripts/get/[...hash]/+page.svelte b/frontend/src/routes/(root)/(logged)/scripts/get/[...hash]/+page.svelte index 0a7d41a4dc..dd4f7fa15f 100644 --- a/frontend/src/routes/(root)/(logged)/scripts/get/[...hash]/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/scripts/get/[...hash]/+page.svelte @@ -21,7 +21,7 @@ import { enterpriseLicense, hubBaseUrlStore, userStore, workspaceStore } from '$lib/stores' import { isDeployable, ALL_DEPLOYABLE } from '$lib/utils_deployable' - import { onDestroy } from 'svelte' + import { onDestroy, setContext, tick } from 'svelte' import HighlightCode from '$lib/components/HighlightCode.svelte' import { Tabs, @@ -42,10 +42,8 @@ import DeployWorkspaceDrawer from '$lib/components/DeployWorkspaceDrawer.svelte' import SavedInputsV2 from '$lib/components/SavedInputsV2.svelte' - import WebhooksPanel from '$lib/components/triggers/webhook/WebhooksPanel.svelte' import DetailPageLayout from '$lib/components/details/DetailPageLayout.svelte' import DetailPageHeader from '$lib/components/details/DetailPageHeader.svelte' - import CliHelpBox from '$lib/components/CliHelpBox.svelte' import { Activity, Archive, @@ -68,30 +66,22 @@ import { scriptToHubUrl } from '$lib/hub' import SharedBadge from '$lib/components/SharedBadge.svelte' import ScriptVersionHistory from '$lib/components/ScriptVersionHistory.svelte' - import RunPageSchedules from '$lib/components/RunPageSchedules.svelte' import { createAppFromScript } from '$lib/components/details/createAppFromScript' import { importStore } from '$lib/components/apps/store' import TimeAgo from '$lib/components/TimeAgo.svelte' - import ClipboardPanel from '$lib/components/details/ClipboardPanel.svelte' import PersistentScriptDrawer from '$lib/components/PersistentScriptDrawer.svelte' import GfmMarkdown from '$lib/components/GfmMarkdown.svelte' - import EmailTriggerPanel from '$lib/components/details/EmailTriggerPanel.svelte' import Star from '$lib/components/Star.svelte' import LogViewer from '$lib/components/LogViewer.svelte' - import RoutesPanel from '$lib/components/triggers/http/RoutesPanel.svelte' import { Highlight } from 'svelte-highlight' import json from 'svelte-highlight/languages/json' import { writable } from 'svelte/store' - import TriggersBadge from '$lib/components/graph/renderers/triggers/TriggersBadge.svelte' - import WebsocketTriggersPanel from '$lib/components/triggers/websocket/WebsocketTriggersPanel.svelte' - import KafkaTriggersPanel from '$lib/components/triggers/kafka/KafkaTriggersPanel.svelte' - import NatsTriggersPanel from '$lib/components/triggers/nats/NatsTriggersPanel.svelte' - import PostgresTriggersPanel from '$lib/components/triggers/postgres/PostgresTriggersPanel.svelte' import Toggle from '$lib/components/Toggle.svelte' import InputSelectedBadge from '$lib/components/schema/InputSelectedBadge.svelte' - import MqttTriggersPanel from '$lib/components/triggers/mqtt/MqttTriggersPanel.svelte' - import SqsTriggerPanel from '$lib/components/triggers/sqs/SqsTriggerPanel.svelte' - import GcpTriggerPanel from '$lib/components/triggers/gcp/GcpTriggerPanel.svelte' + import type { TriggerContext } from '$lib/components/triggers' + import TriggersBadge from '$lib/components/graph/renderers/triggers/TriggersBadge.svelte' + import TriggersEditor from '$lib/components/triggers/TriggersEditor.svelte' + import { Triggers } from '$lib/components/triggers/triggers.svelte' let script: Script | undefined let topHash: string | undefined @@ -107,7 +97,14 @@ let inputSelected: 'saved' | 'history' | undefined = undefined let jsonView = false - $: cliCommand = `wmill script run ${script?.path} -d '${JSON.stringify(args)}'` + $: { + const cliTrigger = triggersState.triggers.find((t) => t.type === 'cli') + if (cliTrigger) { + cliTrigger.extra = { + cliCommand: `wmill script run ${script?.path} -d '${JSON.stringify(args)}'` + } + } + } $: loading = !script @@ -121,6 +118,19 @@ const triggersCount = writable(undefined) + // Add triggers context store + const triggersState = new Triggers([ + { type: 'webhook', path: '', isDraft: false }, + { type: 'email', path: '', isDraft: false }, + { type: 'cli', path: '', isDraft: false } + ]) + setContext('TriggerContext', { + triggersCount, + simplifiedPoll: writable(false), + showCaptureHint: writable(undefined), + triggersState + }) + async function deleteScript(hash: string): Promise { try { await ScriptService.deleteScriptByHash({ workspace: $workspaceStore!, hash }) @@ -167,11 +177,15 @@ } let starred: boolean | undefined = undefined - async function loadTriggersCount(path: string) { - $triggersCount = await ScriptService.getTriggersCountOfScript({ - workspace: $workspaceStore!, - path: path - }) + async function loadTriggers(path: string): Promise { + await triggersState.fetchTriggers( + triggersCount, + $workspaceStore, + path, + false, + undefined, + $userStore + ) } async function loadScript(hash: string): Promise { @@ -194,7 +208,7 @@ can_write = script.workspace_id == $workspaceStore && canWrite(script.path, script.extra_perms!, $userStore) - loadTriggersCount(script.path) + loadTriggers(script.path) if (script.path && script.archived) { const script_by_path = await ScriptService.getScriptByPath({ @@ -497,7 +511,6 @@ } } - let token = 'TOKEN_TO_CREATE' let rightPaneSelected = 'saved_inputs' let savedInputsV2: SavedInputsV2 | undefined = undefined @@ -533,11 +546,7 @@ {#key script.hash} - + { + rightPaneSelected = 'triggers' + }} > { - rightPaneSelected = 'triggers' + selected={rightPaneSelected === 'triggers'} + onSelect={async (triggerIndex: number) => { + if (rightPaneSelected !== 'triggers') { + rightPaneSelected = 'triggers' + } + await tick() + triggersState.selectedTriggerIndex = triggerIndex }} /> @@ -740,76 +757,18 @@ /> {/if} - -
- -
-
- -
- -
-
- -
- -
-
- -
- -
-
- -
- -
-
- -
- -
-
- -
- -
-
- -
- -
-
- -
- -
-
- -
- -
-
- -
- -
+ +
@@ -878,12 +837,6 @@ {/if} - -
- - -
-
{/key} {/if} diff --git a/frontend/src/routes/(root)/(logged)/sqs_triggers/+page.svelte b/frontend/src/routes/(root)/(logged)/sqs_triggers/+page.svelte index b5a5522652..f117702fba 100644 --- a/frontend/src/routes/(root)/(logged)/sqs_triggers/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/sqs_triggers/+page.svelte @@ -220,7 +220,7 @@ - + - + >({}) const selectedIdStore = writable('settings-metadata') - const primaryScheduleStore = writable(undefined) const triggersCount = writable(undefined) - const selectedTriggerStore = writable< - 'webhooks' | 'emails' | 'schedules' | 'cli' | 'routes' | 'websockets' | 'scheduledPoll' - >('webhooks') setContext('TriggerContext', { - primarySchedule: primaryScheduleStore, - selectedTrigger: selectedTriggerStore, triggersCount: triggersCount, simplifiedPoll: writable(false), - defaultValues: writable(undefined), - captureOn: writable(undefined), - showCaptureHint: writable(undefined) + showCaptureHint: writable(undefined), + triggersState: new Triggers() }) setContext('FlowEditorContext', { From 78d6a571aac8906a23a06ae1d26a0cf5a0599b11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Wicha?= Date: Wed, 21 May 2025 23:03:28 +0100 Subject: [PATCH 444/739] Allow maximum length of tld in email validation (#5792) Signed-off-by: Rafal Wicha --- frontend/src/lib/components/StringTypeNarrowing.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/lib/components/StringTypeNarrowing.svelte b/frontend/src/lib/components/StringTypeNarrowing.svelte index 955ccd6fde..bbecfae658 100644 --- a/frontend/src/lib/components/StringTypeNarrowing.svelte +++ b/frontend/src/lib/components/StringTypeNarrowing.svelte @@ -67,7 +67,7 @@ $: { if (format == 'email') { - pattern = '^[\\w-+.]+@([\\w-]+\\.)+[\\w-]{2,4}$' + pattern = '^[\\w-+.]+@([\\w-]+\\.)+[\\w-]{2,63}$' } } From 145a63f3f80ef4aa7cd05ce59b4fd4757967290c Mon Sep 17 00:00:00 2001 From: centdix <40307056+centdix@users.noreply.github.com> Date: Thu, 22 May 2025 00:16:02 +0200 Subject: [PATCH 445/739] internal: clean aider flows (#5788) * add shareable flow * clean existing flows * apply to linear * cleaning * fix * cleaning --- .github/workflows/aider-after-review.yaml | 200 ++------- .github/workflows/aider-common.yml | 480 ++++++++++++++++++++++ .github/workflows/aider.yaml | 364 +++------------- .github/workflows/linear-issue.yaml | 242 ++--------- 4 files changed, 616 insertions(+), 670 deletions(-) create mode 100644 .github/workflows/aider-common.yml diff --git a/.github/workflows/aider-after-review.yaml b/.github/workflows/aider-after-review.yaml index 649ef52724..2ba3483a6c 100644 --- a/.github/workflows/aider-after-review.yaml +++ b/.github/workflows/aider-after-review.yaml @@ -5,12 +5,14 @@ on: types: [submitted] jobs: - auto-fix-review: + check-and-prepare: if: github.event.review.state == 'changes_requested' && contains(github.event.pull_request.title, '[Aider PR]') - runs-on: ubicloud-standard-8 + runs-on: ubicloud-standard-2 permissions: contents: write pull-requests: write + outputs: + prompt_content: ${{ steps.prepare_prompt.outputs.prompt_content }} env: GEMINI_API_KEY: ${{ secrets.GOOGLE_API_KEY }} GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }} @@ -19,66 +21,24 @@ jobs: WINDMILL_TOKEN: ${{ secrets.WINDMILL_TOKEN }} steps: - - name: Harden Runner - uses: step-security/harden-runner@v2 - with: - egress-policy: audit - - - name: Check out code - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Configure Git User - run: | - git config --global user.name "github-actions[bot]" - git config --global user.email "github-actions[bot]@users.noreply.github.com" - - - name: Checkout PR Branch + - name: Acknowledge Request env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_REPOSITORY: ${{ github.repository }} run: | - echo "PR review trigger: Checking out PR branch..." - PR_NUMBER=${{ github.event.pull_request.number }} - PR_HEAD_REF=$(gh pr view $PR_NUMBER --json headRefName -q .headRefName --repo $GITHUB_REPOSITORY) - if [[ -z "$PR_HEAD_REF" || "$PR_HEAD_REF" == "null" ]]; then - echo "::error::Could not determine PR head branch for PR #$PR_NUMBER via gh CLI." - exit 1 - fi - echo "Checking out PR head branch: $PR_HEAD_REF for PR #$PR_NUMBER" - git fetch origin "refs/heads/${PR_HEAD_REF}:refs/remotes/origin/${PR_HEAD_REF}" --no-tags - git checkout "$PR_HEAD_REF" - echo "Successfully checked out branch $(git rev-parse --abbrev-ref HEAD)" + echo "Commenting on PR #${{ github.event.pull_request.number }} to acknowledge the /aider command." + gh pr comment ${{ github.event.pull_request.number }} --body "🤖 Aider is starting to work on your request. Please be patient, this might take a few minutes." --repo $GITHUB_REPOSITORY - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: "3.12" - - - name: Install Aider and Dependencies - run: | - python -m pip install aider-install; aider-install - pip install -U google-generativeai - sudo apt-get update && sudo apt-get install -y jq - - - name: Generate Prompt from Review - id: generate_prompt + - name: Prepare prompt for Aider + id: prepare_prompt shell: bash run: | - mkdir -p .github/aider - PROMPT_FILE_PATH=".github/aider/review-prompt.txt" - # Get PR review body REVIEW_BODY="${{ github.event.review.body }}" REVIEW_BODY_Q=$(printf '%q' "$REVIEW_BODY") PR_NUMBER="${{ github.event.pull_request.number }}" - # Get PR description for context NOT USED FOR NOW - # PR_DETAILS=$(gh pr view $PR_NUMBER --json title,body --repo $GITHUB_REPOSITORY) - # PR_TITLE=$(echo "$PR_DETAILS" | jq -r .title) - # PR_BODY=$(echo "$PR_DETAILS" | jq -r .body) - # Get all PR review comments ALL_REVIEW_COMMENTS=$(gh api \ -H "Accept: application/vnd.github+json" \ @@ -87,132 +47,20 @@ jobs: | jq '[.[] | {diff_hunk: .diff_hunk, path: .path, body: .body}]') BASE_PROMPT="Fix the following issues in the PR based on the review feedback. The review body is prepended with REVIEW. The review comments are prepended with REVIEW_COMMENTS. The review body and comments are separated by a blank line." - COMPLETE_PROMPT=$(printf "%s\nREVIEW:\n%s\nREVIEW_COMMENTS:\n%s" \ - "$BASE_PROMPT" "$REVIEW_BODY_Q" "$ALL_REVIEW_COMMENTS") - echo "$COMPLETE_PROMPT" > "$PROMPT_FILE_PATH" - echo "PROMPT_FILE_PATH=$PROMPT_FILE_PATH" >> $GITHUB_OUTPUT + printf -v COMPLETE_PROMPT "%s\nREVIEW:\n%s\nREVIEW_COMMENTS:\n%s" \ + "$BASE_PROMPT" "$REVIEW_BODY_Q" "$ALL_REVIEW_COMMENTS" - - name: Probe Chat for Relevant Files - id: probe_files - env: - PROMPT_CONTENT_FILE: ${{ steps.generate_prompt.outputs.PROMPT_FILE_PATH }} - run: | - echo "Running probe-chat to find relevant files..." - if [[ ! -f "$PROMPT_CONTENT_FILE" ]]; then - echo "::error::Prompt file $PROMPT_CONTENT_FILE not found!" - exit 1 - fi - PROMPT_CONTENT=$(cat "$PROMPT_CONTENT_FILE") - if [ -z "$PROMPT_CONTENT" ]; then - echo "::error::Prompt content is empty!" - exit 1 - fi + echo "$COMPLETE_PROMPT" - PROMPT_ESCAPED=$(jq -Rs . <<< "$PROMPT_CONTENT") + # Use the proper multi-line output format + echo "prompt_content<> $GITHUB_OUTPUT + echo "$COMPLETE_PROMPT" >> $GITHUB_OUTPUT + echo "EOF" >> $GITHUB_OUTPUT - MESSAGE_FOR_PROBE=$(jq -n --arg prompt_escaped "$PROMPT_ESCAPED" \ - '{ "message": "I'\''m giving you a request that needs to be implemented. Your role is ONLY to give me the files that are relevant to the request and nothing else. The request is prepended with the word REQUEST.\\nREQUEST: \($prompt_escaped). Give me all the files relevant to this request. Your output MUST be a single json array that can be parsed with programatic json parsing, with the relevant files. Files can be rust or typescript or javascript files. DO NOT INCLUDE ANY OTHER TEXT IN YOUR OUTPUT. ONLY THE JSON ARRAY. Example of output: [\"file1.py\", \"file2.py\"]" }' | jq -r .message) - - set -o pipefail - PROBE_OUTPUT=$(npx --yes @buger/probe-chat@latest --max-iterations 50 --model-name gemini-2.5-pro-preview-05-06 --message "$MESSAGE_FOR_PROBE") || { - echo "::error::probe-chat command failed. Output:" - echo "$PROBE_OUTPUT" - exit 1 - } - set +o pipefail - echo "Probe-chat raw output:" - echo "$PROBE_OUTPUT" - - JSON_FILES=$(echo "$PROBE_OUTPUT" | sed -n '/^\s*\[/,$p' | sed '/^\s*\]/q') - echo "Extracted JSON block:" - echo "$JSON_FILES" - - FILES_LIST=$(echo "$JSON_FILES" | jq -e -r '[.[] | select(type == "string" and . != "" and . != null and (endswith("/") | not))] | map(@sh) | join(" ")' || echo "") - - if [[ -z "$FILES_LIST" ]]; then - echo "::warning::probe-chat did not identify any relevant files." - exit 1 - fi - - echo "Formatted files list for aider: $FILES_LIST" - echo "FILES_TO_EDIT=$FILES_LIST" >> $GITHUB_ENV - - - name: Run Aider with review prompt - run: | - aider \ - --read CLAUDE.md \ - --read backend/CLAUDE.md \ - --read frontend/CLAUDE.md \ - ${{ env.FILES_TO_EDIT }} \ - --model gemini/gemini-2.5-pro-preview-05-06 \ - --message-file .github/aider/review-prompt.txt \ - --yes \ - --no-check-update \ - --auto-commits \ - --no-analytics \ - --no-gitignore \ - | tee .github/aider/aider-output.txt || true - echo "Aider command completed. Output saved to .github/aider/aider-output.txt" - # Check if there are any changes to commit - if [[ -z "$(git status --porcelain)" ]]; then - echo "No changes detected after running Aider." - echo "HAS_CHANGES=false" >> $GITHUB_OUTPUT - exit 0 - fi - - - name: Clean up prompt file - if: always() - run: rm -f .github/aider/review-prompt.txt - - - name: Commit and Push Changes - id: commit_and_push - if: ${{ success() }} - run: | - CURRENT_BRANCH_NAME=$(git rev-parse --abbrev-ref HEAD) - echo "Attempting to push changes to PR branch $CURRENT_BRANCH_NAME for PR #${{ github.event.pull_request.number }}" - - # Pull latest changes to avoid rejection due to non-fast-forward - git config pull.rebase true - git pull origin $CURRENT_BRANCH_NAME - - if git push origin $CURRENT_BRANCH_NAME; then - echo "Push to $CURRENT_BRANCH_NAME successful." - echo "CHANGES_APPLIED=true" >> $GITHUB_OUTPUT - else - echo "::warning::Push to PR branch $CURRENT_BRANCH_NAME failed." - echo "CHANGES_APPLIED=false" >> $GITHUB_OUTPUT - fi - - - name: Comment on PR - if: success() - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - PR_NUM: ${{ github.event.pull_request.number }} - run: | - # Create comment body in a temporary file to avoid command line length limits - if [[ "${{ steps.commit_and_push.outputs.CHANGES_APPLIED }}" == "true" ]]; then - cat > /tmp/pr-comment.md << EOL - 🤖 I've automatically addressed the feedback based on the review. - - ## Aider Output - \`\`\` - $(cat .github/aider/aider-output.txt || echo 'No output available') - \`\`\` - - Please review the changes and let me know if further adjustments are needed. - EOL - else - cat > /tmp/pr-comment.md << EOL - 🤖 I attempted to address the review feedback, but no modifications were made. - - ## Aider Output - \`\`\` - $(cat .github/aider/aider-output.txt || echo 'No output available') - \`\`\` - - Please review the output and provide additional guidance if needed. - EOL - fi - - # Use the file for comment body - gh pr comment $PR_NUM --body-file /tmp/pr-comment.md + run-aider: + needs: check-and-prepare + uses: ./.github/workflows/aider-common.yml + with: + needs_processing: false + base_prompt: ${{ needs.check-and-prepare.outputs.prompt_content }} + secrets: inherit diff --git a/.github/workflows/aider-common.yml b/.github/workflows/aider-common.yml new file mode 100644 index 0000000000..2e4e99c716 --- /dev/null +++ b/.github/workflows/aider-common.yml @@ -0,0 +1,480 @@ +name: Aider Common Steps + +on: + workflow_call: + inputs: + issue_title: + description: "Title of the issue or PR" + required: false + type: string + issue_body: + description: "Body of the issue or PR" + required: false + type: string + instruction: + description: "Instruction for Aider" + required: false + type: string + issue_id: + description: "ID of the issue or PR" + required: false + type: string + needs_processing: + description: "Whether the issue needs to be processed by the external API" + required: false + type: boolean + default: true + base_prompt: + description: "Base prompt for Aider" + required: false + type: string + default: "Try to fix the following issue based on the instruction given by the user. The issue is prepended with the word ISSUE. The instruction is prepended with the word INSTRUCTION. The issue and instruction are separated by a blank line." + probe_prompt: + description: "Prompt for probe-chat" + required: false + type: string + default: 'I''m giving you a request that needs to be implemented. Your role is ONLY to give me the files that are relevant to the request and nothing else. The request is prepended with the word REQUEST. REQUEST: $FINAL_PROMPT. Give me all the files relevant to this request. Your output MUST be a single json array that can be parsed with programatic json parsing, with the relevant files. Files can be rust or typescript or javascript files. DO NOT INCLUDE ANY OTHER TEXT IN YOUR OUTPUT. ONLY THE JSON ARRAY. Example of output: ["file1.py", "file2.py"]' + outputs: + files_to_edit: + description: "Files identified by probe-chat for editing" + value: ${{ jobs.common-steps.outputs.files_to_edit }} + final_prompt: + description: "Final prompt for Aider" + value: ${{ jobs.common-steps.outputs.final_prompt }} + pr_branch_name: + description: "Name of the branch used for PR" + value: ${{ jobs.common-steps.outputs.pr_branch_name }} + changes_applied_message: + description: "Message indicating changes were applied" + value: ${{ jobs.common-steps.outputs.changes_applied_message }} + changes_applied: + description: "Boolean indicating if changes were successfully applied" + value: ${{ jobs.common-steps.outputs.changes_applied }} + +jobs: + common-steps: + runs-on: ubicloud-standard-8 + outputs: + files_to_edit: ${{ steps.probe_files.outputs.files_to_edit }} + final_prompt: ${{ steps.create_prompt.outputs.final_prompt }} + pr_branch_name: ${{ steps.commit_and_push.outputs.PR_BRANCH_NAME }} + changes_applied_message: ${{ steps.commit_and_push.outputs.CHANGES_APPLIED_MESSAGE }} + changes_applied: ${{ steps.commit_and_push.outputs.CHANGES_APPLIED }} + env: + GEMINI_API_KEY: ${{ secrets.GOOGLE_API_KEY }} + GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + WINDMILL_TOKEN: ${{ secrets.WINDMILL_TOKEN }} + LINEAR_API_KEY: ${{ secrets.LINEAR_API_KEY }} + + steps: + - name: Harden Runner + uses: step-security/harden-runner@v2 + with: + egress-policy: audit + + - name: Check out code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Checkout PR Branch + id: checkout_pr + if: (github.event_name == 'issue_comment' && github.event.issue.pull_request) || (github.event_name == 'pull_request_review') + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + echo "Issue comment trigger: Checking out PR branch..." + PR_NUMBER="" + if [ -n "${{ github.event.issue.number }}" ]; then + PR_NUMBER="${{ github.event.issue.number }}" + elif [ -n "${{ github.event.pull_request.number }}" ]; then + PR_NUMBER="${{ github.event.pull_request.number }}" + else + echo "::error::Could not determine PR number." + exit 1 + fi + PR_HEAD_REF=$(gh pr view $PR_NUMBER --json headRefName -q .headRefName --repo $GITHUB_REPOSITORY) + if [[ -z "$PR_HEAD_REF" || "$PR_HEAD_REF" == "null" ]]; then + echo "::error::Could not determine PR head branch for PR #$PR_NUMBER via gh CLI." + exit 1 + fi + echo "Checking out PR head branch: $PR_HEAD_REF for PR #$PR_NUMBER" + git fetch origin "refs/heads/${PR_HEAD_REF}:refs/remotes/origin/${PR_HEAD_REF}" --no-tags + git checkout "$PR_HEAD_REF" + echo "Successfully checked out branch $(git rev-parse --abbrev-ref HEAD)" + echo "PR_BRANCH=$PR_HEAD_REF" >> $GITHUB_OUTPUT + + - name: Configure Git User + run: | + git config --global user.name "github-actions[bot]" + git config --global user.email "github-actions[bot]@users.noreply.github.com" + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.12" + + - name: Cache Python dependencies + uses: actions/cache@v3 + with: + path: ~/.cache/pip + key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt', '**/setup.py') }} + restore-keys: | + ${{ runner.os }}-pip- + + - name: Cache Aider installation + id: cache-aider + uses: actions/cache@v3 + with: + path: ~/.local/bin/aider + key: ${{ runner.os }}-aider-install-${{ hashFiles('**/requirements.txt', '**/setup.py') }} + restore-keys: | + ${{ runner.os }}-aider-install- + + - name: Install Aider and Dependencies + run: | + if [ -f ~/.local/bin/aider ] && [ -x ~/.local/bin/aider ]; then + echo "Using cached Aider installation" + export PATH="$HOME/.local/bin:$PATH" + else + echo "Installing Aider..." + python -m pip install aider-install; aider-install + fi + pip install -U google-generativeai + sudo apt-get update && sudo apt-get install -y jq + echo "$HOME/.local/bin" >> $GITHUB_PATH + + - name: Create Prompt for Aider + id: create_prompt + shell: bash + env: + BASE_PROMPT_ENV: ${{ inputs.base_prompt }} + ISSUE_TITLE_ENV: ${{ inputs.issue_title }} + ISSUE_BODY_ENV: ${{ inputs.issue_body }} + INSTRUCTION_ENV: ${{ inputs.instruction }} + NEEDS_PROCESSING_ENV: ${{ inputs.needs_processing }} + WINDMILL_TOKEN: ${{ secrets.WINDMILL_TOKEN }} + run: | + set -e + FINAL_PROMPT_CONTENT="" + + if [[ "$ISSUE_TITLE_ENV" != "" && "$ISSUE_BODY_ENV" != "" ]]; then + echo "Processing issue with title: $ISSUE_TITLE_ENV" + if [[ "$NEEDS_PROCESSING_ENV" == "true" ]]; then + echo "Needs processing is true. Calling Windmill API..." + JSON_PAYLOAD=$(jq -n \ + --arg title "$ISSUE_TITLE_ENV" \ + --arg body "$ISSUE_BODY_ENV" \ + '{"body":{"issue_title":$title,"issue_body":$body}}') + + echo "Windmill JSON Payload: $JSON_PAYLOAD" + + API_RESULT_FILE=$(mktemp) + HTTP_CODE=$(curl -s -o "$API_RESULT_FILE" -w "%{http_code}" \ + -X POST "https://app.windmill.dev/api/w/windmill-labs/jobs/run_wait_result/p/f/ai/quiet_script" \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $WINDMILL_TOKEN" \ + --data-binary "$JSON_PAYLOAD" \ + --max-time 90) + + BODY_CONTENT=$(cat "$API_RESULT_FILE") + rm -f "$API_RESULT_FILE" # Clean up temp file + + echo "Windmill API HTTP Code: $HTTP_CODE" + if [[ "$HTTP_CODE" -eq 200 ]]; then + PROCESSED_ISSUE_PROMPT=$(echo "$BODY_CONTENT" | jq -r '.effective_body // empty') + if [[ -z "$PROCESSED_ISSUE_PROMPT" || "$PROCESSED_ISSUE_PROMPT" == "null" ]]; then + echo "::warning::Windmill API returned 200 but effective_body was empty or null." + EFFECTIVE_ISSUE_CONTENT_FOR_PROMPT="$ISSUE_BODY_ENV" + else + echo "Successfully processed issue via Windmill API." + EFFECTIVE_ISSUE_CONTENT_FOR_PROMPT="$PROCESSED_ISSUE_PROMPT" + fi + FINAL_PROMPT_CONTENT=$(printf "%s\nISSUE:\n%s\nINSTRUCTION:\n%s" \ + "$BASE_PROMPT_ENV" "$EFFECTIVE_ISSUE_CONTENT_FOR_PROMPT" "$INSTRUCTION_ENV") + else + echo "::error::Windmill API call failed (HTTP $HTTP_CODE). Using raw issue content for prompt." + FINAL_PROMPT_CONTENT=$(printf "%s\nISSUE:\n%s\nINSTRUCTION:\n%s" \ + "$BASE_PROMPT_ENV" "$ISSUE_BODY_ENV" "$INSTRUCTION_ENV") + fi + else + echo "Needs processing is false. Using raw issue content for prompt." + FINAL_PROMPT_CONTENT=$(printf "%s\nISSUE:\n%s\nINSTRUCTION:\n%s" \ + "$BASE_PROMPT_ENV" "$ISSUE_BODY_ENV" "$INSTRUCTION_ENV") + fi + else + echo "No issue title or body given. Using base prompt." + FINAL_PROMPT_CONTENT="$BASE_PROMPT_ENV" + fi + + echo "Final prompt: $FINAL_PROMPT_CONTENT" + echo "final_prompt<> "$GITHUB_OUTPUT" + echo "$FINAL_PROMPT_CONTENT" >> "$GITHUB_OUTPUT" + echo "EOF_AIDER_PROMPT" >> "$GITHUB_OUTPUT" + + - name: Probe Chat for Relevant Files + id: probe_files + shell: bash + env: + FINAL_PROMPT: ${{ steps.create_prompt.outputs.final_prompt }} + run: | + echo "Running probe-chat to find relevant files..." + + # escape the final prompt + printf -v MESSAGE_FOR_PROBE 'I'\''m giving you a request that needs to be implemented. Your role is ONLY to give me the files that are relevant to the request and nothing else. The request is prepended with the word REQUEST.\nREQUEST: %s. Give me all the files relevant to this request. Your output MUST be a single json array that can be parsed with programatic json parsing, with the relevant files. Files can be rust or typescript or javascript files. DO NOT INCLUDE ANY OTHER TEXT IN YOUR OUTPUT. ONLY THE JSON ARRAY. Example of output: ["file1.py", "file2.py"]' "$FINAL_PROMPT" + + set -o pipefail + PROBE_OUTPUT=$(npx --yes @buger/probe-chat@latest --max-iterations 50 --model-name gemini-2.5-pro-preview-05-06 --message "$MESSAGE_FOR_PROBE") || { + echo "::error::probe-chat command failed. Output:" + echo "$PROBE_OUTPUT" + exit 1 + } + set +o pipefail + echo "Probe-chat raw output:" + echo "$PROBE_OUTPUT" + + JSON_FILES=$(echo "$PROBE_OUTPUT" | sed -n '/^\s*\[/,$p' | sed '/^\s*\]/q') + echo "Extracted JSON block:" + echo "$JSON_FILES" + + FILES_LIST=$(echo "$JSON_FILES" | jq -e -r '[.[] | select(type == "string" and . != "" and . != null and (endswith("/") | not))] | join(" ")' || echo "") + + if [[ -z "$FILES_LIST" ]]; then + echo "::warning::probe-chat did not identify any relevant files." + fi + + echo "Formatted files list for aider: $FILES_LIST" + echo "files_to_edit=$FILES_LIST" >> $GITHUB_OUTPUT + + - name: Cache Aider tags + uses: actions/cache@v3 + with: + path: .aider.tags.cache.v4 + key: ${{ runner.os }}-aider-${{ github.sha }} + restore-keys: | + ${{ runner.os }}-aider- + + - name: Run Aider + id: run_aider + shell: bash + env: + FILES_TO_EDIT: ${{ steps.probe_files.outputs.files_to_edit }} + FINAL_PROMPT: ${{ steps.create_prompt.outputs.final_prompt }} + run: | + + echo "$FINAL_PROMPT" > .aider_final_prompt.txt + echo "FILES_TO_EDIT: $FILES_TO_EDIT" + + aider \ + --read .cursor/rules/rust-best-practices.mdc \ + --read .cursor/rules/svelte5-best-practices.mdc \ + --read .cursor/rules/windmill-overview.mdc \ + $FILES_TO_EDIT \ + --model gemini/gemini-2.5-pro-preview-05-06 \ + --message "create a test file in backend/test.txt with hello world in it" \ + --yes \ + --no-check-update \ + --auto-commits \ + --no-analytics \ + --no-gitignore \ + | tee .aider_output.txt || true + + echo "Aider command completed. Output saved to .aider_output.txt" + + - name: Cache Node.js dependencies + uses: actions/cache@v3 + with: + path: ~/.npm + key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json', '**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-node- + + - name: Commit and Push Changes + id: commit_and_push + env: + ISSUE_ID: ${{ inputs.issue_id }} + run: | + if [[ "$ISSUE_ID" != "" ]]; then + BRANCH_NAME="aider-fix-issue-${ISSUE_ID}" + + # Check if branch exists remotely + if git ls-remote --heads origin $BRANCH_NAME | grep -q $BRANCH_NAME; then + echo "Branch $BRANCH_NAME already exists remotely, fetching it" + git fetch origin $BRANCH_NAME + git checkout $BRANCH_NAME + git pull origin $BRANCH_NAME + else + echo "Creating new branch $BRANCH_NAME" + git checkout -b $BRANCH_NAME + fi + + echo "Created/checked out branch $BRANCH_NAME for issue #${ISSUE_ID}" + git push origin $BRANCH_NAME + echo "Pushed to branch $BRANCH_NAME" + echo "PR_BRANCH_NAME=$BRANCH_NAME" >> $GITHUB_OUTPUT + echo "CHANGES_APPLIED_MESSAGE=Aider changes pushed to branch $BRANCH_NAME." >> $GITHUB_OUTPUT + else + # We're in a pull_request_review event + PR_NUMBER="${{ github.event.pull_request.number }}" + PR_HEAD_REF="${{ github.event.pull_request.head.ref }}" + + echo "Handling pull_request_review for PR #$PR_NUMBER on branch $PR_HEAD_REF" + + # Ensure we're on the correct branch + git config pull.rebase true + git fetch origin $PR_HEAD_REF + git checkout $PR_HEAD_REF + git pull origin $PR_HEAD_REF + + echo "Attempting to push changes to PR branch $PR_HEAD_REF for PR #$PR_NUMBER" + if git push origin $PR_HEAD_REF; then + echo "Push to $PR_HEAD_REF successful (or no new changes to push)." + echo "CHANGES_APPLIED_MESSAGE=Aider changes (if any) pushed to PR branch $PR_HEAD_REF." >> $GITHUB_OUTPUT + echo "PR_BRANCH_NAME=$PR_HEAD_REF" >> $GITHUB_OUTPUT + echo "CHANGES_APPLIED=true" >> $GITHUB_OUTPUT + else + echo "::warning::Push to PR branch $PR_HEAD_REF failed." + echo "CHANGES_APPLIED_MESSAGE=Aider ran, but failed to push changes to PR branch $PR_HEAD_REF." >> $GITHUB_OUTPUT + echo "CHANGES_APPLIED=false" >> $GITHUB_OUTPUT + fi + fi + + - name: Create Pull Request + if: always() && (github.event_name == 'issue_comment' || github.event_name == 'repository_dispatch') && !github.event.issue.pull_request && steps.commit_and_push.outputs.PR_BRANCH_NAME != '' + id: create_pr + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PR_BRANCH: ${{ steps.commit_and_push.outputs.PR_BRANCH_NAME }} + ISSUE_NUM: ${{ inputs.issue_id }} + ISSUE_TITLE: ${{ inputs.issue_title }} + run: | + # Debug: Check latest commit and branch status + echo "Checking latest commit on branch $PR_BRANCH" + git log -1 --pretty=format:"%h - %an, %ar : %s" + echo "Changes not yet committed:" + git status --porcelain + # Check if there are any changes to commit + if [[ -n $(git status --porcelain) ]]; then + echo "Found uncommitted changes, committing them" + git add . + git commit -m "Aider changes for issue #${ISSUE_NUM}" + git push origin $PR_BRANCH + fi + + # Create PR description in a temporary file to avoid command line length limits and ensure it stays under 40k chars + cat > /tmp/pr-description.md << EOL | head -c 40000 + This PR was created automatically by Aider to fix issue #${ISSUE_NUM}. + + ## Aider Output + \`\`\` + $(cat .aider_output.txt || echo "No output available") + \`\`\` + EOL + + # Create PR using the file for the body content, handle errors gracefully + set +e # Don't exit on error + gh pr create \ + --title "[Aider PR] Fix: ${ISSUE_TITLE}" \ + --body-file /tmp/pr-description.md \ + --head "$PR_BRANCH" \ + --base main + PR_CREATE_EXIT_CODE=$? + set -e # Re-enable exit on error + + if [ $PR_CREATE_EXIT_CODE -eq 0 ]; then + echo "PR created successfully" + PR_URL=$(gh pr view $PR_BRANCH --json url --jq .url) + echo "PR_URL=$PR_URL" >> $GITHUB_OUTPUT + echo "PR_CREATED=true" >> $GITHUB_OUTPUT + else + echo "Warning: Failed to create PR. Exit code: $PR_CREATE_EXIT_CODE" + echo "PR_CREATED=false" >> $GITHUB_OUTPUT + # Continue workflow despite PR creation failure + fi + + - name: Comment on PR with Aider Output + if: always() && github.event_name == 'pull_request_review' && steps.commit_and_push.outputs.CHANGES_APPLIED != '' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PR_NUM: ${{ github.event.pull_request.number }} + JOB_STATUS: ${{ job.status }} + run: | + # Create comment body in a temporary file to avoid command line length limits + if [[ "${{ steps.commit_and_push.outputs.CHANGES_APPLIED }}" == "true" ]]; then + if [[ "$JOB_STATUS" == "success" ]]; then + STATUS_PREFIX="🤖 I've automatically addressed the feedback based on the review." + else + STATUS_PREFIX="⚠️ I attempted to address the feedback, but encountered some issues." + fi + else + if [[ "$JOB_STATUS" == "success" ]]; then + STATUS_PREFIX="🤖 I attempted to address the review feedback, but no modifications were made." + else + STATUS_PREFIX="⚠️ I encountered issues while attempting to address the feedback, and no modifications were made." + fi + fi + + cat > /tmp/pr-comment.md << EOL + ${STATUS_PREFIX} + + ## Aider Output + \`\`\` + $(cat .aider_output.txt || echo 'No output available') + \`\`\` + + Please review the output and provide additional guidance if needed. + EOL + + # Use the file for comment body + gh pr comment $PR_NUM --body-file /tmp/pr-comment.md + + - name: Comment on issue/PR to let the user know Aider has finished working on the request + if: always() && github.event_name == 'issue_comment' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_REPOSITORY: ${{ github.repository }} + JOB_STATUS: ${{ job.status }} + PR_CREATED: ${{ steps.create_pr.outputs.PR_CREATED }} + run: | + echo "Commenting on issue/PR #${{ github.event.issue.number }} to let the user know Aider has finished working on the request." + + if [[ "$JOB_STATUS" == "success" ]]; then + if [[ "$PR_CREATED" == "true" ]]; then + COMMENT_BODY="🤖 Aider has finished working on your request. A PR has been created." + else + COMMENT_BODY="🤖 Aider has finished working on your request, but was unable to create a PR." + fi + else + COMMENT_BODY="⚠️ Aider encountered issues while working on your request. Please check the workflow logs for details." + fi + + gh issue comment ${{ github.event.issue.number }} --body "$COMMENT_BODY" --repo $GITHUB_REPOSITORY + + - name: Comment on linear issue to let the user know Aider has finished working on the request + if: always() && github.event_name == 'repository_dispatch' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_REPOSITORY: ${{ github.repository }} + JOB_STATUS: ${{ job.status }} + LINEAR_API_KEY: ${{ secrets.LINEAR_API_KEY }} + PR_CREATED: ${{ steps.create_pr.outputs.PR_CREATED }} + run: | + echo "Commenting on linear issue #${{ github.event.client_payload.issue_id }} to let the user know Aider has finished working on the request." + + if [[ "$JOB_STATUS" == "success" ]]; then + if [[ "$PR_CREATED" == "true" ]]; then + COMMENT_BODY="🤖 Aider has finished working on your request. A PR has been created." + else + COMMENT_BODY="🤖 Aider has finished working on your request, but was unable to create a PR." + fi + else + COMMENT_BODY="⚠️ Aider encountered issues while working on your request. Please check the workflow logs for details." + fi + + curl -X POST \ + -H "Authorization: $LINEAR_API_KEY" \ + -H "Content-Type: application/json" \ + "https://api.linear.app/graphql" \ + -d "{\"query\":\"mutation { commentCreate(input: { issueId: \\\"${{ github.event.client_payload.issue_id }}\\\", body: \\\"${COMMENT_BODY}\\\" }) { success } }\"}" diff --git a/.github/workflows/aider.yaml b/.github/workflows/aider.yaml index e97b75bf22..fdfd7b4d39 100644 --- a/.github/workflows/aider.yaml +++ b/.github/workflows/aider.yaml @@ -5,8 +5,8 @@ on: types: [created] jobs: - auto-fix: - runs-on: ubicloud-standard-8 + check-and-prepare: + runs-on: ubicloud-standard-2 if: | github.event_name == 'issue_comment' && contains(github.event.comment.body, '/aider') && @@ -21,323 +21,95 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} WINDMILL_TOKEN: ${{ secrets.WINDMILL_TOKEN }} + outputs: + issue_title: ${{ steps.determine_inputs.outputs.ISSUE_TITLE }} + issue_body: ${{ steps.determine_inputs.outputs.ISSUE_BODY }} + comment_content: ${{ steps.determine_inputs.outputs.COMMENT_CONTENT }} + pr_branch: ${{ steps.checkout_pr.outputs.PR_BRANCH }} steps: - - name: Harden Runner - uses: step-security/harden-runner@v2 - with: - egress-policy: audit - - - name: Check out code - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Configure Git User - run: | - git config --global user.name "github-actions[bot]" - git config --global user.email "github-actions[bot]@users.noreply.github.com" - - - name: Checkout PR Branch - if: github.event_name == 'issue_comment' && github.event.issue.pull_request + - name: Acknowledge Request env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_REPOSITORY: ${{ github.repository }} run: | - echo "Issue comment trigger: Checking out PR branch..." - PR_NUMBER=${{ github.event.issue.number }} - PR_HEAD_REF=$(gh pr view $PR_NUMBER --json headRefName -q .headRefName --repo $GITHUB_REPOSITORY) - if [[ -z "$PR_HEAD_REF" || "$PR_HEAD_REF" == "null" ]]; then - echo "::error::Could not determine PR head branch for PR #$PR_NUMBER via gh CLI." - exit 1 - fi - echo "Checking out PR head branch: $PR_HEAD_REF for PR #$PR_NUMBER" - git fetch origin "refs/heads/${PR_HEAD_REF}:refs/remotes/origin/${PR_HEAD_REF}" --no-tags - git checkout "$PR_HEAD_REF" - echo "Successfully checked out branch $(git rev-parse --abbrev-ref HEAD)" + echo "Commenting on issue/PR #${{ github.event.issue.number }} to acknowledge the /aider command." + gh issue comment ${{ github.event.issue.number }} --body "🤖 Aider is starting to work on your request. I'll update you here once I have a PR ready. Please be patient, this might take a few minutes." --repo $GITHUB_REPOSITORY - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: "3.12" - - - name: Install Aider and Dependencies - run: | - python -m pip install aider-install; aider-install - pip install -U google-generativeai - sudo apt-get update && sudo apt-get install -y jq - - - name: Determine Prompt for Aider - id: determine_prompt + - name: Determine inputs for Aider + id: determine_inputs shell: bash run: | - PROMPT_FILE_PATH=".github/aider/issue-prompt.txt" - mkdir -p .github/aider + echo "Determining inputs for Aider..." + ISSUE_TITLE_VAL="" + ISSUE_BODY_VAL="" - # Determine if this is a PR comment or regular issue comment if [[ ! -z "${{ github.event.issue.pull_request }}" ]]; then echo "This is a comment on a Pull Request" PR_NUMBER="${{ github.event.issue.number }}" - # Get PR description to check for issue references - PR_BODY=$(gh pr view $PR_NUMBER --json body -q .body --repo $GITHUB_REPOSITORY) - - # Extract issue number from PR description (looking for #123 or "fixes #123" patterns) - REFERENCED_ISSUE=$(echo "$PR_BODY" | grep -oE "#[0-9]+" | grep -oE "[0-9]+" | head -1) - - if [[ ! -z "$REFERENCED_ISSUE" ]]; then - echo "Found referenced issue #$REFERENCED_ISSUE in PR description" - - # Fetch the referenced issue details - ISSUE_DETAILS=$(gh issue view $REFERENCED_ISSUE --json title,body --repo $GITHUB_REPOSITORY) - ISSUE_TITLE=$(echo "$ISSUE_DETAILS" | jq -r .title) - ISSUE_BODY=$(echo "$ISSUE_DETAILS" | jq -r .body) - - # Store raw comment body in a file first to avoid shell interpretation issues - echo '${{ github.event.comment.body }}' > /tmp/raw_comment.txt - RAW_COMMENT_BODY=$(cat /tmp/raw_comment.txt) - # Remove the /aider prefix and trim whitespace - COMMENT_CONTENT=$(echo "$RAW_COMMENT_BODY" | sed 's|^/aider||' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//') - - echo "Sending issue content and PR comment to external API…" - - ISSUE_TITLE_Q=$(printf '%q' "$ISSUE_TITLE") - ISSUE_BODY_Q=$(printf '%q' "$ISSUE_BODY") - - JSON_PAYLOAD=$(jq -n \ - --arg title "$ISSUE_TITLE_Q" \ - --arg body "$ISSUE_BODY_Q" \ - '{"body":{"issue_title":$title,"issue_body":$body}}') - - API_RESULT=$(curl -s -w "\n%{http_code}" \ - -X POST "https://app.windmill.dev/api/w/windmill-labs/jobs/run_wait_result/p/f/ai/quiet_script" \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $WINDMILL_TOKEN" \ - --data-binary "$JSON_PAYLOAD" \ - --max-time 90) - - HTTP_CODE=$(echo "$API_RESULT" | tail -n1) - BODY=$(echo "$API_RESULT" | sed '$d') - - echo "$BODY" > /tmp/api_response.txt - - BASE_PROMPT="Try to fix the following issue based on the instruction given by the user. The issue is prepended with the word ISSUE. The instruction is prepended with the word INSTRUCTION. The issue and instruction are separated by a blank line." - if [[ "$HTTP_CODE" -eq 200 ]]; then - PROCESSED_ISSUE_PROMPT=$(jq -r '.effective_body // empty' /tmp/api_response.txt) - if [[ -z "$PROCESSED_ISSUE_PROMPT" || "$PROCESSED_ISSUE_PROMPT" == "null" ]]; then - PROCESSED_ISSUE_PROMPT="" - fi - printf "%s\nISSUE:\n%s\nINSTRUCTION:\n%s" \ - "$BASE_PROMPT" "$PROCESSED_ISSUE_PROMPT" "$COMMENT_CONTENT" > "$PROMPT_FILE_PATH" - else - echo "::warning::API call failed (HTTP $HTTP_CODE). Using PR comment with issue context." - printf "%s\nISSUE:\n%s\nINSTRUCTION:\n%s" \ - "$BASE_PROMPT" "$ISSUE_BODY_Q" "$COMMENT_CONTENT" > "$PROMPT_FILE_PATH" - fi - rm -f /tmp/api_response.txt + PR_BODY_JSON=$(GH_TOKEN="${{ secrets.GITHUB_TOKEN }}" gh pr view "$PR_NUMBER" --json body --repo "$GITHUB_REPOSITORY") + if [[ $? -ne 0 ]]; then + echo "Error fetching PR body for PR #$PR_NUMBER" + PR_BODY_VAL="" else - echo "No referenced issue found in PR description, using comment content only" - # Use comment content directly as with regular issue comments - echo '${{ github.event.comment.body }}' > /tmp/raw_comment.txt - RAW_COMMENT_BODY=$(cat /tmp/raw_comment.txt) - COMMENT_CONTENT=$(echo "$RAW_COMMENT_BODY" | sed 's|^/aider||' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//') + PR_BODY_VAL=$(echo "$PR_BODY_JSON" | jq -r .body) + fi + + if [[ ! -z "$PR_BODY_VAL" ]]; then + REFERENCED_ISSUE=$(echo "$PR_BODY_VAL" | grep -oE "#[0-9]+" | grep -oE "[0-9]+" | head -1) - if [[ -z "$COMMENT_CONTENT" ]]; then - echo "::error::Comment with /aider provided, but no instruction found after it. Cannot proceed." - printf "Error: /aider command found but no instruction followed." > "$PROMPT_FILE_PATH" - exit 1 - else - echo "Using comment content as prompt." - printf '%s' "$COMMENT_CONTENT" > "$PROMPT_FILE_PATH" + if [[ ! -z "$REFERENCED_ISSUE" ]]; then + echo "Found referenced issue #$REFERENCED_ISSUE in PR description" + + ISSUE_DETAILS_JSON=$(GH_TOKEN="${{ secrets.GITHUB_TOKEN }}" gh issue view "$REFERENCED_ISSUE" --json title,body --repo "$GITHUB_REPOSITORY") + if [[ $? -ne 0 ]]; then + echo "Error fetching issue details for #$REFERENCED_ISSUE" + else + ISSUE_TITLE_VAL=$(echo "$ISSUE_DETAILS_JSON" | jq -r .title) + ISSUE_BODY_VAL=$(echo "$ISSUE_DETAILS_JSON" | jq -r .body) + fi fi + else + echo "PR body is empty or could not be fetched." fi else echo "This is a comment on a regular issue" - - # Fetch the issue details ISSUE_NUMBER="${{ github.event.issue.number }}" - ISSUE_DETAILS=$(gh issue view $ISSUE_NUMBER --json title,body --repo $GITHUB_REPOSITORY) - ISSUE_TITLE=$(echo "$ISSUE_DETAILS" | jq -r .title) - ISSUE_BODY=$(echo "$ISSUE_DETAILS" | jq -r .body) - - # Store raw comment body in a file first to avoid shell interpretation issues - echo '${{ github.event.comment.body }}' > /tmp/raw_comment.txt - # Extract the command part safely - RAW_COMMENT_BODY=$(cat /tmp/raw_comment.txt) - # Remove the /aider prefix and trim whitespace - COMMENT_CONTENT=$(echo "$RAW_COMMENT_BODY" | sed 's|^/aider||' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//') - - if [[ -z "$COMMENT_CONTENT" ]]; then - echo "::error::Comment with /aider provided, but no instruction found after it. Cannot proceed." - printf "Error: /aider command found but no instruction followed." > "$PROMPT_FILE_PATH" - exit 1 + ISSUE_DETAILS_JSON=$(GH_TOKEN="${{ secrets.GITHUB_TOKEN }}" gh issue view "$ISSUE_NUMBER" --json title,body --repo "$GITHUB_REPOSITORY") + if [[ $? -ne 0 ]]; then + echo "Error fetching issue details for #$ISSUE_NUMBER" else - echo "Sending issue content and issue comment to external API…" - - ISSUE_TITLE_Q=$(printf '%q' "$ISSUE_TITLE") - ISSUE_BODY_Q=$(printf '%q' "$ISSUE_BODY") - COMMENT_CONTENT_Q=$(printf '%q' "$COMMENT_CONTENT") - - JSON_PAYLOAD=$(jq -n \ - --arg title "$ISSUE_TITLE_Q" \ - --arg body "$ISSUE_BODY_Q" \ - --arg comment "$COMMENT_CONTENT_Q" \ - '{"body":{"issue_title":$title,"issue_body":$body,"issue_comment":$comment}}') - - API_RESULT=$(curl -s -w "\n%{http_code}" \ - -X POST "https://app.windmill.dev/api/w/windmill-labs/jobs/run_wait_result/p/f/ai/quiet_script" \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $WINDMILL_TOKEN" \ - --data-binary "$JSON_PAYLOAD" \ - --max-time 90) - - HTTP_CODE=$(echo "$API_RESULT" | tail -n1) - BODY=$(echo "$API_RESULT" | sed '$d') - - echo "$BODY" > /tmp/api_response.txt - - BASE_PROMPT="Try to fix the following issue based on the instruction given by the user. The issue is prepended with the word ISSUE. The instruction is prepended with the word INSTRUCTION. The issue and instruction are separated by a blank line." - if [[ "$HTTP_CODE" -eq 200 ]]; then - PROCESSED_ISSUE_PROMPT=$(jq -r '.effective_body // empty' /tmp/api_response.txt) - if [[ -z "$PROCESSED_ISSUE_PROMPT" || "$PROCESSED_ISSUE_PROMPT" == "null" ]]; then - PROCESSED_ISSUE_PROMPT="" - fi - printf "%s\nISSUE:\n%s\nINSTRUCTION:\n%s" \ - "$BASE_PROMPT" "$PROCESSED_ISSUE_PROMPT" "$COMMENT_CONTENT" > "$PROMPT_FILE_PATH" - else - echo "::warning::API call failed (HTTP $HTTP_CODE). Using PR comment with issue context." - printf "%s\nISSUE:\n%s\nINSTRUCTION:\n%s" \ - "$BASE_PROMPT" "$ISSUE_BODY_Q" "$COMMENT_CONTENT" > "$PROMPT_FILE_PATH" - fi - - rm -f /tmp/api_response.txt + ISSUE_TITLE_VAL=$(echo "$ISSUE_DETAILS_JSON" | jq -r .title) + ISSUE_BODY_VAL=$(echo "$ISSUE_DETAILS_JSON" | jq -r .body) fi fi - echo "Prompt determined and written to $PROMPT_FILE_PATH" - echo "PROMPT_FILE_PATH=$PROMPT_FILE_PATH" >> $GITHUB_OUTPUT - - name: Probe Chat for Relevant Files - id: probe_files + echo "Setting GITHUB_OUTPUT for ISSUE_TITLE..." + echo "ISSUE_TITLE<> "$GITHUB_OUTPUT" + echo "$ISSUE_TITLE_VAL" >> "$GITHUB_OUTPUT" + echo "EOF_AIDER_TITLE" >> "$GITHUB_OUTPUT" + + echo "Setting GITHUB_OUTPUT for ISSUE_BODY..." + echo "ISSUE_BODY<> "$GITHUB_OUTPUT" + echo "$ISSUE_BODY_VAL" >> "$GITHUB_OUTPUT" + echo "EOF_AIDER_BODY" >> "$GITHUB_OUTPUT" + + # Process COMMENT_CONTENT + printf -v COMMENT_CONTENT_VAL "%s" "$(echo "${{ github.event.comment.body }}" | sed 's|^/aider||' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')" + echo "COMMENT_CONTENT<> "$GITHUB_OUTPUT" + echo "$COMMENT_CONTENT_VAL" >> "$GITHUB_OUTPUT" + echo "EOF_AIDER_COMMENT" >> "$GITHUB_OUTPUT" + echo "Finished determining inputs." env: - PROMPT_CONTENT_FILE: ${{ steps.determine_prompt.outputs.PROMPT_FILE_PATH }} - run: | - echo "Running probe-chat to find relevant files..." - if [[ ! -f "$PROMPT_CONTENT_FILE" ]]; then - echo "::error::Prompt file $PROMPT_CONTENT_FILE not found!" - exit 1 - fi - PROMPT_CONTENT=$(cat "$PROMPT_CONTENT_FILE") - if [ -z "$PROMPT_CONTENT" ]; then - echo "::error::Prompt content is empty!" - exit 1 - fi + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Make sure gh cli has a token - PROMPT_ESCAPED=$(jq -Rs . <<< "$PROMPT_CONTENT") - - MESSAGE_FOR_PROBE=$(jq -n --arg prompt_escaped "$PROMPT_ESCAPED" \ - '{ "message": "I'\''m giving you a request that needs to be implemented. Your role is ONLY to give me the files that are relevant to the request and nothing else. The request is prepended with the word REQUEST.\\nREQUEST: \($prompt_escaped). Give me all the files relevant to this request. Your output MUST be a single json array that can be parsed with programatic json parsing, with the relevant files. Files can be rust or typescript or javascript files. DO NOT INCLUDE ANY OTHER TEXT IN YOUR OUTPUT. ONLY THE JSON ARRAY. Example of output: [\"file1.py\", \"file2.py\"]" }' | jq -r .message) - - set -o pipefail - PROBE_OUTPUT=$(npx --yes @buger/probe-chat@latest --max-iterations 50 --model-name gemini-2.5-pro-preview-05-06 --message "$MESSAGE_FOR_PROBE") || { - echo "::error::probe-chat command failed. Output:" - echo "$PROBE_OUTPUT" - exit 1 - } - set +o pipefail - echo "Probe-chat raw output:" - echo "$PROBE_OUTPUT" - - JSON_FILES=$(echo "$PROBE_OUTPUT" | sed -n '/^\s*\[/,$p' | sed '/^\s*\]/q') - echo "Extracted JSON block:" - echo "$JSON_FILES" - - FILES_LIST=$(echo "$JSON_FILES" | jq -e -r '[.[] | select(type == "string" and . != "" and . != null and (endswith("/") | not))] | map(@sh) | join(" ")' || echo "") - - if [[ -z "$FILES_LIST" ]]; then - echo "::warning::probe-chat did not identify any relevant files." - exit 1 - fi - - echo "Formatted files list for aider: $FILES_LIST" - echo "FILES_TO_EDIT=$FILES_LIST" >> $GITHUB_ENV - - - name: Run Aider with external prompt - run: | - echo "Files identified by probe-chat: ${{ env.FILES_TO_EDIT }}" - aider \ - --read CLAUDE.md \ - --read backend/CLAUDE.md \ - --read frontend/CLAUDE.md \ - ${{ env.FILES_TO_EDIT }} \ - --model gemini/gemini-2.5-pro-preview-05-06 \ - --message-file .github/aider/issue-prompt.txt \ - --yes \ - --no-check-update \ - --auto-commits \ - --no-analytics \ - --no-gitignore \ - | tee .github/aider/aider-output.txt || true - echo "Aider command completed. Output saved to .github/aider/aider-output.txt" - - - name: Clean up prompt file - if: always() - run: rm -f .github/aider/issue-prompt.txt - - - name: Commit and Push Changes - id: commit_and_push - if: ${{ success() }} - run: | - if [[ -z "${{ github.event.issue.pull_request }}" ]]; then - BRANCH_NAME="aider-fix-issue-${{ github.event.issue.number }}" - - # Check if branch exists remotely - if git ls-remote --heads origin $BRANCH_NAME | grep -q $BRANCH_NAME; then - echo "Branch $BRANCH_NAME already exists remotely, fetching it" - git fetch origin $BRANCH_NAME - git checkout $BRANCH_NAME - git pull origin $BRANCH_NAME - else - echo "Creating new branch $BRANCH_NAME" - git checkout -b $BRANCH_NAME - fi - - echo "Created/checked out branch $BRANCH_NAME for issue #${{ github.event.issue.number }}" - git push origin $BRANCH_NAME - echo "Pushed to branch $BRANCH_NAME" - echo "PR_BRANCH_NAME=$BRANCH_NAME" >> $GITHUB_OUTPUT - echo "CHANGES_APPLIED_MESSAGE=Aider changes pushed to branch $BRANCH_NAME." >> $GITHUB_OUTPUT - else - CURRENT_BRANCH_NAME=$(git rev-parse --abbrev-ref HEAD) - echo "Attempting to push changes to PR branch $CURRENT_BRANCH_NAME for PR #${{ github.event.issue.number }}" - if git push origin $CURRENT_BRANCH_NAME; then - echo "Push to $CURRENT_BRANCH_NAME successful (or no new changes to push)." - echo "CHANGES_APPLIED_MESSAGE=Aider changes (if any) pushed to PR branch $CURRENT_BRANCH_NAME." >> $GITHUB_OUTPUT - echo "PR_BRANCH_NAME=$CURRENT_BRANCH_NAME" >> $GITHUB_OUTPUT - else - echo "::warning::Push to PR branch $CURRENT_BRANCH_NAME failed." - echo "CHANGES_APPLIED_MESSAGE=Aider ran, but failed to push changes to PR branch $CURRENT_BRANCH_NAME." >> $GITHUB_OUTPUT - fi - fi - - - name: Create Pull Request - if: success() && github.event_name == 'issue_comment' && !github.event.issue.pull_request && steps.commit_and_push.outputs.PR_BRANCH_NAME != '' - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - PR_BRANCH: ${{ steps.commit_and_push.outputs.PR_BRANCH_NAME }} - ISSUE_NUM: ${{ github.event.issue.number }} - run: | - # Create PR description in a temporary file to avoid command line length limits - cat > /tmp/pr-description.md << EOL - This PR was created automatically by Aider to fix issue #${ISSUE_NUM}. - - ## Aider Output - \`\`\` - $(cat .github/aider/aider-output.txt || echo "No output available") - \`\`\` - EOL - - # Create PR using the file for the body content - gh pr create \ - --title "[Aider PR] Add fixes for issue #${ISSUE_NUM}" \ - --body-file /tmp/pr-description.md \ - --head "$PR_BRANCH" \ - --base main + run-aider: + needs: check-and-prepare + uses: ./.github/workflows/aider-common.yml + with: + issue_title: ${{ needs.check-and-prepare.outputs.issue_title }} + issue_body: ${{ needs.check-and-prepare.outputs.issue_body }} + instruction: ${{ needs.check-and-prepare.outputs.comment_content }} + issue_id: ${{ github.event.issue.number }} + secrets: inherit diff --git a/.github/workflows/linear-issue.yaml b/.github/workflows/linear-issue.yaml index 7dd217e141..1dce5b6c87 100644 --- a/.github/workflows/linear-issue.yaml +++ b/.github/workflows/linear-issue.yaml @@ -5,219 +5,65 @@ on: types: [external_issue_fix] jobs: - auto-fix: - runs-on: ubicloud-standard-8 + check-and-prepare: + runs-on: ubicloud-standard-2 permissions: contents: write pull-requests: write - issues: write + outputs: + issue_title: ${{ steps.determine_inputs.outputs.ISSUE_TITLE }} + issue_body: ${{ steps.determine_inputs.outputs.ISSUE_BODY }} + instruction: ${{ steps.determine_inputs.outputs.INSTRUCTION }} env: GEMINI_API_KEY: ${{ secrets.GOOGLE_API_KEY }} GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} WINDMILL_TOKEN: ${{ secrets.WINDMILL_TOKEN }} + LINEAR_API_KEY: ${{ secrets.LINEAR_API_KEY }} steps: - - name: Harden Runner - uses: step-security/harden-runner@v2 - with: - egress-policy: audit - - - name: Check out code - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Configure Git User + - name: Acknowledge Request + env: + LINEAR_API_KEY: ${{ secrets.LINEAR_API_KEY }} run: | - git config --global user.name "github-actions[bot]" - git config --global user.email "github-actions[bot]@users.noreply.github.com" + echo "Commenting on Linear issue #${{ github.event.client_payload.issue_id }} to acknowledge the request." + curl -X POST \ + -H "Authorization: $LINEAR_API_KEY" \ + -H "Content-Type: application/json" \ + "https://api.linear.app/graphql" \ + -d "{\"query\":\"mutation { commentCreate(input: { issueId: \\\"${{ github.event.client_payload.issue_id }}\\\", body: \\\"🤖 Aider is starting to work on your request. I'll update you here once I have a PR ready. Please be patient, this might take a few minutes.\\\" }) { success } }\"}" - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: "3.12" - - - name: Install Aider and Dependencies - run: | - python -m pip install aider-install; aider-install - pip install -U google-generativeai - sudo apt-get update && sudo apt-get install -y jq - - - name: Create Prompt for Aider - id: create_prompt + - name: Determine inputs for Aider + id: determine_inputs shell: bash run: | - PROMPT_FILE_PATH=".github/aider/issue-prompt.txt" - mkdir -p .github/aider + echo "Determining inputs for Aider..." + ISSUE_TITLE_VAL="${{ github.event.client_payload.issue_title }}" + INSTRUCTION_VAL="${{ github.event.client_payload.instruction }}" + ISSUE_BODY_VAL=$(printf '%q' "${{ github.event.client_payload.issue_body }}") + echo "Setting GITHUB_OUTPUT for ISSUE_TITLE..." + echo "ISSUE_TITLE<> "$GITHUB_OUTPUT" + echo "$ISSUE_TITLE_VAL" >> "$GITHUB_OUTPUT" + echo "EOF_AIDER_TITLE" >> "$GITHUB_OUTPUT" - ISSUE_TITLE="${{ github.event.client_payload.issue_title }}" - INSTRUCTION="${{ github.event.client_payload.instruction }}" - ISSUE_BODY=$(printf '%q' "${{ github.event.client_payload.issue_body }}") + echo "Setting GITHUB_OUTPUT for ISSUE_BODY..." + echo "ISSUE_BODY<> "$GITHUB_OUTPUT" + echo "$ISSUE_BODY_VAL" >> "$GITHUB_OUTPUT" + echo "EOF_AIDER_BODY" >> "$GITHUB_OUTPUT" - echo "Processing issue with title: $ISSUE_TITLE" + echo "Setting GITHUB_OUTPUT for INSTRUCTION..." + echo "INSTRUCTION<> "$GITHUB_OUTPUT" + echo "$INSTRUCTION_VAL" >> "$GITHUB_OUTPUT" + echo "EOF_AIDER_INSTRUCTION" >> "$GITHUB_OUTPUT" + echo "Finished determining inputs." - JSON_PAYLOAD=$(jq -n \ - --arg title "$ISSUE_TITLE" \ - --arg body "$ISSUE_BODY" \ - '{"body":{"issue_title":$title,"issue_body":$body}}') - - API_RESULT=$(curl -s -w "\n%{http_code}" \ - -X POST "https://app.windmill.dev/api/w/windmill-labs/jobs/run_wait_result/p/f/ai/quiet_script" \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $WINDMILL_TOKEN" \ - --data-binary "$JSON_PAYLOAD" \ - --max-time 90) - - HTTP_CODE=$(echo "$API_RESULT" | tail -n1) - BODY=$(echo "$API_RESULT" | sed '$d') - - echo "$BODY" > /tmp/api_response.txt - - BASE_PROMPT="Try to fix the following issue based on the instruction given. The issue is prepended with the word ISSUE. The instruction is prepended with the word INSTRUCTION. The issue and instruction are separated by a blank line." - if [[ "$HTTP_CODE" -eq 200 ]]; then - PROCESSED_ISSUE_PROMPT=$(jq -r '.effective_body // empty' /tmp/api_response.txt) - if [[ -z "$PROCESSED_ISSUE_PROMPT" || "$PROCESSED_ISSUE_PROMPT" == "null" ]]; then - PROCESSED_ISSUE_PROMPT="" - fi - printf "%s\nISSUE:\n%s\nINSTRUCTION:\n%s" \ - "$BASE_PROMPT" "$PROCESSED_ISSUE_PROMPT" "$INSTRUCTION" > "$PROMPT_FILE_PATH" - else - echo "::warning::API call failed (HTTP $HTTP_CODE). Using raw issue content." - printf "%s\nISSUE:\n%s\nINSTRUCTION:\n%s" \ - "$BASE_PROMPT" "$ISSUE_BODY" "$INSTRUCTION" > "$PROMPT_FILE_PATH" - fi - rm -f /tmp/api_response.txt - - echo "Prompt created and written to $PROMPT_FILE_PATH" - echo "PROMPT_FILE_PATH=$PROMPT_FILE_PATH" >> $GITHUB_OUTPUT - - # Store the issue title for PR creation - ISSUE_TITLE_SAFE=$(echo "$ISSUE_TITLE" | tr -d '\n' | sed 's/"/\\"/g') - echo "ISSUE_TITLE=$ISSUE_TITLE_SAFE" >> $GITHUB_OUTPUT - - # Generate unique branch name using timestamp and issue info - ISSUE_ID="${{ github.event.client_payload.issue_id }}" - BRANCH_NAME="aider-fix-linear-issue-$ISSUE_ID" - echo "BRANCH_NAME=$BRANCH_NAME" >> $GITHUB_OUTPUT - - - name: Probe Chat for Relevant Files - id: probe_files - env: - PROMPT_CONTENT_FILE: ${{ steps.create_prompt.outputs.PROMPT_FILE_PATH }} - run: | - echo "Running probe-chat to find relevant files..." - if [[ ! -f "$PROMPT_CONTENT_FILE" ]]; then - echo "::error::Prompt file $PROMPT_CONTENT_FILE not found!" - exit 1 - fi - PROMPT_CONTENT=$(cat "$PROMPT_CONTENT_FILE") - if [ -z "$PROMPT_CONTENT" ]; then - echo "::error::Prompt content is empty!" - exit 1 - fi - - PROMPT_ESCAPED=$(jq -Rs . <<< "$PROMPT_CONTENT") - - MESSAGE_FOR_PROBE=$(jq -n --arg prompt_escaped "$PROMPT_ESCAPED" \ - '{ "message": "I'\''m giving you a request that needs to be implemented. Your role is ONLY to give me the files that are relevant to the request and nothing else. The request is prepended with the word REQUEST.\\nREQUEST: \($prompt_escaped). Give me all the files relevant to this request. Your output MUST be a single json array that can be parsed with programatic json parsing, with the relevant files. Files can be rust or typescript or javascript files. DO NOT INCLUDE ANY OTHER TEXT IN YOUR OUTPUT. ONLY THE JSON ARRAY. Example of output: [\"file1.py\", \"file2.py\"]" }' | jq -r .message) - - set -o pipefail - PROBE_OUTPUT=$(npx --yes @buger/probe-chat@latest --max-iterations 50 --model-name gemini-2.5-pro-preview-05-06 --message "$MESSAGE_FOR_PROBE") || { - echo "::error::probe-chat command failed. Output:" - echo "$PROBE_OUTPUT" - exit 1 - } - set +o pipefail - echo "Probe-chat raw output:" - echo "$PROBE_OUTPUT" - - JSON_FILES=$(echo "$PROBE_OUTPUT" | sed -n '/^\s*\[/,$p' | sed '/^\s*\]/q') - echo "Extracted JSON block:" - echo "$JSON_FILES" - - FILES_LIST=$(echo "$JSON_FILES" | jq -e -r '[.[] | select(type == "string" and . != "" and . != null and (endswith("/") | not))] | map(@sh) | join(" ")' || echo "") - - if [[ -z "$FILES_LIST" ]]; then - echo "::warning::probe-chat did not identify any relevant files." - exit 1 - fi - - echo "Formatted files list for aider: $FILES_LIST" - echo "FILES_TO_EDIT=$FILES_LIST" >> $GITHUB_ENV - - - name: Run Aider with external prompt - run: | - echo "Files identified by probe-chat: ${{ env.FILES_TO_EDIT }}" - aider \ - --read CLAUDE.md \ - --read backend/CLAUDE.md \ - --read frontend/CLAUDE.md \ - ${{ env.FILES_TO_EDIT }} \ - --model gemini/gemini-2.5-pro-preview-05-06 \ - --message-file .github/aider/issue-prompt.txt \ - --yes \ - --no-check-update \ - --auto-commits \ - --no-analytics \ - --no-gitignore \ - | tee .github/aider/aider-output.txt || true - echo "Aider command completed. Output saved to .github/aider/aider-output.txt" - - - name: Clean up prompt file - if: always() - run: rm -f .github/aider/issue-prompt.txt - - - name: Commit and Push Changes - id: commit_and_push - if: ${{ success() }} - run: | - BRANCH_NAME="${{ steps.create_prompt.outputs.BRANCH_NAME }}" - - # Check if branch exists remotely - if git ls-remote --heads origin $BRANCH_NAME | grep -q $BRANCH_NAME; then - echo "Branch $BRANCH_NAME already exists remotely, fetching it" - git fetch origin $BRANCH_NAME - git checkout $BRANCH_NAME - git pull origin $BRANCH_NAME - else - echo "Creating new branch $BRANCH_NAME" - git checkout -b $BRANCH_NAME - fi - - # Check if there are any changes to commit - if git diff --quiet && git diff --staged --quiet; then - echo "No changes to commit" - else - git commit -am "Auto-fix using Aider for external issue [skip ci]" || echo "No changes to commit" - fi - - git push origin $BRANCH_NAME - echo "Pushed to branch $BRANCH_NAME" - echo "PR_BRANCH_NAME=$BRANCH_NAME" >> $GITHUB_OUTPUT - - - name: Create Pull Request - if: success() && steps.commit_and_push.outputs.PR_BRANCH_NAME != '' - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - PR_BRANCH: ${{ steps.commit_and_push.outputs.PR_BRANCH_NAME }} - ISSUE_TITLE: ${{ steps.create_prompt.outputs.ISSUE_TITLE }} - ISSUE_ID: ${{ github.event.client_payload.issue_id }} - run: | - # Create PR description in a temporary file to avoid command line length limits - cat > /tmp/pr-description.md << EOL - This PR was created automatically by Aider to fix an external issue: ${ISSUE_TITLE} - - ## Aider Output - \`\`\` - $(cat .github/aider/aider-output.txt || echo "No output available") - \`\`\` - EOL - - # Create PR using the file for the body content - gh pr create \ - --title "[Aider PR] Fix: ${ISSUE_TITLE}" \ - --body-file /tmp/pr-description.md \ - --head "$PR_BRANCH" \ - --base main || echo "PR already exists or couldn't be created" + run-aider: + needs: check-and-prepare + uses: ./.github/workflows/aider-common.yml + with: + issue_title: ${{ needs.check-and-prepare.outputs.issue_title }} + issue_body: ${{ needs.check-and-prepare.outputs.issue_body }} + instruction: ${{ needs.check-and-prepare.outputs.instruction }} + issue_id: ${{ github.event.client_payload.issue_id }} + secrets: inherit From dfd8c4cd2aa8c448aa245065047c36c58fadc27b Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 22 May 2025 01:07:29 +0200 Subject: [PATCH 446/739] more verbose docker wait errors --- backend/windmill-worker/src/bash_executor.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/windmill-worker/src/bash_executor.rs b/backend/windmill-worker/src/bash_executor.rs index 9683c0d8d5..a372094d89 100644 --- a/backend/windmill-worker/src/bash_executor.rs +++ b/backend/windmill-worker/src/bash_executor.rs @@ -305,7 +305,7 @@ async fn handle_docker_job( .await .map_err(|e| { tracing::error!("Error waiting for container: {:?}", e); - anyhow::anyhow!("Error waiting for container") + anyhow::anyhow!("Error waiting for container: {:?}", e) })?; let waited = wait.first().map(|x| x.status_code); Ok(waited) From 3c28abc7bd6f22dde40639b16739f36c50996a95 Mon Sep 17 00:00:00 2001 From: centdix <40307056+centdix@users.noreply.github.com> Date: Thu, 22 May 2025 09:24:31 +0200 Subject: [PATCH 447/739] internal: Restrict access to git workflows (#5795) * restrict access * Update .github/workflows/aider-after-review.yaml Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com> * Update .github/workflows/create-docs.yml Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> --------- Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com> Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> --- .github/workflows/aider-after-review.yaml | 32 +++++++++++++++++++++-- .github/workflows/aider.yaml | 32 +++++++++++++++++++++-- .github/workflows/create-docs.yml | 28 +++++++++++++++++++- 3 files changed, 87 insertions(+), 5 deletions(-) diff --git a/.github/workflows/aider-after-review.yaml b/.github/workflows/aider-after-review.yaml index 2ba3483a6c..abd6091a31 100644 --- a/.github/workflows/aider-after-review.yaml +++ b/.github/workflows/aider-after-review.yaml @@ -5,9 +5,36 @@ on: types: [submitted] jobs: - check-and-prepare: + check-membership: if: github.event.review.state == 'changes_requested' && contains(github.event.pull_request.title, '[Aider PR]') runs-on: ubicloud-standard-2 + outputs: + is_member: ${{ steps.check-membership.outputs.is_member }} + steps: + - name: Check organization membership + id: check-membership + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_REPOSITORY: ${{ github.repository }} + REVIEWER: ${{ github.event.review.user.login }} + run: | + ORG="windmill-labs" + STATUS=$(curl -s -o /dev/null -w "%{http_code}" \ + -H "Authorization: token $GH_TOKEN" \ + -H "Accept: application/vnd.github+json" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + "https://api.github.com/orgs/$ORG/members/$REVIEWER") + + if [ "$STATUS" -eq 204 ]; then + echo "is_member=true" >> $GITHUB_OUTPUT + else + echo "is_member=false" >> $GITHUB_OUTPUT + fi + + check-and-prepare: + needs: check-membership + if: github.event.review.state == 'changes_requested' && contains(github.event.pull_request.title, '[Aider PR]') && needs.check-membership.outputs.is_member == 'true' + runs-on: ubicloud-standard-2 permissions: contents: write pull-requests: write @@ -58,7 +85,8 @@ jobs: echo "EOF" >> $GITHUB_OUTPUT run-aider: - needs: check-and-prepare + needs: [check-membership, check-and-prepare] + if: github.event.review.state == 'changes_requested' && contains(github.event.pull_request.title, '[Aider PR]') && needs.check-membership.outputs.is_member == 'true' uses: ./.github/workflows/aider-common.yml with: needs_processing: false diff --git a/.github/workflows/aider.yaml b/.github/workflows/aider.yaml index fdfd7b4d39..50d9946094 100644 --- a/.github/workflows/aider.yaml +++ b/.github/workflows/aider.yaml @@ -5,12 +5,39 @@ on: types: [created] jobs: - check-and-prepare: + check-membership: runs-on: ubicloud-standard-2 if: | github.event_name == 'issue_comment' && contains(github.event.comment.body, '/aider') && !contains(github.event.comment.user.login, '[bot]') + outputs: + is_member: ${{ steps.check-membership.outputs.is_member }} + steps: + - name: Check organization membership + id: check-membership + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_REPOSITORY: ${{ github.repository }} + COMMENTER: ${{ github.event.comment.user.login }} + run: | + ORG="windmill-labs" + STATUS=$(curl -s -o /dev/null -w "%{http_code}" \ + -H "Authorization: token $GH_TOKEN" \ + -H "Accept: application/vnd.github+json" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + "https://api.github.com/orgs/$ORG/members/$COMMENTER") + + if [ "$STATUS" -eq 204 ]; then + echo "is_member=true" >> $GITHUB_OUTPUT + else + echo "is_member=false" >> $GITHUB_OUTPUT + fi + + check-and-prepare: + needs: check-membership + runs-on: ubicloud-standard-2 + if: needs.check-membership.outputs.is_member == 'true' permissions: contents: write pull-requests: write @@ -105,7 +132,8 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Make sure gh cli has a token run-aider: - needs: check-and-prepare + needs: [check-membership, check-and-prepare] + if: needs.check-membership.outputs.is_member == 'true' uses: ./.github/workflows/aider-common.yml with: issue_title: ${{ needs.check-and-prepare.outputs.issue_title }} diff --git a/.github/workflows/create-docs.yml b/.github/workflows/create-docs.yml index 6c280ae5f9..209883d24c 100644 --- a/.github/workflows/create-docs.yml +++ b/.github/workflows/create-docs.yml @@ -3,8 +3,34 @@ on: types: [created] jobs: + check-membership: + if: ${{ github.event.issue.pull_request && startsWith(github.event.comment.body, '/docs') && github.event.comment.user.type != 'Bot' }} + runs-on: ubicloud-standard-2 + outputs: + is_member: ${{ steps.check-membership.outputs.is_member }} + steps: + - name: Check organization membership + id: check-membership + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + COMMENTER: ${{ github.event.comment.user.login }} + run: | + ORG="windmill-labs" + STATUS=$(curl -s -o /dev/null -w "%{http_code}" \ + -H "Authorization: token $GH_TOKEN" \ + -H "Accept: application/vnd.github+json" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + "https://api.github.com/orgs/$ORG/members/$COMMENTER") + + if [ "$STATUS" -eq 204 ]; then + echo "is_member=true" >> $GITHUB_OUTPUT + else + echo "is_member=false" >> $GITHUB_OUTPUT + fi + trigger-docs: - if: ${{ github.event.issue.pull_request && startsWith(github.event.comment.body, '/docs') }} + needs: check-membership + if: ${{ github.event.issue.pull_request && startsWith(github.event.comment.body, '/docs') && needs.check-membership.outputs.is_member == 'true' }} uses: windmill-labs/windmilldocs/.github/workflows/create-docs.yml@main with: pr_number: ${{ github.event.issue.number }} From dee62e1518e4bb4be8a339ae5f9f864002922333 Mon Sep 17 00:00:00 2001 From: centdix <40307056+centdix@users.noreply.github.com> Date: Thu, 22 May 2025 11:58:32 +0200 Subject: [PATCH 448/739] internal: secure flows (#5796) * secure flows * add restriction to claude code --- .github/workflows/aider-after-review.yaml | 25 ++++++------- .github/workflows/aider.yaml | 45 +++++++++++++---------- .github/workflows/claude.yml | 37 ++++++++++++++++--- .github/workflows/linear-issue.yaml | 17 ++++----- 4 files changed, 78 insertions(+), 46 deletions(-) diff --git a/.github/workflows/aider-after-review.yaml b/.github/workflows/aider-after-review.yaml index abd6091a31..578c7d1b7d 100644 --- a/.github/workflows/aider-after-review.yaml +++ b/.github/workflows/aider-after-review.yaml @@ -17,10 +17,11 @@ jobs: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_REPOSITORY: ${{ github.repository }} REVIEWER: ${{ github.event.review.user.login }} + ORG_ACCESS_TOKEN: ${{ secrets.ORG_ACCESS_TOKEN }} run: | ORG="windmill-labs" STATUS=$(curl -s -o /dev/null -w "%{http_code}" \ - -H "Authorization: token $GH_TOKEN" \ + -H "Authorization: token $ORG_ACCESS_TOKEN" \ -H "Accept: application/vnd.github+json" \ -H "X-GitHub-Api-Version: 2022-11-28" \ "https://api.github.com/orgs/$ORG/members/$REVIEWER") @@ -59,27 +60,25 @@ jobs: - name: Prepare prompt for Aider id: prepare_prompt shell: bash + env: + GITHUB_REPOSITORY: ${{ github.repository }} + PR_NUMBER: ${{ github.event.pull_request.number }} + REVIEW_BODY: ${{ github.event.review.body }} run: | - # Get PR review body - REVIEW_BODY="${{ github.event.review.body }}" - REVIEW_BODY_Q=$(printf '%q' "$REVIEW_BODY") + REVIEW_BODY_ESCAPED="${REVIEW_BODY//\\/\\\\}" + REVIEW_BODY_ESCAPED="${REVIEW_BODY_ESCAPED//\"/\\\"}" - PR_NUMBER="${{ github.event.pull_request.number }}" - - # Get all PR review comments ALL_REVIEW_COMMENTS=$(gh api \ -H "Accept: application/vnd.github+json" \ -H "X-GitHub-Api-Version: 2022-11-28" \ - /repos/$GITHUB_REPOSITORY/pulls/$PR_NUMBER/comments \ - | jq '[.[] | {diff_hunk: .diff_hunk, path: .path, body: .body}]') + /repos/$GITHUB_REPOSITORY/pulls/$PR_NUMBER/comments) + + FORMATTED_COMMENTS=$(jq -r '[.[] | {diff_hunk: .diff_hunk, path: .path, body: .body}]' <<< "$ALL_REVIEW_COMMENTS") BASE_PROMPT="Fix the following issues in the PR based on the review feedback. The review body is prepended with REVIEW. The review comments are prepended with REVIEW_COMMENTS. The review body and comments are separated by a blank line." - printf -v COMPLETE_PROMPT "%s\nREVIEW:\n%s\nREVIEW_COMMENTS:\n%s" \ - "$BASE_PROMPT" "$REVIEW_BODY_Q" "$ALL_REVIEW_COMMENTS" - echo "$COMPLETE_PROMPT" + COMPLETE_PROMPT="${BASE_PROMPT}"$'\n'"REVIEW:"$'\n'"${REVIEW_BODY_ESCAPED}"$'\n'"REVIEW_COMMENTS:"$'\n'"${FORMATTED_COMMENTS}" - # Use the proper multi-line output format echo "prompt_content<> $GITHUB_OUTPUT echo "$COMPLETE_PROMPT" >> $GITHUB_OUTPUT echo "EOF" >> $GITHUB_OUTPUT diff --git a/.github/workflows/aider.yaml b/.github/workflows/aider.yaml index 50d9946094..0614627b35 100644 --- a/.github/workflows/aider.yaml +++ b/.github/workflows/aider.yaml @@ -20,10 +20,11 @@ jobs: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_REPOSITORY: ${{ github.repository }} COMMENTER: ${{ github.event.comment.user.login }} + ORG_ACCESS_TOKEN: ${{ secrets.ORG_ACCESS_TOKEN }} run: | ORG="windmill-labs" STATUS=$(curl -s -o /dev/null -w "%{http_code}" \ - -H "Authorization: token $GH_TOKEN" \ + -H "Authorization: token $ORG_ACCESS_TOKEN" \ -H "Accept: application/vnd.github+json" \ -H "X-GitHub-Api-Version: 2022-11-28" \ "https://api.github.com/orgs/$ORG/members/$COMMENTER") @@ -66,6 +67,11 @@ jobs: - name: Determine inputs for Aider id: determine_inputs shell: bash + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + COMMENT_BODY: ${{ github.event.comment.body }} + ISSUE_NUMBER: ${{ github.event.issue.number }} + GITHUB_REPOSITORY: ${{ github.repository }} run: | echo "Determining inputs for Aider..." ISSUE_TITLE_VAL="" @@ -73,28 +79,31 @@ jobs: if [[ ! -z "${{ github.event.issue.pull_request }}" ]]; then echo "This is a comment on a Pull Request" - PR_NUMBER="${{ github.event.issue.number }}" + PR_NUMBER="$ISSUE_NUMBER" - PR_BODY_JSON=$(GH_TOKEN="${{ secrets.GITHUB_TOKEN }}" gh pr view "$PR_NUMBER" --json body --repo "$GITHUB_REPOSITORY") + PR_BODY_JSON=$(gh pr view "$PR_NUMBER" --json body --repo "$GITHUB_REPOSITORY") if [[ $? -ne 0 ]]; then echo "Error fetching PR body for PR #$PR_NUMBER" PR_BODY_VAL="" else - PR_BODY_VAL=$(echo "$PR_BODY_JSON" | jq -r .body) + PR_BODY_VAL=$(jq -r '.body // ""' <<< "$PR_BODY_JSON") fi if [[ ! -z "$PR_BODY_VAL" ]]; then - REFERENCED_ISSUE=$(echo "$PR_BODY_VAL" | grep -oE "#[0-9]+" | grep -oE "[0-9]+" | head -1) + REFERENCED_ISSUE="" + if [[ "$PR_BODY_VAL" =~ \#([0-9]+) ]]; then + REFERENCED_ISSUE="${BASH_REMATCH[1]}" + fi if [[ ! -z "$REFERENCED_ISSUE" ]]; then echo "Found referenced issue #$REFERENCED_ISSUE in PR description" - ISSUE_DETAILS_JSON=$(GH_TOKEN="${{ secrets.GITHUB_TOKEN }}" gh issue view "$REFERENCED_ISSUE" --json title,body --repo "$GITHUB_REPOSITORY") + ISSUE_DETAILS_JSON=$(gh issue view "$REFERENCED_ISSUE" --json title,body --repo "$GITHUB_REPOSITORY") if [[ $? -ne 0 ]]; then echo "Error fetching issue details for #$REFERENCED_ISSUE" else - ISSUE_TITLE_VAL=$(echo "$ISSUE_DETAILS_JSON" | jq -r .title) - ISSUE_BODY_VAL=$(echo "$ISSUE_DETAILS_JSON" | jq -r .body) + ISSUE_TITLE_VAL=$(jq -r '.title // ""' <<< "$ISSUE_DETAILS_JSON") + ISSUE_BODY_VAL=$(jq -r '.body // ""' <<< "$ISSUE_DETAILS_JSON") fi fi else @@ -102,34 +111,32 @@ jobs: fi else echo "This is a comment on a regular issue" - ISSUE_NUMBER="${{ github.event.issue.number }}" - ISSUE_DETAILS_JSON=$(GH_TOKEN="${{ secrets.GITHUB_TOKEN }}" gh issue view "$ISSUE_NUMBER" --json title,body --repo "$GITHUB_REPOSITORY") + + ISSUE_DETAILS_JSON=$(gh issue view "$ISSUE_NUMBER" --json title,body --repo "$GITHUB_REPOSITORY") if [[ $? -ne 0 ]]; then echo "Error fetching issue details for #$ISSUE_NUMBER" else - ISSUE_TITLE_VAL=$(echo "$ISSUE_DETAILS_JSON" | jq -r .title) - ISSUE_BODY_VAL=$(echo "$ISSUE_DETAILS_JSON" | jq -r .body) + ISSUE_TITLE_VAL=$(jq -r '.title // ""' <<< "$ISSUE_DETAILS_JSON") + ISSUE_BODY_VAL=$(jq -r '.body // ""' <<< "$ISSUE_DETAILS_JSON") fi fi - echo "Setting GITHUB_OUTPUT for ISSUE_TITLE..." echo "ISSUE_TITLE<> "$GITHUB_OUTPUT" echo "$ISSUE_TITLE_VAL" >> "$GITHUB_OUTPUT" echo "EOF_AIDER_TITLE" >> "$GITHUB_OUTPUT" - echo "Setting GITHUB_OUTPUT for ISSUE_BODY..." echo "ISSUE_BODY<> "$GITHUB_OUTPUT" echo "$ISSUE_BODY_VAL" >> "$GITHUB_OUTPUT" echo "EOF_AIDER_BODY" >> "$GITHUB_OUTPUT" - # Process COMMENT_CONTENT - printf -v COMMENT_CONTENT_VAL "%s" "$(echo "${{ github.event.comment.body }}" | sed 's|^/aider||' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')" + CLEAN_COMMENT="${COMMENT_BODY/\/aider/}" + CLEAN_COMMENT="${CLEAN_COMMENT#"${CLEAN_COMMENT%%[![:space:]]*}"}" + CLEAN_COMMENT="${CLEAN_COMMENT%"${CLEAN_COMMENT##*[![:space:]]}"}" + echo "COMMENT_CONTENT<> "$GITHUB_OUTPUT" - echo "$COMMENT_CONTENT_VAL" >> "$GITHUB_OUTPUT" + echo "$CLEAN_COMMENT" >> "$GITHUB_OUTPUT" echo "EOF_AIDER_COMMENT" >> "$GITHUB_OUTPUT" echo "Finished determining inputs." - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Make sure gh cli has a token run-aider: needs: [check-membership, check-and-prepare] diff --git a/.github/workflows/claude.yml b/.github/workflows/claude.yml index 77a96d6119..4dc170d8d1 100644 --- a/.github/workflows/claude.yml +++ b/.github/workflows/claude.yml @@ -11,12 +11,39 @@ on: types: [submitted] jobs: - claude-code-action: + check-membership: if: | - (github.event_name == 'issue_comment' && contains(github.event.comment.body, '/aider')) || - (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '/aider')) || - (github.event_name == 'pull_request_review' && contains(github.event.review.body, '/aider')) || - (github.event_name == 'issues' && contains(github.event.issue.body, '/aider')) + (github.event_name == 'issue_comment' && contains(github.event.comment.body, '/aider') && !contains(github.event.comment.user.login, '[bot]')) || + (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '/aider') && !contains(github.event.comment.user.login, '[bot]')) || + (github.event_name == 'pull_request_review' && contains(github.event.review.body, '/aider') && !contains(github.event.review.user.login, '[bot]')) || + (github.event_name == 'issues' && contains(github.event.issue.body, '/aider') && !contains(github.event.issue.user.login, '[bot]')) + runs-on: ubicloud-standard-2 + outputs: + is_member: ${{ steps.check-membership.outputs.is_member }} + steps: + - name: Check organization membership + id: check-membership + env: + COMMENTER: ${{ github.event_name == 'issue_comment' || github.event_name == 'pull_request_review_comment' ? github.event.comment.user.login : github.event_name == 'pull_request_review' ? github.event.review.user.login : github.event.issue.user.login }} + ORG_ACCESS_TOKEN: ${{ secrets.ORG_ACCESS_TOKEN }} + run: | + ORG="windmill-labs" + STATUS=$(curl -s -o /dev/null -w "%{http_code}" \ + -H "Authorization: token $ORG_ACCESS_TOKEN" \ + -H "Accept: application/vnd.github+json" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + "https://api.github.com/orgs/$ORG/members/$COMMENTER") + + if [ "$STATUS" -eq 204 ]; then + echo "is_member=true" >> $GITHUB_OUTPUT + else + echo "is_member=false" >> $GITHUB_OUTPUT + fi + + claude-code-action: + needs: check-membership + if: | + needs.check-membership.outputs.is_member == 'true' runs-on: ubicloud-standard-8 permissions: contents: read diff --git a/.github/workflows/linear-issue.yaml b/.github/workflows/linear-issue.yaml index 1dce5b6c87..22f9e53c46 100644 --- a/.github/workflows/linear-issue.yaml +++ b/.github/workflows/linear-issue.yaml @@ -37,24 +37,23 @@ jobs: - name: Determine inputs for Aider id: determine_inputs shell: bash + env: + ISSUE_TITLE: ${{ github.event.client_payload.issue_title }} + ISSUE_BODY: ${{ github.event.client_payload.issue_body }} + INSTRUCTION: ${{ github.event.client_payload.instruction }} run: | echo "Determining inputs for Aider..." - ISSUE_TITLE_VAL="${{ github.event.client_payload.issue_title }}" - INSTRUCTION_VAL="${{ github.event.client_payload.instruction }}" - ISSUE_BODY_VAL=$(printf '%q' "${{ github.event.client_payload.issue_body }}") - echo "Setting GITHUB_OUTPUT for ISSUE_TITLE..." + echo "ISSUE_TITLE<> "$GITHUB_OUTPUT" - echo "$ISSUE_TITLE_VAL" >> "$GITHUB_OUTPUT" + echo "$ISSUE_TITLE" >> "$GITHUB_OUTPUT" echo "EOF_AIDER_TITLE" >> "$GITHUB_OUTPUT" - echo "Setting GITHUB_OUTPUT for ISSUE_BODY..." echo "ISSUE_BODY<> "$GITHUB_OUTPUT" - echo "$ISSUE_BODY_VAL" >> "$GITHUB_OUTPUT" + echo "$ISSUE_BODY" >> "$GITHUB_OUTPUT" echo "EOF_AIDER_BODY" >> "$GITHUB_OUTPUT" - echo "Setting GITHUB_OUTPUT for INSTRUCTION..." echo "INSTRUCTION<> "$GITHUB_OUTPUT" - echo "$INSTRUCTION_VAL" >> "$GITHUB_OUTPUT" + echo "$INSTRUCTION" >> "$GITHUB_OUTPUT" echo "EOF_AIDER_INSTRUCTION" >> "$GITHUB_OUTPUT" echo "Finished determining inputs." From d662e18f97c2edc3d60df9496b0927901edb26a5 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 22 May 2025 12:07:21 +0200 Subject: [PATCH 449/739] add more labels to traces --- backend/windmill-queue/src/jobs.rs | 1 + backend/windmill-worker/src/handle_child.rs | 11 +++++++---- backend/windmill-worker/src/job_logger_ee.rs | 1 + 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/backend/windmill-queue/src/jobs.rs b/backend/windmill-queue/src/jobs.rs index 1ff103cd9a..f2b1e56153 100644 --- a/backend/windmill-queue/src/jobs.rs +++ b/backend/windmill-queue/src/jobs.rs @@ -980,6 +980,7 @@ pub async fn add_completed_job( is_flow_step = queued_job.is_flow_step(), language = ?queued_job.script_lang, scheduled_for = ?queued_job.scheduled_for, + workspace_id = ?queued_job.workspace_id, success, "inserted completed job: {} (success: {success})", queued_job.id diff --git a/backend/windmill-worker/src/handle_child.rs b/backend/windmill-worker/src/handle_child.rs index d82a72df98..c47af18073 100644 --- a/backend/windmill-worker/src/handle_child.rs +++ b/backend/windmill-worker/src/handle_child.rs @@ -134,7 +134,7 @@ pub async fn handle_child( let (tx, rx) = broadcast::channel::<()>(3); let mut rx2: broadcast::Receiver<()> = tx.subscribe(); - let output = child_joined_output_stream(&mut child, job_id.clone()); + let output = child_joined_output_stream(&mut child, job_id.clone(), w_id.to_string()); let job_id: Uuid = job_id.clone(); @@ -729,6 +729,7 @@ where fn child_joined_output_stream( child: &mut Child, job_id: Uuid, + w_id: String, ) -> impl stream::FusedStream> { let stderr = child .stderr @@ -743,8 +744,8 @@ fn child_joined_output_stream( let stdout = BufReader::new(stdout).lines(); let stderr = BufReader::new(stderr).lines(); stream::select( - lines_to_stream(stderr, true, job_id.clone()), - lines_to_stream(stdout, false, job_id), + lines_to_stream(stderr, true, job_id.clone(), w_id.clone(), path.clone()), + lines_to_stream(stdout, false, job_id, w_id, path), ) } @@ -752,11 +753,13 @@ pub fn lines_to_stream( mut lines: tokio::io::Lines, stderr: bool, job_id: Uuid, + w_id: String, + path: String, ) -> impl futures::Stream> { stream::poll_fn(move |cx| { std::pin::Pin::new(&mut lines) .poll_next_line(cx) - .map(|result| process_streaming_log_lines(result, stderr, &job_id)) + .map(|result| process_streaming_log_lines(result, stderr, &job_id, &w_id)) }) } diff --git a/backend/windmill-worker/src/job_logger_ee.rs b/backend/windmill-worker/src/job_logger_ee.rs index 4b1d34392c..22772878ee 100644 --- a/backend/windmill-worker/src/job_logger_ee.rs +++ b/backend/windmill-worker/src/job_logger_ee.rs @@ -36,6 +36,7 @@ pub(crate) fn process_streaming_log_lines( r: Result, io::Error>, _stderr: bool, _job_id: &Uuid, + _w_id: &str, ) -> Option> { r.transpose() } From 3fbebcdef57c75c7effde0755794e81b9722def8 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 22 May 2025 12:35:32 +0200 Subject: [PATCH 450/739] add more labels to traces --- backend/ee-repo-ref.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/ee-repo-ref.txt b/backend/ee-repo-ref.txt index 71591f02b5..36e0923e83 100644 --- a/backend/ee-repo-ref.txt +++ b/backend/ee-repo-ref.txt @@ -1 +1 @@ -0f0df9dd99a44baf890f24323f0a2eb2ee1120ce \ No newline at end of file +7632fb040ac1dd340d7ef4ddd90304c6a06e71f1 \ No newline at end of file From d9bd80b280690bc07f1e3c125bf4d3486b8ef0c9 Mon Sep 17 00:00:00 2001 From: centdix <40307056+centdix@users.noreply.github.com> Date: Thu, 22 May 2025 12:35:44 +0200 Subject: [PATCH 451/739] internal: fix flows (#5797) * remove test line * fix claude --- .github/workflows/aider-common.yml | 2 +- .github/workflows/claude.yml | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/.github/workflows/aider-common.yml b/.github/workflows/aider-common.yml index 2e4e99c716..dceea4a012 100644 --- a/.github/workflows/aider-common.yml +++ b/.github/workflows/aider-common.yml @@ -273,7 +273,7 @@ jobs: --read .cursor/rules/windmill-overview.mdc \ $FILES_TO_EDIT \ --model gemini/gemini-2.5-pro-preview-05-06 \ - --message "create a test file in backend/test.txt with hello world in it" \ + --message-file .aider_final_prompt.txt \ --yes \ --no-check-update \ --auto-commits \ diff --git a/.github/workflows/claude.yml b/.github/workflows/claude.yml index 4dc170d8d1..7ac5d93802 100644 --- a/.github/workflows/claude.yml +++ b/.github/workflows/claude.yml @@ -24,10 +24,18 @@ jobs: - name: Check organization membership id: check-membership env: - COMMENTER: ${{ github.event_name == 'issue_comment' || github.event_name == 'pull_request_review_comment' ? github.event.comment.user.login : github.event_name == 'pull_request_review' ? github.event.review.user.login : github.event.issue.user.login }} ORG_ACCESS_TOKEN: ${{ secrets.ORG_ACCESS_TOKEN }} run: | ORG="windmill-labs" + + if [[ "${{ github.event_name }}" == "issue_comment" || "${{ github.event_name }}" == "pull_request_review_comment" ]]; then + COMMENTER="${{ github.event.comment.user.login }}" + elif [[ "${{ github.event_name }}" == "pull_request_review" ]]; then + COMMENTER="${{ github.event.review.user.login }}" + else + COMMENTER="${{ github.event.issue.user.login }}" + fi + STATUS=$(curl -s -o /dev/null -w "%{http_code}" \ -H "Authorization: token $ORG_ACCESS_TOKEN" \ -H "Accept: application/vnd.github+json" \ From e3e25daee79380131f3f28ad326c4455b489f1d3 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 22 May 2025 14:12:10 +0200 Subject: [PATCH 452/739] fix --- backend/windmill-worker/src/handle_child.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/backend/windmill-worker/src/handle_child.rs b/backend/windmill-worker/src/handle_child.rs index c47af18073..3eb9e95dc9 100644 --- a/backend/windmill-worker/src/handle_child.rs +++ b/backend/windmill-worker/src/handle_child.rs @@ -744,8 +744,8 @@ fn child_joined_output_stream( let stdout = BufReader::new(stdout).lines(); let stderr = BufReader::new(stderr).lines(); stream::select( - lines_to_stream(stderr, true, job_id.clone(), w_id.clone(), path.clone()), - lines_to_stream(stdout, false, job_id, w_id, path), + lines_to_stream(stderr, true, job_id.clone(), w_id.clone()), + lines_to_stream(stdout, false, job_id, w_id), ) } @@ -754,7 +754,6 @@ pub fn lines_to_stream( stderr: bool, job_id: Uuid, w_id: String, - path: String, ) -> impl futures::Stream> { stream::poll_fn(move |cx| { std::pin::Pin::new(&mut lines) From 21741e68bcf467b4f87390da51b076b7af91f494 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 22 May 2025 14:23:49 +0200 Subject: [PATCH 453/739] fix --- backend/ee-repo-ref.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/ee-repo-ref.txt b/backend/ee-repo-ref.txt index 36e0923e83..fec7d05006 100644 --- a/backend/ee-repo-ref.txt +++ b/backend/ee-repo-ref.txt @@ -1 +1 @@ -7632fb040ac1dd340d7ef4ddd90304c6a06e71f1 \ No newline at end of file +0854c5c00f62751aa5eb44fd9e550052fdcf7884 \ No newline at end of file From 88482c3bd76ddad16738354f7531d16fa806ad2f Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 22 May 2025 14:40:53 +0200 Subject: [PATCH 454/739] fix: improve app css consistency --- .../apps/components/buttons/AppButton.svelte | 6 +- .../apps/components/display/AppAlert.svelte | 9 +- .../apps/components/layout/AppModal.svelte | 4 +- .../apps/editor/component/components.ts | 3 +- .../componentsPanel/CssHelperPanel.svelte | 256 ++++++++++-------- .../apps/editor/componentsPanel/cssUtils.ts | 32 ++- 6 files changed, 184 insertions(+), 126 deletions(-) diff --git a/frontend/src/lib/components/apps/components/buttons/AppButton.svelte b/frontend/src/lib/components/apps/components/buttons/AppButton.svelte index ff3f34097b..5ad842ba6c 100644 --- a/frontend/src/lib/components/apps/components/buttons/AppButton.svelte +++ b/frontend/src/lib/components/apps/components/buttons/AppButton.svelte @@ -229,7 +229,8 @@ css?.button?.class ?? '', isMenuItem ? 'flex items-center justify-start' : '', isMenuItem ? '!border-0' : '', - 'wm-button' + 'wm-button', + `wm-button-${resolvedConfig.color}` )} variant={isMenuItem ? 'border' : 'contained'} style={css?.button?.style} @@ -237,7 +238,8 @@ css?.container?.class ?? '', resolvedConfig.fillContainer ? 'w-full h-full' : '', isMenuItem ? 'w-full' : '', - 'wm-button-container' + 'wm-button-container', + `wm-button-container-${resolvedConfig.color}` )} wrapperStyle={css?.container?.style} disabled={resolvedConfig.disabled} diff --git a/frontend/src/lib/components/apps/components/display/AppAlert.svelte b/frontend/src/lib/components/apps/components/display/AppAlert.svelte index 20fc60ba03..24dfa9ea51 100644 --- a/frontend/src/lib/components/apps/components/display/AppAlert.svelte +++ b/frontend/src/lib/components/apps/components/display/AppAlert.svelte @@ -10,6 +10,7 @@ import InitializeComponent from '../helpers/InitializeComponent.svelte' import { Alert } from '$lib/components/common' import AlignWrapper from '../helpers/AlignWrapper.svelte' + import { appendClass } from '../../editor/componentsPanel/cssUtils' export let id: string export let configuration: RichConfigurations @@ -63,13 +64,13 @@ tooltip={resolvedConfig.tooltip} size={resolvedConfig.size} collapsible={resolvedConfig.collapsible} - bgClass={css?.background?.class} + bgClass={appendClass(css?.background?.class, 'wm-alert-card-background')} bgStyle={css?.background?.style} - iconClass={css?.icon?.class} + iconClass={appendClass(css?.icon?.class, 'wm-alert-card-icon')} iconStyle={css?.icon?.style} - titleClass={css?.title?.class} + titleClass={appendClass(css?.title?.class, 'wm-alert-card-title')} titleStyle={css?.title?.style} - descriptionClass={css?.description?.class} + descriptionClass={appendClass(css?.description?.class, 'wm-alert-card-description')} descriptionStyle={css?.description?.style} isCollapsed={resolvedConfig.initiallyCollapsed} > diff --git a/frontend/src/lib/components/apps/components/layout/AppModal.svelte b/frontend/src/lib/components/apps/components/layout/AppModal.svelte index 3000afdedf..15f3eca206 100644 --- a/frontend/src/lib/components/apps/components/layout/AppModal.svelte +++ b/frontend/src/lib/components/apps/components/layout/AppModal.svelte @@ -179,7 +179,7 @@ >
{ e?.stopPropagation() if (!$connectingInput.opened) { diff --git a/frontend/src/lib/components/apps/editor/component/components.ts b/frontend/src/lib/components/apps/editor/component/components.ts index 2ff364f44a..27d0bfc3bf 100644 --- a/frontend/src/lib/components/apps/editor/component/components.ts +++ b/frontend/src/lib/components/apps/editor/component/components.ts @@ -3410,7 +3410,8 @@ See date-fns format for more information. By default, it is 'dd.MM.yyyy HH:mm' customCss: { button: { class: '', style: '' }, buttonContainer: { class: '', style: '' }, - popup: { class: '', style: '' } + popup: { class: '', style: '' }, + container: { class: '', style: '' } }, initialData: { horizontalAlignment: 'center', diff --git a/frontend/src/lib/components/apps/editor/componentsPanel/CssHelperPanel.svelte b/frontend/src/lib/components/apps/editor/componentsPanel/CssHelperPanel.svelte index fda2b9338a..05e6380238 100644 --- a/frontend/src/lib/components/apps/editor/componentsPanel/CssHelperPanel.svelte +++ b/frontend/src/lib/components/apps/editor/componentsPanel/CssHelperPanel.svelte @@ -20,20 +20,38 @@ const dispatch = createEventDispatcher() interface CustomCSSEntry { - type: CustomCSSType + type?: CustomCSSType name: string icon: any - ids: { id: string; forceStyle: boolean; forceClass: boolean }[] + ids?: { id: string; forceStyle: boolean; forceClass: boolean }[] + description?: string + order?: number } const { app } = getContext('AppViewerContext') + const descriptions = { + buttoncomponent: + 'The button component also has additional color specific classes to allow customizing classes by color. wm-button-wrapper-blue, wm-button-container-blue, ...' + } const entries: CustomCSSEntry[] = [ + { + name: 'Dark Mode', + icon: LayoutDashboardIcon, + description: + 'When in dark mode, the entire document has the .dark class applied to it. You can apply selective styling by using the .dark class: e.g. .dark .my-element { color: white; }', + order: 3 + }, { type: 'app', name: 'App', icon: LayoutDashboardIcon, - ids: ['viewer', 'grid', 'component'].map((id) => ({ id, forceStyle: true, forceClass: true })) + ids: ['viewer', 'grid', 'component'].map((id) => ({ + id, + forceStyle: true, + forceClass: true + })), + order: 2 }, { type: 'quillcomponent', @@ -51,11 +69,12 @@ id, forceStyle: v?.style != undefined, forceClass: v?.['class'] != undefined - })) + })), + description: descriptions[type as keyof typeof descriptions] })) ] - entries.sort((a, b) => a.name.localeCompare(b.name)) + entries.sort((a, b) => (b.order ?? 0) - (a.order ?? 0) + a.name.localeCompare(b.name)) let search = '' @@ -66,15 +85,15 @@
{#each search != '' ? entries.filter((x) => x.name .toLowerCase() - .includes(search.toLowerCase())) : entries as { type, name, icon, ids } (name + type)} - {#if ids.length > 0} + .includes(search.toLowerCase())) : entries as { type, name, icon, ids, description } (name + type)} + {#if description || (ids && ids.length > 0)} { if ($app.css != undefined) { - if (e.detail && $app.css[type] == undefined) { - $app.css[type] = Object.fromEntries(ids.map(({ id }) => [id, {}])) + if (type && e.detail && $app.css[type] == undefined) { + $app.css[type] = Object.fromEntries((ids ?? []).map(({ id }) => [id, {}])) } } }} @@ -85,115 +104,120 @@ {name}
-
- {#each customisationByComponent.filter( (c) => c.components.includes(type) ) as customisation (customisation.components.join('-'))} - {#if customisation.link} - -
- See documentation - -
-
- {/if} - - - {#if customisation.selectors.length > 0} - - Selectors ({customisation.selectors.length}) - - {/if} - {#if customisation.variables.length > 0} - -
- Variables ({customisation.variables.length}) + {#if description} +
{description}
+ {/if} + {#if type} +
+ {#each customisationByComponent.filter( (c) => c.components.includes(type) ) as customisation (customisation.components.join('-'))} + {#if customisation.link} + +
+ See documentation +
- +
{/if} -
- - - - - Selector - Comment - - - - {#each customisation.selectors as { selector, comment }} - - - {selector} - - - {#if comment} -
{comment}
- {/if} -
- - - -
- {/each} -
-
- - - - - Variable - Default value - Comment - - - - {#each customisation.variables as { variable, value, comment }} - - - {variable} - - - {value} - - - {#if comment} -
{comment}
- {/if} -
- - - -
- {/each} -
-
-
- - {/each} -
+ + + {#if customisation.selectors.length > 0} + + Selectors ({customisation.selectors.length}) + + {/if} + {#if customisation.variables.length > 0} + +
+ Variables ({customisation.variables.length}) +
+
+ {/if} +
+ + + + + Selector + Comment + + + + {#each customisation.selectors as { selector, comment }} + + + {selector} + + + {#if comment} +
{comment}
+ {/if} +
+ + + +
+ {/each} +
+
+ + + + + Variable + Default value + Comment + + + + {#each customisation.variables as { variable, value, comment }} + + + {variable} + + + {value} + + + {#if comment} +
{comment}
+ {/if} +
+ + + +
+ {/each} +
+
+
+
+ {/each} +
+ {/if} {/if} {/each} diff --git a/frontend/src/lib/components/apps/editor/componentsPanel/cssUtils.ts b/frontend/src/lib/components/apps/editor/componentsPanel/cssUtils.ts index 6fc8344295..4634959ac0 100644 --- a/frontend/src/lib/components/apps/editor/componentsPanel/cssUtils.ts +++ b/frontend/src/lib/components/apps/editor/componentsPanel/cssUtils.ts @@ -185,7 +185,11 @@ export const customisationByComponent: Customisation[] = [ components: ['modalcomponent'], selectors: [ { selector: '.wm-modal', comment: 'main modal element', customCssKey: 'popup' }, - { selector: '.wm-modal-button', comment: 'button to open modal', customCssKey: 'button' }, + { + selector: '.wm-modal-container', + comment: 'container for modal', + customCssKey: 'container' + }, { selector: '.wm-modal-button-container', comment: 'container for button to open modal', @@ -826,6 +830,26 @@ export const customisationByComponent: Customisation[] = [ selector: 'wm-alert-card-container', comment: 'Alert container', customCssKey: 'container' + }, + { + selector: 'wm-alert-card-background', + comment: 'Alert background', + customCssKey: 'background' + }, + { + selector: 'wm-alert-card-icon', + comment: 'Alert icon', + customCssKey: 'icon' + }, + { + selector: 'wm-alert-card-title', + comment: 'Alert title', + customCssKey: 'title' + }, + { + selector: 'wm-alert-card-description', + comment: 'Alert description', + customCssKey: 'description' } ], variables: [] @@ -860,3 +884,9 @@ export function hasStyleValue(obj: ComponentCssProperty | undefined) { return obj.style !== '' } + +export function appendClass(className: string | undefined, customCssKey: string) { + if (!className) return customCssKey + + return `${className} ${customCssKey}` +} From 55ae76648475ce9ff14b2fa33b2a71b90fbd50a1 Mon Sep 17 00:00:00 2001 From: wendrul <53628737+wendrul@users.noreply.github.com> Date: Thu, 22 May 2025 15:23:45 +0200 Subject: [PATCH 455/739] feat: job search pagination + result count (#5789) * add tracing to get of authed client * fix: make disabled items not selectable with arrow keys * Invert showing EE message only when not in EE * Makea component for the Run Search part of the Search modal * Make the button to load more jobs * Add pagination for job search * fix missing bind to the openModal bool * Turn off spinner when aborting search results * fix typo in openapi.yaml * Update ee repo ref * Remove unused imports and vars --------- Co-authored-by: Ruben Fiszel --- backend/ee-repo-ref.txt | 2 +- backend/windmill-api/openapi.yaml | 26 +- .../search/GlobalSearchModal.svelte | 211 +++----------- .../lib/components/search/RunsSearch.svelte | 266 ++++++++++++++++++ 4 files changed, 321 insertions(+), 184 deletions(-) create mode 100644 frontend/src/lib/components/search/RunsSearch.svelte diff --git a/backend/ee-repo-ref.txt b/backend/ee-repo-ref.txt index fec7d05006..4d15f57a97 100644 --- a/backend/ee-repo-ref.txt +++ b/backend/ee-repo-ref.txt @@ -1 +1 @@ -0854c5c00f62751aa5eb44fd9e550052fdcf7884 \ No newline at end of file +bea87fa885dc041fba83b2491609a4a2cdbbfa6f diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index 5020067440..9895efce7e 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -12590,6 +12590,11 @@ paths: required: true schema: type: string + - name: pagination_offset + in: query + required: false + schema: + type: integer responses: "200": description: search results @@ -12602,15 +12607,26 @@ paths: description: a list of the terms that couldn't be parsed (and thus ignored) type: array items: - type: object - properties: - dancer: - type: string + type: string hits: description: the jobs that matched the query type: array items: $ref: "#/components/schemas/JobSearchHit" + hit_count: + description: how many jobs matched in total + type: number + index_metadata: + description: Metadata about the index current state + type: object + properties: + indexed_until: + description: Datetime of the most recently indexed job + type: string + format: date-time + lost_lock_ownership: + description: Is the current indexer service being replaced + type: boolean /srch/index/search/service_logs: get: @@ -16810,4 +16826,4 @@ components: channel_name: type: string description: Microsoft Teams channel name - minLength: 1 \ No newline at end of file + minLength: 1 diff --git a/frontend/src/lib/components/search/GlobalSearchModal.svelte b/frontend/src/lib/components/search/GlobalSearchModal.svelte index 271389b007..e684ce0d89 100644 --- a/frontend/src/lib/components/search/GlobalSearchModal.svelte +++ b/frontend/src/lib/components/search/GlobalSearchModal.svelte @@ -3,7 +3,6 @@ import { AppService, FlowService, - IndexSearchService, RawAppService, ScriptService, type Flow, @@ -11,8 +10,7 @@ type ListableRawApp, type Script } from '$lib/gen' - import { clickOutside, displayDateOnly, isMac, sendUserToast } from '$lib/utils' - import TimeAgo from '../TimeAgo.svelte' + import { clickOutside, isMac } from '$lib/utils' import { AlertTriangle, BoxesIcon, @@ -22,14 +20,12 @@ DollarSignIcon, HomeIcon, LayoutDashboardIcon, - Loader2, PlayIcon, Route, Search, SearchCode, Unplug } from 'lucide-svelte' - import JobPreview from '../runs/JobPreview.svelte' import Portal from '$lib/components/Portal.svelte' import { twMerge } from 'tailwind-merge' @@ -44,6 +40,7 @@ import Popover from '../Popover.svelte' import Logs from 'lucide-svelte/icons/logs' import { AwsIcon, GoogleCloudIcon, KafkaIcon, MqttIcon, NatsIcon } from '../icons' + import RunsSearch from './RunsSearch.svelte' let open: boolean = false @@ -72,7 +69,7 @@ let switchModeItems: quickMenuItem[] = [ { search_id: 'switchto:run-search', - label: 'Search across completed runs' + ($enterpriseLicense ? '' : ' (EE)'), + label: 'Search across completed runs' + (!$enterpriseLicense ? '' : ' (EE)'), action: () => switchMode('runs'), shortcutKey: RUNS_PREFIX, icon: Search, @@ -113,28 +110,28 @@ }, { search_id: 'nav:kafka_triggers', - label: 'Go to Kafka triggers' + ($enterpriseLicense ? '' : ' (EE)'), + label: 'Go to Kafka triggers' + (!$enterpriseLicense ? '' : ' (EE)'), action: () => gotoPage('/kafka_triggers'), icon: KafkaIcon, disabled: $userStore?.operator }, { search_id: 'nav:nats_triggers', - label: 'Go to NATS triggers' + ($enterpriseLicense ? '' : ' (EE)'), + label: 'Go to NATS triggers' + (!$enterpriseLicense ? '' : ' (EE)'), action: () => gotoPage('/nats_triggers'), icon: NatsIcon, disabled: $userStore?.operator }, { search_id: 'nav:sqs_triggers', - label: 'Go to SQS triggers' + ($enterpriseLicense ? '' : ' (EE)'), + label: 'Go to SQS triggers' + (!$enterpriseLicense ? '' : ' (EE)'), action: () => gotoPage('/sqs_triggers'), icon: AwsIcon, disabled: $userStore?.operator }, { search_id: 'nav:gcp_pub_sub', - label: 'Go to GCP Pub/Sub' + ($enterpriseLicense ? '' : ' (EE)'), + label: 'Go to GCP Pub/Sub' + (!$enterpriseLicense ? '' : ' (EE)'), action: () => gotoPage('/gcp_triggers'), icon: GoogleCloudIcon, disabled: $userStore?.operator @@ -264,12 +261,8 @@ return r } - let debounceTimeout: any = undefined - const debouncePeriod: number = 1000 - let loadingCompletedRuns: boolean = false let queryParseErrors: string[] = [] - let indexMetadata: any = {} async function handleSearch() { queryParseErrors = [] @@ -314,6 +307,7 @@ ) ) } + itemMap['default'] = itemMap['default'].filter((e) => !e.disabled) } if (tab === 'switch-mode') { itemMap['switch-mode'] = fuzzyFilter( @@ -323,26 +317,8 @@ ) } if (tab === 'runs') { - const s = removePrefix(searchTerm, RUNS_PREFIX) - clearTimeout(debounceTimeout) - loadingCompletedRuns = true - debounceTimeout = setTimeout(async () => { - clearTimeout(debounceTimeout) - let searchResults - try { - searchResults = await IndexSearchService.searchJobsIndex({ - searchQuery: s, - workspace: $workspaceStore! - }) - itemMap['runs'] = searchResults.hits - queryParseErrors = searchResults.query_parse_errors - indexMetadata = searchResults.index_metadata - } catch (e) { - sendUserToast(e.body, true) - } - loadingCompletedRuns = false - selectedItem = selectItem(0) - }, debouncePeriod) + await tick() + runsSearch?.handleRunSearch(removePrefix(searchTerm, RUNS_PREFIX)) } selectedItem = selectItem(0) } @@ -594,6 +570,8 @@ return 'max-h-[60vh]' } } + + let runsSearch: RunsSearch {#if open} @@ -652,18 +630,16 @@ {#if items.length > 0}
{#each items as el} - {#if !el.disabled} - (selectedItem = el)} - id={el?.search_id} - hovered={el?.search_id === selectedItem?.search_id} - label={el?.label} - icon={el?.icon} - shortcutKey={el?.shortcutKey} - bind:mouseMoved - /> - {/if} + (selectedItem = el)} + id={el?.search_id} + hovered={el?.search_id === selectedItem?.search_id} + label={el?.label} + icon={el?.icon} + shortcutKey={el?.shortcutKey} + bind:mouseMoved + /> {/each}
{/if} @@ -729,138 +705,17 @@ {/if}
{:else if tab === 'runs'} -
- {#if loadingCompletedRuns} -
-
- -
-
- {:else if itemMap['runs'] && itemMap['runs'].length > 0} -
- {#each itemMap['runs'] ?? [] as r} - { - selectedItem = r - selectedWorkspace = r?.document.workspace_id[0] - }} - on:keyboardOnlySelect={() => { - open = false - goto(`/run/${r?.document.id[0]}`) - }} - id={r?.document.id[0]} - hovered={selectedItem && r?.document.id[0] === selectedItem?.document.id[0]} - icon={r?.icon} - containerClass="rounded-md px-2 py-1 my-2" - bind:mouseMoved - > - -
-
-
-
{r?.document.script_path}
-
-
- {displayDateOnly(new Date(r?.document.created_at[0]))} -
-
- -
-
-
-
-
-
- {/each} -
-
- {#if selectedItem === undefined} - Select a result to preview - {:else} -
- -
- {/if} -
- {#if indexMetadata.indexed_until} - - Most recently indexed job was created at - - {/if} - {#if indexMetadata.lost_lock_ownership} - - - - The current indexer is no longer indexing new jobs. This is most likely - because of an ongoing deployment and indexing will resume once it's - complete. - - - {/if} -
-
- {:else} -
-
- {#if searchTerm === RUNS_PREFIX} -
Enter your search terms
-
Start typing to do full-text search across completed runs
- {:else} -
No runs found
-
There were no completed runs that match your query
- {/if} -
- Note that new runs might take a while to become searchable (by default ~5min) -
- {#if !$enterpriseLicense} -
- - - Full-text search on jobs is only available on EE. - - {/if} -
-
- {#if indexMetadata.indexed_until} - - Most recently indexed job was created at - - {/if} - {#if indexMetadata.lost_lock_ownership} - - - - The current indexer is no longer indexing new jobs. This is most likely - because of an ongoing deployment and indexing will resume once it's - complete. - - - {/if} -
-
- {/if} -
+ {/if}
diff --git a/frontend/src/lib/components/search/RunsSearch.svelte b/frontend/src/lib/components/search/RunsSearch.svelte new file mode 100644 index 0000000000..e955304786 --- /dev/null +++ b/frontend/src/lib/components/search/RunsSearch.svelte @@ -0,0 +1,266 @@ + + +
+ {#if loadingCompletedRuns} +
+
+ +
+
+ {:else if loadedRuns && loadedRuns.length > 0} +
+
+ {runSearchTotalCount} jobs matched the query +
+
+ {#each loadedRuns ?? [] as r} + {#if r.search_id === 'opt:load_more_jobs'} +
+ {#if loadingMoreJobs} +
+ +
+ {:else} + { + selectedItem = r + selectedWorkspace = undefined + const paginationOffset = runSearchTotalCount! - runSearchRemainingCount! + loadMoreJobs(searchTerm, paginationOffset) + }} + id={'opt:load_more_jobs'} + hovered={selectedItem && r?.search_id === selectedItem?.search_id} + containerClass="rounded-md px-2 py-1 my-2" + bind:mouseMoved + > + +
+ Some other {runSearchRemainingCount} jobs matched the query. Click to load more. + + +
+
+
+ {/if} + {:else} + { + selectedItem = r + selectedWorkspace = r?.document.workspace_id[0] + }} + on:keyboardOnlySelect={() => { + open = false + goto(`/run/${r?.document.id[0]}`) + }} + id={r?.document.id[0]} + hovered={selectedItem && r?.search_id === selectedItem?.search_id} + icon={r?.icon} + containerClass="rounded-md px-2 py-1 my-2" + bind:mouseMoved + > + +
+
+
+
{r?.document.script_path}
+
+
+ {displayDateOnly(new Date(r?.document.created_at[0]))} +
+
+ +
+
+
+
+
+
+ {/if} + {/each} +
+
+
+ {#if selectedItem === undefined} + Select a result to preview + {:else} +
+ +
+ {/if} +
+ {#if indexMetadata.indexed_until} + + Most recently indexed job was created at + + {/if} + {#if indexMetadata.lost_lock_ownership} + + + + The current indexer is no longer indexing new jobs. This is most likely because of an + ongoing deployment and indexing will resume once it's complete. + + + {/if} +
+
+ {:else} +
+
+ {#if searchTerm === ''} +
Enter your search terms
+
Start typing to do full-text search across completed runs
+ {:else} +
No runs found
+
There were no completed runs that match your query
+ {/if} +
+ Note that new runs might take a while to become searchable (by default ~5min) +
+ {#if !$enterpriseLicense} +
+ + + Full-text search on jobs is only available on EE. + + {/if} +
+
+ {#if indexMetadata.indexed_until} + + Most recently indexed job was created at + + {/if} + {#if indexMetadata.lost_lock_ownership} + + + + The current indexer is no longer indexing new jobs. This is most likely because of an + ongoing deployment and indexing will resume once it's complete. + + + {/if} +
+
+ {/if} +
From 6381cdf7d3823dfd246e3b6971e160d7e3ab8fe7 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 22 May 2025 18:26:41 +0200 Subject: [PATCH 456/739] improve service log select --- .../lib/components/ServiceLogsInner.svelte | 58 ++++++++++++++++--- .../apps/svelte-select/lib/Select.svelte | 13 +++-- 2 files changed, 56 insertions(+), 15 deletions(-) diff --git a/frontend/src/lib/components/ServiceLogsInner.svelte b/frontend/src/lib/components/ServiceLogsInner.svelte index 9769e82fca..9b358adf80 100644 --- a/frontend/src/lib/components/ServiceLogsInner.svelte +++ b/frontend/src/lib/components/ServiceLogsInner.svelte @@ -15,6 +15,9 @@ import AnsiUp from 'ansi_up' import { scroll_into_view_if_needed_polyfill } from './multiselect/utils' import SplitPanesOrColumnOnMobile from './splitPanes/SplitPanesOrColumnOnMobile.svelte' + import Select from './apps/svelte-select/lib/Select.svelte' + import { SELECT_INPUT_DEFAULT_STYLE } from '$lib/defaults' + import DarkModeObserver from './DarkModeObserver.svelte' export let searchTerm: string export let queryParseErrors: string[] = [] @@ -319,10 +322,13 @@ const buckets = res['buckets'] sumOtherDocCount = res['sum_other_doc_count'] countsPerHost = new Map(buckets.map(({ key, doc_count }) => [key, doc_count])) - countsPerHost = buckets.reduce((acc: any, { key, doc_count }) => { - acc[key] = { doc_count } - return acc - }, {} as Record) + countsPerHost = buckets.reduce( + (acc: any, { key, doc_count }) => { + acc[key] = { doc_count } + return acc + }, + {} as Record + ) queryParseErrors = countLogsResponse.query_parse_errors ?? [] loadingLogCounts = false } @@ -376,7 +382,7 @@ let ret = {} for (const hk of Object.keys(countsPerHost)) { - let u = hk.split(",") + let u = hk.split(',') let [mode, wg, hn] = [u[0], u[1], u[2]] if (!ret[mode]) { @@ -392,8 +398,23 @@ return ret } + + function getSelectItems(allLogs: ByMode, countsPerHost: any): { label: string; value: any }[] { + return Object.entries(allLogsOrQueryResults(allLogs, countsPerHost)).flatMap(([mode, o1]) => + Object.entries(o1).flatMap(([wg, o2]) => + Object.keys(o2).map((hn) => ({ + label: hn, + value: [mode, wg, hn] + })) + ) + ) + } + + let darkMode = false + + @@ -436,7 +457,7 @@ month: '2-digit', hour: '2-digit', minute: '2-digit' - }) + }) : 'min datetime'} disabled /> @@ -476,7 +497,7 @@ month: '2-digit', hour: '2-digit', minute: '2-digit' - }) + }) : 'max datetime'} disabled /> @@ -548,6 +569,24 @@ >
{/if} +
+ + {:else if bucket_config.type === 'AwsOidc'} + + + {:else}
Unknown bucket type {bucket_config['type']}
{/if} From d940b395091954cc0f1c7e2b47cf9a9de09e5870 Mon Sep 17 00:00:00 2001 From: Guilhem Date: Mon, 26 May 2025 09:21:46 +0200 Subject: [PATCH 473/739] fix triggers reset upon deploy (#5812) --- frontend/src/lib/components/FlowBuilder.svelte | 2 +- frontend/src/lib/components/ScriptBuilder.svelte | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/lib/components/FlowBuilder.svelte b/frontend/src/lib/components/FlowBuilder.svelte index b28eb4bcec..ab8fc1ea9f 100644 --- a/frontend/src/lib/components/FlowBuilder.svelte +++ b/frontend/src/lib/components/FlowBuilder.svelte @@ -461,7 +461,7 @@ ...structuredClone(newSavedFlow), path: $pathStore } as Flow - triggersState.setTriggers([]) + setDraftTriggers([]) loadingSave = false dispatch('deploy', $pathStore) } catch (err) { diff --git a/frontend/src/lib/components/ScriptBuilder.svelte b/frontend/src/lib/components/ScriptBuilder.svelte index 5fa096f06e..5f1da5267c 100644 --- a/frontend/src/lib/components/ScriptBuilder.svelte +++ b/frontend/src/lib/components/ScriptBuilder.svelte @@ -556,7 +556,7 @@ const { draft_triggers: _, ...newScript } = structuredClone(script) savedScript = structuredClone(newScript) as NewScriptWithDraft - triggersState.setTriggers([]) + setDraftTriggers([]) if (!disableHistoryChange) { history.replaceState(history.state, '', `/scripts/edit/${script.path}`) From 306f3eabd1c03fa904b0e59438de124a0e680597 Mon Sep 17 00:00:00 2001 From: HugoCasa Date: Mon, 26 May 2025 19:38:01 +0200 Subject: [PATCH 474/739] fix: add missing http_trigger_version_seq grants (#5816) --- .../migrations/20250526173025_http_trigger_seq_grants.down.sql | 1 + .../migrations/20250526173025_http_trigger_seq_grants.up.sql | 3 +++ 2 files changed, 4 insertions(+) create mode 100644 backend/migrations/20250526173025_http_trigger_seq_grants.down.sql create mode 100644 backend/migrations/20250526173025_http_trigger_seq_grants.up.sql diff --git a/backend/migrations/20250526173025_http_trigger_seq_grants.down.sql b/backend/migrations/20250526173025_http_trigger_seq_grants.down.sql new file mode 100644 index 0000000000..d2f607c5b8 --- /dev/null +++ b/backend/migrations/20250526173025_http_trigger_seq_grants.down.sql @@ -0,0 +1 @@ +-- Add down migration script here diff --git a/backend/migrations/20250526173025_http_trigger_seq_grants.up.sql b/backend/migrations/20250526173025_http_trigger_seq_grants.up.sql new file mode 100644 index 0000000000..bf09f0a555 --- /dev/null +++ b/backend/migrations/20250526173025_http_trigger_seq_grants.up.sql @@ -0,0 +1,3 @@ +-- Add up migration script here +GRANT ALL ON SEQUENCE http_trigger_version_seq TO windmill_user; +GRANT ALL ON SEQUENCE http_trigger_version_seq TO windmill_admin; \ No newline at end of file From e49cf749676b10f8462105dbcb6755c4f6df0739 Mon Sep 17 00:00:00 2001 From: centdix <40307056+centdix@users.noreply.github.com> Date: Mon, 26 May 2025 19:45:09 +0200 Subject: [PATCH 475/739] use ai instead of aider (#5814) --- .github/workflows/claude.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/claude.yml b/.github/workflows/claude.yml index 66eff9dc57..9bc9f8d7ea 100644 --- a/.github/workflows/claude.yml +++ b/.github/workflows/claude.yml @@ -13,10 +13,10 @@ on: jobs: check-membership: if: | - (github.event_name == 'issue_comment' && contains(github.event.comment.body, '/aider') && !contains(github.event.comment.user.login, '[bot]')) || - (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '/aider') && !contains(github.event.comment.user.login, '[bot]')) || - (github.event_name == 'pull_request_review' && contains(github.event.review.body, '/aider') && !contains(github.event.review.user.login, '[bot]')) || - (github.event_name == 'issues' && contains(github.event.issue.body, '/aider') && !contains(github.event.issue.user.login, '[bot]')) + (github.event_name == 'issue_comment' && contains(github.event.comment.body, '/ai') && !contains(github.event.comment.user.login, '[bot]')) || + (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '/ai') && !contains(github.event.comment.user.login, '[bot]')) || + (github.event_name == 'pull_request_review' && contains(github.event.review.body, '/ai') && !contains(github.event.review.user.login, '[bot]')) || + (github.event_name == 'issues' && contains(github.event.issue.body, '/ai') && !contains(github.event.issue.user.login, '[bot]')) runs-on: ubicloud-standard-2 outputs: is_member: ${{ steps.check-membership.outputs.is_member }} @@ -82,4 +82,4 @@ jobs: - Bash(npm run generate-backend-client): Generate the backend client. You need this to run npm run check. - Bash(cargo check): Run the cargo check script. You should run this tool after making changes to the backend code. - Bash(curl https://sh.rustup.rs -sSf | sh): Install Rust. You need this to run cargo check." - trigger_phrase: "/aider" + trigger_phrase: "/ai" From 5897e7e01b8839425c30c2a97481ef7bb9090661 Mon Sep 17 00:00:00 2001 From: Guilhem Date: Tue, 27 May 2025 01:09:55 +0200 Subject: [PATCH 476/739] Fix(frontend): auto completion and render of tailwind classes in app editor (#5817) * fix auto completion and render * Remove tailwind_full.css links and add tailwindUtils to package.json exports - Removed `` from AppEditor.svelte and AppPreview.svelte - Added `"./tailwindUtils"` export to package.json exports section for external consumption - Added tailwindUtils to typesVersions section for TypeScript support Co-authored-by: rubenfiszel --------- Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com> Co-authored-by: rubenfiszel --- frontend/package.json | 7 +++ .../src/lib/components/SimpleEditor.svelte | 49 ++++++++++++------- .../components/apps/editor/AppEditor.svelte | 1 - .../components/apps/editor/AppPreview.svelte | 1 - frontend/tailwind.config.cjs | 4 +- 5 files changed, 41 insertions(+), 21 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index 51c7820491..f302f5c873 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -371,6 +371,10 @@ "types": "./package/components/SimpleEditor.svelte.d.ts", "svelte": "./package/components/SimpleEditor.svelte", "default": "./package/components/SimpleEditor.svelte" + }, + "./tailwindUtils": { + "types": "./package/components/apps/editor/componentsPanel/tailwindUtils.d.ts", + "default": "./package/components/apps/editor/componentsPanel/tailwindUtils.js" } }, "files": [ @@ -506,6 +510,9 @@ ], "components/icons/store": [ "./package/components/icons/store.d.ts" + ], + "tailwindUtils": [ + "./package/components/apps/editor/componentsPanel/tailwindUtils.d.ts" ] } }, diff --git a/frontend/src/lib/components/SimpleEditor.svelte b/frontend/src/lib/components/SimpleEditor.svelte index 3cc814b855..984b05564a 100644 --- a/frontend/src/lib/components/SimpleEditor.svelte +++ b/frontend/src/lib/components/SimpleEditor.svelte @@ -467,33 +467,46 @@ } function addTailwindClassCompletions() { + // Define a custom word definition for Tailwind classes + languages.setMonarchTokensProvider('tailwindcss', { + tokenizer: { + root: [[/[a-zA-Z0-9-]+/, 'tailwind-class']] + } + }) + languages.registerCompletionItemProvider('tailwindcss', { + triggerCharacters: ['-'], provideCompletionItems: function (model, position, context, token) { - const word = model.getWordUntilPosition(position) + const wordUntilPosition = model.getWordUntilPosition(position) + const lineContent = model.getLineContent(position.lineNumber) + + // Get the text from the start of the line to the cursor + const textUntilPosition = lineContent.substring(0, position.column - 1) + // Find the last space before the cursor + const lastSpaceIndex = textUntilPosition.lastIndexOf(' ') + const startColumn = lastSpaceIndex === -1 ? 1 : lastSpaceIndex + 2 + const range = { startLineNumber: position.lineNumber, - startColumn: word.startColumn, + startColumn: startColumn, endLineNumber: position.lineNumber, - endColumn: word.endColumn + endColumn: position.column } - if (word && word.word) { - const currentWord = word.word + const currentWord = wordUntilPosition.word - const suggestions = tailwindClasses - .filter((className) => className.includes(currentWord)) - .map((className) => ({ - label: className, - kind: languages.CompletionItemKind.Class, - insertText: className, - documentation: 'Custom CSS class', - range: range - })) + const suggestions = tailwindClasses + .filter((className) => className.includes(currentWord)) + .map((className) => ({ + label: className, + kind: languages.CompletionItemKind.Class, + insertText: className, + documentation: 'Tailwind CSS class', + range: range, + preselect: true + })) - return { suggestions } - } - - return { suggestions: [] } + return { suggestions } } }) } diff --git a/frontend/src/lib/components/apps/editor/AppEditor.svelte b/frontend/src/lib/components/apps/editor/AppEditor.svelte index 3276befa58..fd328beb28 100644 --- a/frontend/src/lib/components/apps/editor/AppEditor.svelte +++ b/frontend/src/lib/components/apps/editor/AppEditor.svelte @@ -786,7 +786,6 @@ - diff --git a/frontend/src/lib/components/apps/editor/AppPreview.svelte b/frontend/src/lib/components/apps/editor/AppPreview.svelte index 2cc07c05bc..1438f0712c 100644 --- a/frontend/src/lib/components/apps/editor/AppPreview.svelte +++ b/frontend/src/lib/components/apps/editor/AppPreview.svelte @@ -243,7 +243,6 @@ - diff --git a/frontend/tailwind.config.cjs b/frontend/tailwind.config.cjs index f65a852949..908f2516df 100644 --- a/frontend/tailwind.config.cjs +++ b/frontend/tailwind.config.cjs @@ -1,4 +1,5 @@ const plugin = require('tailwindcss/plugin') +const { tailwindClasses } = require('./src/lib/components/apps/editor/componentsPanel/tailwindUtils') const lightTheme = { surface: '#ffffff', @@ -80,7 +81,8 @@ const config = { 'autocomplete-list-item', 'autocomplete-list-item-create', 'selected', - 'wm-tab-selected' + 'wm-tab-selected', + ...tailwindClasses ], theme: { colors: { From 5dcefeff849e4514f107855e25ed20abc4962964 Mon Sep 17 00:00:00 2001 From: Guilhem Date: Tue, 27 May 2025 01:17:32 +0200 Subject: [PATCH 477/739] Allways render content in the app menu to load runnables (#5815) --- .../src/lib/components/apps/components/display/AppMenu.svelte | 1 + frontend/src/lib/components/meltComponents/Menu.svelte | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/frontend/src/lib/components/apps/components/display/AppMenu.svelte b/frontend/src/lib/components/apps/components/display/AppMenu.svelte index 98c8dd5265..7fd1cb16ae 100644 --- a/frontend/src/lib/components/apps/components/display/AppMenu.svelte +++ b/frontend/src/lib/components/apps/components/display/AppMenu.svelte @@ -103,6 +103,7 @@ justifyEnd={false} class={resolvedConfig.fillContainer ? 'w-full h-full' : ''} usePointerDownOutside={true} + renderContent > diff --git a/frontend/src/lib/components/meltComponents/Menu.svelte b/frontend/src/lib/components/meltComponents/Menu.svelte index a53a2399ff..75ea762d26 100644 --- a/frontend/src/lib/components/meltComponents/Menu.svelte +++ b/frontend/src/lib/components/meltComponents/Menu.svelte @@ -17,6 +17,7 @@ export let usePointerDownOutside: boolean = false export let menuClass: string = '' export let open = false + export let renderContent: boolean = false // Use the passed createMenu function const menu = createMenu({ @@ -69,7 +70,7 @@ - {#if open} + {#if open || renderContent}
Date: Tue, 27 May 2025 15:52:57 +0200 Subject: [PATCH 478/739] feat: duckdb sql lang support (#5761) --- backend/.gitignore | 3 +- backend/Cargo.lock | 376 +++++++--- backend/Cargo.toml | 4 +- backend/ee-repo-ref.txt | 2 +- .../20250515084520_duckdb_support.down.sql | 1 + .../20250515084520_duckdb_support.up.sql | 3 + .../parsers/windmill-parser-sql/src/lib.rs | 74 ++ .../parsers/windmill-parser-wasm/src/lib.rs | 6 + backend/windmill-api/openapi.yaml | 3 +- backend/windmill-api/src/workspaces_export.rs | 1 + backend/windmill-common/src/client.rs | 46 +- backend/windmill-common/src/s3_helpers.rs | 17 + backend/windmill-common/src/schema.rs | 2 +- backend/windmill-common/src/scripts.rs | 5 +- backend/windmill-common/src/worker.rs | 1 + backend/windmill-worker/Cargo.toml | 2 + .../windmill-worker/src/duckdb_executor.rs | 664 ++++++++++++++++++ backend/windmill-worker/src/lib.rs | 2 + backend/windmill-worker/src/mysql_executor.rs | 14 +- backend/windmill-worker/src/pg_executor.rs | 16 +- .../windmill-worker/src/windmill-client.js | 2 + backend/windmill-worker/src/worker.rs | 28 + cli/bootstrap/script_bootstrap.ts | 3 +- cli/build.sh | 1 + cli/metadata.ts | 3 + cli/script.ts | 10 +- cli/script_common.ts | 7 +- cli/sync.ts | 1 + cli/wasm/regex/windmill_parser_wasm.js | 1 + frontend/package-lock.json | 8 +- frontend/package.json | 2 +- frontend/src/lib/components/Editor.svelte | 5 +- .../src/lib/components/HighlightCode.svelte | 8 +- .../common/languageIcons/LanguageIcon.svelte | 9 +- .../lib/components/icons/DuckDbIcon.svelte | 19 + frontend/src/lib/consts.ts | 50 ++ frontend/src/lib/infer.ts | 10 +- frontend/src/lib/inferArgSig.ts | 20 +- frontend/src/lib/script_helpers.ts | 18 + frontend/src/lib/scripts.ts | 7 +- .../(root)/(logged)/run/[...run]/+page.svelte | 2 +- 41 files changed, 1310 insertions(+), 146 deletions(-) create mode 100644 backend/migrations/20250515084520_duckdb_support.down.sql create mode 100644 backend/migrations/20250515084520_duckdb_support.up.sql create mode 100644 backend/windmill-worker/src/duckdb_executor.rs create mode 100644 frontend/src/lib/components/icons/DuckDbIcon.svelte diff --git a/backend/.gitignore b/backend/.gitignore index 4ca669fc53..f75b9d1eaa 100644 --- a/backend/.gitignore +++ b/backend/.gitignore @@ -5,4 +5,5 @@ oauth2.json tracing.folded heaptrack* index/ -windmill-api/openapi-*.* \ No newline at end of file +windmill-api/openapi-*.* +.duckdb/* \ No newline at end of file diff --git a/backend/Cargo.lock b/backend/Cargo.lock index eaf6ef8e37..8f6ca407af 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -286,25 +286,57 @@ dependencies = [ "serde", ] +[[package]] +name = "arrow" +version = "54.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5ec52ba94edeed950e4a41f75d35376df196e8cb04437f7280a5aa49f20f796" +dependencies = [ + "arrow-arith 54.3.1", + "arrow-array 54.3.1", + "arrow-buffer 54.3.1", + "arrow-cast 54.3.1", + "arrow-data 54.3.1", + "arrow-ord 54.3.1", + "arrow-row 54.3.1", + "arrow-schema 54.3.1", + "arrow-select 54.3.1", + "arrow-string 54.3.1", +] + [[package]] name = "arrow" version = "55.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1bb018b6960c87fd9d025009820406f74e83281185a8bdcb44880d2aa5c9a87" dependencies = [ - "arrow-arith", - "arrow-array", - "arrow-buffer", - "arrow-cast", + "arrow-arith 55.1.0", + "arrow-array 55.1.0", + "arrow-buffer 55.1.0", + "arrow-cast 55.1.0", "arrow-csv", - "arrow-data", + "arrow-data 55.1.0", "arrow-ipc", "arrow-json", - "arrow-ord", - "arrow-row", - "arrow-schema", - "arrow-select", - "arrow-string", + "arrow-ord 55.1.0", + "arrow-row 55.1.0", + "arrow-schema 55.1.0", + "arrow-select 55.1.0", + "arrow-string 55.1.0", +] + +[[package]] +name = "arrow-arith" +version = "54.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc766fdacaf804cb10c7c70580254fcdb5d55cdfda2bc57b02baf5223a3af9e" +dependencies = [ + "arrow-array 54.3.1", + "arrow-buffer 54.3.1", + "arrow-data 54.3.1", + "arrow-schema 54.3.1", + "chrono", + "num", ] [[package]] @@ -313,14 +345,30 @@ version = "55.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44de76b51473aa888ecd6ad93ceb262fb8d40d1f1154a4df2f069b3590aa7575" dependencies = [ - "arrow-array", - "arrow-buffer", - "arrow-data", - "arrow-schema", + "arrow-array 55.1.0", + "arrow-buffer 55.1.0", + "arrow-data 55.1.0", + "arrow-schema 55.1.0", "chrono", "num", ] +[[package]] +name = "arrow-array" +version = "54.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a12fcdb3f1d03f69d3ec26ac67645a8fe3f878d77b5ebb0b15d64a116c212985" +dependencies = [ + "ahash 0.8.12", + "arrow-buffer 54.3.1", + "arrow-data 54.3.1", + "arrow-schema 54.3.1", + "chrono", + "half", + "hashbrown 0.15.3", + "num", +] + [[package]] name = "arrow-array" version = "55.1.0" @@ -328,9 +376,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29ed77e22744475a9a53d00026cf8e166fe73cf42d89c4c4ae63607ee1cfcc3f" dependencies = [ "ahash 0.8.12", - "arrow-buffer", - "arrow-data", - "arrow-schema", + "arrow-buffer 55.1.0", + "arrow-data 55.1.0", + "arrow-schema 55.1.0", "chrono", "chrono-tz", "half", @@ -338,6 +386,17 @@ dependencies = [ "num", ] +[[package]] +name = "arrow-buffer" +version = "54.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "263f4801ff1839ef53ebd06f99a56cecd1dbaf314ec893d93168e2e860e0291c" +dependencies = [ + "bytes", + "half", + "num", +] + [[package]] name = "arrow-buffer" version = "55.1.0" @@ -349,17 +408,38 @@ dependencies = [ "num", ] +[[package]] +name = "arrow-cast" +version = "54.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ede6175fbc039dfc946a61c1b6d42fd682fcecf5ab5d148fbe7667705798cac9" +dependencies = [ + "arrow-array 54.3.1", + "arrow-buffer 54.3.1", + "arrow-data 54.3.1", + "arrow-schema 54.3.1", + "arrow-select 54.3.1", + "atoi", + "base64 0.22.1", + "chrono", + "comfy-table", + "half", + "lexical-core", + "num", + "ryu", +] + [[package]] name = "arrow-cast" version = "55.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f39e1d774ece9292697fcbe06b5584401b26bd34be1bec25c33edae65c2420ff" dependencies = [ - "arrow-array", - "arrow-buffer", - "arrow-data", - "arrow-schema", - "arrow-select", + "arrow-array 55.1.0", + "arrow-buffer 55.1.0", + "arrow-data 55.1.0", + "arrow-schema 55.1.0", + "arrow-select 55.1.0", "atoi", "base64 0.22.1", "chrono", @@ -376,9 +456,9 @@ version = "55.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9055c972a07bf12c2a827debfd34f88d3b93da1941d36e1d9fee85eebe38a12a" dependencies = [ - "arrow-array", - "arrow-cast", - "arrow-schema", + "arrow-array 55.1.0", + "arrow-cast 55.1.0", + "arrow-schema 55.1.0", "chrono", "csv", "csv-core", @@ -386,14 +466,26 @@ dependencies = [ "regex", ] +[[package]] +name = "arrow-data" +version = "54.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61cfdd7d99b4ff618f167e548b2411e5dd2c98c0ddebedd7df433d34c20a4429" +dependencies = [ + "arrow-buffer 54.3.1", + "arrow-schema 54.3.1", + "half", + "num", +] + [[package]] name = "arrow-data" version = "55.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf75ac27a08c7f48b88e5c923f267e980f27070147ab74615ad85b5c5f90473d" dependencies = [ - "arrow-buffer", - "arrow-schema", + "arrow-buffer 55.1.0", + "arrow-schema 55.1.0", "half", "num", ] @@ -404,10 +496,10 @@ version = "55.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a222f0d93772bd058d1268f4c28ea421a603d66f7979479048c429292fac7b2e" dependencies = [ - "arrow-array", - "arrow-buffer", - "arrow-data", - "arrow-schema", + "arrow-array 55.1.0", + "arrow-buffer 55.1.0", + "arrow-data 55.1.0", + "arrow-schema 55.1.0", "flatbuffers", "lz4_flex", ] @@ -418,11 +510,11 @@ version = "55.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9085342bbca0f75e8cb70513c0807cc7351f1fbf5cb98192a67d5e3044acb033" dependencies = [ - "arrow-array", - "arrow-buffer", - "arrow-cast", - "arrow-data", - "arrow-schema", + "arrow-array 55.1.0", + "arrow-buffer 55.1.0", + "arrow-cast 55.1.0", + "arrow-data 55.1.0", + "arrow-schema 55.1.0", "chrono", "half", "indexmap 2.9.0", @@ -434,17 +526,43 @@ dependencies = [ "simdutf8", ] +[[package]] +name = "arrow-ord" +version = "54.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0a3334a743bd2a1479dbc635540617a3923b4b2f6870f37357339e6b5363c21" +dependencies = [ + "arrow-array 54.3.1", + "arrow-buffer 54.3.1", + "arrow-data 54.3.1", + "arrow-schema 54.3.1", + "arrow-select 54.3.1", +] + [[package]] name = "arrow-ord" version = "55.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab2f1065a5cad7b9efa9e22ce5747ce826aa3855766755d4904535123ef431e7" dependencies = [ - "arrow-array", - "arrow-buffer", - "arrow-data", - "arrow-schema", - "arrow-select", + "arrow-array 55.1.0", + "arrow-buffer 55.1.0", + "arrow-data 55.1.0", + "arrow-schema 55.1.0", + "arrow-select 55.1.0", +] + +[[package]] +name = "arrow-row" +version = "54.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d1d7a7291d2c5107e92140f75257a99343956871f3d3ab33a7b41532f79cb68" +dependencies = [ + "arrow-array 54.3.1", + "arrow-buffer 54.3.1", + "arrow-data 54.3.1", + "arrow-schema 54.3.1", + "half", ] [[package]] @@ -453,19 +571,42 @@ version = "55.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3703a0e3e92d23c3f756df73d2dc9476873f873a76ae63ef9d3de17fda83b2d8" dependencies = [ - "arrow-array", - "arrow-buffer", - "arrow-data", - "arrow-schema", + "arrow-array 55.1.0", + "arrow-buffer 55.1.0", + "arrow-data 55.1.0", + "arrow-schema 55.1.0", "half", ] +[[package]] +name = "arrow-schema" +version = "54.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cfaf5e440be44db5413b75b72c2a87c1f8f0627117d110264048f2969b99e9" +dependencies = [ + "bitflags 2.9.1", +] + [[package]] name = "arrow-schema" version = "55.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73a47aa0c771b5381de2b7f16998d351a6f4eb839f1e13d48353e17e873d969b" +[[package]] +name = "arrow-select" +version = "54.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69efcd706420e52cd44f5c4358d279801993846d1c2a8e52111853d61d55a619" +dependencies = [ + "ahash 0.8.12", + "arrow-array 54.3.1", + "arrow-buffer 54.3.1", + "arrow-data 54.3.1", + "arrow-schema 54.3.1", + "num", +] + [[package]] name = "arrow-select" version = "55.1.0" @@ -473,24 +614,41 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24b7b85575702b23b85272b01bc1c25a01c9b9852305e5d0078c79ba25d995d4" dependencies = [ "ahash 0.8.12", - "arrow-array", - "arrow-buffer", - "arrow-data", - "arrow-schema", + "arrow-array 55.1.0", + "arrow-buffer 55.1.0", + "arrow-data 55.1.0", + "arrow-schema 55.1.0", "num", ] +[[package]] +name = "arrow-string" +version = "54.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a21546b337ab304a32cfc0770f671db7411787586b45b78b4593ae78e64e2b03" +dependencies = [ + "arrow-array 54.3.1", + "arrow-buffer 54.3.1", + "arrow-data 54.3.1", + "arrow-schema 54.3.1", + "arrow-select 54.3.1", + "memchr", + "num", + "regex", + "regex-syntax 0.8.5", +] + [[package]] name = "arrow-string" version = "55.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9260fddf1cdf2799ace2b4c2fc0356a9789fa7551e0953e35435536fecefebbd" dependencies = [ - "arrow-array", - "arrow-buffer", - "arrow-data", - "arrow-schema", - "arrow-select", + "arrow-array 55.1.0", + "arrow-buffer 55.1.0", + "arrow-data 55.1.0", + "arrow-schema 55.1.0", + "arrow-select 55.1.0", "memchr", "num", "regex", @@ -1838,6 +1996,12 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "cast" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" + [[package]] name = "cbc" version = "0.1.2" @@ -2599,9 +2763,9 @@ version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffe060b978f74ab446be722adb8a274e052e005bf6dfd171caadc3abaad10080" dependencies = [ - "arrow", + "arrow 55.1.0", "arrow-ipc", - "arrow-schema", + "arrow-schema 55.1.0", "async-trait", "bytes", "bzip2", @@ -2654,7 +2818,7 @@ version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61fe34f401bd03724a1f96d12108144f8cd495a3cdda2bf5e091822fb80b7e66" dependencies = [ - "arrow", + "arrow 55.1.0", "async-trait", "dashmap 6.1.0", "datafusion-common", @@ -2680,7 +2844,7 @@ version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4411b8e3bce5e0fc7521e44f201def2e2d5d1b5f176fb56e8cdc9942c890f00" dependencies = [ - "arrow", + "arrow 55.1.0", "async-trait", "datafusion-catalog", "datafusion-common", @@ -2704,7 +2868,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0734015d81c8375eb5d4869b7f7ecccc2ee8d6cb81948ef737cd0e7b743bd69c" dependencies = [ "ahash 0.8.12", - "arrow", + "arrow 55.1.0", "arrow-ipc", "base64 0.22.1", "half", @@ -2738,7 +2902,7 @@ version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04e602dcdf2f50c2abf297cc2203c73531e6f48b29516af7695d338cf2a778b1" dependencies = [ - "arrow", + "arrow 55.1.0", "async-compression", "async-trait", "bytes", @@ -2774,7 +2938,7 @@ version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3bb2253952dc32296ed5b84077cb2e0257fea4be6373e1c376426e17ead4ef6" dependencies = [ - "arrow", + "arrow 55.1.0", "async-trait", "bytes", "datafusion-catalog", @@ -2799,7 +2963,7 @@ version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b8c7f47a5d2fe03bfa521ec9bafdb8a5c82de8377f60967c3663f00c8790352" dependencies = [ - "arrow", + "arrow 55.1.0", "async-trait", "bytes", "datafusion-catalog", @@ -2824,7 +2988,7 @@ version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "27d15868ea39ed2dc266728b554f6304acd473de2142281ecfa1294bb7415923" dependencies = [ - "arrow", + "arrow 55.1.0", "async-trait", "bytes", "datafusion-catalog", @@ -2861,7 +3025,7 @@ version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06f004d100f49a3658c9da6fb0c3a9b760062d96cd4ad82ccc3b7b69a9fb2f84" dependencies = [ - "arrow", + "arrow 55.1.0", "dashmap 6.1.0", "datafusion-common", "datafusion-expr", @@ -2880,7 +3044,7 @@ version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a4e4ce3802609be38eeb607ee72f6fe86c3091460de9dbfae9e18db423b3964" dependencies = [ - "arrow", + "arrow 55.1.0", "chrono", "datafusion-common", "datafusion-doc", @@ -2901,7 +3065,7 @@ version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "422ac9cf3b22bbbae8cdf8ceb33039107fde1b5492693168f13bd566b1bcc839" dependencies = [ - "arrow", + "arrow 55.1.0", "datafusion-common", "indexmap 2.9.0", "itertools 0.14.0", @@ -2914,8 +3078,8 @@ version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2ddf0a0a2db5d2918349c978d42d80926c6aa2459cd8a3c533a84ec4bb63479e" dependencies = [ - "arrow", - "arrow-buffer", + "arrow 55.1.0", + "arrow-buffer 55.1.0", "base64 0.22.1", "blake2", "blake3", @@ -2944,7 +3108,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "408a05dafdc70d05a38a29005b8b15e21b0238734dab1e98483fcb58038c5aba" dependencies = [ "ahash 0.8.12", - "arrow", + "arrow 55.1.0", "datafusion-common", "datafusion-doc", "datafusion-execution", @@ -2965,7 +3129,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "756d21da2dd6c9bef97af1504970ff56cbf35d03fbd4ffd62827f02f4d2279d4" dependencies = [ "ahash 0.8.12", - "arrow", + "arrow 55.1.0", "datafusion-common", "datafusion-expr-common", "datafusion-physical-expr-common", @@ -2977,8 +3141,8 @@ version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d8d50f6334b378930d992d801a10ac5b3e93b846b39e4a05085742572844537" dependencies = [ - "arrow", - "arrow-ord", + "arrow 55.1.0", + "arrow-ord 55.1.0", "datafusion-common", "datafusion-doc", "datafusion-execution", @@ -2998,7 +3162,7 @@ version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc9a97220736c8fff1446e936be90d57216c06f28969f9ffd3b72ac93c958c8a" dependencies = [ - "arrow", + "arrow 55.1.0", "async-trait", "datafusion-catalog", "datafusion-common", @@ -3052,7 +3216,7 @@ version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "084d9f979c4b155346d3c34b18f4256e6904ded508e9554d90fed416415c3515" dependencies = [ - "arrow", + "arrow 55.1.0", "chrono", "datafusion-common", "datafusion-expr", @@ -3072,7 +3236,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64c536062b0076f4e30084065d805f389f9fe38af0ca75bcbac86bc5e9fbab65" dependencies = [ "ahash 0.8.12", - "arrow", + "arrow 55.1.0", "datafusion-common", "datafusion-expr", "datafusion-expr-common", @@ -3094,7 +3258,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8a92b53b3193fac1916a1c5b8e3f4347c526f6822e56b71faa5fb372327a863" dependencies = [ "ahash 0.8.12", - "arrow", + "arrow 55.1.0", "datafusion-common", "datafusion-expr-common", "hashbrown 0.14.5", @@ -3107,7 +3271,7 @@ version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6fa0a5ac94c7cf3da97bedabd69d6bbca12aef84b9b37e6e9e8c25286511b5e2" dependencies = [ - "arrow", + "arrow 55.1.0", "datafusion-common", "datafusion-execution", "datafusion-expr", @@ -3127,9 +3291,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "690c615db468c2e5fe5085b232d8b1c088299a6c63d87fd960a354a71f7acb55" dependencies = [ "ahash 0.8.12", - "arrow", - "arrow-ord", - "arrow-schema", + "arrow 55.1.0", + "arrow-ord 55.1.0", + "arrow-schema 55.1.0", "async-trait", "chrono", "datafusion-common", @@ -3156,7 +3320,7 @@ version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad229a134c7406c057ece00c8743c0c34b97f4e72f78b475fe17b66c5e14fa4f" dependencies = [ - "arrow", + "arrow 55.1.0", "async-trait", "dashmap 6.1.0", "datafusion-common", @@ -3180,7 +3344,7 @@ version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64f6ab28b72b664c21a27b22a2ff815fd390ed224c26e89a93b5a8154a4e8607" dependencies = [ - "arrow", + "arrow 55.1.0", "bigdecimal", "datafusion-common", "datafusion-expr", @@ -4640,6 +4804,25 @@ dependencies = [ "zeroize", ] +[[package]] +name = "duckdb" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49ac283b6621e3becf8014d1efa655522794075834c72f744573debef9c9f6c8" +dependencies = [ + "arrow 54.3.1", + "cast", + "fallible-iterator 0.3.0", + "fallible-streaming-iterator", + "hashlink 0.9.1", + "libduckdb-sys", + "memchr", + "num-integer", + "rust_decimal", + "smallvec", + "strum 0.25.0", +] + [[package]] name = "dunce" version = "1.0.5" @@ -7149,6 +7332,22 @@ version = "0.2.172" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" +[[package]] +name = "libduckdb-sys" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12cac9d03484c43fefac8b2066a253c9b0b3b0cd02cbe02a9ea2312f7e382618" +dependencies = [ + "autocfg", + "cc", + "flate2", + "pkg-config", + "serde", + "serde_json", + "tar", + "vcpkg", +] + [[package]] name = "libffi" version = "3.2.0" @@ -8950,13 +9149,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be7b2d778f6b841d37083ebdf32e33a524acde1266b5884a8ca29bf00dfa1231" dependencies = [ "ahash 0.8.12", - "arrow-array", - "arrow-buffer", - "arrow-cast", - "arrow-data", + "arrow-array 55.1.0", + "arrow-buffer 55.1.0", + "arrow-cast 55.1.0", + "arrow-data 55.1.0", "arrow-ipc", - "arrow-schema", - "arrow-select", + "arrow-schema 55.1.0", + "arrow-select 55.1.0", "base64 0.22.1", "brotli 8.0.1", "bytes", @@ -15056,6 +15255,7 @@ dependencies = [ "deno_web", "deno_webidl", "dotenv", + "duckdb", "dyn-iter", "flume", "futures", diff --git a/backend/Cargo.toml b/backend/Cargo.toml index 069aca4367..0273aa2c59 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -87,13 +87,14 @@ python = ["windmill-worker/python", "windmill-api/python"] rust = ["windmill-worker/rust"] mysql = ["windmill-worker/mysql"] oracledb = ["windmill-worker/oracledb"] +duckdb = ["windmill-worker/duckdb"] mssql = ["windmill-worker/mssql"] bigquery = ["windmill-worker/bigquery"] php = ["windmill-worker/php"] csharp = ["windmill-worker/csharp"] nu = ["windmill-worker/nu"] java = ["windmill-worker/java"] -all_languages = [ "python", "deno_core", "rust", "mysql", "oracledb", "mssql", "bigquery", "csharp", "nu", "php", "java"] +all_languages = [ "python", "deno_core", "rust", "mysql", "oracledb", "duckdb", "mssql", "bigquery", "csharp", "nu", "php", "java"] [patch.crates-io] @@ -238,6 +239,7 @@ json-pointer = "^0" itertools = "^0" regex = "^1" semver = "^1" +duckdb = { version = "1.2.2", features = ["bundled"] } v8 = "=130.0.7" # Exact version NOTE: Do not forget to update version and hash in flake.nix deno_fetch = "0.214.0" diff --git a/backend/ee-repo-ref.txt b/backend/ee-repo-ref.txt index 04b305d5a2..be1e897bcd 100644 --- a/backend/ee-repo-ref.txt +++ b/backend/ee-repo-ref.txt @@ -1 +1 @@ -6899b8151329218a1df59964dac57e0e004ae25a \ No newline at end of file +32039f675060b5996951708368bdefe14278d5cd \ No newline at end of file diff --git a/backend/migrations/20250515084520_duckdb_support.down.sql b/backend/migrations/20250515084520_duckdb_support.down.sql new file mode 100644 index 0000000000..d2f607c5b8 --- /dev/null +++ b/backend/migrations/20250515084520_duckdb_support.down.sql @@ -0,0 +1 @@ +-- Add down migration script here diff --git a/backend/migrations/20250515084520_duckdb_support.up.sql b/backend/migrations/20250515084520_duckdb_support.up.sql new file mode 100644 index 0000000000..869fcc07dc --- /dev/null +++ b/backend/migrations/20250515084520_duckdb_support.up.sql @@ -0,0 +1,3 @@ +-- Add up migration script here +ALTER TYPE SCRIPT_LANG ADD VALUE IF NOT EXISTS 'duckdb'; +UPDATE config set config = jsonb_set(config, '{worker_tags}', config->'worker_tags' || '["duckdb"]'::jsonb) where name = 'worker__default' and config @> '{"worker_tags": ["deno", "python3", "go", "bash", "powershell", "dependency", "flow", "hub", "other", "bun", "php", "rust", "ansible", "csharp", "nu", "java"]}'::jsonb AND NOT config->'worker_tags' @> '"duckdb"'::jsonb; diff --git a/backend/parsers/windmill-parser-sql/src/lib.rs b/backend/parsers/windmill-parser-sql/src/lib.rs index 21ebe45f7b..0fe72f0296 100644 --- a/backend/parsers/windmill-parser-sql/src/lib.rs +++ b/backend/parsers/windmill-parser-sql/src/lib.rs @@ -83,6 +83,21 @@ pub fn parse_bigquery_sig(code: &str) -> anyhow::Result { } } +pub fn parse_duckdb_sig(code: &str) -> anyhow::Result { + let parsed = parse_duckdb_file(&code)?; + if let Some(args) = parsed { + Ok(MainArgSignature { + star_args: false, + star_kwargs: false, + args, + no_main_func: None, + has_preprocessor: None, + }) + } else { + Err(anyhow!("Error parsing sql".to_string())) + } +} + pub fn parse_snowflake_sig(code: &str) -> anyhow::Result { let parsed = parse_snowflake_file(&code)?; if let Some(x) = parsed { @@ -212,6 +227,9 @@ lazy_static::lazy_static! { // -- @name (type) = default static ref RE_ARG_BIGQUERY: Regex = Regex::new(r#"(?m)^-- @(\w+) \((\w+(?:\[\])?)\)(?: ?\= ?(.+))? *(?:\r|\n|$)"#).unwrap(); + // -- $name (type) = default + static ref RE_ARG_DUCKDB: Regex = Regex::new(r#"(?m)^-- \$(\w+) \((\w+)\)(?: ?\= ?(.+))? *(?:\r|\n|$)"#).unwrap(); + static ref RE_ARG_SNOWFLAKE: Regex = Regex::new(r#"(?m)^-- \? (\w+) \((\w+)\)(?: ?\= ?(.+))? *(?:\r|\n|$)"#).unwrap(); @@ -577,6 +595,35 @@ fn parse_bigquery_file(code: &str) -> anyhow::Result>> { Ok(Some(args)) } +fn parse_duckdb_file(code: &str) -> anyhow::Result>> { + let mut args: Vec = vec![]; + + for cap in RE_ARG_DUCKDB.captures_iter(code) { + let name = cap.get(1).map(|x| x.as_str().to_string()).unwrap(); + let typ = cap + .get(2) + .map(|x| x.as_str().to_string().to_lowercase()) + .unwrap(); + let default = cap.get(3).map(|x| x.as_str().to_string()); + let has_default = default.is_some(); + let parsed_typ = parse_duckdb_typ(typ.as_str()); + + let parsed_default = default.and_then(|x| parsed_default(&parsed_typ, x)); + + args.push(Arg { + name, + typ: parsed_typ, + default: parsed_default, + otyp: Some(typ), + has_default, + oidx: None, + }); + } + + args.append(&mut parse_sql_sanitized_interpolation(code)); + Ok(Some(args)) +} + fn parse_snowflake_file(code: &str) -> anyhow::Result>> { let mut args: Vec = vec![]; @@ -729,6 +776,33 @@ pub fn parse_bigquery_typ(typ: &str) -> Typ { } } +pub fn parse_duckdb_typ(typ: &str) -> Typ { + if typ.ends_with("[]") { + let base_typ = parse_duckdb_typ(typ.strip_suffix("[]").unwrap()); + Typ::List(Box::new(base_typ)) + } else { + match typ { + "varchar" | "char" | "bpchar" | "text" | "string" => Typ::Str(None), + "blob" | "bytea" | "binary" | "varbinary" | "bitstring" => Typ::Bytes, + "boolean" | "bool" | "bit" | "logical" => Typ::Bool, + "bigint" | "int8" | "long" | "integer" | "int4" | "int" | "smallint" | "int2" + | "short" | "tinyint" | "int1" | "signed" | "ubigint" | "uhugeint" | "uinteger" + | "usmallint" | "utinyint" => Typ::Int, + "decimal" | "numeric" | "double" | "float8" | "float" | "float4" | "real" => Typ::Float, + "date" + | "time" + | "timestamp with time zone" + | "timestamptz" + | "timestamp" + | "datetime" => Typ::Datetime, + "uuid" | "json" => Typ::Str(None), + "interval" | "hugeint" => Typ::Str(None), + "s3object" => Typ::Resource("S3Object".to_string()), + _ => Typ::Str(None), + } + } +} + pub fn parse_snowflake_typ(typ: &str) -> Typ { match typ { "varchar" => Typ::Str(None), diff --git a/backend/parsers/windmill-parser-wasm/src/lib.rs b/backend/parsers/windmill-parser-wasm/src/lib.rs index cd280e7af5..4270c28c60 100644 --- a/backend/parsers/windmill-parser-wasm/src/lib.rs +++ b/backend/parsers/windmill-parser-wasm/src/lib.rs @@ -96,6 +96,12 @@ pub fn parse_oracledb(code: &str) -> String { wrap_sig(windmill_parser_sql::parse_oracledb_sig(code)) } +#[cfg(feature = "sql-parser")] +#[wasm_bindgen] +pub fn parse_duckdb(code: &str) -> String { + wrap_sig(windmill_parser_sql::parse_duckdb_sig(code)) +} + #[cfg(feature = "sql-parser")] #[wasm_bindgen] pub fn parse_bigquery(code: &str) -> String { diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index fd3e81f209..20f495568d 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -14242,7 +14242,8 @@ components: ansible, csharp, nu, - java + java, + duckdb # for related places search: ADD_NEW_LANG ] diff --git a/backend/windmill-api/src/workspaces_export.rs b/backend/windmill-api/src/workspaces_export.rs index c58d773f66..cd2be0f708 100644 --- a/backend/windmill-api/src/workspaces_export.rs +++ b/backend/windmill-api/src/workspaces_export.rs @@ -360,6 +360,7 @@ pub(crate) async fn tarball_workspace( ScriptLang::Bigquery => "bq.sql", ScriptLang::Snowflake => "sf.sql", ScriptLang::Mssql => "ms.sql", + ScriptLang::DuckDb => "duckdb.sql", ScriptLang::Graphql => "gql", ScriptLang::Nativets => "fetch.ts", ScriptLang::Bun | ScriptLang::Bunnative => { diff --git a/backend/windmill-common/src/client.rs b/backend/windmill-common/src/client.rs index 95d9f64bd2..0c5394c6e6 100644 --- a/backend/windmill-common/src/client.rs +++ b/backend/windmill-common/src/client.rs @@ -2,7 +2,11 @@ use anyhow::Context; use reqwest::{Body, Response}; use serde::de::DeserializeOwned; -use crate::utils::HTTP_CLIENT; +use crate::{ + error::{self, to_anyhow}, + s3_helpers::{DuckdbConnectionSettingsQueryV2, DuckdbConnectionSettingsResponse}, + utils::HTTP_CLIENT, +}; #[derive(Clone)] pub struct AuthedClient { @@ -197,4 +201,44 @@ impl AuthedClient { _ => Err(anyhow::anyhow!(response.text().await.unwrap_or_default()))?, } } + + pub async fn get_duckdb_connection_settings( + &self, + s3: &DuckdbConnectionSettingsQueryV2, + ) -> error::Result { + let url = format!( + "{}/api/w/{}/job_helpers/v2/duckdb_connection_settings", + self.base_internal_url, &self.workspace + ); + let response = self + .force_client + .as_ref() + .unwrap_or(&HTTP_CLIENT) + .post(url) + .header( + reqwest::header::CONTENT_TYPE, + reqwest::header::HeaderValue::from_static("application/json"), + ) + .header( + reqwest::header::ACCEPT, + reqwest::header::HeaderValue::from_static("application/json"), + ) + .header( + reqwest::header::AUTHORIZATION, + reqwest::header::HeaderValue::from_str(&format!("Bearer {}", self.token)) + .map_err(|e| error::Error::BadConfig(e.to_string()))?, + ) + .body(serde_json::to_string(&s3).map_err(to_anyhow)?) + .send() + .await + .context(format!("Sent get_duckdb_connection_settings request",)) + .map_err(error::Error::from)?; + match response.status().as_u16() { + 200u16 => Ok(response + .json::() + .await + .context("decoding duckdb_connection_settings response as json")?), + _ => Err(anyhow::anyhow!(response.text().await.unwrap_or_default()))?, + } + } } diff --git a/backend/windmill-common/src/s3_helpers.rs b/backend/windmill-common/src/s3_helpers.rs index 29f59cf07c..7e7c48851e 100644 --- a/backend/windmill-common/src/s3_helpers.rs +++ b/backend/windmill-common/src/s3_helpers.rs @@ -891,3 +891,20 @@ pub async fn convert_json_line_stream>( Ok(tokio_stream::wrappers::ReceiverStream::new(rx)) } + +#[derive(Deserialize, Serialize)] +pub struct DuckdbConnectionSettingsResponse { + pub connection_settings_str: String, + #[serde(skip_serializing_if = "Option::is_none")] + pub azure_container_path: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub s3_bucket: Option, +} + +#[derive(Deserialize, Serialize)] +pub struct DuckdbConnectionSettingsQueryV2 { + #[serde(skip_serializing_if = "Option::is_none")] + pub s3_resource_path: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub storage: Option, +} diff --git a/backend/windmill-common/src/schema.rs b/backend/windmill-common/src/schema.rs index 2b24ead0d3..71ecd220d1 100644 --- a/backend/windmill-common/src/schema.rs +++ b/backend/windmill-common/src/schema.rs @@ -349,7 +349,7 @@ pub fn should_validate_schema(code: &str, lang: &ScriptLang) -> bool { let comment = match lang { Nativets | Bun | Bunnative | Deno | Php | CSharp | Java => "//", Python3 | Go | Bash | Powershell | Graphql | Ansible | Nu => "#", - Postgresql | Mysql | Bigquery | Snowflake | Mssql | OracleDB => "--", + Postgresql | Mysql | Bigquery | Snowflake | Mssql | OracleDB | DuckDb => "--", Rust => "//!", // for related places search: ADD_NEW_LANG }; diff --git a/backend/windmill-common/src/scripts.rs b/backend/windmill-common/src/scripts.rs index e0391767f8..dda9daf0f4 100644 --- a/backend/windmill-common/src/scripts.rs +++ b/backend/windmill-common/src/scripts.rs @@ -46,13 +46,13 @@ pub enum ScriptLang { Graphql, Mssql, OracleDB, + DuckDb, Php, Rust, Ansible, CSharp, Nu, - Java, - // for related places search: ADD_NEW_LANG + Java, // for related places search: ADD_NEW_LANG } impl ScriptLang { @@ -73,6 +73,7 @@ impl ScriptLang { ScriptLang::Mssql => "mssql", ScriptLang::Graphql => "graphql", ScriptLang::OracleDB => "oracledb", + ScriptLang::DuckDb => "duckdb", ScriptLang::Php => "php", ScriptLang::Rust => "rust", ScriptLang::Ansible => "ansible", diff --git a/backend/windmill-common/src/worker.rs b/backend/windmill-common/src/worker.rs index aa1a715758..6b11fa086f 100644 --- a/backend/windmill-common/src/worker.rs +++ b/backend/windmill-common/src/worker.rs @@ -79,6 +79,7 @@ lazy_static::lazy_static! { "csharp".to_string(), "nu".to_string(), "java".to_string(), + "duckdb".to_string(), // for related places search: ADD_NEW_LANG "dependency".to_string(), "flow".to_string(), diff --git a/backend/windmill-worker/Cargo.toml b/backend/windmill-worker/Cargo.toml index 4dccc3213c..dbc8f2ab27 100644 --- a/backend/windmill-worker/Cargo.toml +++ b/backend/windmill-worker/Cargo.toml @@ -31,6 +31,7 @@ csharp = ["dep:windmill-parser-csharp"] rust = ["dep:windmill-parser-rust"] nu = ["dep:windmill-parser-nu"] java = ["dep:windmill-parser-java"] +duckdb = [] [dependencies] windmill-queue.workspace = true @@ -92,6 +93,7 @@ deno_permissions = { workspace = true, optional = true } deno_io = { workspace = true, optional = true } deno_error = { workspace = true, optional = true } async-stream.workspace = true +duckdb.workspace = true postgres-native-tls.workspace = true native-tls.workspace = true diff --git a/backend/windmill-worker/src/duckdb_executor.rs b/backend/windmill-worker/src/duckdb_executor.rs new file mode 100644 index 0000000000..8ee78292d3 --- /dev/null +++ b/backend/windmill-worker/src/duckdb_executor.rs @@ -0,0 +1,664 @@ +use std::collections::HashMap; +use std::env; + +use duckdb::types::TimeUnit; +use duckdb::{params_from_iter, Row}; +use rust_decimal::prelude::FromPrimitive; +use rust_decimal::Decimal; +use serde_json::value::RawValue; +use serde_json::{json, Value}; +use tokio::fs::remove_file; +use tokio::task; +use uuid::Uuid; +use windmill_common::error::{to_anyhow, Error, Result}; +use windmill_common::s3_helpers::{ + DuckdbConnectionSettingsQueryV2, DuckdbConnectionSettingsResponse, S3Object, +}; +use windmill_common::worker::{to_raw_value, Connection}; +use windmill_parser_sql::{parse_duckdb_sig, parse_sql_blocks}; +use windmill_queue::{CanceledBy, MiniPulledJob}; + +use crate::common::{build_args_values, OccupancyMetrics}; +use crate::handle_child::run_future_with_polling_update_job_poller; +#[cfg(feature = "mysql")] +use crate::mysql_executor::MysqlDatabase; +use crate::pg_executor::PgDatabase; +use crate::sanitized_sql_params::sanitize_and_interpolate_unsafe_sql_args; +use windmill_common::client::AuthedClient; + +fn do_duckdb_inner( + conn: &duckdb::Connection, + query: &str, + job_args: &HashMap, + skip_collect: bool, + column_order: &mut Option>, +) -> Result> { + let mut rows_vec = vec![]; + + let (query, job_args) = interpolate_named_args(query, &job_args); + + let mut stmt = conn + .prepare(&query) + .map_err(|e| Error::ExecutionErr(e.to_string()))?; + + let mut rows = stmt + .query(params_from_iter(job_args)) + .map_err(|e| Error::ExecutionErr(e.to_string()))?; + + if skip_collect { + return Ok(to_raw_value(&json!([]))); + } + + // Statement needs to be stepped at least once or stmt.column_names() will panic + let mut column_names = None; + loop { + let row = rows.next(); + match row { + Ok(Some(row)) => { + // Set column names if not already set + let stmt = row.as_ref(); + let column_names = match column_names.as_ref() { + Some(column_names) => column_names, + None => { + column_names = Some(stmt.column_names()); + column_names.as_ref().unwrap() + } + }; + + let row = row_to_value(row, &column_names.as_slice()) + .map_err(|e| Error::ExecutionErr(e.to_string()))?; + rows_vec.push(row); + } + Ok(None) => break, + Err(e) => { + return Err(Error::ExecutionErr(e.to_string())); + } + } + } + + if let (Some(column_order), Some(column_names)) = (column_order.as_mut(), column_names) { + *column_order = column_names.clone(); + } + + return Ok(to_raw_value(&rows_vec)); +} + +pub async fn do_duckdb( + job: &MiniPulledJob, + client: &AuthedClient, + query: &str, + conn: &Connection, + mem_peak: &mut i32, + canceled_by: &mut Option, + worker_name: &str, + column_order_ref: &mut Option>, + occupancy_metrics: &mut OccupancyMetrics, +) -> Result> { + let result_f = async { + let sig = parse_duckdb_sig(query)?.args; + let mut job_args = build_args_values(job, client, conn).await?; + + let (query, _) = &sanitize_and_interpolate_unsafe_sql_args(query, &sig, &job_args)?; + // Prevent interpolate_named_args from detecting argument identifiers in the signature for + // the first query block + let query = trunc_sig(query); + + let (_query_with_transformed_s3_uris, mut used_storages) = + transform_s3_uris(query, client).await?; + let query = _query_with_transformed_s3_uris.as_deref().unwrap_or(query); + + let job_args = { + let mut m: HashMap = HashMap::new(); + for sig_arg in sig.into_iter() { + let json_value = job_args + .remove(&sig_arg.name) + .or_else(|| sig_arg.default) + .unwrap_or_else(|| json!(null)); + + if matches!(&sig_arg.otyp.as_ref().map(String::as_str), Some("s3object")) { + let s3_obj = serde_json::from_value::(json_value).map_err(|e| { + Error::ExecutionErr(format!("Failed to deserialize S3Object: {}", e)) + })?; + let duckdb_conn_settings: windmill_common::s3_helpers::DuckdbConnectionSettingsResponse = client + .get_duckdb_connection_settings(&DuckdbConnectionSettingsQueryV2 { + s3_resource_path: None, + storage: s3_obj.storage.clone(), + }) + .await?; + + let uri = match ( + &duckdb_conn_settings.s3_bucket, + &duckdb_conn_settings.azure_container_path, + ) { + (Some(s3_bucket), None) => format!("s3://{}/{}", s3_bucket, &s3_obj.s3), + (None, Some(az_container)) => format!("{}/{}", az_container, &s3_obj.s3), + _ => { + return Err(Error::ExecutionErr( + "S3Object must have either s3_bucket or azure_container_path" + .to_string(), + )); + } + }; + m.insert(sig_arg.name, duckdb::types::Value::Text(uri)); + used_storages.insert(s3_obj.storage, duckdb_conn_settings); + } else { + let duckdb_value = json_value_to_duckdb_value( + &json_value, + sig_arg + .otyp + .clone() + .unwrap_or_else(|| "text".to_string()) + .as_str(), + client, + )?; + m.insert(sig_arg.name, duckdb_value); + } + } + m + }; + + let query_block_list = parse_sql_blocks(query); + + // Replace windmill resource ATTACH statements with the real instructions + let query_block_list = { + let mut v = vec![]; + for query_block in query_block_list.iter() { + match parse_attach_db_resource(query_block) { + Some(parsed) => v.extend( + transform_attach_db_resource_query(&parsed, &job.id, client).await?, + ), + None => v.push(query_block.to_string()), + }; + } + v + }; + + // duckdb::Connection is not Send so we do it in a single blocking task + let (result, column_order) = task::spawn_blocking(move || { + let conn = duckdb::Connection::open_in_memory() + .map_err(|e| Error::ConnectingToDatabase(e.to_string()))?; + + for (_, DuckdbConnectionSettingsResponse { connection_settings_str, .. }) in + used_storages.into_iter() + { + conn.execute_batch(&connection_settings_str) + .map_err(|e| Error::ExecutionErr(e.to_string()))?; + } + + let mut result: Option> = None; + let mut column_order = None; + for (query_block_index, query_block) in query_block_list.iter().enumerate() { + result = Some( + do_duckdb_inner( + &conn, + query_block.as_str(), + &job_args, + query_block_index != query_block_list.len() - 1, + &mut column_order, + ) + .map_err(|e| Error::ExecutionErr(e.to_string()))?, + ); + } + let result = result.unwrap_or_else(|| to_raw_value(&json!([]))); + Ok::<_, Error>((result, column_order)) + }) + .await + .map_err(to_anyhow)??; + + *column_order_ref = column_order; + + // BigQuery cleanup + let bq_credentials_path = make_bq_credentials_path(&job.id); + env::remove_var("GOOGLE_APPLICATION_CREDENTIALS"); + if matches!(tokio::fs::try_exists(&bq_credentials_path).await, Ok(true)) { + remove_file(&bq_credentials_path).await.map_err(to_anyhow)?; + } + Ok(result) + }; + + let result = run_future_with_polling_update_job_poller( + job.id, + job.timeout, + conn, + mem_peak, + canceled_by, + result_f, + worker_name, + &job.workspace_id, + &mut Some(occupancy_metrics), + Box::pin(futures::stream::once(async { 0 })), + ) + .await?; + + Ok(result) +} + +fn row_to_value(row: &Row<'_>, column_names: &[String]) -> Result> { + let mut obj = serde_json::Map::new(); + for (i, key) in column_names.iter().enumerate() { + let value: duckdb::types::Value = + row.get(i).map_err(|e| Error::ExecutionErr(e.to_string()))?; + let json_value = match value { + duckdb::types::Value::Null => serde_json::Value::Null, + duckdb::types::Value::Boolean(b) => serde_json::Value::Bool(b), + duckdb::types::Value::TinyInt(i) => serde_json::Value::Number(i.into()), + duckdb::types::Value::SmallInt(i) => serde_json::Value::Number(i.into()), + duckdb::types::Value::Int(i) => serde_json::Value::Number(i.into()), + duckdb::types::Value::BigInt(i) => serde_json::Value::Number(i.into()), + duckdb::types::Value::HugeInt(i) => serde_json::Value::String(i.to_string()), + duckdb::types::Value::UTinyInt(u) => serde_json::Value::Number(u.into()), + duckdb::types::Value::USmallInt(u) => serde_json::Value::Number(u.into()), + duckdb::types::Value::UInt(u) => serde_json::Value::Number(u.into()), + duckdb::types::Value::UBigInt(u) => serde_json::Value::Number(u.into()), + duckdb::types::Value::Float(f) => serde_json::Value::Number( + serde_json::Number::from_f64(f as f64) + .ok_or_else(|| Error::ExecutionErr("Could not convert to f64".to_string()))?, + ), + duckdb::types::Value::Double(f) => serde_json::Value::Number( + serde_json::Number::from_f64(f) + .ok_or_else(|| Error::ExecutionErr("Could not convert to f64".to_string()))?, + ), + duckdb::types::Value::Decimal(d) => serde_json::Value::String(d.to_string()), + duckdb::types::Value::Timestamp(_, ts) => serde_json::Value::String(ts.to_string()), + duckdb::types::Value::Text(s) => serde_json::Value::String(s), + duckdb::types::Value::Blob(b) => serde_json::Value::Array( + b.into_iter() + .map(|byte| serde_json::Value::Number(byte.into())) + .collect(), + ), + duckdb::types::Value::Date32(d) => serde_json::Value::Number(d.into()), + duckdb::types::Value::Time64(_, t) => serde_json::Value::String(t.to_string()), + duckdb::types::Value::Interval { months, days, nanos } => serde_json::json!({ + "months": months, + "days": days, + "nanos": nanos + }), + duckdb::types::Value::List(values) => serde_json::Value::Array( + values + .into_iter() + .map(|v| serde_json::Value::String(format!("{:?}", v))) + .collect(), + ), + duckdb::types::Value::Enum(e) => serde_json::Value::String(e), + duckdb::types::Value::Struct(fields) => serde_json::Value::Object( + fields + .iter() + .map(|(k, v)| (k.clone(), serde_json::Value::String(format!("{:?}", v)))) + .collect(), + ), + duckdb::types::Value::Array(values) => serde_json::Value::Array( + values + .into_iter() + .map(|v| serde_json::Value::String(format!("{:?}", v))) + .collect(), + ), + duckdb::types::Value::Map(map) => serde_json::Value::Object( + map.iter() + .map(|(k, v)| { + ( + format!("{:?}", k), + serde_json::Value::String(format!("{:?}", v)), + ) + }) + .collect(), + ), + duckdb::types::Value::Union(value) => { + serde_json::Value::String(format!("{:?}", *value)) + } + }; + obj.insert(key.clone(), json_value); + } + serde_json::value::to_raw_value(&obj).map_err(|e| e.into()) +} + +fn json_value_to_duckdb_value( + json_value: &serde_json::Value, + arg_type: &str, + client: &AuthedClient, +) -> Result { + let arg_type = arg_type.to_lowercase(); + let duckdb_value = match json_value { + serde_json::Value::Null => duckdb::types::Value::Null, + serde_json::Value::Bool(b) => duckdb::types::Value::Boolean(*b), + + serde_json::Value::String(s) + if matches!( + arg_type.as_str(), + "timestamp" | "timestamptz" | "timestamp with time zone" | "datetime" + ) => + { + string_to_duckdb_timestamp(&s)? + } + serde_json::Value::String(s) if arg_type.as_str() == "date" => string_to_duckdb_date(&s)?, + serde_json::Value::String(s) if arg_type.as_str() == "time" => string_to_duckdb_time(&s)?, + serde_json::Value::String(s) => duckdb::types::Value::Text(s.clone()), + + serde_json::Value::Number(n) if n.is_i64() => { + let v = n.as_i64().unwrap(); + match arg_type.as_str() { + "tinyint" | "int1" => duckdb::types::Value::TinyInt(v as i8), + "smallint" | "int2" | "short" => duckdb::types::Value::SmallInt(v as i16), + "integer" | "int4" | "int" | "signed" => duckdb::types::Value::Int(v as i32), + "bigint" | "int8" | "long" => duckdb::types::Value::BigInt(v), + "hugeint" => duckdb::types::Value::HugeInt(v as i128), + "float" | "float4" | "real" => duckdb::types::Value::Float(v as f32), + "double" | "float8" => duckdb::types::Value::Double(v as f64), + _ => duckdb::types::Value::BigInt(v), // default fallback + } + } + + serde_json::Value::Number(n) if n.is_u64() => { + let v = n.as_u64().unwrap(); + match arg_type.as_str() { + "utinyint" => duckdb::types::Value::UTinyInt(v as u8), + "usmallint" => duckdb::types::Value::USmallInt(v as u16), + "uinteger" => duckdb::types::Value::UInt(v as u32), + "ubigint" | "uhugeint" => duckdb::types::Value::UBigInt(v), + _ => duckdb::types::Value::UBigInt(v), // default fallback + } + } + + serde_json::Value::Number(n) if n.is_f64() => { + let v = n.as_f64().unwrap(); + match arg_type.as_str() { + "float" | "float4" | "real" => duckdb::types::Value::Float(v as f32), + "double" | "float8" => duckdb::types::Value::Double(v), + "decimal" | "numeric" => { + duckdb::types::Value::Decimal(Decimal::from_f64(v).ok_or_else(|| { + Error::ExecutionErr("Could not convert f64 to Decimal".to_string()) + })?) + } + _ => duckdb::types::Value::Double(v), // default fallback + } + } + + serde_json::Value::Array(arr) => duckdb::types::Value::Array( + arr.iter() + .map(|val| json_value_to_duckdb_value(val, arg_type.as_str(), client)) + .collect::>>()?, + ), + serde_json::Value::Object(map) => duckdb::types::Value::Struct( + map.iter() + .map(|(k, v)| { + Ok::<_, Error>(( + k.clone(), + json_value_to_duckdb_value(v, arg_type.as_str(), client)?, + )) + }) + .collect::>>()? + .into(), + ), + + value @ _ => { + return Err(Error::ExecutionErr(format!( + "Unsupported type in query: {:?} and signature {arg_type:?}", + value + ))) + } + }; + Ok(duckdb_value) +} + +fn string_to_duckdb_timestamp(s: &str) -> Result { + let ts = chrono::DateTime::parse_from_rfc3339(s) + .map_err(|e: chrono::ParseError| Error::ExecutionErr(e.to_string()))?; + Ok(duckdb::types::Value::Timestamp( + TimeUnit::Millisecond, + ts.timestamp_millis(), + )) +} + +fn string_to_duckdb_date(s: &str) -> Result { + use chrono::Datelike; + let date = chrono::NaiveDate::parse_from_str(s, "%Y-%m-%d").unwrap(); + Ok(duckdb::types::Value::Date32(date.num_days_from_ce())) +} + +fn string_to_duckdb_time(s: &str) -> Result { + use chrono::Timelike; + let time = chrono::NaiveTime::parse_from_str(s, "%H:%M:%S").unwrap(); + Ok(duckdb::types::Value::Time64( + TimeUnit::Microsecond, + time.num_seconds_from_midnight() as i64, + )) +} + +struct ParsedAttachDbResource<'a> { + resource_path: &'a str, + name: &'a str, + db_type: &'a str, + extra_args: Option<&'a str>, +} +fn parse_attach_db_resource<'a>(query: &'a str) -> Option> { + lazy_static::lazy_static! { + static ref RE: regex::Regex = regex::Regex::new(r"ATTACH '\$res:([^']+)' AS (\S+) \(TYPE (\w+)(.*)\)").unwrap(); + } + + for cap in RE.captures_iter(query) { + if let (Some(resource_path), Some(name), Some(db_type)) = + (cap.get(1), cap.get(2), cap.get(3)) + { + let extra_args = cap.get(4).map(|m| query[m.start()..m.end()].trim()); + return Some(ParsedAttachDbResource { + resource_path: query[resource_path.start()..resource_path.end()].trim(), + name: query[name.start()..name.end()].trim(), + db_type: query[db_type.start()..db_type.end()].trim(), + extra_args, + }); + } + } + None +} + +async fn transform_attach_db_resource_query( + parsed: &ParsedAttachDbResource<'_>, + job_id: &Uuid, + client: &AuthedClient, +) -> Result> { + match parsed.db_type.to_lowercase().as_str() { + "postgres" => { + let resource: PgDatabase = client + .get_resource_value_interpolated(parsed.resource_path, Some(job_id.to_string())) + .await?; + + let attach_str = format!( + "ATTACH 'dbname={} {} host={} {} {}' AS {} (TYPE postgres{});", + resource.dbname, + resource + .user + .map(|u| format!("user={}", u)) + .unwrap_or_default(), + resource.host, + resource + .password + .map(|p| format!("password={}", p)) + .unwrap_or_default(), + resource + .port + .map(|p| format!("port={}", p)) + .unwrap_or_default(), + parsed.name, + parsed.extra_args.unwrap_or("") + ); + + Ok(vec![ + "INSTALL postgres;".to_string(), + "LOAD postgres;".to_string(), + attach_str, + ]) + } + "mysql" => { + #[cfg(not(feature = "mysql"))] + return Err(Error::ExecutionErr( + "MySQL feature is not enabled".to_string(), + )); + + #[cfg(feature = "mysql")] + { + let resource: MysqlDatabase = client + .get_resource_value_interpolated(parsed.resource_path, Some(job_id.to_string())) + .await?; + + let attach_str = format!( + "ATTACH 'database={} host={} ssl_mode={} {} {} {}' AS {} (TYPE mysql{});", + resource.database, + resource.host, + resource + .ssl + .map(|ssl| if ssl { "required" } else { "disabled" }) + .unwrap_or("preferred"), + resource + .password + .map(|p| format!("password={}", p)) + .unwrap_or_default(), + resource + .port + .map(|p| format!("port={}", p)) + .unwrap_or_default(), + resource + .user + .map(|u| format!("user={}", u)) + .unwrap_or_default(), + parsed.name, + parsed.extra_args.unwrap_or("") + ); + + Ok(vec![ + "INSTALL mysql;".to_string(), + "LOAD mysql;".to_string(), + attach_str, + ]) + } + } + "bigquery" => { + let resource: Value = client + .get_resource_value_interpolated(parsed.resource_path, Some(job_id.to_string())) + .await?; + // duckdb's bigquery extension requires a json file as credentials + let bq_credentials_path = make_bq_credentials_path(job_id); + env::set_var("GOOGLE_APPLICATION_CREDENTIALS", &bq_credentials_path); + tokio::fs::write(&bq_credentials_path, resource.to_string()) + .await + .map_err(|e| { + Error::ExecutionErr(format!( + "Failed to write BigQuery credentials to {}: {}", + &bq_credentials_path, e + )) + })?; + let project_id: String = serde_json::from_value( + resource + .get("project_id") + .ok_or_else(|| { + Error::ExecutionErr("BigQuery resource must contain project_id".to_string()) + })? + .to_owned(), + ) + .map_err(|_e| Error::ExecutionErr("failed project_id deserialize".to_string()))?; + let attach_str = format!( + "ATTACH 'project={}' as {} (TYPE bigquery{});", + project_id, + parsed.name, + parsed.extra_args.unwrap_or("") + ) + .to_string(); + Ok(vec![ + "INSTALL bigquery FROM community;".to_string(), + "LOAD bigquery;".to_string(), + attach_str, + ]) + } + _ => Err(Error::ExecutionErr(format!( + "Unsupported db type in DuckDB ATTACH: {}", + parsed.db_type + ))), + } +} + +// Returns the transformed query and the set of storages used +async fn transform_s3_uris( + query: &str, + client: &AuthedClient, +) -> Result<( + Option, + HashMap, DuckdbConnectionSettingsResponse>, +)> { + let mut transformed_query = None; + lazy_static::lazy_static! { + static ref RE: regex::Regex = regex::Regex::new(r"'s3://([^'/]*)/([^']+)'").unwrap(); + } + let mut used_storages = HashMap::new(); + for cap in RE.captures_iter(query) { + if let (storage, Some(s3_path)) = (cap.get(1), cap.get(2)) { + let s3_path = s3_path.as_str(); + let storage = match storage.map(|m| m.as_str()) { + Some("") | None => None, + Some(s) => Some(s.to_string()), + }; + let original_str_lit = + format!("'s3://{}/{}'", storage.as_deref().unwrap_or(""), s3_path); + let duckdb_conn_settings = client + .get_duckdb_connection_settings(&DuckdbConnectionSettingsQueryV2 { + s3_resource_path: None, + storage: storage.clone(), + }) + .await?; + let url = match &duckdb_conn_settings { + DuckdbConnectionSettingsResponse { s3_bucket: Some(bucket), .. } => { + format!("'s3://{bucket}/{s3_path}'") + } + DuckdbConnectionSettingsResponse { azure_container_path: Some(base), .. } => { + format!("'{base}/{s3_path}'") + } + _ => { + return Err(Error::ExecutionErr( + "DuckDB connection settings response must have either s3_bucket or azure_container_path".to_string(), + ))?; + } + }; + transformed_query = Some( + transformed_query + .unwrap_or(query.to_string()) + .replace(&original_str_lit, &url), + ); + used_storages.insert(storage, duckdb_conn_settings); + } + } + Ok((transformed_query, used_storages)) +} + +// BigQuery extension requires a json file as credentials +// The file path is set as an env var by do_duckdb +// It is created by transform_attach_db_resource_query (when bigquery is detected) +// and deleted by do_duckdb after the query is executed +fn make_bq_credentials_path(job_id: &Uuid) -> String { + format!("/tmp/service-account-credentials-{}.json", job_id) +} + +// duckdb-rs does not support named parameters, +// and it raises an error when passing unused arguments. We cannot prepare batch statements +// but only single SQL statements so it doesn't work when all arguments are not used by +// every single statement. +fn interpolate_named_args<'a>( + query: &str, + args: &'a HashMap, +) -> (String, Vec<&'a duckdb::types::Value>) { + let mut query = query.to_string(); + + let mut values = vec![]; + for (arg_name, arg_value) in args { + let pat = format!("${}", arg_name); + if !query.contains(&pat) { + continue; + } + values.push(arg_value); + query = query.replace(&pat, &format!("${}", values.len())); + } + (query, values) +} + +fn trunc_sig(query: &str) -> &str { + let idx = query.rfind("-- $").unwrap_or(query.len()); + // find next \n starting from idx and return everything after it + let idx = query[idx..].find('\n').map(|i| i + idx).unwrap_or(0); + &query[idx..] +} diff --git a/backend/windmill-worker/src/lib.rs b/backend/windmill-worker/src/lib.rs index 4ea56c090e..fa6eb10960 100644 --- a/backend/windmill-worker/src/lib.rs +++ b/backend/windmill-worker/src/lib.rs @@ -20,6 +20,8 @@ mod csharp_executor; #[cfg(feature = "enterprise")] mod dedicated_worker; mod deno_executor; +#[cfg(feature = "duckdb")] +mod duckdb_executor; mod global_cache; mod go_executor; mod graphql_executor; diff --git a/backend/windmill-worker/src/mysql_executor.rs b/backend/windmill-worker/src/mysql_executor.rs index ffd84db175..04403e4e08 100644 --- a/backend/windmill-worker/src/mysql_executor.rs +++ b/backend/windmill-worker/src/mysql_executor.rs @@ -32,13 +32,13 @@ use crate::{ }; #[derive(Deserialize)] -struct MysqlDatabase { - host: String, - user: Option, - password: Option, - port: Option, - database: String, - ssl: Option, +pub struct MysqlDatabase { + pub host: String, + pub user: Option, + pub password: Option, + pub port: Option, + pub database: String, + pub ssl: Option, } fn do_mysql_inner<'a>( diff --git a/backend/windmill-worker/src/pg_executor.rs b/backend/windmill-worker/src/pg_executor.rs index 67c2d945aa..2c7fe123dc 100644 --- a/backend/windmill-worker/src/pg_executor.rs +++ b/backend/windmill-worker/src/pg_executor.rs @@ -47,14 +47,14 @@ use lazy_static::lazy_static; use urlencoding::encode; use windmill_common::client::AuthedClient; #[derive(Deserialize)] -struct PgDatabase { - host: String, - user: Option, - password: Option, - port: Option, - sslmode: Option, - dbname: String, - root_certificate_pem: Option, +pub struct PgDatabase { + pub host: String, + pub user: Option, + pub password: Option, + pub port: Option, + pub sslmode: Option, + pub dbname: String, + pub root_certificate_pem: Option, } lazy_static! { diff --git a/backend/windmill-worker/src/windmill-client.js b/backend/windmill-worker/src/windmill-client.js index 3ae15e7453..1ecf28e664 100644 --- a/backend/windmill-worker/src/windmill-client.js +++ b/backend/windmill-worker/src/windmill-client.js @@ -2998,6 +2998,8 @@ var $RawScript = { "mssql", "graphql", "nativets", + "duckdb", + // for related places search: ADD_NEW_LANG ], }, path: { diff --git a/backend/windmill-worker/src/worker.rs b/backend/windmill-worker/src/worker.rs index 221650389a..e15c24ef70 100644 --- a/backend/windmill-worker/src/worker.rs +++ b/backend/windmill-worker/src/worker.rs @@ -145,6 +145,9 @@ use crate::ansible_executor::handle_ansible_job; #[cfg(feature = "mysql")] use crate::mysql_executor::do_mysql; +#[cfg(feature = "duckdb")] +use crate::duckdb_executor::do_duckdb; + #[cfg(feature = "oracledb")] use crate::oracledb_executor::do_oracledb; @@ -2614,6 +2617,30 @@ async fn handle_code_execution_job( ) .await; } + } else if language == Some(ScriptLang::DuckDb) { + #[allow(unreachable_code)] + #[cfg(not(feature = "duckdb"))] + { + return Err(Error::internal_err( + "Duck DB requires the duckdb feature to be enabled".to_string(), + )); + } + + #[cfg(feature = "duckdb")] + { + return do_duckdb( + job, + &client, + &code, + conn, + mem_peak, + canceled_by, + worker_name, + column_order, + occupancy_metrics, + ) + .await; + } } else if language == Some(ScriptLang::Graphql) { return do_graphql( job, @@ -3021,6 +3048,7 @@ fn parse_sig_of_lang( ScriptLang::Snowflake => Some(windmill_parser_sql::parse_snowflake_sig(code)?), ScriptLang::Graphql => None, ScriptLang::Mssql => Some(windmill_parser_sql::parse_mssql_sig(code)?), + ScriptLang::DuckDb => Some(windmill_parser_sql::parse_duckdb_sig(code)?), ScriptLang::OracleDB => Some(windmill_parser_sql::parse_oracledb_sig(code)?), #[cfg(feature = "php")] ScriptLang::Php => Some(windmill_parser_php::parse_php_signature( diff --git a/cli/bootstrap/script_bootstrap.ts b/cli/bootstrap/script_bootstrap.ts index 2ac67bdb83..e9e8a12db5 100644 --- a/cli/bootstrap/script_bootstrap.ts +++ b/cli/bootstrap/script_bootstrap.ts @@ -76,6 +76,7 @@ func main() (interface{}, error) { bash: `echo "Hello world" `, + duckdb: `SELECT 'Hello world' AS message`, oracledb: `SELECT 'Hello world' AS message`, powershell: `Write-Output "Hello world"`, @@ -126,5 +127,5 @@ public class Main { } } `, -// for related places search: ADD_NEW_LANG + // for related places search: ADD_NEW_LANG }; diff --git a/cli/build.sh b/cli/build.sh index bf00b99a57..e228750b51 100755 --- a/cli/build.sh +++ b/cli/build.sh @@ -1,3 +1,4 @@ #!/bin/bash +# Note for mac OS users: you need to install gnu-sed with `brew install gnu-sed` and use `gsed` instead of `sed`. ./gen_wm_client.sh deno run -A dnt.ts diff --git a/cli/metadata.ts b/cli/metadata.ts index 3a83143182..ee39d0b9da 100644 --- a/cli/metadata.ts +++ b/cli/metadata.ts @@ -528,6 +528,9 @@ export async function inferSchema( { name: "database", typ: { resource: "postgresql" } }, ...inferedSchema.args, ]; + } else if (language === "duckdb") { + const { parse_sql } = await import("./wasm/regex/windmill_parser_wasm.js"); + inferedSchema = JSON.parse(parse_sql(content)); } else if (language === "graphql") { const { parse_graphql } = await import( "./wasm/regex/windmill_parser_wasm.js" diff --git a/cli/script.ts b/cli/script.ts index 3896d19c5c..e12c15d9ba 100644 --- a/cli/script.ts +++ b/cli/script.ts @@ -547,6 +547,8 @@ export function filePathExtensionFromContentType( return ".my.sql"; } else if (language === "bigquery") { return ".bq.sql"; + } else if (language === "duckdb") { + return ".duckdb.sql"; } else if (language === "oracledb") { return ".odb.sql"; } else if (language === "snowflake") { @@ -573,7 +575,7 @@ export function filePathExtensionFromContentType( return ".nu"; } else if (language === "java") { return ".java"; - // for related places search: ADD_NEW_LANG + // for related places search: ADD_NEW_LANG } else { throw new Error("Invalid language: " + language); } @@ -593,6 +595,7 @@ export const exts = [ ".odb.sql", ".sf.sql", ".ms.sql", + ".duckdb.sql", ".sql", ".gql", ".ps1", @@ -601,9 +604,8 @@ export const exts = [ ".cs", ".nu", ".playbook.yml", - ".java" - // for related places search: ADD_NEW_LANG - + ".java", + // for related places search: ADD_NEW_LANG ]; export function removeExtensionToPath(path: string): string { diff --git a/cli/script_common.ts b/cli/script_common.ts index a41d7dee8c..39906e7bb9 100644 --- a/cli/script_common.ts +++ b/cli/script_common.ts @@ -9,6 +9,7 @@ export type ScriptLanguage = | "postgresql" | "mysql" | "bigquery" + | "duckdb" | "oracledb" | "snowflake" | "mssql" @@ -19,7 +20,7 @@ export type ScriptLanguage = | "nu" | "ansible" | "java"; - // for related places search: ADD_NEW_LANG +// for related places search: ADD_NEW_LANG export function inferContentTypeFromFilePath( contentPath: string, @@ -43,6 +44,8 @@ export function inferContentTypeFromFilePath( return "bigquery"; } else if (contentPath.endsWith(".odb.sql")) { return "oracledb"; + } else if (contentPath.endsWith(".duckdb.sql")) { + return "duckdb"; } else if (contentPath.endsWith(".sf.sql")) { return "snowflake"; } else if (contentPath.endsWith(".ms.sql")) { @@ -67,7 +70,7 @@ export function inferContentTypeFromFilePath( return "nu"; } else if (contentPath.endsWith(".java")) { return "java"; - // for related places search: ADD_NEW_LANG + // for related places search: ADD_NEW_LANG } else { throw new Error( "Invalid language: " + contentPath.substring(contentPath.lastIndexOf(".")) diff --git a/cli/sync.ts b/cli/sync.ts index 867b8c4d17..456afcadf9 100644 --- a/cli/sync.ts +++ b/cli/sync.ts @@ -344,6 +344,7 @@ export function newPathAssigner(defaultTs: "bun" | "deno"): PathAssigner { else if (language == "nu") ext = "nu"; else if (language == "ansible") ext = "playbook.yml"; else if (language == "java") ext = "java"; + else if (language == "duckdb") ext = "duckdb.sql"; // for related places search: ADD_NEW_LANG else ext = "no_ext"; diff --git a/cli/wasm/regex/windmill_parser_wasm.js b/cli/wasm/regex/windmill_parser_wasm.js index 5418fad879..7867ab4a35 100644 --- a/cli/wasm/regex/windmill_parser_wasm.js +++ b/cli/wasm/regex/windmill_parser_wasm.js @@ -1,5 +1,6 @@ + let WASM_VECTOR_LEN = 0; let cachedUint8ArrayMemory0 = null; diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 899306ebf0..8f93204d54 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -74,7 +74,7 @@ "windmill-parser-wasm-nu": "^1.474.1", "windmill-parser-wasm-php": "^1.429.0", "windmill-parser-wasm-py": "^1.477.1", - "windmill-parser-wasm-regex": "^1.481.0", + "windmill-parser-wasm-regex": "^1.492.1", "windmill-parser-wasm-rust": "^1.429.0", "windmill-parser-wasm-ts": "^1.486.1", "windmill-parser-wasm-yaml": "^1.429.0", @@ -12837,9 +12837,9 @@ "integrity": "sha512-EY3mSMWpqFPzd7fsLg2/hSfQFU8HpW9nplFwm4JHHCDbcTpBzlvzjPJoHAAGO5kMzowAxjqi5ai/mXjeUWuiSg==" }, "node_modules/windmill-parser-wasm-regex": { - "version": "1.481.0", - "resolved": "https://registry.npmjs.org/windmill-parser-wasm-regex/-/windmill-parser-wasm-regex-1.481.0.tgz", - "integrity": "sha512-QY9NOaF0M55SBEbbcAkHoXppjdS2gb2NlwqhlZ1ciYWTtIrbZoL5K8xoG4FbB5vWRHxInG1aRdA2tb+JP180yA==" + "version": "1.492.1", + "resolved": "https://registry.npmjs.org/windmill-parser-wasm-regex/-/windmill-parser-wasm-regex-1.492.1.tgz", + "integrity": "sha512-CBdjz3x00z2xA4BRZv8/hsuHcpZgL28UKTjYVSj5O9XMYlY9g0LNsEQ5TTl/oVyFBs62/CPyvWwGvW4oSAObzg==" }, "node_modules/windmill-parser-wasm-rust": { "version": "1.429.0", diff --git a/frontend/package.json b/frontend/package.json index f302f5c873..9d3bbe19cc 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -143,7 +143,7 @@ "windmill-parser-wasm-nu": "^1.474.1", "windmill-parser-wasm-php": "^1.429.0", "windmill-parser-wasm-py": "^1.477.1", - "windmill-parser-wasm-regex": "^1.481.0", + "windmill-parser-wasm-regex": "^1.492.1", "windmill-parser-wasm-rust": "^1.429.0", "windmill-parser-wasm-ts": "^1.486.1", "windmill-parser-wasm-yaml": "^1.429.0", diff --git a/frontend/src/lib/components/Editor.svelte b/frontend/src/lib/components/Editor.svelte index 35c4576251..02b7f4170b 100644 --- a/frontend/src/lib/components/Editor.svelte +++ b/frontend/src/lib/components/Editor.svelte @@ -133,6 +133,7 @@ import EditorTheme from './EditorTheme.svelte' import { BIGQUERY_TYPES, + DUCKDB_TYPES, MSSQL_TYPES, MYSQL_TYPES, ORACLEDB_TYPES, @@ -482,7 +483,9 @@ ? MSSQL_TYPES : scriptLang === 'oracledb' ? ORACLEDB_TYPES - : [] + : scriptLang === 'duckdb' + ? DUCKDB_TYPES + : [] ).map((t) => ({ label: t, kind: languages.CompletionItemKind.Function, diff --git a/frontend/src/lib/components/HighlightCode.svelte b/frontend/src/lib/components/HighlightCode.svelte index ac4357e5ca..bf196c7868 100644 --- a/frontend/src/lib/components/HighlightCode.svelte +++ b/frontend/src/lib/components/HighlightCode.svelte @@ -55,6 +55,8 @@ return sql case 'oracledb': return sql + case 'duckdb': + return sql case 'powershell': return powershell case 'php': @@ -66,10 +68,10 @@ case 'nu': return python case 'ansible': - return yaml; + return yaml case 'java': - return java; - // for related places search: ADD_NEW_LANG + return java + // for related places search: ADD_NEW_LANG default: return typescript } diff --git a/frontend/src/lib/components/common/languageIcons/LanguageIcon.svelte b/frontend/src/lib/components/common/languageIcons/LanguageIcon.svelte index 9dd3c9860a..6a3de43bf9 100644 --- a/frontend/src/lib/components/common/languageIcons/LanguageIcon.svelte +++ b/frontend/src/lib/components/common/languageIcons/LanguageIcon.svelte @@ -22,6 +22,7 @@ import CSharpIcon from '$lib/components/icons/CSharpIcon.svelte' import NuIcon from '$lib/components/icons/NuIcon.svelte' import JavaIcon from '$lib/components/icons/JavaIcon.svelte' + import DuckDbIcon from '$lib/components/icons/DuckDbIcon.svelte' export let lang: | SupportedLanguage @@ -49,6 +50,7 @@ postgresql: 'Postgresql', bigquery: 'BigQuery', oracledb: 'Oracle Database', + duckdb: 'DuckDB', snowflake: 'Snowflake', mysql: 'MySQL', mssql: 'MS SQL Server', @@ -59,7 +61,7 @@ csharp: 'C#', nu: 'Nu', java: 'Java' - // for related places search: ADD_NEW_LANG + // for related places search: ADD_NEW_LANG } const langToComponent: Record< @@ -91,8 +93,9 @@ ansible: AnsibleIcon, csharp: CSharpIcon, nu: NuIcon, - java: JavaIcon - // for related places search: ADD_NEW_LANG + java: JavaIcon, + duckdb: DuckDbIcon + // for related places search: ADD_NEW_LANG } let subIconScale = width === 30 ? 0.6 : 0.8 diff --git a/frontend/src/lib/components/icons/DuckDbIcon.svelte b/frontend/src/lib/components/icons/DuckDbIcon.svelte new file mode 100644 index 0000000000..7229a377a6 --- /dev/null +++ b/frontend/src/lib/components/icons/DuckDbIcon.svelte @@ -0,0 +1,19 @@ + + + + + + + diff --git a/frontend/src/lib/consts.ts b/frontend/src/lib/consts.ts index d319868795..847bbf42da 100644 --- a/frontend/src/lib/consts.ts +++ b/frontend/src/lib/consts.ts @@ -203,6 +203,56 @@ export const MSSQL_TYPES = [ 'decimal', 'bit' ] +export const DUCKDB_TYPES = [ + 'BIGINT', + 'INT8', + 'LONG', + 'BIT', + 'BITSTRING', + 'BLOB', + 'BYTEA', + 'BINARY', + 'VARBINARY', + 'BOOLEAN', + 'BOOL', + 'LOGICAL', + 'DATE', + 'DECIMAL', + 'NUMERIC', + 'DOUBLE', + 'FLOAT8', + 'FLOAT', + 'FLOAT4', + 'REAL', + 'HUGEINT', + 'INTEGER', + 'INT4', + 'INT', + 'SIGNED', + 'INTERVAL', + 'JSON', + 'SMALLINT', + 'INT2', + 'SHORT', + 'TIME', + 'TIMESTAMP WITH TIME ZONE', + 'TIMESTAMPTZ', + 'TIMESTAMP', + 'DATETIME', + 'TINYINT', + 'INT1', + 'UBIGINT', + 'UHUGEINT', + 'UINTEGER', + 'USMALLINT', + 'UTINYINT', + 'UUID', + 'VARCHAR', + 'CHAR', + 'BPCHAR', + 'TEXT', + 'STRING' +] export const DB_TYPES: Record = { bigquery: BIGQUERY_TYPES, diff --git a/frontend/src/lib/infer.ts b/frontend/src/lib/infer.ts index 5dcb6772f3..6582930715 100644 --- a/frontend/src/lib/infer.ts +++ b/frontend/src/lib/infer.ts @@ -9,6 +9,7 @@ import initRegexParsers, { parse_sql, parse_mysql, parse_oracledb, + parse_duckdb, parse_bigquery, parse_snowflake, parse_graphql, @@ -96,7 +97,9 @@ export async function inferArgs( } let inlineDBResource: string | undefined = undefined - if (['postgresql', 'mysql', 'bigquery', 'snowflake', 'mssql', 'oracledb'].includes(language ?? '')) { + if ( + ['postgresql', 'mysql', 'bigquery', 'snowflake', 'mssql', 'oracledb'].includes(language ?? '') + ) { await initWasmRegex() inlineDBResource = parse_db_resource(code) } @@ -147,6 +150,9 @@ export async function inferArgs( ...inferedSchema.args ] } + } else if (language == 'duckdb') { + await initWasmRegex() + inferedSchema = JSON.parse(parse_duckdb(code)) } else if (language == 'snowflake') { inferedSchema = JSON.parse(parse_snowflake(code)) if (inlineDBResource === undefined) { @@ -194,7 +200,7 @@ export async function inferArgs( } else if (language == 'java') { await initWasmJava() inferedSchema = JSON.parse(parse_java(code)) - // for related places search: ADD_NEW_LANG + // for related places search: ADD_NEW_LANG } else { return null } diff --git a/frontend/src/lib/inferArgSig.ts b/frontend/src/lib/inferArgSig.ts index ae4ad83794..68d3fc814e 100644 --- a/frontend/src/lib/inferArgSig.ts +++ b/frontend/src/lib/inferArgSig.ts @@ -5,23 +5,21 @@ export function argSigToJsonSchemaType( | string | { resource: string | null } | { - list: - | (string | { object: { key: string; typ: any }[] }) - | { str: any } - | { object: { key: string; typ: any }[] } - | null - } + list: + | (string | { object: { key: string; typ: any }[] }) + | { str: any } + | { object: { key: string; typ: any }[] } + | null + } | { dynselect: string } | { str: string[] | null } | { object: { key: string; typ: any }[] } | { - oneof: [ - { + oneof: { label: string properties: { key: string; typ: any }[] - } - ] - }, + }[] + }, oldS: SchemaProperty ): void { const newS: SchemaProperty = { type: '' } diff --git a/frontend/src/lib/script_helpers.ts b/frontend/src/lib/script_helpers.ts index ceb6644c42..07c05974dc 100644 --- a/frontend/src/lib/script_helpers.ts +++ b/frontend/src/lib/script_helpers.ts @@ -307,6 +307,19 @@ INSERT INTO demo VALUES (@P1, @P2); UPDATE demo SET col2 = @P3 WHERE col2 = @P2; ` +const DUCKDB_INIT_CODE = `-- $friends_csv (s3object) +-- $name (text) = Ben + +ATTACH '$res:u/demo/amazed_postgresql' AS db (TYPE postgres); +CREATE TABLE IF NOT EXISTS db.public.friends (name text); + +INSERT INTO db.public.friends + SELECT name FROM read_csv($friends_csv); + +SELECT 'Hello ' || $name || ', you have ' || + (SELECT COUNT(*) FROM read_csv($friends_csv)) || ' new friends !'; +` + const GRAPHQL_INIT_CODE = `query($name4: String, $name2: Int, $name3: [String]) { demo(name1: $name1, name2: $name2, name3: $name3) { name1, @@ -1134,6 +1147,9 @@ export const INITIAL_CODE = { mssql: { script: MSSQL_INIT_CODE }, + duckdb: { + script: DUCKDB_INIT_CODE + }, graphql: { script: GRAPHQL_INIT_CODE }, @@ -1258,6 +1274,8 @@ export function initialCode( return INITIAL_CODE.mssql.script } else if (language == 'graphql') { return INITIAL_CODE.graphql.script + } else if (language == 'duckdb') { + return INITIAL_CODE.duckdb.script } else if (language == 'php') { return INITIAL_CODE.php.script } else if (language == 'rust') { diff --git a/frontend/src/lib/scripts.ts b/frontend/src/lib/scripts.ts index bc8a44b434..961ae72488 100644 --- a/frontend/src/lib/scripts.ts +++ b/frontend/src/lib/scripts.ts @@ -38,6 +38,8 @@ export function scriptLangToEditorLang( return 'sql' } else if (lang == 'mssql') { return 'sql' + } else if (lang == 'duckdb') { + return 'sql' } else if (lang == 'python3') { return 'python' } else if (lang == 'bash') { @@ -140,7 +142,8 @@ const scriptLanguagesArray: [SupportedLanguage | 'docker' | 'bunnative', string] ['csharp', 'C#'], ['docker', 'Docker'], ['nu', 'Nu'], - ['java', 'Java'] + ['java', 'Java'], + ['duckdb', 'DuckDB'] // for related places search: ADD_NEW_LANG ] export function processLangs(selected: string | undefined, langs: string[]): string[] { @@ -150,7 +153,7 @@ export function processLangs(selected: string | undefined, langs: string[]): str let ls = langs.filter((lang) => lang !== 'nativets') //those languages are newer and may not be in the saved list - let nl = ['bunnative', 'rust', 'ansible', 'csharp', 'nu', 'java'] + let nl = ['bunnative', 'rust', 'ansible', 'csharp', 'nu', 'java', 'duckdb'] // for related places search: ADD_NEW_LANG nl.forEach((lang) => { if (!ls.includes(lang)) { diff --git a/frontend/src/routes/(root)/(logged)/run/[...run]/+page.svelte b/frontend/src/routes/(root)/(logged)/run/[...run]/+page.svelte index 35f23fc9e7..cab4ef6adb 100644 --- a/frontend/src/routes/(root)/(logged)/run/[...run]/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/run/[...run]/+page.svelte @@ -755,7 +755,7 @@ priority: {job.priority}
{/if} - {#if job.tag && !['deno', 'python3', 'flow', 'other', 'go', 'postgresql', 'mysql', 'bigquery', 'snowflake', 'mssql', 'graphql', 'oracledb', 'nativets', 'bash', 'powershell', 'php', 'rust', 'other', 'ansible', 'csharp', 'nu', 'java', 'dependency'].includes(job.tag)} + {#if job.tag && !['deno', 'python3', 'flow', 'other', 'go', 'postgresql', 'mysql', 'bigquery', 'snowflake', 'mssql', 'graphql', 'oracledb', 'nativets', 'bash', 'powershell', 'php', 'rust', 'other', 'ansible', 'csharp', 'nu', 'java', 'duckdb', 'dependency'].includes(job.tag)}
Tag: {job.tag} From feae9b09240ba306c007013a36d2aefb0b273766 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Tue, 27 May 2025 21:04:24 +0200 Subject: [PATCH 479/739] fix: error handler node rendering at top level --- frontend/src/lib/components/graph/graphBuilder.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/lib/components/graph/graphBuilder.ts b/frontend/src/lib/components/graph/graphBuilder.ts index 0011106ade..ab851db42e 100644 --- a/frontend/src/lib/components/graph/graphBuilder.ts +++ b/frontend/src/lib/components/graph/graphBuilder.ts @@ -166,7 +166,7 @@ export function graphBuilder( disableMoveIds: options?.disableMoveIds, enableTrigger: sourceId === 'Input', // If the index is -1, it means that the target module is not in the modules array, so we set it to the length of the array - index: index >= 0 ? index : mods?.length ?? 0, + index: index >= 0 ? index : (mods?.length ?? 0), ...extra, insertable: extra.insertable && !options?.disableInsert && prefix == undefined } @@ -635,7 +635,7 @@ export function graphBuilder( if (failureModule) { let toAdd: Record = {} Object.keys(extra.flowModuleStates ?? {}).forEach((id) => { - if (id.startsWith('failure-')) { + if (id.startsWith('failure')) { const failureState = extra.flowModuleStates?.[id] as GraphModuleState | undefined if (failureState?.parent_module) { toAdd[failureState.parent_module] = id From 0d459d5d223728270854e37715ecc1663ede9870 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Wed, 28 May 2025 01:21:22 +0200 Subject: [PATCH 480/739] fix: avoid monaco memory leak --- frontend/src/lib/components/Editor.svelte | 5 ++- .../src/lib/components/SimpleEditor.svelte | 31 +++++++++++------ .../src/lib/components/TemplateEditor.svelte | 32 +++++++++-------- .../copilot/autocomplete/monaco-adapter.ts | 34 +++++++++---------- frontend/src/lib/components/vscode.ts | 9 ++++- 5 files changed, 68 insertions(+), 43 deletions(-) diff --git a/frontend/src/lib/components/Editor.svelte b/frontend/src/lib/components/Editor.svelte index 02b7f4170b..aa1aa5f0b0 100644 --- a/frontend/src/lib/components/Editor.svelte +++ b/frontend/src/lib/components/Editor.svelte @@ -115,7 +115,7 @@ import { workspaceStore } from '$lib/stores' import { type Preview, ResourceService, UserService } from '$lib/gen' import type { Text } from 'yjs' - import { initializeVscode } from '$lib/components/vscode' + import { initializeVscode, keepModelAroundToAvoidDisposalOfWorkers } from '$lib/components/vscode' import { initializeMode } from 'monaco-graphql/esm/initializeMode.js' import type { MonacoGraphQLAPI } from 'monaco-graphql/esm/api.js' @@ -1266,6 +1266,8 @@ folding }) + keepModelAroundToAvoidDisposalOfWorkers() + // updateEditorKeybindingsMode(editor, 'vim', undefined) let ataModel: NodeJS.Timeout | undefined = undefined @@ -1355,6 +1357,7 @@ try { closeWebsockets() vimDisposable?.dispose() + console.log('disposing editor', editor, model) model?.dispose() editor && editor.dispose() console.log('disposed editor') diff --git a/frontend/src/lib/components/SimpleEditor.svelte b/frontend/src/lib/components/SimpleEditor.svelte index 984b05564a..d3c498054d 100644 --- a/frontend/src/lib/components/SimpleEditor.svelte +++ b/frontend/src/lib/components/SimpleEditor.svelte @@ -7,6 +7,16 @@ import '@codingame/monaco-vscode-standalone-css-language-features' import '@codingame/monaco-vscode-standalone-typescript-language-features' import '@codingame/monaco-vscode-standalone-html-language-features' + import { + editor as meditor, + KeyCode, + KeyMod, + Uri as mUri, + languages, + type IRange, + type IDisposable + } from 'monaco-editor' + languages.typescript.javascriptDefaults.setCompilerOptions({ target: languages.typescript.ScriptTarget.Latest, allowNonTsExtensions: true, @@ -44,15 +54,15 @@ import { BROWSER } from 'esm-env' import { createHash, editorConfig, langToExt, updateOptions } from '$lib/editorUtils' - import { - editor as meditor, - KeyCode, - KeyMod, - Uri as mUri, - languages, - type IRange, - type IDisposable - } from 'monaco-editor' + // import { + // editor as meditor, + // KeyCode, + // KeyMod, + // Uri as mUri, + // languages, + // type IRange, + // type IDisposable + // } from 'monaco-editor' import { allClasses } from './apps/editor/componentsPanel/cssUtils' @@ -60,7 +70,7 @@ import libStdContent from '$lib/es6.d.ts.txt?raw' import domContent from '$lib/dom.d.ts.txt?raw' - import { initializeVscode } from './vscode' + import { initializeVscode, keepModelAroundToAvoidDisposalOfWorkers } from './vscode' import EditorTheme from './EditorTheme.svelte' import { vimMode } from '$lib/stores' import { initVim } from './monaco_keybindings' @@ -348,6 +358,7 @@ snippetsPreventQuickSuggestions: disableSuggestions } }) + keepModelAroundToAvoidDisposalOfWorkers() let timeoutModel: NodeJS.Timeout | undefined = undefined editor.onDidChangeModelContent((event) => { diff --git a/frontend/src/lib/components/TemplateEditor.svelte b/frontend/src/lib/components/TemplateEditor.svelte index 941c72fc74..22d3fc6776 100644 --- a/frontend/src/lib/components/TemplateEditor.svelte +++ b/frontend/src/lib/components/TemplateEditor.svelte @@ -1,3 +1,21 @@ + + + + { + confirmationModalOpen = false + }} + on:confirmed={() => { + onDelete?.() + confirmationModalOpen = false + }} +> + {#if trigger !== undefined} + {@const IconComponent = triggerIconMap[trigger.type]} +
+ + +
+ {/if} +
+ + - ``` - - - Use `$derived` for computed values based on other reactive state. - - ```svelte - - -

{count} * 2 = {doubled}

- ``` - - - Use `$effect` for side effects that need to run when reactive values change (e.g., logging, manual DOM manipulation, data fetching). Remember `$effect` does not run on the server. - - ```svelte - - ``` - -2. **Props with `$props`**: - - - Declare component props using `$props()`. This offers better clarity and flexibility compared to `export let`. - - ```svelte - - -

Name: {name}

-

Age: {age}

- ``` - - - For bindable props, use `$bindable`. - - ```svelte - - - - ``` - -## Event Handling - -- **Use direct event attributes**: Svelte 5 moves away from `on:` directives for DOM events. - - **Do**: `` - - **Don't**: `` -- **For component events, prefer callback props**: Instead of `createEventDispatcher`, pass functions as props. - - ```svelte - - - -

Message from child: {message}

- - - - - ``` - -## Snippets for Content Projection - -- **Use `{#snippet ...}` and `{@render ...}` instead of slots**: Snippets are more powerful and flexible. - - ```svelte - - - - - {#snippet title()} - My Awesome Title - {/snippet} - {#snippet content()} -

Some interesting content here.

- {/snippet} -
- - - - -
-
{@render title()}
-
{@render content()}
-
- ``` - -- Default content is passed via the `children` prop (which is a snippet). - ```svelte - - -
- {@render children?.()} -
- ``` - -## Component Design - -1. **Create Small, Reusable Components**: Break down complex UIs into smaller, focused components. Each component should have a single responsibility. This also aids performance by limiting the scope of reactivity updates. -2. **Descriptive Naming**: Use clear and descriptive names for variables, functions, and components. -3. **Minimize Logic in Components**: Move complex business logic to utility functions or services. Keep components focused on presentation and interaction. - -## State Management (Stores) - -1. **Segment Stores**: Avoid a single global store. Create multiple stores, each responsible for a specific piece of global state (e.g., `userStore.js`, `themeStore.js`). This can help limit reactivity updates to only the parts of the UI that depend on specific state segments. -2. **Use Custom Stores for Complex Logic**: For stores with related methods, create custom stores. - - ```javascript - // counterStore.js - import { writable } from 'svelte/store' - - function createCounter() { - const { subscribe, set, update } = writable(0) - - return { - subscribe, - increment: () => update((n) => n + 1), - decrement: () => update((n) => n - 1), - reset: () => set(0) - } - } - export const counter = createCounter() - ``` - -3. **Use Context API for Localized State**: For state shared within a component subtree, consider Svelte's context API (`setContext`, `getContext`) instead of global stores when the state doesn't need to be truly global. - -## Performance Optimizations (Svelte 5) - -When generating Svelte 5 code, prioritize frontend performance by applying the following principles: - -### General Svelte 5 Principles - -- **Leverage the Compiler:** Trust Svelte's compiler to generate optimized JavaScript. Avoid manual DOM manipulation (`document.querySelector`, etc.) unless absolutely necessary for integrating third-party libraries that lack Svelte adapters. -- **Keep Components Small and Focused:** Reinforcing from Component Design, smaller components lead to less complex reactivity graphs and more targeted, efficient updates. - -### Reactivity & State Management - -- **Optimize Computations with `$derived`:** Always use `$derived` for computed values that depend on other state. This ensures the computation only runs when its specific dependencies change, avoiding unnecessary work compared to recomputing derived values in `$effect` or less efficient methods. -- **Minimize `$effect` Usage:** Use `$effect` sparingly and only for true side effects that interact with the outside world or non-Svelte state. Avoid putting complex logic or state updates _within_ an `$effect` unless those updates are explicitly intended as a reaction to external changes or non-Svelte state. Excessive or complex effects can impact rendering performance. -- **Structure State for Fine-Grained Updates:** Design your `$state` objects or variables such that updates affect only the necessary parts of the UI. Avoid putting too much unrelated state into a single large object that gets frequently updated, as this can potentially trigger broader updates than necessary. Consider normalizing complex, nested state. - -### List Rendering (`{#each}`) - -- **Mandate `key` Attribute:** Always use a `key` attribute (`{#each items as item (item.id)}`) that refers to a unique, stable identifier for each item in a list. This is critical for allowing Svelte to efficiently update, reorder, add, or remove list items without destroying and re-creating unnecessary DOM elements and component instances. - -### Component Loading & Bundling - -- **Implement Lazy Loading/Code Splitting:** For routes, components, or modules that are not immediately needed on page load, use dynamic imports (`import(...)`) to split the code bundle. SvelteKit handles this automatically for routes, but it can be applied manually to components using helper patterns if needed. -- **Be Mindful of Third-Party Libraries:** When incorporating external libraries, import only the necessary functions or components to minimize the final bundle size. Prefer libraries designed to be tree-shakeable. - -### Rendering & DOM - -- **Use CSS for Animations/Transitions:** Prefer CSS animations or transitions where possible for performance. Svelte's built-in `transition:` directive is also highly optimized and should be used for complex state-driven transitions, but simple cases can often use plain CSS. -- **Optimize Image Loading:** Implement best practices for images: use optimized formats (WebP, AVIF), lazy loading (`loading="lazy"`), and responsive images (``, `srcset`) to avoid loading unnecessarily large images. - -### Server-Side Rendering (SSR) & Hydration - -- **Ensure SSR Compatibility:** Write components that can be rendered on the server for faster initial page loads. Avoid relying on browser-specific APIs (like `window` or `document`) in the main ` - -
- Hello -
- ``` - -5. **Stay Updated**: Keep Svelte and its related packages up to date to benefit from the latest features, performance improvements, and security fixes. From e302aa38b5977dd406ae05e1d8dbb74cb7dc3d17 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 29 May 2025 01:16:50 +0200 Subject: [PATCH 490/739] fix: evalv2 prohibit component delete --- .../components/apps/editor/AppEditor.svelte | 3 +- .../apps/editor/SettingsPanel.svelte | 12 +++- .../inputEditor/EvalV2InputEditor.svelte | 56 +++++++++++++------ 3 files changed, 49 insertions(+), 22 deletions(-) diff --git a/frontend/src/lib/components/apps/editor/AppEditor.svelte b/frontend/src/lib/components/apps/editor/AppEditor.svelte index fd328beb28..73a5b5b70b 100644 --- a/frontend/src/lib/components/apps/editor/AppEditor.svelte +++ b/frontend/src/lib/components/apps/editor/AppEditor.svelte @@ -785,8 +785,7 @@ $: forceDeactivatePanzoom = isModifierKeyPressed && handMode - - + diff --git a/frontend/src/lib/components/apps/editor/SettingsPanel.svelte b/frontend/src/lib/components/apps/editor/SettingsPanel.svelte index b2e0a4b52e..108a2498c2 100644 --- a/frontend/src/lib/components/apps/editor/SettingsPanel.svelte +++ b/frontend/src/lib/components/apps/editor/SettingsPanel.svelte @@ -121,9 +121,15 @@ gridItemWithLocation?.location.type === 'subgrid' && Array.isArray($app.subgrids?.[gridItemWithLocation.location.subgridKey]) ) { - $app.subgrids[gridItemWithLocation.location.subgridKey][ - gridItemWithLocation.location.subgridItemIndex - ] = cs.item + if ( + $app.subgrids[gridItemWithLocation.location.subgridKey][ + gridItemWithLocation.location.subgridItemIndex + ] + ) { + $app.subgrids[gridItemWithLocation.location.subgridKey][ + gridItemWithLocation.location.subgridItemIndex + ] = cs.item + } } } } diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/inputEditor/EvalV2InputEditor.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/inputEditor/EvalV2InputEditor.svelte index 3b59f74051..dd9c7aebb6 100644 --- a/frontend/src/lib/components/apps/editor/settingsPanel/inputEditor/EvalV2InputEditor.svelte +++ b/frontend/src/lib/components/apps/editor/settingsPanel/inputEditor/EvalV2InputEditor.svelte @@ -13,14 +13,27 @@ import { zIndexes } from '$lib/zIndexes' import Popover from '$lib/components/Popover.svelte' - export let componentInput: EvalV2AppInput | undefined - export let id: string - export let field: string - export let fixedOverflowWidgets: boolean = true - export let acceptSelf: boolean = false - export let recomputeOnInputChanged = true - export let showOnDemandOnlyToggle = false - export let securedContext = false + interface Props { + componentInput: EvalV2AppInput | undefined + id: string + field: string + fixedOverflowWidgets?: boolean + acceptSelf?: boolean + recomputeOnInputChanged?: boolean + showOnDemandOnlyToggle?: boolean + securedContext?: boolean + } + + let { + componentInput = $bindable(), + id, + field, + fixedOverflowWidgets = true, + acceptSelf = false, + recomputeOnInputChanged = true, + showOnDemandOnlyToggle = false, + securedContext = false + }: Props = $props() const { onchange, @@ -30,15 +43,17 @@ } = getContext('AppViewerContext') const { evalPreview } = getContext('AppEditorContext') - let editor: SimpleEditor + let editor: SimpleEditor | undefined = $state() export function setCode(code: string) { editor?.setCode(code) } - $: extraLib = - componentInput?.expr && $worldStore + let exprDefined = $derived(componentInput?.expr != undefined) + let extraLib = $derived( + exprDefined && $worldStore ? buildExtraLib($worldStore?.outputsById ?? {}, acceptSelf ? '' : id, $stateStore, false) : undefined + ) if ( componentInput && @@ -58,8 +73,8 @@ } } - let fullscreen = false - let focus = false + let fullscreen = $state(false) + let focus = $state(false) {#if componentInput?.type === 'evalv2'} @@ -110,7 +125,14 @@ small bind:this={editor} lang="javascript" - bind:code={() => componentInput.expr ?? '', (e) => (componentInput.expr = e)} + bind:code={ + () => componentInput.expr ?? '', + (e) => { + if (componentInput.expr != e) { + componentInput.expr = e + } + } + } shouldBindKey={false} {extraLib} autoHeight @@ -132,17 +154,17 @@
- + {#snippet text()} This context variable is securely provided by the backend and cannot be altered by users - + {/snippet}
{/if} (fullscreen = true)}> {#if focus}
From 8d12bcc8ee2991909ea0d9bb57f04f0d4106c69f Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 29 May 2025 02:10:17 +0200 Subject: [PATCH 491/739] fix: faster layout for larger graphs --- .../lib/components/graph/FlowGraphV2.svelte | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/frontend/src/lib/components/graph/FlowGraphV2.svelte b/frontend/src/lib/components/graph/FlowGraphV2.svelte index 6fa84591f2..f0c1b0bc9e 100644 --- a/frontend/src/lib/components/graph/FlowGraphV2.svelte +++ b/frontend/src/lib/components/graph/FlowGraphV2.svelte @@ -25,7 +25,7 @@ import ResultNode from './renderers/nodes/ResultNode.svelte' import BaseEdge from './renderers/edges/BaseEdge.svelte' import EmptyEdge from './renderers/edges/EmptyEdge.svelte' - import { sugiyama, dagStratify, decrossOpt, coordCenter } from 'd3-dag' + import { sugiyama, dagStratify, coordCenter, decrossTwoLayer, decrossOpt } from 'd3-dag' import { Expand } from 'lucide-svelte' import Toggle from '../Toggle.svelte' import DataflowEdge from './renderers/edges/DataflowEdge.svelte' @@ -117,7 +117,7 @@ function onModulesChange(modules: FlowModule[]) { computeSimplifiableFlow( modules, - triggerContext?.simplifiedPoll ? get(triggerContext.simplifiedPoll) ?? false : false + triggerContext?.simplifiedPoll ? (get(triggerContext.simplifiedPoll) ?? false) : false ) } @@ -143,12 +143,13 @@ let boxSize: any try { const layout = sugiyama() - .decross(decrossOpt()) + .decross(nodes.length > 20 ? decrossTwoLayer() : decrossOpt()) .coord(coordCenter()) .nodeSize(() => [NODE.width + NODE.gap.horizontal, NODE.height + NODE.gap.vertical]) boxSize = layout(dag) } catch { const layout = sugiyama() + .decross(decrossTwoLayer()) .coord(coordCenter()) .nodeSize(() => [NODE.width + NODE.gap.horizontal, NODE.height + NODE.gap.vertical]) boxSize = layout(dag) @@ -160,13 +161,13 @@ position: { x: des.x ? // @ts-ignore - (des.data.data.offset ?? 0) + - // @ts-ignore - des.x + - (fullSize ? fullWidth : width) / 2 - - boxSize.width / 2 - - NODE.width / 2 - - (width - fullWidth) / 2 + (des.data.data.offset ?? 0) + + // @ts-ignore + des.x + + (fullSize ? fullWidth : width) / 2 - + boxSize.width / 2 - + NODE.width / 2 - + (width - fullWidth) / 2 : 0, y: des.y || 0 } From eb33b3603e981b655c11b467cba7401d4a525300 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 29 May 2025 02:28:32 +0200 Subject: [PATCH 492/739] chore(main): release 1.493.3 (#5833) * chore(main): release 1.493.3 * Apply automatic changes --------- Co-authored-by: rubenfiszel <275584+rubenfiszel@users.noreply.github.com> --- CHANGELOG.md | 8 ++ backend/Cargo.lock | 84 +++++++++---------- backend/Cargo.toml | 4 +- backend/windmill-api/openapi.yaml | 2 +- benchmarks/lib.ts | 2 +- cli/main.ts | 2 +- frontend/package-lock.json | 4 +- frontend/package.json | 2 +- lsp/Pipfile | 4 +- openflow.openapi.yaml | 2 +- .../WindmillClient/WindmillClient.psd1 | 2 +- python-client/wmill/pyproject.toml | 2 +- python-client/wmill_pg/pyproject.toml | 2 +- typescript-client/jsr.json | 2 +- typescript-client/package.json | 2 +- version.txt | 2 +- 16 files changed, 67 insertions(+), 59 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4bdd6a9a9f..82eaaa7ca2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [1.493.3](https://github.com/windmill-labs/windmill/compare/v1.493.2...v1.493.3) (2025-05-29) + + +### Bug Fixes + +* evalv2 prohibit component delete ([e302aa3](https://github.com/windmill-labs/windmill/commit/e302aa38b5977dd406ae05e1d8dbb74cb7dc3d17)) +* faster layout for larger graphs ([8d12bcc](https://github.com/windmill-labs/windmill/commit/8d12bcc8ee2991909ea0d9bb57f04f0d4106c69f)) + ## [1.493.2](https://github.com/windmill-labs/windmill/compare/v1.493.1...v1.493.2) (2025-05-28) diff --git a/backend/Cargo.lock b/backend/Cargo.lock index 445dad0222..047fd36c74 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -791,7 +791,7 @@ dependencies = [ "bytes", "http 1.3.1", "rand 0.8.5", - "reqwest 0.12.17", + "reqwest 0.12.18", "serde", "serde-aux", "serde_json", @@ -5990,7 +5990,7 @@ dependencies = [ "google-cloud-token", "home", "jsonwebtoken 9.3.1", - "reqwest 0.12.17", + "reqwest 0.12.18", "serde", "serde_json", "thiserror 1.0.69", @@ -6033,7 +6033,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d901aeb453fd80e51d64df4ee005014f6cf39f2d736dd64f7239c132d9d39a6a" dependencies = [ - "reqwest 0.12.17", + "reqwest 0.12.18", "thiserror 1.0.69", "tokio", ] @@ -8639,7 +8639,7 @@ dependencies = [ "getrandom 0.2.16", "http 1.3.1", "rand 0.8.5", - "reqwest 0.12.17", + "reqwest 0.12.18", "serde", "serde_json", "serde_path_to_error", @@ -8688,7 +8688,7 @@ dependencies = [ "percent-encoding", "quick-xml 0.37.5", "rand 0.9.0", - "reqwest 0.12.17", + "reqwest 0.12.18", "ring 0.17.14", "serde", "serde_json", @@ -10376,9 +10376,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.17" +version = "0.12.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3f27698fc5799d2a281528a908bd874973953ca2e7bc2311637e10c263c723b" +checksum = "e98ff6b0dbbe4d5a37318f433d4fc82babd21631f194d370409ceb2e40b2f0b5" dependencies = [ "async-compression", "base64 0.22.1", @@ -10434,7 +10434,7 @@ dependencies = [ "anyhow", "async-trait", "http 1.3.1", - "reqwest 0.12.17", + "reqwest 0.12.18", "serde", "thiserror 1.0.69", "tower-service", @@ -10453,7 +10453,7 @@ dependencies = [ "http 1.3.1", "hyper 1.6.0", "parking_lot 0.11.2", - "reqwest 0.12.17", + "reqwest 0.12.18", "reqwest-middleware", "retry-policies", "thiserror 1.0.69", @@ -13671,7 +13671,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba3beec919fbdf99d719de8eda6adae3281f8a5b71ae40431f44dc7423053d34" dependencies = [ "loki-api", - "reqwest 0.12.17", + "reqwest 0.12.18", "serde", "serde_json", "snap", @@ -14667,7 +14667,7 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windmill" -version = "1.493.2" +version = "1.493.3" dependencies = [ "anyhow", "axum", @@ -14687,7 +14687,7 @@ dependencies = [ "prometheus", "quote", "rand 0.9.0", - "reqwest 0.12.17", + "reqwest 0.12.18", "rustls 0.23.27", "serde", "serde_json", @@ -14718,7 +14718,7 @@ dependencies = [ [[package]] name = "windmill-api" -version = "1.493.2" +version = "1.493.3" dependencies = [ "anyhow", "argon2", @@ -14777,7 +14777,7 @@ dependencies = [ "rand 0.9.0", "rdkafka", "regex", - "reqwest 0.12.17", + "reqwest 0.12.18", "rmcp", "rsa", "rumqttc", @@ -14827,7 +14827,7 @@ dependencies = [ [[package]] name = "windmill-api-client" -version = "1.493.2" +version = "1.493.3" dependencies = [ "base64 0.22.1", "chrono", @@ -14842,7 +14842,7 @@ dependencies = [ [[package]] name = "windmill-audit" -version = "1.493.2" +version = "1.493.3" dependencies = [ "chrono", "serde", @@ -14855,7 +14855,7 @@ dependencies = [ [[package]] name = "windmill-autoscaling" -version = "1.493.2" +version = "1.493.3" dependencies = [ "anyhow", "serde", @@ -14869,7 +14869,7 @@ dependencies = [ [[package]] name = "windmill-common" -version = "1.493.2" +version = "1.493.3" dependencies = [ "anyhow", "async-stream", @@ -14911,7 +14911,7 @@ dependencies = [ "quick_cache", "rand 0.9.0", "regex", - "reqwest 0.12.17", + "reqwest 0.12.18", "reqwest-middleware", "reqwest-retry", "semver 1.0.26", @@ -14945,7 +14945,7 @@ dependencies = [ [[package]] name = "windmill-git-sync" -version = "1.493.2" +version = "1.493.3" dependencies = [ "regex", "serde", @@ -14959,7 +14959,7 @@ dependencies = [ [[package]] name = "windmill-indexer" -version = "1.493.2" +version = "1.493.3" dependencies = [ "anyhow", "bytes", @@ -14982,7 +14982,7 @@ dependencies = [ [[package]] name = "windmill-macros" -version = "1.493.2" +version = "1.493.3" dependencies = [ "itertools 0.14.0", "lazy_static", @@ -14994,7 +14994,7 @@ dependencies = [ [[package]] name = "windmill-parser" -version = "1.493.2" +version = "1.493.3" dependencies = [ "convert_case 0.6.0", "serde", @@ -15003,7 +15003,7 @@ dependencies = [ [[package]] name = "windmill-parser-bash" -version = "1.493.2" +version = "1.493.3" dependencies = [ "anyhow", "lazy_static", @@ -15015,7 +15015,7 @@ dependencies = [ [[package]] name = "windmill-parser-csharp" -version = "1.493.2" +version = "1.493.3" dependencies = [ "anyhow", "serde_json", @@ -15027,7 +15027,7 @@ dependencies = [ [[package]] name = "windmill-parser-go" -version = "1.493.2" +version = "1.493.3" dependencies = [ "anyhow", "gosyn", @@ -15039,7 +15039,7 @@ dependencies = [ [[package]] name = "windmill-parser-graphql" -version = "1.493.2" +version = "1.493.3" dependencies = [ "anyhow", "lazy_static", @@ -15051,7 +15051,7 @@ dependencies = [ [[package]] name = "windmill-parser-java" -version = "1.493.2" +version = "1.493.3" dependencies = [ "anyhow", "serde_json", @@ -15063,7 +15063,7 @@ dependencies = [ [[package]] name = "windmill-parser-nu" -version = "1.493.2" +version = "1.493.3" dependencies = [ "anyhow", "nu-parser", @@ -15074,7 +15074,7 @@ dependencies = [ [[package]] name = "windmill-parser-php" -version = "1.493.2" +version = "1.493.3" dependencies = [ "anyhow", "itertools 0.14.0", @@ -15085,7 +15085,7 @@ dependencies = [ [[package]] name = "windmill-parser-py" -version = "1.493.2" +version = "1.493.3" dependencies = [ "anyhow", "itertools 0.14.0", @@ -15096,7 +15096,7 @@ dependencies = [ [[package]] name = "windmill-parser-py-imports" -version = "1.493.2" +version = "1.493.3" dependencies = [ "anyhow", "async-recursion", @@ -15119,7 +15119,7 @@ dependencies = [ [[package]] name = "windmill-parser-rust" -version = "1.493.2" +version = "1.493.3" dependencies = [ "anyhow", "convert_case 0.6.0", @@ -15136,7 +15136,7 @@ dependencies = [ [[package]] name = "windmill-parser-sql" -version = "1.493.2" +version = "1.493.3" dependencies = [ "anyhow", "lazy_static", @@ -15148,7 +15148,7 @@ dependencies = [ [[package]] name = "windmill-parser-ts" -version = "1.493.2" +version = "1.493.3" dependencies = [ "anyhow", "lazy_static", @@ -15166,7 +15166,7 @@ dependencies = [ [[package]] name = "windmill-parser-wasm" -version = "1.493.2" +version = "1.493.3" dependencies = [ "anyhow", "getrandom 0.2.16", @@ -15190,7 +15190,7 @@ dependencies = [ [[package]] name = "windmill-parser-yaml" -version = "1.493.2" +version = "1.493.3" dependencies = [ "anyhow", "serde_json", @@ -15200,7 +15200,7 @@ dependencies = [ [[package]] name = "windmill-queue" -version = "1.493.2" +version = "1.493.3" dependencies = [ "anyhow", "async-recursion", @@ -15217,7 +15217,7 @@ dependencies = [ "lazy_static", "prometheus", "regex", - "reqwest 0.12.17", + "reqwest 0.12.18", "serde", "serde_json", "serde_urlencoded", @@ -15233,7 +15233,7 @@ dependencies = [ [[package]] name = "windmill-sql-datatype-parser-wasm" -version = "1.493.2" +version = "1.493.3" dependencies = [ "wasm-bindgen", "wasm-bindgen-test", @@ -15243,7 +15243,7 @@ dependencies = [ [[package]] name = "windmill-worker" -version = "1.493.2" +version = "1.493.3" dependencies = [ "anyhow", "async-recursion", @@ -15295,7 +15295,7 @@ dependencies = [ "prometheus", "rand 0.9.0", "regex", - "reqwest 0.12.17", + "reqwest 0.12.18", "reqwest-middleware", "rust_decimal", "serde", diff --git a/backend/Cargo.toml b/backend/Cargo.toml index ea651b94e0..9556113099 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "windmill" -version = "1.493.2" +version = "1.493.3" authors.workspace = true edition.workspace = true @@ -32,7 +32,7 @@ members = [ ] [workspace.package] -version = "1.493.2" +version = "1.493.3" authors = ["Ruben Fiszel "] edition = "2021" diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index 8055b2654b..7e859bb707 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.493.2 + version: 1.493.3 title: Windmill API contact: diff --git a/benchmarks/lib.ts b/benchmarks/lib.ts index 3ff3ab48d5..666b7df69f 100644 --- a/benchmarks/lib.ts +++ b/benchmarks/lib.ts @@ -2,7 +2,7 @@ import { sleep } from "https://deno.land/x/sleep@v1.2.1/mod.ts"; import * as windmill from "https://deno.land/x/windmill@v1.174.0/mod.ts"; import * as api from "https://deno.land/x/windmill@v1.174.0/windmill-api/index.ts"; -export const VERSION = "v1.493.2"; +export const VERSION = "v1.493.3"; export async function login(email: string, password: string): Promise { return await windmill.UserService.login({ diff --git a/cli/main.ts b/cli/main.ts index f2d53e07ff..47d4198869 100644 --- a/cli/main.ts +++ b/cli/main.ts @@ -63,7 +63,7 @@ export { // } // }); -export const VERSION = "1.493.2"; +export const VERSION = "1.493.3"; const command = new Command() .name("wmill") diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 71b24d6cfc..53e102080f 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "windmill-components", - "version": "1.493.2", + "version": "1.493.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "windmill-components", - "version": "1.493.2", + "version": "1.493.3", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/frontend/package.json b/frontend/package.json index e875005166..3fd50f727d 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "windmill-components", - "version": "1.493.2", + "version": "1.493.3", "scripts": { "dev": "vite dev", "build": "vite build", diff --git a/lsp/Pipfile b/lsp/Pipfile index ee923c3f00..33c426f043 100644 --- a/lsp/Pipfile +++ b/lsp/Pipfile @@ -4,8 +4,8 @@ verify_ssl = true name = "pypi" [packages] -wmill = ">=1.493.2" -wmill_pg = ">=1.493.2" +wmill = ">=1.493.3" +wmill_pg = ">=1.493.3" sendgrid = "*" mysql-connector-python = "*" pymongo = "*" diff --git a/openflow.openapi.yaml b/openflow.openapi.yaml index c5adfe40d4..7c92b0825b 100644 --- a/openflow.openapi.yaml +++ b/openflow.openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.493.2 + version: 1.493.3 title: OpenFlow Spec contact: name: Ruben Fiszel diff --git a/powershell-client/WindmillClient/WindmillClient.psd1 b/powershell-client/WindmillClient/WindmillClient.psd1 index 3063cfdbf5..f2181c8da2 100644 --- a/powershell-client/WindmillClient/WindmillClient.psd1 +++ b/powershell-client/WindmillClient/WindmillClient.psd1 @@ -12,7 +12,7 @@ RootModule = 'WindmillClient.psm1' # Version number of this module. - ModuleVersion = '1.493.2' + ModuleVersion = '1.493.3' # Supported PSEditions # CompatiblePSEditions = @() diff --git a/python-client/wmill/pyproject.toml b/python-client/wmill/pyproject.toml index d9e6a43f4b..a0982fe3bb 100644 --- a/python-client/wmill/pyproject.toml +++ b/python-client/wmill/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "wmill" -version = "1.493.2" +version = "1.493.3" description = "A client library for accessing Windmill server wrapping the Windmill client API" license = "Apache-2.0" homepage = "https://windmill.dev" diff --git a/python-client/wmill_pg/pyproject.toml b/python-client/wmill_pg/pyproject.toml index 8a15766a48..7dd3cfc7a6 100644 --- a/python-client/wmill_pg/pyproject.toml +++ b/python-client/wmill_pg/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "wmill-pg" -version = "1.493.2" +version = "1.493.3" description = "An extension client for the wmill client library focused on pg" license = "Apache-2.0" homepage = "https://windmill.dev" diff --git a/typescript-client/jsr.json b/typescript-client/jsr.json index 8bc58c45c2..3a31249db0 100644 --- a/typescript-client/jsr.json +++ b/typescript-client/jsr.json @@ -1,6 +1,6 @@ { "name": "@windmill/windmill", - "version": "1.493.2", + "version": "1.493.3", "exports": "./src/index.ts", "publish": { "exclude": ["!src", "./s3Types.ts", "./client.ts"] diff --git a/typescript-client/package.json b/typescript-client/package.json index b6fc492db9..2461a1e07e 100644 --- a/typescript-client/package.json +++ b/typescript-client/package.json @@ -1,7 +1,7 @@ { "name": "windmill-client", "description": "Windmill SDK client for browsers and Node.js", - "version": "1.493.2", + "version": "1.493.3", "author": "Ruben Fiszel", "license": "Apache 2.0", "devDependencies": { diff --git a/version.txt b/version.txt index b99c89f1ea..0312f63a12 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.493.2 +1.493.3 From ed3ad327a235c16b9f3aa7f8edeefe61b0c01da3 Mon Sep 17 00:00:00 2001 From: Alexander Petric Date: Thu, 29 May 2025 03:34:05 -0400 Subject: [PATCH 493/739] fix: templatev2 delete issue (#5834) --- frontend/src/lib/components/TemplateEditor.svelte | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/frontend/src/lib/components/TemplateEditor.svelte b/frontend/src/lib/components/TemplateEditor.svelte index 22d3fc6776..c76e016a2b 100644 --- a/frontend/src/lib/components/TemplateEditor.svelte +++ b/frontend/src/lib/components/TemplateEditor.svelte @@ -477,8 +477,11 @@ editor.onDidChangeModelContent((event) => { timeoutModel && clearTimeout(timeoutModel) timeoutModel = setTimeout(() => { - code = getCode() - dispatch('change', { code }) + const newCode = getCode() + if (code != newCode) { + code = newCode + } + dispatch('change', { code: newCode }) }, 200) }) @@ -504,7 +507,10 @@ editor.onDidBlurEditorText(() => { dispatch('blur') - code = getCode() + const newCode = getCode() + if (code != newCode) { + code = newCode + } }) jsLoader = setTimeout(async () => { From acc352b5c009778603e77912e454f6359a0cc23a Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 29 May 2025 09:56:48 +0200 Subject: [PATCH 494/739] opt code updates --- frontend/src/lib/components/Editor.svelte | 52 +++++++++++-------- .../src/lib/components/SimpleEditor.svelte | 31 +++++++---- .../src/lib/components/TemplateEditor.svelte | 27 +++++----- 3 files changed, 67 insertions(+), 43 deletions(-) diff --git a/frontend/src/lib/components/Editor.svelte b/frontend/src/lib/components/Editor.svelte index 8e573c766d..57bebf80a3 100644 --- a/frontend/src/lib/components/Editor.svelte +++ b/frontend/src/lib/components/Editor.svelte @@ -344,26 +344,36 @@ } export function setCode(ncode: string, noHistory: boolean = false): void { - code = ncode - if (noHistory) { - editor?.setValue(ncode) - } else { - if (editor?.getModel()) { - // editor.setValue(ncode) - editor.pushUndoStop() + if (code != ncode) { + if (noHistory) { + editor?.setValue(ncode) + } else { + if (editor?.getModel()) { + // editor.setValue(ncode) + editor.pushUndoStop() - editor.executeEdits('set', [ - { - range: editor.getModel()!.getFullModelRange(), // full range - text: ncode - } - ]) + editor.executeEdits('set', [ + { + range: editor.getModel()!.getFullModelRange(), // full range + text: ncode + } + ]) - editor.pushUndoStop() + editor.pushUndoStop() + } } } } + function updateCode(): boolean { + const ncode = getCode() + if (code == ncode) { + return false + } + code = ncode + return true + } + export function append(code: string): void { if (editor) { const lineCount = editor.getModel()?.getLineCount() || 0 @@ -387,7 +397,7 @@ export async function format() { if (editor) { - code = getCode() + updateCode() if (lang != 'shell' && lang != 'nu') { if ($formatOnSave != false) { if (scriptLang == 'deno' && languageClients.length > 0) { @@ -424,7 +434,7 @@ await editor?.getAction('editor.action.formatDocument')?.run() } } - code = getCode() + updateCode() } if (formatAction) { formatAction() @@ -1275,9 +1285,9 @@ editor?.onDidChangeModelContent((event) => { timeoutModel && clearTimeout(timeoutModel) timeoutModel = setTimeout(() => { - let ncode = getCode() - code = ncode - dispatch('change', ncode) + if (updateCode()) { + dispatch('change', code) + } }, changeTimeout) ataModel && clearTimeout(ataModel) @@ -1296,12 +1306,12 @@ dispatch('focus') editor?.addCommand(KeyMod.CtrlCmd | KeyCode.KeyS, function () { - code = getCode() + updateCode() shouldBindKey && format && format() }) editor?.addCommand(KeyMod.CtrlCmd | KeyCode.Enter, function () { - code = getCode() + updateCode() shouldBindKey && cmdEnterAction && cmdEnterAction() }) diff --git a/frontend/src/lib/components/SimpleEditor.svelte b/frontend/src/lib/components/SimpleEditor.svelte index 7cca3416ae..91bc2be3c0 100644 --- a/frontend/src/lib/components/SimpleEditor.svelte +++ b/frontend/src/lib/components/SimpleEditor.svelte @@ -157,8 +157,19 @@ } export function setCode(ncode: string): void { + if (ncode != code) { + code = ncode + editor?.setValue(ncode) + } + } + + function updateCode(): boolean { + const ncode = getCode() + if (code == ncode) { + return false + } code = ncode - editor?.setValue(ncode) + return true } function updatePlaceholderVisibility(value: string) { @@ -171,11 +182,11 @@ export function format() { if (editor) { - code = getCode() + updateCode() editor.getAction('editor.action.formatDocument')?.run() if (formatAction) { formatAction() - code = getCode() + updateCode() } } } @@ -368,8 +379,9 @@ suggestion = '' timeoutModel && clearTimeout(timeoutModel) timeoutModel = setTimeout(() => { - code = getCode() - dispatch('change', { code }) + if (updateCode()) { + dispatch('change', { code }) + } }, 200) }) @@ -379,7 +391,7 @@ loadExtraLib() editor.addCommand(KeyMod.CtrlCmd | KeyCode.KeyS, function () { - code = getCode() + updateCode() shouldBindKey && format && format() }) @@ -411,12 +423,12 @@ editor.onDidFocusEditorText(() => { if (!editor) return editor.addCommand(KeyMod.CtrlCmd | KeyCode.KeyS, function () { - code = getCode() + updateCode() shouldBindKey && format && format() }) editor.addCommand(KeyMod.CtrlCmd | KeyCode.Enter, function () { - code = getCode() + updateCode() shouldBindKey && cmdEnterAction && cmdEnterAction() }) dispatch('focus') @@ -424,8 +436,7 @@ editor.onDidBlurEditorText(() => { dispatch('blur') - - code = getCode() + updateCode() }) if (lang === 'css' && !cssClassesLoaded) { diff --git a/frontend/src/lib/components/TemplateEditor.svelte b/frontend/src/lib/components/TemplateEditor.svelte index c76e016a2b..0dfdfedfab 100644 --- a/frontend/src/lib/components/TemplateEditor.svelte +++ b/frontend/src/lib/components/TemplateEditor.svelte @@ -380,7 +380,6 @@ $componentControl[$selectedComponent[0]] = { ...$componentControl[$selectedComponent[0]], setCode: (value: string) => { - code = value setCode(value) } } @@ -411,9 +410,9 @@ } export function setCode(ncode: string): void { - code = ncode - if (editor) { - editor.setValue(ncode) + if (code != ncode) { + code = ncode + editor?.setValue(ncode) } } @@ -473,15 +472,22 @@ editor.addCommand(KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.Digit7, function () {}) }) + function updateCode(): boolean { + const ncode = getCode() + if (code == ncode) { + return false + } + code = ncode + return true + } + let timeoutModel: NodeJS.Timeout | undefined = undefined editor.onDidChangeModelContent((event) => { timeoutModel && clearTimeout(timeoutModel) timeoutModel = setTimeout(() => { - const newCode = getCode() - if (code != newCode) { - code = newCode + if (updateCode()) { + dispatch('change', { code }) } - dispatch('change', { code: newCode }) }, 200) }) @@ -507,10 +513,7 @@ editor.onDidBlurEditorText(() => { dispatch('blur') - const newCode = getCode() - if (code != newCode) { - code = newCode - } + updateCode() }) jsLoader = setTimeout(async () => { From 453e7f03d3c7f3deb3c1d53f5d18740f2a30844d Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 29 May 2025 10:25:05 +0200 Subject: [PATCH 495/739] nit optimize updates --- .../propertyPicker/ObjectViewer.svelte | 179 ++++++++++-------- 1 file changed, 101 insertions(+), 78 deletions(-) diff --git a/frontend/src/lib/components/propertyPicker/ObjectViewer.svelte b/frontend/src/lib/components/propertyPicker/ObjectViewer.svelte index 74225bdf4a..c9f4fec930 100644 --- a/frontend/src/lib/components/propertyPicker/ObjectViewer.svelte +++ b/frontend/src/lib/components/propertyPicker/ObjectViewer.svelte @@ -1,4 +1,6 @@ +{#snippet renderScalar(k: string, v: any)} + + + { + selectProp(k, v, true) + }} + title={JSON.stringify(v)} + > + {#if v === NEVER_TESTED_THIS_FAR} + Test the flow to see a value + {:else if v == undefined} + undefined + {:else if v == null} + null + {:else if typeof v == 'string'} + "{truncate(v, 200)}" + {:else if typeof v == 'number' && Number.isInteger(v) && !Number.isSafeInteger(v)} + + {truncate(JSON.stringify(v), 200)} + + + {#snippet text()} + This number is too large for the frontend to handle correctly and may be rounded. + {/snippet} + + + {:else} + + {truncate(JSON.stringify(v), 200)} + + {/if} + +{/snippet} + @@ -118,10 +175,11 @@ {#if searchOpen}
{ - if (event?.key === 'Escape') { + onkeydown={(event) => { + if ((event as KeyboardEvent)?.key === 'Escape') { clearSearch() } + event.stopPropagation() }} type="text" class="!h-6 !text-2xs mt-0.5" @@ -130,7 +188,7 @@ /> @@ -151,8 +209,8 @@ {#if !fullyCollapsed} {#if level != 0 && keys.length > 1} - - + + {/if} @@ -275,7 +296,7 @@
+ {:else if itemsType?.type == 'object' && itemsType?.resourceType == 's3object'} +
+ { + value = [ + ...value, + { + s3: evt.detail?.path ?? '', + filename: evt.detail?.filename ?? '' + } + ] + }} + on:deletion={(evt) => { + value = value.filter((v) => v.s3 !== evt.detail?.path) + }} + defaultValue={defaultValue?.map((v) => v.s3)} + initialValue={value} + /> +
{:else}
{#key redraw} diff --git a/frontend/src/lib/components/ArrayTypeNarrowing.svelte b/frontend/src/lib/components/ArrayTypeNarrowing.svelte index 89285414de..3694b021b7 100644 --- a/frontend/src/lib/components/ArrayTypeNarrowing.svelte +++ b/frontend/src/lib/components/ArrayTypeNarrowing.svelte @@ -21,9 +21,19 @@ } | undefined - let selected: 'string' | 'number' | 'object' | 'bytes' | 'enum' | 'resource' | undefined = + let selected: + | 'string' + | 'number' + | 'object' + | 'bytes' + | 'enum' + | 'resource' + | 's3object' + | undefined = itemsType?.type != 'string' - ? itemsType?.type + ? itemsType?.type == 'object' && itemsType?.resourceType == 's3object' + ? 's3object' + : itemsType?.type : Array.isArray(itemsType?.enum) ? 'enum' : itemsType?.contentEncoding == 'base64' @@ -62,6 +72,8 @@ itemsType = { type: 'string', contentEncoding: 'base64' } } else if (selected == 'resource') { itemsType = { type: 'resource', resourceType: itemsType?.resourceType } + } else if (selected == 's3object') { + itemsType = { type: 'object', resourceType: 's3object' } } else { itemsType = undefined } @@ -71,6 +83,7 @@ {#if originalType != 'string[]'} + diff --git a/frontend/src/lib/components/common/fileInput/FileInput.svelte b/frontend/src/lib/components/common/fileInput/FileInput.svelte index 0212f5f534..77d9b308d8 100644 --- a/frontend/src/lib/components/common/fileInput/FileInput.svelte +++ b/frontend/src/lib/components/common/fileInput/FileInput.svelte @@ -18,7 +18,7 @@ export let iconSize = 36 export let returnFileNames = false export let submittedText: string | undefined = undefined - export let defaultFile: string | undefined = undefined + export let defaultFile: string | string[] | undefined = undefined export let disabled: boolean | undefined = undefined export let folderOnly = false @@ -160,9 +160,8 @@ files = files if (convertTo && files) { const promises = files.map(convertFile) - let converted: ConvertedFile[] | { name: string; data: ConvertedFile }[] = await Promise.all( - promises - ) + let converted: ConvertedFile[] | { name: string; data: ConvertedFile }[] = + await Promise.all(promises) if (returnFileNames) { converted = converted.map((c, i) => ({ name: files![i].name, data: c })) } @@ -239,7 +238,7 @@ {multiple} {...$$restProps} /> - {#if defaultFile} + {#if defaultFile && (!Array.isArray(defaultFile) || defaultFile.length > 0)}
Default file: {defaultFile}
diff --git a/frontend/src/lib/components/common/fileUpload/FileUpload.svelte b/frontend/src/lib/components/common/fileUpload/FileUpload.svelte index 9e5180b76c..44f2a7d8d6 100644 --- a/frontend/src/lib/components/common/fileUpload/FileUpload.svelte +++ b/frontend/src/lib/components/common/fileUpload/FileUpload.svelte @@ -12,69 +12,111 @@ import { createEventDispatcher, onDestroy } from 'svelte' import { emptyString } from '$lib/utils' - export let acceptedFileTypes: string[] | undefined = ['*'] - export let allowMultiple: boolean = true - export let allowDelete = true - export let folderOnly = false - export let containerText: string = folderOnly - ? 'Drag and drop a folder here or click to browse' - : allowMultiple - ? 'Drag and drop files here or click to browse' - : 'Drag and drop a file here or click to browse' - export let customResourcePath: string | undefined = undefined - export let customResourceType: 's3' | 'azure_blob' | undefined = undefined // when customResourcePath is provided, this should be provided as well. Will default to S3 if not - export let customClass: string = '' - export let customStyle: string = '' - export let randomFileKey: boolean = false - export let pathTransformer: any = undefined // function taking as input {file: File} and returning a string - export let forceDisplayUploads: boolean = false - export let defaultValue: string | undefined = undefined - export let workspace: string | undefined = undefined - export let fileUploads: Writable = writable([]) - export let appPath: string | undefined = undefined - export let disabled = false - export let iconSize: number | undefined = undefined - export let initialValue: - | { - s3: string - filename: string - } - | undefined = undefined - - init() - - function init() { - if (initialValue?.s3) { - if (!$fileUploads.find((fileUpload) => fileUpload.path === initialValue?.s3)) { - $fileUploads = [ - ...$fileUploads, - { - name: initialValue.filename, - size: 0, - progress: 100, - path: initialValue?.s3 - } - ] - } - } + interface Props { + acceptedFileTypes?: string[] | undefined + allowMultiple?: boolean + allowDelete?: boolean + folderOnly?: boolean + containerText?: string + customResourcePath?: string | undefined + customResourceType?: 's3' | 'azure_blob' | undefined // when customResourcePath is provided, this should be provided as well. Will default to S3 if not + customClass?: string + customStyle?: string + randomFileKey?: boolean + pathTransformer?: any // function taking as input {file: File} and returning a string + forceDisplayUploads?: boolean + defaultValue?: string | string[] | undefined + workspace?: string | undefined + fileUploads?: Writable + appPath?: string | undefined + disabled?: boolean + iconSize?: number | undefined + initialValue?: + | { + s3: string + filename: string + } + | { + s3: string + filename: string + }[] + | undefined + computeForceViewerPolicies?: + | (() => + | { + allowed_resources: string[] + allow_user_resources: boolean + allow_workspace_resource: boolean + file_key_regex: string + } + | undefined) + | undefined } - export let computeForceViewerPolicies: - | (() => - | { - allowed_resources: string[] - allow_user_resources: boolean - allow_workspace_resource: boolean - file_key_regex: string - } - | undefined) - | undefined = undefined + let { + acceptedFileTypes = ['*'], + allowMultiple = true, + allowDelete = true, + folderOnly = false, + containerText = folderOnly + ? 'Drag and drop a folder here or click to browse' + : allowMultiple + ? 'Drag and drop files here or click to browse' + : 'Drag and drop a file here or click to browse', + customResourcePath = undefined, + customResourceType = undefined, + customClass = '', + customStyle = '', + randomFileKey = false, + pathTransformer = undefined, + forceDisplayUploads = $bindable(false), + defaultValue = undefined, + workspace = undefined, + fileUploads = writable([]), + appPath = undefined, + disabled = false, + iconSize = undefined, + initialValue = undefined, + computeForceViewerPolicies = undefined + }: Props = $props() const dispatch = createEventDispatcher<{ addition: { path?: string; filename?: string } deletion: { path: string } }>() + let initialS3 = $derived( + Array.isArray(initialValue) + ? initialValue?.map((v) => v.s3) + : initialValue?.s3 + ? [initialValue?.s3] + : undefined + ) + init() + + function init() { + if (initialS3) { + function transform(initialValue: { s3: string; filename: string }) { + return { + name: initialValue.filename, + size: 0, + progress: 100, + path: initialValue?.s3 + } + } + for (const s3 of initialS3) { + if (!$fileUploads.find((fileUpload) => fileUpload.path === s3)) { + let initialFileUploads = initialValue + ? Array.isArray(initialValue) + ? initialValue.map(transform) + : [transform(initialValue)] + : [] + $fileUploads = [...$fileUploads, ...initialFileUploads] + } + } + } + } + type FileUploadData = { name: string size: number @@ -554,10 +596,10 @@ {containerText}{#if disabled}
(Disabled){/if} {/if} - {#if initialValue?.s3 && $fileUploads.length == 0} + {#if initialS3 && initialS3.length > 0 && $fileUploads.length == 0}
- File currently selected: {initialValue?.s3} + File currently selected: {initialS3?.join(', ')}
{/if} diff --git a/frontend/src/lib/components/propertyPicker/ObjectViewer.svelte b/frontend/src/lib/components/propertyPicker/ObjectViewer.svelte index c9f4fec930..97d541a673 100644 --- a/frontend/src/lib/components/propertyPicker/ObjectViewer.svelte +++ b/frontend/src/lib/components/propertyPicker/ObjectViewer.svelte @@ -34,7 +34,7 @@ level = 0, currentPath = '', pureViewer = false, - collapsed = $bindable((level != 0 && level % 3 == 0) || Array.isArray(json)), + collapsed = $bindable((level != 0 && level % 3 == 0) || (Array.isArray(json) && level != 0)), rawKey = false, topBrackets = false, allowCopy = true, @@ -205,6 +205,7 @@ {/if}
{/if} + {#if keys.length > 0} {#if !fullyCollapsed} From 80277d14d02e8e596c7002326946142226d382a6 Mon Sep 17 00:00:00 2001 From: Alexander Petric Date: Thu, 29 May 2025 12:52:00 -0400 Subject: [PATCH 504/739] fix: allow disable tabs for sidebar/accordion tabs (#5838) --- .../apps/components/layout/AppTabs.svelte | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/frontend/src/lib/components/apps/components/layout/AppTabs.svelte b/frontend/src/lib/components/apps/components/layout/AppTabs.svelte index c033165c69..977ccc69d9 100644 --- a/frontend/src/lib/components/apps/components/layout/AppTabs.svelte +++ b/frontend/src/lib/components/apps/components/layout/AppTabs.svelte @@ -151,10 +151,11 @@ )} style={css?.tabRow?.style} > - {#each tabs ?? [] as res} + {#each tabs ?? [] as res, index}
+ +
+ {/if} {#if !emptyStringTrimmed(gcp_resource_path) && !emptyStringTrimmed(topic_id)}
{ @@ -119,6 +132,7 @@ iconOnly /> {/if} - {#if !disableAi && customUi?.topBar?.aiBuilder != false} - + {#if !disableAi && customUi?.topBar?.aiBuilder != false && flowEditor?.getIsAiPanelClosed()} + flowEditor?.toggleAiPanel()} /> {/if} { @@ -1476,6 +970,7 @@ {#if $flowStateStore} 0} cmdEnterAction={async () => { await inferSchema(code) runTest() @@ -565,54 +561,57 @@
{#if lang && $copilotInfo.enabled} + {#snippet aiChatHeaderRight()} + {#if testPanelSize === 0} +
+
+
-
+ {#if !$enterpriseLicense} +
+ Agent workers are only available in the enterprise edition. For evaluation purposes, you can + only use the tag `agent_test` tag and it is limited to 100 jobs. +
+ {/if} +
+ { - navigator.clipboard.writeText(token) - sendUserToast('Copied to clipboard') + on:click|preventDefault|stopPropagation={() => { + if (token) { + navigator.clipboard.writeText(token) + sendUserToast('Copied to clipboard') + } }} - placeholder="Select tags to generate a jwt token" + placeholder="Select tags to generate a JWT token" type="text" disabled value={token} - class="pr-8 text-sm text-secondary" + class="w-full pr-10 pl-3 py-2 text-sm text-gray-600 bg-gray-50 border border-gray-300 rounded-lg cursor-pointer hover:bg-gray-100 transition truncate" /> + +
-
- Pass the env variables: -
    -
  • MODE=agent
  • -
  • AGENT_TOKEN={'""'}
  • -
  • BASE_INTERNAL_URL={'""'}
  • +
    + Set the following environment variables: +
      +
    • MODE=agent
    • +
    • AGENT_TOKEN=<token>
    • +
    • BASE_INTERNAL_URL=<base url>
    - to a worker to have it act as an HTTP agent worker. INIT_SCRIPT, if needed, must be passed as an - env variable. - -

    - Remember to have at least one normal worker that listens to the tags `flow` and `dependency` - (or `flow-$workspace` and `dependency-$workspace` if using workspace specific default tags) - to have flow and dependency job being runnable as agent workers can't run dependency jobs - nor can run the flow state machine (but can run the subjobs within them). +

    + to a worker to have it act as an HTTP agent worker. + INIT_SCRIPT, if needed, must be passed as an env variable.

    + + Ensure at least one normal worker is running and listening to the tags + flow and dependency + (or flow-<workspace> and dependency-<workspace> if + using workspace-specific default tags), because agent workers + cannot run dependency jobs + nor execute the + flow state machine. They can, however, run subjobs within flows. + + +
    + Use the following API endpoint with a superadmin bearer token: + POST /api/agent_workers/create_agent_token +
    +	{`
    +	  "worker_group": "agent",
    +	  "tags": ["tag1", "tag2"],
    +	  "exp": 1717334400
    +	`}
    +					
    + The JSON response will contain the generated JWT token. +
    +
    - - -
    - Use the following api endpoint with a superadmin bearer token: - POST /api/agent_workers/create_agent_token - with body: -
    -			
    -{`{
    -	"worker_group": "agent",
    -	"tags": ["tag1", "tag2"],
    -	"exp": 1717334400 // 3 years from now
    -}`}
    -					
    -				
    - JSON response will be the JWT token. -
    -
diff --git a/frontend/src/lib/components/SqlRepl.svelte b/frontend/src/lib/components/SqlRepl.svelte index 727334cf1d..e1b7ba8a85 100644 --- a/frontend/src/lib/components/SqlRepl.svelte +++ b/frontend/src/lib/components/SqlRepl.svelte @@ -41,7 +41,7 @@ import { CornerDownLeft } from 'lucide-svelte' import Button from './common/button/Button.svelte' import Editor from './Editor.svelte' - import { runPreviewJobAndPollResult } from './jobs/utils' + import { runScriptAndPollResult } from './jobs/utils' import { workspaceStore } from '$lib/stores' import { sendUserToast } from '$lib/toast' import { untrack } from 'svelte' @@ -91,7 +91,7 @@ .join(';') } - let { job, result } = (await runPreviewJobAndPollResult( + let { job, result } = (await runScriptAndPollResult( { workspace: $workspaceStore, requestBody: { diff --git a/frontend/src/lib/components/TagsToListenTo.svelte b/frontend/src/lib/components/TagsToListenTo.svelte index ce56a575e8..c80d12b2bb 100644 --- a/frontend/src/lib/components/TagsToListenTo.svelte +++ b/frontend/src/lib/components/TagsToListenTo.svelte @@ -1,47 +1,55 @@ -
- {#if worker_tags?.length == 0} +
+ {#if worker_tags?.length === 0}
No tags selected
{/if} + {#each worker_tags as tag} -
{tag}
+
+ {tag} {#if $superadmin && !disabled} - - {/if}
+ + {/if} +
{/each}
+ {#if $superadmin} -
+
{ - dispatch('focus') - }} + inputClassName="w-full text-sm bg-surface-primary border border-gray-300 rounded-md px-3 py-2 text-primary placeholder-secondary focus:outline-none" + dropdownClassName="!text-sm !py-2 !rounded-md !border-gray-200 !border !shadow-md bg-white" + className="w-full font-primary text-primary" + onFocus={() => dispatch('focus')} create - onCreate={(c) => { + onCreate={(c: string) => { createdTags.push(c) createdTags = [...createdTags] return c }} - createText="Press enter to use this tag" + createText="Press Enter to use this tag" /> -
-
+
+
{/if} diff --git a/frontend/src/lib/components/WorkerRepl.svelte b/frontend/src/lib/components/WorkerRepl.svelte new file mode 100644 index 0000000000..e49c8211a1 --- /dev/null +++ b/frontend/src/lib/components/WorkerRepl.svelte @@ -0,0 +1,289 @@ + + + + + + + {#if codeObj} + + {:else} + + {/if} + + + + + + {#if pick_existing == 'hub'} + + + + {:else} + + + + {/if} + + + +
+
+
+
+
+ + Full path + + + +
+ +
+
+ +
+
+
+
+
+ + +
+
+ +
+
+ + diff --git a/frontend/src/lib/components/apps/components/display/dbtable/utils.ts b/frontend/src/lib/components/apps/components/display/dbtable/utils.ts index 0c3fce722f..05b30ec1f2 100644 --- a/frontend/src/lib/components/apps/components/display/dbtable/utils.ts +++ b/frontend/src/lib/components/apps/components/display/dbtable/utils.ts @@ -8,7 +8,7 @@ import { } from 'graphql' import { tryEvery } from '$lib/utils' import { stringifySchema } from '$lib/components/copilot/lib' -import { runPreviewJobAndPollResult } from '$lib/components/jobs/utils' +import { runScriptAndPollResult } from '$lib/components/jobs/utils' export enum ColumnIdentity { ByDefault = 'By Default', @@ -114,7 +114,7 @@ export async function loadAllTablesMetaData( } try { - let result = (await runPreviewJobAndPollResult({ + let result = (await runScriptAndPollResult({ workspace: workspace, requestBody: { language: getLanguageByResourceType(resourceType), diff --git a/frontend/src/lib/components/dbOps.ts b/frontend/src/lib/components/dbOps.ts index ff37853a7a..7f68c67bfd 100644 --- a/frontend/src/lib/components/dbOps.ts +++ b/frontend/src/lib/components/dbOps.ts @@ -4,7 +4,7 @@ import { type DbType } from './apps/components/display/dbtable/utils' import { makeSelectQuery } from './apps/components/display/dbtable/queries/select' -import { runPreviewJobAndPollResult } from './jobs/utils' +import { runScriptAndPollResult } from './jobs/utils' import { makeCountQuery } from './apps/components/display/dbtable/queries/count' import { makeUpdateQuery } from './apps/components/display/dbtable/queries/update' import { makeDeleteQuery } from './apps/components/display/dbtable/queries/delete' @@ -55,7 +55,7 @@ export function dbTableOpsWithPreviewScripts({ colDefs, getCount: async ({ quicksearch }) => { const countQuery = makeCountQuery(resourceType, tableKey, undefined, colDefs) - const result = await runPreviewJobAndPollResult({ + const result = await runScriptAndPollResult({ workspace, requestBody: { args: { database: '$res:' + resourcePath, quicksearch }, @@ -68,7 +68,7 @@ export function dbTableOpsWithPreviewScripts({ }, getRows: async (params) => { const query = makeSelectQuery(tableKey, colDefs, undefined, resourceType as DbType) - let items = (await runPreviewJobAndPollResult({ + let items = (await runScriptAndPollResult({ workspace, requestBody: { args: { database: '$res:' + resourcePath, ...params }, @@ -85,7 +85,7 @@ export function dbTableOpsWithPreviewScripts({ onUpdate: async ({ values }, colDef, newValue) => { const updateQuery = makeUpdateQuery(tableKey, colDef, colDefs, resourceType) - await runPreviewJobAndPollResult({ + await runScriptAndPollResult({ workspace, requestBody: { args: { @@ -101,7 +101,7 @@ export function dbTableOpsWithPreviewScripts({ onDelete: async ({ values }) => { const deleteQuery = makeDeleteQuery(tableKey, colDefs, resourceType) - await runPreviewJobAndPollResult({ + await runScriptAndPollResult({ workspace, requestBody: { args: { database: '$res:' + resourcePath, ...values }, @@ -112,7 +112,7 @@ export function dbTableOpsWithPreviewScripts({ }, onInsert: async ({ values }) => { const insertQuery = makeInsertQuery(tableKey, colDefs, resourceType) - runPreviewJobAndPollResult({ + runScriptAndPollResult({ workspace, requestBody: { args: { database: '$res:' + resourcePath, ...values }, @@ -155,7 +155,7 @@ export function dbDeleteTableActionWithPreviewScript({ successText: `Table '${tableKey}' deleted successfully`, action: async () => { const deleteQuery = makeDeleteTableQuery(tableKey, resourceType) - await runPreviewJobAndPollResult({ + await runScriptAndPollResult({ workspace, requestBody: { args: { database: '$res:' + resourcePath }, diff --git a/frontend/src/lib/components/jobs/utils.ts b/frontend/src/lib/components/jobs/utils.ts index 018726bdef..6e5f570529 100644 --- a/frontend/src/lib/components/jobs/utils.ts +++ b/frontend/src/lib/components/jobs/utils.ts @@ -1,11 +1,15 @@ -import { JobService, type RunScriptPreviewData } from '$lib/gen' +import { JobService, type RunScriptByPathData, type RunScriptPreviewData } from '$lib/gen' -export async function runPreviewJobAndPollResult( - data: RunScriptPreviewData, + +function isRunScriptByPathData(arg:RunScriptPreviewData | RunScriptByPathData): arg is RunScriptByPathData { + return (arg as RunScriptByPathData).path !== undefined; +} + +export async function runScriptAndPollResult( + data: RunScriptPreviewData | RunScriptByPathData, { maxRetries = 7, withJobData }: { maxRetries?: number; withJobData?: boolean } = {} ): Promise { - const uuid = await JobService.runScriptPreview(data) - + const uuid = (isRunScriptByPathData(data) ? await JobService.runScriptByPath(data) : await JobService.runScriptPreview(data)) as string let attempts = 0 while (attempts < maxRetries) { try { diff --git a/frontend/src/lib/utils.ts b/frontend/src/lib/utils.ts index 6c2bde6431..36784aec76 100644 --- a/frontend/src/lib/utils.ts +++ b/frontend/src/lib/utils.ts @@ -11,7 +11,7 @@ import { deepEqual } from 'fast-equals' import YAML from 'yaml' import { type UserExt } from './stores' import { sendUserToast } from './toast' -import type { Job, Script } from './gen' +import type { Job, Script, ScriptLang } from './gen' import type { EnumType, SchemaProperty } from './common' import type { Schema } from './common' export { sendUserToast } @@ -22,10 +22,19 @@ import type { TriggerKind } from './components/triggers' export function isJobCancelable(j: Job): boolean { return j.type === 'QueuedJob' && !j.schedule_path && !j.canceled } + export function isJobReRunnable(j: Job): boolean { return (j.job_kind === 'script' || j.job_kind === 'flow') && j.parent_job === undefined } +export const WORKER_NAME_PREFIX = 'wk' +export const AGENT_WORKER_NAME_PREFIX = 'ag' +const SSH_AGENT_WORKER_SUFFIX = '/ssh' + +export function isAgentWorkerShell(workerName: string) { + return workerName.startsWith(AGENT_WORKER_NAME_PREFIX) && workerName.endsWith(SSH_AGENT_WORKER_SUFFIX) +} + export function isJobSelectable(selectionType: RunsSelectionMode) { const f: (j: Job) => boolean = { cancel: isJobCancelable, @@ -566,6 +575,10 @@ export function formatCron(inp: string): string { } } +export function scriptLangArrayToCommaList(languages: ScriptLang[]): string { + return languages.join(',') +} + export function cronV1toV2(inp: string): string { let splitted = inp.split(' ') splitted = splitted.filter(String) diff --git a/frontend/src/routes/(root)/(logged)/workers/+page.svelte b/frontend/src/routes/(root)/(logged)/workers/+page.svelte index 7844029664..7d2393dfbf 100644 --- a/frontend/src/routes/(root)/(logged)/workers/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/workers/+page.svelte @@ -1,7 +1,7 @@ {#if $superadmin} @@ -291,6 +301,24 @@ + + { + tag = '' + replForWorkerDrawer?.closeDrawer?.() + }} + > +
+ + If no command has been run in the past 2 minutes, the next one may take up to 15 seconds to + start. + + +
+
+
+ {#if $userStore?.operator && $workspaceStore && !$userWorkspaces.find((_) => _.id === $workspaceStore)?.operator_settings?.workers} - {#if workers} + {@const sshWorker = workers.find((worker) => { + return isAgentWorkerShell(worker.worker) && isWorkerMaybeAlive(worker.last_ping) + })?.worker} {#each workers as { worker, custom_tags, last_ping, started_at, jobs_executed, last_job_id, last_job_workspace_id, occupancy_rate_15s, occupancy_rate_5m, occupancy_rate_30m, occupancy_rate, wm_version, vcpus, memory, memory_usage, wm_memory_usage }} + {@const isWorkerAlive = isWorkerMaybeAlive(last_ping)} - {worker} + + {@const underscorePos = worker.search('_')} + {#if underscorePos === -1} + {worker} + {:else} + {truncate(worker, underscorePos)} + {worker} + {/if} + {#if custom_tags && custom_tags?.length > 2} {truncate(custom_tags?.join(', ') ?? '', 10)} @@ -652,21 +700,49 @@ {wm_version.split('-')[0]}{wm_version}
- + - {last_ping != undefined - ? last_ping < 60 + {isWorkerAlive != undefined + ? isWorkerAlive ? 'Alive' : 'Dead' : 'Unknown'} + + + {/each} {/if} From 825422c48456b2c9b230e1a35914b3fbf7d1e836 Mon Sep 17 00:00:00 2001 From: HugoCasa Date: Tue, 3 Jun 2025 19:14:40 +0200 Subject: [PATCH 518/739] feat: ai prompts improvements + o3/o4 support (#5862) * feat: ai prompts improvements + o3/o4 support * Update frontend/src/lib/components/copilot/chat/flow/core.ts Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> * Update frontend/src/lib/components/copilot/chat/script/core.ts Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> --------- Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> --- .../src/lib/components/ScriptEditor.svelte | 46 ++++++------- .../lib/components/copilot/chat/AIChat.svelte | 1 - .../lib/components/copilot/chat/flow/core.ts | 65 ++++++++++++++----- .../components/copilot/chat/script/core.ts | 22 ++++--- frontend/src/lib/components/copilot/lib.ts | 58 ++++++++++------- .../lib/components/flows/FlowEditor.svelte | 4 +- 6 files changed, 123 insertions(+), 73 deletions(-) diff --git a/frontend/src/lib/components/ScriptEditor.svelte b/frontend/src/lib/components/ScriptEditor.svelte index 1444a29a2f..d13dc4f3d1 100644 --- a/frontend/src/lib/components/ScriptEditor.svelte +++ b/frontend/src/lib/components/ScriptEditor.svelte @@ -591,28 +591,30 @@ }} /> {/snippet} - - { - hideDiffMode() - editor?.reviewAndApplyCode(code) - }} - {showDiffMode} - headerLeft={aiChatHeaderLeft} - headerRight={aiChatHeaderRight} - /> - + {#if aiPanelSize > 0} + + { + hideDiffMode() + editor?.reviewAndApplyCode(code) + }} + {showDiffMode} + headerLeft={aiChatHeaderLeft} + headerRight={aiChatHeaderRight} + /> + + {/if} {/if}
diff --git a/frontend/src/lib/components/copilot/chat/AIChat.svelte b/frontend/src/lib/components/copilot/chat/AIChat.svelte index c60a7586cc..5302697416 100644 --- a/frontend/src/lib/components/copilot/chat/AIChat.svelte +++ b/frontend/src/lib/components/copilot/chat/AIChat.svelte @@ -172,7 +172,6 @@ displayMessages = [...displayMessages, { role: 'tool', tool_call_id: id, content }] }, onFinishToolCall: (id, content) => { - console.log('onFinishToolCall', id, content) const existingIdx = displayMessages.findIndex( (m) => m.role === 'tool' && m.tool_call_id === id ) diff --git a/frontend/src/lib/components/copilot/chat/flow/core.ts b/frontend/src/lib/components/copilot/chat/flow/core.ts index 0ac85c636e..365ecaee61 100644 --- a/frontend/src/lib/components/copilot/chat/flow/core.ts +++ b/frontend/src/lib/components/copilot/chat/flow/core.ts @@ -61,29 +61,29 @@ const newStepSchema = z.union([ 'The language to use for the code, default to bun if none specified' ) }) - .describe('Add a raw script step after the given step id'), + .describe('Add a raw script step at the specified location'), z .object({ type: z.literal('script'), path: z.string().describe('The path of the script to use for the step.') }) - .describe('Add a script step after the given step id'), + .describe('Add a script step at the specified location'), z .object({ type: z.literal('forloop') }) - .describe('Add a for loop after the given step id'), + .describe('Add a for loop at the specified location'), z .object({ type: z.literal('branchall') }) - .describe('Add a branch all after the given step id: all branches will be executed'), + .describe('Add a branch all at the specified location: all branches will be executed'), z .object({ type: z.literal('branchone') }) .describe( - 'Add a branch one after the given step id: only the first branch that evaluates to true will be executed' + 'Add a branch one at the specified location: only the first branch that evaluates to true will be executed' ) ]) @@ -148,7 +148,7 @@ const addStepSchema = z.object({ const addStepToolDef = createToolDef( addStepSchema, 'add_step', - 'Add a step after the given step id' + 'Add a step at the specified location' ) const removeStepSchema = z.object({ @@ -314,6 +314,17 @@ const resourceTypeToolDef = createToolDef( 'Search for resource types' ) +const getInstructionsForCodeGenerationToolSchema = z.object({ + id: z.string().describe('The id of the step to generate code for'), + language: langSchema.describe('The programming language the code will be written in') +}) + +const getInstructionsForCodeGenerationToolDef = createToolDef( + getInstructionsForCodeGenerationToolSchema, + 'get_instructions_for_code_generation', + 'Get instructions for code generation for a raw script step' +) + const workspaceScriptsSearch = new WorkspaceScriptsSearch() export const flowTools: Tool[] = [ @@ -377,11 +388,7 @@ export const flowTools: Tool[] = [ toolCallbacks.onFinishToolCall(toolId, `Added step '${id}'`) if (parsedArgs.step.type === 'rawscript') { - const langContext = getLangContext(parsedArgs.step.language, { - allowResourcesFetch: true, - isPreprocessor: parsedArgs.location.type === 'preprocessor' - }) - return `Step ${id} added, here is some additional instructions to help you write the code:\n${langContext}` + return `Step ${id} added. Here is the updated flow, make sure to take it into account when adding another step:\n${YAML.stringify(helpers.getModules())}` } else { if ( parsedArgs.location.type === 'start_inside_branch' || @@ -440,6 +447,21 @@ export const flowTools: Tool[] = [ return `Flow inputs schema set. New schema:\n${JSON.stringify(updatedSchema)}` } }, + { + def: getInstructionsForCodeGenerationToolDef, + fn: async ({ args, toolId, toolCallbacks }) => { + const parsedArgs = getInstructionsForCodeGenerationToolSchema.parse(args) + const langContext = getLangContext(parsedArgs.language, { + allowResourcesFetch: true, + isPreprocessor: parsedArgs.id === 'preprocessor' + }) + toolCallbacks.onFinishToolCall( + toolId, + 'Retrieved instructions for code generation in ' + parsedArgs.language + ) + return langContext + } + }, { def: setCodeToolDef, fn: async ({ args, helpers, toolId, toolCallbacks }) => { @@ -500,14 +522,17 @@ export const flowTools: Tool[] = [ { def: resourceTypeToolDef, fn: async ({ args, toolId, workspace, toolCallbacks }) => { - toolCallbacks.onToolCall(toolId, 'Searching resource types...') const parsedArgs = resourceTypeToolSchema.parse(args) + toolCallbacks.onToolCall(toolId, 'Searching resource types for "' + parsedArgs.query + '"...') const formattedResourceTypes = await getFormattedResourceTypes( parsedArgs.language, parsedArgs.query, workspace ) - toolCallbacks.onFinishToolCall(toolId, 'Retrieved resource types') + toolCallbacks.onFinishToolCall( + toolId, + 'Retrieved resource types for "' + parsedArgs.query + '"' + ) return formattedResourceTypes } } @@ -544,8 +569,10 @@ export function prepareFlowSystemMessage(): { content: string } { const content = `You are a helpful assitant that creates and edit workflows on the Windmill platform. You're provided with a a bunch of tools to help you edit the flow. -Describe all steps you take to edit the flow before calling the tools. -Follow the user instructions carefully and take note of the following: +Follow the user instructions carefully. +Go step by step, and explain what you're doing as you're doing it. +DO NOT wait for user confirmation before performing an action. Only do it if the user explicitly asks you to wait in their initial instructions. +Take note of the following: ## Flow editor @@ -555,7 +582,10 @@ You can add a script step in different ways: - from a script in the hub - a raw script: create an empty step and write the code directly -When adding a raw script step, you will get back some special instructions to help you write the code. Make sure to follow them carefully. Also, make sure to display the code to the user before setting it. +When generating code for a raw script step, you should make sure it's in the correct format for Windmill. Format varies depending on the language and on the type of step (preprocessor or not). Use the get_instructions_for_code_generation tool to get instructions to help you write the code. Make sure to follow them carefully. DO NOT tell the user you're using this specific tool, just use it. +Also, make sure to display the code to the user before setting it. + +Unless the user explicitly specifies how the script should be created (e.g., from the workspace, from the hub, or as a new one), whenever they ask you to add a script step, you must first check for matching scripts in the workspace and the hub. If no suitable script is found, create a raw script step and write the necessary code directly. Once you've added a new step and set the path or written the code, you should use the get_step_inputs tool to get the current/possible inputs for the step and set the step input values using the set_step_inputs tool. Step input keys and types are automatically inferred from the code. @@ -565,6 +595,9 @@ If you use flow_input in the step inputs, make sure to add the missing propertie You can add branchone/branchall and forloops to the flow. Make sure to set the predicates for the branches (of branchone only) and the iterator expression for the forloops. You can also add or remove branches. +### Adding multiple steps +After adding a step, make sure to consider the updated flow when adding another step so that the step is added in the right place. + ### Flow inputs schema You can use the set_flow_inputs_schema tool to set the flow inputs schema. diff --git a/frontend/src/lib/components/copilot/chat/script/core.ts b/frontend/src/lib/components/copilot/chat/script/core.ts index 9eacc7e41b..89aeaea244 100644 --- a/frontend/src/lib/components/copilot/chat/script/core.ts +++ b/frontend/src/lib/components/copilot/chat/script/core.ts @@ -55,7 +55,7 @@ const TS_RESOURCE_TYPE_SYSTEM = `On Windmill, credentials and configuration are If you need credentials, you should add a parameter to \`main\` with the corresponding resource type inside the \`RT\` namespace: for instance \`RT.Stripe\`. You should only use them if you need them to satisfy the user's instructions. Always use the RT namespace.\n` -const TS_INLINE_TYPE_INSTRUCTION = `You must always inline the objects types instead of defining them separately. If INSTRUCTIONS ask you to use an already defined type **apart from the RT namespace**, you MUST inline it instead of using the type name. Explain to the user that you are inlining the type for better arguments inference.` +const TS_INLINE_TYPE_INSTRUCTION = `When using resource types, you should use RT.ResourceType as parameter type. For other parameters, you should inline the objects types instead of defining them separately. This is because Windmill requires the types (other than resource types) to be inlined to generate a user friendly UI from the parameters.` const PYTHON_RESOURCE_TYPE_SYSTEM = `On Windmill, credentials and configuration are stored in resources and passed as parameters to main. If you need credentials, you should add a parameter to \`main\` with the corresponding resource type. @@ -119,7 +119,7 @@ export function getLangContext( ? TS_PREPROCESSOR_INSTRUCTION : TS_RESOURCE_TYPE_SYSTEM + (allowResourcesFetch - ? `To query the RT namespace, you can use the \`search_resource_types\` function.\n` + ? `To query the RT namespace, you can use the \`search_resource_types\` tool.\n` : '')) + TS_INLINE_TYPE_INSTRUCTION const mainFunctionName = isPreprocessor ? 'preprocessor' : 'main' @@ -143,16 +143,18 @@ export function getLangContext( '\nYou can import deno libraries or you can import npm libraries like that: `import ... from "npm:{package}";`.' ) case 'python3': - return `The user is coding in Python. On Windmill, it is expected the script contains at least one function called \`${mainFunctionName}\`. Do not call the ${mainFunctionName} function. Libraries are installed automatically, do not show how to install them.` + - isPreprocessor - ? PYTHON_PREPROCESSOR_INSTRUCTION - : PYTHON_RESOURCE_TYPE_SYSTEM + - `${allowResourcesFetch ? `\nTo query the available resource types, you can use the \`search_resource_types\` function.` : ''}` + return ( + `The user is coding in Python. On Windmill, it is expected the script contains at least one function called \`${mainFunctionName}\`. Do not call the ${mainFunctionName} function. Libraries are installed automatically, do not show how to install them.` + + (isPreprocessor + ? PYTHON_PREPROCESSOR_INSTRUCTION + : PYTHON_RESOURCE_TYPE_SYSTEM + + `${allowResourcesFetch ? `\nTo query the available resource types, you can use the \`search_resource_types\` tool.` : ''}`) + ) case 'php': return ( 'The user is coding in PHP. On Windmill, it is expected the script contains at least one function called `main`. The script must start with = { def: RESOURCE_TYPE_FUNCTION_DEF, fn: async ({ args, workspace, helpers, toolCallbacks, toolId }) => { - toolCallbacks.onToolCall(toolId, 'Searching resource types...') + toolCallbacks.onToolCall(toolId, 'Searching resource types for "' + args.query + '"...') const formattedResourceTypes = await getFormattedResourceTypes( helpers.getLang(), args.query, workspace ) - toolCallbacks.onFinishToolCall(toolId, 'Retrieved resource types') + toolCallbacks.onFinishToolCall(toolId, 'Retrieved resource types for "' + args.query + '"') return formattedResourceTypes } } diff --git a/frontend/src/lib/components/copilot/lib.ts b/frontend/src/lib/components/copilot/lib.ts index d11e160fcf..c91554b021 100644 --- a/frontend/src/lib/components/copilot/lib.ts +++ b/frontend/src/lib/components/copilot/lib.ts @@ -23,14 +23,9 @@ export const SUPPORTED_LANGUAGES = new Set(Object.keys(GEN_CONFIG.prompts)) // need at least one model for each provider except customai export const AI_DEFAULT_MODELS: Record = { - openai: ['gpt-4o', 'gpt-4o-mini'], + openai: ['gpt-4o', 'gpt-4.1', 'gpt-4o-mini', 'o4-mini', 'o3', 'o3-mini'], azure_openai: ['gpt-4o', 'gpt-4o-mini'], - anthropic: [ - 'claude-3-7-sonnet-latest', - 'claude-3-7-sonnet-latest/thinking', - 'claude-3-5-haiku-latest', - 'claude-3-5-sonnet-latest' - ], + anthropic: ['claude-sonnet-4-0', 'claude-sonnet-4-0/thinking', 'claude-3-5-haiku-latest'], mistral: ['codestral-latest'], deepseek: ['deepseek-chat', 'deepseek-reasoner'], googleai: ['gemini-1.5-pro', 'gemini-2.0-flash', 'gemini-1.5-flash'], @@ -41,7 +36,9 @@ export const AI_DEFAULT_MODELS: Record = { } function getModelMaxTokens(model: string) { - if (model.startsWith('gpt-4o') || model.startsWith('codestral')) { + if (model.startsWith('gpt-4.1')) { + return 32768 + } else if (model.startsWith('gpt-4o') || model.startsWith('codestral')) { return 16384 } else if (model.startsWith('gpt-4-turbo') || model.startsWith('gpt-3.5')) { return 4096 @@ -49,6 +46,36 @@ function getModelMaxTokens(model: string) { return 8192 } +function getModelSpecificConfig( + modelProvider: AIProviderModel, + tools?: OpenAI.Chat.Completions.ChatCompletionTool[] +) { + if (modelProvider.provider === 'openai' && modelProvider.model.startsWith('o')) { + return { + model: modelProvider.model, + ...(tools && tools.length > 0 ? { tools } : {}), + max_completion_tokens: 100000 + } + } else { + return { + ...(modelProvider.model.endsWith('/thinking') + ? { + thinking: { + type: 'enabled', + budget_tokens: 1024 + }, + model: modelProvider.model.slice(0, -9) + } + : { + model: modelProvider.model, + temperature: 0, + ...(tools && tools.length > 0 ? { tools } : {}) + }), + max_completion_tokens: getModelMaxTokens(modelProvider.model) + } + } +} + function prepareMessages(aiProvider: AIProvider, messages: ChatCompletionMessageParam[]) { switch (aiProvider) { case 'googleai': @@ -374,20 +401,7 @@ function getProviderAndCompletionConfig({ provider: modelProvider.provider, config: { ...providerConfig, - ...(modelProvider.model.endsWith('/thinking') - ? { - thinking: { - type: 'enabled', - budget_tokens: 1024 - }, - model: modelProvider.model.slice(0, -9) - } - : { - model: modelProvider.model, - temperature: 0, - ...(tools && tools.length > 0 ? { tools } : {}) - }), - max_tokens: getModelMaxTokens(modelProvider.model), + ...getModelSpecificConfig(modelProvider, tools), messages: processedMessages, stream } as any diff --git a/frontend/src/lib/components/flows/FlowEditor.svelte b/frontend/src/lib/components/flows/FlowEditor.svelte index 0db949d9d0..ef9c5efbba 100644 --- a/frontend/src/lib/components/flows/FlowEditor.svelte +++ b/frontend/src/lib/components/flows/FlowEditor.svelte @@ -144,7 +144,7 @@ /> {/if} - {#if !disableAi} + {#if !disableAi && aiPanelSize > 0} {#snippet aiChatHeaderLeft()}
+
+ + + +
{:else} diff --git a/frontend/src/routes/(root)/(logged)/+page.svelte b/frontend/src/routes/(root)/(logged)/+page.svelte index 784716770d..bfba2b4744 100644 --- a/frontend/src/routes/(root)/(logged)/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/+page.svelte @@ -214,7 +214,7 @@
-
+
{#if $workspaceStore == 'admins'}
@@ -227,7 +227,7 @@
{#if !$userStore?.operator} Create a - + {#if HOME_SHOW_CREATE_FLOW}{/if} {#if HOME_SHOW_CREATE_APP}{/if} {/if} diff --git a/frontend/src/routes/(root)/(logged)/resources/+page.svelte b/frontend/src/routes/(root)/(logged)/resources/+page.svelte index 5816ba85f9..05fa69eba7 100644 --- a/frontend/src/routes/(root)/(logged)/resources/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/resources/+page.svelte @@ -616,10 +616,23 @@ documentationLink="https://www.windmill.dev/docs/core_concepts/resources_and_types" >
- -
diff --git a/frontend/src/routes/(root)/(logged)/schedules/+page.svelte b/frontend/src/routes/(root)/(logged)/schedules/+page.svelte index ec1feb8aff..4b59add981 100644 --- a/frontend/src/routes/(root)/(logged)/schedules/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/schedules/+page.svelte @@ -256,8 +256,14 @@ tooltip="Trigger Scripts and Flows according to a cron schedule" documentationLink="https://www.windmill.dev/docs/core_concepts/scheduling" > -
diff --git a/frontend/src/routes/(root)/(logged)/workspace_settings/+page.svelte b/frontend/src/routes/(root)/(logged)/workspace_settings/+page.svelte index 77593756cc..539018a5ab 100644 --- a/frontend/src/routes/(root)/(logged)/workspace_settings/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/workspace_settings/+page.svelte @@ -644,46 +644,106 @@ goto(`?${$page.url.searchParams.toString()}`) }} > - +
Users
- +
Git Sync
- +
Deployment UI
{#if WORKSPACE_SHOW_SLACK_CMD} - +
Slack / Teams
{/if} {#if isCloudHosted()} - +
Premium Plans
{/if} {#if WORKSPACE_SHOW_WEBHOOK_CLI_SYNC} - +
Webhook
{/if} - +
Error Handler
- +
Windmill AI
- +
Object Storage (S3)
- +
Default App
- +
Encryption
- +
General
From 6d3a2d279a3150dc14fa00032e6eecb2d2dc1f71 Mon Sep 17 00:00:00 2001 From: Alexander Petric Date: Thu, 5 Jun 2025 03:30:23 -0400 Subject: [PATCH 524/739] invalidate auth cache when logging out (#5869) * invalidate auth cache when logging out * use proper sqlx migrate add * formatting * pg notify on token, not email --- ...604181226_auth_cache_invalidation.down.sql | 4 +++ ...50604181226_auth_cache_invalidation.up.sql | 17 ++++++++++++ backend/src/main.rs | 9 +++++-- backend/windmill-api/src/auth.rs | 26 ++++++++++++++----- backend/windmill-api/src/lib.rs | 2 +- 5 files changed, 48 insertions(+), 10 deletions(-) create mode 100644 backend/migrations/20250604181226_auth_cache_invalidation.down.sql create mode 100644 backend/migrations/20250604181226_auth_cache_invalidation.up.sql diff --git a/backend/migrations/20250604181226_auth_cache_invalidation.down.sql b/backend/migrations/20250604181226_auth_cache_invalidation.down.sql new file mode 100644 index 0000000000..b7f0f12204 --- /dev/null +++ b/backend/migrations/20250604181226_auth_cache_invalidation.down.sql @@ -0,0 +1,4 @@ +-- Remove token invalidation notification trigger + +DROP TRIGGER IF EXISTS token_invalidation_trigger ON token; +DROP FUNCTION IF EXISTS notify_token_invalidation(); diff --git a/backend/migrations/20250604181226_auth_cache_invalidation.up.sql b/backend/migrations/20250604181226_auth_cache_invalidation.up.sql new file mode 100644 index 0000000000..11be3961c0 --- /dev/null +++ b/backend/migrations/20250604181226_auth_cache_invalidation.up.sql @@ -0,0 +1,17 @@ +-- Add token invalidation notification trigger + +CREATE OR REPLACE FUNCTION notify_token_invalidation() +RETURNS TRIGGER AS $$ +BEGIN + -- Only notify for session token deletions when the invalidation settings are enabled + IF OLD.label = 'session' AND OLD.email IS NOT NULL THEN + PERFORM pg_notify('notify_token_invalidation', OLD.token); + END IF; + RETURN OLD; +END; +$$ LANGUAGE plpgsql; + +CREATE TRIGGER token_invalidation_trigger +AFTER DELETE ON token +FOR EACH ROW +EXECUTE FUNCTION notify_token_invalidation(); diff --git a/backend/src/main.rs b/backend/src/main.rs index f99f9c7b27..d9283f6d9c 100644 --- a/backend/src/main.rs +++ b/backend/src/main.rs @@ -861,6 +861,11 @@ Windmill Community Edition {GIT_VERSION} } }; }, + "notify_token_invalidation" => { + let token = n.payload(); + tracing::info!("Token invalidation detected for token: {}...", &token[..token.len().min(8)]); + windmill_api::auth::invalidate_token_from_cache(token); + }, "notify_global_setting_change" => { tracing::info!("Global setting change detected: {}", n.payload()); match n.payload() { @@ -893,7 +898,7 @@ Windmill Community Edition {GIT_VERSION} if let Err(e) = load_tag_per_workspace_workspaces(&db).await { tracing::error!("Error loading default tag per workspace workspaces: {e:#}"); } - } + }, SMTP_SETTING => { reload_smtp_config(&db).await; }, @@ -1010,7 +1015,6 @@ Windmill Community Edition {GIT_VERSION} tracing::error!(error = %e, "Could not reload critical alert UI setting"); } }, - a @_ => { tracing::info!("Unrecognized Global Setting Change Payload: {:?}", a); } @@ -1183,6 +1187,7 @@ async fn listen_pg(url: &str) -> Option { "notify_webhook_change", "notify_workspace_envs_change", "notify_runnable_version_change", + "notify_token_invalidation", ]; #[cfg(feature = "http_trigger")] diff --git a/backend/windmill-api/src/auth.rs b/backend/windmill-api/src/auth.rs index 25dc0efd4a..6af5ea1e50 100644 --- a/backend/windmill-api/src/auth.rs +++ b/backend/windmill-api/src/auth.rs @@ -26,6 +26,20 @@ use windmill_common::{ users::{COOKIE_NAME, SUPERADMIN_SECRET_EMAIL}, }; +lazy_static::lazy_static! { + // Global auth cache accessible from main.rs for direct invalidation + pub static ref AUTH_CACHE: Cache<(String, String), ExpiringAuthCache> = Cache::new(300); +} + +// Global function to invalidate a specific token from cache +pub fn invalidate_token_from_cache(token: &str) { + // Remove all cache entries for this token (across all workspaces) + AUTH_CACHE.retain(|(_workspace_id, cached_token), _cached_value| { + cached_token != token + }); + tracing::info!("Invalidated token from auth cache: {}...", &token[..token.len().min(8)]); +} + #[derive(Clone)] pub struct ExpiringAuthCache { pub authed: ApiAuthed, @@ -33,7 +47,6 @@ pub struct ExpiringAuthCache { } pub struct AuthCache { - cache: Cache<(String, String), ExpiringAuthCache>, db: DB, superadmin_secret: Option, #[cfg(feature = "enterprise")] @@ -47,7 +60,6 @@ impl AuthCache { #[cfg(feature = "enterprise")] ext_jwks: Option>>, ) -> Self { AuthCache { - cache: Cache::new(300), db, superadmin_secret, #[cfg(feature = "enterprise")] @@ -56,7 +68,7 @@ impl AuthCache { } pub async fn invalidate(&self, w_id: &str, token: String) { - self.cache.remove(&(w_id.to_string(), token)); + AUTH_CACHE.remove(&(w_id.to_string(), token)); } pub async fn get_authed(&self, w_id: Option, token: &str) -> Option { @@ -64,7 +76,7 @@ impl AuthCache { w_id.as_ref().unwrap_or(&"".to_string()).to_string(), token.to_string(), ); - let s = self.cache.get(&key).map(|c| c.to_owned()); + let s = AUTH_CACHE.get(&key).map(|c| c.to_owned()); match s { Some(ExpiringAuthCache { authed, expiry }) if expiry > chrono::Utc::now() => { Some(authed) @@ -86,7 +98,7 @@ impl AuthCache { }; if let Some((authed, exp)) = authed_and_exp.clone() { - self.cache.insert( + AUTH_CACHE.insert( key, ExpiringAuthCache { authed: authed.clone(), @@ -123,7 +135,7 @@ impl AuthCache { username_override, }; - self.cache.insert( + AUTH_CACHE.insert( key, ExpiringAuthCache { authed: authed.clone(), @@ -317,7 +329,7 @@ impl AuthCache { } }; if let Some(authed) = authed_o.as_ref() { - self.cache.insert( + AUTH_CACHE.insert( key, ExpiringAuthCache { authed: authed.clone(), diff --git a/backend/windmill-api/src/lib.rs b/backend/windmill-api/src/lib.rs index 19b17e4d9d..8a42902508 100644 --- a/backend/windmill-api/src/lib.rs +++ b/backend/windmill-api/src/lib.rs @@ -69,7 +69,7 @@ mod ai; mod apps; pub mod args; mod audit; -mod auth; +pub mod auth; mod capture; mod concurrency_groups; mod configs; From 39b250d62cea0ca70593d36a17dfda648c048904 Mon Sep 17 00:00:00 2001 From: centdix <40307056+centdix@users.noreply.github.com> Date: Thu, 5 Jun 2025 09:52:02 +0200 Subject: [PATCH 525/739] Layout and design issues (#5870) --- backend/ee-repo-ref.txt | 2 +- frontend/src/lib/components/DropdownV2.svelte | 69 +++++++++---------- .../src/lib/components/ScriptEditor.svelte | 8 ++- .../editor/settingsPanel/HideButton.svelte | 14 ++-- .../components/common/button/Button.svelte | 2 +- .../components/common/drawer/Drawer.svelte | 2 +- .../lib/components/copilot/chat/AIChat.svelte | 23 ++++--- .../copilot/chat/AIChatDisplay.svelte | 8 ++- .../copilot/chat/flow/FlowAIButton.svelte | 3 +- .../copilot/chat/navigator/GlobalChat.svelte | 20 ------ .../components/icons/WindmillAiIcon.svelte | 38 ++++++++++ .../lib/components/sidebar/MenuButton.svelte | 2 + .../src/routes/(root)/(logged)/+layout.svelte | 15 +++- 13 files changed, 124 insertions(+), 82 deletions(-) delete mode 100644 frontend/src/lib/components/copilot/chat/navigator/GlobalChat.svelte create mode 100644 frontend/src/lib/components/icons/WindmillAiIcon.svelte diff --git a/backend/ee-repo-ref.txt b/backend/ee-repo-ref.txt index 2b9245ca57..9bf13ff786 100644 --- a/backend/ee-repo-ref.txt +++ b/backend/ee-repo-ref.txt @@ -1 +1 @@ -41ada2b5729da20e7c0c90ceb06324d804136c6f \ No newline at end of file +d2cf3a77ec5914339756d06a117f47db8d09b797 \ No newline at end of file diff --git a/frontend/src/lib/components/DropdownV2.svelte b/frontend/src/lib/components/DropdownV2.svelte index 39e4cb7dab..a41ef9e50e 100644 --- a/frontend/src/lib/components/DropdownV2.svelte +++ b/frontend/src/lib/components/DropdownV2.svelte @@ -81,43 +81,38 @@ - buttonEl?.click()}> - - + buttonEl?.click()} /> + {#if open && !hidePopup}
diff --git a/frontend/src/lib/components/ScriptEditor.svelte b/frontend/src/lib/components/ScriptEditor.svelte index 896a9d4d35..9fb0098bb9 100644 --- a/frontend/src/lib/components/ScriptEditor.svelte +++ b/frontend/src/lib/components/ScriptEditor.svelte @@ -473,7 +473,9 @@ size="md" panelName="Test" shortcut="U" - customHiddenIcon={PlayIcon} + customHiddenIcon={{ + icon: PlayIcon + }} on:click={() => { toggleTestPanel() }} @@ -490,7 +492,9 @@ shortcut="L" size="md" usePopoverOverride={!$copilotInfo.enabled} - customHiddenIcon={WandSparkles} + customHiddenIcon={{ + icon: WandSparkles + }} btnClasses="!text-violet-800 dark:!text-violet-400 border border-gray-200 dark:border-gray-600 bg-surface" on:click={() => { aiChatManager.toggleOpen() diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/HideButton.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/HideButton.svelte index f473894312..341c93c04f 100644 --- a/frontend/src/lib/components/apps/editor/settingsPanel/HideButton.svelte +++ b/frontend/src/lib/components/apps/editor/settingsPanel/HideButton.svelte @@ -4,7 +4,6 @@ import Button from '$lib/components/common/button/Button.svelte' import { getModifierKey } from '$lib/utils' import { - type Icon, PanelBottomClose, PanelBottomOpen, PanelLeftClose, @@ -12,7 +11,6 @@ PanelRightClose, PanelRightOpen } from 'lucide-svelte' - import type { ComponentType } from 'svelte' import { twMerge } from 'tailwind-merge' export let btnClasses: string | undefined = undefined @@ -24,7 +22,7 @@ export let hidden: boolean = false export let shortcut: string | undefined = undefined export let panelName: string | undefined = undefined - export let customHiddenIcon: ComponentType | undefined = undefined + export let customHiddenIcon: ButtonType.Icon | undefined = undefined export let usePopoverOverride: boolean = false const OpenIconMap = { @@ -62,9 +60,13 @@
{/if} - +
- +
From 09bb027294dfe23eefd9c2da55ee040658583245 Mon Sep 17 00:00:00 2001 From: wendrul <53628737+wendrul@users.noreply.github.com> Date: Thu, 5 Jun 2025 10:54:50 +0200 Subject: [PATCH 526/739] debug: Add more tracing lines for indexer + fix mistyped field (#5871) --- backend/ee-repo-ref.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/ee-repo-ref.txt b/backend/ee-repo-ref.txt index 9bf13ff786..fe8033ab6e 100644 --- a/backend/ee-repo-ref.txt +++ b/backend/ee-repo-ref.txt @@ -1 +1 @@ -d2cf3a77ec5914339756d06a117f47db8d09b797 \ No newline at end of file +ab4f856708a056973faea19f10eda5efff546176 From 4c4d8a655cf6f9da5150f6c4583ec70de2062d6d Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 5 Jun 2025 15:36:10 +0200 Subject: [PATCH 527/739] usage query on cloud is in bg --- backend/windmill-queue/src/jobs.rs | 42 ++++++++++++++++-------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/backend/windmill-queue/src/jobs.rs b/backend/windmill-queue/src/jobs.rs index 589119160f..a84890d452 100644 --- a/backend/windmill-queue/src/jobs.rs +++ b/backend/windmill-queue/src/jobs.rs @@ -1011,33 +1011,37 @@ pub async fn add_completed_job( #[cfg(feature = "cloud")] if *CLOUD_HOSTED && !queued_job.is_flow() && _duration > 1000 { - let additional_usage = _duration / 1000; - let w_id = &queued_job.workspace_id; - let premium_workspace = windmill_common::workspaces::is_premium_workspace(db, w_id).await; - let _ = sqlx::query!( - "INSERT INTO usage (id, is_workspace, month_, usage) - VALUES ($1, TRUE, EXTRACT(YEAR FROM current_date) * 12 + EXTRACT(MONTH FROM current_date), $2) - ON CONFLICT (id, is_workspace, month_) DO UPDATE SET usage = usage.usage + $2", - w_id, - additional_usage as i32 - ) - .execute(db) - .await - .map_err(|e| Error::internal_err(format!("updating usage: {e:#}"))); - - if !premium_workspace { + let db = db.clone(); + let workspace_id = queued_job.workspace_id.clone(); + let permissioned_as_email = queued_job.permissioned_as_email.clone(); + tokio::task::spawn(async move { + let additional_usage = _duration / 1000; + let premium_workspace = windmill_common::workspaces::is_premium_workspace(&db, &workspace_id).await; let _ = sqlx::query!( "INSERT INTO usage (id, is_workspace, month_, usage) - VALUES ($1, FALSE, EXTRACT(YEAR FROM current_date) * 12 + EXTRACT(MONTH FROM current_date), $2) + VALUES ($1, TRUE, EXTRACT(YEAR FROM current_date) * 12 + EXTRACT(MONTH FROM current_date), $2) ON CONFLICT (id, is_workspace, month_) DO UPDATE SET usage = usage.usage + $2", - queued_job.permissioned_as_email, + workspace_id, additional_usage as i32 ) - .execute(db) + .execute(&db) .await .map_err(|e| Error::internal_err(format!("updating usage: {e:#}"))); - } + + if !premium_workspace { + let _ = sqlx::query!( + "INSERT INTO usage (id, is_workspace, month_, usage) + VALUES ($1, FALSE, EXTRACT(YEAR FROM current_date) * 12 + EXTRACT(MONTH FROM current_date), $2) + ON CONFLICT (id, is_workspace, month_) DO UPDATE SET usage = usage.usage + $2", + permissioned_as_email, + additional_usage as i32 + ) + .execute(&db) + .await + .map_err(|e| Error::internal_err(format!("updating usage: {e:#}"))); + }}); } + #[cfg(feature = "enterprise")] if !success { From d86dcc6354f11ef683b61dc263213f0926cd35c5 Mon Sep 17 00:00:00 2001 From: centdix <40307056+centdix@users.noreply.github.com> Date: Thu, 5 Jun 2025 16:11:03 +0200 Subject: [PATCH 528/739] Fix menu button on mobile + show accept all when code is applied from script chat (#5872) * fix menu button on mobile * show accept all when code is applied from script chat * fix --- .../components/copilot/chat/AIChatManager.svelte.ts | 1 + .../src/lib/components/copilot/chat/monaco-adapter.ts | 11 ++++++----- .../components/copilot/chat/script/CodeDisplay.svelte | 4 ++-- frontend/src/routes/(root)/(logged)/+layout.svelte | 2 +- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/frontend/src/lib/components/copilot/chat/AIChatManager.svelte.ts b/frontend/src/lib/components/copilot/chat/AIChatManager.svelte.ts index d17f2cf6f7..ed7f25acd5 100644 --- a/frontend/src/lib/components/copilot/chat/AIChatManager.svelte.ts +++ b/frontend/src/lib/components/copilot/chat/AIChatManager.svelte.ts @@ -67,6 +67,7 @@ class AIChatManager { scriptEditorShowDiffMode = $state<(() => void) | undefined>(undefined) flowAiChatHelpers = $state(undefined) mode = $state<'script' | 'flow' | 'navigator'>('navigator') + pendingNewCode = $state(undefined) allowedModes = $derived({ script: this.scriptEditorOptions !== undefined, diff --git a/frontend/src/lib/components/copilot/chat/monaco-adapter.ts b/frontend/src/lib/components/copilot/chat/monaco-adapter.ts index a8168fdba2..300fe88696 100644 --- a/frontend/src/lib/components/copilot/chat/monaco-adapter.ts +++ b/frontend/src/lib/components/copilot/chat/monaco-adapter.ts @@ -8,6 +8,7 @@ import { type VisualChange } from '../shared' import { writable, type Writable } from 'svelte/store' +import { aiChatManager } from './AIChatManager.svelte' type ExcludeVariant = T extends Record ? never : T type VisualChangeWithDiffIndex = ExcludeVariant & { @@ -22,7 +23,6 @@ export class AIChatEditorHandler { reviewingChanges: Writable = writable(false) groupChanges: { changes: VisualChangeWithDiffIndex[]; groupIndex: number }[] = [] - pendingNewCode: string | undefined = undefined constructor(editor: meditor.IStandaloneCodeEditor) { this.editor = editor @@ -30,7 +30,7 @@ export class AIChatEditorHandler { clear() { this.groupChanges = [] - this.pendingNewCode = undefined + aiChatManager.pendingNewCode = undefined for (const collection of this.decorationsCollections) { collection.clear() } @@ -168,12 +168,13 @@ export class AIChatEditorHandler { } async reviewAndApply(newCode: string) { - if (this.pendingNewCode === newCode) { + if (aiChatManager.pendingNewCode === newCode) { + this.acceptAll() return - } else if (this.pendingNewCode) { + } else if (aiChatManager.pendingNewCode) { this.clear() } - this.pendingNewCode = newCode + aiChatManager.pendingNewCode = newCode const changedLines = await this.calculateVisualChanges(newCode) if (changedLines.length === 0) return diff --git a/frontend/src/lib/components/copilot/chat/script/CodeDisplay.svelte b/frontend/src/lib/components/copilot/chat/script/CodeDisplay.svelte index c3154f4919..5b11fcaef5 100644 --- a/frontend/src/lib/components/copilot/chat/script/CodeDisplay.svelte +++ b/frontend/src/lib/components/copilot/chat/script/CodeDisplay.svelte @@ -180,7 +180,7 @@
- {#if aiChatManager.canApplyCode} + {#if aiChatManager.canApplyCode && code !== aiChatManager.scriptEditorOptions?.code}
{/if} diff --git a/frontend/src/routes/(root)/(logged)/+layout.svelte b/frontend/src/routes/(root)/(logged)/+layout.svelte index 1d47469fe2..5f98044ebf 100644 --- a/frontend/src/routes/(root)/(logged)/+layout.svelte +++ b/frontend/src/routes/(root)/(logged)/+layout.svelte @@ -672,7 +672,7 @@
From 445be72b2332dfc867a09a4e52ce687d3b07dff2 Mon Sep 17 00:00:00 2001 From: centdix <40307056+centdix@users.noreply.github.com> Date: Thu, 5 Jun 2025 16:56:16 +0200 Subject: [PATCH 529/739] avoid duplicate threads (#5875) --- .github/workflows/discord-notification.yml | 3 ++ .../shareable-discord-notification.yml | 46 +++++++++++++------ 2 files changed, 36 insertions(+), 13 deletions(-) diff --git a/.github/workflows/discord-notification.yml b/.github/workflows/discord-notification.yml index 3ffec78a60..012c406cef 100644 --- a/.github/workflows/discord-notification.yml +++ b/.github/workflows/discord-notification.yml @@ -17,8 +17,11 @@ jobs: PR_AUTHOR: ${{ github.event.pull_request.user.login }} PR_STATUS: "opened" PR_NUMBER: ${{ github.event.pull_request.number }} + DISCORD_CHANNEL_ID: "1372204995868491786" + DISCORD_GUILD_ID: "930051556043276338" secrets: DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_PR_REVIEWS_WEBHOOK }} + DISCORD_BOT_TOKEN: ${{ secrets.DISCORD_AI_BOT_TOKEN }} merge_success_emoji: if: github.event.pull_request.merged == true diff --git a/.github/workflows/shareable-discord-notification.yml b/.github/workflows/shareable-discord-notification.yml index cb6dbf055d..d59b99070c 100644 --- a/.github/workflows/shareable-discord-notification.yml +++ b/.github/workflows/shareable-discord-notification.yml @@ -38,24 +38,44 @@ jobs: - name: Send Discord notification and start a thread env: WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }} + BOT_TOKEN: ${{ secrets.DISCORD_BOT_TOKEN }} + CHANNEL_ID: ${{ inputs.DISCORD_CHANNEL_ID }} + GUILD_ID: ${{ inputs.DISCORD_GUILD_ID }} PR_TITLE: ${{ inputs.PR_TITLE }} PR_NUMBER: ${{ inputs.PR_NUMBER }} PR_URL: ${{ inputs.PR_URL }} PR_AUTHOR: ${{ inputs.PR_AUTHOR }} run: | - payload=$(jq -n \ - --arg content "${PR_URL}" \ - --arg thread "#${PR_NUMBER}: $PR_TITLE by \`${PR_AUTHOR}\`" \ - '{ - content: $content, - thread_name: $thread, - auto_archive_duration: 10080 - }' - ) - curl -H "Content-Type: application/json" \ - -X POST \ - -d "$payload" \ - "$WEBHOOK_URL" + # Check if thread already exists + thread_exists=false + if threads=$(curl -s -H "Authorization: Bot $BOT_TOKEN" "https://discord.com/api/v10/guilds/${GUILD_ID}/threads/active"); then + if thread_id=$(echo "$threads" | jq -r --arg cid "$CHANNEL_ID" --arg pref "#${PR_NUMBER}:" '.threads[] | select(.parent_id == $cid and (.name | startswith($pref))) | .id' 2>/dev/null); then + if [ -n "$thread_id" ]; then + thread_exists=true + echo "Thread already exists, skipping creation" + fi + fi + else + echo "Failed to check for existing threads, will create new thread" + fi + + # Create thread if it doesn't exist or if check failed + if [ "$thread_exists" = false ]; then + echo "Creating new thread" + payload=$(jq -n \ + --arg content "${PR_URL}" \ + --arg thread "#${PR_NUMBER}: $PR_TITLE by \`${PR_AUTHOR}\`" \ + '{ + content: $content, + thread_name: $thread, + auto_archive_duration: 10080 + }' + ) + curl -H "Content-Type: application/json" \ + -X POST \ + -d "$payload" \ + "$WEBHOOK_URL" + fi merge_success_emoji: runs-on: ubuntu-latest From a0b302d2c58d4245260376cf280bc866be91717c Mon Sep 17 00:00:00 2001 From: pyranota <92104930+pyranota@users.noreply.github.com> Date: Thu, 5 Jun 2025 16:56:30 +0200 Subject: [PATCH 530/739] fix: cannot parse INSTANCE_PYTHON_VERSION (#5874) --- backend/windmill-worker/src/python_versions.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/windmill-worker/src/python_versions.rs b/backend/windmill-worker/src/python_versions.rs index 28781df616..ff07b55ea1 100644 --- a/backend/windmill-worker/src/python_versions.rs +++ b/backend/windmill-worker/src/python_versions.rs @@ -296,6 +296,7 @@ impl PyV { ) -> Self { let mut err = None; let pyv = match INSTANCE_PYTHON_VERSION.read().await.clone() { + Some(v) if &v == "default" => PyVAlias::default().into(), Some(v) => pep440_rs::Version::from_str(&v).unwrap_or_else(|_| { let v = PyVAlias::default().into(); err = Some(format!("\nCannot parse INSTANCE_PYTHON_VERSION ({:?}), fallback to latest_stable ({v:?})", *INSTANCE_PYTHON_VERSION)); From 2c689e0666c3eb47fe7cf4dca53a99a2e0adefa0 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 5 Jun 2025 17:00:39 +0200 Subject: [PATCH 531/739] usage query on cloud is in bg --- ...9caf531b2312b6e405b4d35efd2f7ca663143.json | 22 -- ...f408ff1ac92ed0f5d31a3ef6c58313e1f8671.json | 28 -- ...60f5c3561c37e9c6f2834d234a862a475a6eb.json | 26 -- ...d009cfc9da0d3b2bd1f40d422b550779e5324.json | 20 -- ...bd8fc61409776d641ddb592a4c731e61a0468.json | 26 -- ...8234ca7d1efeee9661f3901f298da375e73f7.json | 184 ------------- ...4e283c71729f81550f6f7156ce4970345cc07.json | 16 -- ...62994d4a861f1dbb9752c0a27428d83040e13.json | 28 -- ...b7a73d9492e07680732af9af09e223ade1f37.json | 14 - ...5be61080c1003eef51eea41862b25c2b93de6.json | 14 - ...50afdcce2d54721bfe8dba008b15e4b581956.json | 15 -- ...b89646279f77469c35deffca8e17a11d7f6c8.json | 28 -- ...f3d52776c8cb73f2507199c6ca16d4d2405ba.json | 23 -- ...f61f003c29185c267642cfd898075ebda855d.json | 145 ---------- ...74b9a1035ec21176468f147998ac89fbed465.json | 14 - ...927c6df0653a02b87bcea939066e39ebcf24d.json | 15 -- ...9418f85d4d3d599f4177403fad5ad99380715.json | 26 -- ...c2133190ba448d6f7830c8f1f7c22e4d753b8.json | 20 -- ...d9474b17887711128dbb2ef15d247d50686b0.json | 22 -- ...d982b52b48c8c3da392b14963a1ec86811546.json | 50 ---- ...8e11e25c1d3a30294cbe78f01ed75edf68da4.json | 23 -- ...09260b906dc988f44a0db60952a2bf8b1cdaf.json | 15 -- ...f8b0672797299545ee0754b6ad74ece92c77e.json | 26 -- ...0e6b77e24bf5a9044fdc5284d0d7f1e14eafa.json | 15 -- ...d95226bd94ca3facb92a620ffa59dacad6705.json | 28 -- ...591b28cbf9ea8f61d379b84ee6e14c033035d.json | 17 -- ...4039bd67f8e37895befa94a15b7e4019e114b.json | 12 - ...c776994ae2c990bb7bb307c52296b9543fbb8.json | 16 -- ...d6bce075f20bcd5d2328f183d8a59331f6bb1.json | 18 -- ...27bcf833f56475bbc1aa3c8f6d79f146f41bf.json | 25 -- ...bac1d55858f89039ae5baecdc9ceca668adab.json | 15 -- ...de63612a7506cc0671b0eb83e528c1c839db4.json | 14 - ...b7c797424f8291517d3abf096fe45548a0273.json | 22 -- ...9ff7994ee40d3953b9f772d0e0ab999bccb7b.json | 14 - ...5199960264b54c1ddf928c0c654ab15176f63.json | 25 -- ...26e57488489177fe596940d3698d843a93666.json | 22 -- ...16fb41fece9b3d46fde2d546d70b46f9008e3.json | 15 ++ ...3f578a21813f038d75184a5034c37d4daf36e.json | 142 ---------- ...5cf9a26e3b2888702e5e9d5fc1b082901df09.json | 16 -- ...076c565f3add98b6768b5476bd3afed11ea31.json | 22 -- ...2cf0e4086030f3b7994e4892392765cbe1517.json | 23 -- ...d8020f1f6085f4ee85f5eab3458637edf26cd.json | 22 -- ...c69b08c6a86116cbfd0ecad8f112f7f49d8d1.json | 26 -- ...cb7aa5a75b7e40fa312eff6590e54b02635a2.json | 20 -- ...9071e1d3cf78e89ec467927823177c5a439cc.json | 22 -- ...81d870b847a8ba07e6197212fdf85ec901b09.json | 15 -- ...3cd1a1d6eca4083286c6f29c9acba522d2fe3.json | 22 -- ...a660bfd5a8c0a451a0deac24632f0ccf66165.json | 26 -- ...4e82c1b7060ba0ca288dc6a7c7afcd76212e8.json | 16 -- ...31617043fcc0bea3ef62c50fcd881f3d48605.json | 35 --- ...287a9f42e252a1246a584249a224afdbbbf8a.json | 16 -- ...721ad0f3e2888af207e8830ccf5e921c5fd60.json | 16 -- ...02024cfa226735eeeb720bbab46bd0e3cedcc.json | 50 ---- ...776992bfeb383d590e379244ad23703e536a4.json | 19 -- ...ce3631feee1565935d2a6ddbecc17950758d1.json | 17 -- ...a2524943ba277c5f9a37c06bd5ee14fd46bda.json | 17 -- ...f131f8a0c9cdb37cfba6283a6718480b02a4b.json | 34 --- ...b3d956c004376102ccc1707fc016801599dbd.json | 36 --- ...520fc4160c008c3d29fe7d99e609c0b6e3e6d.json | 12 - ...b2a897fe4b30c83f2aa5e9464c156f08f1c3a.json | 38 --- ...93c8c0a57f93b7b445171b1cc3f4428ee6e53.json | 18 -- ...a2e60c9c24decb2a6b41125247bbf741e9c25.json | 46 ---- ...55b21bbc487b80bda7fd6250ac12e93938577.json | 22 -- ...e1b38c30f7d2689baf647ea4dc6b398c3a651.json | 23 -- ...74a0cf43682480452f7dbe23012320fe7fe25.json | 58 ---- ...e89fc04765191f251945d14bbe78718714f6e.json | 39 --- ...4caecda6335eda5b2e97e5a7370361653ff48.json | 26 -- ...5bacbb4bbe3bb4725eece43fb82944212f21d.json | 22 -- ...c984775d23c7a4dc1a7ad37528a46ab89d6bd.json | 123 --------- ...da464be138272487639d0ffbbbe6961ec5c37.json | 18 -- ...8b82359c182ee2a5da6df35a4375d5d2d1ef7.json | 65 ----- ...bb6698610189bac63c2caee3f4d52b0851f31.json | 20 -- ...b1bd45853bf5b72e0ab991e0e61fedcfb42fc.json | 16 -- ...17a6cf34de92b9b4079c00b75423a9ff835b9.json | 20 -- ...dcc40f463cbc52d94ed9315cf9a547d4c89f2.json | 184 ------------- ...2846cd0b1ef5f64d20b0d975d0058730f427b.json | 22 -- ...8566101dd27a0f3363884781071d417f8b7e7.json | 22 ++ ...8b29ef8bba3d6da1b1e21f2ca307ccbebee89.json | 16 -- ...9861756b3ad367a4a500728332a7cb91560a4.json | 15 -- ...5f85dd67ab1514d7c48668ab2f10aa6b201ba.json | 14 - ...41d95ba195f5543120e76e68f6e6715b65a71.json | 24 -- ...fb1d462d5c796f08c7481c42154f9bfacf388.json | 22 -- ...31d90bc0aa384262e473c7006340dcb6e959c.json | 23 -- ...f82b5951f17d1b7eade53c6d89253d55f8b9f.json | 22 -- ...c3277a2543cd3b52a3123b0585f6c9071552c.json | 46 ---- ...45b692815f1594bf302dbebd5f80d5d22b98e.json | 22 -- ...e21295673c45e4caae1bdbb47517d4608dc8d.json | 17 -- ...20e85b2eed7b4705367361fc5e456e5263df9.json | 15 -- ...7998ea800860ede856e5fc6cd1f57d5408333.json | 16 -- ...25cc496528768f8ee4c6924b13bb8f75a9f8a.json | 15 -- ...520758656ce6bcd1e694a62e140e0af8c59fa.json | 15 -- ...f2390af9d02efc7112a32a84e1a1247a95973.json | 56 ---- ...cabb01481a19bef5a956dc36cac41acad0e53.json | 25 -- ...a9b44c76f1cf1485ceba50aeede9daec94c01.json | 18 -- ...957c87f2307a218115ca749ea0e71eca2002e.json | 23 -- ...eabc4c516418e595dee9cd7d651acc1f4af6e.json | 248 ------------------ ...973e8fc108d9f32be8a8501391052d76e191e.json | 25 -- ...c067fee1ebf7510fec98e0574e07c906cc714.json | 46 ---- ...cc158e09af72dd31585ed2ddc1cc06cbfd189.json | 20 -- ...ad3056ee4fdf8691ba5503937424d75f3815e.json | 20 -- ...4e255cd5e9b990ffa89998ef24871d3a9717c.json | 14 - ...a37fcc985bf61978cc07167ed35d7dbf92d11.json | 23 -- ...4b7bfc5bc8b6a76c98bf4daf7d715d18c52e6.json | 34 --- ...7c99b85d68ce1be2bafdc145aed0aa8e5d989.json | 14 - ...fc93f01fdbc19c66d7404f95e1f8444235a8e.json | 25 -- ...ef9f4c8faa986843024a2cd58e212f706aae8.json | 17 -- ...d6f4c6e63f7b7b6d4cf0b4ae1237da0e17b4b.json | 28 -- ...585bfa19b70315840585c81b8e7a3911ab5e7.json | 15 -- ...d9fdee37dd8df66974c8d33f58a88b1bca537.json | 12 - ...94f91df7e588d4d2431bc85f4d8734920c8bf.json | 3 +- ...be69959987cbac1d83b64225fd1bf9ab047c9.json | 22 ++ ...fcd8c5491732818404fee2397f00cccee0ad3.json | 34 --- ...524d1a5b196a7b77afcb02f46b84b22088bbf.json | 20 -- ...1a955cb86557032cfbdbf4022bf1ad3230ae7.json | 14 - ...0d206b722ec4192368599c3a5027f50a89c80.json | 14 - ...ccb9c3e8169e4080ee28f6f40c729d06cbb55.json | 16 -- ...7832c5a674a5553674fd9762c981e0d03bb57.json | 15 -- ...8e460f99a0d2155fe2ff7b1d2840c5d9b76d0.json | 23 -- ...0fcfcd6aeae7bc5a37e9a735cabbe2691c570.json | 22 -- ...4633c1531170ded1fdf09114718b941f5e1db.json | 65 ----- ...a614a50fa5fd03c2d3b9a41bd85a7f156345e.json | 22 -- ...75dfe92f74a7220ed69e61899a6e0f053d9cd.json | 14 - ...c7cdd6e5af3545835763ccb29cdf3ac273ef0.json | 15 -- ...329f748006ab131489d2fcac21d32641bb633.json | 24 -- ...540a354f8eec49913aaf07fc1e737e7c93330.json | 16 -- ...722f60cbd41814f8a17006c82f48888f05bb6.json | 14 - ...d59f418ed6fc2a98ddb9bbc33dce5f029d904.json | 15 -- ...857d432dff44e343b8f0610208d42ff5afd14.json | 14 - ...00296ee84c9536228496e19b4ec5df1781bc5.json | 29 -- ...2728a82ba256029096812dd705ccb1a552cfe.json | 19 -- ...f8479986f1591bf545b8562109b6ce26578b0.json | 23 -- ...f11191590a12ea98a671e172b867306959884.json | 15 -- ...f3490f88ced636c9ebdecba2205f964b1d0f1.json | 15 -- ...27bfe0790d5e1c347e5b15835c8996c039cd1.json | 22 -- ...ab0dc7217d1b3f86f362c213982984d2cf652.json | 26 -- ...5ef756b8e5c1955fbe111df9ee171dc262338.json | 3 +- ...a2a9cc4fee3473b3f6ea69f397d91e9356ba1.json | 19 -- ...4ddf964a5b3cd088fc162d0d8222325d4a5ea.json | 14 - ...e22889d35e919d3267c1d2a265d868fa8a7d1.json | 16 -- ...0472a87b7e267a143709728b09ac063c33b96.json | 16 -- ...23b4376a93342702856da2ac70f6bbfc7933e.json | 23 -- ...e98369e1d93514e1618723a34bf96080d4ebc.json | 16 -- ...7a886242277cd50555f20b2e22e13942d2a3a.json | 65 ----- ...90b824af5260a3b1ab3355ac613f1f83fc349.json | 16 -- ...d363102f5f6705d6debb442a85126ed59d863.json | 18 -- ...6b4d21aa3bfe772e4d344e306a224ec2c8a01.json | 15 -- ...e91704c70d9fe15eda18e6889adfd7496f80b.json | 23 -- ...3f4ed8573cda89f655d6490d22f182e3f2f36.json | 120 --------- ...ce13b6fc7d35bbaf7f503dcc73ae48fd07489.json | 17 -- ...23be681a0e2cb07a457ea9aede2daeff551cc.json | 22 -- ...f81572818177a6024e743b12f558b46edf74c.json | 50 ---- ...f14572ac204cfe377166aa1d91cf58f731f50.json | 15 -- ...96f78c2cfd42ed7d1ca6cfd35288b561120db.json | 28 -- ...0a7c1a588e69c2c8d9a1def9276ba326453d2.json | 15 -- ...aa2a97e95f4797c5e11f37822e19828422b7e.json | 23 -- ...009041a5f5a03eaf03fe6bf27eed406640b6a.json | 20 -- ...20cfeee64fd47ded72fce55cc75e0bbb291a8.json | 15 ++ ...7d3541522ef9712a83ecff7bd8b5f6e870748.json | 17 -- ...3322cae965dc5d8ebc98f69d5922fa1192561.json | 22 -- ...679366bb07bc6a100727721a787160ac6910c.json | 38 --- ...de007185263167bf1dfa2e469d319cc4da674.json | 24 -- ...165895ca61ef042947c7314f66514d7f29edc.json | 22 -- ...a0c5976ee60125289e9f7b0b04090bce4a3a3.json | 25 -- ...6af22d25369a33247cec6e9f2d1a5eb851412.json | 15 -- ...5da65edde2fbfee0fac5103ba7bd18c64563d.json | 14 - ...3a94fca9dd95cc3b26b33611eab9d2a261141.json | 22 -- ...22beba612f36368d62fe4e94b5b9e26349d32.json | 20 -- ...aa90d8d8c5c76f3971484e4c515ff60293d3b.json | 24 -- ...36a57830a791c8358e30e9be012b815f5e8e3.json | 50 ---- ...bceffac637548841897341672da427a9140fc.json | 26 -- ...f8c31c2533a4a73184d0276f9a388ff2fa574.json | 25 -- ...884ae3e8c6cf7eaa2d9c62056366eb42f2276.json | 25 -- ...33ba30fa85efcc83fafe4dd7b4e535b96a8d8.json | 15 -- ...0912d0221d191b8ab091601cb53cdd932ad58.json | 25 -- ...c141fe8a346ab6a1a3bc924794bfe3c9af306.json | 26 -- ...eb41dcef121ed161db04b2568ac2d990aed7c.json | 15 -- ...af9f3854bb65393d33b265476c0e68aec4f61.json | 15 -- ...02870a3b7d93ae43b40ac2cd3181dffab0837.json | 17 -- ...42b538ba83115c0ea798be00b01659600f45a.json | 22 -- ...315ff25dad08e4cb714718505b77a75d44b95.json | 15 -- ...a630be29176bd5d1246c974642d40201782fc.json | 26 -- ...fe101cd5c2fe3e4c143c0b979668143d85dd2.json | 25 -- ...b64792c00da1d713d7ca8f9904ccce7bfdae7.json | 246 ----------------- ...b121e63a7f31ed849834bb8ac9e8c726e81f1.json | 28 -- ...4c79b3cbc6413046c3b6099d19f675d8a395b.json | 23 -- ...90e3bb89c4deff181827bd2fa5630c21e42a7.json | 29 -- ...742531bf1351d0be1c3631bde0adfe375497a.json | 22 -- ...e1217f088290fce0e052171230bcd88f945b9.json | 14 - ...6b4ea29a2b0c2b1cde48ef06d687f6f9e8f15.json | 29 -- ...3c13864e855219c7f366c86f0605ec25d1538.json | 35 --- ...2ab7e0bf26431158fbfb5f0023ed847ca7dc5.json | 16 -- ...77afbd8b3a660b3be27514b517c077c63c238.json | 3 +- ...af80b100d2ffa58ec567223e27099d364fcc8.json | 17 -- backend/update_sqlx.sh | 1 - backend/windmill-queue/src/jobs.rs | 77 +++--- 195 files changed, 124 insertions(+), 5495 deletions(-) delete mode 100644 backend/.sqlx/query-005b9255699e73600c579f74b529caf531b2312b6e405b4d35efd2f7ca663143.json delete mode 100644 backend/.sqlx/query-050fb876e10ad13654dbbde4532f408ff1ac92ed0f5d31a3ef6c58313e1f8671.json delete mode 100644 backend/.sqlx/query-070b8ad0b59f485fa5bf68082b060f5c3561c37e9c6f2834d234a862a475a6eb.json delete mode 100644 backend/.sqlx/query-08dd2ea6b17a52bce352d6443d7d009cfc9da0d3b2bd1f40d422b550779e5324.json delete mode 100644 backend/.sqlx/query-08e4a2dc49c75aa356f3cc75a4abd8fc61409776d641ddb592a4c731e61a0468.json delete mode 100644 backend/.sqlx/query-08f288d2781d823e109a9e5b8848234ca7d1efeee9661f3901f298da375e73f7.json delete mode 100644 backend/.sqlx/query-09e2a19435068f9e9bfd5bcb44b4e283c71729f81550f6f7156ce4970345cc07.json delete mode 100644 backend/.sqlx/query-0c2e53960dc7786c848079b155e62994d4a861f1dbb9752c0a27428d83040e13.json delete mode 100644 backend/.sqlx/query-0c9ad812013ff476a79ca8d6bb8b7a73d9492e07680732af9af09e223ade1f37.json delete mode 100644 backend/.sqlx/query-0cb84cbb9083d967cc8be1cccab5be61080c1003eef51eea41862b25c2b93de6.json delete mode 100644 backend/.sqlx/query-0dd3fe3ddf9cb72760687d2ee0950afdcce2d54721bfe8dba008b15e4b581956.json delete mode 100644 backend/.sqlx/query-0ee14619dd81df460b2b8cc6df2b89646279f77469c35deffca8e17a11d7f6c8.json delete mode 100644 backend/.sqlx/query-0ef37117c369f03236e18f9dbb1f3d52776c8cb73f2507199c6ca16d4d2405ba.json delete mode 100644 backend/.sqlx/query-1312b7fd622cc814a406c85dbbff61f003c29185c267642cfd898075ebda855d.json delete mode 100644 backend/.sqlx/query-134fe14dd47e80a9ef9b245a59e74b9a1035ec21176468f147998ac89fbed465.json delete mode 100644 backend/.sqlx/query-14abf759dae7ba5c38017ba6001927c6df0653a02b87bcea939066e39ebcf24d.json delete mode 100644 backend/.sqlx/query-1625a84fbcf8c5f77eb0519f60d9418f85d4d3d599f4177403fad5ad99380715.json delete mode 100644 backend/.sqlx/query-19bc874a06658b549e13cfa080ac2133190ba448d6f7830c8f1f7c22e4d753b8.json delete mode 100644 backend/.sqlx/query-1ace9bdcde90fd2261fd64344a2d9474b17887711128dbb2ef15d247d50686b0.json delete mode 100644 backend/.sqlx/query-1b33393fbbc7e681b4d355f6096d982b52b48c8c3da392b14963a1ec86811546.json delete mode 100644 backend/.sqlx/query-1c0f95a069891f7214505aaa9428e11e25c1d3a30294cbe78f01ed75edf68da4.json delete mode 100644 backend/.sqlx/query-1c37f91192aa4f535c7fff80fa809260b906dc988f44a0db60952a2bf8b1cdaf.json delete mode 100644 backend/.sqlx/query-1cad25c24d0f80d58a50d4da923f8b0672797299545ee0754b6ad74ece92c77e.json delete mode 100644 backend/.sqlx/query-1d87f41fd1abb9361d795a899120e6b77e24bf5a9044fdc5284d0d7f1e14eafa.json delete mode 100644 backend/.sqlx/query-1f5f0858909eb5bac63c4e3b1add95226bd94ca3facb92a620ffa59dacad6705.json delete mode 100644 backend/.sqlx/query-203fa78d423ec5a8c5ff6166aed591b28cbf9ea8f61d379b84ee6e14c033035d.json delete mode 100644 backend/.sqlx/query-2041526bc58872d71f91f7698144039bd67f8e37895befa94a15b7e4019e114b.json delete mode 100644 backend/.sqlx/query-20e01ecb5d4aa4c532a8f906365c776994ae2c990bb7bb307c52296b9543fbb8.json delete mode 100644 backend/.sqlx/query-20fcdcd2674a52ee9bd8d1de518d6bce075f20bcd5d2328f183d8a59331f6bb1.json delete mode 100644 backend/.sqlx/query-22dcd953d900fb0ddbe2099ccee27bcf833f56475bbc1aa3c8f6d79f146f41bf.json delete mode 100644 backend/.sqlx/query-22ff7c00b2d3e93ea9e147fc9a5bac1d55858f89039ae5baecdc9ceca668adab.json delete mode 100644 backend/.sqlx/query-23c37d36e16251763fabf194e41de63612a7506cc0671b0eb83e528c1c839db4.json delete mode 100644 backend/.sqlx/query-266741894b9a6ed650cf999b6e5b7c797424f8291517d3abf096fe45548a0273.json delete mode 100644 backend/.sqlx/query-27920aaa55666ffc14a36a247f89ff7994ee40d3953b9f772d0e0ab999bccb7b.json delete mode 100644 backend/.sqlx/query-299e16725162888c01712f371785199960264b54c1ddf928c0c654ab15176f63.json delete mode 100644 backend/.sqlx/query-2ae44acae7ac80e191b37071baa26e57488489177fe596940d3698d843a93666.json create mode 100644 backend/.sqlx/query-2bf5f7f2cf9d85a5d23e5db2f7616fb41fece9b3d46fde2d546d70b46f9008e3.json delete mode 100644 backend/.sqlx/query-2dcff8b16da75740c362015b2293f578a21813f038d75184a5034c37d4daf36e.json delete mode 100644 backend/.sqlx/query-2e1d1c59bfc53d58962251822c85cf9a26e3b2888702e5e9d5fc1b082901df09.json delete mode 100644 backend/.sqlx/query-2e9b3e718440f3c5269e9217a13076c565f3add98b6768b5476bd3afed11ea31.json delete mode 100644 backend/.sqlx/query-33ee913ce263600a3f94f90e4a42cf0e4086030f3b7994e4892392765cbe1517.json delete mode 100644 backend/.sqlx/query-34a45763bb4d14162f4cd3fa07cd8020f1f6085f4ee85f5eab3458637edf26cd.json delete mode 100644 backend/.sqlx/query-354f88b23d20f92c6b6d5bdd8d6c69b08c6a86116cbfd0ecad8f112f7f49d8d1.json delete mode 100644 backend/.sqlx/query-388b3705f641621b0c2f4496e36cb7aa5a75b7e40fa312eff6590e54b02635a2.json delete mode 100644 backend/.sqlx/query-38c20dba51b1e2b4b28e5eed51f9071e1d3cf78e89ec467927823177c5a439cc.json delete mode 100644 backend/.sqlx/query-3997dcf2c11817e59bf50fd896381d870b847a8ba07e6197212fdf85ec901b09.json delete mode 100644 backend/.sqlx/query-3b02f3ec6b92706c26065b2fa703cd1a1d6eca4083286c6f29c9acba522d2fe3.json delete mode 100644 backend/.sqlx/query-3d8fdf7adf42b27808a5b223df3a660bfd5a8c0a451a0deac24632f0ccf66165.json delete mode 100644 backend/.sqlx/query-3e64c894c89ef82c4527180b82c4e82c1b7060ba0ca288dc6a7c7afcd76212e8.json delete mode 100644 backend/.sqlx/query-3f5520e0ea00569bf169da9abde31617043fcc0bea3ef62c50fcd881f3d48605.json delete mode 100644 backend/.sqlx/query-3f67e7cf8d9f021a075f1c88703287a9f42e252a1246a584249a224afdbbbf8a.json delete mode 100644 backend/.sqlx/query-3fa3d1fa1add8e187fcbaf7351b721ad0f3e2888af207e8830ccf5e921c5fd60.json delete mode 100644 backend/.sqlx/query-42030372693d8d6b8d03947bb6702024cfa226735eeeb720bbab46bd0e3cedcc.json delete mode 100644 backend/.sqlx/query-42df4b40b3bbf14010f07e29892776992bfeb383d590e379244ad23703e536a4.json delete mode 100644 backend/.sqlx/query-43b376a2eff086a32cd76e54361ce3631feee1565935d2a6ddbecc17950758d1.json delete mode 100644 backend/.sqlx/query-43c8cd9f8560412bb06d9966ccfa2524943ba277c5f9a37c06bd5ee14fd46bda.json delete mode 100644 backend/.sqlx/query-44a12919fb154055f1142cc078ef131f8a0c9cdb37cfba6283a6718480b02a4b.json delete mode 100644 backend/.sqlx/query-44b9bea3651edc8ee732def1241b3d956c004376102ccc1707fc016801599dbd.json delete mode 100644 backend/.sqlx/query-45dde0dc2da12fe46b5975ed53b520fc4160c008c3d29fe7d99e609c0b6e3e6d.json delete mode 100644 backend/.sqlx/query-4887db074e9058bc0c1887428d6b2a897fe4b30c83f2aa5e9464c156f08f1c3a.json delete mode 100644 backend/.sqlx/query-4968e9edac534657c808b891cbf93c8c0a57f93b7b445171b1cc3f4428ee6e53.json delete mode 100644 backend/.sqlx/query-4b8132b04e454eddfe6724c6cc3a2e60c9c24decb2a6b41125247bbf741e9c25.json delete mode 100644 backend/.sqlx/query-4cfa57b2a836242d55071ef237855b21bbc487b80bda7fd6250ac12e93938577.json delete mode 100644 backend/.sqlx/query-4e3469185637ad8f06673261bfae1b38c30f7d2689baf647ea4dc6b398c3a651.json delete mode 100644 backend/.sqlx/query-4e5273b9ce05f6ee2dfd5f14c8574a0cf43682480452f7dbe23012320fe7fe25.json delete mode 100644 backend/.sqlx/query-4eca060026a0cb19c5794cd56ace89fc04765191f251945d14bbe78718714f6e.json delete mode 100644 backend/.sqlx/query-50c17c7848760aaf0f869acfc444caecda6335eda5b2e97e5a7370361653ff48.json delete mode 100644 backend/.sqlx/query-51dbf8e3814c2d63df1958db12d5bacbb4bbe3bb4725eece43fb82944212f21d.json delete mode 100644 backend/.sqlx/query-5237f9d3f57f4e799968a4a9630c984775d23c7a4dc1a7ad37528a46ab89d6bd.json delete mode 100644 backend/.sqlx/query-528cdbb75f1c5135170a58fce3fda464be138272487639d0ffbbbe6961ec5c37.json delete mode 100644 backend/.sqlx/query-5303206bbed76ee3ddc56d8057d8b82359c182ee2a5da6df35a4375d5d2d1ef7.json delete mode 100644 backend/.sqlx/query-54c6be1469a80d88fd6d5c30772bb6698610189bac63c2caee3f4d52b0851f31.json delete mode 100644 backend/.sqlx/query-551c78392919e18019bb0a4344fb1bd45853bf5b72e0ab991e0e61fedcfb42fc.json delete mode 100644 backend/.sqlx/query-55a2f170823f1d1abce76287d8817a6cf34de92b9b4079c00b75423a9ff835b9.json delete mode 100644 backend/.sqlx/query-55cb03040bc2a8c53dd7fbb42bbdcc40f463cbc52d94ed9315cf9a547d4c89f2.json delete mode 100644 backend/.sqlx/query-55cf43cb9219b43f8e9f94b23b62846cd0b1ef5f64d20b0d975d0058730f427b.json create mode 100644 backend/.sqlx/query-56b2326015fde12b1a4efa226518566101dd27a0f3363884781071d417f8b7e7.json delete mode 100644 backend/.sqlx/query-574d9a2bb6eceb62f3d2c2be3f18b29ef8bba3d6da1b1e21f2ca307ccbebee89.json delete mode 100644 backend/.sqlx/query-57e270e032e8c04dda7b5c1ca949861756b3ad367a4a500728332a7cb91560a4.json delete mode 100644 backend/.sqlx/query-5930b2fa72fd15d692bcf3e14d95f85dd67ab1514d7c48668ab2f10aa6b201ba.json delete mode 100644 backend/.sqlx/query-5bd8ae8d694ac9f6afef762276141d95ba195f5543120e76e68f6e6715b65a71.json delete mode 100644 backend/.sqlx/query-5f22a7c9170f035779782591b4bfb1d462d5c796f08c7481c42154f9bfacf388.json delete mode 100644 backend/.sqlx/query-5faba1042763a308c64e36cc2a331d90bc0aa384262e473c7006340dcb6e959c.json delete mode 100644 backend/.sqlx/query-5fd70c70ce52cbc51fa9124cb05f82b5951f17d1b7eade53c6d89253d55f8b9f.json delete mode 100644 backend/.sqlx/query-6032ab9ab230c48a44f684e70ebc3277a2543cd3b52a3123b0585f6c9071552c.json delete mode 100644 backend/.sqlx/query-621e9a2a53187dac3ebed62f0d645b692815f1594bf302dbebd5f80d5d22b98e.json delete mode 100644 backend/.sqlx/query-64c5ca0bd4a2c42d6f5415fae1de21295673c45e4caae1bdbb47517d4608dc8d.json delete mode 100644 backend/.sqlx/query-656f268969018438499f677d31720e85b2eed7b4705367361fc5e456e5263df9.json delete mode 100644 backend/.sqlx/query-673564e6c4dcf30dae3d7a75c397998ea800860ede856e5fc6cd1f57d5408333.json delete mode 100644 backend/.sqlx/query-689551fddbff09acd3f000ae54f25cc496528768f8ee4c6924b13bb8f75a9f8a.json delete mode 100644 backend/.sqlx/query-69518153298f8ca6f112bed156b520758656ce6bcd1e694a62e140e0af8c59fa.json delete mode 100644 backend/.sqlx/query-6a72df33cf12824c54b29dbf011f2390af9d02efc7112a32a84e1a1247a95973.json delete mode 100644 backend/.sqlx/query-6b776693091191f36eaf9e35fb3cabb01481a19bef5a956dc36cac41acad0e53.json delete mode 100644 backend/.sqlx/query-6bb4fab9e74c421fb30cfd856a1a9b44c76f1cf1485ceba50aeede9daec94c01.json delete mode 100644 backend/.sqlx/query-6d418b5cd7a4df54cfe3ec06e2a957c87f2307a218115ca749ea0e71eca2002e.json delete mode 100644 backend/.sqlx/query-6e2564dc37ee967c634deade67ceabc4c516418e595dee9cd7d651acc1f4af6e.json delete mode 100644 backend/.sqlx/query-6e70ebf078ac04a2933d2f83791973e8fc108d9f32be8a8501391052d76e191e.json delete mode 100644 backend/.sqlx/query-70a3bfa729f874c9765f00a9c7dc067fee1ebf7510fec98e0574e07c906cc714.json delete mode 100644 backend/.sqlx/query-71ad5448cba8da6677edd02e090cc158e09af72dd31585ed2ddc1cc06cbfd189.json delete mode 100644 backend/.sqlx/query-729c5c6430431f044148aeeec18ad3056ee4fdf8691ba5503937424d75f3815e.json delete mode 100644 backend/.sqlx/query-73ca6ea13b362b2569ea115d28e4e255cd5e9b990ffa89998ef24871d3a9717c.json delete mode 100644 backend/.sqlx/query-746ee16a04267cd251d4cefbc44a37fcc985bf61978cc07167ed35d7dbf92d11.json delete mode 100644 backend/.sqlx/query-776909d3452aaf9e0ed41a5ec314b7bfc5bc8b6a76c98bf4daf7d715d18c52e6.json delete mode 100644 backend/.sqlx/query-7aef087f9e10dd32417477109b97c99b85d68ce1be2bafdc145aed0aa8e5d989.json delete mode 100644 backend/.sqlx/query-7b36b58761cd459b808cc4f463dfc93f01fdbc19c66d7404f95e1f8444235a8e.json delete mode 100644 backend/.sqlx/query-7e31c47e02492b74cbb5702dfc5ef9f4c8faa986843024a2cd58e212f706aae8.json delete mode 100644 backend/.sqlx/query-7ecb01893c46823a207bf59aa57d6f4c6e63f7b7b6d4cf0b4ae1237da0e17b4b.json delete mode 100644 backend/.sqlx/query-7f772ceace10008d7d40afd331a585bfa19b70315840585c81b8e7a3911ab5e7.json delete mode 100644 backend/.sqlx/query-7fa8fca5b5cdf147da0cf8ae5a0d9fdee37dd8df66974c8d33f58a88b1bca537.json create mode 100644 backend/.sqlx/query-83f64dd93b1ddc03b84681d65d9be69959987cbac1d83b64225fd1bf9ab047c9.json delete mode 100644 backend/.sqlx/query-8490024b96aa689d3c1bc5cbf94fcd8c5491732818404fee2397f00cccee0ad3.json delete mode 100644 backend/.sqlx/query-84d048ea323758842dc564c700b524d1a5b196a7b77afcb02f46b84b22088bbf.json delete mode 100644 backend/.sqlx/query-85844054136d7bc9669d6b340ca1a955cb86557032cfbdbf4022bf1ad3230ae7.json delete mode 100644 backend/.sqlx/query-85c116da4a43a5ade37bb9ab2660d206b722ec4192368599c3a5027f50a89c80.json delete mode 100644 backend/.sqlx/query-8667efb13d6bd7ef1858d7d9fc7ccb9c3e8169e4080ee28f6f40c729d06cbb55.json delete mode 100644 backend/.sqlx/query-870b12a46f26c9e29889dd28a5c7832c5a674a5553674fd9762c981e0d03bb57.json delete mode 100644 backend/.sqlx/query-884039108b98daa6279975e65348e460f99a0d2155fe2ff7b1d2840c5d9b76d0.json delete mode 100644 backend/.sqlx/query-88b7589a6416da8be4b26af3bf30fcfcd6aeae7bc5a37e9a735cabbe2691c570.json delete mode 100644 backend/.sqlx/query-8d207cc9ed101ff116b617d25a94633c1531170ded1fdf09114718b941f5e1db.json delete mode 100644 backend/.sqlx/query-8dd1de2aca8c6c9ffaddd2c41c3a614a50fa5fd03c2d3b9a41bd85a7f156345e.json delete mode 100644 backend/.sqlx/query-900ac59515e4283f4b57516210575dfe92f74a7220ed69e61899a6e0f053d9cd.json delete mode 100644 backend/.sqlx/query-902961f15b8c7603dddf2933b5fc7cdd6e5af3545835763ccb29cdf3ac273ef0.json delete mode 100644 backend/.sqlx/query-92c2b66eb6287449f5f8cc9f8d1329f748006ab131489d2fcac21d32641bb633.json delete mode 100644 backend/.sqlx/query-93d64930c74ccb1abdc9bda8287540a354f8eec49913aaf07fc1e737e7c93330.json delete mode 100644 backend/.sqlx/query-9969f99d81b2fa581a1da8f7cc3722f60cbd41814f8a17006c82f48888f05bb6.json delete mode 100644 backend/.sqlx/query-999edc6f54a9efb6dc6237992dad59f418ed6fc2a98ddb9bbc33dce5f029d904.json delete mode 100644 backend/.sqlx/query-9c72b2962d0919353cfe5af710e857d432dff44e343b8f0610208d42ff5afd14.json delete mode 100644 backend/.sqlx/query-9e2810312302b36d3b4d761481c00296ee84c9536228496e19b4ec5df1781bc5.json delete mode 100644 backend/.sqlx/query-9f1f388924176dbe3dea882e0c62728a82ba256029096812dd705ccb1a552cfe.json delete mode 100644 backend/.sqlx/query-a15a4478d1249c9ae5cd5f2b755f8479986f1591bf545b8562109b6ce26578b0.json delete mode 100644 backend/.sqlx/query-a59aac0bc593d99aedd14fd9606f11191590a12ea98a671e172b867306959884.json delete mode 100644 backend/.sqlx/query-a5fbef9db2308920ea26f6154f0f3490f88ced636c9ebdecba2205f964b1d0f1.json delete mode 100644 backend/.sqlx/query-a670b88ea83d69997f1b70873b927bfe0790d5e1c347e5b15835c8996c039cd1.json delete mode 100644 backend/.sqlx/query-a7ffc5b983d365159ef379ec6a2ab0dc7217d1b3f86f362c213982984d2cf652.json delete mode 100644 backend/.sqlx/query-ad3b0176e3d41a0c1d79a8eb59da2a9cc4fee3473b3f6ea69f397d91e9356ba1.json delete mode 100644 backend/.sqlx/query-ad42118ccf6a9d2d1e072c4df064ddf964a5b3cd088fc162d0d8222325d4a5ea.json delete mode 100644 backend/.sqlx/query-add48c8e7c6fa2c549ad6293cbee22889d35e919d3267c1d2a265d868fa8a7d1.json delete mode 100644 backend/.sqlx/query-b223c56f55a138abef8c8cb2df40472a87b7e267a143709728b09ac063c33b96.json delete mode 100644 backend/.sqlx/query-b386d320f9fe1d569a16e6626b723b4376a93342702856da2ac70f6bbfc7933e.json delete mode 100644 backend/.sqlx/query-b4d48c820bf41619bffa8f62367e98369e1d93514e1618723a34bf96080d4ebc.json delete mode 100644 backend/.sqlx/query-b5c839baab25c4dcdd503d380cf7a886242277cd50555f20b2e22e13942d2a3a.json delete mode 100644 backend/.sqlx/query-b6ddadfa8d23db666206f907a6390b824af5260a3b1ab3355ac613f1f83fc349.json delete mode 100644 backend/.sqlx/query-b83e58972d8f8285eb604de94c3d363102f5f6705d6debb442a85126ed59d863.json delete mode 100644 backend/.sqlx/query-b8490eea478c1fd279593a7ced86b4d21aa3bfe772e4d344e306a224ec2c8a01.json delete mode 100644 backend/.sqlx/query-bb56e61c7cfb09c0a28fb3226dfe91704c70d9fe15eda18e6889adfd7496f80b.json delete mode 100644 backend/.sqlx/query-bc0bedddcafad216c30c5061eef3f4ed8573cda89f655d6490d22f182e3f2f36.json delete mode 100644 backend/.sqlx/query-bd829646d08f68106211f97c75dce13b6fc7d35bbaf7f503dcc73ae48fd07489.json delete mode 100644 backend/.sqlx/query-c07c9276945663d062cf0ff5b3323be681a0e2cb07a457ea9aede2daeff551cc.json delete mode 100644 backend/.sqlx/query-c0e6dbce7a401b06e1bf45155c3f81572818177a6024e743b12f558b46edf74c.json delete mode 100644 backend/.sqlx/query-c19a60a9dc3f95af218baf40c62f14572ac204cfe377166aa1d91cf58f731f50.json delete mode 100644 backend/.sqlx/query-c1ceb03e0eafd2e494c06cef1ec96f78c2cfd42ed7d1ca6cfd35288b561120db.json delete mode 100644 backend/.sqlx/query-c4e0f3eab227a798d9cd7478db50a7c1a588e69c2c8d9a1def9276ba326453d2.json delete mode 100644 backend/.sqlx/query-c4e1873bfc7b905e7299a021f4baa2a97e95f4797c5e11f37822e19828422b7e.json delete mode 100644 backend/.sqlx/query-c87db5bfb559c912e35415c9945009041a5f5a03eaf03fe6bf27eed406640b6a.json create mode 100644 backend/.sqlx/query-ca3ba808e020c8c7a35eaef842b20cfeee64fd47ded72fce55cc75e0bbb291a8.json delete mode 100644 backend/.sqlx/query-cac594031a21b4806de9c4616317d3541522ef9712a83ecff7bd8b5f6e870748.json delete mode 100644 backend/.sqlx/query-cbb93da0b7719a27d2ae1ec0f653322cae965dc5d8ebc98f69d5922fa1192561.json delete mode 100644 backend/.sqlx/query-cce991f582bc9d2ba28a5b2b41c679366bb07bc6a100727721a787160ac6910c.json delete mode 100644 backend/.sqlx/query-cd5d62d456b74237b941bc72ea8de007185263167bf1dfa2e469d319cc4da674.json delete mode 100644 backend/.sqlx/query-cecf1addc4aecb087a14786b2a9165895ca61ef042947c7314f66514d7f29edc.json delete mode 100644 backend/.sqlx/query-d06efdc24706e0d7479bffc0b19a0c5976ee60125289e9f7b0b04090bce4a3a3.json delete mode 100644 backend/.sqlx/query-d0bd4f43cb1feabe7ee9e017a0d6af22d25369a33247cec6e9f2d1a5eb851412.json delete mode 100644 backend/.sqlx/query-d113bc301f2f094c3a2a4c6ed385da65edde2fbfee0fac5103ba7bd18c64563d.json delete mode 100644 backend/.sqlx/query-d1dcc7fc8a1e1bc4dad263ec5163a94fca9dd95cc3b26b33611eab9d2a261141.json delete mode 100644 backend/.sqlx/query-d4eb7aea60894b65498144b9bf522beba612f36368d62fe4e94b5b9e26349d32.json delete mode 100644 backend/.sqlx/query-d78ecf85c1e1e95650c380c9488aa90d8d8c5c76f3971484e4c515ff60293d3b.json delete mode 100644 backend/.sqlx/query-d8ea17fba0e417333e9c6cf82ad36a57830a791c8358e30e9be012b815f5e8e3.json delete mode 100644 backend/.sqlx/query-d9a6f75e4c4a1f61e55b313cc09bceffac637548841897341672da427a9140fc.json delete mode 100644 backend/.sqlx/query-dc649111c4c862c36c26ad8a9eff8c31c2533a4a73184d0276f9a388ff2fa574.json delete mode 100644 backend/.sqlx/query-dcf03ff4b922b93be37d2be5da6884ae3e8c6cf7eaa2d9c62056366eb42f2276.json delete mode 100644 backend/.sqlx/query-dea056c89313f4facd62cbbc9fa33ba30fa85efcc83fafe4dd7b4e535b96a8d8.json delete mode 100644 backend/.sqlx/query-df2a426658f0a36683cc2163fe70912d0221d191b8ab091601cb53cdd932ad58.json delete mode 100644 backend/.sqlx/query-e37ba13aa3174931f0bfcff26dbc141fe8a346ab6a1a3bc924794bfe3c9af306.json delete mode 100644 backend/.sqlx/query-e38240e6d50bfe60e1c2b649588eb41dcef121ed161db04b2568ac2d990aed7c.json delete mode 100644 backend/.sqlx/query-e38a66d15382703b99054a9b609af9f3854bb65393d33b265476c0e68aec4f61.json delete mode 100644 backend/.sqlx/query-e822d186203fe809b764007ad7c02870a3b7d93ae43b40ac2cd3181dffab0837.json delete mode 100644 backend/.sqlx/query-eb932b613a6dbb2cdff97e5512d42b538ba83115c0ea798be00b01659600f45a.json delete mode 100644 backend/.sqlx/query-ebbe03cad470d0c6ae98964f630315ff25dad08e4cb714718505b77a75d44b95.json delete mode 100644 backend/.sqlx/query-eda1e5d1109a13feb14be254eaca630be29176bd5d1246c974642d40201782fc.json delete mode 100644 backend/.sqlx/query-f16b00bad2880f896f4452e5894fe101cd5c2fe3e4c143c0b979668143d85dd2.json delete mode 100644 backend/.sqlx/query-f22964772dc2d67aee437bbbd08b64792c00da1d713d7ca8f9904ccce7bfdae7.json delete mode 100644 backend/.sqlx/query-f74589aaa72d0eb9f44157cc60eb121e63a7f31ed849834bb8ac9e8c726e81f1.json delete mode 100644 backend/.sqlx/query-f955a01779f5441efc6aa9364b24c79b3cbc6413046c3b6099d19f675d8a395b.json delete mode 100644 backend/.sqlx/query-fab5a746a179eea356f0bb9005590e3bb89c4deff181827bd2fa5630c21e42a7.json delete mode 100644 backend/.sqlx/query-faf2c77242e0ab39b33886edf3b742531bf1351d0be1c3631bde0adfe375497a.json delete mode 100644 backend/.sqlx/query-fb581eb6f883ebb5909a00c65a6e1217f088290fce0e052171230bcd88f945b9.json delete mode 100644 backend/.sqlx/query-fbe14569717b4c4937b74e6dc6f6b4ea29a2b0c2b1cde48ef06d687f6f9e8f15.json delete mode 100644 backend/.sqlx/query-fc8fa909ef7a15c7ad30dd938be3c13864e855219c7f366c86f0605ec25d1538.json delete mode 100644 backend/.sqlx/query-fd0a0ca4a107dc813240ad71f372ab7e0bf26431158fbfb5f0023ed847ca7dc5.json delete mode 100644 backend/.sqlx/query-ffb6b2a40b605f9c55826a0e519af80b100d2ffa58ec567223e27099d364fcc8.json diff --git a/backend/.sqlx/query-005b9255699e73600c579f74b529caf531b2312b6e405b4d35efd2f7ca663143.json b/backend/.sqlx/query-005b9255699e73600c579f74b529caf531b2312b6e405b4d35efd2f7ca663143.json deleted file mode 100644 index a2133ab230..0000000000 --- a/backend/.sqlx/query-005b9255699e73600c579f74b529caf531b2312b6e405b4d35efd2f7ca663143.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT email FROM password WHERE email = $1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "email", - "type_info": "Varchar" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - false - ] - }, - "hash": "005b9255699e73600c579f74b529caf531b2312b6e405b4d35efd2f7ca663143" -} diff --git a/backend/.sqlx/query-050fb876e10ad13654dbbde4532f408ff1ac92ed0f5d31a3ef6c58313e1f8671.json b/backend/.sqlx/query-050fb876e10ad13654dbbde4532f408ff1ac92ed0f5d31a3ef6c58313e1f8671.json deleted file mode 100644 index 9b50ef2c69..0000000000 --- a/backend/.sqlx/query-050fb876e10ad13654dbbde4532f408ff1ac92ed0f5d31a3ef6c58313e1f8671.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT healthy, created_at FROM healthchecks WHERE check_type = 'min_alive_workers_' || $1 ORDER BY created_at DESC LIMIT 1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "healthy", - "type_info": "Bool" - }, - { - "ordinal": 1, - "name": "created_at", - "type_info": "Timestamptz" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - false, - false - ] - }, - "hash": "050fb876e10ad13654dbbde4532f408ff1ac92ed0f5d31a3ef6c58313e1f8671" -} diff --git a/backend/.sqlx/query-070b8ad0b59f485fa5bf68082b060f5c3561c37e9c6f2834d234a862a475a6eb.json b/backend/.sqlx/query-070b8ad0b59f485fa5bf68082b060f5c3561c37e9c6f2834d234a862a475a6eb.json deleted file mode 100644 index 280db517dd..0000000000 --- a/backend/.sqlx/query-070b8ad0b59f485fa5bf68082b060f5c3561c37e9c6f2834d234a862a475a6eb.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n UPDATE \n gcp_trigger \n SET \n enabled = $1, \n email = $2, \n edited_by = $3, \n edited_at = now(), \n server_id = NULL, \n error = NULL\n WHERE \n path = $4 AND \n workspace_id = $5 \n RETURNING 1\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "?column?", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [ - "Bool", - "Varchar", - "Varchar", - "Text", - "Text" - ] - }, - "nullable": [ - null - ] - }, - "hash": "070b8ad0b59f485fa5bf68082b060f5c3561c37e9c6f2834d234a862a475a6eb" -} diff --git a/backend/.sqlx/query-08dd2ea6b17a52bce352d6443d7d009cfc9da0d3b2bd1f40d422b550779e5324.json b/backend/.sqlx/query-08dd2ea6b17a52bce352d6443d7d009cfc9da0d3b2bd1f40d422b550779e5324.json deleted file mode 100644 index b56784fd64..0000000000 --- a/backend/.sqlx/query-08dd2ea6b17a52bce352d6443d7d009cfc9da0d3b2bd1f40d422b550779e5324.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO variable\n (workspace_id, path, value, is_secret, account, is_oauth, expires_at)\n VALUES ($1, $2, $3, $4, $5, $6, $7)\n ON CONFLICT (workspace_id, path) DO UPDATE SET value = $3, expires_at = $7", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "Varchar", - "Varchar", - "Bool", - "Int4", - "Bool", - "Timestamptz" - ] - }, - "nullable": [] - }, - "hash": "08dd2ea6b17a52bce352d6443d7d009cfc9da0d3b2bd1f40d422b550779e5324" -} diff --git a/backend/.sqlx/query-08e4a2dc49c75aa356f3cc75a4abd8fc61409776d641ddb592a4c731e61a0468.json b/backend/.sqlx/query-08e4a2dc49c75aa356f3cc75a4abd8fc61409776d641ddb592a4c731e61a0468.json deleted file mode 100644 index 9da12fd0b8..0000000000 --- a/backend/.sqlx/query-08e4a2dc49c75aa356f3cc75a4abd8fc61409776d641ddb592a4c731e61a0468.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT login_type, COUNT(*) FROM password GROUP BY login_type", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "login_type", - "type_info": "Varchar" - }, - { - "ordinal": 1, - "name": "count", - "type_info": "Int8" - } - ], - "parameters": { - "Left": [] - }, - "nullable": [ - false, - null - ] - }, - "hash": "08e4a2dc49c75aa356f3cc75a4abd8fc61409776d641ddb592a4c731e61a0468" -} diff --git a/backend/.sqlx/query-08f288d2781d823e109a9e5b8848234ca7d1efeee9661f3901f298da375e73f7.json b/backend/.sqlx/query-08f288d2781d823e109a9e5b8848234ca7d1efeee9661f3901f298da375e73f7.json deleted file mode 100644 index 388fd55418..0000000000 --- a/backend/.sqlx/query-08f288d2781d823e109a9e5b8848234ca7d1efeee9661f3901f298da375e73f7.json +++ /dev/null @@ -1,184 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT * FROM workspace_settings WHERE teams_team_id = $1 AND teams_command_script IS NOT NULL", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "workspace_id", - "type_info": "Varchar" - }, - { - "ordinal": 1, - "name": "slack_team_id", - "type_info": "Varchar" - }, - { - "ordinal": 2, - "name": "slack_name", - "type_info": "Varchar" - }, - { - "ordinal": 3, - "name": "slack_command_script", - "type_info": "Varchar" - }, - { - "ordinal": 4, - "name": "slack_email", - "type_info": "Varchar" - }, - { - "ordinal": 5, - "name": "auto_invite_domain", - "type_info": "Varchar" - }, - { - "ordinal": 6, - "name": "auto_invite_operator", - "type_info": "Bool" - }, - { - "ordinal": 7, - "name": "customer_id", - "type_info": "Varchar" - }, - { - "ordinal": 8, - "name": "plan", - "type_info": "Varchar" - }, - { - "ordinal": 9, - "name": "webhook", - "type_info": "Text" - }, - { - "ordinal": 10, - "name": "deploy_to", - "type_info": "Varchar" - }, - { - "ordinal": 11, - "name": "error_handler", - "type_info": "Varchar" - }, - { - "ordinal": 12, - "name": "ai_config", - "type_info": "Jsonb" - }, - { - "ordinal": 13, - "name": "error_handler_extra_args", - "type_info": "Json" - }, - { - "ordinal": 14, - "name": "error_handler_muted_on_cancel", - "type_info": "Bool" - }, - { - "ordinal": 15, - "name": "large_file_storage", - "type_info": "Jsonb" - }, - { - "ordinal": 16, - "name": "git_sync", - "type_info": "Jsonb" - }, - { - "ordinal": 17, - "name": "default_app", - "type_info": "Varchar" - }, - { - "ordinal": 18, - "name": "auto_add", - "type_info": "Bool" - }, - { - "ordinal": 19, - "name": "default_scripts", - "type_info": "Jsonb" - }, - { - "ordinal": 20, - "name": "deploy_ui", - "type_info": "Jsonb" - }, - { - "ordinal": 21, - "name": "mute_critical_alerts", - "type_info": "Bool" - }, - { - "ordinal": 22, - "name": "color", - "type_info": "Varchar" - }, - { - "ordinal": 23, - "name": "operator_settings", - "type_info": "Jsonb" - }, - { - "ordinal": 24, - "name": "teams_command_script", - "type_info": "Text" - }, - { - "ordinal": 25, - "name": "teams_team_id", - "type_info": "Text" - }, - { - "ordinal": 26, - "name": "teams_team_name", - "type_info": "Text" - }, - { - "ordinal": 27, - "name": "git_app_installations", - "type_info": "Jsonb" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - false, - true, - true, - true, - false, - true, - true, - true, - true, - true, - true, - true, - true, - true, - false, - true, - true, - true, - true, - true, - true, - true, - true, - true, - true, - true, - true, - false - ] - }, - "hash": "08f288d2781d823e109a9e5b8848234ca7d1efeee9661f3901f298da375e73f7" -} diff --git a/backend/.sqlx/query-09e2a19435068f9e9bfd5bcb44b4e283c71729f81550f6f7156ce4970345cc07.json b/backend/.sqlx/query-09e2a19435068f9e9bfd5bcb44b4e283c71729f81550f6f7156ce4970345cc07.json deleted file mode 100644 index 8ece28ff8f..0000000000 --- a/backend/.sqlx/query-09e2a19435068f9e9bfd5bcb44b4e283c71729f81550f6f7156ce4970345cc07.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE account SET refresh_error = $1 WHERE workspace_id = $2 AND id = $3", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Text", - "Int4" - ] - }, - "nullable": [] - }, - "hash": "09e2a19435068f9e9bfd5bcb44b4e283c71729f81550f6f7156ce4970345cc07" -} diff --git a/backend/.sqlx/query-0c2e53960dc7786c848079b155e62994d4a861f1dbb9752c0a27428d83040e13.json b/backend/.sqlx/query-0c2e53960dc7786c848079b155e62994d4a861f1dbb9752c0a27428d83040e13.json deleted file mode 100644 index 5c33539878..0000000000 --- a/backend/.sqlx/query-0c2e53960dc7786c848079b155e62994d4a861f1dbb9752c0a27428d83040e13.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT value, is_secret FROM variable WHERE path = $1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "value", - "type_info": "Varchar" - }, - { - "ordinal": 1, - "name": "is_secret", - "type_info": "Bool" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - false, - false - ] - }, - "hash": "0c2e53960dc7786c848079b155e62994d4a861f1dbb9752c0a27428d83040e13" -} diff --git a/backend/.sqlx/query-0c9ad812013ff476a79ca8d6bb8b7a73d9492e07680732af9af09e223ade1f37.json b/backend/.sqlx/query-0c9ad812013ff476a79ca8d6bb8b7a73d9492e07680732af9af09e223ade1f37.json deleted file mode 100644 index dd536593e3..0000000000 --- a/backend/.sqlx/query-0c9ad812013ff476a79ca8d6bb8b7a73d9492e07680732af9af09e223ade1f37.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE workspace_settings SET auto_invite_domain = NULL, auto_invite_operator = NULL, auto_add = NULL WHERE workspace_id = $1", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [] - }, - "hash": "0c9ad812013ff476a79ca8d6bb8b7a73d9492e07680732af9af09e223ade1f37" -} diff --git a/backend/.sqlx/query-0cb84cbb9083d967cc8be1cccab5be61080c1003eef51eea41862b25c2b93de6.json b/backend/.sqlx/query-0cb84cbb9083d967cc8be1cccab5be61080c1003eef51eea41862b25c2b93de6.json deleted file mode 100644 index 35e2731f9a..0000000000 --- a/backend/.sqlx/query-0cb84cbb9083d967cc8be1cccab5be61080c1003eef51eea41862b25c2b93de6.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO metrics (id, value) VALUES ('telemetry', $1)", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Jsonb" - ] - }, - "nullable": [] - }, - "hash": "0cb84cbb9083d967cc8be1cccab5be61080c1003eef51eea41862b25c2b93de6" -} diff --git a/backend/.sqlx/query-0dd3fe3ddf9cb72760687d2ee0950afdcce2d54721bfe8dba008b15e4b581956.json b/backend/.sqlx/query-0dd3fe3ddf9cb72760687d2ee0950afdcce2d54721bfe8dba008b15e4b581956.json deleted file mode 100644 index af10226fa6..0000000000 --- a/backend/.sqlx/query-0dd3fe3ddf9cb72760687d2ee0950afdcce2d54721bfe8dba008b15e4b581956.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "DELETE FROM account WHERE id = $1 AND workspace_id = $2", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Int4", - "Text" - ] - }, - "nullable": [] - }, - "hash": "0dd3fe3ddf9cb72760687d2ee0950afdcce2d54721bfe8dba008b15e4b581956" -} diff --git a/backend/.sqlx/query-0ee14619dd81df460b2b8cc6df2b89646279f77469c35deffca8e17a11d7f6c8.json b/backend/.sqlx/query-0ee14619dd81df460b2b8cc6df2b89646279f77469c35deffca8e17a11d7f6c8.json deleted file mode 100644 index ac882aec64..0000000000 --- a/backend/.sqlx/query-0ee14619dd81df460b2b8cc6df2b89646279f77469c35deffca8e17a11d7f6c8.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT\n (elem->>'installation_id')::bigint as installation_id,\n elem->>'account_id' as account_id\n FROM workspace_settings,\n LATERAL jsonb_array_elements(git_app_installations) AS elem\n WHERE workspace_id = $1\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "installation_id", - "type_info": "Int8" - }, - { - "ordinal": 1, - "name": "account_id", - "type_info": "Text" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - null, - null - ] - }, - "hash": "0ee14619dd81df460b2b8cc6df2b89646279f77469c35deffca8e17a11d7f6c8" -} diff --git a/backend/.sqlx/query-0ef37117c369f03236e18f9dbb1f3d52776c8cb73f2507199c6ca16d4d2405ba.json b/backend/.sqlx/query-0ef37117c369f03236e18f9dbb1f3d52776c8cb73f2507199c6ca16d4d2405ba.json deleted file mode 100644 index 1394ed76a4..0000000000 --- a/backend/.sqlx/query-0ef37117c369f03236e18f9dbb1f3d52776c8cb73f2507199c6ca16d4d2405ba.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT email FROM password WHERE ($2::text = '*' OR email LIKE CONCAT('%', $2::text)) AND NOT EXISTS (\n SELECT 1 FROM usr WHERE workspace_id = $1::text AND email = password.email\n )", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "email", - "type_info": "Varchar" - } - ], - "parameters": { - "Left": [ - "Text", - "Text" - ] - }, - "nullable": [ - false - ] - }, - "hash": "0ef37117c369f03236e18f9dbb1f3d52776c8cb73f2507199c6ca16d4d2405ba" -} diff --git a/backend/.sqlx/query-1312b7fd622cc814a406c85dbbff61f003c29185c267642cfd898075ebda855d.json b/backend/.sqlx/query-1312b7fd622cc814a406c85dbbff61f003c29185c267642cfd898075ebda855d.json deleted file mode 100644 index 582896cc65..0000000000 --- a/backend/.sqlx/query-1312b7fd622cc814a406c85dbbff61f003c29185c267642cfd898075ebda855d.json +++ /dev/null @@ -1,145 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT\n gcp_resource_path,\n subscription_id,\n topic_id,\n workspace_id,\n delivery_type AS \"delivery_type: _\",\n delivery_config AS \"delivery_config: _\",\n subscription_mode AS \"subscription_mode: _\",\n path,\n script_path,\n is_flow,\n edited_by,\n email,\n edited_at,\n server_id,\n last_server_ping,\n extra_perms,\n error,\n enabled\n FROM \n gcp_trigger\n WHERE \n workspace_id = $1 AND \n path = $2\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "gcp_resource_path", - "type_info": "Varchar" - }, - { - "ordinal": 1, - "name": "subscription_id", - "type_info": "Varchar" - }, - { - "ordinal": 2, - "name": "topic_id", - "type_info": "Varchar" - }, - { - "ordinal": 3, - "name": "workspace_id", - "type_info": "Varchar" - }, - { - "ordinal": 4, - "name": "delivery_type: _", - "type_info": { - "Custom": { - "name": "delivery_mode", - "kind": { - "Enum": [ - "push", - "pull" - ] - } - } - } - }, - { - "ordinal": 5, - "name": "delivery_config: _", - "type_info": "Jsonb" - }, - { - "ordinal": 6, - "name": "subscription_mode: _", - "type_info": { - "Custom": { - "name": "gcp_subscription_mode", - "kind": { - "Enum": [ - "create_update", - "existing" - ] - } - } - } - }, - { - "ordinal": 7, - "name": "path", - "type_info": "Varchar" - }, - { - "ordinal": 8, - "name": "script_path", - "type_info": "Varchar" - }, - { - "ordinal": 9, - "name": "is_flow", - "type_info": "Bool" - }, - { - "ordinal": 10, - "name": "edited_by", - "type_info": "Varchar" - }, - { - "ordinal": 11, - "name": "email", - "type_info": "Varchar" - }, - { - "ordinal": 12, - "name": "edited_at", - "type_info": "Timestamptz" - }, - { - "ordinal": 13, - "name": "server_id", - "type_info": "Varchar" - }, - { - "ordinal": 14, - "name": "last_server_ping", - "type_info": "Timestamptz" - }, - { - "ordinal": 15, - "name": "extra_perms", - "type_info": "Jsonb" - }, - { - "ordinal": 16, - "name": "error", - "type_info": "Text" - }, - { - "ordinal": 17, - "name": "enabled", - "type_info": "Bool" - } - ], - "parameters": { - "Left": [ - "Text", - "Text" - ] - }, - "nullable": [ - false, - false, - false, - false, - false, - true, - false, - false, - false, - false, - false, - false, - false, - true, - true, - false, - true, - false - ] - }, - "hash": "1312b7fd622cc814a406c85dbbff61f003c29185c267642cfd898075ebda855d" -} diff --git a/backend/.sqlx/query-134fe14dd47e80a9ef9b245a59e74b9a1035ec21176468f147998ac89fbed465.json b/backend/.sqlx/query-134fe14dd47e80a9ef9b245a59e74b9a1035ec21176468f147998ac89fbed465.json deleted file mode 100644 index c8aa02d387..0000000000 --- a/backend/.sqlx/query-134fe14dd47e80a9ef9b245a59e74b9a1035ec21176468f147998ac89fbed465.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE global_settings SET value = $1 WHERE name = 'indexer_settings'", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Jsonb" - ] - }, - "nullable": [] - }, - "hash": "134fe14dd47e80a9ef9b245a59e74b9a1035ec21176468f147998ac89fbed465" -} diff --git a/backend/.sqlx/query-14abf759dae7ba5c38017ba6001927c6df0653a02b87bcea939066e39ebcf24d.json b/backend/.sqlx/query-14abf759dae7ba5c38017ba6001927c6df0653a02b87bcea939066e39ebcf24d.json deleted file mode 100644 index 29aaf47e88..0000000000 --- a/backend/.sqlx/query-14abf759dae7ba5c38017ba6001927c6df0653a02b87bcea939066e39ebcf24d.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO concurrency_locks (id, last_locked_at, owner)\n VALUES ($1, now(), $2)\n ON CONFLICT (id)\n DO UPDATE SET\n last_locked_at = now(),\n owner = $2", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "Varchar" - ] - }, - "nullable": [] - }, - "hash": "14abf759dae7ba5c38017ba6001927c6df0653a02b87bcea939066e39ebcf24d" -} diff --git a/backend/.sqlx/query-1625a84fbcf8c5f77eb0519f60d9418f85d4d3d599f4177403fad5ad99380715.json b/backend/.sqlx/query-1625a84fbcf8c5f77eb0519f60d9418f85d4d3d599f4177403fad5ad99380715.json deleted file mode 100644 index f0ee89dbc9..0000000000 --- a/backend/.sqlx/query-1625a84fbcf8c5f77eb0519f60d9418f85d4d3d599f4177403fad5ad99380715.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n UPDATE \n sqs_trigger \n SET \n enabled = $1, \n email = $2, \n edited_by = $3, \n edited_at = now(), \n server_id = NULL, \n error = NULL\n WHERE \n path = $4 AND \n workspace_id = $5 \n RETURNING 1\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "?column?", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [ - "Bool", - "Varchar", - "Varchar", - "Text", - "Text" - ] - }, - "nullable": [ - null - ] - }, - "hash": "1625a84fbcf8c5f77eb0519f60d9418f85d4d3d599f4177403fad5ad99380715" -} diff --git a/backend/.sqlx/query-19bc874a06658b549e13cfa080ac2133190ba448d6f7830c8f1f7c22e4d753b8.json b/backend/.sqlx/query-19bc874a06658b549e13cfa080ac2133190ba448d6f7830c8f1f7c22e4d753b8.json deleted file mode 100644 index 1fadd917d4..0000000000 --- a/backend/.sqlx/query-19bc874a06658b549e13cfa080ac2133190ba448d6f7830c8f1f7c22e4d753b8.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT value FROM global_settings WHERE name = 'slack'", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "value", - "type_info": "Jsonb" - } - ], - "parameters": { - "Left": [] - }, - "nullable": [ - false - ] - }, - "hash": "19bc874a06658b549e13cfa080ac2133190ba448d6f7830c8f1f7c22e4d753b8" -} diff --git a/backend/.sqlx/query-1ace9bdcde90fd2261fd64344a2d9474b17887711128dbb2ef15d247d50686b0.json b/backend/.sqlx/query-1ace9bdcde90fd2261fd64344a2d9474b17887711128dbb2ef15d247d50686b0.json deleted file mode 100644 index 9a8ef973a4..0000000000 --- a/backend/.sqlx/query-1ace9bdcde90fd2261fd64344a2d9474b17887711128dbb2ef15d247d50686b0.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT teams_team_id FROM workspace_settings WHERE workspace_id = $1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "teams_team_id", - "type_info": "Text" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - true - ] - }, - "hash": "1ace9bdcde90fd2261fd64344a2d9474b17887711128dbb2ef15d247d50686b0" -} diff --git a/backend/.sqlx/query-1b33393fbbc7e681b4d355f6096d982b52b48c8c3da392b14963a1ec86811546.json b/backend/.sqlx/query-1b33393fbbc7e681b4d355f6096d982b52b48c8c3da392b14963a1ec86811546.json deleted file mode 100644 index 271c60b480..0000000000 --- a/backend/.sqlx/query-1b33393fbbc7e681b4d355f6096d982b52b48c8c3da392b14963a1ec86811546.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT\n path,\n is_flow,\n workspace_id,\n owner,\n email,\n trigger_config as \"trigger_config!: _\"\n FROM\n capture_config\n WHERE\n trigger_kind = 'sqs' AND\n last_client_ping > NOW() - INTERVAL '10 seconds' AND\n trigger_config IS NOT NULL AND\n (last_server_ping IS NULL OR last_server_ping < now() - interval '15 seconds')\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "path", - "type_info": "Varchar" - }, - { - "ordinal": 1, - "name": "is_flow", - "type_info": "Bool" - }, - { - "ordinal": 2, - "name": "workspace_id", - "type_info": "Varchar" - }, - { - "ordinal": 3, - "name": "owner", - "type_info": "Varchar" - }, - { - "ordinal": 4, - "name": "email", - "type_info": "Varchar" - }, - { - "ordinal": 5, - "name": "trigger_config!: _", - "type_info": "Jsonb" - } - ], - "parameters": { - "Left": [] - }, - "nullable": [ - false, - false, - false, - false, - false, - true - ] - }, - "hash": "1b33393fbbc7e681b4d355f6096d982b52b48c8c3da392b14963a1ec86811546" -} diff --git a/backend/.sqlx/query-1c0f95a069891f7214505aaa9428e11e25c1d3a30294cbe78f01ed75edf68da4.json b/backend/.sqlx/query-1c0f95a069891f7214505aaa9428e11e25c1d3a30294cbe78f01ed75edf68da4.json deleted file mode 100644 index f00f41d16b..0000000000 --- a/backend/.sqlx/query-1c0f95a069891f7214505aaa9428e11e25c1d3a30294cbe78f01ed75edf68da4.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE kafka_trigger SET kafka_resource_path = $1, group_id = $2, topics = $3, script_path = $4, path = $5, is_flow = $6, edited_by = $7, email = $8, edited_at = now(), server_id = NULL, error = NULL\n WHERE workspace_id = $9 AND path = $10", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "Varchar", - "VarcharArray", - "Varchar", - "Varchar", - "Bool", - "Varchar", - "Varchar", - "Text", - "Text" - ] - }, - "nullable": [] - }, - "hash": "1c0f95a069891f7214505aaa9428e11e25c1d3a30294cbe78f01ed75edf68da4" -} diff --git a/backend/.sqlx/query-1c37f91192aa4f535c7fff80fa809260b906dc988f44a0db60952a2bf8b1cdaf.json b/backend/.sqlx/query-1c37f91192aa4f535c7fff80fa809260b906dc988f44a0db60952a2bf8b1cdaf.json deleted file mode 100644 index 946783d745..0000000000 --- a/backend/.sqlx/query-1c37f91192aa4f535c7fff80fa809260b906dc988f44a0db60952a2bf8b1cdaf.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE kafka_trigger SET last_server_ping = NULL WHERE workspace_id = $1 AND path = $2 AND server_id IS NULL", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Text" - ] - }, - "nullable": [] - }, - "hash": "1c37f91192aa4f535c7fff80fa809260b906dc988f44a0db60952a2bf8b1cdaf" -} diff --git a/backend/.sqlx/query-1cad25c24d0f80d58a50d4da923f8b0672797299545ee0754b6ad74ece92c77e.json b/backend/.sqlx/query-1cad25c24d0f80d58a50d4da923f8b0672797299545ee0754b6ad74ece92c77e.json deleted file mode 100644 index 0729adc8ba..0000000000 --- a/backend/.sqlx/query-1cad25c24d0f80d58a50d4da923f8b0672797299545ee0754b6ad74ece92c77e.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n UPDATE \n capture_config \n SET \n last_server_ping = now(), \n error = $1 \n WHERE \n workspace_id = $2 AND \n path = $3 AND \n is_flow = $4 AND \n trigger_kind = 'sqs' AND \n server_id = $5 AND \n last_client_ping > NOW() - INTERVAL '10 seconds' \n RETURNING 1\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "?column?", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [ - "Text", - "Text", - "Text", - "Bool", - "Text" - ] - }, - "nullable": [ - null - ] - }, - "hash": "1cad25c24d0f80d58a50d4da923f8b0672797299545ee0754b6ad74ece92c77e" -} diff --git a/backend/.sqlx/query-1d87f41fd1abb9361d795a899120e6b77e24bf5a9044fdc5284d0d7f1e14eafa.json b/backend/.sqlx/query-1d87f41fd1abb9361d795a899120e6b77e24bf5a9044fdc5284d0d7f1e14eafa.json deleted file mode 100644 index 6a79013c0b..0000000000 --- a/backend/.sqlx/query-1d87f41fd1abb9361d795a899120e6b77e24bf5a9044fdc5284d0d7f1e14eafa.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO usage (id, is_workspace, month_, usage) \n VALUES ($1, TRUE, EXTRACT(YEAR FROM current_date) * 12 + EXTRACT(MONTH FROM current_date), $2) \n ON CONFLICT (id, is_workspace, month_) DO UPDATE SET usage = usage.usage + $2", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "Int4" - ] - }, - "nullable": [] - }, - "hash": "1d87f41fd1abb9361d795a899120e6b77e24bf5a9044fdc5284d0d7f1e14eafa" -} diff --git a/backend/.sqlx/query-1f5f0858909eb5bac63c4e3b1add95226bd94ca3facb92a620ffa59dacad6705.json b/backend/.sqlx/query-1f5f0858909eb5bac63c4e3b1add95226bd94ca3facb92a620ffa59dacad6705.json deleted file mode 100644 index 0adff2fe2c..0000000000 --- a/backend/.sqlx/query-1f5f0858909eb5bac63c4e3b1add95226bd94ca3facb92a620ffa59dacad6705.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO autoscaling_event (worker_group, event_type, desired_workers, reason) VALUES ($1, $2, $3, $4)", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - { - "Custom": { - "name": "autoscaling_event_type", - "kind": { - "Enum": [ - "full_scaleout", - "scalein", - "scaleout" - ] - } - } - }, - "Int4", - "Text" - ] - }, - "nullable": [] - }, - "hash": "1f5f0858909eb5bac63c4e3b1add95226bd94ca3facb92a620ffa59dacad6705" -} diff --git a/backend/.sqlx/query-203fa78d423ec5a8c5ff6166aed591b28cbf9ea8f61d379b84ee6e14c033035d.json b/backend/.sqlx/query-203fa78d423ec5a8c5ff6166aed591b28cbf9ea8f61d379b84ee6e14c033035d.json deleted file mode 100644 index 65b1b24efb..0000000000 --- a/backend/.sqlx/query-203fa78d423ec5a8c5ff6166aed591b28cbf9ea8f61d379b84ee6e14c033035d.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE capture_config SET error = $1, server_id = NULL, last_server_ping = NULL WHERE workspace_id = $2 AND path = $3 AND is_flow = $4 AND trigger_kind = 'kafka'", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Text", - "Text", - "Bool" - ] - }, - "nullable": [] - }, - "hash": "203fa78d423ec5a8c5ff6166aed591b28cbf9ea8f61d379b84ee6e14c033035d" -} diff --git a/backend/.sqlx/query-2041526bc58872d71f91f7698144039bd67f8e37895befa94a15b7e4019e114b.json b/backend/.sqlx/query-2041526bc58872d71f91f7698144039bd67f8e37895befa94a15b7e4019e114b.json deleted file mode 100644 index cbe5ec7607..0000000000 --- a/backend/.sqlx/query-2041526bc58872d71f91f7698144039bd67f8e37895befa94a15b7e4019e114b.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "DELETE FROM healthchecks WHERE healthy = true AND created_at < NOW() - INTERVAL '14 days'", - "describe": { - "columns": [], - "parameters": { - "Left": [] - }, - "nullable": [] - }, - "hash": "2041526bc58872d71f91f7698144039bd67f8e37895befa94a15b7e4019e114b" -} diff --git a/backend/.sqlx/query-20e01ecb5d4aa4c532a8f906365c776994ae2c990bb7bb307c52296b9543fbb8.json b/backend/.sqlx/query-20e01ecb5d4aa4c532a8f906365c776994ae2c990bb7bb307c52296b9543fbb8.json deleted file mode 100644 index c9f7733011..0000000000 --- a/backend/.sqlx/query-20e01ecb5d4aa4c532a8f906365c776994ae2c990bb7bb307c52296b9543fbb8.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE \n capture_config \n SET \n last_server_ping = NULL \n WHERE \n workspace_id = $1 AND \n path = $2 AND \n is_flow = $3 AND \n trigger_kind = 'sqs' AND \n server_id IS NULL\n ", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Text", - "Bool" - ] - }, - "nullable": [] - }, - "hash": "20e01ecb5d4aa4c532a8f906365c776994ae2c990bb7bb307c52296b9543fbb8" -} diff --git a/backend/.sqlx/query-20fcdcd2674a52ee9bd8d1de518d6bce075f20bcd5d2328f183d8a59331f6bb1.json b/backend/.sqlx/query-20fcdcd2674a52ee9bd8d1de518d6bce075f20bcd5d2328f183d8a59331f6bb1.json deleted file mode 100644 index 824335990f..0000000000 --- a/backend/.sqlx/query-20fcdcd2674a52ee9bd8d1de518d6bce075f20bcd5d2328f183d8a59331f6bb1.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO resource\n (workspace_id, path, value, resource_type, created_by, edited_at)\n VALUES ($1, $2, $3, $4, $5, now()) ON CONFLICT (workspace_id, path) DO UPDATE SET value = $3, edited_at = now()", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "Varchar", - "Jsonb", - "Varchar", - "Varchar" - ] - }, - "nullable": [] - }, - "hash": "20fcdcd2674a52ee9bd8d1de518d6bce075f20bcd5d2328f183d8a59331f6bb1" -} diff --git a/backend/.sqlx/query-22dcd953d900fb0ddbe2099ccee27bcf833f56475bbc1aa3c8f6d79f146f41bf.json b/backend/.sqlx/query-22dcd953d900fb0ddbe2099ccee27bcf833f56475bbc1aa3c8f6d79f146f41bf.json deleted file mode 100644 index f94ca24f0f..0000000000 --- a/backend/.sqlx/query-22dcd953d900fb0ddbe2099ccee27bcf833f56475bbc1aa3c8f6d79f146f41bf.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n UPDATE \n sqs_trigger\n SET \n last_server_ping = now(),\n error = $1\n WHERE\n workspace_id = $2\n AND path = $3\n AND server_id = $4 \n AND enabled IS TRUE\n RETURNING 1\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "?column?", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [ - "Text", - "Text", - "Text", - "Text" - ] - }, - "nullable": [ - null - ] - }, - "hash": "22dcd953d900fb0ddbe2099ccee27bcf833f56475bbc1aa3c8f6d79f146f41bf" -} diff --git a/backend/.sqlx/query-22ff7c00b2d3e93ea9e147fc9a5bac1d55858f89039ae5baecdc9ceca668adab.json b/backend/.sqlx/query-22ff7c00b2d3e93ea9e147fc9a5bac1d55858f89039ae5baecdc9ceca668adab.json deleted file mode 100644 index c1c3292d9a..0000000000 --- a/backend/.sqlx/query-22ff7c00b2d3e93ea9e147fc9a5bac1d55858f89039ae5baecdc9ceca668adab.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE email_to_igroup SET email = $1 WHERE email = $2", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "Text" - ] - }, - "nullable": [] - }, - "hash": "22ff7c00b2d3e93ea9e147fc9a5bac1d55858f89039ae5baecdc9ceca668adab" -} diff --git a/backend/.sqlx/query-23c37d36e16251763fabf194e41de63612a7506cc0671b0eb83e528c1c839db4.json b/backend/.sqlx/query-23c37d36e16251763fabf194e41de63612a7506cc0671b0eb83e528c1c839db4.json deleted file mode 100644 index 917540aec4..0000000000 --- a/backend/.sqlx/query-23c37d36e16251763fabf194e41de63612a7506cc0671b0eb83e528c1c839db4.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE workspace_settings\n SET teams_team_id = null, teams_team_name = null WHERE workspace_id = $1", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [] - }, - "hash": "23c37d36e16251763fabf194e41de63612a7506cc0671b0eb83e528c1c839db4" -} diff --git a/backend/.sqlx/query-266741894b9a6ed650cf999b6e5b7c797424f8291517d3abf096fe45548a0273.json b/backend/.sqlx/query-266741894b9a6ed650cf999b6e5b7c797424f8291517d3abf096fe45548a0273.json deleted file mode 100644 index 41879871e1..0000000000 --- a/backend/.sqlx/query-266741894b9a6ed650cf999b6e5b7c797424f8291517d3abf096fe45548a0273.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT git_sync FROM workspace_settings WHERE workspace_id = $1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "git_sync", - "type_info": "Jsonb" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - true - ] - }, - "hash": "266741894b9a6ed650cf999b6e5b7c797424f8291517d3abf096fe45548a0273" -} diff --git a/backend/.sqlx/query-27920aaa55666ffc14a36a247f89ff7994ee40d3953b9f772d0e0ab999bccb7b.json b/backend/.sqlx/query-27920aaa55666ffc14a36a247f89ff7994ee40d3953b9f772d0e0ab999bccb7b.json deleted file mode 100644 index 26a8ba2ee2..0000000000 --- a/backend/.sqlx/query-27920aaa55666ffc14a36a247f89ff7994ee40d3953b9f772d0e0ab999bccb7b.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO healthchecks (check_type, healthy) VALUES ($1, false)", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar" - ] - }, - "nullable": [] - }, - "hash": "27920aaa55666ffc14a36a247f89ff7994ee40d3953b9f772d0e0ab999bccb7b" -} diff --git a/backend/.sqlx/query-299e16725162888c01712f371785199960264b54c1ddf928c0c654ab15176f63.json b/backend/.sqlx/query-299e16725162888c01712f371785199960264b54c1ddf928c0c654ab15176f63.json deleted file mode 100644 index d64d8f404b..0000000000 --- a/backend/.sqlx/query-299e16725162888c01712f371785199960264b54c1ddf928c0c654ab15176f63.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n UPDATE \n capture_config \n SET \n server_id = $1,\n last_server_ping = now(), \n error = 'Connecting...' \n WHERE \n last_client_ping > NOW() - INTERVAL '10 seconds' AND \n workspace_id = $2 AND \n path = $3 AND \n is_flow = $4 AND \n trigger_kind = 'gcp' AND \n (last_server_ping IS NULL OR last_server_ping < now() - interval '15 seconds') \n RETURNING true\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "?column?", - "type_info": "Bool" - } - ], - "parameters": { - "Left": [ - "Varchar", - "Text", - "Text", - "Bool" - ] - }, - "nullable": [ - null - ] - }, - "hash": "299e16725162888c01712f371785199960264b54c1ddf928c0c654ab15176f63" -} diff --git a/backend/.sqlx/query-2ae44acae7ac80e191b37071baa26e57488489177fe596940d3698d843a93666.json b/backend/.sqlx/query-2ae44acae7ac80e191b37071baa26e57488489177fe596940d3698d843a93666.json deleted file mode 100644 index 405902863c..0000000000 --- a/backend/.sqlx/query-2ae44acae7ac80e191b37071baa26e57488489177fe596940d3698d843a93666.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT script_path FROM v2_as_queue WHERE id = $1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "script_path", - "type_info": "Varchar" - } - ], - "parameters": { - "Left": [ - "Uuid" - ] - }, - "nullable": [ - true - ] - }, - "hash": "2ae44acae7ac80e191b37071baa26e57488489177fe596940d3698d843a93666" -} diff --git a/backend/.sqlx/query-2bf5f7f2cf9d85a5d23e5db2f7616fb41fece9b3d46fde2d546d70b46f9008e3.json b/backend/.sqlx/query-2bf5f7f2cf9d85a5d23e5db2f7616fb41fece9b3d46fde2d546d70b46f9008e3.json new file mode 100644 index 0000000000..d60b424505 --- /dev/null +++ b/backend/.sqlx/query-2bf5f7f2cf9d85a5d23e5db2f7616fb41fece9b3d46fde2d546d70b46f9008e3.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO usage (id, is_workspace, month_, usage) \n VALUES ($1, FALSE, EXTRACT(YEAR FROM current_date) * 12 + EXTRACT(MONTH FROM current_date), $2) \n ON CONFLICT (id, is_workspace, month_) DO UPDATE SET usage = usage.usage + $2", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Int4" + ] + }, + "nullable": [] + }, + "hash": "2bf5f7f2cf9d85a5d23e5db2f7616fb41fece9b3d46fde2d546d70b46f9008e3" +} diff --git a/backend/.sqlx/query-2dcff8b16da75740c362015b2293f578a21813f038d75184a5034c37d4daf36e.json b/backend/.sqlx/query-2dcff8b16da75740c362015b2293f578a21813f038d75184a5034c37d4daf36e.json deleted file mode 100644 index 5622b3691e..0000000000 --- a/backend/.sqlx/query-2dcff8b16da75740c362015b2293f578a21813f038d75184a5034c37d4daf36e.json +++ /dev/null @@ -1,142 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT\n gcp_resource_path,\n subscription_id,\n topic_id,\n workspace_id,\n delivery_type AS \"delivery_type: _\",\n delivery_config AS \"delivery_config: _\",\n subscription_mode AS \"subscription_mode: _\",\n path,\n script_path,\n is_flow,\n edited_by,\n email,\n edited_at,\n server_id,\n last_server_ping,\n extra_perms,\n error,\n enabled\n FROM\n gcp_trigger\n WHERE\n delivery_type != 'push'::DELIVERY_MODE AND\n enabled IS TRUE\n AND (last_server_ping IS NULL OR\n last_server_ping < now() - interval '15 seconds'\n )\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "gcp_resource_path", - "type_info": "Varchar" - }, - { - "ordinal": 1, - "name": "subscription_id", - "type_info": "Varchar" - }, - { - "ordinal": 2, - "name": "topic_id", - "type_info": "Varchar" - }, - { - "ordinal": 3, - "name": "workspace_id", - "type_info": "Varchar" - }, - { - "ordinal": 4, - "name": "delivery_type: _", - "type_info": { - "Custom": { - "name": "delivery_mode", - "kind": { - "Enum": [ - "push", - "pull" - ] - } - } - } - }, - { - "ordinal": 5, - "name": "delivery_config: _", - "type_info": "Jsonb" - }, - { - "ordinal": 6, - "name": "subscription_mode: _", - "type_info": { - "Custom": { - "name": "gcp_subscription_mode", - "kind": { - "Enum": [ - "create_update", - "existing" - ] - } - } - } - }, - { - "ordinal": 7, - "name": "path", - "type_info": "Varchar" - }, - { - "ordinal": 8, - "name": "script_path", - "type_info": "Varchar" - }, - { - "ordinal": 9, - "name": "is_flow", - "type_info": "Bool" - }, - { - "ordinal": 10, - "name": "edited_by", - "type_info": "Varchar" - }, - { - "ordinal": 11, - "name": "email", - "type_info": "Varchar" - }, - { - "ordinal": 12, - "name": "edited_at", - "type_info": "Timestamptz" - }, - { - "ordinal": 13, - "name": "server_id", - "type_info": "Varchar" - }, - { - "ordinal": 14, - "name": "last_server_ping", - "type_info": "Timestamptz" - }, - { - "ordinal": 15, - "name": "extra_perms", - "type_info": "Jsonb" - }, - { - "ordinal": 16, - "name": "error", - "type_info": "Text" - }, - { - "ordinal": 17, - "name": "enabled", - "type_info": "Bool" - } - ], - "parameters": { - "Left": [] - }, - "nullable": [ - false, - false, - false, - false, - false, - true, - false, - false, - false, - false, - false, - false, - false, - true, - true, - false, - true, - false - ] - }, - "hash": "2dcff8b16da75740c362015b2293f578a21813f038d75184a5034c37d4daf36e" -} diff --git a/backend/.sqlx/query-2e1d1c59bfc53d58962251822c85cf9a26e3b2888702e5e9d5fc1b082901df09.json b/backend/.sqlx/query-2e1d1c59bfc53d58962251822c85cf9a26e3b2888702e5e9d5fc1b082901df09.json deleted file mode 100644 index 6bbccc1fae..0000000000 --- a/backend/.sqlx/query-2e1d1c59bfc53d58962251822c85cf9a26e3b2888702e5e9d5fc1b082901df09.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO workspace_invite\n (workspace_id, email, is_admin, operator)\n SELECT $1::text, email, false, $3 FROM password WHERE ($2::text = '*' OR email LIKE CONCAT('%', $2::text)) AND NOT EXISTS (\n SELECT 1 FROM usr WHERE workspace_id = $1::text AND email = password.email\n )\n ON CONFLICT DO NOTHING", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Text", - "Bool" - ] - }, - "nullable": [] - }, - "hash": "2e1d1c59bfc53d58962251822c85cf9a26e3b2888702e5e9d5fc1b082901df09" -} diff --git a/backend/.sqlx/query-2e9b3e718440f3c5269e9217a13076c565f3add98b6768b5476bd3afed11ea31.json b/backend/.sqlx/query-2e9b3e718440f3c5269e9217a13076c565f3add98b6768b5476bd3afed11ea31.json deleted file mode 100644 index 70c5674cdf..0000000000 --- a/backend/.sqlx/query-2e9b3e718440f3c5269e9217a13076c565f3add98b6768b5476bd3afed11ea31.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO usage (id, is_workspace, month_, usage)\n VALUES ($1, FALSE, EXTRACT(YEAR FROM current_date) * 12 + EXTRACT(MONTH FROM current_date), 1)\n ON CONFLICT (id, is_workspace, month_) DO UPDATE SET usage = usage.usage + 1 \n RETURNING usage.usage", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "usage", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [ - "Varchar" - ] - }, - "nullable": [ - false - ] - }, - "hash": "2e9b3e718440f3c5269e9217a13076c565f3add98b6768b5476bd3afed11ea31" -} diff --git a/backend/.sqlx/query-33ee913ce263600a3f94f90e4a42cf0e4086030f3b7994e4892392765cbe1517.json b/backend/.sqlx/query-33ee913ce263600a3f94f90e4a42cf0e4086030f3b7994e4892392765cbe1517.json deleted file mode 100644 index 9b7581526e..0000000000 --- a/backend/.sqlx/query-33ee913ce263600a3f94f90e4a42cf0e4086030f3b7994e4892392765cbe1517.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT EXISTS(\n SELECT \n 1 \n FROM \n gcp_trigger \n WHERE \n path = $1 AND \n workspace_id = $2\n )", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "exists", - "type_info": "Bool" - } - ], - "parameters": { - "Left": [ - "Text", - "Text" - ] - }, - "nullable": [ - null - ] - }, - "hash": "33ee913ce263600a3f94f90e4a42cf0e4086030f3b7994e4892392765cbe1517" -} diff --git a/backend/.sqlx/query-34a45763bb4d14162f4cd3fa07cd8020f1f6085f4ee85f5eab3458637edf26cd.json b/backend/.sqlx/query-34a45763bb4d14162f4cd3fa07cd8020f1f6085f4ee85f5eab3458637edf26cd.json deleted file mode 100644 index f9dc00c28c..0000000000 --- a/backend/.sqlx/query-34a45763bb4d14162f4cd3fa07cd8020f1f6085f4ee85f5eab3458637edf26cd.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT created_at FROM healthchecks WHERE check_type = $1 ORDER BY created_at DESC LIMIT 1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "created_at", - "type_info": "Timestamptz" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - false - ] - }, - "hash": "34a45763bb4d14162f4cd3fa07cd8020f1f6085f4ee85f5eab3458637edf26cd" -} diff --git a/backend/.sqlx/query-354f88b23d20f92c6b6d5bdd8d6c69b08c6a86116cbfd0ecad8f112f7f49d8d1.json b/backend/.sqlx/query-354f88b23d20f92c6b6d5bdd8d6c69b08c6a86116cbfd0ecad8f112f7f49d8d1.json deleted file mode 100644 index 4b03b16262..0000000000 --- a/backend/.sqlx/query-354f88b23d20f92c6b6d5bdd8d6c69b08c6a86116cbfd0ecad8f112f7f49d8d1.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT SUBSTRING(name, 9) as \"name!\", (config.config->'min_alive_workers_alert_threshold')::INT as \"threshold!\" \n FROM config \n WHERE name LIKE 'worker__%' AND config->'min_alive_workers_alert_threshold' IS NOT NULL", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "name!", - "type_info": "Text" - }, - { - "ordinal": 1, - "name": "threshold!", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [] - }, - "nullable": [ - null, - null - ] - }, - "hash": "354f88b23d20f92c6b6d5bdd8d6c69b08c6a86116cbfd0ecad8f112f7f49d8d1" -} diff --git a/backend/.sqlx/query-388b3705f641621b0c2f4496e36cb7aa5a75b7e40fa312eff6590e54b02635a2.json b/backend/.sqlx/query-388b3705f641621b0c2f4496e36cb7aa5a75b7e40fa312eff6590e54b02635a2.json deleted file mode 100644 index 48f8d1e10c..0000000000 --- a/backend/.sqlx/query-388b3705f641621b0c2f4496e36cb7aa5a75b7e40fa312eff6590e54b02635a2.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT EXISTS(SELECT 1 FROM metrics WHERE id = 'license_key_renewal' AND created_at > NOW() - INTERVAL '24 hours')", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "exists", - "type_info": "Bool" - } - ], - "parameters": { - "Left": [] - }, - "nullable": [ - null - ] - }, - "hash": "388b3705f641621b0c2f4496e36cb7aa5a75b7e40fa312eff6590e54b02635a2" -} diff --git a/backend/.sqlx/query-38c20dba51b1e2b4b28e5eed51f9071e1d3cf78e89ec467927823177c5a439cc.json b/backend/.sqlx/query-38c20dba51b1e2b4b28e5eed51f9071e1d3cf78e89ec467927823177c5a439cc.json deleted file mode 100644 index 66681c2377..0000000000 --- a/backend/.sqlx/query-38c20dba51b1e2b4b28e5eed51f9071e1d3cf78e89ec467927823177c5a439cc.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT workspace_id FROM usr WHERE email = $1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "workspace_id", - "type_info": "Varchar" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - false - ] - }, - "hash": "38c20dba51b1e2b4b28e5eed51f9071e1d3cf78e89ec467927823177c5a439cc" -} diff --git a/backend/.sqlx/query-3997dcf2c11817e59bf50fd896381d870b847a8ba07e6197212fdf85ec901b09.json b/backend/.sqlx/query-3997dcf2c11817e59bf50fd896381d870b847a8ba07e6197212fdf85ec901b09.json deleted file mode 100644 index 4c90c24dd6..0000000000 --- a/backend/.sqlx/query-3997dcf2c11817e59bf50fd896381d870b847a8ba07e6197212fdf85ec901b09.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "DELETE FROM kafka_trigger WHERE workspace_id = $1 AND path = $2", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Text" - ] - }, - "nullable": [] - }, - "hash": "3997dcf2c11817e59bf50fd896381d870b847a8ba07e6197212fdf85ec901b09" -} diff --git a/backend/.sqlx/query-3b02f3ec6b92706c26065b2fa703cd1a1d6eca4083286c6f29c9acba522d2fe3.json b/backend/.sqlx/query-3b02f3ec6b92706c26065b2fa703cd1a1d6eca4083286c6f29c9acba522d2fe3.json deleted file mode 100644 index 7c35515d12..0000000000 --- a/backend/.sqlx/query-3b02f3ec6b92706c26065b2fa703cd1a1d6eca4083286c6f29c9acba522d2fe3.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT EXISTS (SELECT 1\n FROM workspace_settings\n WHERE workspace_id <> $1\n AND teams_command_script IS NOT NULL\n AND teams_team_id IS NOT NULL\n AND teams_team_id = (SELECT teams_team_id FROM workspace_settings WHERE workspace_id = $1))\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "exists", - "type_info": "Bool" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - null - ] - }, - "hash": "3b02f3ec6b92706c26065b2fa703cd1a1d6eca4083286c6f29c9acba522d2fe3" -} diff --git a/backend/.sqlx/query-3d8fdf7adf42b27808a5b223df3a660bfd5a8c0a451a0deac24632f0ccf66165.json b/backend/.sqlx/query-3d8fdf7adf42b27808a5b223df3a660bfd5a8c0a451a0deac24632f0ccf66165.json deleted file mode 100644 index c48927fdf2..0000000000 --- a/backend/.sqlx/query-3d8fdf7adf42b27808a5b223df3a660bfd5a8c0a451a0deac24632f0ccf66165.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE nats_trigger SET enabled = $1, email = $2, edited_by = $3, edited_at = now(), server_id = NULL, error = NULL\n WHERE path = $4 AND workspace_id = $5 RETURNING 1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "?column?", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [ - "Bool", - "Varchar", - "Varchar", - "Text", - "Text" - ] - }, - "nullable": [ - null - ] - }, - "hash": "3d8fdf7adf42b27808a5b223df3a660bfd5a8c0a451a0deac24632f0ccf66165" -} diff --git a/backend/.sqlx/query-3e64c894c89ef82c4527180b82c4e82c1b7060ba0ca288dc6a7c7afcd76212e8.json b/backend/.sqlx/query-3e64c894c89ef82c4527180b82c4e82c1b7060ba0ca288dc6a7c7afcd76212e8.json deleted file mode 100644 index 8831155670..0000000000 --- a/backend/.sqlx/query-3e64c894c89ef82c4527180b82c4e82c1b7060ba0ca288dc6a7c7afcd76212e8.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE kafka_trigger SET enabled = FALSE, error = $1, server_id = NULL, last_server_ping = NULL WHERE workspace_id = $2 AND path = $3", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Text", - "Text" - ] - }, - "nullable": [] - }, - "hash": "3e64c894c89ef82c4527180b82c4e82c1b7060ba0ca288dc6a7c7afcd76212e8" -} diff --git a/backend/.sqlx/query-3f5520e0ea00569bf169da9abde31617043fcc0bea3ef62c50fcd881f3d48605.json b/backend/.sqlx/query-3f5520e0ea00569bf169da9abde31617043fcc0bea3ef62c50fcd881f3d48605.json deleted file mode 100644 index b225a5a1da..0000000000 --- a/backend/.sqlx/query-3f5520e0ea00569bf169da9abde31617043fcc0bea3ef62c50fcd881f3d48605.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n INSERT INTO gcp_trigger (\n gcp_resource_path,\n subscription_id,\n topic_id,\n delivery_type,\n delivery_config,\n workspace_id, \n path, \n script_path, \n is_flow, \n email, \n enabled, \n edited_by\n ) \n VALUES (\n $1, \n $2, \n $3, \n $4,\n $5,\n $6, \n $7, \n $8, \n $9,\n $10,\n $11,\n $12\n )", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "Varchar", - "Varchar", - { - "Custom": { - "name": "delivery_mode", - "kind": { - "Enum": [ - "push", - "pull" - ] - } - } - }, - "Jsonb", - "Varchar", - "Varchar", - "Varchar", - "Bool", - "Varchar", - "Bool", - "Varchar" - ] - }, - "nullable": [] - }, - "hash": "3f5520e0ea00569bf169da9abde31617043fcc0bea3ef62c50fcd881f3d48605" -} diff --git a/backend/.sqlx/query-3f67e7cf8d9f021a075f1c88703287a9f42e252a1246a584249a224afdbbbf8a.json b/backend/.sqlx/query-3f67e7cf8d9f021a075f1c88703287a9f42e252a1246a584249a224afdbbbf8a.json deleted file mode 100644 index 8dec90897c..0000000000 --- a/backend/.sqlx/query-3f67e7cf8d9f021a075f1c88703287a9f42e252a1246a584249a224afdbbbf8a.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n UPDATE \n sqs_trigger \n SET \n enabled = FALSE, \n error = $1, \n server_id = NULL, \n last_server_ping = NULL \n WHERE \n workspace_id = $2 AND \n path = $3\n ", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Text", - "Text" - ] - }, - "nullable": [] - }, - "hash": "3f67e7cf8d9f021a075f1c88703287a9f42e252a1246a584249a224afdbbbf8a" -} diff --git a/backend/.sqlx/query-3fa3d1fa1add8e187fcbaf7351b721ad0f3e2888af207e8830ccf5e921c5fd60.json b/backend/.sqlx/query-3fa3d1fa1add8e187fcbaf7351b721ad0f3e2888af207e8830ccf5e921c5fd60.json deleted file mode 100644 index 3bb4151982..0000000000 --- a/backend/.sqlx/query-3fa3d1fa1add8e187fcbaf7351b721ad0f3e2888af207e8830ccf5e921c5fd60.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO concurrency_counter(concurrency_id, job_uuids) \n VALUES ($1, $2)\n ON CONFLICT (concurrency_id)\n DO UPDATE SET job_uuids = jsonb_set(concurrency_counter.job_uuids, array[$3], '{}')", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "Jsonb", - "Text" - ] - }, - "nullable": [] - }, - "hash": "3fa3d1fa1add8e187fcbaf7351b721ad0f3e2888af207e8830ccf5e921c5fd60" -} diff --git a/backend/.sqlx/query-42030372693d8d6b8d03947bb6702024cfa226735eeeb720bbab46bd0e3cedcc.json b/backend/.sqlx/query-42030372693d8d6b8d03947bb6702024cfa226735eeeb720bbab46bd0e3cedcc.json deleted file mode 100644 index cef1da340c..0000000000 --- a/backend/.sqlx/query-42030372693d8d6b8d03947bb6702024cfa226735eeeb720bbab46bd0e3cedcc.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT path, is_flow, workspace_id, trigger_config as \"trigger_config!: _\", owner, email FROM capture_config WHERE trigger_kind = 'nats' AND last_client_ping > NOW() - INTERVAL '10 seconds' AND trigger_config IS NOT NULL AND (last_server_ping IS NULL OR last_server_ping < now() - interval '15 seconds')", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "path", - "type_info": "Varchar" - }, - { - "ordinal": 1, - "name": "is_flow", - "type_info": "Bool" - }, - { - "ordinal": 2, - "name": "workspace_id", - "type_info": "Varchar" - }, - { - "ordinal": 3, - "name": "trigger_config!: _", - "type_info": "Jsonb" - }, - { - "ordinal": 4, - "name": "owner", - "type_info": "Varchar" - }, - { - "ordinal": 5, - "name": "email", - "type_info": "Varchar" - } - ], - "parameters": { - "Left": [] - }, - "nullable": [ - false, - false, - false, - true, - false, - false - ] - }, - "hash": "42030372693d8d6b8d03947bb6702024cfa226735eeeb720bbab46bd0e3cedcc" -} diff --git a/backend/.sqlx/query-42df4b40b3bbf14010f07e29892776992bfeb383d590e379244ad23703e536a4.json b/backend/.sqlx/query-42df4b40b3bbf14010f07e29892776992bfeb383d590e379244ad23703e536a4.json deleted file mode 100644 index 695b4d2969..0000000000 --- a/backend/.sqlx/query-42df4b40b3bbf14010f07e29892776992bfeb383d590e379244ad23703e536a4.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO resource\n (workspace_id, path, value, description, resource_type, created_by, edited_at)\n VALUES ($1, $2, $3, $4, $5, $6, now()) ON CONFLICT (workspace_id, path) DO UPDATE SET value = $3, edited_at = now()", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "Varchar", - "Jsonb", - "Text", - "Varchar", - "Varchar" - ] - }, - "nullable": [] - }, - "hash": "42df4b40b3bbf14010f07e29892776992bfeb383d590e379244ad23703e536a4" -} diff --git a/backend/.sqlx/query-43b376a2eff086a32cd76e54361ce3631feee1565935d2a6ddbecc17950758d1.json b/backend/.sqlx/query-43b376a2eff086a32cd76e54361ce3631feee1565935d2a6ddbecc17950758d1.json deleted file mode 100644 index 5b9eeaa790..0000000000 --- a/backend/.sqlx/query-43b376a2eff086a32cd76e54361ce3631feee1565935d2a6ddbecc17950758d1.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO workspace_settings\n (workspace_id, slack_team_id, slack_name, slack_email)\n VALUES ($1, $2, $3, $4) ON CONFLICT (workspace_id) DO UPDATE SET slack_team_id = $2, slack_name = $3, slack_email = $4", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "Varchar", - "Varchar", - "Varchar" - ] - }, - "nullable": [] - }, - "hash": "43b376a2eff086a32cd76e54361ce3631feee1565935d2a6ddbecc17950758d1" -} diff --git a/backend/.sqlx/query-43c8cd9f8560412bb06d9966ccfa2524943ba277c5f9a37c06bd5ee14fd46bda.json b/backend/.sqlx/query-43c8cd9f8560412bb06d9966ccfa2524943ba277c5f9a37c06bd5ee14fd46bda.json deleted file mode 100644 index 7d6ecdbf32..0000000000 --- a/backend/.sqlx/query-43c8cd9f8560412bb06d9966ccfa2524943ba277c5f9a37c06bd5ee14fd46bda.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n UPDATE \n capture_config \n SET \n error = $1, \n server_id = NULL, \n last_server_ping = NULL \n WHERE \n workspace_id = $2 AND \n path = $3 AND \n is_flow = $4 AND \n trigger_kind = 'gcp'\n ", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Text", - "Text", - "Bool" - ] - }, - "nullable": [] - }, - "hash": "43c8cd9f8560412bb06d9966ccfa2524943ba277c5f9a37c06bd5ee14fd46bda" -} diff --git a/backend/.sqlx/query-44a12919fb154055f1142cc078ef131f8a0c9cdb37cfba6283a6718480b02a4b.json b/backend/.sqlx/query-44a12919fb154055f1142cc078ef131f8a0c9cdb37cfba6283a6718480b02a4b.json deleted file mode 100644 index 18c572b1fb..0000000000 --- a/backend/.sqlx/query-44a12919fb154055f1142cc078ef131f8a0c9cdb37cfba6283a6718480b02a4b.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT value, is_secret, expires_at FROM variable WHERE path = $1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "value", - "type_info": "Varchar" - }, - { - "ordinal": 1, - "name": "is_secret", - "type_info": "Bool" - }, - { - "ordinal": 2, - "name": "expires_at", - "type_info": "Timestamptz" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - false, - false, - true - ] - }, - "hash": "44a12919fb154055f1142cc078ef131f8a0c9cdb37cfba6283a6718480b02a4b" -} diff --git a/backend/.sqlx/query-44b9bea3651edc8ee732def1241b3d956c004376102ccc1707fc016801599dbd.json b/backend/.sqlx/query-44b9bea3651edc8ee732def1241b3d956c004376102ccc1707fc016801599dbd.json deleted file mode 100644 index 87d384f5a1..0000000000 --- a/backend/.sqlx/query-44b9bea3651edc8ee732def1241b3d956c004376102ccc1707fc016801599dbd.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n UPDATE \n gcp_trigger \n SET \n gcp_resource_path = $1,\n subscription_id = $2,\n topic_id = $3,\n delivery_type = $4,\n delivery_config = $5,\n is_flow = $6, \n edited_by = $7, \n email = $8,\n script_path = $9,\n path = $10,\n enabled = $11,\n edited_at = now(), \n error = NULL,\n server_id = NULL\n WHERE \n workspace_id = $12 AND \n path = $13\n ", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "Varchar", - "Varchar", - { - "Custom": { - "name": "delivery_mode", - "kind": { - "Enum": [ - "push", - "pull" - ] - } - } - }, - "Jsonb", - "Bool", - "Varchar", - "Varchar", - "Varchar", - "Varchar", - "Bool", - "Text", - "Text" - ] - }, - "nullable": [] - }, - "hash": "44b9bea3651edc8ee732def1241b3d956c004376102ccc1707fc016801599dbd" -} diff --git a/backend/.sqlx/query-45dde0dc2da12fe46b5975ed53b520fc4160c008c3d29fe7d99e609c0b6e3e6d.json b/backend/.sqlx/query-45dde0dc2da12fe46b5975ed53b520fc4160c008c3d29fe7d99e609c0b6e3e6d.json deleted file mode 100644 index edb113673b..0000000000 --- a/backend/.sqlx/query-45dde0dc2da12fe46b5975ed53b520fc4160c008c3d29fe7d99e609c0b6e3e6d.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "DELETE FROM metrics WHERE created_at < NOW() - INTERVAL '180 day'", - "describe": { - "columns": [], - "parameters": { - "Left": [] - }, - "nullable": [] - }, - "hash": "45dde0dc2da12fe46b5975ed53b520fc4160c008c3d29fe7d99e609c0b6e3e6d" -} diff --git a/backend/.sqlx/query-4887db074e9058bc0c1887428d6b2a897fe4b30c83f2aa5e9464c156f08f1c3a.json b/backend/.sqlx/query-4887db074e9058bc0c1887428d6b2a897fe4b30c83f2aa5e9464c156f08f1c3a.json deleted file mode 100644 index 2988f2c0e5..0000000000 --- a/backend/.sqlx/query-4887db074e9058bc0c1887428d6b2a897fe4b30c83f2aa5e9464c156f08f1c3a.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT worker, worker_instance, vcpus, memory FROM worker_ping WHERE ping_at > NOW() - INTERVAL '2 minutes'", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "worker", - "type_info": "Varchar" - }, - { - "ordinal": 1, - "name": "worker_instance", - "type_info": "Varchar" - }, - { - "ordinal": 2, - "name": "vcpus", - "type_info": "Int8" - }, - { - "ordinal": 3, - "name": "memory", - "type_info": "Int8" - } - ], - "parameters": { - "Left": [] - }, - "nullable": [ - false, - false, - true, - true - ] - }, - "hash": "4887db074e9058bc0c1887428d6b2a897fe4b30c83f2aa5e9464c156f08f1c3a" -} diff --git a/backend/.sqlx/query-4968e9edac534657c808b891cbf93c8c0a57f93b7b445171b1cc3f4428ee6e53.json b/backend/.sqlx/query-4968e9edac534657c808b891cbf93c8c0a57f93b7b445171b1cc3f4428ee6e53.json deleted file mode 100644 index 08bc20e88b..0000000000 --- a/backend/.sqlx/query-4968e9edac534657c808b891cbf93c8c0a57f93b7b445171b1cc3f4428ee6e53.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO deployment_metadata (workspace_id, path, flow_version, callback_job_ids, deployment_msg) VALUES ($1, $2, $3, $4, $5)", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "Varchar", - "Int8", - "UuidArray", - "Text" - ] - }, - "nullable": [] - }, - "hash": "4968e9edac534657c808b891cbf93c8c0a57f93b7b445171b1cc3f4428ee6e53" -} diff --git a/backend/.sqlx/query-4b8132b04e454eddfe6724c6cc3a2e60c9c24decb2a6b41125247bbf741e9c25.json b/backend/.sqlx/query-4b8132b04e454eddfe6724c6cc3a2e60c9c24decb2a6b41125247bbf741e9c25.json deleted file mode 100644 index ab5b04afc6..0000000000 --- a/backend/.sqlx/query-4b8132b04e454eddfe6724c6cc3a2e60c9c24decb2a6b41125247bbf741e9c25.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT owner, premium, usage.usage as \"usage?\", workspace_settings.customer_id, workspace_settings.plan FROM workspace LEFT JOIN workspace_settings ON workspace_settings.workspace_id = $1 LEFT JOIN usage ON usage.id = $1 AND month_ = EXTRACT(YEAR FROM current_date) * 12 + EXTRACT(MONTH FROM current_date) AND usage.is_workspace IS true WHERE workspace.id = $1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "owner", - "type_info": "Varchar" - }, - { - "ordinal": 1, - "name": "premium", - "type_info": "Bool" - }, - { - "ordinal": 2, - "name": "usage?", - "type_info": "Int4" - }, - { - "ordinal": 3, - "name": "customer_id", - "type_info": "Varchar" - }, - { - "ordinal": 4, - "name": "plan", - "type_info": "Varchar" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - false, - false, - false, - true, - true - ] - }, - "hash": "4b8132b04e454eddfe6724c6cc3a2e60c9c24decb2a6b41125247bbf741e9c25" -} diff --git a/backend/.sqlx/query-4cfa57b2a836242d55071ef237855b21bbc487b80bda7fd6250ac12e93938577.json b/backend/.sqlx/query-4cfa57b2a836242d55071ef237855b21bbc487b80bda7fd6250ac12e93938577.json deleted file mode 100644 index 5ac1cd561e..0000000000 --- a/backend/.sqlx/query-4cfa57b2a836242d55071ef237855b21bbc487b80bda7fd6250ac12e93938577.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO healthchecks (check_type, healthy) \n SELECT 'min_alive_workers_' || $1, true \n WHERE NOT EXISTS (\n SELECT 1 FROM healthchecks \n WHERE check_type = 'min_alive_workers_' || $1 AND created_at > NOW() - INTERVAL '2 minutes'\n )\n RETURNING id", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Int8" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - false - ] - }, - "hash": "4cfa57b2a836242d55071ef237855b21bbc487b80bda7fd6250ac12e93938577" -} diff --git a/backend/.sqlx/query-4e3469185637ad8f06673261bfae1b38c30f7d2689baf647ea4dc6b398c3a651.json b/backend/.sqlx/query-4e3469185637ad8f06673261bfae1b38c30f7d2689baf647ea4dc6b398c3a651.json deleted file mode 100644 index c6a6f72876..0000000000 --- a/backend/.sqlx/query-4e3469185637ad8f06673261bfae1b38c30f7d2689baf647ea4dc6b398c3a651.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT elem\n FROM workspace_settings,\n LATERAL jsonb_array_elements(git_app_installations) AS elem\n WHERE workspace_id = $1\n AND (elem->>'installation_id')::bigint = $2\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "elem", - "type_info": "Jsonb" - } - ], - "parameters": { - "Left": [ - "Text", - "Int8" - ] - }, - "nullable": [ - null - ] - }, - "hash": "4e3469185637ad8f06673261bfae1b38c30f7d2689baf647ea4dc6b398c3a651" -} diff --git a/backend/.sqlx/query-4e5273b9ce05f6ee2dfd5f14c8574a0cf43682480452f7dbe23012320fe7fe25.json b/backend/.sqlx/query-4e5273b9ce05f6ee2dfd5f14c8574a0cf43682480452f7dbe23012320fe7fe25.json deleted file mode 100644 index 8176539a30..0000000000 --- a/backend/.sqlx/query-4e5273b9ce05f6ee2dfd5f14c8574a0cf43682480452f7dbe23012320fe7fe25.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT \n tag, \n script_lang AS \"script_lang!: _\"\n FROM \n v2_job\n WHERE \n id = $1\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "tag", - "type_info": "Varchar" - }, - { - "ordinal": 1, - "name": "script_lang!: _", - "type_info": { - "Custom": { - "name": "script_lang", - "kind": { - "Enum": [ - "python3", - "deno", - "go", - "bash", - "postgresql", - "nativets", - "bun", - "mysql", - "bigquery", - "snowflake", - "graphql", - "powershell", - "mssql", - "php", - "bunnative", - "rust", - "ansible", - "csharp", - "oracledb", - "nu", - "java", - "duckdb" - ] - } - } - } - } - ], - "parameters": { - "Left": [ - "Uuid" - ] - }, - "nullable": [ - false, - true - ] - }, - "hash": "4e5273b9ce05f6ee2dfd5f14c8574a0cf43682480452f7dbe23012320fe7fe25" -} diff --git a/backend/.sqlx/query-4eca060026a0cb19c5794cd56ace89fc04765191f251945d14bbe78718714f6e.json b/backend/.sqlx/query-4eca060026a0cb19c5794cd56ace89fc04765191f251945d14bbe78718714f6e.json deleted file mode 100644 index 3b812a53db..0000000000 --- a/backend/.sqlx/query-4eca060026a0cb19c5794cd56ace89fc04765191f251945d14bbe78718714f6e.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT event_type::AUTOSCALING_EVENT_TYPE AS \"event_type: _\", EXTRACT(EPOCH FROM (NOW() - applied_at))::int as seconds_ago FROM autoscaling_event WHERE worker_group = $1 ORDER BY applied_at DESC LIMIT 1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "event_type: _", - "type_info": { - "Custom": { - "name": "autoscaling_event_type", - "kind": { - "Enum": [ - "full_scaleout", - "scalein", - "scaleout" - ] - } - } - } - }, - { - "ordinal": 1, - "name": "seconds_ago", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - false, - null - ] - }, - "hash": "4eca060026a0cb19c5794cd56ace89fc04765191f251945d14bbe78718714f6e" -} diff --git a/backend/.sqlx/query-50c17c7848760aaf0f869acfc444caecda6335eda5b2e97e5a7370361653ff48.json b/backend/.sqlx/query-50c17c7848760aaf0f869acfc444caecda6335eda5b2e97e5a7370361653ff48.json deleted file mode 100644 index f3dc153254..0000000000 --- a/backend/.sqlx/query-50c17c7848760aaf0f869acfc444caecda6335eda5b2e97e5a7370361653ff48.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n WITH assigned_teams AS (\n SELECT teams_team_id\n FROM workspace_settings\n ),\n all_teams AS (\n SELECT jsonb_array_elements(CASE\n WHEN jsonb_typeof(value::jsonb) = 'array' THEN value::jsonb\n ELSE '[]'::jsonb\n END) AS team\n FROM global_settings\n WHERE name = 'teams'\n )\n SELECT team->>'team_name' AS team_name, team->>'team_internal_id' AS team_id\n FROM all_teams\n WHERE NOT EXISTS (\n SELECT 1\n FROM assigned_teams\n WHERE assigned_teams.teams_team_id = team->>'team_internal_id'\n )\n AND team->>'team_name' IS NOT NULL\n AND team->>'team_id' IS NOT NULL\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "team_name", - "type_info": "Text" - }, - { - "ordinal": 1, - "name": "team_id", - "type_info": "Text" - } - ], - "parameters": { - "Left": [] - }, - "nullable": [ - null, - null - ] - }, - "hash": "50c17c7848760aaf0f869acfc444caecda6335eda5b2e97e5a7370361653ff48" -} diff --git a/backend/.sqlx/query-51dbf8e3814c2d63df1958db12d5bacbb4bbe3bb4725eece43fb82944212f21d.json b/backend/.sqlx/query-51dbf8e3814c2d63df1958db12d5bacbb4bbe3bb4725eece43fb82944212f21d.json deleted file mode 100644 index 451324ca6b..0000000000 --- a/backend/.sqlx/query-51dbf8e3814c2d63df1958db12d5bacbb4bbe3bb4725eece43fb82944212f21d.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT name FROM instance_group WHERE id = $1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "name", - "type_info": "Varchar" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - false - ] - }, - "hash": "51dbf8e3814c2d63df1958db12d5bacbb4bbe3bb4725eece43fb82944212f21d" -} diff --git a/backend/.sqlx/query-5237f9d3f57f4e799968a4a9630c984775d23c7a4dc1a7ad37528a46ab89d6bd.json b/backend/.sqlx/query-5237f9d3f57f4e799968a4a9630c984775d23c7a4dc1a7ad37528a46ab89d6bd.json deleted file mode 100644 index f9c6646e3a..0000000000 --- a/backend/.sqlx/query-5237f9d3f57f4e799968a4a9630c984775d23c7a4dc1a7ad37528a46ab89d6bd.json +++ /dev/null @@ -1,123 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT\n aws_auth_resource_type AS \"aws_auth_resource_type: _\",\n aws_resource_path,\n message_attributes,\n queue_url,\n workspace_id,\n path,\n script_path,\n is_flow,\n edited_by,\n email,\n edited_at,\n server_id,\n last_server_ping,\n extra_perms,\n error,\n enabled\n FROM \n sqs_trigger\n WHERE \n workspace_id = $1 AND \n path = $2\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "aws_auth_resource_type: _", - "type_info": { - "Custom": { - "name": "aws_auth_resource_type", - "kind": { - "Enum": [ - "oidc", - "credentials" - ] - } - } - } - }, - { - "ordinal": 1, - "name": "aws_resource_path", - "type_info": "Varchar" - }, - { - "ordinal": 2, - "name": "message_attributes", - "type_info": "TextArray" - }, - { - "ordinal": 3, - "name": "queue_url", - "type_info": "Varchar" - }, - { - "ordinal": 4, - "name": "workspace_id", - "type_info": "Varchar" - }, - { - "ordinal": 5, - "name": "path", - "type_info": "Varchar" - }, - { - "ordinal": 6, - "name": "script_path", - "type_info": "Varchar" - }, - { - "ordinal": 7, - "name": "is_flow", - "type_info": "Bool" - }, - { - "ordinal": 8, - "name": "edited_by", - "type_info": "Varchar" - }, - { - "ordinal": 9, - "name": "email", - "type_info": "Varchar" - }, - { - "ordinal": 10, - "name": "edited_at", - "type_info": "Timestamptz" - }, - { - "ordinal": 11, - "name": "server_id", - "type_info": "Varchar" - }, - { - "ordinal": 12, - "name": "last_server_ping", - "type_info": "Timestamptz" - }, - { - "ordinal": 13, - "name": "extra_perms", - "type_info": "Jsonb" - }, - { - "ordinal": 14, - "name": "error", - "type_info": "Text" - }, - { - "ordinal": 15, - "name": "enabled", - "type_info": "Bool" - } - ], - "parameters": { - "Left": [ - "Text", - "Text" - ] - }, - "nullable": [ - false, - false, - true, - false, - false, - false, - false, - false, - false, - false, - false, - true, - true, - true, - true, - false - ] - }, - "hash": "5237f9d3f57f4e799968a4a9630c984775d23c7a4dc1a7ad37528a46ab89d6bd" -} diff --git a/backend/.sqlx/query-528cdbb75f1c5135170a58fce3fda464be138272487639d0ffbbbe6961ec5c37.json b/backend/.sqlx/query-528cdbb75f1c5135170a58fce3fda464be138272487639d0ffbbbe6961ec5c37.json deleted file mode 100644 index e998bea512..0000000000 --- a/backend/.sqlx/query-528cdbb75f1c5135170a58fce3fda464be138272487639d0ffbbbe6961ec5c37.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE job_logs SET logs = $1, log_offset = $2, \n log_file_index = array_append(coalesce(log_file_index, array[]::text[]), $3) \n WHERE workspace_id = $4 AND job_id = $5", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Int4", - "Text", - "Text", - "Uuid" - ] - }, - "nullable": [] - }, - "hash": "528cdbb75f1c5135170a58fce3fda464be138272487639d0ffbbbe6961ec5c37" -} diff --git a/backend/.sqlx/query-5303206bbed76ee3ddc56d8057d8b82359c182ee2a5da6df35a4375d5d2d1ef7.json b/backend/.sqlx/query-5303206bbed76ee3ddc56d8057d8b82359c182ee2a5da6df35a4375d5d2d1ef7.json deleted file mode 100644 index f010362e6f..0000000000 --- a/backend/.sqlx/query-5303206bbed76ee3ddc56d8057d8b82359c182ee2a5da6df35a4375d5d2d1ef7.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT \n gcp_resource_path, \n script_path,\n is_flow, \n workspace_id,\n path,\n edited_by,\n email,\n delivery_config AS \"delivery_config: _\"\n FROM\n gcp_trigger\n WHERE\n workspace_id = $1 AND\n path = $2 AND\n delivery_type = 'push'::DELIVERY_MODE \n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "gcp_resource_path", - "type_info": "Varchar" - }, - { - "ordinal": 1, - "name": "script_path", - "type_info": "Varchar" - }, - { - "ordinal": 2, - "name": "is_flow", - "type_info": "Bool" - }, - { - "ordinal": 3, - "name": "workspace_id", - "type_info": "Varchar" - }, - { - "ordinal": 4, - "name": "path", - "type_info": "Varchar" - }, - { - "ordinal": 5, - "name": "edited_by", - "type_info": "Varchar" - }, - { - "ordinal": 6, - "name": "email", - "type_info": "Varchar" - }, - { - "ordinal": 7, - "name": "delivery_config: _", - "type_info": "Jsonb" - } - ], - "parameters": { - "Left": [ - "Text", - "Text" - ] - }, - "nullable": [ - false, - false, - false, - false, - false, - false, - false, - true - ] - }, - "hash": "5303206bbed76ee3ddc56d8057d8b82359c182ee2a5da6df35a4375d5d2d1ef7" -} diff --git a/backend/.sqlx/query-54c6be1469a80d88fd6d5c30772bb6698610189bac63c2caee3f4d52b0851f31.json b/backend/.sqlx/query-54c6be1469a80d88fd6d5c30772bb6698610189bac63c2caee3f4d52b0851f31.json deleted file mode 100644 index c8759a0193..0000000000 --- a/backend/.sqlx/query-54c6be1469a80d88fd6d5c30772bb6698610189bac63c2caee3f4d52b0851f31.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO password(email, verified, password_hash, login_type, super_admin, name, company, username)\n VALUES ($1, $2, $3, 'password', $4, $5, $6, $7)", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "Bool", - "Varchar", - "Bool", - "Varchar", - "Varchar", - "Varchar" - ] - }, - "nullable": [] - }, - "hash": "54c6be1469a80d88fd6d5c30772bb6698610189bac63c2caee3f4d52b0851f31" -} diff --git a/backend/.sqlx/query-551c78392919e18019bb0a4344fb1bd45853bf5b72e0ab991e0e61fedcfb42fc.json b/backend/.sqlx/query-551c78392919e18019bb0a4344fb1bd45853bf5b72e0ab991e0e61fedcfb42fc.json deleted file mode 100644 index 4a9bcd8cf3..0000000000 --- a/backend/.sqlx/query-551c78392919e18019bb0a4344fb1bd45853bf5b72e0ab991e0e61fedcfb42fc.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n UPDATE workspace_settings\n SET teams_team_id = $1, teams_team_name = $2\n WHERE workspace_id = $3\n AND NOT EXISTS (\n SELECT 1 FROM workspace_settings\n WHERE teams_team_id = $1 AND workspace_id <> $2\n )\n ", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Text", - "Text" - ] - }, - "nullable": [] - }, - "hash": "551c78392919e18019bb0a4344fb1bd45853bf5b72e0ab991e0e61fedcfb42fc" -} diff --git a/backend/.sqlx/query-55a2f170823f1d1abce76287d8817a6cf34de92b9b4079c00b75423a9ff835b9.json b/backend/.sqlx/query-55a2f170823f1d1abce76287d8817a6cf34de92b9b4079c00b75423a9ff835b9.json deleted file mode 100644 index 7b7dd7fe29..0000000000 --- a/backend/.sqlx/query-55a2f170823f1d1abce76287d8817a6cf34de92b9b4079c00b75423a9ff835b9.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO variable\n (workspace_id, path, value, is_secret, description, account, is_oauth)\n VALUES ($1, $2, $3, $4, $5, $6, $7)\n ON CONFLICT (workspace_id, path) DO UPDATE SET value = $3", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "Varchar", - "Varchar", - "Bool", - "Varchar", - "Int4", - "Bool" - ] - }, - "nullable": [] - }, - "hash": "55a2f170823f1d1abce76287d8817a6cf34de92b9b4079c00b75423a9ff835b9" -} diff --git a/backend/.sqlx/query-55cb03040bc2a8c53dd7fbb42bbdcc40f463cbc52d94ed9315cf9a547d4c89f2.json b/backend/.sqlx/query-55cb03040bc2a8c53dd7fbb42bbdcc40f463cbc52d94ed9315cf9a547d4c89f2.json deleted file mode 100644 index 009d9fe5d1..0000000000 --- a/backend/.sqlx/query-55cb03040bc2a8c53dd7fbb42bbdcc40f463cbc52d94ed9315cf9a547d4c89f2.json +++ /dev/null @@ -1,184 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT * FROM workspace_settings WHERE slack_team_id = $1 AND slack_command_script IS NOT NULL", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "workspace_id", - "type_info": "Varchar" - }, - { - "ordinal": 1, - "name": "slack_team_id", - "type_info": "Varchar" - }, - { - "ordinal": 2, - "name": "slack_name", - "type_info": "Varchar" - }, - { - "ordinal": 3, - "name": "slack_command_script", - "type_info": "Varchar" - }, - { - "ordinal": 4, - "name": "slack_email", - "type_info": "Varchar" - }, - { - "ordinal": 5, - "name": "auto_invite_domain", - "type_info": "Varchar" - }, - { - "ordinal": 6, - "name": "auto_invite_operator", - "type_info": "Bool" - }, - { - "ordinal": 7, - "name": "customer_id", - "type_info": "Varchar" - }, - { - "ordinal": 8, - "name": "plan", - "type_info": "Varchar" - }, - { - "ordinal": 9, - "name": "webhook", - "type_info": "Text" - }, - { - "ordinal": 10, - "name": "deploy_to", - "type_info": "Varchar" - }, - { - "ordinal": 11, - "name": "error_handler", - "type_info": "Varchar" - }, - { - "ordinal": 12, - "name": "ai_config", - "type_info": "Jsonb" - }, - { - "ordinal": 13, - "name": "error_handler_extra_args", - "type_info": "Json" - }, - { - "ordinal": 14, - "name": "error_handler_muted_on_cancel", - "type_info": "Bool" - }, - { - "ordinal": 15, - "name": "large_file_storage", - "type_info": "Jsonb" - }, - { - "ordinal": 16, - "name": "git_sync", - "type_info": "Jsonb" - }, - { - "ordinal": 17, - "name": "default_app", - "type_info": "Varchar" - }, - { - "ordinal": 18, - "name": "auto_add", - "type_info": "Bool" - }, - { - "ordinal": 19, - "name": "default_scripts", - "type_info": "Jsonb" - }, - { - "ordinal": 20, - "name": "deploy_ui", - "type_info": "Jsonb" - }, - { - "ordinal": 21, - "name": "mute_critical_alerts", - "type_info": "Bool" - }, - { - "ordinal": 22, - "name": "color", - "type_info": "Varchar" - }, - { - "ordinal": 23, - "name": "operator_settings", - "type_info": "Jsonb" - }, - { - "ordinal": 24, - "name": "teams_command_script", - "type_info": "Text" - }, - { - "ordinal": 25, - "name": "teams_team_id", - "type_info": "Text" - }, - { - "ordinal": 26, - "name": "teams_team_name", - "type_info": "Text" - }, - { - "ordinal": 27, - "name": "git_app_installations", - "type_info": "Jsonb" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - false, - true, - true, - true, - false, - true, - true, - true, - true, - true, - true, - true, - true, - true, - false, - true, - true, - true, - true, - true, - true, - true, - true, - true, - true, - true, - true, - false - ] - }, - "hash": "55cb03040bc2a8c53dd7fbb42bbdcc40f463cbc52d94ed9315cf9a547d4c89f2" -} diff --git a/backend/.sqlx/query-55cf43cb9219b43f8e9f94b23b62846cd0b1ef5f64d20b0d975d0058730f427b.json b/backend/.sqlx/query-55cf43cb9219b43f8e9f94b23b62846cd0b1ef5f64d20b0d975d0058730f427b.json deleted file mode 100644 index e68f25d6ab..0000000000 --- a/backend/.sqlx/query-55cf43cb9219b43f8e9f94b23b62846cd0b1ef5f64d20b0d975d0058730f427b.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT job FROM token WHERE token = $1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "job", - "type_info": "Uuid" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - true - ] - }, - "hash": "55cf43cb9219b43f8e9f94b23b62846cd0b1ef5f64d20b0d975d0058730f427b" -} diff --git a/backend/.sqlx/query-56b2326015fde12b1a4efa226518566101dd27a0f3363884781071d417f8b7e7.json b/backend/.sqlx/query-56b2326015fde12b1a4efa226518566101dd27a0f3363884781071d417f8b7e7.json new file mode 100644 index 0000000000..9da0554266 --- /dev/null +++ b/backend/.sqlx/query-56b2326015fde12b1a4efa226518566101dd27a0f3363884781071d417f8b7e7.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO usage (id, is_workspace, month_, usage)\n VALUES ($1, FALSE, EXTRACT(YEAR FROM current_date) * 12 + EXTRACT(MONTH FROM current_date), 1)\n ON CONFLICT (id, is_workspace, month_) DO UPDATE SET usage = usage.usage + 1 \n RETURNING usage.usage", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "usage", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Varchar" + ] + }, + "nullable": [ + false + ] + }, + "hash": "56b2326015fde12b1a4efa226518566101dd27a0f3363884781071d417f8b7e7" +} diff --git a/backend/.sqlx/query-574d9a2bb6eceb62f3d2c2be3f18b29ef8bba3d6da1b1e21f2ca307ccbebee89.json b/backend/.sqlx/query-574d9a2bb6eceb62f3d2c2be3f18b29ef8bba3d6da1b1e21f2ca307ccbebee89.json deleted file mode 100644 index dd673ef52c..0000000000 --- a/backend/.sqlx/query-574d9a2bb6eceb62f3d2c2be3f18b29ef8bba3d6da1b1e21f2ca307ccbebee89.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE instance_group SET scim_display_name = $1, name = $2 where id = $3", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "Varchar", - "Text" - ] - }, - "nullable": [] - }, - "hash": "574d9a2bb6eceb62f3d2c2be3f18b29ef8bba3d6da1b1e21f2ca307ccbebee89" -} diff --git a/backend/.sqlx/query-57e270e032e8c04dda7b5c1ca949861756b3ad367a4a500728332a7cb91560a4.json b/backend/.sqlx/query-57e270e032e8c04dda7b5c1ca949861756b3ad367a4a500728332a7cb91560a4.json deleted file mode 100644 index ccf6b0ad8f..0000000000 --- a/backend/.sqlx/query-57e270e032e8c04dda7b5c1ca949861756b3ad367a4a500728332a7cb91560a4.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE concurrency_locks SET\n last_locked_at = now()\n WHERE id = $1 AND owner = $2", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Text" - ] - }, - "nullable": [] - }, - "hash": "57e270e032e8c04dda7b5c1ca949861756b3ad367a4a500728332a7cb91560a4" -} diff --git a/backend/.sqlx/query-5930b2fa72fd15d692bcf3e14d95f85dd67ab1514d7c48668ab2f10aa6b201ba.json b/backend/.sqlx/query-5930b2fa72fd15d692bcf3e14d95f85dd67ab1514d7c48668ab2f10aa6b201ba.json deleted file mode 100644 index d616940b6b..0000000000 --- a/backend/.sqlx/query-5930b2fa72fd15d692bcf3e14d95f85dd67ab1514d7c48668ab2f10aa6b201ba.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE v2_job_runtime SET ping = now() WHERE id = $1", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Uuid" - ] - }, - "nullable": [] - }, - "hash": "5930b2fa72fd15d692bcf3e14d95f85dd67ab1514d7c48668ab2f10aa6b201ba" -} diff --git a/backend/.sqlx/query-5bd8ae8d694ac9f6afef762276141d95ba195f5543120e76e68f6e6715b65a71.json b/backend/.sqlx/query-5bd8ae8d694ac9f6afef762276141d95ba195f5543120e76e68f6e6715b65a71.json deleted file mode 100644 index 31700319e2..0000000000 --- a/backend/.sqlx/query-5bd8ae8d694ac9f6afef762276141d95ba195f5543120e76e68f6e6715b65a71.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n UPDATE \n sqs_trigger \n SET \n server_id = $1, \n last_server_ping = now(),\n error = 'Connecting...'\n WHERE \n enabled IS TRUE \n AND workspace_id = $2 \n AND path = $3 \n AND (last_server_ping IS NULL \n OR last_server_ping < now() - INTERVAL '15 seconds'\n ) \n RETURNING true\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "?column?", - "type_info": "Bool" - } - ], - "parameters": { - "Left": [ - "Varchar", - "Text", - "Text" - ] - }, - "nullable": [ - null - ] - }, - "hash": "5bd8ae8d694ac9f6afef762276141d95ba195f5543120e76e68f6e6715b65a71" -} diff --git a/backend/.sqlx/query-5f22a7c9170f035779782591b4bfb1d462d5c796f08c7481c42154f9bfacf388.json b/backend/.sqlx/query-5f22a7c9170f035779782591b4bfb1d462d5c796f08c7481c42154f9bfacf388.json deleted file mode 100644 index 1aea7e585c..0000000000 --- a/backend/.sqlx/query-5f22a7c9170f035779782591b4bfb1d462d5c796f08c7481c42154f9bfacf388.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO healthchecks (check_type, healthy) \n SELECT 'min_alive_workers_' || $1, false\n WHERE NOT EXISTS (\n SELECT 1 FROM healthchecks \n WHERE check_type = 'min_alive_workers_' || $1 AND created_at > NOW() - INTERVAL '2 minutes'\n )\n RETURNING id", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Int8" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - false - ] - }, - "hash": "5f22a7c9170f035779782591b4bfb1d462d5c796f08c7481c42154f9bfacf388" -} diff --git a/backend/.sqlx/query-5faba1042763a308c64e36cc2a331d90bc0aa384262e473c7006340dcb6e959c.json b/backend/.sqlx/query-5faba1042763a308c64e36cc2a331d90bc0aa384262e473c7006340dcb6e959c.json deleted file mode 100644 index 9b7f1962a4..0000000000 --- a/backend/.sqlx/query-5faba1042763a308c64e36cc2a331d90bc0aa384262e473c7006340dcb6e959c.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT value FROM resource WHERE workspace_id = $1 AND path = $2", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "value", - "type_info": "Jsonb" - } - ], - "parameters": { - "Left": [ - "Text", - "Text" - ] - }, - "nullable": [ - true - ] - }, - "hash": "5faba1042763a308c64e36cc2a331d90bc0aa384262e473c7006340dcb6e959c" -} diff --git a/backend/.sqlx/query-5fd70c70ce52cbc51fa9124cb05f82b5951f17d1b7eade53c6d89253d55f8b9f.json b/backend/.sqlx/query-5fd70c70ce52cbc51fa9124cb05f82b5951f17d1b7eade53c6d89253d55f8b9f.json deleted file mode 100644 index 51f58cb81c..0000000000 --- a/backend/.sqlx/query-5fd70c70ce52cbc51fa9124cb05f82b5951f17d1b7eade53c6d89253d55f8b9f.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT owner FROM concurrency_locks WHERE id = $1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "owner", - "type_info": "Varchar" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - true - ] - }, - "hash": "5fd70c70ce52cbc51fa9124cb05f82b5951f17d1b7eade53c6d89253d55f8b9f" -} diff --git a/backend/.sqlx/query-6032ab9ab230c48a44f684e70ebc3277a2543cd3b52a3123b0585f6c9071552c.json b/backend/.sqlx/query-6032ab9ab230c48a44f684e70ebc3277a2543cd3b52a3123b0585f6c9071552c.json deleted file mode 100644 index aa8142ab1a..0000000000 --- a/backend/.sqlx/query-6032ab9ab230c48a44f684e70ebc3277a2543cd3b52a3123b0585f6c9071552c.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT name, id, scim_display_name, array_remove(array_agg(email_to_igroup.email), null) as emails, external_id FROM email_to_igroup RIGHT JOIN instance_group ON instance_group.name = email_to_igroup.igroup WHERE id = $1 group by name, id", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "name", - "type_info": "Varchar" - }, - { - "ordinal": 1, - "name": "id", - "type_info": "Varchar" - }, - { - "ordinal": 2, - "name": "scim_display_name", - "type_info": "Varchar" - }, - { - "ordinal": 3, - "name": "emails", - "type_info": "VarcharArray" - }, - { - "ordinal": 4, - "name": "external_id", - "type_info": "Varchar" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - false, - true, - true, - null, - true - ] - }, - "hash": "6032ab9ab230c48a44f684e70ebc3277a2543cd3b52a3123b0585f6c9071552c" -} diff --git a/backend/.sqlx/query-621e9a2a53187dac3ebed62f0d645b692815f1594bf302dbebd5f80d5d22b98e.json b/backend/.sqlx/query-621e9a2a53187dac3ebed62f0d645b692815f1594bf302dbebd5f80d5d22b98e.json deleted file mode 100644 index 6a66bb6f22..0000000000 --- a/backend/.sqlx/query-621e9a2a53187dac3ebed62f0d645b692815f1594bf302dbebd5f80d5d22b98e.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO usage (id, is_workspace, month_, usage)\n VALUES ($1, TRUE, EXTRACT(YEAR FROM current_date) * 12 + EXTRACT(MONTH FROM current_date), 1)\n ON CONFLICT (id, is_workspace, month_) DO UPDATE SET usage = usage.usage + 1 \n RETURNING usage.usage", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "usage", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [ - "Varchar" - ] - }, - "nullable": [ - false - ] - }, - "hash": "621e9a2a53187dac3ebed62f0d645b692815f1594bf302dbebd5f80d5d22b98e" -} diff --git a/backend/.sqlx/query-64c5ca0bd4a2c42d6f5415fae1de21295673c45e4caae1bdbb47517d4608dc8d.json b/backend/.sqlx/query-64c5ca0bd4a2c42d6f5415fae1de21295673c45e4caae1bdbb47517d4608dc8d.json deleted file mode 100644 index d2460a340b..0000000000 --- a/backend/.sqlx/query-64c5ca0bd4a2c42d6f5415fae1de21295673c45e4caae1bdbb47517d4608dc8d.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE workspace_settings SET auto_invite_domain = $1, auto_invite_operator = $2, auto_add = $4 WHERE workspace_id = $3", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "Bool", - "Text", - "Bool" - ] - }, - "nullable": [] - }, - "hash": "64c5ca0bd4a2c42d6f5415fae1de21295673c45e4caae1bdbb47517d4608dc8d" -} diff --git a/backend/.sqlx/query-656f268969018438499f677d31720e85b2eed7b4705367361fc5e456e5263df9.json b/backend/.sqlx/query-656f268969018438499f677d31720e85b2eed7b4705367361fc5e456e5263df9.json deleted file mode 100644 index c72a8c9d8f..0000000000 --- a/backend/.sqlx/query-656f268969018438499f677d31720e85b2eed7b4705367361fc5e456e5263df9.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE email_to_igroup SET igroup = $2 WHERE igroup = $1", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Varchar" - ] - }, - "nullable": [] - }, - "hash": "656f268969018438499f677d31720e85b2eed7b4705367361fc5e456e5263df9" -} diff --git a/backend/.sqlx/query-673564e6c4dcf30dae3d7a75c397998ea800860ede856e5fc6cd1f57d5408333.json b/backend/.sqlx/query-673564e6c4dcf30dae3d7a75c397998ea800860ede856e5fc6cd1f57d5408333.json deleted file mode 100644 index 8b9a46c4d0..0000000000 --- a/backend/.sqlx/query-673564e6c4dcf30dae3d7a75c397998ea800860ede856e5fc6cd1f57d5408333.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE \n capture_config \n SET \n last_server_ping = NULL \n WHERE \n workspace_id = $1 AND \n path = $2 AND \n is_flow = $3 AND \n trigger_kind = 'gcp' AND \n server_id IS NULL\n ", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Text", - "Bool" - ] - }, - "nullable": [] - }, - "hash": "673564e6c4dcf30dae3d7a75c397998ea800860ede856e5fc6cd1f57d5408333" -} diff --git a/backend/.sqlx/query-689551fddbff09acd3f000ae54f25cc496528768f8ee4c6924b13bb8f75a9f8a.json b/backend/.sqlx/query-689551fddbff09acd3f000ae54f25cc496528768f8ee4c6924b13bb8f75a9f8a.json deleted file mode 100644 index 4c27ae3807..0000000000 --- a/backend/.sqlx/query-689551fddbff09acd3f000ae54f25cc496528768f8ee4c6924b13bb8f75a9f8a.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE instance_group SET external_id = $1 WHERE name = $2", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "Text" - ] - }, - "nullable": [] - }, - "hash": "689551fddbff09acd3f000ae54f25cc496528768f8ee4c6924b13bb8f75a9f8a" -} diff --git a/backend/.sqlx/query-69518153298f8ca6f112bed156b520758656ce6bcd1e694a62e140e0af8c59fa.json b/backend/.sqlx/query-69518153298f8ca6f112bed156b520758656ce6bcd1e694a62e140e0af8c59fa.json deleted file mode 100644 index f96e0e349a..0000000000 --- a/backend/.sqlx/query-69518153298f8ca6f112bed156b520758656ce6bcd1e694a62e140e0af8c59fa.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n UPDATE workspace_settings\n SET git_app_installations = COALESCE(\n (\n SELECT jsonb_agg(elem)\n FROM (\n SELECT elem\n FROM jsonb_array_elements(git_app_installations) AS elem\n WHERE (elem->>'installation_id')::bigint != ($1::jsonb->>'installation_id')::bigint\n UNION ALL\n SELECT $1::jsonb\n ) sub\n ),\n jsonb_build_array($1::jsonb)\n )\n WHERE workspace_id = $2;\n ", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Jsonb", - "Text" - ] - }, - "nullable": [] - }, - "hash": "69518153298f8ca6f112bed156b520758656ce6bcd1e694a62e140e0af8c59fa" -} diff --git a/backend/.sqlx/query-6a72df33cf12824c54b29dbf011f2390af9d02efc7112a32a84e1a1247a95973.json b/backend/.sqlx/query-6a72df33cf12824c54b29dbf011f2390af9d02efc7112a32a84e1a1247a95973.json deleted file mode 100644 index 1521b9fd2f..0000000000 --- a/backend/.sqlx/query-6a72df33cf12824c54b29dbf011f2390af9d02efc7112a32a84e1a1247a95973.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT worker, worker_instance, vcpus, memory, ping_at, started_at, worker_group FROM worker_ping WHERE ping_at > now() - interval '30 days' ORDER BY started_at", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "worker", - "type_info": "Varchar" - }, - { - "ordinal": 1, - "name": "worker_instance", - "type_info": "Varchar" - }, - { - "ordinal": 2, - "name": "vcpus", - "type_info": "Int8" - }, - { - "ordinal": 3, - "name": "memory", - "type_info": "Int8" - }, - { - "ordinal": 4, - "name": "ping_at", - "type_info": "Timestamptz" - }, - { - "ordinal": 5, - "name": "started_at", - "type_info": "Timestamptz" - }, - { - "ordinal": 6, - "name": "worker_group", - "type_info": "Varchar" - } - ], - "parameters": { - "Left": [] - }, - "nullable": [ - false, - false, - true, - true, - false, - false, - false - ] - }, - "hash": "6a72df33cf12824c54b29dbf011f2390af9d02efc7112a32a84e1a1247a95973" -} diff --git a/backend/.sqlx/query-6b776693091191f36eaf9e35fb3cabb01481a19bef5a956dc36cac41acad0e53.json b/backend/.sqlx/query-6b776693091191f36eaf9e35fb3cabb01481a19bef5a956dc36cac41acad0e53.json deleted file mode 100644 index 97079df64f..0000000000 --- a/backend/.sqlx/query-6b776693091191f36eaf9e35fb3cabb01481a19bef5a956dc36cac41acad0e53.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n UPDATE \n capture_config \n SET \n server_id = $1,\n last_server_ping = now(), \n error = 'Connecting...' \n WHERE \n last_client_ping > NOW() - INTERVAL '10 seconds' AND \n workspace_id = $2 AND \n path = $3 AND \n is_flow = $4 AND \n trigger_kind = 'sqs' AND \n (last_server_ping IS NULL OR last_server_ping < now() - interval '15 seconds') \n RETURNING true\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "?column?", - "type_info": "Bool" - } - ], - "parameters": { - "Left": [ - "Varchar", - "Text", - "Text", - "Bool" - ] - }, - "nullable": [ - null - ] - }, - "hash": "6b776693091191f36eaf9e35fb3cabb01481a19bef5a956dc36cac41acad0e53" -} diff --git a/backend/.sqlx/query-6bb4fab9e74c421fb30cfd856a1a9b44c76f1cf1485ceba50aeede9daec94c01.json b/backend/.sqlx/query-6bb4fab9e74c421fb30cfd856a1a9b44c76f1cf1485ceba50aeede9daec94c01.json deleted file mode 100644 index 20bdf25c03..0000000000 --- a/backend/.sqlx/query-6bb4fab9e74c421fb30cfd856a1a9b44c76f1cf1485ceba50aeede9daec94c01.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO deployment_metadata (workspace_id, path, script_hash, callback_job_ids, deployment_msg) VALUES ($1, $2, $3, $4, $5)", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "Varchar", - "Int8", - "UuidArray", - "Text" - ] - }, - "nullable": [] - }, - "hash": "6bb4fab9e74c421fb30cfd856a1a9b44c76f1cf1485ceba50aeede9daec94c01" -} diff --git a/backend/.sqlx/query-6d418b5cd7a4df54cfe3ec06e2a957c87f2307a218115ca749ea0e71eca2002e.json b/backend/.sqlx/query-6d418b5cd7a4df54cfe3ec06e2a957c87f2307a218115ca749ea0e71eca2002e.json deleted file mode 100644 index c20295fe97..0000000000 --- a/backend/.sqlx/query-6d418b5cd7a4df54cfe3ec06e2a957c87f2307a218115ca749ea0e71eca2002e.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT EXISTS(SELECT 1 FROM kafka_trigger WHERE path = $1 AND workspace_id = $2)", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "exists", - "type_info": "Bool" - } - ], - "parameters": { - "Left": [ - "Text", - "Text" - ] - }, - "nullable": [ - null - ] - }, - "hash": "6d418b5cd7a4df54cfe3ec06e2a957c87f2307a218115ca749ea0e71eca2002e" -} diff --git a/backend/.sqlx/query-6e2564dc37ee967c634deade67ceabc4c516418e595dee9cd7d651acc1f4af6e.json b/backend/.sqlx/query-6e2564dc37ee967c634deade67ceabc4c516418e595dee9cd7d651acc1f4af6e.json deleted file mode 100644 index 1ab5672e7d..0000000000 --- a/backend/.sqlx/query-6e2564dc37ee967c634deade67ceabc4c516418e595dee9cd7d651acc1f4af6e.json +++ /dev/null @@ -1,248 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT\n cj.id AS \"id!\",\n cj.workspace_id AS \"workspace_id!\",\n cj.parent_job,\n cj.created_by AS \"created_by!\",\n cj.duration_ms AS \"duration_ms!\",\n cj.success AS \"success!\",\n cj.script_hash AS \"script_hash!: Option\",\n cj.script_path,\n cj.args AS \"args: sqlx::types::Json>>\",\n cj.result AS \"result: sqlx::types::Json>\",\n cj.deleted AS \"deleted!\",\n cj.canceled AS \"canceled!\",\n cj.canceled_by,\n cj.canceled_reason,\n cj.job_kind AS \"job_kind!: JobKind\",\n cj.schedule_path,\n cj.permissioned_as AS \"permissioned_as!\",\n cj.is_flow_step AS \"is_flow_step!\",\n cj.language AS \"language: ScriptLang\",\n cj.is_skipped AS \"is_skipped!\",\n cj.email AS \"email!\",\n cj.visible_to_owner AS \"visible_to_owner!\",\n cj.mem_peak,\n cj.tag AS \"tag!\",\n cj.created_at AS \"created_at!\",\n cj.started_at,\n job_logs.logs,\n job_logs.log_offset AS \"log_offset?\",\n job_logs.log_file_index\n\n FROM v2_as_completed_job AS cj\n LEFT JOIN job_logs ON cj.id = job_logs.job_id\n WHERE (cj.created_at > $1 AND cj.created_at < $3)\n OR cj.id = ANY($2)\n ORDER BY cj.created_at ASC LIMIT $4", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id!", - "type_info": "Uuid" - }, - { - "ordinal": 1, - "name": "workspace_id!", - "type_info": "Varchar" - }, - { - "ordinal": 2, - "name": "parent_job", - "type_info": "Uuid" - }, - { - "ordinal": 3, - "name": "created_by!", - "type_info": "Varchar" - }, - { - "ordinal": 4, - "name": "duration_ms!", - "type_info": "Int8" - }, - { - "ordinal": 5, - "name": "success!", - "type_info": "Bool" - }, - { - "ordinal": 6, - "name": "script_hash!: Option", - "type_info": "Int8" - }, - { - "ordinal": 7, - "name": "script_path", - "type_info": "Varchar" - }, - { - "ordinal": 8, - "name": "args: sqlx::types::Json>>", - "type_info": "Jsonb" - }, - { - "ordinal": 9, - "name": "result: sqlx::types::Json>", - "type_info": "Jsonb" - }, - { - "ordinal": 10, - "name": "deleted!", - "type_info": "Bool" - }, - { - "ordinal": 11, - "name": "canceled!", - "type_info": "Bool" - }, - { - "ordinal": 12, - "name": "canceled_by", - "type_info": "Varchar" - }, - { - "ordinal": 13, - "name": "canceled_reason", - "type_info": "Text" - }, - { - "ordinal": 14, - "name": "job_kind!: JobKind", - "type_info": { - "Custom": { - "name": "job_kind", - "kind": { - "Enum": [ - "script", - "preview", - "flow", - "dependencies", - "flowpreview", - "script_hub", - "identity", - "flowdependencies", - "http", - "graphql", - "postgresql", - "noop", - "appdependencies", - "deploymentcallback", - "singlescriptflow", - "flowscript", - "flownode", - "appscript" - ] - } - } - } - }, - { - "ordinal": 15, - "name": "schedule_path", - "type_info": "Varchar" - }, - { - "ordinal": 16, - "name": "permissioned_as!", - "type_info": "Varchar" - }, - { - "ordinal": 17, - "name": "is_flow_step!", - "type_info": "Bool" - }, - { - "ordinal": 18, - "name": "language: ScriptLang", - "type_info": { - "Custom": { - "name": "script_lang", - "kind": { - "Enum": [ - "python3", - "deno", - "go", - "bash", - "postgresql", - "nativets", - "bun", - "mysql", - "bigquery", - "snowflake", - "graphql", - "powershell", - "mssql", - "php", - "bunnative", - "rust", - "ansible", - "csharp", - "oracledb", - "nu", - "java" - ] - } - } - } - }, - { - "ordinal": 19, - "name": "is_skipped!", - "type_info": "Bool" - }, - { - "ordinal": 20, - "name": "email!", - "type_info": "Varchar" - }, - { - "ordinal": 21, - "name": "visible_to_owner!", - "type_info": "Bool" - }, - { - "ordinal": 22, - "name": "mem_peak", - "type_info": "Int4" - }, - { - "ordinal": 23, - "name": "tag!", - "type_info": "Varchar" - }, - { - "ordinal": 24, - "name": "created_at!", - "type_info": "Timestamptz" - }, - { - "ordinal": 25, - "name": "started_at", - "type_info": "Timestamptz" - }, - { - "ordinal": 26, - "name": "logs", - "type_info": "Text" - }, - { - "ordinal": 27, - "name": "log_offset?", - "type_info": "Int4" - }, - { - "ordinal": 28, - "name": "log_file_index", - "type_info": "TextArray" - } - ], - "parameters": { - "Left": [ - "Timestamptz", - "UuidArray", - "Timestamptz", - "Int8" - ] - }, - "nullable": [ - true, - true, - true, - true, - true, - true, - true, - true, - true, - true, - true, - true, - true, - true, - true, - true, - true, - true, - true, - true, - true, - true, - true, - true, - true, - true, - true, - false, - true - ] - }, - "hash": "6e2564dc37ee967c634deade67ceabc4c516418e595dee9cd7d651acc1f4af6e" -} diff --git a/backend/.sqlx/query-6e70ebf078ac04a2933d2f83791973e8fc108d9f32be8a8501391052d76e191e.json b/backend/.sqlx/query-6e70ebf078ac04a2933d2f83791973e8fc108d9f32be8a8501391052d76e191e.json deleted file mode 100644 index d95c8c9b5c..0000000000 --- a/backend/.sqlx/query-6e70ebf078ac04a2933d2f83791973e8fc108d9f32be8a8501391052d76e191e.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE kafka_trigger SET last_server_ping = now(), error = $1 WHERE workspace_id = $2 AND path = $3 AND server_id = $4 AND enabled IS TRUE RETURNING 1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "?column?", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [ - "Text", - "Text", - "Text", - "Text" - ] - }, - "nullable": [ - null - ] - }, - "hash": "6e70ebf078ac04a2933d2f83791973e8fc108d9f32be8a8501391052d76e191e" -} diff --git a/backend/.sqlx/query-70a3bfa729f874c9765f00a9c7dc067fee1ebf7510fec98e0574e07c906cc714.json b/backend/.sqlx/query-70a3bfa729f874c9765f00a9c7dc067fee1ebf7510fec98e0574e07c906cc714.json deleted file mode 100644 index e54956175a..0000000000 --- a/backend/.sqlx/query-70a3bfa729f874c9765f00a9c7dc067fee1ebf7510fec98e0574e07c906cc714.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT name, id, scim_display_name, array_remove(array_agg(email_to_igroup.email), null) as emails, external_id FROM email_to_igroup RIGHT JOIN instance_group ON instance_group.name = email_to_igroup.igroup WHERE id = $1 GROUP BY name", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "name", - "type_info": "Varchar" - }, - { - "ordinal": 1, - "name": "id", - "type_info": "Varchar" - }, - { - "ordinal": 2, - "name": "scim_display_name", - "type_info": "Varchar" - }, - { - "ordinal": 3, - "name": "emails", - "type_info": "VarcharArray" - }, - { - "ordinal": 4, - "name": "external_id", - "type_info": "Varchar" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - false, - true, - true, - null, - true - ] - }, - "hash": "70a3bfa729f874c9765f00a9c7dc067fee1ebf7510fec98e0574e07c906cc714" -} diff --git a/backend/.sqlx/query-71ad5448cba8da6677edd02e090cc158e09af72dd31585ed2ddc1cc06cbfd189.json b/backend/.sqlx/query-71ad5448cba8da6677edd02e090cc158e09af72dd31585ed2ddc1cc06cbfd189.json deleted file mode 100644 index 5d6daba2ab..0000000000 --- a/backend/.sqlx/query-71ad5448cba8da6677edd02e090cc158e09af72dd31585ed2ddc1cc06cbfd189.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT email FROM password WHERE super_admin IS true AND email NOT LIKE '%@windmill.dev' LIMIT 1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "email", - "type_info": "Varchar" - } - ], - "parameters": { - "Left": [] - }, - "nullable": [ - false - ] - }, - "hash": "71ad5448cba8da6677edd02e090cc158e09af72dd31585ed2ddc1cc06cbfd189" -} diff --git a/backend/.sqlx/query-729c5c6430431f044148aeeec18ad3056ee4fdf8691ba5503937424d75f3815e.json b/backend/.sqlx/query-729c5c6430431f044148aeeec18ad3056ee4fdf8691ba5503937424d75f3815e.json deleted file mode 100644 index b31bd17bd3..0000000000 --- a/backend/.sqlx/query-729c5c6430431f044148aeeec18ad3056ee4fdf8691ba5503937424d75f3815e.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT id FROM v2_job_queue", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Uuid" - } - ], - "parameters": { - "Left": [] - }, - "nullable": [ - false - ] - }, - "hash": "729c5c6430431f044148aeeec18ad3056ee4fdf8691ba5503937424d75f3815e" -} diff --git a/backend/.sqlx/query-73ca6ea13b362b2569ea115d28e4e255cd5e9b990ffa89998ef24871d3a9717c.json b/backend/.sqlx/query-73ca6ea13b362b2569ea115d28e4e255cd5e9b990ffa89998ef24871d3a9717c.json deleted file mode 100644 index 1636e4f358..0000000000 --- a/backend/.sqlx/query-73ca6ea13b362b2569ea115d28e4e255cd5e9b990ffa89998ef24871d3a9717c.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE workspace_settings\n SET slack_team_id = null, slack_name = null WHERE workspace_id = $1", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [] - }, - "hash": "73ca6ea13b362b2569ea115d28e4e255cd5e9b990ffa89998ef24871d3a9717c" -} diff --git a/backend/.sqlx/query-746ee16a04267cd251d4cefbc44a37fcc985bf61978cc07167ed35d7dbf92d11.json b/backend/.sqlx/query-746ee16a04267cd251d4cefbc44a37fcc985bf61978cc07167ed35d7dbf92d11.json deleted file mode 100644 index 4a7e81455e..0000000000 --- a/backend/.sqlx/query-746ee16a04267cd251d4cefbc44a37fcc985bf61978cc07167ed35d7dbf92d11.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT EXISTS(SELECT 1 FROM nats_trigger WHERE path = $1 AND workspace_id = $2)", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "exists", - "type_info": "Bool" - } - ], - "parameters": { - "Left": [ - "Text", - "Text" - ] - }, - "nullable": [ - null - ] - }, - "hash": "746ee16a04267cd251d4cefbc44a37fcc985bf61978cc07167ed35d7dbf92d11" -} diff --git a/backend/.sqlx/query-776909d3452aaf9e0ed41a5ec314b7bfc5bc8b6a76c98bf4daf7d715d18c52e6.json b/backend/.sqlx/query-776909d3452aaf9e0ed41a5ec314b7bfc5bc8b6a76c98bf4daf7d715d18c52e6.json deleted file mode 100644 index 5c7405cec6..0000000000 --- a/backend/.sqlx/query-776909d3452aaf9e0ed41a5ec314b7bfc5bc8b6a76c98bf4daf7d715d18c52e6.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n INSERT INTO sqs_trigger (\n aws_auth_resource_type,\n aws_resource_path,\n queue_url,\n message_attributes,\n workspace_id, \n path, \n script_path, \n is_flow, \n email, \n enabled, \n edited_by\n ) \n VALUES (\n $1, \n $2, \n $3, \n $4, \n $5, \n $6, \n $7,\n $8,\n $9,\n $10,\n $11\n )", - "describe": { - "columns": [], - "parameters": { - "Left": [ - { - "Custom": { - "name": "aws_auth_resource_type", - "kind": { - "Enum": [ - "oidc", - "credentials" - ] - } - } - }, - "Varchar", - "Varchar", - "TextArray", - "Varchar", - "Varchar", - "Varchar", - "Bool", - "Varchar", - "Bool", - "Varchar" - ] - }, - "nullable": [] - }, - "hash": "776909d3452aaf9e0ed41a5ec314b7bfc5bc8b6a76c98bf4daf7d715d18c52e6" -} diff --git a/backend/.sqlx/query-7aef087f9e10dd32417477109b97c99b85d68ce1be2bafdc145aed0aa8e5d989.json b/backend/.sqlx/query-7aef087f9e10dd32417477109b97c99b85d68ce1be2bafdc145aed0aa8e5d989.json deleted file mode 100644 index eb3a2fd9f8..0000000000 --- a/backend/.sqlx/query-7aef087f9e10dd32417477109b97c99b85d68ce1be2bafdc145aed0aa8e5d989.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO workspace_invite\n (workspace_id, email, is_admin)\n VALUES ('demo', $1, false)\n ON CONFLICT DO NOTHING", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar" - ] - }, - "nullable": [] - }, - "hash": "7aef087f9e10dd32417477109b97c99b85d68ce1be2bafdc145aed0aa8e5d989" -} diff --git a/backend/.sqlx/query-7b36b58761cd459b808cc4f463dfc93f01fdbc19c66d7404f95e1f8444235a8e.json b/backend/.sqlx/query-7b36b58761cd459b808cc4f463dfc93f01fdbc19c66d7404f95e1f8444235a8e.json deleted file mode 100644 index 0fe177b05d..0000000000 --- a/backend/.sqlx/query-7b36b58761cd459b808cc4f463dfc93f01fdbc19c66d7404f95e1f8444235a8e.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE nats_trigger SET nats_resource_path = $1, subjects = $2, stream_name = $3, consumer_name = $4, use_jetstream = $5, script_path = $6, path = $7, is_flow = $8, edited_by = $9, email = $10, edited_at = now(), server_id = NULL, error = NULL\n WHERE workspace_id = $11 AND path = $12", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "VarcharArray", - "Varchar", - "Varchar", - "Bool", - "Varchar", - "Varchar", - "Bool", - "Varchar", - "Varchar", - "Text", - "Text" - ] - }, - "nullable": [] - }, - "hash": "7b36b58761cd459b808cc4f463dfc93f01fdbc19c66d7404f95e1f8444235a8e" -} diff --git a/backend/.sqlx/query-7e31c47e02492b74cbb5702dfc5ef9f4c8faa986843024a2cd58e212f706aae8.json b/backend/.sqlx/query-7e31c47e02492b74cbb5702dfc5ef9f4c8faa986843024a2cd58e212f706aae8.json deleted file mode 100644 index eea1cfa434..0000000000 --- a/backend/.sqlx/query-7e31c47e02492b74cbb5702dfc5ef9f4c8faa986843024a2cd58e212f706aae8.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n UPDATE \n capture_config \n SET \n error = $1, \n server_id = NULL, \n last_server_ping = NULL \n WHERE \n workspace_id = $2 AND \n path = $3 AND \n is_flow = $4 AND \n trigger_kind = 'sqs'\n ", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Text", - "Text", - "Bool" - ] - }, - "nullable": [] - }, - "hash": "7e31c47e02492b74cbb5702dfc5ef9f4c8faa986843024a2cd58e212f706aae8" -} diff --git a/backend/.sqlx/query-7ecb01893c46823a207bf59aa57d6f4c6e63f7b7b6d4cf0b4ae1237da0e17b4b.json b/backend/.sqlx/query-7ecb01893c46823a207bf59aa57d6f4c6e63f7b7b6d4cf0b4ae1237da0e17b4b.json deleted file mode 100644 index 628794aae4..0000000000 --- a/backend/.sqlx/query-7ecb01893c46823a207bf59aa57d6f4c6e63f7b7b6d4cf0b4ae1237da0e17b4b.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT\n jsonb_array_elements(git_sync->'repositories')->>'script_path' AS script_path,\n jsonb_array_elements(git_sync->'repositories')->>'git_repo_resource_path' AS git_repo_resource_path\n FROM workspace_settings\n WHERE workspace_id = $1;\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "script_path", - "type_info": "Text" - }, - { - "ordinal": 1, - "name": "git_repo_resource_path", - "type_info": "Text" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - null, - null - ] - }, - "hash": "7ecb01893c46823a207bf59aa57d6f4c6e63f7b7b6d4cf0b4ae1237da0e17b4b" -} diff --git a/backend/.sqlx/query-7f772ceace10008d7d40afd331a585bfa19b70315840585c81b8e7a3911ab5e7.json b/backend/.sqlx/query-7f772ceace10008d7d40afd331a585bfa19b70315840585c81b8e7a3911ab5e7.json deleted file mode 100644 index 1d7b5ddba5..0000000000 --- a/backend/.sqlx/query-7f772ceace10008d7d40afd331a585bfa19b70315840585c81b8e7a3911ab5e7.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n UPDATE workspace_settings\n SET git_app_installations = COALESCE(\n (\n SELECT jsonb_agg(elem)\n FROM jsonb_array_elements(git_app_installations) AS elem\n WHERE (elem->>'installation_id')::bigint != $1\n ),\n '[]'::jsonb\n )\n WHERE workspace_id = $2;\n ", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Int8", - "Text" - ] - }, - "nullable": [] - }, - "hash": "7f772ceace10008d7d40afd331a585bfa19b70315840585c81b8e7a3911ab5e7" -} diff --git a/backend/.sqlx/query-7fa8fca5b5cdf147da0cf8ae5a0d9fdee37dd8df66974c8d33f58a88b1bca537.json b/backend/.sqlx/query-7fa8fca5b5cdf147da0cf8ae5a0d9fdee37dd8df66974c8d33f58a88b1bca537.json deleted file mode 100644 index e4aa1f4f24..0000000000 --- a/backend/.sqlx/query-7fa8fca5b5cdf147da0cf8ae5a0d9fdee37dd8df66974c8d33f58a88b1bca537.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "DELETE FROM healthchecks WHERE check_type LIKE 'min_alive_workers_%' AND created_at < NOW() - INTERVAL '48 hours'", - "describe": { - "columns": [], - "parameters": { - "Left": [] - }, - "nullable": [] - }, - "hash": "7fa8fca5b5cdf147da0cf8ae5a0d9fdee37dd8df66974c8d33f58a88b1bca537" -} diff --git a/backend/.sqlx/query-804fc11e35f4afc0db194b6fe2594f91df7e588d4d2431bc85f4d8734920c8bf.json b/backend/.sqlx/query-804fc11e35f4afc0db194b6fe2594f91df7e588d4d2431bc85f4d8734920c8bf.json index 89745202b0..7933311a4c 100644 --- a/backend/.sqlx/query-804fc11e35f4afc0db194b6fe2594f91df7e588d4d2431bc85f4d8734920c8bf.json +++ b/backend/.sqlx/query-804fc11e35f4afc0db194b6fe2594f91df7e588d4d2431bc85f4d8734920c8bf.json @@ -34,7 +34,8 @@ "csharp", "oracledb", "nu", - "java" + "java", + "duckdb" ] } } diff --git a/backend/.sqlx/query-83f64dd93b1ddc03b84681d65d9be69959987cbac1d83b64225fd1bf9ab047c9.json b/backend/.sqlx/query-83f64dd93b1ddc03b84681d65d9be69959987cbac1d83b64225fd1bf9ab047c9.json new file mode 100644 index 0000000000..3ca69e27dd --- /dev/null +++ b/backend/.sqlx/query-83f64dd93b1ddc03b84681d65d9be69959987cbac1d83b64225fd1bf9ab047c9.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO usage (id, is_workspace, month_, usage)\n VALUES ($1, TRUE, EXTRACT(YEAR FROM current_date) * 12 + EXTRACT(MONTH FROM current_date), 1)\n ON CONFLICT (id, is_workspace, month_) DO UPDATE SET usage = usage.usage + 1 \n RETURNING usage.usage", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "usage", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Varchar" + ] + }, + "nullable": [ + false + ] + }, + "hash": "83f64dd93b1ddc03b84681d65d9be69959987cbac1d83b64225fd1bf9ab047c9" +} diff --git a/backend/.sqlx/query-8490024b96aa689d3c1bc5cbf94fcd8c5491732818404fee2397f00cccee0ad3.json b/backend/.sqlx/query-8490024b96aa689d3c1bc5cbf94fcd8c5491732818404fee2397f00cccee0ad3.json deleted file mode 100644 index 9700ab141f..0000000000 --- a/backend/.sqlx/query-8490024b96aa689d3c1bc5cbf94fcd8c5491732818404fee2397f00cccee0ad3.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n UPDATE \n sqs_trigger \n SET \n aws_auth_resource_type = $1,\n aws_resource_path = $2,\n queue_url = $3,\n message_attributes = $4, \n is_flow = $5, \n edited_by = $6, \n email = $7,\n script_path = $8,\n path = $9,\n edited_at = now(), \n error = NULL,\n server_id = NULL\n WHERE \n workspace_id = $10 AND \n path = $11\n ", - "describe": { - "columns": [], - "parameters": { - "Left": [ - { - "Custom": { - "name": "aws_auth_resource_type", - "kind": { - "Enum": [ - "oidc", - "credentials" - ] - } - } - }, - "Varchar", - "Varchar", - "TextArray", - "Bool", - "Varchar", - "Varchar", - "Varchar", - "Varchar", - "Text", - "Text" - ] - }, - "nullable": [] - }, - "hash": "8490024b96aa689d3c1bc5cbf94fcd8c5491732818404fee2397f00cccee0ad3" -} diff --git a/backend/.sqlx/query-84d048ea323758842dc564c700b524d1a5b196a7b77afcb02f46b84b22088bbf.json b/backend/.sqlx/query-84d048ea323758842dc564c700b524d1a5b196a7b77afcb02f46b84b22088bbf.json deleted file mode 100644 index e4473b360c..0000000000 --- a/backend/.sqlx/query-84d048ea323758842dc564c700b524d1a5b196a7b77afcb02f46b84b22088bbf.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT value FROM global_settings WHERE name = 'teams'", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "value", - "type_info": "Jsonb" - } - ], - "parameters": { - "Left": [] - }, - "nullable": [ - false - ] - }, - "hash": "84d048ea323758842dc564c700b524d1a5b196a7b77afcb02f46b84b22088bbf" -} diff --git a/backend/.sqlx/query-85844054136d7bc9669d6b340ca1a955cb86557032cfbdbf4022bf1ad3230ae7.json b/backend/.sqlx/query-85844054136d7bc9669d6b340ca1a955cb86557032cfbdbf4022bf1ad3230ae7.json deleted file mode 100644 index 3381f8593c..0000000000 --- a/backend/.sqlx/query-85844054136d7bc9669d6b340ca1a955cb86557032cfbdbf4022bf1ad3230ae7.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "DELETE FROM email_to_igroup WHERE email = $1", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [] - }, - "hash": "85844054136d7bc9669d6b340ca1a955cb86557032cfbdbf4022bf1ad3230ae7" -} diff --git a/backend/.sqlx/query-85c116da4a43a5ade37bb9ab2660d206b722ec4192368599c3a5027f50a89c80.json b/backend/.sqlx/query-85c116da4a43a5ade37bb9ab2660d206b722ec4192368599c3a5027f50a89c80.json deleted file mode 100644 index a54cdf49ab..0000000000 --- a/backend/.sqlx/query-85c116da4a43a5ade37bb9ab2660d206b722ec4192368599c3a5027f50a89c80.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO global_settings (name, value) VALUES ('rsa_keys', $1)", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Jsonb" - ] - }, - "nullable": [] - }, - "hash": "85c116da4a43a5ade37bb9ab2660d206b722ec4192368599c3a5027f50a89c80" -} diff --git a/backend/.sqlx/query-8667efb13d6bd7ef1858d7d9fc7ccb9c3e8169e4080ee28f6f40c729d06cbb55.json b/backend/.sqlx/query-8667efb13d6bd7ef1858d7d9fc7ccb9c3e8169e4080ee28f6f40c729d06cbb55.json deleted file mode 100644 index 3a1412b781..0000000000 --- a/backend/.sqlx/query-8667efb13d6bd7ef1858d7d9fc7ccb9c3e8169e4080ee28f6f40c729d06cbb55.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE instance_group SET scim_display_name = $1, name = $2 where id = $3", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "Varchar", - "Text" - ] - }, - "nullable": [] - }, - "hash": "8667efb13d6bd7ef1858d7d9fc7ccb9c3e8169e4080ee28f6f40c729d06cbb55" -} diff --git a/backend/.sqlx/query-870b12a46f26c9e29889dd28a5c7832c5a674a5553674fd9762c981e0d03bb57.json b/backend/.sqlx/query-870b12a46f26c9e29889dd28a5c7832c5a674a5553674fd9762c981e0d03bb57.json deleted file mode 100644 index f5d544c5aa..0000000000 --- a/backend/.sqlx/query-870b12a46f26c9e29889dd28a5c7832c5a674a5553674fd9762c981e0d03bb57.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "DELETE FROM nats_trigger WHERE workspace_id = $1 AND path = $2", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Text" - ] - }, - "nullable": [] - }, - "hash": "870b12a46f26c9e29889dd28a5c7832c5a674a5553674fd9762c981e0d03bb57" -} diff --git a/backend/.sqlx/query-884039108b98daa6279975e65348e460f99a0d2155fe2ff7b1d2840c5d9b76d0.json b/backend/.sqlx/query-884039108b98daa6279975e65348e460f99a0d2155fe2ff7b1d2840c5d9b76d0.json deleted file mode 100644 index 64048e92f8..0000000000 --- a/backend/.sqlx/query-884039108b98daa6279975e65348e460f99a0d2155fe2ff7b1d2840c5d9b76d0.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT elem\n FROM workspace_settings,\n LATERAL jsonb_array_elements(git_app_installations) AS elem\n WHERE workspace_id = $1\n AND (elem->>'installation_id')::bigint = $2\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "elem", - "type_info": "Jsonb" - } - ], - "parameters": { - "Left": [ - "Text", - "Int8" - ] - }, - "nullable": [ - null - ] - }, - "hash": "884039108b98daa6279975e65348e460f99a0d2155fe2ff7b1d2840c5d9b76d0" -} diff --git a/backend/.sqlx/query-88b7589a6416da8be4b26af3bf30fcfcd6aeae7bc5a37e9a735cabbe2691c570.json b/backend/.sqlx/query-88b7589a6416da8be4b26af3bf30fcfcd6aeae7bc5a37e9a735cabbe2691c570.json deleted file mode 100644 index ba27530279..0000000000 --- a/backend/.sqlx/query-88b7589a6416da8be4b26af3bf30fcfcd6aeae7bc5a37e9a735cabbe2691c570.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT login_type::TEXT FROM password WHERE email = $1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "login_type", - "type_info": "Text" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - null - ] - }, - "hash": "88b7589a6416da8be4b26af3bf30fcfcd6aeae7bc5a37e9a735cabbe2691c570" -} diff --git a/backend/.sqlx/query-8d207cc9ed101ff116b617d25a94633c1531170ded1fdf09114718b941f5e1db.json b/backend/.sqlx/query-8d207cc9ed101ff116b617d25a94633c1531170ded1fdf09114718b941f5e1db.json deleted file mode 100644 index d0b96444ee..0000000000 --- a/backend/.sqlx/query-8d207cc9ed101ff116b617d25a94633c1531170ded1fdf09114718b941f5e1db.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT\n hostname,\n mode::text,\n worker_group,\n log_ts,\n file_path,\n ok_lines,\n err_lines,\n json_fmt\n FROM log_file\n WHERE log_ts > NOW() - make_interval(secs => $1)\n ORDER BY log_ts ASC LIMIT $2", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "hostname", - "type_info": "Varchar" - }, - { - "ordinal": 1, - "name": "mode", - "type_info": "Text" - }, - { - "ordinal": 2, - "name": "worker_group", - "type_info": "Varchar" - }, - { - "ordinal": 3, - "name": "log_ts", - "type_info": "Timestamp" - }, - { - "ordinal": 4, - "name": "file_path", - "type_info": "Varchar" - }, - { - "ordinal": 5, - "name": "ok_lines", - "type_info": "Int8" - }, - { - "ordinal": 6, - "name": "err_lines", - "type_info": "Int8" - }, - { - "ordinal": 7, - "name": "json_fmt", - "type_info": "Bool" - } - ], - "parameters": { - "Left": [ - "Float8", - "Int8" - ] - }, - "nullable": [ - false, - null, - true, - false, - false, - true, - true, - true - ] - }, - "hash": "8d207cc9ed101ff116b617d25a94633c1531170ded1fdf09114718b941f5e1db" -} diff --git a/backend/.sqlx/query-8dd1de2aca8c6c9ffaddd2c41c3a614a50fa5fd03c2d3b9a41bd85a7f156345e.json b/backend/.sqlx/query-8dd1de2aca8c6c9ffaddd2c41c3a614a50fa5fd03c2d3b9a41bd85a7f156345e.json deleted file mode 100644 index c1a63e668f..0000000000 --- a/backend/.sqlx/query-8dd1de2aca8c6c9ffaddd2c41c3a614a50fa5fd03c2d3b9a41bd85a7f156345e.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT count(*) \n FROM worker_ping \n WHERE worker_group LIKE $1 AND ping_at > now() - INTERVAL '2 minutes'", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "count", - "type_info": "Int8" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - null - ] - }, - "hash": "8dd1de2aca8c6c9ffaddd2c41c3a614a50fa5fd03c2d3b9a41bd85a7f156345e" -} diff --git a/backend/.sqlx/query-900ac59515e4283f4b57516210575dfe92f74a7220ed69e61899a6e0f053d9cd.json b/backend/.sqlx/query-900ac59515e4283f4b57516210575dfe92f74a7220ed69e61899a6e0f053d9cd.json deleted file mode 100644 index 0bcd4d447f..0000000000 --- a/backend/.sqlx/query-900ac59515e4283f4b57516210575dfe92f74a7220ed69e61899a6e0f053d9cd.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO concurrency_locks (id, last_locked_at) VALUES ($1, NOW()) ON CONFLICT (id) DO NOTHING", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar" - ] - }, - "nullable": [] - }, - "hash": "900ac59515e4283f4b57516210575dfe92f74a7220ed69e61899a6e0f053d9cd" -} diff --git a/backend/.sqlx/query-902961f15b8c7603dddf2933b5fc7cdd6e5af3545835763ccb29cdf3ac273ef0.json b/backend/.sqlx/query-902961f15b8c7603dddf2933b5fc7cdd6e5af3545835763ccb29cdf3ac273ef0.json deleted file mode 100644 index c4e3c52c98..0000000000 --- a/backend/.sqlx/query-902961f15b8c7603dddf2933b5fc7cdd6e5af3545835763ccb29cdf3ac273ef0.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE password SET password_hash = $1 WHERE email = $2", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "Text" - ] - }, - "nullable": [] - }, - "hash": "902961f15b8c7603dddf2933b5fc7cdd6e5af3545835763ccb29cdf3ac273ef0" -} diff --git a/backend/.sqlx/query-92c2b66eb6287449f5f8cc9f8d1329f748006ab131489d2fcac21d32641bb633.json b/backend/.sqlx/query-92c2b66eb6287449f5f8cc9f8d1329f748006ab131489d2fcac21d32641bb633.json deleted file mode 100644 index 14d37809d5..0000000000 --- a/backend/.sqlx/query-92c2b66eb6287449f5f8cc9f8d1329f748006ab131489d2fcac21d32641bb633.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n UPDATE \n gcp_trigger \n SET \n server_id = $1, \n last_server_ping = now(),\n error = 'Connecting...'\n WHERE \n enabled IS TRUE \n AND workspace_id = $2 \n AND path = $3 \n AND (last_server_ping IS NULL \n OR last_server_ping < now() - INTERVAL '15 seconds'\n ) \n RETURNING true\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "?column?", - "type_info": "Bool" - } - ], - "parameters": { - "Left": [ - "Varchar", - "Text", - "Text" - ] - }, - "nullable": [ - null - ] - }, - "hash": "92c2b66eb6287449f5f8cc9f8d1329f748006ab131489d2fcac21d32641bb633" -} diff --git a/backend/.sqlx/query-93d64930c74ccb1abdc9bda8287540a354f8eec49913aaf07fc1e737e7c93330.json b/backend/.sqlx/query-93d64930c74ccb1abdc9bda8287540a354f8eec49913aaf07fc1e737e7c93330.json deleted file mode 100644 index 5b30dd2cbd..0000000000 --- a/backend/.sqlx/query-93d64930c74ccb1abdc9bda8287540a354f8eec49913aaf07fc1e737e7c93330.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE capture_config SET last_server_ping = NULL WHERE workspace_id = $1 AND path = $2 AND is_flow = $3 AND trigger_kind = 'nats' AND server_id IS NULL", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Text", - "Bool" - ] - }, - "nullable": [] - }, - "hash": "93d64930c74ccb1abdc9bda8287540a354f8eec49913aaf07fc1e737e7c93330" -} diff --git a/backend/.sqlx/query-9969f99d81b2fa581a1da8f7cc3722f60cbd41814f8a17006c82f48888f05bb6.json b/backend/.sqlx/query-9969f99d81b2fa581a1da8f7cc3722f60cbd41814f8a17006c82f48888f05bb6.json deleted file mode 100644 index 5a8a85449d..0000000000 --- a/backend/.sqlx/query-9969f99d81b2fa581a1da8f7cc3722f60cbd41814f8a17006c82f48888f05bb6.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "DELETE FROM pending_user WHERE email = $1", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [] - }, - "hash": "9969f99d81b2fa581a1da8f7cc3722f60cbd41814f8a17006c82f48888f05bb6" -} diff --git a/backend/.sqlx/query-999edc6f54a9efb6dc6237992dad59f418ed6fc2a98ddb9bbc33dce5f029d904.json b/backend/.sqlx/query-999edc6f54a9efb6dc6237992dad59f418ed6fc2a98ddb9bbc33dce5f029d904.json deleted file mode 100644 index 8748572af7..0000000000 --- a/backend/.sqlx/query-999edc6f54a9efb6dc6237992dad59f418ed6fc2a98ddb9bbc33dce5f029d904.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n UPDATE \n gcp_trigger \n SET\n last_server_ping = NULL \n WHERE \n workspace_id = $1 \n AND path = $2 \n AND server_id IS NULL", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Text" - ] - }, - "nullable": [] - }, - "hash": "999edc6f54a9efb6dc6237992dad59f418ed6fc2a98ddb9bbc33dce5f029d904" -} diff --git a/backend/.sqlx/query-9c72b2962d0919353cfe5af710e857d432dff44e343b8f0610208d42ff5afd14.json b/backend/.sqlx/query-9c72b2962d0919353cfe5af710e857d432dff44e343b8f0610208d42ff5afd14.json deleted file mode 100644 index a2f8a647c5..0000000000 --- a/backend/.sqlx/query-9c72b2962d0919353cfe5af710e857d432dff44e343b8f0610208d42ff5afd14.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO global_settings (name, value)\n VALUES ('teams', $1)\n ON CONFLICT (name) DO UPDATE SET value = $1", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Jsonb" - ] - }, - "nullable": [] - }, - "hash": "9c72b2962d0919353cfe5af710e857d432dff44e343b8f0610208d42ff5afd14" -} diff --git a/backend/.sqlx/query-9e2810312302b36d3b4d761481c00296ee84c9536228496e19b4ec5df1781bc5.json b/backend/.sqlx/query-9e2810312302b36d3b4d761481c00296ee84c9536228496e19b4ec5df1781bc5.json deleted file mode 100644 index 70df593afe..0000000000 --- a/backend/.sqlx/query-9e2810312302b36d3b4d761481c00296ee84c9536228496e19b4ec5df1781bc5.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT COUNT(*) as count, \n MIN(scheduled_for) as oldest_job\n FROM v2_job_queue \n WHERE tag = $1 \n AND scheduled_for <= NOW() - $2::interval \n AND running = false\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "count", - "type_info": "Int8" - }, - { - "ordinal": 1, - "name": "oldest_job", - "type_info": "Timestamptz" - } - ], - "parameters": { - "Left": [ - "Text", - "Interval" - ] - }, - "nullable": [ - null, - null - ] - }, - "hash": "9e2810312302b36d3b4d761481c00296ee84c9536228496e19b4ec5df1781bc5" -} diff --git a/backend/.sqlx/query-9f1f388924176dbe3dea882e0c62728a82ba256029096812dd705ccb1a552cfe.json b/backend/.sqlx/query-9f1f388924176dbe3dea882e0c62728a82ba256029096812dd705ccb1a552cfe.json deleted file mode 100644 index 51ddd8af63..0000000000 --- a/backend/.sqlx/query-9f1f388924176dbe3dea882e0c62728a82ba256029096812dd705ccb1a552cfe.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO variable\n (workspace_id, path, value, is_secret, account, is_oauth)\n VALUES ($1, $2, $3, $4, $5, $6)\n ON CONFLICT (workspace_id, path) DO UPDATE SET value = $3", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "Varchar", - "Varchar", - "Bool", - "Int4", - "Bool" - ] - }, - "nullable": [] - }, - "hash": "9f1f388924176dbe3dea882e0c62728a82ba256029096812dd705ccb1a552cfe" -} diff --git a/backend/.sqlx/query-a15a4478d1249c9ae5cd5f2b755f8479986f1591bf545b8562109b6ce26578b0.json b/backend/.sqlx/query-a15a4478d1249c9ae5cd5f2b755f8479986f1591bf545b8562109b6ce26578b0.json deleted file mode 100644 index 0099197b32..0000000000 --- a/backend/.sqlx/query-a15a4478d1249c9ae5cd5f2b755f8479986f1591bf545b8562109b6ce26578b0.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT resource_type\n FROM resource\n WHERE resource.path = $1 AND resource.workspace_id = $2", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "resource_type", - "type_info": "Varchar" - } - ], - "parameters": { - "Left": [ - "Text", - "Text" - ] - }, - "nullable": [ - false - ] - }, - "hash": "a15a4478d1249c9ae5cd5f2b755f8479986f1591bf545b8562109b6ce26578b0" -} diff --git a/backend/.sqlx/query-a59aac0bc593d99aedd14fd9606f11191590a12ea98a671e172b867306959884.json b/backend/.sqlx/query-a59aac0bc593d99aedd14fd9606f11191590a12ea98a671e172b867306959884.json deleted file mode 100644 index 987c3d8633..0000000000 --- a/backend/.sqlx/query-a59aac0bc593d99aedd14fd9606f11191590a12ea98a671e172b867306959884.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO password (email, login_type, verified, username) VALUES ($1, 'saml', true, $2) ON CONFLICT DO NOTHING", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "Varchar" - ] - }, - "nullable": [] - }, - "hash": "a59aac0bc593d99aedd14fd9606f11191590a12ea98a671e172b867306959884" -} diff --git a/backend/.sqlx/query-a5fbef9db2308920ea26f6154f0f3490f88ced636c9ebdecba2205f964b1d0f1.json b/backend/.sqlx/query-a5fbef9db2308920ea26f6154f0f3490f88ced636c9ebdecba2205f964b1d0f1.json deleted file mode 100644 index 219558ac68..0000000000 --- a/backend/.sqlx/query-a5fbef9db2308920ea26f6154f0f3490f88ced636c9ebdecba2205f964b1d0f1.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n UPDATE \n sqs_trigger \n SET\n last_server_ping = NULL \n WHERE \n workspace_id = $1 \n AND path = $2 \n AND server_id IS NULL", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Text" - ] - }, - "nullable": [] - }, - "hash": "a5fbef9db2308920ea26f6154f0f3490f88ced636c9ebdecba2205f964b1d0f1" -} diff --git a/backend/.sqlx/query-a670b88ea83d69997f1b70873b927bfe0790d5e1c347e5b15835c8996c039cd1.json b/backend/.sqlx/query-a670b88ea83d69997f1b70873b927bfe0790d5e1c347e5b15835c8996c039cd1.json deleted file mode 100644 index 35fe3aec91..0000000000 --- a/backend/.sqlx/query-a670b88ea83d69997f1b70873b927bfe0790d5e1c347e5b15835c8996c039cd1.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT EXISTS (SELECT 1 FROM password WHERE email = $1)", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "exists", - "type_info": "Bool" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - null - ] - }, - "hash": "a670b88ea83d69997f1b70873b927bfe0790d5e1c347e5b15835c8996c039cd1" -} diff --git a/backend/.sqlx/query-a7ffc5b983d365159ef379ec6a2ab0dc7217d1b3f86f362c213982984d2cf652.json b/backend/.sqlx/query-a7ffc5b983d365159ef379ec6a2ab0dc7217d1b3f86f362c213982984d2cf652.json deleted file mode 100644 index 03b05af6fb..0000000000 --- a/backend/.sqlx/query-a7ffc5b983d365159ef379ec6a2ab0dc7217d1b3f86f362c213982984d2cf652.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n UPDATE \n capture_config \n SET \n last_server_ping = now(), \n error = $1 \n WHERE \n workspace_id = $2 AND \n path = $3 AND \n is_flow = $4 AND \n trigger_kind = 'gcp' AND \n server_id = $5 AND \n last_client_ping > NOW() - INTERVAL '10 seconds' \n RETURNING 1\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "?column?", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [ - "Text", - "Text", - "Text", - "Bool", - "Text" - ] - }, - "nullable": [ - null - ] - }, - "hash": "a7ffc5b983d365159ef379ec6a2ab0dc7217d1b3f86f362c213982984d2cf652" -} diff --git a/backend/.sqlx/query-ab04cda71f8e2be9acbecabe1ee5ef756b8e5c1955fbe111df9ee171dc262338.json b/backend/.sqlx/query-ab04cda71f8e2be9acbecabe1ee5ef756b8e5c1955fbe111df9ee171dc262338.json index 47e4f47005..c8cbb8e10d 100644 --- a/backend/.sqlx/query-ab04cda71f8e2be9acbecabe1ee5ef756b8e5c1955fbe111df9ee171dc262338.json +++ b/backend/.sqlx/query-ab04cda71f8e2be9acbecabe1ee5ef756b8e5c1955fbe111df9ee171dc262338.json @@ -65,7 +65,8 @@ "csharp", "oracledb", "nu", - "java" + "java", + "duckdb" ] } } diff --git a/backend/.sqlx/query-ad3b0176e3d41a0c1d79a8eb59da2a9cc4fee3473b3f6ea69f397d91e9356ba1.json b/backend/.sqlx/query-ad3b0176e3d41a0c1d79a8eb59da2a9cc4fee3473b3f6ea69f397d91e9356ba1.json deleted file mode 100644 index 936365c8d0..0000000000 --- a/backend/.sqlx/query-ad3b0176e3d41a0c1d79a8eb59da2a9cc4fee3473b3f6ea69f397d91e9356ba1.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO folder\n (workspace_id, name, display_name, owners, extra_perms, created_by, edited_at)\n VALUES ($1, $2, $3, $4, $5, $6, now()) ON CONFLICT DO NOTHING", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "Varchar", - "Varchar", - "VarcharArray", - "Jsonb", - "Varchar" - ] - }, - "nullable": [] - }, - "hash": "ad3b0176e3d41a0c1d79a8eb59da2a9cc4fee3473b3f6ea69f397d91e9356ba1" -} diff --git a/backend/.sqlx/query-ad42118ccf6a9d2d1e072c4df064ddf964a5b3cd088fc162d0d8222325d4a5ea.json b/backend/.sqlx/query-ad42118ccf6a9d2d1e072c4df064ddf964a5b3cd088fc162d0d8222325d4a5ea.json deleted file mode 100644 index c43c2a2a65..0000000000 --- a/backend/.sqlx/query-ad42118ccf6a9d2d1e072c4df064ddf964a5b3cd088fc162d0d8222325d4a5ea.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE healthchecks SET healthy = true WHERE check_type = $1", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [] - }, - "hash": "ad42118ccf6a9d2d1e072c4df064ddf964a5b3cd088fc162d0d8222325d4a5ea" -} diff --git a/backend/.sqlx/query-add48c8e7c6fa2c549ad6293cbee22889d35e919d3267c1d2a265d868fa8a7d1.json b/backend/.sqlx/query-add48c8e7c6fa2c549ad6293cbee22889d35e919d3267c1d2a265d868fa8a7d1.json deleted file mode 100644 index 0468efc99f..0000000000 --- a/backend/.sqlx/query-add48c8e7c6fa2c549ad6293cbee22889d35e919d3267c1d2a265d868fa8a7d1.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE nats_trigger SET enabled = FALSE, error = $1, server_id = NULL, last_server_ping = NULL WHERE workspace_id = $2 AND path = $3", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Text", - "Text" - ] - }, - "nullable": [] - }, - "hash": "add48c8e7c6fa2c549ad6293cbee22889d35e919d3267c1d2a265d868fa8a7d1" -} diff --git a/backend/.sqlx/query-b223c56f55a138abef8c8cb2df40472a87b7e267a143709728b09ac063c33b96.json b/backend/.sqlx/query-b223c56f55a138abef8c8cb2df40472a87b7e267a143709728b09ac063c33b96.json deleted file mode 100644 index f542ec075a..0000000000 --- a/backend/.sqlx/query-b223c56f55a138abef8c8cb2df40472a87b7e267a143709728b09ac063c33b96.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE capture_config SET last_server_ping = NULL WHERE workspace_id = $1 AND path = $2 AND is_flow = $3 AND trigger_kind = 'kafka' AND server_id IS NULL", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Text", - "Bool" - ] - }, - "nullable": [] - }, - "hash": "b223c56f55a138abef8c8cb2df40472a87b7e267a143709728b09ac063c33b96" -} diff --git a/backend/.sqlx/query-b386d320f9fe1d569a16e6626b723b4376a93342702856da2ac70f6bbfc7933e.json b/backend/.sqlx/query-b386d320f9fe1d569a16e6626b723b4376a93342702856da2ac70f6bbfc7933e.json deleted file mode 100644 index 13ac3c15ea..0000000000 --- a/backend/.sqlx/query-b386d320f9fe1d569a16e6626b723b4376a93342702856da2ac70f6bbfc7933e.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT EXISTS(\n SELECT \n 1 \n FROM \n sqs_trigger \n WHERE \n path = $1 AND \n workspace_id = $2\n )", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "exists", - "type_info": "Bool" - } - ], - "parameters": { - "Left": [ - "Text", - "Text" - ] - }, - "nullable": [ - null - ] - }, - "hash": "b386d320f9fe1d569a16e6626b723b4376a93342702856da2ac70f6bbfc7933e" -} diff --git a/backend/.sqlx/query-b4d48c820bf41619bffa8f62367e98369e1d93514e1618723a34bf96080d4ebc.json b/backend/.sqlx/query-b4d48c820bf41619bffa8f62367e98369e1d93514e1618723a34bf96080d4ebc.json deleted file mode 100644 index 0efca7e867..0000000000 --- a/backend/.sqlx/query-b4d48c820bf41619bffa8f62367e98369e1d93514e1618723a34bf96080d4ebc.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n UPDATE workspace_settings\n SET git_app_installations = (\n SELECT jsonb_agg(\n CASE\n WHEN (elem->>'installation_id')::bigint = $2 THEN $1::jsonb\n ELSE elem\n END\n )\n FROM jsonb_array_elements(git_app_installations) AS elem\n )\n WHERE workspace_id = $3\n ", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Jsonb", - "Int8", - "Text" - ] - }, - "nullable": [] - }, - "hash": "b4d48c820bf41619bffa8f62367e98369e1d93514e1618723a34bf96080d4ebc" -} diff --git a/backend/.sqlx/query-b5c839baab25c4dcdd503d380cf7a886242277cd50555f20b2e22e13942d2a3a.json b/backend/.sqlx/query-b5c839baab25c4dcdd503d380cf7a886242277cd50555f20b2e22e13942d2a3a.json deleted file mode 100644 index ba9f3814e8..0000000000 --- a/backend/.sqlx/query-b5c839baab25c4dcdd503d380cf7a886242277cd50555f20b2e22e13942d2a3a.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT\n hostname,\n mode::text,\n worker_group,\n log_ts,\n file_path,\n ok_lines,\n err_lines,\n json_fmt\n FROM log_file\n WHERE log_ts > $1\n ORDER BY log_ts ASC LIMIT $2", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "hostname", - "type_info": "Varchar" - }, - { - "ordinal": 1, - "name": "mode", - "type_info": "Text" - }, - { - "ordinal": 2, - "name": "worker_group", - "type_info": "Varchar" - }, - { - "ordinal": 3, - "name": "log_ts", - "type_info": "Timestamp" - }, - { - "ordinal": 4, - "name": "file_path", - "type_info": "Varchar" - }, - { - "ordinal": 5, - "name": "ok_lines", - "type_info": "Int8" - }, - { - "ordinal": 6, - "name": "err_lines", - "type_info": "Int8" - }, - { - "ordinal": 7, - "name": "json_fmt", - "type_info": "Bool" - } - ], - "parameters": { - "Left": [ - "Timestamp", - "Int8" - ] - }, - "nullable": [ - false, - null, - true, - false, - false, - true, - true, - true - ] - }, - "hash": "b5c839baab25c4dcdd503d380cf7a886242277cd50555f20b2e22e13942d2a3a" -} diff --git a/backend/.sqlx/query-b6ddadfa8d23db666206f907a6390b824af5260a3b1ab3355ac613f1f83fc349.json b/backend/.sqlx/query-b6ddadfa8d23db666206f907a6390b824af5260a3b1ab3355ac613f1f83fc349.json deleted file mode 100644 index c681870c72..0000000000 --- a/backend/.sqlx/query-b6ddadfa8d23db666206f907a6390b824af5260a3b1ab3355ac613f1f83fc349.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO workspace_invite\n (workspace_id, email, is_admin, operator)\n VALUES ($1, $2, false, $3)\n ON CONFLICT DO NOTHING", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "Varchar", - "Bool" - ] - }, - "nullable": [] - }, - "hash": "b6ddadfa8d23db666206f907a6390b824af5260a3b1ab3355ac613f1f83fc349" -} diff --git a/backend/.sqlx/query-b83e58972d8f8285eb604de94c3d363102f5f6705d6debb442a85126ed59d863.json b/backend/.sqlx/query-b83e58972d8f8285eb604de94c3d363102f5f6705d6debb442a85126ed59d863.json deleted file mode 100644 index 7548983ecb..0000000000 --- a/backend/.sqlx/query-b83e58972d8f8285eb604de94c3d363102f5f6705d6debb442a85126ed59d863.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO deployment_metadata (workspace_id, path, app_version, callback_job_ids, deployment_msg) VALUES ($1, $2, $3, $4, $5)", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "Varchar", - "Int8", - "UuidArray", - "Text" - ] - }, - "nullable": [] - }, - "hash": "b83e58972d8f8285eb604de94c3d363102f5f6705d6debb442a85126ed59d863" -} diff --git a/backend/.sqlx/query-b8490eea478c1fd279593a7ced86b4d21aa3bfe772e4d344e306a224ec2c8a01.json b/backend/.sqlx/query-b8490eea478c1fd279593a7ced86b4d21aa3bfe772e4d344e306a224ec2c8a01.json deleted file mode 100644 index 15d17d5784..0000000000 --- a/backend/.sqlx/query-b8490eea478c1fd279593a7ced86b4d21aa3bfe772e4d344e306a224ec2c8a01.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE password SET email = $1 WHERE email = $2", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "Text" - ] - }, - "nullable": [] - }, - "hash": "b8490eea478c1fd279593a7ced86b4d21aa3bfe772e4d344e306a224ec2c8a01" -} diff --git a/backend/.sqlx/query-bb56e61c7cfb09c0a28fb3226dfe91704c70d9fe15eda18e6889adfd7496f80b.json b/backend/.sqlx/query-bb56e61c7cfb09c0a28fb3226dfe91704c70d9fe15eda18e6889adfd7496f80b.json deleted file mode 100644 index 56bf2bf09a..0000000000 --- a/backend/.sqlx/query-bb56e61c7cfb09c0a28fb3226dfe91704c70d9fe15eda18e6889adfd7496f80b.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "DELETE FROM account WHERE workspace_id = $1 AND id = $2 RETURNING id", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [ - "Text", - "Int4" - ] - }, - "nullable": [ - false - ] - }, - "hash": "bb56e61c7cfb09c0a28fb3226dfe91704c70d9fe15eda18e6889adfd7496f80b" -} diff --git a/backend/.sqlx/query-bc0bedddcafad216c30c5061eef3f4ed8573cda89f655d6490d22f182e3f2f36.json b/backend/.sqlx/query-bc0bedddcafad216c30c5061eef3f4ed8573cda89f655d6490d22f182e3f2f36.json deleted file mode 100644 index 2ccfd91e32..0000000000 --- a/backend/.sqlx/query-bc0bedddcafad216c30c5061eef3f4ed8573cda89f655d6490d22f182e3f2f36.json +++ /dev/null @@ -1,120 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT\n aws_auth_resource_type AS \"aws_auth_resource_type: _\",\n queue_url,\n aws_resource_path,\n message_attributes,\n workspace_id,\n path,\n script_path,\n is_flow,\n edited_by,\n email,\n edited_at,\n server_id,\n last_server_ping,\n extra_perms,\n error,\n enabled\n FROM\n sqs_trigger\n WHERE\n enabled IS TRUE\n AND (last_server_ping IS NULL OR\n last_server_ping < now() - interval '15 seconds'\n )\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "aws_auth_resource_type: _", - "type_info": { - "Custom": { - "name": "aws_auth_resource_type", - "kind": { - "Enum": [ - "oidc", - "credentials" - ] - } - } - } - }, - { - "ordinal": 1, - "name": "queue_url", - "type_info": "Varchar" - }, - { - "ordinal": 2, - "name": "aws_resource_path", - "type_info": "Varchar" - }, - { - "ordinal": 3, - "name": "message_attributes", - "type_info": "TextArray" - }, - { - "ordinal": 4, - "name": "workspace_id", - "type_info": "Varchar" - }, - { - "ordinal": 5, - "name": "path", - "type_info": "Varchar" - }, - { - "ordinal": 6, - "name": "script_path", - "type_info": "Varchar" - }, - { - "ordinal": 7, - "name": "is_flow", - "type_info": "Bool" - }, - { - "ordinal": 8, - "name": "edited_by", - "type_info": "Varchar" - }, - { - "ordinal": 9, - "name": "email", - "type_info": "Varchar" - }, - { - "ordinal": 10, - "name": "edited_at", - "type_info": "Timestamptz" - }, - { - "ordinal": 11, - "name": "server_id", - "type_info": "Varchar" - }, - { - "ordinal": 12, - "name": "last_server_ping", - "type_info": "Timestamptz" - }, - { - "ordinal": 13, - "name": "extra_perms", - "type_info": "Jsonb" - }, - { - "ordinal": 14, - "name": "error", - "type_info": "Text" - }, - { - "ordinal": 15, - "name": "enabled", - "type_info": "Bool" - } - ], - "parameters": { - "Left": [] - }, - "nullable": [ - false, - false, - false, - true, - false, - false, - false, - false, - false, - false, - false, - true, - true, - true, - true, - false - ] - }, - "hash": "bc0bedddcafad216c30c5061eef3f4ed8573cda89f655d6490d22f182e3f2f36" -} diff --git a/backend/.sqlx/query-bd829646d08f68106211f97c75dce13b6fc7d35bbaf7f503dcc73ae48fd07489.json b/backend/.sqlx/query-bd829646d08f68106211f97c75dce13b6fc7d35bbaf7f503dcc73ae48fd07489.json deleted file mode 100644 index 27a484a8eb..0000000000 --- a/backend/.sqlx/query-bd829646d08f68106211f97c75dce13b6fc7d35bbaf7f503dcc73ae48fd07489.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO instance_group (name, scim_display_name, id, external_id) VALUES ($1, $2, $3, $4) ON CONFLICT DO NOTHING", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "Varchar", - "Varchar", - "Varchar" - ] - }, - "nullable": [] - }, - "hash": "bd829646d08f68106211f97c75dce13b6fc7d35bbaf7f503dcc73ae48fd07489" -} diff --git a/backend/.sqlx/query-c07c9276945663d062cf0ff5b3323be681a0e2cb07a457ea9aede2daeff551cc.json b/backend/.sqlx/query-c07c9276945663d062cf0ff5b3323be681a0e2cb07a457ea9aede2daeff551cc.json deleted file mode 100644 index dc7f552834..0000000000 --- a/backend/.sqlx/query-c07c9276945663d062cf0ff5b3323be681a0e2cb07a457ea9aede2daeff551cc.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT customer_id FROM workspace_settings WHERE workspace_id = $1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "customer_id", - "type_info": "Varchar" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - true - ] - }, - "hash": "c07c9276945663d062cf0ff5b3323be681a0e2cb07a457ea9aede2daeff551cc" -} diff --git a/backend/.sqlx/query-c0e6dbce7a401b06e1bf45155c3f81572818177a6024e743b12f558b46edf74c.json b/backend/.sqlx/query-c0e6dbce7a401b06e1bf45155c3f81572818177a6024e743b12f558b46edf74c.json deleted file mode 100644 index e65e3cb60e..0000000000 --- a/backend/.sqlx/query-c0e6dbce7a401b06e1bf45155c3f81572818177a6024e743b12f558b46edf74c.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT\n path,\n is_flow,\n workspace_id,\n owner,\n email,\n trigger_config as \"trigger_config!: _\"\n FROM\n capture_config\n WHERE\n trigger_kind = 'gcp' AND\n last_client_ping > NOW() - INTERVAL '10 seconds' AND\n trigger_config IS NOT NULL AND\n trigger_config->>'delivery_type' IS DISTINCT FROM 'push' AND\n (last_server_ping IS NULL OR last_server_ping < now() - interval '15 seconds')\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "path", - "type_info": "Varchar" - }, - { - "ordinal": 1, - "name": "is_flow", - "type_info": "Bool" - }, - { - "ordinal": 2, - "name": "workspace_id", - "type_info": "Varchar" - }, - { - "ordinal": 3, - "name": "owner", - "type_info": "Varchar" - }, - { - "ordinal": 4, - "name": "email", - "type_info": "Varchar" - }, - { - "ordinal": 5, - "name": "trigger_config!: _", - "type_info": "Jsonb" - } - ], - "parameters": { - "Left": [] - }, - "nullable": [ - false, - false, - false, - false, - false, - true - ] - }, - "hash": "c0e6dbce7a401b06e1bf45155c3f81572818177a6024e743b12f558b46edf74c" -} diff --git a/backend/.sqlx/query-c19a60a9dc3f95af218baf40c62f14572ac204cfe377166aa1d91cf58f731f50.json b/backend/.sqlx/query-c19a60a9dc3f95af218baf40c62f14572ac204cfe377166aa1d91cf58f731f50.json deleted file mode 100644 index 65cc991931..0000000000 --- a/backend/.sqlx/query-c19a60a9dc3f95af218baf40c62f14572ac204cfe377166aa1d91cf58f731f50.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n DELETE \n FROM \n gcp_trigger \n WHERE \n workspace_id = $1 AND \n path = $2\n ", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Text" - ] - }, - "nullable": [] - }, - "hash": "c19a60a9dc3f95af218baf40c62f14572ac204cfe377166aa1d91cf58f731f50" -} diff --git a/backend/.sqlx/query-c1ceb03e0eafd2e494c06cef1ec96f78c2cfd42ed7d1ca6cfd35288b561120db.json b/backend/.sqlx/query-c1ceb03e0eafd2e494c06cef1ec96f78c2cfd42ed7d1ca6cfd35288b561120db.json deleted file mode 100644 index d1a89a6ad6..0000000000 --- a/backend/.sqlx/query-c1ceb03e0eafd2e494c06cef1ec96f78c2cfd42ed7d1ca6cfd35288b561120db.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT healthy, created_at FROM healthchecks WHERE check_type = 'min_alive_workers_' || $1 AND created_at > NOW() - INTERVAL '24 hours' ORDER BY created_at DESC", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "healthy", - "type_info": "Bool" - }, - { - "ordinal": 1, - "name": "created_at", - "type_info": "Timestamptz" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - false, - false - ] - }, - "hash": "c1ceb03e0eafd2e494c06cef1ec96f78c2cfd42ed7d1ca6cfd35288b561120db" -} diff --git a/backend/.sqlx/query-c4e0f3eab227a798d9cd7478db50a7c1a588e69c2c8d9a1def9276ba326453d2.json b/backend/.sqlx/query-c4e0f3eab227a798d9cd7478db50a7c1a588e69c2c8d9a1def9276ba326453d2.json deleted file mode 100644 index bd16dab3bf..0000000000 --- a/backend/.sqlx/query-c4e0f3eab227a798d9cd7478db50a7c1a588e69c2c8d9a1def9276ba326453d2.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO cloud_workspace_settings (workspace_id, threshold_alert_amount) VALUES ($1, $2) ON CONFLICT (workspace_id) DO UPDATE SET threshold_alert_amount = $2, last_alert_sent = NULL", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "Int4" - ] - }, - "nullable": [] - }, - "hash": "c4e0f3eab227a798d9cd7478db50a7c1a588e69c2c8d9a1def9276ba326453d2" -} diff --git a/backend/.sqlx/query-c4e1873bfc7b905e7299a021f4baa2a97e95f4797c5e11f37822e19828422b7e.json b/backend/.sqlx/query-c4e1873bfc7b905e7299a021f4baa2a97e95f4797c5e11f37822e19828422b7e.json deleted file mode 100644 index d3c16a5275..0000000000 --- a/backend/.sqlx/query-c4e1873bfc7b905e7299a021f4baa2a97e95f4797c5e11f37822e19828422b7e.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE concurrency_locks SET last_locked_at = NOW() WHERE id = $1 AND last_locked_at < NOW() - INTERVAL '1 second' * $2 RETURNING 1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "?column?", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [ - "Text", - "Float8" - ] - }, - "nullable": [ - null - ] - }, - "hash": "c4e1873bfc7b905e7299a021f4baa2a97e95f4797c5e11f37822e19828422b7e" -} diff --git a/backend/.sqlx/query-c87db5bfb559c912e35415c9945009041a5f5a03eaf03fe6bf27eed406640b6a.json b/backend/.sqlx/query-c87db5bfb559c912e35415c9945009041a5f5a03eaf03fe6bf27eed406640b6a.json deleted file mode 100644 index 3facb38868..0000000000 --- a/backend/.sqlx/query-c87db5bfb559c912e35415c9945009041a5f5a03eaf03fe6bf27eed406640b6a.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT value->>'private_key' FROM global_settings WHERE name = 'rsa_keys'", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "?column?", - "type_info": "Text" - } - ], - "parameters": { - "Left": [] - }, - "nullable": [ - null - ] - }, - "hash": "c87db5bfb559c912e35415c9945009041a5f5a03eaf03fe6bf27eed406640b6a" -} diff --git a/backend/.sqlx/query-ca3ba808e020c8c7a35eaef842b20cfeee64fd47ded72fce55cc75e0bbb291a8.json b/backend/.sqlx/query-ca3ba808e020c8c7a35eaef842b20cfeee64fd47ded72fce55cc75e0bbb291a8.json new file mode 100644 index 0000000000..6d44fb2840 --- /dev/null +++ b/backend/.sqlx/query-ca3ba808e020c8c7a35eaef842b20cfeee64fd47ded72fce55cc75e0bbb291a8.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO usage (id, is_workspace, month_, usage) \n VALUES ($1, TRUE, EXTRACT(YEAR FROM current_date) * 12 + EXTRACT(MONTH FROM current_date), $2) \n ON CONFLICT (id, is_workspace, month_) DO UPDATE SET usage = usage.usage + $2", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Int4" + ] + }, + "nullable": [] + }, + "hash": "ca3ba808e020c8c7a35eaef842b20cfeee64fd47ded72fce55cc75e0bbb291a8" +} diff --git a/backend/.sqlx/query-cac594031a21b4806de9c4616317d3541522ef9712a83ecff7bd8b5f6e870748.json b/backend/.sqlx/query-cac594031a21b4806de9c4616317d3541522ef9712a83ecff7bd8b5f6e870748.json deleted file mode 100644 index 3a1add0bef..0000000000 --- a/backend/.sqlx/query-cac594031a21b4806de9c4616317d3541522ef9712a83ecff7bd8b5f6e870748.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE account SET refresh_token = $1, expires_at = $2 WHERE workspace_id = $3 AND id = $4", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "Timestamptz", - "Text", - "Int4" - ] - }, - "nullable": [] - }, - "hash": "cac594031a21b4806de9c4616317d3541522ef9712a83ecff7bd8b5f6e870748" -} diff --git a/backend/.sqlx/query-cbb93da0b7719a27d2ae1ec0f653322cae965dc5d8ebc98f69d5922fa1192561.json b/backend/.sqlx/query-cbb93da0b7719a27d2ae1ec0f653322cae965dc5d8ebc98f69d5922fa1192561.json deleted file mode 100644 index 684e857290..0000000000 --- a/backend/.sqlx/query-cbb93da0b7719a27d2ae1ec0f653322cae965dc5d8ebc98f69d5922fa1192561.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT COALESCE(\n (SELECT COUNT(*) FROM jsonb_object_keys(job_uuids)),\n 0\n )\n FROM concurrency_counter \n WHERE concurrency_id = $1\n FOR UPDATE", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "coalesce", - "type_info": "Int8" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - null - ] - }, - "hash": "cbb93da0b7719a27d2ae1ec0f653322cae965dc5d8ebc98f69d5922fa1192561" -} diff --git a/backend/.sqlx/query-cce991f582bc9d2ba28a5b2b41c679366bb07bc6a100727721a787160ac6910c.json b/backend/.sqlx/query-cce991f582bc9d2ba28a5b2b41c679366bb07bc6a100727721a787160ac6910c.json deleted file mode 100644 index f5d905a157..0000000000 --- a/backend/.sqlx/query-cce991f582bc9d2ba28a5b2b41c679366bb07bc6a100727721a787160ac6910c.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "WITH active_users as (SELECT distinct username as email FROM audit WHERE timestamp > NOW() - INTERVAL '1 month' AND (operation = 'users.login' OR operation = 'oauth.login')),\n active_authors as (SELECT distinct email FROM usr WHERE usr.operator IS false AND email IN (SELECT email FROM active_users)),\n active_authors_agg as (SELECT array_agg(email) as authors FROM active_authors),\n active_ops_agg as (SELECT array_agg(email) as operators from active_users WHERE email NOT IN (SELECT email FROM active_authors))\n SELECT active_authors_agg.authors, active_ops_agg.operators, array_length(active_authors_agg.authors, 1) as author_count, array_length(active_ops_agg.operators, 1) as operator_count FROM active_authors_agg, active_ops_agg", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "authors", - "type_info": "VarcharArray" - }, - { - "ordinal": 1, - "name": "operators", - "type_info": "VarcharArray" - }, - { - "ordinal": 2, - "name": "author_count", - "type_info": "Int4" - }, - { - "ordinal": 3, - "name": "operator_count", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [] - }, - "nullable": [ - null, - null, - null, - null - ] - }, - "hash": "cce991f582bc9d2ba28a5b2b41c679366bb07bc6a100727721a787160ac6910c" -} diff --git a/backend/.sqlx/query-cd5d62d456b74237b941bc72ea8de007185263167bf1dfa2e469d319cc4da674.json b/backend/.sqlx/query-cd5d62d456b74237b941bc72ea8de007185263167bf1dfa2e469d319cc4da674.json deleted file mode 100644 index 912b9a53de..0000000000 --- a/backend/.sqlx/query-cd5d62d456b74237b941bc72ea8de007185263167bf1dfa2e469d319cc4da674.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE nats_trigger SET server_id = $1, last_server_ping = now(), error = 'Connecting...' WHERE enabled IS TRUE AND workspace_id = $2 AND path = $3 AND (last_server_ping IS NULL OR last_server_ping < now() - interval '15 seconds') RETURNING true", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "?column?", - "type_info": "Bool" - } - ], - "parameters": { - "Left": [ - "Varchar", - "Text", - "Text" - ] - }, - "nullable": [ - null - ] - }, - "hash": "cd5d62d456b74237b941bc72ea8de007185263167bf1dfa2e469d319cc4da674" -} diff --git a/backend/.sqlx/query-cecf1addc4aecb087a14786b2a9165895ca61ef042947c7314f66514d7f29edc.json b/backend/.sqlx/query-cecf1addc4aecb087a14786b2a9165895ca61ef042947c7314f66514d7f29edc.json deleted file mode 100644 index 361f5ebd78..0000000000 --- a/backend/.sqlx/query-cecf1addc4aecb087a14786b2a9165895ca61ef042947c7314f66514d7f29edc.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT last_locked_at\n FROM concurrency_locks\n WHERE id = $1\n FOR UPDATE", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "last_locked_at", - "type_info": "Timestamp" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - false - ] - }, - "hash": "cecf1addc4aecb087a14786b2a9165895ca61ef042947c7314f66514d7f29edc" -} diff --git a/backend/.sqlx/query-d06efdc24706e0d7479bffc0b19a0c5976ee60125289e9f7b0b04090bce4a3a3.json b/backend/.sqlx/query-d06efdc24706e0d7479bffc0b19a0c5976ee60125289e9f7b0b04090bce4a3a3.json deleted file mode 100644 index 79fe0873dd..0000000000 --- a/backend/.sqlx/query-d06efdc24706e0d7479bffc0b19a0c5976ee60125289e9f7b0b04090bce4a3a3.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE capture_config SET server_id = $1, last_server_ping = now(), error = 'Connecting...' WHERE last_client_ping > NOW() - INTERVAL '10 seconds' AND workspace_id = $2 AND path = $3 AND is_flow = $4 AND trigger_kind = 'kafka' AND (last_server_ping IS NULL OR last_server_ping < now() - interval '15 seconds') RETURNING true", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "?column?", - "type_info": "Bool" - } - ], - "parameters": { - "Left": [ - "Varchar", - "Text", - "Text", - "Bool" - ] - }, - "nullable": [ - null - ] - }, - "hash": "d06efdc24706e0d7479bffc0b19a0c5976ee60125289e9f7b0b04090bce4a3a3" -} diff --git a/backend/.sqlx/query-d0bd4f43cb1feabe7ee9e017a0d6af22d25369a33247cec6e9f2d1a5eb851412.json b/backend/.sqlx/query-d0bd4f43cb1feabe7ee9e017a0d6af22d25369a33247cec6e9f2d1a5eb851412.json deleted file mode 100644 index 4e3ee705a3..0000000000 --- a/backend/.sqlx/query-d0bd4f43cb1feabe7ee9e017a0d6af22d25369a33247cec6e9f2d1a5eb851412.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n UPDATE workspace_settings\n SET git_app_installations = (\n SELECT jsonb_agg(updated)\n FROM (\n -- For each element, if the account_id matches, replace it\n SELECT\n CASE\n WHEN elem->>'account_id' = ($1::jsonb)->>'account_id' THEN $1::jsonb\n ELSE elem\n END AS updated\n FROM jsonb_array_elements(git_app_installations) AS elem\n UNION ALL\n -- Append new installation if no element with the same account_id exists\n SELECT $1::jsonb\n WHERE NOT EXISTS (\n SELECT 1\n FROM jsonb_array_elements(git_app_installations) AS elem\n WHERE elem->>'account_id' = ($1::jsonb)->>'account_id'\n )\n ) sub\n )\n WHERE workspace_id = $2;\n ", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Jsonb", - "Text" - ] - }, - "nullable": [] - }, - "hash": "d0bd4f43cb1feabe7ee9e017a0d6af22d25369a33247cec6e9f2d1a5eb851412" -} diff --git a/backend/.sqlx/query-d113bc301f2f094c3a2a4c6ed385da65edde2fbfee0fac5103ba7bd18c64563d.json b/backend/.sqlx/query-d113bc301f2f094c3a2a4c6ed385da65edde2fbfee0fac5103ba7bd18c64563d.json deleted file mode 100644 index c3782f5571..0000000000 --- a/backend/.sqlx/query-d113bc301f2f094c3a2a4c6ed385da65edde2fbfee0fac5103ba7bd18c64563d.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO metrics (id, value) VALUES ('license_key_renewal', $1)", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Jsonb" - ] - }, - "nullable": [] - }, - "hash": "d113bc301f2f094c3a2a4c6ed385da65edde2fbfee0fac5103ba7bd18c64563d" -} diff --git a/backend/.sqlx/query-d1dcc7fc8a1e1bc4dad263ec5163a94fca9dd95cc3b26b33611eab9d2a261141.json b/backend/.sqlx/query-d1dcc7fc8a1e1bc4dad263ec5163a94fca9dd95cc3b26b33611eab9d2a261141.json deleted file mode 100644 index 4a0592701c..0000000000 --- a/backend/.sqlx/query-d1dcc7fc8a1e1bc4dad263ec5163a94fca9dd95cc3b26b33611eab9d2a261141.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT args as \"args: sqlx::types::Json>\"\n FROM v2_job\n WHERE id = $1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "args: sqlx::types::Json>", - "type_info": "Jsonb" - } - ], - "parameters": { - "Left": [ - "Uuid" - ] - }, - "nullable": [ - true - ] - }, - "hash": "d1dcc7fc8a1e1bc4dad263ec5163a94fca9dd95cc3b26b33611eab9d2a261141" -} diff --git a/backend/.sqlx/query-d4eb7aea60894b65498144b9bf522beba612f36368d62fe4e94b5b9e26349d32.json b/backend/.sqlx/query-d4eb7aea60894b65498144b9bf522beba612f36368d62fe4e94b5b9e26349d32.json deleted file mode 100644 index 265034b6fc..0000000000 --- a/backend/.sqlx/query-d4eb7aea60894b65498144b9bf522beba612f36368d62fe4e94b5b9e26349d32.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT EXISTS(SELECT 1 FROM workspace WHERE id = 'demo')", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "exists", - "type_info": "Bool" - } - ], - "parameters": { - "Left": [] - }, - "nullable": [ - null - ] - }, - "hash": "d4eb7aea60894b65498144b9bf522beba612f36368d62fe4e94b5b9e26349d32" -} diff --git a/backend/.sqlx/query-d78ecf85c1e1e95650c380c9488aa90d8d8c5c76f3971484e4c515ff60293d3b.json b/backend/.sqlx/query-d78ecf85c1e1e95650c380c9488aa90d8d8c5c76f3971484e4c515ff60293d3b.json deleted file mode 100644 index cdb8b928b3..0000000000 --- a/backend/.sqlx/query-d78ecf85c1e1e95650c380c9488aa90d8d8c5c76f3971484e4c515ff60293d3b.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE kafka_trigger SET server_id = $1, last_server_ping = now(), error = 'Connecting...' WHERE enabled IS TRUE AND workspace_id = $2 AND path = $3 AND (last_server_ping IS NULL OR last_server_ping < now() - interval '15 seconds') RETURNING true", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "?column?", - "type_info": "Bool" - } - ], - "parameters": { - "Left": [ - "Varchar", - "Text", - "Text" - ] - }, - "nullable": [ - null - ] - }, - "hash": "d78ecf85c1e1e95650c380c9488aa90d8d8c5c76f3971484e4c515ff60293d3b" -} diff --git a/backend/.sqlx/query-d8ea17fba0e417333e9c6cf82ad36a57830a791c8358e30e9be012b815f5e8e3.json b/backend/.sqlx/query-d8ea17fba0e417333e9c6cf82ad36a57830a791c8358e30e9be012b815f5e8e3.json deleted file mode 100644 index dcaee3cfe8..0000000000 --- a/backend/.sqlx/query-d8ea17fba0e417333e9c6cf82ad36a57830a791c8358e30e9be012b815f5e8e3.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT path, is_flow, workspace_id, trigger_config as \"trigger_config!: _\", owner, email FROM capture_config WHERE trigger_kind = 'kafka' AND last_client_ping > NOW() - INTERVAL '10 seconds' AND trigger_config IS NOT NULL AND (last_server_ping IS NULL OR last_server_ping < now() - interval '15 seconds')", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "path", - "type_info": "Varchar" - }, - { - "ordinal": 1, - "name": "is_flow", - "type_info": "Bool" - }, - { - "ordinal": 2, - "name": "workspace_id", - "type_info": "Varchar" - }, - { - "ordinal": 3, - "name": "trigger_config!: _", - "type_info": "Jsonb" - }, - { - "ordinal": 4, - "name": "owner", - "type_info": "Varchar" - }, - { - "ordinal": 5, - "name": "email", - "type_info": "Varchar" - } - ], - "parameters": { - "Left": [] - }, - "nullable": [ - false, - false, - false, - true, - false, - false - ] - }, - "hash": "d8ea17fba0e417333e9c6cf82ad36a57830a791c8358e30e9be012b815f5e8e3" -} diff --git a/backend/.sqlx/query-d9a6f75e4c4a1f61e55b313cc09bceffac637548841897341672da427a9140fc.json b/backend/.sqlx/query-d9a6f75e4c4a1f61e55b313cc09bceffac637548841897341672da427a9140fc.json deleted file mode 100644 index 3ccfcc9582..0000000000 --- a/backend/.sqlx/query-d9a6f75e4c4a1f61e55b313cc09bceffac637548841897341672da427a9140fc.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE capture_config SET last_server_ping = now(), error = $1 WHERE workspace_id = $2 AND path = $3 AND is_flow = $4 AND trigger_kind = 'kafka' AND server_id = $5 AND last_client_ping > NOW() - INTERVAL '10 seconds' RETURNING 1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "?column?", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [ - "Text", - "Text", - "Text", - "Bool", - "Text" - ] - }, - "nullable": [ - null - ] - }, - "hash": "d9a6f75e4c4a1f61e55b313cc09bceffac637548841897341672da427a9140fc" -} diff --git a/backend/.sqlx/query-dc649111c4c862c36c26ad8a9eff8c31c2533a4a73184d0276f9a388ff2fa574.json b/backend/.sqlx/query-dc649111c4c862c36c26ad8a9eff8c31c2533a4a73184d0276f9a388ff2fa574.json deleted file mode 100644 index f6ec69af57..0000000000 --- a/backend/.sqlx/query-dc649111c4c862c36c26ad8a9eff8c31c2533a4a73184d0276f9a388ff2fa574.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO account (workspace_id, client, expires_at, refresh_token) VALUES ($1, $2, now() + ($3 || ' seconds')::interval, $4) RETURNING id", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [ - "Varchar", - "Varchar", - "Text", - "Varchar" - ] - }, - "nullable": [ - false - ] - }, - "hash": "dc649111c4c862c36c26ad8a9eff8c31c2533a4a73184d0276f9a388ff2fa574" -} diff --git a/backend/.sqlx/query-dcf03ff4b922b93be37d2be5da6884ae3e8c6cf7eaa2d9c62056366eb42f2276.json b/backend/.sqlx/query-dcf03ff4b922b93be37d2be5da6884ae3e8c6cf7eaa2d9c62056366eb42f2276.json deleted file mode 100644 index 989e4612ec..0000000000 --- a/backend/.sqlx/query-dcf03ff4b922b93be37d2be5da6884ae3e8c6cf7eaa2d9c62056366eb42f2276.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE nats_trigger SET last_server_ping = now(), error = $1 WHERE workspace_id = $2 AND path = $3 AND server_id = $4 AND enabled IS TRUE RETURNING 1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "?column?", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [ - "Text", - "Text", - "Text", - "Text" - ] - }, - "nullable": [ - null - ] - }, - "hash": "dcf03ff4b922b93be37d2be5da6884ae3e8c6cf7eaa2d9c62056366eb42f2276" -} diff --git a/backend/.sqlx/query-dea056c89313f4facd62cbbc9fa33ba30fa85efcc83fafe4dd7b4e535b96a8d8.json b/backend/.sqlx/query-dea056c89313f4facd62cbbc9fa33ba30fa85efcc83fafe4dd7b4e535b96a8d8.json deleted file mode 100644 index 12e4b6d81b..0000000000 --- a/backend/.sqlx/query-dea056c89313f4facd62cbbc9fa33ba30fa85efcc83fafe4dd7b4e535b96a8d8.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n DELETE \n FROM \n sqs_trigger \n WHERE \n workspace_id = $1 AND \n path = $2\n ", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Text" - ] - }, - "nullable": [] - }, - "hash": "dea056c89313f4facd62cbbc9fa33ba30fa85efcc83fafe4dd7b4e535b96a8d8" -} diff --git a/backend/.sqlx/query-df2a426658f0a36683cc2163fe70912d0221d191b8ab091601cb53cdd932ad58.json b/backend/.sqlx/query-df2a426658f0a36683cc2163fe70912d0221d191b8ab091601cb53cdd932ad58.json deleted file mode 100644 index f98dd01404..0000000000 --- a/backend/.sqlx/query-df2a426658f0a36683cc2163fe70912d0221d191b8ab091601cb53cdd932ad58.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n UPDATE \n gcp_trigger\n SET \n last_server_ping = now(),\n error = $1\n WHERE\n workspace_id = $2\n AND path = $3\n AND server_id = $4 \n AND enabled IS TRUE\n RETURNING 1\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "?column?", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [ - "Text", - "Text", - "Text", - "Text" - ] - }, - "nullable": [ - null - ] - }, - "hash": "df2a426658f0a36683cc2163fe70912d0221d191b8ab091601cb53cdd932ad58" -} diff --git a/backend/.sqlx/query-e37ba13aa3174931f0bfcff26dbc141fe8a346ab6a1a3bc924794bfe3c9af306.json b/backend/.sqlx/query-e37ba13aa3174931f0bfcff26dbc141fe8a346ab6a1a3bc924794bfe3c9af306.json deleted file mode 100644 index cec42e51c6..0000000000 --- a/backend/.sqlx/query-e37ba13aa3174931f0bfcff26dbc141fe8a346ab6a1a3bc924794bfe3c9af306.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE capture_config SET last_server_ping = now(), error = $1 WHERE workspace_id = $2 AND path = $3 AND is_flow = $4 AND trigger_kind = 'nats' AND server_id = $5 AND last_client_ping > NOW() - INTERVAL '10 seconds' RETURNING 1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "?column?", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [ - "Text", - "Text", - "Text", - "Bool", - "Text" - ] - }, - "nullable": [ - null - ] - }, - "hash": "e37ba13aa3174931f0bfcff26dbc141fe8a346ab6a1a3bc924794bfe3c9af306" -} diff --git a/backend/.sqlx/query-e38240e6d50bfe60e1c2b649588eb41dcef121ed161db04b2568ac2d990aed7c.json b/backend/.sqlx/query-e38240e6d50bfe60e1c2b649588eb41dcef121ed161db04b2568ac2d990aed7c.json deleted file mode 100644 index 1ff35d7227..0000000000 --- a/backend/.sqlx/query-e38240e6d50bfe60e1c2b649588eb41dcef121ed161db04b2568ac2d990aed7c.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO usage (id, is_workspace, month_, usage) \n VALUES ($1, FALSE, EXTRACT(YEAR FROM current_date) * 12 + EXTRACT(MONTH FROM current_date), $2) \n ON CONFLICT (id, is_workspace, month_) DO UPDATE SET usage = usage.usage + $2", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "Int4" - ] - }, - "nullable": [] - }, - "hash": "e38240e6d50bfe60e1c2b649588eb41dcef121ed161db04b2568ac2d990aed7c" -} diff --git a/backend/.sqlx/query-e38a66d15382703b99054a9b609af9f3854bb65393d33b265476c0e68aec4f61.json b/backend/.sqlx/query-e38a66d15382703b99054a9b609af9f3854bb65393d33b265476c0e68aec4f61.json deleted file mode 100644 index 78e5750992..0000000000 --- a/backend/.sqlx/query-e38a66d15382703b99054a9b609af9f3854bb65393d33b265476c0e68aec4f61.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE nats_trigger SET last_server_ping = NULL WHERE workspace_id = $1 AND path = $2 AND server_id IS NULL", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Text" - ] - }, - "nullable": [] - }, - "hash": "e38a66d15382703b99054a9b609af9f3854bb65393d33b265476c0e68aec4f61" -} diff --git a/backend/.sqlx/query-e822d186203fe809b764007ad7c02870a3b7d93ae43b40ac2cd3181dffab0837.json b/backend/.sqlx/query-e822d186203fe809b764007ad7c02870a3b7d93ae43b40ac2cd3181dffab0837.json deleted file mode 100644 index 8974494ddd..0000000000 --- a/backend/.sqlx/query-e822d186203fe809b764007ad7c02870a3b7d93ae43b40ac2cd3181dffab0837.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO usr (workspace_id, username, email, is_admin, operator) VALUES ($1, $2, $3, false, $4) ON CONFLICT DO NOTHING", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "Varchar", - "Varchar", - "Bool" - ] - }, - "nullable": [] - }, - "hash": "e822d186203fe809b764007ad7c02870a3b7d93ae43b40ac2cd3181dffab0837" -} diff --git a/backend/.sqlx/query-eb932b613a6dbb2cdff97e5512d42b538ba83115c0ea798be00b01659600f45a.json b/backend/.sqlx/query-eb932b613a6dbb2cdff97e5512d42b538ba83115c0ea798be00b01659600f45a.json deleted file mode 100644 index 7717a34760..0000000000 --- a/backend/.sqlx/query-eb932b613a6dbb2cdff97e5512d42b538ba83115c0ea798be00b01659600f45a.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT EXISTS(SELECT 1 FROM healthchecks WHERE check_type = $1 AND healthy = false)", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "exists", - "type_info": "Bool" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - null - ] - }, - "hash": "eb932b613a6dbb2cdff97e5512d42b538ba83115c0ea798be00b01659600f45a" -} diff --git a/backend/.sqlx/query-ebbe03cad470d0c6ae98964f630315ff25dad08e4cb714718505b77a75d44b95.json b/backend/.sqlx/query-ebbe03cad470d0c6ae98964f630315ff25dad08e4cb714718505b77a75d44b95.json deleted file mode 100644 index e087310961..0000000000 --- a/backend/.sqlx/query-ebbe03cad470d0c6ae98964f630315ff25dad08e4cb714718505b77a75d44b95.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE workspace_settings SET teams_command_script = $1 WHERE workspace_id = $2", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Text" - ] - }, - "nullable": [] - }, - "hash": "ebbe03cad470d0c6ae98964f630315ff25dad08e4cb714718505b77a75d44b95" -} diff --git a/backend/.sqlx/query-eda1e5d1109a13feb14be254eaca630be29176bd5d1246c974642d40201782fc.json b/backend/.sqlx/query-eda1e5d1109a13feb14be254eaca630be29176bd5d1246c974642d40201782fc.json deleted file mode 100644 index fdc34ee1c7..0000000000 --- a/backend/.sqlx/query-eda1e5d1109a13feb14be254eaca630be29176bd5d1246c974642d40201782fc.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE kafka_trigger SET enabled = $1, email = $2, edited_by = $3, edited_at = now(), server_id = NULL, error = NULL\n WHERE path = $4 AND workspace_id = $5 RETURNING 1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "?column?", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [ - "Bool", - "Varchar", - "Varchar", - "Text", - "Text" - ] - }, - "nullable": [ - null - ] - }, - "hash": "eda1e5d1109a13feb14be254eaca630be29176bd5d1246c974642d40201782fc" -} diff --git a/backend/.sqlx/query-f16b00bad2880f896f4452e5894fe101cd5c2fe3e4c143c0b979668143d85dd2.json b/backend/.sqlx/query-f16b00bad2880f896f4452e5894fe101cd5c2fe3e4c143c0b979668143d85dd2.json deleted file mode 100644 index a1ce88bd88..0000000000 --- a/backend/.sqlx/query-f16b00bad2880f896f4452e5894fe101cd5c2fe3e4c143c0b979668143d85dd2.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE capture_config SET server_id = $1, last_server_ping = now(), error = 'Connecting...' WHERE last_client_ping > NOW() - INTERVAL '10 seconds' AND workspace_id = $2 AND path = $3 AND is_flow = $4 AND trigger_kind = 'nats' AND (last_server_ping IS NULL OR last_server_ping < now() - interval '15 seconds') RETURNING true", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "?column?", - "type_info": "Bool" - } - ], - "parameters": { - "Left": [ - "Varchar", - "Text", - "Text", - "Bool" - ] - }, - "nullable": [ - null - ] - }, - "hash": "f16b00bad2880f896f4452e5894fe101cd5c2fe3e4c143c0b979668143d85dd2" -} diff --git a/backend/.sqlx/query-f22964772dc2d67aee437bbbd08b64792c00da1d713d7ca8f9904ccce7bfdae7.json b/backend/.sqlx/query-f22964772dc2d67aee437bbbd08b64792c00da1d713d7ca8f9904ccce7bfdae7.json deleted file mode 100644 index b3a352de55..0000000000 --- a/backend/.sqlx/query-f22964772dc2d67aee437bbbd08b64792c00da1d713d7ca8f9904ccce7bfdae7.json +++ /dev/null @@ -1,246 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT\n cj.id AS \"id!\",\n cj.workspace_id AS \"workspace_id!\",\n cj.parent_job,\n cj.created_by AS \"created_by!\",\n cj.duration_ms AS \"duration_ms!\",\n cj.success AS \"success!\",\n cj.script_hash AS \"script_hash!: Option\",\n cj.script_path,\n cj.args AS \"args: sqlx::types::Json>>\",\n cj.result AS \"result: sqlx::types::Json>\",\n cj.deleted AS \"deleted!\",\n cj.canceled AS \"canceled!\",\n cj.canceled_by,\n cj.canceled_reason,\n cj.job_kind AS \"job_kind!: JobKind\",\n cj.schedule_path,\n cj.permissioned_as AS \"permissioned_as!\",\n cj.is_flow_step AS \"is_flow_step!\",\n cj.language AS \"language: ScriptLang\",\n cj.is_skipped AS \"is_skipped!\",\n cj.email AS \"email!\",\n cj.visible_to_owner AS \"visible_to_owner!\",\n cj.mem_peak,\n cj.tag AS \"tag!\",\n cj.created_at AS \"created_at!\",\n cj.started_at,\n job_logs.logs,\n job_logs.log_offset AS \"log_offset?\",\n job_logs.log_file_index\n\n FROM v2_as_completed_job AS cj\n LEFT JOIN job_logs ON cj.id = job_logs.job_id\n WHERE cj.created_at < $1\n ORDER BY cj.created_at ASC LIMIT $2", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id!", - "type_info": "Uuid" - }, - { - "ordinal": 1, - "name": "workspace_id!", - "type_info": "Varchar" - }, - { - "ordinal": 2, - "name": "parent_job", - "type_info": "Uuid" - }, - { - "ordinal": 3, - "name": "created_by!", - "type_info": "Varchar" - }, - { - "ordinal": 4, - "name": "duration_ms!", - "type_info": "Int8" - }, - { - "ordinal": 5, - "name": "success!", - "type_info": "Bool" - }, - { - "ordinal": 6, - "name": "script_hash!: Option", - "type_info": "Int8" - }, - { - "ordinal": 7, - "name": "script_path", - "type_info": "Varchar" - }, - { - "ordinal": 8, - "name": "args: sqlx::types::Json>>", - "type_info": "Jsonb" - }, - { - "ordinal": 9, - "name": "result: sqlx::types::Json>", - "type_info": "Jsonb" - }, - { - "ordinal": 10, - "name": "deleted!", - "type_info": "Bool" - }, - { - "ordinal": 11, - "name": "canceled!", - "type_info": "Bool" - }, - { - "ordinal": 12, - "name": "canceled_by", - "type_info": "Varchar" - }, - { - "ordinal": 13, - "name": "canceled_reason", - "type_info": "Text" - }, - { - "ordinal": 14, - "name": "job_kind!: JobKind", - "type_info": { - "Custom": { - "name": "job_kind", - "kind": { - "Enum": [ - "script", - "preview", - "flow", - "dependencies", - "flowpreview", - "script_hub", - "identity", - "flowdependencies", - "http", - "graphql", - "postgresql", - "noop", - "appdependencies", - "deploymentcallback", - "singlescriptflow", - "flowscript", - "flownode", - "appscript" - ] - } - } - } - }, - { - "ordinal": 15, - "name": "schedule_path", - "type_info": "Varchar" - }, - { - "ordinal": 16, - "name": "permissioned_as!", - "type_info": "Varchar" - }, - { - "ordinal": 17, - "name": "is_flow_step!", - "type_info": "Bool" - }, - { - "ordinal": 18, - "name": "language: ScriptLang", - "type_info": { - "Custom": { - "name": "script_lang", - "kind": { - "Enum": [ - "python3", - "deno", - "go", - "bash", - "postgresql", - "nativets", - "bun", - "mysql", - "bigquery", - "snowflake", - "graphql", - "powershell", - "mssql", - "php", - "bunnative", - "rust", - "ansible", - "csharp", - "oracledb", - "nu", - "java" - ] - } - } - } - }, - { - "ordinal": 19, - "name": "is_skipped!", - "type_info": "Bool" - }, - { - "ordinal": 20, - "name": "email!", - "type_info": "Varchar" - }, - { - "ordinal": 21, - "name": "visible_to_owner!", - "type_info": "Bool" - }, - { - "ordinal": 22, - "name": "mem_peak", - "type_info": "Int4" - }, - { - "ordinal": 23, - "name": "tag!", - "type_info": "Varchar" - }, - { - "ordinal": 24, - "name": "created_at!", - "type_info": "Timestamptz" - }, - { - "ordinal": 25, - "name": "started_at", - "type_info": "Timestamptz" - }, - { - "ordinal": 26, - "name": "logs", - "type_info": "Text" - }, - { - "ordinal": 27, - "name": "log_offset?", - "type_info": "Int4" - }, - { - "ordinal": 28, - "name": "log_file_index", - "type_info": "TextArray" - } - ], - "parameters": { - "Left": [ - "Timestamptz", - "Int8" - ] - }, - "nullable": [ - true, - true, - true, - true, - true, - true, - true, - true, - true, - true, - true, - true, - true, - true, - true, - true, - true, - true, - true, - true, - true, - true, - true, - true, - true, - true, - true, - false, - true - ] - }, - "hash": "f22964772dc2d67aee437bbbd08b64792c00da1d713d7ca8f9904ccce7bfdae7" -} diff --git a/backend/.sqlx/query-f74589aaa72d0eb9f44157cc60eb121e63a7f31ed849834bb8ac9e8c726e81f1.json b/backend/.sqlx/query-f74589aaa72d0eb9f44157cc60eb121e63a7f31ed849834bb8ac9e8c726e81f1.json deleted file mode 100644 index 46fe54f755..0000000000 --- a/backend/.sqlx/query-f74589aaa72d0eb9f44157cc60eb121e63a7f31ed849834bb8ac9e8c726e81f1.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT threshold_alert_amount, last_alert_sent FROM cloud_workspace_settings WHERE workspace_id = $1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "threshold_alert_amount", - "type_info": "Int4" - }, - { - "ordinal": 1, - "name": "last_alert_sent", - "type_info": "Timestamp" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - true, - true - ] - }, - "hash": "f74589aaa72d0eb9f44157cc60eb121e63a7f31ed849834bb8ac9e8c726e81f1" -} diff --git a/backend/.sqlx/query-f955a01779f5441efc6aa9364b24c79b3cbc6413046c3b6099d19f675d8a395b.json b/backend/.sqlx/query-f955a01779f5441efc6aa9364b24c79b3cbc6413046c3b6099d19f675d8a395b.json deleted file mode 100644 index 925d8c39f1..0000000000 --- a/backend/.sqlx/query-f955a01779f5441efc6aa9364b24c79b3cbc6413046c3b6099d19f675d8a395b.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT EXISTS (SELECT 1\n FROM workspace_settings\n WHERE workspace_id <> $1\n AND slack_command_script IS NOT NULL\n AND slack_team_id = $2\n AND (SELECT slack_command_script IS NOT NULL FROM workspace_settings WHERE workspace_id = $1))\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "exists", - "type_info": "Bool" - } - ], - "parameters": { - "Left": [ - "Text", - "Text" - ] - }, - "nullable": [ - null - ] - }, - "hash": "f955a01779f5441efc6aa9364b24c79b3cbc6413046c3b6099d19f675d8a395b" -} diff --git a/backend/.sqlx/query-fab5a746a179eea356f0bb9005590e3bb89c4deff181827bd2fa5630c21e42a7.json b/backend/.sqlx/query-fab5a746a179eea356f0bb9005590e3bb89c4deff181827bd2fa5630c21e42a7.json deleted file mode 100644 index 1f877fcddf..0000000000 --- a/backend/.sqlx/query-fab5a746a179eea356f0bb9005590e3bb89c4deff181827bd2fa5630c21e42a7.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT COUNT(*) as count, COALESCE(MAX(ended_at), now() - INTERVAL '1 second' * $2) as max_ended_at FROM concurrency_key WHERE key = $1 AND ended_at >= (now() - INTERVAL '1 second' * $2)", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "count", - "type_info": "Int8" - }, - { - "ordinal": 1, - "name": "max_ended_at", - "type_info": "Timestamptz" - } - ], - "parameters": { - "Left": [ - "Text", - "Float8" - ] - }, - "nullable": [ - null, - null - ] - }, - "hash": "fab5a746a179eea356f0bb9005590e3bb89c4deff181827bd2fa5630c21e42a7" -} diff --git a/backend/.sqlx/query-faf2c77242e0ab39b33886edf3b742531bf1351d0be1c3631bde0adfe375497a.json b/backend/.sqlx/query-faf2c77242e0ab39b33886edf3b742531bf1351d0be1c3631bde0adfe375497a.json deleted file mode 100644 index ea798bab76..0000000000 --- a/backend/.sqlx/query-faf2c77242e0ab39b33886edf3b742531bf1351d0be1c3631bde0adfe375497a.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT tag FROM v2_job WHERE id = $1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "tag", - "type_info": "Varchar" - } - ], - "parameters": { - "Left": [ - "Uuid" - ] - }, - "nullable": [ - false - ] - }, - "hash": "faf2c77242e0ab39b33886edf3b742531bf1351d0be1c3631bde0adfe375497a" -} diff --git a/backend/.sqlx/query-fb581eb6f883ebb5909a00c65a6e1217f088290fce0e052171230bcd88f945b9.json b/backend/.sqlx/query-fb581eb6f883ebb5909a00c65a6e1217f088290fce0e052171230bcd88f945b9.json deleted file mode 100644 index b3f640dd76..0000000000 --- a/backend/.sqlx/query-fb581eb6f883ebb5909a00c65a6e1217f088290fce0e052171230bcd88f945b9.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO global_settings (name, value) VALUES ('slack', $1) ON CONFLICT (name) DO UPDATE SET value = $1, updated_at = now()", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Jsonb" - ] - }, - "nullable": [] - }, - "hash": "fb581eb6f883ebb5909a00c65a6e1217f088290fce0e052171230bcd88f945b9" -} diff --git a/backend/.sqlx/query-fbe14569717b4c4937b74e6dc6f6b4ea29a2b0c2b1cde48ef06d687f6f9e8f15.json b/backend/.sqlx/query-fbe14569717b4c4937b74e6dc6f6b4ea29a2b0c2b1cde48ef06d687f6f9e8f15.json deleted file mode 100644 index 642572bfe8..0000000000 --- a/backend/.sqlx/query-fbe14569717b4c4937b74e6dc6f6b4ea29a2b0c2b1cde48ef06d687f6f9e8f15.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT client, refresh_token FROM account WHERE workspace_id = $1 AND id = $2", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "client", - "type_info": "Varchar" - }, - { - "ordinal": 1, - "name": "refresh_token", - "type_info": "Varchar" - } - ], - "parameters": { - "Left": [ - "Text", - "Int4" - ] - }, - "nullable": [ - false, - false - ] - }, - "hash": "fbe14569717b4c4937b74e6dc6f6b4ea29a2b0c2b1cde48ef06d687f6f9e8f15" -} diff --git a/backend/.sqlx/query-fc8fa909ef7a15c7ad30dd938be3c13864e855219c7f366c86f0605ec25d1538.json b/backend/.sqlx/query-fc8fa909ef7a15c7ad30dd938be3c13864e855219c7f366c86f0605ec25d1538.json deleted file mode 100644 index f5d5a46df5..0000000000 --- a/backend/.sqlx/query-fc8fa909ef7a15c7ad30dd938be3c13864e855219c7f366c86f0605ec25d1538.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT workspace_id, auto_invite_operator, auto_add FROM workspace_settings ws WHERE (auto_invite_domain = $1 OR auto_invite_domain = '*') AND NOT EXISTS (SELECT 1 FROM usr WHERE workspace_id = ws.workspace_id AND email = $2)", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "workspace_id", - "type_info": "Varchar" - }, - { - "ordinal": 1, - "name": "auto_invite_operator", - "type_info": "Bool" - }, - { - "ordinal": 2, - "name": "auto_add", - "type_info": "Bool" - } - ], - "parameters": { - "Left": [ - "Text", - "Text" - ] - }, - "nullable": [ - false, - true, - true - ] - }, - "hash": "fc8fa909ef7a15c7ad30dd938be3c13864e855219c7f366c86f0605ec25d1538" -} diff --git a/backend/.sqlx/query-fd0a0ca4a107dc813240ad71f372ab7e0bf26431158fbfb5f0023ed847ca7dc5.json b/backend/.sqlx/query-fd0a0ca4a107dc813240ad71f372ab7e0bf26431158fbfb5f0023ed847ca7dc5.json deleted file mode 100644 index d47bb3fd68..0000000000 --- a/backend/.sqlx/query-fd0a0ca4a107dc813240ad71f372ab7e0bf26431158fbfb5f0023ed847ca7dc5.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n UPDATE \n gcp_trigger \n SET \n enabled = FALSE, \n error = $1, \n server_id = NULL, \n last_server_ping = NULL \n WHERE \n workspace_id = $2 AND \n path = $3\n ", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Text", - "Text" - ] - }, - "nullable": [] - }, - "hash": "fd0a0ca4a107dc813240ad71f372ab7e0bf26431158fbfb5f0023ed847ca7dc5" -} diff --git a/backend/.sqlx/query-ff0403790674cdb07022af71c2377afbd8b3a660b3be27514b517c077c63c238.json b/backend/.sqlx/query-ff0403790674cdb07022af71c2377afbd8b3a660b3be27514b517c077c63c238.json index c7644fa79a..4e911403de 100644 --- a/backend/.sqlx/query-ff0403790674cdb07022af71c2377afbd8b3a660b3be27514b517c077c63c238.json +++ b/backend/.sqlx/query-ff0403790674cdb07022af71c2377afbd8b3a660b3be27514b517c077c63c238.json @@ -65,7 +65,8 @@ "csharp", "oracledb", "nu", - "java" + "java", + "duckdb" ] } } diff --git a/backend/.sqlx/query-ffb6b2a40b605f9c55826a0e519af80b100d2ffa58ec567223e27099d364fcc8.json b/backend/.sqlx/query-ffb6b2a40b605f9c55826a0e519af80b100d2ffa58ec567223e27099d364fcc8.json deleted file mode 100644 index c75cb3385a..0000000000 --- a/backend/.sqlx/query-ffb6b2a40b605f9c55826a0e519af80b100d2ffa58ec567223e27099d364fcc8.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE capture_config SET error = $1, server_id = NULL, last_server_ping = NULL WHERE workspace_id = $2 AND path = $3 AND is_flow = $4 AND trigger_kind = 'nats'", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Text", - "Text", - "Bool" - ] - }, - "nullable": [] - }, - "hash": "ffb6b2a40b605f9c55826a0e519af80b100d2ffa58ec567223e27099d364fcc8" -} diff --git a/backend/update_sqlx.sh b/backend/update_sqlx.sh index 24c7a57bcf..a0470b5751 100755 --- a/backend/update_sqlx.sh +++ b/backend/update_sqlx.sh @@ -10,7 +10,6 @@ if [[ "$(uname)" == "Darwin" ]]; then fi cargo sqlx prepare --workspace -- --all-targets --features $(./all_features_oss.sh) -./substitute_ee_code.sh -r --dir ../windmill-ee-private # Undo the samael changes on macOS if [[ "$(uname)" == "Darwin" ]]; then diff --git a/backend/windmill-queue/src/jobs.rs b/backend/windmill-queue/src/jobs.rs index a84890d452..3b0143c826 100644 --- a/backend/windmill-queue/src/jobs.rs +++ b/backend/windmill-queue/src/jobs.rs @@ -1012,16 +1012,19 @@ pub async fn add_completed_job( #[cfg(feature = "cloud")] if *CLOUD_HOSTED && !queued_job.is_flow() && _duration > 1000 { let db = db.clone(); - let workspace_id = queued_job.workspace_id.clone(); - let permissioned_as_email = queued_job.permissioned_as_email.clone(); + let w_id = queued_job.workspace_id.clone(); + let email = queued_job.permissioned_as_email.clone(); + let w_id2 = w_id.clone(); + let email2 = email.clone(); tokio::task::spawn(async move { let additional_usage = _duration / 1000; - let premium_workspace = windmill_common::workspaces::is_premium_workspace(&db, &workspace_id).await; + let premium_workspace = windmill_common::workspaces::is_premium_workspace(&db, &w_id).await; + tokio::time::timeout(std::time::Duration::from_secs(10), async move { let _ = sqlx::query!( "INSERT INTO usage (id, is_workspace, month_, usage) VALUES ($1, TRUE, EXTRACT(YEAR FROM current_date) * 12 + EXTRACT(MONTH FROM current_date), $2) ON CONFLICT (id, is_workspace, month_) DO UPDATE SET usage = usage.usage + $2", - workspace_id, + w_id, additional_usage as i32 ) .execute(&db) @@ -1033,13 +1036,16 @@ pub async fn add_completed_job( "INSERT INTO usage (id, is_workspace, month_, usage) VALUES ($1, FALSE, EXTRACT(YEAR FROM current_date) * 12 + EXTRACT(MONTH FROM current_date), $2) ON CONFLICT (id, is_workspace, month_) DO UPDATE SET usage = usage.usage + $2", - permissioned_as_email, + email, additional_usage as i32 ) .execute(&db) .await .map_err(|e| Error::internal_err(format!("updating usage: {e:#}"))); - }}); + }}).await.unwrap_or_else(|_| { + tracing::error!("Could not update usage for workspace {w_id2} and permissioned as {email2}, stopped after 10s"); + }); + }); } @@ -3273,35 +3279,40 @@ pub async fn push<'c, 'd>( job_payload, JobPayload::Flow { .. } | JobPayload::RawFlow { .. } ) { - let workspace_usage = sqlx::query_scalar!( - "INSERT INTO usage (id, is_workspace, month_, usage) - VALUES ($1, TRUE, EXTRACT(YEAR FROM current_date) * 12 + EXTRACT(MONTH FROM current_date), 1) - ON CONFLICT (id, is_workspace, month_) DO UPDATE SET usage = usage.usage + 1 - RETURNING usage.usage", - workspace_id - ) - .fetch_one(_db) - .await - .map_err(|e| Error::internal_err(format!("updating usage: {e:#}")))?; + tokio::time::timeout(std::time::Duration::from_secs(10), async move { + let workspace_usage = sqlx::query_scalar!( + "INSERT INTO usage (id, is_workspace, month_, usage) + VALUES ($1, TRUE, EXTRACT(YEAR FROM current_date) * 12 + EXTRACT(MONTH FROM current_date), 1) + ON CONFLICT (id, is_workspace, month_) DO UPDATE SET usage = usage.usage + 1 + RETURNING usage.usage", + workspace_id + ) + .fetch_one(_db) + .await + .map_err(|e| Error::internal_err(format!("updating usage: {e:#}")))?; - let user_usage = if !premium_workspace { - Some(sqlx::query_scalar!( - "INSERT INTO usage (id, is_workspace, month_, usage) - VALUES ($1, FALSE, EXTRACT(YEAR FROM current_date) * 12 + EXTRACT(MONTH FROM current_date), 1) - ON CONFLICT (id, is_workspace, month_) DO UPDATE SET usage = usage.usage + 1 - RETURNING usage.usage", - email - ) - .fetch_one(_db) - .await - .map_err(|e| Error::internal_err(format!("updating usage: {e:#}")))?) - } else { - None - }; - (Some(workspace_usage), user_usage) + let user_usage = if !premium_workspace { + Some(sqlx::query_scalar!( + "INSERT INTO usage (id, is_workspace, month_, usage) + VALUES ($1, FALSE, EXTRACT(YEAR FROM current_date) * 12 + EXTRACT(MONTH FROM current_date), 1) + ON CONFLICT (id, is_workspace, month_) DO UPDATE SET usage = usage.usage + 1 + RETURNING usage.usage", + email + ) + .fetch_one(_db) + .await + .map_err(|e| Error::internal_err(format!("updating usage: {e:#}")))?) + } else { + None + }; + Ok((Some(workspace_usage), user_usage)) + }).await.unwrap_or_else(|e| { + tracing::error!("Could not update usage for workspace {workspace_id} and permissioned as {email}, stopped after 10s: {e:#}"); + Err(Error::internal_err(format!("Could not update usage for workspace {workspace_id} and permissioned as {email}, stopped after 10s: {e:#}"))) + }) } else { - (None, None) - }; + Ok((None, None)) + }?; if !premium_workspace { let is_super_admin = From b749e490b4cac762232580052d00b68c9766c8b7 Mon Sep 17 00:00:00 2001 From: Diego Imbert <70353967+diegoimbert@users.noreply.github.com> Date: Thu, 5 Jun 2025 18:42:46 +0200 Subject: [PATCH 532/739] di/fix update sqlx script (#5877) * fix update sqlx script * Update sqlx --------- Co-authored-by: wendrul --- ...9caf531b2312b6e405b4d35efd2f7ca663143.json | 22 ++ ...f408ff1ac92ed0f5d31a3ef6c58313e1f8671.json | 28 ++ ...60f5c3561c37e9c6f2834d234a862a475a6eb.json | 26 ++ ...d009cfc9da0d3b2bd1f40d422b550779e5324.json | 20 ++ ...bd8fc61409776d641ddb592a4c731e61a0468.json | 26 ++ ...8234ca7d1efeee9661f3901f298da375e73f7.json | 184 +++++++++++++ ...4e283c71729f81550f6f7156ce4970345cc07.json | 16 ++ ...62994d4a861f1dbb9752c0a27428d83040e13.json | 28 ++ ...b7a73d9492e07680732af9af09e223ade1f37.json | 14 + ...5be61080c1003eef51eea41862b25c2b93de6.json | 14 + ...50afdcce2d54721bfe8dba008b15e4b581956.json | 15 ++ ...b89646279f77469c35deffca8e17a11d7f6c8.json | 28 ++ ...f3d52776c8cb73f2507199c6ca16d4d2405ba.json | 23 ++ ...f61f003c29185c267642cfd898075ebda855d.json | 145 ++++++++++ ...74b9a1035ec21176468f147998ac89fbed465.json | 14 + ...927c6df0653a02b87bcea939066e39ebcf24d.json | 15 ++ ...9418f85d4d3d599f4177403fad5ad99380715.json | 26 ++ ...c2133190ba448d6f7830c8f1f7c22e4d753b8.json | 20 ++ ...d9474b17887711128dbb2ef15d247d50686b0.json | 22 ++ ...d982b52b48c8c3da392b14963a1ec86811546.json | 50 ++++ ...8e11e25c1d3a30294cbe78f01ed75edf68da4.json | 23 ++ ...09260b906dc988f44a0db60952a2bf8b1cdaf.json | 15 ++ ...f8b0672797299545ee0754b6ad74ece92c77e.json | 26 ++ ...d95226bd94ca3facb92a620ffa59dacad6705.json | 28 ++ ...591b28cbf9ea8f61d379b84ee6e14c033035d.json | 17 ++ ...4039bd67f8e37895befa94a15b7e4019e114b.json | 12 + ...c776994ae2c990bb7bb307c52296b9543fbb8.json | 16 ++ ...d6bce075f20bcd5d2328f183d8a59331f6bb1.json | 18 ++ ...27bcf833f56475bbc1aa3c8f6d79f146f41bf.json | 25 ++ ...bac1d55858f89039ae5baecdc9ceca668adab.json | 15 ++ ...de63612a7506cc0671b0eb83e528c1c839db4.json | 14 + ...b7c797424f8291517d3abf096fe45548a0273.json | 22 ++ ...9ff7994ee40d3953b9f772d0e0ab999bccb7b.json | 14 + ...5199960264b54c1ddf928c0c654ab15176f63.json | 25 ++ ...26e57488489177fe596940d3698d843a93666.json | 22 ++ ...3f578a21813f038d75184a5034c37d4daf36e.json | 142 ++++++++++ ...5cf9a26e3b2888702e5e9d5fc1b082901df09.json | 16 ++ ...2cf0e4086030f3b7994e4892392765cbe1517.json | 23 ++ ...d8020f1f6085f4ee85f5eab3458637edf26cd.json | 22 ++ ...c69b08c6a86116cbfd0ecad8f112f7f49d8d1.json | 26 ++ ...cb7aa5a75b7e40fa312eff6590e54b02635a2.json | 20 ++ ...9071e1d3cf78e89ec467927823177c5a439cc.json | 22 ++ ...81d870b847a8ba07e6197212fdf85ec901b09.json | 15 ++ ...3cd1a1d6eca4083286c6f29c9acba522d2fe3.json | 22 ++ ...a660bfd5a8c0a451a0deac24632f0ccf66165.json | 26 ++ ...4e82c1b7060ba0ca288dc6a7c7afcd76212e8.json | 16 ++ ...31617043fcc0bea3ef62c50fcd881f3d48605.json | 35 +++ ...287a9f42e252a1246a584249a224afdbbbf8a.json | 16 ++ ...721ad0f3e2888af207e8830ccf5e921c5fd60.json | 16 ++ ...02024cfa226735eeeb720bbab46bd0e3cedcc.json | 50 ++++ ...776992bfeb383d590e379244ad23703e536a4.json | 19 ++ ...ce3631feee1565935d2a6ddbecc17950758d1.json | 17 ++ ...a2524943ba277c5f9a37c06bd5ee14fd46bda.json | 17 ++ ...f131f8a0c9cdb37cfba6283a6718480b02a4b.json | 34 +++ ...b3d956c004376102ccc1707fc016801599dbd.json | 36 +++ ...520fc4160c008c3d29fe7d99e609c0b6e3e6d.json | 12 + ...b2a897fe4b30c83f2aa5e9464c156f08f1c3a.json | 38 +++ ...93c8c0a57f93b7b445171b1cc3f4428ee6e53.json | 18 ++ ...a2e60c9c24decb2a6b41125247bbf741e9c25.json | 46 ++++ ...55b21bbc487b80bda7fd6250ac12e93938577.json | 22 ++ ...e1b38c30f7d2689baf647ea4dc6b398c3a651.json | 23 ++ ...74a0cf43682480452f7dbe23012320fe7fe25.json | 58 ++++ ...e89fc04765191f251945d14bbe78718714f6e.json | 39 +++ ...4caecda6335eda5b2e97e5a7370361653ff48.json | 26 ++ ...5bacbb4bbe3bb4725eece43fb82944212f21d.json | 22 ++ ...c984775d23c7a4dc1a7ad37528a46ab89d6bd.json | 123 +++++++++ ...da464be138272487639d0ffbbbe6961ec5c37.json | 18 ++ ...8b82359c182ee2a5da6df35a4375d5d2d1ef7.json | 65 +++++ ...bb6698610189bac63c2caee3f4d52b0851f31.json | 20 ++ ...b1bd45853bf5b72e0ab991e0e61fedcfb42fc.json | 16 ++ ...17a6cf34de92b9b4079c00b75423a9ff835b9.json | 20 ++ ...dcc40f463cbc52d94ed9315cf9a547d4c89f2.json | 184 +++++++++++++ ...2846cd0b1ef5f64d20b0d975d0058730f427b.json | 22 ++ ...8b29ef8bba3d6da1b1e21f2ca307ccbebee89.json | 16 ++ ...9861756b3ad367a4a500728332a7cb91560a4.json | 15 ++ ...5f85dd67ab1514d7c48668ab2f10aa6b201ba.json | 14 + ...153c43903f929ae5d62fbba12610f89c36d55.json | 2 +- ...41d95ba195f5543120e76e68f6e6715b65a71.json | 24 ++ ...fb1d462d5c796f08c7481c42154f9bfacf388.json | 22 ++ ...31d90bc0aa384262e473c7006340dcb6e959c.json | 23 ++ ...f82b5951f17d1b7eade53c6d89253d55f8b9f.json | 22 ++ ...c3277a2543cd3b52a3123b0585f6c9071552c.json | 46 ++++ ...e21295673c45e4caae1bdbb47517d4608dc8d.json | 17 ++ ...20e85b2eed7b4705367361fc5e456e5263df9.json | 15 ++ ...7998ea800860ede856e5fc6cd1f57d5408333.json | 16 ++ ...25cc496528768f8ee4c6924b13bb8f75a9f8a.json | 15 ++ ...520758656ce6bcd1e694a62e140e0af8c59fa.json | 15 ++ ...f2390af9d02efc7112a32a84e1a1247a95973.json | 56 ++++ ...cabb01481a19bef5a956dc36cac41acad0e53.json | 25 ++ ...a9b44c76f1cf1485ceba50aeede9daec94c01.json | 18 ++ ...957c87f2307a218115ca749ea0e71eca2002e.json | 23 ++ ...eabc4c516418e595dee9cd7d651acc1f4af6e.json | 249 ++++++++++++++++++ ...973e8fc108d9f32be8a8501391052d76e191e.json | 25 ++ ...c067fee1ebf7510fec98e0574e07c906cc714.json | 46 ++++ ...cc158e09af72dd31585ed2ddc1cc06cbfd189.json | 20 ++ ...ad3056ee4fdf8691ba5503937424d75f3815e.json | 20 ++ ...4e255cd5e9b990ffa89998ef24871d3a9717c.json | 14 + ...a37fcc985bf61978cc07167ed35d7dbf92d11.json | 23 ++ ...4b7bfc5bc8b6a76c98bf4daf7d715d18c52e6.json | 34 +++ ...7c99b85d68ce1be2bafdc145aed0aa8e5d989.json | 14 + ...fc93f01fdbc19c66d7404f95e1f8444235a8e.json | 25 ++ ...ef9f4c8faa986843024a2cd58e212f706aae8.json | 17 ++ ...d6f4c6e63f7b7b6d4cf0b4ae1237da0e17b4b.json | 28 ++ ...585bfa19b70315840585c81b8e7a3911ab5e7.json | 15 ++ ...d9fdee37dd8df66974c8d33f58a88b1bca537.json | 12 + ...fcd8c5491732818404fee2397f00cccee0ad3.json | 34 +++ ...524d1a5b196a7b77afcb02f46b84b22088bbf.json | 20 ++ ...1a955cb86557032cfbdbf4022bf1ad3230ae7.json | 14 + ...0d206b722ec4192368599c3a5027f50a89c80.json | 14 + ...ccb9c3e8169e4080ee28f6f40c729d06cbb55.json | 16 ++ ...7832c5a674a5553674fd9762c981e0d03bb57.json | 15 ++ ...8e460f99a0d2155fe2ff7b1d2840c5d9b76d0.json | 23 ++ ...0fcfcd6aeae7bc5a37e9a735cabbe2691c570.json | 22 ++ ...4633c1531170ded1fdf09114718b941f5e1db.json | 65 +++++ ...a614a50fa5fd03c2d3b9a41bd85a7f156345e.json | 22 ++ ...75dfe92f74a7220ed69e61899a6e0f053d9cd.json | 14 + ...c7cdd6e5af3545835763ccb29cdf3ac273ef0.json | 15 ++ ...329f748006ab131489d2fcac21d32641bb633.json | 24 ++ ...540a354f8eec49913aaf07fc1e737e7c93330.json | 16 ++ ...722f60cbd41814f8a17006c82f48888f05bb6.json | 14 + ...d59f418ed6fc2a98ddb9bbc33dce5f029d904.json | 15 ++ ...857d432dff44e343b8f0610208d42ff5afd14.json | 14 + ...00296ee84c9536228496e19b4ec5df1781bc5.json | 29 ++ ...2728a82ba256029096812dd705ccb1a552cfe.json | 19 ++ ...f8479986f1591bf545b8562109b6ce26578b0.json | 23 ++ ...f11191590a12ea98a671e172b867306959884.json | 15 ++ ...f3490f88ced636c9ebdecba2205f964b1d0f1.json | 15 ++ ...27bfe0790d5e1c347e5b15835c8996c039cd1.json | 22 ++ ...ab0dc7217d1b3f86f362c213982984d2cf652.json | 26 ++ ...a2a9cc4fee3473b3f6ea69f397d91e9356ba1.json | 19 ++ ...4ddf964a5b3cd088fc162d0d8222325d4a5ea.json | 14 + ...e22889d35e919d3267c1d2a265d868fa8a7d1.json | 16 ++ ...0472a87b7e267a143709728b09ac063c33b96.json | 16 ++ ...23b4376a93342702856da2ac70f6bbfc7933e.json | 23 ++ ...e98369e1d93514e1618723a34bf96080d4ebc.json | 16 ++ ...7a886242277cd50555f20b2e22e13942d2a3a.json | 65 +++++ ...90b824af5260a3b1ab3355ac613f1f83fc349.json | 16 ++ ...d363102f5f6705d6debb442a85126ed59d863.json | 18 ++ ...6b4d21aa3bfe772e4d344e306a224ec2c8a01.json | 15 ++ ...e91704c70d9fe15eda18e6889adfd7496f80b.json | 23 ++ ...3f4ed8573cda89f655d6490d22f182e3f2f36.json | 120 +++++++++ ...ce13b6fc7d35bbaf7f503dcc73ae48fd07489.json | 17 ++ ...23be681a0e2cb07a457ea9aede2daeff551cc.json | 22 ++ ...f81572818177a6024e743b12f558b46edf74c.json | 50 ++++ ...f14572ac204cfe377166aa1d91cf58f731f50.json | 15 ++ ...96f78c2cfd42ed7d1ca6cfd35288b561120db.json | 28 ++ ...0a7c1a588e69c2c8d9a1def9276ba326453d2.json | 15 ++ ...aa2a97e95f4797c5e11f37822e19828422b7e.json | 23 ++ ...009041a5f5a03eaf03fe6bf27eed406640b6a.json | 20 ++ ...7d3541522ef9712a83ecff7bd8b5f6e870748.json | 17 ++ ...3322cae965dc5d8ebc98f69d5922fa1192561.json | 22 ++ ...679366bb07bc6a100727721a787160ac6910c.json | 38 +++ ...de007185263167bf1dfa2e469d319cc4da674.json | 24 ++ ...165895ca61ef042947c7314f66514d7f29edc.json | 22 ++ ...a0c5976ee60125289e9f7b0b04090bce4a3a3.json | 25 ++ ...6af22d25369a33247cec6e9f2d1a5eb851412.json | 15 ++ ...5da65edde2fbfee0fac5103ba7bd18c64563d.json | 14 + ...3a94fca9dd95cc3b26b33611eab9d2a261141.json | 22 ++ ...22beba612f36368d62fe4e94b5b9e26349d32.json | 20 ++ ...aa90d8d8c5c76f3971484e4c515ff60293d3b.json | 24 ++ ...36a57830a791c8358e30e9be012b815f5e8e3.json | 50 ++++ ...bceffac637548841897341672da427a9140fc.json | 26 ++ ...f8c31c2533a4a73184d0276f9a388ff2fa574.json | 25 ++ ...884ae3e8c6cf7eaa2d9c62056366eb42f2276.json | 25 ++ ...33ba30fa85efcc83fafe4dd7b4e535b96a8d8.json | 15 ++ ...0912d0221d191b8ab091601cb53cdd932ad58.json | 25 ++ ...c141fe8a346ab6a1a3bc924794bfe3c9af306.json | 26 ++ ...af9f3854bb65393d33b265476c0e68aec4f61.json | 15 ++ ...02870a3b7d93ae43b40ac2cd3181dffab0837.json | 17 ++ ...42b538ba83115c0ea798be00b01659600f45a.json | 22 ++ ...315ff25dad08e4cb714718505b77a75d44b95.json | 15 ++ ...a630be29176bd5d1246c974642d40201782fc.json | 26 ++ ...fe101cd5c2fe3e4c143c0b979668143d85dd2.json | 25 ++ ...b64792c00da1d713d7ca8f9904ccce7bfdae7.json | 247 +++++++++++++++++ ...b121e63a7f31ed849834bb8ac9e8c726e81f1.json | 28 ++ ...4c79b3cbc6413046c3b6099d19f675d8a395b.json | 23 ++ ...90e3bb89c4deff181827bd2fa5630c21e42a7.json | 29 ++ ...e1217f088290fce0e052171230bcd88f945b9.json | 14 + ...6b4ea29a2b0c2b1cde48ef06d687f6f9e8f15.json | 29 ++ ...3c13864e855219c7f366c86f0605ec25d1538.json | 35 +++ ...2ab7e0bf26431158fbfb5f0023ed847ca7dc5.json | 16 ++ ...af80b100d2ffa58ec567223e27099d364fcc8.json | 17 ++ backend/update_sqlx.sh | 2 +- 183 files changed, 5366 insertions(+), 2 deletions(-) create mode 100644 backend/.sqlx/query-005b9255699e73600c579f74b529caf531b2312b6e405b4d35efd2f7ca663143.json create mode 100644 backend/.sqlx/query-050fb876e10ad13654dbbde4532f408ff1ac92ed0f5d31a3ef6c58313e1f8671.json create mode 100644 backend/.sqlx/query-070b8ad0b59f485fa5bf68082b060f5c3561c37e9c6f2834d234a862a475a6eb.json create mode 100644 backend/.sqlx/query-08dd2ea6b17a52bce352d6443d7d009cfc9da0d3b2bd1f40d422b550779e5324.json create mode 100644 backend/.sqlx/query-08e4a2dc49c75aa356f3cc75a4abd8fc61409776d641ddb592a4c731e61a0468.json create mode 100644 backend/.sqlx/query-08f288d2781d823e109a9e5b8848234ca7d1efeee9661f3901f298da375e73f7.json create mode 100644 backend/.sqlx/query-09e2a19435068f9e9bfd5bcb44b4e283c71729f81550f6f7156ce4970345cc07.json create mode 100644 backend/.sqlx/query-0c2e53960dc7786c848079b155e62994d4a861f1dbb9752c0a27428d83040e13.json create mode 100644 backend/.sqlx/query-0c9ad812013ff476a79ca8d6bb8b7a73d9492e07680732af9af09e223ade1f37.json create mode 100644 backend/.sqlx/query-0cb84cbb9083d967cc8be1cccab5be61080c1003eef51eea41862b25c2b93de6.json create mode 100644 backend/.sqlx/query-0dd3fe3ddf9cb72760687d2ee0950afdcce2d54721bfe8dba008b15e4b581956.json create mode 100644 backend/.sqlx/query-0ee14619dd81df460b2b8cc6df2b89646279f77469c35deffca8e17a11d7f6c8.json create mode 100644 backend/.sqlx/query-0ef37117c369f03236e18f9dbb1f3d52776c8cb73f2507199c6ca16d4d2405ba.json create mode 100644 backend/.sqlx/query-1312b7fd622cc814a406c85dbbff61f003c29185c267642cfd898075ebda855d.json create mode 100644 backend/.sqlx/query-134fe14dd47e80a9ef9b245a59e74b9a1035ec21176468f147998ac89fbed465.json create mode 100644 backend/.sqlx/query-14abf759dae7ba5c38017ba6001927c6df0653a02b87bcea939066e39ebcf24d.json create mode 100644 backend/.sqlx/query-1625a84fbcf8c5f77eb0519f60d9418f85d4d3d599f4177403fad5ad99380715.json create mode 100644 backend/.sqlx/query-19bc874a06658b549e13cfa080ac2133190ba448d6f7830c8f1f7c22e4d753b8.json create mode 100644 backend/.sqlx/query-1ace9bdcde90fd2261fd64344a2d9474b17887711128dbb2ef15d247d50686b0.json create mode 100644 backend/.sqlx/query-1b33393fbbc7e681b4d355f6096d982b52b48c8c3da392b14963a1ec86811546.json create mode 100644 backend/.sqlx/query-1c0f95a069891f7214505aaa9428e11e25c1d3a30294cbe78f01ed75edf68da4.json create mode 100644 backend/.sqlx/query-1c37f91192aa4f535c7fff80fa809260b906dc988f44a0db60952a2bf8b1cdaf.json create mode 100644 backend/.sqlx/query-1cad25c24d0f80d58a50d4da923f8b0672797299545ee0754b6ad74ece92c77e.json create mode 100644 backend/.sqlx/query-1f5f0858909eb5bac63c4e3b1add95226bd94ca3facb92a620ffa59dacad6705.json create mode 100644 backend/.sqlx/query-203fa78d423ec5a8c5ff6166aed591b28cbf9ea8f61d379b84ee6e14c033035d.json create mode 100644 backend/.sqlx/query-2041526bc58872d71f91f7698144039bd67f8e37895befa94a15b7e4019e114b.json create mode 100644 backend/.sqlx/query-20e01ecb5d4aa4c532a8f906365c776994ae2c990bb7bb307c52296b9543fbb8.json create mode 100644 backend/.sqlx/query-20fcdcd2674a52ee9bd8d1de518d6bce075f20bcd5d2328f183d8a59331f6bb1.json create mode 100644 backend/.sqlx/query-22dcd953d900fb0ddbe2099ccee27bcf833f56475bbc1aa3c8f6d79f146f41bf.json create mode 100644 backend/.sqlx/query-22ff7c00b2d3e93ea9e147fc9a5bac1d55858f89039ae5baecdc9ceca668adab.json create mode 100644 backend/.sqlx/query-23c37d36e16251763fabf194e41de63612a7506cc0671b0eb83e528c1c839db4.json create mode 100644 backend/.sqlx/query-266741894b9a6ed650cf999b6e5b7c797424f8291517d3abf096fe45548a0273.json create mode 100644 backend/.sqlx/query-27920aaa55666ffc14a36a247f89ff7994ee40d3953b9f772d0e0ab999bccb7b.json create mode 100644 backend/.sqlx/query-299e16725162888c01712f371785199960264b54c1ddf928c0c654ab15176f63.json create mode 100644 backend/.sqlx/query-2ae44acae7ac80e191b37071baa26e57488489177fe596940d3698d843a93666.json create mode 100644 backend/.sqlx/query-2dcff8b16da75740c362015b2293f578a21813f038d75184a5034c37d4daf36e.json create mode 100644 backend/.sqlx/query-2e1d1c59bfc53d58962251822c85cf9a26e3b2888702e5e9d5fc1b082901df09.json create mode 100644 backend/.sqlx/query-33ee913ce263600a3f94f90e4a42cf0e4086030f3b7994e4892392765cbe1517.json create mode 100644 backend/.sqlx/query-34a45763bb4d14162f4cd3fa07cd8020f1f6085f4ee85f5eab3458637edf26cd.json create mode 100644 backend/.sqlx/query-354f88b23d20f92c6b6d5bdd8d6c69b08c6a86116cbfd0ecad8f112f7f49d8d1.json create mode 100644 backend/.sqlx/query-388b3705f641621b0c2f4496e36cb7aa5a75b7e40fa312eff6590e54b02635a2.json create mode 100644 backend/.sqlx/query-38c20dba51b1e2b4b28e5eed51f9071e1d3cf78e89ec467927823177c5a439cc.json create mode 100644 backend/.sqlx/query-3997dcf2c11817e59bf50fd896381d870b847a8ba07e6197212fdf85ec901b09.json create mode 100644 backend/.sqlx/query-3b02f3ec6b92706c26065b2fa703cd1a1d6eca4083286c6f29c9acba522d2fe3.json create mode 100644 backend/.sqlx/query-3d8fdf7adf42b27808a5b223df3a660bfd5a8c0a451a0deac24632f0ccf66165.json create mode 100644 backend/.sqlx/query-3e64c894c89ef82c4527180b82c4e82c1b7060ba0ca288dc6a7c7afcd76212e8.json create mode 100644 backend/.sqlx/query-3f5520e0ea00569bf169da9abde31617043fcc0bea3ef62c50fcd881f3d48605.json create mode 100644 backend/.sqlx/query-3f67e7cf8d9f021a075f1c88703287a9f42e252a1246a584249a224afdbbbf8a.json create mode 100644 backend/.sqlx/query-3fa3d1fa1add8e187fcbaf7351b721ad0f3e2888af207e8830ccf5e921c5fd60.json create mode 100644 backend/.sqlx/query-42030372693d8d6b8d03947bb6702024cfa226735eeeb720bbab46bd0e3cedcc.json create mode 100644 backend/.sqlx/query-42df4b40b3bbf14010f07e29892776992bfeb383d590e379244ad23703e536a4.json create mode 100644 backend/.sqlx/query-43b376a2eff086a32cd76e54361ce3631feee1565935d2a6ddbecc17950758d1.json create mode 100644 backend/.sqlx/query-43c8cd9f8560412bb06d9966ccfa2524943ba277c5f9a37c06bd5ee14fd46bda.json create mode 100644 backend/.sqlx/query-44a12919fb154055f1142cc078ef131f8a0c9cdb37cfba6283a6718480b02a4b.json create mode 100644 backend/.sqlx/query-44b9bea3651edc8ee732def1241b3d956c004376102ccc1707fc016801599dbd.json create mode 100644 backend/.sqlx/query-45dde0dc2da12fe46b5975ed53b520fc4160c008c3d29fe7d99e609c0b6e3e6d.json create mode 100644 backend/.sqlx/query-4887db074e9058bc0c1887428d6b2a897fe4b30c83f2aa5e9464c156f08f1c3a.json create mode 100644 backend/.sqlx/query-4968e9edac534657c808b891cbf93c8c0a57f93b7b445171b1cc3f4428ee6e53.json create mode 100644 backend/.sqlx/query-4b8132b04e454eddfe6724c6cc3a2e60c9c24decb2a6b41125247bbf741e9c25.json create mode 100644 backend/.sqlx/query-4cfa57b2a836242d55071ef237855b21bbc487b80bda7fd6250ac12e93938577.json create mode 100644 backend/.sqlx/query-4e3469185637ad8f06673261bfae1b38c30f7d2689baf647ea4dc6b398c3a651.json create mode 100644 backend/.sqlx/query-4e5273b9ce05f6ee2dfd5f14c8574a0cf43682480452f7dbe23012320fe7fe25.json create mode 100644 backend/.sqlx/query-4eca060026a0cb19c5794cd56ace89fc04765191f251945d14bbe78718714f6e.json create mode 100644 backend/.sqlx/query-50c17c7848760aaf0f869acfc444caecda6335eda5b2e97e5a7370361653ff48.json create mode 100644 backend/.sqlx/query-51dbf8e3814c2d63df1958db12d5bacbb4bbe3bb4725eece43fb82944212f21d.json create mode 100644 backend/.sqlx/query-5237f9d3f57f4e799968a4a9630c984775d23c7a4dc1a7ad37528a46ab89d6bd.json create mode 100644 backend/.sqlx/query-528cdbb75f1c5135170a58fce3fda464be138272487639d0ffbbbe6961ec5c37.json create mode 100644 backend/.sqlx/query-5303206bbed76ee3ddc56d8057d8b82359c182ee2a5da6df35a4375d5d2d1ef7.json create mode 100644 backend/.sqlx/query-54c6be1469a80d88fd6d5c30772bb6698610189bac63c2caee3f4d52b0851f31.json create mode 100644 backend/.sqlx/query-551c78392919e18019bb0a4344fb1bd45853bf5b72e0ab991e0e61fedcfb42fc.json create mode 100644 backend/.sqlx/query-55a2f170823f1d1abce76287d8817a6cf34de92b9b4079c00b75423a9ff835b9.json create mode 100644 backend/.sqlx/query-55cb03040bc2a8c53dd7fbb42bbdcc40f463cbc52d94ed9315cf9a547d4c89f2.json create mode 100644 backend/.sqlx/query-55cf43cb9219b43f8e9f94b23b62846cd0b1ef5f64d20b0d975d0058730f427b.json create mode 100644 backend/.sqlx/query-574d9a2bb6eceb62f3d2c2be3f18b29ef8bba3d6da1b1e21f2ca307ccbebee89.json create mode 100644 backend/.sqlx/query-57e270e032e8c04dda7b5c1ca949861756b3ad367a4a500728332a7cb91560a4.json create mode 100644 backend/.sqlx/query-5930b2fa72fd15d692bcf3e14d95f85dd67ab1514d7c48668ab2f10aa6b201ba.json create mode 100644 backend/.sqlx/query-5bd8ae8d694ac9f6afef762276141d95ba195f5543120e76e68f6e6715b65a71.json create mode 100644 backend/.sqlx/query-5f22a7c9170f035779782591b4bfb1d462d5c796f08c7481c42154f9bfacf388.json create mode 100644 backend/.sqlx/query-5faba1042763a308c64e36cc2a331d90bc0aa384262e473c7006340dcb6e959c.json create mode 100644 backend/.sqlx/query-5fd70c70ce52cbc51fa9124cb05f82b5951f17d1b7eade53c6d89253d55f8b9f.json create mode 100644 backend/.sqlx/query-6032ab9ab230c48a44f684e70ebc3277a2543cd3b52a3123b0585f6c9071552c.json create mode 100644 backend/.sqlx/query-64c5ca0bd4a2c42d6f5415fae1de21295673c45e4caae1bdbb47517d4608dc8d.json create mode 100644 backend/.sqlx/query-656f268969018438499f677d31720e85b2eed7b4705367361fc5e456e5263df9.json create mode 100644 backend/.sqlx/query-673564e6c4dcf30dae3d7a75c397998ea800860ede856e5fc6cd1f57d5408333.json create mode 100644 backend/.sqlx/query-689551fddbff09acd3f000ae54f25cc496528768f8ee4c6924b13bb8f75a9f8a.json create mode 100644 backend/.sqlx/query-69518153298f8ca6f112bed156b520758656ce6bcd1e694a62e140e0af8c59fa.json create mode 100644 backend/.sqlx/query-6a72df33cf12824c54b29dbf011f2390af9d02efc7112a32a84e1a1247a95973.json create mode 100644 backend/.sqlx/query-6b776693091191f36eaf9e35fb3cabb01481a19bef5a956dc36cac41acad0e53.json create mode 100644 backend/.sqlx/query-6bb4fab9e74c421fb30cfd856a1a9b44c76f1cf1485ceba50aeede9daec94c01.json create mode 100644 backend/.sqlx/query-6d418b5cd7a4df54cfe3ec06e2a957c87f2307a218115ca749ea0e71eca2002e.json create mode 100644 backend/.sqlx/query-6e2564dc37ee967c634deade67ceabc4c516418e595dee9cd7d651acc1f4af6e.json create mode 100644 backend/.sqlx/query-6e70ebf078ac04a2933d2f83791973e8fc108d9f32be8a8501391052d76e191e.json create mode 100644 backend/.sqlx/query-70a3bfa729f874c9765f00a9c7dc067fee1ebf7510fec98e0574e07c906cc714.json create mode 100644 backend/.sqlx/query-71ad5448cba8da6677edd02e090cc158e09af72dd31585ed2ddc1cc06cbfd189.json create mode 100644 backend/.sqlx/query-729c5c6430431f044148aeeec18ad3056ee4fdf8691ba5503937424d75f3815e.json create mode 100644 backend/.sqlx/query-73ca6ea13b362b2569ea115d28e4e255cd5e9b990ffa89998ef24871d3a9717c.json create mode 100644 backend/.sqlx/query-746ee16a04267cd251d4cefbc44a37fcc985bf61978cc07167ed35d7dbf92d11.json create mode 100644 backend/.sqlx/query-776909d3452aaf9e0ed41a5ec314b7bfc5bc8b6a76c98bf4daf7d715d18c52e6.json create mode 100644 backend/.sqlx/query-7aef087f9e10dd32417477109b97c99b85d68ce1be2bafdc145aed0aa8e5d989.json create mode 100644 backend/.sqlx/query-7b36b58761cd459b808cc4f463dfc93f01fdbc19c66d7404f95e1f8444235a8e.json create mode 100644 backend/.sqlx/query-7e31c47e02492b74cbb5702dfc5ef9f4c8faa986843024a2cd58e212f706aae8.json create mode 100644 backend/.sqlx/query-7ecb01893c46823a207bf59aa57d6f4c6e63f7b7b6d4cf0b4ae1237da0e17b4b.json create mode 100644 backend/.sqlx/query-7f772ceace10008d7d40afd331a585bfa19b70315840585c81b8e7a3911ab5e7.json create mode 100644 backend/.sqlx/query-7fa8fca5b5cdf147da0cf8ae5a0d9fdee37dd8df66974c8d33f58a88b1bca537.json create mode 100644 backend/.sqlx/query-8490024b96aa689d3c1bc5cbf94fcd8c5491732818404fee2397f00cccee0ad3.json create mode 100644 backend/.sqlx/query-84d048ea323758842dc564c700b524d1a5b196a7b77afcb02f46b84b22088bbf.json create mode 100644 backend/.sqlx/query-85844054136d7bc9669d6b340ca1a955cb86557032cfbdbf4022bf1ad3230ae7.json create mode 100644 backend/.sqlx/query-85c116da4a43a5ade37bb9ab2660d206b722ec4192368599c3a5027f50a89c80.json create mode 100644 backend/.sqlx/query-8667efb13d6bd7ef1858d7d9fc7ccb9c3e8169e4080ee28f6f40c729d06cbb55.json create mode 100644 backend/.sqlx/query-870b12a46f26c9e29889dd28a5c7832c5a674a5553674fd9762c981e0d03bb57.json create mode 100644 backend/.sqlx/query-884039108b98daa6279975e65348e460f99a0d2155fe2ff7b1d2840c5d9b76d0.json create mode 100644 backend/.sqlx/query-88b7589a6416da8be4b26af3bf30fcfcd6aeae7bc5a37e9a735cabbe2691c570.json create mode 100644 backend/.sqlx/query-8d207cc9ed101ff116b617d25a94633c1531170ded1fdf09114718b941f5e1db.json create mode 100644 backend/.sqlx/query-8dd1de2aca8c6c9ffaddd2c41c3a614a50fa5fd03c2d3b9a41bd85a7f156345e.json create mode 100644 backend/.sqlx/query-900ac59515e4283f4b57516210575dfe92f74a7220ed69e61899a6e0f053d9cd.json create mode 100644 backend/.sqlx/query-902961f15b8c7603dddf2933b5fc7cdd6e5af3545835763ccb29cdf3ac273ef0.json create mode 100644 backend/.sqlx/query-92c2b66eb6287449f5f8cc9f8d1329f748006ab131489d2fcac21d32641bb633.json create mode 100644 backend/.sqlx/query-93d64930c74ccb1abdc9bda8287540a354f8eec49913aaf07fc1e737e7c93330.json create mode 100644 backend/.sqlx/query-9969f99d81b2fa581a1da8f7cc3722f60cbd41814f8a17006c82f48888f05bb6.json create mode 100644 backend/.sqlx/query-999edc6f54a9efb6dc6237992dad59f418ed6fc2a98ddb9bbc33dce5f029d904.json create mode 100644 backend/.sqlx/query-9c72b2962d0919353cfe5af710e857d432dff44e343b8f0610208d42ff5afd14.json create mode 100644 backend/.sqlx/query-9e2810312302b36d3b4d761481c00296ee84c9536228496e19b4ec5df1781bc5.json create mode 100644 backend/.sqlx/query-9f1f388924176dbe3dea882e0c62728a82ba256029096812dd705ccb1a552cfe.json create mode 100644 backend/.sqlx/query-a15a4478d1249c9ae5cd5f2b755f8479986f1591bf545b8562109b6ce26578b0.json create mode 100644 backend/.sqlx/query-a59aac0bc593d99aedd14fd9606f11191590a12ea98a671e172b867306959884.json create mode 100644 backend/.sqlx/query-a5fbef9db2308920ea26f6154f0f3490f88ced636c9ebdecba2205f964b1d0f1.json create mode 100644 backend/.sqlx/query-a670b88ea83d69997f1b70873b927bfe0790d5e1c347e5b15835c8996c039cd1.json create mode 100644 backend/.sqlx/query-a7ffc5b983d365159ef379ec6a2ab0dc7217d1b3f86f362c213982984d2cf652.json create mode 100644 backend/.sqlx/query-ad3b0176e3d41a0c1d79a8eb59da2a9cc4fee3473b3f6ea69f397d91e9356ba1.json create mode 100644 backend/.sqlx/query-ad42118ccf6a9d2d1e072c4df064ddf964a5b3cd088fc162d0d8222325d4a5ea.json create mode 100644 backend/.sqlx/query-add48c8e7c6fa2c549ad6293cbee22889d35e919d3267c1d2a265d868fa8a7d1.json create mode 100644 backend/.sqlx/query-b223c56f55a138abef8c8cb2df40472a87b7e267a143709728b09ac063c33b96.json create mode 100644 backend/.sqlx/query-b386d320f9fe1d569a16e6626b723b4376a93342702856da2ac70f6bbfc7933e.json create mode 100644 backend/.sqlx/query-b4d48c820bf41619bffa8f62367e98369e1d93514e1618723a34bf96080d4ebc.json create mode 100644 backend/.sqlx/query-b5c839baab25c4dcdd503d380cf7a886242277cd50555f20b2e22e13942d2a3a.json create mode 100644 backend/.sqlx/query-b6ddadfa8d23db666206f907a6390b824af5260a3b1ab3355ac613f1f83fc349.json create mode 100644 backend/.sqlx/query-b83e58972d8f8285eb604de94c3d363102f5f6705d6debb442a85126ed59d863.json create mode 100644 backend/.sqlx/query-b8490eea478c1fd279593a7ced86b4d21aa3bfe772e4d344e306a224ec2c8a01.json create mode 100644 backend/.sqlx/query-bb56e61c7cfb09c0a28fb3226dfe91704c70d9fe15eda18e6889adfd7496f80b.json create mode 100644 backend/.sqlx/query-bc0bedddcafad216c30c5061eef3f4ed8573cda89f655d6490d22f182e3f2f36.json create mode 100644 backend/.sqlx/query-bd829646d08f68106211f97c75dce13b6fc7d35bbaf7f503dcc73ae48fd07489.json create mode 100644 backend/.sqlx/query-c07c9276945663d062cf0ff5b3323be681a0e2cb07a457ea9aede2daeff551cc.json create mode 100644 backend/.sqlx/query-c0e6dbce7a401b06e1bf45155c3f81572818177a6024e743b12f558b46edf74c.json create mode 100644 backend/.sqlx/query-c19a60a9dc3f95af218baf40c62f14572ac204cfe377166aa1d91cf58f731f50.json create mode 100644 backend/.sqlx/query-c1ceb03e0eafd2e494c06cef1ec96f78c2cfd42ed7d1ca6cfd35288b561120db.json create mode 100644 backend/.sqlx/query-c4e0f3eab227a798d9cd7478db50a7c1a588e69c2c8d9a1def9276ba326453d2.json create mode 100644 backend/.sqlx/query-c4e1873bfc7b905e7299a021f4baa2a97e95f4797c5e11f37822e19828422b7e.json create mode 100644 backend/.sqlx/query-c87db5bfb559c912e35415c9945009041a5f5a03eaf03fe6bf27eed406640b6a.json create mode 100644 backend/.sqlx/query-cac594031a21b4806de9c4616317d3541522ef9712a83ecff7bd8b5f6e870748.json create mode 100644 backend/.sqlx/query-cbb93da0b7719a27d2ae1ec0f653322cae965dc5d8ebc98f69d5922fa1192561.json create mode 100644 backend/.sqlx/query-cce991f582bc9d2ba28a5b2b41c679366bb07bc6a100727721a787160ac6910c.json create mode 100644 backend/.sqlx/query-cd5d62d456b74237b941bc72ea8de007185263167bf1dfa2e469d319cc4da674.json create mode 100644 backend/.sqlx/query-cecf1addc4aecb087a14786b2a9165895ca61ef042947c7314f66514d7f29edc.json create mode 100644 backend/.sqlx/query-d06efdc24706e0d7479bffc0b19a0c5976ee60125289e9f7b0b04090bce4a3a3.json create mode 100644 backend/.sqlx/query-d0bd4f43cb1feabe7ee9e017a0d6af22d25369a33247cec6e9f2d1a5eb851412.json create mode 100644 backend/.sqlx/query-d113bc301f2f094c3a2a4c6ed385da65edde2fbfee0fac5103ba7bd18c64563d.json create mode 100644 backend/.sqlx/query-d1dcc7fc8a1e1bc4dad263ec5163a94fca9dd95cc3b26b33611eab9d2a261141.json create mode 100644 backend/.sqlx/query-d4eb7aea60894b65498144b9bf522beba612f36368d62fe4e94b5b9e26349d32.json create mode 100644 backend/.sqlx/query-d78ecf85c1e1e95650c380c9488aa90d8d8c5c76f3971484e4c515ff60293d3b.json create mode 100644 backend/.sqlx/query-d8ea17fba0e417333e9c6cf82ad36a57830a791c8358e30e9be012b815f5e8e3.json create mode 100644 backend/.sqlx/query-d9a6f75e4c4a1f61e55b313cc09bceffac637548841897341672da427a9140fc.json create mode 100644 backend/.sqlx/query-dc649111c4c862c36c26ad8a9eff8c31c2533a4a73184d0276f9a388ff2fa574.json create mode 100644 backend/.sqlx/query-dcf03ff4b922b93be37d2be5da6884ae3e8c6cf7eaa2d9c62056366eb42f2276.json create mode 100644 backend/.sqlx/query-dea056c89313f4facd62cbbc9fa33ba30fa85efcc83fafe4dd7b4e535b96a8d8.json create mode 100644 backend/.sqlx/query-df2a426658f0a36683cc2163fe70912d0221d191b8ab091601cb53cdd932ad58.json create mode 100644 backend/.sqlx/query-e37ba13aa3174931f0bfcff26dbc141fe8a346ab6a1a3bc924794bfe3c9af306.json create mode 100644 backend/.sqlx/query-e38a66d15382703b99054a9b609af9f3854bb65393d33b265476c0e68aec4f61.json create mode 100644 backend/.sqlx/query-e822d186203fe809b764007ad7c02870a3b7d93ae43b40ac2cd3181dffab0837.json create mode 100644 backend/.sqlx/query-eb932b613a6dbb2cdff97e5512d42b538ba83115c0ea798be00b01659600f45a.json create mode 100644 backend/.sqlx/query-ebbe03cad470d0c6ae98964f630315ff25dad08e4cb714718505b77a75d44b95.json create mode 100644 backend/.sqlx/query-eda1e5d1109a13feb14be254eaca630be29176bd5d1246c974642d40201782fc.json create mode 100644 backend/.sqlx/query-f16b00bad2880f896f4452e5894fe101cd5c2fe3e4c143c0b979668143d85dd2.json create mode 100644 backend/.sqlx/query-f22964772dc2d67aee437bbbd08b64792c00da1d713d7ca8f9904ccce7bfdae7.json create mode 100644 backend/.sqlx/query-f74589aaa72d0eb9f44157cc60eb121e63a7f31ed849834bb8ac9e8c726e81f1.json create mode 100644 backend/.sqlx/query-f955a01779f5441efc6aa9364b24c79b3cbc6413046c3b6099d19f675d8a395b.json create mode 100644 backend/.sqlx/query-fab5a746a179eea356f0bb9005590e3bb89c4deff181827bd2fa5630c21e42a7.json create mode 100644 backend/.sqlx/query-fb581eb6f883ebb5909a00c65a6e1217f088290fce0e052171230bcd88f945b9.json create mode 100644 backend/.sqlx/query-fbe14569717b4c4937b74e6dc6f6b4ea29a2b0c2b1cde48ef06d687f6f9e8f15.json create mode 100644 backend/.sqlx/query-fc8fa909ef7a15c7ad30dd938be3c13864e855219c7f366c86f0605ec25d1538.json create mode 100644 backend/.sqlx/query-fd0a0ca4a107dc813240ad71f372ab7e0bf26431158fbfb5f0023ed847ca7dc5.json create mode 100644 backend/.sqlx/query-ffb6b2a40b605f9c55826a0e519af80b100d2ffa58ec567223e27099d364fcc8.json diff --git a/backend/.sqlx/query-005b9255699e73600c579f74b529caf531b2312b6e405b4d35efd2f7ca663143.json b/backend/.sqlx/query-005b9255699e73600c579f74b529caf531b2312b6e405b4d35efd2f7ca663143.json new file mode 100644 index 0000000000..a2133ab230 --- /dev/null +++ b/backend/.sqlx/query-005b9255699e73600c579f74b529caf531b2312b6e405b4d35efd2f7ca663143.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT email FROM password WHERE email = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "email", + "type_info": "Varchar" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + false + ] + }, + "hash": "005b9255699e73600c579f74b529caf531b2312b6e405b4d35efd2f7ca663143" +} diff --git a/backend/.sqlx/query-050fb876e10ad13654dbbde4532f408ff1ac92ed0f5d31a3ef6c58313e1f8671.json b/backend/.sqlx/query-050fb876e10ad13654dbbde4532f408ff1ac92ed0f5d31a3ef6c58313e1f8671.json new file mode 100644 index 0000000000..9b50ef2c69 --- /dev/null +++ b/backend/.sqlx/query-050fb876e10ad13654dbbde4532f408ff1ac92ed0f5d31a3ef6c58313e1f8671.json @@ -0,0 +1,28 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT healthy, created_at FROM healthchecks WHERE check_type = 'min_alive_workers_' || $1 ORDER BY created_at DESC LIMIT 1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "healthy", + "type_info": "Bool" + }, + { + "ordinal": 1, + "name": "created_at", + "type_info": "Timestamptz" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + false, + false + ] + }, + "hash": "050fb876e10ad13654dbbde4532f408ff1ac92ed0f5d31a3ef6c58313e1f8671" +} diff --git a/backend/.sqlx/query-070b8ad0b59f485fa5bf68082b060f5c3561c37e9c6f2834d234a862a475a6eb.json b/backend/.sqlx/query-070b8ad0b59f485fa5bf68082b060f5c3561c37e9c6f2834d234a862a475a6eb.json new file mode 100644 index 0000000000..280db517dd --- /dev/null +++ b/backend/.sqlx/query-070b8ad0b59f485fa5bf68082b060f5c3561c37e9c6f2834d234a862a475a6eb.json @@ -0,0 +1,26 @@ +{ + "db_name": "PostgreSQL", + "query": "\n UPDATE \n gcp_trigger \n SET \n enabled = $1, \n email = $2, \n edited_by = $3, \n edited_at = now(), \n server_id = NULL, \n error = NULL\n WHERE \n path = $4 AND \n workspace_id = $5 \n RETURNING 1\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "?column?", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Bool", + "Varchar", + "Varchar", + "Text", + "Text" + ] + }, + "nullable": [ + null + ] + }, + "hash": "070b8ad0b59f485fa5bf68082b060f5c3561c37e9c6f2834d234a862a475a6eb" +} diff --git a/backend/.sqlx/query-08dd2ea6b17a52bce352d6443d7d009cfc9da0d3b2bd1f40d422b550779e5324.json b/backend/.sqlx/query-08dd2ea6b17a52bce352d6443d7d009cfc9da0d3b2bd1f40d422b550779e5324.json new file mode 100644 index 0000000000..b56784fd64 --- /dev/null +++ b/backend/.sqlx/query-08dd2ea6b17a52bce352d6443d7d009cfc9da0d3b2bd1f40d422b550779e5324.json @@ -0,0 +1,20 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO variable\n (workspace_id, path, value, is_secret, account, is_oauth, expires_at)\n VALUES ($1, $2, $3, $4, $5, $6, $7)\n ON CONFLICT (workspace_id, path) DO UPDATE SET value = $3, expires_at = $7", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Varchar", + "Varchar", + "Bool", + "Int4", + "Bool", + "Timestamptz" + ] + }, + "nullable": [] + }, + "hash": "08dd2ea6b17a52bce352d6443d7d009cfc9da0d3b2bd1f40d422b550779e5324" +} diff --git a/backend/.sqlx/query-08e4a2dc49c75aa356f3cc75a4abd8fc61409776d641ddb592a4c731e61a0468.json b/backend/.sqlx/query-08e4a2dc49c75aa356f3cc75a4abd8fc61409776d641ddb592a4c731e61a0468.json new file mode 100644 index 0000000000..9da12fd0b8 --- /dev/null +++ b/backend/.sqlx/query-08e4a2dc49c75aa356f3cc75a4abd8fc61409776d641ddb592a4c731e61a0468.json @@ -0,0 +1,26 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT login_type, COUNT(*) FROM password GROUP BY login_type", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "login_type", + "type_info": "Varchar" + }, + { + "ordinal": 1, + "name": "count", + "type_info": "Int8" + } + ], + "parameters": { + "Left": [] + }, + "nullable": [ + false, + null + ] + }, + "hash": "08e4a2dc49c75aa356f3cc75a4abd8fc61409776d641ddb592a4c731e61a0468" +} diff --git a/backend/.sqlx/query-08f288d2781d823e109a9e5b8848234ca7d1efeee9661f3901f298da375e73f7.json b/backend/.sqlx/query-08f288d2781d823e109a9e5b8848234ca7d1efeee9661f3901f298da375e73f7.json new file mode 100644 index 0000000000..388fd55418 --- /dev/null +++ b/backend/.sqlx/query-08f288d2781d823e109a9e5b8848234ca7d1efeee9661f3901f298da375e73f7.json @@ -0,0 +1,184 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT * FROM workspace_settings WHERE teams_team_id = $1 AND teams_command_script IS NOT NULL", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "workspace_id", + "type_info": "Varchar" + }, + { + "ordinal": 1, + "name": "slack_team_id", + "type_info": "Varchar" + }, + { + "ordinal": 2, + "name": "slack_name", + "type_info": "Varchar" + }, + { + "ordinal": 3, + "name": "slack_command_script", + "type_info": "Varchar" + }, + { + "ordinal": 4, + "name": "slack_email", + "type_info": "Varchar" + }, + { + "ordinal": 5, + "name": "auto_invite_domain", + "type_info": "Varchar" + }, + { + "ordinal": 6, + "name": "auto_invite_operator", + "type_info": "Bool" + }, + { + "ordinal": 7, + "name": "customer_id", + "type_info": "Varchar" + }, + { + "ordinal": 8, + "name": "plan", + "type_info": "Varchar" + }, + { + "ordinal": 9, + "name": "webhook", + "type_info": "Text" + }, + { + "ordinal": 10, + "name": "deploy_to", + "type_info": "Varchar" + }, + { + "ordinal": 11, + "name": "error_handler", + "type_info": "Varchar" + }, + { + "ordinal": 12, + "name": "ai_config", + "type_info": "Jsonb" + }, + { + "ordinal": 13, + "name": "error_handler_extra_args", + "type_info": "Json" + }, + { + "ordinal": 14, + "name": "error_handler_muted_on_cancel", + "type_info": "Bool" + }, + { + "ordinal": 15, + "name": "large_file_storage", + "type_info": "Jsonb" + }, + { + "ordinal": 16, + "name": "git_sync", + "type_info": "Jsonb" + }, + { + "ordinal": 17, + "name": "default_app", + "type_info": "Varchar" + }, + { + "ordinal": 18, + "name": "auto_add", + "type_info": "Bool" + }, + { + "ordinal": 19, + "name": "default_scripts", + "type_info": "Jsonb" + }, + { + "ordinal": 20, + "name": "deploy_ui", + "type_info": "Jsonb" + }, + { + "ordinal": 21, + "name": "mute_critical_alerts", + "type_info": "Bool" + }, + { + "ordinal": 22, + "name": "color", + "type_info": "Varchar" + }, + { + "ordinal": 23, + "name": "operator_settings", + "type_info": "Jsonb" + }, + { + "ordinal": 24, + "name": "teams_command_script", + "type_info": "Text" + }, + { + "ordinal": 25, + "name": "teams_team_id", + "type_info": "Text" + }, + { + "ordinal": 26, + "name": "teams_team_name", + "type_info": "Text" + }, + { + "ordinal": 27, + "name": "git_app_installations", + "type_info": "Jsonb" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + false, + true, + true, + true, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false + ] + }, + "hash": "08f288d2781d823e109a9e5b8848234ca7d1efeee9661f3901f298da375e73f7" +} diff --git a/backend/.sqlx/query-09e2a19435068f9e9bfd5bcb44b4e283c71729f81550f6f7156ce4970345cc07.json b/backend/.sqlx/query-09e2a19435068f9e9bfd5bcb44b4e283c71729f81550f6f7156ce4970345cc07.json new file mode 100644 index 0000000000..8ece28ff8f --- /dev/null +++ b/backend/.sqlx/query-09e2a19435068f9e9bfd5bcb44b4e283c71729f81550f6f7156ce4970345cc07.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE account SET refresh_error = $1 WHERE workspace_id = $2 AND id = $3", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Text", + "Int4" + ] + }, + "nullable": [] + }, + "hash": "09e2a19435068f9e9bfd5bcb44b4e283c71729f81550f6f7156ce4970345cc07" +} diff --git a/backend/.sqlx/query-0c2e53960dc7786c848079b155e62994d4a861f1dbb9752c0a27428d83040e13.json b/backend/.sqlx/query-0c2e53960dc7786c848079b155e62994d4a861f1dbb9752c0a27428d83040e13.json new file mode 100644 index 0000000000..5c33539878 --- /dev/null +++ b/backend/.sqlx/query-0c2e53960dc7786c848079b155e62994d4a861f1dbb9752c0a27428d83040e13.json @@ -0,0 +1,28 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT value, is_secret FROM variable WHERE path = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "value", + "type_info": "Varchar" + }, + { + "ordinal": 1, + "name": "is_secret", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + false, + false + ] + }, + "hash": "0c2e53960dc7786c848079b155e62994d4a861f1dbb9752c0a27428d83040e13" +} diff --git a/backend/.sqlx/query-0c9ad812013ff476a79ca8d6bb8b7a73d9492e07680732af9af09e223ade1f37.json b/backend/.sqlx/query-0c9ad812013ff476a79ca8d6bb8b7a73d9492e07680732af9af09e223ade1f37.json new file mode 100644 index 0000000000..dd536593e3 --- /dev/null +++ b/backend/.sqlx/query-0c9ad812013ff476a79ca8d6bb8b7a73d9492e07680732af9af09e223ade1f37.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE workspace_settings SET auto_invite_domain = NULL, auto_invite_operator = NULL, auto_add = NULL WHERE workspace_id = $1", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [] + }, + "hash": "0c9ad812013ff476a79ca8d6bb8b7a73d9492e07680732af9af09e223ade1f37" +} diff --git a/backend/.sqlx/query-0cb84cbb9083d967cc8be1cccab5be61080c1003eef51eea41862b25c2b93de6.json b/backend/.sqlx/query-0cb84cbb9083d967cc8be1cccab5be61080c1003eef51eea41862b25c2b93de6.json new file mode 100644 index 0000000000..35e2731f9a --- /dev/null +++ b/backend/.sqlx/query-0cb84cbb9083d967cc8be1cccab5be61080c1003eef51eea41862b25c2b93de6.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO metrics (id, value) VALUES ('telemetry', $1)", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Jsonb" + ] + }, + "nullable": [] + }, + "hash": "0cb84cbb9083d967cc8be1cccab5be61080c1003eef51eea41862b25c2b93de6" +} diff --git a/backend/.sqlx/query-0dd3fe3ddf9cb72760687d2ee0950afdcce2d54721bfe8dba008b15e4b581956.json b/backend/.sqlx/query-0dd3fe3ddf9cb72760687d2ee0950afdcce2d54721bfe8dba008b15e4b581956.json new file mode 100644 index 0000000000..af10226fa6 --- /dev/null +++ b/backend/.sqlx/query-0dd3fe3ddf9cb72760687d2ee0950afdcce2d54721bfe8dba008b15e4b581956.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "DELETE FROM account WHERE id = $1 AND workspace_id = $2", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4", + "Text" + ] + }, + "nullable": [] + }, + "hash": "0dd3fe3ddf9cb72760687d2ee0950afdcce2d54721bfe8dba008b15e4b581956" +} diff --git a/backend/.sqlx/query-0ee14619dd81df460b2b8cc6df2b89646279f77469c35deffca8e17a11d7f6c8.json b/backend/.sqlx/query-0ee14619dd81df460b2b8cc6df2b89646279f77469c35deffca8e17a11d7f6c8.json new file mode 100644 index 0000000000..ac882aec64 --- /dev/null +++ b/backend/.sqlx/query-0ee14619dd81df460b2b8cc6df2b89646279f77469c35deffca8e17a11d7f6c8.json @@ -0,0 +1,28 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT\n (elem->>'installation_id')::bigint as installation_id,\n elem->>'account_id' as account_id\n FROM workspace_settings,\n LATERAL jsonb_array_elements(git_app_installations) AS elem\n WHERE workspace_id = $1\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "installation_id", + "type_info": "Int8" + }, + { + "ordinal": 1, + "name": "account_id", + "type_info": "Text" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + null, + null + ] + }, + "hash": "0ee14619dd81df460b2b8cc6df2b89646279f77469c35deffca8e17a11d7f6c8" +} diff --git a/backend/.sqlx/query-0ef37117c369f03236e18f9dbb1f3d52776c8cb73f2507199c6ca16d4d2405ba.json b/backend/.sqlx/query-0ef37117c369f03236e18f9dbb1f3d52776c8cb73f2507199c6ca16d4d2405ba.json new file mode 100644 index 0000000000..1394ed76a4 --- /dev/null +++ b/backend/.sqlx/query-0ef37117c369f03236e18f9dbb1f3d52776c8cb73f2507199c6ca16d4d2405ba.json @@ -0,0 +1,23 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT email FROM password WHERE ($2::text = '*' OR email LIKE CONCAT('%', $2::text)) AND NOT EXISTS (\n SELECT 1 FROM usr WHERE workspace_id = $1::text AND email = password.email\n )", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "email", + "type_info": "Varchar" + } + ], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [ + false + ] + }, + "hash": "0ef37117c369f03236e18f9dbb1f3d52776c8cb73f2507199c6ca16d4d2405ba" +} diff --git a/backend/.sqlx/query-1312b7fd622cc814a406c85dbbff61f003c29185c267642cfd898075ebda855d.json b/backend/.sqlx/query-1312b7fd622cc814a406c85dbbff61f003c29185c267642cfd898075ebda855d.json new file mode 100644 index 0000000000..582896cc65 --- /dev/null +++ b/backend/.sqlx/query-1312b7fd622cc814a406c85dbbff61f003c29185c267642cfd898075ebda855d.json @@ -0,0 +1,145 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT\n gcp_resource_path,\n subscription_id,\n topic_id,\n workspace_id,\n delivery_type AS \"delivery_type: _\",\n delivery_config AS \"delivery_config: _\",\n subscription_mode AS \"subscription_mode: _\",\n path,\n script_path,\n is_flow,\n edited_by,\n email,\n edited_at,\n server_id,\n last_server_ping,\n extra_perms,\n error,\n enabled\n FROM \n gcp_trigger\n WHERE \n workspace_id = $1 AND \n path = $2\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "gcp_resource_path", + "type_info": "Varchar" + }, + { + "ordinal": 1, + "name": "subscription_id", + "type_info": "Varchar" + }, + { + "ordinal": 2, + "name": "topic_id", + "type_info": "Varchar" + }, + { + "ordinal": 3, + "name": "workspace_id", + "type_info": "Varchar" + }, + { + "ordinal": 4, + "name": "delivery_type: _", + "type_info": { + "Custom": { + "name": "delivery_mode", + "kind": { + "Enum": [ + "push", + "pull" + ] + } + } + } + }, + { + "ordinal": 5, + "name": "delivery_config: _", + "type_info": "Jsonb" + }, + { + "ordinal": 6, + "name": "subscription_mode: _", + "type_info": { + "Custom": { + "name": "gcp_subscription_mode", + "kind": { + "Enum": [ + "create_update", + "existing" + ] + } + } + } + }, + { + "ordinal": 7, + "name": "path", + "type_info": "Varchar" + }, + { + "ordinal": 8, + "name": "script_path", + "type_info": "Varchar" + }, + { + "ordinal": 9, + "name": "is_flow", + "type_info": "Bool" + }, + { + "ordinal": 10, + "name": "edited_by", + "type_info": "Varchar" + }, + { + "ordinal": 11, + "name": "email", + "type_info": "Varchar" + }, + { + "ordinal": 12, + "name": "edited_at", + "type_info": "Timestamptz" + }, + { + "ordinal": 13, + "name": "server_id", + "type_info": "Varchar" + }, + { + "ordinal": 14, + "name": "last_server_ping", + "type_info": "Timestamptz" + }, + { + "ordinal": 15, + "name": "extra_perms", + "type_info": "Jsonb" + }, + { + "ordinal": 16, + "name": "error", + "type_info": "Text" + }, + { + "ordinal": 17, + "name": "enabled", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [ + false, + false, + false, + false, + false, + true, + false, + false, + false, + false, + false, + false, + false, + true, + true, + false, + true, + false + ] + }, + "hash": "1312b7fd622cc814a406c85dbbff61f003c29185c267642cfd898075ebda855d" +} diff --git a/backend/.sqlx/query-134fe14dd47e80a9ef9b245a59e74b9a1035ec21176468f147998ac89fbed465.json b/backend/.sqlx/query-134fe14dd47e80a9ef9b245a59e74b9a1035ec21176468f147998ac89fbed465.json new file mode 100644 index 0000000000..c8aa02d387 --- /dev/null +++ b/backend/.sqlx/query-134fe14dd47e80a9ef9b245a59e74b9a1035ec21176468f147998ac89fbed465.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE global_settings SET value = $1 WHERE name = 'indexer_settings'", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Jsonb" + ] + }, + "nullable": [] + }, + "hash": "134fe14dd47e80a9ef9b245a59e74b9a1035ec21176468f147998ac89fbed465" +} diff --git a/backend/.sqlx/query-14abf759dae7ba5c38017ba6001927c6df0653a02b87bcea939066e39ebcf24d.json b/backend/.sqlx/query-14abf759dae7ba5c38017ba6001927c6df0653a02b87bcea939066e39ebcf24d.json new file mode 100644 index 0000000000..29aaf47e88 --- /dev/null +++ b/backend/.sqlx/query-14abf759dae7ba5c38017ba6001927c6df0653a02b87bcea939066e39ebcf24d.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO concurrency_locks (id, last_locked_at, owner)\n VALUES ($1, now(), $2)\n ON CONFLICT (id)\n DO UPDATE SET\n last_locked_at = now(),\n owner = $2", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Varchar" + ] + }, + "nullable": [] + }, + "hash": "14abf759dae7ba5c38017ba6001927c6df0653a02b87bcea939066e39ebcf24d" +} diff --git a/backend/.sqlx/query-1625a84fbcf8c5f77eb0519f60d9418f85d4d3d599f4177403fad5ad99380715.json b/backend/.sqlx/query-1625a84fbcf8c5f77eb0519f60d9418f85d4d3d599f4177403fad5ad99380715.json new file mode 100644 index 0000000000..f0ee89dbc9 --- /dev/null +++ b/backend/.sqlx/query-1625a84fbcf8c5f77eb0519f60d9418f85d4d3d599f4177403fad5ad99380715.json @@ -0,0 +1,26 @@ +{ + "db_name": "PostgreSQL", + "query": "\n UPDATE \n sqs_trigger \n SET \n enabled = $1, \n email = $2, \n edited_by = $3, \n edited_at = now(), \n server_id = NULL, \n error = NULL\n WHERE \n path = $4 AND \n workspace_id = $5 \n RETURNING 1\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "?column?", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Bool", + "Varchar", + "Varchar", + "Text", + "Text" + ] + }, + "nullable": [ + null + ] + }, + "hash": "1625a84fbcf8c5f77eb0519f60d9418f85d4d3d599f4177403fad5ad99380715" +} diff --git a/backend/.sqlx/query-19bc874a06658b549e13cfa080ac2133190ba448d6f7830c8f1f7c22e4d753b8.json b/backend/.sqlx/query-19bc874a06658b549e13cfa080ac2133190ba448d6f7830c8f1f7c22e4d753b8.json new file mode 100644 index 0000000000..1fadd917d4 --- /dev/null +++ b/backend/.sqlx/query-19bc874a06658b549e13cfa080ac2133190ba448d6f7830c8f1f7c22e4d753b8.json @@ -0,0 +1,20 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT value FROM global_settings WHERE name = 'slack'", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "value", + "type_info": "Jsonb" + } + ], + "parameters": { + "Left": [] + }, + "nullable": [ + false + ] + }, + "hash": "19bc874a06658b549e13cfa080ac2133190ba448d6f7830c8f1f7c22e4d753b8" +} diff --git a/backend/.sqlx/query-1ace9bdcde90fd2261fd64344a2d9474b17887711128dbb2ef15d247d50686b0.json b/backend/.sqlx/query-1ace9bdcde90fd2261fd64344a2d9474b17887711128dbb2ef15d247d50686b0.json new file mode 100644 index 0000000000..9a8ef973a4 --- /dev/null +++ b/backend/.sqlx/query-1ace9bdcde90fd2261fd64344a2d9474b17887711128dbb2ef15d247d50686b0.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT teams_team_id FROM workspace_settings WHERE workspace_id = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "teams_team_id", + "type_info": "Text" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + true + ] + }, + "hash": "1ace9bdcde90fd2261fd64344a2d9474b17887711128dbb2ef15d247d50686b0" +} diff --git a/backend/.sqlx/query-1b33393fbbc7e681b4d355f6096d982b52b48c8c3da392b14963a1ec86811546.json b/backend/.sqlx/query-1b33393fbbc7e681b4d355f6096d982b52b48c8c3da392b14963a1ec86811546.json new file mode 100644 index 0000000000..271c60b480 --- /dev/null +++ b/backend/.sqlx/query-1b33393fbbc7e681b4d355f6096d982b52b48c8c3da392b14963a1ec86811546.json @@ -0,0 +1,50 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT\n path,\n is_flow,\n workspace_id,\n owner,\n email,\n trigger_config as \"trigger_config!: _\"\n FROM\n capture_config\n WHERE\n trigger_kind = 'sqs' AND\n last_client_ping > NOW() - INTERVAL '10 seconds' AND\n trigger_config IS NOT NULL AND\n (last_server_ping IS NULL OR last_server_ping < now() - interval '15 seconds')\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "path", + "type_info": "Varchar" + }, + { + "ordinal": 1, + "name": "is_flow", + "type_info": "Bool" + }, + { + "ordinal": 2, + "name": "workspace_id", + "type_info": "Varchar" + }, + { + "ordinal": 3, + "name": "owner", + "type_info": "Varchar" + }, + { + "ordinal": 4, + "name": "email", + "type_info": "Varchar" + }, + { + "ordinal": 5, + "name": "trigger_config!: _", + "type_info": "Jsonb" + } + ], + "parameters": { + "Left": [] + }, + "nullable": [ + false, + false, + false, + false, + false, + true + ] + }, + "hash": "1b33393fbbc7e681b4d355f6096d982b52b48c8c3da392b14963a1ec86811546" +} diff --git a/backend/.sqlx/query-1c0f95a069891f7214505aaa9428e11e25c1d3a30294cbe78f01ed75edf68da4.json b/backend/.sqlx/query-1c0f95a069891f7214505aaa9428e11e25c1d3a30294cbe78f01ed75edf68da4.json new file mode 100644 index 0000000000..f00f41d16b --- /dev/null +++ b/backend/.sqlx/query-1c0f95a069891f7214505aaa9428e11e25c1d3a30294cbe78f01ed75edf68da4.json @@ -0,0 +1,23 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE kafka_trigger SET kafka_resource_path = $1, group_id = $2, topics = $3, script_path = $4, path = $5, is_flow = $6, edited_by = $7, email = $8, edited_at = now(), server_id = NULL, error = NULL\n WHERE workspace_id = $9 AND path = $10", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Varchar", + "VarcharArray", + "Varchar", + "Varchar", + "Bool", + "Varchar", + "Varchar", + "Text", + "Text" + ] + }, + "nullable": [] + }, + "hash": "1c0f95a069891f7214505aaa9428e11e25c1d3a30294cbe78f01ed75edf68da4" +} diff --git a/backend/.sqlx/query-1c37f91192aa4f535c7fff80fa809260b906dc988f44a0db60952a2bf8b1cdaf.json b/backend/.sqlx/query-1c37f91192aa4f535c7fff80fa809260b906dc988f44a0db60952a2bf8b1cdaf.json new file mode 100644 index 0000000000..946783d745 --- /dev/null +++ b/backend/.sqlx/query-1c37f91192aa4f535c7fff80fa809260b906dc988f44a0db60952a2bf8b1cdaf.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE kafka_trigger SET last_server_ping = NULL WHERE workspace_id = $1 AND path = $2 AND server_id IS NULL", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [] + }, + "hash": "1c37f91192aa4f535c7fff80fa809260b906dc988f44a0db60952a2bf8b1cdaf" +} diff --git a/backend/.sqlx/query-1cad25c24d0f80d58a50d4da923f8b0672797299545ee0754b6ad74ece92c77e.json b/backend/.sqlx/query-1cad25c24d0f80d58a50d4da923f8b0672797299545ee0754b6ad74ece92c77e.json new file mode 100644 index 0000000000..0729adc8ba --- /dev/null +++ b/backend/.sqlx/query-1cad25c24d0f80d58a50d4da923f8b0672797299545ee0754b6ad74ece92c77e.json @@ -0,0 +1,26 @@ +{ + "db_name": "PostgreSQL", + "query": "\n UPDATE \n capture_config \n SET \n last_server_ping = now(), \n error = $1 \n WHERE \n workspace_id = $2 AND \n path = $3 AND \n is_flow = $4 AND \n trigger_kind = 'sqs' AND \n server_id = $5 AND \n last_client_ping > NOW() - INTERVAL '10 seconds' \n RETURNING 1\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "?column?", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Text", + "Text", + "Text", + "Bool", + "Text" + ] + }, + "nullable": [ + null + ] + }, + "hash": "1cad25c24d0f80d58a50d4da923f8b0672797299545ee0754b6ad74ece92c77e" +} diff --git a/backend/.sqlx/query-1f5f0858909eb5bac63c4e3b1add95226bd94ca3facb92a620ffa59dacad6705.json b/backend/.sqlx/query-1f5f0858909eb5bac63c4e3b1add95226bd94ca3facb92a620ffa59dacad6705.json new file mode 100644 index 0000000000..0adff2fe2c --- /dev/null +++ b/backend/.sqlx/query-1f5f0858909eb5bac63c4e3b1add95226bd94ca3facb92a620ffa59dacad6705.json @@ -0,0 +1,28 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO autoscaling_event (worker_group, event_type, desired_workers, reason) VALUES ($1, $2, $3, $4)", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + { + "Custom": { + "name": "autoscaling_event_type", + "kind": { + "Enum": [ + "full_scaleout", + "scalein", + "scaleout" + ] + } + } + }, + "Int4", + "Text" + ] + }, + "nullable": [] + }, + "hash": "1f5f0858909eb5bac63c4e3b1add95226bd94ca3facb92a620ffa59dacad6705" +} diff --git a/backend/.sqlx/query-203fa78d423ec5a8c5ff6166aed591b28cbf9ea8f61d379b84ee6e14c033035d.json b/backend/.sqlx/query-203fa78d423ec5a8c5ff6166aed591b28cbf9ea8f61d379b84ee6e14c033035d.json new file mode 100644 index 0000000000..65b1b24efb --- /dev/null +++ b/backend/.sqlx/query-203fa78d423ec5a8c5ff6166aed591b28cbf9ea8f61d379b84ee6e14c033035d.json @@ -0,0 +1,17 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE capture_config SET error = $1, server_id = NULL, last_server_ping = NULL WHERE workspace_id = $2 AND path = $3 AND is_flow = $4 AND trigger_kind = 'kafka'", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Text", + "Text", + "Bool" + ] + }, + "nullable": [] + }, + "hash": "203fa78d423ec5a8c5ff6166aed591b28cbf9ea8f61d379b84ee6e14c033035d" +} diff --git a/backend/.sqlx/query-2041526bc58872d71f91f7698144039bd67f8e37895befa94a15b7e4019e114b.json b/backend/.sqlx/query-2041526bc58872d71f91f7698144039bd67f8e37895befa94a15b7e4019e114b.json new file mode 100644 index 0000000000..cbe5ec7607 --- /dev/null +++ b/backend/.sqlx/query-2041526bc58872d71f91f7698144039bd67f8e37895befa94a15b7e4019e114b.json @@ -0,0 +1,12 @@ +{ + "db_name": "PostgreSQL", + "query": "DELETE FROM healthchecks WHERE healthy = true AND created_at < NOW() - INTERVAL '14 days'", + "describe": { + "columns": [], + "parameters": { + "Left": [] + }, + "nullable": [] + }, + "hash": "2041526bc58872d71f91f7698144039bd67f8e37895befa94a15b7e4019e114b" +} diff --git a/backend/.sqlx/query-20e01ecb5d4aa4c532a8f906365c776994ae2c990bb7bb307c52296b9543fbb8.json b/backend/.sqlx/query-20e01ecb5d4aa4c532a8f906365c776994ae2c990bb7bb307c52296b9543fbb8.json new file mode 100644 index 0000000000..c9f7733011 --- /dev/null +++ b/backend/.sqlx/query-20e01ecb5d4aa4c532a8f906365c776994ae2c990bb7bb307c52296b9543fbb8.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE \n capture_config \n SET \n last_server_ping = NULL \n WHERE \n workspace_id = $1 AND \n path = $2 AND \n is_flow = $3 AND \n trigger_kind = 'sqs' AND \n server_id IS NULL\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Text", + "Bool" + ] + }, + "nullable": [] + }, + "hash": "20e01ecb5d4aa4c532a8f906365c776994ae2c990bb7bb307c52296b9543fbb8" +} diff --git a/backend/.sqlx/query-20fcdcd2674a52ee9bd8d1de518d6bce075f20bcd5d2328f183d8a59331f6bb1.json b/backend/.sqlx/query-20fcdcd2674a52ee9bd8d1de518d6bce075f20bcd5d2328f183d8a59331f6bb1.json new file mode 100644 index 0000000000..824335990f --- /dev/null +++ b/backend/.sqlx/query-20fcdcd2674a52ee9bd8d1de518d6bce075f20bcd5d2328f183d8a59331f6bb1.json @@ -0,0 +1,18 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO resource\n (workspace_id, path, value, resource_type, created_by, edited_at)\n VALUES ($1, $2, $3, $4, $5, now()) ON CONFLICT (workspace_id, path) DO UPDATE SET value = $3, edited_at = now()", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Varchar", + "Jsonb", + "Varchar", + "Varchar" + ] + }, + "nullable": [] + }, + "hash": "20fcdcd2674a52ee9bd8d1de518d6bce075f20bcd5d2328f183d8a59331f6bb1" +} diff --git a/backend/.sqlx/query-22dcd953d900fb0ddbe2099ccee27bcf833f56475bbc1aa3c8f6d79f146f41bf.json b/backend/.sqlx/query-22dcd953d900fb0ddbe2099ccee27bcf833f56475bbc1aa3c8f6d79f146f41bf.json new file mode 100644 index 0000000000..f94ca24f0f --- /dev/null +++ b/backend/.sqlx/query-22dcd953d900fb0ddbe2099ccee27bcf833f56475bbc1aa3c8f6d79f146f41bf.json @@ -0,0 +1,25 @@ +{ + "db_name": "PostgreSQL", + "query": "\n UPDATE \n sqs_trigger\n SET \n last_server_ping = now(),\n error = $1\n WHERE\n workspace_id = $2\n AND path = $3\n AND server_id = $4 \n AND enabled IS TRUE\n RETURNING 1\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "?column?", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Text", + "Text", + "Text", + "Text" + ] + }, + "nullable": [ + null + ] + }, + "hash": "22dcd953d900fb0ddbe2099ccee27bcf833f56475bbc1aa3c8f6d79f146f41bf" +} diff --git a/backend/.sqlx/query-22ff7c00b2d3e93ea9e147fc9a5bac1d55858f89039ae5baecdc9ceca668adab.json b/backend/.sqlx/query-22ff7c00b2d3e93ea9e147fc9a5bac1d55858f89039ae5baecdc9ceca668adab.json new file mode 100644 index 0000000000..c1c3292d9a --- /dev/null +++ b/backend/.sqlx/query-22ff7c00b2d3e93ea9e147fc9a5bac1d55858f89039ae5baecdc9ceca668adab.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE email_to_igroup SET email = $1 WHERE email = $2", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Text" + ] + }, + "nullable": [] + }, + "hash": "22ff7c00b2d3e93ea9e147fc9a5bac1d55858f89039ae5baecdc9ceca668adab" +} diff --git a/backend/.sqlx/query-23c37d36e16251763fabf194e41de63612a7506cc0671b0eb83e528c1c839db4.json b/backend/.sqlx/query-23c37d36e16251763fabf194e41de63612a7506cc0671b0eb83e528c1c839db4.json new file mode 100644 index 0000000000..917540aec4 --- /dev/null +++ b/backend/.sqlx/query-23c37d36e16251763fabf194e41de63612a7506cc0671b0eb83e528c1c839db4.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE workspace_settings\n SET teams_team_id = null, teams_team_name = null WHERE workspace_id = $1", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [] + }, + "hash": "23c37d36e16251763fabf194e41de63612a7506cc0671b0eb83e528c1c839db4" +} diff --git a/backend/.sqlx/query-266741894b9a6ed650cf999b6e5b7c797424f8291517d3abf096fe45548a0273.json b/backend/.sqlx/query-266741894b9a6ed650cf999b6e5b7c797424f8291517d3abf096fe45548a0273.json new file mode 100644 index 0000000000..41879871e1 --- /dev/null +++ b/backend/.sqlx/query-266741894b9a6ed650cf999b6e5b7c797424f8291517d3abf096fe45548a0273.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT git_sync FROM workspace_settings WHERE workspace_id = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "git_sync", + "type_info": "Jsonb" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + true + ] + }, + "hash": "266741894b9a6ed650cf999b6e5b7c797424f8291517d3abf096fe45548a0273" +} diff --git a/backend/.sqlx/query-27920aaa55666ffc14a36a247f89ff7994ee40d3953b9f772d0e0ab999bccb7b.json b/backend/.sqlx/query-27920aaa55666ffc14a36a247f89ff7994ee40d3953b9f772d0e0ab999bccb7b.json new file mode 100644 index 0000000000..26a8ba2ee2 --- /dev/null +++ b/backend/.sqlx/query-27920aaa55666ffc14a36a247f89ff7994ee40d3953b9f772d0e0ab999bccb7b.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO healthchecks (check_type, healthy) VALUES ($1, false)", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar" + ] + }, + "nullable": [] + }, + "hash": "27920aaa55666ffc14a36a247f89ff7994ee40d3953b9f772d0e0ab999bccb7b" +} diff --git a/backend/.sqlx/query-299e16725162888c01712f371785199960264b54c1ddf928c0c654ab15176f63.json b/backend/.sqlx/query-299e16725162888c01712f371785199960264b54c1ddf928c0c654ab15176f63.json new file mode 100644 index 0000000000..d64d8f404b --- /dev/null +++ b/backend/.sqlx/query-299e16725162888c01712f371785199960264b54c1ddf928c0c654ab15176f63.json @@ -0,0 +1,25 @@ +{ + "db_name": "PostgreSQL", + "query": "\n UPDATE \n capture_config \n SET \n server_id = $1,\n last_server_ping = now(), \n error = 'Connecting...' \n WHERE \n last_client_ping > NOW() - INTERVAL '10 seconds' AND \n workspace_id = $2 AND \n path = $3 AND \n is_flow = $4 AND \n trigger_kind = 'gcp' AND \n (last_server_ping IS NULL OR last_server_ping < now() - interval '15 seconds') \n RETURNING true\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "?column?", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [ + "Varchar", + "Text", + "Text", + "Bool" + ] + }, + "nullable": [ + null + ] + }, + "hash": "299e16725162888c01712f371785199960264b54c1ddf928c0c654ab15176f63" +} diff --git a/backend/.sqlx/query-2ae44acae7ac80e191b37071baa26e57488489177fe596940d3698d843a93666.json b/backend/.sqlx/query-2ae44acae7ac80e191b37071baa26e57488489177fe596940d3698d843a93666.json new file mode 100644 index 0000000000..405902863c --- /dev/null +++ b/backend/.sqlx/query-2ae44acae7ac80e191b37071baa26e57488489177fe596940d3698d843a93666.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT script_path FROM v2_as_queue WHERE id = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "script_path", + "type_info": "Varchar" + } + ], + "parameters": { + "Left": [ + "Uuid" + ] + }, + "nullable": [ + true + ] + }, + "hash": "2ae44acae7ac80e191b37071baa26e57488489177fe596940d3698d843a93666" +} diff --git a/backend/.sqlx/query-2dcff8b16da75740c362015b2293f578a21813f038d75184a5034c37d4daf36e.json b/backend/.sqlx/query-2dcff8b16da75740c362015b2293f578a21813f038d75184a5034c37d4daf36e.json new file mode 100644 index 0000000000..5622b3691e --- /dev/null +++ b/backend/.sqlx/query-2dcff8b16da75740c362015b2293f578a21813f038d75184a5034c37d4daf36e.json @@ -0,0 +1,142 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT\n gcp_resource_path,\n subscription_id,\n topic_id,\n workspace_id,\n delivery_type AS \"delivery_type: _\",\n delivery_config AS \"delivery_config: _\",\n subscription_mode AS \"subscription_mode: _\",\n path,\n script_path,\n is_flow,\n edited_by,\n email,\n edited_at,\n server_id,\n last_server_ping,\n extra_perms,\n error,\n enabled\n FROM\n gcp_trigger\n WHERE\n delivery_type != 'push'::DELIVERY_MODE AND\n enabled IS TRUE\n AND (last_server_ping IS NULL OR\n last_server_ping < now() - interval '15 seconds'\n )\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "gcp_resource_path", + "type_info": "Varchar" + }, + { + "ordinal": 1, + "name": "subscription_id", + "type_info": "Varchar" + }, + { + "ordinal": 2, + "name": "topic_id", + "type_info": "Varchar" + }, + { + "ordinal": 3, + "name": "workspace_id", + "type_info": "Varchar" + }, + { + "ordinal": 4, + "name": "delivery_type: _", + "type_info": { + "Custom": { + "name": "delivery_mode", + "kind": { + "Enum": [ + "push", + "pull" + ] + } + } + } + }, + { + "ordinal": 5, + "name": "delivery_config: _", + "type_info": "Jsonb" + }, + { + "ordinal": 6, + "name": "subscription_mode: _", + "type_info": { + "Custom": { + "name": "gcp_subscription_mode", + "kind": { + "Enum": [ + "create_update", + "existing" + ] + } + } + } + }, + { + "ordinal": 7, + "name": "path", + "type_info": "Varchar" + }, + { + "ordinal": 8, + "name": "script_path", + "type_info": "Varchar" + }, + { + "ordinal": 9, + "name": "is_flow", + "type_info": "Bool" + }, + { + "ordinal": 10, + "name": "edited_by", + "type_info": "Varchar" + }, + { + "ordinal": 11, + "name": "email", + "type_info": "Varchar" + }, + { + "ordinal": 12, + "name": "edited_at", + "type_info": "Timestamptz" + }, + { + "ordinal": 13, + "name": "server_id", + "type_info": "Varchar" + }, + { + "ordinal": 14, + "name": "last_server_ping", + "type_info": "Timestamptz" + }, + { + "ordinal": 15, + "name": "extra_perms", + "type_info": "Jsonb" + }, + { + "ordinal": 16, + "name": "error", + "type_info": "Text" + }, + { + "ordinal": 17, + "name": "enabled", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [] + }, + "nullable": [ + false, + false, + false, + false, + false, + true, + false, + false, + false, + false, + false, + false, + false, + true, + true, + false, + true, + false + ] + }, + "hash": "2dcff8b16da75740c362015b2293f578a21813f038d75184a5034c37d4daf36e" +} diff --git a/backend/.sqlx/query-2e1d1c59bfc53d58962251822c85cf9a26e3b2888702e5e9d5fc1b082901df09.json b/backend/.sqlx/query-2e1d1c59bfc53d58962251822c85cf9a26e3b2888702e5e9d5fc1b082901df09.json new file mode 100644 index 0000000000..6bbccc1fae --- /dev/null +++ b/backend/.sqlx/query-2e1d1c59bfc53d58962251822c85cf9a26e3b2888702e5e9d5fc1b082901df09.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO workspace_invite\n (workspace_id, email, is_admin, operator)\n SELECT $1::text, email, false, $3 FROM password WHERE ($2::text = '*' OR email LIKE CONCAT('%', $2::text)) AND NOT EXISTS (\n SELECT 1 FROM usr WHERE workspace_id = $1::text AND email = password.email\n )\n ON CONFLICT DO NOTHING", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Text", + "Bool" + ] + }, + "nullable": [] + }, + "hash": "2e1d1c59bfc53d58962251822c85cf9a26e3b2888702e5e9d5fc1b082901df09" +} diff --git a/backend/.sqlx/query-33ee913ce263600a3f94f90e4a42cf0e4086030f3b7994e4892392765cbe1517.json b/backend/.sqlx/query-33ee913ce263600a3f94f90e4a42cf0e4086030f3b7994e4892392765cbe1517.json new file mode 100644 index 0000000000..9b7581526e --- /dev/null +++ b/backend/.sqlx/query-33ee913ce263600a3f94f90e4a42cf0e4086030f3b7994e4892392765cbe1517.json @@ -0,0 +1,23 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT EXISTS(\n SELECT \n 1 \n FROM \n gcp_trigger \n WHERE \n path = $1 AND \n workspace_id = $2\n )", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "exists", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [ + null + ] + }, + "hash": "33ee913ce263600a3f94f90e4a42cf0e4086030f3b7994e4892392765cbe1517" +} diff --git a/backend/.sqlx/query-34a45763bb4d14162f4cd3fa07cd8020f1f6085f4ee85f5eab3458637edf26cd.json b/backend/.sqlx/query-34a45763bb4d14162f4cd3fa07cd8020f1f6085f4ee85f5eab3458637edf26cd.json new file mode 100644 index 0000000000..f9dc00c28c --- /dev/null +++ b/backend/.sqlx/query-34a45763bb4d14162f4cd3fa07cd8020f1f6085f4ee85f5eab3458637edf26cd.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT created_at FROM healthchecks WHERE check_type = $1 ORDER BY created_at DESC LIMIT 1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "created_at", + "type_info": "Timestamptz" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + false + ] + }, + "hash": "34a45763bb4d14162f4cd3fa07cd8020f1f6085f4ee85f5eab3458637edf26cd" +} diff --git a/backend/.sqlx/query-354f88b23d20f92c6b6d5bdd8d6c69b08c6a86116cbfd0ecad8f112f7f49d8d1.json b/backend/.sqlx/query-354f88b23d20f92c6b6d5bdd8d6c69b08c6a86116cbfd0ecad8f112f7f49d8d1.json new file mode 100644 index 0000000000..4b03b16262 --- /dev/null +++ b/backend/.sqlx/query-354f88b23d20f92c6b6d5bdd8d6c69b08c6a86116cbfd0ecad8f112f7f49d8d1.json @@ -0,0 +1,26 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT SUBSTRING(name, 9) as \"name!\", (config.config->'min_alive_workers_alert_threshold')::INT as \"threshold!\" \n FROM config \n WHERE name LIKE 'worker__%' AND config->'min_alive_workers_alert_threshold' IS NOT NULL", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "name!", + "type_info": "Text" + }, + { + "ordinal": 1, + "name": "threshold!", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [] + }, + "nullable": [ + null, + null + ] + }, + "hash": "354f88b23d20f92c6b6d5bdd8d6c69b08c6a86116cbfd0ecad8f112f7f49d8d1" +} diff --git a/backend/.sqlx/query-388b3705f641621b0c2f4496e36cb7aa5a75b7e40fa312eff6590e54b02635a2.json b/backend/.sqlx/query-388b3705f641621b0c2f4496e36cb7aa5a75b7e40fa312eff6590e54b02635a2.json new file mode 100644 index 0000000000..48f8d1e10c --- /dev/null +++ b/backend/.sqlx/query-388b3705f641621b0c2f4496e36cb7aa5a75b7e40fa312eff6590e54b02635a2.json @@ -0,0 +1,20 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT EXISTS(SELECT 1 FROM metrics WHERE id = 'license_key_renewal' AND created_at > NOW() - INTERVAL '24 hours')", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "exists", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [] + }, + "nullable": [ + null + ] + }, + "hash": "388b3705f641621b0c2f4496e36cb7aa5a75b7e40fa312eff6590e54b02635a2" +} diff --git a/backend/.sqlx/query-38c20dba51b1e2b4b28e5eed51f9071e1d3cf78e89ec467927823177c5a439cc.json b/backend/.sqlx/query-38c20dba51b1e2b4b28e5eed51f9071e1d3cf78e89ec467927823177c5a439cc.json new file mode 100644 index 0000000000..66681c2377 --- /dev/null +++ b/backend/.sqlx/query-38c20dba51b1e2b4b28e5eed51f9071e1d3cf78e89ec467927823177c5a439cc.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT workspace_id FROM usr WHERE email = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "workspace_id", + "type_info": "Varchar" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + false + ] + }, + "hash": "38c20dba51b1e2b4b28e5eed51f9071e1d3cf78e89ec467927823177c5a439cc" +} diff --git a/backend/.sqlx/query-3997dcf2c11817e59bf50fd896381d870b847a8ba07e6197212fdf85ec901b09.json b/backend/.sqlx/query-3997dcf2c11817e59bf50fd896381d870b847a8ba07e6197212fdf85ec901b09.json new file mode 100644 index 0000000000..4c90c24dd6 --- /dev/null +++ b/backend/.sqlx/query-3997dcf2c11817e59bf50fd896381d870b847a8ba07e6197212fdf85ec901b09.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "DELETE FROM kafka_trigger WHERE workspace_id = $1 AND path = $2", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [] + }, + "hash": "3997dcf2c11817e59bf50fd896381d870b847a8ba07e6197212fdf85ec901b09" +} diff --git a/backend/.sqlx/query-3b02f3ec6b92706c26065b2fa703cd1a1d6eca4083286c6f29c9acba522d2fe3.json b/backend/.sqlx/query-3b02f3ec6b92706c26065b2fa703cd1a1d6eca4083286c6f29c9acba522d2fe3.json new file mode 100644 index 0000000000..7c35515d12 --- /dev/null +++ b/backend/.sqlx/query-3b02f3ec6b92706c26065b2fa703cd1a1d6eca4083286c6f29c9acba522d2fe3.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT EXISTS (SELECT 1\n FROM workspace_settings\n WHERE workspace_id <> $1\n AND teams_command_script IS NOT NULL\n AND teams_team_id IS NOT NULL\n AND teams_team_id = (SELECT teams_team_id FROM workspace_settings WHERE workspace_id = $1))\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "exists", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + null + ] + }, + "hash": "3b02f3ec6b92706c26065b2fa703cd1a1d6eca4083286c6f29c9acba522d2fe3" +} diff --git a/backend/.sqlx/query-3d8fdf7adf42b27808a5b223df3a660bfd5a8c0a451a0deac24632f0ccf66165.json b/backend/.sqlx/query-3d8fdf7adf42b27808a5b223df3a660bfd5a8c0a451a0deac24632f0ccf66165.json new file mode 100644 index 0000000000..c48927fdf2 --- /dev/null +++ b/backend/.sqlx/query-3d8fdf7adf42b27808a5b223df3a660bfd5a8c0a451a0deac24632f0ccf66165.json @@ -0,0 +1,26 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE nats_trigger SET enabled = $1, email = $2, edited_by = $3, edited_at = now(), server_id = NULL, error = NULL\n WHERE path = $4 AND workspace_id = $5 RETURNING 1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "?column?", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Bool", + "Varchar", + "Varchar", + "Text", + "Text" + ] + }, + "nullable": [ + null + ] + }, + "hash": "3d8fdf7adf42b27808a5b223df3a660bfd5a8c0a451a0deac24632f0ccf66165" +} diff --git a/backend/.sqlx/query-3e64c894c89ef82c4527180b82c4e82c1b7060ba0ca288dc6a7c7afcd76212e8.json b/backend/.sqlx/query-3e64c894c89ef82c4527180b82c4e82c1b7060ba0ca288dc6a7c7afcd76212e8.json new file mode 100644 index 0000000000..8831155670 --- /dev/null +++ b/backend/.sqlx/query-3e64c894c89ef82c4527180b82c4e82c1b7060ba0ca288dc6a7c7afcd76212e8.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE kafka_trigger SET enabled = FALSE, error = $1, server_id = NULL, last_server_ping = NULL WHERE workspace_id = $2 AND path = $3", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Text", + "Text" + ] + }, + "nullable": [] + }, + "hash": "3e64c894c89ef82c4527180b82c4e82c1b7060ba0ca288dc6a7c7afcd76212e8" +} diff --git a/backend/.sqlx/query-3f5520e0ea00569bf169da9abde31617043fcc0bea3ef62c50fcd881f3d48605.json b/backend/.sqlx/query-3f5520e0ea00569bf169da9abde31617043fcc0bea3ef62c50fcd881f3d48605.json new file mode 100644 index 0000000000..b225a5a1da --- /dev/null +++ b/backend/.sqlx/query-3f5520e0ea00569bf169da9abde31617043fcc0bea3ef62c50fcd881f3d48605.json @@ -0,0 +1,35 @@ +{ + "db_name": "PostgreSQL", + "query": "\n INSERT INTO gcp_trigger (\n gcp_resource_path,\n subscription_id,\n topic_id,\n delivery_type,\n delivery_config,\n workspace_id, \n path, \n script_path, \n is_flow, \n email, \n enabled, \n edited_by\n ) \n VALUES (\n $1, \n $2, \n $3, \n $4,\n $5,\n $6, \n $7, \n $8, \n $9,\n $10,\n $11,\n $12\n )", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Varchar", + "Varchar", + { + "Custom": { + "name": "delivery_mode", + "kind": { + "Enum": [ + "push", + "pull" + ] + } + } + }, + "Jsonb", + "Varchar", + "Varchar", + "Varchar", + "Bool", + "Varchar", + "Bool", + "Varchar" + ] + }, + "nullable": [] + }, + "hash": "3f5520e0ea00569bf169da9abde31617043fcc0bea3ef62c50fcd881f3d48605" +} diff --git a/backend/.sqlx/query-3f67e7cf8d9f021a075f1c88703287a9f42e252a1246a584249a224afdbbbf8a.json b/backend/.sqlx/query-3f67e7cf8d9f021a075f1c88703287a9f42e252a1246a584249a224afdbbbf8a.json new file mode 100644 index 0000000000..8dec90897c --- /dev/null +++ b/backend/.sqlx/query-3f67e7cf8d9f021a075f1c88703287a9f42e252a1246a584249a224afdbbbf8a.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "\n UPDATE \n sqs_trigger \n SET \n enabled = FALSE, \n error = $1, \n server_id = NULL, \n last_server_ping = NULL \n WHERE \n workspace_id = $2 AND \n path = $3\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Text", + "Text" + ] + }, + "nullable": [] + }, + "hash": "3f67e7cf8d9f021a075f1c88703287a9f42e252a1246a584249a224afdbbbf8a" +} diff --git a/backend/.sqlx/query-3fa3d1fa1add8e187fcbaf7351b721ad0f3e2888af207e8830ccf5e921c5fd60.json b/backend/.sqlx/query-3fa3d1fa1add8e187fcbaf7351b721ad0f3e2888af207e8830ccf5e921c5fd60.json new file mode 100644 index 0000000000..3bb4151982 --- /dev/null +++ b/backend/.sqlx/query-3fa3d1fa1add8e187fcbaf7351b721ad0f3e2888af207e8830ccf5e921c5fd60.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO concurrency_counter(concurrency_id, job_uuids) \n VALUES ($1, $2)\n ON CONFLICT (concurrency_id)\n DO UPDATE SET job_uuids = jsonb_set(concurrency_counter.job_uuids, array[$3], '{}')", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Jsonb", + "Text" + ] + }, + "nullable": [] + }, + "hash": "3fa3d1fa1add8e187fcbaf7351b721ad0f3e2888af207e8830ccf5e921c5fd60" +} diff --git a/backend/.sqlx/query-42030372693d8d6b8d03947bb6702024cfa226735eeeb720bbab46bd0e3cedcc.json b/backend/.sqlx/query-42030372693d8d6b8d03947bb6702024cfa226735eeeb720bbab46bd0e3cedcc.json new file mode 100644 index 0000000000..cef1da340c --- /dev/null +++ b/backend/.sqlx/query-42030372693d8d6b8d03947bb6702024cfa226735eeeb720bbab46bd0e3cedcc.json @@ -0,0 +1,50 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT path, is_flow, workspace_id, trigger_config as \"trigger_config!: _\", owner, email FROM capture_config WHERE trigger_kind = 'nats' AND last_client_ping > NOW() - INTERVAL '10 seconds' AND trigger_config IS NOT NULL AND (last_server_ping IS NULL OR last_server_ping < now() - interval '15 seconds')", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "path", + "type_info": "Varchar" + }, + { + "ordinal": 1, + "name": "is_flow", + "type_info": "Bool" + }, + { + "ordinal": 2, + "name": "workspace_id", + "type_info": "Varchar" + }, + { + "ordinal": 3, + "name": "trigger_config!: _", + "type_info": "Jsonb" + }, + { + "ordinal": 4, + "name": "owner", + "type_info": "Varchar" + }, + { + "ordinal": 5, + "name": "email", + "type_info": "Varchar" + } + ], + "parameters": { + "Left": [] + }, + "nullable": [ + false, + false, + false, + true, + false, + false + ] + }, + "hash": "42030372693d8d6b8d03947bb6702024cfa226735eeeb720bbab46bd0e3cedcc" +} diff --git a/backend/.sqlx/query-42df4b40b3bbf14010f07e29892776992bfeb383d590e379244ad23703e536a4.json b/backend/.sqlx/query-42df4b40b3bbf14010f07e29892776992bfeb383d590e379244ad23703e536a4.json new file mode 100644 index 0000000000..695b4d2969 --- /dev/null +++ b/backend/.sqlx/query-42df4b40b3bbf14010f07e29892776992bfeb383d590e379244ad23703e536a4.json @@ -0,0 +1,19 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO resource\n (workspace_id, path, value, description, resource_type, created_by, edited_at)\n VALUES ($1, $2, $3, $4, $5, $6, now()) ON CONFLICT (workspace_id, path) DO UPDATE SET value = $3, edited_at = now()", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Varchar", + "Jsonb", + "Text", + "Varchar", + "Varchar" + ] + }, + "nullable": [] + }, + "hash": "42df4b40b3bbf14010f07e29892776992bfeb383d590e379244ad23703e536a4" +} diff --git a/backend/.sqlx/query-43b376a2eff086a32cd76e54361ce3631feee1565935d2a6ddbecc17950758d1.json b/backend/.sqlx/query-43b376a2eff086a32cd76e54361ce3631feee1565935d2a6ddbecc17950758d1.json new file mode 100644 index 0000000000..5b9eeaa790 --- /dev/null +++ b/backend/.sqlx/query-43b376a2eff086a32cd76e54361ce3631feee1565935d2a6ddbecc17950758d1.json @@ -0,0 +1,17 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO workspace_settings\n (workspace_id, slack_team_id, slack_name, slack_email)\n VALUES ($1, $2, $3, $4) ON CONFLICT (workspace_id) DO UPDATE SET slack_team_id = $2, slack_name = $3, slack_email = $4", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Varchar", + "Varchar", + "Varchar" + ] + }, + "nullable": [] + }, + "hash": "43b376a2eff086a32cd76e54361ce3631feee1565935d2a6ddbecc17950758d1" +} diff --git a/backend/.sqlx/query-43c8cd9f8560412bb06d9966ccfa2524943ba277c5f9a37c06bd5ee14fd46bda.json b/backend/.sqlx/query-43c8cd9f8560412bb06d9966ccfa2524943ba277c5f9a37c06bd5ee14fd46bda.json new file mode 100644 index 0000000000..7d6ecdbf32 --- /dev/null +++ b/backend/.sqlx/query-43c8cd9f8560412bb06d9966ccfa2524943ba277c5f9a37c06bd5ee14fd46bda.json @@ -0,0 +1,17 @@ +{ + "db_name": "PostgreSQL", + "query": "\n UPDATE \n capture_config \n SET \n error = $1, \n server_id = NULL, \n last_server_ping = NULL \n WHERE \n workspace_id = $2 AND \n path = $3 AND \n is_flow = $4 AND \n trigger_kind = 'gcp'\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Text", + "Text", + "Bool" + ] + }, + "nullable": [] + }, + "hash": "43c8cd9f8560412bb06d9966ccfa2524943ba277c5f9a37c06bd5ee14fd46bda" +} diff --git a/backend/.sqlx/query-44a12919fb154055f1142cc078ef131f8a0c9cdb37cfba6283a6718480b02a4b.json b/backend/.sqlx/query-44a12919fb154055f1142cc078ef131f8a0c9cdb37cfba6283a6718480b02a4b.json new file mode 100644 index 0000000000..18c572b1fb --- /dev/null +++ b/backend/.sqlx/query-44a12919fb154055f1142cc078ef131f8a0c9cdb37cfba6283a6718480b02a4b.json @@ -0,0 +1,34 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT value, is_secret, expires_at FROM variable WHERE path = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "value", + "type_info": "Varchar" + }, + { + "ordinal": 1, + "name": "is_secret", + "type_info": "Bool" + }, + { + "ordinal": 2, + "name": "expires_at", + "type_info": "Timestamptz" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + false, + false, + true + ] + }, + "hash": "44a12919fb154055f1142cc078ef131f8a0c9cdb37cfba6283a6718480b02a4b" +} diff --git a/backend/.sqlx/query-44b9bea3651edc8ee732def1241b3d956c004376102ccc1707fc016801599dbd.json b/backend/.sqlx/query-44b9bea3651edc8ee732def1241b3d956c004376102ccc1707fc016801599dbd.json new file mode 100644 index 0000000000..87d384f5a1 --- /dev/null +++ b/backend/.sqlx/query-44b9bea3651edc8ee732def1241b3d956c004376102ccc1707fc016801599dbd.json @@ -0,0 +1,36 @@ +{ + "db_name": "PostgreSQL", + "query": "\n UPDATE \n gcp_trigger \n SET \n gcp_resource_path = $1,\n subscription_id = $2,\n topic_id = $3,\n delivery_type = $4,\n delivery_config = $5,\n is_flow = $6, \n edited_by = $7, \n email = $8,\n script_path = $9,\n path = $10,\n enabled = $11,\n edited_at = now(), \n error = NULL,\n server_id = NULL\n WHERE \n workspace_id = $12 AND \n path = $13\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Varchar", + "Varchar", + { + "Custom": { + "name": "delivery_mode", + "kind": { + "Enum": [ + "push", + "pull" + ] + } + } + }, + "Jsonb", + "Bool", + "Varchar", + "Varchar", + "Varchar", + "Varchar", + "Bool", + "Text", + "Text" + ] + }, + "nullable": [] + }, + "hash": "44b9bea3651edc8ee732def1241b3d956c004376102ccc1707fc016801599dbd" +} diff --git a/backend/.sqlx/query-45dde0dc2da12fe46b5975ed53b520fc4160c008c3d29fe7d99e609c0b6e3e6d.json b/backend/.sqlx/query-45dde0dc2da12fe46b5975ed53b520fc4160c008c3d29fe7d99e609c0b6e3e6d.json new file mode 100644 index 0000000000..edb113673b --- /dev/null +++ b/backend/.sqlx/query-45dde0dc2da12fe46b5975ed53b520fc4160c008c3d29fe7d99e609c0b6e3e6d.json @@ -0,0 +1,12 @@ +{ + "db_name": "PostgreSQL", + "query": "DELETE FROM metrics WHERE created_at < NOW() - INTERVAL '180 day'", + "describe": { + "columns": [], + "parameters": { + "Left": [] + }, + "nullable": [] + }, + "hash": "45dde0dc2da12fe46b5975ed53b520fc4160c008c3d29fe7d99e609c0b6e3e6d" +} diff --git a/backend/.sqlx/query-4887db074e9058bc0c1887428d6b2a897fe4b30c83f2aa5e9464c156f08f1c3a.json b/backend/.sqlx/query-4887db074e9058bc0c1887428d6b2a897fe4b30c83f2aa5e9464c156f08f1c3a.json new file mode 100644 index 0000000000..2988f2c0e5 --- /dev/null +++ b/backend/.sqlx/query-4887db074e9058bc0c1887428d6b2a897fe4b30c83f2aa5e9464c156f08f1c3a.json @@ -0,0 +1,38 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT worker, worker_instance, vcpus, memory FROM worker_ping WHERE ping_at > NOW() - INTERVAL '2 minutes'", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "worker", + "type_info": "Varchar" + }, + { + "ordinal": 1, + "name": "worker_instance", + "type_info": "Varchar" + }, + { + "ordinal": 2, + "name": "vcpus", + "type_info": "Int8" + }, + { + "ordinal": 3, + "name": "memory", + "type_info": "Int8" + } + ], + "parameters": { + "Left": [] + }, + "nullable": [ + false, + false, + true, + true + ] + }, + "hash": "4887db074e9058bc0c1887428d6b2a897fe4b30c83f2aa5e9464c156f08f1c3a" +} diff --git a/backend/.sqlx/query-4968e9edac534657c808b891cbf93c8c0a57f93b7b445171b1cc3f4428ee6e53.json b/backend/.sqlx/query-4968e9edac534657c808b891cbf93c8c0a57f93b7b445171b1cc3f4428ee6e53.json new file mode 100644 index 0000000000..08bc20e88b --- /dev/null +++ b/backend/.sqlx/query-4968e9edac534657c808b891cbf93c8c0a57f93b7b445171b1cc3f4428ee6e53.json @@ -0,0 +1,18 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO deployment_metadata (workspace_id, path, flow_version, callback_job_ids, deployment_msg) VALUES ($1, $2, $3, $4, $5)", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Varchar", + "Int8", + "UuidArray", + "Text" + ] + }, + "nullable": [] + }, + "hash": "4968e9edac534657c808b891cbf93c8c0a57f93b7b445171b1cc3f4428ee6e53" +} diff --git a/backend/.sqlx/query-4b8132b04e454eddfe6724c6cc3a2e60c9c24decb2a6b41125247bbf741e9c25.json b/backend/.sqlx/query-4b8132b04e454eddfe6724c6cc3a2e60c9c24decb2a6b41125247bbf741e9c25.json new file mode 100644 index 0000000000..ab5b04afc6 --- /dev/null +++ b/backend/.sqlx/query-4b8132b04e454eddfe6724c6cc3a2e60c9c24decb2a6b41125247bbf741e9c25.json @@ -0,0 +1,46 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT owner, premium, usage.usage as \"usage?\", workspace_settings.customer_id, workspace_settings.plan FROM workspace LEFT JOIN workspace_settings ON workspace_settings.workspace_id = $1 LEFT JOIN usage ON usage.id = $1 AND month_ = EXTRACT(YEAR FROM current_date) * 12 + EXTRACT(MONTH FROM current_date) AND usage.is_workspace IS true WHERE workspace.id = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "owner", + "type_info": "Varchar" + }, + { + "ordinal": 1, + "name": "premium", + "type_info": "Bool" + }, + { + "ordinal": 2, + "name": "usage?", + "type_info": "Int4" + }, + { + "ordinal": 3, + "name": "customer_id", + "type_info": "Varchar" + }, + { + "ordinal": 4, + "name": "plan", + "type_info": "Varchar" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + false, + false, + false, + true, + true + ] + }, + "hash": "4b8132b04e454eddfe6724c6cc3a2e60c9c24decb2a6b41125247bbf741e9c25" +} diff --git a/backend/.sqlx/query-4cfa57b2a836242d55071ef237855b21bbc487b80bda7fd6250ac12e93938577.json b/backend/.sqlx/query-4cfa57b2a836242d55071ef237855b21bbc487b80bda7fd6250ac12e93938577.json new file mode 100644 index 0000000000..5ac1cd561e --- /dev/null +++ b/backend/.sqlx/query-4cfa57b2a836242d55071ef237855b21bbc487b80bda7fd6250ac12e93938577.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO healthchecks (check_type, healthy) \n SELECT 'min_alive_workers_' || $1, true \n WHERE NOT EXISTS (\n SELECT 1 FROM healthchecks \n WHERE check_type = 'min_alive_workers_' || $1 AND created_at > NOW() - INTERVAL '2 minutes'\n )\n RETURNING id", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int8" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + false + ] + }, + "hash": "4cfa57b2a836242d55071ef237855b21bbc487b80bda7fd6250ac12e93938577" +} diff --git a/backend/.sqlx/query-4e3469185637ad8f06673261bfae1b38c30f7d2689baf647ea4dc6b398c3a651.json b/backend/.sqlx/query-4e3469185637ad8f06673261bfae1b38c30f7d2689baf647ea4dc6b398c3a651.json new file mode 100644 index 0000000000..c6a6f72876 --- /dev/null +++ b/backend/.sqlx/query-4e3469185637ad8f06673261bfae1b38c30f7d2689baf647ea4dc6b398c3a651.json @@ -0,0 +1,23 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT elem\n FROM workspace_settings,\n LATERAL jsonb_array_elements(git_app_installations) AS elem\n WHERE workspace_id = $1\n AND (elem->>'installation_id')::bigint = $2\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "elem", + "type_info": "Jsonb" + } + ], + "parameters": { + "Left": [ + "Text", + "Int8" + ] + }, + "nullable": [ + null + ] + }, + "hash": "4e3469185637ad8f06673261bfae1b38c30f7d2689baf647ea4dc6b398c3a651" +} diff --git a/backend/.sqlx/query-4e5273b9ce05f6ee2dfd5f14c8574a0cf43682480452f7dbe23012320fe7fe25.json b/backend/.sqlx/query-4e5273b9ce05f6ee2dfd5f14c8574a0cf43682480452f7dbe23012320fe7fe25.json new file mode 100644 index 0000000000..8176539a30 --- /dev/null +++ b/backend/.sqlx/query-4e5273b9ce05f6ee2dfd5f14c8574a0cf43682480452f7dbe23012320fe7fe25.json @@ -0,0 +1,58 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT \n tag, \n script_lang AS \"script_lang!: _\"\n FROM \n v2_job\n WHERE \n id = $1\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "tag", + "type_info": "Varchar" + }, + { + "ordinal": 1, + "name": "script_lang!: _", + "type_info": { + "Custom": { + "name": "script_lang", + "kind": { + "Enum": [ + "python3", + "deno", + "go", + "bash", + "postgresql", + "nativets", + "bun", + "mysql", + "bigquery", + "snowflake", + "graphql", + "powershell", + "mssql", + "php", + "bunnative", + "rust", + "ansible", + "csharp", + "oracledb", + "nu", + "java", + "duckdb" + ] + } + } + } + } + ], + "parameters": { + "Left": [ + "Uuid" + ] + }, + "nullable": [ + false, + true + ] + }, + "hash": "4e5273b9ce05f6ee2dfd5f14c8574a0cf43682480452f7dbe23012320fe7fe25" +} diff --git a/backend/.sqlx/query-4eca060026a0cb19c5794cd56ace89fc04765191f251945d14bbe78718714f6e.json b/backend/.sqlx/query-4eca060026a0cb19c5794cd56ace89fc04765191f251945d14bbe78718714f6e.json new file mode 100644 index 0000000000..3b812a53db --- /dev/null +++ b/backend/.sqlx/query-4eca060026a0cb19c5794cd56ace89fc04765191f251945d14bbe78718714f6e.json @@ -0,0 +1,39 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT event_type::AUTOSCALING_EVENT_TYPE AS \"event_type: _\", EXTRACT(EPOCH FROM (NOW() - applied_at))::int as seconds_ago FROM autoscaling_event WHERE worker_group = $1 ORDER BY applied_at DESC LIMIT 1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "event_type: _", + "type_info": { + "Custom": { + "name": "autoscaling_event_type", + "kind": { + "Enum": [ + "full_scaleout", + "scalein", + "scaleout" + ] + } + } + } + }, + { + "ordinal": 1, + "name": "seconds_ago", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + false, + null + ] + }, + "hash": "4eca060026a0cb19c5794cd56ace89fc04765191f251945d14bbe78718714f6e" +} diff --git a/backend/.sqlx/query-50c17c7848760aaf0f869acfc444caecda6335eda5b2e97e5a7370361653ff48.json b/backend/.sqlx/query-50c17c7848760aaf0f869acfc444caecda6335eda5b2e97e5a7370361653ff48.json new file mode 100644 index 0000000000..f3dc153254 --- /dev/null +++ b/backend/.sqlx/query-50c17c7848760aaf0f869acfc444caecda6335eda5b2e97e5a7370361653ff48.json @@ -0,0 +1,26 @@ +{ + "db_name": "PostgreSQL", + "query": "\n WITH assigned_teams AS (\n SELECT teams_team_id\n FROM workspace_settings\n ),\n all_teams AS (\n SELECT jsonb_array_elements(CASE\n WHEN jsonb_typeof(value::jsonb) = 'array' THEN value::jsonb\n ELSE '[]'::jsonb\n END) AS team\n FROM global_settings\n WHERE name = 'teams'\n )\n SELECT team->>'team_name' AS team_name, team->>'team_internal_id' AS team_id\n FROM all_teams\n WHERE NOT EXISTS (\n SELECT 1\n FROM assigned_teams\n WHERE assigned_teams.teams_team_id = team->>'team_internal_id'\n )\n AND team->>'team_name' IS NOT NULL\n AND team->>'team_id' IS NOT NULL\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "team_name", + "type_info": "Text" + }, + { + "ordinal": 1, + "name": "team_id", + "type_info": "Text" + } + ], + "parameters": { + "Left": [] + }, + "nullable": [ + null, + null + ] + }, + "hash": "50c17c7848760aaf0f869acfc444caecda6335eda5b2e97e5a7370361653ff48" +} diff --git a/backend/.sqlx/query-51dbf8e3814c2d63df1958db12d5bacbb4bbe3bb4725eece43fb82944212f21d.json b/backend/.sqlx/query-51dbf8e3814c2d63df1958db12d5bacbb4bbe3bb4725eece43fb82944212f21d.json new file mode 100644 index 0000000000..451324ca6b --- /dev/null +++ b/backend/.sqlx/query-51dbf8e3814c2d63df1958db12d5bacbb4bbe3bb4725eece43fb82944212f21d.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT name FROM instance_group WHERE id = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "name", + "type_info": "Varchar" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + false + ] + }, + "hash": "51dbf8e3814c2d63df1958db12d5bacbb4bbe3bb4725eece43fb82944212f21d" +} diff --git a/backend/.sqlx/query-5237f9d3f57f4e799968a4a9630c984775d23c7a4dc1a7ad37528a46ab89d6bd.json b/backend/.sqlx/query-5237f9d3f57f4e799968a4a9630c984775d23c7a4dc1a7ad37528a46ab89d6bd.json new file mode 100644 index 0000000000..f9c6646e3a --- /dev/null +++ b/backend/.sqlx/query-5237f9d3f57f4e799968a4a9630c984775d23c7a4dc1a7ad37528a46ab89d6bd.json @@ -0,0 +1,123 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT\n aws_auth_resource_type AS \"aws_auth_resource_type: _\",\n aws_resource_path,\n message_attributes,\n queue_url,\n workspace_id,\n path,\n script_path,\n is_flow,\n edited_by,\n email,\n edited_at,\n server_id,\n last_server_ping,\n extra_perms,\n error,\n enabled\n FROM \n sqs_trigger\n WHERE \n workspace_id = $1 AND \n path = $2\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "aws_auth_resource_type: _", + "type_info": { + "Custom": { + "name": "aws_auth_resource_type", + "kind": { + "Enum": [ + "oidc", + "credentials" + ] + } + } + } + }, + { + "ordinal": 1, + "name": "aws_resource_path", + "type_info": "Varchar" + }, + { + "ordinal": 2, + "name": "message_attributes", + "type_info": "TextArray" + }, + { + "ordinal": 3, + "name": "queue_url", + "type_info": "Varchar" + }, + { + "ordinal": 4, + "name": "workspace_id", + "type_info": "Varchar" + }, + { + "ordinal": 5, + "name": "path", + "type_info": "Varchar" + }, + { + "ordinal": 6, + "name": "script_path", + "type_info": "Varchar" + }, + { + "ordinal": 7, + "name": "is_flow", + "type_info": "Bool" + }, + { + "ordinal": 8, + "name": "edited_by", + "type_info": "Varchar" + }, + { + "ordinal": 9, + "name": "email", + "type_info": "Varchar" + }, + { + "ordinal": 10, + "name": "edited_at", + "type_info": "Timestamptz" + }, + { + "ordinal": 11, + "name": "server_id", + "type_info": "Varchar" + }, + { + "ordinal": 12, + "name": "last_server_ping", + "type_info": "Timestamptz" + }, + { + "ordinal": 13, + "name": "extra_perms", + "type_info": "Jsonb" + }, + { + "ordinal": 14, + "name": "error", + "type_info": "Text" + }, + { + "ordinal": 15, + "name": "enabled", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [ + false, + false, + true, + false, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + false + ] + }, + "hash": "5237f9d3f57f4e799968a4a9630c984775d23c7a4dc1a7ad37528a46ab89d6bd" +} diff --git a/backend/.sqlx/query-528cdbb75f1c5135170a58fce3fda464be138272487639d0ffbbbe6961ec5c37.json b/backend/.sqlx/query-528cdbb75f1c5135170a58fce3fda464be138272487639d0ffbbbe6961ec5c37.json new file mode 100644 index 0000000000..e998bea512 --- /dev/null +++ b/backend/.sqlx/query-528cdbb75f1c5135170a58fce3fda464be138272487639d0ffbbbe6961ec5c37.json @@ -0,0 +1,18 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE job_logs SET logs = $1, log_offset = $2, \n log_file_index = array_append(coalesce(log_file_index, array[]::text[]), $3) \n WHERE workspace_id = $4 AND job_id = $5", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Int4", + "Text", + "Text", + "Uuid" + ] + }, + "nullable": [] + }, + "hash": "528cdbb75f1c5135170a58fce3fda464be138272487639d0ffbbbe6961ec5c37" +} diff --git a/backend/.sqlx/query-5303206bbed76ee3ddc56d8057d8b82359c182ee2a5da6df35a4375d5d2d1ef7.json b/backend/.sqlx/query-5303206bbed76ee3ddc56d8057d8b82359c182ee2a5da6df35a4375d5d2d1ef7.json new file mode 100644 index 0000000000..f010362e6f --- /dev/null +++ b/backend/.sqlx/query-5303206bbed76ee3ddc56d8057d8b82359c182ee2a5da6df35a4375d5d2d1ef7.json @@ -0,0 +1,65 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT \n gcp_resource_path, \n script_path,\n is_flow, \n workspace_id,\n path,\n edited_by,\n email,\n delivery_config AS \"delivery_config: _\"\n FROM\n gcp_trigger\n WHERE\n workspace_id = $1 AND\n path = $2 AND\n delivery_type = 'push'::DELIVERY_MODE \n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "gcp_resource_path", + "type_info": "Varchar" + }, + { + "ordinal": 1, + "name": "script_path", + "type_info": "Varchar" + }, + { + "ordinal": 2, + "name": "is_flow", + "type_info": "Bool" + }, + { + "ordinal": 3, + "name": "workspace_id", + "type_info": "Varchar" + }, + { + "ordinal": 4, + "name": "path", + "type_info": "Varchar" + }, + { + "ordinal": 5, + "name": "edited_by", + "type_info": "Varchar" + }, + { + "ordinal": 6, + "name": "email", + "type_info": "Varchar" + }, + { + "ordinal": 7, + "name": "delivery_config: _", + "type_info": "Jsonb" + } + ], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [ + false, + false, + false, + false, + false, + false, + false, + true + ] + }, + "hash": "5303206bbed76ee3ddc56d8057d8b82359c182ee2a5da6df35a4375d5d2d1ef7" +} diff --git a/backend/.sqlx/query-54c6be1469a80d88fd6d5c30772bb6698610189bac63c2caee3f4d52b0851f31.json b/backend/.sqlx/query-54c6be1469a80d88fd6d5c30772bb6698610189bac63c2caee3f4d52b0851f31.json new file mode 100644 index 0000000000..c8759a0193 --- /dev/null +++ b/backend/.sqlx/query-54c6be1469a80d88fd6d5c30772bb6698610189bac63c2caee3f4d52b0851f31.json @@ -0,0 +1,20 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO password(email, verified, password_hash, login_type, super_admin, name, company, username)\n VALUES ($1, $2, $3, 'password', $4, $5, $6, $7)", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Bool", + "Varchar", + "Bool", + "Varchar", + "Varchar", + "Varchar" + ] + }, + "nullable": [] + }, + "hash": "54c6be1469a80d88fd6d5c30772bb6698610189bac63c2caee3f4d52b0851f31" +} diff --git a/backend/.sqlx/query-551c78392919e18019bb0a4344fb1bd45853bf5b72e0ab991e0e61fedcfb42fc.json b/backend/.sqlx/query-551c78392919e18019bb0a4344fb1bd45853bf5b72e0ab991e0e61fedcfb42fc.json new file mode 100644 index 0000000000..4a9bcd8cf3 --- /dev/null +++ b/backend/.sqlx/query-551c78392919e18019bb0a4344fb1bd45853bf5b72e0ab991e0e61fedcfb42fc.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "\n UPDATE workspace_settings\n SET teams_team_id = $1, teams_team_name = $2\n WHERE workspace_id = $3\n AND NOT EXISTS (\n SELECT 1 FROM workspace_settings\n WHERE teams_team_id = $1 AND workspace_id <> $2\n )\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Text", + "Text" + ] + }, + "nullable": [] + }, + "hash": "551c78392919e18019bb0a4344fb1bd45853bf5b72e0ab991e0e61fedcfb42fc" +} diff --git a/backend/.sqlx/query-55a2f170823f1d1abce76287d8817a6cf34de92b9b4079c00b75423a9ff835b9.json b/backend/.sqlx/query-55a2f170823f1d1abce76287d8817a6cf34de92b9b4079c00b75423a9ff835b9.json new file mode 100644 index 0000000000..7b7dd7fe29 --- /dev/null +++ b/backend/.sqlx/query-55a2f170823f1d1abce76287d8817a6cf34de92b9b4079c00b75423a9ff835b9.json @@ -0,0 +1,20 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO variable\n (workspace_id, path, value, is_secret, description, account, is_oauth)\n VALUES ($1, $2, $3, $4, $5, $6, $7)\n ON CONFLICT (workspace_id, path) DO UPDATE SET value = $3", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Varchar", + "Varchar", + "Bool", + "Varchar", + "Int4", + "Bool" + ] + }, + "nullable": [] + }, + "hash": "55a2f170823f1d1abce76287d8817a6cf34de92b9b4079c00b75423a9ff835b9" +} diff --git a/backend/.sqlx/query-55cb03040bc2a8c53dd7fbb42bbdcc40f463cbc52d94ed9315cf9a547d4c89f2.json b/backend/.sqlx/query-55cb03040bc2a8c53dd7fbb42bbdcc40f463cbc52d94ed9315cf9a547d4c89f2.json new file mode 100644 index 0000000000..009d9fe5d1 --- /dev/null +++ b/backend/.sqlx/query-55cb03040bc2a8c53dd7fbb42bbdcc40f463cbc52d94ed9315cf9a547d4c89f2.json @@ -0,0 +1,184 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT * FROM workspace_settings WHERE slack_team_id = $1 AND slack_command_script IS NOT NULL", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "workspace_id", + "type_info": "Varchar" + }, + { + "ordinal": 1, + "name": "slack_team_id", + "type_info": "Varchar" + }, + { + "ordinal": 2, + "name": "slack_name", + "type_info": "Varchar" + }, + { + "ordinal": 3, + "name": "slack_command_script", + "type_info": "Varchar" + }, + { + "ordinal": 4, + "name": "slack_email", + "type_info": "Varchar" + }, + { + "ordinal": 5, + "name": "auto_invite_domain", + "type_info": "Varchar" + }, + { + "ordinal": 6, + "name": "auto_invite_operator", + "type_info": "Bool" + }, + { + "ordinal": 7, + "name": "customer_id", + "type_info": "Varchar" + }, + { + "ordinal": 8, + "name": "plan", + "type_info": "Varchar" + }, + { + "ordinal": 9, + "name": "webhook", + "type_info": "Text" + }, + { + "ordinal": 10, + "name": "deploy_to", + "type_info": "Varchar" + }, + { + "ordinal": 11, + "name": "error_handler", + "type_info": "Varchar" + }, + { + "ordinal": 12, + "name": "ai_config", + "type_info": "Jsonb" + }, + { + "ordinal": 13, + "name": "error_handler_extra_args", + "type_info": "Json" + }, + { + "ordinal": 14, + "name": "error_handler_muted_on_cancel", + "type_info": "Bool" + }, + { + "ordinal": 15, + "name": "large_file_storage", + "type_info": "Jsonb" + }, + { + "ordinal": 16, + "name": "git_sync", + "type_info": "Jsonb" + }, + { + "ordinal": 17, + "name": "default_app", + "type_info": "Varchar" + }, + { + "ordinal": 18, + "name": "auto_add", + "type_info": "Bool" + }, + { + "ordinal": 19, + "name": "default_scripts", + "type_info": "Jsonb" + }, + { + "ordinal": 20, + "name": "deploy_ui", + "type_info": "Jsonb" + }, + { + "ordinal": 21, + "name": "mute_critical_alerts", + "type_info": "Bool" + }, + { + "ordinal": 22, + "name": "color", + "type_info": "Varchar" + }, + { + "ordinal": 23, + "name": "operator_settings", + "type_info": "Jsonb" + }, + { + "ordinal": 24, + "name": "teams_command_script", + "type_info": "Text" + }, + { + "ordinal": 25, + "name": "teams_team_id", + "type_info": "Text" + }, + { + "ordinal": 26, + "name": "teams_team_name", + "type_info": "Text" + }, + { + "ordinal": 27, + "name": "git_app_installations", + "type_info": "Jsonb" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + false, + true, + true, + true, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false + ] + }, + "hash": "55cb03040bc2a8c53dd7fbb42bbdcc40f463cbc52d94ed9315cf9a547d4c89f2" +} diff --git a/backend/.sqlx/query-55cf43cb9219b43f8e9f94b23b62846cd0b1ef5f64d20b0d975d0058730f427b.json b/backend/.sqlx/query-55cf43cb9219b43f8e9f94b23b62846cd0b1ef5f64d20b0d975d0058730f427b.json new file mode 100644 index 0000000000..e68f25d6ab --- /dev/null +++ b/backend/.sqlx/query-55cf43cb9219b43f8e9f94b23b62846cd0b1ef5f64d20b0d975d0058730f427b.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT job FROM token WHERE token = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "job", + "type_info": "Uuid" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + true + ] + }, + "hash": "55cf43cb9219b43f8e9f94b23b62846cd0b1ef5f64d20b0d975d0058730f427b" +} diff --git a/backend/.sqlx/query-574d9a2bb6eceb62f3d2c2be3f18b29ef8bba3d6da1b1e21f2ca307ccbebee89.json b/backend/.sqlx/query-574d9a2bb6eceb62f3d2c2be3f18b29ef8bba3d6da1b1e21f2ca307ccbebee89.json new file mode 100644 index 0000000000..dd673ef52c --- /dev/null +++ b/backend/.sqlx/query-574d9a2bb6eceb62f3d2c2be3f18b29ef8bba3d6da1b1e21f2ca307ccbebee89.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE instance_group SET scim_display_name = $1, name = $2 where id = $3", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Varchar", + "Text" + ] + }, + "nullable": [] + }, + "hash": "574d9a2bb6eceb62f3d2c2be3f18b29ef8bba3d6da1b1e21f2ca307ccbebee89" +} diff --git a/backend/.sqlx/query-57e270e032e8c04dda7b5c1ca949861756b3ad367a4a500728332a7cb91560a4.json b/backend/.sqlx/query-57e270e032e8c04dda7b5c1ca949861756b3ad367a4a500728332a7cb91560a4.json new file mode 100644 index 0000000000..ccf6b0ad8f --- /dev/null +++ b/backend/.sqlx/query-57e270e032e8c04dda7b5c1ca949861756b3ad367a4a500728332a7cb91560a4.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE concurrency_locks SET\n last_locked_at = now()\n WHERE id = $1 AND owner = $2", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [] + }, + "hash": "57e270e032e8c04dda7b5c1ca949861756b3ad367a4a500728332a7cb91560a4" +} diff --git a/backend/.sqlx/query-5930b2fa72fd15d692bcf3e14d95f85dd67ab1514d7c48668ab2f10aa6b201ba.json b/backend/.sqlx/query-5930b2fa72fd15d692bcf3e14d95f85dd67ab1514d7c48668ab2f10aa6b201ba.json new file mode 100644 index 0000000000..d616940b6b --- /dev/null +++ b/backend/.sqlx/query-5930b2fa72fd15d692bcf3e14d95f85dd67ab1514d7c48668ab2f10aa6b201ba.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE v2_job_runtime SET ping = now() WHERE id = $1", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Uuid" + ] + }, + "nullable": [] + }, + "hash": "5930b2fa72fd15d692bcf3e14d95f85dd67ab1514d7c48668ab2f10aa6b201ba" +} diff --git a/backend/.sqlx/query-5a219a2532517869578c4504ff3153c43903f929ae5d62fbba12610f89c36d55.json b/backend/.sqlx/query-5a219a2532517869578c4504ff3153c43903f929ae5d62fbba12610f89c36d55.json index 713ccb9dd3..36ddb8ab9f 100644 --- a/backend/.sqlx/query-5a219a2532517869578c4504ff3153c43903f929ae5d62fbba12610f89c36d55.json +++ b/backend/.sqlx/query-5a219a2532517869578c4504ff3153c43903f929ae5d62fbba12610f89c36d55.json @@ -15,7 +15,7 @@ ] }, "nullable": [ - null + true ] }, "hash": "5a219a2532517869578c4504ff3153c43903f929ae5d62fbba12610f89c36d55" diff --git a/backend/.sqlx/query-5bd8ae8d694ac9f6afef762276141d95ba195f5543120e76e68f6e6715b65a71.json b/backend/.sqlx/query-5bd8ae8d694ac9f6afef762276141d95ba195f5543120e76e68f6e6715b65a71.json new file mode 100644 index 0000000000..31700319e2 --- /dev/null +++ b/backend/.sqlx/query-5bd8ae8d694ac9f6afef762276141d95ba195f5543120e76e68f6e6715b65a71.json @@ -0,0 +1,24 @@ +{ + "db_name": "PostgreSQL", + "query": "\n UPDATE \n sqs_trigger \n SET \n server_id = $1, \n last_server_ping = now(),\n error = 'Connecting...'\n WHERE \n enabled IS TRUE \n AND workspace_id = $2 \n AND path = $3 \n AND (last_server_ping IS NULL \n OR last_server_ping < now() - INTERVAL '15 seconds'\n ) \n RETURNING true\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "?column?", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [ + "Varchar", + "Text", + "Text" + ] + }, + "nullable": [ + null + ] + }, + "hash": "5bd8ae8d694ac9f6afef762276141d95ba195f5543120e76e68f6e6715b65a71" +} diff --git a/backend/.sqlx/query-5f22a7c9170f035779782591b4bfb1d462d5c796f08c7481c42154f9bfacf388.json b/backend/.sqlx/query-5f22a7c9170f035779782591b4bfb1d462d5c796f08c7481c42154f9bfacf388.json new file mode 100644 index 0000000000..1aea7e585c --- /dev/null +++ b/backend/.sqlx/query-5f22a7c9170f035779782591b4bfb1d462d5c796f08c7481c42154f9bfacf388.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO healthchecks (check_type, healthy) \n SELECT 'min_alive_workers_' || $1, false\n WHERE NOT EXISTS (\n SELECT 1 FROM healthchecks \n WHERE check_type = 'min_alive_workers_' || $1 AND created_at > NOW() - INTERVAL '2 minutes'\n )\n RETURNING id", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int8" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + false + ] + }, + "hash": "5f22a7c9170f035779782591b4bfb1d462d5c796f08c7481c42154f9bfacf388" +} diff --git a/backend/.sqlx/query-5faba1042763a308c64e36cc2a331d90bc0aa384262e473c7006340dcb6e959c.json b/backend/.sqlx/query-5faba1042763a308c64e36cc2a331d90bc0aa384262e473c7006340dcb6e959c.json new file mode 100644 index 0000000000..9b7f1962a4 --- /dev/null +++ b/backend/.sqlx/query-5faba1042763a308c64e36cc2a331d90bc0aa384262e473c7006340dcb6e959c.json @@ -0,0 +1,23 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT value FROM resource WHERE workspace_id = $1 AND path = $2", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "value", + "type_info": "Jsonb" + } + ], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [ + true + ] + }, + "hash": "5faba1042763a308c64e36cc2a331d90bc0aa384262e473c7006340dcb6e959c" +} diff --git a/backend/.sqlx/query-5fd70c70ce52cbc51fa9124cb05f82b5951f17d1b7eade53c6d89253d55f8b9f.json b/backend/.sqlx/query-5fd70c70ce52cbc51fa9124cb05f82b5951f17d1b7eade53c6d89253d55f8b9f.json new file mode 100644 index 0000000000..51f58cb81c --- /dev/null +++ b/backend/.sqlx/query-5fd70c70ce52cbc51fa9124cb05f82b5951f17d1b7eade53c6d89253d55f8b9f.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT owner FROM concurrency_locks WHERE id = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "owner", + "type_info": "Varchar" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + true + ] + }, + "hash": "5fd70c70ce52cbc51fa9124cb05f82b5951f17d1b7eade53c6d89253d55f8b9f" +} diff --git a/backend/.sqlx/query-6032ab9ab230c48a44f684e70ebc3277a2543cd3b52a3123b0585f6c9071552c.json b/backend/.sqlx/query-6032ab9ab230c48a44f684e70ebc3277a2543cd3b52a3123b0585f6c9071552c.json new file mode 100644 index 0000000000..aa8142ab1a --- /dev/null +++ b/backend/.sqlx/query-6032ab9ab230c48a44f684e70ebc3277a2543cd3b52a3123b0585f6c9071552c.json @@ -0,0 +1,46 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT name, id, scim_display_name, array_remove(array_agg(email_to_igroup.email), null) as emails, external_id FROM email_to_igroup RIGHT JOIN instance_group ON instance_group.name = email_to_igroup.igroup WHERE id = $1 group by name, id", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "name", + "type_info": "Varchar" + }, + { + "ordinal": 1, + "name": "id", + "type_info": "Varchar" + }, + { + "ordinal": 2, + "name": "scim_display_name", + "type_info": "Varchar" + }, + { + "ordinal": 3, + "name": "emails", + "type_info": "VarcharArray" + }, + { + "ordinal": 4, + "name": "external_id", + "type_info": "Varchar" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + false, + true, + true, + null, + true + ] + }, + "hash": "6032ab9ab230c48a44f684e70ebc3277a2543cd3b52a3123b0585f6c9071552c" +} diff --git a/backend/.sqlx/query-64c5ca0bd4a2c42d6f5415fae1de21295673c45e4caae1bdbb47517d4608dc8d.json b/backend/.sqlx/query-64c5ca0bd4a2c42d6f5415fae1de21295673c45e4caae1bdbb47517d4608dc8d.json new file mode 100644 index 0000000000..d2460a340b --- /dev/null +++ b/backend/.sqlx/query-64c5ca0bd4a2c42d6f5415fae1de21295673c45e4caae1bdbb47517d4608dc8d.json @@ -0,0 +1,17 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE workspace_settings SET auto_invite_domain = $1, auto_invite_operator = $2, auto_add = $4 WHERE workspace_id = $3", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Bool", + "Text", + "Bool" + ] + }, + "nullable": [] + }, + "hash": "64c5ca0bd4a2c42d6f5415fae1de21295673c45e4caae1bdbb47517d4608dc8d" +} diff --git a/backend/.sqlx/query-656f268969018438499f677d31720e85b2eed7b4705367361fc5e456e5263df9.json b/backend/.sqlx/query-656f268969018438499f677d31720e85b2eed7b4705367361fc5e456e5263df9.json new file mode 100644 index 0000000000..c72a8c9d8f --- /dev/null +++ b/backend/.sqlx/query-656f268969018438499f677d31720e85b2eed7b4705367361fc5e456e5263df9.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE email_to_igroup SET igroup = $2 WHERE igroup = $1", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Varchar" + ] + }, + "nullable": [] + }, + "hash": "656f268969018438499f677d31720e85b2eed7b4705367361fc5e456e5263df9" +} diff --git a/backend/.sqlx/query-673564e6c4dcf30dae3d7a75c397998ea800860ede856e5fc6cd1f57d5408333.json b/backend/.sqlx/query-673564e6c4dcf30dae3d7a75c397998ea800860ede856e5fc6cd1f57d5408333.json new file mode 100644 index 0000000000..8b9a46c4d0 --- /dev/null +++ b/backend/.sqlx/query-673564e6c4dcf30dae3d7a75c397998ea800860ede856e5fc6cd1f57d5408333.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE \n capture_config \n SET \n last_server_ping = NULL \n WHERE \n workspace_id = $1 AND \n path = $2 AND \n is_flow = $3 AND \n trigger_kind = 'gcp' AND \n server_id IS NULL\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Text", + "Bool" + ] + }, + "nullable": [] + }, + "hash": "673564e6c4dcf30dae3d7a75c397998ea800860ede856e5fc6cd1f57d5408333" +} diff --git a/backend/.sqlx/query-689551fddbff09acd3f000ae54f25cc496528768f8ee4c6924b13bb8f75a9f8a.json b/backend/.sqlx/query-689551fddbff09acd3f000ae54f25cc496528768f8ee4c6924b13bb8f75a9f8a.json new file mode 100644 index 0000000000..4c27ae3807 --- /dev/null +++ b/backend/.sqlx/query-689551fddbff09acd3f000ae54f25cc496528768f8ee4c6924b13bb8f75a9f8a.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE instance_group SET external_id = $1 WHERE name = $2", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Text" + ] + }, + "nullable": [] + }, + "hash": "689551fddbff09acd3f000ae54f25cc496528768f8ee4c6924b13bb8f75a9f8a" +} diff --git a/backend/.sqlx/query-69518153298f8ca6f112bed156b520758656ce6bcd1e694a62e140e0af8c59fa.json b/backend/.sqlx/query-69518153298f8ca6f112bed156b520758656ce6bcd1e694a62e140e0af8c59fa.json new file mode 100644 index 0000000000..f96e0e349a --- /dev/null +++ b/backend/.sqlx/query-69518153298f8ca6f112bed156b520758656ce6bcd1e694a62e140e0af8c59fa.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "\n UPDATE workspace_settings\n SET git_app_installations = COALESCE(\n (\n SELECT jsonb_agg(elem)\n FROM (\n SELECT elem\n FROM jsonb_array_elements(git_app_installations) AS elem\n WHERE (elem->>'installation_id')::bigint != ($1::jsonb->>'installation_id')::bigint\n UNION ALL\n SELECT $1::jsonb\n ) sub\n ),\n jsonb_build_array($1::jsonb)\n )\n WHERE workspace_id = $2;\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Jsonb", + "Text" + ] + }, + "nullable": [] + }, + "hash": "69518153298f8ca6f112bed156b520758656ce6bcd1e694a62e140e0af8c59fa" +} diff --git a/backend/.sqlx/query-6a72df33cf12824c54b29dbf011f2390af9d02efc7112a32a84e1a1247a95973.json b/backend/.sqlx/query-6a72df33cf12824c54b29dbf011f2390af9d02efc7112a32a84e1a1247a95973.json new file mode 100644 index 0000000000..1521b9fd2f --- /dev/null +++ b/backend/.sqlx/query-6a72df33cf12824c54b29dbf011f2390af9d02efc7112a32a84e1a1247a95973.json @@ -0,0 +1,56 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT worker, worker_instance, vcpus, memory, ping_at, started_at, worker_group FROM worker_ping WHERE ping_at > now() - interval '30 days' ORDER BY started_at", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "worker", + "type_info": "Varchar" + }, + { + "ordinal": 1, + "name": "worker_instance", + "type_info": "Varchar" + }, + { + "ordinal": 2, + "name": "vcpus", + "type_info": "Int8" + }, + { + "ordinal": 3, + "name": "memory", + "type_info": "Int8" + }, + { + "ordinal": 4, + "name": "ping_at", + "type_info": "Timestamptz" + }, + { + "ordinal": 5, + "name": "started_at", + "type_info": "Timestamptz" + }, + { + "ordinal": 6, + "name": "worker_group", + "type_info": "Varchar" + } + ], + "parameters": { + "Left": [] + }, + "nullable": [ + false, + false, + true, + true, + false, + false, + false + ] + }, + "hash": "6a72df33cf12824c54b29dbf011f2390af9d02efc7112a32a84e1a1247a95973" +} diff --git a/backend/.sqlx/query-6b776693091191f36eaf9e35fb3cabb01481a19bef5a956dc36cac41acad0e53.json b/backend/.sqlx/query-6b776693091191f36eaf9e35fb3cabb01481a19bef5a956dc36cac41acad0e53.json new file mode 100644 index 0000000000..97079df64f --- /dev/null +++ b/backend/.sqlx/query-6b776693091191f36eaf9e35fb3cabb01481a19bef5a956dc36cac41acad0e53.json @@ -0,0 +1,25 @@ +{ + "db_name": "PostgreSQL", + "query": "\n UPDATE \n capture_config \n SET \n server_id = $1,\n last_server_ping = now(), \n error = 'Connecting...' \n WHERE \n last_client_ping > NOW() - INTERVAL '10 seconds' AND \n workspace_id = $2 AND \n path = $3 AND \n is_flow = $4 AND \n trigger_kind = 'sqs' AND \n (last_server_ping IS NULL OR last_server_ping < now() - interval '15 seconds') \n RETURNING true\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "?column?", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [ + "Varchar", + "Text", + "Text", + "Bool" + ] + }, + "nullable": [ + null + ] + }, + "hash": "6b776693091191f36eaf9e35fb3cabb01481a19bef5a956dc36cac41acad0e53" +} diff --git a/backend/.sqlx/query-6bb4fab9e74c421fb30cfd856a1a9b44c76f1cf1485ceba50aeede9daec94c01.json b/backend/.sqlx/query-6bb4fab9e74c421fb30cfd856a1a9b44c76f1cf1485ceba50aeede9daec94c01.json new file mode 100644 index 0000000000..20bdf25c03 --- /dev/null +++ b/backend/.sqlx/query-6bb4fab9e74c421fb30cfd856a1a9b44c76f1cf1485ceba50aeede9daec94c01.json @@ -0,0 +1,18 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO deployment_metadata (workspace_id, path, script_hash, callback_job_ids, deployment_msg) VALUES ($1, $2, $3, $4, $5)", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Varchar", + "Int8", + "UuidArray", + "Text" + ] + }, + "nullable": [] + }, + "hash": "6bb4fab9e74c421fb30cfd856a1a9b44c76f1cf1485ceba50aeede9daec94c01" +} diff --git a/backend/.sqlx/query-6d418b5cd7a4df54cfe3ec06e2a957c87f2307a218115ca749ea0e71eca2002e.json b/backend/.sqlx/query-6d418b5cd7a4df54cfe3ec06e2a957c87f2307a218115ca749ea0e71eca2002e.json new file mode 100644 index 0000000000..c20295fe97 --- /dev/null +++ b/backend/.sqlx/query-6d418b5cd7a4df54cfe3ec06e2a957c87f2307a218115ca749ea0e71eca2002e.json @@ -0,0 +1,23 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT EXISTS(SELECT 1 FROM kafka_trigger WHERE path = $1 AND workspace_id = $2)", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "exists", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [ + null + ] + }, + "hash": "6d418b5cd7a4df54cfe3ec06e2a957c87f2307a218115ca749ea0e71eca2002e" +} diff --git a/backend/.sqlx/query-6e2564dc37ee967c634deade67ceabc4c516418e595dee9cd7d651acc1f4af6e.json b/backend/.sqlx/query-6e2564dc37ee967c634deade67ceabc4c516418e595dee9cd7d651acc1f4af6e.json new file mode 100644 index 0000000000..39ebee28b4 --- /dev/null +++ b/backend/.sqlx/query-6e2564dc37ee967c634deade67ceabc4c516418e595dee9cd7d651acc1f4af6e.json @@ -0,0 +1,249 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT\n cj.id AS \"id!\",\n cj.workspace_id AS \"workspace_id!\",\n cj.parent_job,\n cj.created_by AS \"created_by!\",\n cj.duration_ms AS \"duration_ms!\",\n cj.success AS \"success!\",\n cj.script_hash AS \"script_hash!: Option\",\n cj.script_path,\n cj.args AS \"args: sqlx::types::Json>>\",\n cj.result AS \"result: sqlx::types::Json>\",\n cj.deleted AS \"deleted!\",\n cj.canceled AS \"canceled!\",\n cj.canceled_by,\n cj.canceled_reason,\n cj.job_kind AS \"job_kind!: JobKind\",\n cj.schedule_path,\n cj.permissioned_as AS \"permissioned_as!\",\n cj.is_flow_step AS \"is_flow_step!\",\n cj.language AS \"language: ScriptLang\",\n cj.is_skipped AS \"is_skipped!\",\n cj.email AS \"email!\",\n cj.visible_to_owner AS \"visible_to_owner!\",\n cj.mem_peak,\n cj.tag AS \"tag!\",\n cj.created_at AS \"created_at!\",\n cj.started_at,\n job_logs.logs,\n job_logs.log_offset AS \"log_offset?\",\n job_logs.log_file_index\n\n FROM v2_as_completed_job AS cj\n LEFT JOIN job_logs ON cj.id = job_logs.job_id\n WHERE (cj.created_at > $1 AND cj.created_at < $3)\n OR cj.id = ANY($2)\n ORDER BY cj.created_at ASC LIMIT $4", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id!", + "type_info": "Uuid" + }, + { + "ordinal": 1, + "name": "workspace_id!", + "type_info": "Varchar" + }, + { + "ordinal": 2, + "name": "parent_job", + "type_info": "Uuid" + }, + { + "ordinal": 3, + "name": "created_by!", + "type_info": "Varchar" + }, + { + "ordinal": 4, + "name": "duration_ms!", + "type_info": "Int8" + }, + { + "ordinal": 5, + "name": "success!", + "type_info": "Bool" + }, + { + "ordinal": 6, + "name": "script_hash!: Option", + "type_info": "Int8" + }, + { + "ordinal": 7, + "name": "script_path", + "type_info": "Varchar" + }, + { + "ordinal": 8, + "name": "args: sqlx::types::Json>>", + "type_info": "Jsonb" + }, + { + "ordinal": 9, + "name": "result: sqlx::types::Json>", + "type_info": "Jsonb" + }, + { + "ordinal": 10, + "name": "deleted!", + "type_info": "Bool" + }, + { + "ordinal": 11, + "name": "canceled!", + "type_info": "Bool" + }, + { + "ordinal": 12, + "name": "canceled_by", + "type_info": "Varchar" + }, + { + "ordinal": 13, + "name": "canceled_reason", + "type_info": "Text" + }, + { + "ordinal": 14, + "name": "job_kind!: JobKind", + "type_info": { + "Custom": { + "name": "job_kind", + "kind": { + "Enum": [ + "script", + "preview", + "flow", + "dependencies", + "flowpreview", + "script_hub", + "identity", + "flowdependencies", + "http", + "graphql", + "postgresql", + "noop", + "appdependencies", + "deploymentcallback", + "singlescriptflow", + "flowscript", + "flownode", + "appscript" + ] + } + } + } + }, + { + "ordinal": 15, + "name": "schedule_path", + "type_info": "Varchar" + }, + { + "ordinal": 16, + "name": "permissioned_as!", + "type_info": "Varchar" + }, + { + "ordinal": 17, + "name": "is_flow_step!", + "type_info": "Bool" + }, + { + "ordinal": 18, + "name": "language: ScriptLang", + "type_info": { + "Custom": { + "name": "script_lang", + "kind": { + "Enum": [ + "python3", + "deno", + "go", + "bash", + "postgresql", + "nativets", + "bun", + "mysql", + "bigquery", + "snowflake", + "graphql", + "powershell", + "mssql", + "php", + "bunnative", + "rust", + "ansible", + "csharp", + "oracledb", + "nu", + "java", + "duckdb" + ] + } + } + } + }, + { + "ordinal": 19, + "name": "is_skipped!", + "type_info": "Bool" + }, + { + "ordinal": 20, + "name": "email!", + "type_info": "Varchar" + }, + { + "ordinal": 21, + "name": "visible_to_owner!", + "type_info": "Bool" + }, + { + "ordinal": 22, + "name": "mem_peak", + "type_info": "Int4" + }, + { + "ordinal": 23, + "name": "tag!", + "type_info": "Varchar" + }, + { + "ordinal": 24, + "name": "created_at!", + "type_info": "Timestamptz" + }, + { + "ordinal": 25, + "name": "started_at", + "type_info": "Timestamptz" + }, + { + "ordinal": 26, + "name": "logs", + "type_info": "Text" + }, + { + "ordinal": 27, + "name": "log_offset?", + "type_info": "Int4" + }, + { + "ordinal": 28, + "name": "log_file_index", + "type_info": "TextArray" + } + ], + "parameters": { + "Left": [ + "Timestamptz", + "UuidArray", + "Timestamptz", + "Int8" + ] + }, + "nullable": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + true + ] + }, + "hash": "6e2564dc37ee967c634deade67ceabc4c516418e595dee9cd7d651acc1f4af6e" +} diff --git a/backend/.sqlx/query-6e70ebf078ac04a2933d2f83791973e8fc108d9f32be8a8501391052d76e191e.json b/backend/.sqlx/query-6e70ebf078ac04a2933d2f83791973e8fc108d9f32be8a8501391052d76e191e.json new file mode 100644 index 0000000000..d95c8c9b5c --- /dev/null +++ b/backend/.sqlx/query-6e70ebf078ac04a2933d2f83791973e8fc108d9f32be8a8501391052d76e191e.json @@ -0,0 +1,25 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE kafka_trigger SET last_server_ping = now(), error = $1 WHERE workspace_id = $2 AND path = $3 AND server_id = $4 AND enabled IS TRUE RETURNING 1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "?column?", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Text", + "Text", + "Text", + "Text" + ] + }, + "nullable": [ + null + ] + }, + "hash": "6e70ebf078ac04a2933d2f83791973e8fc108d9f32be8a8501391052d76e191e" +} diff --git a/backend/.sqlx/query-70a3bfa729f874c9765f00a9c7dc067fee1ebf7510fec98e0574e07c906cc714.json b/backend/.sqlx/query-70a3bfa729f874c9765f00a9c7dc067fee1ebf7510fec98e0574e07c906cc714.json new file mode 100644 index 0000000000..e54956175a --- /dev/null +++ b/backend/.sqlx/query-70a3bfa729f874c9765f00a9c7dc067fee1ebf7510fec98e0574e07c906cc714.json @@ -0,0 +1,46 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT name, id, scim_display_name, array_remove(array_agg(email_to_igroup.email), null) as emails, external_id FROM email_to_igroup RIGHT JOIN instance_group ON instance_group.name = email_to_igroup.igroup WHERE id = $1 GROUP BY name", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "name", + "type_info": "Varchar" + }, + { + "ordinal": 1, + "name": "id", + "type_info": "Varchar" + }, + { + "ordinal": 2, + "name": "scim_display_name", + "type_info": "Varchar" + }, + { + "ordinal": 3, + "name": "emails", + "type_info": "VarcharArray" + }, + { + "ordinal": 4, + "name": "external_id", + "type_info": "Varchar" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + false, + true, + true, + null, + true + ] + }, + "hash": "70a3bfa729f874c9765f00a9c7dc067fee1ebf7510fec98e0574e07c906cc714" +} diff --git a/backend/.sqlx/query-71ad5448cba8da6677edd02e090cc158e09af72dd31585ed2ddc1cc06cbfd189.json b/backend/.sqlx/query-71ad5448cba8da6677edd02e090cc158e09af72dd31585ed2ddc1cc06cbfd189.json new file mode 100644 index 0000000000..5d6daba2ab --- /dev/null +++ b/backend/.sqlx/query-71ad5448cba8da6677edd02e090cc158e09af72dd31585ed2ddc1cc06cbfd189.json @@ -0,0 +1,20 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT email FROM password WHERE super_admin IS true AND email NOT LIKE '%@windmill.dev' LIMIT 1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "email", + "type_info": "Varchar" + } + ], + "parameters": { + "Left": [] + }, + "nullable": [ + false + ] + }, + "hash": "71ad5448cba8da6677edd02e090cc158e09af72dd31585ed2ddc1cc06cbfd189" +} diff --git a/backend/.sqlx/query-729c5c6430431f044148aeeec18ad3056ee4fdf8691ba5503937424d75f3815e.json b/backend/.sqlx/query-729c5c6430431f044148aeeec18ad3056ee4fdf8691ba5503937424d75f3815e.json new file mode 100644 index 0000000000..b31bd17bd3 --- /dev/null +++ b/backend/.sqlx/query-729c5c6430431f044148aeeec18ad3056ee4fdf8691ba5503937424d75f3815e.json @@ -0,0 +1,20 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT id FROM v2_job_queue", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Uuid" + } + ], + "parameters": { + "Left": [] + }, + "nullable": [ + false + ] + }, + "hash": "729c5c6430431f044148aeeec18ad3056ee4fdf8691ba5503937424d75f3815e" +} diff --git a/backend/.sqlx/query-73ca6ea13b362b2569ea115d28e4e255cd5e9b990ffa89998ef24871d3a9717c.json b/backend/.sqlx/query-73ca6ea13b362b2569ea115d28e4e255cd5e9b990ffa89998ef24871d3a9717c.json new file mode 100644 index 0000000000..1636e4f358 --- /dev/null +++ b/backend/.sqlx/query-73ca6ea13b362b2569ea115d28e4e255cd5e9b990ffa89998ef24871d3a9717c.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE workspace_settings\n SET slack_team_id = null, slack_name = null WHERE workspace_id = $1", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [] + }, + "hash": "73ca6ea13b362b2569ea115d28e4e255cd5e9b990ffa89998ef24871d3a9717c" +} diff --git a/backend/.sqlx/query-746ee16a04267cd251d4cefbc44a37fcc985bf61978cc07167ed35d7dbf92d11.json b/backend/.sqlx/query-746ee16a04267cd251d4cefbc44a37fcc985bf61978cc07167ed35d7dbf92d11.json new file mode 100644 index 0000000000..4a7e81455e --- /dev/null +++ b/backend/.sqlx/query-746ee16a04267cd251d4cefbc44a37fcc985bf61978cc07167ed35d7dbf92d11.json @@ -0,0 +1,23 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT EXISTS(SELECT 1 FROM nats_trigger WHERE path = $1 AND workspace_id = $2)", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "exists", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [ + null + ] + }, + "hash": "746ee16a04267cd251d4cefbc44a37fcc985bf61978cc07167ed35d7dbf92d11" +} diff --git a/backend/.sqlx/query-776909d3452aaf9e0ed41a5ec314b7bfc5bc8b6a76c98bf4daf7d715d18c52e6.json b/backend/.sqlx/query-776909d3452aaf9e0ed41a5ec314b7bfc5bc8b6a76c98bf4daf7d715d18c52e6.json new file mode 100644 index 0000000000..5c7405cec6 --- /dev/null +++ b/backend/.sqlx/query-776909d3452aaf9e0ed41a5ec314b7bfc5bc8b6a76c98bf4daf7d715d18c52e6.json @@ -0,0 +1,34 @@ +{ + "db_name": "PostgreSQL", + "query": "\n INSERT INTO sqs_trigger (\n aws_auth_resource_type,\n aws_resource_path,\n queue_url,\n message_attributes,\n workspace_id, \n path, \n script_path, \n is_flow, \n email, \n enabled, \n edited_by\n ) \n VALUES (\n $1, \n $2, \n $3, \n $4, \n $5, \n $6, \n $7,\n $8,\n $9,\n $10,\n $11\n )", + "describe": { + "columns": [], + "parameters": { + "Left": [ + { + "Custom": { + "name": "aws_auth_resource_type", + "kind": { + "Enum": [ + "oidc", + "credentials" + ] + } + } + }, + "Varchar", + "Varchar", + "TextArray", + "Varchar", + "Varchar", + "Varchar", + "Bool", + "Varchar", + "Bool", + "Varchar" + ] + }, + "nullable": [] + }, + "hash": "776909d3452aaf9e0ed41a5ec314b7bfc5bc8b6a76c98bf4daf7d715d18c52e6" +} diff --git a/backend/.sqlx/query-7aef087f9e10dd32417477109b97c99b85d68ce1be2bafdc145aed0aa8e5d989.json b/backend/.sqlx/query-7aef087f9e10dd32417477109b97c99b85d68ce1be2bafdc145aed0aa8e5d989.json new file mode 100644 index 0000000000..eb3a2fd9f8 --- /dev/null +++ b/backend/.sqlx/query-7aef087f9e10dd32417477109b97c99b85d68ce1be2bafdc145aed0aa8e5d989.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO workspace_invite\n (workspace_id, email, is_admin)\n VALUES ('demo', $1, false)\n ON CONFLICT DO NOTHING", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar" + ] + }, + "nullable": [] + }, + "hash": "7aef087f9e10dd32417477109b97c99b85d68ce1be2bafdc145aed0aa8e5d989" +} diff --git a/backend/.sqlx/query-7b36b58761cd459b808cc4f463dfc93f01fdbc19c66d7404f95e1f8444235a8e.json b/backend/.sqlx/query-7b36b58761cd459b808cc4f463dfc93f01fdbc19c66d7404f95e1f8444235a8e.json new file mode 100644 index 0000000000..0fe177b05d --- /dev/null +++ b/backend/.sqlx/query-7b36b58761cd459b808cc4f463dfc93f01fdbc19c66d7404f95e1f8444235a8e.json @@ -0,0 +1,25 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE nats_trigger SET nats_resource_path = $1, subjects = $2, stream_name = $3, consumer_name = $4, use_jetstream = $5, script_path = $6, path = $7, is_flow = $8, edited_by = $9, email = $10, edited_at = now(), server_id = NULL, error = NULL\n WHERE workspace_id = $11 AND path = $12", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "VarcharArray", + "Varchar", + "Varchar", + "Bool", + "Varchar", + "Varchar", + "Bool", + "Varchar", + "Varchar", + "Text", + "Text" + ] + }, + "nullable": [] + }, + "hash": "7b36b58761cd459b808cc4f463dfc93f01fdbc19c66d7404f95e1f8444235a8e" +} diff --git a/backend/.sqlx/query-7e31c47e02492b74cbb5702dfc5ef9f4c8faa986843024a2cd58e212f706aae8.json b/backend/.sqlx/query-7e31c47e02492b74cbb5702dfc5ef9f4c8faa986843024a2cd58e212f706aae8.json new file mode 100644 index 0000000000..eea1cfa434 --- /dev/null +++ b/backend/.sqlx/query-7e31c47e02492b74cbb5702dfc5ef9f4c8faa986843024a2cd58e212f706aae8.json @@ -0,0 +1,17 @@ +{ + "db_name": "PostgreSQL", + "query": "\n UPDATE \n capture_config \n SET \n error = $1, \n server_id = NULL, \n last_server_ping = NULL \n WHERE \n workspace_id = $2 AND \n path = $3 AND \n is_flow = $4 AND \n trigger_kind = 'sqs'\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Text", + "Text", + "Bool" + ] + }, + "nullable": [] + }, + "hash": "7e31c47e02492b74cbb5702dfc5ef9f4c8faa986843024a2cd58e212f706aae8" +} diff --git a/backend/.sqlx/query-7ecb01893c46823a207bf59aa57d6f4c6e63f7b7b6d4cf0b4ae1237da0e17b4b.json b/backend/.sqlx/query-7ecb01893c46823a207bf59aa57d6f4c6e63f7b7b6d4cf0b4ae1237da0e17b4b.json new file mode 100644 index 0000000000..628794aae4 --- /dev/null +++ b/backend/.sqlx/query-7ecb01893c46823a207bf59aa57d6f4c6e63f7b7b6d4cf0b4ae1237da0e17b4b.json @@ -0,0 +1,28 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT\n jsonb_array_elements(git_sync->'repositories')->>'script_path' AS script_path,\n jsonb_array_elements(git_sync->'repositories')->>'git_repo_resource_path' AS git_repo_resource_path\n FROM workspace_settings\n WHERE workspace_id = $1;\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "script_path", + "type_info": "Text" + }, + { + "ordinal": 1, + "name": "git_repo_resource_path", + "type_info": "Text" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + null, + null + ] + }, + "hash": "7ecb01893c46823a207bf59aa57d6f4c6e63f7b7b6d4cf0b4ae1237da0e17b4b" +} diff --git a/backend/.sqlx/query-7f772ceace10008d7d40afd331a585bfa19b70315840585c81b8e7a3911ab5e7.json b/backend/.sqlx/query-7f772ceace10008d7d40afd331a585bfa19b70315840585c81b8e7a3911ab5e7.json new file mode 100644 index 0000000000..1d7b5ddba5 --- /dev/null +++ b/backend/.sqlx/query-7f772ceace10008d7d40afd331a585bfa19b70315840585c81b8e7a3911ab5e7.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "\n UPDATE workspace_settings\n SET git_app_installations = COALESCE(\n (\n SELECT jsonb_agg(elem)\n FROM jsonb_array_elements(git_app_installations) AS elem\n WHERE (elem->>'installation_id')::bigint != $1\n ),\n '[]'::jsonb\n )\n WHERE workspace_id = $2;\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int8", + "Text" + ] + }, + "nullable": [] + }, + "hash": "7f772ceace10008d7d40afd331a585bfa19b70315840585c81b8e7a3911ab5e7" +} diff --git a/backend/.sqlx/query-7fa8fca5b5cdf147da0cf8ae5a0d9fdee37dd8df66974c8d33f58a88b1bca537.json b/backend/.sqlx/query-7fa8fca5b5cdf147da0cf8ae5a0d9fdee37dd8df66974c8d33f58a88b1bca537.json new file mode 100644 index 0000000000..e4aa1f4f24 --- /dev/null +++ b/backend/.sqlx/query-7fa8fca5b5cdf147da0cf8ae5a0d9fdee37dd8df66974c8d33f58a88b1bca537.json @@ -0,0 +1,12 @@ +{ + "db_name": "PostgreSQL", + "query": "DELETE FROM healthchecks WHERE check_type LIKE 'min_alive_workers_%' AND created_at < NOW() - INTERVAL '48 hours'", + "describe": { + "columns": [], + "parameters": { + "Left": [] + }, + "nullable": [] + }, + "hash": "7fa8fca5b5cdf147da0cf8ae5a0d9fdee37dd8df66974c8d33f58a88b1bca537" +} diff --git a/backend/.sqlx/query-8490024b96aa689d3c1bc5cbf94fcd8c5491732818404fee2397f00cccee0ad3.json b/backend/.sqlx/query-8490024b96aa689d3c1bc5cbf94fcd8c5491732818404fee2397f00cccee0ad3.json new file mode 100644 index 0000000000..9700ab141f --- /dev/null +++ b/backend/.sqlx/query-8490024b96aa689d3c1bc5cbf94fcd8c5491732818404fee2397f00cccee0ad3.json @@ -0,0 +1,34 @@ +{ + "db_name": "PostgreSQL", + "query": "\n UPDATE \n sqs_trigger \n SET \n aws_auth_resource_type = $1,\n aws_resource_path = $2,\n queue_url = $3,\n message_attributes = $4, \n is_flow = $5, \n edited_by = $6, \n email = $7,\n script_path = $8,\n path = $9,\n edited_at = now(), \n error = NULL,\n server_id = NULL\n WHERE \n workspace_id = $10 AND \n path = $11\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + { + "Custom": { + "name": "aws_auth_resource_type", + "kind": { + "Enum": [ + "oidc", + "credentials" + ] + } + } + }, + "Varchar", + "Varchar", + "TextArray", + "Bool", + "Varchar", + "Varchar", + "Varchar", + "Varchar", + "Text", + "Text" + ] + }, + "nullable": [] + }, + "hash": "8490024b96aa689d3c1bc5cbf94fcd8c5491732818404fee2397f00cccee0ad3" +} diff --git a/backend/.sqlx/query-84d048ea323758842dc564c700b524d1a5b196a7b77afcb02f46b84b22088bbf.json b/backend/.sqlx/query-84d048ea323758842dc564c700b524d1a5b196a7b77afcb02f46b84b22088bbf.json new file mode 100644 index 0000000000..e4473b360c --- /dev/null +++ b/backend/.sqlx/query-84d048ea323758842dc564c700b524d1a5b196a7b77afcb02f46b84b22088bbf.json @@ -0,0 +1,20 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT value FROM global_settings WHERE name = 'teams'", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "value", + "type_info": "Jsonb" + } + ], + "parameters": { + "Left": [] + }, + "nullable": [ + false + ] + }, + "hash": "84d048ea323758842dc564c700b524d1a5b196a7b77afcb02f46b84b22088bbf" +} diff --git a/backend/.sqlx/query-85844054136d7bc9669d6b340ca1a955cb86557032cfbdbf4022bf1ad3230ae7.json b/backend/.sqlx/query-85844054136d7bc9669d6b340ca1a955cb86557032cfbdbf4022bf1ad3230ae7.json new file mode 100644 index 0000000000..3381f8593c --- /dev/null +++ b/backend/.sqlx/query-85844054136d7bc9669d6b340ca1a955cb86557032cfbdbf4022bf1ad3230ae7.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "DELETE FROM email_to_igroup WHERE email = $1", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [] + }, + "hash": "85844054136d7bc9669d6b340ca1a955cb86557032cfbdbf4022bf1ad3230ae7" +} diff --git a/backend/.sqlx/query-85c116da4a43a5ade37bb9ab2660d206b722ec4192368599c3a5027f50a89c80.json b/backend/.sqlx/query-85c116da4a43a5ade37bb9ab2660d206b722ec4192368599c3a5027f50a89c80.json new file mode 100644 index 0000000000..a54cdf49ab --- /dev/null +++ b/backend/.sqlx/query-85c116da4a43a5ade37bb9ab2660d206b722ec4192368599c3a5027f50a89c80.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO global_settings (name, value) VALUES ('rsa_keys', $1)", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Jsonb" + ] + }, + "nullable": [] + }, + "hash": "85c116da4a43a5ade37bb9ab2660d206b722ec4192368599c3a5027f50a89c80" +} diff --git a/backend/.sqlx/query-8667efb13d6bd7ef1858d7d9fc7ccb9c3e8169e4080ee28f6f40c729d06cbb55.json b/backend/.sqlx/query-8667efb13d6bd7ef1858d7d9fc7ccb9c3e8169e4080ee28f6f40c729d06cbb55.json new file mode 100644 index 0000000000..3a1412b781 --- /dev/null +++ b/backend/.sqlx/query-8667efb13d6bd7ef1858d7d9fc7ccb9c3e8169e4080ee28f6f40c729d06cbb55.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE instance_group SET scim_display_name = $1, name = $2 where id = $3", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Varchar", + "Text" + ] + }, + "nullable": [] + }, + "hash": "8667efb13d6bd7ef1858d7d9fc7ccb9c3e8169e4080ee28f6f40c729d06cbb55" +} diff --git a/backend/.sqlx/query-870b12a46f26c9e29889dd28a5c7832c5a674a5553674fd9762c981e0d03bb57.json b/backend/.sqlx/query-870b12a46f26c9e29889dd28a5c7832c5a674a5553674fd9762c981e0d03bb57.json new file mode 100644 index 0000000000..f5d544c5aa --- /dev/null +++ b/backend/.sqlx/query-870b12a46f26c9e29889dd28a5c7832c5a674a5553674fd9762c981e0d03bb57.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "DELETE FROM nats_trigger WHERE workspace_id = $1 AND path = $2", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [] + }, + "hash": "870b12a46f26c9e29889dd28a5c7832c5a674a5553674fd9762c981e0d03bb57" +} diff --git a/backend/.sqlx/query-884039108b98daa6279975e65348e460f99a0d2155fe2ff7b1d2840c5d9b76d0.json b/backend/.sqlx/query-884039108b98daa6279975e65348e460f99a0d2155fe2ff7b1d2840c5d9b76d0.json new file mode 100644 index 0000000000..64048e92f8 --- /dev/null +++ b/backend/.sqlx/query-884039108b98daa6279975e65348e460f99a0d2155fe2ff7b1d2840c5d9b76d0.json @@ -0,0 +1,23 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT elem\n FROM workspace_settings,\n LATERAL jsonb_array_elements(git_app_installations) AS elem\n WHERE workspace_id = $1\n AND (elem->>'installation_id')::bigint = $2\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "elem", + "type_info": "Jsonb" + } + ], + "parameters": { + "Left": [ + "Text", + "Int8" + ] + }, + "nullable": [ + null + ] + }, + "hash": "884039108b98daa6279975e65348e460f99a0d2155fe2ff7b1d2840c5d9b76d0" +} diff --git a/backend/.sqlx/query-88b7589a6416da8be4b26af3bf30fcfcd6aeae7bc5a37e9a735cabbe2691c570.json b/backend/.sqlx/query-88b7589a6416da8be4b26af3bf30fcfcd6aeae7bc5a37e9a735cabbe2691c570.json new file mode 100644 index 0000000000..ba27530279 --- /dev/null +++ b/backend/.sqlx/query-88b7589a6416da8be4b26af3bf30fcfcd6aeae7bc5a37e9a735cabbe2691c570.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT login_type::TEXT FROM password WHERE email = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "login_type", + "type_info": "Text" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + null + ] + }, + "hash": "88b7589a6416da8be4b26af3bf30fcfcd6aeae7bc5a37e9a735cabbe2691c570" +} diff --git a/backend/.sqlx/query-8d207cc9ed101ff116b617d25a94633c1531170ded1fdf09114718b941f5e1db.json b/backend/.sqlx/query-8d207cc9ed101ff116b617d25a94633c1531170ded1fdf09114718b941f5e1db.json new file mode 100644 index 0000000000..d0b96444ee --- /dev/null +++ b/backend/.sqlx/query-8d207cc9ed101ff116b617d25a94633c1531170ded1fdf09114718b941f5e1db.json @@ -0,0 +1,65 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT\n hostname,\n mode::text,\n worker_group,\n log_ts,\n file_path,\n ok_lines,\n err_lines,\n json_fmt\n FROM log_file\n WHERE log_ts > NOW() - make_interval(secs => $1)\n ORDER BY log_ts ASC LIMIT $2", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "hostname", + "type_info": "Varchar" + }, + { + "ordinal": 1, + "name": "mode", + "type_info": "Text" + }, + { + "ordinal": 2, + "name": "worker_group", + "type_info": "Varchar" + }, + { + "ordinal": 3, + "name": "log_ts", + "type_info": "Timestamp" + }, + { + "ordinal": 4, + "name": "file_path", + "type_info": "Varchar" + }, + { + "ordinal": 5, + "name": "ok_lines", + "type_info": "Int8" + }, + { + "ordinal": 6, + "name": "err_lines", + "type_info": "Int8" + }, + { + "ordinal": 7, + "name": "json_fmt", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [ + "Float8", + "Int8" + ] + }, + "nullable": [ + false, + null, + true, + false, + false, + true, + true, + true + ] + }, + "hash": "8d207cc9ed101ff116b617d25a94633c1531170ded1fdf09114718b941f5e1db" +} diff --git a/backend/.sqlx/query-8dd1de2aca8c6c9ffaddd2c41c3a614a50fa5fd03c2d3b9a41bd85a7f156345e.json b/backend/.sqlx/query-8dd1de2aca8c6c9ffaddd2c41c3a614a50fa5fd03c2d3b9a41bd85a7f156345e.json new file mode 100644 index 0000000000..c1a63e668f --- /dev/null +++ b/backend/.sqlx/query-8dd1de2aca8c6c9ffaddd2c41c3a614a50fa5fd03c2d3b9a41bd85a7f156345e.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT count(*) \n FROM worker_ping \n WHERE worker_group LIKE $1 AND ping_at > now() - INTERVAL '2 minutes'", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "count", + "type_info": "Int8" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + null + ] + }, + "hash": "8dd1de2aca8c6c9ffaddd2c41c3a614a50fa5fd03c2d3b9a41bd85a7f156345e" +} diff --git a/backend/.sqlx/query-900ac59515e4283f4b57516210575dfe92f74a7220ed69e61899a6e0f053d9cd.json b/backend/.sqlx/query-900ac59515e4283f4b57516210575dfe92f74a7220ed69e61899a6e0f053d9cd.json new file mode 100644 index 0000000000..0bcd4d447f --- /dev/null +++ b/backend/.sqlx/query-900ac59515e4283f4b57516210575dfe92f74a7220ed69e61899a6e0f053d9cd.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO concurrency_locks (id, last_locked_at) VALUES ($1, NOW()) ON CONFLICT (id) DO NOTHING", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar" + ] + }, + "nullable": [] + }, + "hash": "900ac59515e4283f4b57516210575dfe92f74a7220ed69e61899a6e0f053d9cd" +} diff --git a/backend/.sqlx/query-902961f15b8c7603dddf2933b5fc7cdd6e5af3545835763ccb29cdf3ac273ef0.json b/backend/.sqlx/query-902961f15b8c7603dddf2933b5fc7cdd6e5af3545835763ccb29cdf3ac273ef0.json new file mode 100644 index 0000000000..c4e3c52c98 --- /dev/null +++ b/backend/.sqlx/query-902961f15b8c7603dddf2933b5fc7cdd6e5af3545835763ccb29cdf3ac273ef0.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE password SET password_hash = $1 WHERE email = $2", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Text" + ] + }, + "nullable": [] + }, + "hash": "902961f15b8c7603dddf2933b5fc7cdd6e5af3545835763ccb29cdf3ac273ef0" +} diff --git a/backend/.sqlx/query-92c2b66eb6287449f5f8cc9f8d1329f748006ab131489d2fcac21d32641bb633.json b/backend/.sqlx/query-92c2b66eb6287449f5f8cc9f8d1329f748006ab131489d2fcac21d32641bb633.json new file mode 100644 index 0000000000..14d37809d5 --- /dev/null +++ b/backend/.sqlx/query-92c2b66eb6287449f5f8cc9f8d1329f748006ab131489d2fcac21d32641bb633.json @@ -0,0 +1,24 @@ +{ + "db_name": "PostgreSQL", + "query": "\n UPDATE \n gcp_trigger \n SET \n server_id = $1, \n last_server_ping = now(),\n error = 'Connecting...'\n WHERE \n enabled IS TRUE \n AND workspace_id = $2 \n AND path = $3 \n AND (last_server_ping IS NULL \n OR last_server_ping < now() - INTERVAL '15 seconds'\n ) \n RETURNING true\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "?column?", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [ + "Varchar", + "Text", + "Text" + ] + }, + "nullable": [ + null + ] + }, + "hash": "92c2b66eb6287449f5f8cc9f8d1329f748006ab131489d2fcac21d32641bb633" +} diff --git a/backend/.sqlx/query-93d64930c74ccb1abdc9bda8287540a354f8eec49913aaf07fc1e737e7c93330.json b/backend/.sqlx/query-93d64930c74ccb1abdc9bda8287540a354f8eec49913aaf07fc1e737e7c93330.json new file mode 100644 index 0000000000..5b30dd2cbd --- /dev/null +++ b/backend/.sqlx/query-93d64930c74ccb1abdc9bda8287540a354f8eec49913aaf07fc1e737e7c93330.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE capture_config SET last_server_ping = NULL WHERE workspace_id = $1 AND path = $2 AND is_flow = $3 AND trigger_kind = 'nats' AND server_id IS NULL", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Text", + "Bool" + ] + }, + "nullable": [] + }, + "hash": "93d64930c74ccb1abdc9bda8287540a354f8eec49913aaf07fc1e737e7c93330" +} diff --git a/backend/.sqlx/query-9969f99d81b2fa581a1da8f7cc3722f60cbd41814f8a17006c82f48888f05bb6.json b/backend/.sqlx/query-9969f99d81b2fa581a1da8f7cc3722f60cbd41814f8a17006c82f48888f05bb6.json new file mode 100644 index 0000000000..5a8a85449d --- /dev/null +++ b/backend/.sqlx/query-9969f99d81b2fa581a1da8f7cc3722f60cbd41814f8a17006c82f48888f05bb6.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "DELETE FROM pending_user WHERE email = $1", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [] + }, + "hash": "9969f99d81b2fa581a1da8f7cc3722f60cbd41814f8a17006c82f48888f05bb6" +} diff --git a/backend/.sqlx/query-999edc6f54a9efb6dc6237992dad59f418ed6fc2a98ddb9bbc33dce5f029d904.json b/backend/.sqlx/query-999edc6f54a9efb6dc6237992dad59f418ed6fc2a98ddb9bbc33dce5f029d904.json new file mode 100644 index 0000000000..8748572af7 --- /dev/null +++ b/backend/.sqlx/query-999edc6f54a9efb6dc6237992dad59f418ed6fc2a98ddb9bbc33dce5f029d904.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "\n UPDATE \n gcp_trigger \n SET\n last_server_ping = NULL \n WHERE \n workspace_id = $1 \n AND path = $2 \n AND server_id IS NULL", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [] + }, + "hash": "999edc6f54a9efb6dc6237992dad59f418ed6fc2a98ddb9bbc33dce5f029d904" +} diff --git a/backend/.sqlx/query-9c72b2962d0919353cfe5af710e857d432dff44e343b8f0610208d42ff5afd14.json b/backend/.sqlx/query-9c72b2962d0919353cfe5af710e857d432dff44e343b8f0610208d42ff5afd14.json new file mode 100644 index 0000000000..a2f8a647c5 --- /dev/null +++ b/backend/.sqlx/query-9c72b2962d0919353cfe5af710e857d432dff44e343b8f0610208d42ff5afd14.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO global_settings (name, value)\n VALUES ('teams', $1)\n ON CONFLICT (name) DO UPDATE SET value = $1", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Jsonb" + ] + }, + "nullable": [] + }, + "hash": "9c72b2962d0919353cfe5af710e857d432dff44e343b8f0610208d42ff5afd14" +} diff --git a/backend/.sqlx/query-9e2810312302b36d3b4d761481c00296ee84c9536228496e19b4ec5df1781bc5.json b/backend/.sqlx/query-9e2810312302b36d3b4d761481c00296ee84c9536228496e19b4ec5df1781bc5.json new file mode 100644 index 0000000000..70df593afe --- /dev/null +++ b/backend/.sqlx/query-9e2810312302b36d3b4d761481c00296ee84c9536228496e19b4ec5df1781bc5.json @@ -0,0 +1,29 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT COUNT(*) as count, \n MIN(scheduled_for) as oldest_job\n FROM v2_job_queue \n WHERE tag = $1 \n AND scheduled_for <= NOW() - $2::interval \n AND running = false\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "count", + "type_info": "Int8" + }, + { + "ordinal": 1, + "name": "oldest_job", + "type_info": "Timestamptz" + } + ], + "parameters": { + "Left": [ + "Text", + "Interval" + ] + }, + "nullable": [ + null, + null + ] + }, + "hash": "9e2810312302b36d3b4d761481c00296ee84c9536228496e19b4ec5df1781bc5" +} diff --git a/backend/.sqlx/query-9f1f388924176dbe3dea882e0c62728a82ba256029096812dd705ccb1a552cfe.json b/backend/.sqlx/query-9f1f388924176dbe3dea882e0c62728a82ba256029096812dd705ccb1a552cfe.json new file mode 100644 index 0000000000..51ddd8af63 --- /dev/null +++ b/backend/.sqlx/query-9f1f388924176dbe3dea882e0c62728a82ba256029096812dd705ccb1a552cfe.json @@ -0,0 +1,19 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO variable\n (workspace_id, path, value, is_secret, account, is_oauth)\n VALUES ($1, $2, $3, $4, $5, $6)\n ON CONFLICT (workspace_id, path) DO UPDATE SET value = $3", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Varchar", + "Varchar", + "Bool", + "Int4", + "Bool" + ] + }, + "nullable": [] + }, + "hash": "9f1f388924176dbe3dea882e0c62728a82ba256029096812dd705ccb1a552cfe" +} diff --git a/backend/.sqlx/query-a15a4478d1249c9ae5cd5f2b755f8479986f1591bf545b8562109b6ce26578b0.json b/backend/.sqlx/query-a15a4478d1249c9ae5cd5f2b755f8479986f1591bf545b8562109b6ce26578b0.json new file mode 100644 index 0000000000..0099197b32 --- /dev/null +++ b/backend/.sqlx/query-a15a4478d1249c9ae5cd5f2b755f8479986f1591bf545b8562109b6ce26578b0.json @@ -0,0 +1,23 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT resource_type\n FROM resource\n WHERE resource.path = $1 AND resource.workspace_id = $2", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "resource_type", + "type_info": "Varchar" + } + ], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [ + false + ] + }, + "hash": "a15a4478d1249c9ae5cd5f2b755f8479986f1591bf545b8562109b6ce26578b0" +} diff --git a/backend/.sqlx/query-a59aac0bc593d99aedd14fd9606f11191590a12ea98a671e172b867306959884.json b/backend/.sqlx/query-a59aac0bc593d99aedd14fd9606f11191590a12ea98a671e172b867306959884.json new file mode 100644 index 0000000000..987c3d8633 --- /dev/null +++ b/backend/.sqlx/query-a59aac0bc593d99aedd14fd9606f11191590a12ea98a671e172b867306959884.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO password (email, login_type, verified, username) VALUES ($1, 'saml', true, $2) ON CONFLICT DO NOTHING", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Varchar" + ] + }, + "nullable": [] + }, + "hash": "a59aac0bc593d99aedd14fd9606f11191590a12ea98a671e172b867306959884" +} diff --git a/backend/.sqlx/query-a5fbef9db2308920ea26f6154f0f3490f88ced636c9ebdecba2205f964b1d0f1.json b/backend/.sqlx/query-a5fbef9db2308920ea26f6154f0f3490f88ced636c9ebdecba2205f964b1d0f1.json new file mode 100644 index 0000000000..219558ac68 --- /dev/null +++ b/backend/.sqlx/query-a5fbef9db2308920ea26f6154f0f3490f88ced636c9ebdecba2205f964b1d0f1.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "\n UPDATE \n sqs_trigger \n SET\n last_server_ping = NULL \n WHERE \n workspace_id = $1 \n AND path = $2 \n AND server_id IS NULL", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [] + }, + "hash": "a5fbef9db2308920ea26f6154f0f3490f88ced636c9ebdecba2205f964b1d0f1" +} diff --git a/backend/.sqlx/query-a670b88ea83d69997f1b70873b927bfe0790d5e1c347e5b15835c8996c039cd1.json b/backend/.sqlx/query-a670b88ea83d69997f1b70873b927bfe0790d5e1c347e5b15835c8996c039cd1.json new file mode 100644 index 0000000000..35fe3aec91 --- /dev/null +++ b/backend/.sqlx/query-a670b88ea83d69997f1b70873b927bfe0790d5e1c347e5b15835c8996c039cd1.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT EXISTS (SELECT 1 FROM password WHERE email = $1)", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "exists", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + null + ] + }, + "hash": "a670b88ea83d69997f1b70873b927bfe0790d5e1c347e5b15835c8996c039cd1" +} diff --git a/backend/.sqlx/query-a7ffc5b983d365159ef379ec6a2ab0dc7217d1b3f86f362c213982984d2cf652.json b/backend/.sqlx/query-a7ffc5b983d365159ef379ec6a2ab0dc7217d1b3f86f362c213982984d2cf652.json new file mode 100644 index 0000000000..03b05af6fb --- /dev/null +++ b/backend/.sqlx/query-a7ffc5b983d365159ef379ec6a2ab0dc7217d1b3f86f362c213982984d2cf652.json @@ -0,0 +1,26 @@ +{ + "db_name": "PostgreSQL", + "query": "\n UPDATE \n capture_config \n SET \n last_server_ping = now(), \n error = $1 \n WHERE \n workspace_id = $2 AND \n path = $3 AND \n is_flow = $4 AND \n trigger_kind = 'gcp' AND \n server_id = $5 AND \n last_client_ping > NOW() - INTERVAL '10 seconds' \n RETURNING 1\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "?column?", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Text", + "Text", + "Text", + "Bool", + "Text" + ] + }, + "nullable": [ + null + ] + }, + "hash": "a7ffc5b983d365159ef379ec6a2ab0dc7217d1b3f86f362c213982984d2cf652" +} diff --git a/backend/.sqlx/query-ad3b0176e3d41a0c1d79a8eb59da2a9cc4fee3473b3f6ea69f397d91e9356ba1.json b/backend/.sqlx/query-ad3b0176e3d41a0c1d79a8eb59da2a9cc4fee3473b3f6ea69f397d91e9356ba1.json new file mode 100644 index 0000000000..936365c8d0 --- /dev/null +++ b/backend/.sqlx/query-ad3b0176e3d41a0c1d79a8eb59da2a9cc4fee3473b3f6ea69f397d91e9356ba1.json @@ -0,0 +1,19 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO folder\n (workspace_id, name, display_name, owners, extra_perms, created_by, edited_at)\n VALUES ($1, $2, $3, $4, $5, $6, now()) ON CONFLICT DO NOTHING", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Varchar", + "Varchar", + "VarcharArray", + "Jsonb", + "Varchar" + ] + }, + "nullable": [] + }, + "hash": "ad3b0176e3d41a0c1d79a8eb59da2a9cc4fee3473b3f6ea69f397d91e9356ba1" +} diff --git a/backend/.sqlx/query-ad42118ccf6a9d2d1e072c4df064ddf964a5b3cd088fc162d0d8222325d4a5ea.json b/backend/.sqlx/query-ad42118ccf6a9d2d1e072c4df064ddf964a5b3cd088fc162d0d8222325d4a5ea.json new file mode 100644 index 0000000000..c43c2a2a65 --- /dev/null +++ b/backend/.sqlx/query-ad42118ccf6a9d2d1e072c4df064ddf964a5b3cd088fc162d0d8222325d4a5ea.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE healthchecks SET healthy = true WHERE check_type = $1", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [] + }, + "hash": "ad42118ccf6a9d2d1e072c4df064ddf964a5b3cd088fc162d0d8222325d4a5ea" +} diff --git a/backend/.sqlx/query-add48c8e7c6fa2c549ad6293cbee22889d35e919d3267c1d2a265d868fa8a7d1.json b/backend/.sqlx/query-add48c8e7c6fa2c549ad6293cbee22889d35e919d3267c1d2a265d868fa8a7d1.json new file mode 100644 index 0000000000..0468efc99f --- /dev/null +++ b/backend/.sqlx/query-add48c8e7c6fa2c549ad6293cbee22889d35e919d3267c1d2a265d868fa8a7d1.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE nats_trigger SET enabled = FALSE, error = $1, server_id = NULL, last_server_ping = NULL WHERE workspace_id = $2 AND path = $3", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Text", + "Text" + ] + }, + "nullable": [] + }, + "hash": "add48c8e7c6fa2c549ad6293cbee22889d35e919d3267c1d2a265d868fa8a7d1" +} diff --git a/backend/.sqlx/query-b223c56f55a138abef8c8cb2df40472a87b7e267a143709728b09ac063c33b96.json b/backend/.sqlx/query-b223c56f55a138abef8c8cb2df40472a87b7e267a143709728b09ac063c33b96.json new file mode 100644 index 0000000000..f542ec075a --- /dev/null +++ b/backend/.sqlx/query-b223c56f55a138abef8c8cb2df40472a87b7e267a143709728b09ac063c33b96.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE capture_config SET last_server_ping = NULL WHERE workspace_id = $1 AND path = $2 AND is_flow = $3 AND trigger_kind = 'kafka' AND server_id IS NULL", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Text", + "Bool" + ] + }, + "nullable": [] + }, + "hash": "b223c56f55a138abef8c8cb2df40472a87b7e267a143709728b09ac063c33b96" +} diff --git a/backend/.sqlx/query-b386d320f9fe1d569a16e6626b723b4376a93342702856da2ac70f6bbfc7933e.json b/backend/.sqlx/query-b386d320f9fe1d569a16e6626b723b4376a93342702856da2ac70f6bbfc7933e.json new file mode 100644 index 0000000000..13ac3c15ea --- /dev/null +++ b/backend/.sqlx/query-b386d320f9fe1d569a16e6626b723b4376a93342702856da2ac70f6bbfc7933e.json @@ -0,0 +1,23 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT EXISTS(\n SELECT \n 1 \n FROM \n sqs_trigger \n WHERE \n path = $1 AND \n workspace_id = $2\n )", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "exists", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [ + null + ] + }, + "hash": "b386d320f9fe1d569a16e6626b723b4376a93342702856da2ac70f6bbfc7933e" +} diff --git a/backend/.sqlx/query-b4d48c820bf41619bffa8f62367e98369e1d93514e1618723a34bf96080d4ebc.json b/backend/.sqlx/query-b4d48c820bf41619bffa8f62367e98369e1d93514e1618723a34bf96080d4ebc.json new file mode 100644 index 0000000000..0efca7e867 --- /dev/null +++ b/backend/.sqlx/query-b4d48c820bf41619bffa8f62367e98369e1d93514e1618723a34bf96080d4ebc.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "\n UPDATE workspace_settings\n SET git_app_installations = (\n SELECT jsonb_agg(\n CASE\n WHEN (elem->>'installation_id')::bigint = $2 THEN $1::jsonb\n ELSE elem\n END\n )\n FROM jsonb_array_elements(git_app_installations) AS elem\n )\n WHERE workspace_id = $3\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Jsonb", + "Int8", + "Text" + ] + }, + "nullable": [] + }, + "hash": "b4d48c820bf41619bffa8f62367e98369e1d93514e1618723a34bf96080d4ebc" +} diff --git a/backend/.sqlx/query-b5c839baab25c4dcdd503d380cf7a886242277cd50555f20b2e22e13942d2a3a.json b/backend/.sqlx/query-b5c839baab25c4dcdd503d380cf7a886242277cd50555f20b2e22e13942d2a3a.json new file mode 100644 index 0000000000..ba9f3814e8 --- /dev/null +++ b/backend/.sqlx/query-b5c839baab25c4dcdd503d380cf7a886242277cd50555f20b2e22e13942d2a3a.json @@ -0,0 +1,65 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT\n hostname,\n mode::text,\n worker_group,\n log_ts,\n file_path,\n ok_lines,\n err_lines,\n json_fmt\n FROM log_file\n WHERE log_ts > $1\n ORDER BY log_ts ASC LIMIT $2", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "hostname", + "type_info": "Varchar" + }, + { + "ordinal": 1, + "name": "mode", + "type_info": "Text" + }, + { + "ordinal": 2, + "name": "worker_group", + "type_info": "Varchar" + }, + { + "ordinal": 3, + "name": "log_ts", + "type_info": "Timestamp" + }, + { + "ordinal": 4, + "name": "file_path", + "type_info": "Varchar" + }, + { + "ordinal": 5, + "name": "ok_lines", + "type_info": "Int8" + }, + { + "ordinal": 6, + "name": "err_lines", + "type_info": "Int8" + }, + { + "ordinal": 7, + "name": "json_fmt", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [ + "Timestamp", + "Int8" + ] + }, + "nullable": [ + false, + null, + true, + false, + false, + true, + true, + true + ] + }, + "hash": "b5c839baab25c4dcdd503d380cf7a886242277cd50555f20b2e22e13942d2a3a" +} diff --git a/backend/.sqlx/query-b6ddadfa8d23db666206f907a6390b824af5260a3b1ab3355ac613f1f83fc349.json b/backend/.sqlx/query-b6ddadfa8d23db666206f907a6390b824af5260a3b1ab3355ac613f1f83fc349.json new file mode 100644 index 0000000000..c681870c72 --- /dev/null +++ b/backend/.sqlx/query-b6ddadfa8d23db666206f907a6390b824af5260a3b1ab3355ac613f1f83fc349.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO workspace_invite\n (workspace_id, email, is_admin, operator)\n VALUES ($1, $2, false, $3)\n ON CONFLICT DO NOTHING", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Varchar", + "Bool" + ] + }, + "nullable": [] + }, + "hash": "b6ddadfa8d23db666206f907a6390b824af5260a3b1ab3355ac613f1f83fc349" +} diff --git a/backend/.sqlx/query-b83e58972d8f8285eb604de94c3d363102f5f6705d6debb442a85126ed59d863.json b/backend/.sqlx/query-b83e58972d8f8285eb604de94c3d363102f5f6705d6debb442a85126ed59d863.json new file mode 100644 index 0000000000..7548983ecb --- /dev/null +++ b/backend/.sqlx/query-b83e58972d8f8285eb604de94c3d363102f5f6705d6debb442a85126ed59d863.json @@ -0,0 +1,18 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO deployment_metadata (workspace_id, path, app_version, callback_job_ids, deployment_msg) VALUES ($1, $2, $3, $4, $5)", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Varchar", + "Int8", + "UuidArray", + "Text" + ] + }, + "nullable": [] + }, + "hash": "b83e58972d8f8285eb604de94c3d363102f5f6705d6debb442a85126ed59d863" +} diff --git a/backend/.sqlx/query-b8490eea478c1fd279593a7ced86b4d21aa3bfe772e4d344e306a224ec2c8a01.json b/backend/.sqlx/query-b8490eea478c1fd279593a7ced86b4d21aa3bfe772e4d344e306a224ec2c8a01.json new file mode 100644 index 0000000000..15d17d5784 --- /dev/null +++ b/backend/.sqlx/query-b8490eea478c1fd279593a7ced86b4d21aa3bfe772e4d344e306a224ec2c8a01.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE password SET email = $1 WHERE email = $2", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Text" + ] + }, + "nullable": [] + }, + "hash": "b8490eea478c1fd279593a7ced86b4d21aa3bfe772e4d344e306a224ec2c8a01" +} diff --git a/backend/.sqlx/query-bb56e61c7cfb09c0a28fb3226dfe91704c70d9fe15eda18e6889adfd7496f80b.json b/backend/.sqlx/query-bb56e61c7cfb09c0a28fb3226dfe91704c70d9fe15eda18e6889adfd7496f80b.json new file mode 100644 index 0000000000..56bf2bf09a --- /dev/null +++ b/backend/.sqlx/query-bb56e61c7cfb09c0a28fb3226dfe91704c70d9fe15eda18e6889adfd7496f80b.json @@ -0,0 +1,23 @@ +{ + "db_name": "PostgreSQL", + "query": "DELETE FROM account WHERE workspace_id = $1 AND id = $2 RETURNING id", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Text", + "Int4" + ] + }, + "nullable": [ + false + ] + }, + "hash": "bb56e61c7cfb09c0a28fb3226dfe91704c70d9fe15eda18e6889adfd7496f80b" +} diff --git a/backend/.sqlx/query-bc0bedddcafad216c30c5061eef3f4ed8573cda89f655d6490d22f182e3f2f36.json b/backend/.sqlx/query-bc0bedddcafad216c30c5061eef3f4ed8573cda89f655d6490d22f182e3f2f36.json new file mode 100644 index 0000000000..2ccfd91e32 --- /dev/null +++ b/backend/.sqlx/query-bc0bedddcafad216c30c5061eef3f4ed8573cda89f655d6490d22f182e3f2f36.json @@ -0,0 +1,120 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT\n aws_auth_resource_type AS \"aws_auth_resource_type: _\",\n queue_url,\n aws_resource_path,\n message_attributes,\n workspace_id,\n path,\n script_path,\n is_flow,\n edited_by,\n email,\n edited_at,\n server_id,\n last_server_ping,\n extra_perms,\n error,\n enabled\n FROM\n sqs_trigger\n WHERE\n enabled IS TRUE\n AND (last_server_ping IS NULL OR\n last_server_ping < now() - interval '15 seconds'\n )\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "aws_auth_resource_type: _", + "type_info": { + "Custom": { + "name": "aws_auth_resource_type", + "kind": { + "Enum": [ + "oidc", + "credentials" + ] + } + } + } + }, + { + "ordinal": 1, + "name": "queue_url", + "type_info": "Varchar" + }, + { + "ordinal": 2, + "name": "aws_resource_path", + "type_info": "Varchar" + }, + { + "ordinal": 3, + "name": "message_attributes", + "type_info": "TextArray" + }, + { + "ordinal": 4, + "name": "workspace_id", + "type_info": "Varchar" + }, + { + "ordinal": 5, + "name": "path", + "type_info": "Varchar" + }, + { + "ordinal": 6, + "name": "script_path", + "type_info": "Varchar" + }, + { + "ordinal": 7, + "name": "is_flow", + "type_info": "Bool" + }, + { + "ordinal": 8, + "name": "edited_by", + "type_info": "Varchar" + }, + { + "ordinal": 9, + "name": "email", + "type_info": "Varchar" + }, + { + "ordinal": 10, + "name": "edited_at", + "type_info": "Timestamptz" + }, + { + "ordinal": 11, + "name": "server_id", + "type_info": "Varchar" + }, + { + "ordinal": 12, + "name": "last_server_ping", + "type_info": "Timestamptz" + }, + { + "ordinal": 13, + "name": "extra_perms", + "type_info": "Jsonb" + }, + { + "ordinal": 14, + "name": "error", + "type_info": "Text" + }, + { + "ordinal": 15, + "name": "enabled", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [] + }, + "nullable": [ + false, + false, + false, + true, + false, + false, + false, + false, + false, + false, + false, + true, + true, + true, + true, + false + ] + }, + "hash": "bc0bedddcafad216c30c5061eef3f4ed8573cda89f655d6490d22f182e3f2f36" +} diff --git a/backend/.sqlx/query-bd829646d08f68106211f97c75dce13b6fc7d35bbaf7f503dcc73ae48fd07489.json b/backend/.sqlx/query-bd829646d08f68106211f97c75dce13b6fc7d35bbaf7f503dcc73ae48fd07489.json new file mode 100644 index 0000000000..27a484a8eb --- /dev/null +++ b/backend/.sqlx/query-bd829646d08f68106211f97c75dce13b6fc7d35bbaf7f503dcc73ae48fd07489.json @@ -0,0 +1,17 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO instance_group (name, scim_display_name, id, external_id) VALUES ($1, $2, $3, $4) ON CONFLICT DO NOTHING", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Varchar", + "Varchar", + "Varchar" + ] + }, + "nullable": [] + }, + "hash": "bd829646d08f68106211f97c75dce13b6fc7d35bbaf7f503dcc73ae48fd07489" +} diff --git a/backend/.sqlx/query-c07c9276945663d062cf0ff5b3323be681a0e2cb07a457ea9aede2daeff551cc.json b/backend/.sqlx/query-c07c9276945663d062cf0ff5b3323be681a0e2cb07a457ea9aede2daeff551cc.json new file mode 100644 index 0000000000..dc7f552834 --- /dev/null +++ b/backend/.sqlx/query-c07c9276945663d062cf0ff5b3323be681a0e2cb07a457ea9aede2daeff551cc.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT customer_id FROM workspace_settings WHERE workspace_id = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "customer_id", + "type_info": "Varchar" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + true + ] + }, + "hash": "c07c9276945663d062cf0ff5b3323be681a0e2cb07a457ea9aede2daeff551cc" +} diff --git a/backend/.sqlx/query-c0e6dbce7a401b06e1bf45155c3f81572818177a6024e743b12f558b46edf74c.json b/backend/.sqlx/query-c0e6dbce7a401b06e1bf45155c3f81572818177a6024e743b12f558b46edf74c.json new file mode 100644 index 0000000000..e65e3cb60e --- /dev/null +++ b/backend/.sqlx/query-c0e6dbce7a401b06e1bf45155c3f81572818177a6024e743b12f558b46edf74c.json @@ -0,0 +1,50 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT\n path,\n is_flow,\n workspace_id,\n owner,\n email,\n trigger_config as \"trigger_config!: _\"\n FROM\n capture_config\n WHERE\n trigger_kind = 'gcp' AND\n last_client_ping > NOW() - INTERVAL '10 seconds' AND\n trigger_config IS NOT NULL AND\n trigger_config->>'delivery_type' IS DISTINCT FROM 'push' AND\n (last_server_ping IS NULL OR last_server_ping < now() - interval '15 seconds')\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "path", + "type_info": "Varchar" + }, + { + "ordinal": 1, + "name": "is_flow", + "type_info": "Bool" + }, + { + "ordinal": 2, + "name": "workspace_id", + "type_info": "Varchar" + }, + { + "ordinal": 3, + "name": "owner", + "type_info": "Varchar" + }, + { + "ordinal": 4, + "name": "email", + "type_info": "Varchar" + }, + { + "ordinal": 5, + "name": "trigger_config!: _", + "type_info": "Jsonb" + } + ], + "parameters": { + "Left": [] + }, + "nullable": [ + false, + false, + false, + false, + false, + true + ] + }, + "hash": "c0e6dbce7a401b06e1bf45155c3f81572818177a6024e743b12f558b46edf74c" +} diff --git a/backend/.sqlx/query-c19a60a9dc3f95af218baf40c62f14572ac204cfe377166aa1d91cf58f731f50.json b/backend/.sqlx/query-c19a60a9dc3f95af218baf40c62f14572ac204cfe377166aa1d91cf58f731f50.json new file mode 100644 index 0000000000..65cc991931 --- /dev/null +++ b/backend/.sqlx/query-c19a60a9dc3f95af218baf40c62f14572ac204cfe377166aa1d91cf58f731f50.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "\n DELETE \n FROM \n gcp_trigger \n WHERE \n workspace_id = $1 AND \n path = $2\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [] + }, + "hash": "c19a60a9dc3f95af218baf40c62f14572ac204cfe377166aa1d91cf58f731f50" +} diff --git a/backend/.sqlx/query-c1ceb03e0eafd2e494c06cef1ec96f78c2cfd42ed7d1ca6cfd35288b561120db.json b/backend/.sqlx/query-c1ceb03e0eafd2e494c06cef1ec96f78c2cfd42ed7d1ca6cfd35288b561120db.json new file mode 100644 index 0000000000..d1a89a6ad6 --- /dev/null +++ b/backend/.sqlx/query-c1ceb03e0eafd2e494c06cef1ec96f78c2cfd42ed7d1ca6cfd35288b561120db.json @@ -0,0 +1,28 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT healthy, created_at FROM healthchecks WHERE check_type = 'min_alive_workers_' || $1 AND created_at > NOW() - INTERVAL '24 hours' ORDER BY created_at DESC", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "healthy", + "type_info": "Bool" + }, + { + "ordinal": 1, + "name": "created_at", + "type_info": "Timestamptz" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + false, + false + ] + }, + "hash": "c1ceb03e0eafd2e494c06cef1ec96f78c2cfd42ed7d1ca6cfd35288b561120db" +} diff --git a/backend/.sqlx/query-c4e0f3eab227a798d9cd7478db50a7c1a588e69c2c8d9a1def9276ba326453d2.json b/backend/.sqlx/query-c4e0f3eab227a798d9cd7478db50a7c1a588e69c2c8d9a1def9276ba326453d2.json new file mode 100644 index 0000000000..bd16dab3bf --- /dev/null +++ b/backend/.sqlx/query-c4e0f3eab227a798d9cd7478db50a7c1a588e69c2c8d9a1def9276ba326453d2.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO cloud_workspace_settings (workspace_id, threshold_alert_amount) VALUES ($1, $2) ON CONFLICT (workspace_id) DO UPDATE SET threshold_alert_amount = $2, last_alert_sent = NULL", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Int4" + ] + }, + "nullable": [] + }, + "hash": "c4e0f3eab227a798d9cd7478db50a7c1a588e69c2c8d9a1def9276ba326453d2" +} diff --git a/backend/.sqlx/query-c4e1873bfc7b905e7299a021f4baa2a97e95f4797c5e11f37822e19828422b7e.json b/backend/.sqlx/query-c4e1873bfc7b905e7299a021f4baa2a97e95f4797c5e11f37822e19828422b7e.json new file mode 100644 index 0000000000..d3c16a5275 --- /dev/null +++ b/backend/.sqlx/query-c4e1873bfc7b905e7299a021f4baa2a97e95f4797c5e11f37822e19828422b7e.json @@ -0,0 +1,23 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE concurrency_locks SET last_locked_at = NOW() WHERE id = $1 AND last_locked_at < NOW() - INTERVAL '1 second' * $2 RETURNING 1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "?column?", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Text", + "Float8" + ] + }, + "nullable": [ + null + ] + }, + "hash": "c4e1873bfc7b905e7299a021f4baa2a97e95f4797c5e11f37822e19828422b7e" +} diff --git a/backend/.sqlx/query-c87db5bfb559c912e35415c9945009041a5f5a03eaf03fe6bf27eed406640b6a.json b/backend/.sqlx/query-c87db5bfb559c912e35415c9945009041a5f5a03eaf03fe6bf27eed406640b6a.json new file mode 100644 index 0000000000..3facb38868 --- /dev/null +++ b/backend/.sqlx/query-c87db5bfb559c912e35415c9945009041a5f5a03eaf03fe6bf27eed406640b6a.json @@ -0,0 +1,20 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT value->>'private_key' FROM global_settings WHERE name = 'rsa_keys'", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "?column?", + "type_info": "Text" + } + ], + "parameters": { + "Left": [] + }, + "nullable": [ + null + ] + }, + "hash": "c87db5bfb559c912e35415c9945009041a5f5a03eaf03fe6bf27eed406640b6a" +} diff --git a/backend/.sqlx/query-cac594031a21b4806de9c4616317d3541522ef9712a83ecff7bd8b5f6e870748.json b/backend/.sqlx/query-cac594031a21b4806de9c4616317d3541522ef9712a83ecff7bd8b5f6e870748.json new file mode 100644 index 0000000000..3a1add0bef --- /dev/null +++ b/backend/.sqlx/query-cac594031a21b4806de9c4616317d3541522ef9712a83ecff7bd8b5f6e870748.json @@ -0,0 +1,17 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE account SET refresh_token = $1, expires_at = $2 WHERE workspace_id = $3 AND id = $4", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Timestamptz", + "Text", + "Int4" + ] + }, + "nullable": [] + }, + "hash": "cac594031a21b4806de9c4616317d3541522ef9712a83ecff7bd8b5f6e870748" +} diff --git a/backend/.sqlx/query-cbb93da0b7719a27d2ae1ec0f653322cae965dc5d8ebc98f69d5922fa1192561.json b/backend/.sqlx/query-cbb93da0b7719a27d2ae1ec0f653322cae965dc5d8ebc98f69d5922fa1192561.json new file mode 100644 index 0000000000..684e857290 --- /dev/null +++ b/backend/.sqlx/query-cbb93da0b7719a27d2ae1ec0f653322cae965dc5d8ebc98f69d5922fa1192561.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT COALESCE(\n (SELECT COUNT(*) FROM jsonb_object_keys(job_uuids)),\n 0\n )\n FROM concurrency_counter \n WHERE concurrency_id = $1\n FOR UPDATE", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "coalesce", + "type_info": "Int8" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + null + ] + }, + "hash": "cbb93da0b7719a27d2ae1ec0f653322cae965dc5d8ebc98f69d5922fa1192561" +} diff --git a/backend/.sqlx/query-cce991f582bc9d2ba28a5b2b41c679366bb07bc6a100727721a787160ac6910c.json b/backend/.sqlx/query-cce991f582bc9d2ba28a5b2b41c679366bb07bc6a100727721a787160ac6910c.json new file mode 100644 index 0000000000..f5d905a157 --- /dev/null +++ b/backend/.sqlx/query-cce991f582bc9d2ba28a5b2b41c679366bb07bc6a100727721a787160ac6910c.json @@ -0,0 +1,38 @@ +{ + "db_name": "PostgreSQL", + "query": "WITH active_users as (SELECT distinct username as email FROM audit WHERE timestamp > NOW() - INTERVAL '1 month' AND (operation = 'users.login' OR operation = 'oauth.login')),\n active_authors as (SELECT distinct email FROM usr WHERE usr.operator IS false AND email IN (SELECT email FROM active_users)),\n active_authors_agg as (SELECT array_agg(email) as authors FROM active_authors),\n active_ops_agg as (SELECT array_agg(email) as operators from active_users WHERE email NOT IN (SELECT email FROM active_authors))\n SELECT active_authors_agg.authors, active_ops_agg.operators, array_length(active_authors_agg.authors, 1) as author_count, array_length(active_ops_agg.operators, 1) as operator_count FROM active_authors_agg, active_ops_agg", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "authors", + "type_info": "VarcharArray" + }, + { + "ordinal": 1, + "name": "operators", + "type_info": "VarcharArray" + }, + { + "ordinal": 2, + "name": "author_count", + "type_info": "Int4" + }, + { + "ordinal": 3, + "name": "operator_count", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [] + }, + "nullable": [ + null, + null, + null, + null + ] + }, + "hash": "cce991f582bc9d2ba28a5b2b41c679366bb07bc6a100727721a787160ac6910c" +} diff --git a/backend/.sqlx/query-cd5d62d456b74237b941bc72ea8de007185263167bf1dfa2e469d319cc4da674.json b/backend/.sqlx/query-cd5d62d456b74237b941bc72ea8de007185263167bf1dfa2e469d319cc4da674.json new file mode 100644 index 0000000000..912b9a53de --- /dev/null +++ b/backend/.sqlx/query-cd5d62d456b74237b941bc72ea8de007185263167bf1dfa2e469d319cc4da674.json @@ -0,0 +1,24 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE nats_trigger SET server_id = $1, last_server_ping = now(), error = 'Connecting...' WHERE enabled IS TRUE AND workspace_id = $2 AND path = $3 AND (last_server_ping IS NULL OR last_server_ping < now() - interval '15 seconds') RETURNING true", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "?column?", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [ + "Varchar", + "Text", + "Text" + ] + }, + "nullable": [ + null + ] + }, + "hash": "cd5d62d456b74237b941bc72ea8de007185263167bf1dfa2e469d319cc4da674" +} diff --git a/backend/.sqlx/query-cecf1addc4aecb087a14786b2a9165895ca61ef042947c7314f66514d7f29edc.json b/backend/.sqlx/query-cecf1addc4aecb087a14786b2a9165895ca61ef042947c7314f66514d7f29edc.json new file mode 100644 index 0000000000..361f5ebd78 --- /dev/null +++ b/backend/.sqlx/query-cecf1addc4aecb087a14786b2a9165895ca61ef042947c7314f66514d7f29edc.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT last_locked_at\n FROM concurrency_locks\n WHERE id = $1\n FOR UPDATE", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "last_locked_at", + "type_info": "Timestamp" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + false + ] + }, + "hash": "cecf1addc4aecb087a14786b2a9165895ca61ef042947c7314f66514d7f29edc" +} diff --git a/backend/.sqlx/query-d06efdc24706e0d7479bffc0b19a0c5976ee60125289e9f7b0b04090bce4a3a3.json b/backend/.sqlx/query-d06efdc24706e0d7479bffc0b19a0c5976ee60125289e9f7b0b04090bce4a3a3.json new file mode 100644 index 0000000000..79fe0873dd --- /dev/null +++ b/backend/.sqlx/query-d06efdc24706e0d7479bffc0b19a0c5976ee60125289e9f7b0b04090bce4a3a3.json @@ -0,0 +1,25 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE capture_config SET server_id = $1, last_server_ping = now(), error = 'Connecting...' WHERE last_client_ping > NOW() - INTERVAL '10 seconds' AND workspace_id = $2 AND path = $3 AND is_flow = $4 AND trigger_kind = 'kafka' AND (last_server_ping IS NULL OR last_server_ping < now() - interval '15 seconds') RETURNING true", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "?column?", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [ + "Varchar", + "Text", + "Text", + "Bool" + ] + }, + "nullable": [ + null + ] + }, + "hash": "d06efdc24706e0d7479bffc0b19a0c5976ee60125289e9f7b0b04090bce4a3a3" +} diff --git a/backend/.sqlx/query-d0bd4f43cb1feabe7ee9e017a0d6af22d25369a33247cec6e9f2d1a5eb851412.json b/backend/.sqlx/query-d0bd4f43cb1feabe7ee9e017a0d6af22d25369a33247cec6e9f2d1a5eb851412.json new file mode 100644 index 0000000000..4e3ee705a3 --- /dev/null +++ b/backend/.sqlx/query-d0bd4f43cb1feabe7ee9e017a0d6af22d25369a33247cec6e9f2d1a5eb851412.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "\n UPDATE workspace_settings\n SET git_app_installations = (\n SELECT jsonb_agg(updated)\n FROM (\n -- For each element, if the account_id matches, replace it\n SELECT\n CASE\n WHEN elem->>'account_id' = ($1::jsonb)->>'account_id' THEN $1::jsonb\n ELSE elem\n END AS updated\n FROM jsonb_array_elements(git_app_installations) AS elem\n UNION ALL\n -- Append new installation if no element with the same account_id exists\n SELECT $1::jsonb\n WHERE NOT EXISTS (\n SELECT 1\n FROM jsonb_array_elements(git_app_installations) AS elem\n WHERE elem->>'account_id' = ($1::jsonb)->>'account_id'\n )\n ) sub\n )\n WHERE workspace_id = $2;\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Jsonb", + "Text" + ] + }, + "nullable": [] + }, + "hash": "d0bd4f43cb1feabe7ee9e017a0d6af22d25369a33247cec6e9f2d1a5eb851412" +} diff --git a/backend/.sqlx/query-d113bc301f2f094c3a2a4c6ed385da65edde2fbfee0fac5103ba7bd18c64563d.json b/backend/.sqlx/query-d113bc301f2f094c3a2a4c6ed385da65edde2fbfee0fac5103ba7bd18c64563d.json new file mode 100644 index 0000000000..c3782f5571 --- /dev/null +++ b/backend/.sqlx/query-d113bc301f2f094c3a2a4c6ed385da65edde2fbfee0fac5103ba7bd18c64563d.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO metrics (id, value) VALUES ('license_key_renewal', $1)", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Jsonb" + ] + }, + "nullable": [] + }, + "hash": "d113bc301f2f094c3a2a4c6ed385da65edde2fbfee0fac5103ba7bd18c64563d" +} diff --git a/backend/.sqlx/query-d1dcc7fc8a1e1bc4dad263ec5163a94fca9dd95cc3b26b33611eab9d2a261141.json b/backend/.sqlx/query-d1dcc7fc8a1e1bc4dad263ec5163a94fca9dd95cc3b26b33611eab9d2a261141.json new file mode 100644 index 0000000000..4a0592701c --- /dev/null +++ b/backend/.sqlx/query-d1dcc7fc8a1e1bc4dad263ec5163a94fca9dd95cc3b26b33611eab9d2a261141.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT args as \"args: sqlx::types::Json>\"\n FROM v2_job\n WHERE id = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "args: sqlx::types::Json>", + "type_info": "Jsonb" + } + ], + "parameters": { + "Left": [ + "Uuid" + ] + }, + "nullable": [ + true + ] + }, + "hash": "d1dcc7fc8a1e1bc4dad263ec5163a94fca9dd95cc3b26b33611eab9d2a261141" +} diff --git a/backend/.sqlx/query-d4eb7aea60894b65498144b9bf522beba612f36368d62fe4e94b5b9e26349d32.json b/backend/.sqlx/query-d4eb7aea60894b65498144b9bf522beba612f36368d62fe4e94b5b9e26349d32.json new file mode 100644 index 0000000000..265034b6fc --- /dev/null +++ b/backend/.sqlx/query-d4eb7aea60894b65498144b9bf522beba612f36368d62fe4e94b5b9e26349d32.json @@ -0,0 +1,20 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT EXISTS(SELECT 1 FROM workspace WHERE id = 'demo')", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "exists", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [] + }, + "nullable": [ + null + ] + }, + "hash": "d4eb7aea60894b65498144b9bf522beba612f36368d62fe4e94b5b9e26349d32" +} diff --git a/backend/.sqlx/query-d78ecf85c1e1e95650c380c9488aa90d8d8c5c76f3971484e4c515ff60293d3b.json b/backend/.sqlx/query-d78ecf85c1e1e95650c380c9488aa90d8d8c5c76f3971484e4c515ff60293d3b.json new file mode 100644 index 0000000000..cdb8b928b3 --- /dev/null +++ b/backend/.sqlx/query-d78ecf85c1e1e95650c380c9488aa90d8d8c5c76f3971484e4c515ff60293d3b.json @@ -0,0 +1,24 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE kafka_trigger SET server_id = $1, last_server_ping = now(), error = 'Connecting...' WHERE enabled IS TRUE AND workspace_id = $2 AND path = $3 AND (last_server_ping IS NULL OR last_server_ping < now() - interval '15 seconds') RETURNING true", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "?column?", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [ + "Varchar", + "Text", + "Text" + ] + }, + "nullable": [ + null + ] + }, + "hash": "d78ecf85c1e1e95650c380c9488aa90d8d8c5c76f3971484e4c515ff60293d3b" +} diff --git a/backend/.sqlx/query-d8ea17fba0e417333e9c6cf82ad36a57830a791c8358e30e9be012b815f5e8e3.json b/backend/.sqlx/query-d8ea17fba0e417333e9c6cf82ad36a57830a791c8358e30e9be012b815f5e8e3.json new file mode 100644 index 0000000000..dcaee3cfe8 --- /dev/null +++ b/backend/.sqlx/query-d8ea17fba0e417333e9c6cf82ad36a57830a791c8358e30e9be012b815f5e8e3.json @@ -0,0 +1,50 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT path, is_flow, workspace_id, trigger_config as \"trigger_config!: _\", owner, email FROM capture_config WHERE trigger_kind = 'kafka' AND last_client_ping > NOW() - INTERVAL '10 seconds' AND trigger_config IS NOT NULL AND (last_server_ping IS NULL OR last_server_ping < now() - interval '15 seconds')", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "path", + "type_info": "Varchar" + }, + { + "ordinal": 1, + "name": "is_flow", + "type_info": "Bool" + }, + { + "ordinal": 2, + "name": "workspace_id", + "type_info": "Varchar" + }, + { + "ordinal": 3, + "name": "trigger_config!: _", + "type_info": "Jsonb" + }, + { + "ordinal": 4, + "name": "owner", + "type_info": "Varchar" + }, + { + "ordinal": 5, + "name": "email", + "type_info": "Varchar" + } + ], + "parameters": { + "Left": [] + }, + "nullable": [ + false, + false, + false, + true, + false, + false + ] + }, + "hash": "d8ea17fba0e417333e9c6cf82ad36a57830a791c8358e30e9be012b815f5e8e3" +} diff --git a/backend/.sqlx/query-d9a6f75e4c4a1f61e55b313cc09bceffac637548841897341672da427a9140fc.json b/backend/.sqlx/query-d9a6f75e4c4a1f61e55b313cc09bceffac637548841897341672da427a9140fc.json new file mode 100644 index 0000000000..3ccfcc9582 --- /dev/null +++ b/backend/.sqlx/query-d9a6f75e4c4a1f61e55b313cc09bceffac637548841897341672da427a9140fc.json @@ -0,0 +1,26 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE capture_config SET last_server_ping = now(), error = $1 WHERE workspace_id = $2 AND path = $3 AND is_flow = $4 AND trigger_kind = 'kafka' AND server_id = $5 AND last_client_ping > NOW() - INTERVAL '10 seconds' RETURNING 1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "?column?", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Text", + "Text", + "Text", + "Bool", + "Text" + ] + }, + "nullable": [ + null + ] + }, + "hash": "d9a6f75e4c4a1f61e55b313cc09bceffac637548841897341672da427a9140fc" +} diff --git a/backend/.sqlx/query-dc649111c4c862c36c26ad8a9eff8c31c2533a4a73184d0276f9a388ff2fa574.json b/backend/.sqlx/query-dc649111c4c862c36c26ad8a9eff8c31c2533a4a73184d0276f9a388ff2fa574.json new file mode 100644 index 0000000000..f6ec69af57 --- /dev/null +++ b/backend/.sqlx/query-dc649111c4c862c36c26ad8a9eff8c31c2533a4a73184d0276f9a388ff2fa574.json @@ -0,0 +1,25 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO account (workspace_id, client, expires_at, refresh_token) VALUES ($1, $2, now() + ($3 || ' seconds')::interval, $4) RETURNING id", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Varchar", + "Varchar", + "Text", + "Varchar" + ] + }, + "nullable": [ + false + ] + }, + "hash": "dc649111c4c862c36c26ad8a9eff8c31c2533a4a73184d0276f9a388ff2fa574" +} diff --git a/backend/.sqlx/query-dcf03ff4b922b93be37d2be5da6884ae3e8c6cf7eaa2d9c62056366eb42f2276.json b/backend/.sqlx/query-dcf03ff4b922b93be37d2be5da6884ae3e8c6cf7eaa2d9c62056366eb42f2276.json new file mode 100644 index 0000000000..989e4612ec --- /dev/null +++ b/backend/.sqlx/query-dcf03ff4b922b93be37d2be5da6884ae3e8c6cf7eaa2d9c62056366eb42f2276.json @@ -0,0 +1,25 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE nats_trigger SET last_server_ping = now(), error = $1 WHERE workspace_id = $2 AND path = $3 AND server_id = $4 AND enabled IS TRUE RETURNING 1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "?column?", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Text", + "Text", + "Text", + "Text" + ] + }, + "nullable": [ + null + ] + }, + "hash": "dcf03ff4b922b93be37d2be5da6884ae3e8c6cf7eaa2d9c62056366eb42f2276" +} diff --git a/backend/.sqlx/query-dea056c89313f4facd62cbbc9fa33ba30fa85efcc83fafe4dd7b4e535b96a8d8.json b/backend/.sqlx/query-dea056c89313f4facd62cbbc9fa33ba30fa85efcc83fafe4dd7b4e535b96a8d8.json new file mode 100644 index 0000000000..12e4b6d81b --- /dev/null +++ b/backend/.sqlx/query-dea056c89313f4facd62cbbc9fa33ba30fa85efcc83fafe4dd7b4e535b96a8d8.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "\n DELETE \n FROM \n sqs_trigger \n WHERE \n workspace_id = $1 AND \n path = $2\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [] + }, + "hash": "dea056c89313f4facd62cbbc9fa33ba30fa85efcc83fafe4dd7b4e535b96a8d8" +} diff --git a/backend/.sqlx/query-df2a426658f0a36683cc2163fe70912d0221d191b8ab091601cb53cdd932ad58.json b/backend/.sqlx/query-df2a426658f0a36683cc2163fe70912d0221d191b8ab091601cb53cdd932ad58.json new file mode 100644 index 0000000000..f98dd01404 --- /dev/null +++ b/backend/.sqlx/query-df2a426658f0a36683cc2163fe70912d0221d191b8ab091601cb53cdd932ad58.json @@ -0,0 +1,25 @@ +{ + "db_name": "PostgreSQL", + "query": "\n UPDATE \n gcp_trigger\n SET \n last_server_ping = now(),\n error = $1\n WHERE\n workspace_id = $2\n AND path = $3\n AND server_id = $4 \n AND enabled IS TRUE\n RETURNING 1\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "?column?", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Text", + "Text", + "Text", + "Text" + ] + }, + "nullable": [ + null + ] + }, + "hash": "df2a426658f0a36683cc2163fe70912d0221d191b8ab091601cb53cdd932ad58" +} diff --git a/backend/.sqlx/query-e37ba13aa3174931f0bfcff26dbc141fe8a346ab6a1a3bc924794bfe3c9af306.json b/backend/.sqlx/query-e37ba13aa3174931f0bfcff26dbc141fe8a346ab6a1a3bc924794bfe3c9af306.json new file mode 100644 index 0000000000..cec42e51c6 --- /dev/null +++ b/backend/.sqlx/query-e37ba13aa3174931f0bfcff26dbc141fe8a346ab6a1a3bc924794bfe3c9af306.json @@ -0,0 +1,26 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE capture_config SET last_server_ping = now(), error = $1 WHERE workspace_id = $2 AND path = $3 AND is_flow = $4 AND trigger_kind = 'nats' AND server_id = $5 AND last_client_ping > NOW() - INTERVAL '10 seconds' RETURNING 1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "?column?", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Text", + "Text", + "Text", + "Bool", + "Text" + ] + }, + "nullable": [ + null + ] + }, + "hash": "e37ba13aa3174931f0bfcff26dbc141fe8a346ab6a1a3bc924794bfe3c9af306" +} diff --git a/backend/.sqlx/query-e38a66d15382703b99054a9b609af9f3854bb65393d33b265476c0e68aec4f61.json b/backend/.sqlx/query-e38a66d15382703b99054a9b609af9f3854bb65393d33b265476c0e68aec4f61.json new file mode 100644 index 0000000000..78e5750992 --- /dev/null +++ b/backend/.sqlx/query-e38a66d15382703b99054a9b609af9f3854bb65393d33b265476c0e68aec4f61.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE nats_trigger SET last_server_ping = NULL WHERE workspace_id = $1 AND path = $2 AND server_id IS NULL", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [] + }, + "hash": "e38a66d15382703b99054a9b609af9f3854bb65393d33b265476c0e68aec4f61" +} diff --git a/backend/.sqlx/query-e822d186203fe809b764007ad7c02870a3b7d93ae43b40ac2cd3181dffab0837.json b/backend/.sqlx/query-e822d186203fe809b764007ad7c02870a3b7d93ae43b40ac2cd3181dffab0837.json new file mode 100644 index 0000000000..8974494ddd --- /dev/null +++ b/backend/.sqlx/query-e822d186203fe809b764007ad7c02870a3b7d93ae43b40ac2cd3181dffab0837.json @@ -0,0 +1,17 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO usr (workspace_id, username, email, is_admin, operator) VALUES ($1, $2, $3, false, $4) ON CONFLICT DO NOTHING", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Varchar", + "Varchar", + "Bool" + ] + }, + "nullable": [] + }, + "hash": "e822d186203fe809b764007ad7c02870a3b7d93ae43b40ac2cd3181dffab0837" +} diff --git a/backend/.sqlx/query-eb932b613a6dbb2cdff97e5512d42b538ba83115c0ea798be00b01659600f45a.json b/backend/.sqlx/query-eb932b613a6dbb2cdff97e5512d42b538ba83115c0ea798be00b01659600f45a.json new file mode 100644 index 0000000000..7717a34760 --- /dev/null +++ b/backend/.sqlx/query-eb932b613a6dbb2cdff97e5512d42b538ba83115c0ea798be00b01659600f45a.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT EXISTS(SELECT 1 FROM healthchecks WHERE check_type = $1 AND healthy = false)", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "exists", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + null + ] + }, + "hash": "eb932b613a6dbb2cdff97e5512d42b538ba83115c0ea798be00b01659600f45a" +} diff --git a/backend/.sqlx/query-ebbe03cad470d0c6ae98964f630315ff25dad08e4cb714718505b77a75d44b95.json b/backend/.sqlx/query-ebbe03cad470d0c6ae98964f630315ff25dad08e4cb714718505b77a75d44b95.json new file mode 100644 index 0000000000..e087310961 --- /dev/null +++ b/backend/.sqlx/query-ebbe03cad470d0c6ae98964f630315ff25dad08e4cb714718505b77a75d44b95.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE workspace_settings SET teams_command_script = $1 WHERE workspace_id = $2", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [] + }, + "hash": "ebbe03cad470d0c6ae98964f630315ff25dad08e4cb714718505b77a75d44b95" +} diff --git a/backend/.sqlx/query-eda1e5d1109a13feb14be254eaca630be29176bd5d1246c974642d40201782fc.json b/backend/.sqlx/query-eda1e5d1109a13feb14be254eaca630be29176bd5d1246c974642d40201782fc.json new file mode 100644 index 0000000000..fdc34ee1c7 --- /dev/null +++ b/backend/.sqlx/query-eda1e5d1109a13feb14be254eaca630be29176bd5d1246c974642d40201782fc.json @@ -0,0 +1,26 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE kafka_trigger SET enabled = $1, email = $2, edited_by = $3, edited_at = now(), server_id = NULL, error = NULL\n WHERE path = $4 AND workspace_id = $5 RETURNING 1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "?column?", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Bool", + "Varchar", + "Varchar", + "Text", + "Text" + ] + }, + "nullable": [ + null + ] + }, + "hash": "eda1e5d1109a13feb14be254eaca630be29176bd5d1246c974642d40201782fc" +} diff --git a/backend/.sqlx/query-f16b00bad2880f896f4452e5894fe101cd5c2fe3e4c143c0b979668143d85dd2.json b/backend/.sqlx/query-f16b00bad2880f896f4452e5894fe101cd5c2fe3e4c143c0b979668143d85dd2.json new file mode 100644 index 0000000000..a1ce88bd88 --- /dev/null +++ b/backend/.sqlx/query-f16b00bad2880f896f4452e5894fe101cd5c2fe3e4c143c0b979668143d85dd2.json @@ -0,0 +1,25 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE capture_config SET server_id = $1, last_server_ping = now(), error = 'Connecting...' WHERE last_client_ping > NOW() - INTERVAL '10 seconds' AND workspace_id = $2 AND path = $3 AND is_flow = $4 AND trigger_kind = 'nats' AND (last_server_ping IS NULL OR last_server_ping < now() - interval '15 seconds') RETURNING true", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "?column?", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [ + "Varchar", + "Text", + "Text", + "Bool" + ] + }, + "nullable": [ + null + ] + }, + "hash": "f16b00bad2880f896f4452e5894fe101cd5c2fe3e4c143c0b979668143d85dd2" +} diff --git a/backend/.sqlx/query-f22964772dc2d67aee437bbbd08b64792c00da1d713d7ca8f9904ccce7bfdae7.json b/backend/.sqlx/query-f22964772dc2d67aee437bbbd08b64792c00da1d713d7ca8f9904ccce7bfdae7.json new file mode 100644 index 0000000000..b400be3485 --- /dev/null +++ b/backend/.sqlx/query-f22964772dc2d67aee437bbbd08b64792c00da1d713d7ca8f9904ccce7bfdae7.json @@ -0,0 +1,247 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT\n cj.id AS \"id!\",\n cj.workspace_id AS \"workspace_id!\",\n cj.parent_job,\n cj.created_by AS \"created_by!\",\n cj.duration_ms AS \"duration_ms!\",\n cj.success AS \"success!\",\n cj.script_hash AS \"script_hash!: Option\",\n cj.script_path,\n cj.args AS \"args: sqlx::types::Json>>\",\n cj.result AS \"result: sqlx::types::Json>\",\n cj.deleted AS \"deleted!\",\n cj.canceled AS \"canceled!\",\n cj.canceled_by,\n cj.canceled_reason,\n cj.job_kind AS \"job_kind!: JobKind\",\n cj.schedule_path,\n cj.permissioned_as AS \"permissioned_as!\",\n cj.is_flow_step AS \"is_flow_step!\",\n cj.language AS \"language: ScriptLang\",\n cj.is_skipped AS \"is_skipped!\",\n cj.email AS \"email!\",\n cj.visible_to_owner AS \"visible_to_owner!\",\n cj.mem_peak,\n cj.tag AS \"tag!\",\n cj.created_at AS \"created_at!\",\n cj.started_at,\n job_logs.logs,\n job_logs.log_offset AS \"log_offset?\",\n job_logs.log_file_index\n\n FROM v2_as_completed_job AS cj\n LEFT JOIN job_logs ON cj.id = job_logs.job_id\n WHERE cj.created_at < $1\n ORDER BY cj.created_at ASC LIMIT $2", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id!", + "type_info": "Uuid" + }, + { + "ordinal": 1, + "name": "workspace_id!", + "type_info": "Varchar" + }, + { + "ordinal": 2, + "name": "parent_job", + "type_info": "Uuid" + }, + { + "ordinal": 3, + "name": "created_by!", + "type_info": "Varchar" + }, + { + "ordinal": 4, + "name": "duration_ms!", + "type_info": "Int8" + }, + { + "ordinal": 5, + "name": "success!", + "type_info": "Bool" + }, + { + "ordinal": 6, + "name": "script_hash!: Option", + "type_info": "Int8" + }, + { + "ordinal": 7, + "name": "script_path", + "type_info": "Varchar" + }, + { + "ordinal": 8, + "name": "args: sqlx::types::Json>>", + "type_info": "Jsonb" + }, + { + "ordinal": 9, + "name": "result: sqlx::types::Json>", + "type_info": "Jsonb" + }, + { + "ordinal": 10, + "name": "deleted!", + "type_info": "Bool" + }, + { + "ordinal": 11, + "name": "canceled!", + "type_info": "Bool" + }, + { + "ordinal": 12, + "name": "canceled_by", + "type_info": "Varchar" + }, + { + "ordinal": 13, + "name": "canceled_reason", + "type_info": "Text" + }, + { + "ordinal": 14, + "name": "job_kind!: JobKind", + "type_info": { + "Custom": { + "name": "job_kind", + "kind": { + "Enum": [ + "script", + "preview", + "flow", + "dependencies", + "flowpreview", + "script_hub", + "identity", + "flowdependencies", + "http", + "graphql", + "postgresql", + "noop", + "appdependencies", + "deploymentcallback", + "singlescriptflow", + "flowscript", + "flownode", + "appscript" + ] + } + } + } + }, + { + "ordinal": 15, + "name": "schedule_path", + "type_info": "Varchar" + }, + { + "ordinal": 16, + "name": "permissioned_as!", + "type_info": "Varchar" + }, + { + "ordinal": 17, + "name": "is_flow_step!", + "type_info": "Bool" + }, + { + "ordinal": 18, + "name": "language: ScriptLang", + "type_info": { + "Custom": { + "name": "script_lang", + "kind": { + "Enum": [ + "python3", + "deno", + "go", + "bash", + "postgresql", + "nativets", + "bun", + "mysql", + "bigquery", + "snowflake", + "graphql", + "powershell", + "mssql", + "php", + "bunnative", + "rust", + "ansible", + "csharp", + "oracledb", + "nu", + "java", + "duckdb" + ] + } + } + } + }, + { + "ordinal": 19, + "name": "is_skipped!", + "type_info": "Bool" + }, + { + "ordinal": 20, + "name": "email!", + "type_info": "Varchar" + }, + { + "ordinal": 21, + "name": "visible_to_owner!", + "type_info": "Bool" + }, + { + "ordinal": 22, + "name": "mem_peak", + "type_info": "Int4" + }, + { + "ordinal": 23, + "name": "tag!", + "type_info": "Varchar" + }, + { + "ordinal": 24, + "name": "created_at!", + "type_info": "Timestamptz" + }, + { + "ordinal": 25, + "name": "started_at", + "type_info": "Timestamptz" + }, + { + "ordinal": 26, + "name": "logs", + "type_info": "Text" + }, + { + "ordinal": 27, + "name": "log_offset?", + "type_info": "Int4" + }, + { + "ordinal": 28, + "name": "log_file_index", + "type_info": "TextArray" + } + ], + "parameters": { + "Left": [ + "Timestamptz", + "Int8" + ] + }, + "nullable": [ + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + true + ] + }, + "hash": "f22964772dc2d67aee437bbbd08b64792c00da1d713d7ca8f9904ccce7bfdae7" +} diff --git a/backend/.sqlx/query-f74589aaa72d0eb9f44157cc60eb121e63a7f31ed849834bb8ac9e8c726e81f1.json b/backend/.sqlx/query-f74589aaa72d0eb9f44157cc60eb121e63a7f31ed849834bb8ac9e8c726e81f1.json new file mode 100644 index 0000000000..46fe54f755 --- /dev/null +++ b/backend/.sqlx/query-f74589aaa72d0eb9f44157cc60eb121e63a7f31ed849834bb8ac9e8c726e81f1.json @@ -0,0 +1,28 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT threshold_alert_amount, last_alert_sent FROM cloud_workspace_settings WHERE workspace_id = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "threshold_alert_amount", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "last_alert_sent", + "type_info": "Timestamp" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + true, + true + ] + }, + "hash": "f74589aaa72d0eb9f44157cc60eb121e63a7f31ed849834bb8ac9e8c726e81f1" +} diff --git a/backend/.sqlx/query-f955a01779f5441efc6aa9364b24c79b3cbc6413046c3b6099d19f675d8a395b.json b/backend/.sqlx/query-f955a01779f5441efc6aa9364b24c79b3cbc6413046c3b6099d19f675d8a395b.json new file mode 100644 index 0000000000..925d8c39f1 --- /dev/null +++ b/backend/.sqlx/query-f955a01779f5441efc6aa9364b24c79b3cbc6413046c3b6099d19f675d8a395b.json @@ -0,0 +1,23 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT EXISTS (SELECT 1\n FROM workspace_settings\n WHERE workspace_id <> $1\n AND slack_command_script IS NOT NULL\n AND slack_team_id = $2\n AND (SELECT slack_command_script IS NOT NULL FROM workspace_settings WHERE workspace_id = $1))\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "exists", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [ + null + ] + }, + "hash": "f955a01779f5441efc6aa9364b24c79b3cbc6413046c3b6099d19f675d8a395b" +} diff --git a/backend/.sqlx/query-fab5a746a179eea356f0bb9005590e3bb89c4deff181827bd2fa5630c21e42a7.json b/backend/.sqlx/query-fab5a746a179eea356f0bb9005590e3bb89c4deff181827bd2fa5630c21e42a7.json new file mode 100644 index 0000000000..1f877fcddf --- /dev/null +++ b/backend/.sqlx/query-fab5a746a179eea356f0bb9005590e3bb89c4deff181827bd2fa5630c21e42a7.json @@ -0,0 +1,29 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT COUNT(*) as count, COALESCE(MAX(ended_at), now() - INTERVAL '1 second' * $2) as max_ended_at FROM concurrency_key WHERE key = $1 AND ended_at >= (now() - INTERVAL '1 second' * $2)", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "count", + "type_info": "Int8" + }, + { + "ordinal": 1, + "name": "max_ended_at", + "type_info": "Timestamptz" + } + ], + "parameters": { + "Left": [ + "Text", + "Float8" + ] + }, + "nullable": [ + null, + null + ] + }, + "hash": "fab5a746a179eea356f0bb9005590e3bb89c4deff181827bd2fa5630c21e42a7" +} diff --git a/backend/.sqlx/query-fb581eb6f883ebb5909a00c65a6e1217f088290fce0e052171230bcd88f945b9.json b/backend/.sqlx/query-fb581eb6f883ebb5909a00c65a6e1217f088290fce0e052171230bcd88f945b9.json new file mode 100644 index 0000000000..b3f640dd76 --- /dev/null +++ b/backend/.sqlx/query-fb581eb6f883ebb5909a00c65a6e1217f088290fce0e052171230bcd88f945b9.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO global_settings (name, value) VALUES ('slack', $1) ON CONFLICT (name) DO UPDATE SET value = $1, updated_at = now()", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Jsonb" + ] + }, + "nullable": [] + }, + "hash": "fb581eb6f883ebb5909a00c65a6e1217f088290fce0e052171230bcd88f945b9" +} diff --git a/backend/.sqlx/query-fbe14569717b4c4937b74e6dc6f6b4ea29a2b0c2b1cde48ef06d687f6f9e8f15.json b/backend/.sqlx/query-fbe14569717b4c4937b74e6dc6f6b4ea29a2b0c2b1cde48ef06d687f6f9e8f15.json new file mode 100644 index 0000000000..642572bfe8 --- /dev/null +++ b/backend/.sqlx/query-fbe14569717b4c4937b74e6dc6f6b4ea29a2b0c2b1cde48ef06d687f6f9e8f15.json @@ -0,0 +1,29 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT client, refresh_token FROM account WHERE workspace_id = $1 AND id = $2", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "client", + "type_info": "Varchar" + }, + { + "ordinal": 1, + "name": "refresh_token", + "type_info": "Varchar" + } + ], + "parameters": { + "Left": [ + "Text", + "Int4" + ] + }, + "nullable": [ + false, + false + ] + }, + "hash": "fbe14569717b4c4937b74e6dc6f6b4ea29a2b0c2b1cde48ef06d687f6f9e8f15" +} diff --git a/backend/.sqlx/query-fc8fa909ef7a15c7ad30dd938be3c13864e855219c7f366c86f0605ec25d1538.json b/backend/.sqlx/query-fc8fa909ef7a15c7ad30dd938be3c13864e855219c7f366c86f0605ec25d1538.json new file mode 100644 index 0000000000..f5d5a46df5 --- /dev/null +++ b/backend/.sqlx/query-fc8fa909ef7a15c7ad30dd938be3c13864e855219c7f366c86f0605ec25d1538.json @@ -0,0 +1,35 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT workspace_id, auto_invite_operator, auto_add FROM workspace_settings ws WHERE (auto_invite_domain = $1 OR auto_invite_domain = '*') AND NOT EXISTS (SELECT 1 FROM usr WHERE workspace_id = ws.workspace_id AND email = $2)", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "workspace_id", + "type_info": "Varchar" + }, + { + "ordinal": 1, + "name": "auto_invite_operator", + "type_info": "Bool" + }, + { + "ordinal": 2, + "name": "auto_add", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [ + false, + true, + true + ] + }, + "hash": "fc8fa909ef7a15c7ad30dd938be3c13864e855219c7f366c86f0605ec25d1538" +} diff --git a/backend/.sqlx/query-fd0a0ca4a107dc813240ad71f372ab7e0bf26431158fbfb5f0023ed847ca7dc5.json b/backend/.sqlx/query-fd0a0ca4a107dc813240ad71f372ab7e0bf26431158fbfb5f0023ed847ca7dc5.json new file mode 100644 index 0000000000..d47bb3fd68 --- /dev/null +++ b/backend/.sqlx/query-fd0a0ca4a107dc813240ad71f372ab7e0bf26431158fbfb5f0023ed847ca7dc5.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "\n UPDATE \n gcp_trigger \n SET \n enabled = FALSE, \n error = $1, \n server_id = NULL, \n last_server_ping = NULL \n WHERE \n workspace_id = $2 AND \n path = $3\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Text", + "Text" + ] + }, + "nullable": [] + }, + "hash": "fd0a0ca4a107dc813240ad71f372ab7e0bf26431158fbfb5f0023ed847ca7dc5" +} diff --git a/backend/.sqlx/query-ffb6b2a40b605f9c55826a0e519af80b100d2ffa58ec567223e27099d364fcc8.json b/backend/.sqlx/query-ffb6b2a40b605f9c55826a0e519af80b100d2ffa58ec567223e27099d364fcc8.json new file mode 100644 index 0000000000..c75cb3385a --- /dev/null +++ b/backend/.sqlx/query-ffb6b2a40b605f9c55826a0e519af80b100d2ffa58ec567223e27099d364fcc8.json @@ -0,0 +1,17 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE capture_config SET error = $1, server_id = NULL, last_server_ping = NULL WHERE workspace_id = $2 AND path = $3 AND is_flow = $4 AND trigger_kind = 'nats'", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Text", + "Text", + "Bool" + ] + }, + "nullable": [] + }, + "hash": "ffb6b2a40b605f9c55826a0e519af80b100d2ffa58ec567223e27099d364fcc8" +} diff --git a/backend/update_sqlx.sh b/backend/update_sqlx.sh index a0470b5751..09824d9e24 100755 --- a/backend/update_sqlx.sh +++ b/backend/update_sqlx.sh @@ -9,7 +9,7 @@ if [[ "$(uname)" == "Darwin" ]]; then sed -i '' 's/^# \(samael = { git="https:\/\/github.com\/njaremko\/samael", rev="464d015e3ae393e4b5dd00b4d6baa1b617de0dd6", features = \["xmlsec"\] }\)/\1/' Cargo.toml fi -cargo sqlx prepare --workspace -- --all-targets --features $(./all_features_oss.sh) +cargo sqlx prepare --workspace -- --all-targets --all-features # Undo the samael changes on macOS if [[ "$(uname)" == "Darwin" ]]; then From 1551dc8af22f6ea41f68290ace4c58f936c47745 Mon Sep 17 00:00:00 2001 From: Alexander Petric Date: Thu, 5 Jun 2025 12:43:59 -0400 Subject: [PATCH 533/739] fix: fix regex that extract workspaces from custom tags (#5876) --- backend/windmill-common/src/worker.rs | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/backend/windmill-common/src/worker.rs b/backend/windmill-common/src/worker.rs index f803e696f6..1f09176512 100644 --- a/backend/windmill-common/src/worker.rs +++ b/backend/windmill-common/src/worker.rs @@ -129,7 +129,7 @@ lazy_static::lazy_static! { pub static ref ALL_TAGS: Arc>> = Arc::new(RwLock::new(vec![])); - static ref CUSTOM_TAG_REGEX: Regex = Regex::new(r"^([\w-]+)\(((?:[\w-])+\+?)+\)$").unwrap(); + static ref CUSTOM_TAG_REGEX: Regex = Regex::new(r"^([\w-]+)\(((?:[\w-]+\+)*[\w-]+)\)$").unwrap(); pub static ref DISABLE_BUNDLING: bool = std::env::var("DISABLE_BUNDLING") .ok() @@ -267,7 +267,7 @@ fn format_pull_query(peek: String) -> String { id, workspace_id, parent_job, created_by, created_at, runnable_id, runnable_path, args, kind, trigger, trigger_kind, permissioned_as, permissioned_as_email, script_lang, - flow_innermost_root_job, flow_step_id, + flow_innermost_root_job, flow_step_id, same_worker, pre_run_error, visible_to_owner, tag, concurrent_limit, concurrency_time_window_s, timeout, cache_ttl, priority, raw_code, raw_lock, raw_flow, script_entrypoint_override, preprocessed @@ -275,13 +275,13 @@ fn format_pull_query(peek: String) -> String { WHERE id = (SELECT id FROM peek) ) SELECT j.id, j.workspace_id, j.parent_job, j.created_by, started_at, scheduled_for, j.runnable_id, j.runnable_path, j.args, canceled_by, - canceled_reason, j.kind, j.trigger, j.trigger_kind, j.permissioned_as, + canceled_reason, j.kind, j.trigger, j.trigger_kind, j.permissioned_as, flow_status, j.script_lang, - j.same_worker, j.pre_run_error, j.visible_to_owner, + j.same_worker, j.pre_run_error, j.visible_to_owner, j.tag, j.concurrent_limit, j.concurrency_time_window_s, j.flow_innermost_root_job, j.timeout, j.flow_step_id, j.cache_ttl, j.priority, j.raw_code, j.raw_lock, j.raw_flow, j.script_entrypoint_override, j.preprocessed, pj.runnable_path as parent_runnable_path, - COALESCE(p.email, j.permissioned_as_email) as permissioned_as_email, p.username as permissioned_as_username, p.is_admin as permissioned_as_is_admin, + COALESCE(p.email, j.permissioned_as_email) as permissioned_as_email, p.username as permissioned_as_username, p.is_admin as permissioned_as_is_admin, p.is_operator as permissioned_as_is_operator, p.groups as permissioned_as_groups, p.folders as permissioned_as_folders FROM q, j LEFT JOIN v2_job_status f USING (id) @@ -1069,11 +1069,11 @@ pub async fn update_ping_for_failed_init_script_query( db: &DB, ) -> anyhow::Result<()> { sqlx::query!( - "UPDATE worker_ping SET -ping_at = now(), -jobs_executed = 1, -current_job_id = $1, -current_job_workspace_id = 'admins' + "UPDATE worker_ping SET +ping_at = now(), +jobs_executed = 1, +current_job_id = $1, +current_job_workspace_id = 'admins' WHERE worker = $2", last_job_id, worker_name @@ -1519,7 +1519,7 @@ pub struct WorkerConfig { impl std::fmt::Debug for WorkerConfig { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "WorkerConfig {{ worker_tags: {:?}, priority_tags_sorted: {:?}, dedicated_worker: {:?}, init_bash: {:?}, cache_clear: {:?}, additional_python_paths: {:?}, pip_local_dependencies: {:?}, env_vars: {:?} }}", + write!(f, "WorkerConfig {{ worker_tags: {:?}, priority_tags_sorted: {:?}, dedicated_worker: {:?}, init_bash: {:?}, cache_clear: {:?}, additional_python_paths: {:?}, pip_local_dependencies: {:?}, env_vars: {:?} }}", self.worker_tags, self.priority_tags_sorted, self.dedicated_worker, self.init_bash, self.cache_clear, self.additional_python_paths, self.pip_local_dependencies, self.env_vars.iter().map(|(k, v)| format!("{}: {}{} ({} chars)", k, &v[..3.min(v.len())], "***", v.len())).collect::>().join(", ")) } } From 6247d159ce25ae13f6fbc5c105df88305ce29451 Mon Sep 17 00:00:00 2001 From: HugoCasa Date: Thu, 5 Jun 2025 18:44:54 +0200 Subject: [PATCH 534/739] feat: connect fix btn in flow editor to ai chat (#5863) * feat: connect fix btn in flow editor to ai chat * adapt to unified chat * cleaning * cleanup --- .../src/lib/components/FlowBuilder.svelte | 7 - .../ModulePreviewResultViewer.svelte | 11 +- .../src/lib/components/ScriptEditor.svelte | 19 +- .../lib/components/copilot/ScriptFix.svelte | 243 +++--------------- .../copilot/chat/AIChatManager.svelte.ts | 8 + frontend/src/lib/components/copilot/flow.ts | 2 - .../lib/components/flows/FlowEditor.svelte | 8 - .../flows/content/FlowModuleComponent.svelte | 9 +- .../components/scriptEditor/LogPanel.svelte | 14 +- 9 files changed, 50 insertions(+), 271 deletions(-) diff --git a/frontend/src/lib/components/FlowBuilder.svelte b/frontend/src/lib/components/FlowBuilder.svelte index 74cf2eb0cd..17c1f04818 100644 --- a/frontend/src/lib/components/FlowBuilder.svelte +++ b/frontend/src/lib/components/FlowBuilder.svelte @@ -749,12 +749,6 @@ } let flowPreviewButtons: FlowPreviewButtons - - let flowEditor: FlowEditor | undefined = undefined - $: if (flowEditor) { - flowCopilotContext.toggleAiPanel = flowEditor.toggleAiPanel - flowCopilotContext.addSelectedLinesToAiChat = flowEditor.addSelectedLinesToAiChat - } @@ -971,7 +965,6 @@ {#if $flowStateStore} - {#if lang && editor && diffEditor && $testStepStore[mod.id] && selectedJob && 'result' in selectedJob && selectedJob.result && typeof selectedJob.result == 'object' && `error` in selectedJob.result && selectedJob.result.error} - + {#if lang && editor && diffEditor && $testStepStore[mod.id] && selectedJob?.type === 'CompletedJob' && !selectedJob.success && getStringError(selectedJob.result)} + {/if} diff --git a/frontend/src/lib/components/ScriptEditor.svelte b/frontend/src/lib/components/ScriptEditor.svelte index 9fb0098bb9..aaa0510952 100644 --- a/frontend/src/lib/components/ScriptEditor.svelte +++ b/frontend/src/lib/components/ScriptEditor.svelte @@ -312,16 +312,6 @@ let testPanelSize = 30 let storedTestPanelSize = testPanelSize - function addSelectedLinesToAiChat( - e: CustomEvent<{ lines: string; startLine: number; endLine: number }> - ) { - if (!aiChatManager.open) { - aiChatManager.toggleOpen() - } - aiChatManager.addSelectedLinesToContext(e.detail.lines, e.detail.startLine, e.detail.endLine) - // aiChatManager.focusTextArea() TODO: Add this back - } - $: !SUPPORTED_CHAT_SCRIPT_LANGUAGES.includes(lang ?? '') && !aiChatManager.open && aiChatManager.toggleOpen() @@ -530,7 +520,10 @@ }} on:saveDraft on:toggleAiPanel={() => aiChatManager.toggleOpen()} - on:addSelectedLinesToAiChat={addSelectedLinesToAiChat} + on:addSelectedLinesToAiChat={(e) => { + const { lines, startLine, endLine } = e.detail + aiChatManager.addSelectedLinesToContext(lines, startLine, endLine) + }} on:toggleTestPanel={toggleTestPanel} cmdEnterAction={async () => { await inferSchema(code) @@ -678,10 +671,6 @@ { - aiChatManager.fix() - }} - fixChatMode {lang} previewJob={testJob} {pastPreviews} diff --git a/frontend/src/lib/components/copilot/ScriptFix.svelte b/frontend/src/lib/components/copilot/ScriptFix.svelte index a6dd7e2cdb..568abeb507 100644 --- a/frontend/src/lib/components/copilot/ScriptFix.svelte +++ b/frontend/src/lib/components/copilot/ScriptFix.svelte @@ -2,172 +2,23 @@ import { base } from '$lib/base' import { Button } from '../common' - import { SUPPORTED_LANGUAGES, copilot } from './lib' + import { SUPPORTED_LANGUAGES } from './lib' import type { SupportedLanguage } from '$lib/common' - import { sendUserToast } from '$lib/toast' - import type Editor from '../Editor.svelte' - import { dbSchemas, copilotInfo, type DBSchema, workspaceStore } from '$lib/stores' - import type DiffEditor from '../DiffEditor.svelte' - import { scriptLangToEditorLang } from '$lib/scripts' import Popover from '$lib/components/meltComponents/Popover.svelte' - import { writable } from 'svelte/store' - import { WindmillIcon } from '../icons' - import HighlightCode from '../HighlightCode.svelte' - import LoadingIcon from '../apps/svelte-select/lib/LoadingIcon.svelte' import { autoPlacement } from '@floating-ui/core' - import { Check, Wand2, X, RotateCw } from 'lucide-svelte' - import { createEventDispatcher } from 'svelte' + import { WandSparkles } from 'lucide-svelte' + import { aiChatManager } from './chat/AIChatManager.svelte' + import { copilotInfo } from '$lib/stores' - // props - export let lang: SupportedLanguage - export let editor: Editor | undefined - export let diffEditor: DiffEditor | undefined - export let error: string - export let args: Record - export let chatMode: boolean = false - - // state - let genLoading: boolean = false - let generatedCode = writable('') - let generatedExplanation = writable('') - let dbSchema: DBSchema | undefined = undefined - let abortController: AbortController | undefined = undefined - - const dispatch = createEventDispatcher<{ - fix: null - }>() - - async function onFix() { - if (!error) { - return - } - try { - genLoading = true - abortController = new AbortController() - await copilot( - { - language: lang, - code: editor?.getCode() || '', - error, - dbSchema: dbSchema, - type: 'fix', - workspace: $workspaceStore! - }, - generatedCode, - abortController, - generatedExplanation - ) - setupDiff() - diffEditor?.setModified($generatedCode) - showDiff() - } catch (err) { - if (!abortController?.signal.aborted) { - if (err?.message) { - sendUserToast('Failed to generate code: ' + err.message, true) - } else { - sendUserToast('Failed to generate code', true) - console.error(err) - } - } - } finally { - genLoading = false - } - } - - function acceptDiff() { - editor?.setCode(diffEditor?.getModified() || '') - editor?.format() - clear() - } - - function rejectDiff() { - clear() - } - - function setupDiff() { - diffEditor?.setupModel(scriptLangToEditorLang(lang)) - diffEditor?.setOriginal(editor?.getCode() || '') - } - - function showDiff() { - diffEditor?.show() - editor?.hide() - } - - function hideDiff() { - editor?.show() - diffEditor?.hide() - } - - function clear() { - $generatedCode = '' - $generatedExplanation = '' - } - - $: lang && clear() - - $: !$generatedCode && hideDiff() - - function updateSchema(lang, args) { - const schemaRes = lang === 'graphql' ? args.api : args.database - if (typeof schemaRes === 'string') { - dbSchema = $dbSchemas[schemaRes.replace('$res:', '')] - } - } - $: updateSchema(lang, args) - - let popover: Popover | undefined = undefined + let { + lang + }: { + lang: SupportedLanguage + } = $props() {#if SUPPORTED_LANGUAGES.has(lang)} - {#if !genLoading && $generatedCode.length > 0} -
- - -
- {/if} - +
- {#if $copilotInfo.enabled} -
- {#if $generatedCode.length > 0 && genLoading} -
- -
- {:else if genLoading} - - {/if} - {#if $generatedExplanation.length > 0} -

Explanation: test {$generatedExplanation}

- {/if} -
- {:else} -
-

Enable Windmill AI in the workspace settings

- {/if} +
+

Enable Windmill AI in the workspace settings

diff --git a/frontend/src/lib/components/copilot/chat/AIChatManager.svelte.ts b/frontend/src/lib/components/copilot/chat/AIChatManager.svelte.ts index ed7f25acd5..4642c16c5c 100644 --- a/frontend/src/lib/components/copilot/chat/AIChatManager.svelte.ts +++ b/frontend/src/lib/components/copilot/chat/AIChatManager.svelte.ts @@ -474,12 +474,20 @@ class AIChatManager { } fix = () => { + if (!this.open) { + this.toggleOpen() + } + this.changeMode('script') this.instructions = 'Fix the error' this.contextManager?.setFixContext() this.sendRequest() } addSelectedLinesToContext = (lines: string, startLine: number, endLine: number) => { + if (!this.open) { + this.toggleOpen() + } + this.changeMode('script') this.contextManager?.addSelectedLinesToContext(lines, startLine, endLine) } diff --git a/frontend/src/lib/components/copilot/flow.ts b/frontend/src/lib/components/copilot/flow.ts index 09341b6d21..c81d9dcd0f 100644 --- a/frontend/src/lib/components/copilot/flow.ts +++ b/frontend/src/lib/components/copilot/flow.ts @@ -12,6 +12,4 @@ export type FlowCopilotContext = { exprsToSet: Writable<{ [key: string]: InputTransform | undefined }> - toggleAiPanel?: () => void - addSelectedLinesToAiChat?: (lines: string, startLine: number, endLine: number) => void } diff --git a/frontend/src/lib/components/flows/FlowEditor.svelte b/frontend/src/lib/components/flows/FlowEditor.svelte index 4814d5f225..acd5dd7c1b 100644 --- a/frontend/src/lib/components/flows/FlowEditor.svelte +++ b/frontend/src/lib/components/flows/FlowEditor.svelte @@ -39,14 +39,6 @@ pickablePropertiesFiltered: writable(undefined) }) - export function addSelectedLinesToAiChat(lines: string, startLine: number, endLine: number) { - aiChatManager.addSelectedLinesToContext(lines, startLine, endLine) - if (!aiChatManager.open) { - aiChatManager.openChat() - aiChatManager.changeMode('script') - } - } - onMount(() => { aiChatManager.changeMode('flow') }) diff --git a/frontend/src/lib/components/flows/content/FlowModuleComponent.svelte b/frontend/src/lib/components/flows/content/FlowModuleComponent.svelte index 048c09fc1e..0cbf4ebb2d 100644 --- a/frontend/src/lib/components/flows/content/FlowModuleComponent.svelte +++ b/frontend/src/lib/components/flows/content/FlowModuleComponent.svelte @@ -51,7 +51,7 @@ import { workspaceStore } from '$lib/stores' import { checkIfParentLoop } from '../utils' import ModulePreviewResultViewer from '$lib/components/ModulePreviewResultViewer.svelte' - import type { FlowCopilotContext } from '$lib/components/copilot/flow' + import { aiChatManager } from '$lib/components/copilot/chat/AIChatManager.svelte' const { selectedId, @@ -66,9 +66,6 @@ executionCount } = getContext('FlowEditorContext') - const { toggleAiPanel, addSelectedLinesToAiChat } = - getContext('FlowCopilotContext') ?? {} - export let flowModule: FlowModule export let failureModule: boolean = false export let preprocessorModule: boolean = false @@ -392,10 +389,10 @@ { const { lines, startLine, endLine } = e.detail - addSelectedLinesToAiChat?.(lines, startLine, endLine) + aiChatManager.addSelectedLinesToContext(lines, startLine, endLine) }} on:toggleAiPanel={() => { - toggleAiPanel?.() + aiChatManager.toggleOpen() }} loadAsync folding diff --git a/frontend/src/lib/components/scriptEditor/LogPanel.svelte b/frontend/src/lib/components/scriptEditor/LogPanel.svelte index 47f0e96c0f..75f5055953 100644 --- a/frontend/src/lib/components/scriptEditor/LogPanel.svelte +++ b/frontend/src/lib/components/scriptEditor/LogPanel.svelte @@ -29,6 +29,7 @@ import WorkflowTimeline from '../WorkflowTimeline.svelte' import Tooltip from '$lib/components/Tooltip.svelte' import type { PreviewPanelUi } from '../custom_ui' + import { getStringError } from '../copilot/chat/utils' export let lang: Preview['language'] | undefined export let previewIsLoading = false @@ -40,7 +41,6 @@ export let workspace: string | undefined = undefined export let showCaptures: boolean = false export let customUi: PreviewPanelUi | undefined = undefined - export let fixChatMode: boolean = false type DrawerContent = { mode: 'json' | Preview['language'] | 'plain' @@ -141,16 +141,8 @@ language={lang} > - {#if lang && editor && diffEditor && args && previewJob?.result && typeof previewJob?.result == 'object' && `error` in previewJob?.result && previewJob?.result.error} - + {#if lang && editor && diffEditor && args && previewJob && !previewJob.success && getStringError(previewJob.result)} + {/if} From df4992a9295ed188c2a2cb0a5dfd3e33ae2e2dcb Mon Sep 17 00:00:00 2001 From: Alexander Petric Date: Thu, 5 Jun 2025 13:14:32 -0400 Subject: [PATCH 535/739] fix: broken event dispatch for simpleditor (#5879) * fix: broken event dispatch for simpleditor * also fix templateeditor end editor * revert fix for editor --- frontend/src/lib/components/SimpleEditor.svelte | 2 +- frontend/src/lib/components/TemplateEditor.svelte | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/lib/components/SimpleEditor.svelte b/frontend/src/lib/components/SimpleEditor.svelte index ac69ded87f..ab0cccf7b0 100644 --- a/frontend/src/lib/components/SimpleEditor.svelte +++ b/frontend/src/lib/components/SimpleEditor.svelte @@ -169,7 +169,7 @@ return } code = ncode - dispatch('change', ncode) + dispatch('change', { code: ncode }) } function updatePlaceholderVisibility(value: string) { diff --git a/frontend/src/lib/components/TemplateEditor.svelte b/frontend/src/lib/components/TemplateEditor.svelte index b7027633ca..84f9d20c22 100644 --- a/frontend/src/lib/components/TemplateEditor.svelte +++ b/frontend/src/lib/components/TemplateEditor.svelte @@ -478,7 +478,7 @@ return } code = ncode - dispatch('change', code) + dispatch('change', { code: ncode }) } let timeoutModel: NodeJS.Timeout | undefined = undefined From fe4a767df0e6f46fd0c0fd21b4116c7375978bf9 Mon Sep 17 00:00:00 2001 From: HugoCasa Date: Thu, 5 Jun 2025 19:18:50 +0200 Subject: [PATCH 536/739] fix: remove duplicate tools from script ai chat (#5880) --- frontend/src/lib/components/copilot/chat/script/core.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/lib/components/copilot/chat/script/core.ts b/frontend/src/lib/components/copilot/chat/script/core.ts index 9e76dd7689..d26210f7c7 100644 --- a/frontend/src/lib/components/copilot/chat/script/core.ts +++ b/frontend/src/lib/components/copilot/chat/script/core.ts @@ -306,7 +306,7 @@ export function prepareScriptTools( language: ScriptLang | 'bunnative', context: ContextElement[] ): Tool[] { - const tools: Tool[] = [resourceTypeTool, dbSchemaTool] + const tools: Tool[] = [] if (['python3', 'php', 'bun', 'deno', 'nativets', 'bunnative'].includes(language)) { tools.push(resourceTypeTool) } From 67ab46990ad0c9fad810a64c54297419c6151c79 Mon Sep 17 00:00:00 2001 From: centdix <40307056+centdix@users.noreply.github.com> Date: Thu, 5 Jun 2025 19:23:08 +0200 Subject: [PATCH 537/739] feat: Add ask mode to AI chat (#5878) * add ask mode * fix aichat z index * fix * Update FlowEditor.svelte --------- Co-authored-by: Ruben Fiszel --- .../src/lib/components/ScriptEditor.svelte | 6 +- .../lib/components/copilot/chat/AIChat.svelte | 5 +- .../copilot/chat/AIChatDisplay.svelte | 14 +-- .../copilot/chat/AIChatManager.svelte.ts | 66 ++++++++------ .../components/copilot/chat/ChatMode.svelte | 27 +++--- .../lib/components/copilot/chat/ask/core.ts | 40 +++++++++ .../components/copilot/chat/navigator/core.ts | 90 ++++++++++--------- .../lib/components/flows/FlowEditor.svelte | 6 +- frontend/src/lib/zIndexes.ts | 1 + .../src/routes/(root)/(logged)/+layout.svelte | 7 +- 10 files changed, 154 insertions(+), 108 deletions(-) create mode 100644 frontend/src/lib/components/copilot/chat/ask/core.ts diff --git a/frontend/src/lib/components/ScriptEditor.svelte b/frontend/src/lib/components/ScriptEditor.svelte index aaa0510952..13b63437c7 100644 --- a/frontend/src/lib/components/ScriptEditor.svelte +++ b/frontend/src/lib/components/ScriptEditor.svelte @@ -45,7 +45,7 @@ import { createDispatcherIfMounted } from '$lib/createDispatcherIfMounted' import { getStringError } from './copilot/chat/utils' import type { ScriptOptions } from './copilot/chat/ContextManager.svelte' - import { aiChatManager } from './copilot/chat/AIChatManager.svelte' + import { aiChatManager, AIMode } from './copilot/chat/AIChatManager.svelte' import TriggerableByAI from './TriggerableByAI.svelte' // Exported @@ -202,7 +202,7 @@ onMount(() => { inferSchema(code) loadPastTests() - aiChatManager.changeMode('script') + aiChatManager.changeMode(AIMode.SCRIPT) }) setLicense() @@ -279,7 +279,7 @@ aiChatManager.scriptEditorApplyCode = undefined aiChatManager.scriptEditorShowDiffMode = undefined aiChatManager.scriptEditorOptions = undefined - aiChatManager.changeMode('navigator') + aiChatManager.changeMode(AIMode.NAVIGATOR) }) function asKind(str: string | undefined) { diff --git a/frontend/src/lib/components/copilot/chat/AIChat.svelte b/frontend/src/lib/components/copilot/chat/AIChat.svelte index 3fe35e6ffc..d664c6aa05 100644 --- a/frontend/src/lib/components/copilot/chat/AIChat.svelte +++ b/frontend/src/lib/components/copilot/chat/AIChat.svelte @@ -9,7 +9,7 @@ userStore, workspaceStore } from '$lib/stores' - import { aiChatManager } from './AIChatManager.svelte' + import { aiChatManager, AIMode } from './AIChatManager.svelte' import { base } from '$lib/base' import HideButton from '$lib/components/apps/editor/settingsPanel/HideButton.svelte' @@ -39,7 +39,7 @@ removeDiff?: boolean addBackCode?: boolean instructions?: string - mode?: 'script' | 'flow' | 'navigator' + mode?: AIMode lang?: ScriptLang | 'bunnative' isPreprocessor?: boolean } = {} @@ -109,7 +109,6 @@ aiChatManager.contextManager.getSelectedContext(), diff --git a/frontend/src/lib/components/copilot/chat/AIChatDisplay.svelte b/frontend/src/lib/components/copilot/chat/AIChatDisplay.svelte index 8728ba954d..d3a2cf7e40 100644 --- a/frontend/src/lib/components/copilot/chat/AIChatDisplay.svelte +++ b/frontend/src/lib/components/copilot/chat/AIChatDisplay.svelte @@ -15,10 +15,9 @@ import ProviderModelSelector from './ProviderModelSelector.svelte' import ChatMode from './ChatMode.svelte' import Markdown from 'svelte-exmarkdown' - import { aiChatManager } from './AIChatManager.svelte' + import { aiChatManager, AIMode } from './AIChatManager.svelte' let { - allowedModes, messages, pastChats, hasDiff, @@ -36,11 +35,6 @@ disabledMessage = '', suggestions = [] }: { - allowedModes: { - script: boolean - flow: boolean - navigator: boolean - } messages: DisplayMessage[] pastChats: { id: string; title: string }[] hasDiff?: boolean @@ -330,17 +324,17 @@ {/if} {#if disabled} -
+
{:else}
- +
{/if}
- {#if aiChatManager.mode === 'navigator' && suggestions.length > 0 && messages.filter((m) => m.role === 'user').length === 0 && !disabled} + {#if (aiChatManager.mode === AIMode.NAVIGATOR || aiChatManager.mode === AIMode.ASK) && suggestions.length > 0 && messages.filter((m) => m.role === 'user').length === 0 && !disabled}
{#each suggestions as suggestion} diff --git a/frontend/src/lib/components/copilot/chat/AIChatManager.svelte.ts b/frontend/src/lib/components/copilot/chat/AIChatManager.svelte.ts index 4642c16c5c..1c5526556b 100644 --- a/frontend/src/lib/components/copilot/chat/AIChatManager.svelte.ts +++ b/frontend/src/lib/components/copilot/chat/AIChatManager.svelte.ts @@ -28,23 +28,31 @@ import type { FlowModuleState, FlowState } from '$lib/components/flows/flowState import type { CurrentEditor, ExtendedOpenFlow } from '$lib/components/flows/types' import { untrack } from 'svelte' import type { DBSchemas } from '$lib/stores' +import { askTools, prepareAskSystemMessage } from './ask/core' type TriggerablesMap = Record< string, { description: string; onTrigger: ((value?: string) => void) | undefined } > +export enum AIMode { + SCRIPT = 'script', + FLOW = 'flow', + NAVIGATOR = 'navigator', + ASK = 'ask' +} + class AIChatManager { DEFAULT_SIZE = 22 NAVIGATION_SYSTEM_PROMPT = ` CONSIDERATIONS: - You are provided with a tool to switch to navigation mode, only use it when you are sure that the user is asking you to navigate the application or help them find something. Do not use it otherwise. ` - contextManager = new ContextManager() historyManager = new HistoryManager() abortController: AbortController | undefined = undefined + mode = $state(AIMode.NAVIGATOR) size = $state(localStorage.getItem('ai-chat-open') === 'true' ? this.DEFAULT_SIZE : 0) savedSize = $state(0) instructions = $state('') @@ -66,29 +74,29 @@ class AIChatManager { scriptEditorApplyCode = $state<((code: string) => void) | undefined>(undefined) scriptEditorShowDiffMode = $state<(() => void) | undefined>(undefined) flowAiChatHelpers = $state(undefined) - mode = $state<'script' | 'flow' | 'navigator'>('navigator') pendingNewCode = $state(undefined) - allowedModes = $derived({ + allowedModes: Record = $derived({ script: this.scriptEditorOptions !== undefined, flow: this.flowAiChatHelpers !== undefined, - navigator: true + navigator: true, + ask: true }) open = $derived(this.size > 0) - updateMode(currentMode: 'script' | 'flow' | 'navigator') { + updateMode(currentMode: AIMode) { if ( !this.allowedModes[currentMode] && Object.keys(this.allowedModes).filter((k) => this.allowedModes[k]).length === 1 ) { const firstKey = Object.keys(this.allowedModes).filter((k) => this.allowedModes[k])[0] - this.changeMode(firstKey as 'script' | 'flow' | 'navigator') + this.changeMode(firstKey as AIMode) } } changeMode( - mode: 'script' | 'flow' | 'navigator', + mode: AIMode, pendingPrompt?: string, options?: { closeScriptSettings?: boolean @@ -96,7 +104,7 @@ class AIChatManager { ) { this.mode = mode this.pendingPrompt = pendingPrompt ?? '' - if (mode === 'script') { + if (mode === AIMode.SCRIPT) { this.systemMessage = prepareScriptSystemMessage() this.systemMessage.content = this.NAVIGATION_SYSTEM_PROMPT + this.systemMessage.content const context = this.contextManager.getSelectedContext() @@ -111,19 +119,23 @@ class AIChatManager { closeComponent.onTrigger?.() } } - } else if (mode === 'flow') { + } else if (mode === AIMode.FLOW) { this.systemMessage = prepareFlowSystemMessage() this.systemMessage.content = this.NAVIGATION_SYSTEM_PROMPT + this.systemMessage.content this.tools = [this.changeModeTool, ...flowTools] this.helpers = this.flowAiChatHelpers - } else if (mode === 'navigator') { + } else if (mode === AIMode.NAVIGATOR) { this.systemMessage = prepareNavigatorSystemMessage() this.tools = [this.changeModeTool, ...navigatorTools] this.helpers = {} + } else if (mode === AIMode.ASK) { + this.systemMessage = prepareAskSystemMessage() + this.tools = [...askTools] + this.helpers = {} } } - canApplyCode = $derived(this.allowedModes.script && this.mode === 'script') + canApplyCode = $derived(this.allowedModes.script && this.mode === AIMode.SCRIPT) private changeModeTool = { def: { @@ -152,7 +164,7 @@ class AIChatManager { }, fn: async ({ args, toolId, toolCallbacks }) => { toolCallbacks.onToolCall(toolId, 'Switching to ' + args.mode + ' mode...') - this.changeMode(args.mode as 'script' | 'flow' | 'navigator', args.pendingPrompt, { + this.changeMode(args.mode as AIMode, args.pendingPrompt, { closeScriptSettings: true }) toolCallbacks.onFinishToolCall(toolId, 'Switched to ' + args.mode + ' mode') @@ -222,18 +234,18 @@ class AIChatManager { let pendingPrompt = this.pendingPrompt let pendingUserMessage: ChatCompletionUserMessageParam | undefined = undefined if (pendingPrompt) { - if (this.mode === 'script') { + if (this.mode === AIMode.SCRIPT) { pendingUserMessage = await prepareScriptUserMessage( pendingPrompt, this.scriptEditorOptions?.lang as ScriptLang | 'bunnative', this.contextManager.getSelectedContext() ) - } else if (this.mode === 'flow') { + } else if (this.mode === AIMode.FLOW) { pendingUserMessage = prepareFlowUserMessage( pendingPrompt, this.flowAiChatHelpers!.getFlowAndSelectedId() ) - } else if (this.mode === 'navigator') { + } else if (this.mode === AIMode.NAVIGATOR) { pendingUserMessage = prepareNavigatorUserMessage(pendingPrompt) } this.pendingPrompt = '' @@ -327,15 +339,15 @@ class AIChatManager { removeDiff?: boolean addBackCode?: boolean instructions?: string - mode?: 'script' | 'flow' | 'navigator' + mode?: AIMode lang?: ScriptLang | 'bunnative' isPreprocessor?: boolean } = {} ) => { if (options.mode) { - this.changeMode(options.mode, '') + this.changeMode(options.mode) } else { - this.changeMode(this.mode, '') + this.changeMode(this.mode) } if (options.instructions) { this.instructions = options.instructions @@ -345,7 +357,7 @@ class AIChatManager { } try { const oldSelectedContext = this.contextManager?.getSelectedContext() ?? [] - if (this.mode === 'script') { + if (this.mode === AIMode.SCRIPT) { this.contextManager?.updateContextOnRequest(options) } this.loading = true @@ -357,13 +369,13 @@ class AIChatManager { { role: 'user', content: this.instructions, - contextElements: this.mode === 'script' ? oldSelectedContext : undefined + contextElements: this.mode === AIMode.SCRIPT ? oldSelectedContext : undefined } ] const oldInstructions = this.instructions this.instructions = '' - if (this.mode === 'script' && !this.scriptEditorOptions && !options.lang) { + if (this.mode === AIMode.SCRIPT && !this.scriptEditorOptions && !options.lang) { throw new Error('No script options passed') } @@ -372,9 +384,9 @@ class AIChatManager { this.scriptEditorOptions?.path === 'preprocessor' || options.isPreprocessor const userMessage = - this.mode === 'flow' + this.mode === AIMode.FLOW ? prepareFlowUserMessage(oldInstructions, this.flowAiChatHelpers!.getFlowAndSelectedId()) - : this.mode === 'navigator' + : this.mode === AIMode.NAVIGATOR ? prepareNavigatorUserMessage(oldInstructions) : await prepareScriptUserMessage(oldInstructions, lang, oldSelectedContext, { isPreprocessor @@ -405,7 +417,7 @@ class AIChatManager { role: 'assistant', content: this.currentReply, contextElements: - this.mode === 'script' + this.mode === AIMode.SCRIPT ? oldSelectedContext.filter((c) => c.type === 'code') : undefined } @@ -433,7 +445,7 @@ class AIChatManager { } } - if (this.mode === 'flow' && !this.flowAiChatHelpers) { + if (this.mode === AIMode.FLOW && !this.flowAiChatHelpers) { throw new Error('No flow helpers found') } await this.chatRequest({ @@ -447,7 +459,7 @@ class AIChatManager { role: 'assistant', content: this.currentReply, contextElements: - this.mode === 'script' + this.mode === AIMode.SCRIPT ? oldSelectedContext.filter((c) => c.type === 'code') : undefined } @@ -513,7 +525,7 @@ class AIChatManager { this.flowAiChatHelpers.selectStep(moduleId) await this.sendRequest({ instructions: instructions, - mode: 'script', + mode: AIMode.SCRIPT, lang: lang, isPreprocessor: moduleId === 'preprocessor' }) diff --git a/frontend/src/lib/components/copilot/chat/ChatMode.svelte b/frontend/src/lib/components/copilot/chat/ChatMode.svelte index c249826980..3a08f5d97b 100644 --- a/frontend/src/lib/components/copilot/chat/ChatMode.svelte +++ b/frontend/src/lib/components/copilot/chat/ChatMode.svelte @@ -2,21 +2,14 @@ import { ChevronDown } from 'lucide-svelte' import Popover from '$lib/components/meltComponents/Popover.svelte' import { twMerge } from 'tailwind-merge' - import { aiChatManager } from './AIChatManager.svelte' - let { - allowedModes - }: { - allowedModes: { - script: boolean - flow: boolean - navigator: boolean - } - } = $props() + import { aiChatManager, AIMode } from './AIChatManager.svelte'
allowedModes[k]).length < 2} + disablePopup={Object.keys(aiChatManager.allowedModes).filter( + (k) => aiChatManager.allowedModes[k] + ).length < 2} class="max-w-full" > @@ -24,9 +17,9 @@ class="text-tertiary text-xs flex flex-row items-center font-normal gap-0.5 border px-1 rounded-lg" > - {aiChatManager.mode} mode + {aiChatManager.mode.charAt(0).toUpperCase() + aiChatManager.mode.slice(1)} mode - {#if Object.keys(allowedModes).filter((k) => allowedModes[k]).length > 1} + {#if Object.keys(aiChatManager.allowedModes).filter((k) => aiChatManager.allowedModes[k]).length > 1}
@@ -35,19 +28,19 @@
- {#each ['script', 'flow', 'navigator'] as possibleMode} - {#if allowedModes[possibleMode]} + {#each Object.values(AIMode) as possibleMode} + {#if aiChatManager.allowedModes[possibleMode]} {/if} {/each} diff --git a/frontend/src/lib/components/copilot/chat/ask/core.ts b/frontend/src/lib/components/copilot/chat/ask/core.ts new file mode 100644 index 0000000000..997594cc88 --- /dev/null +++ b/frontend/src/lib/components/copilot/chat/ask/core.ts @@ -0,0 +1,40 @@ +import type { + ChatCompletionSystemMessageParam, + ChatCompletionUserMessageParam +} from 'openai/resources/index.mjs' +import type { Tool } from '../shared' +import { getDocumentationTool } from '../navigator/core' + +export const CHAT_SYSTEM_PROMPT = ` +You are Windmill's intelligent assistant, designed to answer questions about its functionality. It is your only purpose to help the user in the context of the windmill application. +Windmill is an open-source developer platform for building internal tools, API integrations, background jobs, workflows, and user interfaces. It offers a unified system where scripts are automatically turned into sharable UIs and can be composed into flows or embedded in custom applications. + +You have access to these tools: +1. Get documentation for user requests (get_documentation) + +INSTRUCTIONS: +- When user asks about something, use the get_documentation tool to retrieve accurate information about how to fulfill the user's request. +- Complete your response with precisions about how it works based on the documentation. Also drop a link to the relevant documentation if possible. +- If the user asks about something that you are unsure about, say that you are not sure about the answer and suggest to ask the question to the windmill team. + +GENERAL PRINCIPLES: +- Be concise but thorough +- Maintain a friendly, professional tone +- If you encounter an error or can't complete a request, explain why and suggest alternatives +` + +export const askTools: Tool<{}>[] = [getDocumentationTool] + +export function prepareAskSystemMessage(): ChatCompletionSystemMessageParam { + return { + role: 'system', + content: CHAT_SYSTEM_PROMPT + } +} + +export function prepareAskUserMessage(instructions: string): ChatCompletionUserMessageParam { + return { + role: 'user', + content: instructions + } +} diff --git a/frontend/src/lib/components/copilot/chat/navigator/core.ts b/frontend/src/lib/components/copilot/chat/navigator/core.ts index 7aae89e8eb..e438d13501 100644 --- a/frontend/src/lib/components/copilot/chat/navigator/core.ts +++ b/frontend/src/lib/components/copilot/chat/navigator/core.ts @@ -234,51 +234,53 @@ async function getDocumentation(args: { request: string }): Promise { return data.choices[0].message.content } -export const navigatorTools: Tool<{}>[] = [ - { - def: GET_TRIGGERABLE_COMPONENTS_TOOL, - fn: async ({ toolId, toolCallbacks }) => { - toolCallbacks.onToolCall(toolId, 'Looking for screen components...') - const components = getTriggerableComponents() - toolCallbacks.onFinishToolCall(toolId, 'Retrieved screen components') - return components - } - }, - { - def: EXECUTE_COMMAND_TOOL, - fn: async ({ args, toolId, toolCallbacks }) => { - toolCallbacks.onToolCall(toolId, 'Clicking on component...') - const result = triggerComponent(args) - toolCallbacks.onFinishToolCall( - toolId, - 'Clicked ' + args.description.charAt(0).toLowerCase() + args.description.slice(1) - ) - return result - } - }, - { - def: GET_DOCUMENTATION_TOOL, - fn: async ({ args, toolId, toolCallbacks }) => { - toolCallbacks.onToolCall(toolId, 'Getting documentation...') - try { - const docResult = await getDocumentation(args) - toolCallbacks.onFinishToolCall(toolId, 'Retrieved documentation') - return docResult - } catch (error) { - toolCallbacks.onFinishToolCall(toolId, 'Failed to get documentation') - console.error('Error getting documentation:', error) - return 'Failed to get documentation, pursuing with the user request...' - } - } - }, - { - def: GET_CURRENT_PAGE_NAME_TOOL, - fn: async ({ toolId, toolCallbacks }) => { - const pageName = getCurrentPageName() - toolCallbacks.onFinishToolCall(toolId, 'Retrieved current page name') - return pageName - } +const triggerComponentTool: Tool<{}> = { + def: EXECUTE_COMMAND_TOOL, + fn: async ({ args, toolId, toolCallbacks }) => { + toolCallbacks.onToolCall(toolId, 'Clicking on component...') + const result = triggerComponent(args) + toolCallbacks.onFinishToolCall( + toolId, + 'Clicked ' + args.description.charAt(0).toLowerCase() + args.description.slice(1) + ) + return result } +} + +const getTriggerableComponentsTool: Tool<{}> = { + def: GET_TRIGGERABLE_COMPONENTS_TOOL, + fn: async ({ toolId, toolCallbacks }) => { + toolCallbacks.onToolCall(toolId, 'Looking for screen components...') + const components = getTriggerableComponents() + toolCallbacks.onFinishToolCall(toolId, 'Retrieved screen components') + return components + } +} + +const getCurrentPageNameTool: Tool<{}> = { + def: GET_CURRENT_PAGE_NAME_TOOL, + fn: async ({ toolId, toolCallbacks }) => { + const pageName = getCurrentPageName() + toolCallbacks.onFinishToolCall(toolId, 'Retrieved current page name') + return pageName + } +} + +export const getDocumentationTool: Tool<{}> = { + def: GET_DOCUMENTATION_TOOL, + fn: async ({ args, toolId, toolCallbacks }) => { + toolCallbacks.onToolCall(toolId, 'Getting documentation...') + const docResult = await getDocumentation(args) + toolCallbacks.onFinishToolCall(toolId, 'Retrieved documentation') + return docResult + } +} + +export const navigatorTools: Tool<{}>[] = [ + getTriggerableComponentsTool, + triggerComponentTool, + getDocumentationTool, + getCurrentPageNameTool ] export function prepareNavigatorSystemMessage(): ChatCompletionSystemMessageParam { diff --git a/frontend/src/lib/components/flows/FlowEditor.svelte b/frontend/src/lib/components/flows/FlowEditor.svelte index acd5dd7c1b..a34ef3caa9 100644 --- a/frontend/src/lib/components/flows/FlowEditor.svelte +++ b/frontend/src/lib/components/flows/FlowEditor.svelte @@ -13,7 +13,7 @@ import type { Flow } from '$lib/gen' import type { Trigger } from '$lib/components/triggers/utils' import FlowAIChat from '../copilot/chat/flow/FlowAIChat.svelte' - import { aiChatManager } from '../copilot/chat/AIChatManager.svelte' + import { aiChatManager, AIMode } from '../copilot/chat/AIChatManager.svelte' import TriggerableByAI from '../TriggerableByAI.svelte' const { flowStore } = getContext('FlowEditorContext') @@ -40,11 +40,11 @@ }) onMount(() => { - aiChatManager.changeMode('flow') + aiChatManager.changeMode(AIMode.FLOW) }) onDestroy(() => { - aiChatManager.changeMode('navigator') + aiChatManager.changeMode(AIMode.NAVIGATOR) }) diff --git a/frontend/src/lib/zIndexes.ts b/frontend/src/lib/zIndexes.ts index c578681651..5dcc315202 100644 --- a/frontend/src/lib/zIndexes.ts +++ b/frontend/src/lib/zIndexes.ts @@ -4,6 +4,7 @@ export const zIndexes = { splitPanelHandle: 1001, colorInput: 1002, disposables: 1100, // Modals and Drawers + aiChat: 1200, svelteSelectOptions: 5000, popover: 5001, contextMenu: 6000, diff --git a/frontend/src/routes/(root)/(logged)/+layout.svelte b/frontend/src/routes/(root)/(logged)/+layout.svelte index 5f98044ebf..bc26efb9e4 100644 --- a/frontend/src/routes/(root)/(logged)/+layout.svelte +++ b/frontend/src/routes/(root)/(logged)/+layout.svelte @@ -56,6 +56,7 @@ import { aiChatManager } from '$lib/components/copilot/chat/AIChatManager.svelte' import { Pane, Splitpanes } from 'svelte-splitpanes' import AiChat from '$lib/components/copilot/chat/AIChat.svelte' + import { zIndexes } from '$lib/zIndexes' OpenAPI.WITH_CREDENTIALS = true let menuOpen = false let globalSearchModal: GlobalSearchModal | undefined = undefined @@ -708,7 +709,11 @@
- + From 4447fe9c88c32ed1f580a89876a94f16caaa5606 Mon Sep 17 00:00:00 2001 From: dieriba Date: Thu, 5 Jun 2025 19:25:46 +0200 Subject: [PATCH 538/739] handle cancel pendings jobs (#5881) --- frontend/src/lib/components/WorkerRepl.svelte | 156 +++++++++++++++++- frontend/src/lib/components/jobs/utils.ts | 60 ++++++- 2 files changed, 199 insertions(+), 17 deletions(-) diff --git a/frontend/src/lib/components/WorkerRepl.svelte b/frontend/src/lib/components/WorkerRepl.svelte index e49c8211a1..e6c79cca05 100644 --- a/frontend/src/lib/components/WorkerRepl.svelte +++ b/frontend/src/lib/components/WorkerRepl.svelte @@ -2,11 +2,11 @@ import { onMount } from 'svelte' import { Terminal } from 'xterm' import 'xterm/css/xterm.css' - import { runScriptAndPollResult } from './jobs/utils' + import { pollJobResult, runScript } from './jobs/utils' import { workspaceStore } from '$lib/stores' import { Badge, Button, Drawer, DrawerContent, Skeleton } from './common' import DarkModeObserver from './DarkModeObserver.svelte' - import { Library, Play } from 'lucide-svelte' + import { Eye, Library, Play, RefreshCw, Square } from 'lucide-svelte' import Editor from './Editor.svelte' import WorkspaceScriptPicker from './flows/pickers/WorkspaceScriptPicker.svelte' import ToggleHubWorkspace from './ToggleHubWorkspace.svelte' @@ -17,6 +17,10 @@ import { FitAddon } from '@xterm/addon-fit' import { Readline } from 'xterm-readline' import Tooltip from './Tooltip.svelte' + import { JobService, type QueuedJob } from '$lib/gen' + import { sendUserToast } from '$lib/toast' + import Select from './Select.svelte' + import { emptyString } from '$lib/utils' let container: HTMLDivElement let term: Terminal @@ -29,12 +33,17 @@ let editor = $state(null) let darkMode = $state(false) let pick_existing: 'workspace' | 'hub' = $state('workspace') + let jobId = $state('') + let selectedJobId = $state('') let codeViewer: Drawer | undefined = $state() let filter = $state('') let { tag }: Props = $props() let code: string = $state('') let working_directory = $state('~') let homeDirectory: string = '~' + let pendingsJobs: Array = $state([]) + let loadingPendingJobs = $state(false) + let isCancelingJob = $state(false) let prompt = $derived( `$-${working_directory === '/' ? '/' : working_directory.split('/').at(-1)} ` ) @@ -86,7 +95,7 @@ } } - let result: any = await runScriptAndPollResult({ + jobId = await runScript({ workspace: $workspaceStore!, requestBody: { language: 'bash', @@ -95,6 +104,9 @@ args: {} } }) + + let result: any = await pollJobResult(jobId, $workspaceStore!) + if (isOnlyCdCommand) { working_directory = (result as string).replace(/(\r\n|\n|\r)/g, '') result = '' @@ -109,6 +121,40 @@ const rl = new Readline() + async function listPendingJobs() { + try { + loadingPendingJobs = true + pendingsJobs = await JobService.listQueue({ + workspace: $workspaceStore!, + tag, + running: true + }) + } catch (error) { + sendUserToast(error.body || error.message) + } finally { + loadingPendingJobs = false + } + } + + async function listPendingJobsAndUpdateSelectedJobid() { + await listPendingJobs() + if (!pendingsJobs.find((pendingJob) => pendingJob.id === selectedJobId)) { + selectedJobId = '' + } + } + + async function cancelJob(jobId: string) { + try { + await JobService.cancelQueuedJob({ + workspace: $workspaceStore! ?? '', + id: jobId, + requestBody: {} + }) + } catch (err) { + sendUserToast(err.BodyDropPivotTarget, true) + } + } + onMount(async () => { term = new Terminal({ cursorBlink: true, @@ -133,6 +179,11 @@ setTimeout(readLine) } + rl.setCtrlCHandler(async () => { + await cancelJob(jobId) + rl.read(prompt).then(processLine) + }) + const fitAddon = new FitAddon() term.loadAddon(fitAddon) term.open(container) @@ -176,9 +227,8 @@ } async function onScriptPick(e: { detail: { path: string } }) { - codeObj = undefined - codeViewer?.openDrawer?.() codeObj = await getScriptByPath(e.detail.path ?? '') + codeViewer?.openDrawer?.() } async function replacePromptWithCommand(command: string) { @@ -192,6 +242,8 @@ await handleCommand(input) term.write(prompt) } + + listPendingJobs() @@ -221,8 +273,94 @@
-
-
+
+
+ {#if pendingsJobs.length === 0} + + {:else} +
+
-
-
+
+
diff --git a/frontend/src/lib/components/jobs/utils.ts b/frontend/src/lib/components/jobs/utils.ts index 6e5f570529..294df7c3ff 100644 --- a/frontend/src/lib/components/jobs/utils.ts +++ b/frontend/src/lib/components/jobs/utils.ts @@ -1,22 +1,57 @@ import { JobService, type RunScriptByPathData, type RunScriptPreviewData } from '$lib/gen' - -function isRunScriptByPathData(arg:RunScriptPreviewData | RunScriptByPathData): arg is RunScriptByPathData { - return (arg as RunScriptByPathData).path !== undefined; +function isRunScriptByPathData( + arg: RunScriptPreviewData | RunScriptByPathData +): arg is RunScriptByPathData { + return (arg as RunScriptByPathData).path !== undefined } -export async function runScriptAndPollResult( - data: RunScriptPreviewData | RunScriptByPathData, - { maxRetries = 7, withJobData }: { maxRetries?: number; withJobData?: boolean } = {} +type RunScriptOptions = { + maxRetries?: number + withJobData?: boolean +} + +/** + * @function runScript + * @param {RunScriptPreviewData | RunScriptByPathData} data - Data for running the script. + * @returns {Promise} A UUID representing the running script. + * + * @example + * const uuid = await runScript(data) + */ +export async function runScript(data: RunScriptPreviewData | RunScriptByPathData) { + const uuid = ( + isRunScriptByPathData(data) + ? await JobService.runScriptByPath(data) + : await JobService.runScriptPreview(data) + ) as string + + return uuid +} + +/** + * @function pollJobResult + * @description Polls a job result by UUID until success, failure, or max retries reached. + * @param {string} uuid - Job UUID. + * @param {string} workspace - Workspace identifier. + * @param {RunScriptOptions} [options] - Optional settings like retries and job data inclusion. + * @returns {Promise} Final job result or throws error if it fails. + * + * @example + * const result = await pollJobResult(uuid, 'my-workspace', { maxRetries: 5, withJobData: true }); + */ +export async function pollJobResult( + uuid: string, + workspace: string, + { maxRetries = 7, withJobData }: RunScriptOptions = {} ): Promise { - const uuid = (isRunScriptByPathData(data) ? await JobService.runScriptByPath(data) : await JobService.runScriptPreview(data)) as string let attempts = 0 while (attempts < maxRetries) { try { await new Promise((resolve) => setTimeout(resolve, 500 * (attempts || 0.75))) const job = await JobService.getCompletedJobResultMaybe({ id: uuid, - workspace: data.workspace + workspace }) if (job.success) { if (withJobData) { @@ -41,3 +76,12 @@ export async function runScriptAndPollResult( throw 'Could not get job result, should not get here' } + +export async function runScriptAndPollResult( + data: RunScriptPreviewData | RunScriptByPathData, + runScriptOptions?: RunScriptOptions +): Promise { + const uuid = await runScript(data) + + return await pollJobResult(uuid, data.workspace, runScriptOptions) +} From 5c38f0dbeed150d30bc455888e31093070409d50 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 5 Jun 2025 19:28:52 +0200 Subject: [PATCH 539/739] fix npm check --- .../src/lib/components/copilot/chat/AIChatManager.svelte.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/lib/components/copilot/chat/AIChatManager.svelte.ts b/frontend/src/lib/components/copilot/chat/AIChatManager.svelte.ts index 1c5526556b..edb407093f 100644 --- a/frontend/src/lib/components/copilot/chat/AIChatManager.svelte.ts +++ b/frontend/src/lib/components/copilot/chat/AIChatManager.svelte.ts @@ -489,7 +489,7 @@ class AIChatManager { if (!this.open) { this.toggleOpen() } - this.changeMode('script') + this.changeMode(AIMode.SCRIPT) this.instructions = 'Fix the error' this.contextManager?.setFixContext() this.sendRequest() @@ -499,7 +499,7 @@ class AIChatManager { if (!this.open) { this.toggleOpen() } - this.changeMode('script') + this.changeMode(AIMode.SCRIPT) this.contextManager?.addSelectedLinesToContext(lines, startLine, endLine) } From fe481e02bcdded9a84010974669968c4b53578e9 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 5 Jun 2025 19:30:32 +0200 Subject: [PATCH 540/739] chore(main): release 1.495.0 (#5852) * chore(main): release 1.495.0 * Apply automatic changes --------- Co-authored-by: rubenfiszel <275584+rubenfiszel@users.noreply.github.com> --- CHANGELOG.md | 25 + backend/Cargo.lock | 524 ++++++------------ backend/Cargo.toml | 4 +- backend/windmill-api/openapi.yaml | 2 +- benchmarks/lib.ts | 2 +- cli/main.ts | 2 +- frontend/package-lock.json | 4 +- frontend/package.json | 2 +- lsp/Pipfile | 4 +- openflow.openapi.yaml | 2 +- .../WindmillClient/WindmillClient.psd1 | 2 +- python-client/wmill/pyproject.toml | 2 +- python-client/wmill_pg/pyproject.toml | 2 +- typescript-client/jsr.json | 2 +- typescript-client/package.json | 2 +- version.txt | 2 +- 16 files changed, 222 insertions(+), 361 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 94351573de..9f0dc16067 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,30 @@ # Changelog +## [1.495.0](https://github.com/windmill-labs/windmill/compare/v1.494.0...v1.495.0) (2025-06-05) + + +### Features + +* Add ask mode to AI chat ([#5878](https://github.com/windmill-labs/windmill/issues/5878)) ([67ab469](https://github.com/windmill-labs/windmill/commit/67ab46990ad0c9fad810a64c54297419c6151c79)) +* add navigator mode to AIChat and unify UI ([#5859](https://github.com/windmill-labs/windmill/issues/5859)) ([cbba829](https://github.com/windmill-labs/windmill/commit/cbba8297cd4c1caa21b96a8422bbbd5c306b8398)) +* ai flow chat ([#5842](https://github.com/windmill-labs/windmill/issues/5842)) ([68ebf66](https://github.com/windmill-labs/windmill/commit/68ebf667d5c0bc306329d0b55a3cc59e5b4862cb)) +* ai prompts improvements + o3/o4 support ([#5862](https://github.com/windmill-labs/windmill/issues/5862)) ([825422c](https://github.com/windmill-labs/windmill/commit/825422c48456b2c9b230e1a35914b3fbf7d1e836)) +* connect fix btn in flow editor to ai chat ([#5863](https://github.com/windmill-labs/windmill/issues/5863)) ([6247d15](https://github.com/windmill-labs/windmill/commit/6247d159ce25ae13f6fbc5c105df88305ce29451)) +* fix backward compatibility pg 14 for postgres trigger ([#5851](https://github.com/windmill-labs/windmill/issues/5851)) ([4cbcbdb](https://github.com/windmill-labs/windmill/commit/4cbcbdb960b469acf773d3943128b6c7d0dcb0b8)) +* ssh repl like direct to workers hosts machine ([#5809](https://github.com/windmill-labs/windmill/issues/5809)) ([f252657](https://github.com/windmill-labs/windmill/commit/f2526571a3614156b2b1e5cc91b15d0c57565d99)) +* use rust-postgres client instead of sqlx for postgres trigger ([#5853](https://github.com/windmill-labs/windmill/issues/5853)) ([39dbd64](https://github.com/windmill-labs/windmill/commit/39dbd646b9683e0ad8de047cca786ae468759e77)) + + +### Bug Fixes + +* broken event dispatch for simpleditor ([#5879](https://github.com/windmill-labs/windmill/issues/5879)) ([df4992a](https://github.com/windmill-labs/windmill/commit/df4992a9295ed188c2a2cb0a5dfd3e33ae2e2dcb)) +* cannot parse INSTANCE_PYTHON_VERSION ([#5874](https://github.com/windmill-labs/windmill/issues/5874)) ([a0b302d](https://github.com/windmill-labs/windmill/commit/a0b302d2c58d4245260376cf280bc866be91717c)) +* fix regex that extract workspaces from custom tags ([#5876](https://github.com/windmill-labs/windmill/issues/5876)) ([1551dc8](https://github.com/windmill-labs/windmill/commit/1551dc8af22f6ea41f68290ace4c58f936c47745)) +* nit ai flow prompt ([#5867](https://github.com/windmill-labs/windmill/issues/5867)) ([3e769f0](https://github.com/windmill-labs/windmill/commit/3e769f0c591b80138b3a356d147228675756452f)) +* **python:** assign PATCH version to python runtime only when needed ([#5866](https://github.com/windmill-labs/windmill/issues/5866)) ([50a5c1f](https://github.com/windmill-labs/windmill/commit/50a5c1f56a7e45882fa0095203de709571e149bb)) +* remove duplicate tools from script ai chat ([#5880](https://github.com/windmill-labs/windmill/issues/5880)) ([fe4a767](https://github.com/windmill-labs/windmill/commit/fe4a767df0e6f46fd0c0fd21b4116c7375978bf9)) +* replace crypto.randomUUID with generateRandomString for HTTP compatibility ([#5849](https://github.com/windmill-labs/windmill/issues/5849)) ([64f35d0](https://github.com/windmill-labs/windmill/commit/64f35d050fb0d1008ce7142fd62d500845e62c4a)), closes [#5847](https://github.com/windmill-labs/windmill/issues/5847) + ## [1.494.0](https://github.com/windmill-labs/windmill/compare/v1.493.4...v1.494.0) (2025-05-31) diff --git a/backend/Cargo.lock b/backend/Cargo.lock index fe8e9c769b..67010aa529 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -175,9 +175,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.18" +version = "0.6.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933" dependencies = [ "anstyle", "anstyle-parse", @@ -190,33 +190,33 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" +checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" [[package]] name = "anstyle-parse" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9" dependencies = [ "windows-sys 0.59.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.8" +version = "3.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6680de5231bd6ee4c6191b8a1325daa282b415391ec9d3a37bd34f2060dc73fa" +checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882" dependencies = [ "anstyle", "once_cell_polyfill", @@ -286,57 +286,25 @@ dependencies = [ "serde", ] -[[package]] -name = "arrow" -version = "54.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5ec52ba94edeed950e4a41f75d35376df196e8cb04437f7280a5aa49f20f796" -dependencies = [ - "arrow-arith 54.3.1", - "arrow-array 54.3.1", - "arrow-buffer 54.3.1", - "arrow-cast 54.3.1", - "arrow-data 54.3.1", - "arrow-ord 54.3.1", - "arrow-row 54.3.1", - "arrow-schema 54.3.1", - "arrow-select 54.3.1", - "arrow-string 54.3.1", -] - [[package]] name = "arrow" version = "55.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1bb018b6960c87fd9d025009820406f74e83281185a8bdcb44880d2aa5c9a87" dependencies = [ - "arrow-arith 55.1.0", - "arrow-array 55.1.0", - "arrow-buffer 55.1.0", - "arrow-cast 55.1.0", + "arrow-arith", + "arrow-array", + "arrow-buffer", + "arrow-cast", "arrow-csv", - "arrow-data 55.1.0", + "arrow-data", "arrow-ipc", "arrow-json", - "arrow-ord 55.1.0", - "arrow-row 55.1.0", - "arrow-schema 55.1.0", - "arrow-select 55.1.0", - "arrow-string 55.1.0", -] - -[[package]] -name = "arrow-arith" -version = "54.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc766fdacaf804cb10c7c70580254fcdb5d55cdfda2bc57b02baf5223a3af9e" -dependencies = [ - "arrow-array 54.3.1", - "arrow-buffer 54.3.1", - "arrow-data 54.3.1", - "arrow-schema 54.3.1", - "chrono", - "num", + "arrow-ord", + "arrow-row", + "arrow-schema", + "arrow-select", + "arrow-string", ] [[package]] @@ -345,30 +313,14 @@ version = "55.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44de76b51473aa888ecd6ad93ceb262fb8d40d1f1154a4df2f069b3590aa7575" dependencies = [ - "arrow-array 55.1.0", - "arrow-buffer 55.1.0", - "arrow-data 55.1.0", - "arrow-schema 55.1.0", + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", "chrono", "num", ] -[[package]] -name = "arrow-array" -version = "54.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a12fcdb3f1d03f69d3ec26ac67645a8fe3f878d77b5ebb0b15d64a116c212985" -dependencies = [ - "ahash 0.8.12", - "arrow-buffer 54.3.1", - "arrow-data 54.3.1", - "arrow-schema 54.3.1", - "chrono", - "half", - "hashbrown 0.15.3", - "num", -] - [[package]] name = "arrow-array" version = "55.1.0" @@ -376,9 +328,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29ed77e22744475a9a53d00026cf8e166fe73cf42d89c4c4ae63607ee1cfcc3f" dependencies = [ "ahash 0.8.12", - "arrow-buffer 55.1.0", - "arrow-data 55.1.0", - "arrow-schema 55.1.0", + "arrow-buffer", + "arrow-data", + "arrow-schema", "chrono", "chrono-tz", "half", @@ -386,17 +338,6 @@ dependencies = [ "num", ] -[[package]] -name = "arrow-buffer" -version = "54.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "263f4801ff1839ef53ebd06f99a56cecd1dbaf314ec893d93168e2e860e0291c" -dependencies = [ - "bytes", - "half", - "num", -] - [[package]] name = "arrow-buffer" version = "55.1.0" @@ -408,38 +349,17 @@ dependencies = [ "num", ] -[[package]] -name = "arrow-cast" -version = "54.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ede6175fbc039dfc946a61c1b6d42fd682fcecf5ab5d148fbe7667705798cac9" -dependencies = [ - "arrow-array 54.3.1", - "arrow-buffer 54.3.1", - "arrow-data 54.3.1", - "arrow-schema 54.3.1", - "arrow-select 54.3.1", - "atoi", - "base64 0.22.1", - "chrono", - "comfy-table", - "half", - "lexical-core", - "num", - "ryu", -] - [[package]] name = "arrow-cast" version = "55.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f39e1d774ece9292697fcbe06b5584401b26bd34be1bec25c33edae65c2420ff" dependencies = [ - "arrow-array 55.1.0", - "arrow-buffer 55.1.0", - "arrow-data 55.1.0", - "arrow-schema 55.1.0", - "arrow-select 55.1.0", + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "arrow-select", "atoi", "base64 0.22.1", "chrono", @@ -456,9 +376,9 @@ version = "55.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9055c972a07bf12c2a827debfd34f88d3b93da1941d36e1d9fee85eebe38a12a" dependencies = [ - "arrow-array 55.1.0", - "arrow-cast 55.1.0", - "arrow-schema 55.1.0", + "arrow-array", + "arrow-cast", + "arrow-schema", "chrono", "csv", "csv-core", @@ -466,26 +386,14 @@ dependencies = [ "regex", ] -[[package]] -name = "arrow-data" -version = "54.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61cfdd7d99b4ff618f167e548b2411e5dd2c98c0ddebedd7df433d34c20a4429" -dependencies = [ - "arrow-buffer 54.3.1", - "arrow-schema 54.3.1", - "half", - "num", -] - [[package]] name = "arrow-data" version = "55.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf75ac27a08c7f48b88e5c923f267e980f27070147ab74615ad85b5c5f90473d" dependencies = [ - "arrow-buffer 55.1.0", - "arrow-schema 55.1.0", + "arrow-buffer", + "arrow-schema", "half", "num", ] @@ -496,10 +404,10 @@ version = "55.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a222f0d93772bd058d1268f4c28ea421a603d66f7979479048c429292fac7b2e" dependencies = [ - "arrow-array 55.1.0", - "arrow-buffer 55.1.0", - "arrow-data 55.1.0", - "arrow-schema 55.1.0", + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", "flatbuffers", "lz4_flex", ] @@ -510,11 +418,11 @@ version = "55.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9085342bbca0f75e8cb70513c0807cc7351f1fbf5cb98192a67d5e3044acb033" dependencies = [ - "arrow-array 55.1.0", - "arrow-buffer 55.1.0", - "arrow-cast 55.1.0", - "arrow-data 55.1.0", - "arrow-schema 55.1.0", + "arrow-array", + "arrow-buffer", + "arrow-cast", + "arrow-data", + "arrow-schema", "chrono", "half", "indexmap 2.9.0", @@ -526,43 +434,17 @@ dependencies = [ "simdutf8", ] -[[package]] -name = "arrow-ord" -version = "54.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0a3334a743bd2a1479dbc635540617a3923b4b2f6870f37357339e6b5363c21" -dependencies = [ - "arrow-array 54.3.1", - "arrow-buffer 54.3.1", - "arrow-data 54.3.1", - "arrow-schema 54.3.1", - "arrow-select 54.3.1", -] - [[package]] name = "arrow-ord" version = "55.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab2f1065a5cad7b9efa9e22ce5747ce826aa3855766755d4904535123ef431e7" dependencies = [ - "arrow-array 55.1.0", - "arrow-buffer 55.1.0", - "arrow-data 55.1.0", - "arrow-schema 55.1.0", - "arrow-select 55.1.0", -] - -[[package]] -name = "arrow-row" -version = "54.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d1d7a7291d2c5107e92140f75257a99343956871f3d3ab33a7b41532f79cb68" -dependencies = [ - "arrow-array 54.3.1", - "arrow-buffer 54.3.1", - "arrow-data 54.3.1", - "arrow-schema 54.3.1", - "half", + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "arrow-select", ] [[package]] @@ -571,40 +453,20 @@ version = "55.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3703a0e3e92d23c3f756df73d2dc9476873f873a76ae63ef9d3de17fda83b2d8" dependencies = [ - "arrow-array 55.1.0", - "arrow-buffer 55.1.0", - "arrow-data 55.1.0", - "arrow-schema 55.1.0", + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", "half", ] -[[package]] -name = "arrow-schema" -version = "54.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cfaf5e440be44db5413b75b72c2a87c1f8f0627117d110264048f2969b99e9" -dependencies = [ - "bitflags 2.9.1", -] - [[package]] name = "arrow-schema" version = "55.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73a47aa0c771b5381de2b7f16998d351a6f4eb839f1e13d48353e17e873d969b" - -[[package]] -name = "arrow-select" -version = "54.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69efcd706420e52cd44f5c4358d279801993846d1c2a8e52111853d61d55a619" dependencies = [ - "ahash 0.8.12", - "arrow-array 54.3.1", - "arrow-buffer 54.3.1", - "arrow-data 54.3.1", - "arrow-schema 54.3.1", - "num", + "bitflags 2.9.1", ] [[package]] @@ -614,41 +476,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24b7b85575702b23b85272b01bc1c25a01c9b9852305e5d0078c79ba25d995d4" dependencies = [ "ahash 0.8.12", - "arrow-array 55.1.0", - "arrow-buffer 55.1.0", - "arrow-data 55.1.0", - "arrow-schema 55.1.0", + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", "num", ] -[[package]] -name = "arrow-string" -version = "54.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21546b337ab304a32cfc0770f671db7411787586b45b78b4593ae78e64e2b03" -dependencies = [ - "arrow-array 54.3.1", - "arrow-buffer 54.3.1", - "arrow-data 54.3.1", - "arrow-schema 54.3.1", - "arrow-select 54.3.1", - "memchr", - "num", - "regex", - "regex-syntax 0.8.5", -] - [[package]] name = "arrow-string" version = "55.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9260fddf1cdf2799ace2b4c2fc0356a9789fa7551e0953e35435536fecefebbd" dependencies = [ - "arrow-array 55.1.0", - "arrow-buffer 55.1.0", - "arrow-data 55.1.0", - "arrow-schema 55.1.0", - "arrow-select 55.1.0", + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "arrow-select", "memchr", "num", "regex", @@ -791,7 +636,7 @@ dependencies = [ "bytes", "http 1.3.1", "rand 0.8.5", - "reqwest 0.12.18", + "reqwest 0.12.19", "serde", "serde-aux", "serde_json", @@ -1013,9 +858,9 @@ dependencies = [ [[package]] name = "aws-sdk-sso" -version = "1.71.0" +version = "1.72.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a4fd09d6e863655d99cd2260f271c6d1030dc6bfad68e19e126d2e4c8ceb18" +checksum = "13118ad30741222f67b1a18e5071385863914da05124652b38e172d6d3d9ce31" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1035,9 +880,9 @@ dependencies = [ [[package]] name = "aws-sdk-ssooidc" -version = "1.72.0" +version = "1.73.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3224ab02ebb3074467a33d57caf6fcb487ca36f3697fdd381b0428dc72380696" +checksum = "f879a8572b4683a8f84f781695bebf2f25cf11a81a2693c31fc0e0215c2c1726" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1057,9 +902,9 @@ dependencies = [ [[package]] name = "aws-sdk-sts" -version = "1.72.0" +version = "1.73.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6933f189ed1255e78175fbd73fb200c0aae7240d220ed3346f567b0ddca3083" +checksum = "f1e9c3c24e36183e2f698235ed38dcfbbdff1d09b9232dc866c4be3011e0b47e" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1133,13 +978,14 @@ dependencies = [ [[package]] name = "aws-smithy-http-client" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e44697a9bded898dcd0b1cb997430d949b87f4f8940d91023ae9062bf218250" +checksum = "073d330f94bdf1f47bb3e0f5d45dda1e372a54a553c39ab6e9646902c8c81594" dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", "aws-smithy-types", + "h2 0.3.26", "h2 0.4.10", "http 0.2.12", "http 1.3.1", @@ -1426,9 +1272,9 @@ dependencies = [ [[package]] name = "base64ct" -version = "1.7.3" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" +checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" [[package]] name = "better_scoped_tls" @@ -2228,9 +2074,9 @@ checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" [[package]] name = "colorchoice" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" [[package]] name = "comfy-table" @@ -2763,9 +2609,9 @@ version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffe060b978f74ab446be722adb8a274e052e005bf6dfd171caadc3abaad10080" dependencies = [ - "arrow 55.1.0", + "arrow", "arrow-ipc", - "arrow-schema 55.1.0", + "arrow-schema", "async-trait", "bytes", "bzip2", @@ -2818,7 +2664,7 @@ version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61fe34f401bd03724a1f96d12108144f8cd495a3cdda2bf5e091822fb80b7e66" dependencies = [ - "arrow 55.1.0", + "arrow", "async-trait", "dashmap 6.1.0", "datafusion-common", @@ -2844,7 +2690,7 @@ version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4411b8e3bce5e0fc7521e44f201def2e2d5d1b5f176fb56e8cdc9942c890f00" dependencies = [ - "arrow 55.1.0", + "arrow", "async-trait", "datafusion-catalog", "datafusion-common", @@ -2868,7 +2714,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0734015d81c8375eb5d4869b7f7ecccc2ee8d6cb81948ef737cd0e7b743bd69c" dependencies = [ "ahash 0.8.12", - "arrow 55.1.0", + "arrow", "arrow-ipc", "base64 0.22.1", "half", @@ -2902,7 +2748,7 @@ version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04e602dcdf2f50c2abf297cc2203c73531e6f48b29516af7695d338cf2a778b1" dependencies = [ - "arrow 55.1.0", + "arrow", "async-compression", "async-trait", "bytes", @@ -2938,7 +2784,7 @@ version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3bb2253952dc32296ed5b84077cb2e0257fea4be6373e1c376426e17ead4ef6" dependencies = [ - "arrow 55.1.0", + "arrow", "async-trait", "bytes", "datafusion-catalog", @@ -2963,7 +2809,7 @@ version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b8c7f47a5d2fe03bfa521ec9bafdb8a5c82de8377f60967c3663f00c8790352" dependencies = [ - "arrow 55.1.0", + "arrow", "async-trait", "bytes", "datafusion-catalog", @@ -2988,7 +2834,7 @@ version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "27d15868ea39ed2dc266728b554f6304acd473de2142281ecfa1294bb7415923" dependencies = [ - "arrow 55.1.0", + "arrow", "async-trait", "bytes", "datafusion-catalog", @@ -3025,7 +2871,7 @@ version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06f004d100f49a3658c9da6fb0c3a9b760062d96cd4ad82ccc3b7b69a9fb2f84" dependencies = [ - "arrow 55.1.0", + "arrow", "dashmap 6.1.0", "datafusion-common", "datafusion-expr", @@ -3044,7 +2890,7 @@ version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a4e4ce3802609be38eeb607ee72f6fe86c3091460de9dbfae9e18db423b3964" dependencies = [ - "arrow 55.1.0", + "arrow", "chrono", "datafusion-common", "datafusion-doc", @@ -3065,7 +2911,7 @@ version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "422ac9cf3b22bbbae8cdf8ceb33039107fde1b5492693168f13bd566b1bcc839" dependencies = [ - "arrow 55.1.0", + "arrow", "datafusion-common", "indexmap 2.9.0", "itertools 0.14.0", @@ -3078,8 +2924,8 @@ version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2ddf0a0a2db5d2918349c978d42d80926c6aa2459cd8a3c533a84ec4bb63479e" dependencies = [ - "arrow 55.1.0", - "arrow-buffer 55.1.0", + "arrow", + "arrow-buffer", "base64 0.22.1", "blake2", "blake3", @@ -3108,7 +2954,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "408a05dafdc70d05a38a29005b8b15e21b0238734dab1e98483fcb58038c5aba" dependencies = [ "ahash 0.8.12", - "arrow 55.1.0", + "arrow", "datafusion-common", "datafusion-doc", "datafusion-execution", @@ -3129,7 +2975,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "756d21da2dd6c9bef97af1504970ff56cbf35d03fbd4ffd62827f02f4d2279d4" dependencies = [ "ahash 0.8.12", - "arrow 55.1.0", + "arrow", "datafusion-common", "datafusion-expr-common", "datafusion-physical-expr-common", @@ -3141,8 +2987,8 @@ version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d8d50f6334b378930d992d801a10ac5b3e93b846b39e4a05085742572844537" dependencies = [ - "arrow 55.1.0", - "arrow-ord 55.1.0", + "arrow", + "arrow-ord", "datafusion-common", "datafusion-doc", "datafusion-execution", @@ -3162,7 +3008,7 @@ version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc9a97220736c8fff1446e936be90d57216c06f28969f9ffd3b72ac93c958c8a" dependencies = [ - "arrow 55.1.0", + "arrow", "async-trait", "datafusion-catalog", "datafusion-common", @@ -3216,7 +3062,7 @@ version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "084d9f979c4b155346d3c34b18f4256e6904ded508e9554d90fed416415c3515" dependencies = [ - "arrow 55.1.0", + "arrow", "chrono", "datafusion-common", "datafusion-expr", @@ -3236,7 +3082,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64c536062b0076f4e30084065d805f389f9fe38af0ca75bcbac86bc5e9fbab65" dependencies = [ "ahash 0.8.12", - "arrow 55.1.0", + "arrow", "datafusion-common", "datafusion-expr", "datafusion-expr-common", @@ -3258,7 +3104,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8a92b53b3193fac1916a1c5b8e3f4347c526f6822e56b71faa5fb372327a863" dependencies = [ "ahash 0.8.12", - "arrow 55.1.0", + "arrow", "datafusion-common", "datafusion-expr-common", "hashbrown 0.14.5", @@ -3271,7 +3117,7 @@ version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6fa0a5ac94c7cf3da97bedabd69d6bbca12aef84b9b37e6e9e8c25286511b5e2" dependencies = [ - "arrow 55.1.0", + "arrow", "datafusion-common", "datafusion-execution", "datafusion-expr", @@ -3291,9 +3137,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "690c615db468c2e5fe5085b232d8b1c088299a6c63d87fd960a354a71f7acb55" dependencies = [ "ahash 0.8.12", - "arrow 55.1.0", - "arrow-ord 55.1.0", - "arrow-schema 55.1.0", + "arrow", + "arrow-ord", + "arrow-schema", "async-trait", "chrono", "datafusion-common", @@ -3320,7 +3166,7 @@ version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad229a134c7406c057ece00c8743c0c34b97f4e72f78b475fe17b66c5e14fa4f" dependencies = [ - "arrow 55.1.0", + "arrow", "async-trait", "dashmap 6.1.0", "datafusion-common", @@ -3344,7 +3190,7 @@ version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64f6ab28b72b664c21a27b22a2ff815fd390ed224c26e89a93b5a8154a4e8607" dependencies = [ - "arrow 55.1.0", + "arrow", "bigdecimal", "datafusion-common", "datafusion-expr", @@ -3385,7 +3231,7 @@ dependencies = [ "once_cell", "percent-encoding", "serde", - "sourcemap 9.2.1", + "sourcemap 9.2.2", "swc_atoms", "swc_common", "swc_config", @@ -4322,11 +4168,11 @@ dependencies = [ [[package]] name = "deno_unsync" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47c618b51088b3ac67f15c69b3ed7620ba3a7d495e5a090186df9424b5ab623e" +checksum = "6742a724e8becb372a74c650a1aefb8924a5b8107f7d75b3848763ea24b27a87" dependencies = [ - "futures", + "futures-util", "parking_lot 0.12.4", "tokio", ] @@ -4806,17 +4652,16 @@ dependencies = [ [[package]] name = "duckdb" -version = "1.2.2" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49ac283b6621e3becf8014d1efa655522794075834c72f744573debef9c9f6c8" +checksum = "379464d1fbb69d1bbda7c11d96fafde6f2bdb78c67e630e6339b048e6e45107e" dependencies = [ - "arrow 54.3.1", + "arrow", "cast", "fallible-iterator 0.3.0", "fallible-streaming-iterator", "hashlink 0.9.1", "libduckdb-sys", - "memchr", "num-integer", "rust_decimal", "smallvec", @@ -5990,7 +5835,7 @@ dependencies = [ "google-cloud-token", "home", "jsonwebtoken 9.3.1", - "reqwest 0.12.18", + "reqwest 0.12.19", "serde", "serde_json", "thiserror 1.0.69", @@ -6033,7 +5878,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d901aeb453fd80e51d64df4ee005014f6cf39f2d736dd64f7239c132d9d39a6a" dependencies = [ - "reqwest 0.12.18", + "reqwest 0.12.19", "thiserror 1.0.69", "tokio", ] @@ -6637,9 +6482,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.13" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c293b6b3d21eca78250dc7dbebd6b9210ec5530e038cbfe0661b5c47ab06e8" +checksum = "dc2fdfdbff08affe55bb779f33b053aa1fe5dd5b54c257343c17edfa55711bdb" dependencies = [ "base64 0.22.1", "bytes", @@ -7349,9 +7194,9 @@ checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" [[package]] name = "libduckdb-sys" -version = "1.2.2" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12cac9d03484c43fefac8b2066a253c9b0b3b0cd02cbe02a9ea2312f7e382618" +checksum = "25d3f1defe457d1ac0fbaef0fe6926953cb33419dd3c8dbac53882d020bee697" dependencies = [ "autocfg", "cc", @@ -7606,9 +7451,9 @@ dependencies = [ [[package]] name = "macro_rules_attribute" -version = "0.2.0" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a82271f7bc033d84bbca59a3ce3e4159938cb08a9c3aebbe54d215131518a13" +checksum = "65049d7923698040cd0b1ddcced9b0eb14dd22c5f86ae59c3740eab64a676520" dependencies = [ "macro_rules_attribute-proc_macro", "paste", @@ -7616,9 +7461,9 @@ dependencies = [ [[package]] name = "macro_rules_attribute-proc_macro" -version = "0.2.0" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8dd856d451cc0da70e2ef2ce95a18e39a93b7558bedf10201ad28503f918568" +checksum = "670fdfda89751bc4a84ac13eaa63e205cf0fd22b4c9a5fbfa085b63c1f1d3a30" [[package]] name = "magic-crypt" @@ -8639,7 +8484,7 @@ dependencies = [ "getrandom 0.2.16", "http 1.3.1", "rand 0.8.5", - "reqwest 0.12.18", + "reqwest 0.12.19", "serde", "serde_json", "serde_path_to_error", @@ -8688,7 +8533,7 @@ dependencies = [ "percent-encoding", "quick-xml 0.37.5", "rand 0.9.0", - "reqwest 0.12.18", + "reqwest 0.12.19", "ring 0.17.14", "serde", "serde_json", @@ -9164,13 +9009,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be7b2d778f6b841d37083ebdf32e33a524acde1266b5884a8ca29bf00dfa1231" dependencies = [ "ahash 0.8.12", - "arrow-array 55.1.0", - "arrow-buffer 55.1.0", - "arrow-cast 55.1.0", - "arrow-data 55.1.0", + "arrow-array", + "arrow-buffer", + "arrow-cast", + "arrow-data", "arrow-ipc", - "arrow-schema 55.1.0", - "arrow-select 55.1.0", + "arrow-schema", + "arrow-select", "base64 0.22.1", "brotli 8.0.1", "bytes", @@ -10376,9 +10221,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.18" +version = "0.12.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e98ff6b0dbbe4d5a37318f433d4fc82babd21631f194d370409ceb2e40b2f0b5" +checksum = "a2f8e5513d63f2e5b386eb5106dc67eaf3f84e95258e210489136b8b92ad6119" dependencies = [ "async-compression", "base64 0.22.1", @@ -10434,7 +10279,7 @@ dependencies = [ "anyhow", "async-trait", "http 1.3.1", - "reqwest 0.12.18", + "reqwest 0.12.19", "serde", "thiserror 1.0.69", "tower-service", @@ -10453,7 +10298,7 @@ dependencies = [ "http 1.3.1", "hyper 1.6.0", "parking_lot 0.11.2", - "reqwest 0.12.18", + "reqwest 0.12.19", "reqwest-middleware", "retry-policies", "thiserror 1.0.69", @@ -11733,9 +11578,9 @@ dependencies = [ [[package]] name = "sourcemap" -version = "9.2.1" +version = "9.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdee719193ae5c919a3ee43f64c2c0dd87f9b9a451d67918a2a5ec2e3c70561c" +checksum = "e22afbcb92ce02d23815b9795523c005cb9d3c214f8b7a66318541c240ea7935" dependencies = [ "base64-simd 0.8.0", "bitvec", @@ -12237,7 +12082,7 @@ dependencies = [ "rustc-hash 1.1.0", "serde", "siphasher 0.3.11", - "sourcemap 9.2.1", + "sourcemap 9.2.2", "swc_allocator", "swc_atoms", "swc_eq_ignore_macros", @@ -12301,7 +12146,7 @@ dependencies = [ "num-bigint", "once_cell", "serde", - "sourcemap 9.2.1", + "sourcemap 9.2.2", "swc_allocator", "swc_atoms", "swc_common", @@ -13564,9 +13409,9 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.6.4" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fdb0c213ca27a9f57ab69ddb290fd80d970922355b83ae380b395d3986b8a2e" +checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" dependencies = [ "async-compression", "bitflags 2.9.1", @@ -13671,7 +13516,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba3beec919fbdf99d719de8eda6adae3281f8a5b71ae40431f44dc7423053d34" dependencies = [ "loki-api", - "reqwest 0.12.18", + "reqwest 0.12.19", "serde", "serde_json", "snap", @@ -14667,7 +14512,7 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windmill" -version = "1.494.0" +version = "1.495.0" dependencies = [ "anyhow", "axum", @@ -14687,7 +14532,7 @@ dependencies = [ "prometheus", "quote", "rand 0.9.0", - "reqwest 0.12.18", + "reqwest 0.12.19", "rustls 0.23.27", "serde", "serde_json", @@ -14718,7 +14563,7 @@ dependencies = [ [[package]] name = "windmill-api" -version = "1.494.0" +version = "1.495.0" dependencies = [ "anyhow", "argon2", @@ -14777,7 +14622,7 @@ dependencies = [ "rand 0.9.0", "rdkafka", "regex", - "reqwest 0.12.18", + "reqwest 0.12.19", "rmcp", "rsa", "rumqttc", @@ -14827,7 +14672,7 @@ dependencies = [ [[package]] name = "windmill-api-client" -version = "1.494.0" +version = "1.495.0" dependencies = [ "base64 0.22.1", "chrono", @@ -14842,7 +14687,7 @@ dependencies = [ [[package]] name = "windmill-audit" -version = "1.494.0" +version = "1.495.0" dependencies = [ "chrono", "serde", @@ -14855,7 +14700,7 @@ dependencies = [ [[package]] name = "windmill-autoscaling" -version = "1.494.0" +version = "1.495.0" dependencies = [ "anyhow", "serde", @@ -14869,7 +14714,7 @@ dependencies = [ [[package]] name = "windmill-common" -version = "1.494.0" +version = "1.495.0" dependencies = [ "anyhow", "async-stream", @@ -14911,7 +14756,7 @@ dependencies = [ "quick_cache", "rand 0.9.0", "regex", - "reqwest 0.12.18", + "reqwest 0.12.19", "reqwest-middleware", "reqwest-retry", "semver 1.0.26", @@ -14945,7 +14790,7 @@ dependencies = [ [[package]] name = "windmill-git-sync" -version = "1.494.0" +version = "1.495.0" dependencies = [ "regex", "serde", @@ -14959,7 +14804,7 @@ dependencies = [ [[package]] name = "windmill-indexer" -version = "1.494.0" +version = "1.495.0" dependencies = [ "anyhow", "bytes", @@ -14982,7 +14827,7 @@ dependencies = [ [[package]] name = "windmill-macros" -version = "1.494.0" +version = "1.495.0" dependencies = [ "itertools 0.14.0", "lazy_static", @@ -14994,7 +14839,7 @@ dependencies = [ [[package]] name = "windmill-parser" -version = "1.494.0" +version = "1.495.0" dependencies = [ "convert_case 0.6.0", "serde", @@ -15003,7 +14848,7 @@ dependencies = [ [[package]] name = "windmill-parser-bash" -version = "1.494.0" +version = "1.495.0" dependencies = [ "anyhow", "lazy_static", @@ -15015,7 +14860,7 @@ dependencies = [ [[package]] name = "windmill-parser-csharp" -version = "1.494.0" +version = "1.495.0" dependencies = [ "anyhow", "serde_json", @@ -15027,7 +14872,7 @@ dependencies = [ [[package]] name = "windmill-parser-go" -version = "1.494.0" +version = "1.495.0" dependencies = [ "anyhow", "gosyn", @@ -15039,7 +14884,7 @@ dependencies = [ [[package]] name = "windmill-parser-graphql" -version = "1.494.0" +version = "1.495.0" dependencies = [ "anyhow", "lazy_static", @@ -15051,7 +14896,7 @@ dependencies = [ [[package]] name = "windmill-parser-java" -version = "1.494.0" +version = "1.495.0" dependencies = [ "anyhow", "serde_json", @@ -15063,7 +14908,7 @@ dependencies = [ [[package]] name = "windmill-parser-nu" -version = "1.494.0" +version = "1.495.0" dependencies = [ "anyhow", "nu-parser", @@ -15074,7 +14919,7 @@ dependencies = [ [[package]] name = "windmill-parser-php" -version = "1.494.0" +version = "1.495.0" dependencies = [ "anyhow", "itertools 0.14.0", @@ -15085,7 +14930,7 @@ dependencies = [ [[package]] name = "windmill-parser-py" -version = "1.494.0" +version = "1.495.0" dependencies = [ "anyhow", "itertools 0.14.0", @@ -15096,7 +14941,7 @@ dependencies = [ [[package]] name = "windmill-parser-py-imports" -version = "1.494.0" +version = "1.495.0" dependencies = [ "anyhow", "async-recursion", @@ -15119,7 +14964,7 @@ dependencies = [ [[package]] name = "windmill-parser-rust" -version = "1.494.0" +version = "1.495.0" dependencies = [ "anyhow", "convert_case 0.6.0", @@ -15136,7 +14981,7 @@ dependencies = [ [[package]] name = "windmill-parser-sql" -version = "1.494.0" +version = "1.495.0" dependencies = [ "anyhow", "lazy_static", @@ -15148,7 +14993,7 @@ dependencies = [ [[package]] name = "windmill-parser-ts" -version = "1.494.0" +version = "1.495.0" dependencies = [ "anyhow", "lazy_static", @@ -15166,7 +15011,7 @@ dependencies = [ [[package]] name = "windmill-parser-wasm" -version = "1.494.0" +version = "1.495.0" dependencies = [ "anyhow", "getrandom 0.2.16", @@ -15190,7 +15035,7 @@ dependencies = [ [[package]] name = "windmill-parser-yaml" -version = "1.494.0" +version = "1.495.0" dependencies = [ "anyhow", "serde_json", @@ -15200,7 +15045,7 @@ dependencies = [ [[package]] name = "windmill-queue" -version = "1.494.0" +version = "1.495.0" dependencies = [ "anyhow", "async-recursion", @@ -15217,7 +15062,7 @@ dependencies = [ "lazy_static", "prometheus", "regex", - "reqwest 0.12.18", + "reqwest 0.12.19", "serde", "serde_json", "serde_urlencoded", @@ -15233,7 +15078,7 @@ dependencies = [ [[package]] name = "windmill-sql-datatype-parser-wasm" -version = "1.494.0" +version = "1.495.0" dependencies = [ "wasm-bindgen", "wasm-bindgen-test", @@ -15243,7 +15088,7 @@ dependencies = [ [[package]] name = "windmill-worker" -version = "1.494.0" +version = "1.495.0" dependencies = [ "anyhow", "async-recursion", @@ -15295,7 +15140,7 @@ dependencies = [ "prometheus", "rand 0.9.0", "regex", - "reqwest 0.12.18", + "reqwest 0.12.19", "reqwest-middleware", "rust_decimal", "serde", @@ -15411,7 +15256,7 @@ dependencies = [ "windows-interface 0.59.1", "windows-link", "windows-result 0.3.4", - "windows-strings 0.4.2", + "windows-strings", ] [[package]] @@ -15509,13 +15354,13 @@ dependencies = [ [[package]] name = "windows-registry" -version = "0.4.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" +checksum = "b3bab093bdd303a1240bb99b8aba8ea8a69ee19d34c9e2ef9594e708a4878820" dependencies = [ + "windows-link", "windows-result 0.3.4", - "windows-strings 0.3.1", - "windows-targets 0.53.0", + "windows-strings", ] [[package]] @@ -15536,15 +15381,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "windows-strings" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" -dependencies = [ - "windows-link", -] - [[package]] name = "windows-strings" version = "0.4.2" diff --git a/backend/Cargo.toml b/backend/Cargo.toml index b0c85285ad..6e5fb5af5f 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "windmill" -version = "1.494.0" +version = "1.495.0" authors.workspace = true edition.workspace = true @@ -32,7 +32,7 @@ members = [ ] [workspace.package] -version = "1.494.0" +version = "1.495.0" authors = ["Ruben Fiszel "] edition = "2021" diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index 14b0898199..77e7c2a5c4 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.494.0 + version: 1.495.0 title: Windmill API contact: diff --git a/benchmarks/lib.ts b/benchmarks/lib.ts index cde9bc5320..56a1654fee 100644 --- a/benchmarks/lib.ts +++ b/benchmarks/lib.ts @@ -2,7 +2,7 @@ import { sleep } from "https://deno.land/x/sleep@v1.2.1/mod.ts"; import * as windmill from "https://deno.land/x/windmill@v1.174.0/mod.ts"; import * as api from "https://deno.land/x/windmill@v1.174.0/windmill-api/index.ts"; -export const VERSION = "v1.494.0"; +export const VERSION = "v1.495.0"; export async function login(email: string, password: string): Promise { return await windmill.UserService.login({ diff --git a/cli/main.ts b/cli/main.ts index c5b67cc26a..ec165dea9f 100644 --- a/cli/main.ts +++ b/cli/main.ts @@ -63,7 +63,7 @@ export { // } // }); -export const VERSION = "1.494.0"; +export const VERSION = "1.495.0"; const command = new Command() .name("wmill") diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 3f46d7ffae..ce864ad627 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "windmill-components", - "version": "1.494.0", + "version": "1.495.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "windmill-components", - "version": "1.494.0", + "version": "1.495.0", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/frontend/package.json b/frontend/package.json index 6660aa6638..10399bbdcb 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "windmill-components", - "version": "1.494.0", + "version": "1.495.0", "scripts": { "dev": "vite dev", "build": "vite build", diff --git a/lsp/Pipfile b/lsp/Pipfile index a375630df0..fdfda5d7b4 100644 --- a/lsp/Pipfile +++ b/lsp/Pipfile @@ -4,8 +4,8 @@ verify_ssl = true name = "pypi" [packages] -wmill = ">=1.494.0" -wmill_pg = ">=1.494.0" +wmill = ">=1.495.0" +wmill_pg = ">=1.495.0" sendgrid = "*" mysql-connector-python = "*" pymongo = "*" diff --git a/openflow.openapi.yaml b/openflow.openapi.yaml index 8c34ffe936..137e7b557c 100644 --- a/openflow.openapi.yaml +++ b/openflow.openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.494.0 + version: 1.495.0 title: OpenFlow Spec contact: name: Ruben Fiszel diff --git a/powershell-client/WindmillClient/WindmillClient.psd1 b/powershell-client/WindmillClient/WindmillClient.psd1 index e046e5a602..ddf9d97cd6 100644 --- a/powershell-client/WindmillClient/WindmillClient.psd1 +++ b/powershell-client/WindmillClient/WindmillClient.psd1 @@ -12,7 +12,7 @@ RootModule = 'WindmillClient.psm1' # Version number of this module. - ModuleVersion = '1.494.0' + ModuleVersion = '1.495.0' # Supported PSEditions # CompatiblePSEditions = @() diff --git a/python-client/wmill/pyproject.toml b/python-client/wmill/pyproject.toml index de044ea453..d3299f16f4 100644 --- a/python-client/wmill/pyproject.toml +++ b/python-client/wmill/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "wmill" -version = "1.494.0" +version = "1.495.0" description = "A client library for accessing Windmill server wrapping the Windmill client API" license = "Apache-2.0" homepage = "https://windmill.dev" diff --git a/python-client/wmill_pg/pyproject.toml b/python-client/wmill_pg/pyproject.toml index 12b33a4e29..a793cdb5a7 100644 --- a/python-client/wmill_pg/pyproject.toml +++ b/python-client/wmill_pg/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "wmill-pg" -version = "1.494.0" +version = "1.495.0" description = "An extension client for the wmill client library focused on pg" license = "Apache-2.0" homepage = "https://windmill.dev" diff --git a/typescript-client/jsr.json b/typescript-client/jsr.json index 076e774fa2..51496a68c5 100644 --- a/typescript-client/jsr.json +++ b/typescript-client/jsr.json @@ -1,6 +1,6 @@ { "name": "@windmill/windmill", - "version": "1.494.0", + "version": "1.495.0", "exports": "./src/index.ts", "publish": { "exclude": ["!src", "./s3Types.ts", "./client.ts"] diff --git a/typescript-client/package.json b/typescript-client/package.json index 11c77bb089..86387f8a45 100644 --- a/typescript-client/package.json +++ b/typescript-client/package.json @@ -1,7 +1,7 @@ { "name": "windmill-client", "description": "Windmill SDK client for browsers and Node.js", - "version": "1.494.0", + "version": "1.495.0", "author": "Ruben Fiszel", "license": "Apache 2.0", "devDependencies": { diff --git a/version.txt b/version.txt index 1d1c866bd4..0ce5b93a99 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.494.0 +1.495.0 From 9695cef21a78cd952c2321bb7a70eece67ebd0d2 Mon Sep 17 00:00:00 2001 From: dieriba Date: Thu, 5 Jun 2025 19:50:44 +0200 Subject: [PATCH 541/739] fix: allow cancel jobs in repl --- frontend/src/lib/components/WorkerRepl.svelte | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/lib/components/WorkerRepl.svelte b/frontend/src/lib/components/WorkerRepl.svelte index e6c79cca05..71dff962e4 100644 --- a/frontend/src/lib/components/WorkerRepl.svelte +++ b/frontend/src/lib/components/WorkerRepl.svelte @@ -146,12 +146,12 @@ async function cancelJob(jobId: string) { try { await JobService.cancelQueuedJob({ - workspace: $workspaceStore! ?? '', + workspace: $workspaceStore!, id: jobId, requestBody: {} }) } catch (err) { - sendUserToast(err.BodyDropPivotTarget, true) + sendUserToast(err.body || err.message, true) } } From 6c3b1e747801ed98743723badc9f3f46a821677f Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 5 Jun 2025 20:14:05 +0200 Subject: [PATCH 542/739] 1.495.1 --- ...153c43903f929ae5d62fbba12610f89c36d55.json | 2 +- ...82cc6ae013695d0cda6da9ab848ca1b9a9606.json | 15 ++++++ ...fd18d1dd3bb2fac53c1f2df648b61fb7488aa.json | 15 ------ backend/Cargo.lock | 54 +++++++++---------- backend/Cargo.toml | 4 +- backend/windmill-api/openapi.yaml | 2 +- benchmarks/lib.ts | 2 +- cli/main.ts | 2 +- frontend/package-lock.json | 4 +- frontend/package.json | 2 +- lsp/Pipfile | 4 +- openflow.openapi.yaml | 2 +- .../WindmillClient/WindmillClient.psd1 | 2 +- python-client/wmill/pyproject.toml | 2 +- python-client/wmill_pg/pyproject.toml | 2 +- typescript-client/jsr.json | 2 +- typescript-client/package.json | 2 +- version.txt | 2 +- 18 files changed, 60 insertions(+), 60 deletions(-) create mode 100644 backend/.sqlx/query-997586ac14384db2c0eeee1bb3382cc6ae013695d0cda6da9ab848ca1b9a9606.json delete mode 100644 backend/.sqlx/query-c3025cdb6e421e1225d420e8b1efd18d1dd3bb2fac53c1f2df648b61fb7488aa.json diff --git a/backend/.sqlx/query-5a219a2532517869578c4504ff3153c43903f929ae5d62fbba12610f89c36d55.json b/backend/.sqlx/query-5a219a2532517869578c4504ff3153c43903f929ae5d62fbba12610f89c36d55.json index 36ddb8ab9f..713ccb9dd3 100644 --- a/backend/.sqlx/query-5a219a2532517869578c4504ff3153c43903f929ae5d62fbba12610f89c36d55.json +++ b/backend/.sqlx/query-5a219a2532517869578c4504ff3153c43903f929ae5d62fbba12610f89c36d55.json @@ -15,7 +15,7 @@ ] }, "nullable": [ - true + null ] }, "hash": "5a219a2532517869578c4504ff3153c43903f929ae5d62fbba12610f89c36d55" diff --git a/backend/.sqlx/query-997586ac14384db2c0eeee1bb3382cc6ae013695d0cda6da9ab848ca1b9a9606.json b/backend/.sqlx/query-997586ac14384db2c0eeee1bb3382cc6ae013695d0cda6da9ab848ca1b9a9606.json new file mode 100644 index 0000000000..1edf26100f --- /dev/null +++ b/backend/.sqlx/query-997586ac14384db2c0eeee1bb3382cc6ae013695d0cda6da9ab848ca1b9a9606.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE worker_ping SET\nping_at = now(),\njobs_executed = 1,\ncurrent_job_id = $1,\ncurrent_job_workspace_id = 'admins'\nWHERE worker = $2", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Uuid", + "Text" + ] + }, + "nullable": [] + }, + "hash": "997586ac14384db2c0eeee1bb3382cc6ae013695d0cda6da9ab848ca1b9a9606" +} diff --git a/backend/.sqlx/query-c3025cdb6e421e1225d420e8b1efd18d1dd3bb2fac53c1f2df648b61fb7488aa.json b/backend/.sqlx/query-c3025cdb6e421e1225d420e8b1efd18d1dd3bb2fac53c1f2df648b61fb7488aa.json deleted file mode 100644 index 638417aabb..0000000000 --- a/backend/.sqlx/query-c3025cdb6e421e1225d420e8b1efd18d1dd3bb2fac53c1f2df648b61fb7488aa.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE worker_ping SET \nping_at = now(), \njobs_executed = 1, \ncurrent_job_id = $1, \ncurrent_job_workspace_id = 'admins' \nWHERE worker = $2", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Uuid", - "Text" - ] - }, - "nullable": [] - }, - "hash": "c3025cdb6e421e1225d420e8b1efd18d1dd3bb2fac53c1f2df648b61fb7488aa" -} diff --git a/backend/Cargo.lock b/backend/Cargo.lock index 67010aa529..cfcd152054 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -14512,7 +14512,7 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windmill" -version = "1.495.0" +version = "1.495.1" dependencies = [ "anyhow", "axum", @@ -14563,7 +14563,7 @@ dependencies = [ [[package]] name = "windmill-api" -version = "1.495.0" +version = "1.495.1" dependencies = [ "anyhow", "argon2", @@ -14672,7 +14672,7 @@ dependencies = [ [[package]] name = "windmill-api-client" -version = "1.495.0" +version = "1.495.1" dependencies = [ "base64 0.22.1", "chrono", @@ -14687,7 +14687,7 @@ dependencies = [ [[package]] name = "windmill-audit" -version = "1.495.0" +version = "1.495.1" dependencies = [ "chrono", "serde", @@ -14700,7 +14700,7 @@ dependencies = [ [[package]] name = "windmill-autoscaling" -version = "1.495.0" +version = "1.495.1" dependencies = [ "anyhow", "serde", @@ -14714,7 +14714,7 @@ dependencies = [ [[package]] name = "windmill-common" -version = "1.495.0" +version = "1.495.1" dependencies = [ "anyhow", "async-stream", @@ -14790,7 +14790,7 @@ dependencies = [ [[package]] name = "windmill-git-sync" -version = "1.495.0" +version = "1.495.1" dependencies = [ "regex", "serde", @@ -14804,7 +14804,7 @@ dependencies = [ [[package]] name = "windmill-indexer" -version = "1.495.0" +version = "1.495.1" dependencies = [ "anyhow", "bytes", @@ -14827,7 +14827,7 @@ dependencies = [ [[package]] name = "windmill-macros" -version = "1.495.0" +version = "1.495.1" dependencies = [ "itertools 0.14.0", "lazy_static", @@ -14839,7 +14839,7 @@ dependencies = [ [[package]] name = "windmill-parser" -version = "1.495.0" +version = "1.495.1" dependencies = [ "convert_case 0.6.0", "serde", @@ -14848,7 +14848,7 @@ dependencies = [ [[package]] name = "windmill-parser-bash" -version = "1.495.0" +version = "1.495.1" dependencies = [ "anyhow", "lazy_static", @@ -14860,7 +14860,7 @@ dependencies = [ [[package]] name = "windmill-parser-csharp" -version = "1.495.0" +version = "1.495.1" dependencies = [ "anyhow", "serde_json", @@ -14872,7 +14872,7 @@ dependencies = [ [[package]] name = "windmill-parser-go" -version = "1.495.0" +version = "1.495.1" dependencies = [ "anyhow", "gosyn", @@ -14884,7 +14884,7 @@ dependencies = [ [[package]] name = "windmill-parser-graphql" -version = "1.495.0" +version = "1.495.1" dependencies = [ "anyhow", "lazy_static", @@ -14896,7 +14896,7 @@ dependencies = [ [[package]] name = "windmill-parser-java" -version = "1.495.0" +version = "1.495.1" dependencies = [ "anyhow", "serde_json", @@ -14908,7 +14908,7 @@ dependencies = [ [[package]] name = "windmill-parser-nu" -version = "1.495.0" +version = "1.495.1" dependencies = [ "anyhow", "nu-parser", @@ -14919,7 +14919,7 @@ dependencies = [ [[package]] name = "windmill-parser-php" -version = "1.495.0" +version = "1.495.1" dependencies = [ "anyhow", "itertools 0.14.0", @@ -14930,7 +14930,7 @@ dependencies = [ [[package]] name = "windmill-parser-py" -version = "1.495.0" +version = "1.495.1" dependencies = [ "anyhow", "itertools 0.14.0", @@ -14941,7 +14941,7 @@ dependencies = [ [[package]] name = "windmill-parser-py-imports" -version = "1.495.0" +version = "1.495.1" dependencies = [ "anyhow", "async-recursion", @@ -14964,7 +14964,7 @@ dependencies = [ [[package]] name = "windmill-parser-rust" -version = "1.495.0" +version = "1.495.1" dependencies = [ "anyhow", "convert_case 0.6.0", @@ -14981,7 +14981,7 @@ dependencies = [ [[package]] name = "windmill-parser-sql" -version = "1.495.0" +version = "1.495.1" dependencies = [ "anyhow", "lazy_static", @@ -14993,7 +14993,7 @@ dependencies = [ [[package]] name = "windmill-parser-ts" -version = "1.495.0" +version = "1.495.1" dependencies = [ "anyhow", "lazy_static", @@ -15011,7 +15011,7 @@ dependencies = [ [[package]] name = "windmill-parser-wasm" -version = "1.495.0" +version = "1.495.1" dependencies = [ "anyhow", "getrandom 0.2.16", @@ -15035,7 +15035,7 @@ dependencies = [ [[package]] name = "windmill-parser-yaml" -version = "1.495.0" +version = "1.495.1" dependencies = [ "anyhow", "serde_json", @@ -15045,7 +15045,7 @@ dependencies = [ [[package]] name = "windmill-queue" -version = "1.495.0" +version = "1.495.1" dependencies = [ "anyhow", "async-recursion", @@ -15078,7 +15078,7 @@ dependencies = [ [[package]] name = "windmill-sql-datatype-parser-wasm" -version = "1.495.0" +version = "1.495.1" dependencies = [ "wasm-bindgen", "wasm-bindgen-test", @@ -15088,7 +15088,7 @@ dependencies = [ [[package]] name = "windmill-worker" -version = "1.495.0" +version = "1.495.1" dependencies = [ "anyhow", "async-recursion", diff --git a/backend/Cargo.toml b/backend/Cargo.toml index 6e5fb5af5f..613b4e6b8d 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "windmill" -version = "1.495.0" +version = "1.495.1" authors.workspace = true edition.workspace = true @@ -32,7 +32,7 @@ members = [ ] [workspace.package] -version = "1.495.0" +version = "1.495.1" authors = ["Ruben Fiszel "] edition = "2021" diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index 77e7c2a5c4..84a7731be6 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.495.0 + version: 1.495.1 title: Windmill API contact: diff --git a/benchmarks/lib.ts b/benchmarks/lib.ts index 56a1654fee..55c8a3fe26 100644 --- a/benchmarks/lib.ts +++ b/benchmarks/lib.ts @@ -2,7 +2,7 @@ import { sleep } from "https://deno.land/x/sleep@v1.2.1/mod.ts"; import * as windmill from "https://deno.land/x/windmill@v1.174.0/mod.ts"; import * as api from "https://deno.land/x/windmill@v1.174.0/windmill-api/index.ts"; -export const VERSION = "v1.495.0"; +export const VERSION = "v1.495.1"; export async function login(email: string, password: string): Promise { return await windmill.UserService.login({ diff --git a/cli/main.ts b/cli/main.ts index ec165dea9f..09e86a2f93 100644 --- a/cli/main.ts +++ b/cli/main.ts @@ -63,7 +63,7 @@ export { // } // }); -export const VERSION = "1.495.0"; +export const VERSION = "1.495.1"; const command = new Command() .name("wmill") diff --git a/frontend/package-lock.json b/frontend/package-lock.json index ce864ad627..a07d08e661 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "windmill-components", - "version": "1.495.0", + "version": "1.495.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "windmill-components", - "version": "1.495.0", + "version": "1.495.1", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/frontend/package.json b/frontend/package.json index 10399bbdcb..da5f434a30 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "windmill-components", - "version": "1.495.0", + "version": "1.495.1", "scripts": { "dev": "vite dev", "build": "vite build", diff --git a/lsp/Pipfile b/lsp/Pipfile index fdfda5d7b4..15e96dc4ea 100644 --- a/lsp/Pipfile +++ b/lsp/Pipfile @@ -4,8 +4,8 @@ verify_ssl = true name = "pypi" [packages] -wmill = ">=1.495.0" -wmill_pg = ">=1.495.0" +wmill = ">=1.495.1" +wmill_pg = ">=1.495.1" sendgrid = "*" mysql-connector-python = "*" pymongo = "*" diff --git a/openflow.openapi.yaml b/openflow.openapi.yaml index 137e7b557c..16b538cfea 100644 --- a/openflow.openapi.yaml +++ b/openflow.openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.495.0 + version: 1.495.1 title: OpenFlow Spec contact: name: Ruben Fiszel diff --git a/powershell-client/WindmillClient/WindmillClient.psd1 b/powershell-client/WindmillClient/WindmillClient.psd1 index ddf9d97cd6..4a9824b46c 100644 --- a/powershell-client/WindmillClient/WindmillClient.psd1 +++ b/powershell-client/WindmillClient/WindmillClient.psd1 @@ -12,7 +12,7 @@ RootModule = 'WindmillClient.psm1' # Version number of this module. - ModuleVersion = '1.495.0' + ModuleVersion = '1.495.1' # Supported PSEditions # CompatiblePSEditions = @() diff --git a/python-client/wmill/pyproject.toml b/python-client/wmill/pyproject.toml index d3299f16f4..efeefa7f69 100644 --- a/python-client/wmill/pyproject.toml +++ b/python-client/wmill/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "wmill" -version = "1.495.0" +version = "1.495.1" description = "A client library for accessing Windmill server wrapping the Windmill client API" license = "Apache-2.0" homepage = "https://windmill.dev" diff --git a/python-client/wmill_pg/pyproject.toml b/python-client/wmill_pg/pyproject.toml index a793cdb5a7..41648e5b50 100644 --- a/python-client/wmill_pg/pyproject.toml +++ b/python-client/wmill_pg/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "wmill-pg" -version = "1.495.0" +version = "1.495.1" description = "An extension client for the wmill client library focused on pg" license = "Apache-2.0" homepage = "https://windmill.dev" diff --git a/typescript-client/jsr.json b/typescript-client/jsr.json index 51496a68c5..6631162ab4 100644 --- a/typescript-client/jsr.json +++ b/typescript-client/jsr.json @@ -1,6 +1,6 @@ { "name": "@windmill/windmill", - "version": "1.495.0", + "version": "1.495.1", "exports": "./src/index.ts", "publish": { "exclude": ["!src", "./s3Types.ts", "./client.ts"] diff --git a/typescript-client/package.json b/typescript-client/package.json index 86387f8a45..677af094a2 100644 --- a/typescript-client/package.json +++ b/typescript-client/package.json @@ -1,7 +1,7 @@ { "name": "windmill-client", "description": "Windmill SDK client for browsers and Node.js", - "version": "1.495.0", + "version": "1.495.1", "author": "Ruben Fiszel", "license": "Apache 2.0", "devDependencies": { diff --git a/version.txt b/version.txt index 0ce5b93a99..18920cd1f0 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.495.0 +1.495.1 From 9ae3212a1e0f88a8297bf41ab53e3c1be4bcc56c Mon Sep 17 00:00:00 2001 From: Alexander Petric Date: Thu, 5 Jun 2025 17:52:31 -0400 Subject: [PATCH 543/739] fix: allow fileupload drag and drop in edit mode on full component without triggering file picker (#5889) * fix: allow fileupload drag and drop in edit mode on full component without triggering file picker * only check move on click, not on pointer move --- .../common/fileInput/FileInput.svelte | 24 ++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/frontend/src/lib/components/common/fileInput/FileInput.svelte b/frontend/src/lib/components/common/fileInput/FileInput.svelte index 77d9b308d8..fa3dbb9fb5 100644 --- a/frontend/src/lib/components/common/fileInput/FileInput.svelte +++ b/frontend/src/lib/components/common/fileInput/FileInput.svelte @@ -27,6 +27,14 @@ type FileWithPath = File & { path?: string } export let files: FileWithPath[] | undefined = undefined + let pointerStartX = 0 + let pointerStartY = 0 + + function handlePointerDown(e: PointerEvent) { + pointerStartX = e.clientX + pointerStartY = e.clientY + } + async function onChange(fileList: FileWithPath[] | null) { if (!fileList || !fileList.length) { files = undefined @@ -179,14 +187,24 @@ +
+ {:else} + + {/if} + + + + + + + + + +
+ +
diff --git a/frontend/src/lib/components/Path.svelte b/frontend/src/lib/components/Path.svelte index 994df893ff..c8d19e2233 100644 --- a/frontend/src/lib/components/Path.svelte +++ b/frontend/src/lib/components/Path.svelte @@ -22,20 +22,19 @@ MqttTriggerService, SqsTriggerService, GcpTriggerService - } from '$lib/gen' import { superadmin, userStore, workspaceStore } from '$lib/stores' import { createEventDispatcher, getContext } from 'svelte' import { writable } from 'svelte/store' - import { Alert, Button, Drawer, DrawerContent } from './common' + import { Alert, Button } from './common' import Badge from './common/badge/Badge.svelte' import ToggleButton from './common/toggleButton-v2/ToggleButton.svelte' import ToggleButtonGroup from './common/toggleButton-v2/ToggleButtonGroup.svelte' - import FolderEditor from './FolderEditor.svelte' import { random_adj } from './random_positive_adjetive' - import { Eye, Folder, Loader2, Plus, SearchCode, User } from 'lucide-svelte' + import { Folder, Loader2, SearchCode, User } from 'lucide-svelte' import Tooltip from './Tooltip.svelte' import { tick } from 'svelte' + import FolderPicker from './FolderPicker.svelte' type PathKind = | 'resource' @@ -162,20 +161,14 @@ initialFolder = initialPath?.split('/')?.[1] initialFolders.push({ name: initialFolder, write: true }) } + const excludedFolders = [initialFolder, 'app_groups', 'app_custom', 'app_themes'] folders = initialFolders.concat( ( await FolderService.listFolderNames({ workspace: $workspaceStore! }) ) - .filter( - (x) => - x != initialFolder && - x != 'app_groups' && - x != 'app_custom' && - x != 'app_themes' && - x != 'app_custom' - ) + .filter((x) => !excludedFolders.includes(x)) .map((x) => ({ name: x, write: @@ -318,24 +311,6 @@ } } - let newFolder: Drawer - let viewFolder: Drawer - let newFolderName: string - let folderCreated: string | undefined = undefined - - async function addFolder() { - await FolderService.createFolder({ - workspace: $workspaceStore ?? '', - requestBody: { name: newFolderName } - }) - folderCreated = newFolderName - $userStore?.folders?.push(newFolderName) - loadFolders() - if (meta) { - meta.owner = newFolderName - } - } - function setDirty() { !dirty && (dirty = true) } @@ -379,33 +354,6 @@ }) - - { - newFolder.closeDrawer() - folderCreated = undefined - }} - > - {#if !folderCreated} -
- - -
- {:else} - - {/if} -
-
- - - - - - -
{#if meta != undefined} @@ -474,44 +422,7 @@ {:else if meta.ownerKind === 'folder'} {/if}
diff --git a/frontend/src/lib/components/triggers/http/HttpTriggersGenerator.svelte b/frontend/src/lib/components/triggers/http/HttpTriggersGenerator.svelte new file mode 100644 index 0000000000..35525fa7ed --- /dev/null +++ b/frontend/src/lib/components/triggers/http/HttpTriggersGenerator.svelte @@ -0,0 +1,318 @@ + + + + + + httpTriggersGenerator.closeDrawer()} + > + + + + {@render config()} + + + +{#snippet config()} +
+
+
+ +
+

+ Pick a folder to bind the generated HTTP routes to. +

+ +
+
+ + {#if !emptyStringTrimmed(folderName)} + + { + if (selected === 'OpenAPI') { + openApiRawEditorValue = code + } else if (selected === 'OpenAPI_File') { + openApiFileEditorValue = code + } else { + openApiUrlEditorValue = code + } + + const type = detail as Source + + if (type === 'OpenAPI') { + code = openApiRawEditorValue + } else if (type === 'OpenAPI_File') { + code = openApiFileEditorValue + } else { + code = openApiUrlEditorValue + } + forceRerender = !forceRerender + }} + bind:selected + let:item + > + + + + + +
+ {#if selected === 'OpenAPI'} + + + + + {:else if selected === 'OpenAPI_File'} + { + if (detail && detail.length > 0) { + if (openApiFile.endsWith('.json')) { + lang = 'json' + } else { + lang = 'yaml' + } + code = detail[0].data + openApiFileEditorValue = code + openApiFile = detail[0].name as string + forceRerender = !forceRerender + return + } + openApiFile = '' + }} + /> + {:else if selected === 'OpenAPI_URL'} +
+ + +
+ {/if} + {#if selected === 'OpenAPI' || (selected === 'OpenAPI_File' && !emptyStringTrimmed(openApiFile)) || (selected === 'OpenAPI_URL' && !emptyStringTrimmed(openApiUrl))} + {#key forceRerender} + + {/key} + {/if} + +
+
+ +
+ {#each httpTriggers as httpTrigger, index} +
+
+
+ {httpTrigger.http_method.toUpperCase()} + {isCloudHosted() || httpTrigger.workspaced_route + ? $workspaceStore! + '/' + httpTrigger.route_path + : httpTrigger.route_path} +
+
+ {httpTrigger.path} +
+
+ +
+ +
+
+ {/each} +
+ {/if} +
+
+
+{/snippet} diff --git a/frontend/src/lib/components/triggers/http/RouteEditor.svelte b/frontend/src/lib/components/triggers/http/RouteEditor.svelte index 00914e8172..79f1fa40ab 100644 --- a/frontend/src/lib/components/triggers/http/RouteEditor.svelte +++ b/frontend/src/lib/components/triggers/http/RouteEditor.svelte @@ -1,12 +1,14 @@ {#if open} - + {/if} diff --git a/frontend/src/lib/components/triggers/http/RouteEditorInner.svelte b/frontend/src/lib/components/triggers/http/RouteEditorInner.svelte index 6d2be0b264..17f2205626 100644 --- a/frontend/src/lib/components/triggers/http/RouteEditorInner.svelte +++ b/frontend/src/lib/components/triggers/http/RouteEditorInner.svelte @@ -46,7 +46,8 @@ onUpdate = undefined, onDelete = undefined, onReset = undefined, - trigger = undefined + trigger = undefined, + customSaveBehavior = undefined } = $props() // Form data state @@ -198,27 +199,27 @@ }, 100) // if loading takes less than 100ms, we don't show the loader try { drawer?.openDrawer() - is_flow = nis_flow + is_flow = defaultValues?.is_flow ?? nis_flow edit = false itemKind = nis_flow ? 'flow' : 'script' - is_async = false - authentication_method = 'none' + is_async = defaultValues?.is_async ?? false + authentication_method = defaultValues?.authentication_method ?? 'none' route_path = defaultValues?.route_path ?? '' dirtyRoutePath = false http_method = defaultValues?.http_method ?? 'post' initialScriptPath = '' fixedScriptPath = fixedScriptPath_ ?? '' script_path = fixedScriptPath - static_asset_config = undefined - s3FileUploadRawMode = false + static_asset_config = defaultValues?.static_asset_config ?? undefined + s3FileUploadRawMode = defaultValues?.s3FileUploadRawMode ?? false path = defaultValues?.path ?? '' initialPath = '' dirtyPath = false - is_static_website = false - workspaced_route = false - authentication_resource_path = '' + is_static_website = defaultValues?.is_static_website ?? false + workspaced_route = defaultValues?.workspaced_route ?? false + authentication_resource_path = defaultValues?.authentication_resource_path ?? '' variable_path = '' - signature_options_type = 'custom_signature' + signature_options_type = defaultValues?.signature_options_type ?? 'custom_signature' raw_string = defaultValues?.raw_string ?? false wrap_body = defaultValues?.wrap_body ?? false } finally { @@ -271,21 +272,26 @@ } async function triggerScript(): Promise { - deploymentLoading = true - const saveCfg = routeConfig - const isSaved = await saveHttpRouteFromCfg( - initialPath, - saveCfg, - edit, - $workspaceStore!, - !!$userStore?.is_admin || !!$userStore?.is_super_admin, - usedTriggerKinds - ) - if (isSaved) { - onUpdate(saveCfg.path) + if (customSaveBehavior) { + customSaveBehavior(routeConfig) drawer?.closeDrawer() + } else { + deploymentLoading = true + const saveCfg = routeConfig + const isSaved = await saveHttpRouteFromCfg( + initialPath, + saveCfg, + edit, + $workspaceStore!, + !!$userStore?.is_admin || !!$userStore?.is_super_admin, + usedTriggerKinds + ) + if (isSaved) { + onUpdate(saveCfg.path) + drawer?.closeDrawer() + } + deploymentLoading = false } - deploymentLoading = false } function getRouteConfig(): Record { @@ -296,6 +302,7 @@ authentication_method === 'signature' && signature_options_type === 'custom_script' ? 'custom_script' : authentication_method + const nCfg = { script_path, is_flow, @@ -312,6 +319,7 @@ is_static_website, extra_perms: extraPerms } + return nCfg } diff --git a/frontend/src/lib/components/triggers/http/utils.ts b/frontend/src/lib/components/triggers/http/utils.ts index 04734b2c81..b41ebf2dc1 100644 --- a/frontend/src/lib/components/triggers/http/utils.ts +++ b/frontend/src/lib/components/triggers/http/utils.ts @@ -1,7 +1,11 @@ import { base } from '$lib/base' import { isCloudHosted } from '$lib/cloud' +import { random_adj } from '$lib/components/random_positive_adjetive' +import type { HttpMethod, NewHttpTrigger } from '$lib/gen' import { HttpTriggerService } from '$lib/gen/services.gen' import { sendUserToast } from '$lib/toast' +import { OpenApi as WindmillOpenApi } from '$lib/utils' +import { type OpenAPI } from 'openapi-types' import type { Writable } from 'svelte/store' import { get } from 'svelte/store' @@ -76,3 +80,60 @@ export async function saveHttpRouteFromCfg( return false } } + +export type Source = 'OpenAPI' | 'OpenAPI_File' | 'OpenAPI_URL' + +function convertOpenApiPathToRoutePath(openApiPath: string) { + return openApiPath.replace(/{([^}]+)}/g, ':$1').slice(1) +} + +function generateFolderPath(folderName: string, summary?: string) { + return `f/${folderName}/${summary?.toLowerCase().replaceAll(' ', '_') ?? random_adj()}` +} + +function processOpenApiDocument( + document: OpenAPI.Document, + folderName: string, + _version?: WindmillOpenApi.OpenApiVersion +) { + const paths = document.paths + + const httpTrigger: NewHttpTrigger[] = [] + + for (const path in paths) { + const pathItem = paths[path] + if (!pathItem) continue + + const methods: HttpMethod[] = ['get', 'post', 'put', 'patch', 'delete'] + + for (const method of methods) { + const routeDetail = pathItem[method] + if (!routeDetail) continue + + httpTrigger.push({ + route_path: convertOpenApiPathToRoutePath(path), + http_method: method, + authentication_method: 'none', + workspaced_route: false, + is_async: true, + script_path: '', + raw_string: false, + is_flow: false, + is_static_website: false, + wrap_body: false, + path: generateFolderPath(folderName, routeDetail.summary) + }) + } + } + + return httpTrigger +} + +export async function generateHttpTriggerFromOpenApi( + api: string, + folderName: string +): Promise { + const [document] = await WindmillOpenApi.parse(api) + + return processOpenApiDocument(document, folderName) +} diff --git a/frontend/src/lib/utils.ts b/frontend/src/lib/utils.ts index 66fbfaca37..e9e091b096 100644 --- a/frontend/src/lib/utils.ts +++ b/frontend/src/lib/utils.ts @@ -19,6 +19,63 @@ import type { AnyMeltElement } from '@melt-ui/svelte' import type { RunsSelectionMode } from './components/runs/RunsBatchActionsDropdown.svelte' import type { TriggerKind } from './components/triggers' +export namespace OpenApi { + export enum OpenApiVersion { + V2, + V3, + V3_1 + } + + export function isV2(doc: OpenAPI.Document): doc is OpenAPIV2.Document { + return 'swagger' in doc && doc.swagger === '2.0' + } + + export function isV3(doc: OpenAPI.Document): doc is OpenAPIV3.Document { + return 'openapi' in doc && typeof doc.openapi === 'string' && doc.openapi.startsWith('3.0') + } + + export function isV3_1(doc: OpenAPI.Document): doc is OpenAPIV3_1.Document { + return 'openapi' in doc && typeof doc.openapi === 'string' && doc.openapi.startsWith('3.1') + } + + export function getOpenApiVersion(doc: OpenAPI.Document): OpenApiVersion { + if (isV2(doc)) { + return OpenApiVersion.V2 + } else if (isV3(doc)) { + return OpenApiVersion.V3 + } else { + return OpenApiVersion.V3_1 + } + } + + /** + * Parses and validates an OpenAPI specification provided as a string in either JSON or YAML format. + * + * @param api - A string containing a valid OpenAPI specification in JSON or YAML format. + * @returns A promise that resolves to a tuple: + * - The first element is the validated OpenAPI document. + * - The second element is the detected OpenAPI version (2, 3.0, or 3.1). + * + * @throws Will throw an error if the specification is invalid or cannot be parsed. + */ + export async function parse(api: string): Promise<[OpenAPI.Document, OpenApiVersion]> { + let data: any + + if (api.trimStart().at(0) === '{') { + data = JSON.parse(api) + } else { + data = YAML.parse(api) + } + + const swaggerParser = (await import('@apidevtools/swagger-parser')).default + + const document = await swaggerParser.validate(data) + const version = getOpenApiVersion(document) + + return [document, version] + } +} + export function isJobCancelable(j: Job): boolean { return j.type === 'QueuedJob' && !j.schedule_path && !j.canceled } @@ -1295,6 +1352,7 @@ export function getOS() { import { type ClassValue, clsx } from 'clsx' import { twMerge } from 'tailwind-merge' import type { Snippet } from 'svelte' +import type { OpenAPI, OpenAPIV2, OpenAPIV3, OpenAPIV3_1 } from 'openapi-types' export function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs)) diff --git a/frontend/src/routes/(root)/(logged)/routes/+page.svelte b/frontend/src/routes/(root)/(logged)/routes/+page.svelte index f4ec5e51c1..ef2364d17b 100644 --- a/frontend/src/routes/(root)/(logged)/routes/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/routes/+page.svelte @@ -11,7 +11,8 @@ displayDate, getLocalSetting, storeLocalSetting, - removeTriggerKindIfUnused + removeTriggerKindIfUnused, + sendUserToast } from '$lib/utils' import { base } from '$app/paths' import CenteredPage from '$lib/components/CenteredPage.svelte' @@ -43,12 +44,14 @@ import { ALL_DEPLOYABLE, isDeployable } from '$lib/utils_deployable' import { isCloudHosted } from '$lib/cloud' import { getHttpRoute } from '$lib/components/triggers/http/utils' + import HttpTriggersGenerator from '$lib/components/triggers/http/HttpTriggersGenerator.svelte' type TriggerW = HttpTrigger & { canWrite: boolean } let triggers: TriggerW[] = [] let shareModal: ShareModal let loading = true + let httpTriggersGenerator: HttpTriggersGenerator | undefined let deploymentDrawer: DeployWorkspaceDrawer let deployUiSettings: WorkspaceDeployUISettings | undefined = undefined @@ -77,7 +80,6 @@ } } let routeEditor: RouteEditor - let filteredItems: (TriggerW & { marked?: any })[] | undefined = [] let items: typeof filteredItems | undefined = [] let preFilteredItems: typeof filteredItems | undefined = [] @@ -188,6 +190,8 @@ + + {#if $userStore?.is_admin || $userStore?.is_super_admin} - +
+ + +
{/if}
@@ -328,11 +343,16 @@ disabled: !canWrite || !($userStore?.is_admin || $userStore?.is_super_admin), action: async () => { - await HttpTriggerService.deleteHttpTrigger({ - workspace: $workspaceStore ?? '', - path - }) - loadTriggers() + try { + await HttpTriggerService.deleteHttpTrigger({ + workspace: $workspaceStore ?? '', + path + }) + sendUserToast(`Successfully deleted HTTP route: ${path}`) + loadTriggers() + } catch (error) { + sendUserToast(error.body || error.message, true) + } } }, { diff --git a/frontend/vite.config.js b/frontend/vite.config.js index c9a7d7d5c9..6ba6bcab5e 100644 --- a/frontend/vite.config.js +++ b/frontend/vite.config.js @@ -3,6 +3,7 @@ import { readFileSync } from 'fs' import { fileURLToPath } from 'url' import mkcert from 'vite-plugin-mkcert' import importMetaUrlPlugin from '@windmill-labs/esbuild-import-meta-url-plugin' +import { nodePolyfills } from 'vite-plugin-node-polyfills' const file = fileURLToPath(new URL('package.json', import.meta.url)) const json = readFileSync(file, 'utf8') @@ -43,7 +44,11 @@ const config = { preview: { port: 3000 }, - plugins: [sveltekit(), ...(process.env.HTTPS === 'true' ? [mkcert()] : [])], + plugins: [ + nodePolyfills({ include: ['buffer'] }), + sveltekit(), + ...(process.env.HTTPS === 'true' ? [mkcert()] : []) + ], define: { __pkg__: version }, From 3c3fdbdf26a9581b815210839b91ebdedb924093 Mon Sep 17 00:00:00 2001 From: dieriba Date: Fri, 6 Jun 2025 14:38:37 +0200 Subject: [PATCH 545/739] fix: use full client side js library for route gen from openapi (#5891) * add base template * generate http trigger from openapi spec * refactor and folder picker * fix force re-render on simple editor * add edit functionality for generated triggers and nits * remove buffer * add buffer * nits * nits * nits and force Rerender * remove analyzer * typo * nits * nits * nits * fix * nits * fix vite * updaate * remove polyfills * rename file and prevent duplicate keys * better naming and duplicate key * camel case * replace spaces --------- Co-authored-by: HugoCasa --- frontend/package-lock.json | 1400 ++--------------- frontend/package.json | 3 +- ...enerator.svelte => RoutesGenerator.svelte} | 13 +- .../src/lib/components/triggers/http/utils.ts | 19 +- frontend/src/lib/utils.ts | 29 +- .../(root)/(logged)/routes/+page.svelte | 8 +- frontend/vite.config.js | 2 - 7 files changed, 175 insertions(+), 1299 deletions(-) rename frontend/src/lib/components/triggers/http/{HttpTriggersGenerator.svelte => RoutesGenerator.svelte} (96%) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index fee8b75e6e..1b254b1ac5 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -10,7 +10,6 @@ "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { - "@apidevtools/swagger-parser": "^10.1.1", "@aws-crypto/sha256-js": "^4.0.0", "@codingame/monaco-vscode-configuration-service-override": "~16.1.1", "@codingame/monaco-vscode-editor-api": "~16.1.1", @@ -23,6 +22,7 @@ "@leeoniya/ufuzzy": "^1.0.8", "@popperjs/core": "^2.11.6", "@redocly/json-to-json-schema": "^0.0.1", + "@scalar/openapi-parser": "^0.15.0", "@tanstack/svelte-table": "npm:tanstack-table-8-svelte-5@^0.1", "@windmill-labs/svelte-dnd-action": "^0.9.48", "@xterm/addon-fit": "^0.10.0", @@ -144,7 +144,6 @@ "typescript": "^5.5.0", "vite": "^6.3.2", "vite-plugin-mkcert": "^1.17.5", - "vite-plugin-node-polyfills": "^0.23.0", "yootils": "^0.3.1" }, "optionalDependencies": { @@ -196,92 +195,6 @@ "url": "https://github.com/sponsors/philsturgeon" } }, - "node_modules/@apidevtools/openapi-schemas": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@apidevtools/openapi-schemas/-/openapi-schemas-2.1.0.tgz", - "integrity": "sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/@apidevtools/swagger-methods": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz", - "integrity": "sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==", - "license": "MIT" - }, - "node_modules/@apidevtools/swagger-parser": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/@apidevtools/swagger-parser/-/swagger-parser-10.1.1.tgz", - "integrity": "sha512-u/kozRnsPO/x8QtKYJOqoGtC4kH6yg1lfYkB9Au0WhYB0FNLpyFusttQtvhlwjtG3rOwiRz4D8DnnXa8iEpIKA==", - "license": "MIT", - "dependencies": { - "@apidevtools/json-schema-ref-parser": "11.7.2", - "@apidevtools/openapi-schemas": "^2.1.0", - "@apidevtools/swagger-methods": "^3.0.2", - "@jsdevtools/ono": "^7.1.3", - "ajv": "^8.17.1", - "ajv-draft-04": "^1.0.0", - "call-me-maybe": "^1.0.2" - }, - "peerDependencies": { - "openapi-types": ">=7" - } - }, - "node_modules/@apidevtools/swagger-parser/node_modules/@apidevtools/json-schema-ref-parser": { - "version": "11.7.2", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.7.2.tgz", - "integrity": "sha512-4gY54eEGEstClvEkGnwVkTkrx0sqwemEFG5OSRRn3tD91XH0+Q8XIkYIfo7IwEWPpJZwILb9GUXeShtplRc/eA==", - "license": "MIT", - "dependencies": { - "@jsdevtools/ono": "^7.1.3", - "@types/json-schema": "^7.0.15", - "js-yaml": "^4.1.0" - }, - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://github.com/sponsors/philsturgeon" - } - }, - "node_modules/@apidevtools/swagger-parser/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@apidevtools/swagger-parser/node_modules/ajv-draft-04": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", - "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", - "license": "MIT", - "peerDependencies": { - "ajv": "^8.5.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/@apidevtools/swagger-parser/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, "node_modules/@aws-crypto/sha256-js": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-4.0.0.tgz", @@ -2652,7 +2565,8 @@ "node_modules/@jsdevtools/ono": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", - "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==" + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", + "dev": true }, "node_modules/@json2csv/formatters": { "version": "7.0.6", @@ -2833,79 +2747,6 @@ "resolved": "https://registry.npmjs.org/@redocly/json-to-json-schema/-/json-to-json-schema-0.0.1.tgz", "integrity": "sha512-dSMyuNPN2k+tFeNZ0+QJ7S1zDJ0UeNL+lpnPFR9K5avj2V4uG4m6FdjrApQ9Zi35AIocaDp/KGfBD9gR5MLUbQ==" }, - "node_modules/@rollup/plugin-inject": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.5.tgz", - "integrity": "sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.3" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-inject/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/pluginutils": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", - "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/pluginutils/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/pluginutils/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.41.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.41.0.tgz", @@ -3165,6 +3006,59 @@ "win32" ] }, + "node_modules/@scalar/openapi-parser": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@scalar/openapi-parser/-/openapi-parser-0.15.0.tgz", + "integrity": "sha512-49u1sE+P+72nbt/9p7flBS/g7wbapTGAplcQ1FZxa4La56OMuShCl4qSSdw8lPNZjUZNTLcw7ExVOGI9p1kkOA==", + "license": "MIT", + "dependencies": { + "ajv": "^8.17.1", + "ajv-draft-04": "^1.0.0", + "ajv-formats": "^3.0.1", + "jsonpointer": "^5.0.1", + "leven": "^4.0.0", + "yaml": "^2.4.5" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@scalar/openapi-parser/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@scalar/openapi-parser/node_modules/ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "license": "MIT", + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/@scalar/openapi-parser/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, "node_modules/@smithy/types": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.2.0.tgz", @@ -3674,7 +3568,8 @@ "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true }, "node_modules/@types/lodash": { "version": "4.17.16", @@ -4113,6 +4008,45 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, "node_modules/amator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/amator/-/amator-1.1.0.tgz", @@ -4180,7 +4114,8 @@ "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true }, "node_modules/aria-query": { "version": "5.3.2", @@ -4209,39 +4144,6 @@ "node": ">=0.10.0" } }, - "node_modules/asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/asn1.js/node_modules/bn.js": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", - "dev": true, - "license": "MIT" - }, - "node_modules/assert": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", - "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "is-nan": "^1.3.2", - "object-is": "^1.1.5", - "object.assign": "^4.1.4", - "util": "^0.12.5" - } - }, "node_modules/astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -4300,22 +4202,6 @@ "postcss": "^8.1.0" } }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/axios": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", @@ -4353,7 +4239,6 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "devOptional": true, "funding": [ { "type": "github", @@ -4367,7 +4252,8 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "optional": true }, "node_modules/bezier-easing": { "version": "2.1.0", @@ -4397,13 +4283,6 @@ "readable-stream": "^3.4.0" } }, - "node_modules/bn.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", - "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", - "dev": true, - "license": "MIT" - }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -4430,157 +4309,6 @@ "node": ">=8" } }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", - "dev": true, - "license": "MIT" - }, - "node_modules/browser-resolve": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", - "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve": "^1.17.0" - } - }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "node_modules/browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/browserify-rsa": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.1.tgz", - "integrity": "sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^5.2.1", - "randombytes": "^2.1.0", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/browserify-sign": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.3.tgz", - "integrity": "sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==", - "dev": true, - "license": "ISC", - "dependencies": { - "bn.js": "^5.2.1", - "browserify-rsa": "^4.1.0", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.5", - "hash-base": "~3.0", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.7", - "readable-stream": "^2.3.8", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/browserify-sign/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/browserify-sign/node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/browserify-sign/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/browserify-sign/node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pako": "~1.0.5" - } - }, - "node_modules/browserify-zlib/node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true, - "license": "(MIT AND Zlib)" - }, "node_modules/browserslist": { "version": "4.24.5", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz", @@ -4617,7 +4345,6 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "devOptional": true, "funding": [ { "type": "github", @@ -4632,25 +4359,12 @@ "url": "https://feross.org/support" } ], + "optional": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", - "dev": true, - "license": "MIT" - }, "node_modules/c12": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/c12/-/c12-1.10.0.tgz", @@ -4763,12 +4477,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/call-me-maybe": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", - "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", - "license": "MIT" - }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -4993,20 +4701,6 @@ "node": ">=18" } }, - "node_modules/cipher-base": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.6.tgz", - "integrity": "sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/citty": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", @@ -5111,19 +4805,6 @@ "node": "^14.18.0 || >=16.10.0" } }, - "node_modules/console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true - }, - "node_modules/constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", - "dev": true, - "license": "MIT" - }, "node_modules/cookie": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", @@ -5133,13 +4814,6 @@ "node": ">= 0.6" } }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true, - "license": "MIT" - }, "node_modules/cosmiconfig": { "version": "8.3.6", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", @@ -5167,60 +4841,6 @@ } } }, - "node_modules/create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - } - }, - "node_modules/create-ecdh/node_modules/bn.js": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", - "dev": true, - "license": "MIT" - }, - "node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true, - "license": "MIT" - }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -5235,33 +4855,6 @@ "node": ">= 8" } }, - "node_modules/crypto-browserify": { - "version": "3.12.1", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.1.tgz", - "integrity": "sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserify-cipher": "^1.0.1", - "browserify-sign": "^4.2.3", - "create-ecdh": "^4.0.4", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "diffie-hellman": "^5.0.3", - "hash-base": "~3.0.4", - "inherits": "^2.0.4", - "pbkdf2": "^3.1.2", - "public-encrypt": "^4.0.3", - "randombytes": "^2.1.0", - "randomfill": "^1.0.4" - }, - "engines": { - "node": ">= 0.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/css-declaration-sorter": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", @@ -5801,17 +5394,6 @@ "node": ">=6" } }, - "node_modules/des.js": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", - "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, "node_modules/destr": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", @@ -5859,25 +5441,6 @@ "node": ">=0.3.1" } }, - "node_modules/diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "node_modules/diffie-hellman/node_modules/bn.js": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", - "dev": true, - "license": "MIT" - }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -5934,19 +5497,6 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/domain-browser": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.22.0.tgz", - "integrity": "sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, "node_modules/domelementtype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", @@ -6045,29 +5595,6 @@ "integrity": "sha512-ps5KcGGmwL8VaeJlvlDlu4fORQpv3+GIcF5I3f9tUKUlJ/wsysh6HU8P5L1XWRYeXfA0oJd4PyM8ds8zTFf6Ng==", "dev": true }, - "node_modules/elliptic": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", - "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", - "dev": true, - "license": "MIT" - }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -6603,16 +6130,6 @@ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz", "integrity": "sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==" }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, "node_modules/eventsource-parser": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.2.tgz", @@ -6621,17 +6138,6 @@ "node": ">=18.0.0" } }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "license": "MIT", - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, "node_modules/expand-template": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", @@ -6833,22 +6339,6 @@ } } }, - "node_modules/for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/foreground-child": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", @@ -7392,36 +6882,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hash-base": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.5.tgz", - "integrity": "sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/hash-sum": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz", "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==" }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -7568,18 +7033,6 @@ "node": ">=12.0.0" } }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, "node_modules/hosted-git-info": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", @@ -7615,13 +7068,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", - "dev": true, - "license": "MIT" - }, "node_modules/humanize-ms": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", @@ -7799,19 +7245,6 @@ "node": ">=8" } }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-core-module": { "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", @@ -7859,25 +7292,6 @@ "node": ">=8" } }, - "node_modules/is-generator-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", - "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.0", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -7890,23 +7304,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-nan": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", - "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -7970,45 +7367,12 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "license": "MIT" - }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, - "node_modules/isomorphic-timers-promises": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/isomorphic-timers-promises/-/isomorphic-timers-promises-1.0.1.tgz", - "integrity": "sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, "node_modules/isomorphic.js": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/isomorphic.js/-/isomorphic.js-0.2.5.tgz", @@ -8059,6 +7423,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, "dependencies": { "argparse": "^2.0.1" }, @@ -8104,6 +7469,15 @@ "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-2.0.0.tgz", "integrity": "sha512-WRitRfs6BGq4q8gTgOy4ek7iPFXjbra0H3PmDLKm2xnZ+Gh1HUhiKGgCZkSPNULlP7mvfu6FV/mOLhCarspADQ==" }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -8283,6 +7657,18 @@ "node": ">=6" } }, + "node_modules/leven": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-4.0.0.tgz", + "integrity": "sha512-puehA3YKku3osqPlNuzGDUHq8WpwXupUg1V6NXdV38G+gr+gkBwFC8g1b/+YcIvp8gnqVIus+eJCH/eGsRmJNw==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -8523,18 +7909,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "license": "MIT", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, "node_modules/mdast-util-find-and-replace": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", @@ -9347,27 +8721,6 @@ "node": ">=8.6" } }, - "node_modules/miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" - } - }, - "node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", - "dev": true, - "license": "MIT" - }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -9418,20 +8771,6 @@ "mini-svg-data-uri": "cli.js" } }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true, - "license": "ISC" - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", - "dev": true, - "license": "MIT" - }, "node_modules/minimatch": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", @@ -9800,52 +9139,6 @@ "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", "dev": true }, - "node_modules/node-stdlib-browser": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-stdlib-browser/-/node-stdlib-browser-1.3.1.tgz", - "integrity": "sha512-X75ZN8DCLftGM5iKwoYLA3rjnrAEs97MkzvSd4q2746Tgpg8b8XWiBGiBG4ZpgcAqBgtgPHTiAc8ZMCvZuikDw==", - "dev": true, - "license": "MIT", - "dependencies": { - "assert": "^2.0.0", - "browser-resolve": "^2.0.0", - "browserify-zlib": "^0.2.0", - "buffer": "^5.7.1", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "create-require": "^1.1.1", - "crypto-browserify": "^3.12.1", - "domain-browser": "4.22.0", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "isomorphic-timers-promises": "^1.0.1", - "os-browserify": "^0.3.0", - "path-browserify": "^1.0.1", - "pkg-dir": "^5.0.0", - "process": "^0.11.10", - "punycode": "^1.4.1", - "querystring-es3": "^0.2.1", - "readable-stream": "^3.6.0", - "stream-browserify": "^3.0.0", - "stream-http": "^3.2.0", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.1", - "url": "^0.11.4", - "util": "^0.12.4", - "vm-browserify": "^1.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-stdlib-browser/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "dev": true, - "license": "MIT" - }, "node_modules/normalize-package-data": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", @@ -9941,19 +9234,6 @@ "node": ">= 6" } }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/object-is": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", @@ -9977,27 +9257,6 @@ "node": ">= 0.4" } }, - "node_modules/object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/ohash": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/ohash/-/ohash-1.1.6.tgz", @@ -10104,13 +9363,6 @@ "node": ">= 0.8.0" } }, - "node_modules/os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", - "dev": true, - "license": "MIT" - }, "node_modules/p-limit": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.2.0.tgz", @@ -10205,24 +9457,6 @@ "node": ">=6" } }, - "node_modules/parse-asn1": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.7.tgz", - "integrity": "sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==", - "dev": true, - "license": "ISC", - "dependencies": { - "asn1.js": "^4.10.1", - "browserify-aes": "^1.2.0", - "evp_bytestokey": "^1.0.3", - "hash-base": "~3.0", - "pbkdf2": "^3.1.2", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/parse-headers": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.6.tgz", @@ -10365,23 +9599,6 @@ "pbf": "bin/pbf" } }, - "node_modules/pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - }, - "engines": { - "node": ">=0.12" - } - }, "node_modules/pdfjs-dist": { "version": "4.8.69", "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-4.8.69.tgz", @@ -10447,19 +9664,6 @@ "node": ">= 6" } }, - "node_modules/pkg-dir": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", - "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^5.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/pkg-types": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", @@ -10521,16 +9725,6 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/postcss": { "version": "8.5.3", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", @@ -11272,23 +10466,6 @@ "svelte": "^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0" } }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, - "license": "MIT" - }, "node_modules/property-information": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", @@ -11315,28 +10492,6 @@ "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", "optional": true }, - "node_modules/public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/public-encrypt/node_modules/bn.js": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", - "dev": true, - "license": "MIT" - }, "node_modules/pump": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", @@ -11356,22 +10511,6 @@ "node": ">=6" } }, - "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/quadprog": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/quadprog/-/quadprog-1.6.1.tgz", @@ -11381,15 +10520,6 @@ "node": ">=8.x" } }, - "node_modules/querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -11452,27 +10582,6 @@ "node": ">=0.10" } }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, "node_modules/rbush": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/rbush/-/rbush-3.0.1.tgz", @@ -11591,7 +10700,7 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "devOptional": true, + "optional": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -11812,17 +10921,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "license": "MIT", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, "node_modules/rollup": { "version": "4.41.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.41.0.tgz", @@ -11906,7 +11004,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "devOptional": true, "funding": [ { "type": "github", @@ -11920,25 +11017,8 @@ "type": "consulting", "url": "https://feross.org/support" } - ] - }, - "node_modules/safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + ], + "optional": true }, "node_modules/semver": { "version": "7.7.2", @@ -11987,27 +11067,6 @@ "node": ">= 0.4" } }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true, - "license": "MIT" - }, - "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "license": "(MIT AND BSD-3-Clause)", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" - } - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -12029,82 +11088,6 @@ "node": ">=8" } }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", @@ -12300,35 +11283,11 @@ "dev": true, "peer": true }, - "node_modules/stream-browserify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", - "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" - } - }, - "node_modules/stream-http": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", - "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", - "dev": true, - "license": "MIT", - "dependencies": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "xtend": "^4.0.2" - } - }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "devOptional": true, + "optional": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -13297,19 +12256,6 @@ "node": ">=0.8" } }, - "node_modules/timers-browserify": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "setimmediate": "^1.0.4" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/tinyexec": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", @@ -13447,13 +12393,6 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, - "node_modules/tty-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", - "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", - "dev": true, - "license": "MIT" - }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -13658,41 +12597,6 @@ "punycode": "^2.1.0" } }, - "node_modules/url": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz", - "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^1.4.1", - "qs": "^6.12.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/url/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -13840,23 +12744,6 @@ "vite": ">=3" } }, - "node_modules/vite-plugin-node-polyfills": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/vite-plugin-node-polyfills/-/vite-plugin-node-polyfills-0.23.0.tgz", - "integrity": "sha512-4n+Ys+2bKHQohPBKigFlndwWQ5fFKwaGY6muNDMTb0fSQLyBzS+jjUNRZG9sKF0S/Go4ApG6LFnUGopjkILg3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/plugin-inject": "^5.0.5", - "node-stdlib-browser": "^1.2.0" - }, - "funding": { - "url": "https://github.com/sponsors/davidmyersdev" - }, - "peerDependencies": { - "vite": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" - } - }, "node_modules/vite/node_modules/fdir": { "version": "6.4.4", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", @@ -13901,13 +12788,6 @@ } } }, - "node_modules/vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true, - "license": "MIT" - }, "node_modules/vscode": { "name": "@codingame/monaco-vscode-extension-api", "version": "16.1.1", @@ -14057,28 +12937,6 @@ "node": ">= 8" } }, - "node_modules/which-typed-array": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/windmill-parser-wasm-csharp": { "version": "1.437.1", "resolved": "https://registry.npmjs.org/windmill-parser-wasm-csharp/-/windmill-parser-wasm-csharp-1.437.1.tgz", @@ -14297,7 +13155,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "devOptional": true, + "optional": true, "engines": { "node": ">=0.4" } diff --git a/frontend/package.json b/frontend/package.json index f6a9b18859..ae549683f7 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -70,7 +70,6 @@ "typescript": "^5.5.0", "vite": "^6.3.2", "vite-plugin-mkcert": "^1.17.5", - "vite-plugin-node-polyfills": "^0.23.0", "yootils": "^0.3.1" }, "overrides": { @@ -80,7 +79,6 @@ }, "type": "module", "dependencies": { - "@apidevtools/swagger-parser": "^10.1.1", "@aws-crypto/sha256-js": "^4.0.0", "@codingame/monaco-vscode-configuration-service-override": "~16.1.1", "@codingame/monaco-vscode-editor-api": "~16.1.1", @@ -93,6 +91,7 @@ "@leeoniya/ufuzzy": "^1.0.8", "@popperjs/core": "^2.11.6", "@redocly/json-to-json-schema": "^0.0.1", + "@scalar/openapi-parser": "^0.15.0", "@tanstack/svelte-table": "npm:tanstack-table-8-svelte-5@^0.1", "@windmill-labs/svelte-dnd-action": "^0.9.48", "@xterm/addon-fit": "^0.10.0", diff --git a/frontend/src/lib/components/triggers/http/HttpTriggersGenerator.svelte b/frontend/src/lib/components/triggers/http/RoutesGenerator.svelte similarity index 96% rename from frontend/src/lib/components/triggers/http/HttpTriggersGenerator.svelte rename to frontend/src/lib/components/triggers/http/RoutesGenerator.svelte index 35525fa7ed..4011ccf215 100644 --- a/frontend/src/lib/components/triggers/http/HttpTriggersGenerator.svelte +++ b/frontend/src/lib/components/triggers/http/RoutesGenerator.svelte @@ -25,7 +25,7 @@ let { closeFn }: Props = $props() let routeEditor: RouteEditor - let httpTriggersGenerator: Drawer + let routesGenerator: Drawer let selected: Source = $state('OpenAPI') let openApiUrl = $state('') @@ -66,7 +66,7 @@ }) export function openDrawer() { - httpTriggersGenerator.openDrawer() + routesGenerator.openDrawer() } async function fetchOpenApiConfig() { @@ -94,7 +94,7 @@ }) sendUserToast(message) await closeFn() - httpTriggersGenerator.closeDrawer() + routesGenerator.closeDrawer() if (!get(usedTriggerKinds).includes('http')) { usedTriggerKinds.update((t) => [...t, 'http']) } @@ -119,6 +119,9 @@ try { isGeneratingHttpRoutes = true httpTriggers = await generateHttpTriggerFromOpenApi(code, folderName) + if (httpTriggers.length === 0) { + sendUserToast('No paths defined in the OpenAPI spec. Cannot generate HTTP routes.', true) + } } catch (error) { sendUserToast(error.message || 'An unexpected error occurred', true) } finally { @@ -129,10 +132,10 @@ - + httpTriggersGenerator.closeDrawer()} + on:close={() => routesGenerator.closeDrawer()} > {/each} {/if} diff --git a/frontend/src/lib/components/copilot/chat/ContextElementBadge.svelte b/frontend/src/lib/components/copilot/chat/ContextElementBadge.svelte index 25baf11ae0..bfb0b10f03 100644 --- a/frontend/src/lib/components/copilot/chat/ContextElementBadge.svelte +++ b/frontend/src/lib/components/copilot/chat/ContextElementBadge.svelte @@ -42,7 +42,9 @@ {/if} - {contextElement.title} + {contextElement.type === 'diff' + ? contextElement.title.replace(/_/g, ' ') + : contextElement.title}
diff --git a/frontend/src/lib/components/copilot/chat/ContextManager.svelte.ts b/frontend/src/lib/components/copilot/chat/ContextManager.svelte.ts index e05e6fd622..ad89b9b672 100644 --- a/frontend/src/lib/components/copilot/chat/ContextManager.svelte.ts +++ b/frontend/src/lib/components/copilot/chat/ContextManager.svelte.ts @@ -93,7 +93,7 @@ export default class ContextManager { if (scriptOptions.lastSavedCode && scriptOptions.lastSavedCode !== scriptOptions.code) { newAvailableContext.push({ type: 'diff', - title: 'diff_with_last_saved_draft', + title: 'diff_with_last_saved_draft', // can't use spaces in the title, because it will break the word match in the context text area hightlighting logic content: scriptOptions.lastSavedCode ?? '', diff: diffLines(scriptOptions.lastSavedCode ?? '', scriptOptions.code), lang: scriptOptions.lang From cb8c3560afab04a821208cc6749fbc3fb8bfdcfd Mon Sep 17 00:00:00 2001 From: centdix <40307056+centdix@users.noreply.github.com> Date: Mon, 9 Jun 2025 17:45:53 +0200 Subject: [PATCH 557/739] avoid discord length limit (#5903) --- .github/workflows/shareable-discord-notification.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/shareable-discord-notification.yml b/.github/workflows/shareable-discord-notification.yml index d59b99070c..1b7936330f 100644 --- a/.github/workflows/shareable-discord-notification.yml +++ b/.github/workflows/shareable-discord-notification.yml @@ -62,9 +62,10 @@ jobs: # Create thread if it doesn't exist or if check failed if [ "$thread_exists" = false ]; then echo "Creating new thread" + THREAD_TITLE="#${PR_NUMBER}: ${PR_TITLE} by \`${PR_AUTHOR}\`" payload=$(jq -n \ --arg content "${PR_URL}" \ - --arg thread "#${PR_NUMBER}: $PR_TITLE by \`${PR_AUTHOR}\`" \ + --arg thread "${THREAD_TITLE:0:99}" \ '{ content: $content, thread_name: $thread, From 94b56d3ffe54f5107c3aa069302f4fd1d385ff42 Mon Sep 17 00:00:00 2001 From: centdix <40307056+centdix@users.noreply.github.com> Date: Mon, 9 Jun 2025 19:30:25 +0200 Subject: [PATCH 558/739] use specific token for helm-chart (#5905) --- .github/workflows/helmchart_on_release.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/helmchart_on_release.yml b/.github/workflows/helmchart_on_release.yml index 1d63cbc326..eeae218d5d 100644 --- a/.github/workflows/helmchart_on_release.yml +++ b/.github/workflows/helmchart_on_release.yml @@ -13,7 +13,7 @@ jobs: uses: actions/checkout@v3 with: repository: windmill-labs/windmill-helm-charts - token: ${{ secrets.DOCS_TOKEN }} + token: ${{ secrets.HELM_CHART_TOKEN }} - name: Get version id: get_version @@ -57,7 +57,7 @@ jobs: - name: Create PR env: - GH_TOKEN: ${{ secrets.DOCS_TOKEN }} + GH_TOKEN: ${{ secrets.HELM_CHART_TOKEN }} run: | gh pr create \ --title "helm: bump version to ${{ env.VERSION }}" \ From cd508951d7d6c37834a80ee998aa04e0bf738c74 Mon Sep 17 00:00:00 2001 From: pyranota <92104930+pyranota@users.noreply.github.com> Date: Mon, 9 Jun 2025 23:12:23 +0200 Subject: [PATCH 559/739] build: disable duckdb for windows (#5906) * build: disable duckdb for windows MSVC linker has troubles with v8 and duckdb * rework --- .github/workflows/build_windows_worker_.yml | 2 +- .github/workflows/publish_windows_worker.yml | 2 +- backend/Cargo.toml | 4 +++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build_windows_worker_.yml b/.github/workflows/build_windows_worker_.yml index e4c3f0a245..738b2a9224 100644 --- a/.github/workflows/build_windows_worker_.yml +++ b/.github/workflows/build_windows_worker_.yml @@ -51,7 +51,7 @@ jobs: $env:OPENSSL_DIR="${Env:VCPKG_INSTALLATION_ROOT}\installed\x64-windows-static" mkdir frontend/build && cd backend New-Item -Path . -Name "windmill-api/openapi-deref.yaml" -ItemType "File" -Force - cargo build --release --features=enterprise,stripe,embedding,parquet,prometheus,openidconnect,cloud,jemalloc,tantivy,license,http_trigger,zip,oauth2,kafka,nats,sqs_trigger,postgres_trigger,gcp_trigger,mqtt_trigger,websocket,smtp,static_frontend,all_languages,mcp,private + cargo build --release --features=enterprise,stripe,embedding,parquet,prometheus,openidconnect,cloud,jemalloc,tantivy,license,http_trigger,zip,oauth2,kafka,nats,sqs_trigger,postgres_trigger,gcp_trigger,mqtt_trigger,websocket,smtp,static_frontend,all_languages_windows,mcp,private - name: Rename binary with corresponding architecture run: | Rename-Item -Path ".\backend\target\release\windmill.exe" -NewName "windmill-ee.exe" diff --git a/.github/workflows/publish_windows_worker.yml b/.github/workflows/publish_windows_worker.yml index 9767c99b38..e9a8c77e87 100644 --- a/.github/workflows/publish_windows_worker.yml +++ b/.github/workflows/publish_windows_worker.yml @@ -53,7 +53,7 @@ jobs: $env:OPENSSL_DIR="${Env:VCPKG_INSTALLATION_ROOT}\installed\x64-windows-static" mkdir frontend/build && cd backend New-Item -Path . -Name "windmill-api/openapi-deref.yaml" -ItemType "File" -Force - cargo build --release --features=enterprise,stripe,embedding,parquet,prometheus,openidconnect,cloud,jemalloc,tantivy,license,http_trigger,zip,oauth2,kafka,sqs_trigger,nats,postgres_trigger,mqtt_trigger,gcp_trigger,websocket,smtp,static_frontend,all_languages,mcp,private + cargo build --release --features=enterprise,stripe,embedding,parquet,prometheus,openidconnect,cloud,jemalloc,tantivy,license,http_trigger,zip,oauth2,kafka,sqs_trigger,nats,postgres_trigger,mqtt_trigger,gcp_trigger,websocket,smtp,static_frontend,all_languages_windows,mcp,private - name: Rename binary with corresponding architecture run: | Rename-Item -Path ".\backend\target\release\windmill.exe" -NewName "windmill-ee.exe" diff --git a/backend/Cargo.toml b/backend/Cargo.toml index 7bda13ac4d..221d5d9179 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -96,7 +96,9 @@ csharp = ["windmill-worker/csharp"] nu = ["windmill-worker/nu"] java = ["windmill-worker/java"] all_languages = ["python", "deno_core", "rust", "mysql", "oracledb", "duckdb", "mssql", "bigquery", "csharp", "nu", "php", "java"] - +# For windows we have another set of languages enabled +# NOTE: DuckDB is ignored because of compilation problems +all_languages_windows = ["python", "deno_core", "rust", "mysql", "oracledb", "mssql", "bigquery", "csharp", "nu", "php", "java"] [patch.crates-io] object_store = { git = "https://github.com/apache/arrow-rs-object-store", rev = "36752c975d4f29e20b57c91f81a10872dcd48ae7" } From ae81b4f456cba7506254da357ea8bff1e48216b7 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Mon, 9 Jun 2025 23:31:39 +0200 Subject: [PATCH 560/739] chore(main): release 1.496.3 (#5902) * chore(main): release 1.496.3 * Apply automatic changes --------- Co-authored-by: rubenfiszel <275584+rubenfiszel@users.noreply.github.com> --- CHANGELOG.md | 8 ++ backend/Cargo.lock | 88 +++++++++---------- backend/Cargo.toml | 4 +- backend/windmill-api/openapi.yaml | 2 +- benchmarks/lib.ts | 2 +- cli/main.ts | 2 +- frontend/package-lock.json | 4 +- frontend/package.json | 2 +- lsp/Pipfile | 4 +- openflow.openapi.yaml | 2 +- .../WindmillClient/WindmillClient.psd1 | 2 +- python-client/wmill/pyproject.toml | 2 +- python-client/wmill_pg/pyproject.toml | 2 +- typescript-client/jsr.json | 2 +- typescript-client/package.json | 2 +- version.txt | 2 +- 16 files changed, 69 insertions(+), 61 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d0c2e2404d..5996d90d3f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [1.496.3](https://github.com/windmill-labs/windmill/compare/v1.496.2...v1.496.3) (2025-06-09) + + +### Bug Fixes + +* improve concurrent job parallelism performance ([e8836a3](https://github.com/windmill-labs/windmill/commit/e8836a393a872bb91e68ba0037681caf24149470)) +* Prioritize diff contexts in script mode for ai chat ([#5888](https://github.com/windmill-labs/windmill/issues/5888)) ([a47939d](https://github.com/windmill-labs/windmill/commit/a47939d13c30e2d4b41efd539f845959174d4fb1)) + ## [1.496.2](https://github.com/windmill-labs/windmill/compare/v1.496.1...v1.496.2) (2025-06-07) diff --git a/backend/Cargo.lock b/backend/Cargo.lock index 891eb00287..edaea2c45a 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -1681,9 +1681,9 @@ dependencies = [ [[package]] name = "bytemuck" -version = "1.23.0" +version = "1.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9134a6ef01ce4b366b50689c94f82c14bc72bc5d0386829828a2e2752ef7958c" +checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422" dependencies = [ "bytemuck_derive", ] @@ -1979,9 +1979,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.39" +version = "4.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd60e63e9be68e5fb56422e397cf9baddded06dae1d2e523401542383bc72a9f" +checksum = "40b6887a1d8685cebccf115538db5c0efe625ccac9696ad45c409d96566e910f" dependencies = [ "clap_builder", "clap_derive", @@ -1989,9 +1989,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.39" +version = "4.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89cc6392a1f72bbeb820d71f32108f61fdaf18bc526e1d23954168a67759ef51" +checksum = "e0c66c08ce9f0c698cbce5c0279d0bb6ac936d8674174fe48f736533b964f59e" dependencies = [ "anstream", "anstyle", @@ -2001,9 +2001,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.32" +version = "4.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7" +checksum = "d2c7947ae4cc3d851207c1adb5b5e260ff0cca11446b1d6d1423788e442257ce" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -2013,9 +2013,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" +checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" [[package]] name = "clipboard-win" @@ -5690,11 +5690,11 @@ dependencies = [ [[package]] name = "getopts" -version = "0.2.21" +version = "0.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14dbbfd5c71d70241ecf9e6f13737f7b5ce823821063188d7e46c41d371eebd5" +checksum = "cba6ae63eb948698e300f645f87c70f76630d505f23b8907cf1e193ee85048c1" dependencies = [ - "unicode-width 0.1.14", + "unicode-width 0.2.0", ] [[package]] @@ -7929,7 +7929,7 @@ dependencies = [ "tokio", "tokio-native-tls", "tokio-util", - "twox-hash 2.1.0", + "twox-hash 2.1.1", "url", ] @@ -9034,7 +9034,7 @@ dependencies = [ "snap", "thrift", "tokio", - "twox-hash 2.1.0", + "twox-hash 2.1.1", "zstd", ] @@ -13676,9 +13676,9 @@ dependencies = [ [[package]] name = "twox-hash" -version = "2.1.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7b17f197b3050ba473acf9181f7b1d3b66d1cf7356c6cc57886662276e65908" +checksum = "8b907da542cbced5261bd3256de1b3a1bf340a3d37f93425a07362a1d687de56" [[package]] name = "typed-arena" @@ -14512,7 +14512,7 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windmill" -version = "1.496.2" +version = "1.496.3" dependencies = [ "anyhow", "axum", @@ -14563,7 +14563,7 @@ dependencies = [ [[package]] name = "windmill-api" -version = "1.496.2" +version = "1.496.3" dependencies = [ "anyhow", "argon2", @@ -14672,7 +14672,7 @@ dependencies = [ [[package]] name = "windmill-api-client" -version = "1.496.2" +version = "1.496.3" dependencies = [ "base64 0.22.1", "chrono", @@ -14687,7 +14687,7 @@ dependencies = [ [[package]] name = "windmill-audit" -version = "1.496.2" +version = "1.496.3" dependencies = [ "chrono", "serde", @@ -14700,7 +14700,7 @@ dependencies = [ [[package]] name = "windmill-autoscaling" -version = "1.496.2" +version = "1.496.3" dependencies = [ "anyhow", "serde", @@ -14714,7 +14714,7 @@ dependencies = [ [[package]] name = "windmill-common" -version = "1.496.2" +version = "1.496.3" dependencies = [ "anyhow", "async-stream", @@ -14790,7 +14790,7 @@ dependencies = [ [[package]] name = "windmill-git-sync" -version = "1.496.2" +version = "1.496.3" dependencies = [ "regex", "serde", @@ -14804,7 +14804,7 @@ dependencies = [ [[package]] name = "windmill-indexer" -version = "1.496.2" +version = "1.496.3" dependencies = [ "anyhow", "bytes", @@ -14827,7 +14827,7 @@ dependencies = [ [[package]] name = "windmill-macros" -version = "1.496.2" +version = "1.496.3" dependencies = [ "itertools 0.14.0", "lazy_static", @@ -14839,7 +14839,7 @@ dependencies = [ [[package]] name = "windmill-parser" -version = "1.496.2" +version = "1.496.3" dependencies = [ "convert_case 0.6.0", "serde", @@ -14848,7 +14848,7 @@ dependencies = [ [[package]] name = "windmill-parser-bash" -version = "1.496.2" +version = "1.496.3" dependencies = [ "anyhow", "lazy_static", @@ -14860,7 +14860,7 @@ dependencies = [ [[package]] name = "windmill-parser-csharp" -version = "1.496.2" +version = "1.496.3" dependencies = [ "anyhow", "serde_json", @@ -14872,7 +14872,7 @@ dependencies = [ [[package]] name = "windmill-parser-go" -version = "1.496.2" +version = "1.496.3" dependencies = [ "anyhow", "gosyn", @@ -14884,7 +14884,7 @@ dependencies = [ [[package]] name = "windmill-parser-graphql" -version = "1.496.2" +version = "1.496.3" dependencies = [ "anyhow", "lazy_static", @@ -14896,7 +14896,7 @@ dependencies = [ [[package]] name = "windmill-parser-java" -version = "1.496.2" +version = "1.496.3" dependencies = [ "anyhow", "serde_json", @@ -14908,7 +14908,7 @@ dependencies = [ [[package]] name = "windmill-parser-nu" -version = "1.496.2" +version = "1.496.3" dependencies = [ "anyhow", "nu-parser", @@ -14919,7 +14919,7 @@ dependencies = [ [[package]] name = "windmill-parser-php" -version = "1.496.2" +version = "1.496.3" dependencies = [ "anyhow", "itertools 0.14.0", @@ -14930,7 +14930,7 @@ dependencies = [ [[package]] name = "windmill-parser-py" -version = "1.496.2" +version = "1.496.3" dependencies = [ "anyhow", "itertools 0.14.0", @@ -14941,7 +14941,7 @@ dependencies = [ [[package]] name = "windmill-parser-py-imports" -version = "1.496.2" +version = "1.496.3" dependencies = [ "anyhow", "async-recursion", @@ -14964,7 +14964,7 @@ dependencies = [ [[package]] name = "windmill-parser-rust" -version = "1.496.2" +version = "1.496.3" dependencies = [ "anyhow", "convert_case 0.6.0", @@ -14981,7 +14981,7 @@ dependencies = [ [[package]] name = "windmill-parser-sql" -version = "1.496.2" +version = "1.496.3" dependencies = [ "anyhow", "lazy_static", @@ -14993,7 +14993,7 @@ dependencies = [ [[package]] name = "windmill-parser-ts" -version = "1.496.2" +version = "1.496.3" dependencies = [ "anyhow", "lazy_static", @@ -15011,7 +15011,7 @@ dependencies = [ [[package]] name = "windmill-parser-wasm" -version = "1.496.2" +version = "1.496.3" dependencies = [ "anyhow", "getrandom 0.2.16", @@ -15035,7 +15035,7 @@ dependencies = [ [[package]] name = "windmill-parser-yaml" -version = "1.496.2" +version = "1.496.3" dependencies = [ "anyhow", "serde_json", @@ -15045,7 +15045,7 @@ dependencies = [ [[package]] name = "windmill-queue" -version = "1.496.2" +version = "1.496.3" dependencies = [ "anyhow", "async-recursion", @@ -15078,7 +15078,7 @@ dependencies = [ [[package]] name = "windmill-sql-datatype-parser-wasm" -version = "1.496.2" +version = "1.496.3" dependencies = [ "wasm-bindgen", "wasm-bindgen-test", @@ -15088,7 +15088,7 @@ dependencies = [ [[package]] name = "windmill-worker" -version = "1.496.2" +version = "1.496.3" dependencies = [ "anyhow", "async-recursion", diff --git a/backend/Cargo.toml b/backend/Cargo.toml index 221d5d9179..84cb427c69 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "windmill" -version = "1.496.2" +version = "1.496.3" authors.workspace = true edition.workspace = true @@ -32,7 +32,7 @@ members = [ ] [workspace.package] -version = "1.496.2" +version = "1.496.3" authors = ["Ruben Fiszel "] edition = "2021" diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index 0b3bb307bc..049e8e3efb 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.496.2 + version: 1.496.3 title: Windmill API contact: diff --git a/benchmarks/lib.ts b/benchmarks/lib.ts index 847141b213..27413cc466 100644 --- a/benchmarks/lib.ts +++ b/benchmarks/lib.ts @@ -2,7 +2,7 @@ import { sleep } from "https://deno.land/x/sleep@v1.2.1/mod.ts"; import * as windmill from "https://deno.land/x/windmill@v1.174.0/mod.ts"; import * as api from "https://deno.land/x/windmill@v1.174.0/windmill-api/index.ts"; -export const VERSION = "v1.496.2"; +export const VERSION = "v1.496.3"; export async function login(email: string, password: string): Promise { return await windmill.UserService.login({ diff --git a/cli/main.ts b/cli/main.ts index ffe1956ec7..50da78522d 100644 --- a/cli/main.ts +++ b/cli/main.ts @@ -63,7 +63,7 @@ export { // } // }); -export const VERSION = "1.496.2"; +export const VERSION = "1.496.3"; const command = new Command() .name("wmill") diff --git a/frontend/package-lock.json b/frontend/package-lock.json index e117f760e2..511069631d 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "windmill-components", - "version": "1.496.2", + "version": "1.496.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "windmill-components", - "version": "1.496.2", + "version": "1.496.3", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/frontend/package.json b/frontend/package.json index 001bf440a4..bd849ce0b5 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "windmill-components", - "version": "1.496.2", + "version": "1.496.3", "scripts": { "dev": "vite dev", "build": "vite build", diff --git a/lsp/Pipfile b/lsp/Pipfile index acf4a64ada..9ca9575e78 100644 --- a/lsp/Pipfile +++ b/lsp/Pipfile @@ -4,8 +4,8 @@ verify_ssl = true name = "pypi" [packages] -wmill = ">=1.496.2" -wmill_pg = ">=1.496.2" +wmill = ">=1.496.3" +wmill_pg = ">=1.496.3" sendgrid = "*" mysql-connector-python = "*" pymongo = "*" diff --git a/openflow.openapi.yaml b/openflow.openapi.yaml index 168d342a68..9cab3a9551 100644 --- a/openflow.openapi.yaml +++ b/openflow.openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.496.2 + version: 1.496.3 title: OpenFlow Spec contact: name: Ruben Fiszel diff --git a/powershell-client/WindmillClient/WindmillClient.psd1 b/powershell-client/WindmillClient/WindmillClient.psd1 index 22d8ed42e9..32b446369b 100644 --- a/powershell-client/WindmillClient/WindmillClient.psd1 +++ b/powershell-client/WindmillClient/WindmillClient.psd1 @@ -12,7 +12,7 @@ RootModule = 'WindmillClient.psm1' # Version number of this module. - ModuleVersion = '1.496.2' + ModuleVersion = '1.496.3' # Supported PSEditions # CompatiblePSEditions = @() diff --git a/python-client/wmill/pyproject.toml b/python-client/wmill/pyproject.toml index 7961e475cb..ab09033ecf 100644 --- a/python-client/wmill/pyproject.toml +++ b/python-client/wmill/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "wmill" -version = "1.496.2" +version = "1.496.3" description = "A client library for accessing Windmill server wrapping the Windmill client API" license = "Apache-2.0" homepage = "https://windmill.dev" diff --git a/python-client/wmill_pg/pyproject.toml b/python-client/wmill_pg/pyproject.toml index 024f8e3f23..c16e6e3d78 100644 --- a/python-client/wmill_pg/pyproject.toml +++ b/python-client/wmill_pg/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "wmill-pg" -version = "1.496.2" +version = "1.496.3" description = "An extension client for the wmill client library focused on pg" license = "Apache-2.0" homepage = "https://windmill.dev" diff --git a/typescript-client/jsr.json b/typescript-client/jsr.json index 3177b9df48..0e46d4699c 100644 --- a/typescript-client/jsr.json +++ b/typescript-client/jsr.json @@ -1,6 +1,6 @@ { "name": "@windmill/windmill", - "version": "1.496.2", + "version": "1.496.3", "exports": "./src/index.ts", "publish": { "exclude": ["!src", "./s3Types.ts", "./client.ts"] diff --git a/typescript-client/package.json b/typescript-client/package.json index f58b680d55..a67cfc0279 100644 --- a/typescript-client/package.json +++ b/typescript-client/package.json @@ -1,7 +1,7 @@ { "name": "windmill-client", "description": "Windmill SDK client for browsers and Node.js", - "version": "1.496.2", + "version": "1.496.3", "author": "Ruben Fiszel", "license": "Apache 2.0", "devDependencies": { diff --git a/version.txt b/version.txt index 4294edeb7c..3efb286dd1 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.496.2 +1.496.3 From b56a5c3e7acd87e0dc7327e9657a9c0bd5b480e3 Mon Sep 17 00:00:00 2001 From: Diego Imbert <70353967+diegoimbert@users.noreply.github.com> Date: Tue, 10 Jun 2025 11:49:47 +0200 Subject: [PATCH 561/739] never exclude _ee.rs files in vscode (#5907) --- backend/.vscode/settings.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/backend/.vscode/settings.json b/backend/.vscode/settings.json index 6ebd36cf07..6c9612d5c3 100644 --- a/backend/.vscode/settings.json +++ b/backend/.vscode/settings.json @@ -11,5 +11,7 @@ "remote.autoForwardPorts": true, "conventionalCommits.scopes": [ "restructring triggers, decoding trigger message on work" - ] + ], + "files.exclude": { "**/*ee.rs": false }, + "search.exclude": { "**/*ee.rs": false } } From d2dfd27b887d61afe407b2cb2be62f60e3d0b237 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Tue, 10 Jun 2025 15:33:41 +0200 Subject: [PATCH 562/739] nit error message --- backend/windmill-queue/src/jobs.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/windmill-queue/src/jobs.rs b/backend/windmill-queue/src/jobs.rs index 3b0143c826..1676148b00 100644 --- a/backend/windmill-queue/src/jobs.rs +++ b/backend/windmill-queue/src/jobs.rs @@ -2716,7 +2716,7 @@ pub async fn get_result_by_id( .await { Ok(res) => Ok(res), - Err(_) => { + Err(e) => { let root = sqlx::query!( "SELECT id As \"id!\", @@ -2733,7 +2733,7 @@ pub async fn get_result_by_id( let restarted_from_id = not_found_if_none( root.restarted_from, "Id not found in the result's mapping of the root job and root job had no restarted from information", - format!("parent: {}, root: {}, id: {}", flow_id, root.id, node_id), + format!("parent: {}, root: {}, id: {}, error: {e:#}", flow_id, root.id, node_id), )?; get_result_by_id_from_original_flow( From 332f66e3483abbeacd4e7c1b74c94c5265314882 Mon Sep 17 00:00:00 2001 From: pyranota <92104930+pyranota@users.noreply.github.com> Date: Tue, 10 Jun 2025 18:38:18 +0200 Subject: [PATCH 563/739] feat(rust): add rust sdk (#5909) * upload client * add gh workflow * refactor build script * remove dbg! * fix async * remove unused * update dev.nu * update CI * fix ci * fixin tests * fixes + tests --- .github/workflows/rust_on_release.yml | 19 + rust-client/.gitignore | 3 + rust-client/Cargo.lock | 1821 +++++++++++++++++++++++++ rust-client/Cargo.toml | 47 + rust-client/README.md | 195 +++ rust-client/dev.nu | 81 ++ rust-client/src/client.rs | 1047 ++++++++++++++ rust-client/src/lib.rs | 8 + rust-client/src/maybe_future.rs | 48 + rust-client/src/tests.rs | 345 +++++ 10 files changed, 3614 insertions(+) create mode 100644 .github/workflows/rust_on_release.yml create mode 100644 rust-client/.gitignore create mode 100644 rust-client/Cargo.lock create mode 100644 rust-client/Cargo.toml create mode 100644 rust-client/README.md create mode 100755 rust-client/dev.nu create mode 100644 rust-client/src/client.rs create mode 100644 rust-client/src/lib.rs create mode 100644 rust-client/src/maybe_future.rs create mode 100644 rust-client/src/tests.rs diff --git a/.github/workflows/rust_on_release.yml b/.github/workflows/rust_on_release.yml new file mode 100644 index 0000000000..5594cc08bb --- /dev/null +++ b/.github/workflows/rust_on_release.yml @@ -0,0 +1,19 @@ +name: Publish rust-client to crates.io on release +on: + push: + tags: + - "v*" + workflow_dispatch: + +jobs: + build_rust_and_publish_to_crates_io: + runs-on: ubicloud-standard-8 + steps: + - uses: actions/checkout@v4 + - uses: cachix/install-nix-action@v20 + with: + extra_nix_config: | + experimental-features = nix-command flakes + - run: cd rust-client && nix develop ../ --command ./dev.nu --check --publish + env: + CRATES_IO_TOKEN: ${{ secrets.CRATES_IO_TOKEN }} diff --git a/rust-client/.gitignore b/rust-client/.gitignore new file mode 100644 index 0000000000..4924b1576c --- /dev/null +++ b/rust-client/.gitignore @@ -0,0 +1,3 @@ +windmill-api/ +windmill_api/ +api/ diff --git a/rust-client/Cargo.lock b/rust-client/Cargo.lock new file mode 100644 index 0000000000..03d1d4594a --- /dev/null +++ b/rust-client/Cargo.lock @@ -0,0 +1,1821 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "backtrace" +version = "0.3.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets", +] + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bitflags" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" + +[[package]] +name = "bumpalo" +version = "3.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" + +[[package]] +name = "cc" +version = "1.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0fc897dc1e865cc67c0e05a836d9d3f1df3cbe442aa4a9473b18e12624a4951" +dependencies = [ + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "chrono" +version = "0.4.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "num-traits", + "serde", + "windows-link", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "darling" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +dependencies = [ + "darling_core", + "quote", + "syn", +] + +[[package]] +name = "deranged" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" +dependencies = [ + "powerfmt", + "serde", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", + "wasm-bindgen", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "http" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "hyper" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03a01595e11bdcec50946522c32dde3fc6914743000a68b93000965f2f02406d" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", + "webpki-roots", +] + +[[package]] +name = "hyper-util" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c293b6b3d21eca78250dc7dbebd6b9210ec5530e038cbfe0661b5c47ab06e8" +dependencies = [ + "base64", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "icu_collections" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" + +[[package]] +name = "icu_properties" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "potential_utf", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" + +[[package]] +name = "icu_provider" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +dependencies = [ + "displaydoc", + "icu_locale_core", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +dependencies = [ + "equivalent", + "hashbrown 0.15.3", + "serde", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "iri-string" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "libc" +version = "0.2.172" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" + +[[package]] +name = "litemap" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" + +[[package]] +name = "log" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mime_guess" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +dependencies = [ + "mime", + "unicase", +] + +[[package]] +name = "miniz_oxide" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +dependencies = [ + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.59.0", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "potential_utf" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro2" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quinn" +version = "0.11.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "626214629cda6781b6dc1d316ba307189c85ba657213ce642d9c77670f8202c8" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "socket2", + "thiserror", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49df843a9161c85bb8aae55f101bc0bac8bcafd637a620d9122fd7e0b2f7422e" +dependencies = [ + "bytes", + "getrandom 0.3.3", + "lru-slab", + "rand", + "ring", + "rustc-hash", + "rustls", + "rustls-pki-types", + "slab", + "thiserror", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee4e529991f949c5e25755532370b8af5d114acae52326361d68d47af64aa842" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.52.0", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + +[[package]] +name = "rand" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +dependencies = [ + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.3", +] + +[[package]] +name = "reqwest" +version = "0.12.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2f8e5513d63f2e5b386eb5106dc67eaf3f84e95258e210489136b8b92ad6119" +dependencies = [ + "base64", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "mime_guess", + "once_cell", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.16", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + +[[package]] +name = "rustls" +version = "0.23.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "730944ca083c1c233a75c09f199e973ca499344a2b7ba9e755c457e86fb4a321" +dependencies = [ + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pki-types" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_repr" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" +dependencies = [ + "base64", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.9.0", + "serde", + "serde_derive", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_yaml" +version = "0.9.34+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" +dependencies = [ + "indexmap 2.9.0", + "itoa", + "ryu", + "serde", + "unsafe-libyaml", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" + +[[package]] +name = "socket2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "time" +version = "0.3.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" + +[[package]] +name = "time-macros" +version = "0.2.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.45.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2", + "tokio-macros", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" +dependencies = [ + "bitflags", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +dependencies = [ + "once_cell", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "unicase" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "unsafe-libyaml" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" +dependencies = [ + "getrandom 0.3.3", + "js-sys", + "serde", + "wasm-bindgen", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2853738d1cc4f2da3a225c18ec6c3721abb31961096e9dbf5ab35fa88b19cfdb" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "windmill-api" +version = "1.496.3" +dependencies = [ + "reqwest", + "serde", + "serde_json", + "serde_repr", + "serde_with", + "url", + "uuid", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-link" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags", +] + +[[package]] +name = "wmill" +version = "1.496.3" +dependencies = [ + "anyhow", + "futures", + "once_cell", + "serde", + "serde_json", + "serde_yaml", + "thiserror", + "tokio", + "uuid", + "windmill-api", +] + +[[package]] +name = "writeable" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" + +[[package]] +name = "yoke" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/rust-client/Cargo.toml b/rust-client/Cargo.toml new file mode 100644 index 0000000000..5b49ab15fd --- /dev/null +++ b/rust-client/Cargo.toml @@ -0,0 +1,47 @@ +[package] +name = "wmill" +version = """ +1.496.3 +""" +edition = "2024" +description = "A client library for accessing Windmill server wrapping the Windmill client API" +license = "Apache-2.0" +homepage = "https://windmill.dev" + +[workspace] +resolver = "3" +members = ["windmill_api"] + +[dependencies] +serde_yaml = "0.9" +serde_json = "1.0" +serde = "1.0" +thiserror = "2" +anyhow = "1.0" +uuid = "1" + +[dependencies.windmill-api] +path = "./windmill_api" +version = "1.496.3" + +[dependencies.futures] +version = "0.3" + +[dependencies.tokio] +version = "1" +default-features = false + +[dependencies.once_cell] +version = "1.18" + +[dev-dependencies.tokio] +version = "1" +default-features = false +features = [ + "rt", + "macros", +] + +[features] +default = [] +async = [] diff --git a/rust-client/README.md b/rust-client/README.md new file mode 100644 index 0000000000..4fbf85010f --- /dev/null +++ b/rust-client/README.md @@ -0,0 +1,195 @@ +# Windmill Rust SDK + +A Rust client library for interacting with [Windmill](https://www.windmill.dev/) API, providing type-safe abstractions for variables, resources, scripts, jobs, and state management. + +## Installation + +Add this to your ```Cargo.toml```: + +```toml +[dependencies] +wmill = "0.1.0" +``` + +For async support (recommended): + +```toml +[dependencies] +wmill = { version = "0.1.0", features = ["async"] } +``` + +## Usage + +### Initialize Client + +```ignore +use wmill::Windmill; + +#[tokio::main] +async fn main() -> Result<(), Box> { + // Read config from env vars + let wm = Windmill::default()?; + + // Or override specific values + let wm = Windmill::new( + Some("custom_token".to_string()), + Some("my_workspace".to_string()), + Some("http://localhost:8000".to_string()) + )?; + + Ok(()) +} +``` + +### Variables + +```ignore +// Get variable (auto-parsed) +let db_config: serde_json::Value = wm.get_variable("u/admin/db_config").await?; + +// Get raw variable +let raw_text = wm.get_variable_raw("u/user/text_note").await?; + +// Set variable +wm.set_variable("new_value".to_string(), "u/user/my_var", false).await?; +``` + +### Resources + +```ignore +// Get resource (typed) +#[derive(serde::Deserialize)] +struct DbConfig { host: String, port: u16 } + +let config: DbConfig = wm.get_resource("u/admin/db").await?; + +// Get raw resource +let raw_json = wm.get_resource_any("u/admin/db").await?; + +// Set resource +wm.set_resource( + Some(serde_json::json!({"host": "localhost", "port": 5432})), + "u/admin/db", + "postgresql" +).await?; +``` + +### Scripts + +```ignore +// Run script async +let job_id = wm.run_script_async( + "u/user/my_script", + false, + serde_json::json!({"param": "value"}), + Some(10) // Schedule in 10 seconds +).await?; + +// Run script sync +let result = wm.run_script_sync( + "u/user/my_script", + false, + serde_json::json!({"param": "value"}), + Some(10), + Some(30), // 30s timeout + true, // Verbose + true // Assert result not None +).await?; +``` + +### Jobs + +```ignore +// Wait for job completion +let result = wm.wait_job(&job_id, Some(60), true, true).await?; + +// Get job status +let status = wm.get_job_status(&job_id).await?; // Running/Waiting/Completed + +// Get result directly +let result = wm.get_result(&job_id).await?; +``` + +### State Management + +```ignore +// Get typed state +#[derive(serde::Deserialize)] +struct ScriptState { counter: i32 } + +let state: ScriptState = wm.get_state().await?; + +// Get raw state +let raw_state = wm.get_state_any().await?; + +// Update state +wm.set_state(Some(serde_json::json!({"counter": 42}))).await?; +``` + +### Progress Tracking + +```ignore +// Set job progress +wm.set_progress(75, None).await?; // Uses current job ID from env + +// Get job progress +let progress = wm.get_progress(Some(job_id.to_string())).await?; +``` + +### Custom API Calls + +The SDK provides direct access to underlying API endpoints through the ```call_api``` method, which works in both async and sync contexts: + +```ignore +// Async usage +#[tokio::main] +async fn main() -> Result<(), Box> { + let wm = Windmill::default()?; + + // Make direct API call to get user + let user = wm.call_api(wmill::apis::admin_api::get_user( + &wm.client_config, + &wm.workspace, + "Alice" + )).await; + + println!("User details: {:?}", user); + Ok(()) +} + +// Sync usage +fn main() { + let wm = Windmill::default().unwrap(); + + // Make direct API call to get user + let user = wm.call_api(wmill::apis::admin_api::get_user( + &wm.client_config, + &wm.workspace, + "Bob" + )); + + println!("User details: {:?}", user); +} +``` + +This advanced feature allows access to any Windmill API endpoint, even those not covered by the SDK's convenience methods. Use this when: +- Need to access newer/undocumented API endpoints +- Require fine-grained control over API requests +- Existing abstractions don't meet specific needs + +## Environment Variables + +The SDK uses these environment variables: + +| Variable | Required | Description | +|---------|----------|-------------| +| ```WM_TOKEN``` | ✅ | Authentication token | +| ```WM_WORKSPACE``` | ✅ | Workspace name | +| ```BASE_INTERNAL_URL``` | ✅ | API base URL (without ```/api```) | +| ```WM_JOB_ID``` | Optional | Current job ID for progress tracking | +| ```WM_STATE_PATH_NEW``` | Optional | State path override | + +## Contributions + +Contributions are welcome! Please open an issue or submit a PR. + diff --git a/rust-client/dev.nu b/rust-client/dev.nu new file mode 100755 index 0000000000..010b84aa39 --- /dev/null +++ b/rust-client/dev.nu @@ -0,0 +1,81 @@ +#! /usr/bin/env nu + +let version = open ../version.txt; + +def main [ --publish(-p) --check(-c) --test(-t) ] { + mkdir api/a/ + + open ../backend/windmill-api/openapi.yaml + # openapi-generator confused with these two, so we just drop them + | reject paths."/w/{workspace}/apps/create_raw" + | reject paths."/w/{workspace}/apps/update_raw/{path}" + | save -f api/openapi.yaml; + + openapi-generator-cli generate -i api/openapi.yaml -g rust -o ./windmill_api --strict-spec true --additional-properties=packageName="windmill-api" + + # Patch Cargo.toml + open Cargo.toml + | update package.version $version + | save -f Cargo.toml + + # Patch windmill_api/Cargo.toml + open windmill_api/Cargo.toml + # Use rustls - otherwise compilation will fail due to missing libssl + | update dependencies.reqwest.features [json, multipart, rustls-tls] + | insert dependencies.reqwest.default-features false + | update package.license "Apache-2.0" + | insert package.homepage "https://windmill.dev" + | save -f windmill_api/Cargo.toml + + # Recursively replace serde_json::from_str with our patched version + ls ./windmill_api/src/**/*.rs + | each { |file| + let path = $file.name + open $path + | str replace --all "serde_json::from_str" "crate::from_str_patched/* Externally injected from /build.nu */" + | save -f $path + } + + # Inject patched from_str + echo ` +// NOTE: Injected by rust-client/dev.nu +pub fn from_str_patched<'a, T>(s: &'a str) -> Result +where + T: serde::de::DeserializeOwned + 'static, +{ + if std::any::TypeId::of::() == std::any::TypeId::of::() + || std::any::TypeId::of::() == std::any::TypeId::of::() { + // unsafe { std::mem::transmute::<&str, T>(s) } + // Quote string + let a = format!("\"{}\"", s.replace('"', r#"\""#)); + serde_json::from_str(&a) + } else { + serde_json::from_str(s) + } +} + ` | save --append ./windmill_api/src/lib.rs + + if $check { + print "Checking..." + cargo check --no-default-features + cargo check --features "async" + } + + if $test { + print "Testing..." + cargo test --features async simple + cargo test --no-default-features + } + + if $publish { + print "Publishing..." + + print Publishing windmill-api + cd windmill_api + cargo publish --token $env.CRATES_IO_TOKEN --allow-dirty + + print Publishing wmill + cd ../ + cargo publish --token $env.CRATES_IO_TOKEN --allow-dirty + } +} diff --git a/rust-client/src/client.rs b/rust-client/src/client.rs new file mode 100644 index 0000000000..66dea99fbb --- /dev/null +++ b/rust-client/src/client.rs @@ -0,0 +1,1047 @@ +#[cfg(feature = "async")] +use futures::FutureExt; +use windmill_api::{ + apis::{ + configuration::Configuration, + job_api, + resource_api::{self, get_resource_value_interpolated}, + variable_api, + }, + models::{EditResource, GetCompletedJobResultMaybe200Response}, +}; + +use serde::Deserialize; +use serde_json::{Value, json}; +use std::{ + env::{self, var}, + fmt::Debug, + time::{Duration, Instant}, +}; + +use crate::{maybe_future::maybe_future::MaybeFuture, ret}; + +#[derive(Debug, Clone)] +pub struct Windmill { + pub workspace: String, + pub token: String, + pub base_internal_url: String, + pub client_config: Configuration, +} + +impl Windmill { + /// Creates a new `Windmill` instance with default configuration. + /// + /// Reads configuration from environment variables: + /// - `WM_TOKEN` for authentication token + /// - `WM_WORKSPACE` for workspace name + /// - `BASE_INTERNAL_URL` for API base URL (appends `/api` automatically) + /// + /// # Errors + /// Returns `SdkError` if: + /// - Required environment variables are missing + /// - Environment variables cannot be read + pub fn default() -> Result { + Windmill::new(None, None, None) + } + + /// Creates a new `Windmill` instance with optional overrides. + /// + /// Falls back to environment variables for any `None` parameters: + /// - `WM_TOKEN` if `token` is `None` + /// - `WM_WORKSPACE` if `workspace` is `None` + /// - `BASE_INTERNAL_URL` + "/api" if `base_internal_url` is `None` + /// + /// # Parameters + /// - `token`: Optional bearer token override + /// - `workspace`: Optional workspace name override + /// - `base_internal_url`: Optional base URL override (without `/api` suffix) + /// + /// # Errors + /// Returns `SdkError` if: + /// - Required environment variables are missing when needed + /// - Environment variables cannot be read + pub fn new( + token: Option, + workspace: Option, + base_internal_url: Option, + ) -> Result { + use env::var; + let (token, base_internal_url, workspace) = ( + token.or(var("WM_TOKEN").ok()).ok_or(SdkError::BadValue( + "WM_TOKEN is not set nor was provided in constructor".to_owned(), + ))?, + base_internal_url + .or(var("BASE_INTERNAL_URL").ok()) + .ok_or(SdkError::BadValue( + "BASE_INTERNAL_URL is not set nor was provided in constructor".to_owned(), + ))? + + "/api", + workspace + .or(var("WM_WORKSPACE").ok()) + .ok_or(SdkError::BadValue( + "WM_WORKSPACE is not set nor was provided in constructor".to_owned(), + ))?, + ); + + Ok(Windmill { + client_config: Configuration { + // TODO: client: reqwest::blocking::Client::new(), // Use blocking client? + base_path: base_internal_url.clone(), + bearer_access_token: Some(token.clone()), + ..Default::default() + }, + workspace, + token, + base_internal_url, + }) + } + + /// Retrieves a variable from Windmill, automatically parsing it as JSON/YAML. + /// + /// This is the convenience version that attempts to parse the variable value as: + /// 1. JSON (primary attempt) + /// 2. YAML (fallback if JSON parsing fails) + /// 3. Raw string (final fallback if both parsings fail) + /// + /// For better performance when you know the format or don't need parsing, + /// use [`Self::get_variable_raw`] instead. + /// + /// # Arguments + /// * `path` - Variable path (e.g., "u/user/variable_name") + /// + /// # Example + /// ```no_run + /// + /// use wmill::Windmill; + /// use serde_json::json; + /// + /// let wm = Windmill::default()?; + /// + /// // For a variable containing JSON: {"key": "value"} + /// let json_var = wm.get_variable("u/admin/config")?; + /// + /// // For a variable containing plain text + /// let text_var = wm.get_variable("u/user/plaintext_note")?; + /// + /// # Ok::<(), wmill::SdkError>(()) + /// ``` + /// + /// See also: [`Self::get_variable_raw`] for the unparsed version + pub fn get_variable<'a>(&'a self, path: &'a str) -> MaybeFuture<'a, Result> { + ret!(self.get_variable_inner(path)); + } + + async fn get_variable_inner<'a>(&'a self, path: &'a str) -> Result { + let raw = self.get_variable_raw_inner(path).await?; + Ok(serde_json::from_str(&raw) + .or(serde_yaml::from_str(&raw)) + .unwrap_or(json!(raw))) + } + + /// This is the **faster version** when: + /// - You know the variable contains plain text + /// - You want to handle parsing yourself + /// - You need maximum performance + /// + /// Performance benefit comes from avoiding: + /// 1. JSON parsing attempt + /// 2. YAML parsing fallback + /// + /// # Arguments + /// * `path` - Variable path (e.g., "u/user/variable_name") + /// + /// # Example + /// ```no_run + /// use wmill::Windmill; + /// use serde_json::{json, Value}; + /// + /// let wm = Windmill::default()?; + /// + /// // When you need the raw content + /// let raw_content = wm.get_variable_raw("u/user/custom_format")?; + /// + /// // When you know it's JSON and want to parse it differently + /// let json_value: Value = serde_json::from_str( + /// &wm.get_variable_raw("u/admin/config")? + /// )?; + /// + /// # Ok::<(), wmill::SdkError>(()) + /// ``` + /// + /// See also: [`Self::get_variable`] for the auto-parsed version + pub fn get_variable_raw<'a>( + &'a self, + path: &'a str, + ) -> MaybeFuture<'a, Result> { + ret!(self.get_variable_raw_inner(path)); + } + + async fn get_variable_raw_inner<'a>(&'a self, path: &'a str) -> Result { + let v = + variable_api::get_variable_value(&self.client_config, &self.workspace, path).await?; + + v.get(1..v.len() - 1) + .ok_or(SdkError::InternalError( + "returned value is incorrect".into(), + )) + .map(|s| s.to_owned()) + } + + /// Creates or updates a variable in the workspace. + /// + /// This function provides atomic variable management that: + /// - Creates a new variable if it doesn't exist + /// - Updates an existing variable if found + /// - Handles both regular and secret variables + /// + /// # Parameters + /// - `value`: The variable value to set + /// - `path`: The variable path/identifier + /// - `is_secret`: Whether to store as a secret (encrypted) variable + /// + /// # Errors + /// Returns `SdkError` if: + /// - Variable fetch fails for reasons other than "not found" + /// - Variable creation fails + /// - Variable update fails + /// - Underlying API calls fail + /// + /// # Notes + /// - For new variables, defaults to empty description + /// - Updates only modify the value (preserving other metadata) + /// - Secret status can only be set during creation + pub fn set_variable<'a>( + &'a self, + value: String, + path: &'a str, + is_secret: bool, + ) -> MaybeFuture<'a, Result<(), SdkError>> { + ret!(self.set_variable_inner(value, path, is_secret)); + } + + async fn set_variable_inner<'a>( + &'a self, + value: String, + path: &'a str, + is_secret: bool, + ) -> Result<(), SdkError> { + let res = + variable_api::get_variable(&self.client_config, &self.workspace, path, None, None) + .await; + + if res.is_err() { + variable_api::create_variable( + &self.client_config, + &self.workspace, + windmill_api::models::CreateVariable { + path: path.to_owned(), + value, + is_secret, + description: "".to_owned(), + account: None, + is_oauth: None, + expires_at: None, + }, + None, + ) + .await?; + } else { + variable_api::update_variable( + &self.client_config, + &self.workspace, + path, + windmill_api::models::EditVariable { + path: None, + value: Some(value), + is_secret: None, + description: None, + }, + None, + ) + .await?; + } + Ok(()) + } + + /// Fetches and deserializes a resource into a concrete type. + /// + /// This is the recommended way to access resources when you know the expected type. + /// For raw JSON access or dynamic typing, use [`Self::get_resource_any`] instead. + /// + /// # Type Parameters + /// * `T` - Any type implementing `DeserializeOwned` (most structs with `#[derive(Deserialize)]`) + /// + /// # Arguments + /// * `path` - The resource path (e.g., "u/user/resource_name") + /// + /// # Example + /// ```no_run + /// use wmill::Windmill; + /// use serde_json::{json, Value}; + /// use serde::Deserialize; + /// + /// #[derive(Deserialize)] + /// struct DbConfig { + /// url: String, + /// pool_size: Option, + /// } + /// + /// let wm = Windmill::default()?; + /// + /// // Directly deserialize to your type + /// let config: DbConfig = wm.get_resource("u/admin/db_connection")?; + /// # Ok::<(), wmill::SdkError>(()) + /// ``` + /// + /// See also: [`Self::get_resource_any`] for untyped version + pub fn get_resource<'a, T: serde::de::DeserializeOwned>( + &'a self, + path: &'a str, + ) -> MaybeFuture<'a, Result> { + ret!(self.get_resource_inner(path)); + } + + async fn get_resource_inner<'a, T: serde::de::DeserializeOwned>( + &'a self, + path: &'a str, + ) -> Result { + Ok(serde_json::from_value( + self.get_resource_any_inner(path).await?, + )?) + } + + /// Fetches a raw JSON [`Value`] from Windmill by path. + /// + /// Use this when you need the raw JSON structure or don't have a concrete type to deserialize into. + /// For typed deserialization, prefer [`Self::get_resource`] instead. + /// + /// # Arguments + /// * `path` - The resource path (e.g., "u/user/resource_name") + /// + /// # Example + /// ```no_run + /// use wmill::Windmill; + /// + /// let wm = Windmill::default()?; + /// + /// // When you need to inspect the raw structure first + /// let json = wm.get_resource_any("u/admin/db_connection")?; + /// + /// println!("Url is: {}", json["url"]); + /// + /// # Ok::<(), wmill::SdkError>(()) + /// ``` + /// + /// See also: [`Self::get_resource`] for typed version + pub fn get_resource_any<'a>( + &'a self, + path: &'a str, + ) -> MaybeFuture<'a, Result> { + ret!(self.get_resource_any_inner(path)); + } + + async fn get_resource_any_inner<'a>(&'a self, path: &'a str) -> Result { + Ok( + get_resource_value_interpolated(&self.client_config, &self.workspace, path, None) + .await?, + ) + } + + /// Creates or updates a resource in Windmill. + /// + /// This function sets a resource's value at the specified path, creating it if it doesn't exist + /// or updating it if it does. The resource will be of the specified type. + /// + /// # Arguments + /// * `value` - The value to set for the resource. Use `None` to create an empty resource. + /// * `path` - The ownership path of the resource (e.g., "u/user/resource_name"). + /// Defines permissions based on Windmill's path prefix system. + /// * `resource_type` - The type of resource to create (e.g., "postgresql", "smtp"). + /// Must be a pre-existing resource type. + /// + /// # Examples + /// ```no_run + /// use wmill::Windmill; + /// + /// # fn main() -> anyhow::Result<()> { + /// let wm = Windmill::default()?; + /// wm.set_resource( + /// Some(serde_json::json!({"host": "localhost", "port": 5432})), + /// "u/admin/database", + /// "postgresql" + /// )?; + /// # Ok(()) + /// # } + /// ``` + pub fn set_resource<'a>( + &'a self, + value: Option, + path: &'a str, + resource_type: &'a str, + ) -> MaybeFuture<'a, Result<(), SdkError>> { + ret!(self.set_resource_inner(value, path, resource_type)); + } + + async fn set_resource_inner<'a>( + &'a self, + value: Option, + path: &'a str, + resource_type: &'a str, + ) -> Result<(), SdkError> { + // if resource_api::get_resource(&self.client_config, &self.workspace, path) + // .await + // .is_err() + if !resource_api::exists_resource(&self.client_config, &self.workspace, path).await? { + resource_api::create_resource( + &self.client_config, + &self.workspace, + windmill_api::models::CreateResource { + path: path.to_owned(), + value, + description: None, + resource_type: resource_type.to_owned(), + // resource_type: "any".to_owned(), + }, + // Some(true), + None, + ) + .await?; + } else { + resource_api::update_resource( + &self.client_config, + &self.workspace, + path, + EditResource { + path: None, + description: None, + value: Some(value), + }, + ) + .await?; + } + Ok(()) + } + + /// Retrieves and deserializes the current typed state value for a script's execution context. + /// + /// This is the typed version of [`Self::get_state_any`], automatically deserializing the state + /// into the specified type `T` that implements [`serde::de::DeserializeOwned`]. + /// + /// # Type Parameter + /// * `T` - The type to deserialize into (must implement `serde::de::DeserializeOwned`) + /// + /// # Examples + /// ```no_run + /// use wmill::Windmill; + /// use serde_json::{json, Value}; + /// use serde::Deserialize; + /// + /// #[derive(Deserialize)] + /// struct ScriptState { + /// counter: i32, + /// last_run: String, + /// } + /// + /// let wm = Windmill::default()?; + /// + /// // Get typed state + /// let state: ScriptState = wm.get_state()?; + /// + /// println!("Counter: {}, Last run: {}", state.counter, state.last_run); + /// + /// # Ok::<(), wmill::SdkError>(()) + /// ``` + /// + /// # Behavior Details + /// - Uses same state path resolution as [`Self::get_state_any`] (`WM_STATE_PATH_NEW` → `WM_STATE_PATH` fallback) + /// - Performs runtime type checking during deserialization + /// + /// # When to Use vs [`Self::get_state_any`] + /// | Use Case | `get_state` | `get_state_any` | + /// |------------------------|-------------------------|------------------------| + /// | Known state structure | ✅ Preferred | ⚠️ Requires manual parsing | + /// | Dynamic state | ❌ Won't compile | ✅ Works | + /// | Type safety | ✅ Compile-time checks | ❌ Runtime checks only | + /// + /// # Notes + /// - For complex types, derive `Deserialize` using Serde attributes + /// - Prefer this over [`Self::get_state_any`] when state schema is stable + /// - State modifications should use corresponding [`Self::set_state`] with matching type + /// + /// # See Also + /// - [`Self::get_state_any`] - Untyped state access + /// - [`Self::set_state`] - For updating typed states + /// - [Windmill State Management](https://www.windmill.dev/docs/core_concepts/persistent_storage/within_windmill#states) + pub fn get_state<'a, T: serde::de::DeserializeOwned>( + &'a self, + ) -> MaybeFuture<'a, Result> { + ret!(self.get_resource_inner(&get_state_path()?)); + } + + /// Retrieves the current state value for a script's execution context. + /// + /// States persist data between runs of the same script by the same trigger (schedule or user). + /// This is the untyped version that returns a generic [`Value`]. + /// + /// # Examples + /// ```no_run + /// use wmill::Windmill; + /// use serde_json::Value; + /// use serde::Deserialize; + /// + /// let wm = Windmill::default()?; + /// + /// // Get state (returns serde_json::Value) + /// let state: Value = wm.get_state_any()?; + /// + /// // Use with default if empty + /// let counter = state.as_i64().unwrap_or(0); + /// # Ok::<(), wmill::SdkError>(()) + /// ``` + /// + /// # Behavior Details + /// - Automatically uses the script's state path from `WM_STATE_PATH_NEW` (falls back to `WM_STATE_PATH`) + /// - Returns the full state object stored as a Windmill resource + /// - State resources are hidden from Workspace view but visible under Resources → States + /// + /// # Typical Use Cases + /// 1. Maintaining counters between runs + /// 2. Storing last execution timestamps + /// 3. Keeping reference data (like previous API responses) + /// + /// # Notes + /// - For typed state access, use `get_state` instead + /// - States are isolated per script and trigger combination + /// - Maximum state size: 5MB (compressed) + /// + /// # See Also + /// - [`Self::set_state`] - For updating the state + /// - [Windmill State Management](https://www.windmill.dev/docs/core_concepts/persistent_storage/within_windmill#states) + pub fn get_state_any<'a>(&'a self) -> MaybeFuture<'a, Result> { + ret!(self.get_resource_any_inner(&get_state_path()?)); + } + + /// Updates or clears the script's persistent state. + /// + /// # Arguments + /// * `value` - New state value (`Some(Value)`) or `None` to clear state + /// + /// # Examples + /// ```no_run + /// use wmill::Windmill; + /// use serde_json::json; + /// + /// # async fn example() -> anyhow::Result<()> { + /// let wm = Windmill::default()?; + /// + /// // Set state + /// wm.set_state(Some(json!({"count": 42})))?; + /// + /// // Clear state + /// wm.set_state(None)?; + /// # Ok(()) + /// # } + /// ``` + /// + /// See also: [`Self::get_state`], [`Self::get_state_any`] + pub fn set_state<'a>(&'a self, value: Option) -> MaybeFuture<'a, Result<(), SdkError>> { + ret!(self.set_resource_inner(value, &get_state_path()?, "state")); + } + + /// Executes a script synchronously and waits for its completion. + /// + /// This is a blocking version of `run_script_async` that handles the entire script execution + /// lifecycle including job scheduling and result waiting. + /// + /// # Parameters + /// - `ident`: Script identifier (either path or hash) + /// - `ident_is_hash`: Whether the identifier is a hash (true) or path (false) + /// - `args`: JSON arguments to pass to the script + /// - `scheduled_in_secs`: Optional delay before execution (in seconds) + /// - `timeout_secs`: Maximum time to wait for job completion (in seconds) + /// - `verbose`: Whether to print execution details + /// - `assert_result_is_not_none`: Whether to fail if the result is None + /// + /// # Errors + /// Returns `SdkError` if: + /// - Script fails to start + /// - Job times out + /// - Result assertion fails + /// - Underlying API calls fail + pub fn run_script_sync<'a>( + &'a self, + ident: &'a str, + ident_is_hash: bool, + args: Value, + scheduled_in_secs: Option, + timeout_secs: Option, + verbose: bool, + assert_result_is_not_none: bool, + ) -> MaybeFuture<'a, Result> { + if verbose { + println!("running `{ident}` synchronously with {:?}", &args); + } + + ret!(async move { + let job_id = self + .run_script_async_inner(ident, ident_is_hash, args, scheduled_in_secs) + .await?; + self.wait_job_inner( + &job_id.to_string(), + timeout_secs, + verbose, + assert_result_is_not_none, + ) + .await + }); + } + + /// Asynchronously executes a script in Windmill and returns its job UUID. + /// + /// This function runs a script either by path or by hash, with optional: + /// - Parent job inheritance (when run within a flow) + /// - Scheduled execution delay + /// - Argument passing + /// + /// # Arguments + /// * `ident` - Script identifier (path or hash depending on `ident_is_hash`) + /// * `ident_is_hash` - If true, `ident` is treated as a script hash; if false, as a path + /// * `args` - JSON arguments to pass to the script (must be an object if using path) + /// * `scheduled_in_secs` - Optional delay (in seconds) before execution + /// + /// # Examples + /// ```no_run + /// use wmill::Windmill; + /// use serde_json::json; + /// + /// let wm = Windmill::default()?; + /// let job_id = wm.run_script_async( + /// "u/user/script_path", + /// false, + /// json!({"param1": "value1"}), + /// Some(10) // Run after 10 seconds + /// )?; + /// + /// # Ok::<(), wmill::SdkError>(()) + /// ``` + /// + /// # Behavior Details + /// - **Automatic Job Inheritance**: + /// - Detects `WM_JOB_ID` env var → sets as `parent_job` + /// - Detects `WM_ROOT_FLOW_JOB_ID` env var → sets as `root_job` + /// - **Scheduled Execution**: + /// - When `scheduled_in_secs` is provided, sets `scheduled_in_secs` in args + /// - **Argument Handling**: + /// - For path-based execution (`ident_is_hash=false`), args must be a JSON object + /// - For hash-based execution, args can be any valid JSON value + /// + /// # Errors + /// - [`SdkError::BadValue`] if path-based execution receives non-object arguments + /// - API errors from Windmill's backend + pub fn run_script_async<'a>( + &'a self, + ident: &'a str, + ident_is_hash: bool, + args: Value, + scheduled_in_secs: Option, + ) -> MaybeFuture<'a, Result> { + ret!(self.run_script_async_inner(ident, ident_is_hash, args, scheduled_in_secs)); + } + + async fn run_script_async_inner<'a>( + &'a self, + ident: &'a str, + ident_is_hash: bool, + mut args: Value, + scheduled_in_secs: Option, + ) -> Result { + if let Ok(parent_job) = var("WM_JOB_ID") { + args["parent_job"] = json!(parent_job); + } + + if let Ok(root_job) = var("WM_ROOT_FLOW_JOB_ID") { + args["root_job"] = json!(root_job); + } + + if let Some(scheduled_in_secs) = scheduled_in_secs { + args["scheduled_in_secs"] = json!(scheduled_in_secs); + } + + let uuid = if ident_is_hash { + job_api::run_script_by_hash( + &self.client_config, + &self.workspace, + ident, + args, + None, + None, + None, + None, + None, + None, + None, + None, + None, + ) + .await? + } else { + job_api::run_script_by_path( + &self.client_config, + &self.workspace, + ident, + args.as_object() + .ok_or(SdkError::BadValue(format!( + "Args should be Object, but it is: {}", + args + )))? + .clone() + .into_iter() + .collect(), + None, + None, + None, + None, + None, + None, + None, + None, + ) + .await? + }; + Ok(uuid) + } + + /// Waits for a job to complete and returns its result. + /// + /// This function provides both synchronous and asynchronous interfaces for waiting + /// on job completion, with timeout handling and result validation. + /// + /// # Parameters + /// - `job_id`: The ID of the job to wait for + /// - `timeout_secs`: Maximum time to wait (in seconds) before cancelling the job + /// - `verbose`: Whether to print progress information + /// - `assert_result_is_not_none`: Whether to fail if the job returns no result + /// + /// # Errors + /// Returns `SdkError` if: + /// - Job fails or times out + /// - Result assertion fails when `assert_result_is_not_none` is true + /// - Underlying API calls fail + /// + /// # Behavior + /// 1. Polls job status at 500ms intervals + /// 2. Cancels job if timeout is reached + /// 3. Validates success status and optional result presence + /// 4. Returns either the result or appropriate error + pub fn wait_job<'a>( + &'a self, + job_id: &'a str, + timeout_secs: Option, + verbose: bool, + assert_result_is_not_none: bool, + ) -> MaybeFuture<'a, Result> { + ret!(self.wait_job_inner(job_id, timeout_secs, verbose, assert_result_is_not_none)); + } + + async fn wait_job_inner<'a>( + &'a self, + job_id: &'a str, + timeout_secs: Option, + verbose: bool, + assert_result_is_not_none: bool, + ) -> Result { + let start = Instant::now(); + loop { + if let Some(timeout) = timeout_secs { + if start.elapsed().as_secs() > timeout { + println!("WARN: reached timeout for {job_id}. Cancelling the job."); + job_api::cancel_queued_job( + &self.client_config, + &self.workspace, + job_id, + windmill_api::models::CancelQueuedJobRequest { + reason: Some("reached timeout".into()), + }, + ) + .await?; + } + } + let GetCompletedJobResultMaybe200Response { + completed, + result, + success, + started, + } = job_api::get_completed_job_result_maybe( + &self.client_config, + &self.workspace, + job_id, + Some(true), + ) + .await?; + + if matches!(started, Some(false)) && verbose { + println!("INFO: job {job_id} has not started yet"); + } + + if completed { + if matches!(success, Some(true)) { + if result.is_none() && assert_result_is_not_none { + return Err(SdkError::ExecutionError("Result was None".into())); + } + return Ok(result.unwrap_or_default()); + } else { + return Err(SdkError::ExecutionError(format!( + "Job {job_id} was not successful: {:?}", + result + ))); + } + } + if verbose { + println!("INFO: sleeping 0.5 seconds for {job_id}"); + } + tokio::time::sleep(Duration::from_millis(500)).await; + } + } + + /// Retrieves the current status of a Windmill job by its UUID. + /// + /// This function queries the Windmill backend to determine whether a job is: + /// - Waiting to be executed + /// - Currently running + /// - Already completed + /// + /// # Arguments + /// * `job_id` - The UUID of the job to check (format: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx") + /// + /// # Job Lifecycle States + /// - **Waiting**: Job is queued but hasn't started execution + /// - **Running**: Job is currently being executed + /// - **Completed**: Job has finished (successfully or with errors) + pub fn get_job_status<'a>( + &'a self, + job_id: &'a str, + ) -> MaybeFuture<'a, Result> { + ret!(self.get_job_status_inner(job_id)); + } + + async fn get_job_status_inner<'a>(&'a self, job_id: &'a str) -> Result { + let job = + job_api::get_job(&self.client_config, &self.workspace, job_id, Some(true)).await?; + + Ok(match job { + windmill_api::models::Job::JobOneOf(..) => JobStatus::Completed, + windmill_api::models::Job::JobOneOf1(job_one_of1) => { + if job_one_of1.running { + JobStatus::Running + } else { + JobStatus::Waiting + } + } + }) + } + + /// Retrieves the result of a completed job. + /// + /// This provides both synchronous and asynchronous interfaces for fetching + /// the final result of a successfully completed job. + /// + /// # Parameters + /// - `job_id`: The ID of the completed job to fetch results for + /// + /// # Errors + /// Returns `SdkError` if: + /// - Job is not found + /// - Job failed to complete successfully + /// - Underlying API calls fail + /// - Result cannot be parsed + /// + /// # Notes + /// - Only works for jobs that have already completed + /// - For pending/running jobs, use `wait_job` instead + /// - Does not handle timeouts or polling - assumes job is already complete + pub fn get_result<'a>(&'a self, job_id: &'a str) -> MaybeFuture<'a, Result> { + ret!(self.get_result_inner(job_id)); + } + + async fn get_result_inner<'a>(&'a self, job_id: &'a str) -> Result { + Ok(job_api::get_completed_job_result( + &self.client_config, + &self.workspace, + job_id, + None, + None, + None, + None, + ) + .await?) + } + + /// Updates the progress percentage of a running Windmill job. + /// + /// This function allows scripts to report their execution progress (0-100%) back to the Windmill UI. + /// Progress updates are visible in both the jobs dashboard and flow visualizations. + /// + /// # Arguments + /// * `value` - Progress percentage (0-100) + /// * `job_id` - Optional job UUID. If None, uses current job's ID from `WM_JOB_ID` environment variable + /// + /// # Examples + /// ```no_run + /// use wmill::Windmill; + /// # fn main () -> anyhow::Result<()>{ + /// let wm = Windmill::default()?; + /// + /// // Report progress for current job + /// wm.set_progress(25, None)?; + /// # Ok(()) + /// # } + /// + /// ``` + /// + /// # Behavior Details + /// - Automatically handles flow context by detecting parent job ID + /// - Progress updates are reflected in real-time in the Windmill UI + /// - Typical usage pattern: + /// ```ignore + /// for (i, item) in items.iter().enumerate() { + /// process(item); + /// let progress = ((i + 1) * 100 / items.len()) as i32; + /// wmill.set_progress(progress, None).await?; + /// } + /// ``` + /// + /// # Notes + /// - Only affects jobs that are currently running + /// - Progress values outside 0-99 range are clamped by the server + /// - Progress cannot decrease + /// - For flows, updates the progress of both the step and parent flow + /// + /// # See Also + /// - [Flow Progress Tracking](https://www.windmill.dev/docs/advanced/explicit_progress) + /// - [`Self::get_progress`] - For reading job progress + pub fn set_progress<'a>( + &'a self, + value: u32, + job_id: Option, + ) -> MaybeFuture<'a, Result<(), SdkError>> { + let f = async move { + let job_id = job_id.unwrap_or(var("WM_JOB_ID")?); + let job = + job_api::get_job(&self.client_config, &self.workspace, &job_id, Some(true)).await?; + + let flow_id = match job { + windmill_api::models::Job::JobOneOf(job) => job.parent_job, + windmill_api::models::Job::JobOneOf1(job) => job.parent_job, + }; + + windmill_api::apis::metrics_api::set_job_progress( + &self.client_config, + &self.workspace, + &job_id, + windmill_api::models::SetJobProgressRequest { + percent: Some(value as i32), + flow_job_id: flow_id, + }, + ) + .await?; + Ok(()) + }; + ret!(f); + } + + /// Retrieves the current progress percentage of a Windmill job. + /// + /// This function queries the Windmill backend to get the execution progress (0-100%) + /// of either a specific job or the current job context. + /// + /// # Arguments + /// * `job_id` - Optional job UUID. If `None`, uses current job's ID from `WM_JOB_ID` env var + /// + /// # See Also + /// - [Flow Progress Tracking](https://www.windmill.dev/docs/advanced/explicit_progress) + /// - [`Self::set_progress`] - For updating job progress + pub fn get_progress<'a>( + &'a self, + job_id: Option, + ) -> MaybeFuture<'a, Result> { + let f = async move { + let job_id = job_id.unwrap_or(var("WM_JOB_ID")?); + Ok(windmill_api::apis::metrics_api::get_job_progress( + &self.client_config, + &self.workspace, + &job_id, + ) + .await + .map(|v| v as u32)?) + }; + ret!(f); + } + + /// Executes an API call in either asynchronous or synchronous mode based on compilation context. + /// + /// This function serves as a bridge between async and sync code, automatically adapting its behavior: + /// - With `async` feature: Returns a boxed future for later await + /// - Without `async` feature: Blocks immediately using the global runtime + /// + /// # Examples + /// + /// ## Async usage (with `async` feature) + /// ```ignore + /// use wmill::Windmill; + /// # #[tokio::main] + /// # async fn main() -> anyhow::Result<()>{ + /// let wm = Windmill::default()?; + /// let user = wm.call_api(wmill::apis::admin_api::get_user(&wm.client_config, &wm.workspace, "Bob"))?; + /// println!("User details: {:?}", user); + /// # Ok(()) + /// # } + /// ``` + /// + /// ## Sync usage (without `async` feature) + /// ```ignore + /// use wmill::Windmill; + /// let wm = Windmill::new(Some("".into()), Some("admins".into()), Some("http://localhost:5000/api".into()))?; + /// let user = wm.call_api(wmill::apis::admin_api::get_user(&wm.client_config, &wm.workspace, "Bob")); + /// println!("User details: {:?}", user); + /// # Ok::<(), wmill::SdkError>(()) + /// ``` + pub fn call_api<'a, T>( + &'a self, + callback: impl Future + std::marker::Send + 'a, + ) -> MaybeFuture<'a, T> { + ret!(callback); + } + + // pub fn get_version() {} +} + +pub enum JobStatus { + Running, + Waiting, + Completed, +} + +fn get_state_path() -> Result { + Ok(var("WM_STATE_PATH_NEW").unwrap_or(var("WM_STATE_PATH")?)) +} + +#[derive(thiserror::Error, Debug)] +pub enum SdkError { + #[error("Error: {0}")] + Serde(#[from] serde_json::Error), + #[error("Having troubles reading Env Variable: {0}")] + VarError(#[from] std::env::VarError), + #[error("Api error: {0}")] + ApiError(String), + #[error("Internal Error: {0}")] + InternalError(String), + #[error("Specified value is incorrect: {0}")] + BadValue(String), + #[error("{0}")] + ExecutionError(String), +} +impl Deserialize<'a>> From> for SdkError { + fn from(value: windmill_api::apis::Error) -> Self { + Self::ApiError(value.to_string()) + } +} diff --git a/rust-client/src/lib.rs b/rust-client/src/lib.rs new file mode 100644 index 0000000000..32dbb548de --- /dev/null +++ b/rust-client/src/lib.rs @@ -0,0 +1,8 @@ +#![doc = include_str!("../README.md")] +mod client; +mod maybe_future; +#[cfg(test)] +mod tests; + +pub use client::{SdkError, Windmill}; +pub use windmill_api::apis; diff --git a/rust-client/src/maybe_future.rs b/rust-client/src/maybe_future.rs new file mode 100644 index 0000000000..ed9f3f086a --- /dev/null +++ b/rust-client/src/maybe_future.rs @@ -0,0 +1,48 @@ +// #[cfg(feature = "async")] +// use futures::future::BoxFuture; + +/// A conditional type that represents either: +/// - A boxed future (async mode) +/// - A direct value (sync mode) +pub mod maybe_future { + #[cfg(feature = "async")] + pub type MaybeFuture<'a, T> = futures::future::BoxFuture<'a, T>; + #[cfg(not(feature = "async"))] + pub type MaybeFuture<'a, T> = T; +} + +/// Bridges between async and sync execution contexts +/// +/// Behavior depends on compilation: +/// - With `async` feature: Returns a boxed future +/// - Without `async` feature: Blocks on the global runtime +#[macro_export] +macro_rules! ret { + ($ex:expr) => { + #[cfg(feature = "async")] + return async move { $ex.await }.boxed(); + + #[cfg(not(feature = "async"))] + return crate::maybe_future::RUNTIME.block_on($ex); + }; +} + +/// The global Tokio runtime instance used in sync mode +/// +/// Initialized lazily with: +/// - I/O capabilities +/// - Time utilities +/// - Current-thread executor +/// +/// # Panics +/// +/// If Tokio fails to initialize the runtime +#[cfg(not(feature = "async"))] +pub(crate) static RUNTIME: once_cell::sync::Lazy = + once_cell::sync::Lazy::new(|| { + tokio::runtime::Builder::new_current_thread() + .enable_io() + .enable_time() + .build() + .unwrap() + }); diff --git a/rust-client/src/tests.rs b/rust-client/src/tests.rs new file mode 100644 index 0000000000..7e3ef4cd77 --- /dev/null +++ b/rust-client/src/tests.rs @@ -0,0 +1,345 @@ +use serde::Deserialize; +use serde_json::json; +use uuid::Uuid; + +use super::*; + +fn wm() -> Windmill { + Windmill::new( + // Some("".into()), + None, + Some("admins".into()), + // Some("storage".into()), + Some("http://localhost:8000".into()), + ) + .unwrap() +} + +#[cfg(not(feature = "async"))] +#[test] +fn create() { + wm(); +} + +#[cfg(not(feature = "async"))] +#[test] +fn resources() { + #[derive(Deserialize, Debug, PartialEq, PartialOrd)] + struct MatrixResource { + token: String, + #[allow(non_snake_case)] + baseUrl: String, + } + let wm = wm(); + let path = format!("f/tests/delete_me_{}", Uuid::new_v4()); + + { + wm.set_resource( + Some(json!({ + "token": "token", + "baseUrl": "url" + })), + &path, + "matrix", + ) + .unwrap(); + + let matrix: MatrixResource = wm.get_resource(&path).unwrap(); + + assert_eq!( + MatrixResource { + token: "token".into(), + baseUrl: "url".into() + }, + matrix + ); + } +} + +#[cfg(not(feature = "async"))] +#[test] +fn variables() { + let wm = wm(); + let path = format!("f/tests/delete_me_{}", Uuid::new_v4()); + + { + // Create new + wm.set_variable( + ":0".into(), + &path, + // TODO: Test with true + false, + ) + .unwrap(); + + // Read + let out_val = wm.get_variable_raw(&path).unwrap(); + assert_eq!(":0", &out_val); + } + { + // Update + let in_val = json!({ + "a": true, + "b": "c" + }); + + wm.set_variable( + // Serialize as JSON + serde_yaml::to_string(&in_val).unwrap(), + &path, + false, + ) + .unwrap(); + + // Read Updated + let out_val = wm.get_variable(&path).unwrap(); + + assert_eq!(in_val, out_val); + } +} + +#[cfg(not(feature = "async"))] +#[test] +fn create_and_run() { + let wm = wm(); + + let path = format!("f/tests/delete_me_{}", Uuid::new_v4()); + let resp = wm + .call_api(apis::script_api::create_script( + &wm.client_config, + &wm.workspace, + windmill_api::models::NewScript { + path: path.clone(), + parent_hash: None, + summary: "auto-generated script from rust sdk | testing".into(), + description: "auto-generated script from rust sdk | testing".into(), + content: r#"fn main() -> Result { Ok("Hello World!".to_owned()) }"# + .into(), + schema: None, + is_template: None, + lock: None, + language: windmill_api::models::ScriptLang::Rust, + kind: Some(windmill_api::models::new_script::Kind::Script), + tag: Some("rust".into()), + draft_only: None, + envs: None, + concurrent_limit: None, + concurrency_time_window_s: None, + cache_ttl: None, + dedicated_worker: None, + ws_error_handler_muted: None, + priority: None, + restart_unless_cancelled: None, + timeout: None, + delete_after_use: None, + deployment_message: None, + concurrency_key: None, + visible_to_runner_only: None, + no_main_func: None, + codebase: None, + has_preprocessor: None, + on_behalf_of_email: None, + }, + )) + .unwrap(); + + assert_eq!( + json!("Hello World!"), + wm.run_script_sync( + // + &resp, + true, + json!(null), + None, + None, + true, + false, + ) + .unwrap() + ); +} +#[cfg(not(feature = "async"))] +#[test] +fn test_within() { + let wm = wm(); + + let path = format!("f/tests/delete_me_{}", Uuid::new_v4()); + let resp = wm + .call_api(apis::script_api::create_script( + &wm.client_config, + &wm.workspace, + windmill_api::models::NewScript { + path: path.clone(), + parent_hash: None, + summary: "auto-generated script from rust sdk | testing".into(), + description: "auto-generated script from rust sdk | testing".into(), + content: r#"//! Add dependencies in the following partial Cargo.toml manifest +//! +//! ```cargo +//! [dependencies] +//! anyhow = "1.0.86" +//! rand = "0.7.2" +//! wmill = { path = "" } +//! ``` +//! +//! Note that serde is used by default with the `derive` feature. +//! You can still reimport it if you need additional features. + +use anyhow::anyhow; +use rand::seq::SliceRandom; +use wmill::Windmill; +use serde::Serialize; + +fn main() -> anyhow::Result { + let wm = Windmill::default()?; + + // Resources + let inp = serde_json::json!({ + "token": "token", + "baseUrl": "url" + }); + + wm.set_resource(Some(inp.clone()), "f/tests/delete_me_test_matrix", "matrix")?; + let out = wm.get_resource_any("f/tests/delete_me_test_matrix")?; + assert_eq!(inp, out); + + // States + let inp = serde_json::json!({ "foo": 2 }); + wm.set_state(Some(inp.clone()))?; + let out = wm.get_state_any()?; + assert_eq!(inp, out); + + // Variables + let inp = "Foo".to_owned(); + wm.set_variable(inp.clone(), "f/tests/my_test_var", false)?; + let out = wm.get_variable_raw("f/tests/my_test_var")?; + assert_eq!(inp, out); + + Ok(0) +} + "# + .replace( + "", + std::env::current_dir() + .expect("Failed to get current directory") + .to_str() + .expect("Failed to parse current directory"), + ) + .into(), + schema: None, + is_template: None, + lock: None, + language: windmill_api::models::ScriptLang::Rust, + kind: Some(windmill_api::models::new_script::Kind::Script), + tag: Some("rust".into()), + draft_only: None, + envs: None, + concurrent_limit: None, + concurrency_time_window_s: None, + cache_ttl: None, + dedicated_worker: None, + ws_error_handler_muted: None, + priority: None, + restart_unless_cancelled: None, + timeout: None, + delete_after_use: None, + deployment_message: None, + concurrency_key: None, + visible_to_runner_only: None, + no_main_func: None, + codebase: None, + has_preprocessor: None, + on_behalf_of_email: None, + }, + )) + .unwrap(); + + assert_eq!( + json!(0), + wm.run_script_sync( + // + &resp, + true, + json!(null), + None, + None, + true, + false, + ) + .unwrap() + ); +} + +// ASYNC TESTS +#[cfg(feature = "async")] +#[tokio::test] +async fn simple() { + let wm = wm(); + let path = format!("f/tests/delete_me_{}", Uuid::new_v4()); + + // Create new + wm.set_variable( + ":0".into(), + &path, + // TODO: Test with true + false, + ) + .await + .unwrap(); + + let resp = wm + .call_api(apis::script_api::create_script( + &wm.client_config, + &wm.workspace, + windmill_api::models::NewScript { + path: path.clone(), + parent_hash: None, + summary: "auto-generated script from rust sdk | testing".into(), + description: "auto-generated script from rust sdk | testing".into(), + content: r#"fn main() -> Result { Ok("Hello World!".to_owned()) }"# + .into(), + schema: None, + is_template: None, + lock: None, + language: windmill_api::models::ScriptLang::Rust, + kind: Some(windmill_api::models::new_script::Kind::Script), + tag: Some("rust".into()), + draft_only: None, + envs: None, + concurrent_limit: None, + concurrency_time_window_s: None, + cache_ttl: None, + dedicated_worker: None, + ws_error_handler_muted: None, + priority: None, + restart_unless_cancelled: None, + timeout: None, + delete_after_use: None, + deployment_message: None, + concurrency_key: None, + visible_to_runner_only: None, + no_main_func: None, + codebase: None, + has_preprocessor: None, + on_behalf_of_email: None, + }, + )) + .await + .unwrap(); + + assert_eq!( + json!("Hello World!"), + wm.run_script_sync( + // + &resp, + true, + json!(null), + None, + None, + true, + false, + ) + .await + .unwrap() + ); +} From b4a6a7e72429617d420af85a9de35bb13adfc6fb Mon Sep 17 00:00:00 2001 From: "claude[bot]" <209825114+claude[bot]@users.noreply.github.com> Date: Tue, 10 Jun 2025 22:12:41 +0200 Subject: [PATCH 564/739] feat: fill runnable inputs with AI chat (#5887) * feat: integrate TriggerableByAI with SchemaForm components - Add currentValue and schema props to TriggerableByAI component - Wrap all ArgInput fields with TriggerableByAI for AI chat integration - Each input field now registers with AI chat manager including: - Current field value - Schema details (type, description, format, etc.) - Proper triggering mechanism for AI-driven value updates This enables AI chat to interact with any input type generated by SchemaForm, allowing intelligent form field modifications based on context and user intent. Co-authored-by: rubenfiszel * add schema to description * draft * draft * just use json inputs component * good starting point * add triggerable to scriptrow + shortcut * fixes * save prompt for ai in schema * fix * change visibility * simplify * cleaning * fixes * add tool to fetch resources * fixes * add try catch * fix prompt * cleaning * use ask ai button * fix * no animation on form + fix empty summary * add inputselectedbadge * better action description + fix rows border --------- Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com> Co-authored-by: rubenfiszel Co-authored-by: centdix --- .../lib/components/FlowPreviewContent.svelte | 2 +- frontend/src/lib/components/JsonEditor.svelte | 1 + frontend/src/lib/components/RunForm.svelte | 55 +++++++++++- .../src/lib/components/ScriptBuilder.svelte | 9 ++ .../src/lib/components/TriggerableByAI.svelte | 17 +++- .../components/common/table/FlowRow.svelte | 2 + .../lib/components/common/table/Row.svelte | 11 +++ .../components/common/table/ScriptRow.svelte | 2 + .../components/copilot/AIFormAssistant.svelte | 42 +++++++++ .../components/copilot/AIFormSettings.svelte | 37 ++++++++ .../copilot/chat/AIChatManager.svelte.ts | 5 +- .../components/copilot/chat/navigator/core.ts | 86 ++++++++++++++++--- .../flows/content/FlowSettings.svelte | 5 ++ .../schema/InputSelectedBadge.svelte | 32 +++++-- .../src/routes/(root)/(logged)/+layout.svelte | 3 + .../(logged)/flows/get/[...path]/+page.svelte | 13 ++- .../scripts/get/[...hash]/+page.svelte | 13 ++- 17 files changed, 306 insertions(+), 29 deletions(-) create mode 100644 frontend/src/lib/components/copilot/AIFormAssistant.svelte create mode 100644 frontend/src/lib/components/copilot/AIFormSettings.svelte diff --git a/frontend/src/lib/components/FlowPreviewContent.svelte b/frontend/src/lib/components/FlowPreviewContent.svelte index 23efc93695..75d960ba18 100644 --- a/frontend/src/lib/components/FlowPreviewContent.svelte +++ b/frontend/src/lib/components/FlowPreviewContent.svelte @@ -419,7 +419,7 @@ >
schemaFormWithArgPicker?.resetSelected()} + onReject={() => schemaFormWithArgPicker?.resetSelected()} {inputSelected} />
diff --git a/frontend/src/lib/components/JsonEditor.svelte b/frontend/src/lib/components/JsonEditor.svelte index 24b41f9e55..800cfb0224 100644 --- a/frontend/src/lib/components/JsonEditor.svelte +++ b/frontend/src/lib/components/JsonEditor.svelte @@ -4,6 +4,7 @@ import SimpleEditor from '$lib/components/SimpleEditor.svelte' import { createEventDispatcher } from 'svelte' import { createDispatcherIfMounted } from '$lib/createDispatcherIfMounted' + export let code: string | undefined export let value: any = undefined export let error = '' diff --git a/frontend/src/lib/components/RunForm.svelte b/frontend/src/lib/components/RunForm.svelte index 7b36d50f51..a7ced0f78e 100644 --- a/frontend/src/lib/components/RunForm.svelte +++ b/frontend/src/lib/components/RunForm.svelte @@ -13,11 +13,13 @@ import TimeAgo from './TimeAgo.svelte' import Popover from './meltComponents/Popover.svelte' - import { Calendar, CornerDownLeft } from 'lucide-svelte' + import { Calendar, Check, CornerDownLeft } from 'lucide-svelte' import RunFormAdvancedPopup from './RunFormAdvancedPopup.svelte' import { page } from '$app/stores' import { replaceState } from '$app/navigation' import JsonInputs from '$lib/components/JsonInputs.svelte' + import TriggerableByAI from './TriggerableByAI.svelte' + import InputSelectedBadge from './schema/InputSelectedBadge.svelte' export let runnable: | { @@ -59,6 +61,8 @@ let reloadArgs = 0 let jsonEditor: JsonInputs | undefined = undefined let schemaHeight = 0 + let showInputSelectedBadge = false + let savedPreviousArgs: Record | undefined = undefined export async function setArgs(nargs: Record) { args = nargs @@ -97,6 +101,49 @@ } + 0 ? runnable?.summary : runnable?.path}. + ## Script description: ${runnable?.description ?? ''}. + ## Schema used: ${JSON.stringify(runnable?.schema)}. + ## Current args: ${JSON.stringify(args)}}`} + onTrigger={(value) => { + savedPreviousArgs = args + setArgs(JSON.parse(value ?? '{}')) + showInputSelectedBadge = true + }} + showAnimation={false} +/> + +{#snippet acceptButton()} + +{/snippet} + +{#if showInputSelectedBadge} + { + setArgs(savedPreviousArgs ?? {}) + savedPreviousArgs = undefined + showInputSelectedBadge = false + }} + /> +{/if}
{#if detailed} {#if runnable} @@ -137,6 +184,10 @@
{:else} +

Loading...

{/if} {/if} @@ -174,7 +225,7 @@ ? { type: 'hash', hash: runnable.hash - } + } : undefined} prettifyHeader {noVariablePicker} diff --git a/frontend/src/lib/components/ScriptBuilder.svelte b/frontend/src/lib/components/ScriptBuilder.svelte index c1065d356f..025902906b 100644 --- a/frontend/src/lib/components/ScriptBuilder.svelte +++ b/frontend/src/lib/components/ScriptBuilder.svelte @@ -12,6 +12,7 @@ } from '$lib/gen' import { inferArgs } from '$lib/infer' import { initialCode } from '$lib/script_helpers' + import AIFormSettings from './copilot/AIFormSettings.svelte' import { defaultScripts, enterpriseLicense, @@ -143,6 +144,7 @@ let metadataOpen = !neverShowMeta && (showMeta || + searchParams.get('metadata_open') == 'true' || (initialPath == '' && searchParams.get('state') == undefined && searchParams.get('collab') == undefined)) @@ -1047,6 +1049,13 @@ }} /> + {#if script.schema} +
+ +
+ {/if}
diff --git a/frontend/src/lib/components/TriggerableByAI.svelte b/frontend/src/lib/components/TriggerableByAI.svelte index f4569d844e..0c6e2a049b 100644 --- a/frontend/src/lib/components/TriggerableByAI.svelte +++ b/frontend/src/lib/components/TriggerableByAI.svelte @@ -1,11 +1,18 @@ + { + goto(href) + }} +/>
+ import { Button } from '$lib/components/common' + import { Pencil } from 'lucide-svelte' + import { aiChatManager } from './chat/AIChatManager.svelte' + import AskAiButton from './AskAiButton.svelte' + + interface Props { + onEditInstructions: () => void + instructions: string + runnableType: 'script' | 'flow' + } + + const { onEditInstructions, instructions, runnableType }: Props = $props() + + async function fillFormWithAI() { + aiChatManager.openChat() + aiChatManager.askAi(`Analyze the ${runnableType} form on this page and fill the inputs for me`) + } + + +
+
+

Fill the inputs with AI

+ +
+
+

+ {instructions + ? 'Instructions: ' + instructions + : 'No AI instructions provided. Click edit to add guidance for AI form filling.'} +

+
+
diff --git a/frontend/src/lib/components/copilot/AIFormSettings.svelte b/frontend/src/lib/components/copilot/AIFormSettings.svelte new file mode 100644 index 0000000000..3454c192c0 --- /dev/null +++ b/frontend/src/lib/components/copilot/AIFormSettings.svelte @@ -0,0 +1,37 @@ + + +
+ { + if (prompt !== undefined) { + prompt = undefined + } else { + prompt = '' + } + }} + options={{ + right: 'Enable filling script inputs with AI' + }} + /> + {#if prompt !== undefined} + + {/if} +
diff --git a/frontend/src/lib/components/copilot/chat/AIChatManager.svelte.ts b/frontend/src/lib/components/copilot/chat/AIChatManager.svelte.ts index edb407093f..9f79b0cbff 100644 --- a/frontend/src/lib/components/copilot/chat/AIChatManager.svelte.ts +++ b/frontend/src/lib/components/copilot/chat/AIChatManager.svelte.ts @@ -32,7 +32,10 @@ import { askTools, prepareAskSystemMessage } from './ask/core' type TriggerablesMap = Record< string, - { description: string; onTrigger: ((value?: string) => void) | undefined } + { + description: string + onTrigger: ((value?: string) => void) | undefined + } > export enum AIMode { diff --git a/frontend/src/lib/components/copilot/chat/navigator/core.ts b/frontend/src/lib/components/copilot/chat/navigator/core.ts index e438d13501..be07b37c41 100644 --- a/frontend/src/lib/components/copilot/chat/navigator/core.ts +++ b/frontend/src/lib/components/copilot/chat/navigator/core.ts @@ -6,6 +6,9 @@ import type { } from 'openai/resources/index.mjs' import type { Tool } from '../shared' import { aiChatManager } from '../AIChatManager.svelte' +import { ResourceService } from '$lib/gen' +import { workspaceStore } from '$lib/stores' +import { get } from 'svelte/store' export const CHAT_SYSTEM_PROMPT = ` You are Windmill's intelligent assistant, designed to help users navigate the application and answer questions about its functionality. It is your only purpose to help the user in the context of the windmill application. @@ -23,6 +26,9 @@ INSTRUCTIONS: - Use get_triggerable_components to understand available options, and then trigger the components using trigger_component. Then wait a moment before rescanning the current page, and then continue with the next step. Do this 5 times max. - Make sure you navigated as far as possible before responding to the user. Always use get_triggerable_components one last time to make sure you didn't miss anything. - If you are not able to fulfill the user's request after 5 attempts, redirect the user to the documentation. +- If you are asked to fill a form or act on an input, input the existing json object and change the fields the user asked you to change. Take into account the prompt_for_ai field of the schema to know what and how to do changes. Then tell the user that you have updated the form, and ask him to review the changes before running the script or flow. +- For form inputs where format starts with "resource-" and is not "resource-obj", fetch the available resources using get_available_resources, and then use the resource_path prefixed with "$res:" to fill the input. +- If you are not sure about an input, set the ones you are sure about, and then ask the user for the value of the input you are not sure about. GENERAL PRINCIPLES: - Be concise but thorough @@ -33,6 +39,7 @@ GENERAL PRINCIPLES: - When you do not find what you are looking for on the current page, go to the home page by looking for the "Home" component, then scan the components again. IMPORTANT CONSIDERATIONS: +- The user might have changed the page in the middle of the conversation, so make sure you rescan the page on each user request instead of just responding that you cannot find what the user is asking for. - If you navigate to a script creation page, consider this: - The page opens with the settings drawer open. After doing the changes mentioned by the user, close the settings drawer. - Then if the user has described what he wanted the script to do, switch to script mode with the change_mode tool, and use the new tools you'll have access to to edit the script. @@ -99,12 +106,13 @@ const EXECUTE_COMMAND_TOOL: ChatCompletionTool = { type: 'string', description: 'Value to pass to the AI-triggerable component trigger function' }, - description: { + actionTaken: { type: 'string', - description: 'Description of the component' + description: + 'Short description of the action taken. Can be clicked, filled, etc. Includes which component was triggered.' } }, - required: ['id', 'description'] + required: ['id', 'actionTaken'] } } } @@ -122,6 +130,24 @@ const GET_CURRENT_PAGE_NAME_TOOL: ChatCompletionTool = { } } +const GET_AVAILABLE_RESOURCES_TOOL: ChatCompletionTool = { + type: 'function', + function: { + name: 'get_available_resources', + description: 'Get the available resources to the user', + parameters: { + type: 'object', + properties: { + resource_type: { + type: 'string', + description: 'The type of resource to get, separated by ","' + } + }, + required: ['resource_type'] + } + } +} + function getTriggerableComponents(): string { try { // Get components registered in the triggerablesByAI store @@ -135,7 +161,12 @@ function getTriggerableComponents(): string { // List each registered component with its ID and description Object.entries(registeredComponents).forEach(([id, component], index) => { - result += `[${index}] ID: "${id}" - Description: ${component.description} - Triggerable: ${component.onTrigger ? 'Yes' : 'No'}\n` + result += ` + [${index}] + ID: "${id}" + Description: ${component.description} + Triggerable: ${component.onTrigger ? 'Yes' : 'No'} + \n` }) return result @@ -234,14 +265,22 @@ async function getDocumentation(args: { request: string }): Promise { return data.choices[0].message.content } +async function getAvailableResources(args: { resource_type: string }): Promise { + const resources = await ResourceService.listResource({ + workspace: get(workspaceStore) as string, + resourceType: args.resource_type + }) + return JSON.stringify(resources) +} + const triggerComponentTool: Tool<{}> = { def: EXECUTE_COMMAND_TOOL, fn: async ({ args, toolId, toolCallbacks }) => { - toolCallbacks.onToolCall(toolId, 'Clicking on component...') + toolCallbacks.onToolCall(toolId, 'Triggering component...') const result = triggerComponent(args) toolCallbacks.onFinishToolCall( toolId, - 'Clicked ' + args.description.charAt(0).toLowerCase() + args.description.slice(1) + args.actionTaken.charAt(0).toUpperCase() + args.actionTaken.slice(1) ) return result } @@ -250,9 +289,9 @@ const triggerComponentTool: Tool<{}> = { const getTriggerableComponentsTool: Tool<{}> = { def: GET_TRIGGERABLE_COMPONENTS_TOOL, fn: async ({ toolId, toolCallbacks }) => { - toolCallbacks.onToolCall(toolId, 'Looking for screen components...') + toolCallbacks.onToolCall(toolId, 'Scanning the page...') const components = getTriggerableComponents() - toolCallbacks.onFinishToolCall(toolId, 'Retrieved screen components') + toolCallbacks.onFinishToolCall(toolId, 'Scanned the page') return components } } @@ -270,9 +309,31 @@ export const getDocumentationTool: Tool<{}> = { def: GET_DOCUMENTATION_TOOL, fn: async ({ args, toolId, toolCallbacks }) => { toolCallbacks.onToolCall(toolId, 'Getting documentation...') - const docResult = await getDocumentation(args) - toolCallbacks.onFinishToolCall(toolId, 'Retrieved documentation') - return docResult + try { + const docResult = await getDocumentation(args) + toolCallbacks.onFinishToolCall(toolId, 'Retrieved documentation') + return docResult + } catch (error) { + toolCallbacks.onFinishToolCall(toolId, 'Error getting documentation') + console.error('Error getting documentation:', error) + return 'Failed to get documentation, pursuing with the user request...' + } + } +} + +const getAvailableResourcesTool: Tool<{}> = { + def: GET_AVAILABLE_RESOURCES_TOOL, + fn: async ({ args, toolId, toolCallbacks }) => { + toolCallbacks.onToolCall(toolId, 'Getting available resources...') + try { + const resources = await getAvailableResources(args) + toolCallbacks.onFinishToolCall(toolId, 'Retrieved available resources') + return resources + } catch (error) { + toolCallbacks.onFinishToolCall(toolId, 'Error getting available resources') + console.error('Error getting available resources:', error) + return 'Failed to get available resources, pursuing with the user request...' + } } } @@ -280,7 +341,8 @@ export const navigatorTools: Tool<{}>[] = [ getTriggerableComponentsTool, triggerComponentTool, getDocumentationTool, - getCurrentPageNameTool + getCurrentPageNameTool, + getAvailableResourcesTool ] export function prepareNavigatorSystemMessage(): ChatCompletionSystemMessageParam { diff --git a/frontend/src/lib/components/flows/content/FlowSettings.svelte b/frontend/src/lib/components/flows/content/FlowSettings.svelte index 85b604bf5d..31af301b12 100644 --- a/frontend/src/lib/components/flows/content/FlowSettings.svelte +++ b/frontend/src/lib/components/flows/content/FlowSettings.svelte @@ -18,6 +18,7 @@ import MetadataGen from '$lib/components/copilot/MetadataGen.svelte' import Badge from '$lib/components/Badge.svelte' import { AlertTriangle } from 'lucide-svelte' + import AIFormSettings from '$lib/components/copilot/AIFormSettings.svelte' export let noEditor: boolean @@ -112,6 +113,10 @@ }} /> + + {#if $flowStore.schema} + + {/if}
diff --git a/frontend/src/lib/components/schema/InputSelectedBadge.svelte b/frontend/src/lib/components/schema/InputSelectedBadge.svelte index 9538fffc95..7abadf14fd 100644 --- a/frontend/src/lib/components/schema/InputSelectedBadge.svelte +++ b/frontend/src/lib/components/schema/InputSelectedBadge.svelte @@ -3,28 +3,46 @@ import { twMerge } from 'tailwind-merge' import Button from '$lib/components/common/button/Button.svelte' import { X } from 'lucide-svelte' + import type { Snippet } from 'svelte' - export let inputSelected: 'history' | 'captures' | 'saved' | undefined = undefined + interface Props { + inputSelected: 'history' | 'captures' | 'saved' | 'ai' | undefined + labelColor?: string + className?: string + acceptButton?: Snippet + onReject: () => void + } + + let { inputSelected, className = '', acceptButton, onReject, labelColor = '' }: Props = $props()
-

+

Using {inputSelected === 'history' ? 'historic' : inputSelected === 'captures' - ? 'captures' - : 'saved'} input arguments + ? 'captures' + : inputSelected === 'ai' + ? 'AI generated' + : 'saved'} input arguments

+ {#if acceptButton} + {@render acceptButton()} + {/if}
diff --git a/frontend/src/routes/(root)/(logged)/+layout.svelte b/frontend/src/routes/(root)/(logged)/+layout.svelte index bc26efb9e4..0c8b40c8c8 100644 --- a/frontend/src/routes/(root)/(logged)/+layout.svelte +++ b/frontend/src/routes/(root)/(logged)/+layout.svelte @@ -463,6 +463,7 @@ label="Ask AI" class="!text-xs" iconClasses="!text-violet-400 dark:!text-violet-400" + shortcut={`${getModifierKey()}L`} />
@@ -534,6 +535,7 @@ label="Ask AI" class="!text-xs" iconClasses="!text-violet-400 dark:!text-violet-400" + shortcut={`${getModifierKey()}L`} />
@@ -645,6 +647,7 @@ label="Ask AI" class="!text-xs" iconClasses="!text-violet-400 dark:!text-violet-400" + shortcut={`${getModifierKey()}L`} />
diff --git a/frontend/src/routes/(root)/(logged)/flows/get/[...path]/+page.svelte b/frontend/src/routes/(root)/(logged)/flows/get/[...path]/+page.svelte index 55bf1d5d1c..443e73fc87 100644 --- a/frontend/src/routes/(root)/(logged)/flows/get/[...path]/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/flows/get/[...path]/+page.svelte @@ -23,6 +23,7 @@ import { sendUserToast } from '$lib/toast' import DeployWorkspaceDrawer from '$lib/components/DeployWorkspaceDrawer.svelte' import SavedInputsV2 from '$lib/components/SavedInputsV2.svelte' + import AIFormAssistant from '$lib/components/copilot/AIFormAssistant.svelte' import { FolderOpen, Archive, @@ -512,7 +513,7 @@
{ + onReject={() => { savedInputsV2?.resetSelected() }} {inputSelected} @@ -532,6 +533,16 @@ />
+ {#if flow.schema?.prompt_for_ai !== undefined} + { + goto(`/flows/edit/${flow?.path}`) + }} + runnableType="flow" + /> + {/if} +
{ + onReject={() => { savedInputsV2?.resetSelected() }} {inputSelected} @@ -695,6 +696,16 @@ />
+ {#if script?.schema?.prompt_for_ai !== undefined} + { + goto(`/scripts/edit/${script?.path}?metadata_open=true`) + }} + runnableType="script" + /> + {/if} + Date: Thu, 12 Jun 2025 10:49:22 +0200 Subject: [PATCH 565/739] feat(backend): use streamable http in favor of sse for MCP (#5910) * draft for http streamable usage * good stuff * add workspace_id to extensions * fix shutdown * cleaning * fix * adapt frontend * Revert "adapt frontend" This reverts commit 331dffaf98004723ce68270002b7c9ed6690bfec. * dont use new path * cleaning * cleaner way of closing sessions --- backend/Cargo.lock | 30 +++++-- backend/windmill-api/Cargo.toml | 2 +- backend/windmill-api/src/lib.rs | 36 +++----- backend/windmill-api/src/mcp.rs | 155 +++++++++++++++++++++++--------- 4 files changed, 152 insertions(+), 71 deletions(-) diff --git a/backend/Cargo.lock b/backend/Cargo.lock index edaea2c45a..37d481c505 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -10402,13 +10402,15 @@ dependencies = [ [[package]] name = "rmcp" version = "0.1.5" -source = "git+https://github.com/windmill-labs/rust-sdk#9142b40202e49ca0b6530fa49a3abc8bd1b2fcf0" +source = "git+https://github.com/modelcontextprotocol/rust-sdk#db03f63e76b5b32f65d34a1bd08ae56dab595f60" dependencies = [ - "async-stream", - "axum", - "base64 0.21.7", + "base64 0.22.1", + "bytes", "chrono", "futures", + "http 1.3.1", + "http-body 1.0.1", + "http-body-util", "paste", "pin-project-lite", "rand 0.9.0", @@ -10416,20 +10418,24 @@ dependencies = [ "schemars", "serde", "serde_json", + "sse-stream", "thiserror 2.0.12", "tokio", "tokio-stream", "tokio-util", + "tower-service", "tracing", + "uuid", ] [[package]] name = "rmcp-macros" version = "0.1.5" -source = "git+https://github.com/windmill-labs/rust-sdk#9142b40202e49ca0b6530fa49a3abc8bd1b2fcf0" +source = "git+https://github.com/modelcontextprotocol/rust-sdk#db03f63e76b5b32f65d34a1bd08ae56dab595f60" dependencies = [ "proc-macro2", "quote", + "serde_json", "syn 2.0.101", ] @@ -10967,6 +10973,7 @@ version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" dependencies = [ + "chrono", "dyn-clone", "schemars_derive", "serde", @@ -11880,6 +11887,19 @@ dependencies = [ "uuid", ] +[[package]] +name = "sse-stream" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f649a9f9e91db2ed32f3724516eac2bc09fab77fc33be8f670f5619b9dc6c3f" +dependencies = [ + "bytes", + "futures-util", + "http-body 1.0.1", + "http-body-util", + "pin-project-lite", +] + [[package]] name = "stable_deref_trait" version = "1.2.0" diff --git a/backend/windmill-api/Cargo.toml b/backend/windmill-api/Cargo.toml index cfb175cb0f..8017436a4a 100644 --- a/backend/windmill-api/Cargo.toml +++ b/backend/windmill-api/Cargo.toml @@ -40,7 +40,7 @@ mcp = ["dep:rmcp"] python = [] [dependencies] -rmcp = { git = "https://github.com/windmill-labs/rust-sdk", features = ["transport-sse-server"], optional = true } +rmcp = { git = "https://github.com/modelcontextprotocol/rust-sdk", features=["transport-streamable-http-server", "transport-streamable-http-server-session", "transport-worker"], optional = true } windmill-queue.workspace = true windmill-common = { workspace = true, default-features = false } windmill-audit.workspace = true diff --git a/backend/windmill-api/src/lib.rs b/backend/windmill-api/src/lib.rs index 8a42902508..3eb1b9d183 100644 --- a/backend/windmill-api/src/lib.rs +++ b/backend/windmill-api/src/lib.rs @@ -19,14 +19,16 @@ use crate::oauth2_oss::SlackVerifier; use crate::smtp_server_oss::SmtpServer; #[cfg(feature = "mcp")] -use crate::mcp::{setup_mcp_server, Runner as McpRunner}; +use crate::mcp::{extract_and_store_workspace_id, setup_mcp_server, shutdown_mcp_server}; +#[cfg(feature = "mcp")] +use rmcp::transport::streamable_http_server::session::local::LocalSessionManager; + use crate::tracing_init::MyOnFailure; use crate::{ tracing_init::{MyMakeSpan, MyOnResponse}, users::OptAuthed, webhook_util::WebhookShared, }; - #[cfg(feature = "agent_worker_server")] use agent_workers_oss::AgentCache; @@ -520,21 +522,18 @@ pub async fn run_server( // Setup MCP server #[allow(unused_variables)] - let (mcp_router, mcp_main_ct, mcp_service_ct) = { + let (mcp_router, mcp_session_manager) = { #[cfg(feature = "mcp")] if server_mode || mcp_mode { - let (mcp_sse_server, mcp_router) = setup_mcp_server(addr, "/api/mcp/w/:workspace_id")?; - #[cfg(feature = "mcp")] - let mcp_main_ct = mcp_sse_server.config.ct.clone(); // Token to signal shutdown *to* MCP - #[cfg(feature = "mcp")] - let mcp_service_ct = mcp_sse_server.with_service(McpRunner::new); // Token to wait for MCP *service* shutdown - (mcp_router, Some(mcp_main_ct), Some(mcp_service_ct)) + let (mcp_router, mcp_session_manager) = setup_mcp_server().await?; + let mcp_middleware = axum::middleware::from_fn(extract_and_store_workspace_id); + (mcp_router.layer(mcp_middleware), Some(mcp_session_manager)) } else { - (Router::new(), None, None) + (Router::new(), Option::>::None) } #[cfg(not(feature = "mcp"))] - (Router::new(), None::<()>, None::<()>) + (Router::new(), Option::<()>::None) }; #[cfg(feature = "agent_worker_server")] @@ -660,7 +659,7 @@ pub async fn run_server( .layer(from_extractor::()) .layer(cors.clone()), ) - .nest("/mcp/w/:workspace_id", mcp_router) + .nest("/mcp/w/:workspace_id/sse", mcp_router) .layer(from_extractor::()) .nest("/agent_workers", { #[cfg(feature = "agent_worker_server")] @@ -819,16 +818,9 @@ pub async fn run_server( tracing::info!("Graceful shutdown of server"); #[cfg(feature = "mcp")] - { - if let Some(mcp_main_ct) = mcp_main_ct { - tracing::info!("Received shutdown signal, cancelling MCP server..."); - mcp_main_ct.cancel(); - } - if let Some(mcp_service_ct) = mcp_service_ct { - tracing::info!("Waiting for MCP service cancellation..."); - mcp_service_ct.cancelled().await; - tracing::info!("MCP service cancelled."); - } + if let Some(mcp_session_manager) = mcp_session_manager { + shutdown_mcp_server(mcp_session_manager).await; + tracing::info!("MCP server shutdown"); } }); diff --git a/backend/windmill-api/src/mcp.rs b/backend/windmill-api/src/mcp.rs index 431e121ba8..dcd6fa4ca8 100644 --- a/backend/windmill-api/src/mcp.rs +++ b/backend/windmill-api/src/mcp.rs @@ -1,11 +1,10 @@ use std::borrow::Cow; use std::collections::HashMap; -use std::net::SocketAddr; use std::sync::Arc; use axum::body::to_bytes; use axum::Router; -use rmcp::transport::sse_server::{SseServer, SseServerConfig}; +use axum::{extract::Path, http::Request, middleware::Next, response::Response}; use rmcp::{ handler::server::ServerHandler, model::*, @@ -17,7 +16,6 @@ use serde_json::Value; use sql_builder::prelude::*; use sqlx::FromRow; use tokio::try_join; -use tokio_util::sync::CancellationToken; use windmill_common::db::UserDB; use windmill_common::worker::to_raw_value; use windmill_common::{DB, HUB_BASE_URL}; @@ -29,6 +27,9 @@ use crate::jobs::{ run_wait_result_flow_by_path_internal, run_wait_result_script_by_path_internal, RunJobQuery, }; use crate::HTTP_CLIENT; +use rmcp::transport::streamable_http_server::{ + session::local::LocalSessionManager, SessionManager, StreamableHttpService, +}; use windmill_common::utils::{query_elems_from_hub, StripPath}; /// Transforms the path for workspace scripts/flows. @@ -856,28 +857,44 @@ impl ServerHandler for Runner { }) }; - let authed = context - .req_extensions - .get::() - .ok_or_else(|| Error::internal_error("ApiAuthed not found", None))?; - let db = context - .req_extensions - .get::() - .ok_or_else(|| Error::internal_error("DB not found", None))?; - let user_db = context - .req_extensions - .get::() - .ok_or_else(|| Error::internal_error("UserDB not found", None))?; + let http_parts = context + .extensions + .get::() + .ok_or_else(|| { + tracing::error!("http::request::Parts not found"); + Error::internal_error("http::request::Parts not found", None) + })?; + + let authed = http_parts.extensions.get::().ok_or_else(|| { + tracing::error!("ApiAuthed Axum extension not found"); + Error::internal_error("ApiAuthed Axum extension not found", None) + })?; + let db = http_parts.extensions.get::().ok_or_else(|| { + tracing::error!("DB Axum extension not found"); + Error::internal_error("DB Axum extension not found", None) + })?; + let user_db = http_parts.extensions.get::().ok_or_else(|| { + tracing::error!("UserDB Axum extension not found"); + Error::internal_error("UserDB Axum extension not found", None) + })?; let args = parse_args(request.arguments)?; + let workspace_id = http_parts + .extensions + .get::() + .ok_or_else(|| { + tracing::error!("WorkspaceId not found"); + Error::internal_error("WorkspaceId not found", None) + }) + .map(|w_id| w_id.0.clone())?; + let (tool_type, path, is_hub) = Runner::reverse_transform(&request.name).unwrap_or_default(); let item_schema = if is_hub { Runner::get_hub_script_schema(&format!("hub/{}", path), db).await? } else { - Runner::get_item_schema(&path, user_db, authed, &context.workspace_id, &tool_type) - .await? + Runner::get_item_schema(&path, user_db, authed, &workspace_id, &tool_type).await? }; let schema_obj = if let Some(ref s) = item_schema { @@ -906,8 +923,6 @@ impl ServerHandler for Runner { } else { windmill_queue::PushArgsOwned::default() }; - - let w_id = context.workspace_id.clone(); let script_or_flow_path = if is_hub { StripPath(format!("hub/{}", path)) } else { @@ -922,7 +937,7 @@ impl ServerHandler for Runner { script_or_flow_path, authed.clone(), user_db.clone(), - w_id.clone(), + workspace_id.clone(), push_args, ) .await @@ -934,7 +949,7 @@ impl ServerHandler for Runner { authed.clone(), user_db.clone(), push_args, - w_id.clone(), + workspace_id.clone(), ) .await }; @@ -978,19 +993,38 @@ impl ServerHandler for Runner { _request: Option, mut _context: RequestContext, ) -> Result { - let workspace_id = _context.workspace_id.clone(); - let db = _context - .req_extensions - .get::() - .ok_or_else(|| Error::internal_error("DB not found", None))?; - let user_db = _context - .req_extensions - .get::() - .ok_or_else(|| Error::internal_error("UserDB not found", None))?; - let authed = _context - .req_extensions - .get::() - .ok_or_else(|| Error::internal_error("ApiAuthed not found", None))?; + let http_parts = _context + .extensions + .get::() + .ok_or_else(|| { + tracing::error!("http::request::Parts not found"); + Error::internal_error("http::request::Parts not found", None) + })?; + + let db = http_parts.extensions.get::().ok_or_else(|| { + tracing::error!("DB Axum extension not found"); + Error::internal_error("DB Axum extension not found", None) + })?; + + let user_db = http_parts.extensions.get::().ok_or_else(|| { + tracing::error!("UserDB Axum extension not found"); + Error::internal_error("UserDB Axum extension not found", None) + })?; + + let authed = http_parts.extensions.get::().ok_or_else(|| { + tracing::error!("ApiAuthed Axum extension not found"); + Error::internal_error("ApiAuthed Axum extension not found", None) + })?; + + let workspace_id = http_parts + .extensions + .get::() + .ok_or_else(|| { + tracing::error!("WorkspaceId not found"); + Error::internal_error("WorkspaceId not found", None) + }) + .map(|w_id| w_id.0.clone())?; + let owned_scope = authed.scopes.as_ref().and_then(|scopes| { scopes .iter() @@ -1127,15 +1161,50 @@ impl ServerHandler for Runner { } } -pub fn setup_mcp_server(addr: SocketAddr, path: &str) -> anyhow::Result<(SseServer, Router)> { - let config = SseServerConfig { - bind: addr, - sse_path: "/sse".to_string(), - post_path: "/message".to_string(), - full_message_path: path.to_string(), - ct: CancellationToken::new(), - sse_keep_alive: None, +#[derive(Clone, Debug)] +pub struct WorkspaceId(pub String); + +pub async fn extract_and_store_workspace_id( + Path(params): Path, + mut request: Request, + next: Next, +) -> Response { + let workspace_id = params; + request.extensions_mut().insert(WorkspaceId(workspace_id)); + next.run(request).await +} + +pub async fn setup_mcp_server() -> anyhow::Result<(Router, Arc)> { + let session_manager = Arc::new(LocalSessionManager::default()); + let service_config = Default::default(); + let service = StreamableHttpService::new(Runner::new, session_manager.clone(), service_config); + + let router = axum::Router::new().nest_service("/", service); + Ok((router, session_manager)) +} + +pub async fn shutdown_mcp_server(session_manager: Arc) { + let session_ids_to_close = { + let sessions_map = session_manager.sessions.read().await; + sessions_map.keys().cloned().collect::>() }; - Ok(SseServer::new(config)) + if !session_ids_to_close.is_empty() { + tracing::info!( + "Closing {} active MCP session(s)...", + session_ids_to_close.len() + ); + let close_futures = session_ids_to_close + .iter() + .map(|session_id| { + let manager_clone = session_manager.clone(); + async move { + if let Err(_) = manager_clone.close_session(session_id).await { + tracing::warn!("Error closing MCP session"); + } + } + }) + .collect::>(); + futures::future::join_all(close_futures).await; + } } From 23920aee84fdca4a557a34ff2d66a0bb7bdca605 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 12 Jun 2025 15:44:35 +0200 Subject: [PATCH 566/739] feat: better graph layout algorithm + migrate to svelte 5 almost everywhere + xyflow 1.0 --- frontend/package-lock.json | 46 +- frontend/package.json | 3 +- frontend/src/lib/components/AddUser.svelte | 68 +- .../src/lib/components/ApiConnectForm.svelte | 127 ++-- .../lib/components/AppConnectDrawer.svelte | 50 +- .../src/lib/components/AppConnectInner.svelte | 146 ++-- frontend/src/lib/components/ArgEnum.svelte | 93 +-- frontend/src/lib/components/ArgInfo.svelte | 4 +- frontend/src/lib/components/ArgInput.svelte | 485 ++++++++----- .../src/lib/components/Auth0Setting.svelte | 21 +- .../components/AutoscalingConfigEditor.svelte | 101 +-- .../lib/components/ContentSearchInner.svelte | 167 ++--- .../components/ContentSearchInnerItem.svelte | 16 +- .../ContextualVariableEditor.svelte | 4 +- .../components/DBManagerDrawerButton.svelte | 4 +- .../lib/components/DBSchemaExplorer.svelte | 7 +- frontend/src/lib/components/DBTable.svelte | 5 +- .../src/lib/components/DateTimeInput.svelte | 66 +- .../components/DeployWorkspaceDrawer.svelte | 4 +- frontend/src/lib/components/Dev.svelte | 139 ++-- frontend/src/lib/components/DiffDrawer.svelte | 9 +- .../src/lib/components/DisplayResult.svelte | 172 +++-- .../lib/components/EditableSchemaForm.svelte | 473 +++++++------ frontend/src/lib/components/Editor.svelte | 25 +- frontend/src/lib/components/EditorBar.svelte | 303 ++++---- .../components/ErrorOrRecoveryHandler.svelte | 4 +- .../src/lib/components/FirstStepInputs.svelte | 78 +- .../src/lib/components/FlowBuilder.svelte | 235 +++--- .../src/lib/components/FlowGraphViewer.svelte | 5 +- .../FlowLoopIterationPreview.svelte | 42 +- .../lib/components/FlowPreviewContent.svelte | 46 +- .../components/FlowStatusViewerInner.svelte | 24 +- frontend/src/lib/components/FlowViewer.svelte | 38 +- .../src/lib/components/FlowViewerInner.svelte | 32 +- .../src/lib/components/FolderEditor.svelte | 55 +- .../src/lib/components/GroupEditor.svelte | 45 +- .../src/lib/components/HistoricInputs.svelte | 44 +- .../src/lib/components/HistoricList.svelte | 48 +- .../lib/components/IconedResourceType.svelte | 45 +- .../src/lib/components/InfiniteList.svelte | 64 +- .../lib/components/InputTransformForm.svelte | 213 +++--- .../InputTransformSchemaForm.svelte | 106 +-- .../src/lib/components/InstanceSetting.svelte | 115 +-- .../lib/components/InstanceSettings.svelte | 4 +- frontend/src/lib/components/InviteUser.svelte | 56 +- frontend/src/lib/components/ItemPicker.svelte | 68 +- frontend/src/lib/components/JobArgs.svelte | 4 +- frontend/src/lib/components/LogViewer.svelte | 4 +- .../src/lib/components/ModulePreview.svelte | 52 +- .../lib/components/ModulePreviewForm.svelte | 50 +- .../ModulePreviewResultViewer.svelte | 75 +- frontend/src/lib/components/MoveDrawer.svelte | 4 +- .../src/lib/components/OktaSetting.svelte | 23 +- frontend/src/lib/components/Path.svelte | 187 ++--- .../components/PersistentScriptDrawer.svelte | 37 +- frontend/src/lib/components/Portal.svelte | 2 +- .../src/lib/components/ResourceEditor.svelte | 86 ++- .../components/ResourceEditorDrawer.svelte | 4 +- frontend/src/lib/components/RunForm.svelte | 134 ++-- .../src/lib/components/S3FilePicker.svelte | 304 ++++---- .../lib/components/SavedInputsPicker.svelte | 74 +- .../src/lib/components/SavedInputsV2.svelte | 77 +- frontend/src/lib/components/SchemaForm.svelte | 317 +++++---- .../components/SchemaFormWithArgPicker.svelte | 2 +- .../src/lib/components/SchemaViewer.svelte | 79 ++- .../src/lib/components/ScriptBuilder.svelte | 351 +++++---- .../src/lib/components/ScriptEditor.svelte | 281 +++++--- .../src/lib/components/ScriptPicker.svelte | 63 +- .../src/lib/components/ScriptSchema.svelte | 8 +- .../components/ScriptVersionHistory.svelte | 7 +- .../src/lib/components/SearchItems.svelte | 23 +- frontend/src/lib/components/Select.svelte | 14 +- .../lib/components/ServiceLogsInner.svelte | 4 +- frontend/src/lib/components/ShareModal.svelte | 124 ++-- .../src/lib/components/SimpleAgTable.svelte | 3 +- .../src/lib/components/SimpleEditor.svelte | 55 +- .../lib/components/StringTypeNarrowing.svelte | 171 +++-- .../src/lib/components/SupabaseConnect.svelte | 14 +- .../lib/components/SuperadminSettings.svelte | 307 ++++---- .../src/lib/components/TemplateEditor.svelte | 43 +- .../lib/components/ToggleHubWorkspace.svelte | 14 +- .../components/ToggleHubWorkspaceQuick.svelte | 16 +- .../src/lib/components/VariableEditor.svelte | 60 +- .../src/lib/components/WorkerGroup.svelte | 278 ++++---- .../apps/components/buttons/AppForm.svelte | 56 +- .../components/buttons/AppFormButton.svelte | 66 +- .../components/buttons/AppSchemaForm.svelte | 69 +- .../apps/components/display/AppMenu.svelte | 202 +++--- .../display/InsertRowDrawerButton.svelte | 4 +- .../display/dbtable/AppDbExplorer.svelte | 16 - .../display/dbtable/InsertRow.svelte | 91 ++- .../helpers/RunnableComponent.svelte | 207 +++--- .../components/helpers/RunnableWrapper.svelte | 4 +- .../components/apps/editor/AppEditor.svelte | 382 +++++----- .../apps/editor/AppEditorHeader.svelte | 453 ++++++------ .../apps/editor/AppExportButton.svelte | 4 +- .../apps/editor/AppJobsDrawer.svelte | 10 +- .../apps/editor/AppJsonEditor.svelte | 4 +- .../apps/editor/AppReportsDrawerInner.svelte | 92 +-- .../apps/editor/PreviewToggle.svelte | 49 +- .../componentsPanel/CssHelperPanel.svelte | 158 +++-- .../editor/componentsPanel/CssProperty.svelte | 110 +-- .../editor/componentsPanel/CssSettings.svelte | 4 +- .../componentsPanel/QuickStyleMenu.svelte | 41 +- .../componentsPanel/QuickStyleProperty.svelte | 92 +-- .../editor/contextPanel/LazyModePanel.svelte | 20 +- .../InlineScriptEditor.svelte | 5 +- .../InlineScriptEditorDrawer.svelte | 33 +- .../settingsPanel/AlignmentEditor.svelte | 24 +- .../settingsPanel/CSSMigrationModal.svelte | 303 ++++---- .../ComponentInputTypeEditor.svelte | 113 +-- .../ComponentPanelDataSource.svelte | 44 +- .../DecisionTreeGraphEditor.svelte | 2 +- .../DecisionTreeGraphNode.svelte | 160 +++-- .../editor/settingsPanel/HideButton.svelte | 44 +- .../settingsPanel/InputsSpecEditor.svelte | 172 +++-- .../editor/settingsPanel/StylePanel.svelte | 4 +- .../decisionTree/DecisionTreePreview.svelte | 100 +-- .../settingsPanel/inputEditor/tabs.svelte.ts | 7 + .../auditLogs/AuditLogDetails.svelte | 8 +- .../auditLogs/AuditLogMobileFilters.svelte | 15 +- .../auditLogs/AuditLogsFilters.svelte | 122 ++-- .../DraftTriggersConfirmationModal.svelte | 31 +- .../common/drawer/DrawerContent.svelte | 44 +- .../lib/components/common/menu/Menu.svelte | 48 +- .../components/common/popup/PopupV2.svelte | 31 +- .../components/common/table/RawAppRow.svelte | 2 +- .../src/lib/components/common/tabs/Tab.svelte | 65 +- .../components/common/tabs/TabContent.svelte | 2 +- .../lib/components/common/tabs/Tabs.svelte | 69 +- .../lib/components/common/tabs/TabsV2.svelte | 76 ++ .../toggleButton-v2/ToggleButtonGroup.svelte | 40 +- .../lib/components/copilot/IteratorGen.svelte | 4 +- .../components/copilot/PredicateGen.svelte | 4 +- .../lib/components/copilot/ScriptGen.svelte | 159 +++-- .../components/copilot/StepInputGen.svelte | 10 +- .../components/copilot/StepInputsGen.svelte | 10 +- .../copilot/chat/flow/FlowAIChat.svelte | 55 +- .../copilot/chat/script/CodeDisplay.svelte | 2 +- .../details/DetailPageDetailPanel.svelte | 34 +- .../details/DetailPageLayout.svelte | 69 +- .../details/DetailPageTriggerPanel.svelte | 113 ++- .../details/EmailTriggerConfigSection.svelte | 43 +- .../components/flows/CreateActionsApp.svelte | 4 +- .../components/flows/CreateActionsFlow.svelte | 6 +- .../lib/components/flows/FlowEditor.svelte | 3 +- .../components/flows/common/FlowCard.svelte | 28 +- .../content/BranchPredicateEditor.svelte | 4 +- .../flows/content/FlowBranchAllWrapper.svelte | 22 +- .../flows/content/FlowBranchOneWrapper.svelte | 34 +- .../content/FlowBranchesAllWrapper.svelte | 30 +- .../content/FlowBranchesOneWrapper.svelte | 40 +- .../flows/content/FlowConstants.svelte | 150 ++-- .../flows/content/FlowEditorPanel.svelte | 22 +- .../flows/content/FlowFailureModule.svelte | 7 +- .../components/flows/content/FlowInput.svelte | 189 +++-- .../flows/content/FlowInputEditor.svelte | 12 +- .../flows/content/FlowInputs.svelte | 104 +-- .../components/flows/content/FlowLoop.svelte | 121 ++-- .../flows/content/FlowModuleComponent.svelte | 267 ++++--- .../flows/content/FlowModuleEarlyStop.svelte | 67 +- .../flows/content/FlowModuleMock.svelte | 29 +- .../flows/content/FlowModuleSkip.svelte | 44 +- .../content/FlowModuleWorkerTagSelect.svelte | 4 +- .../flows/content/FlowModuleWrapper.svelte | 48 +- .../content/FlowPreprocessorModule.svelte | 7 +- .../flows/content/FlowRetries.svelte | 36 +- .../flows/content/FlowSettings.svelte | 203 +++--- .../flows/content/FlowWhileLoop.svelte | 49 +- .../flows/content/ScriptEditorDrawer.svelte | 49 +- .../flows/content/SuspendDrawer.svelte | 4 +- frontend/src/lib/components/flows/dfs.ts | 32 +- .../src/lib/components/flows/flowState.ts | 2 +- ...StateUtils.ts => flowStateUtils.svelte.ts} | 16 +- .../lib/components/flows/flowStore.svelte.ts | 87 +++ .../src/lib/components/flows/flowStore.ts | 10 +- .../flows/header/FlowImportExportMenu.svelte | 4 +- .../flows/header/FlowYamlEditor.svelte | 29 +- .../flows/map/FlowErrorHandlerItem.svelte | 22 +- .../components/flows/map/FlowJobsMenu.svelte | 208 +++--- .../flows/map/FlowModuleSchemaItem.svelte | 252 ++++--- .../map/FlowModuleSchemaItemViewer.svelte | 53 +- .../flows/map/FlowModuleSchemaMap.svelte | 234 +++--- .../flows/map/FlowSettingsItem.svelte | 18 +- .../flows/map/InsertModuleButton.svelte | 54 +- .../lib/components/flows/map/MapItem.svelte | 201 +++--- .../components/flows/map/VirtualItem.svelte | 214 +++--- .../flows/map/VirtualItemWrapper.svelte | 43 +- .../flows/propPicker/OutputPicker.svelte | 69 +- .../flows/propPicker/OutputPickerInner.svelte | 295 ++++---- .../flows/propPicker/StepHistory.svelte | 57 +- frontend/src/lib/components/flows/types.ts | 9 +- .../lib/components/graph/FlowGraphV2.svelte | 506 +++++++------ .../components/graph/ViewportResizer.svelte | 24 + ...graphBuilder.ts => graphBuilder.svelte.ts} | 503 +++++++++---- .../graph/renderers/edges/BaseEdge.svelte | 117 +-- .../graph/renderers/edges/DataflowEdge.svelte | 56 +- .../renderers/nodes/BranchAllEndNode.svelte | 29 + .../renderers/nodes/BranchAllStart.svelte | 100 ++- .../renderers/nodes/BranchOneStart.svelte | 93 ++- .../renderers/nodes/ForLoopEndNode.svelte | 70 +- .../renderers/nodes/ForLoopStartNode.svelte | 58 +- .../graph/renderers/nodes/InputNode.svelte | 123 ++-- .../graph/renderers/nodes/ModuleNode.svelte | 199 +++--- .../graph/renderers/nodes/NoBranchNode.svelte | 50 +- .../graph/renderers/nodes/NodeWrapper.svelte | 23 +- .../graph/renderers/nodes/ResultNode.svelte | 51 +- .../graph/renderers/nodes/SubflowBound.svelte | 69 +- .../graph/renderers/nodes/TriggersNode.svelte | 197 +++--- .../renderers/nodes/branchAllEndNode.svelte | 32 - .../renderers/nodes/branchOneEndNode.svelte | 41 +- .../renderers/triggers/TriggersBadge.svelte | 4 +- .../src/lib/components/home/ItemsList.svelte | 268 +++---- .../lib/components/meltComponents/Menu.svelte | 72 +- .../meltComponents/MenuSingleItem.svelte | 12 +- .../meltComponents/SideBarTab.svelte | 37 +- .../multiselect/MultiSelectWrapper.svelte | 4 +- .../propertyPicker/ObjectViewer.svelte | 4 +- .../raw_apps/RawAppEditorHeader.svelte | 128 ++-- .../RawAppInlineScriptRunnable.svelte | 39 +- .../raw_apps/RawAppInputsSpecEditor.svelte | 80 ++- .../runs/BatchReRunOptionsPane.svelte | 6 +- .../src/lib/components/runs/JobLoader.svelte | 192 +++-- .../runs/PreprocessedArgsDisplay.svelte | 4 +- .../src/lib/components/runs/RunsFilter.svelte | 487 +++++++------ .../src/lib/components/runs/RunsTable.svelte | 279 ++++---- .../lib/components/schema/AddProperty.svelte | 1 - .../schema/AddPropertyFormV2.svelte | 25 +- .../components/schema/AddPropertyV2.svelte | 20 +- .../schema/EditableSchemaDrawer.svelte | 102 +-- .../schema/EditableSchemaWrapper.svelte | 61 +- .../schema/FlowPropertyEditor.svelte | 292 ++++---- .../components/schema/PropertyEditor.svelte | 156 ++-- .../components/schema/SchemaFormDND.svelte | 86 ++- .../components/schema/SchemaPickerRow.svelte | 64 +- .../src/lib/components/schema/Test.svelte | 5 + .../{schemaUtils.ts => schemaUtils.svelte.ts} | 4 +- .../components/scriptEditor/LogPanel.svelte | 77 +- .../settings/ChangeWorkspaceName.svelte | 3 +- .../components/settings/PremiumInfo.svelte | 4 +- .../components/settings/TokensTable.svelte | 81 ++- .../settings/WorkspaceOperatorSettings.svelte | 100 +-- .../settings/WorkspaceUserSettings.svelte | 205 +++--- .../components/sidebar/FavoriteMenu.svelte | 94 +-- .../components/sidebar/OperatorMenu.svelte | 547 +++++++------- .../components/sidebar/SidebarContent.svelte | 503 ++++++------- .../lib/components/sidebar/UserMenu.svelte | 177 ++--- .../components/sidebar/WorkspaceMenu.svelte | 226 +++--- .../src/lib/components/table/DataTable.svelte | 95 ++- .../components/triggers/CaptureSection.svelte | 8 +- .../components/triggers/CaptureTable.svelte | 124 ++-- .../components/triggers/CaptureWrapper.svelte | 5 +- .../gcp/GcpTriggerEditorConfigSection.svelte | 161 +++-- .../triggers/gcp/GcpTriggerEditorInner.svelte | 11 +- .../http/RouteEditorConfigSection.svelte | 14 +- .../triggers/http/RouteEditorInner.svelte | 188 ++--- .../triggers/http/RoutesGenerator.svelte | 57 +- .../kafka/KafkaTriggerEditorInner.svelte | 9 +- .../kafka/KafkaTriggersConfigSection.svelte | 3 +- .../mqtt/MqttEditorConfigSection.svelte | 71 +- .../mqtt/MqttTriggerEditorInner.svelte | 13 +- .../nats/NatsTriggerEditorInner.svelte | 15 +- .../PostgresTriggerEditorInner.svelte | 16 +- .../triggers/postgres/RelationPicker.svelte | 91 ++- .../schedules/ScheduleEditorInner.svelte | 4 +- .../sqs/SqsTriggerEditorConfigSection.svelte | 90 ++- .../triggers/sqs/SqsTriggerEditorInner.svelte | 15 +- .../webhook/WebhooksConfigSection.svelte | 192 ++--- .../WebsocketEditorConfigSection.svelte | 60 +- .../WebsocketTriggerEditorInner.svelte | 14 +- .../FlowBuilderTutorialBranchAll.svelte | 2 +- .../FlowBuilderTutorialBranchOne.svelte | 6 +- .../FlowBuilderTutorialErrorHandler.svelte | 2 +- .../FlowBuilderTutorialForLoop.svelte | 13 +- .../FlowBuilderTutorialSimpleFlow.svelte | 9 +- .../workspaceSettings/AISettings.svelte | 2 - frontend/src/lib/svelte5Utils.svelte.ts | 9 + frontend/src/lib/utils.ts | 22 +- .../src/routes/(root)/(logged)/+layout.svelte | 154 ++-- .../src/routes/(root)/(logged)/+page.svelte | 12 +- .../(root)/(logged)/audit_logs/+page.svelte | 44 +- .../(root)/(logged)/flows/add/+page.svelte | 55 +- .../flows/edit/[...path]/+page.svelte | 92 ++- .../(logged)/flows/get/[...path]/+page.svelte | 495 ++++++------- .../(root)/(logged)/gcp_triggers/+page.svelte | 164 +++-- .../(logged)/kafka_triggers/+page.svelte | 136 ++-- .../(logged)/mqtt_triggers/+page.svelte | 140 ++-- .../(logged)/nats_triggers/+page.svelte | 136 ++-- .../(logged)/postgres_triggers/+page.svelte | 154 ++-- .../(root)/(logged)/resources/+page.svelte | 293 ++++---- .../(root)/(logged)/routes/+page.svelte | 114 +-- .../(root)/(logged)/run/[...run]/+page.svelte | 4 +- .../(logged)/runs/[...path]/+page.svelte | 252 ++++--- .../(root)/(logged)/schedules/+page.svelte | 112 +-- .../(root)/(logged)/scripts/add/+page.svelte | 29 +- .../scripts/edit/[...path]/+page.svelte | 51 +- .../scripts/get/[...hash]/+page.svelte | 668 +++++++++--------- .../(root)/(logged)/sqs_triggers/+page.svelte | 138 ++-- .../user/(user)/+layout@(root).svelte | 12 +- .../user/(user)/create_workspace/+page.svelte | 80 ++- .../user/(user)/workspaces/+page.svelte | 2 +- .../(logged)/websocket_triggers/+page.svelte | 140 ++-- .../(root)/(logged)/workers/+page.svelte | 8 +- frontend/src/routes/(root)/+layout.svelte | 7 +- frontend/src/routes/+layout.svelte | 7 +- .../[job]/[resume]/[hmac]/+page.svelte | 55 +- frontend/src/routes/flows/dev/+page.svelte | 69 +- frontend/src/routes/kitchen_sink/+page.svelte | 4 +- .../src/routes/test_dev_page_2/+page.svelte | 36 + frontend/tsconfig.json | 2 +- 310 files changed, 15286 insertions(+), 11439 deletions(-) create mode 100644 frontend/src/lib/components/apps/editor/settingsPanel/inputEditor/tabs.svelte.ts create mode 100644 frontend/src/lib/components/common/tabs/TabsV2.svelte rename frontend/src/lib/components/flows/{flowStateUtils.ts => flowStateUtils.svelte.ts} (96%) create mode 100644 frontend/src/lib/components/flows/flowStore.svelte.ts create mode 100644 frontend/src/lib/components/graph/ViewportResizer.svelte rename frontend/src/lib/components/graph/{graphBuilder.ts => graphBuilder.svelte.ts} (59%) create mode 100644 frontend/src/lib/components/graph/renderers/nodes/BranchAllEndNode.svelte delete mode 100644 frontend/src/lib/components/graph/renderers/nodes/branchAllEndNode.svelte create mode 100644 frontend/src/lib/components/schema/Test.svelte rename frontend/src/lib/components/schema/{schemaUtils.ts => schemaUtils.svelte.ts} (98%) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 511069631d..ad5a1e9c67 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -24,9 +24,10 @@ "@redocly/json-to-json-schema": "^0.0.1", "@scalar/openapi-parser": "^0.15.0", "@tanstack/svelte-table": "npm:tanstack-table-8-svelte-5@^0.1", + "@tutorlatin/svelte-tiny-virtual-list": "^3.0.2", "@windmill-labs/svelte-dnd-action": "^0.9.48", "@xterm/addon-fit": "^0.10.0", - "@xyflow/svelte": "^0.1.15", + "@xyflow/svelte": "^1.0.0", "ag-charts-community": "^9.0.1", "ag-charts-enterprise": "^9.0.1", "ag-grid-community": "^31.3.4", @@ -3076,11 +3077,11 @@ "integrity": "sha512-VqAAkydywPpkw63WQhPVKCD3SdwXuihCUVZbbiY3SfSTGQyHmwRoq27y4dmJdZuJwd5JIlQoMPyGvMbUPY0RKQ==" }, "node_modules/@svelte-put/shortcut": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@svelte-put/shortcut/-/shortcut-3.1.1.tgz", - "integrity": "sha512-2L5EYTZXiaKvbEelVkg5znxqvfZGZai3m97+cAiUBhLZwXnGtviTDpHxOoZBsqz41szlfRMcamW/8o0+fbW3ZQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@svelte-put/shortcut/-/shortcut-4.1.0.tgz", + "integrity": "sha512-wImNEIkbxAIWFqlfuhcbC+jRPDeRa/uJGIXHMEVVD+jqL9xCwWNnkGQJ6Qb2XVszuRLHlb8SGZDL3Io/h3vs8w==", "peerDependencies": { - "svelte": "^3.55.0 || ^4.0.0 || ^5.0.0" + "svelte": "^5.1.0" } }, "node_modules/@sveltejs/acorn-typescript": { @@ -3274,6 +3275,17 @@ "node": ">=10.13.0" } }, + "node_modules/@tutorlatin/svelte-tiny-virtual-list": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@tutorlatin/svelte-tiny-virtual-list/-/svelte-tiny-virtual-list-3.0.2.tgz", + "integrity": "sha512-Zts/GUrU6aPgmCrL6sGiD1EoiQxUU+r7Q2g9pckEUIDybNkluV2pEYWUsQLQ+28IJlSSHTopv0fhKs3qMUxqEw==", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "svelte": "^5.0.0" + } + }, "node_modules/@types/cookie": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", @@ -3871,22 +3883,21 @@ "peer": true }, "node_modules/@xyflow/svelte": { - "version": "0.1.39", - "resolved": "https://registry.npmjs.org/@xyflow/svelte/-/svelte-0.1.39.tgz", - "integrity": "sha512-QZ5mzNysvJeJW7DxmqI4Urhhef9tclqtPr7WAS5zQF5Gk6k9INwzey4CYNtEZo8XMj9H8lzgoJRmgMPnJEc1kw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@xyflow/svelte/-/svelte-1.0.2.tgz", + "integrity": "sha512-biNnzWRmKF/m7t7iY9wt3/KhoTyA8XGbS0Vix3HCL9vrULDF14R1VsMIOxKZib1GJfG+f1/cD2dQ9kplfPLs/Q==", "dependencies": { - "@svelte-put/shortcut": "3.1.1", - "@xyflow/system": "0.0.59", - "classcat": "^5.0.4" + "@svelte-put/shortcut": "^4.1.0", + "@xyflow/system": "0.0.61" }, "peerDependencies": { - "svelte": "^3.0.0 || ^4.0.0 || ^5.0.0" + "svelte": "^5.25.0" } }, "node_modules/@xyflow/system": { - "version": "0.0.59", - "resolved": "https://registry.npmjs.org/@xyflow/system/-/system-0.0.59.tgz", - "integrity": "sha512-+xgqYhoBv5F10TQx0SiKZR/DcWtuxFYR+e/LluHb7DMtX4SsMDutZWEJ4da4fDco25jZxw5G9fOlmk7MWvYd5Q==", + "version": "0.0.61", + "resolved": "https://registry.npmjs.org/@xyflow/system/-/system-0.0.61.tgz", + "integrity": "sha512-TsZG/Ez8dzxX6/Ol44LvFqVZsYvyz6dpDlAQZZk6hTL7JLGO5vN3dboRJqMwU8/Qtr5IEv5YBzojjAwIqW1HCA==", "dependencies": { "@types/d3-drag": "^3.0.7", "@types/d3-selection": "^3.0.10", @@ -4710,11 +4721,6 @@ "consola": "^3.2.3" } }, - "node_modules/classcat": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/classcat/-/classcat-5.0.5.tgz", - "integrity": "sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w==" - }, "node_modules/clone": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", diff --git a/frontend/package.json b/frontend/package.json index bd849ce0b5..e2c05397ce 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -94,8 +94,8 @@ "@scalar/openapi-parser": "^0.15.0", "@tanstack/svelte-table": "npm:tanstack-table-8-svelte-5@^0.1", "@windmill-labs/svelte-dnd-action": "^0.9.48", + "@xyflow/svelte": "^1.0.0", "@xterm/addon-fit": "^0.10.0", - "@xyflow/svelte": "^0.1.15", "ag-charts-community": "^9.0.1", "ag-charts-enterprise": "^9.0.1", "ag-grid-community": "^31.3.4", @@ -135,6 +135,7 @@ "svelte-exmarkdown": "^5.0.0", "svelte-infinite-loading": "^1.4.0", "svelte-tiny-virtual-list": "^2.0.5", + "@tutorlatin/svelte-tiny-virtual-list": "^3.0.2", "tailwind-merge": "^1.13.2", "vscode": "npm:@codingame/monaco-vscode-extension-api@~16.1.1", "vscode-languageclient": "~9.0.1", diff --git a/frontend/src/lib/components/AddUser.svelte b/frontend/src/lib/components/AddUser.svelte index 6144d6e84b..3c1161471a 100644 --- a/frontend/src/lib/components/AddUser.svelte +++ b/frontend/src/lib/components/AddUser.svelte @@ -13,8 +13,8 @@ const dispatch = createEventDispatcher() - let email: string - let username: string + let email: string | undefined = $state() + let username: string | undefined = $state() function handleKeyUp(event: KeyboardEvent) { const key = event.key @@ -24,7 +24,7 @@ } } - let automateUsernameCreation = false + let automateUsernameCreation = $state(false) async function getAutomateUsernameCreationSetting() { automateUsernameCreation = ((await SettingService.getGlobal({ key: 'automate_username_creation' })) as any) ?? false @@ -35,17 +35,17 @@ await WorkspaceService.addUser({ workspace: $workspaceStore!, requestBody: { - email, + email: email!, username: automateUsernameCreation ? undefined : username, is_admin: selected == 'admin', operator: selected == 'operator' } }) sendUserToast(`Added ${email}`) - if (!(await UserService.existsEmail({ email }))) { + if (!(await UserService.existsEmail({ email: email! }))) { let isSuperadmin = $superadmin if (!isCloudHosted()) { - const emailCopy = email + const emailCopy = email! sendUserToast( `User ${email} is not registered yet on the instance. ${ !isSuperadmin @@ -62,7 +62,7 @@ goto('#superadmin-settings') } } - ] + ] : [] ) } @@ -70,47 +70,49 @@ dispatch('new') } - let selected: 'operator' | 'developer' | 'admin' = 'developer' + let selected: 'operator' | 'developer' | 'admin' = $state('developer') - + {#snippet trigger()} - - + {/snippet} + {#snippet content()}
Add a new user Email - + {#if !automateUsernameCreation} Username - + {/if} Role - - - - + + {#snippet children({ item })} + + + + {/snippet}
-
+ {/snippet}
diff --git a/frontend/src/lib/components/ApiConnectForm.svelte b/frontend/src/lib/components/ApiConnectForm.svelte index 53a6bd278e..80e452bbf3 100644 --- a/frontend/src/lib/components/ApiConnectForm.svelte +++ b/frontend/src/lib/components/ApiConnectForm.svelte @@ -23,31 +23,43 @@ import Popover from './meltComponents/Popover.svelte' import Button from './common/button/Button.svelte' import { Loader2, Github, RotateCw, Plus, Minus, Download } from 'lucide-svelte' - import { onDestroy } from 'svelte' + import { onDestroy, untrack } from 'svelte' - export let resourceType: string - export let resourceTypeInfo: ResourceType | undefined - export let args: Record | any = {} - export let linkedSecret: string | undefined = undefined - export let isValid = true - export let linkedSecretCandidates: string[] | undefined = undefined - export let description: string | undefined = undefined + interface Props { + resourceType: string + resourceTypeInfo: ResourceType | undefined + args?: Record | any + linkedSecret?: string | undefined + isValid?: boolean + linkedSecretCandidates?: string[] | undefined + description?: string | undefined + } - let schema = emptySchema() - let notFound = false + let { + resourceType, + resourceTypeInfo, + args = $bindable({}), + linkedSecret = $bindable(undefined), + isValid = $bindable(true), + linkedSecretCandidates = undefined, + description = $bindable(undefined) + }: Props = $props() - let supabaseWizard = false + let schema = $state(emptySchema()) + let notFound = $state(false) - let loadingGithubInstallations = false - let githubInstallations: GetGlobalConnectedRepositoriesResponse = [] - let workspaceGithubInstallations: GetGlobalConnectedRepositoriesResponse = [] - let selectedGHAppAccountId: string | undefined = undefined - let selectedGHAppRepository: string | undefined = undefined - let githubInstallationUrl: string | undefined = undefined + let supabaseWizard = $state(false) + + let loadingGithubInstallations = $state(false) + let githubInstallations: GetGlobalConnectedRepositoriesResponse = $state([]) + let workspaceGithubInstallations: GetGlobalConnectedRepositoriesResponse = $state([]) + let selectedGHAppAccountId: string | undefined = $state(undefined) + let selectedGHAppRepository: string | undefined = $state(undefined) + let githubInstallationUrl: string | undefined = $state(undefined) let installationCheckInterval: number | undefined = undefined - let isCheckingInstallation = false - let importJwt = '' - let githubAppPopover: { open: () => void; close: () => void } | null = null + let isCheckingInstallation = $state(false) + let importJwt = $state('') + let githubAppPopover: { open: () => void; close: () => void } | null = $state(null) async function loadGithubInstallations() { if (!$enterpriseLicense) return @@ -159,9 +171,6 @@ notFound = true } } - $: $workspaceStore && loadSchema() - - $: notFound && rawCode && parseJson() function parseJson() { try { @@ -173,13 +182,9 @@ error = e.message } } - let error = '' - let rawCode = '' - let viewJsonSchema = false - - $: rawCode && parseJson() - - $: textFileContent && parseTextFileContent() + let error = $state('') + let rawCode = $state('') + let viewJsonSchema = $state(false) function switchTab(asJson: boolean) { viewJsonSchema = asJson @@ -193,11 +198,8 @@ } } - $: resourceType == 'postgresql' && isSupabaseAvailable() - $: resourceType == 'git_repository' && $userStore?.is_admin && loadGithubInstallations() - - let connectionString = '' - let validConnectionString = true + let connectionString = $state('') + let validConnectionString = $state(true) function parseConnectionString(close: (_: any) => void) { const regex = /postgres(?:ql)?:\/\/(?[^:@]+)(?::(?[^@]+))?@(?[^:\/?]+)(?::(?\d+))?\/(?[^\?]+)?(?:\?.*sslmode=(?[^&]+))?/ @@ -241,8 +243,8 @@ close(null) } - let rawCodeEditor: SimpleEditor | undefined = undefined - let textFileContent: string + let rawCodeEditor: SimpleEditor | undefined = $state(undefined) + let textFileContent: string | undefined = $state(undefined) function parseTextFileContent() { args = { @@ -250,13 +252,6 @@ } } - $: githubInstallationsNotInWorkspace = githubInstallations.filter((installation) => { - return !workspaceGithubInstallations.some( - (workspaceInstallation) => - workspaceInstallation.installation_id === installation.installation_id - ) - }) - async function deleteInstallation(installation_id: number) { if (!$workspaceStore) { sendUserToast('Failed to delete installation', true) @@ -329,6 +324,34 @@ } } } + $effect(() => { + $workspaceStore && untrack(() => loadSchema()) + }) + $effect(() => { + notFound && rawCode && untrack(() => parseJson()) + }) + $effect(() => { + rawCode && untrack(() => parseJson()) + }) + $effect(() => { + textFileContent && untrack(() => parseTextFileContent()) + }) + $effect(() => { + resourceType == 'postgresql' && untrack(() => isSupabaseAvailable()) + }) + $effect(() => { + resourceType == 'git_repository' && + $userStore?.is_admin && + untrack(() => loadGithubInstallations()) + }) + let githubInstallationsNotInWorkspace = $derived( + githubInstallations.filter((installation) => { + return !workspaceGithubInstallations.some( + (workspaceInstallation) => + workspaceInstallation.installation_id === installation.installation_id + ) + }) + ) {#if !notFound} @@ -346,7 +369,7 @@ placement: 'bottom' }} > - + {#snippet trigger()} - - + {/snippet} + {#snippet content({ close })}
@@ -384,7 +407,7 @@ {/if}
- + {/snippet} {/if} {#if resourceType == 'postgresql' && supabaseWizard} @@ -419,7 +442,7 @@ }} disabled={!$enterpriseLicense || loadingGithubInstallations} > - + {#snippet trigger()} - - + {/snippet} + {#snippet content({ close })}
{#if workspaceGithubInstallations.length > 0} @@ -654,7 +677,7 @@
-
+ {/snippet} {:else} - {/if} - {#if isGoogleSignin} - - {:else} - - {/if} -
+ {#snippet actions()} +
+ {#if step > 1} + + {/if} + {#if isGoogleSignin} + + {:else} + + {/if} +
+ {/snippet} diff --git a/frontend/src/lib/components/AppConnectInner.svelte b/frontend/src/lib/components/AppConnectInner.svelte index 217d5981f3..5d9bbcbb29 100644 --- a/frontend/src/lib/components/AppConnectInner.svelte +++ b/frontend/src/lib/components/AppConnectInner.svelte @@ -1,4 +1,6 @@ {#if !express} a.localeCompare(b)) - .map((key) => ({ - key - })) + ? connects.map((key) => ({ + key + })) : undefined} bind:filteredItems={filteredConnects} f={(x) => x.key} /> a[0].localeCompare(b[0]))} + items={connectsManual} bind:filteredItems={filteredConnectsManual} f={(x) => x[0]} /> @@ -590,7 +614,7 @@

Scopes

import type { EnumType } from '$lib/common' - import AutoComplete from 'simple-svelte-autocomplete' import { createEventDispatcher } from 'svelte' - import { twMerge } from 'tailwind-merge' + import Select from './Select.svelte' - export let disabled: boolean - export let value: any - export let enum_: EnumType - export let autofocus: boolean | null - export let defaultValue: string | undefined - export let valid: boolean - export let create: boolean - export let required: boolean - export let enumLabels: Record | undefined = undefined + interface Props { + disabled: boolean + value: string | undefined + enum_: EnumType + autofocus: boolean | null + defaultValue: string | undefined + valid: boolean + create: boolean + enumLabels?: Record | undefined + } + + let { + disabled, + value = $bindable(), + enum_, + autofocus, + defaultValue, + valid, + create, + enumLabels = undefined + }: Props = $props() const dispatch = createEventDispatcher() - let customItems: string[] = [] + let customItems: string[] = $state([]) - function onCreate(newItem: string) { - console.log(newItem) - customItems = [...customItems, newItem] + let items = $derived.by(() => { + const l = [...(enum_ ? enum_ : []), ...customItems].map((item) => ({ + value: item, + label: enumLabels?.[item] ?? item + })) + if (create && filterText && l.every((i) => i.value !== filterText)) { + l.push({ value: filterText, label: `Add new: ${filterText}` }) + } + return l + }) - return newItem - } + let filterText = $state('')
- (enumLabels ? enumLabels[val] ?? val : val)} - bind:selectedItem={value} - inputClassName={twMerge( - 'bg-surface-secondary flex', - valid - ? '' - : 'border border-red-700 border-opacity-30 focus:border-red-700 focus:border-opacity-30 bg-red-100' - )} - value={value ?? defaultValue} - hideArrow={true} - dropdownClassName="!text-sm !py-2 !rounded-sm !border-gray-200 !border !shadow-md !bg-surface-primary" - className="w-full" - noInputStyles - onFocus={() => { - dispatch('focus') - }} - onBlur={() => { - dispatch('blur') - }} - {create} - {required} - {onCreate} + { + onkeydown={() => { ignoreValueUndefined = true }} class={valid @@ -545,6 +638,9 @@ outerDivClass={'dark:!border-gray-500 !border-gray-300'} {disabled} bind:selected={value} + onremove={(e) => { + if (Array.isArray(value)) value = value.filter((v) => v !== e.option) + }} options={itemsType?.multiselect ?? []} selectedOptionsDraggable={true} onopen={() => { @@ -552,14 +648,17 @@ }} />
- {:else if itemsType?.enum != undefined && Array.isArray(itemsType?.enum) && Array.isArray(value)} + {:else if itemsType?.enum != undefined && Array.isArray(itemsType?.enum) && (Array.isArray(value) || value == undefined)}
{ + if (Array.isArray(value)) value = value.filter((v) => v !== e.option) + }} bind:selected={ - () => [...value], + () => [...(value ?? [])], (v) => { if (!deepEqual(v, value)) { value = v @@ -610,7 +709,7 @@ fileChanged(x, (val) => (value[i] = val))} + onchange={(x) => fileChanged(x, (val) => (value[i] = val))} multiple={false} /> {:else if itemsType?.type == 'object' && itemsType?.resourceType === undefined && itemsType?.properties === undefined} @@ -624,7 +723,6 @@ {/await} {:else if Array.isArray(itemsType?.enum)} { dispatch('focus') @@ -633,7 +731,7 @@ dispatch('blur') }} {defaultValue} - {valid} + valid={valid ?? true} {disabled} {autofocus} bind:value={value[i]} @@ -680,7 +778,7 @@ transition:fade|local={{ duration: 100 }} class="rounded-full p-1 bg-surface-secondary duration-200 hover:bg-surface-hover ml-2" aria-label="Clear" - on:click={() => { + onclick={() => { value = value.filter((_, index) => index !== i) redraw += 1 }} @@ -691,7 +789,7 @@ {/if} {/each} {#if value.length > itemsLimit} - {/if} @@ -754,16 +852,16 @@ args={otherArgs} {helperScript} bind:value - entrypoint={format.substring('dynselect_'.length)} + entrypoint={format?.substring('dynselect_'.length) ?? ''} /> {:else if inputCat == 'resource-object' && resourceTypes == undefined} Loading resource types... - {:else if inputCat == 'resource-object' && (resourceTypes == undefined || (format.split('-').length > 1 && resourceTypes.includes(format.substring('resource-'.length))))} + {:else if inputCat == 'resource-object' && (resourceTypes == undefined || (format && format?.split('-').length > 1 && resourceTypes.includes(format?.substring('resource-'.length))))} { @@ -771,7 +869,7 @@ }} {showSchemaExplorer} /> - {:else if inputCat == 'resource-object' && format.split('-').length > 1 && format + {:else if inputCat == 'resource-object' && format && format.split('-').length > 1 && format .replace('resource-', '') .replace('_', '') .toLowerCase() == 's3object'} @@ -855,11 +953,12 @@ : 'label' value = { ...toKeep, [tagKey]: detail } }} - let:item > - {#each oneOf as obj} - - {/each} + {#snippet children({ item })} + {#each oneOf as obj} + + {/each} + {/snippet} {#if oneOfSelected} {@const objIdx = oneOf.findIndex((o) => o.title === oneOfSelected)} @@ -873,13 +972,18 @@ {onlyMaskPassword} {disablePortal} {disabled} - schema={{ - properties: obj.properties, - order: obj.order, - $schema: '', - required: obj.required ?? [], - type: 'object' - }} + bind:schema={ + () => ({ + properties: obj.properties ?? {}, + order: obj.order, + $schema: '', + required: obj.required ?? [], + type: 'object' + }), + () => { + dispatch('nestedChange') + } + } bind:args={value} dndType={`nested-${title}`} hiddenArgs={['label', 'kind']} @@ -889,9 +993,6 @@ oneOf[objIdx].order = keys } }} - on:change={() => { - dispatch('nestedChange') - }} on:nestedChange {shouldDispatchChanges} /> @@ -909,7 +1010,12 @@ required: obj.required ?? [], type: 'object' }} - bind:args={value} + bind:args={ + () => value, + (v) => { + value = { ...v, [tagKey]: oneOfSelected } + } + } {shouldDispatchChanges} on:change={() => { dispatch('nestedChange') @@ -971,22 +1077,24 @@ {onlyMaskPassword} {disablePortal} {disabled} - schema={{ - properties, - $schema: '', - required: nestedRequired ?? [], - type: 'object', - order - }} + bind:schema={ + () => ({ + properties, + $schema: '', + required: nestedRequired ?? [], + type: 'object', + order + }), + (newSchema) => { + dispatch('nestedChange') + } + } bind:args={value} dndType={`nested-${title}`} on:reorder={(e) => { const keys = e.detail order = keys }} - on:change={() => { - dispatch('nestedChange') - }} diff={diffStatus && typeof diffStatus.diff === 'object' ? diffStatus.diff : {}} on:acceptChange={(e) => { dispatch('acceptChange', e.detail) @@ -1065,10 +1173,9 @@ {:else if inputCat == 'enum'}
fileChanged(x, (val) => (value = val))} + onchange={(x) => fileChanged(x, (val) => (value = val))} multiple={false} /> {#if value?.length} @@ -1144,8 +1251,8 @@ {:else if inputCat == 'email'} { + onfocus={(e) => { dispatch('focus') }} - on:blur={(e) => { + onblur={(e) => { dispatch('blur') }} use:autosize - on:keydown={onKeyDown} + onkeydown={onKeyDown} {disabled} class={twMerge( 'w-full', @@ -1197,10 +1304,10 @@ > {/key} {#if !disabled && itemPicker && extra?.['disableVariablePicker'] != true} - + {/if} @@ -1224,7 +1331,7 @@ {/if}
{/if} - + {@render actions?.()}
{#if !compact || (error && error != '')} diff --git a/frontend/src/lib/components/Auth0Setting.svelte b/frontend/src/lib/components/Auth0Setting.svelte index e3d4eb46ef..5d8dc9ba5a 100644 --- a/frontend/src/lib/components/Auth0Setting.svelte +++ b/frontend/src/lib/components/Auth0Setting.svelte @@ -6,11 +6,11 @@ import ToggleButton from './common/toggleButton-v2/ToggleButton.svelte' import ToggleButtonGroup from './common/toggleButton-v2/ToggleButtonGroup.svelte' - export let value: any + interface Props { + value: any + } - $: enabled = value != undefined - - $: changeDomain(value?.['domain'], value?.['custom']) + let { value = $bindable() }: Props = $props() function changeDomain(domain, custom) { if (value) { @@ -31,10 +31,14 @@ } } } + let enabled = $derived(value != undefined) + $effect(() => { + changeDomain(value?.['domain'], value?.['custom']) + })
- +
diff --git a/frontend/src/lib/components/AutoscalingConfigEditor.svelte b/frontend/src/lib/components/AutoscalingConfigEditor.svelte index e90f39a9ef..9afa7a004f 100644 --- a/frontend/src/lib/components/AutoscalingConfigEditor.svelte +++ b/frontend/src/lib/components/AutoscalingConfigEditor.svelte @@ -11,11 +11,15 @@ import Label from './Label.svelte' import MultiSelect from 'svelte-multiselect' - export let config: AutoscalingConfig | undefined - export let worker_tags: string[] | undefined + interface Props { + config: AutoscalingConfig | undefined + worker_tags: string[] | undefined + } + + let { config = $bindable(), worker_tags }: Props = $props() const dispatch = createEventDispatcher() - let test_input: number = 3 + let test_input: number = $state(3)
@@ -49,11 +53,11 @@ } }} /> - + - +
diff --git a/frontend/src/lib/components/ContextualVariableEditor.svelte b/frontend/src/lib/components/ContextualVariableEditor.svelte index 7a6243ea25..a511c3c6b2 100644 --- a/frontend/src/lib/components/ContextualVariableEditor.svelte +++ b/frontend/src/lib/components/ContextualVariableEditor.svelte @@ -69,7 +69,7 @@
- + {#snippet actions()} - + {/snippet} diff --git a/frontend/src/lib/components/DBManagerDrawerButton.svelte b/frontend/src/lib/components/DBManagerDrawerButton.svelte index d0a1b68624..583d5a71ac 100644 --- a/frontend/src/lib/components/DBManagerDrawerButton.svelte +++ b/frontend/src/lib/components/DBManagerDrawerButton.svelte @@ -249,7 +249,7 @@ {/if} - + {#snippet actions()} - + {/snippet} diff --git a/frontend/src/lib/components/Dev.svelte b/frontend/src/lib/components/Dev.svelte index 101f576846..f226430d83 100644 --- a/frontend/src/lib/components/Dev.svelte +++ b/frontend/src/lib/components/Dev.svelte @@ -11,7 +11,6 @@ OpenAPI, type Preview, type OpenFlow, - type FlowModule, WorkspaceService, type InputTransform, type TriggersCount @@ -20,7 +19,7 @@ import { setCopilotInfo, userStore, workspaceStore } from '$lib/stores' import { emptySchema, sendUserToast } from '$lib/utils' import { Pane, Splitpanes } from 'svelte-splitpanes' - import { onDestroy, onMount, setContext } from 'svelte' + import { onDestroy, onMount, setContext, untrack } from 'svelte' import DarkModeToggle from '$lib/components/sidebar/DarkModeToggle.svelte' import { page } from '$app/stores' import { getUserExt } from '$lib/user' @@ -49,16 +48,6 @@ import type { FlowPropPickerConfig, PropPickerContext } from './prop_picker' import type { PickableProperties } from './flows/previousResults' import { Triggers } from './triggers/triggers.svelte' - $: token = $page.url.searchParams.get('wm_token') ?? undefined - $: workspace = $page.url.searchParams.get('workspace') ?? undefined - $: themeDarkRaw = $page.url.searchParams.get('activeColorTheme') - $: themeDark = themeDarkRaw == '2' || themeDarkRaw == '4' - - $: if (token) { - OpenAPI.WITH_CREDENTIALS = true - OpenAPI.TOKEN = token - loadUser() - } let flowCopilotContext: FlowCopilotContext = { shouldUpdatePropertyType: writable<{ @@ -87,14 +76,6 @@ } } } - $: if (workspace) { - $workspaceStore = workspace - setupCopilotInfo() - } - - $: if (workspace && token) { - loadUser() - } async function loadUser() { try { @@ -105,31 +86,26 @@ } } - let darkModeToggle: DarkModeToggle - let darkMode: boolean | undefined = undefined - let modeInitialized = false + let darkModeToggle: DarkModeToggle | undefined = $state() + let darkMode: boolean | undefined = $state(undefined) + let modeInitialized = $state(false) function initializeMode() { modeInitialized = true - darkModeToggle.toggle() + darkModeToggle?.toggle() } - $: darkModeToggle && - themeDark != darkMode && - darkMode != undefined && - !modeInitialized && - initializeMode() - let testJobLoader: TestJobLoader + let testJobLoader: TestJobLoader | undefined = $state() let socket: WebSocket | undefined = undefined // Test args input - let args: Record = {} - let isValid: boolean = true + let args: Record = $state({}) + let isValid: boolean = $state(true) // Test - let testIsLoading = false - let testJob: Job | undefined - let pastPreviews: CompletedJob[] = [] - let validCode = true + let testIsLoading = $state(false) + let testJob: Job | undefined = $state() + let pastPreviews: CompletedJob[] = $state([]) + let validCode = $state(true) type LastEditScript = { content: string @@ -140,9 +116,9 @@ tag?: string } - let currentScript: LastEditScript | undefined = undefined + let currentScript: LastEditScript | undefined = $state(undefined) - let schema = emptySchema() + let schema = $state(emptySchema()) const href = window.location.href const indexQ = href.indexOf('?') const searchParams = indexQ > -1 ? new URLSearchParams(href.substring(indexQ)) : undefined @@ -151,12 +127,12 @@ connectWs() } - let useLock = false + let useLock = $state(false) let lockChanges = false let timeout: NodeJS.Timeout | undefined = undefined - let loadingCodebaseButton = false + let loadingCodebaseButton = $state(false) let lastCommandId = '' const el = (event) => { @@ -174,7 +150,7 @@ } } else if (event.data.type == 'testPreviewBundle') { if (event.data.id == lastCommandId && currentScript) { - testJobLoader.runPreview( + testJobLoader?.runPreview( currentScript.path, event.data.file, currentScript.language, @@ -333,7 +309,7 @@ } } - let typescriptBundlePreviewMode = false + let typescriptBundlePreviewMode = $state(false) function runTest() { if (mode == 'script') { if (!currentScript) { @@ -391,7 +367,7 @@ } } - let relativePaths: any[] = [] + let relativePaths: any[] = $state([]) let lastPath: string | undefined = undefined async function replaceScript(lastEdit: LastEditScript) { mode = 'script' @@ -416,14 +392,16 @@ } } - let mode: 'script' | 'flow' = 'script' + let mode: 'script' | 'flow' = $state('script') - const flowStore = writable({ - summary: '', - value: { modules: [] }, - extra_perms: {}, - schema: emptySchema() - } as OpenFlow) + const flowStore = $state({ + val: { + summary: '', + value: { modules: [] }, + extra_perms: {}, + schema: emptySchema() + } as OpenFlow + }) type LastEditFlow = { flow: OpenFlow @@ -436,14 +414,14 @@ // sendUserToast(JSON.stringify(lastEdit.flow), true) // return try { - if (!deepEqual(lastEdit.flow, $flowStore)) { + if (!deepEqual(lastEdit.flow, flowStore)) { if (!lastEdit.flow.summary) { lastEdit.flow.summary = 'New flow' } if (!lastEdit.flow.value?.modules) { lastEdit.flow.value = { modules: [] } } - $flowStore = lastEdit.flow + flowStore.val = lastEdit.flow inferModuleArgs($selectedIdStore) } } catch (e) { @@ -453,10 +431,10 @@ const flowStateStore = writable({} as FlowState) - const previewArgsStore = writable>({}) + const previewArgsStore = $state({ val: {} }) const scriptEditorDrawer = writable(undefined) - const moving = writable<{ module: FlowModule; modules: FlowModule[] } | undefined>(undefined) - const history = initHistory($flowStore) + const moving = writable<{ id: string } | undefined>(undefined) + const history = initHistory(flowStore.val) const testStepStore = writable>({}) const selectedIdStore = writable('settings-metadata') @@ -496,7 +474,6 @@ flowPropPickerConfig: writable(undefined), pickablePropertiesFiltered: writable(undefined) }) - $: updateFlow($flowStore) let lastSent: OpenFlow | undefined = undefined function updateFlow(flow: OpenFlow) { @@ -509,17 +486,15 @@ } } - $: $selectedIdStore && inferModuleArgs($selectedIdStore) - - let flowPreviewButtons: FlowPreviewButtons - let reload = 0 + let flowPreviewButtons: FlowPreviewButtons | undefined = $state() + let reload = $state(0) async function inferModuleArgs(selectedIdStore: string) { if (selectedIdStore == '') { return } //@ts-ignore - dfs($flowStore.value.modules, async (mod) => { + dfs(flowStore.value.modules, async (mod) => { if (mod.id == selectedIdStore) { if ( mod.value.type == 'rawscript' || @@ -544,9 +519,44 @@ } }) } + let token = $derived($page.url.searchParams.get('wm_token') ?? undefined) + let workspace = $derived($page.url.searchParams.get('workspace') ?? undefined) + let themeDarkRaw = $derived($page.url.searchParams.get('activeColorTheme')) + let themeDark = $derived(themeDarkRaw == '2' || themeDarkRaw == '4') + $effect(() => { + if (token) { + OpenAPI.WITH_CREDENTIALS = true + OpenAPI.TOKEN = token + untrack(() => loadUser()) + } + }) + $effect(() => { + if (workspace) { + $workspaceStore = workspace + untrack(() => setupCopilotInfo()) + } + }) + $effect(() => { + if (workspace && token) { + untrack(() => loadUser()) + } + }) + $effect(() => { + darkModeToggle && + themeDark != darkMode && + darkMode != undefined && + !modeInitialized && + untrack(() => initializeMode()) + }) + $effect(() => { + flowStore.val && untrack(() => updateFlow(flowStore.val)) + }) + $effect(() => { + $selectedIdStore && untrack(() => inferModuleArgs($selectedIdStore)) + }) - + - {#if $flowStore?.value?.modules} + {#if flowStore.val?.value?.modules}
{/if}
- + {#snippet actions()} {#if data?.button} {/if} - + {/snippet} diff --git a/frontend/src/lib/components/DisplayResult.svelte b/frontend/src/lib/components/DisplayResult.svelte index c03cfbf597..d27de74a5b 100644 --- a/frontend/src/lib/components/DisplayResult.svelte +++ b/frontend/src/lib/components/DisplayResult.svelte @@ -1,4 +1,6 @@ @@ -442,17 +472,18 @@ on:selected={(ev) => { globalForceJson = ev.detail === 'json' }} - let:item > - + {#snippet children({ item })} + - + + {/snippet}
{/if}
{#each result['render_all'] as res} - { forceJson = ev.detail === 'json' }} > - {#if ['table-col', 'table-row', 'table-row-object'].includes(resultKind ?? '')} - - {:else} - - {/if} - + {#snippet children({ item })} + {#if ['table-col', 'table-row', 'table-row-object'].includes(resultKind ?? '')} + + {:else} + + {/if} + + {/snippet} {/if}
{#if customUi?.disableAiFix !== true} - + {@render copilot_fix?.()} {/if} {#if toolbarLocation === 'self'} @@ -647,7 +679,7 @@ >{JSON.stringify(result.error.extra, null, 4)} {/if} - + {@render children?.()}
{#if !isTest && language === 'bun'}
@@ -723,7 +755,7 @@ /> - - + import { createBubbler, preventDefault, stopPropagation } from 'svelte/legacy' + + const bubble = createBubbler() import type { Schema } from '$lib/common' import { VariableService } from '$lib/gen' import { workspaceStore } from '$lib/stores' @@ -11,7 +14,7 @@ import FlowPropertyEditor from './schema/FlowPropertyEditor.svelte' import PropertyEditor from './schema/PropertyEditor.svelte' import SimpleEditor from './SimpleEditor.svelte' - import { createEventDispatcher, tick } from 'svelte' + import { createEventDispatcher, tick, untrack } from 'svelte' import ToggleButton from './common/toggleButton-v2/ToggleButton.svelte' import ToggleButtonGroup from './common/toggleButton-v2/ToggleButtonGroup.svelte' import Label from './Label.svelte' @@ -22,72 +25,112 @@ import SchemaFormDnd from './schema/SchemaFormDND.svelte' import { deepEqual } from 'fast-equals' import { tweened } from 'svelte/motion' - import type { SchemaDiff } from '$lib/components/schema/schemaUtils' + import type { SchemaDiff } from '$lib/components/schema/schemaUtils.svelte' import type { EditableSchemaFormUi } from '$lib/components/custom_ui' import { createDispatcherIfMounted } from '$lib/createDispatcherIfMounted' - export let schema: Schema | any - export let hiddenArgs: string[] = [] - export let args: Record = {} - export let shouldHideNoInputs: boolean = false - export let noVariablePicker = false - export let flexWrap = false - export let uiOnly: boolean = false - export let isFlowInput: boolean = false - export let noPreview: boolean = false - export let jsonEnabled: boolean = true - export let isAppInput: boolean = false - export let displayWebhookWarning: boolean = false - export let onlyMaskPassword: boolean = false - export let dndType: string | undefined = undefined - export let editTab: - | 'inputEditor' - | 'history' - | 'savedInputs' - | 'json' - | 'captures' - | 'firstStepInputs' - | undefined - export let previewSchema: Record | undefined = undefined - export let editPanelInitialSize: number | undefined = undefined - export let editPanelSize = 0 - export let diff: Record = {} - export let disableDnd: boolean = false - export let shouldDispatchChanges: boolean = false - export let isValid: boolean = true - export let customUi: EditableSchemaFormUi | undefined = undefined - + // export let openEditTab: () => void = () => {} const dispatch = createEventDispatcher() const dispatchIfMounted = createDispatcherIfMounted(dispatch) - let clazz: string = '' - export { clazz as class } - - $: if (args == undefined || typeof args !== 'object') { - args = {} + interface Props { + schema: Schema | any + hiddenArgs?: string[] + args?: Record + shouldHideNoInputs?: boolean + noVariablePicker?: boolean + flexWrap?: boolean + uiOnly?: boolean + isFlowInput?: boolean + noPreview?: boolean + jsonEnabled?: boolean + isAppInput?: boolean + displayWebhookWarning?: boolean + onlyMaskPassword?: boolean + dndType?: string | undefined + editTab: + | 'inputEditor' + | 'history' + | 'savedInputs' + | 'json' + | 'captures' + | 'firstStepInputs' + | undefined + previewSchema?: Record | undefined + editPanelInitialSize?: number | undefined + editPanelSize?: number + diff?: Record + disableDnd?: boolean + shouldDispatchChanges?: boolean + isValid?: boolean + customUi?: EditableSchemaFormUi | undefined + pannelExtraButtonWidth?: number + class?: string + openEditTab?: import('svelte').Snippet + addProperty?: import('svelte').Snippet + runButton?: import('svelte').Snippet + extraTab?: import('svelte').Snippet } + let { + schema = $bindable(), + hiddenArgs = [], + args = $bindable(undefined), + shouldHideNoInputs = false, + noVariablePicker = false, + flexWrap = false, + uiOnly = false, + isFlowInput = false, + noPreview = false, + jsonEnabled = true, + isAppInput = false, + displayWebhookWarning = false, + onlyMaskPassword = false, + dndType = undefined, + editTab, + previewSchema = undefined, + editPanelInitialSize = undefined, + editPanelSize = $bindable(0), + diff = {}, + disableDnd = false, + shouldDispatchChanges = false, + isValid = $bindable(true), + customUi = undefined, + pannelExtraButtonWidth = 0, + class: clazz = '', + openEditTab, + addProperty, + runButton, + extraTab + }: Props = $props() + + $effect.pre(() => { + if (args == undefined) { + args = {} + } + }) + export function setDefaults() { const nargs = {} Object.keys(schema?.properties ?? {}).forEach((key) => { - if (schema?.properties[key].default != undefined && args[key] == undefined) { + if (schema?.properties[key].default != undefined && args?.[key] == undefined) { let value = schema?.properties[key].default - nargs[key] = value === 'object' ? structuredClone(value) : value + nargs[key] = value === 'object' ? structuredClone($state.snapshot(value)) : value } }) args = nargs } let pickForField: string | undefined - let itemPicker: ItemPicker | undefined = undefined - let variableEditor: VariableEditor | undefined = undefined + let itemPicker: ItemPicker | undefined = $state(undefined) + let variableEditor: VariableEditor | undefined = $state(undefined) - let keys: string[] = Array.isArray(schema?.order) - ? [...schema.order] - : (Object.keys(schema?.properties ?? {}) ?? Object.keys(schema?.properties ?? {})) - - $: schema && onSchemaChange() + let keys: string[] = $state( + Array.isArray(schema?.order) + ? [...schema.order] + : (Object.keys(schema?.properties ?? {}) ?? Object.keys(schema?.properties ?? {})) + ) function alignOrderWithProperties(schema: { properties: Record @@ -134,15 +177,25 @@ } } - let opened: string | undefined = keys[0] - let selected = '' + let opened: string | undefined = $state(untrack(() => keys[0])) + + function computeSelected(property: any) { + if (!opened) return '' + return property.type !== 'object' + ? property.type + : property.format === 'resource-s3_object' + ? 'S3' + : property.oneOf && property.oneOf.length >= 2 + ? 'oneOf' + : 'object' + } export function openField(key: string) { opened = key } export function deleteField(key: string) { - delete args[key] + delete args?.[key] delete schema.properties[key] if (schema.required?.includes(key)) { schema.required = schema.required?.filter((x) => x !== key) @@ -152,20 +205,6 @@ } } - $: opened && updateSelected(schema.properties[opened]) - function updateSelected(property: any) { - if (!property) return - selected = opened - ? property.type !== 'object' - ? property.type - : property.format === 'resource-s3_object' - ? 'S3' - : property.oneOf && property.oneOf.length >= 2 - ? 'oneOf' - : 'object' - : '' - } - function renameProperty(oldName: string, key: string) { const el = document.getElementById(key) as HTMLInputElement const newName = el.value @@ -179,8 +218,10 @@ // clear the input el.value = oldName } else { - args[newName] = args[oldName] - delete args[oldName] + if (args) { + args[newName] = args[oldName] + delete args[oldName] + } schema.properties[newName] = schema.properties[oldName] delete schema.properties[oldName] @@ -199,26 +240,34 @@ opened = newName - schema = schema + schema = $state.snapshot(schema) dispatch('change', schema) - sendUserToast('Argument renamed successfully') + sendUserToast('Argument renamed') } } - let jsonView: boolean = customUi?.jsonOnly == true - let schemaString: string = JSON.stringify(schema, null, '\t') - let error: string | undefined = undefined - let editor: SimpleEditor | undefined = undefined + let jsonView: boolean = $state(customUi?.jsonOnly == true) + let schemaString: string = $state(JSON.stringify(schema, null, '\t')) + let error: string | undefined = $state(undefined) + let editor: SimpleEditor | undefined = $state(undefined) + + export function updateJson() { + schemaString = JSON.stringify(schema, null, '\t') + editor?.setCode(schemaString) + } const editTabDefaultSize = noPreview ? 100 : 50 editPanelSize = editTab ? (editPanelInitialSize ?? editTabDefaultSize) : 0 - let inputPanelSize = 100 - editPanelSize + let inputPanelSize = $state(100 - editPanelSize) let editPanelSizeSmooth = tweened(editPanelSize, { duration: 150 }) - let inputPanelSizeSmooth = tweened(inputPanelSize, { duration: 150 }) + let inputPanelSizeSmooth = tweened( + untrack(() => inputPanelSize), + { duration: 150 } + ) - function openEditTab() { + function openEditTabFn() { if (editPanelSize > 0) return editPanelSizeSmooth.set(editTabDefaultSize) inputPanelSizeSmooth.set(100 - editTabDefaultSize) @@ -234,17 +283,22 @@ inputPanelSize = inputSize dispatchIfMounted('editPanelSizeChanged', editSize) } - $: updatePanelSizes($editPanelSizeSmooth, $inputPanelSizeSmooth) - $: !!editTab ? openEditTab() : closeEditTab() - - let panelButtonWidth: number = 0 - export let pannelExtraButtonWidth: number = 0 - - export function updateJson() { - schemaString = JSON.stringify(schema, null, '\t') - editor?.setCode(schemaString) - } + let panelButtonWidth: number = $state(0) + $effect(() => { + if (args == undefined || typeof args !== 'object') { + args = {} + } + }) + $effect(() => { + schema && untrack(() => onSchemaChange()) + }) + $effect(() => { + updatePanelSizes($editPanelSizeSmooth, $inputPanelSizeSmooth) + }) + $effect(() => { + !!editTab ? openEditTabFn() : closeEditTab() + })
@@ -254,37 +308,42 @@ style="right: calc({editPanelSize}% - 1px - {pannelExtraButtonWidth}px); top: 0px;" bind:clientWidth={panelButtonWidth} > - + {@render openEditTab?.()}
{#if !noPreview}
0 ? 'pr-[38px]' : 'pr-2'}" > - {#if $$slots.addProperty} + {#if addProperty}
0 ? `width: 100%;` : `width: calc(100% - ${panelButtonWidth - pannelExtraButtonWidth}px);`} > - + {@render addProperty?.()}
{/if}
(previewSchema ? previewSchema : schema), + (newSchema) => { + console.log('schemaChange set', $state.snapshot(newSchema)) + schema = newSchema + tick().then(() => dispatch('change', schema)) + } + } {dndType} {disableDnd} {onlyMaskPassword} @@ -293,12 +352,10 @@ opened = e.detail }} on:reorder={(e) => { - schema.order = e.detail - schema = schema - tick().then(() => dispatch('change', schema)) - }} - on:change={() => { - schema = schema + schema = { + ...schema, + order: e.detail + } tick().then(() => dispatch('change', schema)) }} prettifyHeader={isAppInput} @@ -314,7 +371,7 @@ noVariablePicker={noVariablePicker || customUi?.disableVariablePicker === true} /> - + {@render runButton?.()}
@@ -327,7 +384,7 @@ class={twMerge('border rounded-md', panelButtonWidth > 0 ? 'rounded-tl-none' : '')} > {#if editTab !== 'inputEditor'} - + {@render extraTab?.()} {:else} {#if jsonEnabled && customUi?.jsonOnly != true} @@ -357,14 +414,14 @@ {#if keys.length > 0} {#each keys as argName, i (argName)}
- - + +
{ + onclick={() => { if (opened === argName) { opened = undefined } else { @@ -375,9 +432,9 @@
{argName} {#if !uiOnly} -
+
- + {#snippet trigger()}
- + {/snippet}
{/if} @@ -429,7 +486,7 @@ class="rounded-full p-1 text-gray-500 bg-white duration-200 hover:bg-gray-600 focus:bg-gray-600 hover:text-white dark:bg-gray-700 dark:text-white dark:hover:bg-gray-800" aria-label="Clear" - on:click={() => { + onclick={() => { dispatch('delete', argName) }} > @@ -461,103 +518,103 @@ {isFlowInput} {isAppInput} on:change={() => { - schema = schema + schema = $state.snapshot(schema) dispatch('change', schema) }} > - + {#snippet typeeditor()} {#if isFlowInput || isAppInput} {/if} - + {/snippet} {#if isFlowInput || isAppInput} { - schema = schema + schema = $state.snapshot(schema) dispatch('change', schema) dispatch('schemaChange') }} @@ -651,7 +708,9 @@ bind:this={itemPicker} pickCallback={(path, _) => { if (pickForField) { - args[pickForField] = '$var:' + path + if (args) { + args[pickForField] = '$var:' + path + } } }} itemName="Variable" @@ -664,17 +723,19 @@ ...x }))} > -
- -
+ {#snippet submission()} +
+ +
+ {/snippet} diff --git a/frontend/src/lib/components/Editor.svelte b/frontend/src/lib/components/Editor.svelte index 16dedf01c6..08ce87d57e 100644 --- a/frontend/src/lib/components/Editor.svelte +++ b/frontend/src/lib/components/Editor.svelte @@ -206,7 +206,7 @@ let websocketInterval: NodeJS.Timeout | undefined let lastWsAttempt: Date = new Date() let nbWsAttempt = 0 - let disposeMethod: () => void | undefined + let disposeMethod: (() => void) | undefined const dispatch = createEventDispatcher() let graphqlService: MonacoGraphQLAPI | undefined = undefined @@ -1267,15 +1267,20 @@ onFileChanges() - editor = meditor.create(divEl as HTMLDivElement, { - ...editorConfig(code, lang, automaticLayout, fixedOverflowWidgets), - model, - fontSize: !small ? 14 : 12, - lineNumbersMinChars, - // overflowWidgetsDomNode: widgets, - tabSize: lang == 'python' ? 4 : 2, - folding - }) + try { + editor = meditor.create(divEl as HTMLDivElement, { + ...editorConfig(code, lang, automaticLayout, fixedOverflowWidgets), + model, + fontSize: !small ? 14 : 12, + lineNumbersMinChars, + // overflowWidgetsDomNode: widgets, + tabSize: lang == 'python' ? 4 : 2, + folding + }) + } catch (e) { + console.error('Error loading monaco:', e) + return + } keepModelAroundToAvoidDisposalOfWorkers() diff --git a/frontend/src/lib/components/EditorBar.svelte b/frontend/src/lib/components/EditorBar.svelte index c2ae98599c..5b5681b3b3 100644 --- a/frontend/src/lib/components/EditorBar.svelte +++ b/frontend/src/lib/components/EditorBar.svelte @@ -1,8 +1,10 @@ - - +
{#if schema && mod} @@ -77,10 +81,10 @@ selected ? 'bg-surface-selected' : 'hover:bg-surface-hover' )} disabled={!schema} - on:click={handleClick} + onclick={handleClick} > -
- {#if mod.value.type === 'rawscript'} - - {:else if mod.value.type === 'script'} - {#if mod.value.path.startsWith('hub/')} -
- -
- {:else} - + {#snippet icon()} +
+ {#if mod.value.type === 'rawscript'} + + {:else if mod.value.type === 'script'} + {#if mod.value.path.startsWith('hub/')} +
+ +
+ {:else} + + {/if} {/if} - {/if} -
+
+ {/snippet}
{:else} diff --git a/frontend/src/lib/components/FlowBuilder.svelte b/frontend/src/lib/components/FlowBuilder.svelte index 17c1f04818..4c1f766c77 100644 --- a/frontend/src/lib/components/FlowBuilder.svelte +++ b/frontend/src/lib/components/FlowBuilder.svelte @@ -1,8 +1,9 @@ - + - +{@render children?.()} { - const currentModules = $flowStore?.value?.modules + const currentModules = flowStore.val?.value?.modules - $flowStore = undo(history, $flowStore) + flowStore.val = undo(history, flowStore.val) - const newModules = $flowStore?.value?.modules + const newModules = flowStore.val?.value?.modules const restoredModules = newModules?.filter( (node) => !currentModules?.some((currentNode) => currentNode?.id === node?.id) ) @@ -820,7 +861,7 @@ $selectedIdStore = 'Input' }} on:redo={() => { - $flowStore = redo(history) + flowStore.val = redo(history) }} />
@@ -853,7 +894,7 @@
{/if}
- + {/snippet}
diff --git a/frontend/src/lib/components/FolderEditor.svelte b/frontend/src/lib/components/FolderEditor.svelte index 22229d8f8e..c12aecf9c7 100644 --- a/frontend/src/lib/components/FolderEditor.svelte +++ b/frontend/src/lib/components/FolderEditor.svelte @@ -184,13 +184,11 @@
- (ownerItem = '')} - let:item - > - - + (ownerItem = '')}> + {#snippet children({ item })} + + + {/snippet}
@@ -278,7 +276,6 @@ { const role = e.detail // const wasInFolder = (folder?.owners ?? []).includes(folder) @@ -315,28 +312,30 @@ loadFolder() }} > - + {#snippet children({ item })} + - + - + + {/snippet}
{:else} diff --git a/frontend/src/lib/components/GroupEditor.svelte b/frontend/src/lib/components/GroupEditor.svelte index fbe03bd9f0..1f66cabfec 100644 --- a/frontend/src/lib/components/GroupEditor.svelte +++ b/frontend/src/lib/components/GroupEditor.svelte @@ -150,7 +150,6 @@
{ const role = e.detail // const wasInGroup = (group?.members ?? []).includes(group) @@ -211,31 +210,33 @@ loadGroup() }} > - - - {#if role === 'manager'} + {#snippet children({ item })} - {/if} + + {#if role === 'manager'} + + {/if} + {/snippet}
{:else} diff --git a/frontend/src/lib/components/HistoricInputs.svelte b/frontend/src/lib/components/HistoricInputs.svelte index 1acd9a9e28..ac79c0479b 100644 --- a/frontend/src/lib/components/HistoricInputs.svelte +++ b/frontend/src/lib/components/HistoricInputs.svelte @@ -8,21 +8,34 @@ import HistoricList from './HistoricList.svelte' import { Loader2 } from 'lucide-svelte' - export let runnableId: string | undefined = undefined - export let runnableType: RunnableType | undefined = undefined - export let loading: boolean = false - export let selected: string | undefined = undefined - export let showAuthor = false - export let placement: 'bottom-start' | 'top-start' | 'bottom-end' | 'top-end' = 'top-end' - export let limitPayloadSize = false - export let searchArgs: Record | undefined = undefined + interface Props { + runnableId?: string | undefined + runnableType?: RunnableType | undefined + loading?: boolean + selected?: string | undefined + showAuthor?: boolean + placement?: 'bottom-start' | 'top-start' | 'bottom-end' | 'top-end' + limitPayloadSize?: boolean + searchArgs?: Record | undefined + } - let historicList: HistoricList | undefined = undefined + let { + runnableId = undefined, + runnableType = undefined, + loading = $bindable(false), + selected = $bindable(undefined), + showAuthor = false, + placement = 'top-end', + limitPayloadSize = false, + searchArgs = undefined + }: Props = $props() + + let historicList: HistoricList | undefined = $state(undefined) const dispatch = createEventDispatcher() - let jobs: Job[] = [] + let jobs: Job[] = $state([]) let hasMoreCurrentRuns = false - let page = 1 + let page = $state(1) async function handleSelected(data: any) { if (selected === data.id) { @@ -34,7 +47,10 @@ const fullPayload = await data.getFullPayload?.() dispatch('select', { args: fullPayload, jobId: data.id }) } else { - dispatch('select', { args: structuredClone(data.payloadData), jobId: data.id }) + dispatch('select', { + args: structuredClone($state.snapshot(data.payloadData)), + jobId: data.id + }) } } @@ -77,11 +93,11 @@ } else if (runnableType === 'ScriptHash') { return 'script,preview' } - return 'all' + return '' } - + {#if runnableId} import { InputService, type RunnableType } from '$lib/gen' import { workspaceStore } from '$lib/stores' - import { onDestroy } from 'svelte' + import { onDestroy, untrack } from 'svelte' import InfiniteList from './InfiniteList.svelte' import JobSchemaPicker from './schema/JobSchemaPicker.svelte' - export let runnableId: string | undefined - export let runnableType: RunnableType | undefined - export let selected: string | undefined = undefined - export let showAuthor = false - export let placement: 'bottom-start' | 'top-start' | 'bottom-end' | 'top-end' = 'bottom-start' - export let limitPayloadSize = false - export let searchArgs: Record | undefined = undefined + interface Props { + runnableId: string | undefined + runnableType: RunnableType | undefined + selected?: string | undefined + showAuthor?: boolean + placement?: 'bottom-start' | 'top-start' | 'bottom-end' | 'top-end' + limitPayloadSize?: boolean + searchArgs?: Record | undefined + } - let infiniteList: InfiniteList | undefined = undefined + let { + runnableId, + runnableType, + selected = undefined, + showAuthor = false, + placement = 'bottom-start', + limitPayloadSize = false, + searchArgs = undefined + }: Props = $props() + + let infiniteList: InfiniteList | undefined = $state(undefined) let loadInputsPageFn: ((page: number, perPage: number) => Promise) | undefined = undefined - let viewerOpen = false + let viewerOpen = $state(false) let openStates: Record = {} // Track open state for each item export async function refresh(clearCurrentRuns: boolean = false) { @@ -101,18 +113,20 @@ viewerOpen = Object.values(openStates).some((state) => state) } - $: $workspaceStore && runnableId && runnableType && infiniteList && initLoadInputs() + $effect(() => { + $workspaceStore && runnableId && runnableType && infiniteList && untrack(() => initLoadInputs()) + }) - + {#snippet columns()} - - + {/snippet} + {#snippet children({ item, hover })} - - + {/snippet} + {#snippet empty()}
{runnableId ? 'No previous inputs' : 'Save draft to see previous runs'}
-
+ {/snippet}
diff --git a/frontend/src/lib/components/IconedResourceType.svelte b/frontend/src/lib/components/IconedResourceType.svelte index 5daea14d17..7375c64cd7 100644 --- a/frontend/src/lib/components/IconedResourceType.svelte +++ b/frontend/src/lib/components/IconedResourceType.svelte @@ -1,18 +1,35 @@
@@ -20,12 +37,13 @@ {name} {/if} {#if iconComponent} + {@const SvelteComponent = iconComponent} - + {:else if formatExtension} - + {:else} @@ -34,4 +52,3 @@ {name} {/if}
- diff --git a/frontend/src/lib/components/InfiniteList.svelte b/frontend/src/lib/components/InfiniteList.svelte index 6457d5ea60..b4afaf41ba 100644 --- a/frontend/src/lib/components/InfiniteList.svelte +++ b/frontend/src/lib/components/InfiniteList.svelte @@ -6,26 +6,48 @@ const dispatch = createEventDispatcher() - export let loading = false - export let items: any[] | undefined = undefined - export let selectedItemId: any | undefined = undefined - export let isEmpty: boolean = true - export let length: number = 0 - export let rounded: boolean = true - export let noBorder: boolean = false - export let extraRowClasses: { bgSelected: string; bgHover: string; class: string } = { - bgSelected: '', - bgHover: '', - class: '' + interface Props { + loading?: boolean + items?: any[] | undefined + selectedItemId?: any | undefined + isEmpty?: boolean + length?: number + rounded?: boolean + noBorder?: boolean + extraRowClasses?: { bgSelected: string; bgHover: string; class: string } + neverShowLoader?: boolean + columns?: import('svelte').Snippet + extra_row?: import('svelte').Snippet<[any]> + children?: import('svelte').Snippet<[any]> + empty?: import('svelte').Snippet<[any]> } - export let neverShowLoader = false + + let { + loading = $bindable(false), + items = $bindable(undefined), + selectedItemId = $bindable(undefined), + isEmpty = $bindable(true), + length = $bindable(0), + rounded = true, + noBorder = false, + extraRowClasses = { + bgSelected: '', + bgHover: '', + class: '' + }, + neverShowLoader = false, + columns, + extra_row, + children, + empty + }: Props = $props() const perPage = 20 - let hasMore = false + let hasMore = $state(false) let page = 1 let hasAlreadyFailed = false - let hovered: any | undefined = undefined + let hovered: any | undefined = $state(undefined) let initLoad = false let loadInputs: ((page: number, perPage: number) => Promise) | undefined = undefined let deleteItemFn: ((id: any) => Promise) | undefined = undefined @@ -39,7 +61,7 @@ page = 1 } - let loadingMore = false + let loadingMore = $state(false) export async function loadData(loadOption: 'refresh' | 'forceRefresh' | 'loadMore' = 'loadMore') { // console.log('loadData', loadOption, length, items?.length) @@ -146,7 +168,7 @@ {noBorder} {neverShowLoader} > - + {@render columns?.()} (hovered = e.detail ? 'extraRow' : undefined)} > - + {@render extra_row?.({ hover: hovered === 'extraRow' })} {#each items ?? [] as item, index} {@const hover = item.id === hovered} @@ -171,16 +193,16 @@ )} on:hover={(e) => (hovered = e.detail ? item.id : undefined)} > - + {@render children?.({ item, hover })} {/each} - + {#snippet emptyMessage()} {#if (!items || items?.length === 0) && (!loading || neverShowLoader)} - + {@render empty?.({ items })} {/if} - + {/snippet} From 0cdff8acd13c04001aa6684068cd8a22954ef093 Mon Sep 17 00:00:00 2001 From: Diego Imbert <70353967+diegoimbert@users.noreply.github.com> Date: Tue, 17 Jun 2025 19:34:28 +0200 Subject: [PATCH 633/739] Fix MQTT undefined binding bug (#5966) --- .../triggers/mqtt/MqttTriggerEditorInner.svelte | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/frontend/src/lib/components/triggers/mqtt/MqttTriggerEditorInner.svelte b/frontend/src/lib/components/triggers/mqtt/MqttTriggerEditorInner.svelte index f397030772..33444b0eaa 100644 --- a/frontend/src/lib/components/triggers/mqtt/MqttTriggerEditorInner.svelte +++ b/frontend/src/lib/components/triggers/mqtt/MqttTriggerEditorInner.svelte @@ -76,12 +76,12 @@ let drawerLoading = $state(true) let showLoading = $state(false) let subscribe_topics: MqttSubscribeTopic[] = $state([]) - let v3_config: MqttV3Config | undefined = $state() - let v5_config: MqttV5Config | undefined = $state() + let v3_config: MqttV3Config | undefined = $state({}) + let v5_config: MqttV5Config | undefined = $state({}) let client_version: MqttClientVersion | undefined = $state() - let client_id: string | undefined = $state(undefined) - let isValid: boolean | undefined = $state(undefined) - let initialConfig: Record | undefined = undefined + let client_id: string | undefined = $state('') + let isValid: boolean = $state(false) + let initialConfig: Record | undefined = {} let deploymentLoading = $state(false) const mqttConfig = $derived.by(getSaveCfg) @@ -247,7 +247,7 @@ } $effect(() => { - let args = [captureConfig, isValid ?? false] as const + let args = [captureConfig, isValid] as const onCaptureConfigChange?.(...args) }) From 28a02095683a23c3c524c7bbb08210f0719ac52f Mon Sep 17 00:00:00 2001 From: Diego Imbert <70353967+diegoimbert@users.noreply.github.com> Date: Tue, 17 Jun 2025 19:47:40 +0200 Subject: [PATCH 634/739] fix gcp trigger bind to undefined (#5967) --- .../lib/components/triggers/gcp/GcpTriggerEditorInner.svelte | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/lib/components/triggers/gcp/GcpTriggerEditorInner.svelte b/frontend/src/lib/components/triggers/gcp/GcpTriggerEditorInner.svelte index 7070e60e26..eede2f1960 100644 --- a/frontend/src/lib/components/triggers/gcp/GcpTriggerEditorInner.svelte +++ b/frontend/src/lib/components/triggers/gcp/GcpTriggerEditorInner.svelte @@ -128,7 +128,7 @@ delivery_type = defaultValues?.delivery_type ?? 'pull' delivery_config = defaultValues?.delivery_config ?? undefined subscription_id = '' - topic_id = defaultValues?.topic_id + topic_id = defaultValues?.topic_id ?? '' subscription_mode = defaultValues?.subscription_mode ?? 'create_update' path = defaultValues?.path ?? '' initialPath = '' @@ -168,7 +168,7 @@ is_flow = cfg?.is_flow path = cfg?.path enabled = cfg?.enabled - topic_id = cfg?.topic_id + topic_id = cfg?.topic_id ?? '' can_write = canWrite(cfg?.path, cfg?.extra_perms, $userStore) } From aba8c01d7f44ba4be369a3c711be9e156d6bf215 Mon Sep 17 00:00:00 2001 From: dieriba Date: Tue, 17 Jun 2025 19:49:00 +0200 Subject: [PATCH 635/739] feat: windmill http triggers and webhooks to openapi spec (#5918) * add sum and description to http routes * add to openapi spec * add subsection * add collaspable and action button * added path rendering, * migrate logic to backend * remover server and handle different format generation * add filter for http route and document generated * remove print * handled webhook and integrated server component * done * add download and copy * nits * update .sqlx * remove .vscode * fix npm check * add summary description and fix toggle * added security handling and nits * update .sqlx * nits and rename key * remove unused code * update ref * nits rename var * nits * nits * nits * nits * nits * add token generation for cURL command * create token * update label and remove section * update repo ref * clean * let brower start download before cleaning up resource * handle sync/async for webhook * format fix * nits * nits * reset sum and description --- ...2cd49e4632f03f16ee6f34d9a2c0842890f05.json | 23 + ...aa7595adae0eac4e4e3a888cb12b972d1a7ce.json | 170 +++ ...60ab725295e0f20cb5f85d5fddc14d503a119.json | 23 + ...d3c5282319fe7e041f114e02fb22b91716637.json | 60 ++ ...4454b95962047458a6927d19ac0d3e7b3f0fa.json | 169 +++ ...efb9806223d1684c53907ff825bc0228ec18d.json | 35 + ...53bc72e787a3f768040c8c73ea86313badb71.json | 55 + ...4757b999d25870fda37fe904e09dd5c742015.json | 93 ++ ...ccc0024acf17ce740f70d2243e5e2a2b25163.json | 35 + ...e99ae0a53d0b1feaa67737da409c51c1b6751.json | 59 ++ backend/Cargo.lock | 29 + backend/Cargo.toml | 4 +- backend/ee-repo-ref.txt | 2 +- .../20240917172503_job_routing.down.sql | 2 +- ...ption_and_summary_to_http_trigger.down.sql | 4 + ...ription_and_summary_to_http_trigger.up.sql | 5 + backend/windmill-api/Cargo.toml | 6 +- backend/windmill-api/openapi.yaml | 157 +++ backend/windmill-api/src/apps.rs | 4 +- backend/windmill-api/src/auth.rs | 151 ++- backend/windmill-api/src/capture.rs | 3 +- backend/windmill-api/src/db.rs | 2 +- backend/windmill-api/src/flows.rs | 4 +- backend/windmill-api/src/http_trigger_auth.rs | 4 +- backend/windmill-api/src/http_triggers.rs | 41 +- backend/windmill-api/src/lib.rs | 3 + backend/windmill-api/src/mqtt_triggers.rs | 4 +- backend/windmill-api/src/openapi.rs | 984 ++++++++++++++++++ .../windmill-api/src/postgres_triggers/mod.rs | 2 +- .../src/postgres_triggers/trigger.rs | 2 +- backend/windmill-api/src/resources.rs | 2 +- backend/windmill-api/src/utils.rs | 19 - backend/windmill-api/src/workspaces_export.rs | 2 + backend/windmill-common/Cargo.toml | 1 + backend/windmill-common/src/utils.rs | 54 +- .../src/lib/components/SimpleEditor.svelte | 9 +- .../components/settings/CreateToken.svelte | 262 +++++ .../triggers/http/OpenAPISpecGenerator.svelte | 647 ++++++++++++ .../triggers/http/RouteEditorInner.svelte | 62 +- .../src/lib/components/triggers/http/utils.ts | 4 +- frontend/src/lib/utils.ts | 14 +- .../(root)/(logged)/routes/+page.svelte | 12 + 42 files changed, 3081 insertions(+), 142 deletions(-) create mode 100644 backend/.sqlx/query-0de53d764bbcf44d76cd8e47f7b2cd49e4632f03f16ee6f34d9a2c0842890f05.json create mode 100644 backend/.sqlx/query-39401cb0db8d367b5beb2be0c13aa7595adae0eac4e4e3a888cb12b972d1a7ce.json create mode 100644 backend/.sqlx/query-3aaa6b6e362b10f2f3546b8595c60ab725295e0f20cb5f85d5fddc14d503a119.json create mode 100644 backend/.sqlx/query-3f05e6186050a7ce6d8efb41067d3c5282319fe7e041f114e02fb22b91716637.json create mode 100644 backend/.sqlx/query-4228b098883408323bd8413ee094454b95962047458a6927d19ac0d3e7b3f0fa.json create mode 100644 backend/.sqlx/query-4dc21dda58758a84bbc1b7f9328efb9806223d1684c53907ff825bc0228ec18d.json create mode 100644 backend/.sqlx/query-6b6aca712df657f81e74a438f6753bc72e787a3f768040c8c73ea86313badb71.json create mode 100644 backend/.sqlx/query-714fb0f66ceb536aee8cb9ae0144757b999d25870fda37fe904e09dd5c742015.json create mode 100644 backend/.sqlx/query-d41df114e78873111e409e1182bccc0024acf17ce740f70d2243e5e2a2b25163.json create mode 100644 backend/.sqlx/query-ed99d4d088d0fd0c01f29803b12e99ae0a53d0b1feaa67737da409c51c1b6751.json create mode 100644 backend/migrations/20250607102516_add_description_and_summary_to_http_trigger.down.sql create mode 100644 backend/migrations/20250607102516_add_description_and_summary_to_http_trigger.up.sql create mode 100644 backend/windmill-api/src/openapi.rs create mode 100644 frontend/src/lib/components/settings/CreateToken.svelte create mode 100644 frontend/src/lib/components/triggers/http/OpenAPISpecGenerator.svelte diff --git a/backend/.sqlx/query-0de53d764bbcf44d76cd8e47f7b2cd49e4632f03f16ee6f34d9a2c0842890f05.json b/backend/.sqlx/query-0de53d764bbcf44d76cd8e47f7b2cd49e4632f03f16ee6f34d9a2c0842890f05.json new file mode 100644 index 0000000000..fd8f30417f --- /dev/null +++ b/backend/.sqlx/query-0de53d764bbcf44d76cd8e47f7b2cd49e4632f03f16ee6f34d9a2c0842890f05.json @@ -0,0 +1,23 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT \n path\n FROM\n flow\n WHERE\n path ~ ANY($1) AND\n workspace_id = $2\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "path", + "type_info": "Varchar" + } + ], + "parameters": { + "Left": [ + "TextArray", + "Text" + ] + }, + "nullable": [ + false + ] + }, + "hash": "0de53d764bbcf44d76cd8e47f7b2cd49e4632f03f16ee6f34d9a2c0842890f05" +} diff --git a/backend/.sqlx/query-39401cb0db8d367b5beb2be0c13aa7595adae0eac4e4e3a888cb12b972d1a7ce.json b/backend/.sqlx/query-39401cb0db8d367b5beb2be0c13aa7595adae0eac4e4e3a888cb12b972d1a7ce.json new file mode 100644 index 0000000000..9906e0d56b --- /dev/null +++ b/backend/.sqlx/query-39401cb0db8d367b5beb2be0c13aa7595adae0eac4e4e3a888cb12b972d1a7ce.json @@ -0,0 +1,170 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT \n workspace_id, \n path, \n route_path, \n route_path_key,\n workspaced_route,\n script_path, \n summary,\n description,\n is_flow, \n http_method as \"http_method: _\", \n edited_by, \n email, \n edited_at, \n extra_perms, \n is_async, \n authentication_method as \"authentication_method: _\", \n static_asset_config as \"static_asset_config: _\", \n is_static_website,\n authentication_resource_path,\n wrap_body,\n raw_string\n FROM \n http_trigger\n WHERE \n workspace_id = $1 AND \n path = $2\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "workspace_id", + "type_info": "Varchar" + }, + { + "ordinal": 1, + "name": "path", + "type_info": "Varchar" + }, + { + "ordinal": 2, + "name": "route_path", + "type_info": "Varchar" + }, + { + "ordinal": 3, + "name": "route_path_key", + "type_info": "Varchar" + }, + { + "ordinal": 4, + "name": "workspaced_route", + "type_info": "Bool" + }, + { + "ordinal": 5, + "name": "script_path", + "type_info": "Varchar" + }, + { + "ordinal": 6, + "name": "summary", + "type_info": "Varchar" + }, + { + "ordinal": 7, + "name": "description", + "type_info": "Text" + }, + { + "ordinal": 8, + "name": "is_flow", + "type_info": "Bool" + }, + { + "ordinal": 9, + "name": "http_method: _", + "type_info": { + "Custom": { + "name": "http_method", + "kind": { + "Enum": [ + "get", + "post", + "put", + "delete", + "patch" + ] + } + } + } + }, + { + "ordinal": 10, + "name": "edited_by", + "type_info": "Varchar" + }, + { + "ordinal": 11, + "name": "email", + "type_info": "Varchar" + }, + { + "ordinal": 12, + "name": "edited_at", + "type_info": "Timestamptz" + }, + { + "ordinal": 13, + "name": "extra_perms", + "type_info": "Jsonb" + }, + { + "ordinal": 14, + "name": "is_async", + "type_info": "Bool" + }, + { + "ordinal": 15, + "name": "authentication_method: _", + "type_info": { + "Custom": { + "name": "authentication_method", + "kind": { + "Enum": [ + "none", + "windmill", + "api_key", + "basic_http", + "custom_script", + "signature" + ] + } + } + } + }, + { + "ordinal": 16, + "name": "static_asset_config: _", + "type_info": "Jsonb" + }, + { + "ordinal": 17, + "name": "is_static_website", + "type_info": "Bool" + }, + { + "ordinal": 18, + "name": "authentication_resource_path", + "type_info": "Varchar" + }, + { + "ordinal": 19, + "name": "wrap_body", + "type_info": "Bool" + }, + { + "ordinal": 20, + "name": "raw_string", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [ + false, + false, + false, + false, + false, + false, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + true, + false, + true, + false, + false + ] + }, + "hash": "39401cb0db8d367b5beb2be0c13aa7595adae0eac4e4e3a888cb12b972d1a7ce" +} diff --git a/backend/.sqlx/query-3aaa6b6e362b10f2f3546b8595c60ab725295e0f20cb5f85d5fddc14d503a119.json b/backend/.sqlx/query-3aaa6b6e362b10f2f3546b8595c60ab725295e0f20cb5f85d5fddc14d503a119.json new file mode 100644 index 0000000000..5121dca128 --- /dev/null +++ b/backend/.sqlx/query-3aaa6b6e362b10f2f3546b8595c60ab725295e0f20cb5f85d5fddc14d503a119.json @@ -0,0 +1,23 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT \n path\n FROM\n script\n WHERE\n path ~ ANY($1) AND\n workspace_id = $2\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "path", + "type_info": "Varchar" + } + ], + "parameters": { + "Left": [ + "TextArray", + "Text" + ] + }, + "nullable": [ + false + ] + }, + "hash": "3aaa6b6e362b10f2f3546b8595c60ab725295e0f20cb5f85d5fddc14d503a119" +} diff --git a/backend/.sqlx/query-3f05e6186050a7ce6d8efb41067d3c5282319fe7e041f114e02fb22b91716637.json b/backend/.sqlx/query-3f05e6186050a7ce6d8efb41067d3c5282319fe7e041f114e02fb22b91716637.json new file mode 100644 index 0000000000..86d22794c6 --- /dev/null +++ b/backend/.sqlx/query-3f05e6186050a7ce6d8efb41067d3c5282319fe7e041f114e02fb22b91716637.json @@ -0,0 +1,60 @@ +{ + "db_name": "PostgreSQL", + "query": "\n UPDATE \n http_trigger \n SET \n route_path = $1, \n route_path_key = $2, \n workspaced_route = $3,\n wrap_body = $4,\n raw_string = $5,\n authentication_resource_path = $6,\n script_path = $7, \n path = $8, \n is_flow = $9, \n http_method = $10, \n static_asset_config = $11, \n edited_by = $12, \n email = $13, \n is_async = $14, \n authentication_method = $15, \n summary = $16,\n description = $17,\n edited_at = now(), \n is_static_website = $18\n WHERE \n workspace_id = $19 AND \n path = $20\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Varchar", + "Bool", + "Bool", + "Bool", + "Varchar", + "Varchar", + "Varchar", + "Bool", + { + "Custom": { + "name": "http_method", + "kind": { + "Enum": [ + "get", + "post", + "put", + "delete", + "patch" + ] + } + } + }, + "Jsonb", + "Varchar", + "Varchar", + "Bool", + { + "Custom": { + "name": "authentication_method", + "kind": { + "Enum": [ + "none", + "windmill", + "api_key", + "basic_http", + "custom_script", + "signature" + ] + } + } + }, + "Varchar", + "Text", + "Bool", + "Text", + "Text" + ] + }, + "nullable": [] + }, + "hash": "3f05e6186050a7ce6d8efb41067d3c5282319fe7e041f114e02fb22b91716637" +} diff --git a/backend/.sqlx/query-4228b098883408323bd8413ee094454b95962047458a6927d19ac0d3e7b3f0fa.json b/backend/.sqlx/query-4228b098883408323bd8413ee094454b95962047458a6927d19ac0d3e7b3f0fa.json new file mode 100644 index 0000000000..365bce7366 --- /dev/null +++ b/backend/.sqlx/query-4228b098883408323bd8413ee094454b95962047458a6927d19ac0d3e7b3f0fa.json @@ -0,0 +1,169 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT \n workspace_id, \n workspaced_route,\n path, \n route_path, \n route_path_key, \n authentication_resource_path,\n script_path, \n is_flow, \n summary,\n description,\n edited_by, \n edited_at, \n email, \n extra_perms, \n is_async, \n authentication_method AS \"authentication_method: _\", \n http_method AS \"http_method: _\", \n static_asset_config AS \"static_asset_config: _\", \n is_static_website,\n wrap_body,\n raw_string\n FROM http_trigger\n WHERE workspace_id = $1\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "workspace_id", + "type_info": "Varchar" + }, + { + "ordinal": 1, + "name": "workspaced_route", + "type_info": "Bool" + }, + { + "ordinal": 2, + "name": "path", + "type_info": "Varchar" + }, + { + "ordinal": 3, + "name": "route_path", + "type_info": "Varchar" + }, + { + "ordinal": 4, + "name": "route_path_key", + "type_info": "Varchar" + }, + { + "ordinal": 5, + "name": "authentication_resource_path", + "type_info": "Varchar" + }, + { + "ordinal": 6, + "name": "script_path", + "type_info": "Varchar" + }, + { + "ordinal": 7, + "name": "is_flow", + "type_info": "Bool" + }, + { + "ordinal": 8, + "name": "summary", + "type_info": "Varchar" + }, + { + "ordinal": 9, + "name": "description", + "type_info": "Text" + }, + { + "ordinal": 10, + "name": "edited_by", + "type_info": "Varchar" + }, + { + "ordinal": 11, + "name": "edited_at", + "type_info": "Timestamptz" + }, + { + "ordinal": 12, + "name": "email", + "type_info": "Varchar" + }, + { + "ordinal": 13, + "name": "extra_perms", + "type_info": "Jsonb" + }, + { + "ordinal": 14, + "name": "is_async", + "type_info": "Bool" + }, + { + "ordinal": 15, + "name": "authentication_method: _", + "type_info": { + "Custom": { + "name": "authentication_method", + "kind": { + "Enum": [ + "none", + "windmill", + "api_key", + "basic_http", + "custom_script", + "signature" + ] + } + } + } + }, + { + "ordinal": 16, + "name": "http_method: _", + "type_info": { + "Custom": { + "name": "http_method", + "kind": { + "Enum": [ + "get", + "post", + "put", + "delete", + "patch" + ] + } + } + } + }, + { + "ordinal": 17, + "name": "static_asset_config: _", + "type_info": "Jsonb" + }, + { + "ordinal": 18, + "name": "is_static_website", + "type_info": "Bool" + }, + { + "ordinal": 19, + "name": "wrap_body", + "type_info": "Bool" + }, + { + "ordinal": 20, + "name": "raw_string", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + false, + false, + false, + false, + false, + true, + false, + false, + true, + true, + false, + false, + false, + false, + false, + false, + false, + true, + false, + false, + false + ] + }, + "hash": "4228b098883408323bd8413ee094454b95962047458a6927d19ac0d3e7b3f0fa" +} diff --git a/backend/.sqlx/query-4dc21dda58758a84bbc1b7f9328efb9806223d1684c53907ff825bc0228ec18d.json b/backend/.sqlx/query-4dc21dda58758a84bbc1b7f9328efb9806223d1684c53907ff825bc0228ec18d.json new file mode 100644 index 0000000000..e0c5d2bb4c --- /dev/null +++ b/backend/.sqlx/query-4dc21dda58758a84bbc1b7f9328efb9806223d1684c53907ff825bc0228ec18d.json @@ -0,0 +1,35 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT \n path,\n summary,\n description\n FROM\n flow\n WHERE\n path ~ ANY($1) AND\n workspace_id = $2\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "path", + "type_info": "Varchar" + }, + { + "ordinal": 1, + "name": "summary", + "type_info": "Text" + }, + { + "ordinal": 2, + "name": "description", + "type_info": "Text" + } + ], + "parameters": { + "Left": [ + "TextArray", + "Text" + ] + }, + "nullable": [ + false, + false, + false + ] + }, + "hash": "4dc21dda58758a84bbc1b7f9328efb9806223d1684c53907ff825bc0228ec18d" +} diff --git a/backend/.sqlx/query-6b6aca712df657f81e74a438f6753bc72e787a3f768040c8c73ea86313badb71.json b/backend/.sqlx/query-6b6aca712df657f81e74a438f6753bc72e787a3f768040c8c73ea86313badb71.json new file mode 100644 index 0000000000..fe40dfd0cd --- /dev/null +++ b/backend/.sqlx/query-6b6aca712df657f81e74a438f6753bc72e787a3f768040c8c73ea86313badb71.json @@ -0,0 +1,55 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT\n route_path,\n http_method AS \"http_method: _\",\n is_async,\n workspaced_route\n FROM\n http_trigger\n WHERE\n path ~ ANY($1) AND\n route_path ~ ANY($2) AND\n workspace_id = $3\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "route_path", + "type_info": "Varchar" + }, + { + "ordinal": 1, + "name": "http_method: _", + "type_info": { + "Custom": { + "name": "http_method", + "kind": { + "Enum": [ + "get", + "post", + "put", + "delete", + "patch" + ] + } + } + } + }, + { + "ordinal": 2, + "name": "is_async", + "type_info": "Bool" + }, + { + "ordinal": 3, + "name": "workspaced_route", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [ + "TextArray", + "TextArray", + "Text" + ] + }, + "nullable": [ + false, + false, + false, + false + ] + }, + "hash": "6b6aca712df657f81e74a438f6753bc72e787a3f768040c8c73ea86313badb71" +} diff --git a/backend/.sqlx/query-714fb0f66ceb536aee8cb9ae0144757b999d25870fda37fe904e09dd5c742015.json b/backend/.sqlx/query-714fb0f66ceb536aee8cb9ae0144757b999d25870fda37fe904e09dd5c742015.json new file mode 100644 index 0000000000..9f3f4b0c8c --- /dev/null +++ b/backend/.sqlx/query-714fb0f66ceb536aee8cb9ae0144757b999d25870fda37fe904e09dd5c742015.json @@ -0,0 +1,93 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT\n route_path,\n http_method AS \"http_method: _\",\n is_async,\n workspaced_route,\n summary,\n description,\n authentication_method AS \"authentication_method: _\",\n authentication_resource_path\n FROM\n http_trigger\n WHERE\n path ~ ANY($1) AND\n route_path ~ ANY($2) AND\n workspace_id = $3\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "route_path", + "type_info": "Varchar" + }, + { + "ordinal": 1, + "name": "http_method: _", + "type_info": { + "Custom": { + "name": "http_method", + "kind": { + "Enum": [ + "get", + "post", + "put", + "delete", + "patch" + ] + } + } + } + }, + { + "ordinal": 2, + "name": "is_async", + "type_info": "Bool" + }, + { + "ordinal": 3, + "name": "workspaced_route", + "type_info": "Bool" + }, + { + "ordinal": 4, + "name": "summary", + "type_info": "Varchar" + }, + { + "ordinal": 5, + "name": "description", + "type_info": "Text" + }, + { + "ordinal": 6, + "name": "authentication_method: _", + "type_info": { + "Custom": { + "name": "authentication_method", + "kind": { + "Enum": [ + "none", + "windmill", + "api_key", + "basic_http", + "custom_script", + "signature" + ] + } + } + } + }, + { + "ordinal": 7, + "name": "authentication_resource_path", + "type_info": "Varchar" + } + ], + "parameters": { + "Left": [ + "TextArray", + "TextArray", + "Text" + ] + }, + "nullable": [ + false, + false, + false, + false, + true, + true, + false, + true + ] + }, + "hash": "714fb0f66ceb536aee8cb9ae0144757b999d25870fda37fe904e09dd5c742015" +} diff --git a/backend/.sqlx/query-d41df114e78873111e409e1182bccc0024acf17ce740f70d2243e5e2a2b25163.json b/backend/.sqlx/query-d41df114e78873111e409e1182bccc0024acf17ce740f70d2243e5e2a2b25163.json new file mode 100644 index 0000000000..febfc4c21f --- /dev/null +++ b/backend/.sqlx/query-d41df114e78873111e409e1182bccc0024acf17ce740f70d2243e5e2a2b25163.json @@ -0,0 +1,35 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT \n path,\n summary,\n description\n FROM\n script\n WHERE\n path ~ ANY($1) AND\n workspace_id = $2\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "path", + "type_info": "Varchar" + }, + { + "ordinal": 1, + "name": "summary", + "type_info": "Text" + }, + { + "ordinal": 2, + "name": "description", + "type_info": "Text" + } + ], + "parameters": { + "Left": [ + "TextArray", + "Text" + ] + }, + "nullable": [ + false, + false, + false + ] + }, + "hash": "d41df114e78873111e409e1182bccc0024acf17ce740f70d2243e5e2a2b25163" +} diff --git a/backend/.sqlx/query-ed99d4d088d0fd0c01f29803b12e99ae0a53d0b1feaa67737da409c51c1b6751.json b/backend/.sqlx/query-ed99d4d088d0fd0c01f29803b12e99ae0a53d0b1feaa67737da409c51c1b6751.json new file mode 100644 index 0000000000..a7ed7469d9 --- /dev/null +++ b/backend/.sqlx/query-ed99d4d088d0fd0c01f29803b12e99ae0a53d0b1feaa67737da409c51c1b6751.json @@ -0,0 +1,59 @@ +{ + "db_name": "PostgreSQL", + "query": "\n INSERT INTO http_trigger (\n workspace_id, \n path, \n route_path, \n route_path_key,\n workspaced_route,\n authentication_resource_path,\n wrap_body,\n raw_string,\n script_path, \n summary,\n description,\n is_flow, \n is_async, \n authentication_method, \n http_method, \n static_asset_config, \n edited_by, \n email, \n edited_at, \n is_static_website\n ) \n VALUES (\n $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, now(), $19\n )\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Varchar", + "Varchar", + "Varchar", + "Bool", + "Varchar", + "Bool", + "Bool", + "Varchar", + "Varchar", + "Text", + "Bool", + "Bool", + { + "Custom": { + "name": "authentication_method", + "kind": { + "Enum": [ + "none", + "windmill", + "api_key", + "basic_http", + "custom_script", + "signature" + ] + } + } + }, + { + "Custom": { + "name": "http_method", + "kind": { + "Enum": [ + "get", + "post", + "put", + "delete", + "patch" + ] + } + } + }, + "Jsonb", + "Varchar", + "Varchar", + "Bool" + ] + }, + "nullable": [] + }, + "hash": "ed99d4d088d0fd0c01f29803b12e99ae0a53d0b1feaa67737da409c51c1b6751" +} diff --git a/backend/Cargo.lock b/backend/Cargo.lock index d9c4efc80f..4ed3fa32fc 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -7297,6 +7297,16 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "libyml" +version = "0.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3302702afa434ffa30847a83305f0a69d6abd74293b6554c18ec85c7ef30c980" +dependencies = [ + "anyhow", + "version_check", +] + [[package]] name = "libz-rs-sys" version = "0.5.1" @@ -11311,6 +11321,21 @@ dependencies = [ "syn 2.0.103", ] +[[package]] +name = "serde_yml" +version = "0.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59e2dd588bf1597a252c3b920e0143eb99b0f76e4e082f4c92ce34fbc9e71ddd" +dependencies = [ + "indexmap 2.9.0", + "itoa", + "libyml", + "memchr", + "ryu", + "serde", + "version_check", +] + [[package]] name = "serdect" version = "0.2.0" @@ -14563,6 +14588,7 @@ dependencies = [ "rustls 0.23.28", "serde", "serde_json", + "serde_yml", "sha1", "sha2 0.10.9", "size", @@ -14628,6 +14654,7 @@ dependencies = [ "hmac", "http 1.3.1", "hyper 1.6.0", + "indexmap 2.9.0", "itertools 0.14.0", "jsonwebtoken 8.3.0", "lazy_static", @@ -14659,6 +14686,7 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", + "serde_yml", "sha1", "sha2 0.10.9", "sql-builder", @@ -14808,6 +14836,7 @@ dependencies = [ "tracing-loki", "tracing-opentelemetry", "tracing-subscriber", + "url", "uuid", "windmill-macros", "windmill-parser-py", diff --git a/backend/Cargo.toml b/backend/Cargo.toml index 2e0d88eb68..205c287b27 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -130,6 +130,7 @@ prometheus = { workspace = true, optional = true } uuid.workspace = true gethostname.workspace = true serde_json.workspace = true +serde_yml.workspace = true serde.workspace = true deno_core = { workspace = true, optional = true } object_store = { workspace = true, optional = true } @@ -201,6 +202,7 @@ tower-http = { version = "^0.6", features = ["trace", "cors"] } tower-cookies = "^0.10" serde = "^1" serde_json = { version = "^1", features = ["preserve_order", "raw_value"] } +serde_yml = "0.0.12" uuid = { version = "^1", features = ["serde", "v4"] } thiserror = "^2" anyhow = "^1" @@ -230,7 +232,7 @@ php-parser-rs = { git = "https://github.com/php-rust-tools/parser", rev = "ec4cb cron = "^0" mail-send = { version = "0.4.0", features = ["builder"], default-features=false } urlencoding = "^2" -url = "^2" +url = { version = "^2" , features = ["serde"]} async-oauth2 = "^0" reqwest = { version = "^0.12", features = ["json", "stream", "gzip"] } time = "^0" diff --git a/backend/ee-repo-ref.txt b/backend/ee-repo-ref.txt index cba1d055de..c41787fda1 100644 --- a/backend/ee-repo-ref.txt +++ b/backend/ee-repo-ref.txt @@ -1 +1 @@ -2c3e21f4573486628e0b8969ff478c237bd0283f +67e727c618cf673850a0887931c803241abfcfe8 \ No newline at end of file diff --git a/backend/migrations/20240917172503_job_routing.down.sql b/backend/migrations/20240917172503_job_routing.down.sql index 569385aa5a..15c3e17762 100644 --- a/backend/migrations/20240917172503_job_routing.down.sql +++ b/backend/migrations/20240917172503_job_routing.down.sql @@ -4,4 +4,4 @@ DROP TYPE http_method; ALTER TABLE script DROP COLUMN has_preprocessor; -DROP FUNCTION prevent_route_path_change(); \ No newline at end of file +DROP FUNCTION prevent_route_path_change(); \ No newline at end of file diff --git a/backend/migrations/20250607102516_add_description_and_summary_to_http_trigger.down.sql b/backend/migrations/20250607102516_add_description_and_summary_to_http_trigger.down.sql new file mode 100644 index 0000000000..597a95161d --- /dev/null +++ b/backend/migrations/20250607102516_add_description_and_summary_to_http_trigger.down.sql @@ -0,0 +1,4 @@ +-- Add down migration script here +ALTER TABLE http_trigger +DROP COLUMN summary, +DROP COLUMN description; \ No newline at end of file diff --git a/backend/migrations/20250607102516_add_description_and_summary_to_http_trigger.up.sql b/backend/migrations/20250607102516_add_description_and_summary_to_http_trigger.up.sql new file mode 100644 index 0000000000..4d51f6d07b --- /dev/null +++ b/backend/migrations/20250607102516_add_description_and_summary_to_http_trigger.up.sql @@ -0,0 +1,5 @@ +-- Add up migration script here +ALTER TABLE http_trigger +ADD COLUMN summary VARCHAR(512) NULL, +ADD COLUMN description TEXT NULL; + diff --git a/backend/windmill-api/Cargo.toml b/backend/windmill-api/Cargo.toml index 8017436a4a..7a715d7437 100644 --- a/backend/windmill-api/Cargo.toml +++ b/backend/windmill-api/Cargo.toml @@ -17,7 +17,7 @@ agent_worker_server = [] enterprise_saml = ["dep:samael", "dep:libxml"] benchmark = [] embedding = ["dep:tinyvector", "dep:hf-hub", "dep:tokenizers", "dep:candle-core", "dep:candle-transformers", "dep:candle-nn"] -parquet = ["dep:datafusion", "dep:object_store", "dep:url", "windmill-common/parquet", "windmill-worker/parquet"] +parquet = ["dep:datafusion", "dep:object_store", "windmill-common/parquet", "windmill-worker/parquet"] prometheus = ["windmill-common/prometheus", "windmill-queue/prometheus", "dep:prometheus", "windmill-worker/prometheus"] openidconnect = ["dep:openidconnect", "windmill-common/openidconnect"] tantivy = ["dep:windmill-indexer"] @@ -76,6 +76,7 @@ hex.workspace = true base64.workspace = true base32.workspace = true serde_urlencoded.workspace = true +serde_yml.workspace = true cron.workspace = true mime_guess.workspace = true rust-embed = { workspace = true, optional = true } @@ -102,6 +103,7 @@ prometheus = { workspace = true, optional = true } async_zip = { workspace = true, optional = true } regex.workspace = true bytes.workspace = true +url.workspace = true samael = { workspace = true, optional = true } libxml = { workspace = true, optional = true } async-recursion.workspace = true @@ -116,7 +118,6 @@ candle-nn = { workspace = true, optional = true} datafusion = { workspace = true, optional = true} object_store = { workspace = true, optional = true} openidconnect = { workspace = true, optional = true} -url = { workspace = true, optional = true} jsonwebtoken = { workspace = true } matchit = { workspace = true, optional = true } tokio-tungstenite = { workspace = true, optional = true} @@ -126,6 +127,7 @@ nkeys = { workspace = true, optional = true } const_format.workspace = true pin-project.workspace = true http.workspace = true +indexmap.workspace = true async-stream.workspace = true ulid.workspace = true rust-postgres = { workspace = true, optional = true } diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index 76d5884891..109378a88b 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -8451,6 +8451,51 @@ paths: "201": description: default error handler set + /w/{workspace}/openapi/generate: + post: + summary: generate openapi spec from http routes/webhook + operationId: generateOpenapiSpec + tags: + - openapi + parameters: + - $ref: "#/components/parameters/WorkspaceId" + requestBody: + description: openapi spec info and url + content: + application/json: + schema: + $ref: "#/components/schemas/GenerateOpenapiSpec" + responses: + "200": + description: openapi spec + content: + text/plain: + schema: + type: string + + /w/{workspace}/openapi/download: + post: + summary: Download the OpenAPI v3.1 spec as a file + operationId: DownloadOpenapiSpec + tags: + - openapi + parameters: + - $ref: "#/components/parameters/WorkspaceId" + requestBody: + description: openapi spec info and url + content: + application/json: + schema: + $ref: "#/components/schemas/GenerateOpenapiSpec" + responses: + "200": + description: Downloaded OpenAPI spec + content: + application/octet-stream: + schema: + type: string + format: binary + /w/{workspace}/http_triggers/create_many: post: summary: create many HTTP triggers @@ -14754,6 +14799,106 @@ components: - custom_script - signature + RunnableKind: + type: string + enum: + - script + - flow + + OpenapiSpecFormat: + type: string + enum: + - yaml + - json + + OpenapiHttpRouteFilters: + type: object + properties: + folder_regex: + type: string + path_regex: + type: string + route_path_regex: + type: string + required: + - folder_regex + - path_regex + - route_path_regex + + WebhookFilters: + type: object + properties: + user_or_folder_regex: + type: string + enum: + - "*" + - u + - f + user_or_folder_regex_value: + type: string + path: + type: string + runnable_kind: + $ref: "#/components/schemas/RunnableKind" + required: + - user_or_folder_regex + - user_or_folder_regex_value + - path + - runnable_kind + + OpenapiV3Info: + type: object + properties: + title: + type: string + version: + type: string + description: + type: string + terms_of_service: + type: string + contact: + type: object + properties: + name: + type: string + url: + type: string + email: + type: string + license: + type: object + properties: + name: + type: string + identifier: + type: string + url: + type: string + required: + - name + required: + - title + - version + + GenerateOpenapiSpec: + type: object + properties: + info: + $ref: "#/components/schemas/OpenapiV3Info" + url: + type: string + openapi_spec_format: + $ref: "#/components/schemas/OpenapiSpecFormat" + http_route_filters: + type: array + items: + $ref: "#/components/schemas/OpenapiHttpRouteFilters" + webhook_filters: + type: array + items: + $ref: "#/components/schemas/WebhookFilters" + HttpMethod: type: string enum: @@ -14785,6 +14930,10 @@ components: $ref: "#/components/schemas/HttpMethod" authentication_resource_path: type: string + summary: + type: string + description: + type: string is_async: type: boolean authentication_method: @@ -14819,6 +14968,10 @@ components: type: string workspaced_route: type: boolean + summary: + type: string + description: + type: string static_asset_config: type: object properties: @@ -14866,6 +15019,10 @@ components: type: string route_path: type: string + summary: + type: string + description: + type: string workspaced_route: type: boolean static_asset_config: diff --git a/backend/windmill-api/src/apps.rs b/backend/windmill-api/src/apps.rs index 9dfe40b5b9..befe569229 100644 --- a/backend/windmill-api/src/apps.rs +++ b/backend/windmill-api/src/apps.rs @@ -12,7 +12,7 @@ use crate::{ db::{ApiAuthed, DB}, resources::get_resource_value_interpolated_internal, users::{require_owner_of_path, OptAuthed}, - utils::{RunnableKind, WithStarredInfoQuery}, + utils::WithStarredInfoQuery, webhook_util::{WebhookMessage, WebhookShared}, HTTP_CLIENT, }; @@ -59,7 +59,7 @@ use windmill_common::{ users::username_to_permissioned_as, utils::{ http_get_from_hub, not_found_if_none, paginate, query_elems_from_hub, require_admin, - Pagination, StripPath, + Pagination, RunnableKind, StripPath, }, variables::{build_crypt, build_crypt_with_key_suffix, encrypt}, worker::{to_raw_value, CLOUD_HOSTED}, diff --git a/backend/windmill-api/src/auth.rs b/backend/windmill-api/src/auth.rs index 6af5ea1e50..954fcad43c 100644 --- a/backend/windmill-api/src/auth.rs +++ b/backend/windmill-api/src/auth.rs @@ -34,10 +34,11 @@ lazy_static::lazy_static! { // Global function to invalidate a specific token from cache pub fn invalidate_token_from_cache(token: &str) { // Remove all cache entries for this token (across all workspaces) - AUTH_CACHE.retain(|(_workspace_id, cached_token), _cached_value| { - cached_token != token - }); - tracing::info!("Invalidated token from auth cache: {}...", &token[..token.len().min(8)]); + AUTH_CACHE.retain(|(_workspace_id, cached_token), _cached_value| cached_token != token); + tracing::info!( + "Invalidated token from auth cache: {}...", + &token[..token.len().min(8)] + ); } #[derive(Clone)] @@ -482,6 +483,27 @@ where } } +fn maybe_get_workspace_id_from_path(path_vec: &[&str]) -> Option { + let workspace_id = if path_vec.len() >= 4 && path_vec[0] == "" && path_vec[2] == "w" { + Some(path_vec[3].to_owned()) + } else if path_vec.len() >= 5 + && path_vec[0] == "" + && path_vec[1] == "api" + && path_vec[2] == "mcp" + && path_vec[3] == "w" + { + Some(path_vec[4].to_owned()) + } else { + if path_vec.len() >= 5 && path_vec[0] == "" && path_vec[2] == "srch" && path_vec[3] == "w" { + Some(path_vec[4].to_owned()) + } else { + None + } + }; + + workspace_id +} + #[async_trait] impl FromRequestParts for ApiAuthed where @@ -494,85 +516,62 @@ where state: &S, ) -> std::result::Result { if parts.method == http::Method::OPTIONS { - return Ok(ApiAuthed { - email: "".to_owned(), - username: "".to_owned(), - is_admin: false, - is_operator: false, - groups: Vec::new(), - folders: Vec::new(), - scopes: None, - username_override: None, - }); + return Ok(ApiAuthed::default()); }; let already_authed = parts.extensions.get::(); - if let Some(authed) = already_authed { - Ok(authed.clone()) - } else { - let already_tokened = parts.extensions.get::(); - let token_o = if let Some(token) = already_tokened { - Some(token.token.clone()) - } else { - extract_token(parts, state).await - }; - let original_uri = OriginalUri::from_request_parts(parts, state) - .await - .ok() - .map(|x| x.0) - .unwrap_or_default(); - let path_vec: Vec<&str> = original_uri.path().split("/").collect(); - let workspace_id = if path_vec.len() >= 4 && path_vec[0] == "" && path_vec[2] == "w" { - Some(path_vec[3].to_owned()) - } else if path_vec.len() >= 5 - && path_vec[0] == "" - && path_vec[1] == "api" - && path_vec[2] == "mcp" - && path_vec[3] == "w" - { - Some(path_vec[4].to_string()) - } else { - if path_vec.len() >= 5 - && path_vec[0] == "" - && path_vec[2] == "srch" - && path_vec[3] == "w" - { - Some(path_vec[4].to_string()) - } else { - None - } - }; - if let Some(token) = token_o { - if let Ok(Extension(cache)) = - Extension::>::from_request_parts(parts, state).await - { - if let Some(authed) = cache.get_authed(workspace_id.clone(), &token).await { - parts.extensions.insert(authed.clone()); - if authed.scopes.as_ref().is_some_and(|scopes| { - scopes - .iter() - .any(|s| s.starts_with("jobs:") || s.starts_with("run:")) - }) && (path_vec.len() < 3 - || (path_vec[4] != "jobs" && path_vec[4] != "jobs_u")) - { - BRUTE_FORCE_COUNTER.increment().await; - return Err(( - StatusCode::UNAUTHORIZED, - format!("Unauthorized scoped token: {:?}", authed.scopes), - )); - } - Span::current().record("username", &authed.username.as_str()); - Span::current().record("email", &authed.email); - if let Some(workspace_id) = workspace_id { - Span::current().record("workspace_id", &workspace_id); - } - return Ok(authed); + if let Some(authed) = already_authed { + return Ok(authed.clone()); + } + + let already_tokened = parts.extensions.get::(); + let token_o = if let Some(token) = already_tokened { + Some(token.token.clone()) + } else { + extract_token(parts, state).await + }; + + if let Some(token) = token_o { + if let Ok(Extension(cache)) = + Extension::>::from_request_parts(parts, state).await + { + let original_uri = OriginalUri::from_request_parts(parts, state) + .await + .ok() + .map(|x| x.0) + .unwrap_or_default(); + let path_vec: Vec<&str> = original_uri.path().split("/").collect(); + let workspace_id = maybe_get_workspace_id_from_path(&path_vec); + + if let Some(authed) = cache.get_authed(workspace_id.clone(), &token).await { + if authed.scopes.as_ref().is_some_and(|scopes| { + scopes + .iter() + .any(|s| s.starts_with("jobs:") || s.starts_with("run:")) + }) && (path_vec.len() < 3 + || (path_vec[4] != "jobs" && path_vec[4] != "jobs_u")) + { + BRUTE_FORCE_COUNTER.increment().await; + return Err(( + StatusCode::UNAUTHORIZED, + format!("Unauthorized scoped token: {:?}", authed.scopes), + )); } + + parts.extensions.insert(authed.clone()); + + Span::current().record("username", &authed.username.as_str()); + Span::current().record("email", &authed.email); + + if let Some(workspace_id) = workspace_id { + Span::current().record("workspace_id", &workspace_id); + } + return Ok(authed); } } - BRUTE_FORCE_COUNTER.increment().await; - Err((StatusCode::UNAUTHORIZED, "Unauthorized".to_owned())) } + BRUTE_FORCE_COUNTER.increment().await; + Err((StatusCode::UNAUTHORIZED, "Unauthorized".to_owned())) } } diff --git a/backend/windmill-api/src/capture.rs b/backend/windmill-api/src/capture.rs index 0c2d9f3946..54ad2c35d4 100644 --- a/backend/windmill-api/src/capture.rs +++ b/backend/windmill-api/src/capture.rs @@ -64,7 +64,6 @@ use crate::{ args::RawWebhookArgs, db::{ApiAuthed, DB}, users::fetch_api_authed, - utils::RunnableKind, }; use axum::{ @@ -82,7 +81,7 @@ use windmill_common::{ db::UserDB, error::{JsonResult, Result}, triggers::{RunnableFormat, RunnableFormatVersion, TriggerKind}, - utils::{not_found_if_none, paginate, Pagination, StripPath}, + utils::{not_found_if_none, paginate, Pagination, RunnableKind, StripPath}, worker::{to_raw_value, CLOUD_HOSTED}, }; diff --git a/backend/windmill-api/src/db.rs b/backend/windmill-api/src/db.rs index c8f76dd817..b70532a8a9 100644 --- a/backend/windmill-api/src/db.rs +++ b/backend/windmill-api/src/db.rs @@ -815,7 +815,7 @@ async fn fix_job_completed_index(db: &DB) -> Result<(), Error> { Ok(()) } -#[derive(Clone, Debug, Hash, Eq, PartialEq)] +#[derive(Clone, Debug, Default, Hash, Eq, PartialEq)] pub struct ApiAuthed { pub email: String, pub username: String, diff --git a/backend/windmill-api/src/flows.rs b/backend/windmill-api/src/flows.rs index 5d1d772911..e8ebe6ccc5 100644 --- a/backend/windmill-api/src/flows.rs +++ b/backend/windmill-api/src/flows.rs @@ -12,7 +12,7 @@ use crate::db::ApiAuthed; use crate::triggers::{ get_triggers_count_internal, list_tokens_internal, TriggersCount, TruncatedTokenWithEmail, }; -use crate::utils::{RunnableKind, WithStarredInfoQuery}; +use crate::utils::WithStarredInfoQuery; use crate::{ db::DB, schedule::clear_schedule, @@ -43,7 +43,7 @@ use windmill_common::{ jobs::JobPayload, schedule::Schedule, scripts::Schema, - utils::{http_get_from_hub, not_found_if_none, paginate, Pagination, StripPath}, + utils::{http_get_from_hub, not_found_if_none, paginate, Pagination, RunnableKind, StripPath}, }; use windmill_git_sync::{handle_deployment_metadata, DeployedObject}; use windmill_queue::{push, schedule::push_scheduled_job, PushIsolationLevel}; diff --git a/backend/windmill-api/src/http_trigger_auth.rs b/backend/windmill-api/src/http_trigger_auth.rs index c197dcc9b0..85288d87b8 100644 --- a/backend/windmill-api/src/http_trigger_auth.rs +++ b/backend/windmill-api/src/http_trigger_auth.rs @@ -441,8 +441,8 @@ pub struct BasicAuthAuthentication { #[derive(Debug, Serialize, Deserialize, Clone)] pub struct ApiKeyAuthentication { - api_key_header: String, - api_key_secret: String, + pub api_key_header: String, + pub api_key_secret: String, } #[derive(Debug, Eq, PartialEq, Hash, Clone, Copy, Serialize, Deserialize)] diff --git a/backend/windmill-api/src/http_triggers.rs b/backend/windmill-api/src/http_triggers.rs index 22a534d1ef..a42bdcac53 100644 --- a/backend/windmill-api/src/http_triggers.rs +++ b/backend/windmill-api/src/http_triggers.rs @@ -44,7 +44,7 @@ use windmill_common::{ error::{self, JsonResult}, s3_helpers::S3Object, triggers::TriggerKind, - utils::{not_found_if_none, paginate, require_admin, Pagination, StripPath}, + utils::{empty_as_none, not_found_if_none, paginate, require_admin, Pagination, StripPath}, worker::CLOUD_HOSTED, }; use windmill_git_sync::handle_deployment_metadata; @@ -114,6 +114,8 @@ struct NewTrigger { static_asset_config: Option>, http_method: HttpMethod, workspaced_route: Option, + summary: Option, + description: Option, is_static_website: bool, wrap_body: Option, raw_string: Option, @@ -134,6 +136,8 @@ pub struct HttpTrigger { pub is_async: bool, pub authentication_method: AuthenticationMethod, pub http_method: HttpMethod, + pub summary: Option, + pub description: Option, #[serde(skip_serializing_if = "Option::is_none")] pub static_asset_config: Option>, pub is_static_website: bool, @@ -153,6 +157,8 @@ struct EditTrigger { authentication_method: AuthenticationMethod, #[serde(deserialize_with = "non_empty_str")] authentication_resource_path: Option, + summary: Option, + description: Option, http_method: HttpMethod, static_asset_config: Option>, workspaced_route: Option, @@ -167,6 +173,7 @@ pub struct ListTriggerQuery { pub per_page: Option, pub path: Option, pub is_flow: Option, + #[serde(default, deserialize_with = "empty_as_none")] pub path_start: Option, } @@ -188,6 +195,8 @@ async fn list_triggers( "wrap_body", "raw_string", "script_path", + "summary", + "description", "is_flow", "http_method", "edited_by", @@ -242,6 +251,8 @@ async fn get_trigger( route_path_key, workspaced_route, script_path, + summary, + description, is_flow, http_method as "http_method: _", edited_by, @@ -317,6 +328,8 @@ async fn create_trigger_inner( wrap_body, raw_string, script_path, + summary, + description, is_flow, is_async, authentication_method, @@ -328,7 +341,7 @@ async fn create_trigger_inner( is_static_website ) VALUES ( - $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, now(), $17 + $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, now(), $19 ) "#, w_id, @@ -340,6 +353,8 @@ async fn create_trigger_inner( new_http_trigger.wrap_body.unwrap_or(false), new_http_trigger.raw_string.unwrap_or(false), new_http_trigger.script_path, + new_http_trigger.summary, + new_http_trigger.description, new_http_trigger.is_flow, new_http_trigger.is_async, new_http_trigger.authentication_method as _, @@ -375,7 +390,11 @@ fn check_no_duplicates<'trigger>( let mut seen = HashSet::with_capacity(new_http_triggers.len()); for (i, trigger) in new_http_triggers.iter().enumerate() { - if !seen.insert((&route_path_key[i], trigger.http_method, trigger.workspaced_route)) { + if !seen.insert(( + &route_path_key[i], + trigger.http_method, + trigger.workspaced_route, + )) { return Err(Error::BadRequest(format!( "Duplicate HTTP route detected: '{}'. Each HTTP route must have a unique 'route_path'.", &trigger.route_path @@ -594,11 +613,13 @@ async fn update_trigger( email = $13, is_async = $14, authentication_method = $15, + summary = $16, + description = $17, edited_at = now(), - is_static_website = $16 + is_static_website = $18 WHERE - workspace_id = $17 AND - path = $18 + workspace_id = $19 AND + path = $20 "#, route_path, &route_path_key, @@ -615,6 +636,8 @@ async fn update_trigger( &authed.email, ct.is_async, ct.authentication_method as _, + ct.summary, + ct.description, ct.is_static_website, w_id, path, @@ -1147,8 +1170,8 @@ async fn route_job( .map_err(|e| e.into_response())?; if trigger.script_path.is_empty() && trigger.static_asset_config.is_none() { - return Err(Error::BadRequest(format!( - "Script path of HTTP route at path: {} must not be empty", + return Err(Error::NotFound(format!( + "Runnable path of HTTP route at path: {}", trigger.path )) .into_response()); @@ -1198,7 +1221,7 @@ async fn route_job( let auth_method = try_get_resource_from_db_as::< crate::http_trigger_auth::AuthenticationMethod, >( - authed.clone(), + &authed, Some(user_db.clone()), &db, &resource_path, diff --git a/backend/windmill-api/src/lib.rs b/backend/windmill-api/src/lib.rs index 3eb1b9d183..a415803339 100644 --- a/backend/windmill-api/src/lib.rs +++ b/backend/windmill-api/src/lib.rs @@ -103,6 +103,8 @@ mod integration; #[cfg(feature = "postgres_trigger")] mod postgres_triggers; +pub mod openapi; + mod approvals; #[cfg(all(feature = "enterprise", feature = "private"))] pub mod apps_ee; @@ -595,6 +597,7 @@ pub async fn run_server( .nest("/variables", variables::workspaced_service()) .nest("/workspaces", workspaces::workspaced_service()) .nest("/oidc", oidc_oss::workspaced_service()) + .nest("/openapi", openapi::openapi_service()) .nest("/http_triggers", http_triggers_service) .nest("/websocket_triggers", websocket_triggers_service) .nest("/kafka_triggers", kafka_triggers_service) diff --git a/backend/windmill-api/src/mqtt_triggers.rs b/backend/windmill-api/src/mqtt_triggers.rs index 70b78ca913..7cc3f3c4e0 100644 --- a/backend/windmill-api/src/mqtt_triggers.rs +++ b/backend/windmill-api/src/mqtt_triggers.rs @@ -478,7 +478,7 @@ pub async fn test_mqtt_connection( test_postgres; let mqtt_resource = try_get_resource_from_db_as::( - authed, + &authed, Some(user_db), &db, &mqtt_resource_path, @@ -1253,7 +1253,7 @@ impl MqttConfig { } } let mqtt_resource = try_get_resource_from_db_as::( - authed, + &authed, Some(UserDB::new(db.clone())), db, mqtt_resource_path, diff --git a/backend/windmill-api/src/openapi.rs b/backend/windmill-api/src/openapi.rs new file mode 100644 index 0000000000..c0e1d046b6 --- /dev/null +++ b/backend/windmill-api/src/openapi.rs @@ -0,0 +1,984 @@ +use std::{ + collections::{HashMap, HashSet}, + fmt::Display, +}; + +use anyhow::anyhow; +use axum::{ + body::Body, extract::Path, http, response::Response, routing::post, Extension, Json, Router, +}; +use http::{header, HeaderValue, Method, StatusCode}; +use indexmap::IndexMap; +use itertools::Itertools; +use serde::{Deserialize, Serialize}; +use serde_json::{to_value, Map, Value}; +use sqlx::PgConnection; +use url::Url; +use windmill_common::{ + db::UserDB, + error::{Error, Result}, + utils::{deserialize_url, empty_as_none, is_empty, RunnableKind}, + DB, +}; + +use crate::db::ApiAuthed; + +#[cfg(feature = "http_trigger")] +use crate::{ + http_trigger_args::HttpMethod, http_trigger_auth::ApiKeyAuthentication, + http_triggers::AuthenticationMethod, resources::try_get_resource_from_db_as, +}; + +lazy_static::lazy_static! { + static ref DEFAULT_OPENAPI_INFO_OBJECT: Info = Info { + title: "Windmill API".to_string(), + version: "1.0.0".to_string(), + ..Default::default() + }; +} + +const DEFAULT_OPENAPI_GENERATED_VERSION: &'static str = "3.1.0"; +const JWT_SECURITY_SCHEME: &'static str = "JwtAuth"; +const BASIC_HTTP_AUTH_SCHEME: &'static str = "BasicHttp"; + +const DEFAULT_REQUEST_KEY: &'static str = "defaultRequest"; +const DEFAULT_ASYNC_RESPONSE_KEY: &'static str = "AsyncResponse"; +const DEFAULT_SYNC_RESPONSE_KEY: &'static str = "SyncResponse"; +const DEFAULT_PAYLOAD_PARAM_KEY: &'static str = "PayloadParam"; + +pub fn openapi_service() -> Router { + Router::new() + .route("/generate", post(generate_openapi_spec)) + .route("/download", post(download_spec)) +} + +#[derive(Debug, Deserialize, Clone, Copy)] +#[serde(rename_all = "lowercase")] +pub enum Format { + JSON, + YAML, +} + +impl Display for Format { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let format = match self { + Format::JSON => "json", + Format::YAML => "yaml", + }; + write!(f, "{}", format) + } +} + +impl Default for Format { + fn default() -> Self { + Self::YAML + } +} + +#[derive(Debug, Default, Deserialize, Serialize)] +struct Contact { + #[serde(skip_serializing_if = "is_empty")] + name: Option, + #[serde( + default, + deserialize_with = "deserialize_url", + skip_serializing_if = "Option::is_none" + )] + url: Option, + #[serde(skip_serializing_if = "is_empty")] + email: Option, +} + +#[derive(Debug, Default, Deserialize, Serialize)] +struct License { + name: String, + #[serde(skip_serializing_if = "is_empty")] + identifier: Option, + #[serde( + default, + deserialize_with = "deserialize_url", + skip_serializing_if = "Option::is_none" + )] + url: Option, +} + +#[derive(Debug, Default, Deserialize, Serialize)] +pub struct Info { + title: String, + version: String, + #[serde(skip_serializing_if = "is_empty")] + description: Option, + #[serde(skip_serializing_if = "Option::is_none")] + contact: Option, + #[serde(skip_serializing_if = "Option::is_none")] + license: Option, +} + +#[derive(Debug, Serialize, Deserialize)] +struct Server { + url: String, + #[serde(skip_serializing_if = "is_empty")] + description: Option, + #[serde(skip_serializing_if = "Option::is_none")] + variables: Option>, +} + +#[derive(Debug)] +pub enum SecurityScheme { + BearerJwt, + BasicHttp, + ApiKey(String), +} +#[derive(Debug)] +pub struct WebhookConfig { + runnable_kind: RunnableKind, +} + +impl WebhookConfig { + pub fn new(runnable_kind: RunnableKind) -> Self { + Self { runnable_kind } + } +} + +#[derive(Debug)] +pub struct HttpRouteConfig { + method: Method, +} + +impl HttpRouteConfig { + pub fn new(method: Method) -> Self { + Self { method } + } +} + +#[derive(Debug)] +pub enum Kind { + Webhook(WebhookConfig), + HttpRoute(HttpRouteConfig), +} + +#[derive(Debug)] +pub struct FuturePath { + route_path: String, + kind: Kind, + is_async: Option, + summary: Option, + description: Option, + security_scheme: Option, +} + +impl FuturePath { + pub fn new( + route_path: String, + kind: Kind, + is_async: Option, + summary: Option, + description: Option, + security_scheme: Option, + ) -> FuturePath { + FuturePath { route_path, kind, is_async, summary, description, security_scheme } + } +} + +fn from_route_path_to_openapi_path( + route_path: &str, + kind: &Kind, +) -> Result<(Vec, Option)> { + let mut openapi_path = String::new(); + let mut parameters = Vec::new(); + + for segment in route_path.split('/') { + if segment.starts_with(':') { + let param_name = &segment[1..]; + + if param_name.is_empty() { + return Err(anyhow!("Empty parameter name in path: {}", route_path).into()); + } + + openapi_path.push_str(&format!("/{{{}}}", param_name)); + parameters.push(serde_json::json!({ + "name": param_name, + "in": "path", + "required": true, + "schema": { "type": "string" } + })); + } else if !segment.is_empty() { + openapi_path.push('/'); + openapi_path.push_str(segment); + } else { + openapi_path.push('/'); + } + } + + let parameters_json = if parameters.is_empty() { + None + } else { + Some(Value::Array(parameters)) + }; + + let prefix = match kind { + Kind::HttpRoute(_) => "", + Kind::Webhook(WebhookConfig { runnable_kind }) => match runnable_kind { + RunnableKind::Script => "p", + RunnableKind::Flow => "f", + }, + }; + + let normalized_path = if openapi_path.starts_with('/') { + format!("{prefix}{openapi_path}") + } else { + format!("{}/{}", prefix, openapi_path) + }; + + let route_paths = if prefix.is_empty() { + vec![normalized_path] + } else { + vec![ + format!("/run/{}", &normalized_path), + format!("/run_wait_result/{}", &normalized_path), + ] + }; + + Ok((route_paths, parameters_json)) +} + +fn get_servers_component(url: &str, kind: &Kind) -> Server { + let url = url.trim_end_matches('/'); + + let server = match kind { + Kind::HttpRoute(_) => { + Server { url: format!("{}/api/r", url), description: None, variables: None } + } + Kind::Webhook(_) => Server { + url: format!("{}/api/w/{{workspace}}/jobs", url), + variables: Some(HashMap::from([( + "workspace".to_string(), + serde_json::json!({ + "default": "test", + "description": "Workspace identifier" + }), + )])), + description: None, + }, + }; + + server +} + +fn generate_paths( + paths: Vec, + url: Option<&Url>, +) -> Result>> { + let mut map: IndexMap> = IndexMap::new(); + + let generate_default_request = || { + serde_json::json!({ + "$ref": format!("#/components/requestBodies/{DEFAULT_REQUEST_KEY}") + }) + }; + + let generate_response = |is_async: bool| { + let responses = if is_async { + serde_json::json!({ + "200": { + "$ref": format!("#/components/responses/{DEFAULT_ASYNC_RESPONSE_KEY}") + } + }) + } else { + serde_json::json!(serde_json::json!({ + "200": { + "$ref": format!("#/components/responses/{DEFAULT_SYNC_RESPONSE_KEY}") + } + })) + }; + + responses + }; + + let get_security_scheme = |security_scheme: Option<&SecurityScheme>| -> Vec { + if let Some(security_scheme) = security_scheme { + let scheme = match security_scheme { + SecurityScheme::ApiKey(api_key) => header_to_pascal_case(&api_key), + SecurityScheme::BearerJwt => JWT_SECURITY_SCHEME.to_owned(), + SecurityScheme::BasicHttp => BASIC_HTTP_AUTH_SCHEME.to_owned(), + }; + + vec![serde_json::json!({ + scheme: [] + })] + } else { + vec![] + } + }; + + let mut duplicate_webhooks = HashSet::new(); + + for path in paths { + let (route_paths, parameters) = + from_route_path_to_openapi_path(&path.route_path, &path.kind)?; + + for route_path in route_paths { + let path_object = map.entry(route_path.clone()).or_insert_with(|| { + let mut path_object = IndexMap::new(); + + if let Some(url) = url { + let servers = get_servers_component(url.as_str(), &path.kind); + path_object.insert("servers".to_string(), to_value(vec![servers]).unwrap()); + } + + if parameters.is_some() { + path_object.insert( + "parameters".to_string(), + to_value(parameters.clone()).unwrap(), + ); + } + + path_object + }); + + let is_async; + + let (methods, is_webhook) = match &path.kind { + Kind::Webhook(_) => { + if !duplicate_webhooks.insert(route_path.clone()) { + return Err(anyhow!("Found duplicate webhook: {}", path.route_path).into()); + } + is_async = route_path.starts_with("/run/"); + let methods = if is_async { + vec![Method::POST] + } else { + vec![Method::GET, Method::POST] + }; + + (methods, true) + } + Kind::HttpRoute(HttpRouteConfig { method }) => { + if path_object.get(&method.to_string()).is_some() { + return Err(anyhow!("Found duplicate route: {}", path.route_path).into()); + } + is_async = path.is_async.unwrap_or(true); + (vec![method.to_owned()], false) + } + }; + + for method in methods { + let mut method_map = IndexMap::new(); + + if let Some(summary) = path.summary.as_ref().filter(|s| !s.is_empty()) { + method_map.insert("summary", Value::String(summary.to_owned())); + } + + if let Some(description) = path.description.as_ref().filter(|s| !s.is_empty()) { + method_map.insert("description", Value::String(description.to_owned())); + } + + method_map.insert( + "security", + to_value(get_security_scheme(path.security_scheme.as_ref()))?, + ); + + if method != Method::GET { + method_map.insert("requestBody", generate_default_request()); + } else if is_webhook { + method_map.insert( + "parameters", + Value::Array(vec![serde_json::json!({ + "$ref": format!("#/components/parameters/{DEFAULT_PAYLOAD_PARAM_KEY}") + })]), + ); + } + + method_map.insert("responses", generate_response(is_async)); + + path_object.insert(method.to_string().to_lowercase(), to_value(&method_map)?); + } + } + } + + return Ok(map); +} + +pub fn transform_to_minified_postgres_regex(glob: &str) -> String { + let mut regex = String::from("^"); + for ch in glob.chars() { + match ch { + '*' => regex.push_str(".*"), + '.' | '+' | '(' | ')' | '|' | '^' | '$' | '{' | '}' | '[' | ']' | '\\' => { + regex.push('\\'); + regex.push(ch); + } + _ => regex.push(ch), + } + } + + regex.push('$'); + regex +} + +#[derive(Debug, Default)] +pub struct ServerToSet { + pub http_route: bool, + pub webhook_flow: bool, + pub webhook_script: bool, +} + +impl ServerToSet { + pub fn new(http_route: bool, webhook_flow: bool, webhook_script: bool) -> ServerToSet { + ServerToSet { http_route, webhook_flow, webhook_script } + } +} + +fn header_to_pascal_case(header: &str) -> String { + header + .split(|c: char| c == '-' || c == '_' || c == ' ') + .filter(|s| !s.is_empty()) + .map(|s| { + let mut chars = s.chars(); + match chars.next() { + Some(first) => { + first.to_ascii_uppercase().to_string() + + chars.as_str().to_ascii_lowercase().as_str() + } + None => String::new(), + } + }) + .collect::() +} + +#[derive(Debug, Default)] +struct SecuritySchemeToAdd { + basic_http: bool, + bearer_jwt: bool, + api_keys: Vec<(String, Value)>, +} + +fn generate_all_security_schemes(future_paths: &[FuturePath]) -> SecuritySchemeToAdd { + let mut to_add = SecuritySchemeToAdd::default(); + + let mut set = HashSet::new(); + for future_path in future_paths { + if !to_add.basic_http + && matches!(future_path.security_scheme, Some(SecurityScheme::BasicHttp)) + { + to_add.basic_http = true + } else if !to_add.bearer_jwt + && matches!(future_path.security_scheme, Some(SecurityScheme::BearerJwt)) + { + to_add.bearer_jwt = true + } else if let Some(SecurityScheme::ApiKey(api_key)) = future_path.security_scheme.as_ref() { + let pascal_case_header = header_to_pascal_case(&api_key); + + if !set.insert(pascal_case_header.clone()) { + continue; + } + + let scheme = serde_json::json!({ + "type": "apiKey", + "in": "header", + "name": api_key + }); + to_add.api_keys.push((pascal_case_header, scheme)); + } + } + + to_add +} + +fn generate_components(future_paths: &[FuturePath]) -> Map { + let mut components = Map::new(); + + if future_paths + .iter() + .any(|path| matches!(path.kind, Kind::Webhook(_))) + { + components.insert( + "parameters".to_owned(), + serde_json::json!({ + "PayloadParam": { + "name": "payload", + "in": "query", + "required": true, + "description": "A URL-safe base64-encoded JSON string payload.", + "schema": { + "type": "string" + } + } + }), + ); + } + + { + let mut security_scheme = Map::new(); + + let SecuritySchemeToAdd { basic_http, bearer_jwt, api_keys } = + generate_all_security_schemes(future_paths); + + if basic_http { + security_scheme.insert( + BASIC_HTTP_AUTH_SCHEME.to_owned(), + serde_json::json!({ + "type": "http", + "scheme": "basic" + }), + ); + } + + if bearer_jwt { + security_scheme.insert( + JWT_SECURITY_SCHEME.to_owned(), + serde_json::json!({ + "type": "http", + "scheme": "bearer", + "bearerFormat": "JWT" + }), + ); + } + + for (key, value) in api_keys { + security_scheme.insert(key, value); + } + components.insert("securitySchemes".to_owned(), Value::Object(security_scheme)); + } + + components.insert("requestBodies".to_owned(), serde_json::json!({ + DEFAULT_REQUEST_KEY: { + "description": "This route may or may not require a request body, but its structure and content type are unknown.", + "required": false, + "content": { + "application/json": {} + } + } + })); + + components.insert("responses".to_owned(), serde_json::json!({ + DEFAULT_ASYNC_RESPONSE_KEY: { + "description": "Returns a job ID as a UUID string.", + "content": { + "text/plain": { + "schema": { + "type": "string", + "format": "uuid", + "examples": [ "550e8400-e29b-41d4-a716-446655440000" ] + } + } + } + }, + DEFAULT_SYNC_RESPONSE_KEY: { + "description": "This route may return a response, but its structure and content type are unknown.", + "content": { + "application/octet-stream": {} + } + }, + + })); + + components +} + +pub fn generate_openapi_document( + info: Option<&Info>, + url: Option<&Url>, + paths: Vec, + format: Format, +) -> Result { + let mut openapi_doc: IndexMap<&'static str, Value> = IndexMap::new(); + + openapi_doc.insert("openapi", to_value(&DEFAULT_OPENAPI_GENERATED_VERSION)?); + openapi_doc.insert( + "info", + to_value(info.unwrap_or(&DEFAULT_OPENAPI_INFO_OBJECT))?, + ); + + openapi_doc.insert("components", Value::Object(generate_components(&paths))); + + openapi_doc.insert("paths", to_value(generate_paths(paths, url)?)?); + + let openapi_document = match format { + Format::YAML => serde_yml::to_string(&openapi_doc).map_err(|err| { + anyhow!( + "Could not generate OpenAPI document in YAML format: {}", + err + ) + })?, + Format::JSON => serde_json::to_string_pretty(&openapi_doc).map_err(|err| { + anyhow!( + "Could not generate OpenAPI document in JSON format: {}", + err + ) + })?, + }; + + Ok(openapi_document) +} + +#[allow(unused)] +#[derive(Debug, Deserialize)] +struct HttpRouteFilter { + folder_regex: String, + path_regex: String, + route_path_regex: String, +} + +#[derive(Debug, Deserialize)] +struct WebhookFilter { + user_or_folder_regex: String, + user_or_folder_regex_value: String, + path: String, + runnable_kind: RunnableKind, +} + +#[derive(Debug, Deserialize)] +struct GenerateOpenAPI { + info: Option, + url: Option, + #[serde(default, deserialize_with = "empty_as_none")] + http_route_filters: Option>, + #[serde(default, deserialize_with = "empty_as_none")] + webhook_filters: Option>, + #[serde(default)] + openapi_spec_format: Format, +} + +#[cfg(feature = "http_trigger")] +async fn http_routes_to_future_paths( + db: &DB, + user_db: UserDB, + authed: &ApiAuthed, + pg_pool: &mut PgConnection, + http_route_filters: Option<&[HttpRouteFilter]>, + w_id: &str, +) -> Result> { + let mut http_routes = Vec::new(); + + if let Some(http_route_filters) = http_route_filters { + let path_regex = http_route_filters + .iter() + .map(|filter| { + transform_to_minified_postgres_regex(&format!( + "f/{}/{}", + filter.folder_regex, filter.path_regex + )) + }) + .collect_vec(); + + let route_path_regex = http_route_filters + .iter() + .map(|filter| transform_to_minified_postgres_regex(&filter.route_path_regex)) + .collect_vec(); + + #[derive(Debug, Deserialize)] + struct MinifiedHttpTrigger { + route_path: String, + http_method: HttpMethod, + is_async: bool, + workspaced_route: bool, + summary: Option, + description: Option, + authentication_method: AuthenticationMethod, + authentication_resource_path: Option, + } + + http_routes = sqlx::query_as!( + MinifiedHttpTrigger, + r#" + SELECT + route_path, + http_method AS "http_method: _", + is_async, + workspaced_route, + summary, + description, + authentication_method AS "authentication_method: _", + authentication_resource_path + FROM + http_trigger + WHERE + path ~ ANY($1) AND + route_path ~ ANY($2) AND + workspace_id = $3 + "#, + &path_regex, + &route_path_regex, + &w_id + ) + .fetch_all(pg_pool) + .await?; + } + + let mut openapi_future_paths = Vec::with_capacity(http_routes.len()); + + for http_route in http_routes { + let auth_method = match http_route.authentication_method { + AuthenticationMethod::BasicHttp => Some(SecurityScheme::BasicHttp), + AuthenticationMethod::Windmill => Some(SecurityScheme::BearerJwt), + AuthenticationMethod::ApiKey => { + let resource_path = match http_route.authentication_resource_path { + Some(resource_path) => resource_path, + None => { + return Err(Error::BadRequest( + "Missing authentication resource path".to_string(), + )); + } + }; + + let api = try_get_resource_from_db_as::( + authed, + Some(user_db.clone()), + db, + &resource_path, + w_id, + ) + .await?; + + Some(SecurityScheme::ApiKey(api.api_key_header)) + } + _ => None, + }; + + let route_path = if http_route.workspaced_route { + format!("{}/{}", w_id, http_route.route_path.trim_start_matches('/')) + } else { + http_route.route_path.clone() + }; + + let method = match http_route.http_method { + HttpMethod::Get => Method::GET, + HttpMethod::Post => Method::POST, + HttpMethod::Put => Method::PUT, + HttpMethod::Patch => Method::PATCH, + HttpMethod::Delete => Method::DELETE, + }; + + let future_path = FuturePath::new( + route_path, + Kind::HttpRoute(HttpRouteConfig::new(method)), + Some(http_route.is_async), + http_route.summary, + http_route.description, + auth_method, + ); + + openapi_future_paths.push(future_path); + } + + Ok(openapi_future_paths) +} + +#[cfg(not(feature = "http_trigger"))] +async fn http_routes_to_future_paths( + _db: &DB, + _user_db: UserDB, + _authed: &ApiAuthed, + _pg_pool: &mut PgConnection, + _http_route_filters: Option<&[HttpRouteFilter]>, + _w_id: &str, +) -> Result> { + Ok(Vec::new()) +} + +async fn webhook_to_future_paths( + pg_pool: &mut PgConnection, + webhook_filters: Option<&[WebhookFilter]>, + w_id: &str, +) -> Result> { + let mut openapi_future_paths = Vec::new(); + if let Some(webhook_filters) = webhook_filters { + let mut script_webhook_filter = Vec::new(); + let mut flow_webhook_filter = Vec::new(); + + for webhook in webhook_filters { + let full_regex = transform_to_minified_postgres_regex(&format!( + "{}/{}/{}", + &webhook.user_or_folder_regex, &webhook.user_or_folder_regex_value, &webhook.path + )); + + match webhook.runnable_kind { + RunnableKind::Script => { + script_webhook_filter.push(full_regex); + } + RunnableKind::Flow => { + flow_webhook_filter.push(full_regex); + } + } + } + + #[derive(Debug, Deserialize, Clone, Hash)] + struct MinifiedWebhook { + path: String, + description: Option, + summary: Option, + } + + impl PartialEq for MinifiedWebhook { + fn eq(&self, other: &Self) -> bool { + self.path == other.path + } + } + + impl Eq for MinifiedWebhook {} + + let webhook_scripts = sqlx::query_as!( + MinifiedWebhook, + r#"SELECT + path, + summary, + description + FROM + script + WHERE + path ~ ANY($1) AND + workspace_id = $2 + "#, + &script_webhook_filter, + &w_id + ) + .fetch_all(&mut *pg_pool) + .await? + .into_iter() + .unique() + .collect_vec(); + + let webhook_flows = sqlx::query_as!( + MinifiedWebhook, + r#"SELECT + path, + summary, + description + FROM + flow + WHERE + path ~ ANY($1) AND + workspace_id = $2 + "#, + &flow_webhook_filter, + &w_id + ) + .fetch_all(&mut *pg_pool) + .await? + .into_iter() + .unique() + .collect_vec(); + + openapi_future_paths.reserve_exact(webhook_scripts.len() + webhook_flows.len()); + + for webhook in webhook_scripts { + openapi_future_paths.push(FuturePath::new( + webhook.path, + Kind::Webhook(WebhookConfig::new(RunnableKind::Script)), + None, + webhook.summary, + webhook.description, + Some(SecurityScheme::BearerJwt), + )); + } + + for webhook in webhook_flows { + openapi_future_paths.push(FuturePath::new( + webhook.path, + Kind::Webhook(WebhookConfig::new(RunnableKind::Flow)), + None, + webhook.summary, + webhook.description, + Some(SecurityScheme::BearerJwt), + )); + } + } + + Ok(openapi_future_paths) +} + +async fn generate_openapi_future_path( + db: &DB, + user_db: UserDB, + authed: &ApiAuthed, + http_route_filters: Option<&[HttpRouteFilter]>, + webhook_filters: Option<&[WebhookFilter]>, + w_id: &str, +) -> Result> { + if http_route_filters.is_none() && webhook_filters.is_none() { + return Err(Error::BadRequest( + "Expected http route filter and/or webhook filters".to_string(), + )); + } + + let mut tx = user_db.clone().begin(authed).await?; + + let mut openapi_future_paths = + http_routes_to_future_paths(db, user_db, authed, &mut tx, http_route_filters, w_id).await?; + + openapi_future_paths + .append(&mut webhook_to_future_paths(&mut tx, webhook_filters, w_id).await?); + + tx.commit().await?; + + if openapi_future_paths.is_empty() { + return Err(Error::NotFound( + "No match for the current filter".to_string(), + )); + } + + Ok(openapi_future_paths) +} + +async fn generate_openapi_spec( + Extension(authed): Extension, + Extension(db): Extension, + Extension(user_db): Extension, + Path(w_id): Path, + Json(generate_openapi): Json, +) -> Result { + let openapi_future_paths = generate_openapi_future_path( + &db, + user_db, + &authed, + generate_openapi.http_route_filters.as_deref(), + generate_openapi.webhook_filters.as_deref(), + &w_id, + ) + .await?; + + let openapi_document = generate_openapi_document( + generate_openapi.info.as_ref(), + generate_openapi.url.as_ref(), + openapi_future_paths, + generate_openapi.openapi_spec_format, + ); + + openapi_document +} + +async fn download_spec( + Extension(authed): Extension, + Extension(db): Extension, + Extension(user_db): Extension, + Path(w_id): Path, + Json(generate_openapi): Json, +) -> Result { + let openapi_future_paths = generate_openapi_future_path( + &db, + user_db, + &authed, + generate_openapi.http_route_filters.as_deref(), + generate_openapi.webhook_filters.as_deref(), + &w_id, + ) + .await?; + + let openapi_document = generate_openapi_document( + generate_openapi.info.as_ref(), + generate_openapi.url.as_ref(), + openapi_future_paths, + generate_openapi.openapi_spec_format, + )?; + + let response = Response::builder() + .status(StatusCode::OK) + .header( + header::CONTENT_TYPE, + HeaderValue::from_static("application/octet-stream"), + ) + .body(Body::from(openapi_document)) + .unwrap(); + + Ok(response) +} diff --git a/backend/windmill-api/src/postgres_triggers/mod.rs b/backend/windmill-api/src/postgres_triggers/mod.rs index 096f0c78d0..eff341436f 100644 --- a/backend/windmill-api/src/postgres_triggers/mod.rs +++ b/backend/windmill-api/src/postgres_triggers/mod.rs @@ -160,7 +160,7 @@ pub async fn get_pg_connection( logical_mode: bool, ) -> Result { let database = - try_get_resource_from_db_as::(authed, user_db, db, postgres_resource_path, w_id) + try_get_resource_from_db_as::(&authed, user_db, db, postgres_resource_path, w_id) .await?; Ok(get_raw_postgres_connection(&database, logical_mode).await?) diff --git a/backend/windmill-api/src/postgres_triggers/trigger.rs b/backend/windmill-api/src/postgres_triggers/trigger.rs index 4598ca1a18..27313879b2 100644 --- a/backend/windmill-api/src/postgres_triggers/trigger.rs +++ b/backend/windmill-api/src/postgres_triggers/trigger.rs @@ -417,7 +417,7 @@ impl PostgresConfig { }; let database = try_get_resource_from_db_as::( - authed, + &authed, Some(UserDB::new(db.clone())), &db, postgres_resource_path, diff --git a/backend/windmill-api/src/resources.rs b/backend/windmill-api/src/resources.rs index d2d58c918d..14fdfef536 100644 --- a/backend/windmill-api/src/resources.rs +++ b/backend/windmill-api/src/resources.rs @@ -1217,7 +1217,7 @@ async fn update_resource_type( ) ))] pub async fn try_get_resource_from_db_as( - authed: ApiAuthed, + authed: &ApiAuthed, user_db: Option, db: &DB, resource_path: &str, diff --git a/backend/windmill-api/src/utils.rs b/backend/windmill-api/src/utils.rs index 5eef389138..8db0d99281 100644 --- a/backend/windmill-api/src/utils.rs +++ b/backend/windmill-api/src/utils.rs @@ -6,8 +6,6 @@ * LICENSE-AGPL for a copy of the license. */ -use std::fmt::Display; - use axum::{body::Body, response::Response}; use regex::Regex; use serde::{Deserialize, Deserializer}; @@ -31,23 +29,6 @@ pub struct WithStarredInfoQuery { pub with_starred_info: Option, } -#[derive(Deserialize)] -#[serde(rename_all = "lowercase")] -pub enum RunnableKind { - Script, - Flow, -} - -impl Display for RunnableKind { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - let runnable_kind = match self { - RunnableKind::Script => "script", - RunnableKind::Flow => "flow" - }; - write!(f, "{}", runnable_kind) - } -} - pub async fn require_super_admin(db: &DB, email: &str) -> error::Result<()> { let is_admin = is_super_admin_email(db, email).await?; diff --git a/backend/windmill-api/src/workspaces_export.rs b/backend/windmill-api/src/workspaces_export.rs index b3ad6dbdd7..5673958ab8 100644 --- a/backend/windmill-api/src/workspaces_export.rs +++ b/backend/windmill-api/src/workspaces_export.rs @@ -548,6 +548,8 @@ pub(crate) async fn tarball_workspace( authentication_resource_path, script_path, is_flow, + summary, + description, edited_by, edited_at, email, diff --git a/backend/windmill-common/Cargo.toml b/backend/windmill-common/Cargo.toml index 6a7a3b124b..250f48e336 100644 --- a/backend/windmill-common/Cargo.toml +++ b/backend/windmill-common/Cargo.toml @@ -80,6 +80,7 @@ backon.workspace = true openidconnect = { workspace = true, optional = true } strum.workspace = true strum_macros.workspace = true +url.workspace = true semver.workspace = true croner = "2.0.6" diff --git a/backend/windmill-common/src/utils.rs b/backend/windmill-common/src/utils.rs index 08cbb7345b..6b539dc73f 100644 --- a/backend/windmill-common/src/utils.rs +++ b/backend/windmill-common/src/utils.rs @@ -22,11 +22,14 @@ use croner::Cron; use rand::{distr::Alphanumeric, rng, Rng}; use reqwest::Client; use semver::Version; -use serde::{Deserialize, Deserializer, Serialize}; +use serde::{de::Error as SerdeDeserializerError, Deserialize, Deserializer, Serialize}; use sha2::{Digest, Sha256}; use sqlx::{Pool, Postgres}; +use std::borrow::Cow; +use std::fmt::Display; use std::{fs::DirBuilder as SyncDirBuilder, str::FromStr}; use tokio::fs::DirBuilder as AsyncDirBuilder; +use url::Url; pub const MAX_PER_PAGE: usize = 10000; pub const DEFAULT_PER_PAGE: usize = 1000; @@ -523,6 +526,18 @@ impl IsEmpty for Vec { } } +impl IsEmpty for Option +where + T: IsEmpty, +{ + fn is_empty(&self) -> bool { + match self { + Some(v) => v.is_empty(), + None => true, + } + } +} + pub fn empty_as_none<'de, D, T>(deserializer: D) -> std::result::Result, D::Error> where D: Deserializer<'de>, @@ -532,6 +547,26 @@ where Ok(option.filter(|s| !s.is_empty())) } +pub fn is_empty(value: &T) -> bool +where + T: IsEmpty, +{ + value.is_empty() +} + +pub fn deserialize_url<'de, D: Deserializer<'de>>( + de: D, +) -> std::result::Result, D::Error> { + let intermediate = >>::deserialize(de)?; + + match intermediate.as_deref() { + None | Some("") => Ok(None), + Some(non_empty_string) => Url::parse(non_empty_string) + .map(Some) + .map_err(D::Error::custom), + } +} + pub async fn fetch_mute_workspace(_db: &DB, workspace_id: &str) -> Result { match sqlx::query!( "SELECT mute_critical_alerts FROM workspace_settings WHERE workspace_id = $1", @@ -783,3 +818,20 @@ impl Future for WarnAfterFuture { } } } + +#[derive(Debug, Deserialize, Clone, Copy, PartialEq, Eq, Hash)] +#[serde(rename_all = "lowercase")] +pub enum RunnableKind { + Script, + Flow, +} + +impl Display for RunnableKind { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let runnable_kind = match self { + RunnableKind::Script => "script", + RunnableKind::Flow => "flow", + }; + write!(f, "{}", runnable_kind) + } +} diff --git a/frontend/src/lib/components/SimpleEditor.svelte b/frontend/src/lib/components/SimpleEditor.svelte index 2d14a3b3a5..29089a36aa 100644 --- a/frontend/src/lib/components/SimpleEditor.svelte +++ b/frontend/src/lib/components/SimpleEditor.svelte @@ -156,11 +156,18 @@ } } - export function setCode(ncode: string): void { + export function setCode(ncode: string, formatCode?: boolean): void { if (ncode != code) { code = ncode } editor?.setValue(ncode) + if (formatCode) { + format() + } + } + + export function formatCode(): void { + format() } function updateCode() { diff --git a/frontend/src/lib/components/settings/CreateToken.svelte b/frontend/src/lib/components/settings/CreateToken.svelte new file mode 100644 index 0000000000..dd25ca2da9 --- /dev/null +++ b/frontend/src/lib/components/settings/CreateToken.svelte @@ -0,0 +1,262 @@ + + +
+ {#if newToken} +
+
+ Added token: +
+
+ Make sure to copy your personal access token now. You won't be able to see it again! +
+
+ {/if} + + {#if newMcpToken} +
+

New MCP URL:

+ +

+ Make sure to copy this URL now. You won't be able to see it again! +

+
+ {/if} + +
+

Add a new token

+ + {#if showMcpMode} +
+ + { + mcpCreationMode = e.detail + if (e.detail) { + newTokenLabel = 'MCP token' + newTokenExpiration = undefined + newTokenWorkspace = $workspaceStore + } else { + newTokenLabel = undefined + newTokenExpiration = undefined + newTokenWorkspace = defaultNewTokenWorkspace + } + }} + checked={mcpCreationMode} + options={{ + right: 'Generate MCP URL', + rightTooltip: + 'Generate a new MCP URL to make your scripts and flows available as tools through your LLM clients.', + rightDocumentationLink: 'https://www.windmill.dev/docs/core_concepts/mcp' + }} + size="xs" + /> + +
+ {/if} + + {#if scopes != undefined} +
+ Scope + {#each scopes as scope} + + {/each} +
+ {/if} + +
+ {#if mcpCreationMode} +
+ Scope + + {#snippet children({ item })} + + + {/snippet} + +
+ +
+ Hub scripts (optional) + {#if loadingApps} +
Loading...
+ {:else if errorFetchApps} +
Error fetching apps
+ {:else} + + {/if} +
+ +
+ Workspace + +
+ {/if} + +
+ Label (optional) + +
+ + {#if !mcpCreationMode} +
+ Expires In (optional) + +
+ {/if} +
+ +
+ + +
+
+
diff --git a/frontend/src/lib/components/triggers/http/OpenAPISpecGenerator.svelte b/frontend/src/lib/components/triggers/http/OpenAPISpecGenerator.svelte new file mode 100644 index 0000000000..bcb83e97db --- /dev/null +++ b/frontend/src/lib/components/triggers/http/OpenAPISpecGenerator.svelte @@ -0,0 +1,647 @@ + + + { + token = '' + }} +> + +
+
+ + Any token generated using the form below will grant unrestricted access to the Windmill + API. Only share it with trusted parties. + + { + token = e.detail + }} + newTokenLabel={`openapi-${$userStore?.username ?? 'superadmin'}-${generateRandomString(4)}`} + /> +
+ + + + +
+
+
+ + + openAPIGenerator.closeDrawer()} + > +
+
+
+ + + + + + + + + + + + {#if webhookAndHttpRouteFilter.length > 0} + {#each webhookAndHttpRouteFilter as filter, i} + {@const isHttpRouteFIlter = isHttpRouteFilter(filter)} +
+
+ + {/if} +
+ +
+ + +
+ {/each} + {/if} +
+ +
+
+
+ +
+
+ +
+
+ + +
+
+ +
+
+ { + if (!emptyStringTrimmed(openapiDocument)) { + try { + if (detail === 'yaml') { + const obj = JSON.parse(openapiDocument) + openapiDocument = YAML.stringify(obj) + } else { + const obj = YAML.parse(openapiDocument) + openapiDocument = JSON.stringify(obj, null, 2) + } + await tick() + editor?.setCode(openapiDocument, true) + } catch (error) { + const message = error instanceof Error ? error.message : JSON.stringify(error) + sendUserToast(`Conversion failed: ${message}`, true) + } + } + }} + > + {#snippet children({ item })} + + + {/snippet} + +
+
+
+ +
+
+ + diff --git a/frontend/src/lib/components/triggers/http/RouteEditorInner.svelte b/frontend/src/lib/components/triggers/http/RouteEditorInner.svelte index 80fbe05994..dda278f7fe 100644 --- a/frontend/src/lib/components/triggers/http/RouteEditorInner.svelte +++ b/frontend/src/lib/components/triggers/http/RouteEditorInner.svelte @@ -32,6 +32,7 @@ import TestingBadge from '../testingBadge.svelte' import TriggerEditorToolbar from '../TriggerEditorToolbar.svelte' import { handleConfigChange } from '../utils' + import autosize from '$lib/autosize' import { untrack } from 'svelte' let { @@ -83,7 +84,8 @@ let signature_options_type = $state<'custom_script' | 'custom_signature'>('custom_signature') let can_write = $state(true) let extraPerms = $state | undefined>(undefined) - + let summary: string | undefined = $state() + let routeDescription: string | undefined = $state() // Component references let s3FilePicker = $state(null) let s3Editor = $state(null) @@ -223,6 +225,8 @@ signature_options_type = defaultValues?.signature_options_type ?? 'custom_signature' raw_string = defaultValues?.raw_string ?? false wrap_body = defaultValues?.wrap_body ?? false + summary = defaultValues?.summary ?? '' + routeDescription = defaultValues?.description ?? '' } finally { clearTimeout(loader) drawerLoading = false @@ -241,6 +245,8 @@ workspaced_route = cfg?.workspaced_route wrap_body = cfg?.wrap_body raw_string = cfg?.raw_string + summary = cfg?.summary + routeDescription = cfg?.description authentication_resource_path = cfg?.authentication_resource_path ?? '' if (cfg?.authentication_method === 'custom_script') { authentication_method = 'signature' @@ -318,7 +324,9 @@ authentication_method: auth_method, static_asset_config, is_static_website, - extra_perms: extraPerms + extra_perms: extraPerms, + summary, + description: routeDescription } return nCfg @@ -370,19 +378,43 @@ {:else}
- +
+ + + + + +
{#if !hideTarget} diff --git a/frontend/src/lib/components/triggers/http/utils.ts b/frontend/src/lib/components/triggers/http/utils.ts index 45bde0db02..ca779dec78 100644 --- a/frontend/src/lib/components/triggers/http/utils.ts +++ b/frontend/src/lib/components/triggers/http/utils.ts @@ -54,7 +54,9 @@ export async function saveHttpRouteFromCfg( workspaced_route: routeCfg.workspaced_route, authentication_resource_path: routeCfg.authentication_resource_path, wrap_body: routeCfg.wrap_body, - raw_string: routeCfg.raw_string + raw_string: routeCfg.raw_string, + description: routeCfg.description, + summary: routeCfg.summary } try { if (edit) { diff --git a/frontend/src/lib/utils.ts b/frontend/src/lib/utils.ts index 2e3a7cf94f..f16133547b 100644 --- a/frontend/src/lib/utils.ts +++ b/frontend/src/lib/utils.ts @@ -661,6 +661,18 @@ export function classNames(...classes: Array): string { return classes.filter(Boolean).join(' ') } +export function download(filename: string, fileContent: string, mimeType?: string) { + const blob = new Blob([fileContent], { + type: mimeType + }) + const url = window.URL.createObjectURL(blob) + const a = document.createElement('a') + a.href = url + a.download = filename + a.click() + setTimeout(() => URL.revokeObjectURL(url), 100) +} + export async function copyToClipboard(value?: string, sendToast = true): Promise { if (!value) { return false @@ -1356,7 +1368,7 @@ export function getOS() { import { type ClassValue, clsx } from 'clsx' import { twMerge } from 'tailwind-merge' import type { Snippet } from 'svelte' -import type { OpenAPI, OpenAPIV2, OpenAPIV3, OpenAPIV3_1 } from 'openapi-types' +import { OpenAPIV2, type OpenAPI, type OpenAPIV3, type OpenAPIV3_1 } from 'openapi-types' export function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs)) diff --git a/frontend/src/routes/(root)/(logged)/routes/+page.svelte b/frontend/src/routes/(root)/(logged)/routes/+page.svelte index 1dbed687c0..d03ae50ff5 100644 --- a/frontend/src/routes/(root)/(logged)/routes/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/routes/+page.svelte @@ -47,12 +47,14 @@ import { isCloudHosted } from '$lib/cloud' import { getHttpRoute } from '$lib/components/triggers/http/utils' import RoutesGenerator from '$lib/components/triggers/http/RoutesGenerator.svelte' + import OpenApiSpecGenerator from '$lib/components/triggers/http/OpenAPISpecGenerator.svelte' type TriggerW = HttpTrigger & { canWrite: boolean } let triggers: TriggerW[] = $state([]) let shareModal: ShareModal | undefined = $state() let loading = $state(true) + let openAPISpecGenerator: OpenApiSpecGenerator | undefined = $state() let routesGenerator: RoutesGenerator | undefined = $state() let deploymentDrawer: DeployWorkspaceDrawer | undefined = $state() let deployUiSettings: WorkspaceDeployUISettings | undefined = $state(undefined) @@ -207,6 +209,7 @@ + From OpenAPI spec + From f5f2f8f344b9f4c35077ee3e802bd91f595856f7 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Tue, 17 Jun 2025 22:29:56 +0200 Subject: [PATCH 636/739] chore(main): release 1.498.0 (#5957) * chore(main): release 1.498.0 * Apply automatic changes --------- Co-authored-by: rubenfiszel <275584+rubenfiszel@users.noreply.github.com> --- CHANGELOG.md | 8 +++ backend/Cargo.lock | 62 +++++++++---------- backend/Cargo.toml | 4 +- backend/windmill-api/openapi.yaml | 2 +- benchmarks/lib.ts | 2 +- cli/main.ts | 2 +- frontend/package-lock.json | 4 +- frontend/package.json | 2 +- lsp/Pipfile | 4 +- openflow.openapi.yaml | 2 +- .../WindmillClient/WindmillClient.psd1 | 2 +- python-client/wmill/pyproject.toml | 2 +- python-client/wmill_pg/pyproject.toml | 2 +- typescript-client/jsr.json | 2 +- typescript-client/package.json | 2 +- version.txt | 2 +- 16 files changed, 56 insertions(+), 48 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2d88c37003..a496bda1b5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [1.498.0](https://github.com/windmill-labs/windmill/compare/v1.497.2...v1.498.0) (2025-06-17) + + +### Features + +* use provider api to list available AI models in workspace settings ([#5947](https://github.com/windmill-labs/windmill/issues/5947)) ([7490e88](https://github.com/windmill-labs/windmill/commit/7490e883d747a7f65b2fefd3ec14b1cfc3d9bbd4)) +* windmill http triggers and webhooks to openapi spec ([#5918](https://github.com/windmill-labs/windmill/issues/5918)) ([aba8c01](https://github.com/windmill-labs/windmill/commit/aba8c01d7f44ba4be369a3c711be9e156d6bf215)) + ## [1.497.2](https://github.com/windmill-labs/windmill/compare/v1.497.1...v1.497.2) (2025-06-17) diff --git a/backend/Cargo.lock b/backend/Cargo.lock index 4ed3fa32fc..24fb8436bb 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -9845,9 +9845,9 @@ dependencies = [ [[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 = "radium" @@ -13521,9 +13521,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.29" +version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b1ffbcf9c6f6b99d386e7444eb608ba646ae452a36b39737deb9663b610f662" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", @@ -14564,7 +14564,7 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windmill" -version = "1.497.2" +version = "1.498.0" dependencies = [ "anyhow", "axum", @@ -14616,7 +14616,7 @@ dependencies = [ [[package]] name = "windmill-api" -version = "1.497.2" +version = "1.498.0" dependencies = [ "anyhow", "argon2", @@ -14727,7 +14727,7 @@ dependencies = [ [[package]] name = "windmill-api-client" -version = "1.497.2" +version = "1.498.0" dependencies = [ "base64 0.22.1", "chrono", @@ -14742,7 +14742,7 @@ dependencies = [ [[package]] name = "windmill-audit" -version = "1.497.2" +version = "1.498.0" dependencies = [ "chrono", "serde", @@ -14755,7 +14755,7 @@ dependencies = [ [[package]] name = "windmill-autoscaling" -version = "1.497.2" +version = "1.498.0" dependencies = [ "anyhow", "serde", @@ -14769,7 +14769,7 @@ dependencies = [ [[package]] name = "windmill-common" -version = "1.497.2" +version = "1.498.0" dependencies = [ "anyhow", "async-stream", @@ -14846,7 +14846,7 @@ dependencies = [ [[package]] name = "windmill-git-sync" -version = "1.497.2" +version = "1.498.0" dependencies = [ "regex", "serde", @@ -14860,7 +14860,7 @@ dependencies = [ [[package]] name = "windmill-indexer" -version = "1.497.2" +version = "1.498.0" dependencies = [ "anyhow", "bytes", @@ -14883,7 +14883,7 @@ dependencies = [ [[package]] name = "windmill-macros" -version = "1.497.2" +version = "1.498.0" dependencies = [ "itertools 0.14.0", "lazy_static", @@ -14895,7 +14895,7 @@ dependencies = [ [[package]] name = "windmill-parser" -version = "1.497.2" +version = "1.498.0" dependencies = [ "convert_case 0.6.0", "serde", @@ -14904,7 +14904,7 @@ dependencies = [ [[package]] name = "windmill-parser-bash" -version = "1.497.2" +version = "1.498.0" dependencies = [ "anyhow", "lazy_static", @@ -14916,7 +14916,7 @@ dependencies = [ [[package]] name = "windmill-parser-csharp" -version = "1.497.2" +version = "1.498.0" dependencies = [ "anyhow", "serde_json", @@ -14928,7 +14928,7 @@ dependencies = [ [[package]] name = "windmill-parser-go" -version = "1.497.2" +version = "1.498.0" dependencies = [ "anyhow", "gosyn", @@ -14940,7 +14940,7 @@ dependencies = [ [[package]] name = "windmill-parser-graphql" -version = "1.497.2" +version = "1.498.0" dependencies = [ "anyhow", "lazy_static", @@ -14952,7 +14952,7 @@ dependencies = [ [[package]] name = "windmill-parser-java" -version = "1.497.2" +version = "1.498.0" dependencies = [ "anyhow", "serde_json", @@ -14964,7 +14964,7 @@ dependencies = [ [[package]] name = "windmill-parser-nu" -version = "1.497.2" +version = "1.498.0" dependencies = [ "anyhow", "nu-parser", @@ -14975,7 +14975,7 @@ dependencies = [ [[package]] name = "windmill-parser-php" -version = "1.497.2" +version = "1.498.0" dependencies = [ "anyhow", "itertools 0.14.0", @@ -14986,7 +14986,7 @@ dependencies = [ [[package]] name = "windmill-parser-py" -version = "1.497.2" +version = "1.498.0" dependencies = [ "anyhow", "itertools 0.14.0", @@ -14997,7 +14997,7 @@ dependencies = [ [[package]] name = "windmill-parser-py-imports" -version = "1.497.2" +version = "1.498.0" dependencies = [ "anyhow", "async-recursion", @@ -15020,7 +15020,7 @@ dependencies = [ [[package]] name = "windmill-parser-rust" -version = "1.497.2" +version = "1.498.0" dependencies = [ "anyhow", "convert_case 0.6.0", @@ -15037,7 +15037,7 @@ dependencies = [ [[package]] name = "windmill-parser-sql" -version = "1.497.2" +version = "1.498.0" dependencies = [ "anyhow", "lazy_static", @@ -15049,7 +15049,7 @@ dependencies = [ [[package]] name = "windmill-parser-ts" -version = "1.497.2" +version = "1.498.0" dependencies = [ "anyhow", "lazy_static", @@ -15067,7 +15067,7 @@ dependencies = [ [[package]] name = "windmill-parser-wasm" -version = "1.497.2" +version = "1.498.0" dependencies = [ "anyhow", "getrandom 0.2.16", @@ -15091,7 +15091,7 @@ dependencies = [ [[package]] name = "windmill-parser-yaml" -version = "1.497.2" +version = "1.498.0" dependencies = [ "anyhow", "serde_json", @@ -15101,7 +15101,7 @@ dependencies = [ [[package]] name = "windmill-queue" -version = "1.497.2" +version = "1.498.0" dependencies = [ "anyhow", "async-recursion", @@ -15134,7 +15134,7 @@ dependencies = [ [[package]] name = "windmill-sql-datatype-parser-wasm" -version = "1.497.2" +version = "1.498.0" dependencies = [ "wasm-bindgen", "wasm-bindgen-test", @@ -15144,7 +15144,7 @@ dependencies = [ [[package]] name = "windmill-worker" -version = "1.497.2" +version = "1.498.0" dependencies = [ "anyhow", "async-recursion", diff --git a/backend/Cargo.toml b/backend/Cargo.toml index 205c287b27..1ac013b916 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "windmill" -version = "1.497.2" +version = "1.498.0" authors.workspace = true edition.workspace = true @@ -32,7 +32,7 @@ members = [ ] [workspace.package] -version = "1.497.2" +version = "1.498.0" authors = ["Ruben Fiszel "] edition = "2021" diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index 109378a88b..a5e693277e 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.497.2 + version: 1.498.0 title: Windmill API contact: diff --git a/benchmarks/lib.ts b/benchmarks/lib.ts index d70da68a7d..45de71358f 100644 --- a/benchmarks/lib.ts +++ b/benchmarks/lib.ts @@ -2,7 +2,7 @@ import { sleep } from "https://deno.land/x/sleep@v1.2.1/mod.ts"; import * as windmill from "https://deno.land/x/windmill@v1.174.0/mod.ts"; import * as api from "https://deno.land/x/windmill@v1.174.0/windmill-api/index.ts"; -export const VERSION = "v1.497.2"; +export const VERSION = "v1.498.0"; export async function login(email: string, password: string): Promise { return await windmill.UserService.login({ diff --git a/cli/main.ts b/cli/main.ts index 55eb7549db..3a505bbc18 100644 --- a/cli/main.ts +++ b/cli/main.ts @@ -63,7 +63,7 @@ export { // } // }); -export const VERSION = "1.497.2"; +export const VERSION = "1.498.0"; const command = new Command() .name("wmill") diff --git a/frontend/package-lock.json b/frontend/package-lock.json index c75e8f9aa2..02bb998500 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "windmill-components", - "version": "1.497.2", + "version": "1.498.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "windmill-components", - "version": "1.497.2", + "version": "1.498.0", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/frontend/package.json b/frontend/package.json index d4892a8bef..bee87418b0 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "windmill-components", - "version": "1.497.2", + "version": "1.498.0", "scripts": { "dev": "vite dev", "build": "vite build", diff --git a/lsp/Pipfile b/lsp/Pipfile index 192ead4d2b..bb3d094961 100644 --- a/lsp/Pipfile +++ b/lsp/Pipfile @@ -4,8 +4,8 @@ verify_ssl = true name = "pypi" [packages] -wmill = ">=1.497.2" -wmill_pg = ">=1.497.2" +wmill = ">=1.498.0" +wmill_pg = ">=1.498.0" sendgrid = "*" mysql-connector-python = "*" pymongo = "*" diff --git a/openflow.openapi.yaml b/openflow.openapi.yaml index d52b85f3ad..a13eaee9be 100644 --- a/openflow.openapi.yaml +++ b/openflow.openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.497.2 + version: 1.498.0 title: OpenFlow Spec contact: name: Ruben Fiszel diff --git a/powershell-client/WindmillClient/WindmillClient.psd1 b/powershell-client/WindmillClient/WindmillClient.psd1 index 9eb11914a1..e4c28508d1 100644 --- a/powershell-client/WindmillClient/WindmillClient.psd1 +++ b/powershell-client/WindmillClient/WindmillClient.psd1 @@ -12,7 +12,7 @@ RootModule = 'WindmillClient.psm1' # Version number of this module. - ModuleVersion = '1.497.2' + ModuleVersion = '1.498.0' # Supported PSEditions # CompatiblePSEditions = @() diff --git a/python-client/wmill/pyproject.toml b/python-client/wmill/pyproject.toml index 661bb6f2df..c547216c76 100644 --- a/python-client/wmill/pyproject.toml +++ b/python-client/wmill/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "wmill" -version = "1.497.2" +version = "1.498.0" description = "A client library for accessing Windmill server wrapping the Windmill client API" license = "Apache-2.0" homepage = "https://windmill.dev" diff --git a/python-client/wmill_pg/pyproject.toml b/python-client/wmill_pg/pyproject.toml index 9a84d34aef..a664711828 100644 --- a/python-client/wmill_pg/pyproject.toml +++ b/python-client/wmill_pg/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "wmill-pg" -version = "1.497.2" +version = "1.498.0" description = "An extension client for the wmill client library focused on pg" license = "Apache-2.0" homepage = "https://windmill.dev" diff --git a/typescript-client/jsr.json b/typescript-client/jsr.json index 88076175e4..a8146e05ec 100644 --- a/typescript-client/jsr.json +++ b/typescript-client/jsr.json @@ -1,6 +1,6 @@ { "name": "@windmill/windmill", - "version": "1.497.2", + "version": "1.498.0", "exports": "./src/index.ts", "publish": { "exclude": ["!src", "./s3Types.ts", "./client.ts"] diff --git a/typescript-client/package.json b/typescript-client/package.json index 1e1f5f75c9..e81d522a28 100644 --- a/typescript-client/package.json +++ b/typescript-client/package.json @@ -1,7 +1,7 @@ { "name": "windmill-client", "description": "Windmill SDK client for browsers and Node.js", - "version": "1.497.2", + "version": "1.498.0", "author": "Ruben Fiszel", "license": "Apache 2.0", "devDependencies": { diff --git a/version.txt b/version.txt index 2126514e50..a54f0c9fdf 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.497.2 +1.498.0 From 38b06bf3a718d9dfd53cecbcd370c71d034c0cf5 Mon Sep 17 00:00:00 2001 From: centdix <40307056+centdix@users.noreply.github.com> Date: Wed, 18 Jun 2025 13:08:59 +0200 Subject: [PATCH 637/739] internal: add /updatesqlx as git command (#5969) * add flow to update sqlx * archive aider * fix * add comments --- ....yaml => aider-after-review.yaml.archived} | 0 ...r-common.yml => aider-common.yml.archived} | 0 ...rnal.yaml => aider-external.yaml.archived} | 0 .../{aider.yaml => aider.yaml.archived} | 0 .github/workflows/update-sqlx.yaml | 98 +++++++++++++++++++ backend/update_sqlx.sh | 18 +++- 6 files changed, 114 insertions(+), 2 deletions(-) rename .github/workflows/{aider-after-review.yaml => aider-after-review.yaml.archived} (100%) rename .github/workflows/{aider-common.yml => aider-common.yml.archived} (100%) rename .github/workflows/{aider-external.yaml => aider-external.yaml.archived} (100%) rename .github/workflows/{aider.yaml => aider.yaml.archived} (100%) create mode 100644 .github/workflows/update-sqlx.yaml diff --git a/.github/workflows/aider-after-review.yaml b/.github/workflows/aider-after-review.yaml.archived similarity index 100% rename from .github/workflows/aider-after-review.yaml rename to .github/workflows/aider-after-review.yaml.archived diff --git a/.github/workflows/aider-common.yml b/.github/workflows/aider-common.yml.archived similarity index 100% rename from .github/workflows/aider-common.yml rename to .github/workflows/aider-common.yml.archived diff --git a/.github/workflows/aider-external.yaml b/.github/workflows/aider-external.yaml.archived similarity index 100% rename from .github/workflows/aider-external.yaml rename to .github/workflows/aider-external.yaml.archived diff --git a/.github/workflows/aider.yaml b/.github/workflows/aider.yaml.archived similarity index 100% rename from .github/workflows/aider.yaml rename to .github/workflows/aider.yaml.archived diff --git a/.github/workflows/update-sqlx.yaml b/.github/workflows/update-sqlx.yaml new file mode 100644 index 0000000000..ddb9bb9e67 --- /dev/null +++ b/.github/workflows/update-sqlx.yaml @@ -0,0 +1,98 @@ +name: Update SQLx + +on: + issue_comment: + types: [created] + +jobs: + update-sqlx: + if: github.event.issue.pull_request && startsWith(github.event.comment.body, '/update-sqlx') + runs-on: ubicloud-standard-8 + permissions: + contents: write + pull-requests: write + issues: write + + services: + postgres: + image: postgres:14 + env: + POSTGRES_PASSWORD: postgres + POSTGRES_USER: postgres + POSTGRES_DB: windmill + ports: + - 5432:5432 + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + + steps: + - name: Comment on PR - Starting + uses: actions/github-script@v6 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + github.rest.issues.createComment({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + body: 'Starting sqlx update...' + }) + + - name: Checkout repository + uses: actions/checkout@v3 + with: + ref: ${{ github.event.issue.pull_request.head.ref }} + fetch-depth: 0 + + - name: Checkout windmill-ee-private + uses: actions/checkout@v3 + with: + repository: windmill-labs/windmill-ee-private + path: windmill-ee-private + token: ${{ secrets.EE_PRIVATE_TOKEN }} + + - name: Install xmlsec build-time deps + run: | + sudo apt-get update + sudo apt-get install -y --no-install-recommends \ + pkg-config libxml2-dev libssl-dev \ + xmlsec1 libxmlsec1-dev libxmlsec1-openssl + + - name: Run update-sqlx script + env: + DATABASE_URL: postgres://postgres:postgres@localhost:5432/windmill + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + PR_NUMBER=${{ github.event.issue.number }} + BRANCH_NAME=$(gh pr view $PR_NUMBER --json headRefName --jq .headRefName) + echo "Checking out PR branch: $BRANCH_NAME" + git checkout $BRANCH_NAME + cd backend + cargo install sqlx-cli + sqlx migrate run + ./update_sqlx.sh --dir ./windmill-ee-private + # Pass the branch name to the next step + echo "BRANCH_NAME=$BRANCH_NAME" >> $GITHUB_ENV + + - name: Commit changes if any + run: | + git config --local user.email "action@github.com" + git config --local user.name "GitHub Action" + git add backend/.sqlx + git commit -m "Update SQLx metadata" + git push origin ${{ env.BRANCH_NAME }} + + - name: Comment on PR - Completed + uses: actions/github-script@v6 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + github.rest.issues.createComment({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + body: 'Successfully ran sqlx update' + }) diff --git a/backend/update_sqlx.sh b/backend/update_sqlx.sh index 09824d9e24..6e64115ce0 100755 --- a/backend/update_sqlx.sh +++ b/backend/update_sqlx.sh @@ -1,4 +1,18 @@ -./substitute_ee_code.sh --dir ../windmill-ee-private +#!/bin/bash + +# Default directory +EE_DIR="../windmill-ee-private" + +# Parse arguments +while [[ "$#" -gt 0 ]]; do + case $1 in + --dir) EE_DIR="$2"; shift ;; + *) echo "Unknown parameter: $1"; exit 1 ;; + esac + shift +done + +./substitute_ee_code.sh --dir "$EE_DIR" # Check if running on macOS if [[ "$(uname)" == "Darwin" ]]; then @@ -18,4 +32,4 @@ if [[ "$(uname)" == "Darwin" ]]; then sed -i '' 's/^#samael = { version="0.0.14", features = \["xmlsec"\] }/samael = { version="0.0.14", features = ["xmlsec"] }/' Cargo.toml # Comment out the git-based samael dependency sed -i '' 's/^\(samael = { git="https:\/\/github.com\/njaremko\/samael", rev="464d015e3ae393e4b5dd00b4d6baa1b617de0dd6", features = \["xmlsec"\] }\)/# \1/' Cargo.toml -fi +fi \ No newline at end of file From 959280bf5ad6a55d8506929e13ba05e3e93656a7 Mon Sep 17 00:00:00 2001 From: centdix <40307056+centdix@users.noreply.github.com> Date: Wed, 18 Jun 2025 13:22:11 +0200 Subject: [PATCH 638/739] fix wrong typo (#5970) --- .github/workflows/update-sqlx.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/update-sqlx.yaml b/.github/workflows/update-sqlx.yaml index ddb9bb9e67..03ecba25b6 100644 --- a/.github/workflows/update-sqlx.yaml +++ b/.github/workflows/update-sqlx.yaml @@ -6,7 +6,7 @@ on: jobs: update-sqlx: - if: github.event.issue.pull_request && startsWith(github.event.comment.body, '/update-sqlx') + if: github.event.issue.pull_request && startsWith(github.event.comment.body, '/updatesqlx') runs-on: ubicloud-standard-8 permissions: contents: write @@ -52,7 +52,7 @@ jobs: with: repository: windmill-labs/windmill-ee-private path: windmill-ee-private - token: ${{ secrets.EE_PRIVATE_TOKEN }} + token: ${{ secrets.WINDMILL_EE_PRIVATE_ACCESS }} - name: Install xmlsec build-time deps run: | From be0c8ddae087fab89bc5c7aa70ff1367fa3c7077 Mon Sep 17 00:00:00 2001 From: Diego Imbert <70353967+diegoimbert@users.noreply.github.com> Date: Wed, 18 Jun 2025 14:25:55 +0200 Subject: [PATCH 639/739] prevent datatable from spamming loadMore on scroll to end (#5973) --- .../src/lib/components/table/DataTable.svelte | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/frontend/src/lib/components/table/DataTable.svelte b/frontend/src/lib/components/table/DataTable.svelte index 82b2f3f401..2fed249679 100644 --- a/frontend/src/lib/components/table/DataTable.svelte +++ b/frontend/src/lib/components/table/DataTable.svelte @@ -73,7 +73,7 @@ const hasScrollbar = tableContainer.scrollHeight > tableContainer.clientHeight if (!hasScrollbar && hasMore) { - dispatch('loadMore') + triggerLoadMore() } } @@ -92,11 +92,20 @@ if (!tableContainer) return const { scrollTop, scrollHeight, clientHeight } = tableContainer - if (scrollHeight - (scrollTop + clientHeight) < 50) { - dispatch('loadMore') + if (scrollHeight - (scrollTop + clientHeight) === 0) { + triggerLoadMore() } } + let lastLoadMoreDispatch: number | undefined = $state(undefined) + function triggerLoadMore() { + if (lastLoadMoreDispatch && Date.now() - lastLoadMoreDispatch < 1000) { + return + } + dispatch('loadMore') + lastLoadMoreDispatch = Date.now() + } + $effect(() => { if (tableContainer && hasMore && !loading) { untrack(() => checkScrollStatus()) @@ -170,7 +179,7 @@
- {#if !superadmin} + {#if !($superadmin || $devopsRole)}
diff --git a/frontend/src/routes/(root)/(logged)/workers/+page.svelte b/frontend/src/routes/(root)/(logged)/workers/+page.svelte index 749a17755d..139ee18e9b 100644 --- a/frontend/src/routes/(root)/(logged)/workers/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/workers/+page.svelte @@ -19,6 +19,7 @@ import { enterpriseLicense, superadmin, + devopsRole, userStore, workspaceStore, userWorkspaces @@ -131,7 +132,7 @@ loadWorkers() loadWorkerGroups() loadCustomTags() - $: $superadmin && loadDefaultTagsPerWorkspace() + $: ($superadmin || $devopsRole) && loadDefaultTagsPerWorkspace() onDestroy(() => { if (intervalId) { @@ -271,7 +272,7 @@ } -{#if $superadmin} +{#if $superadmin || $devopsRole} {/if} @@ -331,7 +332,7 @@ tooltip="The workers are the dutiful servants that execute the jobs." documentationLink="https://www.windmill.dev/docs/core_concepts/worker_groups" > - {#if $superadmin} + {#if $superadmin || $devopsRole}
- {#if $superadmin} + {#if $superadmin || $devopsRole}
-
+
{ + // Prevent keyboard events from bubbling to SvelteFlow + e.stopPropagation() + }} + > {#if selectedNode}
@@ -92,6 +98,10 @@ renderCount++ }, 300)() }} + on:keydown={(e) => { + // Prevent keyboard events from bubbling to SvelteFlow + e.stopPropagation() + }} /> From 530a72ba83629a764d3a8b034ce9bb53e7c82b32 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 19 Jun 2025 00:58:56 +0200 Subject: [PATCH 654/739] chore(main): release 1.499.0 (#5990) * chore(main): release 1.499.0 * Apply automatic changes --------- Co-authored-by: rubenfiszel <275584+rubenfiszel@users.noreply.github.com> --- CHANGELOG.md | 12 +++ backend/Cargo.lock | 86 +++++++++---------- backend/Cargo.toml | 4 +- backend/windmill-api/openapi.yaml | 2 +- benchmarks/lib.ts | 2 +- cli/main.ts | 2 +- frontend/package-lock.json | 4 +- frontend/package.json | 2 +- lsp/Pipfile | 4 +- openflow.openapi.yaml | 2 +- .../WindmillClient/WindmillClient.psd1 | 2 +- python-client/wmill/pyproject.toml | 2 +- python-client/wmill_pg/pyproject.toml | 2 +- typescript-client/jsr.json | 2 +- typescript-client/package.json | 2 +- version.txt | 2 +- 16 files changed, 72 insertions(+), 60 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a496bda1b5..d52dfb4622 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## [1.499.0](https://github.com/windmill-labs/windmill/compare/v1.498.0...v1.499.0) (2025-06-18) + + +### Features + +* devOps role can edit worker groups ([#5984](https://github.com/windmill-labs/windmill/issues/5984)) ([b1c4f8b](https://github.com/windmill-labs/windmill/commit/b1c4f8b29d0fb4cad76853110b84a87892b54661)) + + +### Bug Fixes + +* prevent keypress events from bubbling in decision tree drawer ([#5993](https://github.com/windmill-labs/windmill/issues/5993)) ([2a33442](https://github.com/windmill-labs/windmill/commit/2a334421e85abf046784aab57522582439ef2901)) + ## [1.498.0](https://github.com/windmill-labs/windmill/compare/v1.497.2...v1.498.0) (2025-06-17) diff --git a/backend/Cargo.lock b/backend/Cargo.lock index 24fb8436bb..73a66bb231 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -741,9 +741,9 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[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 = "aws-config" @@ -902,9 +902,9 @@ dependencies = [ [[package]] name = "aws-sdk-sts" -version = "1.74.0" +version = "1.75.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19d440e1d368759bd10df0dbdddbfff6473d7cd73e9d9ef2363dc9995ac2d711" +checksum = "e3258fa707f2f585ee3049d9550954b959002abd59176975150a01d5cf38ae3f" dependencies = [ "aws-credential-types", "aws-runtime", @@ -2303,9 +2303,9 @@ dependencies = [ [[package]] name = "croner" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38fd53511eaf0b00a185613875fee58b208dfce016577d0ad4bb548e1c4fb3ee" +checksum = "c344b0690c1ad1c7176fe18eb173e0c927008fdaaa256e40dfd43ddd149c0843" dependencies = [ "chrono", ] @@ -7188,9 +7188,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.173" +version = "0.2.174" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8cfeafaffdbc32176b64fb251369d52ea9f0a8fbc6f8759edffef7b525d64bb" +checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" [[package]] name = "libduckdb-sys" @@ -10410,7 +10410,7 @@ dependencies = [ [[package]] name = "rmcp" version = "0.1.5" -source = "git+https://github.com/modelcontextprotocol/rust-sdk#d1884fe598cd4c524ff6e0101859a60d4b4c8b8f" +source = "git+https://github.com/modelcontextprotocol/rust-sdk#8a577659f01917289064c0a3c753392b44305ef4" dependencies = [ "base64 0.22.1", "bytes", @@ -10439,7 +10439,7 @@ dependencies = [ [[package]] name = "rmcp-macros" version = "0.1.5" -source = "git+https://github.com/modelcontextprotocol/rust-sdk#d1884fe598cd4c524ff6e0101859a60d4b4c8b8f" +source = "git+https://github.com/modelcontextprotocol/rust-sdk#8a577659f01917289064c0a3c753392b44305ef4" dependencies = [ "proc-macro2", "quote", @@ -11922,9 +11922,9 @@ dependencies = [ [[package]] name = "sse-stream" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f649a9f9e91db2ed32f3724516eac2bc09fab77fc33be8f670f5619b9dc6c3f" +checksum = "eb4dc4d33c68ec1f27d386b5610a351922656e1fdf5c05bbaad930cd1519479a" dependencies = [ "bytes", "futures-util", @@ -14564,7 +14564,7 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windmill" -version = "1.498.0" +version = "1.499.0" dependencies = [ "anyhow", "axum", @@ -14616,7 +14616,7 @@ dependencies = [ [[package]] name = "windmill-api" -version = "1.498.0" +version = "1.499.0" dependencies = [ "anyhow", "argon2", @@ -14727,7 +14727,7 @@ dependencies = [ [[package]] name = "windmill-api-client" -version = "1.498.0" +version = "1.499.0" dependencies = [ "base64 0.22.1", "chrono", @@ -14742,7 +14742,7 @@ dependencies = [ [[package]] name = "windmill-audit" -version = "1.498.0" +version = "1.499.0" dependencies = [ "chrono", "serde", @@ -14755,7 +14755,7 @@ dependencies = [ [[package]] name = "windmill-autoscaling" -version = "1.498.0" +version = "1.499.0" dependencies = [ "anyhow", "serde", @@ -14769,7 +14769,7 @@ dependencies = [ [[package]] name = "windmill-common" -version = "1.498.0" +version = "1.499.0" dependencies = [ "anyhow", "async-stream", @@ -14846,7 +14846,7 @@ dependencies = [ [[package]] name = "windmill-git-sync" -version = "1.498.0" +version = "1.499.0" dependencies = [ "regex", "serde", @@ -14860,7 +14860,7 @@ dependencies = [ [[package]] name = "windmill-indexer" -version = "1.498.0" +version = "1.499.0" dependencies = [ "anyhow", "bytes", @@ -14883,7 +14883,7 @@ dependencies = [ [[package]] name = "windmill-macros" -version = "1.498.0" +version = "1.499.0" dependencies = [ "itertools 0.14.0", "lazy_static", @@ -14895,7 +14895,7 @@ dependencies = [ [[package]] name = "windmill-parser" -version = "1.498.0" +version = "1.499.0" dependencies = [ "convert_case 0.6.0", "serde", @@ -14904,7 +14904,7 @@ dependencies = [ [[package]] name = "windmill-parser-bash" -version = "1.498.0" +version = "1.499.0" dependencies = [ "anyhow", "lazy_static", @@ -14916,7 +14916,7 @@ dependencies = [ [[package]] name = "windmill-parser-csharp" -version = "1.498.0" +version = "1.499.0" dependencies = [ "anyhow", "serde_json", @@ -14928,7 +14928,7 @@ dependencies = [ [[package]] name = "windmill-parser-go" -version = "1.498.0" +version = "1.499.0" dependencies = [ "anyhow", "gosyn", @@ -14940,7 +14940,7 @@ dependencies = [ [[package]] name = "windmill-parser-graphql" -version = "1.498.0" +version = "1.499.0" dependencies = [ "anyhow", "lazy_static", @@ -14952,7 +14952,7 @@ dependencies = [ [[package]] name = "windmill-parser-java" -version = "1.498.0" +version = "1.499.0" dependencies = [ "anyhow", "serde_json", @@ -14964,7 +14964,7 @@ dependencies = [ [[package]] name = "windmill-parser-nu" -version = "1.498.0" +version = "1.499.0" dependencies = [ "anyhow", "nu-parser", @@ -14975,7 +14975,7 @@ dependencies = [ [[package]] name = "windmill-parser-php" -version = "1.498.0" +version = "1.499.0" dependencies = [ "anyhow", "itertools 0.14.0", @@ -14986,7 +14986,7 @@ dependencies = [ [[package]] name = "windmill-parser-py" -version = "1.498.0" +version = "1.499.0" dependencies = [ "anyhow", "itertools 0.14.0", @@ -14997,7 +14997,7 @@ dependencies = [ [[package]] name = "windmill-parser-py-imports" -version = "1.498.0" +version = "1.499.0" dependencies = [ "anyhow", "async-recursion", @@ -15020,7 +15020,7 @@ dependencies = [ [[package]] name = "windmill-parser-rust" -version = "1.498.0" +version = "1.499.0" dependencies = [ "anyhow", "convert_case 0.6.0", @@ -15037,7 +15037,7 @@ dependencies = [ [[package]] name = "windmill-parser-sql" -version = "1.498.0" +version = "1.499.0" dependencies = [ "anyhow", "lazy_static", @@ -15049,7 +15049,7 @@ dependencies = [ [[package]] name = "windmill-parser-ts" -version = "1.498.0" +version = "1.499.0" dependencies = [ "anyhow", "lazy_static", @@ -15067,7 +15067,7 @@ dependencies = [ [[package]] name = "windmill-parser-wasm" -version = "1.498.0" +version = "1.499.0" dependencies = [ "anyhow", "getrandom 0.2.16", @@ -15091,7 +15091,7 @@ dependencies = [ [[package]] name = "windmill-parser-yaml" -version = "1.498.0" +version = "1.499.0" dependencies = [ "anyhow", "serde_json", @@ -15101,7 +15101,7 @@ dependencies = [ [[package]] name = "windmill-queue" -version = "1.498.0" +version = "1.499.0" dependencies = [ "anyhow", "async-recursion", @@ -15134,7 +15134,7 @@ dependencies = [ [[package]] name = "windmill-sql-datatype-parser-wasm" -version = "1.498.0" +version = "1.499.0" dependencies = [ "wasm-bindgen", "wasm-bindgen-test", @@ -15144,7 +15144,7 @@ dependencies = [ [[package]] name = "windmill-worker" -version = "1.498.0" +version = "1.499.0" dependencies = [ "anyhow", "async-recursion", @@ -15865,18 +15865,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.25" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" +checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.25" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" +checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" dependencies = [ "proc-macro2", "quote", diff --git a/backend/Cargo.toml b/backend/Cargo.toml index 1ac013b916..506f360852 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "windmill" -version = "1.498.0" +version = "1.499.0" authors.workspace = true edition.workspace = true @@ -32,7 +32,7 @@ members = [ ] [workspace.package] -version = "1.498.0" +version = "1.499.0" authors = ["Ruben Fiszel "] edition = "2021" diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index a5e693277e..6922c98379 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.498.0 + version: 1.499.0 title: Windmill API contact: diff --git a/benchmarks/lib.ts b/benchmarks/lib.ts index 45de71358f..a988908588 100644 --- a/benchmarks/lib.ts +++ b/benchmarks/lib.ts @@ -2,7 +2,7 @@ import { sleep } from "https://deno.land/x/sleep@v1.2.1/mod.ts"; import * as windmill from "https://deno.land/x/windmill@v1.174.0/mod.ts"; import * as api from "https://deno.land/x/windmill@v1.174.0/windmill-api/index.ts"; -export const VERSION = "v1.498.0"; +export const VERSION = "v1.499.0"; export async function login(email: string, password: string): Promise { return await windmill.UserService.login({ diff --git a/cli/main.ts b/cli/main.ts index 3a505bbc18..f0ad23f8cf 100644 --- a/cli/main.ts +++ b/cli/main.ts @@ -63,7 +63,7 @@ export { // } // }); -export const VERSION = "1.498.0"; +export const VERSION = "1.499.0"; const command = new Command() .name("wmill") diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 02bb998500..e4b6658b41 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "windmill-components", - "version": "1.498.0", + "version": "1.499.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "windmill-components", - "version": "1.498.0", + "version": "1.499.0", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/frontend/package.json b/frontend/package.json index bee87418b0..9cf40edea3 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "windmill-components", - "version": "1.498.0", + "version": "1.499.0", "scripts": { "dev": "vite dev", "build": "vite build", diff --git a/lsp/Pipfile b/lsp/Pipfile index bb3d094961..55e2072ce4 100644 --- a/lsp/Pipfile +++ b/lsp/Pipfile @@ -4,8 +4,8 @@ verify_ssl = true name = "pypi" [packages] -wmill = ">=1.498.0" -wmill_pg = ">=1.498.0" +wmill = ">=1.499.0" +wmill_pg = ">=1.499.0" sendgrid = "*" mysql-connector-python = "*" pymongo = "*" diff --git a/openflow.openapi.yaml b/openflow.openapi.yaml index a13eaee9be..a25dabb602 100644 --- a/openflow.openapi.yaml +++ b/openflow.openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.498.0 + version: 1.499.0 title: OpenFlow Spec contact: name: Ruben Fiszel diff --git a/powershell-client/WindmillClient/WindmillClient.psd1 b/powershell-client/WindmillClient/WindmillClient.psd1 index e4c28508d1..4eaafc91e3 100644 --- a/powershell-client/WindmillClient/WindmillClient.psd1 +++ b/powershell-client/WindmillClient/WindmillClient.psd1 @@ -12,7 +12,7 @@ RootModule = 'WindmillClient.psm1' # Version number of this module. - ModuleVersion = '1.498.0' + ModuleVersion = '1.499.0' # Supported PSEditions # CompatiblePSEditions = @() diff --git a/python-client/wmill/pyproject.toml b/python-client/wmill/pyproject.toml index c547216c76..2248094357 100644 --- a/python-client/wmill/pyproject.toml +++ b/python-client/wmill/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "wmill" -version = "1.498.0" +version = "1.499.0" description = "A client library for accessing Windmill server wrapping the Windmill client API" license = "Apache-2.0" homepage = "https://windmill.dev" diff --git a/python-client/wmill_pg/pyproject.toml b/python-client/wmill_pg/pyproject.toml index a664711828..3847adc1c1 100644 --- a/python-client/wmill_pg/pyproject.toml +++ b/python-client/wmill_pg/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "wmill-pg" -version = "1.498.0" +version = "1.499.0" description = "An extension client for the wmill client library focused on pg" license = "Apache-2.0" homepage = "https://windmill.dev" diff --git a/typescript-client/jsr.json b/typescript-client/jsr.json index a8146e05ec..e5c9953a98 100644 --- a/typescript-client/jsr.json +++ b/typescript-client/jsr.json @@ -1,6 +1,6 @@ { "name": "@windmill/windmill", - "version": "1.498.0", + "version": "1.499.0", "exports": "./src/index.ts", "publish": { "exclude": ["!src", "./s3Types.ts", "./client.ts"] diff --git a/typescript-client/package.json b/typescript-client/package.json index e81d522a28..22838073f6 100644 --- a/typescript-client/package.json +++ b/typescript-client/package.json @@ -1,7 +1,7 @@ { "name": "windmill-client", "description": "Windmill SDK client for browsers and Node.js", - "version": "1.498.0", + "version": "1.499.0", "author": "Ruben Fiszel", "license": "Apache 2.0", "devDependencies": { diff --git a/version.txt b/version.txt index a54f0c9fdf..1c31ddf8a0 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.498.0 +1.499.0 From 054f2c134adf04fbae0a35efea0d1ab8665ac0e4 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 19 Jun 2025 08:07:03 +0200 Subject: [PATCH 655/739] improve decision tree builder --- .../components/layout/AppDecisionTree.svelte | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/frontend/src/lib/components/apps/components/layout/AppDecisionTree.svelte b/frontend/src/lib/components/apps/components/layout/AppDecisionTree.svelte index f92bbde678..d595a7d85a 100644 --- a/frontend/src/lib/components/apps/components/layout/AppDecisionTree.svelte +++ b/frontend/src/lib/components/apps/components/layout/AppDecisionTree.svelte @@ -24,19 +24,29 @@ let { id, componentContainerHeight, customCss = undefined, render, nodes }: Props = $props() - let resolvedConditions = $state( - nodes.reduce((acc, node) => { + let resolvedConditions = $state(createResolvedConditions()) + + function createResolvedConditions() { + return nodes.reduce((acc, node) => { acc[node.id] = acc[node.id] || [] return acc }, {}) - ) + } - let resolvedNext = $state( - nodes.reduce((acc, node) => { + let resolvedNext = $state(createResolvedNext()) + + function createResolvedNext() { + return nodes.reduce((acc, node) => { acc[node.id] = acc[node.id] || false return acc }, {}) - ) + } + + $effect(() => { + nodes + resolvedConditions = untrack(() => createResolvedConditions()) + resolvedNext = untrack(() => createResolvedNext()) + }) let everRender = $state(render) $effect.pre(() => { From fa8d1b47db19e15fe854e01f9987c8f97cb45b44 Mon Sep 17 00:00:00 2001 From: Diego Imbert <70353967+diegoimbert@users.noreply.github.com> Date: Thu, 19 Jun 2025 14:37:17 +0200 Subject: [PATCH 656/739] fix: new MultiSelect component (#5979) * rename all multiselects to Legacy * move Select * Separate SelectDropdown * fix click outside for select with portal * multiselect v0 * multiselect clear btn * move filterText logic to SelectDropdown * ui nits * console.log * draggable * Draggable multiselect * multiselect search * nit refacto * autofocus multiselect input * Replace in AppMultiSelectV2 * search icon * app multi select nits * arginput update multiselect * fix autofocus scrolling up * replace High priority tags multiselect * autoscaling config editor multiselect replace * fix clear btn not in border * replace multiselect in cron input * replace multiselect in savedinputs * replace EventHandlerItem multiselect * select dropdown shadow * more multiselect migration * hover opacity on drag * TokensTable UI fixes + replace multiselect * ai settings replace multiselect * DefaultTags Multiselect replace * prevent multiselect from opening on drag * nit * app multiselect css + simplify * console log * safeSelectItems cleanup * Remove svelte-multiselect * clip when wrap not allowed * hide duplicate app components * CSS works better with multiselect in app editor * allowOverflow * allowClear * fix custom createText messed up with search --- frontend/package-lock.json | 10 - frontend/package.json | 1 - frontend/src/lib/components/ArgEnum.svelte | 2 +- frontend/src/lib/components/ArgInput.svelte | 44 +- .../components/AutoscalingConfigEditor.svelte | 33 +- .../src/lib/components/ChannelSelector.svelte | 2 +- frontend/src/lib/components/CronInput.svelte | 35 +- .../src/lib/components/DBTableEditor.svelte | 5 +- .../src/lib/components/DefaultTags.svelte | 2 +- .../lib/components/DefaultTagsInner.svelte | 13 +- .../src/lib/components/FolderEditor.svelte | 5 +- .../src/lib/components/GroupEditor.svelte | 5 +- .../LightweightResourcePicker.svelte | 2 +- .../src/lib/components/ResourcePicker.svelte | 2 +- .../src/lib/components/SavedInputsV2.svelte | 9 +- .../src/lib/components/ScriptPicker.svelte | 2 +- frontend/src/lib/components/Select.svelte | 271 ------ .../lib/components/ServiceLogsInner.svelte | 5 +- frontend/src/lib/components/ShareModal.svelte | 9 +- .../src/lib/components/TagsToListenTo.svelte | 11 +- .../src/lib/components/TeamSelector.svelte | 2 +- .../src/lib/components/WorkerGroup.svelte | 41 +- frontend/src/lib/components/WorkerRepl.svelte | 2 +- .../src/lib/components/WorkerTagSelect.svelte | 5 +- .../apps/components/buttons/AppForm.svelte | 1 - .../components/inputs/AppDateSelect.svelte | 14 +- .../components/inputs/AppMultiSelect.svelte | 3 - .../components/inputs/AppMultiSelectV2.svelte | 240 ++--- .../apps/components/inputs/AppSelect.svelte | 2 +- .../components/apps/editor/AppEditor.svelte | 2 +- .../components/apps/editor/GridEditor.svelte | 1 + .../apps/editor/component/components.ts | 5 + .../components/apps/editor/component/sets.ts | 4 +- .../componentsPanel/CssHelperPanel.svelte | 4 +- .../apps/editor/componentsPanel/cssUtils.ts | 21 +- .../settingsPanel/EventHandlerItem.svelte | 16 +- .../inputEditor/DBTableSelect.svelte | 2 +- .../auditLogs/AuditLogsFilters.svelte | 5 +- .../lib/components/common/CloseButton.svelte | 1 + .../common/drawer/ConditionalPortal.svelte | 19 +- .../components/multiselect/MultiSelect.svelte | 828 ------------------ .../multiselect/MultiSelectWrapper.svelte | 130 --- .../src/lib/components/multiselect/types.ts | 47 - .../src/lib/components/multiselect/utils.ts | 64 -- .../src/lib/components/runs/RunsFilter.svelte | 15 +- .../schema/EditableSchemaWrapper.svelte | 5 +- .../search/GlobalSearchModal.svelte | 3 +- .../components/select/DraggableTags.svelte | 63 ++ .../lib/components/select/MultiSelect.svelte | 176 ++++ .../src/lib/components/select/Select.svelte | 156 ++++ .../components/select/SelectDropdown.svelte | 147 ++++ .../src/lib/components/select/utils.svelte.ts | 72 ++ .../components/settings/CreateToken.svelte | 5 +- .../components/settings/TokensTable.svelte | 14 +- .../gcp/GcpTriggerEditorConfigSection.svelte | 7 +- .../triggers/http/OpenAPISpecGenerator.svelte | 5 +- .../PostgresTriggerEditorInner.svelte | 41 +- .../postgres/PublicationPicker.svelte | 5 +- .../triggers/postgres/RelationPicker.svelte | 75 +- .../triggers/postgres/SlotPicker.svelte | 5 +- .../sqs/SqsTriggerEditorConfigSection.svelte | 28 +- .../workspaceSettings/AISettings.svelte | 15 +- frontend/src/lib/utils.ts | 37 +- .../(root)/(logged)/workers/+page.svelte | 26 +- 64 files changed, 969 insertions(+), 1858 deletions(-) delete mode 100644 frontend/src/lib/components/Select.svelte delete mode 100644 frontend/src/lib/components/multiselect/MultiSelect.svelte delete mode 100644 frontend/src/lib/components/multiselect/MultiSelectWrapper.svelte delete mode 100644 frontend/src/lib/components/multiselect/types.ts delete mode 100644 frontend/src/lib/components/multiselect/utils.ts create mode 100644 frontend/src/lib/components/select/DraggableTags.svelte create mode 100644 frontend/src/lib/components/select/MultiSelect.svelte create mode 100644 frontend/src/lib/components/select/Select.svelte create mode 100644 frontend/src/lib/components/select/SelectDropdown.svelte create mode 100644 frontend/src/lib/components/select/utils.svelte.ts diff --git a/frontend/package-lock.json b/frontend/package-lock.json index e4b6658b41..ce57c0026d 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -132,7 +132,6 @@ "svelte-check": "^4.0.0", "svelte-floating-ui": "^1.5.8", "svelte-highlight": "^7.6.0", - "svelte-multiselect": "^11.0.0-rc.1", "svelte-popperjs": "^1.3.2", "svelte-preprocess": "^6.0.0", "svelte-range-slider-pips": "^2.3.1", @@ -11862,15 +11861,6 @@ "resolved": "https://registry.npmjs.org/svelte-infinite-loading/-/svelte-infinite-loading-1.4.0.tgz", "integrity": "sha512-Jo+f/yr/HmZQuIiiKKzAHVFXdAUWHW2RBbrcQTil8JVk1sCm/riy7KTJVzjBgQvHasrFQYKF84zvtc9/Y4lFYg==" }, - "node_modules/svelte-multiselect": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/svelte-multiselect/-/svelte-multiselect-11.1.0.tgz", - "integrity": "sha512-D93t6GlOV//gU7upR59uCd755Hq6OWhqv9ddhOXBDN/mEZj5XOAYHwDjUjePUKlE+bI+jry1BlZef8Mof2Y+YA==", - "dev": true, - "peerDependencies": { - "svelte": "^5.8.0" - } - }, "node_modules/svelte-popperjs": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/svelte-popperjs/-/svelte-popperjs-1.3.2.tgz", diff --git a/frontend/package.json b/frontend/package.json index 9cf40edea3..cab3c1d9a6 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -57,7 +57,6 @@ "svelte-check": "^4.0.0", "svelte-floating-ui": "^1.5.8", "svelte-highlight": "^7.6.0", - "svelte-multiselect": "^11.0.0-rc.1", "svelte-popperjs": "^1.3.2", "svelte-preprocess": "^6.0.0", "svelte-range-slider-pips": "^2.3.1", diff --git a/frontend/src/lib/components/ArgEnum.svelte b/frontend/src/lib/components/ArgEnum.svelte index b1f94d39f0..d87d34ea33 100644 --- a/frontend/src/lib/components/ArgEnum.svelte +++ b/frontend/src/lib/components/ArgEnum.svelte @@ -1,7 +1,7 @@ diff --git a/frontend/src/lib/components/DefaultTagsInner.svelte b/frontend/src/lib/components/DefaultTagsInner.svelte index 5e4e824787..ab715770de 100644 --- a/frontend/src/lib/components/DefaultTagsInner.svelte +++ b/frontend/src/lib/components/DefaultTagsInner.svelte @@ -7,11 +7,12 @@ import { enterpriseLicense, superadmin } from '$lib/stores' import { DEFAULT_TAGS_PER_WORKSPACE_SETTING, DEFAULT_TAGS_WORKSPACES_SETTING } from '$lib/consts' import Toggle from './Toggle.svelte' - import MultiSelectWrapper from './multiselect/MultiSelectWrapper.svelte' + import MultiSelect from './select/MultiSelect.svelte' + import { safeSelectItems } from './select/utils.svelte' let defaultTags: string[] | undefined = undefined export let defaultTagPerWorkspace: boolean | undefined = undefined - export let defaultTagWorkspaces: string[] | undefined = undefined + export let defaultTagWorkspaces: string[] = [] let limitToWorkspaces = false let workspaces: string[] = [] @@ -62,7 +63,7 @@
{/each}
-
+
{#if limitToWorkspaces} - {/if} diff --git a/frontend/src/lib/components/FolderEditor.svelte b/frontend/src/lib/components/FolderEditor.svelte index 5ae36a7e24..38f980f042 100644 --- a/frontend/src/lib/components/FolderEditor.svelte +++ b/frontend/src/lib/components/FolderEditor.svelte @@ -18,7 +18,8 @@ import Label from './Label.svelte' import { sendUserToast } from '$lib/toast' import { createEventDispatcher } from 'svelte' - import Select from './Select.svelte' + import Select from './select/Select.svelte' + import { safeSelectItems } from './select/utils.svelte' export let name: string let can_write = false @@ -197,7 +198,7 @@ ownerKind === 'user' ? usernames.filter((x) => !perms?.map((y) => y.owner_name).includes('u/' + x)) : groups.filter((x) => !perms?.map((y) => y.owner_name).includes('g/' + x))} - {#if ownerKind == 'group'} diff --git a/frontend/src/lib/components/LightweightResourcePicker.svelte b/frontend/src/lib/components/LightweightResourcePicker.svelte index 50da38607b..87570466b4 100644 --- a/frontend/src/lib/components/LightweightResourcePicker.svelte +++ b/frontend/src/lib/components/LightweightResourcePicker.svelte @@ -8,7 +8,7 @@ import type { AppViewerContext } from './apps/types' import { sendUserToast } from '$lib/toast' import { createDispatcherIfMounted } from '$lib/createDispatcherIfMounted' - import Select from './Select.svelte' + import Select from './select/Select.svelte' const dispatch = createEventDispatcher() const dispatchIfMounted = createDispatcherIfMounted(dispatch) diff --git a/frontend/src/lib/components/ResourcePicker.svelte b/frontend/src/lib/components/ResourcePicker.svelte index a07596fc34..f136fd32a6 100644 --- a/frontend/src/lib/components/ResourcePicker.svelte +++ b/frontend/src/lib/components/ResourcePicker.svelte @@ -10,7 +10,7 @@ import { Pen, Plus, RotateCw } from 'lucide-svelte' import { sendUserToast } from '$lib/toast' import { isDbType } from './apps/components/display/dbtable/utils' - import Select from './Select.svelte' + import Select from './select/Select.svelte' import { createDispatcherIfMounted } from '$lib/createDispatcherIfMounted' const dispatch = createEventDispatcher() diff --git a/frontend/src/lib/components/SavedInputsV2.svelte b/frontend/src/lib/components/SavedInputsV2.svelte index 538f3ce05f..0fb4f89e58 100644 --- a/frontend/src/lib/components/SavedInputsV2.svelte +++ b/frontend/src/lib/components/SavedInputsV2.svelte @@ -10,7 +10,8 @@ import { ExternalLink, Search } from 'lucide-svelte' import { Popover } from './meltComponents' import SchemaForm from './SchemaForm.svelte' - import MultiSelect from './multiselect/MultiSelectWrapper.svelte' + import MultiSelect from './select/MultiSelect.svelte' + import { safeSelectItems } from './select/utils.svelte' const dispatch = createEventDispatcher() interface Props { @@ -142,7 +143,6 @@ {/snippet} {#snippet content()} -
Search by args
@@ -175,11 +175,10 @@
{#key filteredSchema} diff --git a/frontend/src/lib/components/ScriptPicker.svelte b/frontend/src/lib/components/ScriptPicker.svelte index 0bb0a9caca..c4fe27167a 100644 --- a/frontend/src/lib/components/ScriptPicker.svelte +++ b/frontend/src/lib/components/ScriptPicker.svelte @@ -5,7 +5,7 @@ import { base } from '$lib/base' import { createEventDispatcher, untrack } from 'svelte' - import Select from './Select.svelte' + import Select from './select/Select.svelte' import { getScriptByPath } from '$lib/scripts' import { Button, Drawer, DrawerContent } from './common' diff --git a/frontend/src/lib/components/Select.svelte b/frontend/src/lib/components/Select.svelte deleted file mode 100644 index 0afdf2cc32..0000000000 --- a/frontend/src/lib/components/Select.svelte +++ /dev/null @@ -1,271 +0,0 @@ - - - { - if (!open || !processedItems?.length) return - if (e.key === 'ArrowUp' && keyArrowPos !== undefined && processedItems.length > 0) { - keyArrowPos = keyArrowPos <= 0 ? undefined : keyArrowPos - 1 - } else if (e.key === 'ArrowDown') { - if (keyArrowPos === undefined) { - keyArrowPos = 0 - } else { - keyArrowPos = Math.min(processedItems.length - 1, keyArrowPos + 1) - } - } else if (e.key === 'Enter' && keyArrowPos !== undefined && processedItems?.[keyArrowPos]) { - setValue(processedItems[keyArrowPos]) - } else { - keyArrowPos = undefined - return - } - e.preventDefault() - }} -/> - -
(open = false) }} - onpointerdown={() => onFocus?.()} - onfocus={() => onFocus?.()} - onblur={() => onBlur?.()} -> - {#if loading} -
- -
- {:else if clearable && !disabled && value} -
- -
- {:else if RightIcon} -
- -
- {/if} - - filterText, (v) => (filterText = v)} - placeholder={loading ? 'Loading...' : (valueEntry?.label ?? placeholder)} - style={containerStyle} - class={twMerge( - '!bg-surface text-ellipsis', - open ? '' : 'cursor-pointer', - valueEntry && !loading ? '!placeholder-primary' : '', - (clearable || RightIcon) && !disabled && value ? '!pr-8' : '', - inputClass ?? '' - )} - autocomplete="off" - onpointerdown={() => (open = true)} - bind:this={inputEl} - /> - - - {#if open && !disabled} -
- {#if processedItems?.length === 0} -
No items
- {/if} - {#each processedItems ?? [] as item, itemIndex} - {#if (item.__select_group && itemIndex === 0) || processedItems?.[itemIndex - 1]?.__select_group !== item.__select_group} -
- {item.__select_group} -
- {/if} - - {/each} -
- {/if} -
-
diff --git a/frontend/src/lib/components/ServiceLogsInner.svelte b/frontend/src/lib/components/ServiceLogsInner.svelte index 4504d4e69d..b8b233bf6f 100644 --- a/frontend/src/lib/components/ServiceLogsInner.svelte +++ b/frontend/src/lib/components/ServiceLogsInner.svelte @@ -11,14 +11,13 @@ import { sendUserToast } from '$lib/toast' import { onDestroy, tick, untrack } from 'svelte' import { Loader2 } from 'lucide-svelte' - import { copyToClipboard, truncateRev } from '$lib/utils' + import { copyToClipboard, scroll_into_view_if_needed_polyfill, truncateRev } from '$lib/utils' import LogSnippetViewer from './LogSnippetViewer.svelte' import { Button, Drawer, DrawerContent } from './common' import ClipboardCopy from 'lucide-svelte/icons/clipboard-copy' import AnsiUp from 'ansi_up' - import { scroll_into_view_if_needed_polyfill } from './multiselect/utils' import SplitPanesOrColumnOnMobile from './splitPanes/SplitPanesOrColumnOnMobile.svelte' - import Select from './Select.svelte' + import Select from './select/Select.svelte' import { goto } from '$lib/navigation' import { page } from '$app/stores' diff --git a/frontend/src/lib/components/ShareModal.svelte b/frontend/src/lib/components/ShareModal.svelte index eac1b0fefd..a8eeeeb9d1 100644 --- a/frontend/src/lib/components/ShareModal.svelte +++ b/frontend/src/lib/components/ShareModal.svelte @@ -13,7 +13,8 @@ import { isOwner } from '$lib/utils' import ToggleButtonGroup from './common/toggleButton-v2/ToggleButtonGroup.svelte' import ToggleButton from './common/toggleButton-v2/ToggleButton.svelte' - import Select from './Select.svelte' + import Select from './select/Select.svelte' + import { safeSelectItems } from './select/utils.svelte' const dispatch = createEventDispatcher() @@ -138,9 +139,9 @@
{#key ownerKind} !worker_tags?.includes(x)) - .map((x) => ({ value: x, label: x }))} + items={safeSelectItems( + [...(customTags ?? []), ...createdTags, ...defaultTags, ...nativeTags].filter( + (x) => !worker_tags?.includes(x) + ) + )} {disabled} bind:value={newTag} onFocus={() => dispatch('focus')} diff --git a/frontend/src/lib/components/TeamSelector.svelte b/frontend/src/lib/components/TeamSelector.svelte index 638c30d22f..899314bb31 100644 --- a/frontend/src/lib/components/TeamSelector.svelte +++ b/frontend/src/lib/components/TeamSelector.svelte @@ -2,7 +2,7 @@ import { workspaceStore } from '$lib/stores' import { RefreshCcw } from 'lucide-svelte' import { WorkspaceService } from '$lib/gen' - import Select from './Select.svelte' + import Select from './select/Select.svelte' import { onMount } from 'svelte' interface TeamItem { diff --git a/frontend/src/lib/components/WorkerGroup.svelte b/frontend/src/lib/components/WorkerGroup.svelte index 2dd2bd08ef..403995db2c 100644 --- a/frontend/src/lib/components/WorkerGroup.svelte +++ b/frontend/src/lib/components/WorkerGroup.svelte @@ -1,7 +1,6 @@ -{#each Object.keys(components['multiselectcomponent'].initialData.configuration) as key (key)} +{#each Object.keys(components['multiselectcomponentv2'].initialData.configuration) as key (key)} {/each} @@ -193,74 +160,33 @@
{ + class={twMerge('w-full', resolvedConfig.allowOverflow ? '' : 'absolute inset-0')} + onpointerdown={(e) => { $selectedComponent = [id] - - if (!e.shiftKey) { - e.stopPropagation() - } + if (!e.shiftKey) e.stopPropagation() selectedComponent.set([id]) }} - use:floatingRef - bind:clientWidth={w} > - {#if !selectedItems || Array.isArray(selectedItems)} - { - if (event?.detail?.type === 'removeAll') { - outputs?.result.set([]) - setContextValue([]) - } else { - setResultsFromSelectedItems() + { + customItems.push(item) + selectedItems.push(item) + customItems = customItems + selectedItems = selectedItems } - }} - on:open={() => { - $selectedComponent = [id] - open = true - }} - on:close={() => { - open = false - }} - let:option - > - - -
{ - let newe = new MouseEvent('mouseup') - e.target?.['parentElement']?.dispatchEvent(newe) - }} - > - {typeof option == 'object' ? (option?.label ?? 'NO_LABEL') : option} -
-
- - - - {:else} - Value {selectedItems} is not an array - {/if} + : undefined} + onOpen={() => ($selectedComponent = [id])} + />
diff --git a/frontend/src/lib/components/apps/components/inputs/AppSelect.svelte b/frontend/src/lib/components/apps/components/inputs/AppSelect.svelte index 5c9fff9c35..4e7d7dc8fc 100644 --- a/frontend/src/lib/components/apps/components/inputs/AppSelect.svelte +++ b/frontend/src/lib/components/apps/components/inputs/AppSelect.svelte @@ -19,7 +19,7 @@ import { Bug } from 'lucide-svelte' import Popover from '$lib/components/Popover.svelte' import ResolveStyle from '../helpers/ResolveStyle.svelte' - import Select from '$lib/components/Select.svelte' + import Select from '$lib/components/select/Select.svelte' interface Props { id: string diff --git a/frontend/src/lib/components/apps/editor/AppEditor.svelte b/frontend/src/lib/components/apps/editor/AppEditor.svelte index d7555b8460..75db79da69 100644 --- a/frontend/src/lib/components/apps/editor/AppEditor.svelte +++ b/frontend/src/lib/components/apps/editor/AppEditor.svelte @@ -1256,7 +1256,7 @@ {:else}
- Select a component to see the settings for it + Select a component to see the settings for it
{/if} diff --git a/frontend/src/lib/components/apps/editor/GridEditor.svelte b/frontend/src/lib/components/apps/editor/GridEditor.svelte index 01a725683b..faa5a321e8 100644 --- a/frontend/src/lib/components/apps/editor/GridEditor.svelte +++ b/frontend/src/lib/components/apps/editor/GridEditor.svelte @@ -127,6 +127,7 @@ } +
({ id, forceStyle: true, forceClass: true })) }, ...Object.entries(ccomponents) - .filter(([key]) => key !== 'quillcomponent') + .filter(([key]) => !['quillcomponent', ...Object.keys(DEPRECATED_COMPONENTS)].includes(key)) .map(([type, { name, icon, customCss }]) => ({ type: type as keyof typeof components, name, diff --git a/frontend/src/lib/components/apps/editor/componentsPanel/cssUtils.ts b/frontend/src/lib/components/apps/editor/componentsPanel/cssUtils.ts index 4634959ac0..8545d0627c 100644 --- a/frontend/src/lib/components/apps/editor/componentsPanel/cssUtils.ts +++ b/frontend/src/lib/components/apps/editor/componentsPanel/cssUtils.ts @@ -676,8 +676,8 @@ export const customisationByComponent: Customisation[] = [ comment: 'buttons to remove a single or all selected options at once' }, { - selector: '.multiselect > input[autocomplete]', - comment: 'input inside the top-level wrapper div' + selector: '.multiselect.dropdown', + comment: 'dropdown container' }, { selector: '.multiselect > ul.options', @@ -686,23 +686,6 @@ export const customisationByComponent: Customisation[] = [ { selector: '.multiselect > ul.options > li', comment: 'dropdown list items' - }, - { - selector: '.multiselect > ul.options > li.selected', - comment: 'selected options in the dropdown list' - }, - { - selector: '.multiselect > ul.options > li:not(.selected):hover', - comment: 'unselected but hovered options in the dropdown list' - }, - { - selector: '.multiselect > ul.options > li.active', - comment: - 'active item, navigated to with up/down arrow keys and ready to be selected by pressing enter' - }, - { - selector: '.multiselect > ul.options > li.disabled', - comment: 'options with disabled key set to true' } ], variables: [ diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/EventHandlerItem.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/EventHandlerItem.svelte index 83b05f5fd0..37697dec9d 100644 --- a/frontend/src/lib/components/apps/editor/settingsPanel/EventHandlerItem.svelte +++ b/frontend/src/lib/components/apps/editor/settingsPanel/EventHandlerItem.svelte @@ -1,11 +1,16 @@ {#if condition} - + {@render children?.()} {:else} - + {@render children?.()} {/if} diff --git a/frontend/src/lib/components/multiselect/MultiSelect.svelte b/frontend/src/lib/components/multiselect/MultiSelect.svelte deleted file mode 100644 index 1e4f00c66d..0000000000 --- a/frontend/src/lib/components/multiselect/MultiSelect.svelte +++ /dev/null @@ -1,828 +0,0 @@ - - - - - - - diff --git a/frontend/src/lib/components/multiselect/MultiSelectWrapper.svelte b/frontend/src/lib/components/multiselect/MultiSelectWrapper.svelte deleted file mode 100644 index 685c9b0801..0000000000 --- a/frontend/src/lib/components/multiselect/MultiSelectWrapper.svelte +++ /dev/null @@ -1,130 +0,0 @@ - - - - -
- {#if !value || Array.isArray(value)} -
- [...(value ?? [])], - (newVal) => { - if (!deepEqual(value, newVal)) { - value = newVal - } - } - } - {placeholder} - options={items} - on:close={() => { - open = false - }} - on:open={() => { - open = true - }} - let:option - disableRemoveAll - > -
{ - e.stopPropagation() - }} - onpointerdown={(e) => { - e.stopPropagation() - let newe = new MouseEvent('mouseup') - e.target?.['parentElement']?.dispatchEvent(newe) - }} - aria-selected={value?.includes(option)} - > - {option} -
-
-
- - - - {:else} - Value {value} is not an array - {/if} -
diff --git a/frontend/src/lib/components/multiselect/types.ts b/frontend/src/lib/components/multiselect/types.ts deleted file mode 100644 index d3dc4d7cac..0000000000 --- a/frontend/src/lib/components/multiselect/types.ts +++ /dev/null @@ -1,47 +0,0 @@ -export type Option = string | number | ObjectOption - -// single CSS string or an object with keys 'option' and 'selected', each a string, -// which only apply to the dropdown list and list of selected options, respectively -export type OptionStyle = string | { option: string; selected: string } - -export type ObjectOption = { - label: string | number // user-displayed text - value?: unknown // associated value, can be anything incl. objects (defaults to label if undefined) - title?: string // on-hover tooltip - disabled?: boolean // make this option unselectable - preselected?: boolean // make this option selected on page load (before any user interaction) - disabledTitle?: string // override the default disabledTitle = 'This option is disabled' - selectedTitle?: string // tooltip to display when this option is selected and hovered - style?: OptionStyle - [key: string]: unknown // allow any other keys users might want -} - -export type DispatchEvents = { - add: { option: T } - create: { option: T } - remove: { option: T } - removeAll: { options: T[] } - change: { - option?: T - options?: T[] - type: 'add' | 'remove' | 'removeAll' - } - open: { event: Event } - close: { event: Event } -} - -export type MultiSelectEvents = { - [key in keyof DispatchEvents]: CustomEvent -} & { - blur: FocusEvent - click: MouseEvent - focus: FocusEvent - keydown: KeyboardEvent - keyup: KeyboardEvent - mouseenter: MouseEvent - mouseleave: MouseEvent - touchcancel: TouchEvent - touchend: TouchEvent - touchmove: TouchEvent - touchstart: TouchEvent -} diff --git a/frontend/src/lib/components/multiselect/utils.ts b/frontend/src/lib/components/multiselect/utils.ts deleted file mode 100644 index a9bcfcaa69..0000000000 --- a/frontend/src/lib/components/multiselect/utils.ts +++ /dev/null @@ -1,64 +0,0 @@ -import type { Option, OptionStyle } from './types' - -// get the label key from an option object or the option itself if it's a string or number -export const get_label = (opt: Option) => { - if (opt instanceof Object) { - if (opt.label === undefined) { - console.error(`MultiSelect option ${JSON.stringify(opt)} is an object but has no label key`) - } - return opt.label - } - return `${opt}` -} - -// this function is used extract CSS strings from a {selected, option} style object to be used in the style attribute of the option -// if the style is a string, it will be returned as is -export function get_style( - option: { style?: OptionStyle; [key: string]: unknown } | string | number, - key: 'selected' | 'option' | null = null -) { - let css_str = `` - if (![`selected`, `option`, null].includes(key)) { - console.error(`MultiSelect: Invalid key=${key} for get_style`) - } - if (typeof option == `object` && option.style) { - if (typeof option.style == `string`) { - css_str = option.style - } - if (typeof option.style == `object`) { - if (key && key in option.style) return option.style[key] ?? `` - else { - console.error(`Invalid style object for option=${JSON.stringify(option)}`) - } - } - } - // ensure css_str ends with a semicolon - if (css_str.trim() && !css_str.trim().endsWith(`;`)) css_str += `;` - return css_str -} - -// Firefox lacks support for scrollIntoViewIfNeeded (https://caniuse.com/scrollintoviewifneeded). -// See https://github.com/janosh/svelte-multiselect/issues/87 -// Polyfill copied from -// https://github.com/nuxodin/lazyfill/blob/a8e63/polyfills/Element/prototype/scrollIntoViewIfNeeded.js -// exported for testing -export function scroll_into_view_if_needed_polyfill(elem: Element, centerIfNeeded: boolean = true) { - const observer = new IntersectionObserver(function ([entry]) { - const ratio = entry.intersectionRatio - if (ratio < 1) { - const place = ratio <= 0 && centerIfNeeded ? `center` : `nearest` - elem.scrollIntoView({ - block: place, - inline: place - }) - } - observer.disconnect() - }, { - root: null, // or specify a scrolling parent if needed - rootMargin: '0px 1000px', // Essentially making horizontal checks irrelevant - threshold: 0.1 // Adjust threshold to control when observer should trigger -}) - observer.observe(elem) - - return observer // return for testing -} diff --git a/frontend/src/lib/components/runs/RunsFilter.svelte b/frontend/src/lib/components/runs/RunsFilter.svelte index 6fd0b0ed03..77ab068bfe 100644 --- a/frontend/src/lib/components/runs/RunsFilter.svelte +++ b/frontend/src/lib/components/runs/RunsFilter.svelte @@ -12,7 +12,8 @@ import { createEventDispatcher, untrack } from 'svelte' import ToggleButtonMore from '../common/toggleButton-v2/ToggleButtonMore.svelte' import Popover from '$lib/components/meltComponents/Popover.svelte' - import Select from '../Select.svelte' + import Select from '../select/Select.svelte' + import { safeSelectItems } from '../select/utils.svelte' interface Props { // Filters @@ -174,7 +175,7 @@
User ({ label: p, value: p }))} + items={safeSelectItems(folders)} bind:value={() => folder ?? undefined, (v) => (folder = v ?? null)} clearable onClear={() => ((folder = null), dispatch('reset'))} @@ -203,7 +204,7 @@
Path ({ label: p, value: p }))} + items={safeSelectItems(usernames)} bind:value={() => user ?? undefined, (v) => (user = v ?? null)} clearable onClear={() => ((user = null), dispatch('reset'))} @@ -575,7 +576,7 @@
+ {/if} + {/snippet} + +
diff --git a/frontend/src/lib/components/select/Select.svelte b/frontend/src/lib/components/select/Select.svelte new file mode 100644 index 0000000000..ec0a4dcc47 --- /dev/null +++ b/frontend/src/lib/components/select/Select.svelte @@ -0,0 +1,156 @@ + + +
(open = false) }} + onpointerdown={() => onFocus?.()} + onfocus={() => onFocus?.()} + onblur={() => onBlur?.()} +> + {#if loading} +
+ +
+ {:else if clearable && !disabled && value} +
+ +
+ {:else if RightIcon} +
+ +
+ {/if} + + filterText, (v) => (filterText = v)} + placeholder={loading ? 'Loading...' : (valueEntry?.label ?? placeholder)} + style={containerStyle} + class={twMerge( + '!bg-surface text-ellipsis', + open ? '' : 'cursor-pointer', + valueEntry && !loading ? '!placeholder-primary' : '', + (clearable || RightIcon) && !disabled && value ? '!pr-8' : '', + inputClass ?? '' + )} + autocomplete="off" + onpointerdown={() => (open = true)} + bind:this={inputEl} + /> + inputEl!.getBoundingClientRect())} + {listAutoWidth} + {noItemsMsg} + /> +
diff --git a/frontend/src/lib/components/select/SelectDropdown.svelte b/frontend/src/lib/components/select/SelectDropdown.svelte new file mode 100644 index 0000000000..7780828a70 --- /dev/null +++ b/frontend/src/lib/components/select/SelectDropdown.svelte @@ -0,0 +1,147 @@ + + + { + if (!open || !processedItems?.length) return + if (e.key === 'ArrowUp' && keyArrowPos !== undefined && processedItems.length > 0) { + keyArrowPos = keyArrowPos <= 0 ? undefined : keyArrowPos - 1 + } else if (e.key === 'ArrowDown') { + if (keyArrowPos === undefined) { + keyArrowPos = 0 + } else { + keyArrowPos = Math.min(processedItems.length - 1, keyArrowPos + 1) + } + } else if (e.key === 'Enter' && keyArrowPos !== undefined && processedItems?.[keyArrowPos]) { + onSelectValue(processedItems[keyArrowPos]) + } else { + keyArrowPos = undefined + return + } + e.preventDefault() + }} +/> + + + {#if open && !disabled} +
+ {@render header?.()} + {#if processedItems?.length === 0} +
{noItemsMsg}
+ {/if} +
    + {#each processedItems ?? [] as item, itemIndex} + {#if (item.__select_group && itemIndex === 0) || processedItems?.[itemIndex - 1]?.__select_group !== item.__select_group} +
  • + {item.__select_group} +
  • + {/if} +
  • + +
  • + {/each} +
+
+ {/if} +
diff --git a/frontend/src/lib/components/select/utils.svelte.ts b/frontend/src/lib/components/select/utils.svelte.ts new file mode 100644 index 0000000000..f3d43b40c1 --- /dev/null +++ b/frontend/src/lib/components/select/utils.svelte.ts @@ -0,0 +1,72 @@ +export function processItems({ + items, + filterText, + groupBy, + sortBy, + onCreateItem, + createText +}: { + items?: Item[] + filterText?: string + groupBy?: (item: Item) => string + sortBy?: (a: Item, b: Item) => number + onCreateItem?: (value: string) => void + createText?: string +}): ProcessedItem[] { + let items2 = + items?.map((item) => ({ + ...item, + label: getLabel(item) + })) ?? [] + if (groupBy) { + items2 = + items2?.map((item) => ({ + ...item, + __select_group: groupBy(item) + })) ?? [] + } + if (sortBy) { + items2 = items2?.sort(sortBy) + } + if (onCreateItem && filterText && !items2.some((item) => item.label === filterText)) { + items2.push({ + label: createText ?? `Add new: "${filterText}"`, + value: filterText, + __is_create: true + } as any) + } + return items2 +} + +export type ProcessedItem = { + __select_group?: string + __is_create?: true + label: string + value: T +} + +export function getLabel(item: { label?: string; value: T } | undefined): string { + if (!item) return '' + if (item.label) return item.label + if (typeof item.value === 'string') return item.value + if (typeof item.value == 'number' || typeof item.value == 'boolean') return item.value.toString() + + return JSON.stringify(item.value) +} + +export function safeSelectItems( + list: (T | { value: T; label?: string } | undefined | null)[] | undefined | null +): { value: T; label?: string }[] { + if (!list) return [] + return list + .filter((item) => item !== undefined && item !== null) + .map((item) => { + if (typeof item === 'string' || typeof item === 'number' || typeof item === 'boolean') { + return { value: item } + } + if (typeof item === 'object' && 'value' in item) { + return item + } + return { value: null as any, label: 'UNKNOWN_ITEM' } + }) +} diff --git a/frontend/src/lib/components/settings/CreateToken.svelte b/frontend/src/lib/components/settings/CreateToken.svelte index dd25ca2da9..70c60e2aca 100644 --- a/frontend/src/lib/components/settings/CreateToken.svelte +++ b/frontend/src/lib/components/settings/CreateToken.svelte @@ -3,7 +3,6 @@ import { Button } from '../common' import ToggleButton from '../common/toggleButton-v2/ToggleButton.svelte' import ToggleButtonGroup from '../common/toggleButton-v2/ToggleButtonGroup.svelte' - import MultiSelectWrapper from '../multiselect/MultiSelectWrapper.svelte' import TriggerableByAI from '../TriggerableByAI.svelte' import Toggle from '../Toggle.svelte' import { UserService, type NewToken } from '$lib/gen' @@ -39,7 +38,7 @@ let newMcpScope = $state('favorites') let loadingApps = $state(false) let errorFetchApps = $state(false) - let allApps = $state([]) + // let allApps = $state([]) function handleCopyClick() { copyToClipboard(newToken ?? '') @@ -205,7 +204,7 @@ {:else if errorFetchApps}
Error fetching apps
{:else} - + {/if}
diff --git a/frontend/src/lib/components/settings/TokensTable.svelte b/frontend/src/lib/components/settings/TokensTable.svelte index 9601b92f67..d66e6c2df1 100644 --- a/frontend/src/lib/components/settings/TokensTable.svelte +++ b/frontend/src/lib/components/settings/TokensTable.svelte @@ -12,8 +12,9 @@ import Toggle from '../Toggle.svelte' import ClipboardPanel from '../details/ClipboardPanel.svelte' import { sendUserToast } from '$lib/toast' - import MultiSelectWrapper from '../multiselect/MultiSelectWrapper.svelte' import TriggerableByAI from '../TriggerableByAI.svelte' + import MultiSelect from '../select/MultiSelect.svelte' + import { safeSelectItems } from '../select/utils.svelte' // --- Props --- interface Props { @@ -306,10 +307,11 @@ {:else if errorFetchApps}
Error fetching apps
{:else} - {/if}
@@ -319,7 +321,7 @@ +
{#if !mcpCreationMode} @@ -339,7 +341,7 @@ Expires In (optional) - diff --git a/frontend/src/lib/components/triggers/gcp/GcpTriggerEditorConfigSection.svelte b/frontend/src/lib/components/triggers/gcp/GcpTriggerEditorConfigSection.svelte index 83aa8633ce..60751a4595 100644 --- a/frontend/src/lib/components/triggers/gcp/GcpTriggerEditorConfigSection.svelte +++ b/frontend/src/lib/components/triggers/gcp/GcpTriggerEditorConfigSection.svelte @@ -23,7 +23,8 @@ import { RefreshCw } from 'lucide-svelte' import Alert from '$lib/components/common/alert/Alert.svelte' import TestingBadge from '../testingBadge.svelte' - import Select from '$lib/components/Select.svelte' + import Select from '$lib/components/select/Select.svelte' + import { safeSelectItems } from '$lib/components/select/utils.svelte' let topic_items: string[] = $state([]) let subscription_items: string[] = $state([]) @@ -176,7 +177,7 @@ loadAllSubscriptionFromGooglePubSubTopic() } } - items={topic_items.map((value) => ({ value }))} + items={safeSelectItems(topic_items)} placeholder="Choose a topic" /> - {/if} -
- {/each} -
- -{#if $superadmin} -
- + {#if _items.error} +
+ error: {JSON.stringify(_items.error)} +
{/if}
{:else} @@ -153,7 +121,7 @@ {#await import('$lib/components/JsonEditor.svelte')} {:then Module} - + {/await}
{/if} diff --git a/frontend/src/lib/components/apps/svelte-select/lib/SelectLegacy.svelte b/frontend/src/lib/components/apps/svelte-select/lib/SelectLegacy.svelte deleted file mode 100644 index 201a4ab7d7..0000000000 --- a/frontend/src/lib/components/apps/svelte-select/lib/SelectLegacy.svelte +++ /dev/null @@ -1,1043 +0,0 @@ - - - - - -
- {#if listOpen} - -
- {#if $$slots['list-prepend']}{/if} - {#if $$slots.list} - {:else if filteredItems.length > 0} - {#each filteredItems as item, i} -
handleHover(i)} - on:focus={() => handleHover(i)} - on:click|stopPropagation={() => handleItemClick({ item, i })} - on:keydown|preventDefault|stopPropagation - class="list-item" - tabindex="-1" - > -
- - {item ? truncate(item?.[label], 80) : ''} - -
-
- {/each} - {:else if !hideEmptyState} - -
No options
-
- {/if} - {#if $$slots['list-append']}{/if} -
-
- {/if} - - - {#if focused} - {ariaSelection} - - {ariaContext} - - {/if} - - -
- -
- -
- {#if hasValue} -
- - {value[label]} - -
- {/if} - - -
- -
- {#if loading} - - {/if} - - {#if showClear} - - {/if} - - {#if showChevron} - - {/if} -
- - - - - - {#if required && (!value || value.length === 0)} - - - - {/if} -
- - diff --git a/frontend/src/lib/components/apps/svelte-select/lib/index.js b/frontend/src/lib/components/apps/svelte-select/lib/index.js deleted file mode 100644 index 80d0787c5f..0000000000 --- a/frontend/src/lib/components/apps/svelte-select/lib/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default as default } from './SelectLegacy.svelte' diff --git a/frontend/src/lib/components/select/MultiSelect.svelte b/frontend/src/lib/components/select/MultiSelect.svelte index 171528078e..e94a3cb72f 100644 --- a/frontend/src/lib/components/select/MultiSelect.svelte +++ b/frontend/src/lib/components/select/MultiSelect.svelte @@ -74,7 +74,7 @@ }) let valueEntry = $derived( - value.map((v) => processedItems.find((item) => item.value === v)!).filter(Boolean) + value.map((v) => processedItems.find((item) => item.value === v) ?? { value: v, label: v }) ) function onAddValue(item: ProcessedItem) { diff --git a/frontend/src/lib/components/select/Select.svelte b/frontend/src/lib/components/select/Select.svelte index ec0a4dcc47..69fb7bf16c 100644 --- a/frontend/src/lib/components/select/Select.svelte +++ b/frontend/src/lib/components/select/Select.svelte @@ -4,7 +4,7 @@ import CloseButton from '../common/CloseButton.svelte' import { Loader2 } from 'lucide-svelte' import { untrack } from 'svelte' - import { processItems, type ProcessedItem } from './utils.svelte' + import { getLabel, processItems, type ProcessedItem } from './utils.svelte' import SelectDropdown from './SelectDropdown.svelte' import { deepEqual } from 'fast-equals' @@ -14,7 +14,7 @@ items, placeholder = 'Please select', value = $bindable(), - filterText: _filterTextBind = $bindable(undefined), + filterText = $bindable(''), class: className = '', clearable = false, listAutoWidth = true, @@ -27,6 +27,7 @@ RightIcon, createText, noItemsMsg, + open = $bindable(false), groupBy, sortBy, onFocus, @@ -50,6 +51,7 @@ RightIcon?: any createText?: string noItemsMsg?: string + open?: boolean groupBy?: (item: Item) => string sortBy?: (a: Item, b: Item) => number onFocus?: () => void @@ -60,8 +62,6 @@ let disabled = $derived(_disabled || loading) - let filterText = $state('') - let open = $state(false) let inputEl: HTMLInputElement | undefined = $state() let processedItems: ProcessedItem[] = $derived.by(() => { @@ -69,13 +69,6 @@ return untrack(() => processItems(args)) }) - $effect(() => { - if (_filterTextBind !== undefined) filterText = _filterTextBind - }) - $effect(() => { - if (_filterTextBind !== undefined) _filterTextBind = filterText - }) - $effect(() => { if (filterText) open = true }) @@ -128,12 +121,12 @@ {disabled} type="text" bind:value={() => filterText, (v) => (filterText = v)} - placeholder={loading ? 'Loading...' : (valueEntry?.label ?? placeholder)} + placeholder={loading ? 'Loading...' : (valueEntry?.label ?? getLabel({ value }) ?? placeholder)} style={containerStyle} class={twMerge( '!bg-surface text-ellipsis', open ? '' : 'cursor-pointer', - valueEntry && !loading ? '!placeholder-primary' : '', + value && !loading ? '!placeholder-primary' : '', (clearable || RightIcon) && !disabled && value ? '!pr-8' : '', inputClass ?? '' )} diff --git a/frontend/src/lib/components/select/SelectDropdown.svelte b/frontend/src/lib/components/select/SelectDropdown.svelte index 7780828a70..a589bc22ff 100644 --- a/frontend/src/lib/components/select/SelectDropdown.svelte +++ b/frontend/src/lib/components/select/SelectDropdown.svelte @@ -137,7 +137,7 @@ onSelectValue(item) }} > - {item.label} + {item.label || '\xa0'} {/each} diff --git a/frontend/src/lib/components/wizards/AppPicker.svelte b/frontend/src/lib/components/wizards/AppPicker.svelte index 6dd15edf18..b0369d3c96 100644 --- a/frontend/src/lib/components/wizards/AppPicker.svelte +++ b/frontend/src/lib/components/wizards/AppPicker.svelte @@ -1,16 +1,14 @@
- { - value = e.detail.value - }} - on:clear={() => { - value = '' - }} - bind:value={selecteValue} - items={apps.map((app) => { - return { - value: app.path, - label: app.path === $appPath ? `${app.path} (current app)` : app.path - } - })} + - -
- {#if !$enterpriseLicense} -
- Agent workers are only available in the enterprise edition. For evaluation purposes, you can - only use the tag `agent_test` tag and it is limited to 100 jobs. -
- {/if} - -
+ + Create + Blacklist + {#snippet content()} +
+ {#if selectedTab === 'create'} + Use HTTP agent workers only when the workers need to be deployed remotely OR with only + HTTP connectivity OR in untrusted environments. HTTP agent workers have more latency and + less capabilities than normal workers. +
+
+ +
+
+ {#if !$enterpriseLicense} +
+ Agent workers are only available in the enterprise edition. For evaluation purposes, + you can only use the tag `agent_test` tag and it is limited to 100 jobs. +
+ {/if} + +
-
- {#if !$enterpriseLicense} -
- Agent workers are only available in the enterprise edition. For evaluation purposes, you can - only use the tag `agent_test` tag and it is limited to 100 jobs. -
- {/if} -
- - { - if (token) { - navigator.clipboard.writeText(token) - sendUserToast('Copied to clipboard') - } - }} - placeholder="Select tags to generate a JWT token" - type="text" - disabled - value={token} - class="w-full pr-10 pl-3 py-2 text-sm text-gray-600 bg-gray-50 border border-gray-300 rounded-lg cursor-pointer hover:bg-gray-100 transition truncate" - /> +
+ {#if !$enterpriseLicense} +
+ Agent workers are only available in the enterprise edition. For evaluation purposes, + you can only use the tag `agent_test` tag and it is limited to 100 jobs. +
+ {/if} +
+ { + e.preventDefault() + e.stopPropagation() + if (token) { + navigator.clipboard.writeText(token) + sendUserToast('Copied to clipboard') + } + }} + placeholder="Select tags to generate a JWT token" + type="text" + disabled + value={token} + class="w-full pr-10 pl-3 py-2 text-sm text-gray-600 bg-gray-50 border border-gray-300 rounded-lg cursor-pointer hover:bg-gray-100 transition truncatere" + /> - - -
+ +
-
- Set the following environment variables: -
    -
  • MODE=agent
  • -
  • AGENT_TOKEN=<token>
  • -
  • BASE_INTERNAL_URL=<base url>
  • -
-

- to a worker to have it act as an HTTP agent worker. - INIT_SCRIPT, if needed, must be passed as an env variable. -

- - Ensure at least one normal worker is running and listening to the tags - flow and dependency - (or flow-<workspace> and dependency-<workspace> if - using workspace-specific default tags), because agent workers - cannot run dependency jobs - nor execute the - flow state machine. They can, however, run subjobs within flows. - - -
- Use the following API endpoint with a superadmin bearer token: - POST /api/agent_workers/create_agent_token -
+						
+ Set the following environment variables: +
    +
  • MODE=agent
  • +
  • AGENT_TOKEN=<token>
  • +
  • BASE_INTERNAL_URL=<base url>
  • +
+

+ to a worker to have it act as an HTTP agent worker. + INIT_SCRIPT, if needed, must be passed as an env variable. +

+ + Ensure at least one normal worker is running and listening to the tags + flow and dependency + (or flow-<workspace> and + dependency-<workspace> + if using workspace-specific default tags), because agent workers + cannot run dependency jobs + nor execute the + flow state machine. They can, however, run subjobs within flows. + + +
+ Use the following API endpoint with a superadmin bearer token: + POST /api/agent_workers/create_agent_token +
 	{`
+											>{`
 	  "worker_group": "agent",
 	  "tags": ["tag1", "tag2"],
 	  "exp": 1717334400
 	`}
-					
- The JSON response will contain the generated JWT token. + > +
+ The JSON response will contain the generated JWT token. +
+
+
+
- + {:else if selectedTab === 'blacklist'} +
+
+ {#if !$enterpriseLicense} +
+ Token blacklist management is only available in the enterprise edition. +
+ {:else} +
+ Add tokens to the blacklist to prevent them from being used by agent workers. + Blacklisted tokens may take up to 5 minutes to be effective because of caching. +
+ +
+
+ + +
+
+ +
+ + {#if !$superadmin} +
+ Only superadmins can manage the token blacklist. +
+ {/if} +
+ + +
+
+

Blacklisted Tokens

+ +
+ + {#if isLoadingBlacklist} +
Loading blacklisted tokens...
+ {:else if blacklistedTokens?.length === 0} +
+ No tokens are currently blacklisted. +
+ {:else} +
+ {#each blacklistedTokens ?? [] as blacklistedToken} +
+
+
+ {blacklistedToken.token} +
+ {#if blacklistedToken.expires_at} +
+ Expires: {new Date(blacklistedToken.expires_at).toLocaleString()} +
+ {/if} +
+ {#if $superadmin} + + {/if} +
+ {/each} +
+ {/if} +
+ {/if} +
+
+ {/if}
- -
+ {/snippet} + From 934ae4fe5740ceb83f234b658f1bfae010f411af Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Fri, 20 Jun 2025 12:12:07 +0200 Subject: [PATCH 665/739] rm WM_OIDC_JWT from ctx vars --- frontend/src/lib/deno_fetch.d.ts.txt | 1 - frontend/src/lib/process.d.ts.txt | 1 - 2 files changed, 2 deletions(-) diff --git a/frontend/src/lib/deno_fetch.d.ts.txt b/frontend/src/lib/deno_fetch.d.ts.txt index d61301f4bb..b4586ca93b 100644 --- a/frontend/src/lib/deno_fetch.d.ts.txt +++ b/frontend/src/lib/deno_fetch.d.ts.txt @@ -438,7 +438,6 @@ interface Process { WM_STATE_PATH: string; WM_FLOW_STEP_ID: string; WM_OBJECT_PATH: string; - WM_OIDC_JWT: string; WM_WORKER_GROUP: string; } } \ No newline at end of file diff --git a/frontend/src/lib/process.d.ts.txt b/frontend/src/lib/process.d.ts.txt index 74a58de0c8..e80b2f13ae 100644 --- a/frontend/src/lib/process.d.ts.txt +++ b/frontend/src/lib/process.d.ts.txt @@ -174,7 +174,6 @@ declare module 'process' { WM_STATE_PATH: string WM_FLOW_STEP_ID: string WM_OBJECT_PATH: string - WM_OIDC_JWT: string WM_WORKER_GROUP: string } interface HRTime { From b3b6c534307ceef451e1596c7336db80435f0e5f Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Fri, 20 Jun 2025 12:12:38 +0200 Subject: [PATCH 666/739] remove WM_OIDC_JWT from context vars --- backend/windmill-api/src/resources.rs | 1 - backend/windmill-api/src/variables.rs | 3 +-- backend/windmill-common/src/variables.rs | 7 ------- backend/windmill-worker/src/bun_executor.rs | 1 - backend/windmill-worker/src/common.rs | 1 - backend/windmill-worker/src/deno_executor.rs | 4 +--- backend/windmill-worker/src/python_executor.rs | 2 -- 7 files changed, 2 insertions(+), 17 deletions(-) diff --git a/backend/windmill-api/src/resources.rs b/backend/windmill-api/src/resources.rs index 14fdfef536..19fd422805 100644 --- a/backend/windmill-api/src/resources.rs +++ b/backend/windmill-api/src/resources.rs @@ -583,7 +583,6 @@ pub async fn transform_json_value<'c>( job.schedule_path.clone(), job.flow_step_id.clone(), job.root_job.map(|x| x.to_string()), - None, Some(job.scheduled_for.clone()), ) .await; diff --git a/backend/windmill-api/src/variables.rs b/backend/windmill-api/src/variables.rs index 4b6601e1e6..c1192feb3b 100644 --- a/backend/windmill-api/src/variables.rs +++ b/backend/windmill-api/src/variables.rs @@ -74,8 +74,7 @@ async fn list_contextual_variables( Some("u/user/triggering_flow_path".to_string()), Some("c".to_string()), Some("017e0ad5-f499-73b6-5488-92a61c5196dd".to_string()), - Some("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c".to_string()), - Some(chrono::offset::Utc::now()) + Some(chrono::offset::Utc::now()), ) .await .to_vec(), diff --git a/backend/windmill-common/src/variables.rs b/backend/windmill-common/src/variables.rs index 3fd2e0513b..1dfa1438d8 100644 --- a/backend/windmill-common/src/variables.rs +++ b/backend/windmill-common/src/variables.rs @@ -180,7 +180,6 @@ pub async fn get_reserved_variables( schedule_path: Option, step_id: Option, root_flow_id: Option, - jwt_token: Option, scheduled_for: Option>, ) -> Vec { let state_path = { @@ -334,12 +333,6 @@ pub async fn get_reserved_variables( description: "Script or flow step execution unique path, useful for storing results in an external service".to_string(), is_custom: false, }, - ContextualVariable { - name: "WM_OIDC_JWT".to_string(), - value: jwt_token.unwrap_or_else(|| "".to_string()), - description: "OIDC JWT token (EE only)".to_string(), - is_custom: false, - }, ContextualVariable { name: "WM_WORKER_GROUP".to_string(), value: WORKER_GROUP.clone(), diff --git a/backend/windmill-worker/src/bun_executor.rs b/backend/windmill-worker/src/bun_executor.rs index fa64832ee4..cbe389403b 100644 --- a/backend/windmill-worker/src/bun_executor.rs +++ b/backend/windmill-worker/src/bun_executor.rs @@ -1566,7 +1566,6 @@ pub async fn start_worker( None, None, None, - None, ) .await; let context_envs = build_envs_map(context.to_vec()).await; diff --git a/backend/windmill-worker/src/common.rs b/backend/windmill-worker/src/common.rs index b419626845..3b5312c14c 100644 --- a/backend/windmill-worker/src/common.rs +++ b/backend/windmill-worker/src/common.rs @@ -434,7 +434,6 @@ pub async fn get_reserved_variables( job.schedule_path(), job.flow_step_id.clone(), job.flow_innermost_root_job.clone().map(|x| x.to_string()), - None, Some(job.scheduled_for.clone()), ) .await diff --git a/backend/windmill-worker/src/deno_executor.rs b/backend/windmill-worker/src/deno_executor.rs index 2215c94d8d..e9db387b03 100644 --- a/backend/windmill-worker/src/deno_executor.rs +++ b/backend/windmill-worker/src/deno_executor.rs @@ -11,8 +11,7 @@ use crate::{ start_child_process, OccupancyMetrics, }, handle_child::handle_child, - DENO_CACHE_DIR, DENO_PATH, DISABLE_NSJAIL, HOME_ENV, NPM_CONFIG_REGISTRY, - PATH_ENV, TZ_ENV, + DENO_CACHE_DIR, DENO_PATH, DISABLE_NSJAIL, HOME_ENV, NPM_CONFIG_REGISTRY, PATH_ENV, TZ_ENV, }; use windmill_common::client::AuthedClient; @@ -534,7 +533,6 @@ pub async fn start_worker( None, None, None, - None, ) .await; let context_envs = build_envs_map(context.to_vec()).await; diff --git a/backend/windmill-worker/src/python_executor.rs b/backend/windmill-worker/src/python_executor.rs index 90ef0afccd..90be4e9cfc 100644 --- a/backend/windmill-worker/src/python_executor.rs +++ b/backend/windmill-worker/src/python_executor.rs @@ -2077,7 +2077,6 @@ pub async fn start_worker( None, None, None, - None, ) .await .to_vec(); @@ -2197,7 +2196,6 @@ for line in sys.stdin: None, None, None, - None, ) .await; From 3e822823519d1d5c22e422e4bd1ad4d37b6428b6 Mon Sep 17 00:00:00 2001 From: "claude[bot]" <209825114+claude[bot]@users.noreply.github.com> Date: Fri, 20 Jun 2025 12:31:52 +0200 Subject: [PATCH 667/739] feat: add typescript client context to ai chat system prompt (#6004) * feat: add typescript client context to ai chat system prompt Add windmill client function signatures and descriptions to the TypeScript language context in the AI chat system. This provides users with inline documentation for key windmill client functions including resource operations, state management, variables, script execution, S3 operations, and flow utilities. The context is kept concise to avoid making the system prompt too large while still providing the most useful function signatures for TypeScript scripts. Resolves #6002 Co-authored-by: Ruben Fiszel * fix import * feat: add python client context to ai chat system prompt Add PYTHON_WINDMILL_CLIENT_CONTEXT with function signatures and descriptions for key windmill client functions in Python, including: - Resource operations (get_resource, set_resource) - State management (get_state, set_state, get_flow_user_state, set_flow_user_state) - Variables (get_variable, set_variable) - Script execution (run_script, run_script_async, wait_job) - S3 file operations (load_s3_file, write_s3_file) - Flow operations (run_flow_async, get_resume_urls) - Utilities (whoami, get_job_status, set_progress) The context is now included for Python language (python3) in the AI chat system prompt, providing users with helpful function signatures and descriptions when asking for coding assistance. Co-authored-by: centdix --------- Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com> Co-authored-by: Ruben Fiszel Co-authored-by: centdix Co-authored-by: centdix --- .../components/copilot/chat/script/core.ts | 77 ++++++++++++++++++- 1 file changed, 75 insertions(+), 2 deletions(-) diff --git a/frontend/src/lib/components/copilot/chat/script/core.ts b/frontend/src/lib/components/copilot/chat/script/core.ts index d26210f7c7..72af4d8b8a 100644 --- a/frontend/src/lib/components/copilot/chat/script/core.ts +++ b/frontend/src/lib/components/copilot/chat/script/core.ts @@ -61,6 +61,76 @@ You should only use them if you need them to satisfy the user's instructions. Al const TS_INLINE_TYPE_INSTRUCTION = `When using resource types, you should use RT.ResourceType as parameter type. For other parameters, you should inline the objects types instead of defining them separately. This is because Windmill requires the types (other than resource types) to be inlined to generate a user friendly UI from the parameters.` +const TS_WINDMILL_CLIENT_CONTEXT = ` + +The windmill client (wmill) can be used to interact with Windmill from the script. Import it with \`import * as wmill from "windmill-client"\`. Key functions include: + +// Resource operations +wmill.getResource(path?: string): Promise // Get resource value by path +wmill.setResource(value: any, path?: string): Promise // Set resource value + +// State management (persistent across executions) +wmill.getState(): Promise // Get shared state +wmill.setState(state: any): Promise // Set shared state + +// Variables +wmill.getVariable(path: string): Promise // Get variable value +wmill.setVariable(path: string, value: string): Promise // Set variable value + +// Script execution +wmill.runScript(path: string, args?: Record): Promise // Run script synchronously +wmill.runScriptAsync(path: string, args?: Record): Promise // Run script async, returns job ID +wmill.waitJob(jobId: string): Promise // Wait for job completion and get result + +// S3 file operations (if S3 is configured) +wmill.loadS3File(s3object: S3Object): Promise // Load file content from S3 +wmill.writeS3File(s3object: S3Object, content: string | Blob): Promise // Write file to S3 + +// Flow operations +wmill.setFlowUserState(key: string, value: any): Promise // Set flow user state +wmill.getFlowUserState(key: string): Promise // Get flow user state +wmill.getResumeUrls(): Promise<{approvalPage: string, resume: string, cancel: string}> // Get approval URLs + +// Utilities +wmill.getWorkspace(): string // Get current workspace +wmill.databaseUrlFromResource(path: string): Promise // Get database URL from resource` + +const PYTHON_WINDMILL_CLIENT_CONTEXT = ` + +The windmill client (wmill) can be used to interact with Windmill from the script. Import it with \`import wmill\`. Key functions include: + +// Resource operations +wmill.get_resource(path: str) -> dict | None // Get resource value by path +wmill.set_resource(path: str, value: Any, resource_type: str = "any") -> None // Set resource value + +// State management (persistent across executions) +wmill.get_state() -> Any // Get shared state (deprecated, use flow user state) +wmill.set_state(value: Any) -> None // Set shared state +wmill.get_flow_user_state(key: str) -> Any // Get flow user state +wmill.set_flow_user_state(key: str, value: Any) -> None // Set flow user state + +// Variables +wmill.get_variable(path: str) -> str // Get variable value +wmill.set_variable(path: str, value: str, is_secret: bool = False) -> None // Set variable value + +// Script execution +wmill.run_script(path: str, args: dict = None, timeout = None) -> Any // Run script synchronously +wmill.run_script_async(path: str, args: dict = None, scheduled_in_secs: int = None) -> str // Run script async, returns job ID +wmill.wait_job(job_id: str, timeout = None) -> Any // Wait for job completion and get result + +// S3 file operations (if S3 is configured) +wmill.load_s3_file(s3object: S3Object, s3_resource_path: str = None) -> bytes // Load file content from S3 +wmill.write_s3_file(s3object: S3Object, file_content: bytes, s3_resource_path: str = None) -> S3Object // Write file to S3 + +// Flow operations +wmill.run_flow_async(path: str, args: dict = None) -> str // Run flow asynchronously +wmill.get_resume_urls(approver: str = None) -> dict // Get approval URLs for flow steps + +// Utilities +wmill.whoami() -> dict // Get current user information +wmill.get_job_status(job_id: str) -> str // Get job status ("RUNNING" | "WAITING" | "COMPLETED") +wmill.set_progress(value: int) -> None // Set job progress (0-100)` + const PYTHON_RESOURCE_TYPE_SYSTEM = `On Windmill, credentials and configuration are stored in resources and passed as parameters to main. If you need credentials, you should add a parameter to \`main\` with the corresponding resource type. You need to **redefine** the type of the resources that are needed before the main function as TypedDict, but only include them if they are actually needed to achieve the function purpose. @@ -124,7 +194,9 @@ export function getLangContext( : TS_RESOURCE_TYPE_SYSTEM + (allowResourcesFetch ? `To query the RT namespace, you can use the \`search_resource_types\` tool.\n` - : '')) + TS_INLINE_TYPE_INSTRUCTION + : '')) + + TS_INLINE_TYPE_INSTRUCTION + + TS_WINDMILL_CLIENT_CONTEXT const mainFunctionName = isPreprocessor ? 'preprocessor' : 'main' @@ -152,7 +224,8 @@ export function getLangContext( (isPreprocessor ? PYTHON_PREPROCESSOR_INSTRUCTION : PYTHON_RESOURCE_TYPE_SYSTEM + - `${allowResourcesFetch ? `\nTo query the available resource types, you can use the \`search_resource_types\` tool.` : ''}`) + `${allowResourcesFetch ? `\nTo query the available resource types, you can use the \`search_resource_types\` tool.` : ''}`) + + PYTHON_WINDMILL_CLIENT_CONTEXT ) case 'php': return ( From 88ab1a513605722c1ea9737279303127ff4c5942 Mon Sep 17 00:00:00 2001 From: pyranota <92104930+pyranota@users.noreply.github.com> Date: Fri, 20 Jun 2025 13:24:27 +0200 Subject: [PATCH 668/739] Use regex to split input to python import parser (#6007) --- .../parsers/windmill-parser-py-imports/src/lib.rs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/backend/parsers/windmill-parser-py-imports/src/lib.rs b/backend/parsers/windmill-parser-py-imports/src/lib.rs index 4e51be6b6a..3e84a4f7a5 100644 --- a/backend/parsers/windmill-parser-py-imports/src/lib.rs +++ b/backend/parsers/windmill-parser-py-imports/src/lib.rs @@ -30,8 +30,6 @@ use windmill_common::{ worker::PythonAnnotations, }; -const DEF_MAIN: &str = "def main("; - fn replace_import(x: String) -> String { SHORT_IMPORTS_MAP .get(&x) @@ -48,6 +46,9 @@ lazy_static! { static ref RE: Regex = Regex::new(r"^\#\s?(\S+)\s*$").unwrap(); static ref PIN_RE: Regex = Regex::new(r"(?:\s*#\s*(pin|repin):\s*)(\S*)").unwrap(); static ref PKG_RE: Regex = Regex::new(r"^([^!=<>]+)(?:[!=<>]|$)").unwrap(); + // Regex to properly match main function definition at line start, + // capturing both sync and async variants + static ref DEF_MAIN_RE: Regex = Regex::new(r"(?m)^(async\s+)?def\s+main\s*\(").unwrap(); } fn process_import(module: Option, path: &str, level: usize) -> Vec { @@ -143,7 +144,12 @@ struct ImportPin { } fn parse_code_for_imports(code: &str, path: &str) -> error::Result> { - let mut code = code.split(DEF_MAIN).next().unwrap_or("").to_string(); + // Use regex to safely find the main function definition + let mut code = DEF_MAIN_RE + .split(code) + .next() + .unwrap_or_default() + .to_string(); // remove main function decorator from end of file if it exists if code From af6b724f0bca85cc62411ec7ce93b9c4b0cc38b0 Mon Sep 17 00:00:00 2001 From: centdix <40307056+centdix@users.noreply.github.com> Date: Fri, 20 Jun 2025 13:32:33 +0200 Subject: [PATCH 669/739] internal: use git app for git actions (#6010) * add flow to ask claude to review pr * allow app for claude * cleaning * use app for change versions flow * add owner * fix * rename --- .github/workflows/change-versions.yml | 12 +++++ .github/workflows/check-org-membership.yml | 60 ++++++++++++++++++++++ .github/workflows/claude.yml | 52 ++++++++----------- .github/workflows/create-docs.yml | 44 ++++++++-------- .github/workflows/helmchart_on_release.yml | 12 ++++- .github/workflows/pr-ready-review.yml | 29 +++++++++++ 6 files changed, 152 insertions(+), 57 deletions(-) create mode 100644 .github/workflows/check-org-membership.yml create mode 100644 .github/workflows/pr-ready-review.yml diff --git a/.github/workflows/change-versions.yml b/.github/workflows/change-versions.yml index 034b022f06..eea62bf6b7 100644 --- a/.github/workflows/change-versions.yml +++ b/.github/workflows/change-versions.yml @@ -9,7 +9,14 @@ jobs: runs-on: ubicloud container: node:18 steps: + - uses: actions/create-github-app-token@v2 + id: app + with: + app-id: ${{ vars.INTERNAL_APP_ID }} + private-key: ${{ secrets.INTERNAL_APP_KEY }} - uses: actions/checkout@v4 + with: + token: ${{ steps.app.outputs.token }} - run: git config --system --add safe.directory /__w/windmill/windmill - name: Change versions run: ./.github/change-versions.sh "$(cat version.txt)" @@ -21,3 +28,8 @@ jobs: cd backend cargo generate-lockfile - uses: stefanzweifel/git-auto-commit-action@v5 + with: + commit_user_name: windmill-internal-app[bot] + commit_user_email: windmill-internal-app[bot]@users.noreply.github.com + env: + GITHUB_TOKEN: ${{ steps.app.outputs.token }} diff --git a/.github/workflows/check-org-membership.yml b/.github/workflows/check-org-membership.yml new file mode 100644 index 0000000000..910c39c7ba --- /dev/null +++ b/.github/workflows/check-org-membership.yml @@ -0,0 +1,60 @@ +name: Check Organization Membership + +on: + workflow_call: + inputs: + commenter: + required: true + type: string + description: 'The username to check for organization membership' + organization: + required: false + type: string + default: 'windmill-labs' + description: 'The organization to check membership for' + trusted_bot: + required: false + type: string + default: 'windmill-internal-app[bot]' + description: 'The trusted bot username to allow' + secrets: + access_token: + required: true + description: 'The access token to use for org membership check' + outputs: + is_member: + description: 'Whether the user is an organization member or trusted bot' + value: ${{ jobs.check-membership.outputs.is_member }} + +jobs: + check-membership: + runs-on: ubicloud-standard-2 + outputs: + is_member: ${{ steps.check-membership.outputs.is_member }} + steps: + - name: Check organization membership + id: check-membership + env: + ORG_ACCESS_TOKEN: ${{ secrets.access_token }} + COMMENTER: ${{ inputs.commenter }} + ORG: ${{ inputs.organization }} + TRUSTED_BOT: ${{ inputs.trusted_bot }} + run: | + # 1. Allow the trusted bot straight away + if [[ "$COMMENTER" == "$TRUSTED_BOT" ]]; then + echo "is_member=true" >> $GITHUB_OUTPUT + exit 0 + fi + + # 2. Otherwise fall back to the org-membership check + STATUS=$(curl -s -o /dev/null -w "%{http_code}" \ + -H "Authorization: token $ORG_ACCESS_TOKEN" \ + -H "Accept: application/vnd.github+json" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + "https://api.github.com/orgs/$ORG/members/$COMMENTER") + + if [ "$STATUS" -eq 204 ]; then + echo "is_member=true" >> $GITHUB_OUTPUT + else + echo "is_member=false" >> $GITHUB_OUTPUT + fi \ No newline at end of file diff --git a/.github/workflows/claude.yml b/.github/workflows/claude.yml index 26420fd6c1..0c5d6d59d4 100644 --- a/.github/workflows/claude.yml +++ b/.github/workflows/claude.yml @@ -11,45 +11,40 @@ on: types: [submitted] jobs: - check-membership: + determine-commenter: if: | - (github.event_name == 'issue_comment' && contains(github.event.comment.body, '/ai') && !contains(github.event.comment.user.login, '[bot]')) || - (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '/ai') && !contains(github.event.comment.user.login, '[bot]')) || - (github.event_name == 'pull_request_review' && contains(github.event.review.body, '/ai') && !contains(github.event.review.user.login, '[bot]')) || - (github.event_name == 'issues' && contains(github.event.issue.body, '/ai') && !contains(github.event.issue.user.login, '[bot]')) + (github.event_name == 'issue_comment' && contains(github.event.comment.body, '/ai')) || + (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '/ai')) || + (github.event_name == 'pull_request_review' && contains(github.event.review.body, '/ai')) || + (github.event_name == 'issues' && contains(github.event.issue.body, '/ai')) runs-on: ubicloud-standard-2 outputs: - is_member: ${{ steps.check-membership.outputs.is_member }} + commenter: ${{ steps.determine-commenter.outputs.commenter }} steps: - - name: Check organization membership - id: check-membership - env: - ORG_ACCESS_TOKEN: ${{ secrets.ORG_ACCESS_TOKEN }} + - name: Determine commenter + id: determine-commenter run: | - ORG="windmill-labs" - - if [[ "${{ github.event_name }}" == "issue_comment" || "${{ github.event_name }}" == "pull_request_review_comment" ]]; then + # Work out who wrote the comment / review + if [[ "${{ github.event_name }}" == "issue_comment" || \ + "${{ github.event_name }}" == "pull_request_review_comment" ]]; then COMMENTER="${{ github.event.comment.user.login }}" elif [[ "${{ github.event_name }}" == "pull_request_review" ]]; then COMMENTER="${{ github.event.review.user.login }}" else COMMENTER="${{ github.event.issue.user.login }}" fi + echo "commenter=$COMMENTER" >> $GITHUB_OUTPUT - STATUS=$(curl -s -o /dev/null -w "%{http_code}" \ - -H "Authorization: token $ORG_ACCESS_TOKEN" \ - -H "Accept: application/vnd.github+json" \ - -H "X-GitHub-Api-Version: 2022-11-28" \ - "https://api.github.com/orgs/$ORG/members/$COMMENTER") - - if [ "$STATUS" -eq 204 ]; then - echo "is_member=true" >> $GITHUB_OUTPUT - else - echo "is_member=false" >> $GITHUB_OUTPUT - fi + check-membership: + needs: determine-commenter + uses: ./.github/workflows/check-org-membership.yml + with: + commenter: ${{ needs.determine-commenter.outputs.commenter }} + secrets: + access_token: ${{ secrets.ORG_ACCESS_TOKEN }} claude-code-action: - needs: check-membership + needs: [determine-commenter, check-membership] if: | needs.check-membership.outputs.is_member == 'true' runs-on: ubicloud-standard-8 @@ -64,13 +59,6 @@ jobs: with: fetch-depth: 1 - # Cache rust dependencies - - uses: dtolnay/rust-toolchain@stable - - uses: Swatinem/rust-cache@v2 - with: - workspaces: "./backend -> target" - - # Cache node dependencies - uses: actions/cache@v3 with: path: ~/.npm diff --git a/.github/workflows/create-docs.yml b/.github/workflows/create-docs.yml index 2d264f9755..e6b313617c 100644 --- a/.github/workflows/create-docs.yml +++ b/.github/workflows/create-docs.yml @@ -4,38 +4,36 @@ on: jobs: check-membership: - if: ${{ github.event.issue.pull_request && startsWith(github.event.comment.body, '/docs') && github.event.comment.user.type != 'Bot' }} + if: ${{ github.event.issue.pull_request && startsWith(github.event.comment.body, '/docs') }} + uses: ./.github/workflows/check-org-membership.yml + with: + commenter: ${{ github.event.comment.user.login }} + secrets: + access_token: ${{ secrets.ORG_ACCESS_TOKEN }} + + generate-token: + needs: check-membership + if: ${{ needs.check-membership.outputs.is_member == 'true' }} runs-on: ubicloud-standard-2 outputs: - is_member: ${{ steps.check-membership.outputs.is_member }} + app_token: ${{ steps.app.outputs.token }} steps: - - name: Check organization membership - id: check-membership - env: - ORG_ACCESS_TOKEN: ${{ secrets.ORG_ACCESS_TOKEN }} - COMMENTER: ${{ github.event.comment.user.login }} - run: | - ORG="windmill-labs" - STATUS=$(curl -s -o /dev/null -w "%{http_code}" \ - -H "Authorization: token $ORG_ACCESS_TOKEN" \ - -H "Accept: application/vnd.github+json" \ - -H "X-GitHub-Api-Version: 2022-11-28" \ - "https://api.github.com/orgs/$ORG/members/$COMMENTER") - - if [ "$STATUS" -eq 204 ]; then - echo "is_member=true" >> $GITHUB_OUTPUT - else - echo "is_member=false" >> $GITHUB_OUTPUT - fi + - name: Generate an installation token + id: app + uses: actions/create-github-app-token@v2 + with: + app-id: ${{ vars.INTERNAL_APP_ID }} + private-key: ${{ secrets.INTERNAL_APP_KEY }} + owner: windmill-labs trigger-docs: - needs: check-membership - if: ${{ github.event.issue.pull_request && startsWith(github.event.comment.body, '/docs') && needs.check-membership.outputs.is_member == 'true' }} + needs: [generate-token, check-membership] + if: ${{ needs.check-membership.outputs.is_member == 'true' }} uses: windmill-labs/windmilldocs/.github/workflows/create-docs.yml@main with: pr_number: ${{ github.event.issue.number }} repo: ${{ github.event.repository.name }} comment_text: ${{ github.event.comment.body }} secrets: - DOCS_TOKEN: ${{ secrets.DOCS_TOKEN }} + DOCS_TOKEN: ${{ needs.generate-token.outputs.app_token }} GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }} diff --git a/.github/workflows/helmchart_on_release.yml b/.github/workflows/helmchart_on_release.yml index eeae218d5d..b3bc4e8c2f 100644 --- a/.github/workflows/helmchart_on_release.yml +++ b/.github/workflows/helmchart_on_release.yml @@ -9,11 +9,19 @@ jobs: runs-on: ubicloud-standard-2 steps: + - name: Generate an installation token + id: app + uses: actions/create-github-app-token@v2 + with: + app-id: ${{ vars.INTERNAL_APP_ID }} + private-key: ${{ secrets.INTERNAL_APP_KEY }} + owner: windmill-labs + - name: Checkout on helm repository uses: actions/checkout@v3 with: repository: windmill-labs/windmill-helm-charts - token: ${{ secrets.HELM_CHART_TOKEN }} + token: ${{ steps.app.outputs.token }} - name: Get version id: get_version @@ -57,7 +65,7 @@ jobs: - name: Create PR env: - GH_TOKEN: ${{ secrets.HELM_CHART_TOKEN }} + GH_TOKEN: ${{ steps.app.outputs.token }} run: | gh pr create \ --title "helm: bump version to ${{ env.VERSION }}" \ diff --git a/.github/workflows/pr-ready-review.yml b/.github/workflows/pr-ready-review.yml new file mode 100644 index 0000000000..f2e06aebd1 --- /dev/null +++ b/.github/workflows/pr-ready-review.yml @@ -0,0 +1,29 @@ +name: Auto Comment on PR Ready for Review + +on: + pull_request: + types: [ready_for_review] + +jobs: + add-review-comment: + if: github.event.pull_request.draft == false + runs-on: ubicloud-standard-2 + steps: + - name: Generate an installation token + id: app + uses: actions/create-github-app-token@v2 + with: + app-id: ${{ vars.INTERNAL_APP_ID }} + private-key: ${{ secrets.INTERNAL_APP_KEY }} + + - name: Add review comment + uses: actions/github-script@v7 + with: + github-token: ${{ steps.app.outputs.token }} + script: | + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.payload.pull_request.number, + body: '/ai review this PR' + }); From 99e18aedeacb2a39e780ad961f405ebab182fe8d Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Fri, 20 Jun 2025 14:08:42 +0200 Subject: [PATCH 670/739] nit typo --- backend/windmill-api/src/apps.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/windmill-api/src/apps.rs b/backend/windmill-api/src/apps.rs index befe569229..6e127ebc60 100644 --- a/backend/windmill-api/src/apps.rs +++ b/backend/windmill-api/src/apps.rs @@ -2011,7 +2011,7 @@ async fn upload_s3_file_from_app( if !has_unnamed_policy { return Err(Error::BadRequest( - "no policy found for unnamed s3 file uplooad".to_string(), + "no policy found for unnamed s3 file upload".to_string(), )); } From f3ecbe1792034de950ac66e233be5a91beb0a802 Mon Sep 17 00:00:00 2001 From: Guilhem Date: Fri, 20 Jun 2025 13:35:34 +0100 Subject: [PATCH 671/739] runs filter popover close on click outside (#6013) --- frontend/src/lib/components/runs/RunsFilter.svelte | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/lib/components/runs/RunsFilter.svelte b/frontend/src/lib/components/runs/RunsFilter.svelte index 77ab068bfe..50223c9c45 100644 --- a/frontend/src/lib/components/runs/RunsFilter.svelte +++ b/frontend/src/lib/components/runs/RunsFilter.svelte @@ -522,6 +522,7 @@ floatingConfig={{ strategy: 'absolute', placement: 'bottom-end' }} contentClasses="p-4" closeButton + usePointerDownOutside > {#snippet trigger()}
{/if} diff --git a/frontend/src/lib/components/ModulePreview.svelte b/frontend/src/lib/components/ModulePreview.svelte index ffa1530fcf..93ea296ec6 100644 --- a/frontend/src/lib/components/ModulePreview.svelte +++ b/frontend/src/lib/components/ModulePreview.svelte @@ -1,22 +1,13 @@ - jobDone()} +
@@ -130,7 +57,7 @@
{#if testIsLoading} - @@ -139,7 +66,7 @@ color="dark" btnClasses="truncate" size="sm" - on:click={() => runTest(stepArgs)} + on:click={runTestWithStepArgs} shortCut={{ Icon: CornerDownLeft }} @@ -149,5 +76,5 @@ {/if}
- +
diff --git a/frontend/src/lib/components/ModulePreviewForm.svelte b/frontend/src/lib/components/ModulePreviewForm.svelte index 1825d82252..926c5ccff3 100644 --- a/frontend/src/lib/components/ModulePreviewForm.svelte +++ b/frontend/src/lib/components/ModulePreviewForm.svelte @@ -5,77 +5,91 @@ import { RefreshCw } from 'lucide-svelte' import ArgInput from './ArgInput.svelte' import { Button } from './common' - import { getContext, untrack } from 'svelte' + import { getContext, onMount, untrack } from 'svelte' import type { FlowEditorContext } from './flows/types' import { evalValue } from './flows/utils' import type { FlowModule } from '$lib/gen' import type { PickableProperties } from './flows/previousResults' import type SimpleEditor from './SimpleEditor.svelte' import { getResourceTypes } from './resourceTypesStore' + import { twMerge } from 'tailwind-merge' interface Props { schema: Schema | { properties?: Record; required?: string[] } - args?: Record mod: FlowModule pickableProperties: PickableProperties | undefined isValid?: boolean autofocus?: boolean + focusArg?: string } let { schema, - args = $bindable({}), mod, pickableProperties, isValid = $bindable(true), - autofocus = false + autofocus = false, + focusArg = undefined }: Props = $props() - const { testStepStore } = getContext('FlowEditorContext') + const { testSteps, flowStateStore, flowStore, previewArgs } = + getContext('FlowEditorContext') let inputCheck: { [id: string]: boolean } = $state({}) $effect(() => { isValid = allTrue(inputCheck) ?? false }) - $effect(() => { - if (args == undefined || typeof args !== 'object') { - args = {} - } - }) - - function removeExtraKey() { - const nargs = {} - Object.keys(args ?? {}).forEach((key) => { - if (keys.includes(key)) { - nargs[key] = args[key] - } - }) - args = nargs - } - let keys: string[] = $state([]) $effect(() => { let lkeys = Object.keys(schema?.properties ?? {}) if (schema?.properties && JSON.stringify(lkeys) != JSON.stringify(keys)) { keys = lkeys - untrack(() => removeExtraKey()) + untrack(() => testSteps?.removeExtraKey(mod.id, keys)) } }) function plugIt(argName: string) { - args[argName] = structuredClone( - $state.snapshot(evalValue(argName, mod, testStepStore, pickableProperties, true)) + testSteps?.setEvaluatedStepArg( + mod.id, + argName, + $state.snapshot(evalValue(argName, mod, pickableProperties, true)) ) - try { - editor?.[argName]?.setCode(JSON.stringify(args[argName], null, 4)) - } catch { - //ignore - } } let editor: Record = $state({}) + // Animation and highlighting for focusArg + let animateArg: string | undefined = $state(undefined) + $effect(() => { + if (focusArg) { + // Add a slight delay to ensure the form is rendered + setTimeout(() => { + const argElement = document.querySelector(`[data-arg="${focusArg}"]`) + if (argElement) { + // Add highlight animation + animateArg = focusArg + argElement.scrollIntoView({ behavior: 'smooth', block: 'center' }) + + // Focus the input if it exists + const input = argElement.querySelector('input, textarea, select') as + | HTMLInputElement + | HTMLTextAreaElement + | HTMLSelectElement + | null + if (input) { + input.focus() + } + + // Remove highlight after animation + setTimeout(() => { + animateArg = undefined + }, 2000) + } + }, 200) + } + }) + let resourceTypes: string[] | undefined = $state(undefined) async function loadResourceTypes() { @@ -83,21 +97,34 @@ } loadResourceTypes() + + let args = $state(>{}) + + onMount(() => { + testSteps?.updateStepArgs(mod.id, $flowStateStore, flowStore?.val, previewArgs?.val) + args = testSteps?.getStepArgs(mod.id) ?? { value: {} } + }) -
+
{#if keys.length > 0} {#each keys as argName, i (argName)} {#if Object.keys(schema.properties ?? {}).includes(argName)} -
- {#if typeof args == 'object' && schema?.properties?.[argName]} +
+ {#if typeof args.value == 'object' && schema?.properties?.[argName]} {/if} -
- -
+ {#if testSteps?.isArgManuallySet(mod.id, argName)} +
+ +
+ {/if}
{/if} {/each} diff --git a/frontend/src/lib/components/ModulePreviewResultViewer.svelte b/frontend/src/lib/components/ModulePreviewResultViewer.svelte index 70ade6a2a8..ec203979c9 100644 --- a/frontend/src/lib/components/ModulePreviewResultViewer.svelte +++ b/frontend/src/lib/components/ModulePreviewResultViewer.svelte @@ -41,7 +41,7 @@ onUpdateMock }: Props = $props() - const { testStepStore } = getContext('FlowEditorContext') + const { testSteps } = getContext('FlowEditorContext') let selectedJob: Job | undefined = $state(undefined) let fetchingLastJob = false @@ -49,7 +49,7 @@ let jobProgressReset: () => void = $state(() => {}) let nlastJob = $derived.by(() => { - if (testJob) { + if (testJob && testJob.type === 'CompletedJob') { return { ...testJob, preview: true } } if (lastJob) { @@ -90,7 +90,7 @@ {disableHistory} > {#snippet copilot_fix()} - {#if lang && editor && diffEditor && $testStepStore[mod.id] && selectedJob?.type === 'CompletedJob' && !selectedJob.success && getStringError(selectedJob.result)} + {#if lang && editor && diffEditor && testSteps.getStepArgs(mod.id) && selectedJob?.type === 'CompletedJob' && !selectedJob.success && getStringError(selectedJob.result)} {/if} {/snippet} diff --git a/frontend/src/lib/components/ModuleTest.svelte b/frontend/src/lib/components/ModuleTest.svelte new file mode 100644 index 0000000000..705ef031ca --- /dev/null +++ b/frontend/src/lib/components/ModuleTest.svelte @@ -0,0 +1,137 @@ + + + + + jobDone()} + bind:scriptProgress + bind:this={testJobLoader} + bind:isLoading={ + () => testModulesState[mod.id]?.loading ?? false, + (v) => + (testModulesState[mod.id] = { + ...testModulesState[mod.id], + loading: v ?? false, + instances: testModulesState[mod.id]?.instances ?? 0 + }) + } + bind:job={testJob} +/> diff --git a/frontend/src/lib/components/common/button/Button.svelte b/frontend/src/lib/components/common/button/Button.svelte index e342420233..f230d89798 100644 --- a/frontend/src/lib/components/common/button/Button.svelte +++ b/frontend/src/lib/components/common/button/Button.svelte @@ -49,6 +49,7 @@ portal?: string } | undefined = undefined + export let dropdownBtnClasses: string = '' type MenuItem = { label: string @@ -309,7 +310,8 @@ 'rounded-md m-0 p-0 center-center h-full', variant === 'border' ? 'border-0 border-r border-y ' : 'border-0', 'rounded-r-md !rounded-l-none', - size === 'xs2' ? '!w-8' : '!w-10' + size === 'xs2' ? '!w-8' : '!w-10', + dropdownBtnClasses )} > diff --git a/frontend/src/lib/components/flows/FlowEditor.svelte b/frontend/src/lib/components/flows/FlowEditor.svelte index 2fcac3854c..d9bce7c83d 100644 --- a/frontend/src/lib/components/flows/FlowEditor.svelte +++ b/frontend/src/lib/components/flows/FlowEditor.svelte @@ -32,6 +32,10 @@ }) | undefined onDeployTrigger?: (trigger: Trigger) => void + onTestUpTo?: ((id: string) => void) | undefined + onEditInput?: ((moduleId: string, key: string) => void) | undefined + forceTestTab?: Record + highlightArg?: Record } let { @@ -44,7 +48,11 @@ smallErrorHandler = false, newFlow = false, savedFlow = undefined, - onDeployTrigger = () => {} + onDeployTrigger = () => {}, + onTestUpTo = undefined, + onEditInput = undefined, + forceTestTab, + highlightArg }: Props = $props() let flowModuleSchemaMap: FlowModuleSchemaMap | undefined = $state() @@ -93,6 +101,8 @@ } aiChatManager.generateStep(detail.moduleId, detail.lang, detail.instructions) }} + {onTestUpTo} + {onEditInput} /> {/if}
@@ -113,6 +123,8 @@ on:applyArgs on:testWithArgs {onDeployTrigger} + {forceTestTab} + {highlightArg} /> {/if} diff --git a/frontend/src/lib/components/flows/content/FlowEditorPanel.svelte b/frontend/src/lib/components/flows/content/FlowEditorPanel.svelte index 030d0792a1..41b3d15827 100644 --- a/frontend/src/lib/components/flows/content/FlowEditorPanel.svelte +++ b/frontend/src/lib/components/flows/content/FlowEditorPanel.svelte @@ -25,6 +25,8 @@ }) | undefined onDeployTrigger?: (trigger: Trigger) => void + forceTestTab?: Record + highlightArg?: Record } let { @@ -33,7 +35,9 @@ newFlow = false, disabledFlowInputs = false, savedFlow = undefined, - onDeployTrigger = () => {} + onDeployTrigger = () => {}, + forceTestTab, + highlightArg }: Props = $props() const { @@ -138,6 +142,8 @@ previousModule={flowStore.val.value.modules[index - 1]} {enableAi} savedModule={savedFlow?.value.modules[index]} + {forceTestTab} + {highlightArg} /> {/each} {/key} diff --git a/frontend/src/lib/components/flows/content/FlowModuleComponent.svelte b/frontend/src/lib/components/flows/content/FlowModuleComponent.svelte index c613b56ed9..70ffe5a3ec 100644 --- a/frontend/src/lib/components/flows/content/FlowModuleComponent.svelte +++ b/frontend/src/lib/components/flows/content/FlowModuleComponent.svelte @@ -77,6 +77,8 @@ noEditor: boolean enableAi: boolean savedModule?: FlowModule | undefined + forceTestTab?: boolean + highlightArg?: string } let { @@ -89,7 +91,9 @@ scriptTemplate = 'script', noEditor, enableAi, - savedModule = undefined + savedModule = undefined, + forceTestTab = false, + highlightArg = undefined }: Props = $props() let tag: string | undefined = $state(undefined) @@ -274,6 +278,20 @@ onDestroy(() => { $currentEditor = undefined }) + + // Handle force test tab prop with animation + $effect(() => { + if (forceTestTab) { + selected = 'test' + // Add a smooth transition to the test tab + setTimeout(() => { + const testTab = document.querySelector('[value="test"]') + if (testTab) { + testTab.scrollIntoView({ behavior: 'smooth', block: 'nearest' }) + } + }, 100) + } + }) @@ -525,6 +543,7 @@ bind:testJob bind:testIsLoading bind:scriptProgress + focusArg={highlightArg} /> {:else if selected === 'advanced'} diff --git a/frontend/src/lib/components/flows/content/FlowModuleWrapper.svelte b/frontend/src/lib/components/flows/content/FlowModuleWrapper.svelte index fa3116631e..a61d1dbdb9 100644 --- a/frontend/src/lib/components/flows/content/FlowModuleWrapper.svelte +++ b/frontend/src/lib/components/flows/content/FlowModuleWrapper.svelte @@ -40,6 +40,8 @@ parentModule?: FlowModule | undefined // Pointer to previous module, for easy access to testing results previousModule?: FlowModule | undefined + forceTestTab?: Record + highlightArg?: Record } let { @@ -48,7 +50,9 @@ enableAi = false, savedModule = undefined, parentModule = $bindable(), - previousModule = undefined + previousModule = undefined, + forceTestTab, + highlightArg }: Props = $props() function initializePrimaryScheduleForTriggerScript(module: FlowModule) { @@ -196,6 +200,8 @@ {scriptTemplate} {enableAi} {savedModule} + forceTestTab={forceTestTab?.[flowModule.id]} + highlightArg={highlightArg?.[flowModule.id]} /> {/if} {:else if flowModule.value.type === 'forloopflow' || flowModule.value.type == 'whileloopflow'} @@ -210,6 +216,8 @@ ? savedModule.value.modules[index] : undefined} {enableAi} + {forceTestTab} + {highlightArg} /> {/each} {:else if flowModule.value.type === 'branchone'} @@ -229,6 +237,8 @@ ? savedModule.value.default[index] : undefined} {enableAi} + {forceTestTab} + {highlightArg} /> {/each} {/if} @@ -252,6 +262,8 @@ ? savedModule.value.branches[branchIndex]?.modules[index] : undefined} {enableAi} + {forceTestTab} + {highlightArg} /> {/each} {/if} @@ -271,6 +283,8 @@ savedModule={savedModule?.value.type === 'branchall' ? savedModule.value.branches[branchIndex]?.modules[index] : undefined} + {forceTestTab} + {highlightArg} /> {/each} {/if} diff --git a/frontend/src/lib/components/flows/header/FlowPreviewButtons.svelte b/frontend/src/lib/components/flows/header/FlowPreviewButtons.svelte index f053c6cb62..c3e80d836f 100644 --- a/frontend/src/lib/components/flows/header/FlowPreviewButtons.svelte +++ b/frontend/src/lib/components/flows/header/FlowPreviewButtons.svelte @@ -70,6 +70,12 @@ 'triggers' ].includes($selectedId) || $selectedId?.includes('branch') + + export function testUpTo() { + if (upToDisabled) return + previewMode = 'upTo' + previewOpen = true + } {#if !upToDisabled} @@ -78,10 +84,7 @@ disabled={upToDisabled} color="light" variant="border" - on:click={() => { - previewMode = 'upTo' - previewOpen = !previewOpen - }} + on:click={testUpTo} startIcon={{ icon: Play }} > Test up to  diff --git a/frontend/src/lib/components/flows/map/FlowModuleSchemaItem.svelte b/frontend/src/lib/components/flows/map/FlowModuleSchemaItem.svelte index e0f8e3e17b..9b05735105 100644 --- a/frontend/src/lib/components/flows/map/FlowModuleSchemaItem.svelte +++ b/frontend/src/lib/components/flows/map/FlowModuleSchemaItem.svelte @@ -14,7 +14,9 @@ Square, SkipForward, Pin, - X + X, + Play, + Loader2 } from 'lucide-svelte' import { createEventDispatcher, getContext, untrack } from 'svelte' import { fade } from 'svelte/transition' @@ -23,6 +25,7 @@ import { twMerge } from 'tailwind-merge' import IdEditorInput from '$lib/components/IdEditorInput.svelte' import { dfs } from '../dfs' + import { dfs as dfsPreviousResults } from '../previousResults' import { Drawer } from '$lib/components/common' import DrawerContent from '$lib/components/common/drawer/DrawerContent.svelte' import { getDependeeAndDependentComponents } from '../flowExplorer' @@ -32,6 +35,8 @@ import OutputPicker from '$lib/components/flows/propPicker/OutputPicker.svelte' import OutputPickerInner from '$lib/components/flows/propPicker/OutputPickerInner.svelte' import type { FlowState } from '$lib/components/flows/flowState' + import { Button } from '$lib/components/common' + import ModuleTest from '$lib/components/ModuleTest.svelte' interface Props { selected?: boolean @@ -63,7 +68,10 @@ alwaysShowOutputPicker?: boolean loopStatus?: { type: 'inside' | 'self'; flow: 'forloopflow' | 'whileloopflow' } | undefined icon?: import('svelte').Snippet + onTestUpTo?: ((id: string) => void) | undefined + inputTransform?: Record | undefined onUpdateMock?: (mock: { enabled: boolean; return_value?: unknown }) => void + onEditInput?: (moduleId: string, key: string) => void } let { @@ -91,7 +99,10 @@ alwaysShowOutputPicker = false, loopStatus = undefined, icon, - onUpdateMock + onTestUpTo, + inputTransform, + onUpdateMock, + onEditInput }: Props = $props() let pickableIds: Record | undefined = $state(undefined) @@ -116,11 +127,15 @@ let newId: string = $state(id ?? '') + let moduleTest: ModuleTest | undefined = $state(undefined) + let testIsLoading = $state(false) let hover = $state(false) let connectingData: any | undefined = $state(undefined) let lastJob: any | undefined = $state(undefined) let outputPicker: OutputPicker | undefined = $state(undefined) let historyOpen = $state(false) + let testJob: any | undefined = $state(undefined) + let outputPickerBarOpen = $state(false) let flowStateStore = $derived(flowEditorContext?.flowStateStore) @@ -158,10 +173,24 @@ flowStateStore && $flowStateStore && untrack(() => updateLastJob($flowStateStore)) }) + let nlastJob = $derived.by(() => { + if (testJob) { + return { ...testJob, preview: true } + } + if (lastJob) { + return { ...lastJob, preview: false } + } + return undefined + }) + let isConnectingCandidate = $derived( !!id && !!$flowPropPickerConfig && !!pickableIds && Object.keys(pickableIds).includes(id) ) + const outputPickerVisible = $derived( + editMode && (isConnectingCandidate || alwaysShowOutputPicker) && !!id + ) + const icon_render = $derived(icon) @@ -223,22 +252,36 @@ {/if} +{#if deletable && id && flowEditorContext?.flowStore && outputPickerVisible} + {@const flowStore = flowEditorContext?.flowStore.val} + {@const mod = flowStore?.value ? dfsPreviousResults(id, flowStore, false)[0] : undefined} + {#if mod && $flowStateStore[id]} + + {/if} +{/if} +
(hover = true)} onmouseleave={() => (hover = false)} onpointerdown={stopPropagation(preventDefault(() => dispatch('pointerdown')))} > -
+
+
{#if retry}
- {#if editMode && (isConnectingCandidate || alwaysShowOutputPicker)} + {#if outputPickerVisible} {#snippet children({ allowCopy, isConnecting, selectConnection })} {/snippet} @@ -389,10 +438,60 @@
{#if deletable} +
+ {#if (hover || selected) && outputPickerVisible} +
+ {#if !testIsLoading} + + {:else} + + {/if} +
+ {/if} +
+ {/if} + + {/if} +{/snippet} + +{#snippet editKey(key: string)} + +{/snippet} diff --git a/frontend/src/lib/components/flows/propPicker/OutputPicker.svelte b/frontend/src/lib/components/flows/propPicker/OutputPicker.svelte index 864602718f..b62326352f 100644 --- a/frontend/src/lib/components/flows/propPicker/OutputPicker.svelte +++ b/frontend/src/lib/components/flows/propPicker/OutputPicker.svelte @@ -1,10 +1,12 @@ - { +
{ e.preventDefault() e.stopPropagation() }} - bind:this={popover} - allowFullScreen - contentClasses="overflow-hidden resize rounded-md" - contentStyle={`width: calc(${MIN_WIDTH}px); min-width: calc(${MIN_WIDTH}px); height: calc(${MIN_HEIGHT}px); min-height: calc(${MIN_HEIGHT}px);`} - extraProps={{ 'data-prop-picker': true }} - closeOnOtherPopoverOpen - class="outline-none" > - {#snippet trigger({ isOpen })} -
{ - e.preventDefault() - e.stopPropagation() - }} - data-prop-picker - title={`${isOpen ? 'Close' : 'Open'} step output`} - > -
- +
+
+
+ {#if showInput} + { + e.preventDefault() + e.stopPropagation() + }} + allowFullScreen + contentClasses="overflow-hidden resize" + contentStyle={`width: calc(${MIN_WIDTH}px); min-width: calc(${MIN_WIDTH}px); height: calc(${MIN_HEIGHT}px); min-height: calc(${MIN_HEIGHT}px); `} + extraProps={{ 'data-prop-picker': true }} + closeOnOtherPopoverOpen + disableFocusTrap + class="flex-1 h-full" + bind:isOpen={inputOpen} + bind:this={inputPopover} > -
+ In + + {/snippet} + {#snippet content()} + + {/snippet} + + {/if} + { + e.preventDefault() + e.stopPropagation() + }} + bind:this={popover} + allowFullScreen + contentClasses="overflow-hidden resize" + contentStyle={`width: calc(${MIN_WIDTH}px); min-width: calc(${MIN_WIDTH}px); height: calc(${MIN_HEIGHT}px); min-height: calc(${MIN_HEIGHT}px); `} + extraProps={{ 'data-prop-picker': true }} + closeOnOtherPopoverOpen + class="flex-1 h-full" + bind:isOpen={outputOpen} + > + {#snippet trigger({ isOpen })} + - -
- -
+ + + {/snippet} + {#snippet content()} + {@render children?.({ + allowCopy: !$flowPropPickerConfig, + isConnecting: showConnecting, + selectConnection + })} + {/snippet} +
- {/snippet} - {#snippet content()} - {@render children?.({ - allowCopy: !$flowPropPickerConfig, - isConnecting: showConnecting, - selectConnection - })} - {/snippet} - +
+
+
AppComponent, + appComponentFromType(preset.targetComponent, preset.configuration, undefined) as ( + id: string + ) => AppComponent, $focusedGrid, undefined, undefined, From e8bb3075020ca44978f503a81a7997ba1bcd671b Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Sun, 16 Mar 2025 17:20:39 +0100 Subject: [PATCH 045/739] fix: improve row lock contention on concurrency counter --- ...8234ca7d1efeee9661f3901f298da375e73f7.json | 38 +++++++------- ...dcc40f463cbc52d94ed9315cf9a547d4c89f2.json | 38 +++++++------- ...6d8a2424dce6c4ab2a43cf863911c833fd30.json} | 4 +- ...b69a1e6798103df08344fbc9719e53f336c29.json | 22 ++++++++ ...05d394a7cbcf0038c72a78add5c7b02ef5927.json | 2 +- backend/windmill-queue/src/jobs.rs | 50 ++++++++++++++----- 6 files changed, 100 insertions(+), 54 deletions(-) rename backend/.sqlx/{query-3e3d12a51cb524fbd3d6949e150cb608acfbe8c8eade1939e813086380c205e0.json => query-b6d657d98de40a25b2bf66471c376d8a2424dce6c4ab2a43cf863911c833fd30.json} (53%) create mode 100644 backend/.sqlx/query-c013880b8567bf5545b0c93ffb4b69a1e6798103df08344fbc9719e53f336c29.json diff --git a/backend/.sqlx/query-08f288d2781d823e109a9e5b8848234ca7d1efeee9661f3901f298da375e73f7.json b/backend/.sqlx/query-08f288d2781d823e109a9e5b8848234ca7d1efeee9661f3901f298da375e73f7.json index 2be39fce26..4bcf3c6ce3 100644 --- a/backend/.sqlx/query-08f288d2781d823e109a9e5b8848234ca7d1efeee9661f3901f298da375e73f7.json +++ b/backend/.sqlx/query-08f288d2781d823e109a9e5b8848234ca7d1efeee9661f3901f298da375e73f7.json @@ -130,28 +130,28 @@ }, { "ordinal": 25, - "name": "teams_command_script", - "type_info": "Text" - }, - { - "ordinal": 26, - "name": "teams_team_id", - "type_info": "Text" - }, - { - "ordinal": 27, - "name": "teams_team_name", - "type_info": "Text" - }, - { - "ordinal": 28, "name": "ai_models", "type_info": "VarcharArray" }, { - "ordinal": 29, + "ordinal": 26, "name": "code_completion_model", "type_info": "Varchar" + }, + { + "ordinal": 27, + "name": "teams_command_script", + "type_info": "Text" + }, + { + "ordinal": 28, + "name": "teams_team_id", + "type_info": "Text" + }, + { + "ordinal": 29, + "name": "teams_team_name", + "type_info": "Text" } ], "parameters": { @@ -185,10 +185,10 @@ true, true, true, - true, - true, - true, false, + true, + true, + true, true ] }, diff --git a/backend/.sqlx/query-55cb03040bc2a8c53dd7fbb42bbdcc40f463cbc52d94ed9315cf9a547d4c89f2.json b/backend/.sqlx/query-55cb03040bc2a8c53dd7fbb42bbdcc40f463cbc52d94ed9315cf9a547d4c89f2.json index 9243288c9d..14685a8bfa 100644 --- a/backend/.sqlx/query-55cb03040bc2a8c53dd7fbb42bbdcc40f463cbc52d94ed9315cf9a547d4c89f2.json +++ b/backend/.sqlx/query-55cb03040bc2a8c53dd7fbb42bbdcc40f463cbc52d94ed9315cf9a547d4c89f2.json @@ -130,28 +130,28 @@ }, { "ordinal": 25, - "name": "teams_command_script", - "type_info": "Text" - }, - { - "ordinal": 26, - "name": "teams_team_id", - "type_info": "Text" - }, - { - "ordinal": 27, - "name": "teams_team_name", - "type_info": "Text" - }, - { - "ordinal": 28, "name": "ai_models", "type_info": "VarcharArray" }, { - "ordinal": 29, + "ordinal": 26, "name": "code_completion_model", "type_info": "Varchar" + }, + { + "ordinal": 27, + "name": "teams_command_script", + "type_info": "Text" + }, + { + "ordinal": 28, + "name": "teams_team_id", + "type_info": "Text" + }, + { + "ordinal": 29, + "name": "teams_team_name", + "type_info": "Text" } ], "parameters": { @@ -185,10 +185,10 @@ true, true, true, - true, - true, - true, false, + true, + true, + true, true ] }, diff --git a/backend/.sqlx/query-3e3d12a51cb524fbd3d6949e150cb608acfbe8c8eade1939e813086380c205e0.json b/backend/.sqlx/query-b6d657d98de40a25b2bf66471c376d8a2424dce6c4ab2a43cf863911c833fd30.json similarity index 53% rename from backend/.sqlx/query-3e3d12a51cb524fbd3d6949e150cb608acfbe8c8eade1939e813086380c205e0.json rename to backend/.sqlx/query-b6d657d98de40a25b2bf66471c376d8a2424dce6c4ab2a43cf863911c833fd30.json index d6fd72a8b5..c775d232e1 100644 --- a/backend/.sqlx/query-3e3d12a51cb524fbd3d6949e150cb608acfbe8c8eade1939e813086380c205e0.json +++ b/backend/.sqlx/query-b6d657d98de40a25b2bf66471c376d8a2424dce6c4ab2a43cf863911c833fd30.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "INSERT INTO concurrency_counter(concurrency_id, job_uuids) VALUES ($1, $2)\n ON CONFLICT (concurrency_id) \n DO UPDATE SET job_uuids = jsonb_set(concurrency_counter.job_uuids, array[$3], '{}')\n RETURNING (SELECT COUNT(*) FROM jsonb_object_keys(job_uuids))", + "query": "INSERT INTO concurrency_counter(concurrency_id, job_uuids) \n VALUES ($1, $2)\n ON CONFLICT (concurrency_id) \n DO UPDATE SET job_uuids = jsonb_set(concurrency_counter.job_uuids, array[$3], '{}')\n RETURNING (SELECT COUNT(*) FROM jsonb_object_keys(job_uuids))", "describe": { "columns": [ { @@ -20,5 +20,5 @@ null ] }, - "hash": "3e3d12a51cb524fbd3d6949e150cb608acfbe8c8eade1939e813086380c205e0" + "hash": "b6d657d98de40a25b2bf66471c376d8a2424dce6c4ab2a43cf863911c833fd30" } diff --git a/backend/.sqlx/query-c013880b8567bf5545b0c93ffb4b69a1e6798103df08344fbc9719e53f336c29.json b/backend/.sqlx/query-c013880b8567bf5545b0c93ffb4b69a1e6798103df08344fbc9719e53f336c29.json new file mode 100644 index 0000000000..904c4eba5f --- /dev/null +++ b/backend/.sqlx/query-c013880b8567bf5545b0c93ffb4b69a1e6798103df08344fbc9719e53f336c29.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT job_uuids FROM concurrency_counter \n WHERE concurrency_id = $1 \n FOR UPDATE", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "job_uuids", + "type_info": "Jsonb" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + false + ] + }, + "hash": "c013880b8567bf5545b0c93ffb4b69a1e6798103df08344fbc9719e53f336c29" +} diff --git a/backend/.sqlx/query-ddf2eccb78a310ed00c7d8b9c3f05d394a7cbcf0038c72a78add5c7b02ef5927.json b/backend/.sqlx/query-ddf2eccb78a310ed00c7d8b9c3f05d394a7cbcf0038c72a78add5c7b02ef5927.json index 5bfff47576..c2dfed73a2 100644 --- a/backend/.sqlx/query-ddf2eccb78a310ed00c7d8b9c3f05d394a7cbcf0038c72a78add5c7b02ef5927.json +++ b/backend/.sqlx/query-ddf2eccb78a310ed00c7d8b9c3f05d394a7cbcf0038c72a78add5c7b02ef5927.json @@ -15,7 +15,7 @@ ] }, "nullable": [ - true + null ] }, "hash": "ddf2eccb78a310ed00c7d8b9c3f05d394a7cbcf0038c72a78add5c7b02ef5927" diff --git a/backend/windmill-queue/src/jobs.rs b/backend/windmill-queue/src/jobs.rs index c676d1e6f7..ac9fa133dc 100644 --- a/backend/windmill-queue/src/jobs.rs +++ b/backend/windmill-queue/src/jobs.rs @@ -1919,22 +1919,13 @@ pub async fn pull( format!("{{\"{}\": {{}}}}", pulled_job.id.hyphenated().to_string()).as_str(), ) .expect("Unable to serialize job_uuids column to proper JSON"); - let running_job = sqlx::query_scalar!( - "INSERT INTO concurrency_counter(concurrency_id, job_uuids) VALUES ($1, $2) - ON CONFLICT (concurrency_id) - DO UPDATE SET job_uuids = jsonb_set(concurrency_counter.job_uuids, array[$3], '{}') - RETURNING (SELECT COUNT(*) FROM jsonb_object_keys(job_uuids))", - job_concurrency_key, + let (mut tx, running_job) = update_concurrency_counter( + tx, + job_concurrency_key.clone(), jobs_uuids_init_json_value, pulled_job.id.hyphenated().to_string(), ) - .fetch_one(&mut *tx) - .await - .map_err(|e| { - Error::internal_err(format!( - "Error getting concurrency count for script path {job_script_path}: {e:#}" - )) - })?; + .await?; tracing::debug!("running_job: {}", running_job.unwrap_or(0)); let completed_count = sqlx::query!( @@ -2069,6 +2060,39 @@ pub async fn pull( } } +async fn update_concurrency_counter<'c>( + mut tx: Transaction<'c, sqlx::Postgres>, + job_concurrency_key: String, + jobs_uuids_init_json_value: serde_json::Value, + pulled_job_id: String, +) -> anyhow::Result<(Transaction<'c, sqlx::Postgres>, Option)> { + // 1. Try to lock the row first + let _ = sqlx::query!( + "SELECT job_uuids FROM concurrency_counter + WHERE concurrency_id = $1 + FOR UPDATE", + job_concurrency_key + ) + .fetch_optional(&mut *tx) + .await?; + + // 2. Insert if missing, otherwise update + let running_job = sqlx::query_scalar!( + "INSERT INTO concurrency_counter(concurrency_id, job_uuids) + VALUES ($1, $2) + ON CONFLICT (concurrency_id) + DO UPDATE SET job_uuids = jsonb_set(concurrency_counter.job_uuids, array[$3], '{}') + RETURNING (SELECT COUNT(*) FROM jsonb_object_keys(job_uuids))", + job_concurrency_key, + jobs_uuids_init_json_value, + pulled_job_id + ) + .fetch_one(&mut *tx) + .await?; + + Ok((tx, running_job)) +} + async fn pull_single_job_and_mark_as_running_no_concurrency_limit<'c>( db: &Pool, suspend_first: bool, From 85d13e650d79404f70999b2ae9f4645e703375e8 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Sun, 16 Mar 2025 17:45:40 +0100 Subject: [PATCH 046/739] DISABLE_CONCURRENCY_LIMIT --- .github/workflows/docker-image.yml | 2 +- backend/src/monitor.rs | 19 ++++++++----- backend/windmill-queue/src/jobs.rs | 45 ++++++++++++++++++++---------- 3 files changed, 43 insertions(+), 23 deletions(-) diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index 2a43771223..03457b4b79 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -33,7 +33,7 @@ on: type: boolean concurrency: group: ${{ github.ref }} - cancel-in-progress: true + cancel-in-progress: false permissions: write-all diff --git a/backend/src/monitor.rs b/backend/src/monitor.rs index f348bb9fab..cf82ed7f49 100644 --- a/backend/src/monitor.rs +++ b/backend/src/monitor.rs @@ -112,6 +112,7 @@ lazy_static::lazy_static! { static ref QUEUE_COUNT_TAGS: Arc>> = Arc::new(RwLock::new(Vec::new())); + static ref DISABLE_CONCURRENCY_LIMIT: bool = std::env::var("DISABLE_CONCURRENCY_LIMIT").is_ok_and(|s| s == "true"); } @@ -1885,13 +1886,17 @@ async fn handle_zombie_flows(db: &DB) -> error::Result<()> { .await?; if let Some(key) = concurrency_key { - sqlx::query!( - "UPDATE concurrency_counter SET job_uuids = job_uuids - $2 WHERE concurrency_id = $1", - key, - flow.id.hyphenated().to_string() - ) - .execute(&mut *tx) - .await?; + if *DISABLE_CONCURRENCY_LIMIT { + tracing::warn!("Concurrency limit is disabled, skipping"); + } else { + sqlx::query!( + "UPDATE concurrency_counter SET job_uuids = job_uuids - $2 WHERE concurrency_id = $1", + key, + flow.id.hyphenated().to_string() + ) + .execute(&mut *tx) + .await?; + } } sqlx::query!( diff --git a/backend/windmill-queue/src/jobs.rs b/backend/windmill-queue/src/jobs.rs index ac9fa133dc..fd17c28400 100644 --- a/backend/windmill-queue/src/jobs.rs +++ b/backend/windmill-queue/src/jobs.rs @@ -810,15 +810,19 @@ pub async fn add_completed_job( .unwrap_or_else(|| queued_job.full_path_with_workspace()) } }; - if let Err(e) = sqlx::query_scalar!( - "UPDATE concurrency_counter SET job_uuids = job_uuids - $2 WHERE concurrency_id = $1", - concurrency_key, - queued_job.id.hyphenated().to_string(), - ) - .execute(&mut *tx) - .await - { - tracing::error!("Could not decrement concurrency counter: {}", e); + if *DISABLE_CONCURRENCY_LIMIT { + tracing::warn!("Concurrency limit is disabled, skipping"); + } else { + if let Err(e) = sqlx::query_scalar!( + "UPDATE concurrency_counter SET job_uuids = job_uuids - $2 WHERE concurrency_id = $1", + concurrency_key, + queued_job.id.hyphenated().to_string(), + ) + .execute(&mut *tx) + .await + { + tracing::error!("Could not decrement concurrency counter: {}", e); + } } if let Err(e) = sqlx::query_scalar!( @@ -1842,6 +1846,10 @@ impl std::ops::Deref for PulledJob { } } +lazy_static::lazy_static! { + static ref DISABLE_CONCURRENCY_LIMIT: bool = std::env::var("DISABLE_CONCURRENCY_LIMIT").is_ok_and(|s| s == "true"); +} + pub async fn pull( db: &Pool, suspend_first: bool, @@ -1968,10 +1976,13 @@ pub async fn pull( tx.commit().await?; return Ok((Option::Some(pulled_job), suspended)); } - let x = sqlx::query_scalar!( - "UPDATE concurrency_counter SET job_uuids = job_uuids - $2 WHERE concurrency_id = $1 RETURNING (SELECT COUNT(*) FROM jsonb_object_keys(job_uuids))", - job_concurrency_key, - pulled_job.id.hyphenated().to_string(), + if *DISABLE_CONCURRENCY_LIMIT { + tracing::warn!("Concurrency limit is disabled, skipping"); + } else { + let x = sqlx::query_scalar!( + "UPDATE concurrency_counter SET job_uuids = job_uuids - $2 WHERE concurrency_id = $1 RETURNING (SELECT COUNT(*) FROM jsonb_object_keys(job_uuids))", + job_concurrency_key, + pulled_job.id.hyphenated().to_string(), ) .fetch_one(&mut *tx) @@ -1981,8 +1992,8 @@ pub async fn pull( "Error decreasing concurrency count for script path {job_script_path}: {e:#}" )) })?; - - tracing::debug!("running_job after decrease: {}", x.unwrap_or(0)); + tracing::debug!("running_job after decrease: {}", x.unwrap_or(0)); + } let job_uuid: Uuid = pulled_job.id; let avg_script_duration: Option = sqlx::query_scalar!( @@ -2066,6 +2077,10 @@ async fn update_concurrency_counter<'c>( jobs_uuids_init_json_value: serde_json::Value, pulled_job_id: String, ) -> anyhow::Result<(Transaction<'c, sqlx::Postgres>, Option)> { + if *DISABLE_CONCURRENCY_LIMIT { + tracing::warn!("Concurrency limit is disabled, skipping"); + return Ok((tx, None)); + } // 1. Try to lock the row first let _ = sqlx::query!( "SELECT job_uuids FROM concurrency_counter From 8d71124c20c78baa9e0db23dc78727ffedf56d3f Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Sun, 16 Mar 2025 18:22:41 +0100 Subject: [PATCH 047/739] DISABLE_CONCURRENCY_LIMIT 2 --- backend/windmill-queue/src/jobs.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/windmill-queue/src/jobs.rs b/backend/windmill-queue/src/jobs.rs index fd17c28400..cccd3a3e5e 100644 --- a/backend/windmill-queue/src/jobs.rs +++ b/backend/windmill-queue/src/jobs.rs @@ -2037,7 +2037,7 @@ pub async fn pull( nestimated ).fetch_optional(&mut *tx).await?.flatten().unwrap_or(0) as i32; tracing::info!("estimated_next_schedule_timestamp: {:?}, jobs_in_window: {jobs_in_window}, nestimated: {nestimated}, inc: {inc}", estimated_next_schedule_timestamp); - if jobs_in_window < job_custom_concurrent_limit { + if jobs_in_window < job_custom_concurrent_limit || *DISABLE_CONCURRENCY_LIMIT { break; } else { estimated_next_schedule_timestamp = nestimated; From eee7d33bd8811be75d319956133bd8d6292aea90 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Mon, 17 Mar 2025 00:53:14 +0100 Subject: [PATCH 048/739] fix: improve concurrency limit check performances --- ...e18e8dfbdb0bf1dd4c0dc07a55f4eeb4eb5f8.json | 24 ------------ ...2d688519e8af27b228202c872061cbda7e30a.json | 23 +++++++++++ backend/windmill-queue/src/jobs.rs | 39 ++++++++++++------- 3 files changed, 48 insertions(+), 38 deletions(-) delete mode 100644 backend/.sqlx/query-9c19ad9ab14325587d662539c04e18e8dfbdb0bf1dd4c0dc07a55f4eeb4eb5f8.json create mode 100644 backend/.sqlx/query-bef2776351e8489559609d390b92d688519e8af27b228202c872061cbda7e30a.json diff --git a/backend/.sqlx/query-9c19ad9ab14325587d662539c04e18e8dfbdb0bf1dd4c0dc07a55f4eeb4eb5f8.json b/backend/.sqlx/query-9c19ad9ab14325587d662539c04e18e8dfbdb0bf1dd4c0dc07a55f4eeb4eb5f8.json deleted file mode 100644 index 89368ea0c8..0000000000 --- a/backend/.sqlx/query-9c19ad9ab14325587d662539c04e18e8dfbdb0bf1dd4c0dc07a55f4eeb4eb5f8.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT COUNT(*) FROM v2_as_queue LEFT JOIN concurrency_key ON concurrency_key.job_id = v2_as_queue.id\n WHERE key = $1 AND running = false AND canceled = false AND scheduled_for >= $2 AND scheduled_for < $3", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "count", - "type_info": "Int8" - } - ], - "parameters": { - "Left": [ - "Text", - "Timestamptz", - "Timestamptz" - ] - }, - "nullable": [ - null - ] - }, - "hash": "9c19ad9ab14325587d662539c04e18e8dfbdb0bf1dd4c0dc07a55f4eeb4eb5f8" -} diff --git a/backend/.sqlx/query-bef2776351e8489559609d390b92d688519e8af27b228202c872061cbda7e30a.json b/backend/.sqlx/query-bef2776351e8489559609d390b92d688519e8af27b228202c872061cbda7e30a.json new file mode 100644 index 0000000000..d75ffd0339 --- /dev/null +++ b/backend/.sqlx/query-bef2776351e8489559609d390b92d688519e8af27b228202c872061cbda7e30a.json @@ -0,0 +1,23 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT scheduled_for FROM v2_job_queue INNER JOIN concurrency_key ON concurrency_key.job_id = v2_job_queue.id\n WHERE key = $1 AND running = false AND canceled_by IS NULL AND scheduled_for >= $2", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "scheduled_for", + "type_info": "Timestamptz" + } + ], + "parameters": { + "Left": [ + "Text", + "Timestamptz" + ] + }, + "nullable": [ + false + ] + }, + "hash": "bef2776351e8489559609d390b92d688519e8af27b228202c872061cbda7e30a" +} diff --git a/backend/windmill-queue/src/jobs.rs b/backend/windmill-queue/src/jobs.rs index cccd3a3e5e..2a183e4631 100644 --- a/backend/windmill-queue/src/jobs.rs +++ b/backend/windmill-queue/src/jobs.rs @@ -2005,7 +2005,7 @@ pub async fn pull( ) .fetch_one(&mut *tx) .await?; - tracing::info!("avg script duration computed: {:?}", avg_script_duration); + tracing::debug!("avg script duration computed: {:?}", avg_script_duration); // let before_me = sqlx::query!( // "SELECT schedu FROM queue WHERE script_path = $1 AND job_kind != 'dependencies' AND running = true AND workspace_id = $2 AND canceled = false AND started_at < $3 ORDER BY started_at DESC LIMIT 1", @@ -2027,28 +2027,39 @@ pub async fn pull( .max(now + Duration::try_seconds(3).unwrap_or_default()); let mut estimated_next_schedule_timestamp = min_started_p_inc; + let all_jobs = sqlx::query_scalar!( + "SELECT scheduled_for FROM v2_job_queue INNER JOIN concurrency_key ON concurrency_key.job_id = v2_job_queue.id + WHERE key = $1 AND running = false AND canceled_by IS NULL AND scheduled_for >= $2", + job_concurrency_key, + estimated_next_schedule_timestamp - inc + ).fetch_all(&mut *tx).await?; + + let mut i = 0; loop { - let nestimated = estimated_next_schedule_timestamp + inc; - let jobs_in_window = sqlx::query_scalar!( - "SELECT COUNT(*) FROM v2_as_queue LEFT JOIN concurrency_key ON concurrency_key.job_id = v2_as_queue.id - WHERE key = $1 AND running = false AND canceled = false AND scheduled_for >= $2 AND scheduled_for < $3", - job_concurrency_key, - estimated_next_schedule_timestamp, - nestimated - ).fetch_optional(&mut *tx).await?.flatten().unwrap_or(0) as i32; - tracing::info!("estimated_next_schedule_timestamp: {:?}, jobs_in_window: {jobs_in_window}, nestimated: {nestimated}, inc: {inc}", estimated_next_schedule_timestamp); + let jobs_in_window = all_jobs + .iter() + .filter(|&scheduled_for| { + scheduled_for >= &(estimated_next_schedule_timestamp - inc) + && scheduled_for < &estimated_next_schedule_timestamp + }) + .count() as i32; + + tracing::debug!("estimated_next_schedule_timestamp: {:?}, jobs_in_window: {jobs_in_window}, inc: {inc}", estimated_next_schedule_timestamp); + if jobs_in_window < job_custom_concurrent_limit || *DISABLE_CONCURRENCY_LIMIT { break; } else { - estimated_next_schedule_timestamp = nestimated; + i += 1; + estimated_next_schedule_timestamp = estimated_next_schedule_timestamp + inc; } } - tracing::info!("Job '{}' from path '{}' with concurrency key '{}' has reached its concurrency limit of {} jobs run in the last {} seconds. This job will be re-queued for next execution at {}", - job_uuid, job_script_path, job_concurrency_key, job_custom_concurrent_limit, job_custom_concurrency_time_window_s, estimated_next_schedule_timestamp); + tracing::info!("Job '{}' from path '{}' with concurrency key '{}' has reached its concurrency limit of {} jobs run in the last {} seconds. This job will be re-queued for next execution at {} (avg script duration: {:?}, number of time windows full: {})", + job_uuid, job_script_path, job_concurrency_key, job_custom_concurrent_limit, job_custom_concurrency_time_window_s, estimated_next_schedule_timestamp, avg_script_duration, i); let job_log_event = format!( - "\nRe-scheduled job to {estimated_next_schedule_timestamp} due to concurrency limits with key {job_concurrency_key} and limit {job_custom_concurrent_limit} in the last {job_custom_concurrency_time_window_s} seconds", + "\nRe-scheduled job to {estimated_next_schedule_timestamp} due to concurrency limits with key {job_concurrency_key} and limit {job_custom_concurrent_limit} in the last {job_custom_concurrency_time_window_s} seconds (avg script duration: {:?}, number of time windows full: {})", + avg_script_duration, i ); let _ = append_logs(&job_uuid, &pulled_job.workspace_id, job_log_event, db).await; From 8a7b119d4d9f02f4e3b58cb99c106f4f7148562b Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Mon, 17 Mar 2025 17:24:50 +0100 Subject: [PATCH 049/739] improve concurrency limits II (#5485) --- ...5cde8a5b86d7ca377a028004cc382e12faf41.json | 14 ++ ...91cf3ea0afe68fb8e08e7aea239dc735c625c.json | 15 -- ...a81d68f3d56d4782e99e05b4f1cb362683514.json | 15 ++ ...c5eb28780abc8adffcc7175f6c8d4ff8849ca.json | 23 --- ...721ad0f3e2888af207e8830ccf5e921c5fd60.json | 16 ++ ...5f85dd67ab1514d7c48668ab2f10aa6b201ba.json | 14 ++ ...bcae842ff252cc355bd91aeeb5e26dcc74f3.json} | 4 +- ...ff0d370cf1ab4d41f68494a940951eaa52bc3.json | 15 -- ...91e9605494a797b9c01c54fbdbe8949ab625d.json | 15 ++ ...6fe4c284dd6ed5245fbb90650d99afbf3812.json} | 4 +- ...76d8a2424dce6c4ab2a43cf863911c833fd30.json | 24 --- ...b69a1e6798103df08344fbc9719e53f336c29.json | 22 -- ...3322cae965dc5d8ebc98f69d5922fa1192561.json | 22 ++ backend/ee-repo-ref.txt | 2 +- backend/src/main.rs | 21 +- backend/windmill-api/src/jobs.rs | 7 + backend/windmill-queue/src/jobs.rs | 188 ++++++------------ backend/windmill-queue/src/jobs_ee.rs | 16 ++ backend/windmill-queue/src/lib.rs | 2 +- .../src/lib/components/runs/RunRow.svelte | 5 + 20 files changed, 207 insertions(+), 237 deletions(-) create mode 100644 backend/.sqlx/query-05cb171b610bfb45f6228128a385cde8a5b86d7ca377a028004cc382e12faf41.json delete mode 100644 backend/.sqlx/query-0a1c95c4376b944661bab13271091cf3ea0afe68fb8e08e7aea239dc735c625c.json create mode 100644 backend/.sqlx/query-1bceaf6e9f25745b7f70128054ca81d68f3d56d4782e99e05b4f1cb362683514.json delete mode 100644 backend/.sqlx/query-38a3fbc28e827d08a928d441274c5eb28780abc8adffcc7175f6c8d4ff8849ca.json create mode 100644 backend/.sqlx/query-3fa3d1fa1add8e187fcbaf7351b721ad0f3e2888af207e8830ccf5e921c5fd60.json create mode 100644 backend/.sqlx/query-5930b2fa72fd15d692bcf3e14d95f85dd67ab1514d7c48668ab2f10aa6b201ba.json rename backend/.sqlx/{query-ab9e47e5b510e7df5a41db12896675393a6bb27f8e14245410751961218a7df5.json => query-6b6f8f7b4a6b6e7e41a9da8b6dfdbcae842ff252cc355bd91aeeb5e26dcc74f3.json} (54%) delete mode 100644 backend/.sqlx/query-7145a1a6cf0ccfae5874c882e63ff0d370cf1ab4d41f68494a940951eaa52bc3.json create mode 100644 backend/.sqlx/query-7f6d6952abee71fb6bb5604766c91e9605494a797b9c01c54fbdbe8949ab625d.json rename backend/.sqlx/{query-7b1e6b67a20ae1128118d5f5cc0db4007fb9dc6fd20582a46ebb951fca3a7abd.json => query-8c2541cdfb84bfdbdc28285641166fe4c284dd6ed5245fbb90650d99afbf3812.json} (58%) delete mode 100644 backend/.sqlx/query-b6d657d98de40a25b2bf66471c376d8a2424dce6c4ab2a43cf863911c833fd30.json delete mode 100644 backend/.sqlx/query-c013880b8567bf5545b0c93ffb4b69a1e6798103df08344fbc9719e53f336c29.json create mode 100644 backend/.sqlx/query-cbb93da0b7719a27d2ae1ec0f653322cae965dc5d8ebc98f69d5922fa1192561.json create mode 100644 backend/windmill-queue/src/jobs_ee.rs diff --git a/backend/.sqlx/query-05cb171b610bfb45f6228128a385cde8a5b86d7ca377a028004cc382e12faf41.json b/backend/.sqlx/query-05cb171b610bfb45f6228128a385cde8a5b86d7ca377a028004cc382e12faf41.json new file mode 100644 index 0000000000..5290fab4c4 --- /dev/null +++ b/backend/.sqlx/query-05cb171b610bfb45f6228128a385cde8a5b86d7ca377a028004cc382e12faf41.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO concurrency_counter(concurrency_id, job_uuids) \n VALUES ($1, '{}'::jsonb)", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar" + ] + }, + "nullable": [] + }, + "hash": "05cb171b610bfb45f6228128a385cde8a5b86d7ca377a028004cc382e12faf41" +} diff --git a/backend/.sqlx/query-0a1c95c4376b944661bab13271091cf3ea0afe68fb8e08e7aea239dc735c625c.json b/backend/.sqlx/query-0a1c95c4376b944661bab13271091cf3ea0afe68fb8e08e7aea239dc735c625c.json deleted file mode 100644 index b8f224dbc2..0000000000 --- a/backend/.sqlx/query-0a1c95c4376b944661bab13271091cf3ea0afe68fb8e08e7aea239dc735c625c.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO concurrency_key(key, job_id) VALUES ($1, $2)", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "Uuid" - ] - }, - "nullable": [] - }, - "hash": "0a1c95c4376b944661bab13271091cf3ea0afe68fb8e08e7aea239dc735c625c" -} diff --git a/backend/.sqlx/query-1bceaf6e9f25745b7f70128054ca81d68f3d56d4782e99e05b4f1cb362683514.json b/backend/.sqlx/query-1bceaf6e9f25745b7f70128054ca81d68f3d56d4782e99e05b4f1cb362683514.json new file mode 100644 index 0000000000..1be74d47f2 --- /dev/null +++ b/backend/.sqlx/query-1bceaf6e9f25745b7f70128054ca81d68f3d56d4782e99e05b4f1cb362683514.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "WITH inserted_concurrency_counter AS (\n INSERT INTO concurrency_counter (concurrency_id, job_uuids) \n VALUES ($1, '{}'::jsonb)\n ON CONFLICT DO NOTHING\n )\n INSERT INTO concurrency_key(key, job_id) VALUES ($1, $2)", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Uuid" + ] + }, + "nullable": [] + }, + "hash": "1bceaf6e9f25745b7f70128054ca81d68f3d56d4782e99e05b4f1cb362683514" +} diff --git a/backend/.sqlx/query-38a3fbc28e827d08a928d441274c5eb28780abc8adffcc7175f6c8d4ff8849ca.json b/backend/.sqlx/query-38a3fbc28e827d08a928d441274c5eb28780abc8adffcc7175f6c8d4ff8849ca.json deleted file mode 100644 index a3929e5e4b..0000000000 --- a/backend/.sqlx/query-38a3fbc28e827d08a928d441274c5eb28780abc8adffcc7175f6c8d4ff8849ca.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE concurrency_counter SET job_uuids = job_uuids - $2 WHERE concurrency_id = $1 RETURNING (SELECT COUNT(*) FROM jsonb_object_keys(job_uuids))", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "count", - "type_info": "Int8" - } - ], - "parameters": { - "Left": [ - "Text", - "Text" - ] - }, - "nullable": [ - null - ] - }, - "hash": "38a3fbc28e827d08a928d441274c5eb28780abc8adffcc7175f6c8d4ff8849ca" -} diff --git a/backend/.sqlx/query-3fa3d1fa1add8e187fcbaf7351b721ad0f3e2888af207e8830ccf5e921c5fd60.json b/backend/.sqlx/query-3fa3d1fa1add8e187fcbaf7351b721ad0f3e2888af207e8830ccf5e921c5fd60.json new file mode 100644 index 0000000000..3bb4151982 --- /dev/null +++ b/backend/.sqlx/query-3fa3d1fa1add8e187fcbaf7351b721ad0f3e2888af207e8830ccf5e921c5fd60.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO concurrency_counter(concurrency_id, job_uuids) \n VALUES ($1, $2)\n ON CONFLICT (concurrency_id)\n DO UPDATE SET job_uuids = jsonb_set(concurrency_counter.job_uuids, array[$3], '{}')", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Jsonb", + "Text" + ] + }, + "nullable": [] + }, + "hash": "3fa3d1fa1add8e187fcbaf7351b721ad0f3e2888af207e8830ccf5e921c5fd60" +} diff --git a/backend/.sqlx/query-5930b2fa72fd15d692bcf3e14d95f85dd67ab1514d7c48668ab2f10aa6b201ba.json b/backend/.sqlx/query-5930b2fa72fd15d692bcf3e14d95f85dd67ab1514d7c48668ab2f10aa6b201ba.json new file mode 100644 index 0000000000..d616940b6b --- /dev/null +++ b/backend/.sqlx/query-5930b2fa72fd15d692bcf3e14d95f85dd67ab1514d7c48668ab2f10aa6b201ba.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE v2_job_runtime SET ping = now() WHERE id = $1", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Uuid" + ] + }, + "nullable": [] + }, + "hash": "5930b2fa72fd15d692bcf3e14d95f85dd67ab1514d7c48668ab2f10aa6b201ba" +} diff --git a/backend/.sqlx/query-ab9e47e5b510e7df5a41db12896675393a6bb27f8e14245410751961218a7df5.json b/backend/.sqlx/query-6b6f8f7b4a6b6e7e41a9da8b6dfdbcae842ff252cc355bd91aeeb5e26dcc74f3.json similarity index 54% rename from backend/.sqlx/query-ab9e47e5b510e7df5a41db12896675393a6bb27f8e14245410751961218a7df5.json rename to backend/.sqlx/query-6b6f8f7b4a6b6e7e41a9da8b6dfdbcae842ff252cc355bd91aeeb5e26dcc74f3.json index 868541a175..80619c8b2a 100644 --- a/backend/.sqlx/query-ab9e47e5b510e7df5a41db12896675393a6bb27f8e14245410751961218a7df5.json +++ b/backend/.sqlx/query-6b6f8f7b4a6b6e7e41a9da8b6dfdbcae842ff252cc355bd91aeeb5e26dcc74f3.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT COALESCE((SELECT MIN(started_at) as min_started_at\n FROM v2_as_queue\n WHERE script_path = $1 AND job_kind != 'dependencies' AND running = true AND workspace_id = $2 AND canceled = false AND concurrent_limit > 0), $3) as min_started_at, now() AS now", + "query": "SELECT COALESCE((SELECT MIN(started_at) as min_started_at\n FROM v2_job_queue INNER JOIN v2_job ON v2_job.id = v2_job_queue.id\n WHERE v2_job.runnable_path = $1 AND v2_job.kind != 'dependencies' AND v2_job_queue.running = true AND v2_job_queue.workspace_id = $2 AND v2_job_queue.canceled_by IS NULL AND v2_job.concurrent_limit > 0), $3) as min_started_at, now() AS now", "describe": { "columns": [ { @@ -26,5 +26,5 @@ null ] }, - "hash": "ab9e47e5b510e7df5a41db12896675393a6bb27f8e14245410751961218a7df5" + "hash": "6b6f8f7b4a6b6e7e41a9da8b6dfdbcae842ff252cc355bd91aeeb5e26dcc74f3" } diff --git a/backend/.sqlx/query-7145a1a6cf0ccfae5874c882e63ff0d370cf1ab4d41f68494a940951eaa52bc3.json b/backend/.sqlx/query-7145a1a6cf0ccfae5874c882e63ff0d370cf1ab4d41f68494a940951eaa52bc3.json deleted file mode 100644 index edec8c5053..0000000000 --- a/backend/.sqlx/query-7145a1a6cf0ccfae5874c882e63ff0d370cf1ab4d41f68494a940951eaa52bc3.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "WITH ping AS (UPDATE v2_job_runtime SET ping = NULL WHERE id = $2 RETURNING id)\n UPDATE v2_job_queue SET\n running = false,\n started_at = null,\n scheduled_for = $1\n WHERE id = $2", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Timestamptz", - "Uuid" - ] - }, - "nullable": [] - }, - "hash": "7145a1a6cf0ccfae5874c882e63ff0d370cf1ab4d41f68494a940951eaa52bc3" -} diff --git a/backend/.sqlx/query-7f6d6952abee71fb6bb5604766c91e9605494a797b9c01c54fbdbe8949ab625d.json b/backend/.sqlx/query-7f6d6952abee71fb6bb5604766c91e9605494a797b9c01c54fbdbe8949ab625d.json new file mode 100644 index 0000000000..0667ac7d65 --- /dev/null +++ b/backend/.sqlx/query-7f6d6952abee71fb6bb5604766c91e9605494a797b9c01c54fbdbe8949ab625d.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "\n WITH ping AS (\n UPDATE v2_job_runtime SET ping = null WHERE id = $2\n )\n UPDATE v2_job_queue SET\n running = false,\n started_at = null,\n scheduled_for = $1\n WHERE id = $2", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Timestamptz", + "Uuid" + ] + }, + "nullable": [] + }, + "hash": "7f6d6952abee71fb6bb5604766c91e9605494a797b9c01c54fbdbe8949ab625d" +} diff --git a/backend/.sqlx/query-7b1e6b67a20ae1128118d5f5cc0db4007fb9dc6fd20582a46ebb951fca3a7abd.json b/backend/.sqlx/query-8c2541cdfb84bfdbdc28285641166fe4c284dd6ed5245fbb90650d99afbf3812.json similarity index 58% rename from backend/.sqlx/query-7b1e6b67a20ae1128118d5f5cc0db4007fb9dc6fd20582a46ebb951fca3a7abd.json rename to backend/.sqlx/query-8c2541cdfb84bfdbdc28285641166fe4c284dd6ed5245fbb90650d99afbf3812.json index a094b8580f..88dcd47312 100644 --- a/backend/.sqlx/query-7b1e6b67a20ae1128118d5f5cc0db4007fb9dc6fd20582a46ebb951fca3a7abd.json +++ b/backend/.sqlx/query-8c2541cdfb84bfdbdc28285641166fe4c284dd6ed5245fbb90650d99afbf3812.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT CAST(ROUND(AVG(duration_ms), 0) AS BIGINT) AS avg_duration_s FROM\n (SELECT duration_ms FROM concurrency_key LEFT JOIN v2_as_completed_job ON v2_as_completed_job.id = concurrency_key.job_id WHERE key = $1 AND ended_at IS NOT NULL\n ORDER BY ended_at\n DESC LIMIT 10) AS t", + "query": "SELECT CAST(ROUND(AVG(duration_ms), 0) AS BIGINT) AS avg_duration_s FROM\n (SELECT duration_ms FROM concurrency_key LEFT JOIN v2_job_completed ON v2_job_completed.id = concurrency_key.job_id WHERE key = $1 AND ended_at IS NOT NULL\n ORDER BY ended_at\n DESC LIMIT 10) AS t", "describe": { "columns": [ { @@ -18,5 +18,5 @@ null ] }, - "hash": "7b1e6b67a20ae1128118d5f5cc0db4007fb9dc6fd20582a46ebb951fca3a7abd" + "hash": "8c2541cdfb84bfdbdc28285641166fe4c284dd6ed5245fbb90650d99afbf3812" } diff --git a/backend/.sqlx/query-b6d657d98de40a25b2bf66471c376d8a2424dce6c4ab2a43cf863911c833fd30.json b/backend/.sqlx/query-b6d657d98de40a25b2bf66471c376d8a2424dce6c4ab2a43cf863911c833fd30.json deleted file mode 100644 index c775d232e1..0000000000 --- a/backend/.sqlx/query-b6d657d98de40a25b2bf66471c376d8a2424dce6c4ab2a43cf863911c833fd30.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO concurrency_counter(concurrency_id, job_uuids) \n VALUES ($1, $2)\n ON CONFLICT (concurrency_id) \n DO UPDATE SET job_uuids = jsonb_set(concurrency_counter.job_uuids, array[$3], '{}')\n RETURNING (SELECT COUNT(*) FROM jsonb_object_keys(job_uuids))", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "count", - "type_info": "Int8" - } - ], - "parameters": { - "Left": [ - "Varchar", - "Jsonb", - "Text" - ] - }, - "nullable": [ - null - ] - }, - "hash": "b6d657d98de40a25b2bf66471c376d8a2424dce6c4ab2a43cf863911c833fd30" -} diff --git a/backend/.sqlx/query-c013880b8567bf5545b0c93ffb4b69a1e6798103df08344fbc9719e53f336c29.json b/backend/.sqlx/query-c013880b8567bf5545b0c93ffb4b69a1e6798103df08344fbc9719e53f336c29.json deleted file mode 100644 index 904c4eba5f..0000000000 --- a/backend/.sqlx/query-c013880b8567bf5545b0c93ffb4b69a1e6798103df08344fbc9719e53f336c29.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT job_uuids FROM concurrency_counter \n WHERE concurrency_id = $1 \n FOR UPDATE", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "job_uuids", - "type_info": "Jsonb" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - false - ] - }, - "hash": "c013880b8567bf5545b0c93ffb4b69a1e6798103df08344fbc9719e53f336c29" -} diff --git a/backend/.sqlx/query-cbb93da0b7719a27d2ae1ec0f653322cae965dc5d8ebc98f69d5922fa1192561.json b/backend/.sqlx/query-cbb93da0b7719a27d2ae1ec0f653322cae965dc5d8ebc98f69d5922fa1192561.json new file mode 100644 index 0000000000..684e857290 --- /dev/null +++ b/backend/.sqlx/query-cbb93da0b7719a27d2ae1ec0f653322cae965dc5d8ebc98f69d5922fa1192561.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT COALESCE(\n (SELECT COUNT(*) FROM jsonb_object_keys(job_uuids)),\n 0\n )\n FROM concurrency_counter \n WHERE concurrency_id = $1\n FOR UPDATE", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "coalesce", + "type_info": "Int8" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + null + ] + }, + "hash": "cbb93da0b7719a27d2ae1ec0f653322cae965dc5d8ebc98f69d5922fa1192561" +} diff --git a/backend/ee-repo-ref.txt b/backend/ee-repo-ref.txt index 5d5699c639..1cd709f740 100644 --- a/backend/ee-repo-ref.txt +++ b/backend/ee-repo-ref.txt @@ -1 +1 @@ -9a3f58425136b0f9e9c8106151537b1e271ec838 \ No newline at end of file +280b866cd0b179c16c894197a891f24495a26549 \ No newline at end of file diff --git a/backend/src/main.rs b/backend/src/main.rs index afec50c6a9..a2762405bc 100644 --- a/backend/src/main.rs +++ b/backend/src/main.rs @@ -116,9 +116,10 @@ where } lazy_static::lazy_static! { - static ref PG_LISTENER_REFRESH_PERIOD_SECS: Option = std::env::var("PG_LISTENER_REFRESH_PERIOD_SECS") + static ref PG_LISTENER_REFRESH_PERIOD_SECS: u64 = std::env::var("PG_LISTENER_REFRESH_PERIOD_SECS") .ok() - .and_then(|x| x.parse::().ok()); + .and_then(|x| x.parse::().ok()) + .unwrap_or(3600 * 12); } pub fn main() -> anyhow::Result<()> { @@ -866,12 +867,24 @@ Windmill Community Edition {GIT_VERSION} }; }, _ = tokio::time::sleep(Duration::from_secs(30)) => { - if PG_LISTENER_REFRESH_PERIOD_SECS.is_some_and(|x| last_listener_refresh.elapsed() > Duration::from_secs(x)) { - tracing::info!("Refreshing pg listener"); + if last_listener_refresh.elapsed() > Duration::from_secs(*PG_LISTENER_REFRESH_PERIOD_SECS) { + tracing::info!("Refreshing pg listeners, settings and license key after {}s", Duration::from_secs(*PG_LISTENER_REFRESH_PERIOD_SECS).as_secs()); if let Err(e) = listener.unlisten_all().await { tracing::error!(error = %e, "Could not unlisten to database"); } listener = retry_listen_pg(&db_url).await; + initial_load( + &db, + tx.clone(), + worker_mode, + server_mode, + #[cfg(feature = "parquet")] + disable_s3_store, + ) + .await; + if let Err(err) = reload_license_key(&db).await { + tracing::error!("Failed to reload license key: {err:#}"); + } last_listener_refresh = Instant::now(); } diff --git a/backend/windmill-api/src/jobs.rs b/backend/windmill-api/src/jobs.rs index ad0376fe51..5148359981 100644 --- a/backend/windmill-api/src/jobs.rs +++ b/backend/windmill-api/src/jobs.rs @@ -4968,6 +4968,13 @@ async fn add_batch_jobs( } if let Some(custom_concurrency_key) = custom_concurrency_key { + sqlx::query!( + "INSERT INTO concurrency_counter(concurrency_id, job_uuids) + VALUES ($1, '{}'::jsonb)", + &custom_concurrency_key + ) + .execute(&mut *tx) + .await?; sqlx::query!( "INSERT INTO concurrency_key (job_id, key) SELECT id, $1 FROM unnest($2::uuid[]) as id", custom_concurrency_key, diff --git a/backend/windmill-queue/src/jobs.rs b/backend/windmill-queue/src/jobs.rs index 2a183e4631..f0eda8328a 100644 --- a/backend/windmill-queue/src/jobs.rs +++ b/backend/windmill-queue/src/jobs.rs @@ -62,6 +62,7 @@ use windmill_common::BASE_URL; #[cfg(feature = "cloud")] use windmill_common::users::SUPERADMIN_SYNC_EMAIL; +use crate::jobs_ee::update_concurrency_counter; use crate::schedule::{get_schedule_opt, push_scheduled_job}; #[cfg(feature = "prometheus")] @@ -1887,11 +1888,6 @@ pub async fn pull( return Ok((Option::Some(pulled_job), suspended)); } - let mut tx = db.begin().await?; - - // Else the job is subject to concurrency limits - let job_script_path = pulled_job.script_path.clone().unwrap(); - let job_concurrency_key = match concurrency_key(db, &pulled_job).await { Ok(key) => key, Err(e) => { @@ -1915,104 +1911,67 @@ pub async fn pull( job_custom_concurrency_time_window_s ); - sqlx::query_scalar!( - "SELECT null FROM v2_job_queue WHERE id = $1 FOR UPDATE", - pulled_job.id - ) - .fetch_one(&mut *tx) - .await - .context("lock job in queue")?; - let jobs_uuids_init_json_value = serde_json::from_str::( format!("{{\"{}\": {{}}}}", pulled_job.id.hyphenated().to_string()).as_str(), ) .expect("Unable to serialize job_uuids column to proper JSON"); - let (mut tx, running_job) = update_concurrency_counter( - tx, - job_concurrency_key.clone(), - jobs_uuids_init_json_value, - pulled_job.id.hyphenated().to_string(), - ) - .await?; - tracing::debug!("running_job: {}", running_job.unwrap_or(0)); - let completed_count = sqlx::query!( - "SELECT COUNT(*) as count, COALESCE(MAX(ended_at), now() - INTERVAL '1 second' * $2) as max_ended_at FROM concurrency_key WHERE key = $1 AND ended_at >= (now() - INTERVAL '1 second' * $2)", - job_concurrency_key, - f64::from(job_custom_concurrency_time_window_s), - ).fetch_one(&mut *tx).await.map_err(|e| { - Error::internal_err(format!( - "Error getting completed count for key {job_concurrency_key}: {e:#}" - )) - })?; - - let min_started_at = sqlx::query!( - "SELECT COALESCE((SELECT MIN(started_at) as min_started_at - FROM v2_as_queue - WHERE script_path = $1 AND job_kind != 'dependencies' AND running = true AND workspace_id = $2 AND canceled = false AND concurrent_limit > 0), $3) as min_started_at, now() AS now", - job_script_path, - &pulled_job.workspace_id, - completed_count.max_ended_at - ) - .fetch_one(&mut *tx) - .await - .map_err(|e| { - Error::internal_err(format!( - "Error getting concurrency count for script path {job_script_path}: {e:#}" - )) - })?; - - let concurrent_jobs_for_this_script = - completed_count.count.unwrap_or_default() as i32 + running_job.unwrap_or(0) as i32; - tracing::debug!( - "Current concurrent jobs for this script: {}", - concurrent_jobs_for_this_script - ); - if concurrent_jobs_for_this_script <= job_custom_concurrent_limit { + let (within_limit, max_ended_at) = if *DISABLE_CONCURRENCY_LIMIT { + tracing::warn!("Concurrency limit is disabled, skipping"); + (true, None) + } else { + update_concurrency_counter( + db, + &pulled_job.id, + job_concurrency_key.clone(), + jobs_uuids_init_json_value, + pulled_job.id.hyphenated().to_string(), + job_custom_concurrency_time_window_s, + job_custom_concurrent_limit, + ) + .await? + }; + if within_limit { #[cfg(feature = "prometheus")] if METRICS_ENABLED.load(std::sync::atomic::Ordering::Relaxed) { QUEUE_PULL_COUNT.inc(); } - tx.commit().await?; return Ok((Option::Some(pulled_job), suspended)); } - if *DISABLE_CONCURRENCY_LIMIT { - tracing::warn!("Concurrency limit is disabled, skipping"); - } else { - let x = sqlx::query_scalar!( - "UPDATE concurrency_counter SET job_uuids = job_uuids - $2 WHERE concurrency_id = $1 RETURNING (SELECT COUNT(*) FROM jsonb_object_keys(job_uuids))", - job_concurrency_key, - pulled_job.id.hyphenated().to_string(), + let job_script_path = pulled_job.script_path.clone().unwrap_or_default(); + + let min_started_at = sqlx::query!( + "SELECT COALESCE((SELECT MIN(started_at) as min_started_at + FROM v2_job_queue INNER JOIN v2_job ON v2_job.id = v2_job_queue.id + WHERE v2_job.runnable_path = $1 AND v2_job.kind != 'dependencies' AND v2_job_queue.running = true AND v2_job_queue.workspace_id = $2 AND v2_job_queue.canceled_by IS NULL AND v2_job.concurrent_limit > 0), $3) as min_started_at, now() AS now", + job_script_path, + &pulled_job.workspace_id, + max_ended_at ) - .fetch_one(&mut *tx) + .fetch_one(db) .await .map_err(|e| { Error::internal_err(format!( - "Error decreasing concurrency count for script path {job_script_path}: {e:#}" + "Error getting min started at for script path {job_script_path}: {e:#}" )) })?; - tracing::debug!("running_job after decrease: {}", x.unwrap_or(0)); - } let job_uuid: Uuid = pulled_job.id; let avg_script_duration: Option = sqlx::query_scalar!( "SELECT CAST(ROUND(AVG(duration_ms), 0) AS BIGINT) AS avg_duration_s FROM - (SELECT duration_ms FROM concurrency_key LEFT JOIN v2_as_completed_job ON v2_as_completed_job.id = concurrency_key.job_id WHERE key = $1 AND ended_at IS NOT NULL + (SELECT duration_ms FROM concurrency_key LEFT JOIN v2_job_completed ON v2_job_completed.id = concurrency_key.job_id WHERE key = $1 AND ended_at IS NOT NULL ORDER BY ended_at DESC LIMIT 10) AS t", job_concurrency_key ) - .fetch_one(&mut *tx) + .fetch_one(db) .await?; - tracing::debug!("avg script duration computed: {:?}", avg_script_duration); + tracing::debug!( + "avg script duration computed: {}", + avg_script_duration.unwrap_or(0) + ); - // let before_me = sqlx::query!( - // "SELECT schedu FROM queue WHERE script_path = $1 AND job_kind != 'dependencies' AND running = true AND workspace_id = $2 AND canceled = false AND started_at < $3 ORDER BY started_at DESC LIMIT 1", - // job_script_path, - // &pulled_job.workspace_id, - // min_started_at.now.unwrap() - // ) // optimal scheduling is: 'older_job_in_concurrency_time_window_started_timestamp + script_avg_duration + concurrency_time_window_s' let inc = Duration::try_milliseconds( avg_script_duration.map(|x| i64::from(x + 100)).unwrap_or(0), @@ -2023,8 +1982,9 @@ pub async fn pull( .unwrap_or_default(); let now = min_started_at.now.unwrap(); - let min_started_p_inc = (min_started_at.min_started_at.unwrap_or(now) + inc) - .max(now + Duration::try_seconds(3).unwrap_or_default()); + let min_started_at_or_now = min_started_at.min_started_at.unwrap_or(now); + let min_started_p_inc = + (min_started_at_or_now + inc).max(now + Duration::try_seconds(3).unwrap_or_default()); let mut estimated_next_schedule_timestamp = min_started_p_inc; let all_jobs = sqlx::query_scalar!( @@ -2032,17 +1992,21 @@ pub async fn pull( WHERE key = $1 AND running = false AND canceled_by IS NULL AND scheduled_for >= $2", job_concurrency_key, estimated_next_schedule_timestamp - inc - ).fetch_all(&mut *tx).await?; + ).fetch_all(db).await?; + tracing::debug!( + "all_jobs: {:?}, estimated_next_schedule_timestamp: {:?}, inc: {:?}", + all_jobs, + estimated_next_schedule_timestamp, + inc + ); let mut i = 0; loop { let jobs_in_window = all_jobs .iter() - .filter(|&scheduled_for| { - scheduled_for >= &(estimated_next_schedule_timestamp - inc) - && scheduled_for < &estimated_next_schedule_timestamp - }) - .count() as i32; + .filter(|&scheduled_for| scheduled_for <= &estimated_next_schedule_timestamp) + .count() as i32 + - (job_custom_concurrent_limit * i); tracing::debug!("estimated_next_schedule_timestamp: {:?}, jobs_in_window: {jobs_in_window}, inc: {inc}", estimated_next_schedule_timestamp); @@ -2054,18 +2018,20 @@ pub async fn pull( } } - tracing::info!("Job '{}' from path '{}' with concurrency key '{}' has reached its concurrency limit of {} jobs run in the last {} seconds. This job will be re-queued for next execution at {} (avg script duration: {:?}, number of time windows full: {})", + tracing::info!("Job '{}' from path '{}' with concurrency key '{}' has reached its concurrency limit of {} jobs run in the last {} seconds. This job will be re-queued for next execution at {} (min_started_at: {min_started_at_or_now}, avg script duration: {:?}, number of time windows full: {})", job_uuid, job_script_path, job_concurrency_key, job_custom_concurrent_limit, job_custom_concurrency_time_window_s, estimated_next_schedule_timestamp, avg_script_duration, i); let job_log_event = format!( - "\nRe-scheduled job to {estimated_next_schedule_timestamp} due to concurrency limits with key {job_concurrency_key} and limit {job_custom_concurrent_limit} in the last {job_custom_concurrency_time_window_s} seconds (avg script duration: {:?}, number of time windows full: {})", + "\nRe-scheduled job to {estimated_next_schedule_timestamp} due to concurrency limits with key {job_concurrency_key} and limit {job_custom_concurrent_limit} in the last {job_custom_concurrency_time_window_s} seconds (min_started_at: {min_started_at_or_now}, avg script duration: {:?}, number of time windows full: {})\n", avg_script_duration, i ); let _ = append_logs(&job_uuid, &pulled_job.workspace_id, job_log_event, db).await; - // if using posgtres, then we're able to re-queue the entire batch of scheduled job for this script_path, so we do it sqlx::query!( - "WITH ping AS (UPDATE v2_job_runtime SET ping = NULL WHERE id = $2 RETURNING id) + " + WITH ping AS ( + UPDATE v2_job_runtime SET ping = null WHERE id = $2 + ) UPDATE v2_job_queue SET running = false, started_at = null, @@ -2074,51 +2040,12 @@ pub async fn pull( estimated_next_schedule_timestamp, job_uuid, ) - .execute(&mut *tx) + .execute(db) .await .map_err(|e| Error::internal_err(format!("Could not update and re-queue job {job_uuid}. The job will be marked as running but it is not running: {e:#}")))?; - - tx.commit().await? } } -async fn update_concurrency_counter<'c>( - mut tx: Transaction<'c, sqlx::Postgres>, - job_concurrency_key: String, - jobs_uuids_init_json_value: serde_json::Value, - pulled_job_id: String, -) -> anyhow::Result<(Transaction<'c, sqlx::Postgres>, Option)> { - if *DISABLE_CONCURRENCY_LIMIT { - tracing::warn!("Concurrency limit is disabled, skipping"); - return Ok((tx, None)); - } - // 1. Try to lock the row first - let _ = sqlx::query!( - "SELECT job_uuids FROM concurrency_counter - WHERE concurrency_id = $1 - FOR UPDATE", - job_concurrency_key - ) - .fetch_optional(&mut *tx) - .await?; - - // 2. Insert if missing, otherwise update - let running_job = sqlx::query_scalar!( - "INSERT INTO concurrency_counter(concurrency_id, job_uuids) - VALUES ($1, $2) - ON CONFLICT (concurrency_id) - DO UPDATE SET job_uuids = jsonb_set(concurrency_counter.job_uuids, array[$3], '{}') - RETURNING (SELECT COUNT(*) FROM jsonb_object_keys(job_uuids))", - job_concurrency_key, - jobs_uuids_init_json_value, - pulled_job_id - ) - .fetch_one(&mut *tx) - .await?; - - Ok((tx, running_job)) -} - async fn pull_single_job_and_mark_as_running_no_concurrency_limit<'c>( db: &Pool, suspend_first: bool, @@ -3767,7 +3694,12 @@ pub async fn push<'c, 'd>( &job_kind, )); sqlx::query!( - "INSERT INTO concurrency_key(key, job_id) VALUES ($1, $2)", + "WITH inserted_concurrency_counter AS ( + INSERT INTO concurrency_counter (concurrency_id, job_uuids) + VALUES ($1, '{}'::jsonb) + ON CONFLICT DO NOTHING + ) + INSERT INTO concurrency_key(key, job_id) VALUES ($1, $2)", concurrency_key, job_id, ) diff --git a/backend/windmill-queue/src/jobs_ee.rs b/backend/windmill-queue/src/jobs_ee.rs new file mode 100644 index 0000000000..ea1f86b529 --- /dev/null +++ b/backend/windmill-queue/src/jobs_ee.rs @@ -0,0 +1,16 @@ +use chrono::{DateTime, Utc}; +use uuid::Uuid; +use windmill_common::DB; + +#[allow(dead_code)] +pub(crate) async fn update_concurrency_counter( + _db: &DB, + _job_id: &Uuid, + _job_concurrency_key: String, + _jobs_uuids_init_json_value: serde_json::Value, + _pulled_job_id: String, + _job_custom_concurrency_time_window_s: i32, + _limit: i32, +) -> anyhow::Result<(bool, Option>)> { + Ok((true, None)) +} diff --git a/backend/windmill-queue/src/lib.rs b/backend/windmill-queue/src/lib.rs index b47a3c3238..c2d022d16a 100644 --- a/backend/windmill-queue/src/lib.rs +++ b/backend/windmill-queue/src/lib.rs @@ -7,6 +7,6 @@ */ mod jobs; +pub mod jobs_ee; pub mod schedule; - pub use jobs::*; diff --git a/frontend/src/lib/components/runs/RunRow.svelte b/frontend/src/lib/components/runs/RunRow.svelte index 1ea568034e..4430708091 100644 --- a/frontend/src/lib/components/runs/RunRow.svelte +++ b/frontend/src/lib/components/runs/RunRow.svelte @@ -134,6 +134,11 @@ Scheduled for {displayDate(job.scheduled_for)} {:else if job.canceled} Cancelling job... (created ) + {:else if `scheduled_for` in job && job.scheduled_for && forLater(job.scheduled_for)} + Waiting for executor (scheduled for ) {:else} Waiting for executor (created ) {/if} From 303a81f1bf3107eb92caec37b10ba9334ac53d6c Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Tue, 18 Mar 2025 21:57:17 +0100 Subject: [PATCH 050/739] only reload license key periodically on ee --- backend/src/main.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/src/main.rs b/backend/src/main.rs index a2762405bc..9c87afa8a2 100644 --- a/backend/src/main.rs +++ b/backend/src/main.rs @@ -882,6 +882,7 @@ Windmill Community Edition {GIT_VERSION} disable_s3_store, ) .await; + #[cfg(feature = "enterprise")] if let Err(err) = reload_license_key(&db).await { tracing::error!("Failed to reload license key: {err:#}"); } From 880db319e8e2479fdf12abcac526f7fd5064a00f Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Wed, 19 Mar 2025 09:55:53 +0100 Subject: [PATCH 051/739] feat: filter by worker + backend perf opt (#5489) * all * all * all * refactor * sqlx * ref * impr * fix * fix * fix * ee private --- ...da4cbe80b0150827c6e90f6e4f9e512587ba1.json | 14 - ...a6c391c4d0054a618b861464ee37239f1f1e0.json | 273 ++++++++++++ ...7bb9be8106a79e0683cd34459585bbd920ce4.json | 23 - ...5dbf541eb14c5c374656ffb96da7283a2a6f1.json | 23 - ...e5f4b72fc27578d988155b74b05ec5df30b9.json} | 6 +- ...665831ee3e4ec3815e9ad90e886ffecba0f1.json} | 7 +- backend/ee-repo-ref.txt | 2 +- backend/src/monitor.rs | 4 +- backend/windmill-api/openapi.yaml | 13 + backend/windmill-api/src/capture.rs | 34 +- .../windmill-api/src/concurrency_groups.rs | 1 + backend/windmill-api/src/jobs.rs | 177 ++++++-- backend/windmill-api/src/mqtt_triggers.rs | 4 +- .../src/postgres_triggers/trigger.rs | 4 +- .../windmill-api/src/websocket_triggers.rs | 4 +- backend/windmill-common/src/worker.rs | 26 +- backend/windmill-queue/src/jobs.rs | 416 +++++++++++++----- .../windmill-worker/src/ansible_executor.rs | 5 +- backend/windmill-worker/src/bash_executor.rs | 9 +- .../windmill-worker/src/bigquery_executor.rs | 5 +- backend/windmill-worker/src/bun_executor.rs | 17 +- backend/windmill-worker/src/common.rs | 47 +- .../windmill-worker/src/csharp_executor.rs | 7 +- .../windmill-worker/src/dedicated_worker.rs | 23 +- backend/windmill-worker/src/deno_executor.rs | 15 +- backend/windmill-worker/src/go_executor.rs | 5 +- .../windmill-worker/src/graphql_executor.rs | 5 +- backend/windmill-worker/src/lib.rs | 1 + backend/windmill-worker/src/mssql_executor.rs | 5 +- backend/windmill-worker/src/mysql_executor.rs | 4 +- .../windmill-worker/src/oracledb_executor.rs | 5 +- backend/windmill-worker/src/otel_ee.rs | 3 + backend/windmill-worker/src/pg_executor.rs | 6 +- backend/windmill-worker/src/php_executor.rs | 5 +- .../windmill-worker/src/python_executor.rs | 13 +- .../windmill-worker/src/result_processor.rs | 35 +- backend/windmill-worker/src/rust_executor.rs | 4 +- .../windmill-worker/src/snowflake_executor.rs | 5 +- backend/windmill-worker/src/worker.rs | 133 +++--- backend/windmill-worker/src/worker_flow.rs | 131 +++--- .../windmill-worker/src/worker_lockfiles.rs | 53 ++- .../src/lib/components/runs/JobLoader.svelte | 3 + .../src/lib/components/runs/JobPreview.svelte | 21 +- .../src/lib/components/runs/RunsFilter.svelte | 83 +++- .../src/lib/components/runs/RunsTable.svelte | 1 + .../(root)/(logged)/run/[...run]/+page.svelte | 15 + .../(logged)/runs/[...path]/+page.svelte | 33 ++ 47 files changed, 1212 insertions(+), 516 deletions(-) delete mode 100644 backend/.sqlx/query-0aa8f50fe377a23e2ae3821fd6eda4cbe80b0150827c6e90f6e4f9e512587ba1.json create mode 100644 backend/.sqlx/query-4aaab98ebdaa90f1edf49ac96fba6c391c4d0054a618b861464ee37239f1f1e0.json delete mode 100644 backend/.sqlx/query-5ff7df54c7908a7de494ddae5fc7bb9be8106a79e0683cd34459585bbd920ce4.json delete mode 100644 backend/.sqlx/query-a3ccf362b4f6df400b3c7a084795dbf541eb14c5c374656ffb96da7283a2a6f1.json rename backend/.sqlx/{query-4535c8effd1bae49894d13293a37e1ee949cf9108239032cb3addbf350fb33de.json => query-c50b6a4a6739d6df087a3b37c209e5f4b72fc27578d988155b74b05ec5df30b9.json} (73%) rename backend/.sqlx/{query-2f2ef9b1ccff527c48fa01cf1b78cd0e58c8d534ac22ec0356d82a854b31d087.json => query-ec1f31fd7628ea2e30995a0de1d8665831ee3e4ec3815e9ad90e886ffecba0f1.json} (57%) create mode 100644 backend/windmill-worker/src/otel_ee.rs diff --git a/backend/.sqlx/query-0aa8f50fe377a23e2ae3821fd6eda4cbe80b0150827c6e90f6e4f9e512587ba1.json b/backend/.sqlx/query-0aa8f50fe377a23e2ae3821fd6eda4cbe80b0150827c6e90f6e4f9e512587ba1.json deleted file mode 100644 index d48b865a92..0000000000 --- a/backend/.sqlx/query-0aa8f50fe377a23e2ae3821fd6eda4cbe80b0150827c6e90f6e4f9e512587ba1.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE v2_job_queue SET started_at = NOW() WHERE id = $1", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Uuid" - ] - }, - "nullable": [] - }, - "hash": "0aa8f50fe377a23e2ae3821fd6eda4cbe80b0150827c6e90f6e4f9e512587ba1" -} diff --git a/backend/.sqlx/query-4aaab98ebdaa90f1edf49ac96fba6c391c4d0054a618b861464ee37239f1f1e0.json b/backend/.sqlx/query-4aaab98ebdaa90f1edf49ac96fba6c391c4d0054a618b861464ee37239f1f1e0.json new file mode 100644 index 0000000000..1ae47774dd --- /dev/null +++ b/backend/.sqlx/query-4aaab98ebdaa90f1edf49ac96fba6c391c4d0054a618b861464ee37239f1f1e0.json @@ -0,0 +1,273 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT \n v2_job_queue.workspace_id,\n v2_job_queue.id,\n v2_job.args as \"args: sqlx::types::Json>>\",\n v2_job.parent_job,\n v2_job.created_by,\n v2_job_queue.started_at,\n scheduled_for,\n runnable_path,\n kind as \"kind: JobKind\",\n runnable_id as \"runnable_id: ScriptHash\",\n canceled_reason,\n canceled_by,\n permissioned_as,\n permissioned_as_email,\n flow_status as \"flow_status: sqlx::types::Json>\",\n v2_job.tag,\n script_lang as \"script_lang: ScriptLang\",\n same_worker,\n pre_run_error,\n concurrent_limit,\n concurrency_time_window_s,\n flow_innermost_root_job,\n timeout,\n flow_step_id,\n cache_ttl,\n v2_job_queue.priority,\n preprocessed,\n script_entrypoint_override,\n trigger,\n trigger_kind as \"trigger_kind: JobTriggerKind\",\n visible_to_owner\n FROM v2_job_queue INNER JOIN v2_job ON v2_job.id = v2_job_queue.id LEFT JOIN v2_job_status ON v2_job_status.id = v2_job_queue.id WHERE v2_job_queue.id = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "workspace_id", + "type_info": "Varchar" + }, + { + "ordinal": 1, + "name": "id", + "type_info": "Uuid" + }, + { + "ordinal": 2, + "name": "args: sqlx::types::Json>>", + "type_info": "Jsonb" + }, + { + "ordinal": 3, + "name": "parent_job", + "type_info": "Uuid" + }, + { + "ordinal": 4, + "name": "created_by", + "type_info": "Varchar" + }, + { + "ordinal": 5, + "name": "started_at", + "type_info": "Timestamptz" + }, + { + "ordinal": 6, + "name": "scheduled_for", + "type_info": "Timestamptz" + }, + { + "ordinal": 7, + "name": "runnable_path", + "type_info": "Varchar" + }, + { + "ordinal": 8, + "name": "kind: JobKind", + "type_info": { + "Custom": { + "name": "job_kind", + "kind": { + "Enum": [ + "script", + "preview", + "flow", + "dependencies", + "flowpreview", + "script_hub", + "identity", + "flowdependencies", + "http", + "graphql", + "postgresql", + "noop", + "appdependencies", + "deploymentcallback", + "singlescriptflow", + "flowscript", + "flownode", + "appscript" + ] + } + } + } + }, + { + "ordinal": 9, + "name": "runnable_id: ScriptHash", + "type_info": "Int8" + }, + { + "ordinal": 10, + "name": "canceled_reason", + "type_info": "Text" + }, + { + "ordinal": 11, + "name": "canceled_by", + "type_info": "Varchar" + }, + { + "ordinal": 12, + "name": "permissioned_as", + "type_info": "Varchar" + }, + { + "ordinal": 13, + "name": "permissioned_as_email", + "type_info": "Varchar" + }, + { + "ordinal": 14, + "name": "flow_status: sqlx::types::Json>", + "type_info": "Jsonb" + }, + { + "ordinal": 15, + "name": "tag", + "type_info": "Varchar" + }, + { + "ordinal": 16, + "name": "script_lang: ScriptLang", + "type_info": { + "Custom": { + "name": "script_lang", + "kind": { + "Enum": [ + "python3", + "deno", + "go", + "bash", + "postgresql", + "nativets", + "bun", + "mysql", + "bigquery", + "snowflake", + "graphql", + "powershell", + "mssql", + "php", + "bunnative", + "rust", + "ansible", + "csharp", + "oracledb" + ] + } + } + } + }, + { + "ordinal": 17, + "name": "same_worker", + "type_info": "Bool" + }, + { + "ordinal": 18, + "name": "pre_run_error", + "type_info": "Text" + }, + { + "ordinal": 19, + "name": "concurrent_limit", + "type_info": "Int4" + }, + { + "ordinal": 20, + "name": "concurrency_time_window_s", + "type_info": "Int4" + }, + { + "ordinal": 21, + "name": "flow_innermost_root_job", + "type_info": "Uuid" + }, + { + "ordinal": 22, + "name": "timeout", + "type_info": "Int4" + }, + { + "ordinal": 23, + "name": "flow_step_id", + "type_info": "Varchar" + }, + { + "ordinal": 24, + "name": "cache_ttl", + "type_info": "Int4" + }, + { + "ordinal": 25, + "name": "priority", + "type_info": "Int2" + }, + { + "ordinal": 26, + "name": "preprocessed", + "type_info": "Bool" + }, + { + "ordinal": 27, + "name": "script_entrypoint_override", + "type_info": "Varchar" + }, + { + "ordinal": 28, + "name": "trigger", + "type_info": "Varchar" + }, + { + "ordinal": 29, + "name": "trigger_kind: JobTriggerKind", + "type_info": { + "Custom": { + "name": "job_trigger_kind", + "kind": { + "Enum": [ + "webhook", + "http", + "websocket", + "kafka", + "email", + "nats", + "schedule", + "app", + "ui", + "postgres" + ] + } + } + } + }, + { + "ordinal": 30, + "name": "visible_to_owner", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [ + "Uuid" + ] + }, + "nullable": [ + false, + false, + true, + true, + false, + true, + false, + true, + false, + true, + true, + true, + false, + false, + true, + false, + true, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false + ] + }, + "hash": "4aaab98ebdaa90f1edf49ac96fba6c391c4d0054a618b861464ee37239f1f1e0" +} diff --git a/backend/.sqlx/query-5ff7df54c7908a7de494ddae5fc7bb9be8106a79e0683cd34459585bbd920ce4.json b/backend/.sqlx/query-5ff7df54c7908a7de494ddae5fc7bb9be8106a79e0683cd34459585bbd920ce4.json deleted file mode 100644 index 45bca31fd0..0000000000 --- a/backend/.sqlx/query-5ff7df54c7908a7de494ddae5fc7bb9be8106a79e0683cd34459585bbd920ce4.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT flow_version.value->>'concurrency_key'\n FROM flow \n LEFT JOIN flow_version\n ON flow_version.id = flow.versions[array_upper(flow.versions, 1)]\n WHERE flow.path = $1 AND flow.workspace_id = $2", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "?column?", - "type_info": "Text" - } - ], - "parameters": { - "Left": [ - "Text", - "Text" - ] - }, - "nullable": [ - null - ] - }, - "hash": "5ff7df54c7908a7de494ddae5fc7bb9be8106a79e0683cd34459585bbd920ce4" -} diff --git a/backend/.sqlx/query-a3ccf362b4f6df400b3c7a084795dbf541eb14c5c374656ffb96da7283a2a6f1.json b/backend/.sqlx/query-a3ccf362b4f6df400b3c7a084795dbf541eb14c5c374656ffb96da7283a2a6f1.json deleted file mode 100644 index bc5e2351f9..0000000000 --- a/backend/.sqlx/query-a3ccf362b4f6df400b3c7a084795dbf541eb14c5c374656ffb96da7283a2a6f1.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT concurrency_key FROM script WHERE hash = $1 AND workspace_id = $2", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "concurrency_key", - "type_info": "Varchar" - } - ], - "parameters": { - "Left": [ - "Int8", - "Text" - ] - }, - "nullable": [ - true - ] - }, - "hash": "a3ccf362b4f6df400b3c7a084795dbf541eb14c5c374656ffb96da7283a2a6f1" -} diff --git a/backend/.sqlx/query-4535c8effd1bae49894d13293a37e1ee949cf9108239032cb3addbf350fb33de.json b/backend/.sqlx/query-c50b6a4a6739d6df087a3b37c209e5f4b72fc27578d988155b74b05ec5df30b9.json similarity index 73% rename from backend/.sqlx/query-4535c8effd1bae49894d13293a37e1ee949cf9108239032cb3addbf350fb33de.json rename to backend/.sqlx/query-c50b6a4a6739d6df087a3b37c209e5f4b72fc27578d988155b74b05ec5df30b9.json index a500b04785..eef812552b 100644 --- a/backend/.sqlx/query-4535c8effd1bae49894d13293a37e1ee949cf9108239032cb3addbf350fb33de.json +++ b/backend/.sqlx/query-c50b6a4a6739d6df087a3b37c209e5f4b72fc27578d988155b74b05ec5df30b9.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT\n job_kind AS \"job_kind!: JobKind\",\n script_hash AS \"script_hash: ScriptHash\",\n flow_status AS \"flow_status!: Json>\",\n raw_flow AS \"raw_flow: Json>\"\n FROM v2_as_queue WHERE id = $1 AND workspace_id = $2 LIMIT 1", + "query": "SELECT\n kind AS \"job_kind!: JobKind\",\n runnable_id AS \"script_hash: ScriptHash\",\n flow_status AS \"flow_status!: Json>\",\n raw_flow AS \"raw_flow: Json>\"\n FROM v2_job INNER JOIN v2_job_status ON v2_job.id = v2_job_status.id WHERE v2_job.id = $1 AND v2_job.workspace_id = $2 LIMIT 1", "describe": { "columns": [ { @@ -57,11 +57,11 @@ ] }, "nullable": [ - true, + false, true, true, true ] }, - "hash": "4535c8effd1bae49894d13293a37e1ee949cf9108239032cb3addbf350fb33de" + "hash": "c50b6a4a6739d6df087a3b37c209e5f4b72fc27578d988155b74b05ec5df30b9" } diff --git a/backend/.sqlx/query-2f2ef9b1ccff527c48fa01cf1b78cd0e58c8d534ac22ec0356d82a854b31d087.json b/backend/.sqlx/query-ec1f31fd7628ea2e30995a0de1d8665831ee3e4ec3815e9ad90e886ffecba0f1.json similarity index 57% rename from backend/.sqlx/query-2f2ef9b1ccff527c48fa01cf1b78cd0e58c8d534ac22ec0356d82a854b31d087.json rename to backend/.sqlx/query-ec1f31fd7628ea2e30995a0de1d8665831ee3e4ec3815e9ad90e886ffecba0f1.json index 77e16162bd..b5629e0425 100644 --- a/backend/.sqlx/query-2f2ef9b1ccff527c48fa01cf1b78cd0e58c8d534ac22ec0356d82a854b31d087.json +++ b/backend/.sqlx/query-ec1f31fd7628ea2e30995a0de1d8665831ee3e4ec3815e9ad90e886ffecba0f1.json @@ -1,15 +1,14 @@ { "db_name": "PostgreSQL", - "query": "UPDATE v2_job_runtime SET ping = NULL\n WHERE id = $1 AND ping = $2", + "query": "UPDATE v2_job_runtime SET ping = NULL\n WHERE id = $1", "describe": { "columns": [], "parameters": { "Left": [ - "Uuid", - "Timestamptz" + "Uuid" ] }, "nullable": [] }, - "hash": "2f2ef9b1ccff527c48fa01cf1b78cd0e58c8d534ac22ec0356d82a854b31d087" + "hash": "ec1f31fd7628ea2e30995a0de1d8665831ee3e4ec3815e9ad90e886ffecba0f1" } diff --git a/backend/ee-repo-ref.txt b/backend/ee-repo-ref.txt index 1cd709f740..41ce253b23 100644 --- a/backend/ee-repo-ref.txt +++ b/backend/ee-repo-ref.txt @@ -1 +1 @@ -280b866cd0b179c16c894197a891f24495a26549 \ No newline at end of file +94ff10ff18c121f49180ddaebf5dee8cd94d06df \ No newline at end of file diff --git a/backend/src/monitor.rs b/backend/src/monitor.rs index cf82ed7f49..0a87924669 100644 --- a/backend/src/monitor.rs +++ b/backend/src/monitor.rs @@ -50,7 +50,7 @@ use windmill_common::{ SMTP_CONFIG, TMP_DIR, WORKER_CONFIG, WORKER_GROUP, }, KillpillSender, BASE_URL, CRITICAL_ALERT_MUTE_UI_ENABLED, CRITICAL_ERROR_CHANNELS, DB, DEFAULT_HUB_BASE_URL, HUB_BASE_URL, JOB_RETENTION_SECS, METRICS_DEBUG_ENABLED, METRICS_ENABLED, MONITOR_LOGS_ON_OBJECT_STORE, OTEL_LOGS_ENABLED, OTEL_METRICS_ENABLED, OTEL_TRACING_ENABLED, SERVICE_LOG_RETENTION_SECS }; -use windmill_queue::cancel_job; +use windmill_queue::{cancel_job, MiniPulledJob}; use windmill_worker::{ create_token_for_owner, handle_job_error, AuthedClient, SameWorkerPayload, SameWorkerSender, SendResult, BUNFIG_INSTALL_SCOPES, INSTANCE_PYTHON_VERSION, JOB_DEFAULT_TIMEOUT, KEEP_JOB_DIR, @@ -1826,7 +1826,7 @@ async fn handle_zombie_jobs(db: &Pool, base_internal_url: &str, worker let _ = handle_job_error( db, &client, - &job, + &MiniPulledJob::from(&job), 0, None, error::Error::ExecutionErr(error_message), diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index 2b4bd94f9c..6a49031517 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -6649,6 +6649,7 @@ paths: - $ref: "#/components/parameters/OrderDesc" - $ref: "#/components/parameters/CreatedBy" - $ref: "#/components/parameters/ParentJob" + - $ref: "#/components/parameters/Worker" - $ref: "#/components/parameters/ScriptExactPath" - $ref: "#/components/parameters/ScriptStartPath" - $ref: "#/components/parameters/SchedulePath" @@ -6856,6 +6857,7 @@ paths: - $ref: "#/components/parameters/OrderDesc" - $ref: "#/components/parameters/CreatedBy" - $ref: "#/components/parameters/Label" + - $ref: "#/components/parameters/Worker" - $ref: "#/components/parameters/ParentJob" - $ref: "#/components/parameters/ScriptExactPath" - $ref: "#/components/parameters/ScriptStartPath" @@ -6910,6 +6912,7 @@ paths: - $ref: "#/components/parameters/WorkspaceId" - $ref: "#/components/parameters/CreatedBy" - $ref: "#/components/parameters/Label" + - $ref: "#/components/parameters/Worker" - $ref: "#/components/parameters/ParentJob" - $ref: "#/components/parameters/ScriptExactPath" - $ref: "#/components/parameters/ScriptStartPath" @@ -12097,6 +12100,12 @@ components: in: query schema: type: string + Worker: + name: worker + description: worker this job was ran on + in: query + schema: + type: string ParentJob: name: parent_job description: @@ -12732,6 +12741,8 @@ components: type: number preprocessed: type: boolean + worker: + type: string required: - id - running @@ -12841,6 +12852,8 @@ components: type: number preprocessed: type: boolean + worker: + type: string required: - id - created_by diff --git a/backend/windmill-api/src/capture.rs b/backend/windmill-api/src/capture.rs index 402d504a2c..06e4f4ad4d 100644 --- a/backend/windmill-api/src/capture.rs +++ b/backend/windmill-api/src/capture.rs @@ -47,13 +47,13 @@ use hyper::StatusCode; use serde::{Deserialize, Serialize}; use serde_json::value::RawValue; use sqlx::types::Json as SqlxJson; -use std::fmt; use windmill_common::{ db::UserDB, error::{JsonResult, Result}, utils::{not_found_if_none, paginate, Pagination, StripPath}, worker::{to_raw_value, CLOUD_HOSTED}, }; +use windmill_queue::TriggerKind; use windmill_queue::{PushArgs, PushArgsOwned}; const KEEP_LAST: i64 = 20; @@ -94,38 +94,6 @@ pub fn workspaced_unauthed_service() -> Router { } } -#[derive(sqlx::Type, Serialize, Deserialize, Debug)] -#[sqlx(type_name = "TRIGGER_KIND", rename_all = "lowercase")] -#[serde(rename_all = "lowercase")] -pub enum TriggerKind { - Webhook, - Http, - Websocket, - Kafka, - Email, - Nats, - Mqtt, - Sqs, - Postgres, -} - -impl fmt::Display for TriggerKind { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let s = match self { - TriggerKind::Webhook => "webhook", - TriggerKind::Http => "http", - TriggerKind::Websocket => "websocket", - TriggerKind::Kafka => "kafka", - TriggerKind::Email => "email", - TriggerKind::Nats => "nats", - TriggerKind::Mqtt => "mqtt", - TriggerKind::Sqs => "sqs", - TriggerKind::Postgres => "postgres", - }; - write!(f, "{}", s) - } -} - #[cfg(feature = "http_trigger")] #[derive(Serialize, Deserialize)] struct HttpTriggerConfig { diff --git a/backend/windmill-api/src/concurrency_groups.rs b/backend/windmill-api/src/concurrency_groups.rs index 3f7e41617f..e59821c3e5 100644 --- a/backend/windmill-api/src/concurrency_groups.rs +++ b/backend/windmill-api/src/concurrency_groups.rs @@ -199,6 +199,7 @@ async fn get_concurrent_intervals( result: None, tag: None, has_null_parent: None, + worker: None, label: None, scheduled_for_before_now: _, is_not_schedule: _, diff --git a/backend/windmill-api/src/jobs.rs b/backend/windmill-api/src/jobs.rs index 5148359981..4b5a4f3daf 100644 --- a/backend/windmill-api/src/jobs.rs +++ b/backend/windmill-api/src/jobs.rs @@ -676,64 +676,167 @@ async fn get_job( } macro_rules! get_job_query { - ("v2_as_completed_job", $($opts:tt)*) => { + ("v2_job_completed", $($opts:tt)*) => { get_job_query!( - @impl "v2_as_completed_job", ($($opts)*), - "duration_ms, success, result, result_columns, deleted, is_skipped, result->'wm_labels' as labels, \ + @impl "v2_job_completed", ($($opts)*), + "v2_job_completed.duration_ms, CASE WHEN status = 'success' OR status = 'skipped' THEN true ELSE false END as success, result_columns, deleted, status = 'skipped' as is_skipped, result->'wm_labels' as labels, \ CASE WHEN result is null or pg_column_size(result) < 90000 THEN result ELSE '\"WINDMILL_TOO_BIG\"'::jsonb END as result", + "", ) }; - ("v2_as_queue", $($opts:tt)*) => { + ("v2_job_queue", $($opts:tt)*) => { get_job_query!( - @impl "v2_as_queue", ($($opts)*), - "scheduled_for, running, last_ping, suspend, suspend_until, same_worker, pre_run_error, visible_to_owner, \ - root_job, leaf_jobs, concurrent_limit, concurrency_time_window_s, timeout, flow_step_id, cache_ttl,\ + @impl "v2_job_queue", ($($opts)*), + "scheduled_for, running, ping as last_ping, suspend, suspend_until, same_worker, pre_run_error, visible_to_owner, \ + flow_innermost_root_job AS root_job, flow_leaf_jobs AS leaf_jobs, concurrent_limit, concurrency_time_window_s, timeout, flow_step_id, cache_ttl,\ script_entrypoint_override", + "LEFT JOIN v2_job_runtime ON v2_job_runtime.id = v2_job_queue.id LEFT JOIN v2_job_status ON v2_job_status.id = v2_job_queue.id", ) }; - (@impl $table:literal, (with_logs: $with_logs:expr, $($rest:tt)*), $additional_fields:literal, $($args:tt)*) => { + (@impl $table:literal, (with_logs: $with_logs:expr, $($rest:tt)*), $additional_fields:literal, $additional_joins:literal, $($args:tt)*) => { if $with_logs { - get_job_query!(@impl $table, ($($rest)*), $additional_fields, logs = "right(job_logs.logs, 20000)", $($args)*) + get_job_query!(@impl $table, ($($rest)*), $additional_fields, $additional_joins, logs = "right(job_logs.logs, 20000)", $($args)*) } else { - get_job_query!(@impl $table, ($($rest)*), $additional_fields, logs = "null", $($args)*) + get_job_query!(@impl $table, ($($rest)*), $additional_fields, $additional_joins, logs = "null", $($args)*) } }; - (@impl $table:literal, (with_code: $with_code:expr, $($rest:tt)*), $additional_fields:literal, $($args:tt)*) => { + (@impl $table:literal, (with_code: $with_code:expr, $($rest:tt)*), $additional_fields:literal, $additional_joins:literal, $($args:tt)*) => { if $with_code { - get_job_query!(@impl $table, ($($rest)*), $additional_fields, lock = "raw_lock", code = "raw_code", $($args)*) + get_job_query!(@impl $table, ($($rest)*), $additional_fields, $additional_joins, lock = "raw_lock", code = "raw_code", $($args)*) } else { - get_job_query!(@impl $table, ($($rest)*), $additional_fields, lock = "null", code = "null", $($args)*) + get_job_query!(@impl $table, ($($rest)*), $additional_fields, $additional_joins, lock = "null", code = "null", $($args)*) } }; - (@impl $table:literal, (with_flow: $with_flow:expr, $($rest:tt)*), $additional_fields:literal, $($args:tt)*) => { + (@impl $table:literal, (with_flow: $with_flow:expr, $($rest:tt)*), $additional_fields:literal, $additional_joins:literal, $($args:tt)*) => { if $with_flow { - get_job_query!(@impl $table, ($($rest)*), $additional_fields, flow = "raw_flow", $($args)*) + get_job_query!(@impl $table, ($($rest)*), $additional_fields, $additional_joins, flow = "raw_flow", $($args)*) } else { - get_job_query!(@impl $table, ($($rest)*), $additional_fields, flow = "null", $($args)*) + get_job_query!(@impl $table, ($($rest)*), $additional_fields, $additional_joins, flow = "null", $($args)*) } }; - (@impl $table:literal, (), $additional_fields:literal, $($args:tt)*) => { + (@impl $table:literal, (), $additional_fields:literal, $additional_joins:literal, $($args:tt)*) => { const_format::formatcp!( "SELECT \ - id, {table}.workspace_id, parent_job, created_by, {table}.created_at, started_at, script_hash, script_path, \ + {table}.id, {table}.workspace_id, parent_job, v2_job.created_by, v2_job.created_at, started_at, v2_job.runnable_id as script_hash, v2_job.runnable_path as script_path, \ CASE WHEN args is null THEN NULL WHEN pg_column_size(args) < 90000 THEN CASE WHEN jsonb_typeof(args) = 'object' THEN args ELSE jsonb_build_object('value', args) END - ELSE '{{\"reason\": \"WINDMILL_TOO_BIG\"}}'::jsonb END as args, \ - {logs} as logs, {code} as raw_code, canceled, canceled_by, canceled_reason, job_kind, \ - schedule_path, permissioned_as, flow_status, {flow} as raw_flow, is_flow_step, language, \ - {lock} as raw_lock, email, visible_to_owner, mem_peak, tag, priority, preprocessed, {additional_fields} \ - FROM {table} LEFT JOIN job_logs ON id = job_id \ - WHERE id = $1 AND {table}.workspace_id = $2 AND ($3::text[] IS NULL OR tag = ANY($3)) LIMIT 1", + ELSE '{{\"reason\": \"WINDMILL_TOO_BIG\"}}'::jsonb END as args, COALESCE(flow_status, workflow_as_code_status) AS flow_status, \ + {logs} as logs, {code} as raw_code, canceled_by is not null as canceled, canceled_by, canceled_reason, kind as job_kind, \ + CASE WHEN trigger_kind = 'schedule'::job_trigger_kind THEN trigger END AS schedule_path, permissioned_as, \ + {flow} as raw_flow, flow_step_id IS NOT NULL AS is_flow_step, script_lang as language, \ + {lock} as raw_lock, permissioned_as_email as email, visible_to_owner, memory_peak as mem_peak, v2_job.tag, v2_job.priority, preprocessed, worker,\ + {additional_fields} \ + FROM {table} + INNER JOIN v2_job ON v2_job.id = {table}.id \ + {additional_joins} \ + LEFT JOIN job_logs ON {table}.id = job_id \ + WHERE {table}.id = $1 AND {table}.workspace_id = $2 AND ($3::text[] IS NULL OR v2_job.tag = ANY($3))", table = $table, additional_fields = $additional_fields, + additional_joins = $additional_joins, $($args)* ) } } +// CREATE OR REPLACE VIEW v2_as_queue AS +// SELECT +// j.id, +// j.workspace_id, +// j.parent_job, +// j.created_by, +// j.created_at, +// q.started_at, +// q.scheduled_for, +// q.running, +// j.runnable_id AS script_hash, +// j.runnable_path AS script_path, +// j.args, +// j.raw_code, +// q.canceled_by IS NOT NULL AS canceled, +// q.canceled_by, +// q.canceled_reason, +// r.ping AS last_ping, +// j.kind AS job_kind, +// CASE WHEN j.trigger_kind = 'schedule'::job_trigger_kind THEN j.trigger END +// AS schedule_path, +// j.permissioned_as, +// COALESCE(s.flow_status, s.workflow_as_code_status) AS flow_status, +// j.raw_flow, +// j.flow_step_id IS NOT NULL AS is_flow_step, +// j.script_lang AS language, +// q.suspend, +// q.suspend_until, +// j.same_worker, +// j.raw_lock, +// j.pre_run_error, +// j.permissioned_as_email AS email, +// j.visible_to_owner, +// r.memory_peak AS mem_peak, +// j.flow_innermost_root_job AS root_job, +// s.flow_leaf_jobs AS leaf_jobs, +// j.tag, +// j.concurrent_limit, +// j.concurrency_time_window_s, +// j.timeout, +// j.flow_step_id, +// j.cache_ttl, +// j.priority, +// NULL::TEXT AS logs, +// j.script_entrypoint_override, +// j.preprocessed +// FROM v2_job_queue q +// JOIN v2_job j USING (id) +// LEFT JOIN v2_job_runtime r USING (id) +// LEFT JOIN v2_job_status s USING (id) +// ; + +// -- Add up migration script here +// CREATE OR REPLACE VIEW v2_as_completed_job AS +// SELECT +// j.id, +// j.workspace_id, +// j.parent_job, +// j.created_by, +// j.created_at, +// c.duration_ms, +// c.status = 'success' OR c.status = 'skipped' AS success, +// j.runnable_id AS script_hash, +// j.runnable_path AS script_path, +// j.args, +// c.result, +// FALSE AS deleted, +// j.raw_code, +// c.status = 'canceled' AS canceled, +// c.canceled_by, +// c.canceled_reason, +// j.kind AS job_kind, +// CASE WHEN j.trigger_kind = 'schedule'::job_trigger_kind THEN j.trigger END +// AS schedule_path, +// j.permissioned_as, +// COALESCE(c.flow_status, c.workflow_as_code_status) AS flow_status, +// j.raw_flow, +// j.flow_step_id IS NOT NULL AS is_flow_step, +// j.script_lang AS language, +// c.started_at, +// c.status = 'skipped' AS is_skipped, +// j.raw_lock, +// j.permissioned_as_email AS email, +// j.visible_to_owner, +// c.memory_peak AS mem_peak, +// j.tag, +// j.priority, +// NULL::TEXT AS logs, +// c.result_columns, +// j.script_entrypoint_override, +// j.preprocessed +// FROM v2_job_completed c +// JOIN v2_job j USING (id) +// ; + #[derive(Copy, Clone)] struct GetQuery<'a> { with_logs: bool, @@ -839,7 +942,7 @@ impl<'a> GetQuery<'a> { job_id: Uuid, workspace_id: &str, ) -> error::Result>> { - let query = get_job_query!("v2_as_queue", + let query = get_job_query!("v2_job_queue", with_logs: self.with_logs, with_code: self.with_code, with_flow: self.with_flow, @@ -871,11 +974,13 @@ impl<'a> GetQuery<'a> { job_id: Uuid, workspace_id: &str, ) -> error::Result>> { - let query = get_job_query!("v2_as_completed_job", + let query = get_job_query!("v2_job_completed", with_logs: self.with_logs, with_code: self.with_code, with_flow: self.with_flow, ); + + // tracing::info!("query: {}", query); let query = sqlx::query_as::<_, JobExtended>(query) .bind(job_id) .bind(workspace_id) @@ -1259,6 +1364,7 @@ pub struct ListQueueQuery { pub order_desc: Option, pub job_kinds: Option, pub suspended: Option, + pub worker: Option, // filter by matching a subset of the args using base64 encoded json subset pub args: Option, pub tag: Option, @@ -1283,6 +1389,7 @@ impl From for ListQueueQuery { created_after: lcq.created_after, created_or_started_before: lcq.created_or_started_before, created_or_started_after: lcq.created_or_started_after, + worker: lcq.worker, running: lcq.running, parent_job: lcq.parent_job, order_desc: lcq.order_desc, @@ -1319,6 +1426,10 @@ pub fn filter_list_queue_query( sqlb.and_where_eq("v2_job.workspace_id", "?".bind(&w_id)); } + if let Some(w) = &lq.worker { + sqlb.and_where_eq("v2_job_queue.worker", "?".bind(w)); + } + if let Some(ps) = &lq.script_path_start { sqlb.and_where_like_left("runnable_path", ps); } @@ -2444,6 +2555,9 @@ pub struct JobExtended { #[serde(skip_serializing_if = "Option::is_none")] pub raw_flow: Option>>, + #[serde(skip_serializing_if = "Option::is_none")] + pub worker: Option, + #[sqlx(skip)] #[serde(skip_serializing_if = "Option::is_none")] pub self_wait_time_ms: Option, @@ -2463,6 +2577,7 @@ impl JobExtended { raw_code: None, raw_lock: None, raw_flow: None, + worker: None, self_wait_time_ms, aggregate_wait_time_ms, } @@ -2678,6 +2793,7 @@ pub struct UnifiedJob { pub self_wait_time_ms: Option, pub aggregate_wait_time_ms: Option, pub preprocessed: Option, + pub worker: Option, } const CJ_FIELDS: &[&str] = &[ @@ -2716,6 +2832,7 @@ const CJ_FIELDS: &[&str] = &[ "self_wait_time_ms", "aggregate_wait_time_ms", "v2_job.preprocessed", + "v2_job_completed.worker", ]; const QJ_FIELDS: &[&str] = &[ @@ -2754,6 +2871,7 @@ const QJ_FIELDS: &[&str] = &[ "self_wait_time_ms", "aggregate_wait_time_ms", "v2_job.preprocessed", + "v2_job_queue.worker", ]; impl UnifiedJob { @@ -3358,7 +3476,7 @@ pub async fn run_workflow_as_code( path: job.script_path, language: job.language.unwrap_or_else(|| ScriptLang::Deno), lock: raw_lock, - custom_concurrency_key: windmill_queue::custom_concurrency_key(&db, job.id) + custom_concurrency_key: windmill_queue::custom_concurrency_key(&db, &job.id) .await .map_err(to_anyhow)?, concurrent_limit: job.concurrent_limit, @@ -5328,6 +5446,10 @@ pub fn filter_list_completed_query( sqlb.and_where(&wh); } + if let Some(worker) = &lq.worker { + sqlb.and_where_eq("v2_job_completed.worker", "?".bind(worker)); + } + if w_id != "admins" || !lq.all_workspaces.is_some_and(|x| x) { sqlb.and_where_eq("v2_job.workspace_id", "?".bind(&w_id)); } @@ -5486,6 +5608,7 @@ pub struct ListCompletedQuery { pub label: Option, pub is_not_schedule: Option, pub concurrency_key: Option, + pub worker: Option, } async fn list_completed_jobs( diff --git a/backend/windmill-api/src/mqtt_triggers.rs b/backend/windmill-api/src/mqtt_triggers.rs index 5f63e95b9e..67c4c12d5b 100644 --- a/backend/windmill-api/src/mqtt_triggers.rs +++ b/backend/windmill-api/src/mqtt_triggers.rs @@ -1,10 +1,12 @@ use crate::{ - capture::{insert_capture_payload, MqttTriggerConfig, TriggerKind}, + capture::{insert_capture_payload, MqttTriggerConfig}, db::{ApiAuthed, DB}, jobs::{run_flow_by_path_inner, run_script_by_path_inner, RunJobQuery}, resources::try_get_resource_from_db_as, users::fetch_api_authed, }; +use windmill_queue::TriggerKind; + use axum::{ async_trait, extract::{Path, Query}, diff --git a/backend/windmill-api/src/postgres_triggers/trigger.rs b/backend/windmill-api/src/postgres_triggers/trigger.rs index 81f439d0ae..2e6727704f 100644 --- a/backend/windmill-api/src/postgres_triggers/trigger.rs +++ b/backend/windmill-api/src/postgres_triggers/trigger.rs @@ -1,7 +1,7 @@ use std::{collections::HashMap, pin::Pin}; use crate::{ - capture::{insert_capture_payload, PostgresTriggerConfig, TriggerKind}, + capture::{insert_capture_payload, PostgresTriggerConfig}, db::{ApiAuthed, DB}, postgres_triggers::{ relation::RelationConverter, @@ -14,6 +14,8 @@ use crate::{ resources::try_get_resource_from_db_as, users::fetch_api_authed, }; +use windmill_queue::TriggerKind; + use bytes::{BufMut, Bytes, BytesMut}; use chrono::TimeZone; use futures::{pin_mut, SinkExt, StreamExt}; diff --git a/backend/windmill-api/src/websocket_triggers.rs b/backend/windmill-api/src/websocket_triggers.rs index 4de01f14f3..9be3829d83 100644 --- a/backend/windmill-api/src/websocket_triggers.rs +++ b/backend/windmill-api/src/websocket_triggers.rs @@ -30,8 +30,10 @@ use windmill_common::{ }; use windmill_queue::PushArgsOwned; +use windmill_queue::TriggerKind; + use crate::{ - capture::{insert_capture_payload, TriggerKind, WebsocketTriggerConfig}, + capture::{insert_capture_payload, WebsocketTriggerConfig}, db::{ApiAuthed, DB}, jobs::{ run_flow_by_path_inner, run_script_by_path_inner, run_wait_result_internal, RunJobQuery, diff --git a/backend/windmill-common/src/worker.rs b/backend/windmill-common/src/worker.rs index 7a1f53774b..856555f29d 100644 --- a/backend/windmill-common/src/worker.rs +++ b/backend/windmill-common/src/worker.rs @@ -124,31 +124,29 @@ fn format_pull_query(peek: String) -> String { worker = $1 WHERE id = (SELECT id FROM peek) RETURNING - started_at, scheduled_for, running, - canceled_by, canceled_reason, canceled_by IS NOT NULL AS canceled, - suspend, suspend_until + started_at, scheduled_for, + canceled_by, canceled_reason, worker ), r AS NOT MATERIALIZED ( UPDATE v2_job_runtime SET ping = now() WHERE id = (SELECT id FROM peek) ), j AS NOT MATERIALIZED ( SELECT - id, workspace_id, parent_job, created_by, created_at, runnable_id AS script_hash, - runnable_path AS script_path, args, kind AS job_kind, - CASE WHEN trigger_kind = 'schedule' THEN trigger END AS schedule_path, - permissioned_as, permissioned_as_email AS email, script_lang AS language, - flow_innermost_root_job AS root_job, flow_step_id, flow_step_id IS NOT NULL AS is_flow_step, + id, workspace_id, parent_job, created_by, created_at, runnable_id, + runnable_path, args, kind, trigger, trigger_kind, + permissioned_as, permissioned_as_email, script_lang, + flow_innermost_root_job, flow_step_id, same_worker, pre_run_error, visible_to_owner, tag, concurrent_limit, concurrency_time_window_s, timeout, cache_ttl, priority, raw_code, raw_lock, raw_flow, script_entrypoint_override, preprocessed FROM v2_job WHERE id = (SELECT id FROM peek) - ) SELECT id, workspace_id, parent_job, created_by, created_at, started_at, scheduled_for, - running, script_hash, script_path, args, null as logs, canceled, canceled_by, - canceled_reason, null as last_ping, job_kind, schedule_path, permissioned_as, - flow_status, is_flow_step, language, suspend, suspend_until, - same_worker, pre_run_error, email, visible_to_owner, null as mem_peak, - root_job, flow_leaf_jobs as leaf_jobs, tag, concurrent_limit, concurrency_time_window_s, + ) SELECT id, workspace_id, parent_job, created_by, started_at, scheduled_for, + runnable_id, runnable_path, args, canceled_by, + canceled_reason, kind, trigger, trigger_kind, permissioned_as, permissioned_as_email, + flow_status, script_lang, + same_worker, pre_run_error, visible_to_owner, + tag, concurrent_limit, concurrency_time_window_s, flow_innermost_root_job, timeout, flow_step_id, cache_ttl, priority, raw_code, raw_lock, raw_flow, script_entrypoint_override, preprocessed FROM q, j diff --git a/backend/windmill-queue/src/jobs.rs b/backend/windmill-queue/src/jobs.rs index f0eda8328a..2adaa99772 100644 --- a/backend/windmill-queue/src/jobs.rs +++ b/backend/windmill-queue/src/jobs.rs @@ -6,6 +6,7 @@ * LICENSE-AGPL for a copy of the license. */ +use std::fmt; use std::{borrow::Borrow, collections::HashMap, sync::Arc, vec}; use anyhow::Context; @@ -17,8 +18,10 @@ use itertools::Itertools; use prometheus::IntCounter; use regex::Regex; use reqwest::Client; +use serde::Deserialize; use serde::{ser::SerializeMap, Serialize}; use serde_json::{json, value::RawValue}; +use sqlx::PgExecutor; use sqlx::{types::Json, FromRow, Pool, Postgres, Transaction}; use tokio::{sync::RwLock, time::sleep}; use ulid::Ulid; @@ -156,7 +159,7 @@ pub async fn cancel_single_job<'c>( .await; let add_job = add_completed_job_error( &db, - &job_running, + &MiniPulledJob::from(&job_running), job_running.mem_peak.unwrap_or(0), Some(CanceledBy { username: Some(username.to_string()), reason: Some(reason) }), e, @@ -488,7 +491,7 @@ where pub async fn add_completed_job_error( db: &Pool, - queued_job: &QueuedJob, + queued_job: &MiniPulledJob, mem_peak: i32, canceled_by: Option, e: serde_json::Value, @@ -544,7 +547,7 @@ lazy_static::lazy_static! { pub async fn add_completed_job( db: &Pool, - queued_job: &QueuedJob, + queued_job: &MiniPulledJob, success: bool, skipped: bool, result: Json<&T>, @@ -581,7 +584,7 @@ pub async fn add_completed_job( serde_json::to_string(&result).unwrap_or_else(|_| "".to_string()) ); - let mem_peak = mem_peak.max(queued_job.mem_peak.unwrap_or(0)); + let mem_peak = mem_peak; // add_time!(bench, "add_completed_job query START"); let _duration = sqlx::query_scalar!( @@ -638,7 +641,7 @@ pub async fn add_completed_job( .map_err(|e| Error::InternalErr(format!("Could not update job labels: {e:#}")))?; } - if !queued_job.is_flow_step { + if !queued_job.is_flow_step() { if let Some(parent_job) = queued_job.parent_job { let _ = sqlx::query_scalar!( "UPDATE v2_job_status SET @@ -670,7 +673,7 @@ pub async fn add_completed_job( tx = delete_job(tx, &job_id).await?; // tracing::error!("3 {:?}", start.elapsed()); - if queued_job.is_flow_step { + if queued_job.is_flow_step() { if let Some(parent_job) = queued_job.parent_job { // persist the flow last progress timestamp to avoid zombie flow jobs tracing::debug!( @@ -704,12 +707,12 @@ pub async fn add_completed_job( } } } else { - if queued_job.schedule_path.is_some() && queued_job.script_path.is_some() { - let schedule_path = queued_job.schedule_path.as_ref().unwrap(); - let script_path = queued_job.script_path.as_ref().unwrap(); + if queued_job.schedule_path().is_some() && queued_job.runnable_path.is_some() { + let schedule_path = queued_job.schedule_path().unwrap(); + let script_path = queued_job.runnable_path.as_ref().unwrap(); let schedule = - get_schedule_opt(&mut *tx, &queued_job.workspace_id, schedule_path).await?; + get_schedule_opt(&mut *tx, &queued_job.workspace_id, &schedule_path).await?; if let Some(schedule) = schedule { #[cfg(feature = "enterprise")] @@ -743,7 +746,7 @@ pub async fn add_completed_job( db, queued_job, &schedule, - script_path, + &script_path, &queued_job.workspace_id, ) .await @@ -760,7 +763,7 @@ pub async fn add_completed_job( if let Err(err) = apply_schedule_handlers( db, &schedule, - script_path, + &script_path, &queued_job.workspace_id, success, result, @@ -799,19 +802,17 @@ pub async fn add_completed_job( } } if queued_job.concurrent_limit.is_some() { - let concurrency_key = match concurrency_key(db, queued_job).await { + let concurrency_key = match concurrency_key(db, &queued_job.id).await { Ok(c) => c, Err(e) => { tracing::error!( "Could not get concurrency key for job {} defaulting to default key: {e:?}", queued_job.id ); - legacy_concurrency_key(db, queued_job) - .await - .unwrap_or_else(|| queued_job.full_path_with_workspace()) + "".to_string() } }; - if *DISABLE_CONCURRENCY_LIMIT { + if *DISABLE_CONCURRENCY_LIMIT || concurrency_key.is_empty() { tracing::warn!("Concurrency limit is disabled, skipping"); } else { if let Err(e) = sqlx::query_scalar!( @@ -852,16 +853,16 @@ pub async fn add_completed_job( tracing::info!( %job_id, - root_job = ?queued_job.root_job.map(|x| x.to_string()).unwrap_or_else(|| String::new()), - path = &queued_job.script_path(), - job_kind = ?queued_job.job_kind, + root_job = ?queued_job.flow_innermost_root_job.map(|x| x.to_string()).unwrap_or_else(|| String::new()), + path = &queued_job.runnable_path(), + job_kind = ?queued_job.kind, started_at = ?queued_job.started_at.map(|x| x.to_string()).unwrap_or_else(|| String::new()), duration = ?_duration, permissioned_as = ?queued_job.permissioned_as, - email = ?queued_job.email, + email = ?queued_job.permissioned_as_email, created_by = queued_job.created_by, - is_flow_step = queued_job.is_flow_step, - language = ?queued_job.language, + is_flow_step = queued_job.is_flow_step(), + language = ?queued_job.script_lang, success, "inserted completed job: {} (success: {success})", queued_job.id @@ -916,7 +917,7 @@ pub async fn add_completed_job( "INSERT INTO usage (id, is_workspace, month_, usage) VALUES ($1, FALSE, EXTRACT(YEAR FROM current_date) * 12 + EXTRACT(MONTH FROM current_date), $2) ON CONFLICT (id, is_workspace, month_) DO UPDATE SET usage = usage.usage + $2", - queued_job.email, + queued_job.permissioned_as_email, additional_usage as i32 ) .execute(db) @@ -927,8 +928,8 @@ pub async fn add_completed_job( #[cfg(feature = "enterprise")] if !success { - async fn has_failure_module(db: &Pool, job: &QueuedJob) -> bool { - if let Ok(flow) = cache::job::fetch_flow(db, job.job_kind, job.script_hash).await { + async fn has_failure_module(db: &Pool, job: &MiniPulledJob) -> bool { + if let Ok(flow) = cache::job::fetch_flow(db, job.kind, job.runnable_id).await { return flow.value().failure_module.is_some(); } sqlx::query_scalar!( @@ -941,7 +942,7 @@ pub async fn add_completed_job( .unwrap_or(false) } - if queued_job.email == ERROR_HANDLER_USER_EMAIL { + if queued_job.permissioned_as_email == ERROR_HANDLER_USER_EMAIL { let base_url = BASE_URL.read().await; let w_id = &queued_job.workspace_id; report_critical_error( @@ -960,7 +961,7 @@ pub async fn add_completed_job( None, ) .await; - } else if queued_job.email == SCHEDULE_ERROR_HANDLER_USER_EMAIL { + } else if queued_job.permissioned_as_email == SCHEDULE_ERROR_HANDLER_USER_EMAIL { let base_url = BASE_URL.read().await; let w_id = &queued_job.workspace_id; report_error_to_workspace_handler_or_critical_side_channel( @@ -979,8 +980,8 @@ pub async fn add_completed_job( ) .await; } else if !_skip_downstream_error_handlers - && (matches!(queued_job.job_kind, JobKind::Script) - || matches!(queued_job.job_kind, JobKind::Flow) + && (matches!(queued_job.kind, JobKind::Script) + || matches!(queued_job.kind, JobKind::Flow) && !has_failure_module(db, queued_job).await) && queued_job.parent_job.is_none() { @@ -1030,8 +1031,8 @@ pub async fn add_completed_job( } } - if !queued_job.is_flow_step && queued_job.job_kind == JobKind::Script && canceled_by.is_none() { - if let Some(hash) = queued_job.script_hash { + if !queued_job.is_flow_step() && queued_job.kind == JobKind::Script && canceled_by.is_none() { + if let Some(hash) = queued_job.runnable_id { let p = sqlx::query_scalar!( "SELECT restart_unless_cancelled FROM script WHERE hash = $1 AND workspace_id = $2", hash.0, @@ -1054,7 +1055,7 @@ pub async fn add_completed_job( { let next_run = queued_job.started_at.unwrap_or(now) + chrono::Duration::try_seconds(10).unwrap(); - tracing::warn!("Perpetual script {:?} is running too fast, only 1 job per 10s it supported. Scheduling next run for {:?}", queued_job.script_path, next_run); + tracing::warn!("Perpetual script {:?} is running too fast, only 1 job per 10s it supported. Scheduling next run for {:?}", queued_job.runnable_path, next_run); Some(next_run) } else { None @@ -1067,14 +1068,14 @@ pub async fn add_completed_job( &queued_job.workspace_id, JobPayload::ScriptHash { hash, - path: queued_job.script_path().to_string(), - custom_concurrency_key: custom_concurrency_key(db, queued_job.id).await?, + path: queued_job.runnable_path().to_string(), + custom_concurrency_key: custom_concurrency_key(db, &queued_job.id).await?, concurrent_limit: queued_job.concurrent_limit, concurrency_time_window_s: queued_job.concurrency_time_window_s, cache_ttl: queued_job.cache_ttl, dedicated_worker: None, language: queued_job - .language + .script_lang .clone() .unwrap_or_else(|| ScriptLang::Deno), priority: queued_job.priority, @@ -1086,10 +1087,10 @@ pub async fn add_completed_job( .map(|x| PushArgs::from(&x.0)) .unwrap_or_else(|| PushArgs::from(&ehm)), &queued_job.created_by, - &queued_job.email, + &queued_job.permissioned_as_email, queued_job.permissioned_as.clone(), scheduled_for, - queued_job.schedule_path.clone(), + queued_job.schedule_path(), None, None, None, @@ -1116,7 +1117,7 @@ pub async fn add_completed_job( } pub async fn send_error_to_global_handler<'a, T: Serialize + Send + Sync>( - queued_job: &QueuedJob, + queued_job: &MiniPulledJob, db: &Pool, result: Json<&T>, ) -> Result<(), Error> { @@ -1131,8 +1132,8 @@ pub async fn send_error_to_global_handler<'a, T: Serialize + Send + Sync>( push_error_handler( db, queued_job.id, - queued_job.schedule_path.clone(), - queued_job.script_path.clone(), + queued_job.schedule_path(), + queued_job.runnable_path.clone(), queued_job.is_flow(), &queued_job.workspace_id, &prefixed_global_error_handler_path, @@ -1140,7 +1141,7 @@ pub async fn send_error_to_global_handler<'a, T: Serialize + Send + Sync>( None, queued_job.started_at, None, - &queued_job.email, + &queued_job.permissioned_as_email, false, true, None, @@ -1152,7 +1153,7 @@ pub async fn send_error_to_global_handler<'a, T: Serialize + Send + Sync>( } pub async fn report_error_to_workspace_handler_or_critical_side_channel( - queued_job: &QueuedJob, + queued_job: &MiniPulledJob, db: &Pool, error_message: String, ) -> () { @@ -1171,8 +1172,8 @@ pub async fn report_error_to_workspace_handler_or_critical_side_channel( if let Err(err) = push_error_handler( db, queued_job.id, - queued_job.schedule_path.clone(), - queued_job.script_path.clone(), + queued_job.schedule_path(), + queued_job.runnable_path.clone(), queued_job.is_flow(), w_id, &error_handler, @@ -1184,7 +1185,7 @@ pub async fn report_error_to_workspace_handler_or_critical_side_channel( None, queued_job.started_at, error_handler_extra_args, - &queued_job.email, + &queued_job.permissioned_as_email, false, false, None, @@ -1204,7 +1205,7 @@ pub async fn report_error_to_workspace_handler_or_critical_side_channel( } pub async fn send_error_to_workspace_handler<'a, 'c, T: Serialize + Send + Sync>( - queued_job: &QueuedJob, + queued_job: &MiniPulledJob, is_canceled: bool, db: &Pool, result: Json<&'a T>, @@ -1224,12 +1225,12 @@ pub async fn send_error_to_workspace_handler<'a, 'c, T: Serialize + Send + Sync> } if let Some(error_handler) = error_handler { - let ws_error_handler_muted: Option = match queued_job.job_kind { + let ws_error_handler_muted: Option = match queued_job.kind { JobKind::Script => { sqlx::query_scalar!( "SELECT ws_error_handler_muted FROM script WHERE workspace_id = $1 AND hash = $2", queued_job.workspace_id, - queued_job.script_hash.unwrap().0, + queued_job.runnable_id.map(|x| x.0), ) .fetch_optional(db) .await? @@ -1238,7 +1239,7 @@ pub async fn send_error_to_workspace_handler<'a, 'c, T: Serialize + Send + Sync> sqlx::query_scalar!( "SELECT ws_error_handler_muted FROM flow WHERE workspace_id = $1 AND path = $2", queued_job.workspace_id, - queued_job.script_path.as_ref().unwrap(), + queued_job.runnable_path.clone(), ) .fetch_optional(db) .await? @@ -1253,8 +1254,8 @@ pub async fn send_error_to_workspace_handler<'a, 'c, T: Serialize + Send + Sync> push_error_handler( db, queued_job.id, - queued_job.schedule_path.clone(), - queued_job.script_path.clone(), + queued_job.schedule_path(), + queued_job.runnable_path.clone(), queued_job.is_flow(), &queued_job.workspace_id, &error_handler, @@ -1262,7 +1263,7 @@ pub async fn send_error_to_workspace_handler<'a, 'c, T: Serialize + Send + Sync> None, queued_job.started_at, error_handler_extra_args, - &queued_job.email, + &queued_job.permissioned_as_email, false, false, None, @@ -1276,7 +1277,7 @@ pub async fn send_error_to_workspace_handler<'a, 'c, T: Serialize + Send + Sync> pub async fn handle_maybe_scheduled_job<'c>( db: &Pool, - job: &QueuedJob, + job: &MiniPulledJob, schedule: &Schedule, script_path: &str, w_id: &str, @@ -1831,17 +1832,180 @@ async fn handle_successful_schedule<'a, 'c, T: Serialize + Send + Sync>( Ok(()) } -#[derive(sqlx::FromRow)] +#[derive(sqlx::Type, Serialize, Deserialize, Debug, Clone)] +#[sqlx(type_name = "TRIGGER_KIND", rename_all = "lowercase")] +#[serde(rename_all = "lowercase")] +pub enum TriggerKind { + Webhook, + Http, + Websocket, + Kafka, + Email, + Nats, + Mqtt, + Sqs, + Postgres, +} + +#[derive(sqlx::Type, Serialize, Deserialize, Debug, Clone)] +#[sqlx(type_name = "JOB_TRIGGER_KIND", rename_all = "lowercase")] +#[serde(rename_all = "lowercase")] +pub enum JobTriggerKind { + Webhook, + Http, + Websocket, + Kafka, + Email, + Nats, + Mqtt, + Sqs, + Postgres, + Schedule, +} + +impl fmt::Display for TriggerKind { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let s = match self { + TriggerKind::Webhook => "webhook", + TriggerKind::Http => "http", + TriggerKind::Websocket => "websocket", + TriggerKind::Kafka => "kafka", + TriggerKind::Email => "email", + TriggerKind::Nats => "nats", + TriggerKind::Mqtt => "mqtt", + TriggerKind::Sqs => "sqs", + TriggerKind::Postgres => "postgres", + }; + write!(f, "{}", s) + } +} + +#[derive(sqlx::FromRow, Debug, Clone)] +pub struct MiniPulledJob { + pub workspace_id: String, + pub id: Uuid, + pub args: Option>>>, + pub parent_job: Option, + pub created_by: String, + pub scheduled_for: chrono::DateTime, + pub started_at: Option>, + pub runnable_path: Option, + pub kind: JobKind, + pub runnable_id: Option, + pub canceled_reason: Option, + pub canceled_by: Option, + pub permissioned_as: String, + pub permissioned_as_email: String, + pub flow_status: Option>>, + pub tag: String, + pub script_lang: Option, + pub same_worker: bool, + pub pre_run_error: Option, + pub concurrent_limit: Option, + pub concurrency_time_window_s: Option, + pub flow_innermost_root_job: Option, + pub timeout: Option, + pub flow_step_id: Option, + pub cache_ttl: Option, + pub priority: Option, + pub preprocessed: Option, + pub script_entrypoint_override: Option, + pub trigger: Option, + pub trigger_kind: Option, + pub visible_to_owner: bool, +} + +impl MiniPulledJob { + pub fn runnable_path(&self) -> &str { + self.runnable_path + .as_ref() + .map(String::as_str) + .unwrap_or("tmp/main") + } + + pub fn is_flow_step(&self) -> bool { + self.flow_step_id.is_some() + } + + pub fn is_canceled(&self) -> bool { + self.canceled_by.is_some() + } + + pub fn parse_flow_status(&self) -> Option { + // tracing::error!("parse_flow_status: {:?}", self.flow_status); + + self.flow_status + .as_ref() + .and_then(|v| serde_json::from_str::((**v).get()).ok()) + } + + pub fn from(job: &QueuedJob) -> MiniPulledJob { + MiniPulledJob { + workspace_id: job.workspace_id.clone(), + id: job.id, + args: job.args.clone(), + parent_job: job.parent_job.clone(), + created_by: job.created_by.clone(), + started_at: job.started_at.clone(), + scheduled_for: job.scheduled_for, + runnable_path: job.script_path.clone(), + kind: job.job_kind, + runnable_id: job.script_hash.clone(), + canceled_reason: job.canceled_reason.clone(), + canceled_by: job.canceled_by.clone(), + permissioned_as: job.permissioned_as.clone(), + permissioned_as_email: job.email.clone(), + flow_status: job.flow_status.clone(), + tag: job.tag.clone(), + script_lang: job.language.clone(), + same_worker: job.same_worker, + pre_run_error: job.pre_run_error.clone(), + concurrent_limit: job.concurrent_limit.clone(), + concurrency_time_window_s: job.concurrency_time_window_s.clone(), + flow_innermost_root_job: job.root_job.clone(), + timeout: job.timeout.clone(), + flow_step_id: job.flow_step_id.clone(), + cache_ttl: job.cache_ttl.clone(), + priority: job.priority.clone(), + preprocessed: job.preprocessed.clone(), + script_entrypoint_override: job.script_entrypoint_override.clone(), + trigger: job.schedule_path.clone(), + trigger_kind: if job.schedule_path.is_some() { + Some(JobTriggerKind::Schedule) + } else { + None + }, + visible_to_owner: job.visible_to_owner.clone(), + } + } + pub fn is_flow(&self) -> bool { + self.kind.is_flow() + } + + pub fn schedule_path(&self) -> Option { + if self + .trigger_kind + .as_ref() + .is_some_and(|t| matches!(t, JobTriggerKind::Schedule)) + { + self.trigger.clone() + } else { + None + } + } +} + +#[derive(sqlx::FromRow, Debug, Clone)] pub struct PulledJob { #[sqlx(flatten)] - pub job: QueuedJob, + pub job: MiniPulledJob, pub raw_code: Option, pub raw_lock: Option, pub raw_flow: Option>>, } impl std::ops::Deref for PulledJob { - type Target = QueuedJob; + type Target = MiniPulledJob; fn deref(&self) -> &Self::Target { &self.job } @@ -1851,6 +2015,52 @@ lazy_static::lazy_static! { static ref DISABLE_CONCURRENCY_LIMIT: bool = std::env::var("DISABLE_CONCURRENCY_LIMIT").is_ok_and(|s| s == "true"); } +pub async fn get_mini_pulled_job<'c>( + e: impl PgExecutor<'c>, + job_id: &Uuid, +) -> windmill_common::error::Result> { + let job = sqlx::query_as!( + MiniPulledJob, + "SELECT + v2_job_queue.workspace_id, + v2_job_queue.id, + v2_job.args as \"args: sqlx::types::Json>>\", + v2_job.parent_job, + v2_job.created_by, + v2_job_queue.started_at, + scheduled_for, + runnable_path, + kind as \"kind: JobKind\", + runnable_id as \"runnable_id: ScriptHash\", + canceled_reason, + canceled_by, + permissioned_as, + permissioned_as_email, + flow_status as \"flow_status: sqlx::types::Json>\", + v2_job.tag, + script_lang as \"script_lang: ScriptLang\", + same_worker, + pre_run_error, + concurrent_limit, + concurrency_time_window_s, + flow_innermost_root_job, + timeout, + flow_step_id, + cache_ttl, + v2_job_queue.priority, + preprocessed, + script_entrypoint_override, + trigger, + trigger_kind as \"trigger_kind: JobTriggerKind\", + visible_to_owner + FROM v2_job_queue INNER JOIN v2_job ON v2_job.id = v2_job_queue.id LEFT JOIN v2_job_status ON v2_job_status.id = v2_job_queue.id WHERE v2_job_queue.id = $1", + job_id, + ) + .fetch_optional(e) + .await?; + Ok(job) +} + pub async fn pull( db: &Pool, suspend_first: bool, @@ -1880,7 +2090,10 @@ pub async fn pull( // concurrency check. If more than X jobs for this path are already running, we re-queue and pull another job from the queue let pulled_job = job; - if pulled_job.script_path.is_none() || !has_concurent_limit || pulled_job.canceled { + if pulled_job.runnable_path.is_none() + || !has_concurent_limit + || pulled_job.canceled_by.is_some() + { #[cfg(feature = "prometheus")] if METRICS_ENABLED.load(std::sync::atomic::Ordering::Relaxed) { QUEUE_PULL_COUNT.inc(); @@ -1888,16 +2101,14 @@ pub async fn pull( return Ok((Option::Some(pulled_job), suspended)); } - let job_concurrency_key = match concurrency_key(db, &pulled_job).await { + let job_concurrency_key = match concurrency_key(db, &pulled_job.id).await { Ok(key) => key, Err(e) => { tracing::error!( "Could not get concurrency key for job {} defaulting to default key: {e:?}", pulled_job.id ); - legacy_concurrency_key(db, &pulled_job) - .await - .unwrap_or_else(|| pulled_job.full_path_with_workspace()) + "".to_string() } }; tracing::debug!("Concurrency key is '{}'", job_concurrency_key); @@ -1916,21 +2127,22 @@ pub async fn pull( ) .expect("Unable to serialize job_uuids column to proper JSON"); - let (within_limit, max_ended_at) = if *DISABLE_CONCURRENCY_LIMIT { - tracing::warn!("Concurrency limit is disabled, skipping"); - (true, None) - } else { - update_concurrency_counter( - db, - &pulled_job.id, - job_concurrency_key.clone(), - jobs_uuids_init_json_value, - pulled_job.id.hyphenated().to_string(), - job_custom_concurrency_time_window_s, - job_custom_concurrent_limit, - ) - .await? - }; + let (within_limit, max_ended_at) = + if *DISABLE_CONCURRENCY_LIMIT || job_concurrency_key.is_empty() { + tracing::warn!("Concurrency limit is disabled, skipping"); + (true, None) + } else { + update_concurrency_counter( + db, + &pulled_job.id, + job_concurrency_key.clone(), + jobs_uuids_init_json_value, + pulled_job.id.hyphenated().to_string(), + job_custom_concurrency_time_window_s, + job_custom_concurrent_limit, + ) + .await? + }; if within_limit { #[cfg(feature = "prometheus")] if METRICS_ENABLED.load(std::sync::atomic::Ordering::Relaxed) { @@ -1939,7 +2151,7 @@ pub async fn pull( return Ok((Option::Some(pulled_job), suspended)); } - let job_script_path = pulled_job.script_path.clone().unwrap_or_default(); + let job_script_path = pulled_job.runnable_path.clone().unwrap_or_default(); let min_started_at = sqlx::query!( "SELECT COALESCE((SELECT MIN(started_at) as min_started_at @@ -2116,56 +2328,18 @@ async fn pull_single_job_and_mark_as_running_no_concurrency_limit<'c>( pub async fn custom_concurrency_key( db: &Pool, - job_id: Uuid, + job_id: &Uuid, ) -> Result, sqlx::Error> { sqlx::query_scalar!("SELECT key FROM concurrency_key WHERE job_id = $1", job_id) .fetch_optional(db) // this should no longer be fetch optional .await } -async fn legacy_concurrency_key(db: &Pool, queued_job: &QueuedJob) -> Option { - let r = if queued_job.is_flow() { - sqlx::query_scalar!( - "SELECT flow_version.value->>'concurrency_key' - FROM flow - LEFT JOIN flow_version - ON flow_version.id = flow.versions[array_upper(flow.versions, 1)] - WHERE flow.path = $1 AND flow.workspace_id = $2", - queued_job.script_path, - queued_job.workspace_id - ) - .fetch_optional(db) - .await - } else { - sqlx::query_scalar!( - "SELECT concurrency_key FROM script WHERE hash = $1 AND workspace_id = $2", - queued_job.script_hash.unwrap_or(ScriptHash(0)).0, - queued_job.workspace_id - ) - .fetch_optional(db) - .await - } - .ok() - .flatten() - .flatten(); - - let ehm = HashMap::new(); - let push_args = queued_job - .args - .as_ref() - .map(|x| PushArgs::from(&x.0)) - .unwrap_or_else(|| PushArgs::from(&ehm)); - r.map(|x| interpolate_args(x, &push_args, &queued_job.workspace_id)) -} - -async fn concurrency_key( - db: &Pool, - queued_job: &QueuedJob, -) -> windmill_common::error::Result { +async fn concurrency_key(db: &Pool, id: &Uuid) -> windmill_common::error::Result { not_found_if_none( - custom_concurrency_key(db, queued_job.id).await?, + custom_concurrency_key(db, id).await?, "ConcurrencyKey", - queued_job.id.to_string(), + id.to_string(), ) } @@ -3922,7 +4096,7 @@ pub async fn push<'c, 'd>( Ok((uuid, tx)) } -pub fn canceled_job_to_result(job: &QueuedJob) -> serde_json::Value { +pub fn canceled_job_to_result(job: &MiniPulledJob) -> serde_json::Value { let reason = job .canceled_reason .as_deref() diff --git a/backend/windmill-worker/src/ansible_executor.rs b/backend/windmill-worker/src/ansible_executor.rs index a1b03acf1e..a565ff6820 100644 --- a/backend/windmill-worker/src/ansible_executor.rs +++ b/backend/windmill-worker/src/ansible_executor.rs @@ -11,9 +11,10 @@ use tokio::process::Command; use uuid::Uuid; use windmill_common::{ error, - jobs::QueuedJob, worker::{to_raw_value, write_file, write_file_at_user_defined_location, WORKER_CONFIG}, }; +use windmill_queue::MiniPulledJob; + use windmill_parser_yaml::{AnsibleRequirements, ResourceOrVariablePath}; use windmill_queue::{append_logs, CanceledBy}; @@ -180,7 +181,7 @@ pub async fn handle_ansible_job( job_dir: &str, worker_dir: &str, worker_name: &str, - job: &QueuedJob, + job: &MiniPulledJob, mem_peak: &mut i32, canceled_by: &mut Option, db: &sqlx::Pool, diff --git a/backend/windmill-worker/src/bash_executor.rs b/backend/windmill-worker/src/bash_executor.rs index 9eac965ad2..86f472705c 100644 --- a/backend/windmill-worker/src/bash_executor.rs +++ b/backend/windmill-worker/src/bash_executor.rs @@ -15,7 +15,6 @@ use tokio::process::Command; use uuid::Uuid; use windmill_common::{ error::Error, - jobs::QueuedJob, worker::{to_raw_value, write_file}, }; @@ -25,7 +24,7 @@ use windmill_common::DB; #[cfg(feature = "dind")] use windmill_common::error::to_anyhow; -use windmill_queue::{append_logs, CanceledBy}; +use windmill_queue::{append_logs, CanceledBy, MiniPulledJob}; lazy_static::lazy_static! { pub static ref BIN_BASH: String = std::env::var("BASH_PATH").unwrap_or_else(|_| "/bin/bash".to_string()); @@ -63,7 +62,7 @@ lazy_static::lazy_static! { pub async fn handle_bash_job( mem_peak: &mut i32, canceled_by: &mut Option, - job: &QueuedJob, + job: &MiniPulledJob, db: &sqlx::Pool, client: &AuthedClientBackgroundTask, content: &str, @@ -163,7 +162,7 @@ exit $exit_status let nsjail = !*DISABLE_NSJAIL && job - .script_path + .runnable_path .as_ref() .map(|x| !x.starts_with("init_script_")) .unwrap_or(true); @@ -470,7 +469,7 @@ fn raw_to_string(x: &str) -> String { pub async fn handle_powershell_job( mem_peak: &mut i32, canceled_by: &mut Option, - job: &QueuedJob, + job: &MiniPulledJob, db: &sqlx::Pool, client: &AuthedClientBackgroundTask, content: &str, diff --git a/backend/windmill-worker/src/bigquery_executor.rs b/backend/windmill-worker/src/bigquery_executor.rs index e4674ed6ee..6c3b9337fd 100644 --- a/backend/windmill-worker/src/bigquery_executor.rs +++ b/backend/windmill-worker/src/bigquery_executor.rs @@ -5,7 +5,6 @@ use futures::{FutureExt, TryFutureExt}; use reqwest::Client; use serde_json::{json, value::RawValue, Value}; use windmill_common::error::to_anyhow; -use windmill_common::jobs::QueuedJob; use windmill_common::{error::Error, worker::to_raw_value}; use windmill_parser_sql::{ parse_bigquery_sig, parse_db_resource, parse_sql_blocks, parse_sql_statement_named_params, @@ -203,8 +202,10 @@ fn do_bigquery_inner<'a>( Ok(result_f.boxed()) } +use windmill_queue::MiniPulledJob; + pub async fn do_bigquery( - job: &QueuedJob, + job: &MiniPulledJob, client: &AuthedClientBackgroundTask, query: &str, db: &sqlx::Pool, diff --git a/backend/windmill-worker/src/bun_executor.rs b/backend/windmill-worker/src/bun_executor.rs index 29ffbc3044..8e13e0d57f 100644 --- a/backend/windmill-worker/src/bun_executor.rs +++ b/backend/windmill-worker/src/bun_executor.rs @@ -9,7 +9,7 @@ use serde_json::value::RawValue; use uuid::Uuid; use windmill_parser_ts::remove_pinned_imports; -use windmill_queue::{append_logs, CanceledBy}; +use windmill_queue::{append_logs, CanceledBy, MiniPulledJob}; #[cfg(feature = "enterprise")] use crate::common::build_envs_map; @@ -41,7 +41,6 @@ use windmill_common::variables; use windmill_common::{ error::{self, Result}, get_latest_hash_for_path, - jobs::QueuedJob, scripts::ScriptLang, worker::{exists_in_cache, save_cache, write_file, DISABLE_BUNDLING}, DB, @@ -824,7 +823,7 @@ pub async fn handle_bun_job( codebase: Option<&String>, mem_peak: &mut i32, canceled_by: &mut Option, - job: &QueuedJob, + job: &MiniPulledJob, db: &sqlx::Pool, client: &AuthedClientBackgroundTask, job_dir: &str, @@ -846,7 +845,7 @@ pub async fn handle_bun_job( let (local_path, remote_path) = compute_bundle_local_and_remote_path( inner_content, requirements_o, - job.script_path(), + job.runnable_path(), Some(db.clone()), &job.workspace_id, ) @@ -871,7 +870,7 @@ pub async fn handle_bun_job( annotation.nodejs = true } let main_override = job.script_entrypoint_override.as_deref(); - let apply_preprocessor = !job.is_flow_step && job.preprocessed == Some(false); + let apply_preprocessor = !job.is_flow_step() && job.preprocessed == Some(false); if has_bundle_cache { let target; @@ -936,7 +935,7 @@ pub async fn handle_bun_job( &job.workspace_id, Some(db), &client.get_token().await, - &job.script_path(), + job.runnable_path(), job_dir, base_internal_url, worker_name, @@ -1130,7 +1129,7 @@ try {{ base_internal_url, &client.get_token().await, &job.workspace_id, - &job.script_path(), + job.runnable_path(), if annotation.nodejs { LoaderMode::NodeBundle } else if annotation.native { @@ -1148,7 +1147,7 @@ try {{ base_internal_url, &client.get_token().await, &job.workspace_id, - &job.script_path(), + job.runnable_path(), if annotation.nodejs { LoaderMode::Node } else { @@ -1500,7 +1499,7 @@ pub async fn start_worker( script_path: &str, token: &str, job_completed_tx: JobCompletedSender, - jobs_rx: Receiver>, + jobs_rx: Receiver>, killpill_rx: tokio::sync::broadcast::Receiver<()>, ) -> Result<()> { let mut logs = "".to_string(); diff --git a/backend/windmill-worker/src/common.rs b/backend/windmill-worker/src/common.rs index 0ffdabb857..3b9eadae96 100644 --- a/backend/windmill-worker/src/common.rs +++ b/backend/windmill-worker/src/common.rs @@ -24,12 +24,12 @@ use windmill_common::worker::{ use windmill_common::{ cache::{Cache, RawData}, error::{self, Error}, - jobs::QueuedJob, scripts::ScriptHash, variables::ContextualVariable, }; use anyhow::{anyhow, Result}; +use windmill_queue::MiniPulledJob; use std::path::Path; use std::{collections::HashMap, sync::Arc, time::Duration}; @@ -45,7 +45,7 @@ use crate::{ }; pub async fn build_args_map<'a>( - job: &'a QueuedJob, + job: &'a MiniPulledJob, client: &AuthedClientBackgroundTask, db: &Pool, ) -> error::Result>>> { @@ -73,12 +73,12 @@ pub fn check_executor_binary_exists( } pub async fn build_args_values( - job: &QueuedJob, + job: &MiniPulledJob, client: &AuthedClientBackgroundTask, db: &Pool, ) -> error::Result> { if let Some(args) = &job.args { - transform_json_as_values(client, &job.workspace_id, &args.0, &job, db).await + transform_json_as_values(client, &job.workspace_id, &args.0, job, db).await } else { Ok(HashMap::new()) } @@ -87,7 +87,7 @@ pub async fn build_args_values( #[tracing::instrument(level = "trace", skip_all)] pub async fn create_args_and_out_file( client: &AuthedClientBackgroundTask, - job: &QueuedJob, + job: &MiniPulledJob, job_dir: &str, db: &Pool, ) -> Result<(), Error> { @@ -129,7 +129,7 @@ pub async fn transform_json<'a>( client: &AuthedClientBackgroundTask, workspace: &str, vs: &'a HashMap>, - job: &QueuedJob, + job: &MiniPulledJob, db: &Pool, ) -> error::Result>>> { let mut has_match = false; @@ -168,7 +168,7 @@ pub async fn transform_json_as_values<'a>( client: &AuthedClientBackgroundTask, workspace: &str, vs: &'a HashMap>, - job: &QueuedJob, + job: &MiniPulledJob, db: &Pool, ) -> error::Result> { let mut r: HashMap = HashMap::new(); @@ -238,7 +238,7 @@ pub async fn transform_json_value( client: &AuthedClient, workspace: &str, v: Value, - job: &QueuedJob, + job: &MiniPulledJob, db: &Pool, ) -> error::Result { match v { @@ -272,7 +272,8 @@ pub async fn transform_json_value( Value::String(y) if y.starts_with("$encrypted:") => { let encrypted = y.strip_prefix("$encrypted:").unwrap(); - let root_job_id = get_root_job_id(&job.root_job.unwrap_or_else(|| job.id), db).await?; + let root_job_id = + get_root_job_id(&job.flow_innermost_root_job.unwrap_or_else(|| job.id), db).await?; let mc = build_crypt_with_key_suffix(&db, &job.workspace_id, &root_job_id.to_string()) .await?; decrypt(&mc, encrypted.to_string()).and_then(|x| { @@ -295,16 +296,16 @@ pub async fn transform_json_value( db, &job.workspace_id, &client.token, - &job.email, + &job.permissioned_as_email, &job.created_by, &job.id.to_string(), &job.permissioned_as, - job.script_path.clone(), + job.runnable_path.clone(), job.parent_job.map(|x| x.to_string()), flow_path, - job.schedule_path.clone(), + job.schedule_path(), job.flow_step_id.clone(), - job.root_job.clone().map(|x| x.to_string()), + job.flow_innermost_root_job.clone().map(|x| x.to_string()), None, Some(job.scheduled_for.clone()), ) @@ -413,7 +414,7 @@ pub fn capitalize(s: &str) -> String { #[tracing::instrument(level = "trace", skip_all)] pub async fn get_reserved_variables( - job: &QueuedJob, + job: &MiniPulledJob, token: &str, db: &sqlx::Pool, ) -> Result, Error> { @@ -430,16 +431,16 @@ pub async fn get_reserved_variables( db, &job.workspace_id, token, - &job.email, + &job.permissioned_as_email, &job.created_by, &job.id.to_string(), &job.permissioned_as, - job.script_path.clone(), + job.runnable_path.clone(), job.parent_job.map(|x| x.to_string()), flow_path, - job.schedule_path.clone(), + job.schedule_path(), job.flow_step_id.clone(), - job.root_job.clone().map(|x| x.to_string()), + job.flow_innermost_root_job.clone().map(|x| x.to_string()), None, Some(job.scheduled_for.clone()), ) @@ -669,15 +670,15 @@ async fn hash_args( pub async fn cached_result_path( db: &DB, client: &AuthedClient, - job: &QueuedJob, + job: &MiniPulledJob, raw_data: Option<&RawData>, ) -> String { let mut hasher = sha2::Sha256::new(); - hasher.update(&[job.job_kind as u8]); - if let Some(ScriptHash(hash)) = job.script_hash { + hasher.update(&[job.kind as u8]); + if let Some(ScriptHash(hash)) = job.runnable_id { hasher.update(&hash.to_le_bytes()) } else { - job.script_path + job.runnable_path .as_ref() .inspect(|x| hasher.update(x.as_bytes())); match raw_data { @@ -890,7 +891,7 @@ pub async fn get_cached_resource_value_if_valid( pub async fn save_in_cache( db: &Pool, _client: &AuthedClient, - job: &QueuedJob, + job: &MiniPulledJob, cached_path: String, r: Arc>, ) { diff --git a/backend/windmill-worker/src/csharp_executor.rs b/backend/windmill-worker/src/csharp_executor.rs index 5694920e88..811443d3b8 100644 --- a/backend/windmill-worker/src/csharp_executor.rs +++ b/backend/windmill-worker/src/csharp_executor.rs @@ -19,7 +19,6 @@ use windmill_common::{ }; use windmill_common::error::{self, Error}; -use windmill_common::jobs::QueuedJob; #[cfg(feature = "csharp")] use windmill_queue::append_logs; @@ -426,11 +425,13 @@ fn remove_lines_from_text(contents: &str, indices_to_remove: Vec) -> Stri result.join("\n") } +use windmill_queue::MiniPulledJob; + #[cfg(not(feature = "csharp"))] pub async fn handle_csharp_job( _mem_peak: &mut i32, _canceled_by: &mut Option, - _job: &QueuedJob, + _job: &MiniPulledJob, _db: &sqlx::Pool, _client: &AuthedClientBackgroundTask, _inner_content: &str, @@ -449,7 +450,7 @@ pub async fn handle_csharp_job( pub async fn handle_csharp_job( mem_peak: &mut i32, canceled_by: &mut Option, - job: &QueuedJob, + job: &MiniPulledJob, db: &sqlx::Pool, client: &AuthedClientBackgroundTask, inner_content: &str, diff --git a/backend/windmill-worker/src/dedicated_worker.rs b/backend/windmill-worker/src/dedicated_worker.rs index b67483dd9c..2b63a6d28a 100644 --- a/backend/windmill-worker/src/dedicated_worker.rs +++ b/backend/windmill-worker/src/dedicated_worker.rs @@ -19,13 +19,13 @@ use windmill_common::KillpillSender; use windmill_common::{ cache, error, flows::{FlowModule, FlowModuleValue}, - jobs::QueuedJob, scripts::{ScriptHash, ScriptLang}, variables, worker::to_raw_value, DB, }; use windmill_queue::append_logs; +use windmill_queue::MiniPulledJob; use anyhow::Context; @@ -70,7 +70,7 @@ pub async fn handle_dedicated_process( mut killpill_rx: tokio::sync::broadcast::Receiver<()>, job_completed_tx: JobCompletedSender, token: &str, - mut jobs_rx: Receiver>, + mut jobs_rx: Receiver>, worker_name: &str, db: &DB, script_path: &str, @@ -78,6 +78,8 @@ pub async fn handle_dedicated_process( ) -> std::result::Result<(), error::Error> { //do not cache local dependencies + use windmill_queue::MiniPulledJob; + use crate::{handle_child::process_status, PROXY_ENVS}; let cmd_name = format!("dedicated {command_path}"); let mut child = { @@ -134,7 +136,8 @@ pub async fn handle_dedicated_process( } }); - let mut jobs: VecDeque> = VecDeque::with_capacity(MAX_BUFFERED_DEDICATED_JOBS); + let mut jobs: VecDeque> = + VecDeque::with_capacity(MAX_BUFFERED_DEDICATED_JOBS); // let mut i = 0; // let mut j = 0; let mut alive = true; @@ -179,7 +182,7 @@ pub async fn handle_dedicated_process( } tracing::debug!("processed job: |{line}|"); if line.starts_with("wm_res[") { - let job: Arc = jobs.pop_front().expect("pop"); + let job: Arc = jobs.pop_front().expect("pop"); tracing::info!("job completed on dedicated worker {script_path}: {}", job.id); match serde_json::from_str::>(&line.replace("wm_res[success]:", "").replace("wm_res[error]:", "")) { Ok(result) => { @@ -242,7 +245,7 @@ pub async fn handle_dedicated_process( type DedicatedWorker = ( String, - Sender>, + Sender>, Option>, ); @@ -262,7 +265,7 @@ async fn spawn_dedicated_workers_for_flow( job_completed_tx: &JobCompletedSender, ) -> Vec { let mut workers = vec![]; - let mut script_path_to_worker: HashMap>> = + let mut script_path_to_worker: HashMap>> = HashMap::new(); for module in modules.iter() { let value = module.get_value(); @@ -447,7 +450,7 @@ pub async fn create_dedicated_worker_map( worker_name: &str, job_completed_tx: &JobCompletedSender, ) -> ( - HashMap>>, + HashMap>>, bool, Vec>, ) { @@ -566,6 +569,7 @@ async fn spawn_dedicated_worker( scripts::{ScriptHash, ScriptLang}, utils::rd_string, }; + use windmill_queue::MiniPulledJob; use crate::{build_envs, get_script_content_by_hash, ContentReqLangEnvs, JOB_TOKEN}; @@ -578,8 +582,9 @@ async fn spawn_dedicated_worker( #[cfg(feature = "enterprise")] { - let (dedicated_worker_tx, dedicated_worker_rx) = - tokio::sync::mpsc::channel::>(MAX_BUFFERED_DEDICATED_JOBS); + let (dedicated_worker_tx, dedicated_worker_rx) = tokio::sync::mpsc::channel::< + std::sync::Arc, + >(MAX_BUFFERED_DEDICATED_JOBS); let killpill_rx = killpill_rx.resubscribe(); let db = db.clone(); let base_internal_url = base_internal_url.to_string(); diff --git a/backend/windmill-worker/src/deno_executor.rs b/backend/windmill-worker/src/deno_executor.rs index 40350fdeee..2bd979571c 100644 --- a/backend/windmill-worker/src/deno_executor.rs +++ b/backend/windmill-worker/src/deno_executor.rs @@ -3,7 +3,7 @@ use std::{collections::HashMap, process::Stdio}; use itertools::Itertools; use serde_json::value::RawValue; use uuid::Uuid; -use windmill_queue::{append_logs, CanceledBy}; +use windmill_queue::{append_logs, CanceledBy, MiniPulledJob}; use crate::{ common::{ @@ -15,11 +15,8 @@ use crate::{ NPM_CONFIG_REGISTRY, PATH_ENV, TZ_ENV, }; use tokio::{fs::File, io::AsyncReadExt, process::Command}; +use windmill_common::error::{self}; use windmill_common::{error::Result, worker::write_file, BASE_URL}; -use windmill_common::{ - error::{self}, - jobs::QueuedJob, -}; use windmill_parser::Typ; lazy_static::lazy_static! { @@ -180,7 +177,7 @@ pub async fn handle_deno_job( requirements_o: Option<&String>, mem_peak: &mut i32, canceled_by: &mut Option, - job: &QueuedJob, + job: &MiniPulledJob, db: &sqlx::Pool, client: &AuthedClientBackgroundTask, job_dir: &str, @@ -196,7 +193,7 @@ pub async fn handle_deno_job( append_logs(&job.id, &job.workspace_id, logs1, db).await; let main_override = job.script_entrypoint_override.as_deref(); - let apply_preprocessor = !job.is_flow_step && job.preprocessed == Some(false); + let apply_preprocessor = !job.is_flow_step() && job.preprocessed == Some(false); write_file(job_dir, "main.ts", inner_content)?; @@ -310,7 +307,7 @@ try {{ let write_import_map_f = build_import_map( &job.workspace_id, - job.script_path(), + job.runnable_path(), base_internal_url, job_dir, ); @@ -502,7 +499,7 @@ pub async fn start_worker( script_path: &str, token: &str, job_completed_tx: JobCompletedSender, - jobs_rx: Receiver>, + jobs_rx: Receiver>, killpill_rx: tokio::sync::broadcast::Receiver<()>, db: &sqlx::Pool, ) -> Result<()> { diff --git a/backend/windmill-worker/src/go_executor.rs b/backend/windmill-worker/src/go_executor.rs index 1a8156a1bb..23aee36fa4 100644 --- a/backend/windmill-worker/src/go_executor.rs +++ b/backend/windmill-worker/src/go_executor.rs @@ -7,12 +7,11 @@ use tokio::{fs::File, io::AsyncReadExt, process::Command}; use uuid::Uuid; use windmill_common::{ error::{self, Error}, - jobs::QueuedJob, utils::calculate_hash, worker::{save_cache, write_file}, }; use windmill_parser_go::{parse_go_imports, REQUIRE_PARSE}; -use windmill_queue::{append_logs, CanceledBy}; +use windmill_queue::{append_logs, CanceledBy, MiniPulledJob}; use crate::{ common::{ @@ -36,7 +35,7 @@ pub const GO_OBJECT_STORE_PREFIX: &str = "gobin/"; pub async fn handle_go_job( mem_peak: &mut i32, canceled_by: &mut Option, - job: &QueuedJob, + job: &MiniPulledJob, db: &sqlx::Pool, client: &AuthedClientBackgroundTask, inner_content: &str, diff --git a/backend/windmill-worker/src/graphql_executor.rs b/backend/windmill-worker/src/graphql_executor.rs index 929235cccf..98e5ef9a32 100644 --- a/backend/windmill-worker/src/graphql_executor.rs +++ b/backend/windmill-worker/src/graphql_executor.rs @@ -4,11 +4,10 @@ use anyhow::anyhow; use futures::{stream, TryStreamExt}; use serde_json::{json, value::RawValue}; use sqlx::types::Json; -use windmill_common::jobs::QueuedJob; use windmill_common::worker::to_raw_value; use windmill_common::{error::Error, worker::CLOUD_HOSTED}; use windmill_parser_graphql::parse_graphql_sig; -use windmill_queue::CanceledBy; +use windmill_queue::{CanceledBy, MiniPulledJob}; use serde::Deserialize; @@ -35,7 +34,7 @@ struct GraphqlError { } pub async fn do_graphql( - job: &QueuedJob, + job: &MiniPulledJob, client: &AuthedClientBackgroundTask, query: &str, db: &sqlx::Pool, diff --git a/backend/windmill-worker/src/lib.rs b/backend/windmill-worker/src/lib.rs index 9b77ca840f..4c5aa1c908 100644 --- a/backend/windmill-worker/src/lib.rs +++ b/backend/windmill-worker/src/lib.rs @@ -29,6 +29,7 @@ mod js_eval; mod mysql_executor; #[cfg(feature = "oracledb")] mod oracledb_executor; +mod otel_ee; mod pg_executor; #[cfg(feature = "php")] mod php_executor; diff --git a/backend/windmill-worker/src/mssql_executor.rs b/backend/windmill-worker/src/mssql_executor.rs index 42d9c3aa8c..a033d1eff1 100644 --- a/backend/windmill-worker/src/mssql_executor.rs +++ b/backend/windmill-worker/src/mssql_executor.rs @@ -8,10 +8,11 @@ use tiberius::{AuthMethod, Client, ColumnData, Config, FromSqlOwned, Query, Row, use tokio::net::TcpStream; use tokio_util::compat::TokioAsyncWriteCompatExt; use uuid::Uuid; +use windmill_common::error::to_anyhow; use windmill_common::error::{self, Error}; use windmill_common::worker::to_raw_value; -use windmill_common::{error::to_anyhow, jobs::QueuedJob}; use windmill_parser_sql::{parse_db_resource, parse_mssql_sig}; +use windmill_queue::MiniPulledJob; use windmill_queue::{append_logs, CanceledBy}; use crate::common::{build_args_values, OccupancyMetrics}; @@ -33,7 +34,7 @@ lazy_static::lazy_static! { } pub async fn do_mssql( - job: &QueuedJob, + job: &MiniPulledJob, client: &AuthedClientBackgroundTask, query: &str, db: &sqlx::Pool, diff --git a/backend/windmill-worker/src/mysql_executor.rs b/backend/windmill-worker/src/mysql_executor.rs index d733901f93..80c41f21c3 100644 --- a/backend/windmill-worker/src/mysql_executor.rs +++ b/backend/windmill-worker/src/mysql_executor.rs @@ -12,7 +12,6 @@ use sqlx::types::Json; use tokio::sync::Mutex; use windmill_common::{ error::{to_anyhow, Error}, - jobs::QueuedJob, worker::to_raw_value, }; use windmill_parser_sql::{ @@ -20,6 +19,7 @@ use windmill_parser_sql::{ RE_ARG_MYSQL_NAMED, }; use windmill_queue::CanceledBy; +use windmill_queue::MiniPulledJob; use crate::{ common::{build_args_map, OccupancyMetrics}, @@ -103,7 +103,7 @@ pub fn do_mysql_inner<'a>( } pub async fn do_mysql( - job: &QueuedJob, + job: &MiniPulledJob, client: &AuthedClientBackgroundTask, query: &str, db: &sqlx::Pool, diff --git a/backend/windmill-worker/src/oracledb_executor.rs b/backend/windmill-worker/src/oracledb_executor.rs index e6292181b2..3127659b02 100644 --- a/backend/windmill-worker/src/oracledb_executor.rs +++ b/backend/windmill-worker/src/oracledb_executor.rs @@ -11,9 +11,10 @@ use serde_json::{json, value::RawValue, Value}; use sqlx::types::Json; use windmill_common::{ error::{to_anyhow, Error}, - jobs::QueuedJob, worker::to_raw_value, }; +use windmill_queue::MiniPulledJob; + use windmill_parser_sql::{ parse_db_resource, parse_oracledb_sig, parse_sql_blocks, parse_sql_statement_named_params, }; @@ -292,7 +293,7 @@ fn get_statement_values( } pub async fn do_oracledb( - job: &QueuedJob, + job: &MiniPulledJob, client: &AuthedClientBackgroundTask, query: &str, db: &sqlx::Pool, diff --git a/backend/windmill-worker/src/otel_ee.rs b/backend/windmill-worker/src/otel_ee.rs new file mode 100644 index 0000000000..311ffd6355 --- /dev/null +++ b/backend/windmill-worker/src/otel_ee.rs @@ -0,0 +1,3 @@ +use windmill_queue::MiniPulledJob; + +pub fn add_root_flow_job_to_otlp(_queued_job: &MiniPulledJob, _success: bool) {} diff --git a/backend/windmill-worker/src/pg_executor.rs b/backend/windmill-worker/src/pg_executor.rs index 40d1103af0..645d7ff09f 100644 --- a/backend/windmill-worker/src/pg_executor.rs +++ b/backend/windmill-worker/src/pg_executor.rs @@ -25,14 +25,14 @@ use tokio_postgres::{ Column, }; use uuid::Uuid; +use windmill_common::error::to_anyhow; use windmill_common::error::{self, Error}; use windmill_common::worker::{to_raw_value, CLOUD_HOSTED}; -use windmill_common::{error::to_anyhow, jobs::QueuedJob}; use windmill_parser::{Arg, Typ}; use windmill_parser_sql::{ parse_db_resource, parse_pg_statement_arg_indices, parse_pgsql_sig, parse_sql_blocks, }; -use windmill_queue::CanceledBy; +use windmill_queue::{CanceledBy, MiniPulledJob}; use crate::common::{build_args_values, sizeof_val, OccupancyMetrics}; use crate::handle_child::run_future_with_polling_update_job_poller; @@ -157,7 +157,7 @@ fn do_postgresql_inner<'a>( } pub async fn do_postgresql( - job: &QueuedJob, + job: &MiniPulledJob, client: &AuthedClientBackgroundTask, query: &str, db: &sqlx::Pool, diff --git a/backend/windmill-worker/src/php_executor.rs b/backend/windmill-worker/src/php_executor.rs index 4f579a54a8..fa5eb58c16 100644 --- a/backend/windmill-worker/src/php_executor.rs +++ b/backend/windmill-worker/src/php_executor.rs @@ -7,9 +7,10 @@ use tokio::{fs::File, io::AsyncReadExt, process::Command}; use uuid::Uuid; use windmill_common::{ error::{self, to_anyhow, Result}, - jobs::QueuedJob, worker::write_file, }; +use windmill_queue::MiniPulledJob; + use windmill_parser::Typ; use windmill_queue::{append_logs, CanceledBy}; @@ -136,7 +137,7 @@ pub async fn handle_php_job( requirements_o: Option<&String>, mem_peak: &mut i32, canceled_by: &mut Option, - job: &QueuedJob, + job: &MiniPulledJob, db: &sqlx::Pool, client: &AuthedClientBackgroundTask, job_dir: &str, diff --git a/backend/windmill-worker/src/python_executor.rs b/backend/windmill-worker/src/python_executor.rs index 1180652d35..d39580d285 100644 --- a/backend/windmill-worker/src/python_executor.rs +++ b/backend/windmill-worker/src/python_executor.rs @@ -26,7 +26,6 @@ use windmill_common::{ self, Error::{self}, }, - jobs::QueuedJob, utils::calculate_hash, worker::{write_file, PythonAnnotations, WORKER_CONFIG}, DB, @@ -709,7 +708,7 @@ pub async fn uv_pip_compile( async fn postinstall( additional_python_paths: &mut Vec, job_dir: &str, - job: &QueuedJob, + job: &MiniPulledJob, db: &sqlx::Pool, ) -> windmill_common::error::Result<()> { // It is guranteed that additional_python_paths only contains paths within windmill/cache/ @@ -836,7 +835,7 @@ pub async fn handle_python_job( job_dir: &str, worker_dir: &str, worker_name: &str, - job: &QueuedJob, + job: &MiniPulledJob, mem_peak: &mut i32, canceled_by: &mut Option, db: &sqlx::Pool, @@ -848,7 +847,7 @@ pub async fn handle_python_job( new_args: &mut Option>>, occupancy_metrics: &mut OccupancyMetrics, ) -> windmill_common::error::Result> { - let script_path = crate::common::use_flow_root_path(job.script_path()); + let script_path = crate::common::use_flow_root_path(job.runnable_path()); let (py_version, mut additional_python_paths) = handle_python_deps( job_dir, @@ -911,7 +910,7 @@ pub async fn handle_python_job( pre_spread, ) = prepare_wrapper( job_dir, - job.is_flow_step, + job.is_flow_step(), job.preprocessed, job.script_entrypoint_override.as_deref(), inner_content, @@ -2298,6 +2297,8 @@ use crate::{common::build_envs_map, dedicated_worker::handle_dedicated_process}; #[cfg(feature = "enterprise")] use windmill_common::variables; +use windmill_queue::MiniPulledJob; + #[cfg(feature = "enterprise")] pub async fn start_worker( requirements_o: Option<&String>, @@ -2311,7 +2312,7 @@ pub async fn start_worker( script_path: &str, token: &str, job_completed_tx: JobCompletedSender, - jobs_rx: tokio::sync::mpsc::Receiver>, + jobs_rx: tokio::sync::mpsc::Receiver>, killpill_rx: tokio::sync::broadcast::Receiver<()>, ) -> error::Result<()> { let mut mem_peak: i32 = 0; diff --git a/backend/windmill-worker/src/result_processor.rs b/backend/windmill-worker/src/result_processor.rs index 153d6f32fc..966991d0ea 100644 --- a/backend/windmill-worker/src/result_processor.rs +++ b/backend/windmill-worker/src/result_processor.rs @@ -19,7 +19,7 @@ use uuid::Uuid; use windmill_common::{ add_time, error::{self, Error}, - jobs::{JobKind, QueuedJob}, + jobs::JobKind, utils::WarnAfterExt, worker::{to_raw_value, WORKER_GROUP}, KillpillSender, DB, @@ -28,7 +28,7 @@ use windmill_common::{ #[cfg(feature = "benchmark")] use crate::bench::{BenchmarkInfo, BenchmarkIter}; -use windmill_queue::{append_logs, get_queued_job, CanceledBy, WrappedError}; +use windmill_queue::{append_logs, get_queued_job, CanceledBy, MiniPulledJob, WrappedError}; use serde_json::{json, value::RawValue}; @@ -42,6 +42,7 @@ use windmill_queue::{add_completed_job, add_completed_job_error}; use crate::{ bash_executor::ANSI_ESCAPE_RE, common::{read_result, save_in_cache}, + otel_ee::add_root_flow_job_to_otlp, worker_flow::update_flow_status_after_job_completion, AuthedClient, JobCompleted, JobCompletedSender, SameWorkerSender, SendResult, INIT_SCRIPT_TAG, }; @@ -81,7 +82,7 @@ pub fn start_background_processor( let is_init_script_and_failure = !jc.success && jc.job.tag.as_str() == INIT_SCRIPT_TAG; let is_dependency_job = matches!( - jc.job.job_kind, + jc.job.kind, JobKind::Dependencies | JobKind::FlowDependencies ); @@ -98,14 +99,14 @@ pub fn start_background_processor( parent_job = field::Empty, otel.name = field::Empty ); - let rj = if let Some(root_job) = jc.job.root_job { + let rj = if let Some(root_job) = jc.job.flow_innermost_root_job { root_job } else { jc.job.id }; windmill_common::otel_ee::set_span_parent(&span, &rj); - if let Some(lg) = jc.job.language.as_ref() { + if let Some(lg) = jc.job.script_lang.as_ref() { span.record("language", lg.as_str()); } if let Some(step_id) = jc.job.flow_step_id.as_ref() { @@ -120,10 +121,10 @@ pub fn start_background_processor( if let Some(parent_job) = jc.job.parent_job.as_ref() { span.record("parent_job", parent_job.to_string().as_str()); } - if let Some(script_path) = jc.job.script_path.as_ref() { + if let Some(script_path) = jc.job.runnable_path.as_ref() { span.record("script_path", script_path.as_str()); } - if let Some(root_job) = jc.job.root_job.as_ref() { + if let Some(root_job) = jc.job.flow_innermost_root_job.as_ref() { span.record("root_job", root_job.to_string().as_str()); } @@ -142,7 +143,7 @@ pub fn start_background_processor( .await; if let Some(root_job) = root_job { - windmill_common::otel_ee::add_root_flow_job_to_otlp(&root_job, success); + add_root_flow_job_to_otlp(&root_job, success); } if is_init_script_and_failure { @@ -227,7 +228,7 @@ pub fn start_background_processor( async fn send_job_completed( job_completed_tx: JobCompletedSender, - job: Arc, + job: Arc, result: Arc>, result_columns: Option>, mem_peak: i32, @@ -256,7 +257,7 @@ async fn send_job_completed( } pub async fn process_result( - job: Arc, + job: Arc, result: error::Result>>, job_dir: &str, job_completed_tx: JobCompletedSender, @@ -356,7 +357,7 @@ pub async fn handle_receive_completed_job( worker_name: &str, job_completed_tx: Sender, #[cfg(feature = "benchmark")] bench: &mut BenchmarkIter, -) -> Option> { +) -> Option> { let token = jc.token.clone(); let workspace = jc.job.workspace_id.clone(); let client = AuthedClient { @@ -423,14 +424,14 @@ pub async fn process_completed_job( worker_name: &str, job_completed_tx: Sender, #[cfg(feature = "benchmark")] bench: &mut BenchmarkIter, -) -> error::Result>> { +) -> error::Result>> { if success { // println!("bef completed job{:?}", SystemTime::now()); if let Some(cached_path) = cached_res_path { save_in_cache(db, client, &job, cached_path, result.clone()).await; } - let is_flow_step = job.is_flow_step; + let is_flow_step = job.is_flow_step(); let parent_job = job.parent_job.clone(); let job_id = job.id.clone(); let workspace_id = job.workspace_id.clone(); @@ -511,7 +512,7 @@ pub async fn process_completed_job( None, ) .await?; - if job.is_flow_step { + if job.is_flow_step() { if let Some(parent_job) = job.parent_job { tracing::error!(parent_flow = %parent_job, subflow = %job.id, "process completed job error, updating flow status"); let r = update_flow_status_after_job_completion( @@ -544,7 +545,7 @@ pub async fn process_completed_job( pub async fn handle_job_error( db: &Pool, client: &AuthedClient, - job: &QueuedJob, + job: &MiniPulledJob, mem_peak: i32, canceled_by: Option, err: Error, @@ -581,7 +582,7 @@ pub async fn handle_job_error( .await }; - let update_job_future = if job.is_flow_step || job.is_flow() { + let update_job_future = if job.is_flow_step() || job.is_flow() { let (flow, job_status_to_update) = if let Some(parent_job_id) = job.parent_job { if let Err(e) = update_job_future().await { tracing::error!( @@ -630,7 +631,7 @@ pub async fn handle_job_error( .await; let _ = add_completed_job_error( db, - &parent_job, + &MiniPulledJob::from(&parent_job), mem_peak, canceled_by.clone(), e, diff --git a/backend/windmill-worker/src/rust_executor.rs b/backend/windmill-worker/src/rust_executor.rs index 95fd822100..b3fbb08d35 100644 --- a/backend/windmill-worker/src/rust_executor.rs +++ b/backend/windmill-worker/src/rust_executor.rs @@ -7,10 +7,10 @@ use itertools::Itertools; use tokio::{fs::File, io::AsyncReadExt, process::Command}; use windmill_common::{ error::{self, Error}, - jobs::QueuedJob, utils::calculate_hash, worker::{save_cache, write_file}, }; +use windmill_queue::MiniPulledJob; use windmill_queue::{append_logs, CanceledBy}; use crate::{ @@ -275,7 +275,7 @@ pub fn compute_rust_hash(code: &str, requirements_o: Option<&String>) -> String pub async fn handle_rust_job( mem_peak: &mut i32, canceled_by: &mut Option, - job: &QueuedJob, + job: &MiniPulledJob, db: &sqlx::Pool, client: &AuthedClientBackgroundTask, inner_content: &str, diff --git a/backend/windmill-worker/src/snowflake_executor.rs b/backend/windmill-worker/src/snowflake_executor.rs index 3315df6bc1..7090c114e8 100644 --- a/backend/windmill-worker/src/snowflake_executor.rs +++ b/backend/windmill-worker/src/snowflake_executor.rs @@ -10,10 +10,9 @@ use sha2::{Digest, Sha256}; use std::collections::HashMap; use windmill_common::error::to_anyhow; -use windmill_common::jobs::QueuedJob; use windmill_common::{error::Error, worker::to_raw_value}; use windmill_parser_sql::{parse_db_resource, parse_snowflake_sig, parse_sql_blocks}; -use windmill_queue::{CanceledBy, HTTP_CLIENT}; +use windmill_queue::{CanceledBy, MiniPulledJob, HTTP_CLIENT}; use serde::{Deserialize, Serialize}; @@ -240,7 +239,7 @@ fn do_snowflake_inner<'a>( } pub async fn do_snowflake( - job: &QueuedJob, + job: &MiniPulledJob, client: &AuthedClientBackgroundTask, query: &str, db: &sqlx::Pool, diff --git a/backend/windmill-worker/src/worker.rs b/backend/windmill-worker/src/worker.rs index 7c474efd40..3ae9a1e683 100644 --- a/backend/windmill-worker/src/worker.rs +++ b/backend/windmill-worker/src/worker.rs @@ -56,7 +56,7 @@ use windmill_common::{ cache::{self, RawData}, error::{self, to_anyhow, Error}, flows::FlowNodeId, - jobs::{JobKind, QueuedJob}, + jobs::JobKind, scripts::{get_full_hub_script_by_path, ScriptHash, ScriptLang, PREVIEW_IS_CODEBASE_HASH}, users::SUPERADMIN_SECRET_EMAIL, utils::StripPath, @@ -65,8 +65,8 @@ use windmill_common::{ }; use windmill_queue::{ - append_logs, canceled_job_to_result, empty_result, pull, push, CanceledBy, PulledJob, PushArgs, - PushIsolationLevel, HTTP_CLIENT, + append_logs, canceled_job_to_result, empty_result, pull, push, CanceledBy, MiniPulledJob, + PulledJob, PushArgs, PushIsolationLevel, HTTP_CLIENT, }; #[cfg(feature = "prometheus")] @@ -154,7 +154,7 @@ use windmill_common::add_time; pub async fn create_token_for_owner_in_bg( db: &Pool, - job: &QueuedJob, + job: &MiniPulledJob, ) -> Arc> { let rw_lock = Arc::new(RwLock::new(String::new())); // skipping test runs @@ -163,7 +163,7 @@ pub async fn create_token_for_owner_in_bg( let db = db.clone(); let w_id = job.workspace_id.clone(); let owner = job.permissioned_as.clone(); - let email = job.email.clone(); + let email = job.permissioned_as_email.clone(); let job_id = job.id.clone(); let label = if job.permissioned_as != format!("u/{}", job.created_by) @@ -707,7 +707,7 @@ async fn insert_wait_time( } fn add_outstanding_wait_time( - queued_job: &QueuedJob, + queued_job: &MiniPulledJob, db: &Pool, waiting_threshold: i64, ) -> () { @@ -724,7 +724,7 @@ fn add_outstanding_wait_time( } let job_id = queued_job.id; - let root_job_id = queued_job.root_job; + let root_job_id = queued_job.flow_innermost_root_job; let db = db.clone(); tokio::spawn(async move { @@ -1083,7 +1083,7 @@ pub async fn run_worker( #[cfg(feature = "enterprise")] let (dedicated_workers, is_flow_worker, dedicated_handles): ( - HashMap>>, + HashMap>>, bool, Vec>, ) = create_dedicated_worker_map( @@ -1099,7 +1099,7 @@ pub async fn run_worker( #[cfg(not(feature = "enterprise"))] let (dedicated_workers, is_flow_worker, dedicated_handles): ( - HashMap>>, + HashMap>>, bool, Vec>, ) = (HashMap::new(), false, vec![]); @@ -1299,11 +1299,48 @@ pub async fn run_worker( same_worker_job.job_id ); let r = sqlx::query_as::<_, PulledJob>( - " - WITH ping AS ( - UPDATE v2_job_runtime SET ping = NOW() WHERE id = $1 RETURNING id + "WITH ping AS ( + UPDATE v2_job_runtime SET ping = NOW() WHERE id = $1 + ), + started_at AS ( + UPDATE v2_job_queue SET started_at = NOW() WHERE id = $1 ) - SELECT * FROM v2_as_queue WHERE id = (SELECT id FROM ping) + SELECT + v2_job_queue.workspace_id, + v2_job_queue.id, + v2_job.args, + v2_job.parent_job, + v2_job.created_by, + v2_job_queue.started_at, + scheduled_for, + runnable_path, + kind, + runnable_id, + canceled_reason, + canceled_by, + permissioned_as, + permissioned_as_email, + flow_status, + v2_job.tag, + script_lang, + same_worker, + pre_run_error, + concurrent_limit, + concurrency_time_window_s, + flow_innermost_root_job, + timeout, + flow_step_id, + cache_ttl, + v2_job_queue.priority, + preprocessed, + script_entrypoint_override, + trigger, + trigger_kind, + visible_to_owner, + raw_code, + raw_lock, + raw_flow + FROM v2_job_queue INNER JOIN v2_job ON v2_job.id = v2_job_queue.id LEFT JOIN v2_job_status ON v2_job_status.id = v2_job_queue.id WHERE v2_job_queue.id = $1 ", ) .bind(same_worker_job.job_id) @@ -1315,12 +1352,7 @@ pub async fn run_worker( same_worker_job.job_id, e )) }); - let _ = sqlx::query!( - "UPDATE v2_job_queue SET started_at = NOW() WHERE id = $1", - same_worker_job.job_id - ) - .execute(db) - .await; + // tracing::error!("r: {:?}", r); if r.is_err() && !same_worker_job.recoverable { tracing::error!( worker = %worker_name, hostname = %hostname, @@ -1443,12 +1475,12 @@ pub async fn run_worker( tracing::debug!(worker = %worker_name, hostname = %hostname, "started handling of job {}", job.id); - if matches!(job.job_kind, JobKind::Script | JobKind::Preview) { + if matches!(job.kind, JobKind::Script | JobKind::Preview) { if !dedicated_workers.is_empty() { let key_o = if is_flow_worker { job.flow_step_id.as_ref().map(|x| x.to_string()) } else { - job.script_path.as_ref().map(|x| x.to_string()) + job.runnable_path.as_ref().map(|x| x.to_string()) }; if let Some(key) = key_o { if let Some(dedicated_worker_tx) = dedicated_workers.get(&key) { @@ -1467,7 +1499,7 @@ pub async fn run_worker( } } } - if matches!(job.job_kind, JobKind::Noop) { + if matches!(job.kind, JobKind::Noop) { add_time!(bench, "send job completed START"); job_completed_tx .send(JobCompleted { @@ -1533,7 +1565,7 @@ pub async fn run_worker( .await; let job_root = job - .root_job + .flow_innermost_root_job .map(|x| x.to_string()) .unwrap_or_else(|| "none".to_string()); @@ -1554,7 +1586,7 @@ pub async fn run_worker( let same_worker = job.same_worker; - let folder = if job.language == Some(ScriptLang::Go) { + let folder = if job.script_lang == Some(ScriptLang::Go) { DirBuilder::new() .recursive(true) .create(&format!("{job_dir}/go")) @@ -1605,12 +1637,12 @@ pub async fn run_worker( language = field::Empty, script_path = field::Empty, flow_step_id = field::Empty, parent_job = field::Empty, otel.name = field::Empty); - let rj = if let Some(root_job) = arc_job.root_job { + let rj = if let Some(root_job) = arc_job.flow_innermost_root_job { root_job } else { arc_job.id }; - if let Some(lg) = arc_job.language.as_ref() { + if let Some(lg) = arc_job.script_lang.as_ref() { span.record("language", lg.as_str()); } if let Some(step_id) = arc_job.flow_step_id.as_ref() { @@ -1622,10 +1654,10 @@ pub async fn run_worker( if let Some(parent_job) = arc_job.parent_job.as_ref() { span.record("parent_job", parent_job.to_string().as_str()); } - if let Some(script_path) = arc_job.script_path.as_ref() { + if let Some(script_path) = arc_job.runnable_path.as_ref() { span.record("script_path", script_path.as_str()); } - if let Some(root_job) = arc_job.root_job.as_ref() { + if let Some(root_job) = arc_job.flow_innermost_root_job.as_ref() { span.record("root_job", root_job.to_string().as_str()); } @@ -1869,7 +1901,7 @@ pub enum SendResult { #[derive(Debug, Clone)] pub struct JobCompleted { - pub job: Arc, + pub job: Arc, pub result: Arc>, pub result_columns: Option>, pub mem_peak: i32, @@ -1881,7 +1913,7 @@ pub struct JobCompleted { } async fn do_nativets( - job: &QueuedJob, + job: &MiniPulledJob, client: &AuthedClientBackgroundTask, env_code: String, code: String, @@ -1923,7 +1955,7 @@ pub struct PreviousResult<'a> { } async fn handle_queued_job( - job: Arc, + job: Arc, raw_code: Option, raw_lock: Option, raw_flow: Option>>, @@ -1942,7 +1974,7 @@ async fn handle_queued_job( ) -> windmill_common::error::Result { // Extract the active span from the context - if job.canceled { + if job.canceled_by.is_some() { return Err(Error::JsonErr(canceled_job_to_result(&job))); } if let Some(e) = &job.pre_run_error { @@ -1981,7 +2013,7 @@ async fn handle_queued_job( } } - if job.is_flow_step { + if job.is_flow_step() { let _ = update_flow_status_in_progress( db, &job.workspace_id, @@ -2022,7 +2054,7 @@ async fn handle_queued_job( // Pre-fetch preview jobs raw values if necessary. // The `raw_*` values passed to this function are the original raw values from `queue` tables, // they are kept for backward compatibility as they have been moved to the `job` table. - let preview_data = match (job.job_kind, job.script_hash) { + let preview_data = match (job.kind, job.runnable_id) { ( JobKind::Preview | JobKind::Dependencies @@ -2085,7 +2117,7 @@ async fn handle_queued_job( let flow_data = match preview_data { Some(RawData::Flow(data)) => data, // Not a preview: fetch from the cache or the database. - _ => cache::job::fetch_flow(db, job.job_kind, job.script_hash).await?, + _ => cache::job::fetch_flow(db, job.kind, job.runnable_id).await?, }; handle_flow( job, @@ -2140,7 +2172,7 @@ async fn handle_queued_job( let mut column_order: Option> = None; let mut new_args: Option>> = None; - let result = match job.job_kind { + let result = match job.kind { JobKind::Dependencies => { handle_dependency_job( &job, @@ -2327,7 +2359,7 @@ pub async fn get_script_content_by_hash( #[tracing::instrument(level = "trace", skip_all)] async fn handle_code_execution_job( - job: &QueuedJob, + job: &MiniPulledJob, preview: Option>, db: &sqlx::Pool, client: &AuthedClientBackgroundTask, @@ -2343,7 +2375,7 @@ async fn handle_code_execution_job( killpill_rx: &mut tokio::sync::broadcast::Receiver<()>, ) -> error::Result> { let script_hash = || { - job.script_hash + job.runnable_id .ok_or_else(|| Error::internal_err("expected script hash")) }; let (arc_data, arc_metadata, data, metadata): ( @@ -2352,11 +2384,9 @@ async fn handle_code_execution_job( ScriptData, ScriptMetadata, ); - let (ScriptData { code, lock }, ScriptMetadata { language, envs, codebase }) = match job - .job_kind - { + let (ScriptData { code, lock }, ScriptMetadata { language, envs, codebase }) = match job.kind { JobKind::Preview => { - let codebase = match job.script_hash.map(|x| x.0) { + let codebase = match job.runnable_id.map(|x| x.0) { Some(PREVIEW_IS_CODEBASE_HASH) => Some(job.id.to_string()), Some(PREVIEW_IS_TAR_CODEBASE_HASH) => Some(format!("{}.tar", job.id)), _ => None, @@ -2364,12 +2394,13 @@ async fn handle_code_execution_job( arc_data = preview.ok_or_else(|| Error::internal_err("expected preview".to_string()))?; - metadata = ScriptMetadata { language: job.language, codebase, envs: None }; + metadata = ScriptMetadata { language: job.script_lang, codebase, envs: None }; (arc_data.as_ref(), &metadata) } JobKind::Script_Hub => { let ContentReqLangEnvs { content, lockfile, language, envs, codebase } = - get_hub_script_content_and_requirements(job.script_path.as_ref(), Some(db)).await?; + get_hub_script_content_and_requirements(job.runnable_path.as_ref(), Some(db)) + .await?; data = ScriptData { code: content, lock: lockfile }; metadata = ScriptMetadata { language, envs, codebase }; (&data, &metadata) @@ -2380,17 +2411,17 @@ async fn handle_code_execution_job( } JobKind::FlowScript => { arc_data = cache::flow::fetch_script(db, FlowNodeId(script_hash()?.0)).await?; - metadata = ScriptMetadata { language: job.language, envs: None, codebase: None }; + metadata = ScriptMetadata { language: job.script_lang, envs: None, codebase: None }; (arc_data.as_ref(), &metadata) } JobKind::AppScript => { arc_data = cache::app::fetch_script(db, AppScriptId(script_hash()?.0)).await?; - metadata = ScriptMetadata { language: job.language, envs: None, codebase: None }; + metadata = ScriptMetadata { language: job.script_lang, envs: None, codebase: None }; (arc_data.as_ref(), &metadata) } JobKind::DeploymentCallback => { let script_path = job - .script_path + .runnable_path .as_ref() .ok_or_else(|| Error::internal_err("expected script path".to_string()))?; if script_path.starts_with("hub/") { @@ -2419,7 +2450,7 @@ async fn handle_code_execution_job( ), }; - let language = *language; + let language = language.clone(); if language == Some(ScriptLang::Postgresql) { return do_postgresql( job, @@ -2614,7 +2645,7 @@ async fn handle_code_execution_job( } let lang_str = job - .language + .script_lang .as_ref() .map(|x| format!("{x:?}")) .unwrap_or_else(|| "NO_LANG".to_string()); @@ -2626,8 +2657,8 @@ async fn handle_code_execution_job( job.id ); - let shared_mount = if job.same_worker && job.language != Some(ScriptLang::Deno) { - let folder = if job.language == Some(ScriptLang::Go) { + let shared_mount = if job.same_worker && job.script_lang != Some(ScriptLang::Deno) { + let folder = if job.script_lang == Some(ScriptLang::Go) { "/go" } else { "" diff --git a/backend/windmill-worker/src/worker_flow.rs b/backend/windmill-worker/src/worker_flow.rs index 50f6ee8607..6a8544d722 100644 --- a/backend/windmill-worker/src/worker_flow.rs +++ b/backend/windmill-worker/src/worker_flow.rs @@ -40,7 +40,7 @@ use windmill_common::flow_status::{ use windmill_common::flows::{add_virtual_items_if_necessary, Branch, FlowNodeId}; use windmill_common::jobs::{ script_hash_to_tag_and_limits, script_path_to_payload, JobKind, JobPayload, OnBehalfOf, - QueuedJob, RawCode, ENTRYPOINT_OVERRIDE, + RawCode, ENTRYPOINT_OVERRIDE, }; use windmill_common::scripts::ScriptHash; use windmill_common::users::username_to_permissioned_as; @@ -56,8 +56,9 @@ use windmill_common::{ }; use windmill_queue::schedule::get_schedule_opt; use windmill_queue::{ - add_completed_job, add_completed_job_error, append_logs, handle_maybe_scheduled_job, - CanceledBy, PushArgs, PushIsolationLevel, WrappedError, + add_completed_job, add_completed_job_error, append_logs, get_mini_pulled_job, + handle_maybe_scheduled_job, CanceledBy, MiniPulledJob, PushArgs, PushIsolationLevel, + WrappedError, }; type DB = sqlx::Pool; @@ -82,7 +83,7 @@ pub async fn update_flow_status_after_job_completion( worker_name: &str, job_completed_tx: Sender, #[cfg(feature = "benchmark")] bench: &mut BenchmarkIter, -) -> error::Result>> { +) -> error::Result>> { // this is manual tailrecursion because async_recursion blows up the stack potentially_crash_for_testing(); @@ -166,7 +167,7 @@ pub async fn update_flow_status_after_job_completion( pub enum UpdateFlowStatusAfterJobCompletion { Rec(RecUpdateFlowStatusAfterJobCompletion), - Done(Arc), + Done(Arc), NotDone, NonLastParallelBranch, } @@ -217,11 +218,11 @@ pub async fn update_flow_status_after_job_completion_internal( let (job_kind, script_hash, old_status, raw_flow) = sqlx::query!( "SELECT - job_kind AS \"job_kind!: JobKind\", - script_hash AS \"script_hash: ScriptHash\", + kind AS \"job_kind!: JobKind\", + runnable_id AS \"script_hash: ScriptHash\", flow_status AS \"flow_status!: Json>\", raw_flow AS \"raw_flow: Json>\" - FROM v2_as_queue WHERE id = $1 AND workspace_id = $2 LIMIT 1", + FROM v2_job INNER JOIN v2_job_status ON v2_job.id = v2_job_status.id WHERE v2_job.id = $1 AND v2_job.workspace_id = $2 LIMIT 1", flow, w_id ) @@ -811,6 +812,13 @@ pub async fn update_flow_status_after_job_completion_internal( old_status.step }; + // tracing::error!( + // "step_counter: {:?} {} {inc_step_counter} {flow}", + // step_counter, + // old_status.step, + // ); + // panic!("stop"); + /* is_last_step is true when the step_counter (the next step index) is an invalid index */ let is_last_step = usize::try_from(step_counter) .map(|i| !(..old_status.modules.len()).contains(&i)) @@ -962,26 +970,20 @@ pub async fn update_flow_status_after_job_completion_internal( .context("remove flow status retry")?; } - let flow_job = sqlx::query_as::<_, QueuedJob>( - "SELECT * FROM v2_as_queue WHERE id = $1 AND workspace_id = $2", - ) - .bind(flow) - .bind(w_id) - .fetch_optional(&mut *tx) - .await - .map_err(Into::::into)? - .ok_or_else(|| Error::internal_err(format!("requiring flow to be in the queue")))?; + let flow_job = get_mini_pulled_job(&mut *tx, &flow) + .await? + .ok_or_else(|| Error::internal_err(format!("requiring flow to be in the queue")))?; tx.commit().await?; let job_root = flow_job - .root_job + .flow_innermost_root_job .map(|x| x.to_string()) .unwrap_or_else(|| "none".to_string()); tracing::info!(id = %flow_job.id, root_id = %job_root, "update flow status"); let should_continue_flow = match success { _ if stop_early => false, - _ if flow_job.canceled => false, + _ if flow_job.is_canceled() => false, true => !is_last_step, false if unrecoverable => false, false if skip_branch_failure || skip_loop_failures || continue_on_error => { @@ -1039,7 +1041,7 @@ pub async fn update_flow_status_after_job_completion_internal( let done = if !should_continue_flow { { - let logs = if flow_job.canceled { + let logs = if flow_job.is_canceled() { "Flow job canceled\n".to_string() } else if stop_early { format!("Flow job stopped early because of a stop early predicate returning true\n") @@ -1078,7 +1080,7 @@ pub async fn update_flow_status_after_job_completion_internal( })?; } } - if flow_job.canceled { + if flow_job.is_canceled() { add_completed_job_error( db, &flow_job, @@ -1182,7 +1184,7 @@ pub async fn update_flow_status_after_job_completion_internal( let _ = tokio::fs::remove_dir_all(format!("{worker_dir}/{}", flow_job.id)).await; } - if flow_job.is_flow_step { + if flow_job.is_flow_step() { if let Some(parent_job) = flow_job.parent_job { tracing::info!(subflow_id = %flow_job.id, parent_id = %parent_job, "subflow is finished, updating parent flow status"); @@ -1539,7 +1541,7 @@ async fn transform_input( #[instrument(level = "trace", skip_all)] pub async fn handle_flow( - flow_job: Arc, + flow_job: Arc, flow_data: &cache::FlowData, db: &sqlx::Pool, client: &AuthedClient, @@ -1554,13 +1556,14 @@ pub async fn handle_flow( .parse_flow_status() .with_context(|| "Unable to parse flow status")?; - if !flow_job.is_flow_step + let schedule_path = flow_job.schedule_path(); + if !flow_job.is_flow_step() && status.retry.fail_count == 0 - && flow_job.schedule_path.is_some() - && flow_job.script_path.is_some() + && schedule_path.is_some() + && flow_job.runnable_path.is_some() && status.step == 0 { - let schedule_path = flow_job.schedule_path.as_ref().unwrap(); + let schedule_path = schedule_path.as_ref().unwrap(); let schedule = get_schedule_opt(db, &flow_job.workspace_id, schedule_path) .warn_after_seconds(5) @@ -1571,7 +1574,7 @@ pub async fn handle_flow( db, &flow_job, &schedule, - flow_job.script_path.as_ref().unwrap(), + flow_job.runnable_path.as_ref().unwrap(), &flow_job.workspace_id, ) .warn_after_seconds(5) @@ -1652,13 +1655,13 @@ lazy_static::lazy_static! { } struct PushNextFlowJobRec { - flow_job: Arc, + flow_job: Arc, status: FlowStatus, } // #[async_recursion] // #[instrument(level = "trace", skip_all)] async fn push_next_flow_job( - flow_job: Arc, + flow_job: Arc, mut status: FlowStatus, flow: &FlowValue, db: &sqlx::Pool, @@ -1670,7 +1673,7 @@ async fn push_next_flow_job( worker_name: &str, ) -> error::Result> { let job_root = flow_job - .root_job + .flow_innermost_root_job .map(|x| x.to_string()) .unwrap_or_else(|| "none".to_string()); tracing::info!(id = %flow_job.id, root_id = %job_root, "pushing next flow job"); @@ -1690,7 +1693,7 @@ async fn push_next_flow_job( Step::FailureStep => status.failure_module.module_status.clone(), }; - let fj: mappable_rc::Marc = flow_job.clone().into(); + let fj: mappable_rc::Marc = flow_job.clone().into(); let arc_flow_job_args: Marc>> = Marc::map(fj, |x| { if let Some(args) = &x.args { &args.0 @@ -1727,10 +1730,11 @@ async fn push_next_flow_job( } if matches!(step, Step::Step(0)) { - if !flow_job.is_flow_step && flow_job.schedule_path.is_some() { + if !flow_job.is_flow_step() && flow_job.schedule_path().is_some() { + let schedule_path = flow_job.schedule_path(); let no_flow_overlap = sqlx::query_scalar!( "SELECT no_flow_overlap FROM schedule WHERE path = $1 AND workspace_id = $2", - flow_job.schedule_path.as_ref().unwrap(), + schedule_path.as_ref().unwrap(), flow_job.workspace_id.as_str() ) .fetch_one(db) @@ -1748,10 +1752,10 @@ async fn push_next_flow_job( AND parent_job IS NULL AND j.id != $3 AND running = true", - flow_job.schedule_path.as_ref().unwrap(), + schedule_path.as_ref().unwrap(), flow_job.workspace_id.as_str(), flow_job.id, - flow_job.script_path.as_ref().unwrap() + flow_job.runnable_path() ) .fetch_all(db) .await?; @@ -1966,7 +1970,7 @@ async fn push_next_flow_job( .permissioned_as .trim_start_matches("u/") .to_string(), - email: flow_job.email.clone(), + email: flow_job.permissioned_as_email.clone(), username_override: None, }; @@ -2056,9 +2060,8 @@ async fn push_next_flow_job( sqlx::query!( "UPDATE v2_job_runtime SET ping = NULL - WHERE id = $1 AND ping = $2", + WHERE id = $1", flow_job.id, - flow_job.last_ping ) .execute(&mut *tx) .await?; @@ -2464,8 +2467,8 @@ async fn push_next_flow_job( // Also check `flow_job.same_worker` for [`JobKind::Flow`] jobs as it's no // more reflected to the flow value on push. let job_same_worker = flow_job.same_worker - && matches!(flow_job.job_kind, JobKind::Flow) - && flow_job.script_hash.is_some(); + && matches!(flow_job.kind, JobKind::Flow) + && flow_job.runnable_id.is_some(); let continue_on_same_worker = (flow.same_worker || job_same_worker) && module.suspend.is_none() && module.sleep.is_none(); @@ -2635,12 +2638,17 @@ async fn push_next_flow_job( } { None } else { - flow_job.root_job.or_else(|| Some(flow_job.id)) + flow_job + .flow_innermost_root_job + .or_else(|| Some(flow_job.id)) }; // forward root job permissions to the new job let job_perms: Option = if JOB_TOKEN.is_none() { - if let Some(root_job) = &flow_job.root_job.or_else(|| Some(flow_job.id)) { + if let Some(root_job) = &flow_job + .flow_innermost_root_job + .or_else(|| Some(flow_job.id)) + { sqlx::query_as!( JobPerms, "SELECT * FROM job_perms WHERE job_id = $1 AND workspace_id = $2", @@ -2670,7 +2678,10 @@ async fn push_next_flow_job( { (&on_behalf_of.email, on_behalf_of.permissioned_as.clone()) } else { - (&flow_job.email, flow_job.permissioned_as.to_owned()) + ( + &flow_job.permissioned_as_email, + flow_job.permissioned_as.to_owned(), + ) }; let tx2 = PushIsolationLevel::Transaction(tx); let (uuid, mut inner_tx) = push( @@ -2683,7 +2694,7 @@ async fn push_next_flow_job( email, permissioned_as, scheduled_for_o, - flow_job.schedule_path.clone(), + flow_job.schedule_path(), Some(flow_job.id), root_job, None, @@ -3119,22 +3130,22 @@ fn payload_from_modules<'a>( }) } -fn get_path(flow_job: &QueuedJob, status: &FlowStatus, module: &FlowModule) -> String { +fn get_path(flow_job: &MiniPulledJob, status: &FlowStatus, module: &FlowModule) -> String { if status .preprocessor_module .as_ref() .is_some_and(|x| x.id() == module.id) { - format!("{}/preprocessor", flow_job.script_path()) + format!("{}/preprocessor", flow_job.runnable_path()) } else { - format!("{}/{}", flow_job.script_path(), module.id) + format!("{}/{}", flow_job.runnable_path(), module.id) } } async fn compute_next_flow_transform( arc_flow_job_args: Marc>>, arc_last_job_result: Arc>, - flow_job: &QueuedJob, + flow_job: &MiniPulledJob, flow: &FlowValue, by_id: Option, db: &DB, @@ -3299,7 +3310,7 @@ async fn compute_next_flow_transform( /* forloop modules are expected set `iter: { value: Value, index: usize }` as job arguments */ FlowModuleValue::ForloopFlow { modules, modules_node, iterator, parallel, .. } => { // if it's a simple single step flow, we will collapse it as an optimization and need to pass flow_input as an arg - let is_simple = !matches!(flow_job.job_kind, JobKind::FlowPreview) + let is_simple = !matches!(flow_job.kind, JobKind::FlowPreview) && !parallel && is_simple_modules(&modules, flow.failure_module.as_ref()); @@ -3370,7 +3381,7 @@ async fn compute_next_flow_transform( flow.failure_module.as_ref(), flow.same_worker, || format!("{}-{i}", status.step), - || format!("{}/forloop-{i}", flow_job.script_path()), + || format!("{}/forloop-{i}", flow_job.runnable_path()), true, ) else { return None; @@ -3460,7 +3471,7 @@ async fn compute_next_flow_transform( flow.failure_module.as_ref(), flow.same_worker, || status.step.to_string(), - || format!("{}/branchone-{}", flow_job.script_path(), branch_idx), + || format!("{}/branchone-{}", flow_job.runnable_path(), branch_idx), true, ) else { return Ok(NextFlowTransform::EmptyInnerFlows { branch_chosen: Some(branch) }); @@ -3496,7 +3507,7 @@ async fn compute_next_flow_transform( flow.failure_module.as_ref(), flow.same_worker, || format!("{}-{i}", status.step), - || format!("{}/branchall-{}", flow_job.script_path(), i), + || format!("{}/branchall-{}", flow_job.runnable_path(), i), false, ) else { return None; @@ -3563,7 +3574,7 @@ async fn compute_next_flow_transform( || { format!( "{}/branchall-{}", - flow_job.script_path(), + flow_job.runnable_path(), branch_status.branch ) }, @@ -3598,13 +3609,13 @@ async fn next_loop_iteration( ns: ForloopNextIteration, modules: Vec, modules_node: Option, - flow_job: &QueuedJob, + flow_job: &MiniPulledJob, is_simple: bool, db: &sqlx::Pool, module: &FlowModule, delete_after_use: bool, ) -> Result { - let inner_path = || format!("{}/loop-{}", flow_job.script_path(), ns.index); + let inner_path = || format!("{}/loop-{}", flow_job.runnable_path(), ns.index); if is_simple { let mut value = modules[0].get_value()?; let simple_input_transforms = match &mut value { @@ -3669,7 +3680,7 @@ pub(super) fn is_simple_modules( async fn next_forloop_status( status_module: &FlowStatusModule, by_id: Option, - flow_job: &QueuedJob, + flow_job: &MiniPulledJob, previous_id: &str, status: &FlowStatus, iterator: &InputTransform, @@ -3808,7 +3819,7 @@ async fn next_forloop_status( async fn payload_from_simple_module( value: FlowModuleValue, db: &sqlx::Pool, - flow_job: &QueuedJob, + flow_job: &MiniPulledJob, module: &FlowModule, inner_path: String, ) -> Result { @@ -3929,7 +3940,7 @@ async fn script_to_payload( script_hash: Option, script_path: String, db: &sqlx::Pool, - flow_job: &QueuedJob, + flow_job: &MiniPulledJob, module: &FlowModule, tag_override: Option, ) -> Result { @@ -4003,7 +4014,7 @@ async fn script_to_payload( } async fn get_transform_context( - flow_job: &QueuedJob, + flow_job: &MiniPulledJob, previous_id: &str, status: &FlowStatus, ) -> error::Result { diff --git a/backend/windmill-worker/src/worker_lockfiles.rs b/backend/windmill-worker/src/worker_lockfiles.rs index 7bf0929448..a2679913da 100644 --- a/backend/windmill-worker/src/worker_lockfiles.rs +++ b/backend/windmill-worker/src/worker_lockfiles.rs @@ -22,7 +22,6 @@ use windmill_common::{ cache::{self, RawData}, error::{self, to_anyhow}, flows::{add_virtual_items_if_necessary, FlowValue}, - jobs::QueuedJob, scripts::ScriptLang, DB, }; @@ -30,7 +29,7 @@ use windmill_git_sync::{handle_deployment_metadata, DeployedObject}; #[cfg(feature = "python")] use windmill_parser_py_imports::parse_relative_imports; use windmill_parser_ts::parse_expr_for_imports; -use windmill_queue::{append_logs, CanceledBy, PushIsolationLevel}; +use windmill_queue::{append_logs, CanceledBy, MiniPulledJob, PushIsolationLevel}; use crate::common::OccupancyMetrics; use crate::csharp_executor::generate_nuget_lockfile; @@ -217,7 +216,7 @@ pub fn extract_relative_imports( } #[tracing::instrument(level = "trace", skip_all)] pub async fn handle_dependency_job( - job: &QueuedJob, + job: &MiniPulledJob, preview_data: Option<&RawData>, mem_peak: &mut i32, canceled_by: &mut Option, @@ -229,7 +228,7 @@ pub async fn handle_dependency_job( token: &str, occupancy_metrics: &mut OccupancyMetrics, ) -> error::Result> { - let script_path = job.script_path(); + let script_path = job.runnable_path(); let raw_deps = job .args .as_ref() @@ -239,7 +238,7 @@ pub async fn handle_dependency_job( }) .unwrap_or(false); let npm_mode = if job - .language + .script_lang .as_ref() .map(|v| v == &ScriptLang::Bun) .unwrap_or(false) @@ -260,7 +259,7 @@ pub async fn handle_dependency_job( // `JobKind::Dependencies` job store either: // - A saved script `hash` in the `script_hash` column. // - Preview raw lock and code in the `queue` or `job` table. - let script_data = match job.script_hash { + let script_data = match job.runnable_id { Some(hash) => &cache::script::fetch(db, hash).await?.0, _ => match preview_data { Some(RawData::Script(data)) => data, @@ -269,7 +268,7 @@ pub async fn handle_dependency_job( }; let content = capture_dependency_job( &job.id, - job.language.as_ref().map(|v| Ok(v)).unwrap_or_else(|| { + job.script_lang.as_ref().map(|v| Ok(v)).unwrap_or_else(|| { Err(Error::internal_err( "Job Language required for dependency jobs".to_owned(), )) @@ -293,14 +292,14 @@ pub async fn handle_dependency_job( match content { Ok(content) => { - if job.script_hash.is_none() { + if job.runnable_id.is_none() { // it a one-off raw script dependency job, no need to update the db return Ok(to_raw_value_owned( json!({ "status": "Successful lock file generation", "lock": content }), )); } - let hash = job.script_hash.unwrap_or(ScriptHash(0)); + let hash = job.runnable_id.unwrap_or(ScriptHash(0)); let w_id = &job.workspace_id; sqlx::query!( "UPDATE script SET lock = $1 WHERE hash = $2 AND workspace_id = $3", @@ -318,7 +317,7 @@ pub async fn handle_dependency_job( get_deployment_msg_and_parent_path_from_args(job.args.clone()); if let Err(e) = handle_deployment_metadata( - &job.email, + &job.permissioned_as_email, &job.created_by, &db, &w_id, @@ -336,7 +335,7 @@ pub async fn handle_dependency_job( } let relative_imports = - extract_relative_imports(&script_data.code, script_path, &job.language); + extract_relative_imports(&script_data.code, script_path, &job.script_lang); if let Some(relative_imports) = relative_imports { update_script_dependency_map( &job.id, @@ -362,7 +361,7 @@ pub async fn handle_dependency_job( script_path, deployment_message, parent_path, - &job.email, + &job.permissioned_as_email, &job.created_by, &job.permissioned_as, db, @@ -391,7 +390,7 @@ pub async fn handle_dependency_job( sqlx::query!( "UPDATE script SET lock_error_logs = $1 WHERE hash = $2 AND workspace_id = $3", &format!("{logs2}\n{error}"), - &job.script_hash.unwrap_or(ScriptHash(0)).0, + &job.runnable_id.unwrap_or(ScriptHash(0)).0, &job.workspace_id ) .execute(db) @@ -546,7 +545,7 @@ async fn trigger_dependents_to_recompute_dependencies( } pub async fn handle_flow_dependency_job( - job: &QueuedJob, + job: &MiniPulledJob, preview_data: Option<&RawData>, mem_peak: &mut i32, canceled_by: &mut Option, @@ -558,7 +557,7 @@ pub async fn handle_flow_dependency_job( token: &str, occupancy_metrics: &mut OccupancyMetrics, ) -> error::Result> { - let job_path = job.script_path.clone().ok_or_else(|| { + let job_path = job.runnable_path.clone().ok_or_else(|| { error::Error::internal_err( "Cannot resolve flow dependencies for flow without path".to_string(), ) @@ -579,7 +578,7 @@ pub async fn handle_flow_dependency_job( None } else { Some( - job.script_hash + job.runnable_id .clone() .ok_or_else(|| { Error::internal_err( @@ -606,7 +605,7 @@ pub async fn handle_flow_dependency_job( // `JobKind::FlowDependencies` job store either: // - A saved flow version `id` in the `script_hash` column. // - Preview raw flow in the `queue` or `job` table. - let mut flow = match job.script_hash { + let mut flow = match job.runnable_id { Some(ScriptHash(id)) => cache::flow::fetch_version(db, id).await?, _ => match preview_data { Some(RawData::Flow(data)) => data.clone(), @@ -664,7 +663,7 @@ pub async fn handle_flow_dependency_job( sqlx::query!( "UPDATE flow SET lock_error_logs = $1 WHERE path = $2 AND workspace_id = $3", &format!("{logs2}\n{error_message}"), - &job.script_path(), + &job.runnable_path(), &job.workspace_id ) .execute(db) @@ -677,7 +676,7 @@ pub async fn handle_flow_dependency_job( } else { sqlx::query!( "UPDATE flow SET lock_error_logs = NULL WHERE path = $1 AND workspace_id = $2", - &job.script_path(), + &job.runnable_path(), &job.workspace_id ) .execute(db) @@ -746,7 +745,7 @@ pub async fn handle_flow_dependency_job( tx.commit().await?; if let Err(e) = handle_deployment_metadata( - &job.email, + &job.permissioned_as_email, &job.created_by, &db, &job.workspace_id, @@ -799,7 +798,7 @@ struct LockModuleError { async fn lock_modules<'c>( modules: Vec, - job: &QueuedJob, + job: &MiniPulledJob, mem_peak: &mut i32, canceled_by: &mut Option, job_dir: &str, @@ -1402,7 +1401,7 @@ fn skip_creating_new_lock(language: &ScriptLang, content: &str) -> bool { #[async_recursion] async fn lock_modules_app( value: Value, - job: &QueuedJob, + job: &MiniPulledJob, mem_peak: &mut i32, canceled_by: &mut Option, job_dir: &str, @@ -1454,7 +1453,7 @@ async fn lock_modules_app( worker_dir, base_internal_url, token, - &format!("{}/app", job.script_path()), + &format!("{}/app", job.runnable_path()), false, None, occupancy_metrics, @@ -1550,7 +1549,7 @@ async fn lock_modules_app( } pub async fn handle_app_dependency_job( - job: &QueuedJob, + job: &MiniPulledJob, mem_peak: &mut i32, canceled_by: &mut Option, job_dir: &str, @@ -1561,14 +1560,14 @@ pub async fn handle_app_dependency_job( token: &str, occupancy_metrics: &mut OccupancyMetrics, ) -> error::Result<()> { - let job_path = job.script_path.clone().ok_or_else(|| { + let job_path = job.runnable_path.clone().ok_or_else(|| { error::Error::internal_err( "Cannot resolve app dependencies for app without path".to_string(), ) })?; let id = job - .script_hash + .runnable_id .clone() .ok_or_else(|| Error::internal_err("App Dependency requires script hash".to_owned()))? .0; @@ -1632,7 +1631,7 @@ pub async fn handle_app_dependency_job( get_deployment_msg_and_parent_path_from_args(job.args.clone()); if let Err(e) = handle_deployment_metadata( - &job.email, + &job.permissioned_as_email, &job.created_by, &db, &job.workspace_id, diff --git a/frontend/src/lib/components/runs/JobLoader.svelte b/frontend/src/lib/components/runs/JobLoader.svelte index 5789cdc76d..e924151f53 100644 --- a/frontend/src/lib/components/runs/JobLoader.svelte +++ b/frontend/src/lib/components/runs/JobLoader.svelte @@ -18,6 +18,7 @@ export let jobs: Job[] | undefined export let user: string | null export let label: string | null = null + export let worker: string | null = null export let folder: string | null export let path: string | null export let success: 'success' | 'suspended' | 'waiting' | 'failure' | 'running' | undefined = @@ -61,6 +62,7 @@ (path && label && success && + worker && isSkipped != undefined && jobKinds && concurrencyKey && @@ -173,6 +175,7 @@ hasNullParent: jobKindsCat != 'all' ? true : undefined, label: label === null || label === '' ? undefined : label, tag: tag === null || tag === '' ? undefined : tag, + worker: worker === null || worker === '' ? undefined : worker, isNotSchedule: showSchedules == false ? true : undefined, suspended: success == 'waiting' ? false : success == 'suspended' ? true : undefined, scheduledForBeforeNow: diff --git a/frontend/src/lib/components/runs/JobPreview.svelte b/frontend/src/lib/components/runs/JobPreview.svelte index 2dcf08946f..e22adf235b 100644 --- a/frontend/src/lib/components/runs/JobPreview.svelte +++ b/frontend/src/lib/components/runs/JobPreview.svelte @@ -106,7 +106,7 @@ {#if concurrencyKey} - This jobs has concurrency limits enabled with the key: + This job has concurrency limits enabled with the key: + + Worker: {truncateRev(job.worker, 20)} + + {/if}
@@ -151,7 +159,8 @@ { label: 'Schedule path', value: 'schedulePath' }, { label: 'Concurrency key', value: 'concurrencyKey' }, { label: 'Label', value: 'label' }, - { label: 'Tag', value: 'tag' } + { label: 'Tag', value: 'tag' }, + { label: 'Worker', value: 'worker' } ]} {item} bind:selected={filterBy} @@ -415,6 +424,40 @@ />