Compare commits

...

29 Commits

Author SHA1 Message Date
Ruben Fiszel
3d7882577f chore(main): release 1.463.4 (#5309)
* chore(main): release 1.463.4

* Update CHANGELOG.md

* Apply automatic changes

---------

Co-authored-by: rubenfiszel <275584+rubenfiszel@users.noreply.github.com>
2025-02-18 00:55:01 +01:00
Ruben Fiszel
9234701f05 ensure index creation of root_job_by_path 2025-02-17 23:57:38 +01:00
Alexander Petric
935b5b7996 fix: improve teams settings in workspace settings (#5316) 2025-02-17 22:44:26 +01:00
Ruben Fiszel
c6b2e6653a output incorrect jobs in benchmarks 2025-02-17 22:20:33 +01:00
Ruben Fiszel
0dd0a795a6 nit benchmarks improvement 2025-02-17 21:54:58 +01:00
Ruben Fiszel
953082681e fix: improve que job indices for faster performances 2025-02-17 21:26:46 +01:00
Ruben Fiszel
e0d7a54a2d nit on bench scripts 2025-02-17 19:26:34 +01:00
Ruben Fiszel
85c56e9450 fix: improve que job indices for faster performances 2025-02-17 19:17:30 +01:00
Ruben Fiszel
5e22690bd9 fix: improve que job indices for faster performances 2025-02-17 17:56:28 +01:00
Ruben Fiszel
fe337293da chore(main): release 1.463.3 (#5308)
* chore(main): release 1.463.3

* Apply automatic changes

---------

Co-authored-by: rubenfiszel <275584+rubenfiszel@users.noreply.github.com>
2025-02-17 15:41:06 +01:00
Ruben Fiszel
0208f53541 fix: windmill_admin has implicit bypass rls on v2_job even if role not set 2025-02-17 15:20:39 +01:00
Ruben Fiszel
3493185e2f nits 2025-02-17 14:34:22 +01:00
Ruben Fiszel
3535016608 improve version detection from source 2025-02-17 11:49:06 +01:00
Ruben Fiszel
449cbcf0c3 chore(main): release 1.463.2 (#5305)
* chore(main): release 1.463.2

* Apply automatic changes

---------

Co-authored-by: rubenfiszel <275584+rubenfiszel@users.noreply.github.com>
2025-02-16 02:07:01 +01:00
Alexander Petric
062e6bc161 fix: show skipped flows as success (#5304) 2025-02-16 02:03:25 +01:00
Ruben Fiszel
cad14c25f6 chore(main): release 1.463.1 (#5303)
* chore(main): release 1.463.1

* Apply automatic changes

---------

Co-authored-by: rubenfiszel <275584+rubenfiszel@users.noreply.github.com>
2025-02-15 20:44:26 +01:00
pyranota
53f47bcfc8 fix: not able to filter runs by schedule (#5302) 2025-02-15 20:39:37 +01:00
Ruben Fiszel
f1d9922688 chore(main): release 1.463.0 (#5293)
* chore(main): release 1.463.0

* Apply automatic changes

---------

Co-authored-by: rubenfiszel <275584+rubenfiszel@users.noreply.github.com>
2025-02-14 23:07:39 +01:00
Alexander Petric
8adf02ba3c reactivity fix on teams workspace dropdown (#5300) 2025-02-14 23:07:17 +01:00
Alexander Petric
dad829adf4 feat: adding docker log rotation by default in docker compose (#5295)
* feat: adding docker log rotation by default in docker compose

* add newline

* add compression
2025-02-14 20:48:33 +01:00
HugoCasa
41eecc1437 fix: static website serving (#5298) 2025-02-14 19:03:40 +01:00
Ruben Fiszel
3544e20dca nits 2025-02-14 18:49:26 +01:00
Ruben Fiszel
cfe5232f56 nits 2025-02-14 17:15:59 +01:00
Ruben Fiszel
e0f3e0b1f8 nit 2025-02-14 16:51:49 +01:00
Ruben Fiszel
826fd436bb optimize network calls of flow status 2025-02-14 16:43:58 +01:00
HugoCasa
28558e674f feat: parse script for preprocessor/no_main_func on deploy (#5292)
* feat: parse script for preprocessor/no_main_func on deploy

* fix substitute for linux
2025-02-14 15:42:18 +01:00
Ruben Fiszel
266f82046a fix: improve runs page load time 2025-02-14 13:30:07 +01:00
Ruben Fiszel
7ec4f68dbb chore(main): release 1.462.3 (#5290)
* chore(main): release 1.462.2

* bump
2025-02-14 11:50:12 +01:00
Ruben Fiszel
9ccadb6085 fix: users should be able to see their own jobs 2025-02-14 11:12:26 +01:00
70 changed files with 689 additions and 328 deletions

4
.env
View File

@@ -7,3 +7,7 @@ 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

View File

@@ -1,5 +1,58 @@
# Changelog
## [1.463.4](https://github.com/windmill-labs/windmill/compare/v1.463.3...v1.463.4) (2025-02-17)
### Bug Fixes
* improve queue job indices for faster performances ([9530826](https://github.com/windmill-labs/windmill/commit/953082681e2c4fd71d5ac1acf372265ccc72297b))
* improve teams settings in workspace settings ([#5316](https://github.com/windmill-labs/windmill/issues/5316)) ([935b5b7](https://github.com/windmill-labs/windmill/commit/935b5b799636c0f02597315837268d4a76f6709a))
## [1.463.3](https://github.com/windmill-labs/windmill/compare/v1.463.2...v1.463.3) (2025-02-17)
### Bug Fixes
* windmill_admin has implicit bypass rls on v2_job even if role not set ([0208f53](https://github.com/windmill-labs/windmill/commit/0208f53541473aa51bed0e15d938def3d4530e3f))
## [1.463.2](https://github.com/windmill-labs/windmill/compare/v1.463.1...v1.463.2) (2025-02-16)
### Bug Fixes
* show skipped flows as success ([#5304](https://github.com/windmill-labs/windmill/issues/5304)) ([062e6bc](https://github.com/windmill-labs/windmill/commit/062e6bc161b56215cb081209d37ad8e0cbd1dd99))
## [1.463.1](https://github.com/windmill-labs/windmill/compare/v1.463.0...v1.463.1) (2025-02-15)
### Bug Fixes
* not able to filter runs by schedule ([#5302](https://github.com/windmill-labs/windmill/issues/5302)) ([53f47bc](https://github.com/windmill-labs/windmill/commit/53f47bcfc84ed747b55d3a7d84ccf13ff1c43c97))
## [1.463.0](https://github.com/windmill-labs/windmill/compare/v1.462.1...v1.463.0) (2025-02-14)
### Features
* adding docker log rotation by default in docker compose ([#5295](https://github.com/windmill-labs/windmill/issues/5295)) ([dad829a](https://github.com/windmill-labs/windmill/commit/dad829adf4bff97e998f7d18e0bbafb8497d4198))
* parse script for preprocessor/no_main_func on deploy ([#5292](https://github.com/windmill-labs/windmill/issues/5292)) ([28558e6](https://github.com/windmill-labs/windmill/commit/28558e674f60fef1b165a79c039b1b450759d500))
### Bug Fixes
* display branch chosen even if emoty branch ([77a8eed](https://github.com/windmill-labs/windmill/commit/77a8eedc96171e9f84463407bdc5aec9b7b10d62))
* improve handling of empty branches and loops ([e7d4582](https://github.com/windmill-labs/windmill/commit/e7d458278969897aa7312dcd20a8091aaad772d7))
* improve runs page load time ([266f820](https://github.com/windmill-labs/windmill/commit/266f82046ad287163d24910902393cd63156ca1d))
* static website serving ([#5298](https://github.com/windmill-labs/windmill/issues/5298)) ([41eecc1](https://github.com/windmill-labs/windmill/commit/41eecc1437301bea557fb467cc48b502162de419))
* users should be able to see their own jobs ([9ccadb6](https://github.com/windmill-labs/windmill/commit/9ccadb6085498119bdfcc172d52c7fce1eb3336e))
## [1.462.3](https://github.com/windmill-labs/windmill/compare/v1.462.1...v1.462.2) (2025-02-14)
### Bug Fixes
* users should be able to see their own jobs ([9ccadb6](https://github.com/windmill-labs/windmill/commit/9ccadb6085498119bdfcc172d52c7fce1eb3336e))
## [1.462.2](https://github.com/windmill-labs/windmill/compare/v1.462.1...v1.462.2) (2025-02-14)

View File

@@ -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
]
},

View File

@@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
"query": "SELECT coalesce(COUNT(*) FILTER(WHERE suspend = 0 AND running = false), 0) as \"database_length!\", coalesce(COUNT(*) FILTER(WHERE suspend > 0), 0) as \"suspended!\" FROM v2_as_queue WHERE (workspace_id = $1 OR $2) AND scheduled_for <= now()",
"query": "SELECT coalesce(COUNT(*) FILTER(WHERE suspend = 0 AND running = false), 0) as \"database_length!\", coalesce(COUNT(*) FILTER(WHERE suspend > 0), 0) as \"suspended!\" FROM v2_as_queue WHERE (workspace_id = $1 OR $2) AND scheduled_for <= now() AND ($3::text[] IS NULL OR tag = ANY($3))",
"describe": {
"columns": [
{
@@ -17,7 +17,8 @@
"parameters": {
"Left": [
"Text",
"Bool"
"Bool",
"TextArray"
]
},
"nullable": [
@@ -25,5 +26,5 @@
null
]
},
"hash": "19cc8499f682ec34d54bc4f694cb281a9bd7f5431c646c6268513751fff95395"
"hash": "0cb0e912bc942af2b1ef784455f3f073a79e300f3dd48f14122d1782eee663cd"
}

View File

@@ -0,0 +1,12 @@
{
"db_name": "PostgreSQL",
"query": "DROP INDEX CONCURRENTLY IF EXISTS queue_sort",
"describe": {
"columns": [],
"parameters": {
"Left": []
},
"nullable": []
},
"hash": "0efb16cbf130ec6e9922ecc82a95b252449bd569df374e40ce8820fc3d75a0f0"
}

View File

@@ -0,0 +1,12 @@
{
"db_name": "PostgreSQL",
"query": "DROP INDEX CONCURRENTLY IF EXISTS queue_sort_2",
"describe": {
"columns": [],
"parameters": {
"Left": []
},
"nullable": []
},
"hash": "3738096c29ab9d964be8a74bfd14ff1d599049ebefdaf97a017c9cef8d52ce20"
}

View File

@@ -0,0 +1,12 @@
{
"db_name": "PostgreSQL",
"query": "CREATE INDEX CONCURRENTLY queue_sort_v2 ON v2_job_queue (priority DESC NULLS LAST, scheduled_for, tag) WHERE running = false",
"describe": {
"columns": [],
"parameters": {
"Left": []
},
"nullable": []
},
"hash": "3bbde0fa35d935ec2dd8bd1fb14cfecf48305f5f4b644b3c35355074e1ccce28"
}

View File

@@ -1,12 +0,0 @@
{
"db_name": "PostgreSQL",
"query": "VACUUM (skip_locked) v2_job_queue, v2_job_runtime, v2_job_status",
"describe": {
"columns": [],
"parameters": {
"Left": []
},
"nullable": []
},
"hash": "47455b0ebaf999ab58b2cba3d74cb4bdd64075939a4aa2c117e18372511ea7e0"
}

View File

@@ -0,0 +1,12 @@
{
"db_name": "PostgreSQL",
"query": "DROP INDEX CONCURRENTLY IF EXISTS ix_job_workspace_id_created_at_new_7",
"describe": {
"columns": [],
"parameters": {
"Left": []
},
"nullable": []
},
"hash": "4d4aa16b2a55e57f9376d0cb253e671525969fb5f528ae07576e9dc5e77af1f1"
}

View File

@@ -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"
}

View File

@@ -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
]
},

View File

@@ -0,0 +1,12 @@
{
"db_name": "PostgreSQL",
"query": "DROP INDEX CONCURRENTLY IF EXISTS root_job_index_by_path_2",
"describe": {
"columns": [],
"parameters": {
"Left": []
},
"nullable": []
},
"hash": "6536214f31e9d600e868b01385d8c6395e2440ea27553b7ccb18d7149b106728"
}

View File

@@ -0,0 +1,12 @@
{
"db_name": "PostgreSQL",
"query": "\n UPDATE workspace_settings\n SET teams_command_script = NULL,\n teams_team_id = NULL,\n teams_team_name = NULL\n ",
"describe": {
"columns": [],
"parameters": {
"Left": []
},
"nullable": []
},
"hash": "65c339164e7669360d231d70105849e72bdc197c17c0fc51777c1dc9267e2daf"
}

View File

@@ -1,12 +0,0 @@
{
"db_name": "PostgreSQL",
"query": "create index concurrently if not exists ix_job_workspace_id_created_at_new_6 ON v2_job (workspace_id, created_at DESC) where kind in ('script', 'flow') AND parent_job IS NULL",
"describe": {
"columns": [],
"parameters": {
"Left": []
},
"nullable": []
},
"hash": "8be277b89102a26dda506202a3ef7eb05342cfb3aa9b4f5d80c70fbc50d437ba"
}

View File

@@ -1,12 +0,0 @@
{
"db_name": "PostgreSQL",
"query": "create index concurrently if not exists ix_job_workspace_id_created_at_new_7 ON v2_job (workspace_id, created_at DESC) where kind in ('script', 'flow') AND parent_job IS NULL",
"describe": {
"columns": [],
"parameters": {
"Left": []
},
"nullable": []
},
"hash": "ae8dfecd46425d5f86003eea9a578e9831fc0e700cc76ab9627afe9040a4efe0"
}

View File

@@ -0,0 +1,12 @@
{
"db_name": "PostgreSQL",
"query": "VACUUM v2_job_queue, v2_job_runtime, v2_job_status",
"describe": {
"columns": [],
"parameters": {
"Left": []
},
"nullable": []
},
"hash": "b9b38d63af3670d1f11d5cbb82a8008a9479bf4b3d7231371ebf26382ecde365"
}

View File

@@ -0,0 +1,12 @@
{
"db_name": "PostgreSQL",
"query": "create index concurrently if not exists ix_job_root_job_index_by_path_2 ON v2_job (workspace_id, runnable_path, created_at desc) WHERE parent_job IS NULL",
"describe": {
"columns": [],
"parameters": {
"Left": []
},
"nullable": []
},
"hash": "c481e5d63ebf1aa537cc4ce4e84f9a71af5996bc76f328b3ba1cf68a71880462"
}

View File

@@ -0,0 +1,12 @@
{
"db_name": "PostgreSQL",
"query": "create index concurrently if not exists ix_v2_job_workspace_id_created_at ON v2_job (workspace_id, created_at DESC) where kind in ('script', 'flow', 'singlescriptflow') AND parent_job IS NULL",
"describe": {
"columns": [],
"parameters": {
"Left": []
},
"nullable": []
},
"hash": "d585aa6301c41308b02a1f0fbf068221e732e48dfa6e34d5b025adbbdcbb03e0"
}

View File

@@ -0,0 +1,12 @@
{
"db_name": "PostgreSQL",
"query": "\n UPDATE global_settings\n SET value = (\n SELECT jsonb_agg(elem)\n FROM jsonb_array_elements(value) AS elem\n WHERE NOT (elem ? 'teams_channel')\n )\n WHERE name = 'critical_error_channels'\n ",
"describe": {
"columns": [],
"parameters": {
"Left": []
},
"nullable": []
},
"hash": "df3b60c1d0fb44c97bf2611a7cda6bdb16a1be66e993a5cfadf6de2e3c8a5021"
}

View File

@@ -0,0 +1,14 @@
{
"db_name": "PostgreSQL",
"query": "UPDATE global_settings SET value = $1 WHERE name = 'teams'",
"describe": {
"columns": [],
"parameters": {
"Left": [
"Jsonb"
]
},
"nullable": []
},
"hash": "e565f3b2e51059f563d18a8a9442bcae9640cee7b936820cb46c011222a77ff0"
}

View File

@@ -0,0 +1,12 @@
{
"db_name": "PostgreSQL",
"query": "DROP INDEX CONCURRENTLY IF EXISTS ix_job_workspace_id_created_at_new_6",
"describe": {
"columns": [],
"parameters": {
"Left": []
},
"nullable": []
},
"hash": "faa0e401e6beebde6c3fef06151d3e73a5806f61cae4a53b5bdc888ec7164395"
}

117
backend/Cargo.lock generated
View File

@@ -1552,9 +1552,9 @@ dependencies = [
[[package]]
name = "cc"
version = "1.2.13"
version = "1.2.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c7777341816418c02e033934a09f20dc0ccaf65a5201ef8a450ae0105a573fda"
checksum = "0c3d1b2e905a3a7b00a6141adb0e4c0bb941d11caf55349d863942a1cc44e3c9"
dependencies = [
"jobserver",
"libc",
@@ -1668,9 +1668,9 @@ dependencies = [
[[package]]
name = "clap"
version = "4.5.29"
version = "4.5.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8acebd8ad879283633b343856142139f2da2317c96b05b4dd6181c61e2480184"
checksum = "92b7b18d71fad5313a1e320fa9897994228ce274b60faa4d694fe0ea89cd9e6d"
dependencies = [
"clap_builder",
"clap_derive",
@@ -1678,9 +1678,9 @@ dependencies = [
[[package]]
name = "clap_builder"
version = "4.5.29"
version = "4.5.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f6ba32cbda51c7e1dfd49acc1457ba1a7dec5b64fe360e828acb13ca8dc9c2f9"
checksum = "a35db2071778a7344791a4fb4f95308b5673d219dee3ae348b86642574ecc90c"
dependencies = [
"anstream",
"anstyle",
@@ -3209,9 +3209,9 @@ dependencies = [
[[package]]
name = "equivalent"
version = "1.0.1"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
[[package]]
name = "errno"
@@ -5776,9 +5776,9 @@ dependencies = [
[[package]]
name = "openssl"
version = "0.10.70"
version = "0.10.71"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "61cfb4e166a8bb8c9b55c500bc2308550148ece889be90f609377e58140f42c6"
checksum = "5e14130c6a98cd258fdcb0fb6d744152343ff729cbfcb28c656a9d12b999fbcd"
dependencies = [
"bitflags 2.8.0",
"cfg-if",
@@ -5817,9 +5817,9 @@ dependencies = [
[[package]]
name = "openssl-sys"
version = "0.9.105"
version = "0.9.106"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b22d5b84be05a8d6947c7cb71f7c849aa0f112acd4bf51c2a7c1c988ac0a9dc"
checksum = "8bb61ea9811cc39e3c2069f40b8b8e2e70d8569b361f879786cc7ed48b777cdd"
dependencies = [
"cc",
"libc",
@@ -6608,9 +6608,9 @@ dependencies = [
[[package]]
name = "psm"
version = "0.1.24"
version = "0.1.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "200b9ff220857e53e184257720a14553b2f4aa02577d2ed9842d45d4b9654810"
checksum = "f58e5423e24c18cc840e1c98370b3993c6649cd1678b4d24318bcf0a083cbe88"
dependencies = [
"cc",
]
@@ -6737,9 +6737,9 @@ dependencies = [
[[package]]
name = "quinn-udp"
version = "0.5.9"
version = "0.5.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1c40286217b4ba3a71d644d752e6a0b71f13f1b6a2c5311acfcbe0c2418ed904"
checksum = "e46f3055866785f6b92bc6164b76be02ca8f2eb4b002c0354b28cf4c119e5944"
dependencies = [
"cfg_aliases",
"libc",
@@ -6795,8 +6795,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94"
dependencies = [
"rand_chacha 0.9.0",
"rand_core 0.9.0",
"zerocopy 0.8.17",
"rand_core 0.9.1",
"zerocopy 0.8.18",
]
[[package]]
@@ -6826,7 +6826,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"
dependencies = [
"ppv-lite86",
"rand_core 0.9.0",
"rand_core 0.9.1",
]
[[package]]
@@ -6849,12 +6849,12 @@ dependencies = [
[[package]]
name = "rand_core"
version = "0.9.0"
version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b08f3c9802962f7e1b25113931d94f43ed9725bebc59db9d0c3e9a23b67e15ff"
checksum = "a88e0da7a2c97baa202165137c158d0a2e824ac465d13d81046727b34cb247d3"
dependencies = [
"getrandom 0.3.1",
"zerocopy 0.8.17",
"zerocopy 0.8.18",
]
[[package]]
@@ -7575,9 +7575,9 @@ checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd"
[[package]]
name = "ryu-js"
version = "1.0.1"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ad97d4ce1560a5e27cec89519dc8300d1aa6035b099821261c651486a19e44d5"
checksum = "dd29631678d6fb0903b69223673e122c32e9ae559d0960a38d574695ebc0ea15"
[[package]]
name = "safetensors"
@@ -8150,9 +8150,9 @@ dependencies = [
[[package]]
name = "smallvec"
version = "1.13.2"
version = "1.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd"
dependencies = [
"serde",
]
@@ -9297,9 +9297,9 @@ dependencies = [
[[package]]
name = "tempfile"
version = "3.16.0"
version = "3.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "38c246215d7d24f48ae091a2902398798e05d978b24315d6efbc00ede9a8bb91"
checksum = "22e5a0acb1f3f55f65cc4a866c361b2fb2a0ff6366785ae6fbb5f85df07ba230"
dependencies = [
"cfg-if",
"fastrand 2.3.0",
@@ -10858,7 +10858,7 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]]
name = "windmill"
version = "1.462.2"
version = "1.463.4"
dependencies = [
"anyhow",
"axum",
@@ -10901,7 +10901,7 @@ dependencies = [
[[package]]
name = "windmill-api"
version = "1.462.2"
version = "1.463.4"
dependencies = [
"anyhow",
"argon2",
@@ -10988,13 +10988,14 @@ dependencies = [
"windmill-git-sync",
"windmill-indexer",
"windmill-parser",
"windmill-parser-py",
"windmill-parser-ts",
"windmill-queue",
]
[[package]]
name = "windmill-api-client"
version = "1.462.2"
version = "1.463.4"
dependencies = [
"base64 0.22.1",
"chrono",
@@ -11012,7 +11013,7 @@ dependencies = [
[[package]]
name = "windmill-audit"
version = "1.462.2"
version = "1.463.4"
dependencies = [
"chrono",
"serde",
@@ -11025,7 +11026,7 @@ dependencies = [
[[package]]
name = "windmill-autoscaling"
version = "1.462.2"
version = "1.463.4"
dependencies = [
"anyhow",
"serde",
@@ -11039,7 +11040,7 @@ dependencies = [
[[package]]
name = "windmill-common"
version = "1.462.2"
version = "1.463.4"
dependencies = [
"anyhow",
"async-stream",
@@ -11098,7 +11099,7 @@ dependencies = [
[[package]]
name = "windmill-git-sync"
version = "1.462.2"
version = "1.463.4"
dependencies = [
"regex",
"serde",
@@ -11112,7 +11113,7 @@ dependencies = [
[[package]]
name = "windmill-indexer"
version = "1.462.2"
version = "1.463.4"
dependencies = [
"anyhow",
"bytes",
@@ -11135,7 +11136,7 @@ dependencies = [
[[package]]
name = "windmill-macros"
version = "1.462.2"
version = "1.463.4"
dependencies = [
"itertools 0.14.0",
"lazy_static",
@@ -11147,7 +11148,7 @@ dependencies = [
[[package]]
name = "windmill-parser"
version = "1.462.2"
version = "1.463.4"
dependencies = [
"convert_case 0.6.0",
"serde",
@@ -11156,7 +11157,7 @@ dependencies = [
[[package]]
name = "windmill-parser-bash"
version = "1.462.2"
version = "1.463.4"
dependencies = [
"anyhow",
"lazy_static",
@@ -11168,7 +11169,7 @@ dependencies = [
[[package]]
name = "windmill-parser-csharp"
version = "1.462.2"
version = "1.463.4"
dependencies = [
"anyhow",
"serde_json",
@@ -11180,7 +11181,7 @@ dependencies = [
[[package]]
name = "windmill-parser-go"
version = "1.462.2"
version = "1.463.4"
dependencies = [
"anyhow",
"gosyn",
@@ -11192,7 +11193,7 @@ dependencies = [
[[package]]
name = "windmill-parser-graphql"
version = "1.462.2"
version = "1.463.4"
dependencies = [
"anyhow",
"lazy_static",
@@ -11204,7 +11205,7 @@ dependencies = [
[[package]]
name = "windmill-parser-php"
version = "1.462.2"
version = "1.463.4"
dependencies = [
"anyhow",
"itertools 0.14.0",
@@ -11215,7 +11216,7 @@ dependencies = [
[[package]]
name = "windmill-parser-py"
version = "1.462.2"
version = "1.463.4"
dependencies = [
"anyhow",
"itertools 0.14.0",
@@ -11226,7 +11227,7 @@ dependencies = [
[[package]]
name = "windmill-parser-py-imports"
version = "1.462.2"
version = "1.463.4"
dependencies = [
"anyhow",
"async-recursion",
@@ -11246,7 +11247,7 @@ dependencies = [
[[package]]
name = "windmill-parser-rust"
version = "1.462.2"
version = "1.463.4"
dependencies = [
"anyhow",
"convert_case 0.6.0",
@@ -11263,7 +11264,7 @@ dependencies = [
[[package]]
name = "windmill-parser-sql"
version = "1.462.2"
version = "1.463.4"
dependencies = [
"anyhow",
"lazy_static",
@@ -11275,7 +11276,7 @@ dependencies = [
[[package]]
name = "windmill-parser-ts"
version = "1.462.2"
version = "1.463.4"
dependencies = [
"anyhow",
"lazy_static",
@@ -11293,7 +11294,7 @@ dependencies = [
[[package]]
name = "windmill-parser-wasm"
version = "1.462.2"
version = "1.463.4"
dependencies = [
"anyhow",
"getrandom 0.2.15",
@@ -11315,7 +11316,7 @@ dependencies = [
[[package]]
name = "windmill-parser-yaml"
version = "1.462.2"
version = "1.463.4"
dependencies = [
"anyhow",
"serde_json",
@@ -11325,7 +11326,7 @@ dependencies = [
[[package]]
name = "windmill-queue"
version = "1.462.2"
version = "1.463.4"
dependencies = [
"anyhow",
"async-recursion",
@@ -11358,7 +11359,7 @@ dependencies = [
[[package]]
name = "windmill-sql-datatype-parser-wasm"
version = "1.462.2"
version = "1.463.4"
dependencies = [
"wasm-bindgen",
"wasm-bindgen-test",
@@ -11368,7 +11369,7 @@ dependencies = [
[[package]]
name = "windmill-worker"
version = "1.462.2"
version = "1.463.4"
dependencies = [
"anyhow",
"async-recursion",
@@ -11782,11 +11783,11 @@ dependencies = [
[[package]]
name = "zerocopy"
version = "0.8.17"
version = "0.8.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aa91407dacce3a68c56de03abe2760159582b846c6a4acd2f456618087f12713"
checksum = "79386d31a42a4996e3336b0919ddb90f81112af416270cff95b5f5af22b839c2"
dependencies = [
"zerocopy-derive 0.8.17",
"zerocopy-derive 0.8.18",
]
[[package]]
@@ -11802,9 +11803,9 @@ dependencies = [
[[package]]
name = "zerocopy-derive"
version = "0.8.17"
version = "0.8.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "06718a168365cad3d5ff0bb133aad346959a2074bd4a85c121255a11304a8626"
checksum = "76331675d372f91bf8d17e13afbd5fe639200b73d01f0fc748bb059f9cca2db7"
dependencies = [
"proc-macro2",
"quote",

View File

@@ -1,6 +1,6 @@
[package]
name = "windmill"
version = "1.462.2"
version = "1.463.4"
authors.workspace = true
edition.workspace = true
@@ -30,7 +30,7 @@ members = [
]
[workspace.package]
version = "1.462.2"
version = "1.463.4"
authors = ["Ruben Fiszel <ruben@windmill.dev>"]
edition = "2021"
@@ -187,7 +187,7 @@ hex = "^0"
sql-builder = "^3"
argon2 = "^0"
quick_cache = "^0"
rand = "^0"
rand = "=0.9.0"
rand_core = { version = "^0", features = ["std"] }
magic-crypt = "^3"
git-version = "^0"

View File

@@ -1 +1 @@
703a03ac430b6f603a5a189e5b4ff9a42bb2bd7f
e507af5589efb1a8a72ae4e231130f749bde738d

View File

@@ -0,0 +1 @@
-- Add down migration script here

View File

@@ -0,0 +1,8 @@
-- Add up migration script here
DROP POLICY IF EXISTS see_own ON v2_job;
CREATE POLICY see_own ON v2_job
AS PERMISSIVE
FOR ALL
TO windmill_user
USING ((SPLIT_PART((permissioned_as)::TEXT, '/'::TEXT, 1) = 'u'::TEXT) AND
(SPLIT_PART((permissioned_as)::TEXT, '/'::TEXT, 2) = CURRENT_SETTING('session.user'::TEXT)));

View File

@@ -0,0 +1 @@
-- Add down migration script here

View File

@@ -0,0 +1,3 @@
-- Add up migration script here
DROP POLICY IF EXISTS admin_policy ON v2_job;
CREATE POLICY admin_policy ON v2_job FOR ALL TO windmill_admin USING (true);

View File

@@ -60,6 +60,7 @@ fn filter_non_main(code: &str, main_name: &str) -> String {
pub fn parse_python_signature(
code: &str,
override_main: Option<String>,
skip_params: bool,
) -> anyhow::Result<MainArgSignature> {
let main_name = override_main.unwrap_or("main".to_string());
@@ -78,11 +79,13 @@ pub fn parse_python_signature(
let ast = Suite::parse(&filtered_code, "main.py")
.map_err(|e| anyhow::anyhow!("Error parsing code: {}", e.to_string()))?;
let param = ast.into_iter().find_map(|x| match x {
let params = ast.into_iter().find_map(|x| match x {
Stmt::FunctionDef(StmtFunctionDef { name, args, .. }) if &name == &main_name => Some(*args),
_ => None,
});
if let Some(params) = param {
if !skip_params && params.is_some() {
let params = params.unwrap();
//println!("{:?}", params);
let def_arg_start = params.args.len() - params.defaults().count();
Ok(MainArgSignature {
@@ -149,7 +152,7 @@ pub fn parse_python_signature(
star_args: false,
star_kwargs: false,
args: vec![],
no_main_func: Some(true),
no_main_func: Some(params.is_none()),
has_preprocessor: Some(has_preprocessor),
})
}
@@ -287,7 +290,7 @@ def main(test1: str, name: datetime.datetime = datetime.now(), byte: bytes = byt
";
//println!("{}", serde_json::to_string()?);
assert_eq!(
parse_python_signature(code, None)?,
parse_python_signature(code, None, false)?,
MainArgSignature {
star_args: false,
star_kwargs: false,
@@ -376,7 +379,7 @@ def main(test1: str,
";
//println!("{}", serde_json::to_string()?);
assert_eq!(
parse_python_signature(code, None)?,
parse_python_signature(code, None, false)?,
MainArgSignature {
star_args: false,
star_kwargs: false,
@@ -436,7 +439,7 @@ def main(test1: str,
";
//println!("{}", serde_json::to_string()?);
assert_eq!(
parse_python_signature(code, None)?,
parse_python_signature(code, None, false)?,
MainArgSignature {
star_args: false,
star_kwargs: false,
@@ -493,7 +496,7 @@ def main(test1: Literal["foo", "bar"], test2: List[Literal["foo", "bar"]]): retu
"#;
//println!("{}", serde_json::to_string()?);
assert_eq!(
parse_python_signature(code, None)?,
parse_python_signature(code, None, false)?,
MainArgSignature {
star_args: false,
star_kwargs: false,
@@ -537,7 +540,7 @@ def main(test1: DynSelect_foo): return
"#;
//println!("{}", serde_json::to_string()?);
assert_eq!(
parse_python_signature(code, None)?,
parse_python_signature(code, None, false)?,
MainArgSignature {
star_args: false,
star_kwargs: false,
@@ -568,7 +571,7 @@ def hello(): return
"#;
//println!("{}", serde_json::to_string()?);
assert_eq!(
parse_python_signature(code, None)?,
parse_python_signature(code, None, false)?,
MainArgSignature {
star_args: false,
star_kwargs: false,
@@ -596,7 +599,7 @@ def main(): return
"#;
//println!("{}", serde_json::to_string()?);
assert_eq!(
parse_python_signature(code, None)?,
parse_python_signature(code, None, false)?,
MainArgSignature {
star_args: false,
star_kwargs: false,
@@ -617,10 +620,10 @@ def main(a: list, e: List[int], b: list = [1,2,3,4], c = [1,2,3,4], d = ["a", "b
"#;
println!(
"{}",
serde_json::to_string(&parse_python_signature(code, None)?)?
serde_json::to_string(&parse_python_signature(code, None, false)?)?
);
assert_eq!(
parse_python_signature(code, None)?,
parse_python_signature(code, None, false)?,
MainArgSignature {
star_args: false,
star_kwargs: false,

View File

@@ -134,6 +134,7 @@ pub fn parse_expr_for_ids(code: &str) -> anyhow::Result<Vec<(String, String)>> {
pub fn parse_deno_signature(
code: &str,
skip_dflt: bool,
skip_params: bool,
main_override: Option<String>,
) -> anyhow::Result<MainArgSignature> {
let cm: Lrc<SourceMap> = Default::default();
@@ -179,27 +180,26 @@ pub fn parse_deno_signature(
});
let mut c: u16 = 0;
if let Some(params) = params {
let r = MainArgSignature {
star_args: false,
star_kwargs: false,
args: params
.into_iter()
.map(|x| parse_param(x, &cm, skip_dflt, &mut c))
.collect::<anyhow::Result<Vec<Arg>>>()?,
no_main_func: Some(false),
has_preprocessor: Some(has_preprocessor),
};
Ok(r)
} else {
Ok(MainArgSignature {
star_args: false,
star_kwargs: false,
args: vec![],
no_main_func: Some(true),
has_preprocessor: Some(has_preprocessor),
})
}
let no_main_func = params.is_none();
let r = MainArgSignature {
star_args: false,
star_kwargs: false,
args: if skip_params {
vec![]
} else {
params
.map(|x| {
x.into_iter()
.map(|x| parse_param(x, &cm, skip_dflt, &mut c))
.collect::<anyhow::Result<Vec<Arg>>>()
})
.transpose()?
.unwrap_or_else(|| vec![])
},
no_main_func: Some(no_main_func),
has_preprocessor: Some(has_preprocessor),
};
Ok(r)
}
fn parse_param(

View File

@@ -17,10 +17,11 @@ fn wrap_sig(r: anyhow::Result<MainArgSignature>) -> String {
#[cfg(feature = "ts-parser")]
#[wasm_bindgen]
pub fn parse_deno(code: &str, main_override: Option<String>) -> String {
pub fn parse_deno(code: &str, main_override: Option<String>, skip_params: Option<bool>) -> String {
wrap_sig(windmill_parser_ts::parse_deno_signature(
code,
false,
false,
main_override,
))
}
@@ -73,6 +74,7 @@ pub fn parse_python(code: &str, main_override: Option<String>) -> String {
wrap_sig(windmill_parser_py::parse_python_signature(
code,
main_override,
false,
))
}

View File

@@ -18,7 +18,7 @@ export function main(test1?: string, test2: string = \"burkina\",
}
";
assert_eq!(
parse_deno_signature(code, false, None)?,
parse_deno_signature(code, false, false, None)?,
MainArgSignature {
star_args: false,
star_kwargs: false,
@@ -159,7 +159,7 @@ export function main(test2 = \"burkina\",
}
";
assert_eq!(
parse_deno_signature(code, false, None)?,
parse_deno_signature(code, false, false, None)?,
MainArgSignature {
star_args: false,
star_kwargs: false,
@@ -236,7 +236,7 @@ export function main(foo: FooBar, {a, b}: FooBar, {c, d}: FooBar = {a: \"foo\",
}
";
assert_eq!(
parse_deno_signature(code, false, None)?,
parse_deno_signature(code, false, false, None)?,
MainArgSignature {
star_args: false,
star_kwargs: false,
@@ -282,7 +282,7 @@ export function main(foo: (\"foo\" | \"bar\")[]) {
}
";
assert_eq!(
parse_deno_signature(code, false, None)?,
parse_deno_signature(code, false, false, None)?,
MainArgSignature {
star_args: false,
star_kwargs: false,

View File

@@ -68,7 +68,7 @@ fi
if [ "$REVERT" == "YES" ]; then
for ee_file in $(find ${EE_CODE_DIR} -name "*ee.rs"); do
ce_file="${ee_file/${EE_CODE_DIR}/.}"
ce_file="${ee_file/${EE_CODE_DIR}/}"
ce_file="${root_dirpath}/backend/${ce_file}"
if [ "$REVERT_PREVIOUS" == "YES" ]; then
git checkout HEAD@{3} ${ce_file} || true
@@ -80,7 +80,7 @@ if [ "$REVERT" == "YES" ]; then
else
# This replaces all files in current repo with alternative EE files in windmill-ee-private
for ee_file in $(find "${EE_CODE_DIR}" -name "*ee.rs"); do
ce_file="${ee_file/${EE_CODE_DIR}/.}"
ce_file="${ee_file/${EE_CODE_DIR}/}"
ce_file="${root_dirpath}/backend/${ce_file}"
if [[ -f "${ce_file}" ]]; then
rm "${ce_file}"

View File

@@ -36,6 +36,7 @@ windmill-common = { workspace = true, default-features = false }
windmill-audit.workspace = true
windmill-parser.workspace = true
windmill-parser-ts.workspace = true
windmill-parser-py.workspace = true
windmill-git-sync.workspace = true
windmill-indexer = { workspace = true, optional = true }
tokio.workspace = true

View File

@@ -1,7 +1,7 @@
openapi: "3.0.3"
info:
version: 1.462.2
version: 1.463.4
title: Windmill API
contact:

View File

@@ -545,8 +545,8 @@ async fn fix_job_completed_index(db: &DB) -> Result<(), Error> {
.await?;
});
run_windmill_migration!("fix_job_index_1", &db, |tx| {
let migration_job_name = "fix_job_completed_index_4";
run_windmill_migration!("fix_job_index_1_II", &db, |tx| {
let migration_job_name = "fix_job_index_1_II";
let mut i = 1;
tracing::info!("step {i} of {migration_job_name} migration");
sqlx::query!("create index concurrently if not exists ix_job_workspace_id_created_at_new_3 ON v2_job (workspace_id, created_at DESC)")
@@ -573,31 +573,26 @@ async fn fix_job_completed_index(db: &DB) -> Result<(), Error> {
i += 1;
tracing::info!("step {i} of {migration_job_name} migration");
sqlx::query!("create index concurrently if not exists ix_job_workspace_id_created_at_new_6 ON v2_job (workspace_id, created_at DESC) where kind in ('script', 'flow') AND parent_job IS NULL")
.execute(db)
.await?;
i += 1;
tracing::info!("step {i} of {migration_job_name} migration");
sqlx::query!("create index concurrently if not exists ix_job_workspace_id_created_at_new_7 ON v2_job (workspace_id, created_at DESC) where kind in ('script', 'flow') AND parent_job IS NULL")
.execute(db)
.await?;
i += 1;
tracing::info!("step {i} of {migration_job_name} migration");
sqlx::query!("create index concurrently if not exists ix_completed_job_workspace_id_started_at_new_2 ON v2_job_completed (workspace_id, started_at DESC)")
.execute(db)
.await?;
i += 1;
tracing::info!("step {i} of {migration_job_name} migration");
sqlx::query!("create index concurrently if not exists root_job_index_by_path_2 ON v2_job (workspace_id, runnable_path, created_at desc) WHERE parent_job IS NULL")
sqlx::query!("create index concurrently if not exists ix_job_root_job_index_by_path_2 ON v2_job (workspace_id, runnable_path, created_at desc) WHERE parent_job IS NULL")
.execute(db)
.await?;
i += 1;
tracing::info!("step {i} of {migration_job_name} migration");
sqlx::query!("DROP INDEX CONCURRENTLY IF EXISTS root_job_index_by_path_2")
.execute(db)
.await?;
i += 1;
tracing::info!("step {i} of {migration_job_name} migration");
sqlx::query!("create index concurrently if not exists ix_job_created_at ON v2_job (created_at DESC)")
.execute(db)
.await?;
@@ -653,6 +648,37 @@ async fn fix_job_completed_index(db: &DB) -> Result<(), Error> {
.await?;
});
run_windmill_migration!("v2_improve_v2_job_indices_ii", &db, |tx| {
sqlx::query!("create index concurrently if not exists ix_v2_job_workspace_id_created_at ON v2_job (workspace_id, created_at DESC) where kind in ('script', 'flow', 'singlescriptflow') AND parent_job IS NULL")
.execute(db)
.await?;
sqlx::query!("DROP INDEX CONCURRENTLY IF EXISTS ix_job_workspace_id_created_at_new_6")
.execute(db)
.await?;
sqlx::query!("DROP INDEX CONCURRENTLY IF EXISTS ix_job_workspace_id_created_at_new_7")
.execute(db)
.await?;
});
run_windmill_migration!("v2_improve_v2_queued_jobs_indices", &db, |tx| {
sqlx::query!("CREATE INDEX CONCURRENTLY queue_sort_v2 ON v2_job_queue (priority DESC NULLS LAST, scheduled_for, tag) WHERE running = false")
.execute(db)
.await?;
// sqlx::query!("CREATE INDEX CONCURRENTLY queue_sort_2_v2 ON v2_job_queue (tag, priority DESC NULLS LAST, scheduled_for) WHERE running = false")
// .execute(db)
// .await?;
sqlx::query!("DROP INDEX CONCURRENTLY IF EXISTS queue_sort")
.execute(db)
.await?;
sqlx::query!("DROP INDEX CONCURRENTLY IF EXISTS queue_sort_2")
.execute(db)
.await?;
});
Ok(())
}

View File

@@ -538,7 +538,7 @@ async fn get_http_route_trigger(
let route_path = trigger.route_path.clone();
if trigger.is_static_website {
router
.insert(format!("{}/*wm_subpath", route_path), idx)
.insert(format!("/{}/*wm_subpath", route_path), idx)
.unwrap_or_else(|e| {
tracing::warn!(
"Failed to consider http trigger route {}: {:?}",
@@ -547,19 +547,22 @@ async fn get_http_route_trigger(
);
});
}
router.insert(route_path.as_str(), idx).unwrap_or_else(|e| {
tracing::warn!(
"Failed to consider http trigger route {}: {:?}",
route_path,
e,
);
});
router
.insert(format!("/{}", route_path), idx)
.unwrap_or_else(|e| {
tracing::warn!(
"Failed to consider http trigger route {}: {:?}",
route_path,
e,
);
});
}
let trigger_idx = router.at(route_path.0.as_str()).ok();
let requested_path = format!("/{}", route_path.0);
let trigger_idx = router.at(requested_path.as_str()).ok();
let matchit::Match { value: trigger_idx, params } =
not_found_if_none(trigger_idx, "Trigger", route_path.0.as_str())?;
not_found_if_none(trigger_idx, "Trigger", requested_path.as_str())?;
let trigger = triggers.remove(trigger_idx.to_owned());

View File

@@ -1161,7 +1161,7 @@ pub struct ListableCompletedJob {
pub parent_job: Option<Uuid>,
pub created_by: String,
pub created_at: chrono::DateTime<chrono::Utc>,
pub started_at: chrono::DateTime<chrono::Utc>,
pub started_at: Option<chrono::DateTime<chrono::Utc>>,
pub duration_ms: i64,
pub success: bool,
#[serde(skip_serializing_if = "Option::is_none")]
@@ -1319,7 +1319,7 @@ pub fn filter_list_queue_query(
}
if let Some(p) = &lq.schedule_path {
sqlb.and_where_eq("trigger", "?".bind(p));
sqlb.and_where_eq("trigger_kind", "schedule");
sqlb.and_where_eq("trigger_kind", "'schedule'");
}
if let Some(h) = &lq.script_hash {
sqlb.and_where_eq("runnable_id", "?".bind(h));
@@ -1647,6 +1647,7 @@ struct QueueStats {
#[derive(Deserialize)]
pub struct CountQueueJobsQuery {
all_workspaces: Option<bool>,
tags: Option<String>,
}
async fn count_queue_jobs(
@@ -1654,12 +1655,16 @@ async fn count_queue_jobs(
Path(w_id): Path<String>,
Query(cq): Query<CountQueueJobsQuery>,
) -> error::JsonResult<QueueStats> {
let tags = cq
.tags
.map(|t| t.split(',').map(|s| s.to_string()).collect::<Vec<_>>());
Ok(Json(
sqlx::query_as!(
QueueStats,
"SELECT coalesce(COUNT(*) FILTER(WHERE suspend = 0 AND running = false), 0) as \"database_length!\", coalesce(COUNT(*) FILTER(WHERE suspend > 0), 0) as \"suspended!\" FROM v2_as_queue WHERE (workspace_id = $1 OR $2) AND scheduled_for <= now()",
"SELECT coalesce(COUNT(*) FILTER(WHERE suspend = 0 AND running = false), 0) as \"database_length!\", coalesce(COUNT(*) FILTER(WHERE suspend > 0), 0) as \"suspended!\" FROM v2_as_queue WHERE (workspace_id = $1 OR $2) AND scheduled_for <= now() AND ($3::text[] IS NULL OR tag = ANY($3))",
w_id,
w_id == "admins" && cq.all_workspaces.unwrap_or(false),
tags.as_ref().map(|v| v.as_slice())
)
.fetch_one(&db)
.await?,
@@ -1800,13 +1805,13 @@ async fn list_jobs(
}
sqlc.unwrap().limit(per_page).offset(offset).query()?
};
let mut tx = user_db.begin(&authed).await?;
let mut tx: Transaction<'_, Postgres> = user_db.begin(&authed).await?;
#[cfg(feature = "prometheus")]
let start = Instant::now();
#[cfg(feature = "prometheus")]
if _api_list_jobs_query_duration.is_some() {
if _api_list_jobs_query_duration.is_some() || true {
tracing::info!("list_jobs query: {}", sql);
}
@@ -2681,7 +2686,7 @@ const CJ_FIELDS: &[&str] = &[
"v2_job.runnable_path as script_path",
"null as args",
"v2_job_completed.duration_ms",
"v2_job_completed.status = 'success' as success",
"v2_job_completed.status = 'success' OR v2_job_completed.status = 'skipped' as success",
"false as deleted",
"v2_job_completed.status = 'canceled' as canceled",
"v2_job_completed.canceled_by",
@@ -4695,6 +4700,7 @@ struct BatchInfo {
flow_value: Option<FlowValue>,
path: Option<String>,
rawscript: Option<BatchRawScript>,
tag: Option<String>,
}
#[tracing::instrument(level = "trace", skip_all)]
@@ -4863,6 +4869,8 @@ async fn add_batch_jobs(
} else {
format!("{}", language.as_str())
}
} else if let Some(tag) = batch_info.tag {
tag
} else {
format!("{}", language.as_str())
};
@@ -5472,7 +5480,7 @@ async fn list_completed_jobs(
"v2_job.created_at",
"v2_job_completed.started_at",
"v2_job_completed.duration_ms",
"v2_job_completed.status = 'success' as success",
"v2_job_completed.status = 'success' OR v2_job_completed.status = 'skipped' as success",
"v2_job.runnable_id as script_hash",
"v2_job.runnable_path as script_path",
"false as deleted",

View File

@@ -625,6 +625,19 @@ async fn create_script_internal<'c>(
} else {
ns.language.clone()
};
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)
}
ScriptLang::Python3 => {
let args = windmill_parser_py::parse_python_signature(&ns.content, None, true)?;
(args.no_main_func, args.has_preprocessor)
}
_ => (ns.no_main_func, ns.has_preprocessor),
};
sqlx::query!(
"INSERT INTO script (workspace_id, hash, path, parent_hashes, summary, description, \
content, created_by, schema, is_template, extra_perms, lock, language, kind, tag, \
@@ -660,9 +673,9 @@ async fn create_script_internal<'c>(
ns.timeout,
ns.concurrency_key,
ns.visible_to_runner_only,
ns.no_main_func,
no_main_func.filter(|x| *x), // should be Some(true) or None
codebase,
ns.has_preprocessor,
has_preprocessor.filter(|x| *x), // should be Some(true) or None
if ns.on_behalf_of_email.is_some() {
Some(&authed.email)
} else {

View File

@@ -281,7 +281,7 @@ pub async fn connect_db(
pub async fn connect(
database_url: &str,
max_connections: u32,
worker_mode: bool,
_worker_mode: bool,
) -> Result<sqlx::Pool<sqlx::Postgres>, error::Error> {
use std::time::Duration;
@@ -289,18 +289,18 @@ pub async fn connect(
.min_connections((max_connections / 5).clamp(3, max_connections))
.max_connections(max_connections)
.max_lifetime(Duration::from_secs(30 * 60)) // 30 mins
.after_connect(move |conn, _| {
if worker_mode {
Box::pin(async move {
sqlx::query("SET enable_seqscan = OFF;")
.execute(conn)
.await?;
Ok(())
})
} else {
Box::pin(async move { Ok(()) })
}
})
// .after_connect(move |conn, _| {
// if worker_mode {
// Box::pin(async move {
// // sqlx::query("SET enable_seqscan = OFF;")
// // .execute(conn)
// // .await?;
// Ok(())
// })
// } else {
// Box::pin(async move { Ok(()) })
// }
// })
.connect_with(
sqlx::postgres::PgConnectOptions::from_str(database_url)?.statement_cache_capacity(400),
)

View File

@@ -47,8 +47,11 @@ lazy_static::lazy_static! {
.connect_timeout(std::time::Duration::from_secs(10))
.build().unwrap();
pub static ref GIT_SEM_VERSION: Version = Version::parse(
// skip first `v` character.
GIT_VERSION.split_at(1).1
if GIT_VERSION.starts_with('v') {
&GIT_VERSION[1..]
} else {
GIT_VERSION
}
).unwrap_or(Version::new(0, 1, 0));
}

View File

@@ -657,7 +657,7 @@ pub async fn update_min_version<'c, E: sqlx::Executor<'c, Database = sqlx::Postg
let min_version = pings
.iter()
.filter(|x| !x.is_empty())
.filter_map(|x| semver::Version::parse(x.split_at(1).1).ok())
.filter_map(|x| semver::Version::parse(if x.starts_with('v') { &x[1..] } else { x }).ok())
.min()
.unwrap_or_else(|| cur_version.clone());

View File

@@ -2108,12 +2108,15 @@ 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();
let r = sqlx::query_as::<_, PulledJob>(query)
.bind(worker_name)
.fetch_optional(db)
.await?;
if let Some(pulled_job) = r {
// tracing::info!("pulled job: {:?}", instant.elapsed().as_micros());
highest_priority_job = Some(pulled_job);
break;
}

View File

@@ -951,6 +951,7 @@ pub async fn handle_bun_job(
let args = windmill_parser_ts::parse_deno_signature(
inner_content,
true,
false,
main_override.map(ToString::to_string),
)?
.args;
@@ -960,6 +961,7 @@ pub async fn handle_bun_job(
windmill_parser_ts::parse_deno_signature(
inner_content,
true,
false,
Some("preprocessor".to_string()),
)?
.args,
@@ -1573,7 +1575,7 @@ pub async fn start_worker(
{
// let mut start = Instant::now();
let args = windmill_parser_ts::parse_deno_signature(inner_content, true, None)?.args;
let args = windmill_parser_ts::parse_deno_signature(inner_content, true, false, None)?.args;
let dates = args
.iter()
.filter_map(|x| {

View File

@@ -205,6 +205,7 @@ pub async fn handle_deno_job(
let args = windmill_parser_ts::parse_deno_signature(
inner_content,
true,
false,
main_override.map(ToString::to_string),
)?
.args;
@@ -214,6 +215,7 @@ pub async fn handle_deno_job(
windmill_parser_ts::parse_deno_signature(
inner_content,
true,
false,
Some("preprocessor".to_string()),
)?
.args,
@@ -533,7 +535,7 @@ pub async fn start_worker(
{
// let mut start = Instant::now();
let args = windmill_parser_ts::parse_deno_signature(inner_content, true, None)?.args;
let args = windmill_parser_ts::parse_deno_signature(inner_content, true, false, None)?.args;
let dates = args
.iter()
.filter_map(|x| {

View File

@@ -775,7 +775,7 @@ pub async fn eval_fetch_timeout(
let (sender, mut receiver) = oneshot::channel::<IsolateHandle>();
let parsed_args = windmill_parser_ts::parse_deno_signature(&ts_expr, true, None)?.args;
let parsed_args = windmill_parser_ts::parse_deno_signature(&ts_expr, true, false, None)?.args;
let spread = parsed_args
.into_iter()
.map(|x| {

View File

@@ -1296,12 +1296,14 @@ async fn prepare_wrapper(
let sig = windmill_parser_py::parse_python_signature(
inner_content,
main_override.map(ToString::to_string),
false,
)?;
let pre_sig = if apply_preprocessor {
Some(windmill_parser_py::parse_python_signature(
inner_content,
Some("preprocessor".to_string()),
false,
)?)
} else {
None
@@ -1661,7 +1663,7 @@ async fn spawn_uv_install(
.replace("{TARGET_DIR}", &venv_p)
.replace("{CLONE_NEWUSER}", &(!*DISABLE_NUSER).to_string()),
)?;
let mut nsjail_cmd = Command::new(NSJAIL_PATH.as_str());
nsjail_cmd
.current_dir(job_dir)

View File

@@ -1277,7 +1277,7 @@ pub async fn run_worker(
tokio::task::spawn(
(async move {
tracing::info!(worker = %worker_name, hostname = %hostname, "vacuuming queue");
if let Err(e) = sqlx::query!("VACUUM (skip_locked) v2_job_queue, v2_job_runtime, v2_job_status")
if let Err(e) = sqlx::query!("VACUUM v2_job_queue, v2_job_runtime, v2_job_status")
.execute(&db2)
.await
{

View File

@@ -26,7 +26,7 @@ async function verifyOutputs(uuids: string[], workspace: string) {
incorrectResults++;
}
if (job.result !== uuid) {
console.log(`Job ${uuid} did not output the correct value`);
console.log(`Job ${uuid} did not output the correct value: ${JSON.stringify(job)}`);
incorrectResults++;
}
} catch (_) {
@@ -37,6 +37,7 @@ async function verifyOutputs(uuids: string[], workspace: string) {
console.log(`Incorrect results: ${incorrectResults}`);
}
export const NON_TEST_TAGS = ["deno", "python", "go", "bash", "dedicated", "bun", "nativets", "flow"]
export async function main({
host,
email,
@@ -96,11 +97,11 @@ export async function main({
windmill.setClient(final_token, host);
const enc = (s: string) => new TextEncoder().encode(s);
async function getQueueCount() {
async function getQueueCount(tags?: string[]) {
return (
await (
await fetch(
config.server + "/api/w/" + config.workspace_id + "/jobs/queue/count",
config.server + "/api/w/" + config.workspace_id + "/jobs/queue/count" + (tags && tags.length > 0 ? "?tags=" + tags.join(",") : ""),
{ headers: { ["Authorization"]: "Bearer " + config.token } }
)
).json()
@@ -132,11 +133,11 @@ export async function main({
}
let pastJobs = 0;
async function getCompletedJobsCount(): Promise<number> {
async function getCompletedJobsCount(tags?: string[]): Promise<number> {
const completedJobs = (
await (
await fetch(
host + "/api/w/" + config.workspace_id + "/jobs/completed/count",
host + "/api/w/" + config.workspace_id + "/jobs/completed/count" + (tags && tags.length > 0 ? "?tags=" + tags.join(",") : ""),
{ headers: { ["Authorization"]: "Bearer " + config.token } }
)
).json()
@@ -152,7 +153,6 @@ export async function main({
await createBenchScript(kind, workspace);
}
pastJobs = await getCompletedJobsCount();
const jobsSent = jobs;
console.log(`Bulk creating ${jobsSent} jobs`);
@@ -208,11 +208,44 @@ export async function main({
throw new Error("Unknown script pattern " + kind);
}
const response = await fetch(
config.server +
let testOtherTag = false;
if (testOtherTag) {
const otherTagTodo = 2000000;
let parsed = JSON.parse(body);
parsed.tag = "test";
let nbody = JSON.stringify(parsed);
let response2 = await fetch(
config.server +
"/api/w/" +
config.workspace_id +
`/jobs/add_batch_jobs/${jobsSent}`,
`/jobs/add_batch_jobs/${otherTagTodo}`,
{
method: "POST",
headers: {
["Authorization"]: "Bearer " + config.token,
"Content-Type": "application/json",
},
body: nbody,
}
);
if (!response2.ok) {
throw new Error(
"Failed to create jobs: " +
response2.statusText +
" " +
(await response2.text())
);
}
}
pastJobs = await getCompletedJobsCount(NON_TEST_TAGS);
const response = await fetch(
config.server +
"/api/w/" +
config.workspace_id +
`/jobs/add_batch_jobs/${jobsSent}`,
{
method: "POST",
headers: {
@@ -222,20 +255,24 @@ export async function main({
body,
}
);
if (!response.ok) {
throw new Error(
"Failed to create jobs: " +
response.statusText +
" " +
(await response.text())
response.statusText +
" " +
(await response.text())
);
}
const uuids = await response.json();
const end_create = Date.now();
const create_duration = end_create - start_create;
console.log(
`Jobs successfully added to the queue in ${
create_duration / 1000
`Jobs successfully added to the queue in ${create_duration / 1000
}s. Windmill will start pulling them\n`
);
let start = Date.now();
@@ -248,14 +285,14 @@ export async function main({
while (completedJobs < jobsSent) {
const loopStart = Date.now();
if (!didStart) {
const actual_queue = await getQueueCount();
const actual_queue = await getQueueCount(NON_TEST_TAGS);
if (actual_queue < jobsSent) {
start = Date.now();
didStart = true;
}
} else {
const elapsed = start ? Date.now() - start : 0;
completedJobs = await getCompletedJobsCount();
completedJobs = await getCompletedJobsCount(NON_TEST_TAGS);
if (nStepsFlow > 0) {
completedJobs = Math.floor(completedJobs / (nStepsFlow + 1));
}
@@ -263,9 +300,9 @@ export async function main({
const instThr =
lastElapsed > 0
? (
((completedJobs - lastCompletedJobs) / (elapsed - lastElapsed)) *
1000
).toFixed(2)
((completedJobs - lastCompletedJobs) / (elapsed - lastElapsed)) *
1000
).toFixed(2)
: 0;
lastElapsed = elapsed;
@@ -275,8 +312,7 @@ export async function main({
enc(
`elapsed: ${(elapsed / 1000).toFixed(
2
)} | jobs executed: ${completedJobs}/${jobsSent} (thr: inst ${instThr} - avg ${avgThr}) | remaining: ${
jobsSent - completedJobs
)} | jobs executed: ${completedJobs}/${jobsSent} (thr: inst ${instThr} - avg ${avgThr}) | remaining: ${jobsSent - completedJobs
} \r`
)
);
@@ -294,7 +330,7 @@ export async function main({
console.log(`avg. throughput (jobs/time): ${jobsSent / total_duration_sec}`);
console.log("completed jobs", completedJobs);
console.log("queue length:", await getQueueCount());
console.log("queue length:", await getQueueCount(NON_TEST_TAGS));
if (
!noVerify &&

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.462.2";
export const VERSION = "v1.463.4";
export async function login(email: string, password: string): Promise<string> {
return await windmill.UserService.login({

View File

@@ -62,7 +62,7 @@ export {
// }
// });
export const VERSION = "1.462.2";
export const VERSION = "1.463.4";
const command = new Command()
.name("wmill")

View File

@@ -313,10 +313,16 @@ export async function updateScriptSchema(
path
);
metadataContent.schema = result.schema;
if (result.has_preprocessor == true)
if (result.has_preprocessor) {
metadataContent.has_preprocessor = result.has_preprocessor;
if (result.no_main_func === true)
} else {
delete metadataContent.has_preprocessor;
}
if (result.no_main_func) {
metadataContent.no_main_func = result.no_main_func;
} else {
delete metadataContent.no_main_func;
}
}
async function updateScriptLock(
@@ -441,7 +447,11 @@ export function inferSchema(
content: string,
currentSchema: any,
path: string
) {
): {
schema: any;
has_preprocessor: boolean | undefined;
no_main_func: boolean | undefined;
} {
let inferedSchema: any;
if (language === "python3") {
inferedSchema = JSON.parse(parse_python(content));

View File

@@ -1,5 +1,12 @@
version: "3.7"
x-logging: &default-logging
driver: "json-file"
options:
max-size: "${LOG_MAX_SIZE:-20m}"
max-file: "${LOG_MAX_FILE:-10}"
compress: "true"
services:
db:
deploy:
@@ -22,6 +29,7 @@ services:
interval: 10s
timeout: 5s
retries: 5
logging: *default-logging
windmill_server:
image: ${WM_IMAGE}
@@ -40,6 +48,7 @@ services:
condition: service_healthy
volumes:
- worker_logs:/tmp/windmill/logs
logging: *default-logging
windmill_worker:
image: ${WM_IMAGE}
@@ -65,6 +74,7 @@ services:
- /var/run/docker.sock:/var/run/docker.sock
- worker_dependency_cache:/tmp/windmill/cache
- worker_logs:/tmp/windmill/logs
logging: *default-logging
## This worker is specialized for "native" jobs. Native jobs run in-process and thus are much more lightweight than other jobs
windmill_worker_native:
@@ -90,6 +100,7 @@ services:
condition: service_healthy
volumes:
- worker_logs:/tmp/windmill/logs
logging: *default-logging
# This worker is specialized for reports or scraping jobs. It is assigned the "reports" worker group which has an init script that installs chromium and can be targeted by using the "chromium" worker tag.
# windmill_worker_reports:
# image: ${WM_IMAGE}
@@ -135,6 +146,7 @@ services:
volumes:
- windmill_index:/tmp/windmill/search
- worker_logs:/tmp/windmill/logs
logging: *default-logging
lsp:
image: ghcr.io/windmill-labs/windmill-lsp:latest
@@ -144,6 +156,7 @@ services:
- 3001
volumes:
- lsp_cache:/pyls/.cache
logging: *default-logging
multiplayer:
image: ghcr.io/windmill-labs/windmill-multiplayer:latest
@@ -152,6 +165,7 @@ services:
restart: unless-stopped
expose:
- 3002
logging: *default-logging
caddy:
image: ghcr.io/windmill-labs/caddy-l4:latest
@@ -170,6 +184,7 @@ services:
- BASE_URL=":80"
# - BASE_URL=":443" # uncomment and comment line above to enable HTTPS via custom certificate and key files
# - BASE_URL=mydomain.com # Uncomment and comment line above to enable HTTPS handling by Caddy
logging: *default-logging
volumes:
db_data: null

View File

@@ -1,12 +1,12 @@
{
"name": "windmill-components",
"version": "1.462.2",
"version": "1.463.4",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "windmill-components",
"version": "1.462.2",
"version": "1.463.4",
"license": "AGPL-3.0",
"dependencies": {
"@anthropic-ai/sdk": "^0.32.1",

View File

@@ -1,6 +1,6 @@
{
"name": "windmill-components",
"version": "1.462.2",
"version": "1.463.4",
"scripts": {
"dev": "vite dev",
"build": "vite build",

View File

@@ -35,7 +35,7 @@
isFetching = false
}
$: workspaceStore && platform && $enterpriseLicense === 'teams' && loadTeams()
$: workspaceStore && platform && $enterpriseLicense && loadTeams()
async function connectTeams() {
const selectedTeam = teams.find((team) => team.team_id === selected_teams_team)

View File

@@ -29,17 +29,21 @@
$: jobId != lastJobId && diffJobId()
let iteration = 0
let logOffset = 0
async function diffJobId() {
if (jobId != lastJobId) {
lastJobId = jobId
logs = undefined
logOffset = 0
iteration = 0
getLogs()
}
}
let logOffset = 0
async function getLogs() {
iteration += 1
if (jobId) {
const getUpdate = await JobService.getJobUpdates({
workspace: workspaceId ?? $workspaceStore!,
@@ -51,11 +55,14 @@
logOffset = getUpdate.log_offset ?? 0
}
if (refreshLog) {
setTimeout(() => {
if (refreshLog) {
getLogs()
}
}, 1000)
setTimeout(
() => {
if (refreshLog) {
getLogs()
}
},
iteration < 10 ? 1000 : iteration < 20 ? 2000 : 5000
)
}
}
</script>
@@ -69,7 +76,7 @@
class:border={!noBorder}
class="grid {!col
? 'grid-cols-2'
: 'grid-rows-2'} shadow border border-tertiary-inverse grow overflow-hidden"
: 'grid-rows-2 max-h-screen'} shadow border border-tertiary-inverse grow overflow-hidden"
>
<div class="bg-surface {col ? '' : 'max-h-80'} p-1 overflow-auto relative">
<span class="text-tertiary">Result</span>

View File

@@ -88,7 +88,7 @@
flowJobIds?.flowJobs?.map((x, id) => `iter #${id + 1} not loaded by frontend yet`) ?? []
let retry_selected = ''
let timeout: NodeJS.Timeout
let timeout: NodeJS.Timeout | undefined = undefined
let localModuleStates: Writable<Record<string, GraphModuleState>> = writable({})
let localDurationStatuses: Writable<Record<string, DurationStatus>> = writable({})
@@ -403,7 +403,7 @@
}
}
$: isForloopSelected && globalModuleStates && loadJobInProgress()
$: isForloopSelected && globalModuleStates && debounceLoadJobInProgress()
async function getNewJob(jobId: string, initialJob: Job | undefined) {
if (
@@ -421,10 +421,33 @@
}
}
let debounceJobId: string | undefined = undefined
let lastRefreshed: Date | undefined = undefined
function debounceLoadJobInProgress() {
const pollingRate = reducedPolling ? 5000 : 1000
if (
lastRefreshed &&
new Date().getTime() - lastRefreshed.getTime() < pollingRate &&
debounceJobId == jobId
) {
timeout && clearTimeout(timeout)
}
timeout = setTimeout(() => {
loadJobInProgress()
lastRefreshed = new Date()
debounceJobId = jobId
timeout = undefined
}, pollingRate)
}
let errorCount = 0
let notAnonynmous = false
let started = false
async function loadJobInProgress() {
dispatch('start')
if (!started) {
started = true
dispatch('start')
}
if (jobId != '00000000-0000-0000-0000-000000000000') {
try {
const newJob = await getNewJob(jobId, initialJob)
@@ -447,7 +470,7 @@
}
}
if (job?.type !== 'CompletedJob' && errorCount < 4 && !destroyed) {
timeout = setTimeout(() => loadJobInProgress(), reducedPolling ? 5000 : 1000)
debounceLoadJobInProgress()
} else {
dispatch('done', job)
}
@@ -1286,7 +1309,7 @@
durationStatuses={localDurationStatuses}
/>
{:else if rightColumnSelect == 'node_status'}
<div class="pt-2 max-h-[80vh] grow flex flex-col">
<div class="pt-2 grow flex flex-col">
{#if selectedNode}
{@const node = $localModuleStates[selectedNode]}
@@ -1365,7 +1388,6 @@
/>
</div>
{/if}
<FlowJobResult
workspaceId={job?.workspace_id}
jobId={node.job_id}

View File

@@ -344,7 +344,6 @@
failedTimes = s.on_failure_times ?? 1
failedExact = s.on_failure_exact ?? false
errorHandlerExtraArgs = s.on_failure_extra_args ?? {}
console.log('errorHandlerExtraArgs', errorHandlerExtraArgs)
errorHandlerSelected = getHandlerType('error', errorHandlerPath)
} else {
errorHandlerPath = undefined

View File

@@ -95,20 +95,7 @@
return jobKinds
}
if (jobKindsCat == 'all') {
let kinds: CompletedJob['job_kind'][] = [
'script',
'flow',
'dependencies',
'flowdependencies',
'appdependencies',
'preview',
'flowpreview',
'script_hub',
'flowscript',
'flownode',
'appscript'
]
return kinds.join(',')
return ''
} else if (jobKindsCat == 'dependencies') {
let kinds: CompletedJob['job_kind'][] = [
'dependencies',
@@ -122,6 +109,9 @@
} else if (jobKindsCat == 'deploymentcallbacks') {
let kinds: CompletedJob['job_kind'][] = ['deploymentcallback']
return kinds.join(',')
} else if (jobKindsCat == 'runs') {
let kinds: CompletedJob['job_kind'][] = ['script', 'flow', 'singlescriptflow']
return kinds.join(',')
} else {
let kinds: CompletedJob['job_kind'][] = [
'script',
@@ -170,7 +160,7 @@
createdBefore,
createdBy: user === null || user === '' ? undefined : user,
scriptPathStart: scriptPathStart,
jobKinds,
jobKinds: jobKindsCat == 'all' || jobKinds == '' ? undefined : jobKinds,
success: success == 'success' ? true : success == 'failure' ? false : undefined,
running:
success == 'running' || success == 'suspended'
@@ -228,7 +218,7 @@
scriptPathExact: path === null || path === '' ? undefined : path,
createdBy: user === null || user === '' ? undefined : user,
scriptPathStart: folder === null || folder === '' ? undefined : `f/${folder}/`,
jobKinds,
jobKinds: jobKindsCat == 'all' || jobKinds == '' ? undefined : jobKinds,
success: success == 'success' ? true : success == 'failure' ? false : undefined,
running: success == 'running' ? true : undefined,
isSkipped: isSkipped ? undefined : false,

View File

@@ -234,13 +234,17 @@
}
}
$: {
if ($workspaceStore && $page.params.run && testJobLoader) {
forceCancel = false
getJob()
}
function onRunsPageChangeWithLoader() {
forceCancel = false
getJob()
}
function onRunsPageChange() {
job = undefined
}
$: $workspaceStore && $page.params.run && onRunsPageChange()
$: $workspaceStore && $page.params.run && testJobLoader && onRunsPageChangeWithLoader()
$: selectedJobStep !== undefined && onSelectedJobStepChange()
$: job && onJobLoaded()
@@ -388,19 +392,20 @@
</DrawerContent>
</Drawer>
{/if}
<TestJobLoader
lazyLogs
bind:scriptProgress
on:done={() => job?.['result'] != undefined && (viewTab = 'result')}
bind:this={testJobLoader}
bind:getLogs
bind:isLoading={testIsLoading}
bind:job
bind:jobUpdateLastFetch
workspaceOverride={$workspaceStore}
bind:notfound
/>
{#if !job || (job?.job_kind != 'flow' && job?.job_kind != 'flownode' && job?.job_kind != 'flowpreview')}
<TestJobLoader
lazyLogs
bind:scriptProgress
on:done={() => job?.['result'] != undefined && (viewTab = 'result')}
bind:this={testJobLoader}
bind:getLogs
bind:isLoading={testIsLoading}
bind:job
bind:jobUpdateLastFetch
workspaceOverride={$workspaceStore}
bind:notfound
/>
{/if}
<Portal name="persistent-run">
<PersistentScriptDrawer bind:this={persistentScriptDrawer} />
@@ -922,6 +927,9 @@
on:jobsLoaded={({ detail }) => {
job = detail
}}
on:done={(e) => {
job = e.detail
}}
initialJob={job}
workspaceId={$workspaceStore}
bind:selectedJobStep

View File

@@ -447,11 +447,14 @@
if (emptyString($enterpriseLicense)) {
errorHandlerSelected = 'custom'
} else {
errorHandlerSelected =
emptyString(errorHandlerScriptPath) ? 'custom' :
(errorHandlerScriptPath.startsWith('hub/') && errorHandlerScriptPath.endsWith('/workspace-or-schedule-error-handler-slack')) ? 'slack' :
(errorHandlerScriptPath.endsWith('/workspace-or-schedule-error-handler-teams')) ? 'teams' :
'custom'
errorHandlerSelected = emptyString(errorHandlerScriptPath)
? 'custom'
: errorHandlerScriptPath.startsWith('hub/') &&
errorHandlerScriptPath.endsWith('/workspace-or-schedule-error-handler-slack')
? 'slack'
: errorHandlerScriptPath.endsWith('/workspace-or-schedule-error-handler-teams')
? 'teams'
: 'custom'
}
errorHandlerExtraArgs = settings.error_handler_extra_args ?? {}
workspaceDefaultAppPath = settings.default_app
@@ -812,8 +815,8 @@
{#if !$enterpriseLicense}
<div class="pt-4" />
<Alert type="info" title="Workspace Teams commands is an EE feature">
Workspace Teams commands is a Windmill EE feature. It enables using your current Slack / Teams
connection to run a custom script and send notifications.
Workspace Teams commands is a Windmill EE feature. It enables using your current Slack
/ Teams connection to run a custom script and send notifications.
</Alert>
<div class="pb-2" />
{/if}
@@ -867,12 +870,7 @@
<div class="mt-20" />
<PageHeader title="Delete workspace" primary={false} />
{#if $superadmin}
<p class="italic text-xs">
When deleting the workspace, it will be archived for a short period of time and then
permanently deleted.
</p>
{:else}
{#if !$superadmin}
<p class="italic text-xs"> Only instance superadmins can delete a workspace. </p>
{/if}
{#if $workspaceStore === 'admins' || $workspaceStore === 'starter'}

View File

@@ -4,8 +4,8 @@ verify_ssl = true
name = "pypi"
[packages]
wmill = ">=1.462.2"
wmill_pg = ">=1.462.2"
wmill = ">=1.463.4"
wmill_pg = ">=1.463.4"
sendgrid = "*"
mysql-connector-python = "*"
pymongo = "*"

View File

@@ -1,7 +1,7 @@
openapi: "3.0.3"
info:
version: 1.462.2
version: 1.463.4
title: OpenFlow Spec
contact:
name: Ruben Fiszel

View File

@@ -12,7 +12,7 @@
RootModule = 'WindmillClient.psm1'
# Version number of this module.
ModuleVersion = '1.462.2'
ModuleVersion = '1.463.4'
# Supported PSEditions
# CompatiblePSEditions = @()

View File

@@ -1,6 +1,6 @@
[tool.poetry]
name = "wmill"
version = "1.462.2"
version = "1.463.4"
description = "A client library for accessing Windmill server wrapping the Windmill client API"
license = "Apache-2.0"
homepage = "https://windmill.dev"

View File

@@ -1,6 +1,6 @@
[tool.poetry]
name = "wmill-pg"
version = "1.462.2"
version = "1.463.4"
description = "An extension client for the wmill client library focused on pg"
license = "Apache-2.0"
homepage = "https://windmill.dev"

View File

@@ -1,6 +1,6 @@
{
"name": "@windmill/windmill",
"version": "1.462.2",
"version": "1.463.4",
"exports": "./src/index.ts",
"publish": {
"exclude": ["!src", "./s3Types.ts", "./client.ts"]

View File

@@ -1,7 +1,7 @@
{
"name": "windmill-client",
"description": "Windmill SDK client for browsers and Node.js",
"version": "1.462.2",
"version": "1.463.4",
"author": "Ruben Fiszel",
"license": "Apache 2.0",
"devDependencies": {

View File

@@ -1 +1 @@
1.462.2
1.463.4