Compare commits

..

18 Commits

Author SHA1 Message Date
Ruben Fiszel
9016ea5fca all 2025-02-18 17:44:14 +01:00
Ruben Fiszel
f321c5d093 all 2025-02-18 17:43:03 +01:00
Ruben Fiszel
4e2fa3d022 push 2025-02-18 17:36:39 +01:00
Ruben Fiszel
72b0431274 push 2025-02-18 17:24:24 +01:00
Ruben Fiszel
7c4ce55f18 push 2025-02-18 17:15:47 +01:00
Ruben Fiszel
d4f61f13fd fix(bash): allow process substitution on nsjail 2025-02-18 16:46:42 +01:00
Ruben Fiszel
138cedf1da fix(bash): improve bash last line as result reliability using bash process substitution (#5321) 2025-02-18 15:13:28 +01:00
Ruben Fiszel
07237a0eb1 chore(main): release 1.463.6 (#5320)
* chore(main): release 1.463.6

* Apply automatic changes

---------

Co-authored-by: rubenfiszel <275584+rubenfiszel@users.noreply.github.com>
2025-02-18 14:43:46 +01:00
Ruben Fiszel
52e12d1021 fix: fix reactivity issue on loading live flow on runs page 2025-02-18 14:35:23 +01:00
Ruben Fiszel
1069ad3999 fix: improve v2 migration finalizer to avoid deadlocks 2025-02-18 13:17:10 +01:00
Ruben Fiszel
b4088faae1 fix: pin chrono tz version to 0.10.1 2025-02-18 10:50:03 +01:00
Ruben Fiszel
24ff5a6261 fix: make teams cleanup non critical 2025-02-18 10:40:17 +01:00
Ruben Fiszel
112361adba chore(main): release 1.463.5 (#5318)
* chore(main): release 1.463.4

* update

* Update CHANGELOG.md
2025-02-18 10:32:38 +01:00
Ruben Fiszel
1b46e0f084 fix: fix teams cleanup preventing start 2025-02-18 10:25:42 +01:00
Ruben Fiszel
0c391e92a2 improve benchmarks 2025-02-18 09:51:21 +01:00
Ruben Fiszel
588ff79364 make benchmarks even more stable 2025-02-18 08:43:03 +01:00
Ruben Fiszel
3b6585afdf nit benchmarks 2025-02-18 01:54:14 +01:00
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
37 changed files with 333 additions and 192 deletions

View File

@@ -22,7 +22,7 @@ jobs:
windmill:
image: ghcr.io/windmill-labs/windmill-ee:main
image: ghcr.io/windmill-labs/windmill-ee:1.463.6
env:
DATABASE_URL: postgres://postgres:changeme@postgres:5432/windmill
LICENSE_KEY: ${{ secrets.WM_LICENSE_KEY_CI }}
@@ -64,7 +64,7 @@ jobs:
--health-cmd pg_isready --health-interval 10s --health-timeout 5s
--health-retries 5
windmill:
image: ghcr.io/windmill-labs/windmill-ee:main
image: ghcr.io/windmill-labs/windmill-ee:1.463.6
env:
DATABASE_URL: postgres://postgres:changeme@postgres:5432/windmill
LICENSE_KEY: ${{ secrets.WM_LICENSE_KEY_CI }}
@@ -106,7 +106,7 @@ jobs:
--health-cmd pg_isready --health-interval 10s --health-timeout 5s
--health-retries 5
windmill:
image: ghcr.io/windmill-labs/windmill-ee:main
image: ghcr.io/windmill-labs/windmill-ee:1.463.6
env:
DATABASE_URL: postgres://postgres:changeme@postgres:5432/windmill
LICENSE_KEY: ${{ secrets.WM_LICENSE_KEY_CI }}
@@ -119,7 +119,7 @@ jobs:
ports:
- 8000:8000
windmill_1:
image: ghcr.io/windmill-labs/windmill-ee:main
image: ghcr.io/windmill-labs/windmill-ee:1.463.6
env:
DATABASE_URL: postgres://postgres:changeme@postgres:5432/windmill
LICENSE_KEY: ${{ secrets.WM_LICENSE_KEY_CI }}
@@ -130,7 +130,7 @@ jobs:
--pull always
windmill_2:
image: ghcr.io/windmill-labs/windmill-ee:main
image: ghcr.io/windmill-labs/windmill-ee:1.463.6
env:
DATABASE_URL: postgres://postgres:changeme@postgres:5432/windmill
LICENSE_KEY: ${{ secrets.WM_LICENSE_KEY_CI }}
@@ -141,7 +141,7 @@ jobs:
--pull always
windmill_3:
image: ghcr.io/windmill-labs/windmill-ee:main
image: ghcr.io/windmill-labs/windmill-ee:1.463.6
env:
DATABASE_URL: postgres://postgres:changeme@postgres:5432/windmill
LICENSE_KEY: ${{ secrets.WM_LICENSE_KEY_CI }}
@@ -162,6 +162,7 @@ jobs:
-c
https://raw.githubusercontent.com/windmill-labs/windmill/${GITHUB_REF##ref/head/}/benchmarks/suite_config.json
--workers 4
--factor 3
- name: Save benchmark results
uses: actions/upload-artifact@v4
with:
@@ -182,7 +183,7 @@ jobs:
--health-cmd pg_isready --health-interval 10s --health-timeout 5s
--health-retries 5
windmill:
image: ghcr.io/windmill-labs/windmill-ee:main
image: ghcr.io/windmill-labs/windmill-ee:1.463.6
env:
DATABASE_URL: postgres://postgres:changeme@postgres:5432/windmill
LICENSE_KEY: ${{ secrets.WM_LICENSE_KEY_CI }}
@@ -195,7 +196,7 @@ jobs:
ports:
- 8000:8000
windmill_1:
image: ghcr.io/windmill-labs/windmill-ee:main
image: ghcr.io/windmill-labs/windmill-ee:1.463.6
env:
DATABASE_URL: postgres://postgres:changeme@postgres:5432/windmill
LICENSE_KEY: ${{ secrets.WM_LICENSE_KEY_CI }}
@@ -206,7 +207,7 @@ jobs:
--pull always
windmill_2:
image: ghcr.io/windmill-labs/windmill-ee:main
image: ghcr.io/windmill-labs/windmill-ee:1.463.6
env:
DATABASE_URL: postgres://postgres:changeme@postgres:5432/windmill
LICENSE_KEY: ${{ secrets.WM_LICENSE_KEY_CI }}
@@ -217,7 +218,7 @@ jobs:
--pull always
windmill_3:
image: ghcr.io/windmill-labs/windmill-ee:main
image: ghcr.io/windmill-labs/windmill-ee:1.463.6
env:
DATABASE_URL: postgres://postgres:changeme@postgres:5432/windmill
LICENSE_KEY: ${{ secrets.WM_LICENSE_KEY_CI }}
@@ -228,7 +229,7 @@ jobs:
--pull always
windmill_4:
image: ghcr.io/windmill-labs/windmill-ee:main
image: ghcr.io/windmill-labs/windmill-ee:1.463.6
env:
DATABASE_URL: postgres://postgres:changeme@postgres:5432/windmill
LICENSE_KEY: ${{ secrets.WM_LICENSE_KEY_CI }}
@@ -239,7 +240,7 @@ jobs:
--pull always
windmill_5:
image: ghcr.io/windmill-labs/windmill-ee:main
image: ghcr.io/windmill-labs/windmill-ee:1.463.6
env:
DATABASE_URL: postgres://postgres:changeme@postgres:5432/windmill
LICENSE_KEY: ${{ secrets.WM_LICENSE_KEY_CI }}
@@ -250,7 +251,7 @@ jobs:
--pull always
windmill_6:
image: ghcr.io/windmill-labs/windmill-ee:main
image: ghcr.io/windmill-labs/windmill-ee:1.463.6
env:
DATABASE_URL: postgres://postgres:changeme@postgres:5432/windmill
LICENSE_KEY: ${{ secrets.WM_LICENSE_KEY_CI }}
@@ -261,7 +262,7 @@ jobs:
--pull always
windmill_7:
image: ghcr.io/windmill-labs/windmill-ee:main
image: ghcr.io/windmill-labs/windmill-ee:1.463.6
env:
DATABASE_URL: postgres://postgres:changeme@postgres:5432/windmill
LICENSE_KEY: ${{ secrets.WM_LICENSE_KEY_CI }}
@@ -281,6 +282,7 @@ jobs:
-c
https://raw.githubusercontent.com/windmill-labs/windmill/${GITHUB_REF##ref/head/}/benchmarks/suite_config.json
--workers 8
--factor 3
- name: Save benchmark results
uses: actions/upload-artifact@v4
with:

View File

@@ -1,5 +1,21 @@
# Changelog
## [1.463.6](https://github.com/windmill-labs/windmill/compare/v1.463.5...v1.463.6) (2025-02-18)
### Bug Fixes
* fix reactivity issue on loading live flow on runs page ([52e12d1](https://github.com/windmill-labs/windmill/commit/52e12d1021831adc2ce9b7b0946a93562038017e))
* improve v2 migration finalizer to avoid deadlocks ([1069ad3](https://github.com/windmill-labs/windmill/commit/1069ad39992940e32e5d8566ef2283970525be1a))
## [1.463.5](https://github.com/windmill-labs/windmill/compare/v1.463.4...v1.463.5) (2025-02-18)
### Bug Fixes
* fix teams cleanup preventing start ([1b46e0f](https://github.com/windmill-labs/windmill/commit/1b46e0f08426497d549cf5007c93981df9ab41e5))
## [1.463.4](https://github.com/windmill-labs/windmill/compare/v1.463.3...v1.463.4) (2025-02-17)

View File

@@ -1,12 +0,0 @@
{
"db_name": "PostgreSQL",
"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",
"describe": {
"columns": [],
"parameters": {
"Left": []
},
"nullable": []
},
"hash": "3bacf9cd9aa63f4bec5f983f4a0c3030216b5a4ed669f77962509d1c2c6cb780"
}

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 global_settings\n SET value = (\n SELECT COALESCE(jsonb_agg(elem), '[]'::jsonb)\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": "81b06122c7a12a314d8905ba5c7c14aa7614f2610e79a8c7302eaa63fb74984d"
}

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

@@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
"query": "DELETE FROM v2_job_queue WHERE workspace_id = $1 AND id = $2 RETURNING 1",
"query": "DELETE FROM v2_job_queue WHERE id = $1 RETURNING 1",
"describe": {
"columns": [
{
@@ -11,7 +11,6 @@
],
"parameters": {
"Left": [
"Text",
"Uuid"
]
},
@@ -19,5 +18,5 @@
null
]
},
"hash": "d25c58d2722ad3dcd91101ce6f66e1d802dd5d82e1cd5f5ed3a15cbc75eb6745"
"hash": "c92cc71e6d10c41368f7aa75b0799c2e1e9ca0ed33077ade8d7560e7cc21fa06"
}

View File

@@ -1,12 +0,0 @@
{
"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"
}

123
backend/Cargo.lock generated
View File

@@ -713,7 +713,7 @@ dependencies = [
"percent-encoding",
"pin-project-lite",
"tracing",
"uuid 1.13.1",
"uuid 1.13.2",
]
[[package]]
@@ -1007,9 +1007,9 @@ dependencies = [
[[package]]
name = "backon"
version = "1.3.0"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ba5289ec98f68f28dd809fd601059e6aa908bb8f6108620930828283d4ee23d7"
checksum = "49fef586913a57ff189f25c9b3d034356a5bf6b3fa9a7f067588fe1698ba1f5d"
dependencies = [
"fastrand 2.3.0",
"gloo-timers",
@@ -1222,15 +1222,16 @@ dependencies = [
[[package]]
name = "blake3"
version = "1.5.5"
version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b8ee0c1824c4dea5b5f81736aff91bae041d2c07ee1192bec91054e10e3e601e"
checksum = "1230237285e3e10cde447185e8975408ae24deaa67205ce684805c25bc0c7937"
dependencies = [
"arrayref",
"arrayvec",
"cc",
"cfg-if",
"constant_time_eq",
"memmap2",
]
[[package]]
@@ -2263,7 +2264,7 @@ dependencies = [
"tokio",
"tokio-util",
"url",
"uuid 1.13.1",
"uuid 1.13.2",
"xz2",
"zstd",
]
@@ -2363,7 +2364,7 @@ dependencies = [
"regex",
"sha2 0.10.8",
"unicode-segmentation",
"uuid 1.13.1",
"uuid 1.13.2",
]
[[package]]
@@ -2530,7 +2531,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bef552e6f588e446098f6ba40d89ac146c8c7b64aade83c051ee00bb5d2bc18d"
dependencies = [
"serde",
"uuid 1.13.1",
"uuid 1.13.2",
]
[[package]]
@@ -2825,7 +2826,7 @@ dependencies = [
"serde",
"thiserror 1.0.69",
"tokio",
"uuid 1.13.1",
"uuid 1.13.2",
]
[[package]]
@@ -5405,7 +5406,7 @@ dependencies = [
"sha2 0.10.8",
"subprocess",
"thiserror 1.0.69",
"uuid 1.13.1",
"uuid 1.13.2",
"zstd",
]
@@ -6366,7 +6367,7 @@ dependencies = [
"postgres-protocol 0.6.8",
"serde",
"serde_json",
"uuid 1.13.1",
"uuid 1.13.2",
]
[[package]]
@@ -7222,7 +7223,7 @@ dependencies = [
"rkyv_derive",
"seahash",
"tinyvec",
"uuid 1.13.1",
"uuid 1.13.2",
]
[[package]]
@@ -7613,7 +7614,7 @@ dependencies = [
"serde",
"thiserror 1.0.69",
"url",
"uuid 1.13.1",
"uuid 1.13.2",
]
[[package]]
@@ -7651,7 +7652,7 @@ dependencies = [
"schemars_derive",
"serde",
"serde_json",
"uuid 1.13.1",
"uuid 1.13.2",
]
[[package]]
@@ -8386,7 +8387,7 @@ dependencies = [
"tokio-stream",
"tracing",
"url",
"uuid 1.13.1",
"uuid 1.13.2",
"webpki-roots",
]
@@ -8470,7 +8471,7 @@ dependencies = [
"stringprep",
"thiserror 2.0.11",
"tracing",
"uuid 1.13.1",
"uuid 1.13.2",
"whoami",
]
@@ -8511,7 +8512,7 @@ dependencies = [
"stringprep",
"thiserror 2.0.11",
"tracing",
"uuid 1.13.1",
"uuid 1.13.2",
"whoami",
]
@@ -8537,7 +8538,7 @@ dependencies = [
"sqlx-core",
"tracing",
"url",
"uuid 1.13.1",
"uuid 1.13.2",
]
[[package]]
@@ -9184,7 +9185,7 @@ dependencies = [
"tempfile",
"thiserror 1.0.69",
"time",
"uuid 1.13.1",
"uuid 1.13.2",
"winapi",
]
@@ -9414,7 +9415,7 @@ dependencies = [
"tokio-rustls 0.24.1",
"tokio-util",
"tracing",
"uuid 1.13.1",
"uuid 1.13.2",
]
[[package]]
@@ -10121,9 +10122,9 @@ dependencies = [
[[package]]
name = "tree-sitter-language"
version = "0.1.4"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "38eee4db33814de3d004de9d8d825627ed3320d0989cce0dea30efaf5be4736c"
checksum = "c4013970217383f67b18aef68f6fb2e8d409bc5755227092d32efb0422ba24b8"
[[package]]
name = "triomphe"
@@ -10195,9 +10196,9 @@ checksum = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a"
[[package]]
name = "typenum"
version = "1.17.0"
version = "1.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f"
[[package]]
name = "typify"
@@ -10250,7 +10251,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ab82fc73182c29b02e2926a6df32f2241dbadb5cfc111fd595515b3598f46bb3"
dependencies = [
"rand 0.9.0",
"uuid 1.13.1",
"uuid 1.13.2",
"web-time",
]
@@ -10532,9 +10533,9 @@ dependencies = [
[[package]]
name = "uuid"
version = "1.13.1"
version = "1.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ced87ca4be083373936a67f8de945faa23b6b42384bd5b64434850802c6dccd0"
checksum = "8c1f41ffb7cf259f1ecc2876861a17e7142e63ead296f671f81f6ae85903e0d6"
dependencies = [
"getrandom 0.3.1",
"serde",
@@ -10858,7 +10859,7 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]]
name = "windmill"
version = "1.463.4"
version = "1.463.6"
dependencies = [
"anyhow",
"axum",
@@ -10887,7 +10888,7 @@ dependencies = [
"tokio",
"tracing",
"url",
"uuid 1.13.1",
"uuid 1.13.2",
"v8",
"windmill-api",
"windmill-api-client",
@@ -10901,7 +10902,7 @@ dependencies = [
[[package]]
name = "windmill-api"
version = "1.463.4"
version = "1.463.6"
dependencies = [
"anyhow",
"argon2",
@@ -10982,7 +10983,7 @@ dependencies = [
"ulid",
"url",
"urlencoding",
"uuid 1.13.1",
"uuid 1.13.2",
"windmill-audit",
"windmill-common",
"windmill-git-sync",
@@ -10995,7 +10996,7 @@ dependencies = [
[[package]]
name = "windmill-api-client"
version = "1.463.4"
version = "1.463.6"
dependencies = [
"base64 0.22.1",
"chrono",
@@ -11008,12 +11009,12 @@ dependencies = [
"serde",
"serde_json",
"syn 1.0.109",
"uuid 1.13.1",
"uuid 1.13.2",
]
[[package]]
name = "windmill-audit"
version = "1.463.4"
version = "1.463.6"
dependencies = [
"chrono",
"serde",
@@ -11026,21 +11027,21 @@ dependencies = [
[[package]]
name = "windmill-autoscaling"
version = "1.463.4"
version = "1.463.6"
dependencies = [
"anyhow",
"serde",
"serde_json",
"sqlx",
"tracing",
"uuid 1.13.1",
"uuid 1.13.2",
"windmill-common",
"windmill-queue",
]
[[package]]
name = "windmill-common"
version = "1.463.4"
version = "1.463.6"
dependencies = [
"anyhow",
"async-stream",
@@ -11093,27 +11094,27 @@ dependencies = [
"tracing-loki",
"tracing-opentelemetry",
"tracing-subscriber",
"uuid 1.13.1",
"uuid 1.13.2",
"windmill-macros",
]
[[package]]
name = "windmill-git-sync"
version = "1.463.4"
version = "1.463.6"
dependencies = [
"regex",
"serde",
"serde_json",
"sqlx",
"tracing",
"uuid 1.13.1",
"uuid 1.13.2",
"windmill-common",
"windmill-queue",
]
[[package]]
name = "windmill-indexer"
version = "1.463.4"
version = "1.463.6"
dependencies = [
"anyhow",
"bytes",
@@ -11130,13 +11131,13 @@ dependencies = [
"tokio",
"tokio-tar",
"tracing",
"uuid 1.13.1",
"uuid 1.13.2",
"windmill-common",
]
[[package]]
name = "windmill-macros"
version = "1.463.4"
version = "1.463.6"
dependencies = [
"itertools 0.14.0",
"lazy_static",
@@ -11148,7 +11149,7 @@ dependencies = [
[[package]]
name = "windmill-parser"
version = "1.463.4"
version = "1.463.6"
dependencies = [
"convert_case 0.6.0",
"serde",
@@ -11157,7 +11158,7 @@ dependencies = [
[[package]]
name = "windmill-parser-bash"
version = "1.463.4"
version = "1.463.6"
dependencies = [
"anyhow",
"lazy_static",
@@ -11169,7 +11170,7 @@ dependencies = [
[[package]]
name = "windmill-parser-csharp"
version = "1.463.4"
version = "1.463.6"
dependencies = [
"anyhow",
"serde_json",
@@ -11181,7 +11182,7 @@ dependencies = [
[[package]]
name = "windmill-parser-go"
version = "1.463.4"
version = "1.463.6"
dependencies = [
"anyhow",
"gosyn",
@@ -11193,7 +11194,7 @@ dependencies = [
[[package]]
name = "windmill-parser-graphql"
version = "1.463.4"
version = "1.463.6"
dependencies = [
"anyhow",
"lazy_static",
@@ -11205,7 +11206,7 @@ dependencies = [
[[package]]
name = "windmill-parser-php"
version = "1.463.4"
version = "1.463.6"
dependencies = [
"anyhow",
"itertools 0.14.0",
@@ -11216,7 +11217,7 @@ dependencies = [
[[package]]
name = "windmill-parser-py"
version = "1.463.4"
version = "1.463.6"
dependencies = [
"anyhow",
"itertools 0.14.0",
@@ -11227,7 +11228,7 @@ dependencies = [
[[package]]
name = "windmill-parser-py-imports"
version = "1.463.4"
version = "1.463.6"
dependencies = [
"anyhow",
"async-recursion",
@@ -11247,7 +11248,7 @@ dependencies = [
[[package]]
name = "windmill-parser-rust"
version = "1.463.4"
version = "1.463.6"
dependencies = [
"anyhow",
"convert_case 0.6.0",
@@ -11264,7 +11265,7 @@ dependencies = [
[[package]]
name = "windmill-parser-sql"
version = "1.463.4"
version = "1.463.6"
dependencies = [
"anyhow",
"lazy_static",
@@ -11276,7 +11277,7 @@ dependencies = [
[[package]]
name = "windmill-parser-ts"
version = "1.463.4"
version = "1.463.6"
dependencies = [
"anyhow",
"lazy_static",
@@ -11294,7 +11295,7 @@ dependencies = [
[[package]]
name = "windmill-parser-wasm"
version = "1.463.4"
version = "1.463.6"
dependencies = [
"anyhow",
"getrandom 0.2.15",
@@ -11316,7 +11317,7 @@ dependencies = [
[[package]]
name = "windmill-parser-yaml"
version = "1.463.4"
version = "1.463.6"
dependencies = [
"anyhow",
"serde_json",
@@ -11326,7 +11327,7 @@ dependencies = [
[[package]]
name = "windmill-queue"
version = "1.463.4"
version = "1.463.6"
dependencies = [
"anyhow",
"async-recursion",
@@ -11352,14 +11353,14 @@ dependencies = [
"tokio",
"tracing",
"ulid",
"uuid 1.13.1",
"uuid 1.13.2",
"windmill-audit",
"windmill-common",
]
[[package]]
name = "windmill-sql-datatype-parser-wasm"
version = "1.463.4"
version = "1.463.6"
dependencies = [
"wasm-bindgen",
"wasm-bindgen-test",
@@ -11369,7 +11370,7 @@ dependencies = [
[[package]]
name = "windmill-worker"
version = "1.463.4"
version = "1.463.6"
dependencies = [
"anyhow",
"async-recursion",
@@ -11426,7 +11427,7 @@ dependencies = [
"tokio-util",
"tracing",
"urlencoding",
"uuid 1.13.1",
"uuid 1.13.2",
"windmill-audit",
"windmill-common",
"windmill-git-sync",

View File

@@ -1,6 +1,6 @@
[package]
name = "windmill"
version = "1.463.4"
version = "1.463.6"
authors.workspace = true
edition.workspace = true
@@ -30,7 +30,7 @@ members = [
]
[workspace.package]
version = "1.463.4"
version = "1.463.6"
authors = ["Ruben Fiszel <ruben@windmill.dev>"]
edition = "2021"
@@ -174,7 +174,7 @@ uuid = { version = "^1", features = ["serde", "v4"] }
thiserror = "^2"
anyhow = "^1"
chrono = { version = "0.4.35", features = ["serde"] }
chrono-tz = "^0"
chrono-tz = "^0.10.1"
tracing = "^0"
tracing-subscriber = { version = "^0", features = ["env-filter", "json"] }
tracing-appender = "^0"

View File

@@ -1 +1 @@
e507af5589efb1a8a72ae4e231130f749bde738d
5d25cf2cd15c1953794045fd7debea14a33c7519

0
backend/pg_log_tail Normal file
View File

View File

@@ -21,7 +21,7 @@ use std::{
net::{IpAddr, Ipv4Addr, SocketAddr},
time::Duration,
};
use tokio::{fs::File, io::AsyncReadExt};
use tokio::{fs::File, io::AsyncReadExt, task::JoinHandle};
use uuid::Uuid;
use windmill_api::HTTP_CLIENT;
@@ -372,6 +372,7 @@ async fn windmill_main() -> anyhow::Result<()> {
let is_agent = mode == Mode::Agent;
let mut migration_handle: Option<JoinHandle<()>> = None;
#[cfg(feature = "parquet")]
let disable_s3_store = std::env::var("DISABLE_S3_STORE")
.ok()
@@ -384,7 +385,7 @@ async fn windmill_main() -> anyhow::Result<()> {
if !skip_migration {
// migration code to avoid break
windmill_api::migrate_db(&db).await?;
migration_handle = windmill_api::migrate_db(&db).await?;
} else {
tracing::info!("SKIP_MIGRATION set, skipping db migration...")
}
@@ -682,6 +683,14 @@ Windmill Community Edition {GIT_VERSION}
loop {
tokio::select! {
biased;
Some(_) = async { if let Some(jh) = migration_handle.take() {
tracing::info!("migration job finished");
Some(jh.await)
} else {
None
}} => {
continue;
},
_ = monitor_killpill_rx.recv() => {
tracing::info!("received killpill for monitor job");
break;

View File

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

View File

@@ -15,6 +15,7 @@ use sqlx::{
Executor, PgConnection, Pool, Postgres,
};
use tokio::task::JoinHandle;
use windmill_audit::audit_ee::{AuditAuthor, AuditAuthorable};
use windmill_common::{
db::{Authable, Authed},
@@ -170,7 +171,7 @@ impl Migrate for CustomMigrator {
}
}
pub async fn migrate(db: &DB) -> Result<(), Error> {
pub async fn migrate(db: &DB) -> Result<Option<JoinHandle<()>>, Error> {
let migrator = db.acquire().await?;
let mut custom_migrator = CustomMigrator { inner: migrator };
@@ -225,9 +226,10 @@ pub async fn migrate(db: &DB) -> Result<(), Error> {
}
});
if !has_done_migration(db, "v2_finalize_disable_sync_III").await {
let mut jh = None;
if !has_done_migration(db, "v2_finalize_job_completed").await {
let db2 = db.clone();
let _ = tokio::task::spawn(async move {
let v2jh = tokio::task::spawn(async move {
loop {
if !*MIN_VERSION_IS_AT_LEAST_1_461.read().await {
tracing::info!("Waiting for all workers to be at least version 1.461 before applying v2 finalize migration, sleeping for 5s...");
@@ -245,9 +247,10 @@ pub async fn migrate(db: &DB) -> Result<(), Error> {
break;
}
});
jh = Some(v2jh)
}
Ok(())
Ok(jh)
}
async fn fix_flow_versioning_migration(
@@ -373,29 +376,91 @@ async fn v2_finalize(db: &DB) -> Result<(), Error> {
run_windmill_migration!("v2_finalize_disable_sync_III", db, |tx| {
tx.execute(
r#"
LOCK TABLE v2_job_queue IN ACCESS EXCLUSIVE MODE;
ALTER TABLE v2_job_queue DISABLE ROW LEVEL SECURITY;
ALTER TABLE v2_job_completed DISABLE ROW LEVEL SECURITY;
DROP FUNCTION IF EXISTS v2_job_after_update CASCADE;
DROP FUNCTION IF EXISTS v2_job_completed_before_insert CASCADE;
DROP FUNCTION IF EXISTS v2_job_completed_before_update CASCADE;
DROP FUNCTION IF EXISTS v2_job_queue_after_insert CASCADE;
DROP FUNCTION IF EXISTS v2_job_queue_before_insert CASCADE;
DROP FUNCTION IF EXISTS v2_job_queue_before_update CASCADE;
DROP FUNCTION IF EXISTS v2_job_runtime_before_insert CASCADE;
DROP FUNCTION IF EXISTS v2_job_runtime_before_update CASCADE;
DROP FUNCTION IF EXISTS v2_job_status_before_insert CASCADE;
DROP FUNCTION IF EXISTS v2_job_status_before_update CASCADE;
DROP VIEW IF EXISTS completed_job, completed_job_view, job, queue, queue_view CASCADE;
"#,
)
.await?;
});
run_windmill_migration!("v2_finalize_disable_sync_III_2", db, |tx| {
tx.execute(
r#"
LOCK TABLE v2_job_completed IN ACCESS EXCLUSIVE MODE;
ALTER TABLE v2_job_completed DISABLE ROW LEVEL SECURITY;
"#,
)
.await?;
});
run_windmill_migration!("v2_finalize_disable_sync_III_3", db, |tx| {
tx.execute(
r#"
LOCK TABLE v2_job IN ACCESS EXCLUSIVE MODE;
DROP FUNCTION IF EXISTS v2_job_after_update CASCADE;
"#,
)
.await?;
});
run_windmill_migration!("v2_finalize_disable_sync_III_4", db, |tx| {
tx.execute(
r#"
LOCK TABLE v2_job_completed IN ACCESS EXCLUSIVE MODE;
DROP FUNCTION IF EXISTS v2_job_completed_before_insert CASCADE;
DROP FUNCTION IF EXISTS v2_job_completed_before_update CASCADE;
"#,
)
.await?;
});
run_windmill_migration!("v2_finalize_disable_sync_III_5", db, |tx| {
tx.execute(
r#"
LOCK TABLE v2_job_queue IN ACCESS EXCLUSIVE MODE;
DROP FUNCTION IF EXISTS v2_job_queue_after_insert CASCADE;
DROP FUNCTION IF EXISTS v2_job_queue_before_insert CASCADE;
DROP FUNCTION IF EXISTS v2_job_queue_before_update CASCADE;
"#,
)
.await?;
});
run_windmill_migration!("v2_finalize_disable_sync_III_6", db, |tx| {
tx.execute(
r#"
LOCK TABLE v2_job_runtime IN ACCESS EXCLUSIVE MODE;
DROP FUNCTION IF EXISTS v2_job_runtime_before_insert CASCADE;
DROP FUNCTION IF EXISTS v2_job_runtime_before_update CASCADE;
"#,
)
.await?;
});
run_windmill_migration!("v2_finalize_disable_sync_III_7", db, |tx| {
tx.execute(
r#"
LOCK TABLE v2_job_status IN ACCESS EXCLUSIVE MODE;
DROP FUNCTION IF EXISTS v2_job_status_before_insert CASCADE;
DROP FUNCTION IF EXISTS v2_job_status_before_update CASCADE;
"#,
)
.await?;
});
run_windmill_migration!("v2_finalize_disable_sync_III_8", db, |tx| {
tx.execute(
r#"
DROP VIEW IF EXISTS completed_job, completed_job_view, job, queue, queue_view CASCADE;
"#,
)
.await?;
});
run_windmill_migration!("v2_finalize_job_queue", db, |tx| {
tx.execute(
r#"
LOCK TABLE v2_job_queue IN ACCESS EXCLUSIVE MODE;
ALTER TABLE v2_job_queue
DROP COLUMN IF EXISTS __parent_job CASCADE,
DROP COLUMN IF EXISTS __created_by CASCADE,
@@ -434,6 +499,7 @@ async fn v2_finalize(db: &DB) -> Result<(), Error> {
run_windmill_migration!("v2_finalize_job_completed", db, |tx| {
tx.execute(
r#"
LOCK TABLE v2_job_completed IN ACCESS EXCLUSIVE MODE;
ALTER TABLE v2_job_completed
DROP COLUMN IF EXISTS __parent_job CASCADE,
DROP COLUMN IF EXISTS __created_by CASCADE,

View File

@@ -34,6 +34,7 @@ use http::HeaderValue;
use reqwest::Client;
#[cfg(feature = "oauth2")]
use std::collections::HashMap;
use tokio::task::JoinHandle;
use windmill_common::global_settings::load_value_from_global_settings;
use windmill_common::global_settings::EMAIL_DOMAIN_SETTING;
use windmill_common::worker::HUB_CACHE_DIR;
@@ -641,7 +642,8 @@ async fn openapi_json() -> &'static str {
include_str!("../openapi-deref.json")
}
pub async fn migrate_db(db: &DB) -> anyhow::Result<()> {
db::migrate(db).await?;
Ok(())
pub async fn migrate_db(db: &DB) -> anyhow::Result<Option<JoinHandle<()>>> {
db::migrate(db)
.await
.map_err(|e| anyhow::anyhow!("Error migrating db: {e:#}"))
}

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

@@ -566,6 +566,9 @@ pub async fn add_completed_job<T: Serialize + Send + Sync + ValidableJson>(
let result_columns = result_columns.as_ref();
let _job_id = queued_job.id;
let (opt_uuid, _duration, _skip_downstream_error_handlers) = (|| async {
// let start = std::time::Instant::now();
let mut tx = db.begin().await?;
let job_id = queued_job.id;
@@ -663,7 +666,7 @@ pub async fn add_completed_job<T: Serialize + Send + Sync + ValidableJson>(
// tracing::error!("Added completed job {:#?}", queued_job);
let mut _skip_downstream_error_handlers = false;
tx = delete_job(tx, &queued_job.workspace_id, job_id).await?;
tx = delete_job(tx, &job_id).await?;
// tracing::error!("3 {:?}", start.elapsed());
if queued_job.is_flow_step {
@@ -858,6 +861,7 @@ pub async fn add_completed_job<T: Serialize + Send + Sync + ValidableJson>(
"inserted completed job: {} (success: {success})",
queued_job.id
);
// tracing::info!("completed job: {:?}", start.elapsed().as_micros());
Ok((None, _duration, _skip_downstream_error_handlers)) as windmill_common::error::Result<(Option<Uuid>, i64, bool)>
})
.retry(
@@ -2597,21 +2601,17 @@ async fn extract_result_from_job_result(
pub async fn delete_job<'c>(
mut tx: Transaction<'c, Postgres>,
w_id: &str,
job_id: Uuid,
job_id: &Uuid,
) -> windmill_common::error::Result<Transaction<'c, Postgres>> {
#[cfg(feature = "prometheus")]
if METRICS_ENABLED.load(std::sync::atomic::Ordering::Relaxed) {
QUEUE_DELETE_COUNT.inc();
}
let job_removed = sqlx::query_scalar!(
"DELETE FROM v2_job_queue WHERE workspace_id = $1 AND id = $2 RETURNING 1",
w_id,
job_id
)
.fetch_optional(&mut *tx)
.await;
let job_removed =
sqlx::query_scalar!("DELETE FROM v2_job_queue WHERE id = $1 RETURNING 1", job_id,)
.fetch_optional(&mut *tx)
.await;
if let Err(job_removed) = job_removed {
tracing::error!(

View File

@@ -21,10 +21,24 @@ mount {
is_bind: true
}
mount {
src: "/proc/self/fd"
dst: "/dev/fd"
is_symlink: true
mandatory: false
}
mount {
src: "/bin"
dst: "/bin"
is_bind: true
}
mount {
src: "/opt/microsoft"
dst: "/opt/microsoft"
is_bind: true
mandatory: false
}
mount {

View File

@@ -21,6 +21,13 @@ mount {
is_bind: true
}
mount {
src: "/proc/self/fd"
dst: "/dev/fd"
is_symlink: true
mandatory: false
}
mount {
src: "/opt/microsoft"
dst: "/opt/microsoft"

View File

@@ -97,7 +97,7 @@ cleanup() {{
trap '' SIGTERM SIGINT
# Kill the process group of the script (negative PID value)
pkill -P $$
pkill -P $$ 2>/dev/null || true
exit
}}
@@ -105,14 +105,9 @@ cleanup() {{
# Trap SIGTERM (or other signals) and call cleanup function
trap cleanup SIGTERM SIGINT
# Create a named pipe
mkfifo bp
# Start background processes
cat bp | tail -1 >> ./result2.out &
# Run main.sh in the same process group
{bash} ./main.sh "$@" 2>&1 | tee bp &
{bash} ./main.sh "$@" 2>&1 | tee >(tail -1 >> ./result2.out) &
pid=$!
@@ -121,7 +116,6 @@ wait $pid
exit_status=$?
# Clean up the named pipe and background processes
rm -f bp
pkill -P $$ || true
# Exit with the captured status
@@ -624,7 +618,7 @@ $env:PSModulePath = \"{};$PSModulePathBackup\"",
write_file(
job_dir,
"wrapper.sh",
&format!("set -o pipefail\nset -e\nmkfifo bp\ncat bp | tail -1 > ./result2.out &\n{} -F ./main.ps1 \"$@\" 2>&1 | tee bp\nwait $!", POWERSHELL_PATH.as_str()),
&format!("set -o pipefail\nset -e\n{} -F ./main.ps1 \"$@\" 2>&1 | tee >(tail -1 >> ./result2.out) &\nwait $!", POWERSHELL_PATH.as_str()),
)?;
#[cfg(windows)]

View File

@@ -201,7 +201,7 @@ export async function main({
kind: "rawscript",
rawscript: {
language: api.RawScript.language.BASH,
content: "# let's bloat that bash script, 3.. 2.. 1.. BOOM\n".repeat(25000) + "echo \"$WM_FLOW_JOB_ID\"\n",
content: "# let's bloat that bash script, 3.. 2.. 1.. BOOM\n".repeat(100) + "echo \"$WM_FLOW_JOB_ID\"\n",
},
});
} else {

View File

@@ -39,6 +39,7 @@ async function main({
workspace,
configPath,
workers,
factor
}: {
host: string;
email?: string;
@@ -47,6 +48,7 @@ async function main({
workspace: string;
configPath: string;
workers: number;
factor?: number;
}) {
async function getConfig(configPath: string): Promise<Config> {
if (configPath.startsWith("http")) {
@@ -77,7 +79,7 @@ async function main({
token,
workspace,
kind: benchmark.kind,
jobs: benchmark.jobs,
jobs: benchmark.jobs * (factor ?? 1),
});
if (benchmark.noSave) {
@@ -153,6 +155,9 @@ await new Command()
"Number of workers that are used to run the benchmarks (only affect graph title)",
{ default: 1 }
)
.option("--factor <factor:number>", "Factor to multiply the number of jobs by.", {
default: 1,
})
.action(main)
.command(
"upgrade",

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.463.4";
export const VERSION = "v1.463.6";
export async function login(email: string, password: string): Promise<string> {
return await windmill.UserService.login({
@@ -25,7 +25,7 @@ async function waitForDeployment(workspace: string, hash: string) {
if (resp.lock !== null) {
return;
}
} catch (err) {}
} catch (err) { }
await sleep(0.5);
}
throw new Error("Script did not deploy in time");
@@ -246,7 +246,7 @@ export const getFlowPayload = (flowPattern: string): api.FlowPreview => {
input_transforms: {},
language: api.RawScript.language.BASH,
type: "rawscript",
content: "# let's bloat that bash script, 3.. 2.. 1.. BOOM\n".repeat(25000) + "echo \"$WM_FLOW_JOB_ID\"\n",
content: "# let's bloat that bash script, 3.. 2.. 1.. BOOM\n".repeat(100) + `if [[ -z $\{WM_FLOW_JOB_ID+x\} ]]; then\necho "not set"\nelif [[ -z "$WM_FLOW_JOB_ID" ]]; then\necho "empty"\nelse\necho "$WM_FLOW_JOB_ID"\nfi`,
},
}
],

View File

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

View File

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

View File

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

View File

@@ -1099,6 +1099,14 @@ export function isFlowPreview(job_kind: Job['job_kind'] | undefined) {
return !!job_kind && (job_kind === 'flowpreview' || job_kind === 'flownode')
}
export function isNotFlow(job_kind: Job['job_kind'] | undefined) {
return (
job_kind !== 'flow' &&
job_kind !== 'singlescriptflow' &&
!isFlowPreview(job_kind)
)
}
export function isScriptPreview(job_kind: Job['job_kind'] | undefined) {
return (
!!job_kind && (job_kind === 'preview' || job_kind === 'flowscript' || job_kind === 'appscript')

View File

@@ -20,6 +20,7 @@
emptyString,
encodeState,
isFlowPreview,
isNotFlow,
isScriptPreview,
truncateHash,
truncateRev
@@ -119,7 +120,7 @@
let showExplicitProgressTip: boolean =
(localStorage.getItem('hideExplicitProgressTip') ?? 'false') == 'false'
$: job?.logs == undefined && job && viewTab == 'logs' && getLogs?.()
$: job?.logs == undefined && job && viewTab == 'logs' && isNotFlow(job?.job_kind) && getLogs?.()
let lastJobId: string | undefined = undefined
let concurrencyKey: string | undefined = undefined
@@ -222,15 +223,19 @@
})
}
if (job === undefined || job.job_kind !== 'script' || job.script_hash === undefined) {
return
}
const script = await ScriptService.getScriptByHash({
workspace: $workspaceStore!,
hash: job.script_hash
})
if (script.restart_unless_cancelled ?? false) {
persistentScriptDefinition = script
if (
job &&
job.job_kind === 'script' &&
job.script_hash &&
persistentScriptDefinition === undefined
) {
const script = await ScriptService.getScriptByHash({
workspace: $workspaceStore!,
hash: job.script_hash
})
if (script.restart_unless_cancelled ?? false) {
persistentScriptDefinition = script
}
}
}
@@ -241,6 +246,7 @@
function onRunsPageChange() {
job = undefined
persistentScriptDefinition = undefined
}
$: $workspaceStore && $page.params.run && onRunsPageChange()
$: $workspaceStore && $page.params.run && testJobLoader && onRunsPageChangeWithLoader()
@@ -846,7 +852,7 @@
<h2 class="mt-10">Scheduled to be executed later: {displayDate(job?.['scheduled_for'])}</h2>
</div>
{/if}
{#if job?.job_kind !== 'flow' && job?.job_kind !== 'singlescriptflow' && !isFlowPreview(job?.job_kind)}
{#if isNotFlow(job?.job_kind)}
{#if ['python3', 'bun', 'deno'].includes(job?.language ?? '') && (job?.job_kind == 'script' || isScriptPreview(job?.job_kind))}
<ExecutionDuration bind:job bind:longRunning={currentJobIsLongRunning} />
{/if}

View File

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

View File

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

View File

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

View File

@@ -1,6 +1,6 @@
[tool.poetry]
name = "wmill"
version = "1.463.4"
version = "1.463.6"
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.463.4"
version = "1.463.6"
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.463.4",
"version": "1.463.6",
"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.463.4",
"version": "1.463.6",
"author": "Ruben Fiszel",
"license": "Apache 2.0",
"devDependencies": {

View File

@@ -1 +1 @@
1.463.4
1.463.6