diff --git a/go.mod b/go.mod index 45b8da3dc..5bb1dcd36 100644 --- a/go.mod +++ b/go.mod @@ -5,8 +5,8 @@ go 1.24.0 toolchain go1.24.3 require ( - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.1 - github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.10.1 + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.2 + github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.11.0 github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azcertificates v1.4.0 github.com/Edgio/edgio-api v0.0.0-workspace github.com/G-Core/gcorelabscdn-go v1.0.32 @@ -14,9 +14,9 @@ require ( github.com/alibabacloud-go/apig-20240327/v3 v3.2.2 github.com/alibabacloud-go/cas-20200407/v3 v3.0.4 github.com/alibabacloud-go/cdn-20180510/v5 v5.2.2 - github.com/alibabacloud-go/cloudapi-20160714/v5 v5.7.6 - github.com/alibabacloud-go/darabonba-openapi/v2 v2.1.9 - github.com/alibabacloud-go/ddoscoo-20200101/v4 v4.0.1 + github.com/alibabacloud-go/cloudapi-20160714/v5 v5.7.7 + github.com/alibabacloud-go/darabonba-openapi/v2 v2.1.11 + github.com/alibabacloud-go/ddoscoo-20200101/v4 v4.0.2 github.com/alibabacloud-go/esa-20240910/v2 v2.36.0 github.com/alibabacloud-go/fc-20230330/v4 v4.3.6 github.com/alibabacloud-go/fc-open-20210406/v2 v2.0.12 @@ -24,21 +24,21 @@ require ( github.com/alibabacloud-go/live-20161101 v1.1.1 github.com/alibabacloud-go/nlb-20220430/v2 v2.0.3 github.com/alibabacloud-go/slb-20140515/v4 v4.0.10 - github.com/alibabacloud-go/tea v1.3.10 - github.com/alibabacloud-go/vod-20170321/v4 v4.8.4 + github.com/alibabacloud-go/tea v1.3.11 + github.com/alibabacloud-go/vod-20170321/v4 v4.9.2 github.com/alibabacloud-go/waf-openapi-20211001/v5 v5.6.0 github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible - github.com/aws/aws-sdk-go-v2/service/acm v1.33.1 - github.com/aws/aws-sdk-go-v2/service/cloudfront v1.47.0 - github.com/aws/aws-sdk-go-v2/service/iam v1.43.1 - github.com/baidubce/bce-sdk-go v0.9.235 + github.com/aws/aws-sdk-go-v2/service/acm v1.36.0 + github.com/aws/aws-sdk-go-v2/service/cloudfront v1.50.0 + github.com/aws/aws-sdk-go-v2/service/iam v1.47.1 + github.com/baidubce/bce-sdk-go v0.9.240 github.com/blinkbean/dingtalk v1.1.3 github.com/byteplus-sdk/byteplus-sdk-golang v1.0.53 - github.com/go-acme/lego/v4 v4.25.1 + github.com/go-acme/lego/v4 v4.25.2 github.com/go-lark/lark v1.16.0 github.com/go-resty/resty/v2 v2.16.5 github.com/go-viper/mapstructure/v2 v2.4.0 - github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.159 + github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.163 github.com/jdcloud-api/jdcloud-sdk-go v1.64.0 github.com/kong/go-kong v0.67.0 github.com/libdns/dynv6 v1.0.0 @@ -47,36 +47,36 @@ require ( github.com/pavlo-v-chernykh/keystore-go/v4 v4.5.0 github.com/pkg/sftp v1.13.9 github.com/pocketbase/dbx v1.11.0 - github.com/pocketbase/pocketbase v0.29.0 + github.com/pocketbase/pocketbase v0.29.3 github.com/povsister/scp v0.0.0-20250701154629-777cf82de5df github.com/qiniu/go-sdk/v7 v7.25.4 github.com/samber/lo v1.51.0 - github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdn v1.0.1207 - github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.0.1212 - github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1213 + github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdn v1.1.5 + github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.1.14 + github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.14 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/gaap v1.0.1200 - github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/live v1.0.1208 - github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/scf v1.0.1209 - github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ssl v1.0.1211 - github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/teo v1.0.1212 - github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vod v1.0.1210 - github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.1213 + github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/live v1.1.3 + github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/scf v1.1.0 + github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ssl v1.1.10 + github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/teo v1.1.7 + github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vod v1.1.13 + github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.1.11 github.com/ucloud/ucloud-sdk-go v0.22.45 - github.com/volcengine/ve-tos-golang-sdk/v2 v2.7.18 - github.com/volcengine/volc-sdk-golang v1.0.216 - github.com/volcengine/volcengine-go-sdk v1.1.23 + github.com/volcengine/ve-tos-golang-sdk/v2 v2.7.21 + github.com/volcengine/volc-sdk-golang v1.0.217 + github.com/volcengine/volcengine-go-sdk v1.1.28 gitlab.ecloud.com/ecloud/ecloudsdkclouddns v1.0.1 gitlab.ecloud.com/ecloud/ecloudsdkcore v1.0.0 - golang.org/x/crypto v0.40.0 - golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 - k8s.io/api v0.33.3 - k8s.io/apimachinery v0.33.3 - k8s.io/client-go v0.33.3 + golang.org/x/crypto v0.41.0 + golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b + k8s.io/api v0.33.4 + k8s.io/apimachinery v0.33.4 + k8s.io/client-go v0.33.4 software.sslmate.com/src/go-pkcs12 v0.6.0 ) require ( - github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1 // indirect + github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2 // indirect github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/dns/armdns v1.2.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/privatedns/armprivatedns v1.3.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resourcegraph/armresourcegraph v0.9.0 // indirect @@ -105,9 +105,10 @@ require ( github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/validator/v10 v10.23.0 // indirect github.com/go-sql-driver/mysql v1.8.1 // indirect + github.com/goccy/go-yaml v1.9.8 // indirect github.com/gofrs/uuid v4.4.0+incompatible // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v5 v5.2.3 // indirect + github.com/golang-jwt/jwt/v5 v5.3.0 // indirect github.com/google/gnostic-models v0.6.9 // indirect github.com/google/go-cmp v0.7.0 // indirect github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 // indirect @@ -140,6 +141,7 @@ require ( github.com/x448/float16 v0.8.4 // indirect go.mongodb.org/mongo-driver v1.17.2 // indirect go.yaml.in/yaml/v2 v2.4.2 // indirect + golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ns1/ns1-go.v2 v2.14.4 // indirect @@ -164,19 +166,19 @@ require ( github.com/alibabacloud-go/tea-xml v1.1.3 // indirect github.com/aliyun/credentials-go v1.4.6 // indirect github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect - github.com/aws/aws-sdk-go-v2 v1.36.6 + github.com/aws/aws-sdk-go-v2 v1.38.1 github.com/aws/aws-sdk-go-v2/config v1.29.18 github.com/aws/aws-sdk-go-v2/credentials v1.17.71 github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.33 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.37 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.37 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.4 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.4 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.18 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.25.6 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.4 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.34.1 // indirect - github.com/aws/smithy-go v1.22.4 // indirect + github.com/aws/smithy-go v1.22.5 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/clbanning/mxj/v2 v2.7.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect @@ -192,7 +194,7 @@ require ( github.com/google/uuid v1.6.0 github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect + github.com/json-iterator/go v1.1.13-0.20220915233716-71ac16282d12 // indirect github.com/kr/fs v0.1.0 // indirect github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect @@ -207,22 +209,22 @@ require ( github.com/spf13/pflag v1.0.7 // indirect github.com/tjfoc/gmsm v1.4.1 // indirect golang.org/x/image v0.29.0 // indirect - golang.org/x/mod v0.26.0 // indirect - golang.org/x/net v0.42.0 // indirect + golang.org/x/mod v0.27.0 // indirect + golang.org/x/net v0.43.0 // indirect golang.org/x/oauth2 v0.30.0 // indirect golang.org/x/sync v0.16.0 - golang.org/x/sys v0.34.0 // indirect - golang.org/x/term v0.33.0 // indirect - golang.org/x/text v0.27.0 // indirect + golang.org/x/sys v0.35.0 // indirect + golang.org/x/term v0.34.0 // indirect + golang.org/x/text v0.28.0 // indirect golang.org/x/time v0.12.0 - golang.org/x/tools v0.35.0 // indirect + golang.org/x/tools v0.36.0 // indirect google.golang.org/protobuf v1.36.6 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - modernc.org/libc v1.65.10 // indirect + modernc.org/libc v1.66.3 // indirect modernc.org/mathutil v1.7.1 // indirect modernc.org/memory v1.11.0 // indirect - modernc.org/sqlite v1.38.0 // indirect + modernc.org/sqlite v1.38.2 // indirect ) replace github.com/Edgio/edgio-api v0.0.0-workspace => ./pkg/forks/github.com/Edgio/edgio-api@v0.0.0-workspace diff --git a/go.sum b/go.sum index 7a24655e2..602120ed6 100644 --- a/go.sum +++ b/go.sum @@ -36,12 +36,18 @@ filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4 github.com/Azure/azure-sdk-for-go v68.0.0+incompatible h1:fcYLmCpyNYRnvJbPerq7U0hS+6+I79yEDJBqVNcqUzU= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.1 h1:Wc1ml6QlJs2BHQ/9Bqu1jiyggbsSjramq2oUmp5WeIo= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.1/go.mod h1:Ot/6aikWnKWi4l9QB7qVSwa8iMphQNqkWALMoNT3rzM= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.2 h1:Hr5FTipp7SL07o2FvoVOX9HRiRH3CR3Mj8pxqCcdD5A= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.2/go.mod h1:QyVsSSN64v5TGltphKLQ2sQxe4OBQg0J1eKRcVBnfgE= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.10.1 h1:B+blDbyVIG3WaikNxPnhPiJ1MThR03b3vKGtER95TP4= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.10.1/go.mod h1:JdM5psgjfBf5fo2uWOZhflPWyDBZ/O/CNAH9CtsuZE4= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.11.0 h1:MhRfI58HblXzCtWEZCO0feHs8LweePB3s90r7WaR1KU= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.11.0/go.mod h1:okZ+ZURbArNdlJ+ptXoyHNuOETzOl1Oww19rm8I2WLA= github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2 h1:yz1bePFlP5Vws5+8ez6T3HWXPmwOK7Yvq8QxDBD3SKY= github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2/go.mod h1:Pa9ZNPuoNu/GztvBSKk9J1cDJW6vk/n0zLtV4mgd8N8= github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1 h1:FPKJS1T+clwv+OLGt13a8UjqeRuh0O4SJ3lUriThc+4= github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1/go.mod h1:j2chePtV91HrC22tGoRX3sGY42uF13WzmmV80/OdVAA= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2 h1:9iefClla7iYpfYWdzPCRDozdmndjTm8DXdpCzPajMgA= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2/go.mod h1:XtLgD3ZD34DAaVIIAyG3objl5DynM3CQ/vMcbBNJZGI= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/dns/armdns v1.2.0 h1:lpOxwrQ919lCZoNCd69rVt8u1eLZuMORrGXqy8sNf3c= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/dns/armdns v1.2.0/go.mod h1:fSvRkb8d26z9dbL40Uf/OO6Vo9iExtZK3D0ulRV+8M0= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v3 v3.1.0 h1:2qsIIvxVT+uE6yrNldntJKlLRgxGbZ85kgtz5SNBhMw= @@ -102,6 +108,8 @@ github.com/alibabacloud-go/cdn-20180510/v5 v5.2.2 h1:+KJOPukTM+xMyiLOW5qBwYKG2df github.com/alibabacloud-go/cdn-20180510/v5 v5.2.2/go.mod h1:GnPiPL3HlzCi8SGiLiVgKrAFkP1vTtcF4yGtjsl4wfo= github.com/alibabacloud-go/cloudapi-20160714/v5 v5.7.6 h1:0NB4hiiqqF7etZ7WgsaO7fkaj79pEMGEUeb74ZGPRKE= github.com/alibabacloud-go/cloudapi-20160714/v5 v5.7.6/go.mod h1:5bdtTnhDmV4jXyIinHY15bJrUl8TwMIhrICNQBy+MD8= +github.com/alibabacloud-go/cloudapi-20160714/v5 v5.7.7 h1:+NCbioja/R33VQdqA35X7AVuYrpkCZ6uDVQ+j1GkSjY= +github.com/alibabacloud-go/cloudapi-20160714/v5 v5.7.7/go.mod h1:6fBf26RoBBpSq3dMPro5UnOw34+dk5PnikcynJX9opU= github.com/alibabacloud-go/darabonba-array v0.1.0 h1:vR8s7b1fWAQIjEjWnuF0JiKsCvclSRTfDzZHTYqfufY= github.com/alibabacloud-go/darabonba-array v0.1.0/go.mod h1:BLKxr0brnggqOJPqT09DFJ8g3fsDshapUD3C3aOEFaI= github.com/alibabacloud-go/darabonba-encode-util v0.0.2 h1:1uJGrbsGEVqWcWxrS9MyC2NG0Ax+GpOM5gtupki31XE= @@ -117,6 +125,8 @@ github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.11/go.mod h1:wHxkgZT1ClZdcw github.com/alibabacloud-go/darabonba-openapi/v2 v2.1.8/go.mod h1:d+z3ScRqc7PFzg4h9oqE3h8yunRZvAvU7u+iuPYEhpU= github.com/alibabacloud-go/darabonba-openapi/v2 v2.1.9 h1:7P0KWfed/YMtpeuW3E2iwokzoz9L7H9rB+VZzg5DeBs= github.com/alibabacloud-go/darabonba-openapi/v2 v2.1.9/go.mod h1:kgnXaV74AVjM3ZWJu1GhyXGuCtxljJ677oUfz6MyJOE= +github.com/alibabacloud-go/darabonba-openapi/v2 v2.1.11 h1:5JIs4BPVpzbgcBrgmUxBdDsMjmsHZvPbTPD1m4aB+ZQ= +github.com/alibabacloud-go/darabonba-openapi/v2 v2.1.11/go.mod h1:ue0+WkdPxpCB2JP3iaG4Iawayxp72kyT5uDbozQKaW8= github.com/alibabacloud-go/darabonba-signature-util v0.0.7 h1:UzCnKvsjPFzApvODDNEYqBHMFt1w98wC7FOo0InLyxg= github.com/alibabacloud-go/darabonba-signature-util v0.0.7/go.mod h1:oUzCYV2fcCH797xKdL6BDH8ADIHlzrtKVjeRtunBNTQ= github.com/alibabacloud-go/darabonba-string v1.0.2 h1:E714wms5ibdzCqGeYJ9JCFywE5nDyvIXIIQbZVFkkqo= @@ -125,6 +135,8 @@ github.com/alibabacloud-go/dcdn-20180115/v3 v3.5.0 h1:EQmKhYju6y38kJ1ZvZROeJG2Q1 github.com/alibabacloud-go/dcdn-20180115/v3 v3.5.0/go.mod h1:b9qzvr/2V1f0r1Z6xUmkLqEouKcPGy4LCC22yV+6HQo= github.com/alibabacloud-go/ddoscoo-20200101/v4 v4.0.1 h1:KD17N7f83BO+bSKfPU7Mg2pSfIiBCbBlHL14Zd3S/a0= github.com/alibabacloud-go/ddoscoo-20200101/v4 v4.0.1/go.mod h1:iXO5nADvrdxU7Lek8DjNrWG7yD7EV6X18kewPUKBC2c= +github.com/alibabacloud-go/ddoscoo-20200101/v4 v4.0.2 h1:KvHAZ1yCJ6NnF6aeqhR0e8kuc7zCrUAkS7+2RyQaJJU= +github.com/alibabacloud-go/ddoscoo-20200101/v4 v4.0.2/go.mod h1:fBEEvkfQEp5k7yfMzU4n0zWcibHDoGfakv3YaopBdiI= github.com/alibabacloud-go/debug v0.0.0-20190504072949-9472017b5c68/go.mod h1:6pb/Qy8c+lqua8cFpEy7g39NRRqOWc3rOwAy8m5Y2BY= github.com/alibabacloud-go/debug v1.0.0/go.mod h1:8gfgZCCAC3+SCzjWtY053FrOcd4/qlH6IHTI4QyICOc= github.com/alibabacloud-go/debug v1.0.1 h1:MsW9SmUtbb1Fnt3ieC6NNZi6aEwrXfDksD4QA6GSbPg= @@ -166,6 +178,8 @@ github.com/alibabacloud-go/tea v1.2.2/go.mod h1:CF3vOzEMAG+bR4WOql8gc2G9H3EkH3ZL github.com/alibabacloud-go/tea v1.3.9/go.mod h1:A560v/JTQ1n5zklt2BEpurJzZTI8TUT+Psg2drWlxRg= github.com/alibabacloud-go/tea v1.3.10 h1:J0Ke8iMyoxX2daj90hdPr1QgfxJnhR8SOflB910o/Dk= github.com/alibabacloud-go/tea v1.3.10/go.mod h1:A560v/JTQ1n5zklt2BEpurJzZTI8TUT+Psg2drWlxRg= +github.com/alibabacloud-go/tea v1.3.11 h1:F7s2HRszY0J+tFckhy5FCpnBEENTijgFcYR68Brg9/Y= +github.com/alibabacloud-go/tea v1.3.11/go.mod h1:A560v/JTQ1n5zklt2BEpurJzZTI8TUT+Psg2drWlxRg= github.com/alibabacloud-go/tea-fileform v1.1.1 h1:1YG6erAP3joQ0XdCXYIotuD7zyOM6qCR49xkp5FZDeU= github.com/alibabacloud-go/tea-fileform v1.1.1/go.mod h1:ZeCV91o4ISmxidd686f0ebdS5EDHWU+vW+TkjLhrsFE= github.com/alibabacloud-go/tea-oss-sdk v1.1.3/go.mod h1:yUnodpR3Bf2rudLE7V/Gft5txjJF30Pk+hH77K/Eab0= @@ -190,6 +204,8 @@ github.com/alibabacloud-go/tea-xml v1.1.3 h1:7LYnm+JbOq2B+T/B0fHC4Ies4/FofC4zHzY github.com/alibabacloud-go/tea-xml v1.1.3/go.mod h1:Rq08vgCcCAjHyRi/M7xlHKUykZCEtyBy9+DPF6GgEu8= github.com/alibabacloud-go/vod-20170321/v4 v4.8.4 h1:MYP2xfrcud8vlWljQ4lhemNgAgi9/AUAa450n8TUXZo= github.com/alibabacloud-go/vod-20170321/v4 v4.8.4/go.mod h1:5ocQ6hIc9tpGixD2iy099aOGwIgpzjT2le4Krd4aLn8= +github.com/alibabacloud-go/vod-20170321/v4 v4.9.2 h1:4TojRyj2k/k0Vs9j0SVRR3BJbdTXMEZhJy7poFs3ZkM= +github.com/alibabacloud-go/vod-20170321/v4 v4.9.2/go.mod h1:3iJRCLBKjbMhYXt2sUbvz5vUdMuynms3cMTKNQ9nIdM= github.com/alibabacloud-go/waf-openapi-20211001/v5 v5.6.0 h1:jqiPGtZJhdnGnni6EKIrUY9yhwOo37qz1IeX0bkfBbk= github.com/alibabacloud-go/waf-openapi-20211001/v5 v5.6.0/go.mod h1:9itYSTzipL3NlvhvNYfTjFaapoZzG68nlu/KUdh9SpA= github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible h1:8psS8a+wKfiLt1iVDX79F7Y6wUM49Lcha2FMXt4UM8g= @@ -216,6 +232,8 @@ github.com/aws/aws-sdk-go v1.40.45/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm github.com/aws/aws-sdk-go-v2 v1.9.1/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= github.com/aws/aws-sdk-go-v2 v1.36.6 h1:zJqGjVbRdTPojeCGWn5IR5pbJwSQSBh5RWFTQcEQGdU= github.com/aws/aws-sdk-go-v2 v1.36.6/go.mod h1:EYrzvCCN9CMUTa5+6lf6MM4tq3Zjp8UhSGR/cBsjai0= +github.com/aws/aws-sdk-go-v2 v1.38.1 h1:j7sc33amE74Rz0M/PoCpsZQ6OunLqys/m5antM0J+Z8= +github.com/aws/aws-sdk-go-v2 v1.38.1/go.mod h1:9Q0OoGQoboYIAJyslFyF1f5K1Ryddop8gqMhWx/n4Wg= github.com/aws/aws-sdk-go-v2/config v1.29.18 h1:x4T1GRPnqKV8HMJOMtNktbpQMl3bIsfx8KbqmveUO2I= github.com/aws/aws-sdk-go-v2/config v1.29.18/go.mod h1:bvz8oXugIsH8K7HLhBv06vDqnFv3NsGDt2Znpk7zmOU= github.com/aws/aws-sdk-go-v2/credentials v1.17.71 h1:r2w4mQWnrTMJjOyIsZtGp3R3XGY3nqHn8C26C2lQWgA= @@ -224,17 +242,27 @@ github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.33 h1:D9ixiWSG4lyUBL2DDNK924 github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.33/go.mod h1:caS/m4DI+cij2paz3rtProRBI4s/+TCiWoaWZuQ9010= github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.37 h1:osMWfm/sC/L4tvEdQ65Gri5ZZDCUpuYJZbTTDrsn4I0= github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.37/go.mod h1:ZV2/1fbjOPr4G4v38G3Ww5TBT4+hmsK45s/rxu1fGy0= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.4 h1:IdCLsiiIj5YJ3AFevsewURCPV+YWUlOW8JiPhoAy8vg= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.4/go.mod h1:l4bdfCD7XyyZA9BolKBo1eLqgaJxl0/x91PL4Yqe0ao= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.37 h1:v+X21AvTb2wZ+ycg1gx+orkB/9U6L7AOp93R7qYxsxM= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.37/go.mod h1:G0uM1kyssELxmJ2VZEfG0q2npObR3BAkF3c1VsfVnfs= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.4 h1:j7vjtr1YIssWQOMeOWRbh3z8g2oY/xPjnZH2gLY4sGw= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.4/go.mod h1:yDmJgqOiH4EA8Hndnv4KwAo8jCGTSnM5ASG1nBI+toA= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= github.com/aws/aws-sdk-go-v2/service/acm v1.33.1 h1:VAAadBIWgoYoS0tRWkghu1E2LfSsKQw8m/sOkdF1D3E= github.com/aws/aws-sdk-go-v2/service/acm v1.33.1/go.mod h1:eq3JsAPGHsNfhRbPoVRUVDxtQFynlnFcDXzxFMEeOdQ= +github.com/aws/aws-sdk-go-v2/service/acm v1.36.0 h1:U16SZFwZpyQGXUyrrmOqWqU9jMYhokCSpc+fYajYLy0= +github.com/aws/aws-sdk-go-v2/service/acm v1.36.0/go.mod h1:fdYDfiFuQij96Ryxl5uJK5xGAjyLhHGiBwquH7mpuAc= github.com/aws/aws-sdk-go-v2/service/cloudfront v1.47.0 h1:RyGeARqe2WTJU1K7L7rFQuCqLscbzQoi1oy7LxnROIE= github.com/aws/aws-sdk-go-v2/service/cloudfront v1.47.0/go.mod h1:0zgTNyuzL2+HfnkP+w8Z+eKtKu7KbOTWuywJYdjkWfY= +github.com/aws/aws-sdk-go-v2/service/cloudfront v1.50.0 h1:PN9qG49RrQ5b9in9ZfHqY3LxVEKoURo0Ia0LMjzFkw8= +github.com/aws/aws-sdk-go-v2/service/cloudfront v1.50.0/go.mod h1:HLzQI9ENSq0pNCO+ASh5KbwL7AoYBqPkTLv1Y40+pl4= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.8.1/go.mod h1:CM+19rL1+4dFWnOQKwDc7H1KwXTz+h61oUSHyhV0b3o= github.com/aws/aws-sdk-go-v2/service/iam v1.43.1 h1:xpPZZpbmqIJse9OH+Kf/bW/n+bRe0BtE/LtHvBJYcbc= github.com/aws/aws-sdk-go-v2/service/iam v1.43.1/go.mod h1:/IEkOg5Gkv2HFxOb3Prs84xpRyxO9P/9Zow/clWl84Q= +github.com/aws/aws-sdk-go-v2/service/iam v1.47.1 h1:8qIz2VOP22KhWlMhh2nZOlvQjXHcZ1jIYy/LmP1r0go= +github.com/aws/aws-sdk-go-v2/service/iam v1.47.1/go.mod h1:t7ahGe9ZaK9mmtYhCMjVA6euun4iNzaeDnJyONTBlms= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4 h1:CXV68E2dNqhuynZJPB80bhPQwAKqBWVer887figW6Jc= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4/go.mod h1:/xFi9KtvBXP97ppCz1TAEvU1Uf66qvid89rbem3wCzQ= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.18 h1:vvbXsA2TVO80/KT7ZqCbx934dt6PY+vQ8hZpUZ/cpYg= @@ -250,8 +278,12 @@ github.com/aws/aws-sdk-go-v2/service/sts v1.34.1/go.mod h1:3wFBZKoWnX3r+Sm7in79i github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/aws/smithy-go v1.22.4 h1:uqXzVZNuNexwc/xrh6Tb56u89WDlJY6HS+KC0S4QSjw= github.com/aws/smithy-go v1.22.4/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= +github.com/aws/smithy-go v1.22.5 h1:P9ATCXPMb2mPjYBgueqJNCA5S9UfktsW0tTxi+a7eqw= +github.com/aws/smithy-go v1.22.5/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= github.com/baidubce/bce-sdk-go v0.9.235 h1:iAi+seH9w1Go2szFNzyGumahLGDsuYZ3i8hduX3qiM8= github.com/baidubce/bce-sdk-go v0.9.235/go.mod h1:zbYJMQwE4IZuyrJiFO8tO8NbtYiKTFTbwh4eIsqjVdg= +github.com/baidubce/bce-sdk-go v0.9.240 h1:vw0BDkg+uV47tqYXqwgsQnCEIAmKEvq/4lprs6bH0bg= +github.com/baidubce/bce-sdk-go v0.9.240/go.mod h1:zbYJMQwE4IZuyrJiFO8tO8NbtYiKTFTbwh4eIsqjVdg= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= @@ -329,6 +361,7 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.m github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= @@ -353,6 +386,8 @@ github.com/go-acme/alidns-20150109/v4 v4.5.10 h1:epLD0VaHR5XUpiM6mjm4MzQFICrk+zp github.com/go-acme/alidns-20150109/v4 v4.5.10/go.mod h1:qGRq8kD0xVgn82qRSQmhHwh/oWxKRjF4Db5OI4ScV5g= github.com/go-acme/lego/v4 v4.25.1 h1:AYPUM7quPN/g2PcjjWw8sAMz3eV+Z8UWkr1kitDOyVA= github.com/go-acme/lego/v4 v4.25.1/go.mod h1:OORYyVNZPaNdIdVYCGSBNRNZDIjhQbPuFxwGDgWj/yM= +github.com/go-acme/lego/v4 v4.25.2 h1:+D1Q+VnZrD+WJdlkgUEGHFFTcDrwGlE7q24IFtMmHDI= +github.com/go-acme/lego/v4 v4.25.2/go.mod h1:OORYyVNZPaNdIdVYCGSBNRNZDIjhQbPuFxwGDgWj/yM= github.com/go-acme/tencentclouddnspod v1.0.1208 h1:xAVy1lmg2KcKKeYmFSBQUttwc1o1S++9QTjAotGC+BM= github.com/go-acme/tencentclouddnspod v1.0.1208/go.mod h1:yxG02mkbbVd7lTb97nOn7oj09djhm7hAwxNQw4B9dpQ= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= @@ -392,6 +427,7 @@ github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+ github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= github.com/go-playground/validator/v10 v10.7.0/go.mod h1:xm76BBt941f7yWdGnI2DVPFFg1UK3YY04qifoXU3lOk= github.com/go-playground/validator/v10 v10.23.0 h1:/PwmTwZhS0dPkav3cdK9kV1FsAmrL8sThn8IHr/sO+o= github.com/go-playground/validator/v10 v10.23.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= @@ -410,6 +446,8 @@ github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncV github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/go-zookeeper/zk v1.0.2/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= +github.com/goccy/go-yaml v1.9.8 h1:5gMyLUeU1/6zl+WFfR1hN7D2kf+1/eRGa7DFtToiBvQ= +github.com/goccy/go-yaml v1.9.8/go.mod h1:JubOolP3gh0HpiBc4BLRD4YmjEjHAmIIB2aaXKkTfoE= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= @@ -420,6 +458,8 @@ github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69 github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v5 v5.2.3 h1:kkGXqQOBSDDWRhWNXTFpqGSCMyh/PLnqUvMGJPDJDs0= github.com/golang-jwt/jwt/v5 v5.2.3/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v5 v5.3.0 h1:pv4AsKCKKZuqlgs5sUmn4x8UlGa0kEVt/puTpKx9vvo= +github.com/golang-jwt/jwt/v5 v5.3.0/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -546,6 +586,8 @@ github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKEN github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.159 h1:6LZysc4iyO4cHB1aJsRklWfSEJr8CEhW7BmcM0SkYcU= github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.159/go.mod h1:Y/+YLCFCJtS29i2MbYPTUlNNfwXvkzEsZKR0imY/2aY= +github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.163 h1:2OAYy5J1sJXjVTqucSDqf4VSd8Pzf10ZuyzK2HTTqUU= +github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.163/go.mod h1:M+yna96Fx9o5GbIUnF3OvVvQGjgfVSyeJbV9Yb1z/wI= github.com/hudl/fargo v1.4.0/go.mod h1:9Ai6uvFy5fQNq6VPKtg+Ceq1+eTY4nKUlR2JElEOcDo= github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= @@ -580,6 +622,8 @@ github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/ github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/json-iterator/go v1.1.13-0.20220915233716-71ac16282d12 h1:9Nu54bhS/H/Kgo2/7xNSUuC5G28VR8ljfrLKU2G4IjU= +github.com/json-iterator/go v1.1.13-0.20220915233716-71ac16282d12/go.mod h1:TBzl5BIHNXfS9+C35ZyJaklL7mLDbgUkcgXzSLa8Tk0= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= @@ -743,6 +787,10 @@ github.com/pocketbase/dbx v1.11.0 h1:LpZezioMfT3K4tLrqA55wWFw1EtH1pM4tzSVa7kgszU github.com/pocketbase/dbx v1.11.0/go.mod h1:xXRCIAKTHMgUCyCKZm55pUOdvFziJjQfXaWKhu2vhMs= github.com/pocketbase/pocketbase v0.29.0 h1:oL6qvkU2QSybClVtQdaq9Z1F3Wk59iKYCfIaf1R8KUs= github.com/pocketbase/pocketbase v0.29.0/go.mod h1:SqyH7o/3e+/uLySATlJqxH4S8gyU6R0adG56ZSV1vuU= +github.com/pocketbase/pocketbase v0.29.2 h1:MghVgLYy/xh9lBwHtteNSYjYOvHKYD+dS9pzUzOP79Q= +github.com/pocketbase/pocketbase v0.29.2/go.mod h1:QZPKtMCWfiDJb0aLhwgj7ZOr6O8tusbui2EhTFAHThU= +github.com/pocketbase/pocketbase v0.29.3 h1:Mj8o5awsbVJIdIoTuQNhfC2oL/c4aImQ3RyfFZlzFVg= +github.com/pocketbase/pocketbase v0.29.3/go.mod h1:oGpT67LObxCFK4V2fSL7J9YnPbBnnshOpJ5v3zcneww= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/povsister/scp v0.0.0-20250701154629-777cf82de5df h1:zEgSHrxo8f6hGG1xCaqunfBq8hlfDmFd1JM0QXiQi7o= @@ -791,6 +839,7 @@ github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb github.com/samber/lo v1.51.0 h1:kysRYLbHy/MB7kQZf5DSN50JHmMsNEdeY24VzJFu7wI= github.com/samber/lo v1.51.0/go.mod h1:4+MXEGsJzbKGaUEQFKBq2xtfuznW9oz/WrgyzMzRoM0= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.3.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= @@ -836,8 +885,12 @@ github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOf github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdn v1.0.1207 h1:FO4Q4UNwLP6achx7Y8EblzeVDG4BW66aGG4Hk7y5r9U= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdn v1.0.1207/go.mod h1:YQW7rko8ub/X7RJWS/Yqb8fG30Wk4EEmnZI7GTnKBp4= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdn v1.1.5 h1:d1Qxqq2eHHGkNhUS1lUmgNnyJMVz0Eg+n8gIqTMxA+8= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdn v1.1.5/go.mod h1:ITOgZuYkf3FdQJceKzaBwUhG535JaqSA5Nog4mM/e1I= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.0.1212 h1:PrOVwyGIVITOP51HzfBqiD3PDrWJ3ZrijsiYyEj8Wn4= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.0.1212/go.mod h1:EDYceO3jwZ8FU7LWjXpZGeCO4Ti3iqeg2j2NZTMBHQs= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.1.14 h1:AyCLbxE55tuoei9fhlhGVrd9yiU/PdyDOyMQYFvRxJU= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.1.14/go.mod h1:zHhSaVjo4w4+toT8XsV6TCT5N5gtPOg538L7Aay7U+E= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1200/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1207/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1208/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= @@ -847,20 +900,41 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1211/go.mod github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1212/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1213 h1:ChLfbQsFFiBoolNyZ4Umvrg90QrdsnYH0KiKZwOhLkE= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1213/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.0/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.3/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.5/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.7/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.10/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.11/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.13/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.14 h1:+I+n8wDpnG95yLnV3rtT4MUs8gdwgbpuZEVKQhSxqxs= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.14/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/gaap v1.0.1200 h1:SqfiAwdDQx1SG2XKMBBxwUTZSBlVNFCVt/hynkl6JHM= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/gaap v1.0.1200/go.mod h1:zwjcd7dfjsmAPD7yEHHY36tnDM5ts5rUgThXGvsZ+OE= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/live v1.0.1208 h1:GLCCKdL1yWCSAF7hinVnOmOGgMfKXDrWkOuvhAhIg8I= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/live v1.0.1208/go.mod h1:0TssSKHt8SCgjMTaxr1Fjfrp+OUTqp+tkglNoXIkCyM= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/live v1.1.3 h1:z8cdM+64rsQ6DbG6aXG9NaP/CldF+lgpZwli0qFnuVc= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/live v1.1.3/go.mod h1:O9AbLV8J4wdm1pEx66qy7UbACGE8NO2UxucPPDNMcDQ= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/scf v1.0.1209 h1:2cYGQZktchIE3jjn1qglPwSCGg2kaQBW8k5xbUIEWIw= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/scf v1.0.1209/go.mod h1:u14H5ciHEeHMPQL1e6HwHf5gAHc4h65c5gDMaF4dF38= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/scf v1.1.0 h1:tBrYIRge/u1vOXLDuFBbiP3uv59I7JUekhkCzM8KQ5A= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/scf v1.1.0/go.mod h1:q904dfEmrK/ETugTjgL7j1spCT08ioeLUV5JA4Bj8Xk= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ssl v1.0.1211 h1:SXEmqWgiSln9UDElTFz2XwZAwxLS2F92fOeWygMFA9I= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ssl v1.0.1211/go.mod h1:k0C4B9RPQcL++fMFS32d8nAl6ApXs8+Nfusk1HugCis= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ssl v1.1.10 h1:dj7PUBNAK1D4aSWxSxAbPxmJ12M8Etos8lYVJWyIdGs= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ssl v1.1.10/go.mod h1:Xt/9WKwki9CCfSAG8e848Sk54HfNa9ZApFhLHxBr1W8= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/teo v1.0.1212 h1:LUeCZrOPScN5HVRvT+Vz+MJ0aOHE0kqhkCy/UXdzRJc= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/teo v1.0.1212/go.mod h1:mWIN9z1o7n3T59FAu0bpPq2iKG4VcmHHWTe74Cz6wN0= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/teo v1.1.7 h1:2nuXJAtcySCGhKyv/LOFA04v9DtukYk6U0Xc3ZZU0pA= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/teo v1.1.7/go.mod h1:uqAhbeIHHrk9eb3D4pFIREq1kY0y+AjXY26pNj5N2Zo= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vod v1.0.1210 h1:DbRK20aFfzpnFEUbzuBaeMmIMrpQs5LCZIZlPTmvJ68= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vod v1.0.1210/go.mod h1:8Gy21lo1a5wUAzrzhmgXF/4zhulI5sbW3HwGt5i5qzc= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vod v1.1.13 h1:eU1aa13vM0YWPP4DC/2HSeAVGP+U/Qdqb/syrepIroI= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vod v1.1.13/go.mod h1:q8AXovSiUhSct/xncaNrz1Br0Rfg0IiZrLaRIuYz3rI= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.1213 h1:/2TWW5pHhxHcft+aj9tLS3o+s8ZfrYaXC+eZo1eMyko= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.1213/go.mod h1:xzGeque72VBwuOin47PdjPh5axADALnYc9WR5g/plBU= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.1.11 h1:2jrTSxfC4AX0qv8rrK2Cpay+hz1FJlii2jNMlPFlnPI= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.1.11/go.mod h1:JY5OQafRSIAh/s+YIT8mgnZbqiq+EjdFgDriJLMThf0= github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= @@ -878,11 +952,17 @@ github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0o github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= github.com/volcengine/ve-tos-golang-sdk/v2 v2.7.18 h1:uint/YlMWuQ5et0ab+AOHq+re+yi8pOvjS77gker8ms= github.com/volcengine/ve-tos-golang-sdk/v2 v2.7.18/go.mod h1:IrjK84IJJTuOZOTMv/P18Ydjy/x+ow7fF7q11jAxXLM= +github.com/volcengine/ve-tos-golang-sdk/v2 v2.7.21 h1:t6OkemY2V5wi6YNWB5ezqTrQM+/+bu0Bf35H9XrP5kQ= +github.com/volcengine/ve-tos-golang-sdk/v2 v2.7.21/go.mod h1:IrjK84IJJTuOZOTMv/P18Ydjy/x+ow7fF7q11jAxXLM= github.com/volcengine/volc-sdk-golang v1.0.23/go.mod h1:AfG/PZRUkHJ9inETvbjNifTDgut25Wbkm2QoYBTbvyU= github.com/volcengine/volc-sdk-golang v1.0.216 h1:+wAq8RvxpGECveRJaAXZFpzrZoQ33WjMuRyd9iY2Oc0= github.com/volcengine/volc-sdk-golang v1.0.216/go.mod h1:zHJlaqiMbIB+0mcrsZPTwOb3FB7S/0MCfqlnO8R7hlM= +github.com/volcengine/volc-sdk-golang v1.0.217 h1:ylONAeFRGTRc5D0s2ASvekaoQsKDD1fd+w41IgAoVvk= +github.com/volcengine/volc-sdk-golang v1.0.217/go.mod h1:zHJlaqiMbIB+0mcrsZPTwOb3FB7S/0MCfqlnO8R7hlM= github.com/volcengine/volcengine-go-sdk v1.1.23 h1:wa4ytrLa1UBc/+/R4hEJDtBYD+TpHxLLh5+G+J1x1Rg= github.com/volcengine/volcengine-go-sdk v1.1.23/go.mod h1:EyKoi6t6eZxoPNGr2GdFCZti2Skd7MO3eUzx7TtSvNo= +github.com/volcengine/volcengine-go-sdk v1.1.28 h1:hDErsr+6LDlX++Wfjsmra4bHAx8T0IbkNChG9VsOjjM= +github.com/volcengine/volcengine-go-sdk v1.1.28/go.mod h1:EyKoi6t6eZxoPNGr2GdFCZti2Skd7MO3eUzx7TtSvNo= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= @@ -955,6 +1035,8 @@ golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5D golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM= golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY= +golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4= +golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -970,6 +1052,8 @@ golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EH golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 h1:R9PFI6EUdfVKgwKjZef7QIwGcBKu86OEFpJ9nUEP2l4= golang.org/x/exp v0.0.0-20250718183923-645b1fa84792/go.mod h1:A+z0yzpGtvnG90cToK5n2tu8UJVP2XUATh+r+sfOOOc= +golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b h1:DXr+pvt3nC887026GRP39Ej11UATqWDmWuS99x26cD0= +golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b/go.mod h1:4QTo5u+SEIbbKW1RacMZq1YEfOBqeXa19JeshGi+zc4= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -1003,6 +1087,8 @@ golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg= golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ= +golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ= +golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1060,6 +1146,8 @@ golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs= golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8= +golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= +golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1147,6 +1235,7 @@ golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220406163625-3f8b81556e12/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1167,6 +1256,8 @@ golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= +golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1184,6 +1275,8 @@ golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/term v0.33.0 h1:NuFncQrRcaRvVmgRkvM3j/F00gWIAlcmlB8ACEKmGIg= golang.org/x/term v0.33.0/go.mod h1:s18+ql9tYWp1IfpV9DmCtQDDSRBUjKaw9M1eAv5UeF0= +golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4= +golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1204,6 +1297,8 @@ golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4= golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU= +golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= +golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1267,9 +1362,12 @@ golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58 golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0= golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw= +golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg= +golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= @@ -1407,10 +1505,16 @@ honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.33.3 h1:SRd5t//hhkI1buzxb288fy2xvjubstenEKL9K51KBI8= k8s.io/api v0.33.3/go.mod h1:01Y/iLUjNBM3TAvypct7DIj0M0NIZc+PzAHCIo0CYGE= +k8s.io/api v0.33.4 h1:oTzrFVNPXBjMu0IlpA2eDDIU49jsuEorGHB4cvKupkk= +k8s.io/api v0.33.4/go.mod h1:VHQZ4cuxQ9sCUMESJV5+Fe8bGnqAARZ08tSTdHWfeAc= k8s.io/apimachinery v0.33.3 h1:4ZSrmNa0c/ZpZJhAgRdcsFcZOw1PQU1bALVQ0B3I5LA= k8s.io/apimachinery v0.33.3/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM= +k8s.io/apimachinery v0.33.4 h1:SOf/JW33TP0eppJMkIgQ+L6atlDiP/090oaX0y9pd9s= +k8s.io/apimachinery v0.33.4/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM= k8s.io/client-go v0.33.3 h1:M5AfDnKfYmVJif92ngN532gFqakcGi6RvaOF16efrpA= k8s.io/client-go v0.33.3/go.mod h1:luqKBQggEf3shbxHY4uVENAxrDISLOarxpTKMiUuujg= +k8s.io/client-go v0.33.4 h1:TNH+CSu8EmXfitntjUPwaKVPN0AYMbc9F1bBS8/ABpw= +k8s.io/client-go v0.33.4/go.mod h1:LsA0+hBG2DPwovjd931L/AoaezMPX9CmBgyVyBZmbCY= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff h1:/usPimJzUKKu+m+TE36gUyGcf03XZEP0ZIKgKj35LS4= @@ -1428,6 +1532,8 @@ modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI= modernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito= modernc.org/libc v1.65.10 h1:ZwEk8+jhW7qBjHIT+wd0d9VjitRyQef9BnzlzGwMODc= modernc.org/libc v1.65.10/go.mod h1:StFvYpx7i/mXtBAfVOjaU0PWZOvIRoZSgXhrwXzr8Po= +modernc.org/libc v1.66.3 h1:cfCbjTUcdsKyyZZfEUKfoHcP3S0Wkvz3jgSzByEWVCQ= +modernc.org/libc v1.66.3/go.mod h1:XD9zO8kt59cANKvHPXpx7yS2ELPheAey0vjIuZOhOU8= modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU= modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg= modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI= @@ -1438,6 +1544,8 @@ modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w= modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE= modernc.org/sqlite v1.38.0 h1:+4OrfPQ8pxHKuWG4md1JpR/EYAh3Md7TdejuuzE7EUI= modernc.org/sqlite v1.38.0/go.mod h1:1Bj+yES4SVvBZ4cBOpVZ6QgesMCKpJZDq0nxYzOpmNE= +modernc.org/sqlite v1.38.2 h1:Aclu7+tgjgcQVShZqim41Bbw9Cho0y/7WzYptXqkEek= +modernc.org/sqlite v1.38.2/go.mod h1:cPTJYSlgg3Sfg046yBShXENNtPrWrDX8bsbAQBzgQ5E= modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0= modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A= modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= diff --git a/internal/certificate/service_deps.go b/internal/certificate/service_deps.go index 7b22dbbad..ecdca099e 100644 --- a/internal/certificate/service_deps.go +++ b/internal/certificate/service_deps.go @@ -9,7 +9,7 @@ import ( ) type certificateRepository interface { - ListExpireSoon(ctx context.Context) ([]*domain.Certificate, error) + ListExpiringSoon(ctx context.Context) ([]*domain.Certificate, error) GetById(ctx context.Context, id string) (*domain.Certificate, error) DeleteWhere(ctx context.Context, exprs ...dbx.Expression) (int, error) } diff --git a/internal/domain/statistics.go b/internal/domain/statistics.go index 1d3cbfdd3..bf3246df3 100644 --- a/internal/domain/statistics.go +++ b/internal/domain/statistics.go @@ -1,9 +1,9 @@ package domain type Statistics struct { - CertificateTotal int `json:"certificateTotal"` - CertificateExpireSoon int `json:"certificateExpireSoon"` - CertificateExpired int `json:"certificateExpired"` + CertificateTotal int `json:"certificateTotal"` + CertificateExpiringSoon int `json:"certificateExpiringSoon"` + CertificateExpired int `json:"certificateExpired"` WorkflowTotal int `json:"workflowTotal"` WorkflowEnabled int `json:"workflowEnabled"` diff --git a/internal/domain/workflow.go b/internal/domain/workflow.go index 236db82c9..b3f39d65c 100644 --- a/internal/domain/workflow.go +++ b/internal/domain/workflow.go @@ -93,6 +93,7 @@ const ( WorkflowNodeTypeTryCatch = WorkflowNodeType("tryCatch") WorkflowNodeTypeTryBlock = WorkflowNodeType("tryBlock") WorkflowNodeTypeCatchBlock = WorkflowNodeType("catchBlock") + WorkflowNodeTypeDelay = WorkflowNodeType("delay") WorkflowNodeTypeBizApply = WorkflowNodeType("bizApply") WorkflowNodeTypeBizUpload = WorkflowNodeType("bizUpload") WorkflowNodeTypeBizMonitor = WorkflowNodeType("bizMonitor") @@ -101,12 +102,36 @@ const ( ) type WorkflowNodeData struct { - Name string `json:"name"` - Config WorkflowNodeConfig `json:"config"` + Name string `json:"name"` + Disabled bool `json:"disabled,omitempty,omitzero"` + Config WorkflowNodeConfig `json:"config,omitempty,omitzero"` } type WorkflowNodeConfig map[string]any +func (c WorkflowNodeConfig) AsDelay() WorkflowNodeConfigForDelay { + return WorkflowNodeConfigForDelay{ + Wait: xmaps.GetInt32(c, "wait"), + } +} + +func (c WorkflowNodeConfig) AsBranchBlock() WorkflowNodeConfigForBranchBlock { + expression := c["expression"] + if expression == nil { + return WorkflowNodeConfigForBranchBlock{} + } + + exprRaw, _ := json.Marshal(expression) + expr, err := expr.UnmarshalExpr([]byte(exprRaw)) + if err != nil { + return WorkflowNodeConfigForBranchBlock{} + } + + return WorkflowNodeConfigForBranchBlock{ + Expression: expr, + } +} + func (c WorkflowNodeConfig) AsBizApply() WorkflowNodeConfigForBizApply { return WorkflowNodeConfigForBizApply{ Domains: xmaps.GetString(c, "domains"), @@ -169,21 +194,12 @@ func (c WorkflowNodeConfig) AsBizNotify() WorkflowNodeConfigForBizNotify { } } -func (c WorkflowNodeConfig) AsBranchBlock() WorkflowNodeConfigForBranchBlock { - expression := c["expression"] - if expression == nil { - return WorkflowNodeConfigForBranchBlock{} - } +type WorkflowNodeConfigForDelay struct { + Wait int32 `json:"wait"` // 等待时间 +} - exprRaw, _ := json.Marshal(expression) - expr, err := expr.UnmarshalExpr([]byte(exprRaw)) - if err != nil { - return WorkflowNodeConfigForBranchBlock{} - } - - return WorkflowNodeConfigForBranchBlock{ - Expression: expr, - } +type WorkflowNodeConfigForBranchBlock struct { + Expression expr.Expr `json:"expression"` // 条件表达式 } type WorkflowNodeConfigForBizApply struct { @@ -236,7 +252,3 @@ type WorkflowNodeConfigForBizNotify struct { Message string `json:"message"` // 通知内容 SkipOnAllPrevSkipped bool `json:"skipOnAllPrevSkipped"` // 前序节点均已跳过时是否跳过 } - -type WorkflowNodeConfigForBranchBlock struct { - Expression expr.Expr `json:"expression"` // 条件表达式 -} diff --git a/internal/repository/certificate.go b/internal/repository/certificate.go index a8152ab23..16d5d95b2 100644 --- a/internal/repository/certificate.go +++ b/internal/repository/certificate.go @@ -18,7 +18,7 @@ func NewCertificateRepository() *CertificateRepository { return &CertificateRepository{} } -func (r *CertificateRepository) ListExpireSoon(ctx context.Context) ([]*domain.Certificate, error) { +func (r *CertificateRepository) ListExpiringSoon(ctx context.Context) ([]*domain.Certificate, error) { records, err := app.GetApp().FindAllRecords( domain.CollectionNameCertificate, dbx.NewExp("validityNotAfter>DATETIME('now')"), diff --git a/internal/repository/statistics.go b/internal/repository/statistics.go index e43aeaa60..0343bb336 100644 --- a/internal/repository/statistics.go +++ b/internal/repository/statistics.go @@ -28,15 +28,15 @@ func (r *StatisticsRepository) Get(ctx context.Context) (*domain.Statistics, err rs.CertificateTotal = certTotal.Total // 即将过期证书 - certExpireSoonTotal := struct { + certExpiringSoonTotal := struct { Total int `db:"total"` }{} if err := app.GetDB(). NewQuery("SELECT COUNT(*) AS total FROM certificate WHERE validityNotAfter > DATETIME('now') and validityNotAfter < DATETIME('now', '+20 days') AND deleted = ''"). - One(&certExpireSoonTotal); err != nil { + One(&certExpiringSoonTotal); err != nil { return nil, err } - rs.CertificateExpireSoon = certExpireSoonTotal.Total + rs.CertificateExpiringSoon = certExpiringSoonTotal.Total // 已过期证书 certExpiredTotal := struct { diff --git a/internal/rest/handlers/workflow.go b/internal/rest/handlers/workflow.go index 3de0a5544..ff3df00c9 100644 --- a/internal/rest/handlers/workflow.go +++ b/internal/rest/handlers/workflow.go @@ -2,10 +2,12 @@ package handlers import ( "context" + "errors" "github.com/pocketbase/pocketbase/core" "github.com/pocketbase/pocketbase/tools/router" + "github.com/certimate-go/certimate/internal/domain" "github.com/certimate-go/certimate/internal/domain/dtos" "github.com/certimate-go/certimate/internal/rest/resp" ) @@ -36,6 +38,9 @@ func (handler *WorkflowHandler) run(e *core.RequestEvent) error { if err := e.BindBody(req); err != nil { return resp.Err(e, err) } + if req.RunTrigger != domain.WorkflowTriggerTypeManual { + return resp.Err(e, errors.New("invalid parameters: the value of 'trigger' must be 'manual'")) + } res, err := handler.service.StartRun(e.Request.Context(), req) if err != nil { diff --git a/internal/workflow/dispatcher/dispatcher.go b/internal/workflow/dispatcher/dispatcher.go index 806c2e9b0..8cf598dcc 100644 --- a/internal/workflow/dispatcher/dispatcher.go +++ b/internal/workflow/dispatcher/dispatcher.go @@ -232,6 +232,10 @@ func (wd *workflowDispatcher) tryExecuteAsync(task *taskInfo) { return nil }) we.OnNodeError(func(ctx context.Context, node *engine.Node, err error) error { + if errors.Is(err, engine.ErrTerminated) || errors.Is(err, engine.ErrBlocksException) { + return nil + } + log := domain.WorkflowLog{} log.WorkflowId = task.WorkflowId log.RunId = task.RunId diff --git a/internal/workflow/engine/engine.go b/internal/workflow/engine/engine.go index fa41f93bc..c7a875ab3 100644 --- a/internal/workflow/engine/engine.go +++ b/internal/workflow/engine/engine.go @@ -62,7 +62,7 @@ func (we *workflowEngine) Invoke(ctx context.Context, workflowId string, runId s SetInputsManager(newInOutManager()). SetContext(ctx) if err := we.executeBlocks(wfCtx, runGraph.Nodes); err != nil { - if !errors.Is(err, errInterrupted) { + if !errors.Is(err, ErrTerminated) { we.fireOnErrorHooks(ctx, err) return err } @@ -135,7 +135,7 @@ func (we *workflowEngine) executeNode(wfCtx *WorkflowContext, node *Node) error execCtx := newNodeExecutionContext(wfCtx, node) execRes, err := executor.Execute(execCtx) - if err != nil { + if err != nil && !errors.Is(err, ErrTerminated) { we.fireOnNodeErrorHooks(wfCtx.ctx, node, err) return err } @@ -179,11 +179,15 @@ func (we *workflowEngine) executeNode(wfCtx *WorkflowContext, node *Node) error } } - if execRes.Interrupted { - return errInterrupted + if execRes.Terminated { + return ErrTerminated } } + if err != nil && errors.Is(err, ErrTerminated) { + return err + } + return nil } @@ -195,6 +199,11 @@ func (we *workflowEngine) executeBlocks(wfCtx *WorkflowContext, blocks []*Node) default: } + // 节点已禁用,直接跳过执行 + if node.Data.Disabled { + continue + } + err := we.executeNode(wfCtx, node) if err != nil { return err @@ -282,6 +291,7 @@ func NewWorkflowEngine() WorkflowEngine { } engine.executors[NodeTypeStart] = newStartNodeExecutor() engine.executors[NodeTypeEnd] = newEndNodeExecutor() + engine.executors[NodeTypeDelay] = newDelayNodeExecutor() engine.executors[NodeTypeCondition] = newConditionNodeExecutor() engine.executors[NodeTypeBranchBlock] = newBranchBlockNodeExecutor() engine.executors[NodeTypeTryCatch] = newTryCatchNodeExecutor() diff --git a/internal/workflow/engine/errors.go b/internal/workflow/engine/errors.go index 8b83d52dd..e05a39966 100644 --- a/internal/workflow/engine/errors.go +++ b/internal/workflow/engine/errors.go @@ -4,4 +4,9 @@ import ( "errors" ) -var errInterrupted = errors.New("workflow engine: interrupted, may be ended") +var ( + // 表示工作流引擎执行被中断,可能已结束 + ErrTerminated = errors.New("workflow engine: execution was terminated") + // 表示工作流引擎在执行子节点时发生异常 + ErrBlocksException = errors.New("workflow engine: error occurred when executing blocks") +) diff --git a/internal/workflow/engine/executor.go b/internal/workflow/engine/executor.go index a55182bbf..bbd9ae4a9 100644 --- a/internal/workflow/engine/executor.go +++ b/internal/workflow/engine/executor.go @@ -69,7 +69,7 @@ func newNodeExecutionContext(wfCtx *WorkflowContext, node *Node) *NodeExecutionC type NodeExecutionResult struct { node *Node - Interrupted bool // 是否中断执行(通常由 End 节点主动触发) + Terminated bool // 是否终止执行(通常由 End 节点主动触发) variablesMtx sync.Mutex Variables []VariableState diff --git a/internal/workflow/engine/executor_condition.go b/internal/workflow/engine/executor_condition.go index 32bff15b1..73bcaf3c6 100644 --- a/internal/workflow/engine/executor_condition.go +++ b/internal/workflow/engine/executor_condition.go @@ -33,7 +33,7 @@ func (ne *conditionNodeExecutor) Execute(execCtx *NodeExecutionContext) (*NodeEx err := engine.executeNode(execCtx.Clone(), node) if err != nil { - if errors.Is(err, errInterrupted) { + if errors.Is(err, ErrTerminated) { return execRes, err } errs = append(errs, err) @@ -41,7 +41,7 @@ func (ne *conditionNodeExecutor) Execute(execCtx *NodeExecutionContext) (*NodeEx } if len(errs) > 0 { - return execRes, fmt.Errorf("error occurred when executing child nodes: %w", errors.Join(errs...)) + return execRes, fmt.Errorf("%w: %w", ErrBlocksException, errors.Join(errs...)) } return execRes, nil @@ -92,7 +92,7 @@ func (ne *branchBlockNodeExecutor) Execute(execCtx *NodeExecutionContext) (*Node panic("impossible!") } else { if err := engine.executeBlocks(execCtx.Clone(), execCtx.Node.Blocks); err != nil { - return execRes, err + return execRes, fmt.Errorf("%w: %w", ErrBlocksException, err) } } diff --git a/internal/workflow/engine/executor_delay.go b/internal/workflow/engine/executor_delay.go new file mode 100644 index 000000000..b3f32b71b --- /dev/null +++ b/internal/workflow/engine/executor_delay.go @@ -0,0 +1,28 @@ +package engine + +import ( + "fmt" + "log/slog" + "time" +) + +type delayNodeExecutor struct { + nodeExecutor +} + +func (ne *delayNodeExecutor) Execute(execCtx *NodeExecutionContext) (*NodeExecutionResult, error) { + execRes := newNodeExecutionResult(execCtx.Node) + + nodeCfg := execCtx.Node.Data.Config.AsDelay() + ne.logger.Info(fmt.Sprintf("delay for %d second(s) before continuing ...", nodeCfg.Wait)) + + time.Sleep(time.Duration(nodeCfg.Wait) * time.Second) + + return execRes, nil +} + +func newDelayNodeExecutor() NodeExecutor { + return &delayNodeExecutor{ + nodeExecutor: nodeExecutor{logger: slog.Default()}, + } +} diff --git a/internal/workflow/engine/executor_end.go b/internal/workflow/engine/executor_end.go index 1a9a02fb7..6d674d3ac 100644 --- a/internal/workflow/engine/executor_end.go +++ b/internal/workflow/engine/executor_end.go @@ -8,9 +8,11 @@ type endNodeExecutor struct { nodeExecutor } -func (e *endNodeExecutor) Execute(execCtx *NodeExecutionContext) (*NodeExecutionResult, error) { +func (ne *endNodeExecutor) Execute(execCtx *NodeExecutionContext) (*NodeExecutionResult, error) { execRes := newNodeExecutionResult(execCtx.Node) - execRes.Interrupted = true + execRes.Terminated = true + + ne.logger.Info("the is ending") return execRes, nil } diff --git a/internal/workflow/engine/executor_start.go b/internal/workflow/engine/executor_start.go index ab0ada84e..c4f93c1d4 100644 --- a/internal/workflow/engine/executor_start.go +++ b/internal/workflow/engine/executor_start.go @@ -8,9 +8,11 @@ type startNodeExecutor struct { nodeExecutor } -func (e *startNodeExecutor) Execute(execCtx *NodeExecutionContext) (*NodeExecutionResult, error) { +func (ne *startNodeExecutor) Execute(execCtx *NodeExecutionContext) (*NodeExecutionResult, error) { execRes := newNodeExecutionResult(execCtx.Node) + ne.logger.Info("") + return execRes, nil } diff --git a/internal/workflow/engine/executor_trycatch.go b/internal/workflow/engine/executor_trycatch.go index 28d8844ec..52eb12cec 100644 --- a/internal/workflow/engine/executor_trycatch.go +++ b/internal/workflow/engine/executor_trycatch.go @@ -33,7 +33,7 @@ func (ne *tryCatchNodeExecutor) Execute(execCtx *NodeExecutionContext) (*NodeExe err := engine.executeNode(execCtx.Clone(), node) if err != nil { - if errors.Is(err, errInterrupted) { + if errors.Is(err, ErrTerminated) { return execRes, err } tryErrs = append(tryErrs, err) @@ -52,18 +52,17 @@ func (ne *tryCatchNodeExecutor) Execute(execCtx *NodeExecutionContext) (*NodeExe err := engine.executeNode(execCtx.Clone(), node) if err != nil { - if errors.Is(err, errInterrupted) { + if errors.Is(err, ErrTerminated) { return execRes, err } catchErrs = append(catchErrs, err) } } - if len(catchErrs) > 0 { - return execRes, fmt.Errorf("error occurred when executing child nodes: %w", errors.Join(append(tryErrs, catchErrs...)...)) - } - - return execRes, fmt.Errorf("error occurred when executing child nodes: %w", errors.Join(tryErrs...)) + errs := make([]error, 0) + errs = append(errs, tryErrs...) + errs = append(errs, catchErrs...) + return execRes, fmt.Errorf("%w: %w", ErrBlocksException, errors.Join(errs...)) } return execRes, nil @@ -90,7 +89,7 @@ func (ne *tryBlockNodeExecutor) Execute(execCtx *NodeExecutionContext) (*NodeExe execRes := newNodeExecutionResult(execCtx.Node) if err := engine.executeBlocks(execCtx.Clone(), execCtx.Node.Blocks); err != nil { - return execRes, err + return execRes, fmt.Errorf("%w: %w", ErrBlocksException, err) } return execRes, nil @@ -117,7 +116,7 @@ func (ne *catchBlockNodeExecutor) Execute(execCtx *NodeExecutionContext) (*NodeE } if err := engine.executeBlocks(execCtx.Clone(), execCtx.Node.Blocks); err != nil { - return execRes, err + return execRes, fmt.Errorf("%w: %w", ErrBlocksException, err) } return execRes, nil diff --git a/internal/workflow/engine/models.go b/internal/workflow/engine/models.go index 079b676c5..e8a32273a 100644 --- a/internal/workflow/engine/models.go +++ b/internal/workflow/engine/models.go @@ -16,6 +16,7 @@ const ( NodeTypeTryCatch = domain.WorkflowNodeTypeTryCatch NodeTypeTryBlock = domain.WorkflowNodeTypeTryBlock NodeTypeCatchBlock = domain.WorkflowNodeTypeCatchBlock + NodeTypeDelay = domain.WorkflowNodeTypeDelay NodeTypeBizApply = domain.WorkflowNodeTypeBizApply NodeTypeBizUpload = domain.WorkflowNodeTypeBizUpload NodeTypeBizMonitor = domain.WorkflowNodeTypeBizMonitor diff --git a/internal/workflow/engine/state.go b/internal/workflow/engine/state.go index ee4e92816..5b3b282e7 100644 --- a/internal/workflow/engine/state.go +++ b/internal/workflow/engine/state.go @@ -273,7 +273,6 @@ func newInOutManager() InOutManager { const ( stateIOTypeRef = "ref" - stateIOType = "recordRef" ) const ( diff --git a/internal/workflow/service.go b/internal/workflow/service.go index 02260cae7..96cad7a05 100644 --- a/internal/workflow/service.go +++ b/internal/workflow/service.go @@ -81,7 +81,7 @@ func (s *WorkflowService) StartRun(ctx context.Context, req *dtos.WorkflowStartR return nil, err } - if workflow.LastRunStatus == domain.WorkflowRunStatusTypePending || workflow.LastRunStatus == domain.WorkflowRunStatusTypeProcessing { + if req.RunTrigger == domain.WorkflowTriggerTypeManual && (workflow.LastRunStatus == domain.WorkflowRunStatusTypePending || workflow.LastRunStatus == domain.WorkflowRunStatusTypeProcessing) { return nil, errors.New("workflow is already pending or processing") } else if workflow.GraphContent == nil { return nil, errors.New("workflow graph content is empty") diff --git a/migrations/1755187200_cm0.4.0_migrate.go b/migrations/1755187200_cm0.4.0_migrate.go index 0a4e6f0e1..9d85755a8 100644 --- a/migrations/1755187200_cm0.4.0_migrate.go +++ b/migrations/1755187200_cm0.4.0_migrate.go @@ -37,12 +37,17 @@ func init() { // update collection `access` // - modify field `config` schema: rename property `defaultReceiver` to `receiver` + // - modify field `reserve` candidates // - delete records: 'local' { collection, err := app.FindCollectionByNameOrId("4yzbv8urny5ja1e") if err != nil { return err } else if collection != nil { + if _, err := app.DB().NewQuery("UPDATE access SET reserve = 'notif' WHERE reserve = 'notification'").Execute(); err != nil { + return err + } + if _, err := app.DB().NewQuery("DELETE FROM access WHERE provider = 'local'").Execute(); err != nil { return err } diff --git a/ui/package-lock.json b/ui/package-lock.json index ea3764c85..69c285c91 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -11,20 +11,20 @@ "@codemirror/lang-yaml": "^6.1.2", "@codemirror/language": "^6.11.3", "@codemirror/legacy-modes": "^6.5.1", - "@flowgram.ai/document": "^0.4.0", - "@flowgram.ai/fixed-layout-editor": "^0.4.0", - "@flowgram.ai/minimap-plugin": "^0.4.0", + "@flowgram.ai/document": "0.4.3", + "@flowgram.ai/fixed-layout-editor": "0.4.3", + "@flowgram.ai/minimap-plugin": "0.4.3", "@tabler/icons-react": "^3.34.1", "@uiw/codemirror-extensions-basic-setup": "^4.25.1", "@uiw/codemirror-theme-vscode": "^4.25.1", "@uiw/react-codemirror": "^4.25.1", - "ahooks": "^3.9.0", - "antd": "^5.27.0", + "ahooks": "^3.9.4", + "antd": "^5.27.1", "antd-zod": "^7.0.0", "clsx": "^2.1.1", "cron-parser": "^5.3.0", "file-saver": "^2.0.5", - "i18next": "^25.3.6", + "i18next": "^25.4.2", "i18next-browser-languagedetector": "^8.2.0", "immer": "^10.1.1", "nanoid": "^5.1.5", @@ -33,14 +33,15 @@ "react": "^18.3.1", "react-copy-to-clipboard": "^5.1.0", "react-dom": "^18.3.1", - "react-i18next": "^15.6.1", - "react-router-dom": "^7.8.1", + "react-i18next": "^15.7.2", + "react-router-dom": "^7.8.2", "tailwind-merge": "^3.3.1", - "zod": "^4.0.17", - "zustand": "^5.0.7" + "yaml": "^2.8.1", + "zod": "^4.1.1", + "zustand": "^5.0.8" }, "devDependencies": { - "@eslint/js": "^9.33.0", + "@eslint/js": "^9.34.0", "@tailwindcss/postcss": "^4.1.12", "@tailwindcss/vite": "^4.1.12", "@types/file-saver": "^2.0.7", @@ -51,10 +52,10 @@ "@types/react-dom": "^18.3.7", "@vitejs/plugin-legacy": "^6.1.1", "@vitejs/plugin-react": "^4.7.0", - "eslint": "^9.33.0", + "eslint": "^9.34.0", "eslint-config-prettier": "^10.1.8", "eslint-import-resolver-typescript": "^4.4.4", - "eslint-plugin-better-tailwindcss": "^3.7.4", + "eslint-plugin-better-tailwindcss": "^3.7.5", "eslint-plugin-import": "^2.32.0", "eslint-plugin-prettier": "^5.5.4", "eslint-plugin-react-hooks": "^5.2.0", @@ -63,7 +64,7 @@ "prettier": "^3.6.2", "tailwindcss": "^4.1.12", "typescript": "^5.8.3", - "typescript-eslint": "^8.39.1", + "typescript-eslint": "^8.40.0", "vite": "^6.3.5" } }, @@ -2374,9 +2375,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.33.0", - "resolved": "https://registry.npmmirror.com/@eslint/js/-/js-9.33.0.tgz", - "integrity": "sha512-5K1/mKhWaMfreBGJTwval43JJmkip0RmM+3+IuqupeSKNC/Th2Kc7ucaq5ovTSra/OOKB9c58CGSz3QMVbWt0A==", + "version": "9.34.0", + "resolved": "https://registry.npmmirror.com/@eslint/js/-/js-9.34.0.tgz", + "integrity": "sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2408,12 +2409,12 @@ } }, "node_modules/@flowgram.ai/background-plugin": { - "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/background-plugin/-/background-plugin-0.4.0.tgz", - "integrity": "sha512-aHyIZ0O87L2CLrEUZQf3MyWDyHqpjchg9CUpZETUFYIeAXGP0Uk0/31C3slLPKdsYFGuW5y54E0ighII0tbTBQ==", + "version": "0.4.3", + "resolved": "https://registry.npmmirror.com/@flowgram.ai/background-plugin/-/background-plugin-0.4.3.tgz", + "integrity": "sha512-evXup2fikpqMfzi8WUfRwadahQjauLtcO2MRSy7aqgkjx4cd5nE8Y2FWLZNEi1EKOz1PeDigVZqsWXKoB+icwg==", "dependencies": { - "@flowgram.ai/core": "0.4.0", - "@flowgram.ai/utils": "0.4.0", + "@flowgram.ai/core": "0.4.3", + "@flowgram.ai/utils": "0.4.3", "inversify": "^6.0.1", "reflect-metadata": "~0.2.2" }, @@ -2423,11 +2424,11 @@ } }, "node_modules/@flowgram.ai/command": { - "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/command/-/command-0.4.0.tgz", - "integrity": "sha512-sRro1cAG84qIvx04DzN79Wv1Ldv2CtUEKL1TjG6URQ0wYPEcF89mZF5vUG3U4sU9bXBYvfa9hSsJpSOofDaF8Q==", + "version": "0.4.3", + "resolved": "https://registry.npmmirror.com/@flowgram.ai/command/-/command-0.4.3.tgz", + "integrity": "sha512-Wua7WFd6Kdd3Mu5En6WXeokj16PWBmIKBnxz4wLIxtFl8AQekLj0Cx4hliLmia1yJI+M9RsCSqRPnbIcI05qNw==", "dependencies": { - "@flowgram.ai/utils": "0.4.0", + "@flowgram.ai/utils": "0.4.3", "inversify": "^6.0.1", "reflect-metadata": "~0.2.2" }, @@ -2437,12 +2438,12 @@ } }, "node_modules/@flowgram.ai/core": { - "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/core/-/core-0.4.0.tgz", - "integrity": "sha512-/dgEGYJt/hQNYBViRXdv8zoUorm8vXhH3n/1p1W9xdM076mkTjIfesJHEFU+LLy4/ZZVH+G200O76XqGGK5zog==", + "version": "0.4.3", + "resolved": "https://registry.npmmirror.com/@flowgram.ai/core/-/core-0.4.3.tgz", + "integrity": "sha512-ttkg9lk4PIH9cUpoPqJYvlCo4uyRja3484B+Ml6/P6wPM33cpvbbHVC6LqgLhtg760fLqhTHRPNw5qTMk3bk7w==", "dependencies": { - "@flowgram.ai/command": "0.4.0", - "@flowgram.ai/utils": "0.4.0", + "@flowgram.ai/command": "0.4.3", + "@flowgram.ai/utils": "0.4.3", "@phosphor/messaging": "^1.3.0", "@tweenjs/tween.js": "^18", "clsx": "^1.1.1", @@ -2482,12 +2483,12 @@ } }, "node_modules/@flowgram.ai/document": { - "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/document/-/document-0.4.0.tgz", - "integrity": "sha512-LXy3gTGusK+e4qJxRl1DhfwGS6p5rQnRJq/XFXhHMnEnE/fwG6ZSJOsFDcVnNdU8Z5pwW7393FwNfyqIZoabIA==", + "version": "0.4.3", + "resolved": "https://registry.npmmirror.com/@flowgram.ai/document/-/document-0.4.3.tgz", + "integrity": "sha512-vvnm+FHOt9b36vQJGnFa6US3oJTvVUrK5HzYG4ujb7NwEzBWb80+ELK/m0U8VB+aFPPwlFZBgsBIrMAgq/xrgg==", "dependencies": { - "@flowgram.ai/core": "0.4.0", - "@flowgram.ai/utils": "0.4.0", + "@flowgram.ai/core": "0.4.3", + "@flowgram.ai/utils": "0.4.3", "inversify": "^6.0.1", "lodash": "^4.17.21", "nanoid": "^4.0.2", @@ -2512,29 +2513,29 @@ } }, "node_modules/@flowgram.ai/editor": { - "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/editor/-/editor-0.4.0.tgz", - "integrity": "sha512-/ATStbs+jtwMErOv/7XMbsLs6yjvb8r9t8xcwfhOrqYGGEgWpaIX1jadifcIyr1T6V1yjZdiWTUIjZvVqyPm+A==", + "version": "0.4.3", + "resolved": "https://registry.npmmirror.com/@flowgram.ai/editor/-/editor-0.4.3.tgz", + "integrity": "sha512-LJ9Z2Mk8xuFdHnSHw/pQ7oPYEqMmKArQld3rb7C6o6RJjBxTKkwnm542wmVBGL24Nv50M9AbwDQaUPKJQkgqpA==", "dependencies": { - "@flowgram.ai/background-plugin": "0.4.0", - "@flowgram.ai/core": "0.4.0", - "@flowgram.ai/document": "0.4.0", - "@flowgram.ai/form": "0.4.0", - "@flowgram.ai/form-core": "0.4.0", - "@flowgram.ai/group-plugin": "0.4.0", - "@flowgram.ai/history": "0.4.0", - "@flowgram.ai/history-node-plugin": "0.4.0", - "@flowgram.ai/i18n-plugin": "0.4.0", - "@flowgram.ai/materials-plugin": "0.4.0", - "@flowgram.ai/node": "0.4.0", - "@flowgram.ai/node-core-plugin": "0.4.0", - "@flowgram.ai/node-variable-plugin": "0.4.0", - "@flowgram.ai/playground-react": "0.4.0", - "@flowgram.ai/redux-devtool-plugin": "0.4.0", - "@flowgram.ai/renderer": "0.4.0", - "@flowgram.ai/shortcuts-plugin": "0.4.0", - "@flowgram.ai/utils": "0.4.0", - "@flowgram.ai/variable-plugin": "0.4.0", + "@flowgram.ai/background-plugin": "0.4.3", + "@flowgram.ai/core": "0.4.3", + "@flowgram.ai/document": "0.4.3", + "@flowgram.ai/form": "0.4.3", + "@flowgram.ai/form-core": "0.4.3", + "@flowgram.ai/group-plugin": "0.4.3", + "@flowgram.ai/history": "0.4.3", + "@flowgram.ai/history-node-plugin": "0.4.3", + "@flowgram.ai/i18n-plugin": "0.4.3", + "@flowgram.ai/materials-plugin": "0.4.3", + "@flowgram.ai/node": "0.4.3", + "@flowgram.ai/node-core-plugin": "0.4.3", + "@flowgram.ai/node-variable-plugin": "0.4.3", + "@flowgram.ai/playground-react": "0.4.3", + "@flowgram.ai/redux-devtool-plugin": "0.4.3", + "@flowgram.ai/renderer": "0.4.3", + "@flowgram.ai/shortcuts-plugin": "0.4.3", + "@flowgram.ai/utils": "0.4.3", + "@flowgram.ai/variable-plugin": "0.4.3", "inversify": "^6.0.1", "reflect-metadata": "~0.2.2" }, @@ -2544,13 +2545,13 @@ } }, "node_modules/@flowgram.ai/fixed-drag-plugin": { - "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/fixed-drag-plugin/-/fixed-drag-plugin-0.4.0.tgz", - "integrity": "sha512-Wl1CPlY4vTDFU5FBdyVcSWh+WpKTSk21PztErmqKseFgkSJAFDfKFyNIy/Fq0WzpIJoNLi3Zf6FGCySWk8+d7g==", + "version": "0.4.3", + "resolved": "https://registry.npmmirror.com/@flowgram.ai/fixed-drag-plugin/-/fixed-drag-plugin-0.4.3.tgz", + "integrity": "sha512-uoIrbAatETrTI1BIhtrQGSpIIvuqsa8qax6WGoOspUbATqZxSwoMTrJfEkOOqBwdAGsVBdjm68sQcG7U40WBEA==", "dependencies": { - "@flowgram.ai/core": "0.4.0", - "@flowgram.ai/document": "0.4.0", - "@flowgram.ai/renderer": "0.4.0", + "@flowgram.ai/core": "0.4.3", + "@flowgram.ai/document": "0.4.3", + "@flowgram.ai/renderer": "0.4.3", "inversify": "^6.0.1", "reflect-metadata": "~0.2.2" }, @@ -2560,29 +2561,29 @@ } }, "node_modules/@flowgram.ai/fixed-history-plugin": { - "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/fixed-history-plugin/-/fixed-history-plugin-0.4.0.tgz", - "integrity": "sha512-1QMe3A28loPHOEurOW+vhSXffVJ1D4uZHp/g46IlOCxRY4WHvL4np9PegAd65rvG1D+Wud237k+AIJAM8/LbvQ==", + "version": "0.4.3", + "resolved": "https://registry.npmmirror.com/@flowgram.ai/fixed-history-plugin/-/fixed-history-plugin-0.4.3.tgz", + "integrity": "sha512-rCHwUGYyckan8D+G21e/m5aFJ7DaQW+kZAcciaxRG15OMTFxhk/uFz2AqLj6VnkW/D9uV3g4hIoGgbf4dy+sxg==", "dependencies": { - "@flowgram.ai/core": "0.4.0", - "@flowgram.ai/document": "0.4.0", - "@flowgram.ai/form-core": "0.4.0", - "@flowgram.ai/history": "0.4.0", - "@flowgram.ai/utils": "0.4.0", + "@flowgram.ai/core": "0.4.3", + "@flowgram.ai/document": "0.4.3", + "@flowgram.ai/form-core": "0.4.3", + "@flowgram.ai/history": "0.4.3", + "@flowgram.ai/utils": "0.4.3", "inversify": "^6.0.1", "lodash": "^4.17.21", "reflect-metadata": "~0.2.2" } }, "node_modules/@flowgram.ai/fixed-layout-core": { - "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/fixed-layout-core/-/fixed-layout-core-0.4.0.tgz", - "integrity": "sha512-sc6IQHlYIq6xpiQvEved8e1OUaIU+hkCUQPWRt8t6AvmCzahjLcHso34p7IdOoDT0bbXHWTUzLQk6bgRF+wyEQ==", + "version": "0.4.3", + "resolved": "https://registry.npmmirror.com/@flowgram.ai/fixed-layout-core/-/fixed-layout-core-0.4.3.tgz", + "integrity": "sha512-uT8di5eVKjv9cPcrye1c5hlczJ+sA3zf5PVkrvSHaq2o9837gVzoPUoASLPKYXB6ztUWsMe2/qzcWcQmvJibfQ==", "dependencies": { - "@flowgram.ai/core": "0.4.0", - "@flowgram.ai/document": "0.4.0", - "@flowgram.ai/renderer": "0.4.0", - "@flowgram.ai/utils": "0.4.0", + "@flowgram.ai/core": "0.4.3", + "@flowgram.ai/document": "0.4.3", + "@flowgram.ai/renderer": "0.4.3", + "@flowgram.ai/utils": "0.4.3", "inversify": "^6.0.1", "lodash": "^4.17.21", "reflect-metadata": "~0.2.2" @@ -2593,19 +2594,19 @@ } }, "node_modules/@flowgram.ai/fixed-layout-editor": { - "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/fixed-layout-editor/-/fixed-layout-editor-0.4.0.tgz", - "integrity": "sha512-sxq9JM0GwB4EVRP8B2f84gZXpUgFoswcVgMBt+CdxecZV5gJzURmKl6Xe6Fh3y+7tOoWEo0e5/mK4MElLSeYeA==", + "version": "0.4.3", + "resolved": "https://registry.npmmirror.com/@flowgram.ai/fixed-layout-editor/-/fixed-layout-editor-0.4.3.tgz", + "integrity": "sha512-L/8NqrCOdnln2oRImWgcWfblEI9GxzS+XuuYoULnkApWXk6l7OGAZiR3d+UACy7jGzhaFX5lcq8fzE2XuKhSpw==", "dependencies": { - "@flowgram.ai/core": "0.4.0", - "@flowgram.ai/editor": "0.4.0", - "@flowgram.ai/fixed-drag-plugin": "0.4.0", - "@flowgram.ai/fixed-history-plugin": "0.4.0", - "@flowgram.ai/fixed-layout-core": "0.4.0", - "@flowgram.ai/history": "0.4.0", - "@flowgram.ai/reactive": "0.4.0", - "@flowgram.ai/select-box-plugin": "0.4.0", - "@flowgram.ai/utils": "0.4.0", + "@flowgram.ai/core": "0.4.3", + "@flowgram.ai/editor": "0.4.3", + "@flowgram.ai/fixed-drag-plugin": "0.4.3", + "@flowgram.ai/fixed-history-plugin": "0.4.3", + "@flowgram.ai/fixed-layout-core": "0.4.3", + "@flowgram.ai/history": "0.4.3", + "@flowgram.ai/reactive": "0.4.3", + "@flowgram.ai/select-box-plugin": "0.4.3", + "@flowgram.ai/utils": "0.4.3", "inversify": "^6.0.1", "reflect-metadata": "~0.2.2" }, @@ -2615,12 +2616,12 @@ } }, "node_modules/@flowgram.ai/form": { - "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/form/-/form-0.4.0.tgz", - "integrity": "sha512-DU4n7RY4v+WYwPHd0IIFUS7c/kqWBF+/G7p4ocWOP/PR+SCo1vwNHDK9NHWYxXmQdt2JWrM9l55HKGHUiOPYdA==", + "version": "0.4.3", + "resolved": "https://registry.npmmirror.com/@flowgram.ai/form/-/form-0.4.3.tgz", + "integrity": "sha512-YYfG9DiWEDxseA4hFkzx2TKzo69uMmff3CxMXjrlVDYVTL0at24ZNBqV+/Hs6pee8FwMXK4257JgZax5zKDZ4A==", "dependencies": { - "@flowgram.ai/reactive": "0.4.0", - "@flowgram.ai/utils": "0.4.0", + "@flowgram.ai/reactive": "0.4.3", + "@flowgram.ai/utils": "0.4.3", "fast-equals": "^2.0.0", "lodash": "^4.17.21", "nanoid": "^4.0.2" @@ -2631,13 +2632,13 @@ } }, "node_modules/@flowgram.ai/form-core": { - "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/form-core/-/form-core-0.4.0.tgz", - "integrity": "sha512-xoS0T5PGkwtvQfs9Xf+7rLVmIZzOkeMBWHN+ERRUQMFRjquZnkEeBrkIB2ZBG0i/Uh0dq0Lq8b+vjsRFpemj+Q==", + "version": "0.4.3", + "resolved": "https://registry.npmmirror.com/@flowgram.ai/form-core/-/form-core-0.4.3.tgz", + "integrity": "sha512-FmPuWiY/0PSZJv3yZMs/377O5jcJP9M4kg5/ks63M1N1WnABsbJNyspp6mJbm7edvpiUiiqWIeywyCCtYW5rTw==", "dependencies": { - "@flowgram.ai/core": "0.4.0", - "@flowgram.ai/document": "0.4.0", - "@flowgram.ai/utils": "0.4.0", + "@flowgram.ai/core": "0.4.3", + "@flowgram.ai/document": "0.4.3", + "@flowgram.ai/utils": "0.4.3", "inversify": "^6.0.1", "lodash": "^4.17.21", "reflect-metadata": "~0.2.2" @@ -2665,16 +2666,16 @@ } }, "node_modules/@flowgram.ai/free-layout-core": { - "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/free-layout-core/-/free-layout-core-0.4.0.tgz", - "integrity": "sha512-wPa2lB32rHI6SS7BWHpE7OU6mk0hlpcpbW50d5oBekAMHu1ygOLH2oKEDaWAae2wJmdfQqMrTMWmBgXos5epLw==", + "version": "0.4.3", + "resolved": "https://registry.npmmirror.com/@flowgram.ai/free-layout-core/-/free-layout-core-0.4.3.tgz", + "integrity": "sha512-mYEQuxeeSvkbUZfHo/XIDjR7zSunX8MN1uTVG3lO0dDtxNRblzkhDLc/RV1YoqX2P+8ybwXNtQvFXjhS80GfiA==", "dependencies": { - "@flowgram.ai/core": "0.4.0", - "@flowgram.ai/document": "0.4.0", - "@flowgram.ai/form-core": "0.4.0", - "@flowgram.ai/node": "0.4.0", - "@flowgram.ai/reactive": "0.4.0", - "@flowgram.ai/utils": "0.4.0", + "@flowgram.ai/core": "0.4.3", + "@flowgram.ai/document": "0.4.3", + "@flowgram.ai/form-core": "0.4.3", + "@flowgram.ai/node": "0.4.3", + "@flowgram.ai/reactive": "0.4.3", + "@flowgram.ai/utils": "0.4.3", "inversify": "^6.0.1", "lodash-es": "^4.17.21", "nanoid": "^4.0.2", @@ -2703,14 +2704,14 @@ } }, "node_modules/@flowgram.ai/group-plugin": { - "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/group-plugin/-/group-plugin-0.4.0.tgz", - "integrity": "sha512-Sqcf4uTINRiQ/k9uBcI4WjAoIpHa3XH+M+LgUzRNYDTLN90iSk7YN3/7+hXkqTyg4cgQt+pyv8rG7HRneEm2jA==", + "version": "0.4.3", + "resolved": "https://registry.npmmirror.com/@flowgram.ai/group-plugin/-/group-plugin-0.4.3.tgz", + "integrity": "sha512-jPMr3fKbJBnozJ8PI36ouxJltR6EajstWCe4GXpvsxJjTa1flFfs7KEzDb/odrweO7LlcF6Wx7Ibhni5WRQ7+A==", "dependencies": { - "@flowgram.ai/core": "0.4.0", - "@flowgram.ai/document": "0.4.0", - "@flowgram.ai/renderer": "0.4.0", - "@flowgram.ai/utils": "0.4.0", + "@flowgram.ai/core": "0.4.3", + "@flowgram.ai/document": "0.4.3", + "@flowgram.ai/renderer": "0.4.3", + "@flowgram.ai/utils": "0.4.3", "inversify": "^6.0.1", "reflect-metadata": "~0.2.2" }, @@ -2720,12 +2721,12 @@ } }, "node_modules/@flowgram.ai/history": { - "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/history/-/history-0.4.0.tgz", - "integrity": "sha512-XTKkakg5X+64fnBCSSYSaY276z3F11DWNHcvSD7aKG+DcM4f219dFh4Uy78ceHlEVB1Z7IqWJexCtDVOtoIl1A==", + "version": "0.4.3", + "resolved": "https://registry.npmmirror.com/@flowgram.ai/history/-/history-0.4.3.tgz", + "integrity": "sha512-1ED2+FrulnonH5FXTpzg9C0iWSC5/nc6fP4+GJLe9WhcVNA6mlIG9D4Gtqjf0x/M+IQm0Vr6ewS73CTY4+KnjQ==", "dependencies": { - "@flowgram.ai/core": "0.4.0", - "@flowgram.ai/utils": "0.4.0", + "@flowgram.ai/core": "0.4.3", + "@flowgram.ai/utils": "0.4.3", "inversify": "^6.0.1", "lodash": "^4.17.21", "nanoid": "^4.0.2", @@ -2733,17 +2734,17 @@ } }, "node_modules/@flowgram.ai/history-node-plugin": { - "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/history-node-plugin/-/history-node-plugin-0.4.0.tgz", - "integrity": "sha512-rsFmJJGBDg2ZYLFD8SKYoQ1YpJ+apNGsqmc4krGefDJXW8QAFEm5KKBt5Yr+PvxNgz1QmGB+sguPHqnMoSPcCA==", + "version": "0.4.3", + "resolved": "https://registry.npmmirror.com/@flowgram.ai/history-node-plugin/-/history-node-plugin-0.4.3.tgz", + "integrity": "sha512-gSpdFbZeyvf39Cl4KEKwx9ft6E+0fW0V+kPSA+Wk0ruSdTBSWxpXCqYD2wUt74LkDuy5xcun5EhP0kQtaVIO4g==", "dependencies": { - "@flowgram.ai/core": "0.4.0", - "@flowgram.ai/document": "0.4.0", - "@flowgram.ai/form": "0.4.0", - "@flowgram.ai/form-core": "0.4.0", - "@flowgram.ai/history": "0.4.0", - "@flowgram.ai/node": "0.4.0", - "@flowgram.ai/utils": "0.4.0", + "@flowgram.ai/core": "0.4.3", + "@flowgram.ai/document": "0.4.3", + "@flowgram.ai/form": "0.4.3", + "@flowgram.ai/form-core": "0.4.3", + "@flowgram.ai/history": "0.4.3", + "@flowgram.ai/node": "0.4.3", + "@flowgram.ai/utils": "0.4.3", "inversify": "^6.0.1", "lodash": "^4.17.21", "reflect-metadata": "~0.2.2" @@ -2772,32 +2773,32 @@ } }, "node_modules/@flowgram.ai/i18n": { - "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/i18n/-/i18n-0.4.0.tgz", - "integrity": "sha512-TMSeRy9Ds5Ha5qorkICPRr1hGEiGPx7UwEXrR4JF7bYsSbMAGZ74BXdHt8dxsaFLgPamtNAvvH6ifJP/6V+wLg==", + "version": "0.4.3", + "resolved": "https://registry.npmmirror.com/@flowgram.ai/i18n/-/i18n-0.4.3.tgz", + "integrity": "sha512-Dh69c29OI1QG7sRtVEpzKFFTIKSMDevt5SLg1o9eZGfqZQ+16zGaRnYeAz0ycnII4JWflORe7LZJtyS72wbI0A==", "dependencies": { - "@flowgram.ai/utils": "0.4.0", + "@flowgram.ai/utils": "0.4.3", "i18n-js": "^4.5.1" } }, "node_modules/@flowgram.ai/i18n-plugin": { - "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/i18n-plugin/-/i18n-plugin-0.4.0.tgz", - "integrity": "sha512-aeQt/c5LbsdL5OVsUQxVbUu40K0M1sUalnqrgY9iaGYrr0mYlXPGL0iXp44MBJPgxsbfLfo7HGbP7FEq3U8CbA==", + "version": "0.4.3", + "resolved": "https://registry.npmmirror.com/@flowgram.ai/i18n-plugin/-/i18n-plugin-0.4.3.tgz", + "integrity": "sha512-n41NdNxeixqYw1oT6Jl5PMFHGHE6mcLFctbWZ3UKiZ4769WnaqrhRfglyxp/bHCsiLHp3z2+xMgCtuQAfl1DCg==", "dependencies": { - "@flowgram.ai/core": "0.4.0", - "@flowgram.ai/i18n": "0.4.0" + "@flowgram.ai/core": "0.4.3", + "@flowgram.ai/i18n": "0.4.3" } }, "node_modules/@flowgram.ai/materials-plugin": { - "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/materials-plugin/-/materials-plugin-0.4.0.tgz", - "integrity": "sha512-TYkWIu/iZ2aQDfXQWdRxEvRE5DHQonMlB3t9YshdAvyrg7N5sCVTjrw+3mqgm5tX8NoCEAQ4YDDQ7lEY5+wjrA==", + "version": "0.4.3", + "resolved": "https://registry.npmmirror.com/@flowgram.ai/materials-plugin/-/materials-plugin-0.4.3.tgz", + "integrity": "sha512-+RgUAFxMxfNERJistMfMgqs+wwvHGdQwuFZU0JpoTiKTV8wnIR5HQ0/pak3EbZOfQRxhm7Akp8iGMHHTTNs/wA==", "dependencies": { - "@flowgram.ai/core": "0.4.0", - "@flowgram.ai/form-core": "0.4.0", - "@flowgram.ai/renderer": "0.4.0", - "@flowgram.ai/utils": "0.4.0", + "@flowgram.ai/core": "0.4.3", + "@flowgram.ai/form-core": "0.4.3", + "@flowgram.ai/renderer": "0.4.3", + "@flowgram.ai/utils": "0.4.3", "inversify": "^6.0.1", "reflect-metadata": "~0.2.2" }, @@ -2808,14 +2809,14 @@ } }, "node_modules/@flowgram.ai/minimap-plugin": { - "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/minimap-plugin/-/minimap-plugin-0.4.0.tgz", - "integrity": "sha512-0icvzo0hWBQksLZO9Fs2F/wbRoox14Q3gHkIjaCsPIkLJi9YFSYxfQcmxdeq6Jm6p6mACiBrK7pfWKxcDl3ZoA==", + "version": "0.4.3", + "resolved": "https://registry.npmmirror.com/@flowgram.ai/minimap-plugin/-/minimap-plugin-0.4.3.tgz", + "integrity": "sha512-WVlzxQ+oNYGj7OV270C0SFRAQoTiYh7aV1dnCIDZj8NvKG/OGNXP6y28bD6atDSlIKK2EQ7deua/oIROXJIxcg==", "dependencies": { - "@flowgram.ai/core": "0.4.0", - "@flowgram.ai/document": "0.4.0", - "@flowgram.ai/renderer": "0.4.0", - "@flowgram.ai/utils": "0.4.0", + "@flowgram.ai/core": "0.4.3", + "@flowgram.ai/document": "0.4.3", + "@flowgram.ai/renderer": "0.4.3", + "@flowgram.ai/utils": "0.4.3", "inversify": "^6.0.1", "lodash": "^4.17.21", "reflect-metadata": "~0.2.2" @@ -2827,15 +2828,15 @@ } }, "node_modules/@flowgram.ai/node": { - "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/node/-/node-0.4.0.tgz", - "integrity": "sha512-y0GK95LKtZelLicyLO1kkYtpSij2qJVsewAJ4ASSqAKrB3Ukqx7Q5hM66p8nXGLcsE/0r2o2tmBiWf7Pk5u6lQ==", + "version": "0.4.3", + "resolved": "https://registry.npmmirror.com/@flowgram.ai/node/-/node-0.4.3.tgz", + "integrity": "sha512-B6ex6A9nhjf/Q1Vz6lsIFzToNaupPrFLZ6hxmwEfkGny+3DBmG/4Wvr/JKi3vdSRC0jwPM62FQe0mBrMSCG9qA==", "dependencies": { - "@flowgram.ai/core": "0.4.0", - "@flowgram.ai/document": "0.4.0", - "@flowgram.ai/form": "0.4.0", - "@flowgram.ai/form-core": "0.4.0", - "@flowgram.ai/utils": "0.4.0", + "@flowgram.ai/core": "0.4.3", + "@flowgram.ai/document": "0.4.3", + "@flowgram.ai/form": "0.4.3", + "@flowgram.ai/form-core": "0.4.3", + "@flowgram.ai/utils": "0.4.3", "inversify": "^6.0.1", "lodash": "^4.17.21", "nanoid": "^4.0.2", @@ -2847,16 +2848,16 @@ } }, "node_modules/@flowgram.ai/node-core-plugin": { - "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/node-core-plugin/-/node-core-plugin-0.4.0.tgz", - "integrity": "sha512-9HSrjvGQRu3k/IzmXz06XrerDuTZ8ZqDfMhdFXmV5eXm0aLhUH1SqDVcTDOT1d0lyoDjZKmBShgrBGG7ECDhMQ==", + "version": "0.4.3", + "resolved": "https://registry.npmmirror.com/@flowgram.ai/node-core-plugin/-/node-core-plugin-0.4.3.tgz", + "integrity": "sha512-ISvfuPnuBbFbG6NE2eTbLAQO8D37ck9sOyEDIOEyRf/41nO88HIFhXMyA2beAAZODXXUlaVnvUwSRC5TiWnb8g==", "dependencies": { - "@flowgram.ai/core": "0.4.0", - "@flowgram.ai/document": "0.4.0", - "@flowgram.ai/form-core": "0.4.0", - "@flowgram.ai/node": "0.4.0", - "@flowgram.ai/renderer": "0.4.0", - "@flowgram.ai/utils": "0.4.0", + "@flowgram.ai/core": "0.4.3", + "@flowgram.ai/document": "0.4.3", + "@flowgram.ai/form-core": "0.4.3", + "@flowgram.ai/node": "0.4.3", + "@flowgram.ai/renderer": "0.4.3", + "@flowgram.ai/utils": "0.4.3", "inversify": "^6.0.1", "reflect-metadata": "~0.2.2" }, @@ -2867,16 +2868,16 @@ } }, "node_modules/@flowgram.ai/node-variable-plugin": { - "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/node-variable-plugin/-/node-variable-plugin-0.4.0.tgz", - "integrity": "sha512-2Am/R0xRxhG4TDRgcTAMwp0yRI7SvK2vRgFMvEe6mjmnAZJooD19scyPkt7/TYlFmdCNGLasgFDhF7ORZ8qUtg==", + "version": "0.4.3", + "resolved": "https://registry.npmmirror.com/@flowgram.ai/node-variable-plugin/-/node-variable-plugin-0.4.3.tgz", + "integrity": "sha512-VYNex4a5NNULXGoiMOJMzu64eTjKJjx/krfsyKq53yngODNtezKbJ1nsJD8b9NT2haPW4R6xWY27Fy/Mji/oIg==", "dependencies": { - "@flowgram.ai/core": "0.4.0", - "@flowgram.ai/document": "0.4.0", - "@flowgram.ai/form-core": "0.4.0", - "@flowgram.ai/node": "0.4.0", - "@flowgram.ai/utils": "0.4.0", - "@flowgram.ai/variable-plugin": "0.4.0", + "@flowgram.ai/core": "0.4.3", + "@flowgram.ai/document": "0.4.3", + "@flowgram.ai/form-core": "0.4.3", + "@flowgram.ai/node": "0.4.3", + "@flowgram.ai/utils": "0.4.3", + "@flowgram.ai/variable-plugin": "0.4.3", "inversify": "^6.0.1", "lodash": "^4.17.21", "reflect-metadata": "~0.2.2" @@ -2905,14 +2906,14 @@ } }, "node_modules/@flowgram.ai/playground-react": { - "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/playground-react/-/playground-react-0.4.0.tgz", - "integrity": "sha512-8B6vfIRdPcfAj8WbYBeIC+PJS34QH44BF5Xfux21KqhcqYjyjn+S46KYo6WuGi4MMIx8MUheSivyKc4kKbhW+Q==", + "version": "0.4.3", + "resolved": "https://registry.npmmirror.com/@flowgram.ai/playground-react/-/playground-react-0.4.3.tgz", + "integrity": "sha512-qPbjegMfZAvtuI633dD46ZL0GoZD3573Hom4LnUF/Impa7Wvn290PSBr3M3oRZ3yorCX2UQKUhmgopkn2Tk2mg==", "dependencies": { - "@flowgram.ai/background-plugin": "0.4.0", - "@flowgram.ai/core": "0.4.0", - "@flowgram.ai/shortcuts-plugin": "0.4.0", - "@flowgram.ai/utils": "0.4.0", + "@flowgram.ai/background-plugin": "0.4.3", + "@flowgram.ai/core": "0.4.3", + "@flowgram.ai/shortcuts-plugin": "0.4.3", + "@flowgram.ai/utils": "0.4.3", "inversify": "^6.0.1", "reflect-metadata": "~0.2.2" }, @@ -2922,11 +2923,11 @@ } }, "node_modules/@flowgram.ai/reactive": { - "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/reactive/-/reactive-0.4.0.tgz", - "integrity": "sha512-wdMQCyEYS+hCHWo3zWEmUjJl1lJylf4oVbn/f6LTRTqZPSNqL02k1o5xVHo/L43GhbhRZzyK2/JCaGpowzF4Kg==", + "version": "0.4.3", + "resolved": "https://registry.npmmirror.com/@flowgram.ai/reactive/-/reactive-0.4.3.tgz", + "integrity": "sha512-1OUduNKzkHpQkRIkS0s58GXJ8HTj38wB2odcBjKnPSHovGCGTldHVz/AQmsqtKth4FpMRPMZOJ3sdtbGhY4mdQ==", "dependencies": { - "@flowgram.ai/utils": "0.4.0" + "@flowgram.ai/utils": "0.4.3" }, "peerDependencies": { "react": ">=16.8", @@ -2934,12 +2935,12 @@ } }, "node_modules/@flowgram.ai/redux-devtool-plugin": { - "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/redux-devtool-plugin/-/redux-devtool-plugin-0.4.0.tgz", - "integrity": "sha512-EDNpr6fLXT/OnoUkjanv2Cs0vzU93NLXtUMxYa1JWwm3mjXGZIiVeIve1FGfarMzJcnky3xv3CjhzZnLxd0rkg==", + "version": "0.4.3", + "resolved": "https://registry.npmmirror.com/@flowgram.ai/redux-devtool-plugin/-/redux-devtool-plugin-0.4.3.tgz", + "integrity": "sha512-K+fuKV1t3UTtJQx6sk7Z1LsWFhLQsLOR2zLz8msXtCis2AsIj6tEZYMT1YOli3PwKJosgcmZFW24qY8pwU9RDQ==", "dependencies": { - "@flowgram.ai/core": "0.4.0", - "@flowgram.ai/variable-core": "0.4.0", + "@flowgram.ai/core": "0.4.3", + "@flowgram.ai/variable-core": "0.4.3", "inversify": "^6.0.1", "reflect-metadata": "~0.2.2", "styled-components": "^5" @@ -2994,14 +2995,14 @@ } }, "node_modules/@flowgram.ai/renderer": { - "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/renderer/-/renderer-0.4.0.tgz", - "integrity": "sha512-Qhpsh6tE8x+9ZTo1/rrCakaPIHgKCcX/8QE1ovHxHH9gRsxknihPHXA6t1sKRE0vyXcS6ZT5MxJ2zoAAY/vYjA==", + "version": "0.4.3", + "resolved": "https://registry.npmmirror.com/@flowgram.ai/renderer/-/renderer-0.4.3.tgz", + "integrity": "sha512-xvPbSLGhL2EXBUc0fV0nME5+VzBTtYlykWkxB30tiURcN5e/tsTbomO4/sh3MmO+pGHzsFfJsVMSStdgW5BzCg==", "dependencies": { - "@flowgram.ai/core": "0.4.0", - "@flowgram.ai/document": "0.4.0", - "@flowgram.ai/i18n": "0.4.0", - "@flowgram.ai/utils": "0.4.0", + "@flowgram.ai/core": "0.4.3", + "@flowgram.ai/document": "0.4.3", + "@flowgram.ai/i18n": "0.4.3", + "@flowgram.ai/utils": "0.4.3", "inversify": "^6.0.1", "lodash": "^4.17.21", "reflect-metadata": "~0.2.2" @@ -3012,12 +3013,12 @@ } }, "node_modules/@flowgram.ai/select-box-plugin": { - "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/select-box-plugin/-/select-box-plugin-0.4.0.tgz", - "integrity": "sha512-p9donmLCrw1JSo1gLKetzBJvE6huIgXI+fVjkHzR4/WKACDXQ7IsILW63ZNprfHGvvhaLanKWhAoPTabEfsWEg==", + "version": "0.4.3", + "resolved": "https://registry.npmmirror.com/@flowgram.ai/select-box-plugin/-/select-box-plugin-0.4.3.tgz", + "integrity": "sha512-kfx2CXDq+1yNq835MieVXRh4sqO4lUtHLRhknDJqt5nscijqEONuWTbgczkxSznjHrh7xYZbK0FrE4Qm5yXv3A==", "dependencies": { - "@flowgram.ai/core": "0.4.0", - "@flowgram.ai/renderer": "0.4.0", + "@flowgram.ai/core": "0.4.3", + "@flowgram.ai/renderer": "0.4.3", "inversify": "^6.0.1", "reflect-metadata": "~0.2.2" }, @@ -3027,13 +3028,13 @@ } }, "node_modules/@flowgram.ai/shortcuts-plugin": { - "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/shortcuts-plugin/-/shortcuts-plugin-0.4.0.tgz", - "integrity": "sha512-paU8n4/ZW1qHK3SIJkFXdeD/gcwkQmcJaJOhTIsfRAmKftF3TJ/YBunld53vAaHnvZ7nxHzrcofg1oYxWpPCmQ==", + "version": "0.4.3", + "resolved": "https://registry.npmmirror.com/@flowgram.ai/shortcuts-plugin/-/shortcuts-plugin-0.4.3.tgz", + "integrity": "sha512-k4zCR0LsvyB/eUoRll9d8YkWcwzJ/8sGyNel+oNOdge3qohmNS466U6bs0LhVvyPZnm0ZHEwN9VVlT9A9ErYwg==", "dependencies": { - "@flowgram.ai/core": "0.4.0", - "@flowgram.ai/document": "0.4.0", - "@flowgram.ai/utils": "0.4.0", + "@flowgram.ai/core": "0.4.3", + "@flowgram.ai/document": "0.4.3", + "@flowgram.ai/utils": "0.4.3", "inversify": "^6.0.1", "reflect-metadata": "~0.2.2", "styled-components": "^5" @@ -3088,9 +3089,9 @@ } }, "node_modules/@flowgram.ai/utils": { - "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/utils/-/utils-0.4.0.tgz", - "integrity": "sha512-WqfXPJCD3wElHBMHfPd8PjKWAZ7WYDpC/l74oCNMttSWGCQbgnnNUTu+Iux6Ifv33wn75tFnh+XbUEnnHPv8HA==", + "version": "0.4.3", + "resolved": "https://registry.npmmirror.com/@flowgram.ai/utils/-/utils-0.4.3.tgz", + "integrity": "sha512-BOeB39OrkmhdRVXbnpt8d+sdq9GbY8yBiz7VZvuuV9u96OmU9FxX1kImSbT9JBkSpHHfzsTuXUq/5MRyENlNlw==", "dependencies": { "clsx": "^1.1.1", "inversify": "^6.0.1", @@ -3128,12 +3129,12 @@ } }, "node_modules/@flowgram.ai/variable-core": { - "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/variable-core/-/variable-core-0.4.0.tgz", - "integrity": "sha512-LcjZw1oTibottQpq/C5+FtYAJz/GVZg1nQ0p+f2v91LFqm7LyTO0sVISDqtUbt++OWeGWdolMhhpFXgVgOw26Q==", + "version": "0.4.3", + "resolved": "https://registry.npmmirror.com/@flowgram.ai/variable-core/-/variable-core-0.4.3.tgz", + "integrity": "sha512-6umtNMGgUVpu/kxWYhaX1ZAr/iasESSwi07XZvWoIbu/iyCRdFLUURuMkVXC8gnQoqbDMIUJCobLT8qO9t2eWg==", "dependencies": { - "@flowgram.ai/core": "0.4.0", - "@flowgram.ai/utils": "0.4.0", + "@flowgram.ai/core": "0.4.3", + "@flowgram.ai/utils": "0.4.3", "fast-equals": "^2.0.0", "inversify": "^6.0.1", "lodash": "^4.17.21", @@ -3164,15 +3165,15 @@ } }, "node_modules/@flowgram.ai/variable-layout": { - "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/variable-layout/-/variable-layout-0.4.0.tgz", - "integrity": "sha512-TIZvr7hzzt5B/m0YAHhtLQIZQ87tXbzqegQv82n0oTjOWMXd9Mis/4GWkoQC94BsPBoDPPzYG45WZ3QDIulBng==", + "version": "0.4.3", + "resolved": "https://registry.npmmirror.com/@flowgram.ai/variable-layout/-/variable-layout-0.4.3.tgz", + "integrity": "sha512-a6vG1B6WeVaUrI/7TbNW7//z3IwubHIxqa3KOGCIdE9W2VX5KU/Y/CjxglXgWQdBnjRlstzi6iS6yw7y6Ic/tw==", "dependencies": { - "@flowgram.ai/core": "0.4.0", - "@flowgram.ai/document": "0.4.0", - "@flowgram.ai/free-layout-core": "0.4.0", - "@flowgram.ai/utils": "0.4.0", - "@flowgram.ai/variable-core": "0.4.0", + "@flowgram.ai/core": "0.4.3", + "@flowgram.ai/document": "0.4.3", + "@flowgram.ai/free-layout-core": "0.4.3", + "@flowgram.ai/utils": "0.4.3", + "@flowgram.ai/variable-core": "0.4.3", "inversify": "^6.0.1", "reflect-metadata": "~0.2.2", "styled-components": "^5" @@ -3227,16 +3228,16 @@ } }, "node_modules/@flowgram.ai/variable-plugin": { - "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/variable-plugin/-/variable-plugin-0.4.0.tgz", - "integrity": "sha512-N46yICT7oGHjZ0T821xOs+hlwW9/pdUK7qNXbSLSZL7gX4HoXCREQSKWVtqfpfMkwTnOeIKQ2VudN7gzXrrVMw==", + "version": "0.4.3", + "resolved": "https://registry.npmmirror.com/@flowgram.ai/variable-plugin/-/variable-plugin-0.4.3.tgz", + "integrity": "sha512-VnfRs0ehgSn6D77+EA6snzkPtWqJMDrpWc5mbSrWw5HgZZ3qbij5NQBL89yME7mp5brakAVX/DPW+BTu5NVmCA==", "dependencies": { - "@flowgram.ai/core": "0.4.0", - "@flowgram.ai/document": "0.4.0", - "@flowgram.ai/free-layout-core": "0.4.0", - "@flowgram.ai/utils": "0.4.0", - "@flowgram.ai/variable-core": "0.4.0", - "@flowgram.ai/variable-layout": "0.4.0", + "@flowgram.ai/core": "0.4.3", + "@flowgram.ai/document": "0.4.3", + "@flowgram.ai/free-layout-core": "0.4.3", + "@flowgram.ai/utils": "0.4.3", + "@flowgram.ai/variable-core": "0.4.3", + "@flowgram.ai/variable-layout": "0.4.3", "inversify": "^6.0.1", "reflect-metadata": "~0.2.2", "styled-components": "^5" @@ -4420,16 +4421,16 @@ "peer": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.39.1", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.39.1.tgz", - "integrity": "sha512-yYegZ5n3Yr6eOcqgj2nJH8cH/ZZgF+l0YIdKILSDjYFRjgYQMgv/lRjV5Z7Up04b9VYUondt8EPMqg7kTWgJ2g==", + "version": "8.40.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.40.0.tgz", + "integrity": "sha512-w/EboPlBwnmOBtRbiOvzjD+wdiZdgFeo17lkltrtn7X37vagKKWJABvyfsJXTlHe6XBzugmYgd4A4nW+k8Mixw==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.39.1", - "@typescript-eslint/type-utils": "8.39.1", - "@typescript-eslint/utils": "8.39.1", - "@typescript-eslint/visitor-keys": "8.39.1", + "@typescript-eslint/scope-manager": "8.40.0", + "@typescript-eslint/type-utils": "8.40.0", + "@typescript-eslint/utils": "8.40.0", + "@typescript-eslint/visitor-keys": "8.40.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -4443,7 +4444,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.39.1", + "@typescript-eslint/parser": "^8.40.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } @@ -4458,15 +4459,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.39.1", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-8.39.1.tgz", - "integrity": "sha512-pUXGCuHnnKw6PyYq93lLRiZm3vjuslIy7tus1lIQTYVK9bL8XBgJnCWm8a0KcTtHC84Yya1Q6rtll+duSMj0dg==", + "version": "8.40.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-8.40.0.tgz", + "integrity": "sha512-jCNyAuXx8dr5KJMkecGmZ8KI61KBUhkCob+SD+C+I5+Y1FWI2Y3QmY4/cxMCC5WAsZqoEtEETVhUiUMIGCf6Bw==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.39.1", - "@typescript-eslint/types": "8.39.1", - "@typescript-eslint/typescript-estree": "8.39.1", - "@typescript-eslint/visitor-keys": "8.39.1", + "@typescript-eslint/scope-manager": "8.40.0", + "@typescript-eslint/types": "8.40.0", + "@typescript-eslint/typescript-estree": "8.40.0", + "@typescript-eslint/visitor-keys": "8.40.0", "debug": "^4.3.4" }, "engines": { @@ -4482,13 +4483,13 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.39.1", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/project-service/-/project-service-8.39.1.tgz", - "integrity": "sha512-8fZxek3ONTwBu9ptw5nCKqZOSkXshZB7uAxuFF0J/wTMkKydjXCzqqga7MlFMpHi9DoG4BadhmTkITBcg8Aybw==", + "version": "8.40.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/project-service/-/project-service-8.40.0.tgz", + "integrity": "sha512-/A89vz7Wf5DEXsGVvcGdYKbVM9F7DyFXj52lNYUDS1L9yJfqjW/fIp5PgMuEJL/KeqVTe2QSbXAGUZljDUpArw==", "dev": true, "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.39.1", - "@typescript-eslint/types": "^8.39.1", + "@typescript-eslint/tsconfig-utils": "^8.40.0", + "@typescript-eslint/types": "^8.40.0", "debug": "^4.3.4" }, "engines": { @@ -4503,13 +4504,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.39.1", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-8.39.1.tgz", - "integrity": "sha512-RkBKGBrjgskFGWuyUGz/EtD8AF/GW49S21J8dvMzpJitOF1slLEbbHnNEtAHtnDAnx8qDEdRrULRnWVx27wGBw==", + "version": "8.40.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-8.40.0.tgz", + "integrity": "sha512-y9ObStCcdCiZKzwqsE8CcpyuVMwRouJbbSrNuThDpv16dFAj429IkM6LNb1dZ2m7hK5fHyzNcErZf7CEeKXR4w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "8.39.1", - "@typescript-eslint/visitor-keys": "8.39.1" + "@typescript-eslint/types": "8.40.0", + "@typescript-eslint/visitor-keys": "8.40.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4520,9 +4521,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.39.1", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.39.1.tgz", - "integrity": "sha512-ePUPGVtTMR8XMU2Hee8kD0Pu4NDE1CN9Q1sxGSGd/mbOtGZDM7pnhXNJnzW63zk/q+Z54zVzj44HtwXln5CvHA==", + "version": "8.40.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.40.0.tgz", + "integrity": "sha512-jtMytmUaG9d/9kqSl/W3E3xaWESo4hFDxAIHGVW/WKKtQhesnRIJSAJO6XckluuJ6KDB5woD1EiqknriCtAmcw==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4536,14 +4537,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.39.1", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-8.39.1.tgz", - "integrity": "sha512-gu9/ahyatyAdQbKeHnhT4R+y3YLtqqHyvkfDxaBYk97EcbfChSJXyaJnIL3ygUv7OuZatePHmQvuH5ru0lnVeA==", + "version": "8.40.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-8.40.0.tgz", + "integrity": "sha512-eE60cK4KzAc6ZrzlJnflXdrMqOBaugeukWICO2rB0KNvwdIMaEaYiywwHMzA1qFpTxrLhN9Lp4E/00EgWcD3Ow==", "dev": true, "dependencies": { - "@typescript-eslint/types": "8.39.1", - "@typescript-eslint/typescript-estree": "8.39.1", - "@typescript-eslint/utils": "8.39.1", + "@typescript-eslint/types": "8.40.0", + "@typescript-eslint/typescript-estree": "8.40.0", + "@typescript-eslint/utils": "8.40.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -4560,9 +4561,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.39.1", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/types/-/types-8.39.1.tgz", - "integrity": "sha512-7sPDKQQp+S11laqTrhHqeAbsCfMkwJMrV7oTDvtDds4mEofJYir414bYKUEb8YPUm9QL3U+8f6L6YExSoAGdQw==", + "version": "8.40.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/types/-/types-8.40.0.tgz", + "integrity": "sha512-ETdbFlgbAmXHyFPwqUIYrfc12ArvpBhEVgGAxVYSwli26dn8Ko+lIo4Su9vI9ykTZdJn+vJprs/0eZU0YMAEQg==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4573,15 +4574,15 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.39.1", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.39.1.tgz", - "integrity": "sha512-EKkpcPuIux48dddVDXyQBlKdeTPMmALqBUbEk38McWv0qVEZwOpVJBi7ugK5qVNgeuYjGNQxrrnoM/5+TI/BPw==", + "version": "8.40.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.40.0.tgz", + "integrity": "sha512-k1z9+GJReVVOkc1WfVKs1vBrR5MIKKbdAjDTPvIK3L8De6KbFfPFt6BKpdkdk7rZS2GtC/m6yI5MYX+UsuvVYQ==", "dev": true, "dependencies": { - "@typescript-eslint/project-service": "8.39.1", - "@typescript-eslint/tsconfig-utils": "8.39.1", - "@typescript-eslint/types": "8.39.1", - "@typescript-eslint/visitor-keys": "8.39.1", + "@typescript-eslint/project-service": "8.40.0", + "@typescript-eslint/tsconfig-utils": "8.40.0", + "@typescript-eslint/types": "8.40.0", + "@typescript-eslint/visitor-keys": "8.40.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -4601,15 +4602,15 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.39.1", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-8.39.1.tgz", - "integrity": "sha512-VF5tZ2XnUSTuiqZFXCZfZs1cgkdd3O/sSYmdo2EpSyDlC86UM/8YytTmKnehOW3TGAlivqTDT6bS87B/GQ/jyg==", + "version": "8.40.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-8.40.0.tgz", + "integrity": "sha512-Cgzi2MXSZyAUOY+BFwGs17s7ad/7L+gKt6Y8rAVVWS+7o6wrjeFN4nVfTpbE25MNcxyJ+iYUXflbs2xR9h4UBg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.39.1", - "@typescript-eslint/types": "8.39.1", - "@typescript-eslint/typescript-estree": "8.39.1" + "@typescript-eslint/scope-manager": "8.40.0", + "@typescript-eslint/types": "8.40.0", + "@typescript-eslint/typescript-estree": "8.40.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4624,12 +4625,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.39.1", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.39.1.tgz", - "integrity": "sha512-W8FQi6kEh2e8zVhQ0eeRnxdvIoOkAp/CPAahcNio6nO9dsIwb9b34z90KOlheoyuVf6LSOEdjlkxSkapNEc+4A==", + "version": "8.40.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.40.0.tgz", + "integrity": "sha512-8CZ47QwalyRjsypfwnbI3hKy5gJDPmrkLjkgMxhi0+DZZ2QNx2naS6/hWoVYUHU7LU2zleF68V9miaVZvhFfTA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "8.39.1", + "@typescript-eslint/types": "8.40.0", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -5050,9 +5051,9 @@ } }, "node_modules/ahooks": { - "version": "3.9.0", - "resolved": "https://registry.npmmirror.com/ahooks/-/ahooks-3.9.0.tgz", - "integrity": "sha512-r20/C38aFyU3Zqp3620gkdLnxmQhnmWORB3eGGTDlM4i/fOc0GUvM+f2oleMzEu7b3+pHXyzz+FB6ojxsUdYdw==", + "version": "3.9.4", + "resolved": "https://registry.npmmirror.com/ahooks/-/ahooks-3.9.4.tgz", + "integrity": "sha512-NkbX0mamCz4aBX27mZnObbzqcM9S4fzpjVf/6yOvmHh+McBo74xQw5Yz5ry4q2cLMkfNUjhe2q3M5RpjfMVu4g==", "dependencies": { "@babel/runtime": "^7.21.0", "dayjs": "^1.9.1", @@ -5065,7 +5066,7 @@ "tslib": "^2.4.1" }, "engines": { - "node": ">=8.0.0" + "node": ">=18" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", @@ -5104,9 +5105,9 @@ } }, "node_modules/antd": { - "version": "5.27.0", - "resolved": "https://registry.npmmirror.com/antd/-/antd-5.27.0.tgz", - "integrity": "sha512-o54dmpooLOc08RSGCkeEQBYAGPxUSmnhmYJKCNTHH46vzjOVxdteu+wPTRVkRbAkDTbs2VcNr5VL7Lu67rPIiA==", + "version": "5.27.1", + "resolved": "https://registry.npmmirror.com/antd/-/antd-5.27.1.tgz", + "integrity": "sha512-jGMSdBN7hAMvPV27B4RhzZfL6n6yu8yDbo7oXrlJasaOqB7bSDPcjdEy1kXy3JPsny/Qazb1ykzRI4EfcByAPQ==", "dependencies": { "@ant-design/colors": "^7.2.1", "@ant-design/cssinjs": "^1.23.0", @@ -6112,9 +6113,9 @@ } }, "node_modules/eslint": { - "version": "9.33.0", - "resolved": "https://registry.npmmirror.com/eslint/-/eslint-9.33.0.tgz", - "integrity": "sha512-TS9bTNIryDzStCpJN93aC5VRSW3uTx9sClUn4B87pwiCaJh220otoI0X8mJKr+VcPtniMdN8GKjlwgWGUv5ZKA==", + "version": "9.34.0", + "resolved": "https://registry.npmmirror.com/eslint/-/eslint-9.34.0.tgz", + "integrity": "sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", @@ -6123,7 +6124,7 @@ "@eslint/config-helpers": "^0.3.1", "@eslint/core": "^0.15.2", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.33.0", + "@eslint/js": "9.34.0", "@eslint/plugin-kit": "^0.3.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -6291,18 +6292,18 @@ } }, "node_modules/eslint-plugin-better-tailwindcss": { - "version": "3.7.4", - "resolved": "https://registry.npmmirror.com/eslint-plugin-better-tailwindcss/-/eslint-plugin-better-tailwindcss-3.7.4.tgz", - "integrity": "sha512-jlLHLoqrNbcqqROVjFojGDv1m2LGiJwFqynbARbyeRj9rc1Hmh46EeQhmYVQihhD4j+DSxG/bcwoA9PABIpLmw==", + "version": "3.7.5", + "resolved": "https://registry.npmmirror.com/eslint-plugin-better-tailwindcss/-/eslint-plugin-better-tailwindcss-3.7.5.tgz", + "integrity": "sha512-O6xqnXe7hCMMBecFHVmSUg3oER/Olt0EAiAxe6V7MfLG2Kys3MC56RAbgfv0tIRE0xiL7AoYydlxQ1iIMU8qKQ==", "dev": true, "dependencies": { "@eslint/css-tree": "^3.6.3", - "enhanced-resolve": "^5.18.2", + "enhanced-resolve": "^5.18.3", "jiti": "^2.5.1", "postcss": "^8.5.6", "postcss-import": "^16.1.1", "synckit": "^0.11.11", - "tailwind-csstree": "^0.1.2", + "tailwind-csstree": "^0.1.3", "tsconfig-paths-webpack-plugin": "^4.2.0" }, "engines": { @@ -7059,9 +7060,9 @@ } }, "node_modules/i18next": { - "version": "25.3.6", - "resolved": "https://registry.npmmirror.com/i18next/-/i18next-25.3.6.tgz", - "integrity": "sha512-dThZ0CTCM3sUG/qS0ZtQYZQcUI6DtBN8yBHK+SKEqihPcEYmjVWh/YJ4luic73Iq6Uxhp6q7LJJntRK5+1t7jQ==", + "version": "25.4.2", + "resolved": "https://registry.npmmirror.com/i18next/-/i18next-25.4.2.tgz", + "integrity": "sha512-gD4T25a6ovNXsfXY1TwHXXXLnD/K2t99jyYMCSimSCBnBRJVQr5j+VAaU83RJCPzrTGhVQ6dqIga66xO2rtd5g==", "funding": [ { "type": "individual", @@ -9129,15 +9130,15 @@ "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==" }, "node_modules/react-i18next": { - "version": "15.6.1", - "resolved": "https://registry.npmmirror.com/react-i18next/-/react-i18next-15.6.1.tgz", - "integrity": "sha512-uGrzSsOUUe2sDBG/+FJq2J1MM+Y4368/QW8OLEKSFvnDflHBbZhSd1u3UkW0Z06rMhZmnB/AQrhCpYfE5/5XNg==", + "version": "15.7.2", + "resolved": "https://registry.npmmirror.com/react-i18next/-/react-i18next-15.7.2.tgz", + "integrity": "sha512-xJxq7ibnhUlMvd82lNC4te1GxGUMoM1A05KKyqoqsBXVZtEvZg/fz/fnVzdlY/hhQ3SpP/79qCocZOtICGhd3g==", "dependencies": { "@babel/runtime": "^7.27.6", "html-parse-stringify": "^3.0.1" }, "peerDependencies": { - "i18next": ">= 23.2.3", + "i18next": ">= 25.4.1", "react": ">= 16.8.0", "typescript": "^5" }, @@ -9168,9 +9169,9 @@ } }, "node_modules/react-router": { - "version": "7.8.1", - "resolved": "https://registry.npmmirror.com/react-router/-/react-router-7.8.1.tgz", - "integrity": "sha512-5cy/M8DHcG51/KUIka1nfZ2QeylS4PJRs6TT8I4PF5axVsI5JUxp0hC0NZ/AEEj8Vw7xsEoD7L/6FY+zoYaOGA==", + "version": "7.8.2", + "resolved": "https://registry.npmmirror.com/react-router/-/react-router-7.8.2.tgz", + "integrity": "sha512-7M2fR1JbIZ/jFWqelpvSZx+7vd7UlBTfdZqf6OSdF9g6+sfdqJDAWcak6ervbHph200ePlu+7G8LdoiC3ReyAQ==", "dependencies": { "cookie": "^1.0.1", "set-cookie-parser": "^2.6.0" @@ -9189,11 +9190,11 @@ } }, "node_modules/react-router-dom": { - "version": "7.8.1", - "resolved": "https://registry.npmmirror.com/react-router-dom/-/react-router-dom-7.8.1.tgz", - "integrity": "sha512-NkgBCF3sVgCiAWIlSt89GR2PLaksMpoo3HDCorpRfnCEfdtRPLiuTf+CNXvqZMI5SJLZCLpVCvcZrTdtGW64xQ==", + "version": "7.8.2", + "resolved": "https://registry.npmmirror.com/react-router-dom/-/react-router-dom-7.8.2.tgz", + "integrity": "sha512-Z4VM5mKDipal2jQ385H6UBhiiEDlnJPx6jyWsTYoZQdl5TrjxEV2a9yl3Fi60NBJxYzOTGTTHXPi0pdizvTwow==", "dependencies": { - "react-router": "7.8.1" + "react-router": "7.8.2" }, "engines": { "node": ">=20.0.0" @@ -9992,9 +9993,9 @@ "dev": true }, "node_modules/tailwind-csstree": { - "version": "0.1.2", - "resolved": "https://registry.npmmirror.com/tailwind-csstree/-/tailwind-csstree-0.1.2.tgz", - "integrity": "sha512-SP36MjhkSGa0Yux/B863QyxljQku+WbGH5f+dqyFJXvdexemcC0Fwj/2du2DoXVkboO5Rc1Pd4i45EmFJual6w==", + "version": "0.1.3", + "resolved": "https://registry.npmmirror.com/tailwind-csstree/-/tailwind-csstree-0.1.3.tgz", + "integrity": "sha512-LfOT807005OVfyxAjHpOajlIgoEaE894jqjkrhONC/HqBLS8OAhhNifnNs3Y5wD26eIdf0vk1zu9gja2oI3/1Q==", "dev": true, "engines": { "node": ">=18.18" @@ -10317,15 +10318,15 @@ } }, "node_modules/typescript-eslint": { - "version": "8.39.1", - "resolved": "https://registry.npmmirror.com/typescript-eslint/-/typescript-eslint-8.39.1.tgz", - "integrity": "sha512-GDUv6/NDYngUlNvwaHM1RamYftxf782IyEDbdj3SeaIHHv8fNQVRC++fITT7kUJV/5rIA/tkoRSSskt6osEfqg==", + "version": "8.40.0", + "resolved": "https://registry.npmmirror.com/typescript-eslint/-/typescript-eslint-8.40.0.tgz", + "integrity": "sha512-Xvd2l+ZmFDPEt4oj1QEXzA4A2uUK6opvKu3eGN9aGjB8au02lIVcLyi375w94hHyejTOmzIU77L8ol2sRg9n7Q==", "dev": true, "dependencies": { - "@typescript-eslint/eslint-plugin": "8.39.1", - "@typescript-eslint/parser": "8.39.1", - "@typescript-eslint/typescript-estree": "8.39.1", - "@typescript-eslint/utils": "8.39.1" + "@typescript-eslint/eslint-plugin": "8.40.0", + "@typescript-eslint/parser": "8.40.0", + "@typescript-eslint/typescript-estree": "8.40.0", + "@typescript-eslint/utils": "8.40.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -10728,17 +10729,14 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "node_modules/yaml": { - "version": "2.5.0", - "resolved": "https://registry.npmmirror.com/yaml/-/yaml-2.5.0.tgz", - "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", - "dev": true, - "optional": true, - "peer": true, + "version": "2.8.1", + "resolved": "https://registry.npmmirror.com/yaml/-/yaml-2.8.1.tgz", + "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", "bin": { "yaml": "bin.mjs" }, "engines": { - "node": ">= 14" + "node": ">= 14.6" } }, "node_modules/yocto-queue": { @@ -10754,17 +10752,17 @@ } }, "node_modules/zod": { - "version": "4.0.17", - "resolved": "https://registry.npmmirror.com/zod/-/zod-4.0.17.tgz", - "integrity": "sha512-1PHjlYRevNxxdy2JZ8JcNAw7rX8V9P1AKkP+x/xZfxB0K5FYfuV+Ug6P/6NVSR2jHQ+FzDDoDHS04nYUsOIyLQ==", + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/zod/-/zod-4.1.1.tgz", + "integrity": "sha512-SgMZK/h8Tigt9nnKkfJMvB/mKjiJXaX26xegP4sa+0wHIFVFWVlsQGdhklDmuargBD3Hsi3rsQRIzwJIhTPJHA==", "funding": { "url": "https://github.com/sponsors/colinhacks" } }, "node_modules/zustand": { - "version": "5.0.7", - "resolved": "https://registry.npmmirror.com/zustand/-/zustand-5.0.7.tgz", - "integrity": "sha512-Ot6uqHDW/O2VdYsKLLU8GQu8sCOM1LcoE8RwvLv9uuRT9s6SOHCKs0ZEOhxg+I1Ld+A1Q5lwx+UlKXXUoCZITg==", + "version": "5.0.8", + "resolved": "https://registry.npmmirror.com/zustand/-/zustand-5.0.8.tgz", + "integrity": "sha512-gyPKpIaxY9XcO2vSMrLbiER7QMAMGOQZVRdJ6Zi782jkbzZygq5GI9nG8g+sMgitRtndwaBSl7uiqC49o1SSiw==", "engines": { "node": ">=12.20.0" }, diff --git a/ui/package.json b/ui/package.json index e8dffe533..b9cd911be 100644 --- a/ui/package.json +++ b/ui/package.json @@ -13,20 +13,20 @@ "@codemirror/lang-yaml": "^6.1.2", "@codemirror/language": "^6.11.3", "@codemirror/legacy-modes": "^6.5.1", - "@flowgram.ai/document": "^0.4.0", - "@flowgram.ai/fixed-layout-editor": "^0.4.0", - "@flowgram.ai/minimap-plugin": "^0.4.0", + "@flowgram.ai/document": "0.4.3", + "@flowgram.ai/fixed-layout-editor": "0.4.3", + "@flowgram.ai/minimap-plugin": "0.4.3", "@tabler/icons-react": "^3.34.1", "@uiw/codemirror-extensions-basic-setup": "^4.25.1", "@uiw/codemirror-theme-vscode": "^4.25.1", "@uiw/react-codemirror": "^4.25.1", - "ahooks": "^3.9.0", - "antd": "^5.27.0", + "ahooks": "^3.9.4", + "antd": "^5.27.1", "antd-zod": "^7.0.0", "clsx": "^2.1.1", "cron-parser": "^5.3.0", "file-saver": "^2.0.5", - "i18next": "^25.3.6", + "i18next": "^25.4.2", "i18next-browser-languagedetector": "^8.2.0", "immer": "^10.1.1", "nanoid": "^5.1.5", @@ -35,14 +35,15 @@ "react": "^18.3.1", "react-copy-to-clipboard": "^5.1.0", "react-dom": "^18.3.1", - "react-i18next": "^15.6.1", - "react-router-dom": "^7.8.1", + "react-i18next": "^15.7.2", + "react-router-dom": "^7.8.2", "tailwind-merge": "^3.3.1", - "zod": "^4.0.17", - "zustand": "^5.0.7" + "yaml": "^2.8.1", + "zod": "^4.1.1", + "zustand": "^5.0.8" }, "devDependencies": { - "@eslint/js": "^9.33.0", + "@eslint/js": "^9.34.0", "@tailwindcss/postcss": "^4.1.12", "@tailwindcss/vite": "^4.1.12", "@types/file-saver": "^2.0.7", @@ -53,10 +54,10 @@ "@types/react-dom": "^18.3.7", "@vitejs/plugin-legacy": "^6.1.1", "@vitejs/plugin-react": "^4.7.0", - "eslint": "^9.33.0", + "eslint": "^9.34.0", "eslint-config-prettier": "^10.1.8", "eslint-import-resolver-typescript": "^4.4.4", - "eslint-plugin-better-tailwindcss": "^3.7.4", + "eslint-plugin-better-tailwindcss": "^3.7.5", "eslint-plugin-import": "^2.32.0", "eslint-plugin-prettier": "^5.5.4", "eslint-plugin-react-hooks": "^5.2.0", @@ -65,7 +66,7 @@ "prettier": "^3.6.2", "tailwindcss": "^4.1.12", "typescript": "^5.8.3", - "typescript-eslint": "^8.39.1", + "typescript-eslint": "^8.40.0", "vite": "^6.3.5" } } diff --git a/ui/src/components/ModalForm.tsx b/ui/src/components/ModalForm.tsx index 9a7ba759a..2e24d8dfb 100644 --- a/ui/src/components/ModalForm.tsx +++ b/ui/src/components/ModalForm.tsx @@ -122,7 +122,7 @@ const ModalForm = = any>({ onOk={handleOkClick} onCancel={handleCancelClick} > -
+
{children}
diff --git a/ui/src/components/access/AccessEditDrawer.tsx b/ui/src/components/access/AccessEditDrawer.tsx index c091f3144..6792dfebd 100644 --- a/ui/src/components/access/AccessEditDrawer.tsx +++ b/ui/src/components/access/AccessEditDrawer.tsx @@ -1,7 +1,7 @@ import { startTransition, useCallback, useEffect, useRef, useState } from "react"; import { useTranslation } from "react-i18next"; import { IconX } from "@tabler/icons-react"; -import { useControllableValue } from "ahooks"; +import { useControllableValue, useGetState } from "ahooks"; import { App, Button, Drawer, Flex } from "antd"; import { type AccessModel } from "@/domain/access"; @@ -145,8 +145,9 @@ const AccessEditDrawer = ({ afterClose, afterSubmit, mode, data, loading, trigge const useDrawer = () => { type DataType = AccessEditDrawerProps["data"]; - const [data, setData] = useState(); - const [open, setOpen] = useState(false); + const [data, setData, getData] = useGetState(); + const [loading, setLoading] = useState(); + const [open, setOpen] = useState(false); const onOpenChange = useCallback((open: boolean) => { setOpen(open); @@ -158,17 +159,34 @@ const useDrawer = () => { startTransition(() => { if (!open) { setData(void 0); + setLoading(void 0); } }); }, data, + loading, open, onOpenChange, }, - open: (data: NonNullable) => { + open: ({ data, loading }: { data: NonNullable; loading?: boolean }) => { setData(data); + setLoading(loading); setOpen(true); + + return { + safeUpdate: ({ data, loading }: { data?: NonNullable; loading?: boolean }) => { + if (data != null) { + if (data.id !== getData()?.id) return; // 确保数据不脏读 + + setData(data); + } + + if (loading != null) { + setLoading(loading); + } + }, + }; }, close: () => { setOpen(false); diff --git a/ui/src/components/access/AccessForm.tsx b/ui/src/components/access/AccessForm.tsx index 8ce53863f..9978e2733 100644 --- a/ui/src/components/access/AccessForm.tsx +++ b/ui/src/components/access/AccessForm.tsx @@ -334,7 +334,7 @@ const AccessForm = forwardRef(({ className, getFieldsValue: () => { const values = formInst.getFieldsValue(true); values.config = nestedFormInst.getFieldsValue(); - values.reserve = usage === "ca" ? "ca" : usage === "notification" ? "notification" : void 0; + values.reserve = usage === "ca" ? "ca" : usage === "notification" ? "notif" : void 0; return values; }, resetFields: (fields) => { diff --git a/ui/src/components/certificate/CertificateDetailDrawer.tsx b/ui/src/components/certificate/CertificateDetailDrawer.tsx index 7a48724bc..4bc7e0f53 100644 --- a/ui/src/components/certificate/CertificateDetailDrawer.tsx +++ b/ui/src/components/certificate/CertificateDetailDrawer.tsx @@ -1,6 +1,6 @@ import { startTransition, useCallback, useState } from "react"; import { IconX } from "@tabler/icons-react"; -import { useControllableValue } from "ahooks"; +import { useControllableValue, useGetState } from "ahooks"; import { Button, Drawer, Flex } from "antd"; import Show from "@/components/Show"; @@ -64,8 +64,9 @@ const CertificateDetailDrawer = ({ afterClose, data, loading, trigger, ...props const useDrawer = () => { type DataType = CertificateDetailDrawerProps["data"]; - const [data, setData] = useState(); - const [open, setOpen] = useState(false); + const [data, setData, getData] = useGetState(); + const [loading, setLoading] = useState(); + const [open, setOpen] = useState(false); const onOpenChange = useCallback((open: boolean) => { setOpen(open); @@ -77,17 +78,34 @@ const useDrawer = () => { startTransition(() => { if (!open) { setData(void 0); + setLoading(void 0); } }); }, data, + loading, open, onOpenChange, }, - open: (data: NonNullable) => { + open: ({ data, loading }: { data: NonNullable; loading?: boolean }) => { setData(data); + setLoading(loading); setOpen(true); + + return { + safeUpdate: ({ data, loading }: { data?: NonNullable; loading?: boolean }) => { + if (data != null) { + if (data.id !== getData()?.id) return; // 确保数据不脏读 + + setData(data); + } + + if (loading != null) { + setLoading(loading); + } + }, + }; }, close: () => { setOpen(false); diff --git a/ui/src/components/workflow/WorkflowGraphExportBox.tsx b/ui/src/components/workflow/WorkflowGraphExportBox.tsx new file mode 100644 index 000000000..06a8c74c7 --- /dev/null +++ b/ui/src/components/workflow/WorkflowGraphExportBox.tsx @@ -0,0 +1,143 @@ +import { useEffect, useState } from "react"; +import { CopyToClipboard } from "react-copy-to-clipboard"; +import { useTranslation } from "react-i18next"; +import { FlowNodeBaseType, FlowNodeSplitType } from "@flowgram.ai/fixed-layout-editor"; +import { IconClipboard } from "@tabler/icons-react"; +import { App, Button, Form, Radio, Tooltip } from "antd"; +import { stringify as stringifyYaml } from "yaml"; + +import CodeInput from "@/components/CodeInput"; +import { type WorkflowGraph, type WorkflowNode } from "@/domain/workflow"; + +import { getAllNodeRegistries } from "./designer/nodes"; + +export type WorkflowGraphExportBoxFormats = "json" | "yaml"; + +export interface WorkflowGraphExportBoxProps { + className?: string; + style?: React.CSSProperties; + data: WorkflowGraph; +} + +const serialize = (graph: WorkflowGraph | undefined, format: WorkflowGraphExportBoxFormats): string | undefined => { + if (!graph) return; + + const nodeRegistries = getAllNodeRegistries(); + + const deepConvert = (node: WorkflowNode): Map => { + // 利用 Map 来保证字段序列化的有序性 + const map = new Map([ + ["id", node.id], + ["type", node.type], + ["name", node.data.name], + ]); + + if (node.data.disabled != null) { + if (node.data.disabled) { + map.set("disabled", node.data.disabled); + } + } + + if (node.data.config != null) { + map.set("config", node.data.config); + } + + if (node.blocks != null) { + const branchLikeNodeTypes = [ + FlowNodeBaseType.BLOCK, + FlowNodeSplitType.SIMPLE_SPLIT, + FlowNodeSplitType.DYNAMIC_SPLIT, + FlowNodeSplitType.STATIC_SPLIT, + ] as string[]; + const hasChildren = node.blocks.length > 0 || branchLikeNodeTypes.includes(nodeRegistries.find((r) => r.type === node.type)?.extend ?? ""); + if (hasChildren) { + const childern = node.blocks.map((block) => deepConvert(block)); + map.set("blocks", childern); + } + } + + Object.entries(node.data).forEach(([k, v]) => { + if (k === "name" || k === "disabled" || k === "config") return; + map.set(k, v); + }); + + return map; + }; + const nodes = graph.nodes.map((node) => deepConvert(node)); + + let content: string = ""; + switch (format) { + case "json": + content = JSON.stringify( + { ...graph, nodes }, + (_, value) => { + if (value instanceof Map) { + return Object.fromEntries(value.entries()); + } else { + return value; + } + }, + 2 + ); + break; + + case "yaml": + content = stringifyYaml( + { ...graph, nodes }, + { + indent: 2, + defaultKeyType: "PLAIN", + defaultStringType: "QUOTE_DOUBLE", + } + ); + break; + } + + return content; +}; + +const WorkflowGraphExportBox = ({ className, style, data }: WorkflowGraphExportBoxProps) => { + const { t } = useTranslation(); + + const { message } = App.useApp(); + + const [format, setFormat] = useState("yaml"); + const [content, setContent] = useState(); + + useEffect(() => { + setContent(serialize(data, format)); + }, [data, format]); + + return ( +
+ + setFormat(e.target.value)}> + + YAML + + + JSON + + + + + +
+ + { + message.success(t("common.text.copied")); + }} + > +
+ +
+
+ ); +}; + +export default WorkflowGraphExportBox; diff --git a/ui/src/components/workflow/WorkflowGraphExportModal.tsx b/ui/src/components/workflow/WorkflowGraphExportModal.tsx new file mode 100644 index 000000000..0569630c9 --- /dev/null +++ b/ui/src/components/workflow/WorkflowGraphExportModal.tsx @@ -0,0 +1,95 @@ +import { startTransition, useCallback, useState } from "react"; +import { useTranslation } from "react-i18next"; +import { useControllableValue } from "ahooks"; +import { Modal } from "antd"; + +import { type WorkflowGraph } from "@/domain/workflow"; +import { useTriggerElement } from "@/hooks"; + +import WorkflowGraphExportBox from "./WorkflowGraphExportBox"; + +export interface WorkflowGraphExportModalProps { + afterClose?: () => void; + data: WorkflowGraph; + loading?: boolean; + open?: boolean; + trigger?: React.ReactNode; + onOpenChange?: (open: boolean) => void; +} + +const WorkflowGraphExportModal = ({ afterClose, data, loading, trigger, ...props }: WorkflowGraphExportModalProps) => { + const { t } = useTranslation(); + + const [open, setOpen] = useControllableValue(props, { + valuePropName: "open", + defaultValuePropName: "defaultOpen", + trigger: "onOpenChange", + }); + + const triggerEl = useTriggerElement(trigger, { onClick: () => setOpen(true) }); + + const handleCancelClick = () => { + setOpen(false); + }; + + return ( + <> + {triggerEl} + + +
+ +
+
+ + ); +}; + +const useModal = () => { + type DataType = WorkflowGraphExportModalProps["data"]; + const [data, setData] = useState(); + const [open, setOpen] = useState(false); + + const onOpenChange = useCallback((open: boolean) => { + setOpen(open); + }, []); + + return { + modalProps: { + afterClose: () => { + startTransition(() => { + if (!open) { + setData(void 0); + } + }); + }, + data: data!, + open, + onOpenChange, + }, + + open: ({ data }: { data: DataType }) => { + setData(data); + setOpen(true); + }, + close: () => { + setOpen(false); + }, + }; +}; + +const _default = Object.assign(WorkflowGraphExportModal, { + useModal, +}); + +export default _default; diff --git a/ui/src/components/workflow/WorkflowGraphImportInputBox.tsx b/ui/src/components/workflow/WorkflowGraphImportInputBox.tsx new file mode 100644 index 000000000..8a951cb3a --- /dev/null +++ b/ui/src/components/workflow/WorkflowGraphImportInputBox.tsx @@ -0,0 +1,249 @@ +import { forwardRef, useImperativeHandle } from "react"; +import { useTranslation } from "react-i18next"; +import { Form, Radio } from "antd"; +import { createSchemaFieldRule } from "antd-zod"; +import { parse as parseYaml } from "yaml"; +import { z } from "zod"; + +import CodeInput from "@/components/CodeInput"; +import { WORKFLOW_NODE_TYPES, type WorkflowGraph, type WorkflowNode, type WorkflowNodeType } from "@/domain/workflow"; +import { useAntdForm } from "@/hooks"; + +export type WorkflowGraphImportInputBoxFormats = "json" | "yaml"; + +export interface WorkflowGraphImportInputBoxProps { + className?: string; + style?: React.CSSProperties; +} + +export interface WorkflowGraphImportInputBoxInstance { + validate: () => Promise; +} + +const deserialize = (content: string | undefined, format: WorkflowGraphImportInputBoxFormats): WorkflowGraph | undefined => { + if (!content?.trim()) return; + + let temp: any; + switch (format) { + case "json": + temp = JSON.parse(content); + break; + + case "yaml": + temp = parseYaml(content); + break; + } + + const deepParse = (item: any): WorkflowNode => { + item = item ?? {}; + + const node: WorkflowNode = { + id: item.id?.toString() ?? "", + type: (item.type?.toString() ?? "") as WorkflowNodeType, + data: { + name: item.name?.toString() ?? "", + disabled: item.disabled === true || item.disabled === "true", + config: item.config, + }, + blocks: Array.isArray(item.blocks) ? item.blocks.map((block: any) => deepParse(block)) : [], + }; + + if (item.data != null) { + Object.entries(item.data).forEach(([k, v]) => { + if (k === "id" || k === "type" || k === "meta" || k === "blocks") return; + if (k === "name" || k === "disabled" || k === "config") return; + node.data[k] = v; + }); + } + + return node; + }; + const nodes = Array.from(temp.nodes ?? []).map((item) => deepParse(item)); + + return { nodes: nodes }; +}; + +const WorkflowGraphImportInputBox = forwardRef(({ className, style }, ref) => { + const { t } = useTranslation(); + + const formSchema = z + .object({ + format: z.enum(["json", "yaml"]), + content: z.string().refine((v) => !!v?.trim(), t("workflow.detail.design.action.import.form.content.errmsg.invalid")), + }) + .superRefine((values, ctx) => { + let graph: WorkflowGraph | undefined; + try { + graph = deserialize(values.content, values.format); + } catch { + ctx.addIssue({ + code: "custom", + message: t("workflow.detail.design.action.import.form.content.errmsg.invalid"), + path: ["content"], + }); + return; + } + + if (graph) { + const errmsgs: string[] = []; + + if (graph.nodes.at(0)?.type !== WORKFLOW_NODE_TYPES.START) { + errmsgs.push(t("workflow.detail.design.action.import.form.content.errmsg.first_node_start")); + } + + if (graph.nodes.at(-1)?.type !== WORKFLOW_NODE_TYPES.END) { + errmsgs.push(t("workflow.detail.design.action.import.form.content.errmsg.last_node_end")); + } + + let startNodeId: string | undefined; + let startNodeDuplicated: boolean = false; + const nodeIds = new Set(); + const deepValidate = (node: WorkflowNode) => { + // 验证字段:ID + if (!/^(?![_-])[a-zA-Z0-9_-]{1,32}$/.test(node.id)) { + errmsgs.push(t("workflow.detail.design.action.import.form.content.errmsg.invalid_id", { nodeId: node.id })); + } + + // 验证字段:配置项 + if (node.data.config != null) { + if (typeof node.data.config !== "object" || Array.isArray(node.data.config)) { + errmsgs.push(t("workflow.detail.design.action.import.form.content.errmsg.invalid_config", { nodeId: node.id })); + } + } + + // 验证节点 ID 是否冲突 + if (nodeIds.has(node.id)) { + errmsgs.push(t("workflow.detail.design.action.import.form.content.errmsg.conflict_id", { nodeId: node.id })); + } else { + nodeIds.add(node.id); + } + + // 验证开始节点是否重复 + if (node.type === WORKFLOW_NODE_TYPES.START) { + if (startNodeId) { + if (!startNodeDuplicated) { + startNodeDuplicated = true; + errmsgs.push(t("workflow.detail.design.action.import.form.content.errmsg.duplicate_start")); + } + } else { + startNodeId = node.id; + } + } + + // 验证 Condition 分支结构 + if (node.type === WORKFLOW_NODE_TYPES.CONDITION) { + const blocks = node.blocks ?? []; + const f1 = blocks.length > 0; + const f2 = blocks.every((block) => block.type === WORKFLOW_NODE_TYPES.BRANCHBLOCK); + if (!f1 || !f2) { + errmsgs.push(t("workflow.detail.design.action.import.form.content.errmsg.abnormal_condition_branch", { nodeId: node.id })); + } + } else if (node.type === WORKFLOW_NODE_TYPES.BRANCHBLOCK) { + const blocks = node.blocks ?? []; + const f1 = blocks.length > 0; + const f2 = blocks.every((block) => block.type !== WORKFLOW_NODE_TYPES.BRANCHBLOCK); + if (!f1 || !f2) { + errmsgs.push(t("workflow.detail.design.action.import.form.content.errmsg.abnormal_condition_branch", { nodeId: node.id })); + } + } + + // 验证 TryCatch 分支结构 + if (node.type === WORKFLOW_NODE_TYPES.TRYCATCH) { + const blocks = node.blocks ?? []; + const f1 = blocks.length >= 2; + const f2 = blocks[0]?.type === WORKFLOW_NODE_TYPES.TRYBLOCK; + const f3 = blocks.some((block) => block.type === WORKFLOW_NODE_TYPES.CATCHBLOCK); + if (!f1 || !f2 || !f3) { + errmsgs.push(t("workflow.detail.design.action.import.form.content.errmsg.abnormal_try_catch_branch", { nodeId: node.id })); + } + } else if (node.type === WORKFLOW_NODE_TYPES.TRYBLOCK || node.type === WORKFLOW_NODE_TYPES.CATCHBLOCK) { + const blocks = node.blocks ?? []; + const f1 = blocks.length > 0; + const f2 = blocks.every((block) => block.type !== WORKFLOW_NODE_TYPES.TRYBLOCK); + const f3 = blocks.every((block) => block.type !== WORKFLOW_NODE_TYPES.CATCHBLOCK); + if (!f1 || !f2 || !f3) { + errmsgs.push(t("workflow.detail.design.action.import.form.content.errmsg.abnormal_try_catch_branch", { nodeId: node.id })); + } + } + + // 验证子节点 + if (Array.isArray(node.blocks)) { + node.blocks.forEach((block) => deepValidate(block)); + } + }; + graph.nodes.forEach((node) => deepValidate(node)); + + const MAX_ISSUE_COUNT = 5; + for (let i = 0; i < Math.min(MAX_ISSUE_COUNT, errmsgs.length); i++) { + ctx.addIssue({ + code: "custom", + message: errmsgs[i], + path: ["content"], + }); + } + } + }); + const formRule = createSchemaFieldRule(formSchema); + const { form: formInst, formProps } = useAntdForm>({ + name: "workflowGraphExportInputBoxForm", + initialValues: { + format: "yaml", + content: "", + }, + }); + + const fieldFormat = Form.useWatch("format", formInst); + const fieldContent = Form.useWatch("content", formInst); + + const handleFormatChange = (format: WorkflowGraphImportInputBoxFormats) => { + formInst.setFieldValue("format", format); + + switch (format) { + case "json": + try { + JSON.parse(fieldContent); + } catch { + formInst.setFieldValue("content", ""); + } + break; + + case "yaml": + try { + parseYaml(fieldContent); + } catch { + formInst.setFieldValue("content", ""); + } + break; + } + }; + + useImperativeHandle(ref, () => { + return { + validate: async () => { + const formValues = await formInst.validateFields(); + return deserialize(formValues.content, formValues.format); + }, + }; + }); + + return ( +
+ + handleFormatChange(e.target.value)}> + + YAML + + + JSON + + + + + + + +
+ ); +}); + +export default WorkflowGraphImportInputBox; diff --git a/ui/src/components/workflow/WorkflowGraphImportModal.tsx b/ui/src/components/workflow/WorkflowGraphImportModal.tsx new file mode 100644 index 000000000..052026c2f --- /dev/null +++ b/ui/src/components/workflow/WorkflowGraphImportModal.tsx @@ -0,0 +1,119 @@ +import { startTransition, useCallback, useRef, useState } from "react"; +import { useTranslation } from "react-i18next"; +import { useControllableValue } from "ahooks"; +import { Button, Flex, Modal } from "antd"; + +import { type WorkflowGraph } from "@/domain/workflow"; +import { useTriggerElement } from "@/hooks"; + +import WorkflowImportExportForm, { type WorkflowGraphImportInputBoxInstance } from "./WorkflowGraphImportInputBox"; + +export interface WorkflowGraphImportModalProps { + afterClose?: () => void; + open?: boolean; + trigger?: React.ReactNode; + onCancel?: () => void; + onOk?: (graph: WorkflowGraph) => void; + onOpenChange?: (open: boolean) => void; +} + +const WorkflowGraphImportModal = ({ afterClose, trigger, onCancel, onOk, ...props }: WorkflowGraphImportModalProps) => { + const { t } = useTranslation(); + + const [open, setOpen] = useControllableValue(props, { + valuePropName: "open", + defaultValuePropName: "defaultOpen", + trigger: "onOpenChange", + }); + + const triggerEl = useTriggerElement(trigger, { onClick: () => setOpen(true) }); + + const graphInputBoxRef = useRef(null); + + const handleCancelClick = () => { + setOpen(false); + + onCancel?.(); + }; + + const handleOkClick = async () => { + const graph = await graphInputBoxRef.current!.validate(); + + setOpen(false); + + if (graph != null) { + onOk?.(graph); + } + }; + + return ( + <> + {triggerEl} + + + + + + } + open={open} + title={t("workflow.detail.design.action.import.modal.title")} + width="768px" + onCancel={handleCancelClick} + > +
+ +
+
+ + ); +}; + +const useModal = () => { + const [open, setOpen] = useState(false); + const [onOkHandler, setOnOkHandler] = useState<{ handler: WorkflowGraphImportModalProps["onOk"] }>(); + + const onOpenChange = useCallback((open: boolean) => { + setOpen(open); + }, []); + + return { + modalProps: { + afterClose: () => { + startTransition(() => { + if (!open) { + setOnOkHandler(void 0); + } + }); + }, + open, + onOk: (graph: WorkflowGraph) => { + onOkHandler?.handler?.(graph); + }, + onOpenChange, + }, + + open: () => { + setOpen(true); + + const { promise, resolve } = Promise.withResolvers(); + setOnOkHandler({ handler: (graph) => resolve(graph) }); + return promise; + }, + close: () => { + setOpen(false); + }, + }; +}; + +const _default = Object.assign(WorkflowGraphImportModal, { + useModal, +}); + +export default _default; diff --git a/ui/src/components/workflow/WorkflowRunDetail.tsx b/ui/src/components/workflow/WorkflowRunDetail.tsx index fff54849a..36ee20e2b 100644 --- a/ui/src/components/workflow/WorkflowRunDetail.tsx +++ b/ui/src/components/workflow/WorkflowRunDetail.tsx @@ -1,8 +1,9 @@ import { useState } from "react"; import { useTranslation } from "react-i18next"; -import { IconBrowserShare, IconCheck, IconChevronRight, IconDownload, IconSettings2 } from "@tabler/icons-react"; +import { EditorState, FlowLayoutDefault } from "@flowgram.ai/fixed-layout-editor"; +import { IconBrowserShare, IconCheck, IconDots, IconDownload, IconSettings2, IconTransferOut } from "@tabler/icons-react"; import { useRequest } from "ahooks"; -import { App, Button, Collapse, Divider, Dropdown, Empty, Skeleton, Spin, Table, type TableProps, Tooltip, Typography } from "antd"; +import { Alert, App, Button, Card, Divider, Dropdown, Empty, Skeleton, Spin, Table, type TableProps, Tooltip, Typography, theme } from "antd"; import dayjs from "dayjs"; import { ClientResponseError } from "pocketbase"; @@ -17,6 +18,9 @@ import { listByWorkflowRunId as listLogsByWorkflowRunId } from "@/repository/wor import { mergeCls } from "@/utils/css"; import { getErrMsg } from "@/utils/error"; +import WorkflowDesigner from "./designer/Designer"; +import WorkflowToolbar from "./designer/Toolbar"; +import WorkflowGraphExportModal from "./WorkflowGraphExportModal"; import WorkflowStatus from "./WorkflowStatus"; export interface WorkflowRunDetailProps { @@ -25,21 +29,127 @@ export interface WorkflowRunDetailProps { data: WorkflowRunModel; } -const WorkflowRunDetail = ({ data, ...props }: WorkflowRunDetailProps) => { - return ( -
- - - +const WorkflowRunDetail = ({ className, style, data }: WorkflowRunDetailProps) => { + const { t } = useTranslation(); - - - + return ( +
+ + {data.endedAt + ? t("workflow_run.base.description_with_time_cost", { + trigger: t(`workflow_run.base.trigger.${data.trigger}`), + startedAt: dayjs(data.startedAt).format("YYYY-MM-DD HH:mm:ss"), + timeCost: dayjs(data.endedAt).diff(dayjs(data.startedAt), "second") + "s", + }) + : t("workflow_run.base.description", { + trigger: t(`workflow_run.base.trigger.${data.trigger}`), + startedAt: dayjs(data.startedAt).format("YYYY-MM-DD HH:mm:ss"), + })} +
+ } + showIcon + type={ + { + [WORKFLOW_RUN_STATUSES.SUCCEEDED]: "success" as const, + [WORKFLOW_RUN_STATUSES.FAILED]: "error" as const, + [WORKFLOW_RUN_STATUSES.CANCELED]: "warning" as const, + }[data.status] ?? ("info" as const) + } + /> + +
+ {t("workflow_run.process")} + +
+ +
+ {t("workflow_run.logs")} + +
+ + +
+ {t("workflow_run.artifacts")} + +
); }; +const WorkflowRunProcess = ({ runData }: { runData: WorkflowRunModel }) => { + const { t } = useTranslation(); + + const { token: themeToken } = theme.useToken(); + + const { modalProps: graphExportModalProps, ...graphExportModal } = WorkflowGraphExportModal.useModal(); + + const handleExportClick = () => { + graphExportModal.open({ data: runData.graph! }); + }; + + return ( + <> + + +
+
+
+ + + , + onClick: handleExportClick, + }, + ], + }} + trigger={["click"]} + > +
+
+
+
+
+ + + + ); +}; + const WorkflowRunLogs = ({ runId, runStatus }: { runId: string; runStatus: string }) => { const { t } = useTranslation(); @@ -131,7 +241,7 @@ const WorkflowRunLogs = ({ runId, runStatus }: { runId: string; runStatus: strin .map((group) => { const escape = (str: string) => str.replaceAll("\r", "\\r").replaceAll("\n", "\\n"); return ( - group.name + + `#${group.id} ${group.name}` + NEWLINE + group.records .map((record) => { @@ -156,49 +266,48 @@ const WorkflowRunLogs = ({ runId, runStatus }: { runId: string; runStatus: strin }; return ( - <> - {t("workflow_run.logs")} -
-
-
- -
-
- , - onClick: () => setShowTimestamp(!showTimestamp), - }, - { - key: "show-whitespace", - label: t("workflow_run.logs.menu.show_whitespaces"), - icon: , - onClick: () => setShowWhitespace(!showWhitespace), - }, - { - type: "divider", - }, - { - key: "download-logs", - label: t("workflow_run.logs.menu.download_logs"), - icon: , - onClick: handleDownloadClick, - }, - ], - }} - trigger={["click"]} - > -
+
+
+
+
+
+ , + onClick: () => setShowTimestamp(!showTimestamp), + }, + { + key: "show-whitespace", + label: t("workflow_run.logs.menu.show_whitespaces"), + icon: , + onClick: () => setShowWhitespace(!showWhitespace), + }, + { + type: "divider", + }, + { + key: "download-logs", + label: t("workflow_run.logs.menu.download_logs"), + icon: , + onClick: handleDownloadClick, + }, + ], + }} + trigger={["click"]} + > +
+
- + +
0} fallback={ @@ -207,32 +316,20 @@ const WorkflowRunLogs = ({ runId, runStatus }: { runId: string; runStatus: strin } > -
- group.id)} - expandIcon={({ isActive }) => } - items={listData.map((group) => { - return { - key: group.id, - classNames: { - header: "text-sm text-stone-200", - body: "text-stone-200", - }, - style: { color: "inherit", border: "none" }, - styles: { - header: { color: "inherit" }, - }, - label: group.name, - children:
{group.records.map((record) => renderRecord(record))}
, - }; - })} - /> -
+ {listData.map((group) => { + return ( +
+
+ {`#${group.id}\u00A0`} + {group.name} +
+
{group.records.map((record) => renderRecord(record))}
+
+ ); + })}
- +
); }; @@ -286,7 +383,7 @@ const WorkflowRunArtifacts = ({ runId }: { runId: string }) => { }, ]; const [tableData, setTableData] = useState([]); - const { loading: tableLoading } = useRequest( + const { loading } = useRequest( () => { return listCertificatesByWorkflowRunId(runId); }, @@ -309,20 +406,17 @@ const WorkflowRunArtifacts = ({ runId }: { runId: string }) => { ); return ( - <> - {t("workflow_run.artifacts")} - - columns={tableColumns} - dataSource={tableData} - loading={tableLoading} - locale={{ - emptyText: , - }} - pagination={false} - rowKey={(record) => record.id} - size="small" - /> - + + columns={tableColumns} + dataSource={tableData} + loading={loading} + locale={{ + emptyText: , + }} + pagination={false} + rowKey={(record) => record.id} + size="small" + /> ); }; diff --git a/ui/src/components/workflow/WorkflowRunDetailDrawer.tsx b/ui/src/components/workflow/WorkflowRunDetailDrawer.tsx index 4419062cc..77d6f3a48 100644 --- a/ui/src/components/workflow/WorkflowRunDetailDrawer.tsx +++ b/ui/src/components/workflow/WorkflowRunDetailDrawer.tsx @@ -1,6 +1,6 @@ import { startTransition, useCallback, useState } from "react"; import { IconX } from "@tabler/icons-react"; -import { useControllableValue } from "ahooks"; +import { useControllableValue, useGetState } from "ahooks"; import { Button, Drawer, Flex } from "antd"; import Show from "@/components/Show"; @@ -64,8 +64,9 @@ const WorkflowRunDetailDrawer = ({ afterClose, data, loading, trigger, ...props const useDrawer = () => { type DataType = WorkflowRunDetailDrawerProps["data"]; - const [data, setData] = useState(); - const [open, setOpen] = useState(false); + const [data, setData, getData] = useGetState(); + const [loading, setLoading] = useState(); + const [open, setOpen] = useState(false); const onOpenChange = useCallback((open: boolean) => { setOpen(open); @@ -77,17 +78,34 @@ const useDrawer = () => { startTransition(() => { if (!open) { setData(void 0); + setLoading(void 0); } }); }, data, + loading, open, onOpenChange, }, - open: (data: NonNullable) => { + open: ({ data, loading }: { data: NonNullable; loading?: boolean }) => { setData(data); + setLoading(loading); setOpen(true); + + return { + safeUpdate: ({ data, loading }: { data?: NonNullable; loading?: boolean }) => { + if (data != null) { + if (data.id !== getData()?.id) return; // 确保数据不脏读 + + setData(data); + } + + if (loading != null) { + setLoading(loading); + } + }, + }; }, close: () => { setOpen(false); diff --git a/ui/src/components/workflow/designer/Designer.tsx b/ui/src/components/workflow/designer/Designer.tsx index 8acb7e65b..a93b1710b 100644 --- a/ui/src/components/workflow/designer/Designer.tsx +++ b/ui/src/components/workflow/designer/Designer.tsx @@ -26,6 +26,8 @@ export interface DesignerProps { className?: string; style?: React.CSSProperties; children?: React.ReactNode; + defaultEditorState?: string; + defaultLayout?: string; initialData?: FlowDocumentJSON; readonly?: boolean; onDocumentChange?: (ctx: FixedLayoutPluginContext) => void; @@ -39,7 +41,7 @@ export interface DesignerInstance extends FixedLayoutPluginContext { } const Designer = forwardRef( - ({ className, style, children, initialData, readonly, onDocumentChange, onNodeChange, onNodeClick }, ref) => { + ({ className, style, children, defaultEditorState, defaultLayout, initialData, readonly, onDocumentChange, onNodeChange, onNodeClick }, ref) => { const { token: themeToken } = theme.useToken(); const rendered = useRef(false); @@ -47,6 +49,8 @@ const Designer = forwardRef( const flowgramEditorRef = useRef(null); const flowgramEditorProps = useMemo( () => ({ + defaultLayout: defaultLayout, + initialData: initialData, constants: { @@ -121,9 +125,13 @@ const Designer = forwardRef( ], onInit: (ctx) => { - const maybeMobile = ["android", "ios", "iphone", "ipad", "micromessenger"].some((s) => navigator.userAgent.includes(s)); - if (maybeMobile) { - ctx.playground.editorState.changeState(EditorState.STATE_MOUSE_FRIENDLY_SELECT.id); + if (defaultEditorState != null) { + ctx.playground.editorState.changeState(defaultEditorState); + } else { + const maybeMobile = ["android", "ios", "iphone", "ipad", "micromessenger"].some((s) => navigator.userAgent.includes(s)); + if (maybeMobile) { + ctx.playground.editorState.changeState(EditorState.STATE_MOUSE_FRIENDLY_SELECT.id); + } } }, @@ -136,7 +144,7 @@ const Designer = forwardRef( }, 1); }, }), - [themeToken, initialData, readonly, onDocumentChange] + [defaultEditorState, defaultLayout, initialData, readonly, onDocumentChange, themeToken] ); useEffect(() => { diff --git a/ui/src/components/workflow/designer/NodeDrawer.tsx b/ui/src/components/workflow/designer/NodeDrawer.tsx index c7e6ade74..c33ad67b1 100644 --- a/ui/src/components/workflow/designer/NodeDrawer.tsx +++ b/ui/src/components/workflow/designer/NodeDrawer.tsx @@ -10,6 +10,7 @@ import BizMonitorNodeConfigDrawer from "./forms/BizMonitorNodeConfigDrawer"; import BizNotifyNodeConfigDrawer from "./forms/BizNotifyNodeConfigDrawer"; import BizUploadNodeConfigDrawer from "./forms/BizUploadNodeConfigDrawer"; import BranchBlockNodeConfigDrawer from "./forms/BranchBlockNodeConfigDrawer"; +import DelayNodeConfigDrawer from "./forms/DelayNodeConfigDrawer"; import StartNodeConfigDrawer from "./forms/StartNodeConfigDrawer"; import { NodeType } from "./nodes/typings"; @@ -50,6 +51,10 @@ const NodeDrawer = ({ node, trigger, ...props }: NodeDrawerProps) => { {node?.flowNodeType === NodeType.Start ? ( + ) : node?.flowNodeType === NodeType.Delay ? ( + + ) : node?.flowNodeType === NodeType.BranchBlock ? ( + ) : node?.flowNodeType === NodeType.BizApply ? ( ) : node?.flowNodeType === NodeType.BizUpload ? ( @@ -60,8 +65,6 @@ const NodeDrawer = ({ node, trigger, ...props }: NodeDrawerProps) => { ) : node?.flowNodeType === NodeType.BizNotify ? ( - ) : node?.flowNodeType === NodeType.BranchBlock ? ( - ) : ( <> )} @@ -72,7 +75,7 @@ const NodeDrawer = ({ node, trigger, ...props }: NodeDrawerProps) => { const useDrawer = () => { type NodeDataType = NodeDrawerProps["node"]; const [node, setNode] = useState(); - const [open, setOpen] = useState(false); + const [open, setOpen] = useState(false); const onOpenChange = useCallback((open: boolean) => { setOpen(open); diff --git a/ui/src/components/workflow/designer/Toolbar.tsx b/ui/src/components/workflow/designer/Toolbar.tsx index 8759b0c86..0edbe95d9 100644 --- a/ui/src/components/workflow/designer/Toolbar.tsx +++ b/ui/src/components/workflow/designer/Toolbar.tsx @@ -1,9 +1,10 @@ -import { useCallback, useEffect, useState } from "react"; +import { useCallback, useEffect, useMemo, useState } from "react"; import { useTranslation } from "react-i18next"; import { EditorState, FlowLayoutDefault, useClientContext, usePlaygroundTools, useRefresh } from "@flowgram.ai/fixed-layout-editor"; import { IconHandStop, IconLayoutCards, IconMatrix, IconMaximize, IconMinus, IconPlus } from "@tabler/icons-react"; -import { Button, Dropdown, Tooltip } from "antd"; +import { Button, type ButtonProps, Dropdown, Tooltip } from "antd"; +import Show from "@/components/Show"; import { mergeCls } from "@/utils/css"; import Minimap from "./Minimap"; @@ -11,9 +12,26 @@ import Minimap from "./Minimap"; export interface ToolbarProps { className?: string; style?: React.CSSProperties; + size?: ButtonProps["size"]; + showLayout?: boolean; + showMinimap?: boolean; + showMouseState?: boolean; + showZoom?: boolean; + showZoomFit?: boolean; + showZoomLevel?: boolean; } -const Toolbar = ({ className, style }: ToolbarProps) => { +const Toolbar = ({ + className, + style, + size, + showLayout = true, + showMinimap = true, + showMouseState = true, + showZoom = true, + showZoomFit = true, + showZoomLevel = true, +}: ToolbarProps) => { const { t } = useTranslation(); const ctx = useClientContext(); @@ -29,6 +47,12 @@ const Toolbar = ({ className, style }: ToolbarProps) => { return () => d.dispose(); }, [playground]); + const buttonIconSize = useMemo(() => { + if (size === "large") return "1.5em"; + if (size === "small") return "1em"; + return "1.25em"; + }, [size]); + const [isMinimapVisible, setIsMinimapVisible] = useState(() => window.screen.availWidth >= 1024); const [isMouseFriendly, setIsMouseFriendly] = useState(() => playground.editorState.is(EditorState.STATE_MOUSE_FRIENDLY_SELECT.id)); @@ -58,55 +82,80 @@ const Toolbar = ({ className, style }: ToolbarProps) => { return (
- - - - - + + + +
); diff --git a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderAliyunCLB.tsx b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderAliyunCLB.tsx index e20b91635..f3f1ee94f 100644 --- a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderAliyunCLB.tsx +++ b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderAliyunCLB.tsx @@ -107,7 +107,7 @@ const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) region: z.string().nonempty(t("workflow_node.deploy.form.aliyun_clb_region.placeholder")), resourceType: z.literal([RESOURCE_TYPE_LOADBALANCER, RESOURCE_TYPE_LISTENER], t("workflow_node.deploy.form.aliyun_clb_resource_type.placeholder")), loadbalancerId: z.string().nonempty(t("workflow_node.deploy.form.aliyun_clb_loadbalancer_id.placeholder")), - listenerPort: z.preprocess((v) => (v == null || v === "" ? undefined : Number(v)), z.number().nullish()), + listenerPort: z.preprocess((v) => (v == null || v === "" ? void 0 : Number(v)), z.number().nullish()), domain: z .string() .nullish() diff --git a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderBaiduCloudAppBLB.tsx b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderBaiduCloudAppBLB.tsx index a52ff49f4..bace7c3a9 100644 --- a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderBaiduCloudAppBLB.tsx +++ b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderBaiduCloudAppBLB.tsx @@ -107,7 +107,7 @@ const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) region: z.string().nonempty(t("workflow_node.deploy.form.baiducloud_appblb_region.placeholder")), resourceType: z.literal([RESOURCE_TYPE_LOADBALANCER, RESOURCE_TYPE_LISTENER], t("workflow_node.deploy.form.baiducloud_appblb_resource_type.placeholder")), loadbalancerId: z.string().nonempty(t("workflow_node.deploy.form.baiducloud_appblb_loadbalancer_id.placeholder")), - listenerPort: z.preprocess((v) => (v == null || v === "" ? undefined : Number(v)), z.number().nullish()), + listenerPort: z.preprocess((v) => (v == null || v === "" ? void 0 : Number(v)), z.number().nullish()), domain: z .string() .nullish() diff --git a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderBaiduCloudBLB.tsx b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderBaiduCloudBLB.tsx index 4b2fd05d6..c4663e9ff 100644 --- a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderBaiduCloudBLB.tsx +++ b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderBaiduCloudBLB.tsx @@ -107,7 +107,7 @@ const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) region: z.string().nonempty(t("workflow_node.deploy.form.baiducloud_blb_region.placeholder")), resourceType: z.literal([RESOURCE_TYPE_LOADBALANCER, RESOURCE_TYPE_LISTENER], t("workflow_node.deploy.form.baiducloud_blb_resource_type.placeholder")), loadbalancerId: z.string().nonempty(t("workflow_node.deploy.form.baiducloud_blb_loadbalancer_id.placeholder")), - listenerPort: z.preprocess((v) => (v == null || v === "" ? undefined : Number(v)), z.number().nullish()), + listenerPort: z.preprocess((v) => (v == null || v === "" ? void 0 : Number(v)), z.number().nullish()), domain: z .string() .nullish() diff --git a/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigForm.tsx b/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigForm.tsx index 3d86d8d60..881e075c3 100644 --- a/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigForm.tsx +++ b/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigForm.tsx @@ -168,7 +168,7 @@ const BizNotifyNodeConfigForm = ({ node, ...props }: BizNotifyNodeConfigFormProp showSearch onChange={handleProviderAccessSelect} onFilter={(_, option) => { - if (option.reserve !== "notification") return false; + if (option.reserve !== "notif") return false; const provider = accessProvidersMap.get(option.provider); return !!provider?.usages?.includes(ACCESS_USAGES.NOTIFICATION); diff --git a/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigFormProviderTelegramBot.tsx b/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigFormProviderTelegramBot.tsx index c085e79ed..2c4ba7ae7 100644 --- a/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigFormProviderTelegramBot.tsx +++ b/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigFormProviderTelegramBot.tsx @@ -40,7 +40,7 @@ const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) return z.object({ chatId: z .preprocess( - (v) => (v == null || v === "" ? undefined : Number(v)), + (v) => (v == null || v === "" ? void 0 : Number(v)), z .number() .nullish() diff --git a/ui/src/components/workflow/designer/forms/BranchBlockNodeConfigFormExpressionEditor.tsx b/ui/src/components/workflow/designer/forms/BranchBlockNodeConfigExprInputBox.tsx similarity index 95% rename from ui/src/components/workflow/designer/forms/BranchBlockNodeConfigFormExpressionEditor.tsx rename to ui/src/components/workflow/designer/forms/BranchBlockNodeConfigExprInputBox.tsx index 4240bd03d..0fa1799b4 100644 --- a/ui/src/components/workflow/designer/forms/BranchBlockNodeConfigFormExpressionEditor.tsx +++ b/ui/src/components/workflow/designer/forms/BranchBlockNodeConfigExprInputBox.tsx @@ -21,7 +21,7 @@ import { useNodeFormContext } from "./_context"; import { getAllPreviousNodes } from "../_util"; import { NodeType } from "../nodes/typings"; -export interface BranchBlockNodeConfigFormExpressionEditorProps { +export interface BranchBlockNodeConfigExprInputBoxProps { className?: string; style?: React.CSSProperties; defaultValue?: Expr; @@ -29,8 +29,8 @@ export interface BranchBlockNodeConfigFormExpressionEditorProps { onChange?: (value: Expr) => void; } -export interface BranchBlockNodeConfigFormExpressionEditorInstance { - validate: () => Promise; +export interface BranchBlockNodeConfigExprInputBoxInstance { + validate: () => Promise; } // 表单内部使用的扁平结构 @@ -50,7 +50,7 @@ type ConditionFormValues = { logicalOperator: ExprLogicalOperator; }; -const exprToFormValues = (expr?: Expr): ConditionFormValues => { +const exprToFormValues = (expr: Expr | undefined): ConditionFormValues => { if (!expr) return getInitialValues(); const conditions: ConditionItem[] = []; @@ -60,9 +60,9 @@ const exprToFormValues = (expr?: Expr): ConditionFormValues => { if (expr.type === ExprType.Comparison) { if (expr.left.type == ExprType.Variant && expr.right.type == ExprType.Constant) { conditions.push({ - leftSelector: expr.left.selector?.id != null ? `${expr.left.selector.id}#${expr.left.selector.name}#${expr.left.selector.type}` : undefined, - operator: expr.operator != null ? expr.operator : undefined, - rightValue: expr.right?.value != null ? String(expr.right.value) : undefined, + leftSelector: expr.left.selector?.id != null ? `${expr.left.selector.id}#${expr.left.selector.name}#${expr.left.selector.type}` : void 0, + operator: expr.operator != null ? expr.operator : void 0, + rightValue: expr.right?.value != null ? String(expr.right.value) : void 0, }); } else { console.warn("[certimate] invalid comparison expression: left must be a variant and right must be a constant", expr); @@ -113,14 +113,14 @@ const formValuesToExpr = (values: ConditionFormValues): Expr | undefined => { }; if (values.conditions.length === 0) { - return undefined; + return; } // 只有一个条件时,直接返回比较表达式 if (values.conditions.length === 1) { const { leftSelector, operator, rightValue } = values.conditions[0]; if (!leftSelector || !operator || !rightValue) { - return undefined; + return; } return wrapExpr(values.conditions[0]); } @@ -138,7 +138,7 @@ const formValuesToExpr = (values: ConditionFormValues): Expr | undefined => { return expr; }; -const BranchBlockNodeConfigFormExpressionEditor = forwardRef( +const BranchBlockNodeConfigExprInputBox = forwardRef( ({ className, style, ...props }, ref) => { const { t } = useTranslation(); @@ -153,7 +153,7 @@ const BranchBlockNodeConfigFormExpressionEditor = forwardRef(); - const formName = useAntdFormName({ form: formInst, name: "workflowNodeBranchBlockConfigFormExpressionEditorForm" }); + const formName = useAntdFormName({ form: formInst, name: "workflowNodeBranchBlockConfigExprInputBoxForm" }); const [formModel, setFormModel] = useState(getInitialValues()); useEffect(() => { @@ -253,8 +253,9 @@ const BranchBlockNodeConfigFormExpressionEditor = forwardRef { await formInst.validateFields(); + return formValuesToExpr(formInst.getFieldsValue()); }, - } as BranchBlockNodeConfigFormExpressionEditorInstance; + }; }); return ( @@ -315,7 +316,7 @@ const BranchBlockNodeConfigFormExpressionEditor = forwardRef