Compare commits

..
Author SHA1 Message Date
Ruben FiszelandClaude Opus 4.5 db4df60fb8 fix: create parent dirs in script new and accept python as language alias
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-24 13:10:03 +00:00
60 changed files with 271 additions and 667 deletions
-25
View File
@@ -1,30 +1,5 @@
# Changelog
## [1.663.0](https://github.com/windmill-labs/windmill/compare/v1.662.0...v1.663.0) (2026-03-24)
### Features
* add summary field for native triggers ([#8476](https://github.com/windmill-labs/windmill/issues/8476)) ([5089a45](https://github.com/windmill-labs/windmill/commit/5089a458819abbc6f241bc354bebb91520bd1a52))
* add typed request body to OpenAPI spec generation ([#8481](https://github.com/windmill-labs/windmill/issues/8481)) ([37ebaf4](https://github.com/windmill-labs/windmill/commit/37ebaf4d0ac342703498733f97778a552f979f6a))
* **cli:** better stale scripts detection [#3](https://github.com/windmill-labs/windmill/issues/3) ([#8480](https://github.com/windmill-labs/windmill/issues/8480)) ([9643006](https://github.com/windmill-labs/windmill/commit/9643006f1e90b991b334bb58caf62301bc26d09d))
* Debounce node ([#8324](https://github.com/windmill-labs/windmill/issues/8324)) ([5d1c54d](https://github.com/windmill-labs/windmill/commit/5d1c54d9b33d6ff6f2c98481a2740d1e7629cdfa))
* surface permissioned_as selector in trigger editor UI ([#8475](https://github.com/windmill-labs/windmill/issues/8475)) ([f035b53](https://github.com/windmill-labs/windmill/commit/f035b538bbd786445526339f88be8f33a3628105))
### Bug Fixes
* clean up stale dependency map entries for renamed scripts ([#8492](https://github.com/windmill-labs/windmill/issues/8492)) ([47c0c36](https://github.com/windmill-labs/windmill/commit/47c0c363f4fc1d9af7efd07ea172e32989ce50d2))
* **cli:** add Svelte 5 event delegation guidance and safe push to raw-app skill ([#8466](https://github.com/windmill-labs/windmill/issues/8466)) ([911df95](https://github.com/windmill-labs/windmill/commit/911df958e78d2dab9823dfa7d7e5c9824fc2d565))
* Fix worker panic when job_isolation changed to unshare at runtime ([#8490](https://github.com/windmill-labs/windmill/issues/8490)) ([cbe47c0](https://github.com/windmill-labs/windmill/commit/cbe47c0b6c22f79452d020777e481ee26970f25b))
* improve SQS retries ([3c8d351](https://github.com/windmill-labs/windmill/commit/3c8d351c9722a089133871019d27cf3bc3cdc159))
* Move database manager SQL queries to backend ([#8306](https://github.com/windmill-labs/windmill/issues/8306)) ([aa30fd2](https://github.com/windmill-labs/windmill/commit/aa30fd252dcf40233d191c43a6293fb9feabf010))
* prevent SQL injection in job query parameters ([#8494](https://github.com/windmill-labs/windmill/issues/8494)) ([54f5a19](https://github.com/windmill-labs/windmill/commit/54f5a19377e9df712e18f85f896e21b1776981ed))
* respect NO_COLOR env variable for stdout log output ([#8483](https://github.com/windmill-labs/windmill/issues/8483)) ([f329ee7](https://github.com/windmill-labs/windmill/commit/f329ee7aaefbae0ad344743c40825440a936bd30))
* show effective isolation level on workers page ([#8491](https://github.com/windmill-labs/windmill/issues/8491)) ([37886ed](https://github.com/windmill-labs/windmill/commit/37886edda1443293806a9b1b810196b72e076b12))
* skip debounce arg accumulation when batch table is empty (CE) ([#8485](https://github.com/windmill-labs/windmill/issues/8485)) ([010753c](https://github.com/windmill-labs/windmill/commit/010753c73ac85237af50acadf9c08567b1bc993c))
* stop_after_if with empty error_message prevents flow from stopping ([#8464](https://github.com/windmill-labs/windmill/issues/8464)) ([1503bf9](https://github.com/windmill-labs/windmill/commit/1503bf948e3340b8a6933d71885f8f2cb8dc1867))
## [1.662.0](https://github.com/windmill-labs/windmill/compare/v1.661.0...v1.662.0) (2026-03-20)
@@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
"query": "\n SELECT\n external_id,\n workspace_id,\n service_name AS \"service_name!: ServiceName\",\n script_path,\n is_flow,\n webhook_token_hash,\n service_config,\n error,\n created_at,\n updated_at,\n summary\n FROM\n native_trigger\n WHERE\n workspace_id = $1\n AND service_name = $2\n AND script_path = $3\n AND is_flow = $4\n LIMIT 1\n ",
"query": "\n SELECT\n external_id,\n workspace_id,\n service_name AS \"service_name!: ServiceName\",\n script_path,\n is_flow,\n webhook_token_hash,\n service_config,\n error,\n created_at,\n updated_at\n FROM\n native_trigger\n WHERE\n workspace_id = $1\n AND service_name = $2\n AND script_path = $3\n AND is_flow = $4\n LIMIT 1\n ",
"describe": {
"columns": [
{
@@ -62,11 +62,6 @@
"ordinal": 9,
"name": "updated_at",
"type_info": "Timestamptz"
},
{
"ordinal": 10,
"name": "summary",
"type_info": "Varchar"
}
],
"parameters": {
@@ -97,9 +92,8 @@
true,
true,
false,
false,
true
false
]
},
"hash": "6dafcc89668fb0e5740f23264b515b1724c36031da39d53ae6c329a479bdf8aa"
"hash": "1a69ef11a3f361f105c2a8af7b7fa182f3953150ade1756259b31a50e9308fce"
}
@@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
"query": "\n UPDATE native_trigger\n SET script_path = $1, is_flow = $2, webhook_token_hash = $3, service_config = $4, summary = $8, error = NULL, updated_at = NOW()\n WHERE\n workspace_id = $5\n AND service_name = $6\n AND external_id = $7\n ",
"query": "\n UPDATE native_trigger\n SET script_path = $1, is_flow = $2, webhook_token_hash = $3, service_config = $4, error = NULL, updated_at = NOW()\n WHERE\n workspace_id = $5\n AND service_name = $6\n AND external_id = $7\n ",
"describe": {
"columns": [],
"parameters": {
@@ -21,11 +21,10 @@
}
}
},
"Text",
"Varchar"
"Text"
]
},
"nullable": []
},
"hash": "bf224f6441c36187f1402f9f01bfe15bb9edfa1dc9052f8a829e486b7334d708"
"hash": "40a8bf6a5a42c275d73221bc5f386f2e18cb911352551d0a34bf1933e558674e"
}
@@ -15,7 +15,7 @@
]
},
"nullable": [
true
null
]
},
"hash": "5a219a2532517869578c4504ff3153c43903f929ae5d62fbba12610f89c36d55"
@@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
"query": "\n INSERT INTO native_trigger (\n external_id,\n workspace_id,\n service_name,\n script_path,\n is_flow,\n webhook_token_hash,\n service_config,\n summary\n ) VALUES (\n $1, $2, $3, $4, $5, $6, $7, $8\n )\n ON CONFLICT (external_id, workspace_id, service_name)\n DO UPDATE SET script_path = $4, is_flow = $5, webhook_token_hash = $6, service_config = $7, summary = $8, error = NULL, updated_at = NOW()\n ",
"query": "\n INSERT INTO native_trigger (\n external_id,\n workspace_id,\n service_name,\n script_path,\n is_flow,\n webhook_token_hash,\n service_config\n ) VALUES (\n $1, $2, $3, $4, $5, $6, $7\n )\n ON CONFLICT (external_id, workspace_id, service_name)\n DO UPDATE SET script_path = $4, is_flow = $5, webhook_token_hash = $6, service_config = $7, error = NULL, updated_at = NOW()\n ",
"describe": {
"columns": [],
"parameters": {
@@ -21,11 +21,10 @@
"Varchar",
"Bool",
"Varchar",
"Jsonb",
"Varchar"
"Jsonb"
]
},
"nullable": []
},
"hash": "1048d1c95270ce1f36c02bce31a2bc8a88935c613bd213b7156299811377db8e"
"hash": "6f9386dfcb4c201525722aee3caa25bf2f3a35d90f7354c7d3aef8a3538a03a7"
}
@@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
"query": "\n SELECT\n nt.external_id,\n nt.workspace_id,\n nt.service_name AS \"service_name!: ServiceName\",\n nt.script_path,\n nt.is_flow,\n nt.webhook_token_hash,\n nt.service_config,\n nt.error,\n nt.created_at,\n nt.updated_at,\n nt.summary\n FROM\n native_trigger nt\n WHERE\n nt.workspace_id = $1 AND\n nt.service_name = $2 AND\n ($5::text IS NULL OR nt.script_path = $5) AND\n ($6::bool IS NULL OR nt.is_flow = $6) AND\n (\n (nt.is_flow = false AND EXISTS (\n SELECT 1 FROM script s\n WHERE s.workspace_id = nt.workspace_id\n AND s.path = nt.script_path\n ))\n OR\n (nt.is_flow = true AND EXISTS (\n SELECT 1 FROM flow f\n WHERE f.workspace_id = nt.workspace_id\n AND f.path = nt.script_path\n ))\n )\n LIMIT $3\n OFFSET $4\n ",
"query": "\n SELECT\n nt.external_id,\n nt.workspace_id,\n nt.service_name AS \"service_name!: ServiceName\",\n nt.script_path,\n nt.is_flow,\n nt.webhook_token_hash,\n nt.service_config,\n nt.error,\n nt.created_at,\n nt.updated_at\n FROM\n native_trigger nt\n WHERE\n nt.workspace_id = $1 AND\n nt.service_name = $2 AND\n ($5::text IS NULL OR nt.script_path = $5) AND\n ($6::bool IS NULL OR nt.is_flow = $6) AND\n (\n (nt.is_flow = false AND EXISTS (\n SELECT 1 FROM script s\n WHERE s.workspace_id = nt.workspace_id\n AND s.path = nt.script_path\n ))\n OR\n (nt.is_flow = true AND EXISTS (\n SELECT 1 FROM flow f\n WHERE f.workspace_id = nt.workspace_id\n AND f.path = nt.script_path\n ))\n )\n LIMIT $3\n OFFSET $4\n ",
"describe": {
"columns": [
{
@@ -62,11 +62,6 @@
"ordinal": 9,
"name": "updated_at",
"type_info": "Timestamptz"
},
{
"ordinal": 10,
"name": "summary",
"type_info": "Varchar"
}
],
"parameters": {
@@ -99,9 +94,8 @@
true,
true,
false,
false,
true
false
]
},
"hash": "b0775af41a9b54cce040bf37cae770e63dab12a1383a0855d105c061e4e4ca48"
"hash": "a115d8ea786907561afdbbc07d11dc715d80b00c0e79b61b0057a3ae3886a85e"
}
@@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
"query": "\n SELECT\n external_id,\n workspace_id,\n service_name AS \"service_name!: ServiceName\",\n script_path,\n is_flow,\n webhook_token_hash,\n service_config,\n error,\n created_at,\n updated_at,\n summary\n FROM\n native_trigger\n WHERE\n workspace_id = $1\n AND service_name = $2\n AND external_id = $3\n ",
"query": "\n SELECT\n external_id,\n workspace_id,\n service_name AS \"service_name!: ServiceName\",\n script_path,\n is_flow,\n webhook_token_hash,\n service_config,\n error,\n created_at,\n updated_at\n FROM\n native_trigger\n WHERE\n workspace_id = $1\n AND service_name = $2\n AND external_id = $3\n ",
"describe": {
"columns": [
{
@@ -62,11 +62,6 @@
"ordinal": 9,
"name": "updated_at",
"type_info": "Timestamptz"
},
{
"ordinal": 10,
"name": "summary",
"type_info": "Varchar"
}
],
"parameters": {
@@ -96,9 +91,8 @@
true,
true,
false,
false,
true
false
]
},
"hash": "15014ce696cf2af4f719a537a4e3ca5b322cc130a35a91f8b8854f5ebdf25ad2"
"hash": "bac545933a627a62b7845d8aab80702443285e4d1d11e5a0f4cd2a3d4add51bb"
}
@@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
"query": "SELECT hash FROM script WHERE path = $1 AND workspace_id = $2 AND deleted = false AND archived = false ORDER BY created_at DESC LIMIT 1",
"query": "SELECT hash FROM script WHERE path = $1 AND workspace_id = $2 AND deleted = false ORDER BY created_at DESC LIMIT 1",
"describe": {
"columns": [
{
@@ -19,5 +19,5 @@
false
]
},
"hash": "a32d7ba43745226fd65328475731526e0b20ea6eeafeb937eb01cdc2cdfcb859"
"hash": "d5661c7557cf3a8dee7cf799cd364d21d38edb827d2c08b0ca7d72311b78d574"
}
+125 -130
View File
@@ -234,9 +234,9 @@ dependencies = [
[[package]]
name = "arc-swap"
version = "1.9.0"
version = "1.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a07d1f37ff60921c83bdfc7407723bdefe89b44b98a9b772f225c8f9d67141a6"
checksum = "f9f3647c145568cec02c42054e07bdf9a5a698e15b466fb2341bfc393cd24aa5"
dependencies = [
"rustversion",
]
@@ -2536,6 +2536,12 @@ version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b"
[[package]]
name = "convert_case"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e"
[[package]]
name = "convert_case"
version = "0.6.0"
@@ -4881,6 +4887,19 @@ dependencies = [
"syn 1.0.109",
]
[[package]]
name = "derive_more"
version = "0.99.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f"
dependencies = [
"convert_case 0.4.0",
"proc-macro2",
"quote",
"rustc_version 0.4.1",
"syn 2.0.117",
]
[[package]]
name = "derive_more"
version = "1.0.0"
@@ -4908,7 +4927,6 @@ dependencies = [
"proc-macro2",
"quote",
"syn 2.0.117",
"unicode-xid",
]
[[package]]
@@ -7401,13 +7419,13 @@ dependencies = [
[[package]]
name = "ipconfig"
version = "0.3.3"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2d72a21f6a71a6c4c3160e095e8925861f5119dd26ef71acee1b9146f74f76c8"
checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f"
dependencies = [
"socket2 0.6.3",
"socket2 0.5.10",
"widestring",
"windows-sys 0.61.2",
"windows-sys 0.48.0",
"winreg",
]
@@ -7428,9 +7446,9 @@ dependencies = [
[[package]]
name = "iri-string"
version = "0.7.11"
version = "0.7.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d8e7418f59cc01c88316161279a7f665217ae316b388e58a0d10e29f54f1e5eb"
checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a"
dependencies = [
"memchr",
"serde",
@@ -7520,7 +7538,7 @@ dependencies = [
"cesu8",
"cfg-if",
"combine",
"jni-sys 0.3.1",
"jni-sys",
"log",
"thiserror 1.0.69",
"walkdir",
@@ -7529,31 +7547,9 @@ dependencies = [
[[package]]
name = "jni-sys"
version = "0.3.1"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258"
dependencies = [
"jni-sys 0.4.1",
]
[[package]]
name = "jni-sys"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2"
dependencies = [
"jni-sys-macros",
]
[[package]]
name = "jni-sys-macros"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264"
dependencies = [
"quote",
"syn 2.0.117",
]
checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130"
[[package]]
name = "jobserver"
@@ -8312,9 +8308,9 @@ dependencies = [
[[package]]
name = "malachite"
version = "0.4.22"
version = "0.4.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2fbdf9cb251732db30a7200ebb6ae5d22fe8e11397364416617d2c2cf0c51cb5"
checksum = "4a6ecab92657eb234bfe98abd0b17920772c6b14ce69256950142e2eb36d000b"
dependencies = [
"malachite-base",
"malachite-nz",
@@ -8335,11 +8331,11 @@ dependencies = [
[[package]]
name = "malachite-bigint"
version = "0.2.3"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d149aaa2965d70381709d9df4c7ee1fc0de1c614a4efc2ee356f5e43d68749f8"
checksum = "17703a19c80bbdd0b7919f0f104f3b0597f7de4fc4e90a477c15366a5ba03faa"
dependencies = [
"derive_more 1.0.0",
"derive_more 0.99.20",
"malachite",
"num-integer",
"num-traits",
@@ -8614,9 +8610,9 @@ dependencies = [
[[package]]
name = "moka"
version = "0.12.15"
version = "0.12.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "957228ad12042ee839f93c8f257b62b4c0ab5eaae1d4fa60de53b27c9d7c5046"
checksum = "85f8024e1c8e71c778968af91d43700ce1d11b219d127d79fb2934153b82b42b"
dependencies = [
"async-lock",
"crossbeam-channel",
@@ -8830,7 +8826,7 @@ version = "0.5.0+25.2.9519653"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691"
dependencies = [
"jni-sys 0.3.1",
"jni-sys",
]
[[package]]
@@ -11667,7 +11663,7 @@ dependencies = [
"once_cell",
"ring 0.17.14",
"rustls-pki-types",
"rustls-webpki 0.103.10",
"rustls-webpki 0.103.9",
"subtle",
"zeroize",
]
@@ -11751,7 +11747,7 @@ dependencies = [
"rustls 0.23.35",
"rustls-native-certs 0.8.3",
"rustls-platform-verifier-android",
"rustls-webpki 0.103.10",
"rustls-webpki 0.103.9",
"security-framework 3.6.0",
"security-framework-sys",
"webpki-root-certs 1.0.6",
@@ -11799,9 +11795,9 @@ dependencies = [
[[package]]
name = "rustls-webpki"
version = "0.103.10"
version = "0.103.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "df33b2b81ac578cabaf06b89b0631153a3f416b0a886e8a7a1707fb51abbd1ef"
checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53"
dependencies = [
"aws-lc-rs",
"ring 0.17.14",
@@ -13881,12 +13877,12 @@ dependencies = [
[[package]]
name = "terminal_size"
version = "0.4.4"
version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "230a1b821ccbd75b185820a1f1ff7b14d21da1e442e22c0863ea5f08771a8874"
checksum = "60b8cb979cb11c32ce1603f8137b22262a9d131aaa5c37b5678025f22b8becd0"
dependencies = [
"rustix 1.1.4",
"windows-sys 0.61.2",
"windows-sys 0.60.2",
]
[[package]]
@@ -14472,9 +14468,9 @@ dependencies = [
[[package]]
name = "toml_parser"
version = "1.1.0+spec-1.1.0"
version = "1.0.10+spec-1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2334f11ee363607eb04df9b8fc8a13ca1715a72ba8662a26ac285c98aabb4011"
checksum = "7df25b4befd31c4816df190124375d5a20c6b6921e2cad937316de3fccd63420"
dependencies = [
"winnow 1.0.0",
]
@@ -15746,7 +15742,7 @@ dependencies = [
[[package]]
name = "windmill"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"async-nats",
@@ -15822,7 +15818,7 @@ dependencies = [
[[package]]
name = "windmill-alerting"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"axum 0.7.9",
"chrono",
@@ -15835,7 +15831,7 @@ dependencies = [
[[package]]
name = "windmill-api"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"argon2",
@@ -15976,7 +15972,7 @@ dependencies = [
[[package]]
name = "windmill-api-agent-workers"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"axum 0.7.9",
"chrono",
@@ -15999,7 +15995,7 @@ dependencies = [
[[package]]
name = "windmill-api-assets"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"axum 0.7.9",
"chrono",
@@ -16012,7 +16008,7 @@ dependencies = [
[[package]]
name = "windmill-api-auth"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"axum 0.7.9",
@@ -16038,7 +16034,7 @@ dependencies = [
[[package]]
name = "windmill-api-client"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"reqwest 0.12.28",
"serde",
@@ -16048,7 +16044,7 @@ dependencies = [
[[package]]
name = "windmill-api-configs"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"axum 0.7.9",
"chrono",
@@ -16065,7 +16061,7 @@ dependencies = [
[[package]]
name = "windmill-api-debug"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"axum 0.7.9",
"base64 0.22.1",
@@ -16088,7 +16084,7 @@ dependencies = [
[[package]]
name = "windmill-api-embeddings"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"axum 0.7.9",
@@ -16111,7 +16107,7 @@ dependencies = [
[[package]]
name = "windmill-api-flow-conversations"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"axum 0.7.9",
"chrono",
@@ -16127,7 +16123,7 @@ dependencies = [
[[package]]
name = "windmill-api-flows"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"axum 0.7.9",
"chrono",
@@ -16147,7 +16143,7 @@ dependencies = [
[[package]]
name = "windmill-api-groups"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"axum 0.7.9",
"chrono",
@@ -16167,7 +16163,7 @@ dependencies = [
[[package]]
name = "windmill-api-inputs"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"axum 0.7.9",
"chrono",
@@ -16181,7 +16177,7 @@ dependencies = [
[[package]]
name = "windmill-api-integration-tests"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"async-nats",
@@ -16209,7 +16205,7 @@ dependencies = [
[[package]]
name = "windmill-api-jobs"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"axum 0.7.9",
@@ -16234,7 +16230,7 @@ dependencies = [
[[package]]
name = "windmill-api-npm-proxy"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"axum 0.7.9",
"flate2",
@@ -16252,7 +16248,7 @@ dependencies = [
[[package]]
name = "windmill-api-openapi"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"axum 0.7.9",
@@ -16264,7 +16260,6 @@ dependencies = [
"serde_json",
"serde_yml",
"sqlx",
"tracing",
"url",
"windmill-api-auth",
"windmill-common",
@@ -16274,7 +16269,7 @@ dependencies = [
[[package]]
name = "windmill-api-schedule"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"axum 0.7.9",
"chrono",
@@ -16294,7 +16289,7 @@ dependencies = [
[[package]]
name = "windmill-api-scripts"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"axum 0.7.9",
"chrono",
@@ -16324,7 +16319,7 @@ dependencies = [
[[package]]
name = "windmill-api-settings"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"axum 0.7.9",
@@ -16351,7 +16346,7 @@ dependencies = [
[[package]]
name = "windmill-api-sse"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"lazy_static",
"serde",
@@ -16363,7 +16358,7 @@ dependencies = [
[[package]]
name = "windmill-api-users"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"argon2",
"axum 0.7.9",
@@ -16386,7 +16381,7 @@ dependencies = [
[[package]]
name = "windmill-api-workers"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"axum 0.7.9",
"chrono",
@@ -16400,7 +16395,7 @@ dependencies = [
[[package]]
name = "windmill-api-workspaces"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"axum 0.7.9",
"chrono",
@@ -16431,7 +16426,7 @@ dependencies = [
[[package]]
name = "windmill-audit"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"chrono",
"lazy_static",
@@ -16445,7 +16440,7 @@ dependencies = [
[[package]]
name = "windmill-autoscaling"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"axum 0.7.9",
@@ -16464,7 +16459,7 @@ dependencies = [
[[package]]
name = "windmill-common"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"aes-gcm",
"anyhow",
@@ -16564,7 +16559,7 @@ dependencies = [
[[package]]
name = "windmill-dep-map"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"chrono",
"itertools 0.14.0",
@@ -16583,7 +16578,7 @@ dependencies = [
[[package]]
name = "windmill-git-sync"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"regex",
"serde",
@@ -16598,7 +16593,7 @@ dependencies = [
[[package]]
name = "windmill-indexer"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"astral-tokio-tar",
@@ -16622,7 +16617,7 @@ dependencies = [
[[package]]
name = "windmill-jseval"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"futures",
@@ -16639,7 +16634,7 @@ dependencies = [
[[package]]
name = "windmill-macros"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"itertools 0.14.0",
"lazy_static",
@@ -16655,7 +16650,7 @@ dependencies = [
[[package]]
name = "windmill-mcp"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"async-trait",
@@ -16676,7 +16671,7 @@ dependencies = [
[[package]]
name = "windmill-native-triggers"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"async-trait",
@@ -16707,7 +16702,7 @@ dependencies = [
[[package]]
name = "windmill-oauth"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"async-oauth2",
@@ -16731,7 +16726,7 @@ dependencies = [
[[package]]
name = "windmill-object-store"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"async-stream",
@@ -16765,7 +16760,7 @@ dependencies = [
[[package]]
name = "windmill-operator"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"futures",
@@ -16783,7 +16778,7 @@ dependencies = [
[[package]]
name = "windmill-parser"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"convert_case 0.6.0",
"serde",
@@ -16792,7 +16787,7 @@ dependencies = [
[[package]]
name = "windmill-parser-bash"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"lazy_static",
@@ -16804,7 +16799,7 @@ dependencies = [
[[package]]
name = "windmill-parser-csharp"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"serde_json",
@@ -16816,7 +16811,7 @@ dependencies = [
[[package]]
name = "windmill-parser-go"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"gosyn",
@@ -16828,7 +16823,7 @@ dependencies = [
[[package]]
name = "windmill-parser-graphql"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"lazy_static",
@@ -16840,7 +16835,7 @@ dependencies = [
[[package]]
name = "windmill-parser-java"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"serde_json",
@@ -16852,7 +16847,7 @@ dependencies = [
[[package]]
name = "windmill-parser-nu"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"nu-parser",
@@ -16863,7 +16858,7 @@ dependencies = [
[[package]]
name = "windmill-parser-php"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"itertools 0.14.0",
@@ -16874,7 +16869,7 @@ dependencies = [
[[package]]
name = "windmill-parser-py"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"itertools 0.14.0",
@@ -16886,7 +16881,7 @@ dependencies = [
[[package]]
name = "windmill-parser-py-asset"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"rustpython-ast",
@@ -16897,7 +16892,7 @@ dependencies = [
[[package]]
name = "windmill-parser-py-imports"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"async-recursion",
@@ -16919,7 +16914,7 @@ dependencies = [
[[package]]
name = "windmill-parser-ruby"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"lazy_static",
@@ -16933,7 +16928,7 @@ dependencies = [
[[package]]
name = "windmill-parser-rust"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"convert_case 0.6.0",
@@ -16950,7 +16945,7 @@ dependencies = [
[[package]]
name = "windmill-parser-sql"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"lazy_static",
@@ -16963,7 +16958,7 @@ dependencies = [
[[package]]
name = "windmill-parser-sql-asset"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"serde",
@@ -16975,7 +16970,7 @@ dependencies = [
[[package]]
name = "windmill-parser-ts"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"lazy_static",
@@ -16993,7 +16988,7 @@ dependencies = [
[[package]]
name = "windmill-parser-ts-asset"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"serde-wasm-bindgen",
@@ -17009,7 +17004,7 @@ dependencies = [
[[package]]
name = "windmill-parser-wac"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"rustpython-ast",
@@ -17025,7 +17020,7 @@ dependencies = [
[[package]]
name = "windmill-parser-yaml"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"serde",
@@ -17036,7 +17031,7 @@ dependencies = [
[[package]]
name = "windmill-queue"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"async-recursion",
@@ -17073,7 +17068,7 @@ dependencies = [
[[package]]
name = "windmill-runtime-nativets"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"const_format",
@@ -17111,7 +17106,7 @@ dependencies = [
[[package]]
name = "windmill-sql-datatype-parser-wasm"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"getrandom 0.3.4",
"wasm-bindgen",
@@ -17122,7 +17117,7 @@ dependencies = [
[[package]]
name = "windmill-store"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"async-recursion",
@@ -17151,7 +17146,7 @@ dependencies = [
[[package]]
name = "windmill-test-utils"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"axum 0.7.9",
@@ -17174,7 +17169,7 @@ dependencies = [
[[package]]
name = "windmill-trigger"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"async-trait",
@@ -17207,7 +17202,7 @@ dependencies = [
[[package]]
name = "windmill-trigger-email"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"async-trait",
@@ -17227,7 +17222,7 @@ dependencies = [
[[package]]
name = "windmill-trigger-gcp"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"async-trait",
@@ -17261,7 +17256,7 @@ dependencies = [
[[package]]
name = "windmill-trigger-http"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"async-trait",
@@ -17296,7 +17291,7 @@ dependencies = [
[[package]]
name = "windmill-trigger-kafka"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"async-trait",
@@ -17319,7 +17314,7 @@ dependencies = [
[[package]]
name = "windmill-trigger-mqtt"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"async-trait",
@@ -17343,7 +17338,7 @@ dependencies = [
[[package]]
name = "windmill-trigger-nats"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"async-nats",
@@ -17367,7 +17362,7 @@ dependencies = [
[[package]]
name = "windmill-trigger-postgres"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"async-trait",
@@ -17402,7 +17397,7 @@ dependencies = [
[[package]]
name = "windmill-trigger-sqs"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"async-trait",
@@ -17430,7 +17425,7 @@ dependencies = [
[[package]]
name = "windmill-trigger-websocket"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"async-trait",
@@ -17453,7 +17448,7 @@ dependencies = [
[[package]]
name = "windmill-types"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"bitflags 2.9.4",
@@ -17472,7 +17467,7 @@ dependencies = [
[[package]]
name = "windmill-worker"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"anyhow",
"async-once-cell",
@@ -17579,7 +17574,7 @@ dependencies = [
[[package]]
name = "windmill-worker-volumes"
version = "1.663.0"
version = "1.662.0"
dependencies = [
"bytes",
"futures",
@@ -18194,12 +18189,12 @@ checksum = "a90e88e4667264a994d34e6d1ab2d26d398dcdca8b7f52bec8668957517fc7d8"
[[package]]
name = "winreg"
version = "0.55.0"
version = "0.50.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97"
checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1"
dependencies = [
"cfg-if",
"windows-sys 0.59.0",
"windows-sys 0.48.0",
]
[[package]]
+2 -2
View File
@@ -1,6 +1,6 @@
[package]
name = "windmill"
version = "1.663.0"
version = "1.662.0"
authors.workspace = true
edition.workspace = true
@@ -82,7 +82,7 @@ members = [
exclude = ["./windmill-duckdb-ffi-internal"]
[workspace.package]
version = "1.663.0"
version = "1.662.0"
authors = ["Ruben Fiszel <ruben@windmill.dev>"]
edition = "2021"
@@ -1 +0,0 @@
ALTER TABLE native_trigger DROP COLUMN IF EXISTS summary;
@@ -1 +0,0 @@
ALTER TABLE native_trigger ADD COLUMN summary VARCHAR(1000);
@@ -422,7 +422,6 @@ async fn test_delete_integration_full_cascade(db: Pool<Postgres>) -> anyhow::Res
"ext-1",
&trigger_config,
json!({"triggerType": "drive"}),
None,
)
.await?;
@@ -512,7 +511,6 @@ async fn test_cleanup_preserves_triggers(db: Pool<Postgres>) -> anyhow::Result<(
"ext-1",
&trigger_config,
json!({"triggerType": "drive"}),
None,
)
.await?;
+28 -24
View File
@@ -50,11 +50,11 @@ pub fn filter_list_queue_query(
.values
.iter()
.map(|v| {
let p = v.replace("*", "%");
let p = v.replace("*", "%").replace("'", "''");
if w.negated {
format!("v2_job_queue.worker NOT LIKE {}", quote(&p))
format!("v2_job_queue.worker NOT LIKE '{p}'")
} else {
format!("v2_job_queue.worker LIKE {}", quote(&p))
format!("v2_job_queue.worker LIKE '{p}'")
}
})
.collect();
@@ -77,11 +77,11 @@ pub fn filter_list_queue_query(
.values
.iter()
.map(|v| {
let p = format!("{}%", v);
let e = v.replace("'", "''");
if ps.negated {
format!("runnable_path NOT LIKE {}", quote(&p))
format!("runnable_path NOT LIKE '{e}%'")
} else {
format!("runnable_path LIKE {}", quote(&p))
format!("runnable_path LIKE '{e}%'")
}
})
.collect();
@@ -123,11 +123,11 @@ pub fn filter_list_queue_query(
.values
.iter()
.map(|v| {
let p = v.replace("*", "%");
let p = v.replace("*", "%").replace("'", "''");
if t.negated {
format!("v2_job.tag NOT LIKE {}", quote(&p))
format!("v2_job.tag NOT LIKE '{p}'")
} else {
format!("v2_job.tag LIKE {}", quote(&p))
format!("v2_job.tag LIKE '{p}'")
}
})
.collect();
@@ -287,14 +287,14 @@ pub fn filter_list_completed_query(
.values
.iter()
.map(|v| {
let p = v.replace("*", "%");
let p = v.replace("*", "%").replace("'", "''");
if label.negated {
format!(
"NOT EXISTS (SELECT 1 FROM jsonb_array_elements_text(result->'wm_labels') lbl WHERE jsonb_typeof(result->'wm_labels') = 'array' AND lbl LIKE {})", quote(&p)
"NOT EXISTS (SELECT 1 FROM jsonb_array_elements_text(result->'wm_labels') lbl WHERE jsonb_typeof(result->'wm_labels') = 'array' AND lbl LIKE '{p}')"
)
} else {
format!(
"EXISTS (SELECT 1 FROM jsonb_array_elements_text(result->'wm_labels') lbl WHERE jsonb_typeof(result->'wm_labels') = 'array' AND lbl LIKE {})", quote(&p)
"EXISTS (SELECT 1 FROM jsonb_array_elements_text(result->'wm_labels') lbl WHERE jsonb_typeof(result->'wm_labels') = 'array' AND lbl LIKE '{p}')"
)
}
})
@@ -308,14 +308,14 @@ pub fn filter_list_completed_query(
let clauses: Vec<_> = label
.values
.iter()
.map(|v| format!("NOT (result->'wm_labels' ? {})", quote(v)))
.map(|v| format!("NOT (result->'wm_labels' ? '{}')", v.replace("'", "''")))
.collect();
sqlb.and_where(format!("({})", clauses.join(" AND ")));
} else {
let clauses: Vec<_> = label
.values
.iter()
.map(|v| format!("result->'wm_labels' ? {}", quote(v)))
.map(|v| format!("result->'wm_labels' ? '{}'", v.replace("'", "''")))
.collect();
sqlb.and_where("result ? 'wm_labels'");
sqlb.and_where(format!("({})", clauses.join(" OR ")));
@@ -329,11 +329,11 @@ pub fn filter_list_completed_query(
.values
.iter()
.map(|v| {
let p = v.replace("*", "%");
let p = v.replace("*", "%").replace("'", "''");
if worker.negated {
format!("v2_job_completed.worker NOT LIKE {}", quote(&p))
format!("v2_job_completed.worker NOT LIKE '{p}'")
} else {
format!("v2_job_completed.worker LIKE {}", quote(&p))
format!("v2_job_completed.worker LIKE '{p}'")
}
})
.collect();
@@ -366,11 +366,11 @@ pub fn filter_list_completed_query(
.values
.iter()
.map(|v| {
let p = format!("{}%", v);
let e = v.replace("'", "''");
if ps.negated {
format!("runnable_path NOT LIKE {}", quote(&p))
format!("runnable_path NOT LIKE '{e}%'")
} else {
format!("runnable_path LIKE {}", quote(&p))
format!("runnable_path LIKE '{e}%'")
}
})
.collect();
@@ -400,11 +400,11 @@ pub fn filter_list_completed_query(
.values
.iter()
.map(|v| {
let p = v.replace("*", "%");
let p = v.replace("*", "%").replace("'", "''");
if t.negated {
format!("v2_job.tag NOT LIKE {}", quote(&p))
format!("v2_job.tag NOT LIKE '{p}'")
} else {
format!("v2_job.tag LIKE {}", quote(&p))
format!("v2_job.tag LIKE '{p}'")
}
})
.collect();
@@ -449,7 +449,11 @@ pub fn filter_list_completed_query(
}
if let Some(dt) = &lq.created_or_started_after {
let ts = dt.to_rfc3339();
sqlb.and_where("(created_at >= ? OR started_at >= ?)".bind(&ts).bind(&ts));
sqlb.and_where(format!(
"(created_at >= '{}' OR started_at >= '{}')",
ts.replace("'", "''"),
ts.replace("'", "''")
));
}
if let Some(dt) = &lq.created_before {
+1 -13
View File
@@ -1,7 +1,7 @@
openapi: "3.0.3"
info:
version: 1.663.0
version: 1.662.0
title: Windmill API
contact:
@@ -24592,10 +24592,6 @@ components:
type: string
nullable: true
description: Error message if the trigger is in an error state
summary:
type: string
nullable: true
description: Short summary to be displayed when listed
required:
- external_id
- workspace_id
@@ -24630,10 +24626,6 @@ components:
type: string
nullable: true
description: Error message if the trigger is in an error state
summary:
type: string
nullable: true
description: Short summary to be displayed when listed
external_data:
type: object
description: Configuration data from the external service
@@ -24726,10 +24718,6 @@ components:
type: object
description: Service-specific configuration (e.g., event types, filters)
additionalProperties: true
summary:
type: string
nullable: true
description: Short summary to be displayed when listed
required:
- script_path
- is_flow
+4 -1
View File
@@ -2027,7 +2027,10 @@ async fn count_completed_jobs_detail(
if let Some(tags) = query.tags {
sqlb.and_where_in(
"v2_job.tag",
&tags.split(",").map(|t| quote(t)).collect::<Vec<_>>(),
&tags
.split(",")
.map(|t| format!("'{}'", t))
.collect::<Vec<_>>(),
);
}
@@ -68,7 +68,7 @@ pub async fn trigger_dependents_to_recompute_dependencies(
let job_payload = match importer_kind.as_str() {
"script" => match sqlx::query_scalar!(
"SELECT hash FROM script WHERE path = $1 AND workspace_id = $2 AND deleted = false AND archived = false ORDER BY created_at DESC LIMIT 1",
"SELECT hash FROM script WHERE path = $1 AND workspace_id = $2 AND deleted = false ORDER BY created_at DESC LIMIT 1",
importer_path,
w_id
)
@@ -181,7 +181,6 @@ async fn create_native_trigger<T: External>(
&external_id,
&config,
service_config,
data.summary.as_deref(),
)
.await?;
@@ -305,7 +304,6 @@ async fn update_native_trigger_handler<T: External>(
&external_id,
&config,
service_config,
data.summary.as_deref(),
)
.await?;
+7 -17
View File
@@ -195,7 +195,6 @@ pub struct NativeTrigger {
pub error: Option<String>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
pub summary: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
@@ -210,7 +209,6 @@ pub struct NativeTriggerData<C> {
pub script_path: String,
pub is_flow: bool,
pub service_config: C,
pub summary: Option<String>,
}
#[derive(Debug, Clone, FromRow, Serialize, Deserialize)]
@@ -823,7 +821,6 @@ pub async fn store_native_trigger<'c, E: sqlx::Executor<'c, Database = Postgres>
external_id: &str,
config: &NativeTriggerConfig,
service_config: C,
summary: Option<&str>,
) -> Result<()> {
use windmill_common::auth::hash_token;
@@ -838,13 +835,12 @@ pub async fn store_native_trigger<'c, E: sqlx::Executor<'c, Database = Postgres>
script_path,
is_flow,
webhook_token_hash,
service_config,
summary
service_config
) VALUES (
$1, $2, $3, $4, $5, $6, $7, $8
$1, $2, $3, $4, $5, $6, $7
)
ON CONFLICT (external_id, workspace_id, service_name)
DO UPDATE SET script_path = $4, is_flow = $5, webhook_token_hash = $6, service_config = $7, summary = $8, error = NULL, updated_at = NOW()
DO UPDATE SET script_path = $4, is_flow = $5, webhook_token_hash = $6, service_config = $7, error = NULL, updated_at = NOW()
"#,
external_id,
workspace_id,
@@ -853,7 +849,6 @@ pub async fn store_native_trigger<'c, E: sqlx::Executor<'c, Database = Postgres>
config.is_flow,
webhook_token_hash,
sqlx::types::Json(service_config) as _,
summary,
)
.execute(db)
.await?;
@@ -868,7 +863,6 @@ pub async fn update_native_trigger<'c, E: sqlx::Executor<'c, Database = Postgres
external_id: &str,
config: &NativeTriggerConfig,
service_config: Option<&RawValue>,
summary: Option<&str>,
) -> Result<()> {
use windmill_common::auth::hash_token;
@@ -877,7 +871,7 @@ pub async fn update_native_trigger<'c, E: sqlx::Executor<'c, Database = Postgres
sqlx::query!(
r#"
UPDATE native_trigger
SET script_path = $1, is_flow = $2, webhook_token_hash = $3, service_config = $4, summary = $8, error = NULL, updated_at = NOW()
SET script_path = $1, is_flow = $2, webhook_token_hash = $3, service_config = $4, error = NULL, updated_at = NOW()
WHERE
workspace_id = $5
AND service_name = $6
@@ -890,7 +884,6 @@ pub async fn update_native_trigger<'c, E: sqlx::Executor<'c, Database = Postgres
workspace_id,
service_name as ServiceName,
external_id,
summary,
)
.execute(db)
.await?;
@@ -941,8 +934,7 @@ pub async fn get_native_trigger<'c, E: sqlx::Executor<'c, Database = Postgres>>(
service_config,
error,
created_at,
updated_at,
summary
updated_at
FROM
native_trigger
WHERE
@@ -980,8 +972,7 @@ pub async fn get_native_trigger_by_script<'c, E: sqlx::Executor<'c, Database = P
service_config,
error,
created_at,
updated_at,
summary
updated_at
FROM
native_trigger
WHERE
@@ -1027,8 +1018,7 @@ pub async fn list_native_triggers<'c, E: sqlx::Executor<'c, Database = Postgres>
nt.service_config,
nt.error,
nt.created_at,
nt.updated_at,
nt.summary
nt.updated_at
FROM
native_trigger nt
WHERE
+12 -3
View File
@@ -133,12 +133,21 @@ async fn list_variables(
])
.left()
.join("account")
.on("variable.account = account.id AND account.workspace_id = ?".bind(&w_id))
.on(&format!(
"variable.account = account.id AND account.workspace_id = '{}'",
w_id
))
.left()
.join("resource")
.on("resource.path = variable.path AND resource.workspace_id = ?".bind(&w_id))
.on(&format!(
"resource.path = variable.path AND resource.workspace_id = '{}'",
w_id
))
.and_where("variable.workspace_id = ?".bind(&w_id))
.and_where("variable.path NOT LIKE 'u/' || ? || '/secret_arg/%'".bind(&authed.username))
.and_where(&format!(
"variable.path NOT LIKE 'u/' || '{}' || '/secret_arg/%'",
authed.username
))
.order_by("path", false)
.limit(per_page)
.offset(offset)
+1 -1
View File
@@ -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.663.0";
export const VERSION = "v1.662.0";
export async function login(email: string, password: string): Promise<string> {
return await windmill.UserService.login({
+9 -1
View File
@@ -1,7 +1,7 @@
import { GlobalOptions } from "../../types.ts";
import { requireLogin } from "../../core/auth.ts";
import { resolveWorkspace, validatePath } from "../../core/context.ts";
import { readFile, writeFile, stat } from "node:fs/promises";
import { readFile, writeFile, stat, mkdir } from "node:fs/promises";
import { Buffer } from "node:buffer";
import { colors } from "@cliffy/ansi/colors";
import { Command } from "@cliffy/command";
@@ -1078,6 +1078,11 @@ async function bootstrap(
return;
}
// normalize language aliases
if (language === ("python" as any)) {
language = "python3";
}
const scriptInitialCode = scriptBootstrapCode[language];
if (scriptInitialCode === undefined) {
throw new Error("Language unknown");
@@ -1118,6 +1123,9 @@ async function bootstrap(
yamlOptions
);
const parentDir = path.dirname(scriptCodeFileFullPath);
await mkdir(parentDir, { recursive: true });
await writeFile(scriptCodeFileFullPath, scriptInitialCode, {
flag: 'wx', encoding: 'utf-8',
});
-4
View File
@@ -231,7 +231,6 @@ export async function pushNativeTrigger(
is_flow: result.is_flow,
service_config: result.service_config,
error: result.error,
summary: result.summary,
};
log.debug(`Native trigger ${serviceName}/${externalId} exists on remote`);
} catch {
@@ -244,7 +243,6 @@ export async function pushNativeTrigger(
script_path: localTrigger.script_path,
is_flow: localTrigger.is_flow,
service_config: localTrigger.service_config,
summary: localTrigger.summary,
};
if (remoteTrigger) {
@@ -253,13 +251,11 @@ export async function pushNativeTrigger(
script_path: localTrigger.script_path,
is_flow: localTrigger.is_flow,
service_config: localTrigger.service_config,
summary: localTrigger.summary,
};
const remoteCompare = {
script_path: remoteTrigger.script_path,
is_flow: remoteTrigger.is_flow,
service_config: remoteTrigger.service_config,
summary: remoteTrigger.summary,
};
if (isSuperset(localCompare, remoteCompare)) {
+1 -1
View File
@@ -68,7 +68,7 @@ export {
workspaceAdd,
};
export const VERSION = "1.663.0";
export const VERSION = "1.662.0";
// Re-exported from constants.ts to maintain backwards compatibility
export { WM_FORK_PREFIX } from "./core/constants.ts";
+2 -2
View File
@@ -1,12 +1,12 @@
{
"name": "windmill-components",
"version": "1.663.0",
"version": "1.662.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "windmill-components",
"version": "1.663.0",
"version": "1.662.0",
"hasInstallScript": true,
"license": "AGPL-3.0",
"dependencies": {
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "windmill-components",
"version": "1.663.0",
"version": "1.662.0",
"scripts": {
"dev": "vite dev",
"build": "vite build",
@@ -170,9 +170,7 @@ export async function saveScheduleFromCfg(
tag: scheduleCfg.tag,
paused_until: scheduleCfg.paused_until,
cron_version: scheduleCfg.cron_version,
dynamic_skip: scheduleCfg.dynamic_skip,
permissioned_as: scheduleCfg.permissioned_as,
preserve_permissioned_as: scheduleCfg.preserve_permissioned_as
dynamic_skip: scheduleCfg.dynamic_skip
}
try {
if (edit) {
@@ -1,84 +0,0 @@
<script lang="ts">
import OnBehalfOfSelector, {
type OnBehalfOfChoice,
type OnBehalfOfDetails
} from '$lib/components/OnBehalfOfSelector.svelte'
import { userStore, workspaceStore } from '$lib/stores'
import { AlertTriangle } from 'lucide-svelte'
interface Props {
/** Current permissioned_as value from the trigger (e.g., 'u/admin') */
permissionedAs: string | undefined
/** Callback when user changes the permissioned_as selection */
onPermissionedAsChange: (permissionedAs: string | undefined, preserve: boolean) => void
}
let { permissionedAs, onPermissionedAsChange }: Props = $props()
const canPreserve = $derived(
$userStore?.is_admin || ($userStore?.groups ?? []).includes('wm_deployers')
)
const myPermissionedAs = $derived($userStore?.username ? `u/${$userStore.username}` : undefined)
let onBehalfOfChoice = $state<OnBehalfOfChoice>(undefined)
let customPermissionedAs = $state<string | undefined>(undefined)
const effectivePermissionedAs = $derived.by(() => {
if (onBehalfOfChoice === 'target') return permissionedAs
if (onBehalfOfChoice === 'custom' && customPermissionedAs) return customPermissionedAs
return myPermissionedAs
})
const willChange = $derived(
permissionedAs !== undefined &&
effectivePermissionedAs !== undefined &&
permissionedAs !== effectivePermissionedAs
)
function handleSelect(choice: OnBehalfOfChoice, details?: OnBehalfOfDetails) {
onBehalfOfChoice = choice
if (choice === 'target') {
customPermissionedAs = undefined
onPermissionedAsChange(permissionedAs, true)
} else if (choice === 'custom' && details) {
customPermissionedAs = details.permissionedAs
onPermissionedAsChange(details.permissionedAs, true)
} else {
customPermissionedAs = undefined
onPermissionedAsChange(undefined, false)
}
}
</script>
{#if permissionedAs && $workspaceStore}
<div class="flex items-center gap-1.5 text-2xs text-tertiary mb-4">
<span>Permissioned as</span>
{#if canPreserve}
<OnBehalfOfSelector
targetWorkspace={$workspaceStore}
targetValue={permissionedAs}
selected={onBehalfOfChoice}
onSelect={handleSelect}
kind="trigger"
{canPreserve}
customValue={customPermissionedAs}
isDeployment={false}
/>
{#if willChange}
<AlertTriangle class="w-3.5 h-3.5 text-yellow-500" />
<span class="text-yellow-600 dark:text-yellow-400"
>will change from <strong>{permissionedAs}</strong> on save</span
>
{/if}
{:else}
<strong class="text-secondary">{permissionedAs}</strong>
{#if willChange}
<AlertTriangle class="w-3.5 h-3.5 text-yellow-500" />
<span class="text-yellow-600 dark:text-yellow-400"
>will change to <strong>{effectivePermissionedAs}</strong> on save</span
>
{/if}
{/if}
</div>
{/if}
@@ -118,7 +118,7 @@
{trigger?.isDraft ? 'Deploy' : 'Update'}
</Button>
{#snippet text()}
<span>
<span >
{#if !isDeployed}
Deploy the runnable to enable trigger creation
{:else if cloudDisabled}
@@ -127,7 +127,7 @@
Enter a valid config to {trigger?.isDraft ? 'deploy' : 'update'} the trigger
{/if}
</span>
{/snippet}
{/snippet}
</Tooltip>
{/if}
</div>
@@ -20,7 +20,6 @@
import Label from '$lib/components/Label.svelte'
import EmailTriggerEditorConfigSection from './EmailTriggerEditorConfigSection.svelte'
import TriggerEditorToolbar from '../TriggerEditorToolbar.svelte'
import PermissionedAsLine from '../PermissionedAsLine.svelte'
import { getHandlerType, handleConfigChange } from '../utils'
import { untrack } from 'svelte'
import Tabs from '$lib/components/common/tabs/Tabs.svelte'
@@ -76,9 +75,6 @@
let drawer = $state<Drawer | undefined>(undefined)
let initialConfig: NewEmailTrigger | undefined = undefined
let deploymentLoading = $state(false)
let permissionedAs = $state<string | undefined>(undefined)
let selectedPermissionedAs = $state<string | undefined>(undefined)
let preservePermissionedAs = $state(false)
let optionTabSelected: 'error_handler' | 'retries' = $state('error_handler')
let errorHandlerSelected: ErrorHandler = $state('slack')
@@ -185,9 +181,6 @@
retry = cfg?.retry
errorHandlerSelected = getHandlerType(error_handler_path ?? '')
mode = cfg?.mode ?? 'enabled'
permissionedAs = cfg?.permissioned_as
selectedPermissionedAs = undefined
preservePermissionedAs = false
}
async function loadTrigger(defaultConfig?: Partial<EmailTrigger>): Promise<void> {
@@ -243,9 +236,7 @@
error_handler_path,
error_handler_args,
retry,
mode,
permissioned_as: selectedPermissionedAs,
preserve_permissioned_as: preservePermissionedAs || undefined
mode
}
return nCfg
@@ -313,15 +304,6 @@
<Loader2 class="animate-spin" />
{/if}
{:else}
{#if edit}
<PermissionedAsLine
{permissionedAs}
onPermissionedAsChange={(pa, preserve) => {
selectedPermissionedAs = pa
preservePermissionedAs = preserve
}}
/>
{/if}
<div class="flex flex-col gap-12">
{#if mode === 'suspended'}
<TriggerSuspendedJobsAlert {suspendedJobsModal} />
@@ -30,9 +30,7 @@ export async function saveEmailTriggerFromCfg(
error_handler_path: emailCfg.error_handler_path,
error_handler_args: emailCfg.error_handler_path ? emailCfg.error_handler_args : undefined,
mode: emailCfg.mode,
retry: emailCfg.retry,
permissioned_as: emailCfg.permissioned_as,
preserve_permissioned_as: emailCfg.preserve_permissioned_as
retry: emailCfg.retry
}
try {
if (edit) {
@@ -22,7 +22,6 @@
import GcpTriggerEditorConfigSection from './GcpTriggerEditorConfigSection.svelte'
import { untrack, type Snippet } from 'svelte'
import TriggerEditorToolbar from '../TriggerEditorToolbar.svelte'
import PermissionedAsLine from '../PermissionedAsLine.svelte'
import { saveGcpTriggerFromCfg } from './utils'
import { getHandlerType, handleConfigChange, type Trigger } from '../utils'
import { deepEqual } from 'fast-equals'
@@ -58,9 +57,6 @@
let subscription_mode: SubscriptionMode = $state('create_update')
let initialConfig: Record<string, any> | undefined = undefined
let deploymentLoading = $state(false)
let permissionedAs = $state<string | undefined>(undefined)
let selectedPermissionedAs = $state<string | undefined>(undefined)
let preservePermissionedAs = $state(false)
let base_endpoint = $derived(`${window.location.origin}${base}`)
let auto_acknowledge_msg = $state(true)
let ack_deadline: number | undefined = $state()
@@ -206,9 +202,6 @@
auto_acknowledge_msg = cfg?.auto_acknowledge_msg ?? true
ack_deadline = cfg?.ack_deadline
errorHandlerSelected = getHandlerType(error_handler_path ?? '')
permissionedAs = cfg?.permissioned_as
selectedPermissionedAs = undefined
preservePermissionedAs = false
}
async function updateTrigger(): Promise<void> {
@@ -253,9 +246,7 @@
error_handler_args,
retry,
auto_acknowledge_msg,
ack_deadline,
permissioned_as: selectedPermissionedAs,
preserve_permissioned_as: preservePermissionedAs || undefined
ack_deadline
}
}
@@ -378,15 +369,6 @@
<p>Loading...</p>
</div>
{:else}
{#if edit}
<PermissionedAsLine
{permissionedAs}
onPermissionedAsChange={(pa, preserve) => {
selectedPermissionedAs = pa
preservePermissionedAs = preserve
}}
/>
{/if}
<div class="flex flex-col gap-5">
{#if mode === 'suspended'}
<TriggerSuspendedJobsAlert {suspendedJobsModal} />
@@ -472,11 +454,9 @@
<Section label="Advanced" collapsable>
{#snippet header()}
<TriggerAdvancedBadges
{error_handler_path}
{retry}
extraBadges={[{ name: 'Manual Ack', active: !auto_acknowledge_msg }]}
/>
<TriggerAdvancedBadges {error_handler_path} {retry} extraBadges={[
{ name: 'Manual Ack', active: !auto_acknowledge_msg }
]} />
{/snippet}
<div class="flex flex-col gap-6">
<div class="min-h-96">
@@ -32,8 +32,6 @@ export async function saveGcpTriggerFromCfg(
is_flow: cfg.is_flow,
auto_acknowledge_msg: cfg.auto_acknowledge_msg,
ack_deadline: cfg.ack_deadline,
permissioned_as: cfg.permissioned_as,
preserve_permissioned_as: cfg.preserve_permissioned_as,
...errorHandlerAndRetries
}
if (edit) {
@@ -46,7 +46,6 @@
import RouteBodyTransformerOption from './RouteBodyTransformerOption.svelte'
import TestingBadge from '../testingBadge.svelte'
import TriggerEditorToolbar from '../TriggerEditorToolbar.svelte'
import PermissionedAsLine from '../PermissionedAsLine.svelte'
import { getHandlerType, handleConfigChange } from '../utils'
import autosize from '$lib/autosize'
import { untrack } from 'svelte'
@@ -123,9 +122,6 @@
let drawer = $state<Drawer | undefined>(undefined)
let initialConfig: NewHttpTrigger | undefined = undefined
let deploymentLoading = $state(false)
let permissionedAs = $state<string | undefined>(undefined)
let selectedPermissionedAs = $state<string | undefined>(undefined)
let preservePermissionedAs = $state(false)
let optionTabSelected: 'request_options' | 'error_handler' | 'retries' = $state('request_options')
let errorHandlerSelected: ErrorHandler = $state('slack')
@@ -319,9 +315,6 @@
error_handler_args = cfg?.error_handler_args ?? {}
retry = cfg?.retry
errorHandlerSelected = getHandlerType(error_handler_path ?? '')
permissionedAs = cfg?.permissioned_as
selectedPermissionedAs = undefined
preservePermissionedAs = false
}
async function loadTrigger(defaultConfig?: Partial<HttpTrigger>): Promise<void> {
@@ -395,9 +388,7 @@
description: routeDescription,
error_handler_path,
error_handler_args,
retry,
permissioned_as: selectedPermissionedAs,
preserve_permissioned_as: preservePermissionedAs || undefined
retry
}
return nCfg
@@ -490,15 +481,6 @@
<Loader2 class="animate-spin" />
{/if}
{:else}
{#if edit}
<PermissionedAsLine
{permissionedAs}
onPermissionedAsChange={(pa, preserve) => {
selectedPermissionedAs = pa
preservePermissionedAs = preserve
}}
/>
{/if}
<div class="flex flex-col gap-8">
{#if mode === 'suspended'}
<TriggerSuspendedJobsAlert {suspendedJobsModal} />
@@ -715,15 +697,11 @@
{#if !is_static_website}
<Section label="Advanced" collapsable>
{#snippet header()}
<TriggerAdvancedBadges
{error_handler_path}
{retry}
extraBadges={[
{ name: 'Async', active: request_type === 'async' },
{ name: 'SSE', active: request_type === 'sync_sse' },
{ name: 'Authentication', active: authentication_method !== 'none' }
]}
/>
<TriggerAdvancedBadges {error_handler_path} {retry} extraBadges={[
{ name: 'Async', active: request_type === 'async' },
{ name: 'SSE', active: request_type === 'sync_sse' },
{ name: 'Authentication', active: authentication_method !== 'none' }
]} />
{/snippet}
<div class="min-h-96">
<Tabs bind:selected={optionTabSelected}>
@@ -61,9 +61,7 @@ export async function saveHttpRouteFromCfg(
error_handler_path: routeCfg.error_handler_path,
error_handler_args: routeCfg.error_handler_path ? routeCfg.error_handler_args : undefined,
retry: routeCfg.retry,
mode: routeCfg.mode,
permissioned_as: routeCfg.permissioned_as,
preserve_permissioned_as: routeCfg.preserve_permissioned_as
mode: routeCfg.mode
}
try {
if (edit) {
@@ -15,7 +15,6 @@
import KafkaTriggersConfigSection from './KafkaTriggersConfigSection.svelte'
import { untrack, type Snippet } from 'svelte'
import TriggerEditorToolbar from '../TriggerEditorToolbar.svelte'
import PermissionedAsLine from '../PermissionedAsLine.svelte'
import { saveKafkaTriggerFromCfg } from './utils'
import { getHandlerType, handleConfigChange, type Trigger } from '../utils'
import Tabs from '$lib/components/common/tabs/Tabs.svelte'
@@ -88,9 +87,6 @@
let autoOffsetReset = $state('latest')
let autoCommit = $state(true)
let deploymentLoading = $state(false)
let permissionedAs = $state<string | undefined>(undefined)
let selectedPermissionedAs = $state<string | undefined>(undefined)
let preservePermissionedAs = $state(false)
let resetLoading = $state(false)
let optionTabSelected: 'error_handler' | 'retries' = $state('error_handler')
let errorHandlerSelected: ErrorHandler = $state('slack')
@@ -220,9 +216,6 @@
retry = cfg?.retry
filters = cfg?.filters ?? []
errorHandlerSelected = getHandlerType(error_handler_path ?? '')
permissionedAs = cfg?.permissioned_as
selectedPermissionedAs = undefined
preservePermissionedAs = false
}
async function loadTrigger(defaultConfig?: Record<string, any>): Promise<void> {
@@ -253,9 +246,7 @@
extra_perms: extra_perms,
error_handler_path,
error_handler_args,
retry,
permissioned_as: selectedPermissionedAs,
preserve_permissioned_as: preservePermissionedAs || undefined
retry
}
}
@@ -423,15 +414,6 @@
<Loader2 class="animate-spin" />
{/if}
{:else}
{#if edit}
<PermissionedAsLine
{permissionedAs}
onPermissionedAsChange={(pa, preserve) => {
selectedPermissionedAs = pa
preservePermissionedAs = preserve
}}
/>
{/if}
<div class="flex flex-col gap-4">
{#if description}
{@render description()}
@@ -549,10 +531,11 @@
Offsets will not be committed automatically. Use <code
>wmill.commit_kafka_offsets(trigger_path, topic, partition, offset)</code
>
in Python or
<code>wmill.commitKafkaOffsets(triggerPath, topic, partition, offset)</code> in TypeScript
with the values from the event payload. The consumer collects all pending commits and
commits the highest offset for each topic/partition pair.
in Python or <code
>wmill.commitKafkaOffsets(triggerPath, topic, partition, offset)</code
> in TypeScript with the values from the event payload. The consumer collects
all pending commits and commits the highest offset for each topic/partition
pair.
</Alert>
{/if}
</div>
@@ -26,9 +26,7 @@ export async function saveKafkaTriggerFromCfg(
filters: cfg.filters ?? [],
auto_offset_reset: cfg.auto_offset_reset ?? 'latest',
auto_commit: cfg.auto_commit ?? true,
...errorHandlerAndRetries,
permissioned_as: cfg.permissioned_as,
preserve_permissioned_as: cfg.preserve_permissioned_as
...errorHandlerAndRetries
}
try {
if (edit) {
@@ -24,7 +24,6 @@
import MqttEditorConfigSection from './MqttEditorConfigSection.svelte'
import type { Snippet } from 'svelte'
import TriggerEditorToolbar from '../TriggerEditorToolbar.svelte'
import PermissionedAsLine from '../PermissionedAsLine.svelte'
import { saveMqttTriggerFromCfg } from './utils'
import { getHandlerType, handleConfigChange, type Trigger } from '../utils'
import Tabs from '$lib/components/common/tabs/Tabs.svelte'
@@ -99,9 +98,6 @@
let isValid: boolean = $state(false)
let initialConfig: Record<string, any> | undefined = {}
let deploymentLoading = $state(false)
let permissionedAs = $state<string | undefined>(undefined)
let selectedPermissionedAs = $state<string | undefined>(undefined)
let preservePermissionedAs = $state(false)
let errorHandlerSelected: ErrorHandler = $state('slack')
let error_handler_path: string | undefined = $state()
let error_handler_args: Record<string, any> = $state({})
@@ -219,9 +215,6 @@
errorHandlerSelected = getHandlerType(error_handler_path ?? '')
activateV5Options.topic_alias_maximum = Boolean(v5_config.topic_alias_maximum)
activateV5Options.session_expiry_interval = Boolean(v5_config.session_expiry_interval)
permissionedAs = cfg?.permissioned_as
selectedPermissionedAs = undefined
preservePermissionedAs = false
} catch (error) {
sendUserToast(`Could not load mqtt trigger config: ${error.body}`, true)
}
@@ -258,9 +251,7 @@
is_flow,
error_handler_path,
error_handler_args,
retry,
permissioned_as: selectedPermissionedAs,
preserve_permissioned_as: preservePermissionedAs || undefined
retry
}
}
@@ -401,15 +392,6 @@
<Loader2 class="animate-spin" />
{/if}
{:else}
{#if edit}
<PermissionedAsLine
{permissionedAs}
onPermissionedAsChange={(pa, preserve) => {
selectedPermissionedAs = pa
preservePermissionedAs = preserve
}}
/>
{/if}
<div class="flex flex-col gap-4">
{#if description}
{@render description()}
@@ -489,14 +471,10 @@
<Section label="Advanced" collapsable>
{#snippet header()}
<TriggerAdvancedBadges
{error_handler_path}
{retry}
extraBadges={[
{ name: 'Custom Client ID', active: !!client_id },
{ name: 'MQTT v3', active: client_version === 'v3' }
]}
/>
<TriggerAdvancedBadges {error_handler_path} {retry} extraBadges={[
{ name: 'Custom Client ID', active: !!client_id },
{ name: 'MQTT v3', active: client_version === 'v3' }
]} />
{/snippet}
<div class="flex flex-col gap-6">
<div class="min-h-96">
@@ -27,8 +27,6 @@ export async function saveMqttTriggerFromCfg(
script_path: cfg.script_path,
is_flow: cfg.is_flow,
mode: cfg.mode,
permissioned_as: cfg.permissioned_as,
preserve_permissioned_as: cfg.preserve_permissioned_as,
...errorHandlerAndRetries
}
try {
@@ -11,7 +11,6 @@
import { usedTriggerKinds, userStore, workspaceStore } from '$lib/stores'
import { canWrite, emptyString, sendUserToast } from '$lib/utils'
import { Button } from '$lib/components/common'
import TextInput from '$lib/components/text_input/TextInput.svelte'
import Drawer from '$lib/components/common/drawer/Drawer.svelte'
import DrawerContent from '$lib/components/common/drawer/DrawerContent.svelte'
import { Loader2, Save } from 'lucide-svelte'
@@ -95,7 +94,6 @@
let initialScriptPath = $state('')
let fixedScriptPath = $state('')
let isFlow = $state(false)
let summary = $state('')
let externalId = $state<string | null>(null)
let can_write = $state(true)
let originalConfig = $state<Record<string, any> | undefined>(undefined)
@@ -125,7 +123,6 @@
can_write = true
originalConfig = undefined
initialConfig = undefined
summary = ''
}
export function openRecreate(nativeTrigger: ExtendedNativeTrigger) {
@@ -149,7 +146,6 @@
can_write = true
originalConfig = undefined
initialConfig = undefined
summary = nativeTrigger.summary ?? ''
}
export async function openEdit(
@@ -186,7 +182,6 @@
scriptPath = fullTrigger.script_path
initialScriptPath = fullTrigger.script_path
can_write = canWrite(fullTrigger.script_path, {}, $userStore)
summary = fullTrigger.summary ?? ''
externalData = fullTrigger.external_data
// Apply default values if provided (for draft triggers)
@@ -208,8 +203,7 @@
return {
script_path: scriptPath,
is_flow: isFlow,
service_config: serviceConfig,
summary: summary !== '' ? summary : undefined
service_config: serviceConfig
}
}
@@ -392,22 +386,6 @@
{/if}
</div>
<div class="flex flex-col gap-12 mt-6">
<Section label="Metadata">
<div class="flex flex-col gap-6">
<label class="flex flex-col gap-1">
<span class="text-xs font-semibold text-emphasis">Summary</span>
<TextInput
inputProps={{
type: 'text',
placeholder: 'Short summary to be displayed when listed',
disabled: !can_write
}}
bind:value={summary}
/>
</label>
</div>
</Section>
{#if !hideTarget}
<Section label="Runnable">
<p class="text-xs mb-1 text-primary">
@@ -98,31 +98,20 @@
{@html trigger.marked}
</span>
{:else}
{trigger.summary || trigger.script_path}
{trigger.script_path}
{/if}
</div>
{#if trigger.summary}
<div class="text-secondary text-xs truncate text-left font-normal">
{trigger.script_path}
</div>
{/if}
{#if service === 'google'}
{@const triggerType = trigger.service_config?.triggerType}
{@const resourceName = trigger.service_config?.resourceName}
{@const calendarName = trigger.service_config?.calendarName}
<div
class="text-secondary text-xs truncate text-left font-normal flex items-center gap-1 mb-0.5"
>
<div class="text-secondary text-xs truncate text-left font-normal flex items-center gap-1 mb-0.5">
{#if triggerType === 'calendar'}
<GoogleCalendarIcon height="12px" width="12px" />
Calendar: {calendarName || trigger.service_config?.calendarId || ''}
{:else}
<GoogleDriveIcon height="12px" width="12px" />
Drive: {resourceName
? resourceName
: trigger.service_config?.resourceId
? trigger.service_config.resourceId
: 'All changes'}
Drive: {resourceName ? resourceName : trigger.service_config?.resourceId ? trigger.service_config.resourceId : 'All changes'}
{/if}
</div>
{/if}
@@ -111,7 +111,7 @@ export function validateCommonFields(config: Record<string, any>): Record<string
}
export function formatTriggerDisplayName(trigger: NativeTrigger): string {
return `${trigger.summary ?? ''} ${trigger.script_path} (external id: ${trigger.external_id})`
return `${trigger.script_path} (external id: ${trigger.external_id})`
}
export function getTriggerIconName(service: NativeServiceName): string {
@@ -199,8 +199,7 @@ export async function saveNativeTriggerFromCfg(
const requestBody: NativeTriggerData = {
script_path: triggerCfg.script_path,
is_flow: triggerCfg.is_flow,
service_config: triggerCfg.service_config,
summary: triggerCfg.summary
service_config: triggerCfg.service_config
}
const serviceName = NATIVE_TRIGGER_SERVICES[service].serviceDisplayName
@@ -14,7 +14,6 @@
import NatsTriggersConfigSection from './NatsTriggersConfigSection.svelte'
import { untrack, type Snippet } from 'svelte'
import TriggerEditorToolbar from '../TriggerEditorToolbar.svelte'
import PermissionedAsLine from '../PermissionedAsLine.svelte'
import { saveNatsTriggerFromCfg } from './utils'
import { getHandlerType, handleConfigChange, type Trigger } from '../utils'
import Tabs from '$lib/components/common/tabs/Tabs.svelte'
@@ -90,9 +89,6 @@
use_jetstream: false
})
let deploymentLoading = $state(false)
let permissionedAs = $state<string | undefined>(undefined)
let selectedPermissionedAs = $state<string | undefined>(undefined)
let preservePermissionedAs = $state(false)
let isValid = $state(false)
let optionTabSelected: 'error_handler' | 'retries' = $state('error_handler')
let errorHandlerSelected: ErrorHandler = $state('slack')
@@ -205,9 +201,6 @@
error_handler_args = cfg?.error_handler_args ?? {}
retry = cfg?.retry
errorHandlerSelected = getHandlerType(error_handler_path ?? '')
permissionedAs = cfg?.permissioned_as
selectedPermissionedAs = undefined
preservePermissionedAs = false
}
async function loadTrigger(defaultConfig?: Record<string, any>): Promise<void> {
@@ -236,9 +229,7 @@
use_jetstream: natsCfg.use_jetstream,
error_handler_path,
error_handler_args,
retry,
permissioned_as: selectedPermissionedAs,
preserve_permissioned_as: preservePermissionedAs || undefined
retry
}
}
@@ -385,15 +376,6 @@
<Loader2 class="animate-spin" />
{/if}
{:else}
{#if edit}
<PermissionedAsLine
{permissionedAs}
onPermissionedAsChange={(pa, preserve) => {
selectedPermissionedAs = pa
preservePermissionedAs = preserve
}}
/>
{/if}
<div class="flex flex-col gap-4">
{#if description}
{@render description()}
@@ -25,8 +25,6 @@ export async function saveNatsTriggerFromCfg(
consumer_name: cfg.consumer_name,
subjects: cfg.subjects,
use_jetstream: cfg.use_jetstream,
permissioned_as: cfg.permissioned_as,
preserve_permissioned_as: cfg.preserve_permissioned_as,
...errorHandlerAndRetries
}
try {
@@ -33,7 +33,6 @@
import { base } from '$lib/base'
import { untrack, type Snippet } from 'svelte'
import TriggerEditorToolbar from '../TriggerEditorToolbar.svelte'
import PermissionedAsLine from '../PermissionedAsLine.svelte'
import TestingBadge from '../testingBadge.svelte'
import { getHandlerType, handleConfigChange, type Trigger } from '../utils'
import TriggerRetriesAndErrorHandler from '../TriggerRetriesAndErrorHandler.svelte'
@@ -114,9 +113,6 @@
let basic_mode = $derived(tab === 'basic')
let initialConfig: Record<string, any> | undefined = undefined
let deploymentLoading = $state(false)
let permissionedAs = $state<string | undefined>(undefined)
let selectedPermissionedAs = $state<string | undefined>(undefined)
let preservePermissionedAs = $state(false)
let creatingSlot: boolean = $state(false)
let creatingPublication: boolean = $state(false)
let pg14: boolean = $derived(postgresVersion.startsWith('14'))
@@ -322,9 +318,7 @@
error_handler_path,
error_handler_args,
retry,
mode,
permissioned_as: selectedPermissionedAs,
preserve_permissioned_as: preservePermissionedAs || undefined
mode
}
return cfg
}
@@ -345,9 +339,6 @@
retry = cfg?.retry
errorHandlerSelected = getHandlerType(error_handler_path ?? '')
mode = cfg?.mode ?? 'enabled'
permissionedAs = cfg?.permissioned_as
selectedPermissionedAs = undefined
preservePermissionedAs = false
}
async function loadTrigger(defaultConfig?: Record<string, any>): Promise<void> {
@@ -562,15 +553,6 @@
</div>
{/if}
{:else}
{#if edit}
<PermissionedAsLine
{permissionedAs}
onPermissionedAsChange={(pa, preserve) => {
selectedPermissionedAs = pa
preservePermissionedAs = preserve
}}
/>
{/if}
<div class="flex flex-col gap-4">
{#if description}
{@render description()}
@@ -126,8 +126,6 @@ export async function savePostgresTriggerFromCfg(
publication_name: config.publication_name,
publication: config.publication,
mode: config.mode,
permissioned_as: config.permissioned_as,
preserve_permissioned_as: config.preserve_permissioned_as,
...errorHandlerAndRetries
}
if (edit) {
@@ -38,7 +38,6 @@
import { handleConfigChange } from '../utils'
import TextInput from '$lib/components/text_input/TextInput.svelte'
import { twMerge } from 'tailwind-merge'
import PermissionedAsLine from '../PermissionedAsLine.svelte'
let {
useDrawer = true,
@@ -112,9 +111,6 @@
let isValid = $state(true)
let allowSchedule = $derived(isValid && validCRON && script_path != '')
let deploymentLoading = $state(false)
let permissionedAs = $state<string | undefined>(undefined)
let selectedPermissionedAs = $state<string | undefined>(undefined)
let preservePermissionedAs = $state(false)
const saveDisabled = $derived(
!allowSchedule ||
@@ -511,9 +507,6 @@
extraPerms = cfg.extra_perms ?? {}
can_write = canWrite(cfg.path, cfg.extra_perms, $userStore)
tag = cfg.tag
permissionedAs = cfg.permissioned_as
selectedPermissionedAs = undefined
preservePermissionedAs = false
loading = false
}
@@ -612,9 +605,7 @@
paused_until: paused_until,
cron_version: cronVersion,
extra_perms: extraPerms,
dynamic_skip: dynamicSkipPath,
permissioned_as: selectedPermissionedAs,
preserve_permissioned_as: preservePermissionedAs || undefined
dynamic_skip: dynamicSkipPath
}
}
@@ -691,15 +682,6 @@
<Loader2 class="animate-spin" />
{/if}
{:else}
{#if edit}
<PermissionedAsLine
{permissionedAs}
onPermissionedAsChange={(pa, preserve) => {
selectedPermissionedAs = pa
preservePermissionedAs = preserve
}}
/>
{/if}
<div class="flex flex-col gap-8">
<Section label="Metadata">
<div class="flex flex-col gap-6">
@@ -931,16 +913,12 @@
<Section label="Advanced" collapsable>
{#snippet header()}
<TriggerAdvancedBadges
error_handler_path={errorHandlerPath}
{retry}
extraBadges={[
{ name: 'Recovery Handler', active: !!recoveryHandlerPath },
{ name: 'Success Handler', active: !!successHandlerPath },
{ name: 'Dynamic Skip', active: !!dynamicSkipPath },
{ name: 'Custom Tag', active: !!tag }
]}
/>
<TriggerAdvancedBadges error_handler_path={errorHandlerPath} {retry} extraBadges={[
{ name: 'Recovery Handler', active: !!recoveryHandlerPath },
{ name: 'Success Handler', active: !!successHandlerPath },
{ name: 'Dynamic Skip', active: !!dynamicSkipPath },
{ name: 'Custom Tag', active: !!tag }
]} />
{/snippet}
{@render errorHandler()}
</Section>
@@ -20,7 +20,6 @@
import Required from '$lib/components/Required.svelte'
import { untrack, type Snippet } from 'svelte'
import TriggerEditorToolbar from '../TriggerEditorToolbar.svelte'
import PermissionedAsLine from '../PermissionedAsLine.svelte'
import { saveSqsTriggerFromCfg } from './utils'
import { getHandlerType, handleConfigChange, type Trigger } from '../utils'
import Tabs from '$lib/components/common/tabs/Tabs.svelte'
@@ -89,9 +88,6 @@
let isValid = $state(false)
let initialConfig: Record<string, any> | undefined = undefined
let deploymentLoading = $state(false)
let permissionedAs = $state<string | undefined>(undefined)
let selectedPermissionedAs = $state<string | undefined>(undefined)
let preservePermissionedAs = $state(false)
let optionTabSelected: 'error_handler' | 'retries' = $state('error_handler')
let errorHandlerSelected: ErrorHandler = $state('slack')
let error_handler_path: string | undefined = $state()
@@ -193,9 +189,6 @@
error_handler_args = cfg?.error_handler_args ?? {}
retry = cfg?.retry
errorHandlerSelected = getHandlerType(error_handler_path ?? '')
permissionedAs = cfg?.permissioned_as
selectedPermissionedAs = undefined
preservePermissionedAs = false
} catch (error) {
sendUserToast(`Could not load SQS trigger config: ${error.body}`, true)
}
@@ -230,9 +223,7 @@
mode,
error_handler_path,
error_handler_args,
retry,
permissioned_as: selectedPermissionedAs,
preserve_permissioned_as: preservePermissionedAs || undefined
retry
}
}
@@ -371,15 +362,6 @@
<Loader2 class="animate-spin" />
{/if}
{:else}
{#if edit}
<PermissionedAsLine
{permissionedAs}
onPermissionedAsChange={(pa, preserve) => {
selectedPermissionedAs = pa
preservePermissionedAs = preserve
}}
/>
{/if}
<div class="flex flex-col gap-4">
{#if description}
{@render description()}
@@ -25,8 +25,6 @@ export async function saveSqsTriggerFromCfg(
message_attributes: cfg.message_attributes,
aws_auth_resource_type: cfg.aws_auth_resource_type,
mode: cfg.mode,
permissioned_as: cfg.permissioned_as,
preserve_permissioned_as: cfg.preserve_permissioned_as,
...errorHandlerAndRetries
}
try {
@@ -481,15 +481,14 @@ export function getLightConfig(
} else if (triggerType === 'email') {
return { local_part: trigger.local_part }
} else if (triggerType === 'nextcloud') {
return { event: trigger.service_config?.event ?? trigger.event, summary: trigger.summary }
return { event: trigger.service_config?.event ?? trigger.event }
} else if (triggerType === 'google') {
return {
trigger_type: trigger.service_config?.triggerType ?? trigger.trigger_type,
resource_id: trigger.service_config?.resourceId ?? trigger.resource_id,
resource_name: trigger.service_config?.resourceName ?? trigger.resource_name,
calendar_id: trigger.service_config?.calendarId ?? trigger.calendar_id,
calendar_name: trigger.service_config?.calendarName ?? trigger.calendar_name,
summary: trigger.summary
calendar_name: trigger.service_config?.calendarName ?? trigger.calendar_name
}
} else {
return undefined
@@ -525,12 +524,8 @@ export function getTriggerLabel(trigger: Trigger): string {
return `${config?.url}`
} else if (type === 'email' && config?.local_part) {
return `${config?.local_part}`
} else if (type === 'nextcloud' && config?.summary) {
return `${config.summary}`
} else if (type === 'nextcloud' && path) {
return `${path}`
} else if (type === 'google' && config?.summary) {
return `${config.summary}`
} else if (type === 'google' && path) {
const triggerType = config?.trigger_type ?? config?.triggerType
if (triggerType === 'calendar') {
@@ -31,7 +31,6 @@
import { untrack, type Snippet } from 'svelte'
import TriggerEditorToolbar from '../TriggerEditorToolbar.svelte'
import PermissionedAsLine from '../PermissionedAsLine.svelte'
import { saveWebsocketTriggerFromCfg } from './utils'
import { getHandlerType, handleConfigChange, type Trigger } from '../utils'
import Tabs from '$lib/components/common/tabs/Tabs.svelte'
@@ -106,9 +105,6 @@
let showLoading = $state(false)
let initialConfig: Record<string, any> | undefined = undefined
let deploymentLoading = $state(false)
let permissionedAs = $state<string | undefined>(undefined)
let selectedPermissionedAs = $state<string | undefined>(undefined)
let preservePermissionedAs = $state(false)
let isValid = $state(false)
let optionTabSelected: 'error_handler' | 'retries' = $state('error_handler')
let errorHandlerSelected: ErrorHandler = $state('slack')
@@ -238,9 +234,6 @@
retry = cfg?.retry
errorHandlerSelected = getHandlerType(error_handler_path ?? '')
mode = cfg?.mode ?? 'enabled'
permissionedAs = cfg?.permissioned_as
selectedPermissionedAs = undefined
preservePermissionedAs = false
}
function getSaveCfg() {
@@ -257,9 +250,7 @@
error_handler_path,
error_handler_args,
retry,
mode,
permissioned_as: selectedPermissionedAs,
preserve_permissioned_as: preservePermissionedAs || undefined
mode
}
}
@@ -447,15 +438,6 @@
<Loader2 class="animate-spin" />
{/if}
{:else}
{#if edit}
<PermissionedAsLine
{permissionedAs}
onPermissionedAsChange={(pa, preserve) => {
selectedPermissionedAs = pa
preservePermissionedAs = preserve
}}
/>
{/if}
<div class="flex flex-col gap-4">
{#if mode === 'suspended'}
<TriggerSuspendedJobsAlert {suspendedJobsModal} />
@@ -706,11 +688,9 @@
<Section label="Advanced" collapsable>
{#snippet header()}
<TriggerAdvancedBadges
{error_handler_path}
{retry}
extraBadges={[{ name: 'Filters', active: filters.length > 0 }]}
/>
<TriggerAdvancedBadges {error_handler_path} {retry} extraBadges={[
{ name: 'Filters', active: filters.length > 0 }
]} />
{/snippet}
<div class="flex flex-col gap-6">
<TriggerFilters bind:filters disabled={!can_write} />
@@ -29,9 +29,7 @@ export async function saveWebsocketTriggerFromCfg(
url_runnable_args: triggerCfg.url_runnable_args,
can_return_message: triggerCfg.can_return_message,
can_return_error_result: triggerCfg.can_return_error_result,
...errorHandlerAndRetries,
permissioned_as: triggerCfg.permissioned_as,
preserve_permissioned_as: triggerCfg.preserve_permissioned_as
...errorHandlerAndRetries
}
try {
if (edit) {
@@ -143,7 +143,7 @@
}
}
const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/
const emailPattern = /^[\w-.]+@([\w-]+\.)+[\w-]{2,4}$/
let emailValid = $derived(emailPattern.test(newEmail))
let passwordValid = $derived(newPassword.length >= 2)
let accountFormValid = $derived(emailValid && passwordValid)
+1 -1
View File
@@ -4,7 +4,7 @@ verify_ssl = true
name = "pypi"
[packages]
wmill = ">=1.663.0"
wmill = ">=1.662.0"
sendgrid = "*"
mysql-connector-python = "*"
pymongo = "*"
+1 -1
View File
@@ -1,7 +1,7 @@
openapi: '3.0.3'
info:
version: 1.663.0
version: 1.662.0
title: OpenFlow Spec
contact:
name: Ruben Fiszel
@@ -12,7 +12,7 @@
RootModule = 'WindmillClient.psm1'
# Version number of this module.
ModuleVersion = '1.663.0'
ModuleVersion = '1.662.0'
# Supported PSEditions
# CompatiblePSEditions = @()
+1 -1
View File
@@ -1,6 +1,6 @@
[tool.poetry]
name = "wmill"
version = "1.663.0"
version = "1.662.0"
description = "A client library for accessing Windmill server wrapping the Windmill client API"
license = "Apache-2.0"
homepage = "https://windmill.dev"
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@windmill/windmill",
"version": "1.663.0",
"version": "1.662.0",
"exports": "./src/index.ts",
"publish": {
"exclude": ["!src", "./s3Types.ts", "./sqlUtils.ts", "./client.ts"]
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "windmill-client",
"description": "Windmill SDK client for browsers and Node.js",
"version": "1.663.0",
"version": "1.662.0",
"author": "Ruben Fiszel",
"license": "Apache 2.0",
"sideEffects": false,
+1 -1
View File
@@ -1 +1 @@
1.663.0
1.662.0