From 8a991c1cb0da1a89004f3609df6ab3aace6dd2de Mon Sep 17 00:00:00 2001 From: abelanger5 Date: Sun, 30 Jun 2024 11:38:39 -0400 Subject: [PATCH 1/9] fix(go-sdk): add schedule timeout (#673) * fix(go-sdk): add schedule timeout * chore: lint --- frontend/app/src/lib/api/generated/http-client.ts | 3 +++ frontend/docs/pages/home/features/timeouts.mdx | 2 +- pkg/client/admin.go | 4 ++++ pkg/client/types/file.go | 2 ++ pkg/repository/prisma/dbsqlc/step_runs.sql | 4 +++- pkg/repository/prisma/dbsqlc/step_runs.sql.go | 4 +++- pkg/worker/workflow.go | 9 ++++++--- 7 files changed, 22 insertions(+), 6 deletions(-) diff --git a/frontend/app/src/lib/api/generated/http-client.ts b/frontend/app/src/lib/api/generated/http-client.ts index 906d7c4da..953b6103c 100644 --- a/frontend/app/src/lib/api/generated/http-client.ts +++ b/frontend/app/src/lib/api/generated/http-client.ts @@ -88,6 +88,9 @@ export class HttpClient { } protected createFormData(input: Record): FormData { + if (input instanceof FormData) { + return input; + } return Object.keys(input || {}).reduce((formData, key) => { const property = input[key]; const propertyContent: any[] = property instanceof Array ? property : [property]; diff --git a/frontend/docs/pages/home/features/timeouts.mdx b/frontend/docs/pages/home/features/timeouts.mdx index 23e4f1f99..4e0815e09 100644 --- a/frontend/docs/pages/home/features/timeouts.mdx +++ b/frontend/docs/pages/home/features/timeouts.mdx @@ -54,7 +54,7 @@ const myWorkflow: Workflow = { cleanup, err := run(events, worker.WorkflowJob{ Name: "timeout", Description: "timeout", - ScheduleTimeoutAt: "2m", + ScheduleTimeout: "2m", Steps: []*worker.WorkflowStep{ worker.Fn(func(ctx worker.HatchetContext) (result *stepOneOutput, err error) { time.Sleep(time.Second * 60) diff --git a/pkg/client/admin.go b/pkg/client/admin.go index 879347724..b9c85ae61 100644 --- a/pkg/client/admin.go +++ b/pkg/client/admin.go @@ -284,6 +284,10 @@ func (a *adminClientImpl) getPutRequest(workflow *types.Workflow) (*admincontrac } } + if workflow.ScheduleTimeout != "" { + opts.ScheduleTimeout = &workflow.ScheduleTimeout + } + if workflow.OnFailureJob != nil { onFailureJob, err := a.getJobOpts("on-failure", workflow.OnFailureJob) diff --git a/pkg/client/types/file.go b/pkg/client/types/file.go index 6ce85aa0d..911c11942 100644 --- a/pkg/client/types/file.go +++ b/pkg/client/types/file.go @@ -12,6 +12,8 @@ import ( type Workflow struct { Name string `yaml:"name,omitempty"` + ScheduleTimeout string `yaml:"scheduleTimeout,omitempty"` + Concurrency *WorkflowConcurrency `yaml:"concurrency,omitempty"` Version string `yaml:"version,omitempty"` diff --git a/pkg/repository/prisma/dbsqlc/step_runs.sql b/pkg/repository/prisma/dbsqlc/step_runs.sql index 84b0ea2a8..c6f2335c6 100644 --- a/pkg/repository/prisma/dbsqlc/step_runs.sql +++ b/pkg/repository/prisma/dbsqlc/step_runs.sql @@ -382,7 +382,9 @@ SET "status" = 'PENDING_ASSIGNMENT', -- requeue after now plus 4 seconds "requeueAfter" = CURRENT_TIMESTAMP + INTERVAL '4 seconds', - "updatedAt" = CURRENT_TIMESTAMP + "updatedAt" = CURRENT_TIMESTAMP, + -- unset the schedule timeout + "scheduleTimeoutAt" = NULL FROM locked_step_runs WHERE diff --git a/pkg/repository/prisma/dbsqlc/step_runs.sql.go b/pkg/repository/prisma/dbsqlc/step_runs.sql.go index 5210486c9..fe1093e11 100644 --- a/pkg/repository/prisma/dbsqlc/step_runs.sql.go +++ b/pkg/repository/prisma/dbsqlc/step_runs.sql.go @@ -974,7 +974,9 @@ SET "status" = 'PENDING_ASSIGNMENT', -- requeue after now plus 4 seconds "requeueAfter" = CURRENT_TIMESTAMP + INTERVAL '4 seconds', - "updatedAt" = CURRENT_TIMESTAMP + "updatedAt" = CURRENT_TIMESTAMP, + -- unset the schedule timeout + "scheduleTimeoutAt" = NULL FROM locked_step_runs WHERE diff --git a/pkg/worker/workflow.go b/pkg/worker/workflow.go index 1fe03c082..e7e6f3cde 100644 --- a/pkg/worker/workflow.go +++ b/pkg/worker/workflow.go @@ -149,6 +149,8 @@ type WorkflowJob struct { Steps []*WorkflowStep OnFailure *WorkflowJob + + ScheduleTimeout string } type WorkflowConcurrency struct { @@ -195,9 +197,10 @@ func (j *WorkflowJob) ToWorkflow(svcName string, namespace string) types.Workflo } w := types.Workflow{ - Name: namespace + j.Name, - Jobs: jobs, - OnFailureJob: onFailureJob, + Name: namespace + j.Name, + Jobs: jobs, + OnFailureJob: onFailureJob, + ScheduleTimeout: j.ScheduleTimeout, } if j.Concurrency != nil { From 792f0a559f992734fd9888bd6e76524ab76d8ef7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Jul 2024 05:21:58 +0000 Subject: [PATCH 2/9] chore(deps): bump github.com/gorilla/schema from 1.4.0 to 1.4.1 (#676) Bumps [github.com/gorilla/schema](https://github.com/gorilla/schema) from 1.4.0 to 1.4.1. - [Release notes](https://github.com/gorilla/schema/releases) - [Commits](https://github.com/gorilla/schema/compare/v1.4.0...v1.4.1) --- updated-dependencies: - dependency-name: github.com/gorilla/schema dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 4d4e82ea3..bd0cfe8bd 100644 --- a/go.mod +++ b/go.mod @@ -102,7 +102,7 @@ require ( github.com/goccy/go-json v0.10.3 github.com/golang/protobuf v1.5.4 // indirect github.com/google/uuid v1.6.0 - github.com/gorilla/schema v1.4.0 + github.com/gorilla/schema v1.4.1 github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect diff --git a/go.sum b/go.sum index ac222be41..c90d245a3 100644 --- a/go.sum +++ b/go.sum @@ -124,8 +124,8 @@ github.com/googleapis/gax-go/v2 v2.12.5 h1:8gw9KZK8TiVKB6q3zHY3SBzLnrGp6HQjyfYBY github.com/googleapis/gax-go/v2 v2.12.5/go.mod h1:BUDKcWo+RaKq5SC9vVYL0wLADa3VcfswbOMMRmB9H3E= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= -github.com/gorilla/schema v1.4.0 h1:l2N+lRTJtev9SUhBtj6NmSxd/6+8LhvN0kV+H2Y8R9k= -github.com/gorilla/schema v1.4.0/go.mod h1:Dg5SSm5PV60mhF2NFaTV1xuYYj8tV8NOPRo4FggUMnM= +github.com/gorilla/schema v1.4.1 h1:jUg5hUjCSDZpNGLuXQOgIWGdlgrIdYvgQ0wZtdK1M3E= +github.com/gorilla/schema v1.4.1/go.mod h1:Dg5SSm5PV60mhF2NFaTV1xuYYj8tV8NOPRo4FggUMnM= github.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA= github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo= github.com/gorilla/sessions v1.3.0 h1:XYlkq7KcpOB2ZhHBPv5WpjMIxrQosiZanfoy1HLZFzg= From 8a8a033af637963bc25233f5a4a291b85e785005 Mon Sep 17 00:00:00 2001 From: Gabe Ruttner Date: Mon, 1 Jul 2024 08:47:32 -0700 Subject: [PATCH 3/9] feat: variable token expiration (#670) * feat: variable token expiration * fix: typo * fix: long tokens for webhook workers * fix: format --- .../components/schemas/api_tokens.yaml | 5 + api/v1/server/handlers/api-tokens/create.go | 19 +- api/v1/server/oas/gen/openapi.gen.go | 273 +++++++++--------- cmd/hatchet-admin/cli/token.go | 19 +- .../src/lib/api/generated/data-contracts.ts | 2 + .../components/create-token-dialog.tsx | 45 ++- internal/services/webhooks/webhooks.go | 5 +- internal/testutils/env.go | 2 +- pkg/auth/token/token.go | 26 +- pkg/auth/token/token_test.go | 6 +- pkg/client/rest/gen.go | 3 + 11 files changed, 248 insertions(+), 157 deletions(-) diff --git a/api-contracts/openapi/components/schemas/api_tokens.yaml b/api-contracts/openapi/components/schemas/api_tokens.yaml index e88d569f7..2929ec73b 100644 --- a/api-contracts/openapi/components/schemas/api_tokens.yaml +++ b/api-contracts/openapi/components/schemas/api_tokens.yaml @@ -23,6 +23,11 @@ CreateAPITokenRequest: type: string description: A name for the API token. maxLength: 255 + expiresIn: + type: string + description: The duration for which the token is valid. + x-oapi-codegen-extra-tags: + validate: "omitnil,duration" required: - name diff --git a/api/v1/server/handlers/api-tokens/create.go b/api/v1/server/handlers/api-tokens/create.go index ab229b34c..78fce53e8 100644 --- a/api/v1/server/handlers/api-tokens/create.go +++ b/api/v1/server/handlers/api-tokens/create.go @@ -1,8 +1,11 @@ package apitokens import ( + "time" + "github.com/labstack/echo/v4" + "github.com/hatchet-dev/hatchet/api/v1/server/oas/apierrors" "github.com/hatchet-dev/hatchet/api/v1/server/oas/gen" "github.com/hatchet-dev/hatchet/pkg/repository/prisma/db" ) @@ -17,7 +20,21 @@ func (a *APITokenService) ApiTokenCreate(ctx echo.Context, request gen.ApiTokenC return gen.ApiTokenCreate400JSONResponse(*apiErrors), nil } - token, err := a.config.Auth.JWTManager.GenerateTenantToken(ctx.Request().Context(), tenant.ID, request.Body.Name) + var expiresAt *time.Time + + if request.Body.ExpiresIn != nil { + expiresIn, err := time.ParseDuration(*request.Body.ExpiresIn) + + if err != nil { + return gen.ApiTokenCreate400JSONResponse(apierrors.NewAPIErrors("invalid expiration duration")), nil + } + + e := time.Now().UTC().Add(expiresIn) + + expiresAt = &e + } + + token, err := a.config.Auth.JWTManager.GenerateTenantToken(ctx.Request().Context(), tenant.ID, request.Body.Name, expiresAt) if err != nil { return nil, err diff --git a/api/v1/server/oas/gen/openapi.gen.go b/api/v1/server/oas/gen/openapi.gen.go index 8af86d157..5af423c25 100644 --- a/api/v1/server/oas/gen/openapi.gen.go +++ b/api/v1/server/oas/gen/openapi.gen.go @@ -234,6 +234,9 @@ type AcceptInviteRequest struct { // CreateAPITokenRequest defines model for CreateAPITokenRequest. type CreateAPITokenRequest struct { + // ExpiresIn The duration for which the token is valid. + ExpiresIn *string `json:"expiresIn,omitempty" validate:"omitnil,duration"` + // Name A name for the API token. Name string `json:"name"` } @@ -7952,141 +7955,141 @@ var swaggerSpec = []string{ "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", - "AA==", + "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", + "o5IXGY78Y99/uX353wAAAP//yN1jl4B0AQA=", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/cmd/hatchet-admin/cli/token.go b/cmd/hatchet-admin/cli/token.go index 6589fcdd2..c925818f2 100644 --- a/cmd/hatchet-admin/cli/token.go +++ b/cmd/hatchet-admin/cli/token.go @@ -5,6 +5,7 @@ import ( "fmt" "log" "os" + "time" "github.com/spf13/cobra" @@ -15,6 +16,7 @@ import ( var ( tokenTenantId string tokenName string + expiresIn time.Duration ) var tokenCmd = &cobra.Command{ @@ -26,7 +28,7 @@ var tokenCreateAPICmd = &cobra.Command{ Use: "create", Short: "create a new API token.", Run: func(cmd *cobra.Command, args []string) { - err := runCreateAPIToken() + err := runCreateAPIToken(expiresIn) if err != nil { log.Printf("Fatal: could not run [token create] command: %v", err) @@ -55,9 +57,18 @@ func init() { "default", "the name of the token", ) + + tokenCreateAPICmd.PersistentFlags().DurationVarP( + &expiresIn, + "expiresIn", + "e", + 90*24*time.Hour, + "Expiration duration for the API token", + ) + } -func runCreateAPIToken() error { +func runCreateAPIToken(expiresIn time.Duration) error { // read in the local config configLoader := loader.NewConfigLoader(configDirectory) @@ -77,7 +88,9 @@ func runCreateAPIToken() error { defer serverConf.Disconnect() // nolint:errcheck - defaultTok, err := serverConf.Auth.JWTManager.GenerateTenantToken(context.Background(), tokenTenantId, tokenName) + expiresAt := time.Now().UTC().Add(expiresIn) + + defaultTok, err := serverConf.Auth.JWTManager.GenerateTenantToken(context.Background(), tokenTenantId, tokenName, &expiresAt) if err != nil { return err diff --git a/frontend/app/src/lib/api/generated/data-contracts.ts b/frontend/app/src/lib/api/generated/data-contracts.ts index 117f04452..fa1cb0fd2 100644 --- a/frontend/app/src/lib/api/generated/data-contracts.ts +++ b/frontend/app/src/lib/api/generated/data-contracts.ts @@ -885,6 +885,8 @@ export interface CreateAPITokenRequest { * @maxLength 255 */ name: string; + /** The duration for which the token is valid. */ + expiresIn?: string; } export interface CreateAPITokenResponse { diff --git a/frontend/app/src/pages/main/tenant-settings/api-tokens/components/create-token-dialog.tsx b/frontend/app/src/pages/main/tenant-settings/api-tokens/components/create-token-dialog.tsx index b41326387..e19da40b1 100644 --- a/frontend/app/src/pages/main/tenant-settings/api-tokens/components/create-token-dialog.tsx +++ b/frontend/app/src/pages/main/tenant-settings/api-tokens/components/create-token-dialog.tsx @@ -5,16 +5,30 @@ import { } from '@/components/ui/dialog'; import { Button } from '@/components/ui/button'; import { z } from 'zod'; -import { useForm } from 'react-hook-form'; +import { Controller, useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { Label } from '@/components/ui/label'; import { Input } from '@/components/ui/input'; import { cn } from '@/lib/utils'; import { Spinner } from '@/components/ui/loading'; import { CodeHighlighter } from '@/components/ui/code-highlighter'; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from '@/components/ui/select'; + +export const EXPIRES_IN_OPTS = { + '3 months': `${3 * 30 * 24 * 60 * 60}s`, + '1 year': `${365 * 24 * 60 * 60}s`, + '100 years': `${100 * 365 * 24 * 60 * 60}s`, +}; const schema = z.object({ name: z.string().min(1).max(255), + expiresIn: z.string().optional(), }); interface CreateTokenDialogProps { @@ -33,6 +47,7 @@ export function CreateTokenDialog({ const { register, handleSubmit, + control, formState: { errors }, } = useForm>({ resolver: zodResolver(schema), @@ -62,8 +77,6 @@ export function CreateTokenDialog({ ); } - // TODO: add a name for the token - return ( @@ -90,6 +103,32 @@ export function CreateTokenDialog({
{nameError}
)} + + { + return ( + + ); + }} + /> + + + ); + }; + const PlatformPicker = () => ( <>
@@ -125,6 +135,11 @@ export default function GetStarted() { ))}
+ {!platform && ( +
+ +
+ )} {platform && (
+
)} From 461eda194a8f858f30c880a1bd5117e4f88c0f1f Mon Sep 17 00:00:00 2001 From: Gabe Ruttner Date: Mon, 1 Jul 2024 11:44:12 -0700 Subject: [PATCH 5/9] feat: worker paused state (#677) * feat: worker paused state * feat: ui * fix: comment --- .../openapi/components/schemas/_index.yaml | 2 + .../openapi/components/schemas/worker.yaml | 8 + .../openapi/paths/worker/worker.yaml | 43 ++ api/v1/server/handlers/workers/list.go | 2 +- api/v1/server/handlers/workers/update.go | 35 ++ api/v1/server/oas/gen/openapi.gen.go | 410 +++++++++++------- api/v1/server/oas/transformers/worker.go | 16 +- frontend/app/src/lib/api/generated/Api.ts | 20 + .../src/lib/api/generated/data-contracts.ts | 7 +- .../src/pages/main/workers/$worker/index.tsx | 110 +++-- .../main/workers/components/worker-table.tsx | 3 +- pkg/client/rest/gen.go | 172 ++++++++ pkg/repository/prisma/db/db_gen.go | 162 ++++++- .../prisma/dbsqlc/get_group_key_runs.sql | 1 + .../prisma/dbsqlc/get_group_key_runs.sql.go | 1 + pkg/repository/prisma/dbsqlc/models.go | 1 + pkg/repository/prisma/dbsqlc/schema.sql | 1 + pkg/repository/prisma/dbsqlc/step_runs.sql | 3 + pkg/repository/prisma/dbsqlc/step_runs.sql.go | 3 + pkg/repository/prisma/dbsqlc/workers.sql | 3 +- pkg/repository/prisma/dbsqlc/workers.sql.go | 25 +- pkg/repository/prisma/worker.go | 25 ++ pkg/repository/worker.go | 6 + .../20240701144845_v0_35_0/migration.sql | 2 + prisma/schema.prisma | 5 +- sql/migrations/20240701144852_v0_35_0.sql | 2 + sql/migrations/atlas.sum | 3 +- sql/schema/schema.sql | 1 + 28 files changed, 877 insertions(+), 195 deletions(-) create mode 100644 api/v1/server/handlers/workers/update.go create mode 100644 prisma/migrations/20240701144845_v0_35_0/migration.sql create mode 100644 sql/migrations/20240701144852_v0_35_0.sql diff --git a/api-contracts/openapi/components/schemas/_index.yaml b/api-contracts/openapi/components/schemas/_index.yaml index 9f9defa0f..f7c72a885 100644 --- a/api-contracts/openapi/components/schemas/_index.yaml +++ b/api-contracts/openapi/components/schemas/_index.yaml @@ -162,6 +162,8 @@ WorkerList: $ref: "./worker.yaml#/WorkerList" Worker: $ref: "./worker.yaml#/Worker" +UpdateWorkerRequest: + $ref: "./worker.yaml#/UpdateWorkerRequest" APIToken: $ref: "./api_tokens.yaml#/APIToken" CreateAPITokenRequest: diff --git a/api-contracts/openapi/components/schemas/worker.yaml b/api-contracts/openapi/components/schemas/worker.yaml index 5e1262ba0..8bda8da4f 100644 --- a/api-contracts/openapi/components/schemas/worker.yaml +++ b/api-contracts/openapi/components/schemas/worker.yaml @@ -31,6 +31,7 @@ Worker: enum: - ACTIVE - INACTIVE + - PAUSED maxRuns: type: integer description: The maximum number of runs this worker can execute concurrently. @@ -49,6 +50,13 @@ Worker: - name type: object +UpdateWorkerRequest: + properties: + isPaused: + type: boolean + description: Whether the worker is paused and cannot accept new runs. + type: object + WorkerList: properties: pagination: diff --git a/api-contracts/openapi/paths/worker/worker.yaml b/api-contracts/openapi/paths/worker/worker.yaml index 0ea437f9b..1d3c73626 100644 --- a/api-contracts/openapi/paths/worker/worker.yaml +++ b/api-contracts/openapi/paths/worker/worker.yaml @@ -37,6 +37,49 @@ withTenant: - Worker withWorker: + patch: + x-resources: ["tenant", "worker"] + description: Update a worker + operationId: worker:update + parameters: + - description: The worker id + in: path + name: worker + required: true + schema: + type: string + format: uuid + minLength: 36 + maxLength: 36 + requestBody: + content: + application/json: + schema: + $ref: "../../components/schemas/_index.yaml#/UpdateWorkerRequest" + description: The worker update + required: true + responses: + "200": + content: + application/json: + schema: + $ref: "../../components/schemas/_index.yaml#/Worker" + description: Successfully updated the worker + "400": + content: + application/json: + schema: + $ref: "../../components/schemas/_index.yaml#/APIErrors" + description: A malformed or bad request + "403": + content: + application/json: + schema: + $ref: "../../components/schemas/_index.yaml#/APIErrors" + description: Forbidden + summary: Update worker + tags: + - Worker get: x-resources: ["tenant", "worker"] description: Get a worker diff --git a/api/v1/server/handlers/workers/list.go b/api/v1/server/handlers/workers/list.go index 5f461865a..2cae8c8f2 100644 --- a/api/v1/server/handlers/workers/list.go +++ b/api/v1/server/handlers/workers/list.go @@ -30,7 +30,7 @@ func (t *WorkerService) WorkerList(ctx echo.Context, request gen.WorkerListReque workerCp := worker slots := int(worker.Slots) - rows[i] = *transformers.ToWorkerSqlc(&workerCp.Worker, &worker.RunningStepRuns, &slots) + rows[i] = *transformers.ToWorkerSqlc(&workerCp.Worker, &slots) } return gen.WorkerList200JSONResponse( diff --git a/api/v1/server/handlers/workers/update.go b/api/v1/server/handlers/workers/update.go new file mode 100644 index 000000000..60aaddf76 --- /dev/null +++ b/api/v1/server/handlers/workers/update.go @@ -0,0 +1,35 @@ +package workers + +import ( + "github.com/labstack/echo/v4" + + "github.com/hatchet-dev/hatchet/api/v1/server/oas/gen" + "github.com/hatchet-dev/hatchet/api/v1/server/oas/transformers" + "github.com/hatchet-dev/hatchet/pkg/repository" + "github.com/hatchet-dev/hatchet/pkg/repository/prisma/db" +) + +func (t *WorkerService) WorkerUpdate(ctx echo.Context, request gen.WorkerUpdateRequestObject) (gen.WorkerUpdateResponseObject, error) { + worker := ctx.Get("worker").(*db.WorkerModel) + + // validate the request + if apiErrors, err := t.config.Validator.ValidateAPI(request.Body); err != nil { + return nil, err + } else if apiErrors != nil { + return gen.WorkerUpdate400JSONResponse(*apiErrors), nil + } + + update := repository.ApiUpdateWorkerOpts{} + + if request.Body.IsPaused != nil { + update.IsPaused = request.Body.IsPaused + } + + updatedWorker, err := t.config.APIRepository.Worker().UpdateWorker(worker.TenantID, worker.ID, update) + + if err != nil { + return nil, err + } + + return gen.WorkerUpdate200JSONResponse(*transformers.ToWorkerSqlc(updatedWorker, nil)), nil +} diff --git a/api/v1/server/oas/gen/openapi.gen.go b/api/v1/server/oas/gen/openapi.gen.go index 5af423c25..d20084f09 100644 --- a/api/v1/server/oas/gen/openapi.gen.go +++ b/api/v1/server/oas/gen/openapi.gen.go @@ -121,6 +121,7 @@ const ( const ( ACTIVE WorkerStatus = "ACTIVE" INACTIVE WorkerStatus = "INACTIVE" + PAUSED WorkerStatus = "PAUSED" ) // Defines values for WorkflowConcurrencyLimitStrategy. @@ -779,6 +780,12 @@ type UpdateTenantRequest struct { Name *string `json:"name,omitempty"` } +// UpdateWorkerRequest defines model for UpdateWorkerRequest. +type UpdateWorkerRequest struct { + // IsPaused Whether the worker is paused and cannot accept new runs. + IsPaused *bool `json:"isPaused,omitempty"` +} + // User defines model for User. type User struct { // Email The email address of the user. @@ -1304,6 +1311,9 @@ type UserUpdatePasswordJSONRequestBody = UserChangePasswordRequest // UserCreateJSONRequestBody defines body for UserCreate for application/json ContentType. type UserCreateJSONRequestBody = UserRegisterRequest +// WorkerUpdateJSONRequestBody defines body for WorkerUpdate for application/json ContentType. +type WorkerUpdateJSONRequestBody = UpdateWorkerRequest + // WorkflowRunCreateJSONRequestBody defines body for WorkflowRunCreate for application/json ContentType. type WorkflowRunCreateJSONRequestBody = TriggerWorkflowRunRequest @@ -1507,6 +1517,9 @@ type ServerInterface interface { // Get worker // (GET /api/v1/workers/{worker}) WorkerGet(ctx echo.Context, worker openapi_types.UUID) error + // Update worker + // (PATCH /api/v1/workers/{worker}) + WorkerUpdate(ctx echo.Context, worker openapi_types.UUID) error // Delete workflow // (DELETE /api/v1/workflows/{workflow}) WorkflowDelete(ctx echo.Context, workflow openapi_types.UUID) error @@ -2978,6 +2991,26 @@ func (w *ServerInterfaceWrapper) WorkerGet(ctx echo.Context) error { return err } +// WorkerUpdate converts echo context to params. +func (w *ServerInterfaceWrapper) WorkerUpdate(ctx echo.Context) error { + var err error + // ------------- Path parameter "worker" ------------- + var worker openapi_types.UUID + + err = runtime.BindStyledParameterWithLocation("simple", false, "worker", runtime.ParamLocationPath, ctx.Param("worker"), &worker) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter worker: %s", err)) + } + + ctx.Set(BearerAuthScopes, []string{}) + + ctx.Set(CookieAuthScopes, []string{}) + + // Invoke the callback with all the unmarshaled arguments + err = w.Handler.WorkerUpdate(ctx, worker) + return err +} + // WorkflowDelete converts echo context to params. func (w *ServerInterfaceWrapper) WorkflowDelete(ctx echo.Context) error { var err error @@ -3235,6 +3268,7 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL router.GET(baseURL+"/api/v1/users/slack/callback", wrapper.UserUpdateSlackOauthCallback) router.DELETE(baseURL+"/api/v1/webhook-workers/:webhook", wrapper.WebhookDelete) router.GET(baseURL+"/api/v1/workers/:worker", wrapper.WorkerGet) + router.PATCH(baseURL+"/api/v1/workers/:worker", wrapper.WorkerUpdate) router.DELETE(baseURL+"/api/v1/workflows/:workflow", wrapper.WorkflowDelete) router.GET(baseURL+"/api/v1/workflows/:workflow", wrapper.WorkflowGet) router.GET(baseURL+"/api/v1/workflows/:workflow/metrics", wrapper.WorkflowGetMetrics) @@ -5615,6 +5649,42 @@ func (response WorkerGet403JSONResponse) VisitWorkerGetResponse(w http.ResponseW return json.NewEncoder(w).Encode(response) } +type WorkerUpdateRequestObject struct { + Worker openapi_types.UUID `json:"worker"` + Body *WorkerUpdateJSONRequestBody +} + +type WorkerUpdateResponseObject interface { + VisitWorkerUpdateResponse(w http.ResponseWriter) error +} + +type WorkerUpdate200JSONResponse Worker + +func (response WorkerUpdate200JSONResponse) VisitWorkerUpdateResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(200) + + return json.NewEncoder(w).Encode(response) +} + +type WorkerUpdate400JSONResponse APIErrors + +func (response WorkerUpdate400JSONResponse) VisitWorkerUpdateResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(400) + + return json.NewEncoder(w).Encode(response) +} + +type WorkerUpdate403JSONResponse APIErrors + +func (response WorkerUpdate403JSONResponse) VisitWorkerUpdateResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(403) + + return json.NewEncoder(w).Encode(response) +} + type WorkflowDeleteRequestObject struct { Workflow openapi_types.UUID `json:"workflow"` } @@ -6016,6 +6086,8 @@ type StrictServerInterface interface { WorkerGet(ctx echo.Context, request WorkerGetRequestObject) (WorkerGetResponseObject, error) + WorkerUpdate(ctx echo.Context, request WorkerUpdateRequestObject) (WorkerUpdateResponseObject, error) + WorkflowDelete(ctx echo.Context, request WorkflowDeleteRequestObject) (WorkflowDeleteResponseObject, error) WorkflowGet(ctx echo.Context, request WorkflowGetRequestObject) (WorkflowGetResponseObject, error) @@ -7774,6 +7846,37 @@ func (sh *strictHandler) WorkerGet(ctx echo.Context, worker openapi_types.UUID) return nil } +// WorkerUpdate operation middleware +func (sh *strictHandler) WorkerUpdate(ctx echo.Context, worker openapi_types.UUID) error { + var request WorkerUpdateRequestObject + + request.Worker = worker + + var body WorkerUpdateJSONRequestBody + if err := ctx.Bind(&body); err != nil { + return err + } + request.Body = &body + + handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + return sh.ssi.WorkerUpdate(ctx, request.(WorkerUpdateRequestObject)) + } + for _, middleware := range sh.middlewares { + handler = middleware(handler, "WorkerUpdate") + } + + response, err := handler(ctx, request) + + if err != nil { + return err + } else if validResponse, ok := response.(WorkerUpdateResponseObject); ok { + return validResponse.VisitWorkerUpdateResponse(ctx.Response()) + } else if response != nil { + return fmt.Errorf("Unexpected response type: %T", response) + } + return nil +} + // WorkflowDelete operation middleware func (sh *strictHandler) WorkflowDelete(ctx echo.Context, workflow openapi_types.UUID) error { var request WorkflowDeleteRequestObject @@ -7937,159 +8040,160 @@ func (sh *strictHandler) WorkflowVersionGetDefinition(ctx echo.Context, workflow // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "o5IXGY78Y99/uX353wAAAP//yN1jl4B0AQA=", + "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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/api/v1/server/oas/transformers/worker.go b/api/v1/server/oas/transformers/worker.go index 87f0b42d7..e52014c39 100644 --- a/api/v1/server/oas/transformers/worker.go +++ b/api/v1/server/oas/transformers/worker.go @@ -20,6 +20,10 @@ func ToWorker(worker *db.WorkerModel) *gen.Worker { status := gen.ACTIVE + if worker.IsPaused { + status = gen.PAUSED + } + if lastHeartbeat, ok := worker.LastHeartbeatAt(); ok && lastHeartbeat.Add(4*time.Second).Before(time.Now()) { status = gen.INACTIVE } @@ -63,7 +67,7 @@ func ToWorker(worker *db.WorkerModel) *gen.Worker { return res } -func ToWorkerSqlc(worker *dbsqlc.Worker, stepCount *int64, slots *int) *gen.Worker { +func ToWorkerSqlc(worker *dbsqlc.Worker, slots *int) *gen.Worker { dispatcherId := uuid.MustParse(pgUUIDToStr(worker.DispatcherId)) @@ -71,11 +75,19 @@ func ToWorkerSqlc(worker *dbsqlc.Worker, stepCount *int64, slots *int) *gen.Work status := gen.ACTIVE + if worker.IsPaused { + status = gen.PAUSED + } + if worker.LastHeartbeatAt.Time.Add(5 * time.Second).Before(time.Now()) { status = gen.INACTIVE } - availableRuns := maxRuns - *slots + var availableRuns int + + if slots != nil { + availableRuns = maxRuns - *slots + } res := &gen.Worker{ Metadata: *toAPIMetadata(pgUUIDToStr(worker.ID), worker.CreatedAt.Time, worker.UpdatedAt.Time), diff --git a/frontend/app/src/lib/api/generated/Api.ts b/frontend/app/src/lib/api/generated/Api.ts index ee2f1bad7..7d07c8e5a 100644 --- a/frontend/app/src/lib/api/generated/Api.ts +++ b/frontend/app/src/lib/api/generated/Api.ts @@ -59,6 +59,7 @@ import { UpdateTenantAlertEmailGroupRequest, UpdateTenantInviteRequest, UpdateTenantRequest, + UpdateWorkerRequest, User, UserChangePasswordRequest, UserLoginRequest, @@ -1493,6 +1494,25 @@ export class Api extends HttpClient + this.request({ + path: `/api/v1/workers/${worker}`, + method: "PATCH", + body: data, + secure: true, + type: ContentType.Json, + format: "json", + ...params, + }); /** * @description Get a worker * diff --git a/frontend/app/src/lib/api/generated/data-contracts.ts b/frontend/app/src/lib/api/generated/data-contracts.ts index fa1cb0fd2..2dd8224bb 100644 --- a/frontend/app/src/lib/api/generated/data-contracts.ts +++ b/frontend/app/src/lib/api/generated/data-contracts.ts @@ -850,7 +850,7 @@ export interface Worker { /** The recent step runs for this worker. */ recentStepRuns?: StepRun[]; /** The status of the worker. */ - status?: "ACTIVE" | "INACTIVE"; + status?: "ACTIVE" | "INACTIVE" | "PAUSED"; /** The maximum number of runs this worker can execute concurrently. */ maxRuns?: number; /** The number of runs this worker can execute concurrently. */ @@ -865,6 +865,11 @@ export interface Worker { dispatcherId?: string; } +export interface UpdateWorkerRequest { + /** Whether the worker is paused and cannot accept new runs. */ + isPaused?: boolean; +} + export interface APIToken { metadata: APIResourceMeta; /** diff --git a/frontend/app/src/pages/main/workers/$worker/index.tsx b/frontend/app/src/pages/main/workers/$worker/index.tsx index 92ebaa1b6..71c357da8 100644 --- a/frontend/app/src/pages/main/workers/$worker/index.tsx +++ b/frontend/app/src/pages/main/workers/$worker/index.tsx @@ -1,6 +1,6 @@ import { Separator } from '@/components/ui/separator'; -import { queries, Worker } from '@/lib/api'; -import { useQuery } from '@tanstack/react-query'; +import api, { queries, UpdateWorkerRequest, Worker } from '@/lib/api'; +import { useMutation, useQuery } from '@tanstack/react-query'; import { Link, useOutletContext, useParams } from 'react-router-dom'; import invariant from 'tiny-invariant'; import { ServerStackIcon } from '@heroicons/react/24/outline'; @@ -9,7 +9,7 @@ import { DataTable } from '@/components/molecules/data-table/data-table'; import { columns } from './components/step-runs-columns'; import { Loading } from '@/components/ui/loading.tsx'; import { TenantContextType } from '@/lib/outlet'; -import { Badge } from '@/components/ui/badge'; +import { Badge, BadgeProps } from '@/components/ui/badge'; import { Tooltip, TooltipContent, @@ -17,7 +17,15 @@ import { TooltipTrigger, } from '@/components/ui/tooltip'; import RelativeDate from '@/components/molecules/relative-date'; - +import { useApiError } from '@/lib/hooks'; +import queryClient from '@/query-client'; +import { BiDotsVertical } from 'react-icons/bi'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from '@/components/ui/dropdown-menu'; export const isHealthy = (worker?: Worker) => { const reasons = []; @@ -42,34 +50,48 @@ export const isHealthy = (worker?: Worker) => { }; export const WorkerStatus = ({ - status, + status = 'INACTIVE', health, }: { - status?: 'ACTIVE' | 'INACTIVE'; + status?: 'ACTIVE' | 'INACTIVE' | 'PAUSED'; health: string[]; -}) => ( -
- - - - - {status === 'ACTIVE' ? 'Active' : 'Inactive'} - - - - {health.map((reason, i) => ( -
{reason}
- ))} -
-
-
-
-); +}) => { + const label: Record = { + ACTIVE: 'Active', + INACTIVE: 'Inactive', + PAUSED: 'Paused', + }; + + const variant: Record = { + ACTIVE: 'successful', + INACTIVE: 'failed', + PAUSED: 'inProgress', + }; + + return ( +
+ + + + {label[status]} + + + {health.map((reason, i) => ( +
{reason}
+ ))} +
+
+
+
+ ); +}; export default function ExpandedWorkflowRun() { const { tenant } = useOutletContext(); invariant(tenant); + const { handleApiError } = useApiError({}); + const params = useParams(); invariant(params.worker); @@ -82,6 +104,18 @@ export default function ExpandedWorkflowRun() { const healthy = isHealthy(worker); + const updateWorker = useMutation({ + mutationKey: ['worker:update', worker?.metadata.id], + mutationFn: async (data: UpdateWorkerRequest) => + (await api.workerUpdate(worker!.metadata.id, data)).data, + onSuccess: async () => { + await queryClient.invalidateQueries({ + queryKey: queries.workers.get(worker!.metadata.id).queryKey, + }); + }, + onError: handleApiError, + }); + if (!worker || workerQuery.isLoading || !workerQuery.data) { return ; } @@ -97,7 +131,33 @@ export default function ExpandedWorkflowRun() { {worker.name} - +
+ + + + + + + { + updateWorker.mutate({ + isPaused: worker.status === 'PAUSED' ? false : true, + }); + }} + > + {worker.status === 'PAUSED' ? 'Resume' : 'Pause'} Step Run + Assignment + + + +

diff --git a/frontend/app/src/pages/main/workers/components/worker-table.tsx b/frontend/app/src/pages/main/workers/components/worker-table.tsx index 8afb0a42f..efa7e4232 100644 --- a/frontend/app/src/pages/main/workers/components/worker-table.tsx +++ b/frontend/app/src/pages/main/workers/components/worker-table.tsx @@ -34,7 +34,7 @@ export function WorkersTable() { const [columnFilters, setColumnFilters] = useState([ { id: 'status', - value: ['ACTIVE'], + value: ['ACTIVE', 'PAUSED'], }, ]); @@ -173,6 +173,7 @@ export function WorkersTable() { title: 'Status', options: [ { value: 'ACTIVE', label: 'Active' }, + { value: 'PAUSED', label: 'Paused' }, { value: 'INACTIVE', label: 'Inactive' }, ], }, diff --git a/pkg/client/rest/gen.go b/pkg/client/rest/gen.go index 9f4e141af..cf0903bc7 100644 --- a/pkg/client/rest/gen.go +++ b/pkg/client/rest/gen.go @@ -118,6 +118,7 @@ const ( const ( ACTIVE WorkerStatus = "ACTIVE" INACTIVE WorkerStatus = "INACTIVE" + PAUSED WorkerStatus = "PAUSED" ) // Defines values for WorkflowConcurrencyLimitStrategy. @@ -776,6 +777,12 @@ type UpdateTenantRequest struct { Name *string `json:"name,omitempty"` } +// UpdateWorkerRequest defines model for UpdateWorkerRequest. +type UpdateWorkerRequest struct { + // IsPaused Whether the worker is paused and cannot accept new runs. + IsPaused *bool `json:"isPaused,omitempty"` +} + // User defines model for User. type User struct { // Email The email address of the user. @@ -1301,6 +1308,9 @@ type UserUpdatePasswordJSONRequestBody = UserChangePasswordRequest // UserCreateJSONRequestBody defines body for UserCreate for application/json ContentType. type UserCreateJSONRequestBody = UserRegisterRequest +// WorkerUpdateJSONRequestBody defines body for WorkerUpdate for application/json ContentType. +type WorkerUpdateJSONRequestBody = UpdateWorkerRequest + // WorkflowRunCreateJSONRequestBody defines body for WorkflowRunCreate for application/json ContentType. type WorkflowRunCreateJSONRequestBody = TriggerWorkflowRunRequest @@ -1611,6 +1621,11 @@ type ClientInterface interface { // WorkerGet request WorkerGet(ctx context.Context, worker openapi_types.UUID, reqEditors ...RequestEditorFn) (*http.Response, error) + // WorkerUpdateWithBody request with any body + WorkerUpdateWithBody(ctx context.Context, worker openapi_types.UUID, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + WorkerUpdate(ctx context.Context, worker openapi_types.UUID, body WorkerUpdateJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + // WorkflowDelete request WorkflowDelete(ctx context.Context, workflow openapi_types.UUID, reqEditors ...RequestEditorFn) (*http.Response, error) @@ -2640,6 +2655,30 @@ func (c *Client) WorkerGet(ctx context.Context, worker openapi_types.UUID, reqEd return c.Client.Do(req) } +func (c *Client) WorkerUpdateWithBody(ctx context.Context, worker openapi_types.UUID, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewWorkerUpdateRequestWithBody(c.Server, worker, contentType, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) WorkerUpdate(ctx context.Context, worker openapi_types.UUID, body WorkerUpdateJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewWorkerUpdateRequest(c.Server, worker, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + func (c *Client) WorkflowDelete(ctx context.Context, workflow openapi_types.UUID, reqEditors ...RequestEditorFn) (*http.Response, error) { req, err := NewWorkflowDeleteRequest(c.Server, workflow) if err != nil { @@ -5711,6 +5750,53 @@ func NewWorkerGetRequest(server string, worker openapi_types.UUID) (*http.Reques return req, nil } +// NewWorkerUpdateRequest calls the generic WorkerUpdate builder with application/json body +func NewWorkerUpdateRequest(server string, worker openapi_types.UUID, body WorkerUpdateJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewWorkerUpdateRequestWithBody(server, worker, "application/json", bodyReader) +} + +// NewWorkerUpdateRequestWithBody generates requests for WorkerUpdate with any type of body +func NewWorkerUpdateRequestWithBody(server string, worker openapi_types.UUID, contentType string, body io.Reader) (*http.Request, error) { + var err error + + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "worker", runtime.ParamLocationPath, worker) + if err != nil { + return nil, err + } + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/api/v1/workers/%s", pathParam0) + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("PATCH", queryURL.String(), body) + if err != nil { + return nil, err + } + + req.Header.Add("Content-Type", contentType) + + return req, nil +} + // NewWorkflowDeleteRequest generates requests for WorkflowDelete func NewWorkflowDeleteRequest(server string, workflow openapi_types.UUID) (*http.Request, error) { var err error @@ -6309,6 +6395,11 @@ type ClientWithResponsesInterface interface { // WorkerGetWithResponse request WorkerGetWithResponse(ctx context.Context, worker openapi_types.UUID, reqEditors ...RequestEditorFn) (*WorkerGetResponse, error) + // WorkerUpdateWithBodyWithResponse request with any body + WorkerUpdateWithBodyWithResponse(ctx context.Context, worker openapi_types.UUID, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*WorkerUpdateResponse, error) + + WorkerUpdateWithResponse(ctx context.Context, worker openapi_types.UUID, body WorkerUpdateJSONRequestBody, reqEditors ...RequestEditorFn) (*WorkerUpdateResponse, error) + // WorkflowDeleteWithResponse request WorkflowDeleteWithResponse(ctx context.Context, workflow openapi_types.UUID, reqEditors ...RequestEditorFn) (*WorkflowDeleteResponse, error) @@ -7901,6 +7992,30 @@ func (r WorkerGetResponse) StatusCode() int { return 0 } +type WorkerUpdateResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *Worker + JSON400 *APIErrors + JSON403 *APIErrors +} + +// Status returns HTTPResponse.Status +func (r WorkerUpdateResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r WorkerUpdateResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + type WorkflowDeleteResponse struct { Body []byte HTTPResponse *http.Response @@ -8788,6 +8903,23 @@ func (c *ClientWithResponses) WorkerGetWithResponse(ctx context.Context, worker return ParseWorkerGetResponse(rsp) } +// WorkerUpdateWithBodyWithResponse request with arbitrary body returning *WorkerUpdateResponse +func (c *ClientWithResponses) WorkerUpdateWithBodyWithResponse(ctx context.Context, worker openapi_types.UUID, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*WorkerUpdateResponse, error) { + rsp, err := c.WorkerUpdateWithBody(ctx, worker, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseWorkerUpdateResponse(rsp) +} + +func (c *ClientWithResponses) WorkerUpdateWithResponse(ctx context.Context, worker openapi_types.UUID, body WorkerUpdateJSONRequestBody, reqEditors ...RequestEditorFn) (*WorkerUpdateResponse, error) { + rsp, err := c.WorkerUpdate(ctx, worker, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseWorkerUpdateResponse(rsp) +} + // WorkflowDeleteWithResponse request returning *WorkflowDeleteResponse func (c *ClientWithResponses) WorkflowDeleteWithResponse(ctx context.Context, workflow openapi_types.UUID, reqEditors ...RequestEditorFn) (*WorkflowDeleteResponse, error) { rsp, err := c.WorkflowDelete(ctx, workflow, reqEditors...) @@ -11363,6 +11495,46 @@ func ParseWorkerGetResponse(rsp *http.Response) (*WorkerGetResponse, error) { return response, nil } +// ParseWorkerUpdateResponse parses an HTTP response from a WorkerUpdateWithResponse call +func ParseWorkerUpdateResponse(rsp *http.Response) (*WorkerUpdateResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &WorkerUpdateResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest Worker + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 400: + var dest APIErrors + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON400 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 403: + var dest APIErrors + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON403 = &dest + + } + + return response, nil +} + // ParseWorkflowDeleteResponse parses an HTTP response from a WorkflowDeleteWithResponse call func ParseWorkflowDeleteResponse(rsp *http.Response) (*WorkflowDeleteResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) diff --git a/pkg/repository/prisma/db/db_gen.go b/pkg/repository/prisma/db/db_gen.go index 39e5b5de4..05b0f366e 100644 --- a/pkg/repository/prisma/db/db_gen.go +++ b/pkg/repository/prisma/db/db_gen.go @@ -1367,7 +1367,10 @@ model Worker { // the last heartbeat time lastHeartbeatAt DateTime? - // whether this worker is active or not + // whether the worker has been marked as paused + isPaused Boolean @default(false) + + // whether this worker GRPC connection is active or not isActive Boolean @default(false) lastListenerEstablished DateTime? @@ -2511,6 +2514,7 @@ const ( WorkerScalarFieldEnumDeletedAt WorkerScalarFieldEnum = "deletedAt" WorkerScalarFieldEnumTenantID WorkerScalarFieldEnum = "tenantId" WorkerScalarFieldEnumLastHeartbeatAt WorkerScalarFieldEnum = "lastHeartbeatAt" + WorkerScalarFieldEnumIsPaused WorkerScalarFieldEnum = "isPaused" WorkerScalarFieldEnumIsActive WorkerScalarFieldEnum = "isActive" WorkerScalarFieldEnumLastListenerEstablished WorkerScalarFieldEnum = "lastListenerEstablished" WorkerScalarFieldEnumName WorkerScalarFieldEnum = "name" @@ -3779,6 +3783,8 @@ const workerFieldTenantID workerPrismaFields = "tenantId" const workerFieldLastHeartbeatAt workerPrismaFields = "lastHeartbeatAt" +const workerFieldIsPaused workerPrismaFields = "isPaused" + const workerFieldIsActive workerPrismaFields = "isActive" const workerFieldLastListenerEstablished workerPrismaFields = "lastListenerEstablished" @@ -9896,6 +9902,7 @@ type InnerWorker struct { DeletedAt *DateTime `json:"deletedAt,omitempty"` TenantID string `json:"tenantId"` LastHeartbeatAt *DateTime `json:"lastHeartbeatAt,omitempty"` + IsPaused bool `json:"isPaused"` IsActive bool `json:"isActive"` LastListenerEstablished *DateTime `json:"lastListenerEstablished,omitempty"` Name string `json:"name"` @@ -9911,6 +9918,7 @@ type RawWorkerModel struct { DeletedAt *RawDateTime `json:"deletedAt,omitempty"` TenantID RawString `json:"tenantId"` LastHeartbeatAt *RawDateTime `json:"lastHeartbeatAt,omitempty"` + IsPaused RawBoolean `json:"isPaused"` IsActive RawBoolean `json:"isActive"` LastListenerEstablished *RawDateTime `json:"lastListenerEstablished,omitempty"` Name RawString `json:"name"` @@ -147649,6 +147657,11 @@ type workerQuery struct { // @optional LastHeartbeatAt workerQueryLastHeartbeatAtDateTime + // IsPaused + // + // @required + IsPaused workerQueryIsPausedBoolean + // IsActive // // @required @@ -149856,6 +149869,74 @@ func (r workerQueryLastHeartbeatAtDateTime) Field() workerPrismaFields { return workerFieldLastHeartbeatAt } +// base struct +type workerQueryIsPausedBoolean struct{} + +// Set the required value of IsPaused +func (r workerQueryIsPausedBoolean) Set(value bool) workerSetParam { + + return workerSetParam{ + data: builder.Field{ + Name: "isPaused", + Value: value, + }, + } + +} + +// Set the optional value of IsPaused dynamically +func (r workerQueryIsPausedBoolean) SetIfPresent(value *Boolean) workerSetParam { + if value == nil { + return workerSetParam{} + } + + return r.Set(*value) +} + +func (r workerQueryIsPausedBoolean) Equals(value bool) workerWithPrismaIsPausedEqualsParam { + + return workerWithPrismaIsPausedEqualsParam{ + data: builder.Field{ + Name: "isPaused", + Fields: []builder.Field{ + { + Name: "equals", + Value: value, + }, + }, + }, + } +} + +func (r workerQueryIsPausedBoolean) EqualsIfPresent(value *bool) workerWithPrismaIsPausedEqualsParam { + if value == nil { + return workerWithPrismaIsPausedEqualsParam{} + } + return r.Equals(*value) +} + +func (r workerQueryIsPausedBoolean) Order(direction SortOrder) workerDefaultParam { + return workerDefaultParam{ + data: builder.Field{ + Name: "isPaused", + Value: direction, + }, + } +} + +func (r workerQueryIsPausedBoolean) Cursor(cursor bool) workerCursorParam { + return workerCursorParam{ + data: builder.Field{ + Name: "isPaused", + Value: cursor, + }, + } +} + +func (r workerQueryIsPausedBoolean) Field() workerPrismaFields { + return workerFieldIsPaused +} + // base struct type workerQueryIsActiveBoolean struct{} @@ -218287,6 +218368,7 @@ var workerOutput = []builder.Output{ {Name: "deletedAt"}, {Name: "tenantId"}, {Name: "lastHeartbeatAt"}, + {Name: "isPaused"}, {Name: "isActive"}, {Name: "lastListenerEstablished"}, {Name: "name"}, @@ -219004,6 +219086,84 @@ func (p workerWithPrismaLastHeartbeatAtEqualsUniqueParam) lastHeartbeatAtField() func (workerWithPrismaLastHeartbeatAtEqualsUniqueParam) unique() {} func (workerWithPrismaLastHeartbeatAtEqualsUniqueParam) equals() {} +type WorkerWithPrismaIsPausedEqualsSetParam interface { + field() builder.Field + getQuery() builder.Query + equals() + workerModel() + isPausedField() +} + +type WorkerWithPrismaIsPausedSetParam interface { + field() builder.Field + getQuery() builder.Query + workerModel() + isPausedField() +} + +type workerWithPrismaIsPausedSetParam struct { + data builder.Field + query builder.Query +} + +func (p workerWithPrismaIsPausedSetParam) field() builder.Field { + return p.data +} + +func (p workerWithPrismaIsPausedSetParam) getQuery() builder.Query { + return p.query +} + +func (p workerWithPrismaIsPausedSetParam) workerModel() {} + +func (p workerWithPrismaIsPausedSetParam) isPausedField() {} + +type WorkerWithPrismaIsPausedWhereParam interface { + field() builder.Field + getQuery() builder.Query + workerModel() + isPausedField() +} + +type workerWithPrismaIsPausedEqualsParam struct { + data builder.Field + query builder.Query +} + +func (p workerWithPrismaIsPausedEqualsParam) field() builder.Field { + return p.data +} + +func (p workerWithPrismaIsPausedEqualsParam) getQuery() builder.Query { + return p.query +} + +func (p workerWithPrismaIsPausedEqualsParam) workerModel() {} + +func (p workerWithPrismaIsPausedEqualsParam) isPausedField() {} + +func (workerWithPrismaIsPausedSetParam) settable() {} +func (workerWithPrismaIsPausedEqualsParam) equals() {} + +type workerWithPrismaIsPausedEqualsUniqueParam struct { + data builder.Field + query builder.Query +} + +func (p workerWithPrismaIsPausedEqualsUniqueParam) field() builder.Field { + return p.data +} + +func (p workerWithPrismaIsPausedEqualsUniqueParam) getQuery() builder.Query { + return p.query +} + +func (p workerWithPrismaIsPausedEqualsUniqueParam) workerModel() {} +func (p workerWithPrismaIsPausedEqualsUniqueParam) isPausedField() {} + +func (workerWithPrismaIsPausedEqualsUniqueParam) unique() {} +func (workerWithPrismaIsPausedEqualsUniqueParam) equals() {} + type WorkerWithPrismaIsActiveEqualsSetParam interface { field() builder.Field getQuery() builder.Query diff --git a/pkg/repository/prisma/dbsqlc/get_group_key_runs.sql b/pkg/repository/prisma/dbsqlc/get_group_key_runs.sql index 2437f3efb..05dff3e74 100644 --- a/pkg/repository/prisma/dbsqlc/get_group_key_runs.sql +++ b/pkg/repository/prisma/dbsqlc/get_group_key_runs.sql @@ -55,6 +55,7 @@ WITH valid_workers AS ( w."tenantId" = @tenantId::uuid AND w."lastHeartbeatAt" > NOW() - INTERVAL '5 seconds' AND w."isActive" = true + AND w."isPaused" = false GROUP BY w."id" ), diff --git a/pkg/repository/prisma/dbsqlc/get_group_key_runs.sql.go b/pkg/repository/prisma/dbsqlc/get_group_key_runs.sql.go index a34d336f1..3ff8601cc 100644 --- a/pkg/repository/prisma/dbsqlc/get_group_key_runs.sql.go +++ b/pkg/repository/prisma/dbsqlc/get_group_key_runs.sql.go @@ -221,6 +221,7 @@ WITH valid_workers AS ( w."tenantId" = $1::uuid AND w."lastHeartbeatAt" > NOW() - INTERVAL '5 seconds' AND w."isActive" = true + AND w."isPaused" = false GROUP BY w."id" ), diff --git a/pkg/repository/prisma/dbsqlc/models.go b/pkg/repository/prisma/dbsqlc/models.go index 67ffc496c..e016ebdb5 100644 --- a/pkg/repository/prisma/dbsqlc/models.go +++ b/pkg/repository/prisma/dbsqlc/models.go @@ -1040,6 +1040,7 @@ type Worker struct { MaxRuns int32 `json:"maxRuns"` IsActive bool `json:"isActive"` LastListenerEstablished pgtype.Timestamp `json:"lastListenerEstablished"` + IsPaused bool `json:"isPaused"` } type WorkerSemaphore struct { diff --git a/pkg/repository/prisma/dbsqlc/schema.sql b/pkg/repository/prisma/dbsqlc/schema.sql index c163068a1..8cd25efcc 100644 --- a/pkg/repository/prisma/dbsqlc/schema.sql +++ b/pkg/repository/prisma/dbsqlc/schema.sql @@ -572,6 +572,7 @@ CREATE TABLE "Worker" ( "maxRuns" INTEGER NOT NULL DEFAULT 100, "isActive" BOOLEAN NOT NULL DEFAULT false, "lastListenerEstablished" TIMESTAMP(3), + "isPaused" BOOLEAN NOT NULL DEFAULT false, CONSTRAINT "Worker_pkey" PRIMARY KEY ("id") ); diff --git a/pkg/repository/prisma/dbsqlc/step_runs.sql b/pkg/repository/prisma/dbsqlc/step_runs.sql index c6f2335c6..744eb6b48 100644 --- a/pkg/repository/prisma/dbsqlc/step_runs.sql +++ b/pkg/repository/prisma/dbsqlc/step_runs.sql @@ -316,6 +316,7 @@ WITH valid_workers AS ( AND w."lastHeartbeatAt" > NOW() - INTERVAL '5 seconds' -- necessary because isActive is set to false immediately when the stream closes AND w."isActive" = true + AND w."isPaused" = false GROUP BY w."id", w."maxRuns" HAVING @@ -405,6 +406,7 @@ WITH valid_workers AS ( AND w."lastHeartbeatAt" > NOW() - INTERVAL '5 seconds' -- necessary because isActive is set to false immediately when the stream closes AND w."isActive" = true + AND w."isPaused" = false GROUP BY w."id", w."maxRuns" HAVING @@ -524,6 +526,7 @@ WITH valid_workers AS ( AND w."dispatcherId" IS NOT NULL AND w."lastHeartbeatAt" > NOW() - INTERVAL '5 seconds' AND w."isActive" = true + AND w."isPaused" = false AND w."id" IN ( SELECT "_ActionToWorker"."B" FROM "_ActionToWorker" diff --git a/pkg/repository/prisma/dbsqlc/step_runs.sql.go b/pkg/repository/prisma/dbsqlc/step_runs.sql.go index fe1093e11..01d7d1136 100644 --- a/pkg/repository/prisma/dbsqlc/step_runs.sql.go +++ b/pkg/repository/prisma/dbsqlc/step_runs.sql.go @@ -21,6 +21,7 @@ WITH valid_workers AS ( AND w."dispatcherId" IS NOT NULL AND w."lastHeartbeatAt" > NOW() - INTERVAL '5 seconds' AND w."isActive" = true + AND w."isPaused" = false AND w."id" IN ( SELECT "_ActionToWorker"."B" FROM "_ActionToWorker" @@ -909,6 +910,7 @@ WITH valid_workers AS ( AND w."lastHeartbeatAt" > NOW() - INTERVAL '5 seconds' -- necessary because isActive is set to false immediately when the stream closes AND w."isActive" = true + AND w."isPaused" = false GROUP BY w."id", w."maxRuns" HAVING @@ -1019,6 +1021,7 @@ WITH valid_workers AS ( AND w."lastHeartbeatAt" > NOW() - INTERVAL '5 seconds' -- necessary because isActive is set to false immediately when the stream closes AND w."isActive" = true + AND w."isPaused" = false GROUP BY w."id", w."maxRuns" HAVING diff --git a/pkg/repository/prisma/dbsqlc/workers.sql b/pkg/repository/prisma/dbsqlc/workers.sql index e00696af4..4e37010ba 100644 --- a/pkg/repository/prisma/dbsqlc/workers.sql +++ b/pkg/repository/prisma/dbsqlc/workers.sql @@ -83,7 +83,8 @@ SET "dispatcherId" = coalesce(sqlc.narg('dispatcherId')::uuid, "dispatcherId"), "maxRuns" = coalesce(sqlc.narg('maxRuns')::int, "maxRuns"), "lastHeartbeatAt" = coalesce(sqlc.narg('lastHeartbeatAt')::timestamp, "lastHeartbeatAt"), - "isActive" = coalesce(sqlc.narg('isActive')::boolean, "isActive") + "isActive" = coalesce(sqlc.narg('isActive')::boolean, "isActive"), + "isPaused" = coalesce(sqlc.narg('isPaused')::boolean, "isPaused") WHERE "id" = @id::uuid RETURNING *; diff --git a/pkg/repository/prisma/dbsqlc/workers.sql.go b/pkg/repository/prisma/dbsqlc/workers.sql.go index 04e1eb617..9ce454b6b 100644 --- a/pkg/repository/prisma/dbsqlc/workers.sql.go +++ b/pkg/repository/prisma/dbsqlc/workers.sql.go @@ -28,7 +28,7 @@ INSERT INTO "Worker" ( $2::text, $3::uuid, $4::int -) RETURNING id, "createdAt", "updatedAt", "deletedAt", "tenantId", "lastHeartbeatAt", name, "dispatcherId", "maxRuns", "isActive", "lastListenerEstablished" +) RETURNING id, "createdAt", "updatedAt", "deletedAt", "tenantId", "lastHeartbeatAt", name, "dispatcherId", "maxRuns", "isActive", "lastListenerEstablished", "isPaused" ` type CreateWorkerParams struct { @@ -58,6 +58,7 @@ func (q *Queries) CreateWorker(ctx context.Context, db DBTX, arg CreateWorkerPar &i.MaxRuns, &i.IsActive, &i.LastListenerEstablished, + &i.IsPaused, ) return &i, err } @@ -67,7 +68,7 @@ DELETE FROM "Worker" WHERE "id" = $1::uuid -RETURNING id, "createdAt", "updatedAt", "deletedAt", "tenantId", "lastHeartbeatAt", name, "dispatcherId", "maxRuns", "isActive", "lastListenerEstablished" +RETURNING id, "createdAt", "updatedAt", "deletedAt", "tenantId", "lastHeartbeatAt", name, "dispatcherId", "maxRuns", "isActive", "lastListenerEstablished", "isPaused" ` func (q *Queries) DeleteWorker(ctx context.Context, db DBTX, id pgtype.UUID) (*Worker, error) { @@ -85,6 +86,7 @@ func (q *Queries) DeleteWorker(ctx context.Context, db DBTX, id pgtype.UUID) (*W &i.MaxRuns, &i.IsActive, &i.LastListenerEstablished, + &i.IsPaused, ) return &i, err } @@ -178,7 +180,7 @@ func (q *Queries) LinkServicesToWorker(ctx context.Context, db DBTX, arg LinkSer const listWorkersWithStepCount = `-- name: ListWorkersWithStepCount :many SELECT - workers.id, workers."createdAt", workers."updatedAt", workers."deletedAt", workers."tenantId", workers."lastHeartbeatAt", workers.name, workers."dispatcherId", workers."maxRuns", workers."isActive", workers."lastListenerEstablished", + workers.id, workers."createdAt", workers."updatedAt", workers."deletedAt", workers."tenantId", workers."lastHeartbeatAt", workers.name, workers."dispatcherId", workers."maxRuns", workers."isActive", workers."lastListenerEstablished", workers."isPaused", COUNT(runs."id") FILTER (WHERE runs."status" = 'RUNNING') AS "runningStepRuns", (SELECT COUNT(*) FROM "WorkerSemaphoreSlot" wss WHERE wss."workerId" = workers."id" AND wss."stepRunId" IS NOT NULL) AS "slots" FROM @@ -253,6 +255,7 @@ func (q *Queries) ListWorkersWithStepCount(ctx context.Context, db DBTX, arg Lis &i.Worker.MaxRuns, &i.Worker.IsActive, &i.Worker.LastListenerEstablished, + &i.Worker.IsPaused, &i.RunningStepRuns, &i.Slots, ); err != nil { @@ -306,10 +309,11 @@ SET "dispatcherId" = coalesce($1::uuid, "dispatcherId"), "maxRuns" = coalesce($2::int, "maxRuns"), "lastHeartbeatAt" = coalesce($3::timestamp, "lastHeartbeatAt"), - "isActive" = coalesce($4::boolean, "isActive") + "isActive" = coalesce($4::boolean, "isActive"), + "isPaused" = coalesce($5::boolean, "isPaused") WHERE - "id" = $5::uuid -RETURNING id, "createdAt", "updatedAt", "deletedAt", "tenantId", "lastHeartbeatAt", name, "dispatcherId", "maxRuns", "isActive", "lastListenerEstablished" + "id" = $6::uuid +RETURNING id, "createdAt", "updatedAt", "deletedAt", "tenantId", "lastHeartbeatAt", name, "dispatcherId", "maxRuns", "isActive", "lastListenerEstablished", "isPaused" ` type UpdateWorkerParams struct { @@ -317,6 +321,7 @@ type UpdateWorkerParams struct { MaxRuns pgtype.Int4 `json:"maxRuns"` LastHeartbeatAt pgtype.Timestamp `json:"lastHeartbeatAt"` IsActive pgtype.Bool `json:"isActive"` + IsPaused pgtype.Bool `json:"isPaused"` ID pgtype.UUID `json:"id"` } @@ -326,6 +331,7 @@ func (q *Queries) UpdateWorker(ctx context.Context, db DBTX, arg UpdateWorkerPar arg.MaxRuns, arg.LastHeartbeatAt, arg.IsActive, + arg.IsPaused, arg.ID, ) var i Worker @@ -341,6 +347,7 @@ func (q *Queries) UpdateWorker(ctx context.Context, db DBTX, arg UpdateWorkerPar &i.MaxRuns, &i.IsActive, &i.LastListenerEstablished, + &i.IsPaused, ) return &i, err } @@ -356,7 +363,7 @@ WHERE "lastListenerEstablished" IS NULL OR "lastListenerEstablished" <= $2::timestamp ) -RETURNING id, "createdAt", "updatedAt", "deletedAt", "tenantId", "lastHeartbeatAt", name, "dispatcherId", "maxRuns", "isActive", "lastListenerEstablished" +RETURNING id, "createdAt", "updatedAt", "deletedAt", "tenantId", "lastHeartbeatAt", name, "dispatcherId", "maxRuns", "isActive", "lastListenerEstablished", "isPaused" ` type UpdateWorkerActiveStatusParams struct { @@ -380,6 +387,7 @@ func (q *Queries) UpdateWorkerActiveStatus(ctx context.Context, db DBTX, arg Upd &i.MaxRuns, &i.IsActive, &i.LastListenerEstablished, + &i.IsPaused, ) return &i, err } @@ -390,7 +398,7 @@ SET "isActive" = $1::boolean WHERE "tenantId" = $2::uuid AND "name" = $3::text -RETURNING id, "createdAt", "updatedAt", "deletedAt", "tenantId", "lastHeartbeatAt", name, "dispatcherId", "maxRuns", "isActive", "lastListenerEstablished" +RETURNING id, "createdAt", "updatedAt", "deletedAt", "tenantId", "lastHeartbeatAt", name, "dispatcherId", "maxRuns", "isActive", "lastListenerEstablished", "isPaused" ` type UpdateWorkersByNameParams struct { @@ -420,6 +428,7 @@ func (q *Queries) UpdateWorkersByName(ctx context.Context, db DBTX, arg UpdateWo &i.MaxRuns, &i.IsActive, &i.LastListenerEstablished, + &i.IsPaused, ); err != nil { return nil, err } diff --git a/pkg/repository/prisma/worker.go b/pkg/repository/prisma/worker.go index 00e8c94f3..2d7b3fadb 100644 --- a/pkg/repository/prisma/worker.go +++ b/pkg/repository/prisma/worker.go @@ -125,6 +125,31 @@ func (r *workerAPIRepository) ListWorkers(tenantId string, opts *repository.List return workers, nil } +func (w *workerAPIRepository) UpdateWorker(tenantId, workerId string, opts repository.ApiUpdateWorkerOpts) (*dbsqlc.Worker, error) { + if err := w.v.Validate(opts); err != nil { + return nil, err + } + + updateParams := dbsqlc.UpdateWorkerParams{ + ID: sqlchelpers.UUIDFromStr(workerId), + } + + if opts.IsPaused != nil { + updateParams.IsPaused = pgtype.Bool{ + Bool: *opts.IsPaused, + Valid: true, + } + } + + worker, err := w.queries.UpdateWorker(context.Background(), w.pool, updateParams) + + if err != nil { + return nil, fmt.Errorf("could not update worker: %w", err) + } + + return worker, nil +} + type workerEngineRepository struct { pool *pgxpool.Pool v validator.Validator diff --git a/pkg/repository/worker.go b/pkg/repository/worker.go index 22f6831d9..31b2f3f19 100644 --- a/pkg/repository/worker.go +++ b/pkg/repository/worker.go @@ -52,6 +52,10 @@ type ListWorkersOpts struct { Assignable *bool } +type ApiUpdateWorkerOpts struct { + IsPaused *bool +} + type WorkerAPIRepository interface { // ListWorkers lists workers for the tenant ListWorkers(tenantId string, opts *ListWorkersOpts) ([]*dbsqlc.ListWorkersWithStepCountRow, error) @@ -61,6 +65,8 @@ type WorkerAPIRepository interface { // GetWorkerById returns a worker by its id. GetWorkerById(workerId string) (*db.WorkerModel, error) + + UpdateWorker(tenantId string, workerId string, opts ApiUpdateWorkerOpts) (*dbsqlc.Worker, error) } type WorkerEngineRepository interface { diff --git a/prisma/migrations/20240701144845_v0_35_0/migration.sql b/prisma/migrations/20240701144845_v0_35_0/migration.sql new file mode 100644 index 000000000..08d93b198 --- /dev/null +++ b/prisma/migrations/20240701144845_v0_35_0/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Worker" ADD COLUMN "isPaused" BOOLEAN NOT NULL DEFAULT false; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 3b89ffbb5..0bbc59817 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -1293,7 +1293,10 @@ model Worker { // the last heartbeat time lastHeartbeatAt DateTime? - // whether this worker is active or not + // whether the worker has been marked as paused + isPaused Boolean @default(false) + + // whether this worker GRPC connection is active or not isActive Boolean @default(false) lastListenerEstablished DateTime? diff --git a/sql/migrations/20240701144852_v0_35_0.sql b/sql/migrations/20240701144852_v0_35_0.sql new file mode 100644 index 000000000..20854824c --- /dev/null +++ b/sql/migrations/20240701144852_v0_35_0.sql @@ -0,0 +1,2 @@ +-- Modify "Worker" table +ALTER TABLE "Worker" ADD COLUMN "isPaused" boolean NOT NULL DEFAULT false; diff --git a/sql/migrations/atlas.sum b/sql/migrations/atlas.sum index aa8462d06..75769a438 100644 --- a/sql/migrations/atlas.sum +++ b/sql/migrations/atlas.sum @@ -1,4 +1,4 @@ -h1:NK+ekkECiuadzun2bA8DNGD9zGTMM8+f44rPVLThpJs= +h1:LXQRtfBJrIn4LxC0e60IvzAFysclKxaKq++WZR4Bi7I= 20240115180414_init.sql h1:Ef3ZyjAHkmJPdGF/dEWCahbwgcg6uGJKnDxW2JCRi2k= 20240122014727_v0_6_0.sql h1:o/LdlteAeFgoHJ3e/M4Xnghqt9826IE/Y/h0q95Acuo= 20240126235456_v0_7_0.sql h1:KiVzt/hXgQ6esbdC6OMJOOWuYEXmy1yeCpmsVAHTFKs= @@ -34,3 +34,4 @@ h1:NK+ekkECiuadzun2bA8DNGD9zGTMM8+f44rPVLThpJs= 20240606145243_v0_31_0.sql h1:ALisDQv8IPGe6MiBSfE/Esdl5x4pzNHIVMavlsBXIPE= 20240625180548_v0.34.0.sql h1:77uSk0VF/jBvEPHCqWC4hmMQqUx4zVnMdTryGsIXt9s= 20240626204339_v0.34.2.sql h1:e2hArnEfcEYcBjEPxZW3axkl4CGt2lHa1oIA2r2fjfY= +20240701144852_v0_35_0.sql h1:q8pPeq4LZp7hxZZp4P08xctwAdQFKDEA9vbj1Ulbn7U= diff --git a/sql/schema/schema.sql b/sql/schema/schema.sql index c163068a1..8cd25efcc 100644 --- a/sql/schema/schema.sql +++ b/sql/schema/schema.sql @@ -572,6 +572,7 @@ CREATE TABLE "Worker" ( "maxRuns" INTEGER NOT NULL DEFAULT 100, "isActive" BOOLEAN NOT NULL DEFAULT false, "lastListenerEstablished" TIMESTAMP(3), + "isPaused" BOOLEAN NOT NULL DEFAULT false, CONSTRAINT "Worker_pkey" PRIMARY KEY ("id") ); From 49709e833cee3e76846874f381e919f17f927e14 Mon Sep 17 00:00:00 2001 From: Becca Britt Date: Mon, 1 Jul 2024 11:53:34 -0700 Subject: [PATCH 6/9] Fix: python sdk docs hatchet.admin references (#678) Fix references to hatchet admin module in python-sdk docs --- .../docs/pages/sdks/python-sdk/get-workflow-results.mdx | 8 ++++---- frontend/docs/pages/sdks/python-sdk/run-workflow-api.mdx | 4 ++-- .../docs/pages/sdks/python-sdk/run-workflow-schedule.mdx | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/frontend/docs/pages/sdks/python-sdk/get-workflow-results.mdx b/frontend/docs/pages/sdks/python-sdk/get-workflow-results.mdx index 99d6b1335..b7335e2f2 100644 --- a/frontend/docs/pages/sdks/python-sdk/get-workflow-results.mdx +++ b/frontend/docs/pages/sdks/python-sdk/get-workflow-results.mdx @@ -2,14 +2,14 @@ import { Callout } from "nextra/components"; # Getting Workflow Run Results -It is possible to wait for or stream the results of a workflow run by getting a `WorkflowRunRef`. This is the return value of the `run_workflow` and `get_workflow_run` methods on the `hatchet.admin` client, or the `spawn_workflow` method on a `Context` object. For example: +It is possible to wait for or stream the results of a workflow run by getting a `WorkflowRunRef`. This is the return value of the `run_workflow` and `get_workflow_run` methods on the `hatchet.client.admin` client, or the `spawn_workflow` method on a `Context` object. For example: ```py filename="get_workflow_run.py" copy from hatchet_sdk import Hatchet, ClientConfig hatchet = Hatchet() -workflow_run_ref = hatchet.admin.get_workflow_run( +workflow_run_ref = hatchet.client.admin.get_workflow_run( "5a3a617d-1200-4ee2-92e6-be4bd27ca26f", ) @@ -24,7 +24,7 @@ This method takes the `workflow_run_id` as a parameter and returns a reference t If you need to get the workflow run id from a different method than where it was invoked, you can store the value of the `workflow_run_id` attribute of the return value of [`run_workflow`](./run-workflow-api) or [`spawn_workflow`](./run-workflow-child). For example: ```py -workflow_run = hatchet.admin.run_workflow( +workflow_run = hatchet.client.admin.run_workflow( "ManualTriggerWorkflow", {"test": "test"}, ) @@ -54,7 +54,7 @@ It is also possible to stream the results of a workflow run as each step is exec ```py filename="stream_workflow_run.py" copy from hatchet_sdk import Hatchet, ClientConfig -workflow_run_ref = hatchet.admin.get_workflow_run( +workflow_run_ref = hatchet.client.admin.get_workflow_run( "5a3a617d-1200-4ee2-92e6-be4bd27ca26f", ) diff --git a/frontend/docs/pages/sdks/python-sdk/run-workflow-api.mdx b/frontend/docs/pages/sdks/python-sdk/run-workflow-api.mdx index 547d05a13..83c6ced61 100644 --- a/frontend/docs/pages/sdks/python-sdk/run-workflow-api.mdx +++ b/frontend/docs/pages/sdks/python-sdk/run-workflow-api.mdx @@ -1,13 +1,13 @@ # Running Workflows via API -Workflows can be triggered from the API by calling `run_workflow`. This method is available on the `hatchet.admin` client: +Workflows can be triggered from the API by calling `run_workflow`. This method is available on the `hatchet.client.admin` client: ```python filename="run_workflow.py" copy from hatchet_sdk import Hatchet, ClientConfig hatchet = Hatchet() -workflowRun = hatchet.admin.run_workflow( +workflowRun = hatchet.client.admin.run_workflow( "ManualTriggerWorkflow", {"test": "test"}, options={"additional_metadata": {"hello": "moon"}}, diff --git a/frontend/docs/pages/sdks/python-sdk/run-workflow-schedule.mdx b/frontend/docs/pages/sdks/python-sdk/run-workflow-schedule.mdx index 09c671fb3..372d9daac 100644 --- a/frontend/docs/pages/sdks/python-sdk/run-workflow-schedule.mdx +++ b/frontend/docs/pages/sdks/python-sdk/run-workflow-schedule.mdx @@ -1,6 +1,6 @@ # Running Scheduled Workflows -Workflows can be scheduled from the API to run at some future time by calling `schedule_workflow`. This method is available on the `hatchet.admin` client: +Workflows can be scheduled from the API to run at some future time by calling `schedule_workflow`. This method is available on the `hatchet.client.admin` client: ```py filename="scheduled_workflow.py" copy from hatchet_sdk import Hatchet, ClientConfig @@ -10,7 +10,7 @@ hatchet = Hatchet() now = datetime.now() future_time = now + timedelta(seconds=15) -workflowRun = hatchet.admin.schedule_workflow( +workflowRun = hatchet.client.admin.schedule_workflow( "ManualTriggerWorkflow", [future_time], {"test": "test"}, From cc23233730caac5989b381b5378959003806539d Mon Sep 17 00:00:00 2001 From: Luca Steeb Date: Tue, 2 Jul 2024 00:17:27 +0100 Subject: [PATCH 7/9] chore(pre-commit): format prisma file on pre-commit (#674) --- Taskfile.yaml | 4 ++++ pkg/repository/prisma/db/db_gen.go | 2 +- prisma/schema.prisma | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Taskfile.yaml b/Taskfile.yaml index 1723bbb10..bd72892f9 100644 --- a/Taskfile.yaml +++ b/Taskfile.yaml @@ -150,6 +150,9 @@ tasks: lint-frontend: cmds: - cd frontend/app/ && pnpm run lint:check + format-prisma: + cmds: + - go run github.com/steebchen/prisma-client-go format kill-query-engines: cmds: - ps -A | grep 'prisma-query-engine-darwin-arm64' | grep -v grep | awk '{print $1}' | xargs kill -9 $1 @@ -175,4 +178,5 @@ tasks: deps: - pre-commit-install cmds: + - task: format-prisma - pre-commit run --all-files || pre-commit run --all-files diff --git a/pkg/repository/prisma/db/db_gen.go b/pkg/repository/prisma/db/db_gen.go index 05b0f366e..508fbb919 100644 --- a/pkg/repository/prisma/db/db_gen.go +++ b/pkg/repository/prisma/db/db_gen.go @@ -1574,7 +1574,7 @@ model SNSIntegration { } model SecurityCheckIdent { - id String @id @unique @default(uuid()) @db.Uuid + id String @id @unique @default(uuid()) @db.Uuid } ` const schemaDatasourceURL = "" diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 0bbc59817..60447ac37 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -1500,5 +1500,5 @@ model SNSIntegration { } model SecurityCheckIdent { - id String @id @unique @default(uuid()) @db.Uuid + id String @id @unique @default(uuid()) @db.Uuid } From 3e41279840ea83255afd4be667c83b63fa1da28a Mon Sep 17 00:00:00 2001 From: Luca Steeb Date: Tue, 2 Jul 2024 01:08:49 +0100 Subject: [PATCH 8/9] chore(packages): pin swagger api generation (#675) --- frontend/app/package.json | 1 + frontend/app/pnpm-lock.yaml | 968 +++++++++++++----- frontend/app/src/components/ui/envvar.tsx | 2 +- frontend/app/src/lib/api/generated/Api.ts | 262 ++--- .../src/lib/api/generated/data-contracts.ts | 114 +-- .../app/src/lib/api/generated/http-client.ts | 32 +- hack/oas/generate-clients.sh | 2 +- hack/oas/generate-server.sh | 2 +- 8 files changed, 900 insertions(+), 483 deletions(-) diff --git a/frontend/app/package.json b/frontend/app/package.json index 26999278b..68a676719 100644 --- a/frontend/app/package.json +++ b/frontend/app/package.json @@ -104,6 +104,7 @@ "eslint-plugin-unused-imports": "^3.0.0", "postcss": "^8.4.31", "prettier": "^3.1.1", + "swagger-typescript-api": "^13.0.11", "tailwindcss": "^3.3.5", "typescript": "^5.2.2", "vite": "^5.0.0", diff --git a/frontend/app/pnpm-lock.yaml b/frontend/app/pnpm-lock.yaml index 713ce900d..7a868571e 100644 --- a/frontend/app/pnpm-lock.yaml +++ b/frontend/app/pnpm-lock.yaml @@ -13,76 +13,76 @@ importers: version: 2.1.3(react@18.2.0) '@hookform/resolvers': specifier: ^3.3.2 - version: 3.3.4(react-hook-form@7.51.2) + version: 3.3.4(react-hook-form@7.51.2(react@18.2.0)) '@lukemorales/query-key-factory': specifier: ^1.3.2 - version: 1.3.4(@tanstack/query-core@5.28.9)(@tanstack/react-query@5.28.9) + version: 1.3.4(@tanstack/query-core@5.28.9)(@tanstack/react-query@5.28.9(react@18.2.0)) '@monaco-editor/react': specifier: ^4.6.0 - version: 4.6.0(monaco-editor@0.47.0)(react-dom@18.2.0)(react@18.2.0) + version: 4.6.0(monaco-editor@0.47.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-accordion': specifier: ^1.1.2 - version: 1.1.2(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + version: 1.1.2(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-avatar': specifier: ^1.0.4 - version: 1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-checkbox': specifier: ^1.0.4 - version: 1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-collapsible': specifier: ^1.0.3 - version: 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-dialog': specifier: ^1.0.5 - version: 1.0.5(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.5(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-dropdown-menu': specifier: ^2.0.6 - version: 2.0.6(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + version: 2.0.6(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-hover-card': specifier: ^1.0.7 - version: 1.0.7(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.7(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-icons': specifier: ^1.3.0 version: 1.3.0(react@18.2.0) '@radix-ui/react-label': specifier: ^2.0.2 - version: 2.0.2(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + version: 2.0.2(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-menubar': specifier: ^1.0.4 - version: 1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-popover': specifier: ^1.0.7 - version: 1.0.7(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.7(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-select': specifier: ^2.0.0 - version: 2.0.0(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + version: 2.0.0(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-separator': specifier: ^1.0.3 - version: 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-slot': specifier: ^1.0.2 version: 1.0.2(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-switch': specifier: ^1.0.3 - version: 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-tabs': specifier: ^1.0.4 - version: 1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-toast': specifier: ^1.1.5 - version: 1.1.5(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + version: 1.1.5(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-tooltip': specifier: ^1.0.7 - version: 1.0.7(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.7(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@rjsf/core': specifier: ^5.17.0 - version: 5.18.1(@rjsf/utils@5.18.1)(react@18.2.0) + version: 5.18.1(@rjsf/utils@5.18.1(react@18.2.0))(react@18.2.0) '@rjsf/utils': specifier: ^5.17.0 version: 5.18.1(react@18.2.0) '@rjsf/validator-ajv8': specifier: ^5.17.0 - version: 5.18.1(@rjsf/utils@5.18.1) + version: 5.18.1(@rjsf/utils@5.18.1(react@18.2.0)) '@sentry/react': specifier: ^7.105.0 version: 7.109.0(react@18.2.0) @@ -94,7 +94,7 @@ importers: version: 5.28.9(react@18.2.0) '@tanstack/react-table': specifier: ^8.10.7 - version: 8.15.3(react-dom@18.2.0)(react@18.2.0) + version: 8.15.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@visx/axis': specifier: ^3.5.0 version: 3.10.1(react@18.2.0) @@ -139,7 +139,7 @@ importers: version: 2.1.0 cmdk: specifier: ^0.2.0 - version: 0.2.1(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + version: 0.2.1(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) cron-parser: specifier: ^4.9.0 version: 4.9.0 @@ -178,13 +178,13 @@ importers: version: 5.0.1(react@18.2.0) react-router-dom: specifier: ^6.20.0 - version: 6.22.3(react-dom@18.2.0)(react@18.2.0) + version: 6.22.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react-syntax-highlighter: specifier: ^15.5.0 version: 15.5.0(react@18.2.0) reactflow: specifier: ^11.10.3 - version: 11.10.4(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + version: 11.10.4(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) tailwind-merge: specifier: ^2.0.0 version: 2.2.2 @@ -221,13 +221,13 @@ importers: version: 15.5.11 '@typescript-eslint/eslint-plugin': specifier: ^6.10.0 - version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.2.2) + version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2) '@typescript-eslint/parser': specifier: ^6.10.0 version: 6.21.0(eslint@8.57.0)(typescript@5.2.2) '@vitejs/plugin-react': specifier: ^4.2.0 - version: 4.2.1(vite@5.2.7) + version: 4.2.1(vite@5.2.7(@types/node@20.12.2)) autoprefixer: specifier: ^10.4.16 version: 10.4.19(postcss@8.4.38) @@ -236,19 +236,19 @@ importers: version: 8.57.0 eslint-config-airbnb-typescript: specifier: ^17.1.0 - version: 17.1.0(@typescript-eslint/eslint-plugin@6.21.0)(@typescript-eslint/parser@6.21.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + version: 17.1.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2))(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0))(eslint@8.57.0) eslint-config-prettier: specifier: ^9.1.0 version: 9.1.0(eslint@8.57.0) eslint-import-resolver-typescript: specifier: ^3.6.1 - version: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + version: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-plugin-import@2.29.1)(eslint@8.57.0) eslint-plugin-import: specifier: ^2.29.1 - version: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + version: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) eslint-plugin-prettier: specifier: ^5.0.1 - version: 5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.2.5) + version: 5.1.3(@types/eslint@8.56.7)(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.2.5) eslint-plugin-react: specifier: ^7.33.2 version: 7.34.1(eslint@8.57.0) @@ -260,13 +260,16 @@ importers: version: 0.4.6(eslint@8.57.0) eslint-plugin-unused-imports: specifier: ^3.0.0 - version: 3.1.0(@typescript-eslint/eslint-plugin@6.21.0)(eslint@8.57.0) + version: 3.1.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0) postcss: specifier: ^8.4.31 version: 8.4.38 prettier: specifier: ^3.1.1 version: 3.2.5 + swagger-typescript-api: + specifier: ^13.0.11 + version: 13.0.11 tailwindcss: specifier: ^3.3.5 version: 3.4.3 @@ -278,7 +281,7 @@ importers: version: 5.2.7(@types/node@20.12.2) vite-plugin-eslint: specifier: ^1.8.1 - version: 1.8.1(eslint@8.57.0)(vite@5.2.7) + version: 1.8.1(eslint@8.57.0)(vite@5.2.7(@types/node@20.12.2)) packages: @@ -557,6 +560,9 @@ packages: resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@exodus/schemasafe@1.3.0': + resolution: {integrity: sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==} + '@floating-ui/core@1.6.0': resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==} @@ -1454,6 +1460,10 @@ packages: resolution: {integrity: sha512-/7rFTpasql9fJ1KbruF0yDESKV/ojvOP9pL/qqwUffvA9iy9Bvw3kYzzyzd1YsiCiVBgftoCsFTKPcvL3A4rwQ==} engines: {node: '>= 14'} + '@sindresorhus/is@4.6.0': + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + '@tanstack/query-core@5.28.9': resolution: {integrity: sha512-hNlfCiqZevr3GRVPXS3MhaGW5hjcxvCsIQ4q6ff7EPlvFwYZaS+0d9EIIgofnegDaU2BbCDlyURoYfRl5rmzow==} @@ -1659,6 +1669,9 @@ packages: '@types/semver@7.5.8': resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + '@types/swagger-schema-official@2.0.25': + resolution: {integrity: sha512-T92Xav+Gf/Ik1uPW581nA+JftmjWPgskw/WBf4TJzxRG/SJ+DfNnNE+WuZ4mrXuzflQMqMkm1LSYjzYW7MB1Cg==} + '@types/unist@2.0.10': resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} @@ -1941,6 +1954,9 @@ packages: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} + call-me-maybe@1.0.2: + resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} + callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -1960,6 +1976,10 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + character-entities-legacy@1.1.4: resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} @@ -1982,6 +2002,10 @@ packages: classnames@2.5.1: resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + clsx@2.0.0: resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} engines: {node: '>=6'} @@ -2035,6 +2059,15 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + cron-parser@4.9.0: resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==} engines: {node: '>=12.0.0'} @@ -2217,10 +2250,20 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + emojilib@2.4.0: + resolution: {integrity: sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==} + enhanced-resolve@5.16.0: resolution: {integrity: sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==} engines: {node: '>=10.13.0'} + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + es-abstract@1.23.3: resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} engines: {node: '>= 0.4'} @@ -2252,6 +2295,9 @@ packages: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} + es6-promise@3.3.1: + resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} + esbuild@0.20.2: resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} engines: {node: '>=12'} @@ -2412,6 +2458,10 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} + eta@2.2.0: + resolution: {integrity: sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==} + engines: {node: '>=6.0.0'} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -2431,6 +2481,9 @@ packages: fast-plist@0.1.3: resolution: {integrity: sha512-d9cEfo/WcOezgPLAC/8t8wGb6YOD6JTCPMw2QcG2nAdFmyY+9rTUizCTaGjIZAloWENTEUMAPpkUAIJJJ0i96A==} + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} @@ -2505,6 +2558,10 @@ packages: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + get-intrinsic@1.2.4: resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} engines: {node: '>= 0.4'} @@ -2610,6 +2667,9 @@ packages: hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + http2-client@1.3.5: + resolution: {integrity: sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==} + https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} @@ -2653,6 +2713,9 @@ packages: resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} engines: {node: '>= 0.4'} + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-async-function@2.0.0: resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} engines: {node: '>= 0.4'} @@ -2810,6 +2873,9 @@ packages: json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-schema-compare@0.2.2: resolution: {integrity: sha512-c4WYmDKyJXhs7WWvAWm3uIYnfyWFoIp+JEoX34rctVvEkMYCPGhXtvmFFXiffBbxfZsvQ0RNnV5H7GvDF5HCqQ==} @@ -2974,6 +3040,14 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + node-emoji@2.1.3: + resolution: {integrity: sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==} + engines: {node: '>=18'} + + node-fetch-h2@2.3.0: + resolution: {integrity: sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==} + engines: {node: 4.x || >=6.0.0} + node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -2983,6 +3057,9 @@ packages: encoding: optional: true + node-readfiles@0.2.0: + resolution: {integrity: sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==} + node-releases@2.0.14: resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} @@ -2994,6 +3071,22 @@ packages: resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} engines: {node: '>=0.10.0'} + oas-kit-common@1.0.8: + resolution: {integrity: sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==} + + oas-linter@3.2.2: + resolution: {integrity: sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ==} + + oas-resolver@2.5.6: + resolution: {integrity: sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ==} + hasBin: true + + oas-schema-walker@1.1.5: + resolution: {integrity: sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ==} + + oas-validator@5.0.8: + resolution: {integrity: sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==} + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -3055,6 +3148,10 @@ packages: parse-entities@2.0.0: resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -3151,6 +3248,11 @@ packages: engines: {node: '>=14'} hasBin: true + prettier@3.3.2: + resolution: {integrity: sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==} + engines: {node: '>=14'} + hasBin: true + prism-react-renderer@2.3.1: resolution: {integrity: sha512-Rdf+HzBLR7KYjzpJ1rSoxT9ioO85nZngQEoFIhL07XhtJHlCU3SOz0GJ6+qvMyQe0Se+BV3qpe6Yd/NmQF5Juw==} peerDependencies: @@ -3302,6 +3404,9 @@ packages: refractor@3.6.0: resolution: {integrity: sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==} + reftools@1.1.9: + resolution: {integrity: sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==} + regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} @@ -3309,6 +3414,10 @@ packages: resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} engines: {node: '>= 0.4'} + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} @@ -3388,6 +3497,24 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + should-equal@2.0.0: + resolution: {integrity: sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==} + + should-format@3.0.3: + resolution: {integrity: sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==} + + should-type-adaptors@1.1.0: + resolution: {integrity: sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==} + + should-type@1.4.0: + resolution: {integrity: sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==} + + should-util@1.0.1: + resolution: {integrity: sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==} + + should@13.2.3: + resolution: {integrity: sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==} + side-channel@1.0.6: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} engines: {node: '>= 0.4'} @@ -3396,6 +3523,10 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + skin-tone@2.0.0: + resolution: {integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==} + engines: {node: '>=8'} + slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -3466,6 +3597,18 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + swagger-schema-official@2.0.0-bab6bed: + resolution: {integrity: sha512-rCC0NWGKr/IJhtRuPq/t37qvZHI/mH4I4sxflVM+qgVe5Z2uOCivzWaVbuioJaB61kvm5UvB7b49E+oBY0M8jA==} + + swagger-typescript-api@13.0.11: + resolution: {integrity: sha512-y4CdNSDpNJhpFZc5tB65DHYSxIr2ecIWFk6s7WAGrDCNBP5EeVlEUxPhus2FFoJOfxf+142wPzzyLWlwO3d7zA==} + engines: {node: '>=18.0.0'} + hasBin: true + + swagger2openapi@7.0.8: + resolution: {integrity: sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==} + hasBin: true + synckit@0.8.8: resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} engines: {node: ^14.18.0 || >=16.0.0} @@ -3563,12 +3706,21 @@ packages: engines: {node: '>=14.17'} hasBin: true + typescript@5.5.2: + resolution: {integrity: sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==} + engines: {node: '>=14.17'} + hasBin: true + unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + unicode-emoji-modifier-base@1.0.0: + resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==} + engines: {node: '>=4'} + unplugin@1.0.1: resolution: {integrity: sha512-aqrHaVBWW1JVKBHmGo33T5TxeL0qWzfvjWokObHA9bYmN7eNDkwOxmLjhioHl9878qDFMAaT51XNroRyuz7WxA==} @@ -3706,17 +3858,33 @@ packages: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + yaml@2.4.1: resolution: {integrity: sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==} engines: {node: '>= 14'} hasBin: true + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -3984,6 +4152,8 @@ snapshots: '@eslint/js@8.57.0': {} + '@exodus/schemasafe@1.3.0': {} + '@floating-ui/core@1.6.0': dependencies: '@floating-ui/utils': 0.2.1 @@ -3993,7 +4163,7 @@ snapshots: '@floating-ui/core': 1.6.0 '@floating-ui/utils': 0.2.1 - '@floating-ui/react-dom@2.0.8(react-dom@18.2.0)(react@18.2.0)': + '@floating-ui/react-dom@2.0.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@floating-ui/dom': 1.6.3 react: 18.2.0 @@ -4005,7 +4175,7 @@ snapshots: dependencies: react: 18.2.0 - '@hookform/resolvers@3.3.4(react-hook-form@7.51.2)': + '@hookform/resolvers@3.3.4(react-hook-form@7.51.2(react@18.2.0))': dependencies: react-hook-form: 7.51.2(react@18.2.0) @@ -4047,7 +4217,7 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 - '@lukemorales/query-key-factory@1.3.4(@tanstack/query-core@5.28.9)(@tanstack/react-query@5.28.9)': + '@lukemorales/query-key-factory@1.3.4(@tanstack/query-core@5.28.9)(@tanstack/react-query@5.28.9(react@18.2.0))': dependencies: '@tanstack/query-core': 5.28.9 '@tanstack/react-query': 5.28.9(react@18.2.0) @@ -4057,7 +4227,7 @@ snapshots: monaco-editor: 0.47.0 state-local: 1.0.7 - '@monaco-editor/react@4.6.0(monaco-editor@0.47.0)(react-dom@18.2.0)(react@18.2.0)': + '@monaco-editor/react@4.6.0(monaco-editor@0.47.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@monaco-editor/loader': 1.4.0(monaco-editor@0.47.0) monaco-editor: 0.47.0 @@ -4093,87 +4263,93 @@ snapshots: dependencies: '@babel/runtime': 7.24.1 - '@radix-ui/react-accordion@1.1.2(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0)': + '@radix-ui/react-accordion@1.1.2(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collapsible': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-collapsible': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-direction': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-id': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@types/react': 18.2.73 - '@types/react-dom': 18.2.23 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.2.73 + '@types/react-dom': 18.2.23 - '@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0)': + '@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.73 - '@types/react-dom': 18.2.23 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.2.73 + '@types/react-dom': 18.2.23 - '@radix-ui/react-avatar@1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0)': + '@radix-ui/react-avatar@1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 '@radix-ui/react-context': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@types/react': 18.2.73 - '@types/react-dom': 18.2.23 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.2.73 + '@types/react-dom': 18.2.23 - '@radix-ui/react-checkbox@1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0)': + '@radix-ui/react-checkbox@1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@types/react': 18.2.73 - '@types/react-dom': 18.2.23 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.2.73 + '@types/react-dom': 18.2.23 - '@radix-ui/react-collapsible@1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0)': + '@radix-ui/react-collapsible@1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-id': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@types/react': 18.2.73 - '@types/react-dom': 18.2.23 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.2.73 + '@types/react-dom': 18.2.23 - '@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0)': + '@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-slot': 1.0.2(@types/react@18.2.73)(react@18.2.0) - '@types/react': 18.2.73 - '@types/react-dom': 18.2.23 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.2.73 + '@types/react-dom': 18.2.23 '@radix-ui/react-compose-refs@1.0.0(react@18.2.0)': dependencies: @@ -4183,8 +4359,9 @@ snapshots: '@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.73)(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 - '@types/react': 18.2.73 react: 18.2.0 + optionalDependencies: + '@types/react': 18.2.73 '@radix-ui/react-context@1.0.0(react@18.2.0)': dependencies: @@ -4194,22 +4371,23 @@ snapshots: '@radix-ui/react-context@1.0.1(@types/react@18.2.73)(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 - '@types/react': 18.2.73 react: 18.2.0 + optionalDependencies: + '@types/react': 18.2.73 - '@radix-ui/react-dialog@1.0.0(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0)': + '@radix-ui/react-dialog@1.0.0(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 '@radix-ui/primitive': 1.0.0 '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) '@radix-ui/react-context': 1.0.0(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.0(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-focus-guards': 1.0.0(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.0(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-id': 1.0.0(react@18.2.0) - '@radix-ui/react-portal': 1.0.0(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-presence': 1.0.0(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.0(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-presence': 1.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-primitive': 1.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-slot': 1.0.0(react@18.2.0) '@radix-ui/react-use-controllable-state': 1.0.0(react@18.2.0) aria-hidden: 1.2.4 @@ -4219,72 +4397,76 @@ snapshots: transitivePeerDependencies: - '@types/react' - '@radix-ui/react-dialog@1.0.5(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0)': + '@radix-ui/react-dialog@1.0.5(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-id': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-slot': 1.0.2(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@types/react': 18.2.73 - '@types/react-dom': 18.2.23 aria-hidden: 1.2.4 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-remove-scroll: 2.5.5(@types/react@18.2.73)(react@18.2.0) + optionalDependencies: + '@types/react': 18.2.73 + '@types/react-dom': 18.2.23 '@radix-ui/react-direction@1.0.1(@types/react@18.2.73)(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 - '@types/react': 18.2.73 react: 18.2.0 + optionalDependencies: + '@types/react': 18.2.73 - '@radix-ui/react-dismissable-layer@1.0.0(react-dom@18.2.0)(react@18.2.0)': + '@radix-ui/react-dismissable-layer@1.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 '@radix-ui/primitive': 1.0.0 '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) - '@radix-ui/react-primitive': 1.0.0(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) '@radix-ui/react-use-escape-keydown': 1.0.0(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - '@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0)': + '@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.73)(react@18.2.0) - '@types/react': 18.2.73 - '@types/react-dom': 18.2.23 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.2.73 + '@types/react-dom': 18.2.23 - '@radix-ui/react-dropdown-menu@2.0.6(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0)': + '@radix-ui/react-dropdown-menu@2.0.6(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-id': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@radix-ui/react-menu': 2.0.6(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-menu': 2.0.6(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@types/react': 18.2.73 - '@types/react-dom': 18.2.23 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.2.73 + '@types/react-dom': 18.2.23 '@radix-ui/react-focus-guards@1.0.0(react@18.2.0)': dependencies: @@ -4294,45 +4476,48 @@ snapshots: '@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.73)(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 - '@types/react': 18.2.73 react: 18.2.0 + optionalDependencies: + '@types/react': 18.2.73 - '@radix-ui/react-focus-scope@1.0.0(react-dom@18.2.0)(react@18.2.0)': + '@radix-ui/react-focus-scope@1.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) - '@radix-ui/react-primitive': 1.0.0(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - '@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0)': + '@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@types/react': 18.2.73 - '@types/react-dom': 18.2.23 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.2.73 + '@types/react-dom': 18.2.23 - '@radix-ui/react-hover-card@1.0.7(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0)': + '@radix-ui/react-hover-card@1.0.7(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@types/react': 18.2.73 - '@types/react-dom': 18.2.23 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.2.73 + '@types/react-dom': 18.2.23 '@radix-ui/react-icons@1.3.0(react@18.2.0)': dependencies: @@ -4348,120 +4533,127 @@ snapshots: dependencies: '@babel/runtime': 7.24.1 '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@types/react': 18.2.73 react: 18.2.0 + optionalDependencies: + '@types/react': 18.2.73 - '@radix-ui/react-label@2.0.2(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0)': + '@radix-ui/react-label@2.0.2(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.73 - '@types/react-dom': 18.2.23 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.2.73 + '@types/react-dom': 18.2.23 - '@radix-ui/react-menu@2.0.6(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0)': + '@radix-ui/react-menu@2.0.6(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-direction': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-id': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-slot': 1.0.2(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@types/react': 18.2.73 - '@types/react-dom': 18.2.23 aria-hidden: 1.2.4 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-remove-scroll: 2.5.5(@types/react@18.2.73)(react@18.2.0) + optionalDependencies: + '@types/react': 18.2.73 + '@types/react-dom': 18.2.23 - '@radix-ui/react-menubar@1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0)': + '@radix-ui/react-menubar@1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-direction': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-id': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@radix-ui/react-menu': 2.0.6(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-menu': 2.0.6(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@types/react': 18.2.73 - '@types/react-dom': 18.2.23 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.2.73 + '@types/react-dom': 18.2.23 - '@radix-ui/react-popover@1.0.7(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0)': + '@radix-ui/react-popover@1.0.7(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-id': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-slot': 1.0.2(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@types/react': 18.2.73 - '@types/react-dom': 18.2.23 aria-hidden: 1.2.4 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-remove-scroll: 2.5.5(@types/react@18.2.73)(react@18.2.0) + optionalDependencies: + '@types/react': 18.2.73 + '@types/react-dom': 18.2.23 - '@radix-ui/react-popper@1.1.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0)': + '@radix-ui/react-popper@1.1.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 - '@floating-ui/react-dom': 2.0.8(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@floating-ui/react-dom': 2.0.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/rect': 1.0.1 - '@types/react': 18.2.73 - '@types/react-dom': 18.2.23 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.2.73 + '@types/react-dom': 18.2.23 - '@radix-ui/react-portal@1.0.0(react-dom@18.2.0)(react@18.2.0)': + '@radix-ui/react-portal@1.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 - '@radix-ui/react-primitive': 1.0.0(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - '@radix-ui/react-portal@1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0)': + '@radix-ui/react-portal@1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.73 - '@types/react-dom': 18.2.23 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.2.73 + '@types/react-dom': 18.2.23 - '@radix-ui/react-presence@1.0.0(react-dom@18.2.0)(react@18.2.0)': + '@radix-ui/react-presence@1.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) @@ -4469,86 +4661,91 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - '@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0)': + '@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@types/react': 18.2.73 - '@types/react-dom': 18.2.23 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.2.73 + '@types/react-dom': 18.2.23 - '@radix-ui/react-primitive@1.0.0(react-dom@18.2.0)(react@18.2.0)': + '@radix-ui/react-primitive@1.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 '@radix-ui/react-slot': 1.0.0(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - '@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0)': + '@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 '@radix-ui/react-slot': 1.0.2(@types/react@18.2.73)(react@18.2.0) - '@types/react': 18.2.73 - '@types/react-dom': 18.2.23 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.2.73 + '@types/react-dom': 18.2.23 - '@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0)': + '@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-direction': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-id': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@types/react': 18.2.73 - '@types/react-dom': 18.2.23 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.2.73 + '@types/react-dom': 18.2.23 - '@radix-ui/react-select@2.0.0(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0)': + '@radix-ui/react-select@2.0.0(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 '@radix-ui/number': 1.0.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-direction': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-id': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-slot': 1.0.2(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.73 - '@types/react-dom': 18.2.23 + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) aria-hidden: 1.2.4 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-remove-scroll: 2.5.5(@types/react@18.2.73)(react@18.2.0) + optionalDependencies: + '@types/react': 18.2.73 + '@types/react-dom': 18.2.23 - '@radix-ui/react-separator@1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0)': + '@radix-ui/react-separator@1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.73 - '@types/react-dom': 18.2.23 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.2.73 + '@types/react-dom': 18.2.23 '@radix-ui/react-slot@1.0.0(react@18.2.0)': dependencies: @@ -4560,79 +4757,84 @@ snapshots: dependencies: '@babel/runtime': 7.24.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@types/react': 18.2.73 react: 18.2.0 + optionalDependencies: + '@types/react': 18.2.73 - '@radix-ui/react-switch@1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0)': + '@radix-ui/react-switch@1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@types/react': 18.2.73 - '@types/react-dom': 18.2.23 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.2.73 + '@types/react-dom': 18.2.23 - '@radix-ui/react-tabs@1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0)': + '@radix-ui/react-tabs@1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-context': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-direction': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-id': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@types/react': 18.2.73 - '@types/react-dom': 18.2.23 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.2.73 + '@types/react-dom': 18.2.23 - '@radix-ui/react-toast@1.1.5(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0)': + '@radix-ui/react-toast@1.1.5(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.73 - '@types/react-dom': 18.2.23 + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.2.73 + '@types/react-dom': 18.2.23 - '@radix-ui/react-tooltip@1.0.7(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0)': + '@radix-ui/react-tooltip@1.0.7(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-id': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-slot': 1.0.2(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.73 - '@types/react-dom': 18.2.23 + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.2.73 + '@types/react-dom': 18.2.23 '@radix-ui/react-use-callback-ref@1.0.0(react@18.2.0)': dependencies: @@ -4642,8 +4844,9 @@ snapshots: '@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.73)(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 - '@types/react': 18.2.73 react: 18.2.0 + optionalDependencies: + '@types/react': 18.2.73 '@radix-ui/react-use-controllable-state@1.0.0(react@18.2.0)': dependencies: @@ -4655,8 +4858,9 @@ snapshots: dependencies: '@babel/runtime': 7.24.1 '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@types/react': 18.2.73 react: 18.2.0 + optionalDependencies: + '@types/react': 18.2.73 '@radix-ui/react-use-escape-keydown@1.0.0(react@18.2.0)': dependencies: @@ -4668,8 +4872,9 @@ snapshots: dependencies: '@babel/runtime': 7.24.1 '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@types/react': 18.2.73 react: 18.2.0 + optionalDependencies: + '@types/react': 18.2.73 '@radix-ui/react-use-layout-effect@1.0.0(react@18.2.0)': dependencies: @@ -4679,45 +4884,50 @@ snapshots: '@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.73)(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 - '@types/react': 18.2.73 react: 18.2.0 + optionalDependencies: + '@types/react': 18.2.73 '@radix-ui/react-use-previous@1.0.1(@types/react@18.2.73)(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 - '@types/react': 18.2.73 react: 18.2.0 + optionalDependencies: + '@types/react': 18.2.73 '@radix-ui/react-use-rect@1.0.1(@types/react@18.2.73)(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 '@radix-ui/rect': 1.0.1 - '@types/react': 18.2.73 react: 18.2.0 + optionalDependencies: + '@types/react': 18.2.73 '@radix-ui/react-use-size@1.0.1(@types/react@18.2.73)(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.73)(react@18.2.0) - '@types/react': 18.2.73 react: 18.2.0 + optionalDependencies: + '@types/react': 18.2.73 - '@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0)': + '@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.73 - '@types/react-dom': 18.2.23 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.2.73 + '@types/react-dom': 18.2.23 '@radix-ui/rect@1.0.1': dependencies: '@babel/runtime': 7.24.1 - '@reactflow/background@11.3.9(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0)': + '@reactflow/background@11.3.9(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@reactflow/core': 11.10.4(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/core': 11.10.4(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) classcat: 5.0.4 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -4726,9 +4936,9 @@ snapshots: - '@types/react' - immer - '@reactflow/controls@11.2.9(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0)': + '@reactflow/controls@11.2.9(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@reactflow/core': 11.10.4(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/core': 11.10.4(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) classcat: 5.0.4 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -4737,7 +4947,7 @@ snapshots: - '@types/react' - immer - '@reactflow/core@11.10.4(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0)': + '@reactflow/core@11.10.4(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@types/d3': 7.4.3 '@types/d3-drag': 3.0.7 @@ -4754,9 +4964,9 @@ snapshots: - '@types/react' - immer - '@reactflow/minimap@11.7.9(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0)': + '@reactflow/minimap@11.7.9(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@reactflow/core': 11.10.4(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/core': 11.10.4(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/d3-selection': 3.0.10 '@types/d3-zoom': 3.0.8 classcat: 5.0.4 @@ -4769,9 +4979,9 @@ snapshots: - '@types/react' - immer - '@reactflow/node-resizer@2.2.9(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0)': + '@reactflow/node-resizer@2.2.9(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@reactflow/core': 11.10.4(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/core': 11.10.4(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) classcat: 5.0.4 d3-drag: 3.0.0 d3-selection: 3.0.0 @@ -4782,9 +4992,9 @@ snapshots: - '@types/react' - immer - '@reactflow/node-toolbar@1.3.9(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0)': + '@reactflow/node-toolbar@1.3.9(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@reactflow/core': 11.10.4(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/core': 11.10.4(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) classcat: 5.0.4 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -4795,7 +5005,7 @@ snapshots: '@remix-run/router@1.15.3': {} - '@rjsf/core@5.18.1(@rjsf/utils@5.18.1)(react@18.2.0)': + '@rjsf/core@5.18.1(@rjsf/utils@5.18.1(react@18.2.0))(react@18.2.0)': dependencies: '@rjsf/utils': 5.18.1(react@18.2.0) lodash: 4.17.21 @@ -4814,7 +5024,7 @@ snapshots: react: 18.2.0 react-is: 18.2.0 - '@rjsf/validator-ajv8@5.18.1(@rjsf/utils@5.18.1)': + '@rjsf/validator-ajv8@5.18.1(@rjsf/utils@5.18.1(react@18.2.0))': dependencies: '@rjsf/utils': 5.18.1(react@18.2.0) ajv: 8.12.0 @@ -4992,6 +5202,8 @@ snapshots: - encoding - supports-color + '@sindresorhus/is@4.6.0': {} + '@tanstack/query-core@5.28.9': {} '@tanstack/react-query@5.28.9(react@18.2.0)': @@ -4999,7 +5211,7 @@ snapshots: '@tanstack/query-core': 5.28.9 react: 18.2.0 - '@tanstack/react-table@8.15.3(react-dom@18.2.0)(react@18.2.0)': + '@tanstack/react-table@8.15.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@tanstack/table-core': 8.15.3 react: 18.2.0 @@ -5219,9 +5431,11 @@ snapshots: '@types/semver@7.5.8': {} + '@types/swagger-schema-official@2.0.25': {} + '@types/unist@2.0.10': {} - '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.2.2)': + '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2)': dependencies: '@eslint-community/regexpp': 4.10.0 '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.2.2) @@ -5236,6 +5450,7 @@ snapshots: natural-compare: 1.4.0 semver: 7.6.0 ts-api-utils: 1.3.0(typescript@5.2.2) + optionalDependencies: typescript: 5.2.2 transitivePeerDependencies: - supports-color @@ -5248,6 +5463,7 @@ snapshots: '@typescript-eslint/visitor-keys': 6.21.0 debug: 4.3.4 eslint: 8.57.0 + optionalDependencies: typescript: 5.2.2 transitivePeerDependencies: - supports-color @@ -5264,6 +5480,7 @@ snapshots: debug: 4.3.4 eslint: 8.57.0 ts-api-utils: 1.3.0(typescript@5.2.2) + optionalDependencies: typescript: 5.2.2 transitivePeerDependencies: - supports-color @@ -5280,6 +5497,7 @@ snapshots: minimatch: 9.0.3 semver: 7.6.0 ts-api-utils: 1.3.0(typescript@5.2.2) + optionalDependencies: typescript: 5.2.2 transitivePeerDependencies: - supports-color @@ -5433,7 +5651,7 @@ snapshots: d3-time-format: 4.1.0 internmap: 2.0.3 - '@vitejs/plugin-react@4.2.1(vite@5.2.7)': + '@vitejs/plugin-react@4.2.1(vite@5.2.7(@types/node@20.12.2))': dependencies: '@babel/core': 7.24.3 '@babel/plugin-transform-react-jsx-self': 7.24.1(@babel/core@7.24.3) @@ -5457,7 +5675,7 @@ snapshots: - supports-color ajv-formats@2.1.1(ajv@8.12.0): - dependencies: + optionalDependencies: ajv: 8.12.0 ajv@6.12.6: @@ -5635,6 +5853,8 @@ snapshots: get-intrinsic: 1.2.4 set-function-length: 1.2.2 + call-me-maybe@1.0.2: {} + callsites@3.1.0: {} camelcase-css@2.0.1: {} @@ -5652,6 +5872,8 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 + char-regex@1.0.2: {} + character-entities-legacy@1.1.4: {} character-entities@1.2.4: {} @@ -5678,13 +5900,19 @@ snapshots: classnames@2.5.1: {} + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + clsx@2.0.0: {} clsx@2.1.0: {} - cmdk@0.2.1(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0): + cmdk@0.2.1(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@radix-ui/react-dialog': 1.0.0(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-dialog': 1.0.0(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) transitivePeerDependencies: @@ -5729,6 +5957,15 @@ snapshots: convert-source-map@2.0.0: {} + cosmiconfig@9.0.0(typescript@5.5.2): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + optionalDependencies: + typescript: 5.5.2 + cron-parser@4.9.0: dependencies: luxon: 3.4.4 @@ -5898,11 +6135,19 @@ snapshots: emoji-regex@9.2.2: {} + emojilib@2.4.0: {} + enhanced-resolve@5.16.0: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 + env-paths@2.2.1: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + es-abstract@1.23.3: dependencies: array-buffer-byte-length: 1.0.1 @@ -5995,6 +6240,8 @@ snapshots: is-date-object: 1.0.5 is-symbol: 1.0.4 + es6-promise@3.3.1: {} + esbuild@0.20.2: optionalDependencies: '@esbuild/aix-ppc64': 0.20.2 @@ -6027,22 +6274,22 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.29.1)(eslint@8.57.0): + eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0))(eslint@8.57.0): dependencies: confusing-browser-globals: 1.0.11 eslint: 8.57.0 - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) object.assign: 4.1.5 object.entries: 1.1.8 semver: 6.3.1 - eslint-config-airbnb-typescript@17.1.0(@typescript-eslint/eslint-plugin@6.21.0)(@typescript-eslint/parser@6.21.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0): + eslint-config-airbnb-typescript@17.1.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2))(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0))(eslint@8.57.0): dependencies: - '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.2.2) + '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2) '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.2.2) eslint: 8.57.0 - eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.29.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) eslint-config-prettier@9.1.0(eslint@8.57.0): dependencies: @@ -6056,13 +6303,13 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0): + eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-plugin-import@2.29.1)(eslint@8.57.0): dependencies: debug: 4.3.4 enhanced-resolve: 5.16.0 eslint: 8.57.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) fast-glob: 3.3.2 get-tsconfig: 4.7.3 is-core-module: 2.13.1 @@ -6073,19 +6320,19 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + eslint-module-utils@2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0): dependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.2.2) debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.2.2) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-plugin-import@2.29.1)(eslint@8.57.0) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): dependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.2.2) array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 @@ -6094,7 +6341,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -6104,18 +6351,22 @@ snapshots: object.values: 1.2.0 semver: 6.3.1 tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.2.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.2.5): + eslint-plugin-prettier@5.1.3(@types/eslint@8.56.7)(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.2.5): dependencies: eslint: 8.57.0 - eslint-config-prettier: 9.1.0(eslint@8.57.0) prettier: 3.2.5 prettier-linter-helpers: 1.0.0 synckit: 0.8.8 + optionalDependencies: + '@types/eslint': 8.56.7 + eslint-config-prettier: 9.1.0(eslint@8.57.0) eslint-plugin-react-hooks@4.6.0(eslint@8.57.0): dependencies: @@ -6147,11 +6398,12 @@ snapshots: semver: 6.3.1 string.prototype.matchall: 4.0.11 - eslint-plugin-unused-imports@3.1.0(@typescript-eslint/eslint-plugin@6.21.0)(eslint@8.57.0): + eslint-plugin-unused-imports@3.1.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0): dependencies: - '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.2.2) eslint: 8.57.0 eslint-rule-composer: 0.3.0 + optionalDependencies: + '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2) eslint-rule-composer@0.3.0: {} @@ -6225,6 +6477,8 @@ snapshots: esutils@2.0.3: {} + eta@2.2.0: {} + fast-deep-equal@3.1.3: {} fast-diff@1.3.0: {} @@ -6243,6 +6497,8 @@ snapshots: fast-plist@0.1.3: {} + fast-safe-stringify@2.1.1: {} + fastq@1.17.1: dependencies: reusify: 1.0.4 @@ -6311,6 +6567,8 @@ snapshots: gensync@1.0.0-beta.2: {} + get-caller-file@2.0.5: {} + get-intrinsic@1.2.4: dependencies: es-errors: 1.3.0 @@ -6432,6 +6690,8 @@ snapshots: dependencies: react-is: 16.13.1 + http2-client@1.3.5: {} + https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 @@ -6479,6 +6739,8 @@ snapshots: call-bind: 1.0.7 get-intrinsic: 1.2.4 + is-arrayish@0.2.1: {} + is-async-function@2.0.0: dependencies: has-tostringtag: 1.0.2 @@ -6597,7 +6859,7 @@ snapshots: jiti@1.21.0: {} jotai@2.7.2(@types/react@18.2.73)(react@18.2.0): - dependencies: + optionalDependencies: '@types/react': 18.2.73 react: 18.2.0 @@ -6613,6 +6875,8 @@ snapshots: json-buffer@3.0.1: {} + json-parse-even-better-errors@2.3.1: {} + json-schema-compare@0.2.2: dependencies: lodash: 4.17.21 @@ -6755,16 +7019,62 @@ snapshots: natural-compare@1.4.0: {} + node-emoji@2.1.3: + dependencies: + '@sindresorhus/is': 4.6.0 + char-regex: 1.0.2 + emojilib: 2.4.0 + skin-tone: 2.0.0 + + node-fetch-h2@2.3.0: + dependencies: + http2-client: 1.3.5 + node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 + node-readfiles@0.2.0: + dependencies: + es6-promise: 3.3.1 + node-releases@2.0.14: {} normalize-path@3.0.0: {} normalize-range@0.1.2: {} + oas-kit-common@1.0.8: + dependencies: + fast-safe-stringify: 2.1.1 + + oas-linter@3.2.2: + dependencies: + '@exodus/schemasafe': 1.3.0 + should: 13.2.3 + yaml: 1.10.2 + + oas-resolver@2.5.6: + dependencies: + node-fetch-h2: 2.3.0 + oas-kit-common: 1.0.8 + reftools: 1.1.9 + yaml: 1.10.2 + yargs: 17.7.2 + + oas-schema-walker@1.1.5: {} + + oas-validator@5.0.8: + dependencies: + call-me-maybe: 1.0.2 + oas-kit-common: 1.0.8 + oas-linter: 3.2.2 + oas-resolver: 2.5.6 + oas-schema-walker: 1.1.5 + reftools: 1.1.9 + should: 13.2.3 + yaml: 1.10.2 + object-assign@4.1.1: {} object-hash@3.0.0: {} @@ -6845,6 +7155,13 @@ snapshots: is-decimal: 1.0.4 is-hexadecimal: 1.0.4 + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.24.2 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + path-exists@4.0.0: {} path-is-absolute@1.0.1: {} @@ -6885,8 +7202,9 @@ snapshots: postcss-load-config@4.0.2(postcss@8.4.38): dependencies: lilconfig: 3.1.1 - postcss: 8.4.38 yaml: 2.4.1 + optionalDependencies: + postcss: 8.4.38 postcss-nested@6.0.1(postcss@8.4.38): dependencies: @@ -6914,6 +7232,8 @@ snapshots: prettier@3.2.5: {} + prettier@3.3.2: {} + prism-react-renderer@2.3.1(react@18.2.0): dependencies: '@types/prismjs': 1.26.3 @@ -6968,32 +7288,35 @@ snapshots: react-remove-scroll-bar@2.3.6(@types/react@18.2.73)(react@18.2.0): dependencies: - '@types/react': 18.2.73 react: 18.2.0 react-style-singleton: 2.2.1(@types/react@18.2.73)(react@18.2.0) tslib: 2.6.2 + optionalDependencies: + '@types/react': 18.2.73 react-remove-scroll@2.5.4(@types/react@18.2.73)(react@18.2.0): dependencies: - '@types/react': 18.2.73 react: 18.2.0 react-remove-scroll-bar: 2.3.6(@types/react@18.2.73)(react@18.2.0) react-style-singleton: 2.2.1(@types/react@18.2.73)(react@18.2.0) tslib: 2.6.2 use-callback-ref: 1.3.2(@types/react@18.2.73)(react@18.2.0) use-sidecar: 1.1.2(@types/react@18.2.73)(react@18.2.0) + optionalDependencies: + '@types/react': 18.2.73 react-remove-scroll@2.5.5(@types/react@18.2.73)(react@18.2.0): dependencies: - '@types/react': 18.2.73 react: 18.2.0 react-remove-scroll-bar: 2.3.6(@types/react@18.2.73)(react@18.2.0) react-style-singleton: 2.2.1(@types/react@18.2.73)(react@18.2.0) tslib: 2.6.2 use-callback-ref: 1.3.2(@types/react@18.2.73)(react@18.2.0) use-sidecar: 1.1.2(@types/react@18.2.73)(react@18.2.0) + optionalDependencies: + '@types/react': 18.2.73 - react-router-dom@6.22.3(react-dom@18.2.0)(react@18.2.0): + react-router-dom@6.22.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: '@remix-run/router': 1.15.3 react: 18.2.0 @@ -7007,11 +7330,12 @@ snapshots: react-style-singleton@2.2.1(@types/react@18.2.73)(react@18.2.0): dependencies: - '@types/react': 18.2.73 get-nonce: 1.0.1 invariant: 2.2.4 react: 18.2.0 tslib: 2.6.2 + optionalDependencies: + '@types/react': 18.2.73 react-syntax-highlighter@15.5.0(react@18.2.0): dependencies: @@ -7026,14 +7350,14 @@ snapshots: dependencies: loose-envify: 1.4.0 - reactflow@11.10.4(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0): + reactflow@11.10.4(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@reactflow/background': 11.3.9(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) - '@reactflow/controls': 11.2.9(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) - '@reactflow/core': 11.10.4(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) - '@reactflow/minimap': 11.7.9(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) - '@reactflow/node-resizer': 2.2.9(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) - '@reactflow/node-toolbar': 1.3.9(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/background': 11.3.9(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@reactflow/controls': 11.2.9(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@reactflow/core': 11.10.4(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@reactflow/minimap': 11.7.9(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@reactflow/node-resizer': 2.2.9(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@reactflow/node-toolbar': 1.3.9(@types/react@18.2.73)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) transitivePeerDependencies: @@ -7074,6 +7398,8 @@ snapshots: parse-entities: 2.0.0 prismjs: 1.27.0 + reftools@1.1.9: {} + regenerator-runtime@0.14.1: {} regexp.prototype.flags@1.5.2: @@ -7083,6 +7409,8 @@ snapshots: es-errors: 1.3.0 set-function-name: 2.0.2 + require-directory@2.1.1: {} + require-from-string@2.0.2: {} resolve-from@4.0.0: {} @@ -7183,6 +7511,32 @@ snapshots: shebang-regex@3.0.0: {} + should-equal@2.0.0: + dependencies: + should-type: 1.4.0 + + should-format@3.0.3: + dependencies: + should-type: 1.4.0 + should-type-adaptors: 1.1.0 + + should-type-adaptors@1.1.0: + dependencies: + should-type: 1.4.0 + should-util: 1.0.1 + + should-type@1.4.0: {} + + should-util@1.0.1: {} + + should@13.2.3: + dependencies: + should-equal: 2.0.0 + should-format: 3.0.3 + should-type: 1.4.0 + should-type-adaptors: 1.1.0 + should-util: 1.0.1 + side-channel@1.0.6: dependencies: call-bind: 1.0.7 @@ -7192,6 +7546,10 @@ snapshots: signal-exit@4.1.0: {} + skin-tone@2.0.0: + dependencies: + unicode-emoji-modifier-base: 1.0.0 + slash@3.0.0: {} source-map-js@1.2.0: {} @@ -7278,6 +7636,41 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + swagger-schema-official@2.0.0-bab6bed: {} + + swagger-typescript-api@13.0.11: + dependencies: + '@types/swagger-schema-official': 2.0.25 + cosmiconfig: 9.0.0(typescript@5.5.2) + didyoumean: 1.2.2 + eta: 2.2.0 + js-yaml: 4.1.0 + lodash: 4.17.21 + nanoid: 3.3.7 + node-emoji: 2.1.3 + prettier: 3.3.2 + swagger-schema-official: 2.0.0-bab6bed + swagger2openapi: 7.0.8 + typescript: 5.5.2 + transitivePeerDependencies: + - encoding + + swagger2openapi@7.0.8: + dependencies: + call-me-maybe: 1.0.2 + node-fetch: 2.7.0 + node-fetch-h2: 2.3.0 + node-readfiles: 0.2.0 + oas-kit-common: 1.0.8 + oas-resolver: 2.5.6 + oas-schema-walker: 1.1.5 + oas-validator: 5.0.8 + reftools: 1.1.9 + yaml: 1.10.2 + yargs: 17.7.2 + transitivePeerDependencies: + - encoding + synckit@0.8.8: dependencies: '@pkgr/core': 0.1.1 @@ -7402,6 +7795,8 @@ snapshots: typescript@5.2.2: {} + typescript@5.5.2: {} + unbox-primitive@1.0.2: dependencies: call-bind: 1.0.7 @@ -7411,6 +7806,8 @@ snapshots: undici-types@5.26.5: {} + unicode-emoji-modifier-base@1.0.0: {} + unplugin@1.0.1: dependencies: acorn: 8.11.3 @@ -7430,16 +7827,18 @@ snapshots: use-callback-ref@1.3.2(@types/react@18.2.73)(react@18.2.0): dependencies: - '@types/react': 18.2.73 react: 18.2.0 tslib: 2.6.2 + optionalDependencies: + '@types/react': 18.2.73 use-sidecar@1.1.2(@types/react@18.2.73)(react@18.2.0): dependencies: - '@types/react': 18.2.73 detect-node-es: 1.1.0 react: 18.2.0 tslib: 2.6.2 + optionalDependencies: + '@types/react': 18.2.73 use-sync-external-store@1.2.0(react@18.2.0): dependencies: @@ -7462,7 +7861,7 @@ snapshots: validate.io-number@1.0.3: {} - vite-plugin-eslint@1.8.1(eslint@8.57.0)(vite@5.2.7): + vite-plugin-eslint@1.8.1(eslint@8.57.0)(vite@5.2.7(@types/node@20.12.2)): dependencies: '@rollup/pluginutils': 4.2.1 '@types/eslint': 8.56.7 @@ -7472,11 +7871,11 @@ snapshots: vite@5.2.7(@types/node@20.12.2): dependencies: - '@types/node': 20.12.2 esbuild: 0.20.2 postcss: 8.4.38 rollup: 4.13.2 optionalDependencies: + '@types/node': 20.12.2 fsevents: 2.3.3 webidl-conversions@3.0.1: {} @@ -7548,18 +7947,35 @@ snapshots: xtend@4.0.2: {} + y18n@5.0.8: {} + yallist@3.1.1: {} yallist@4.0.0: {} + yaml@1.10.2: {} + yaml@2.4.1: {} + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + yocto-queue@0.1.0: {} zod@3.22.4: {} zustand@4.5.2(@types/react@18.2.73)(react@18.2.0): dependencies: + use-sync-external-store: 1.2.0(react@18.2.0) + optionalDependencies: '@types/react': 18.2.73 react: 18.2.0 - use-sync-external-store: 1.2.0(react@18.2.0) diff --git a/frontend/app/src/components/ui/envvar.tsx b/frontend/app/src/components/ui/envvar.tsx index 7617ce4ef..a1599e056 100644 --- a/frontend/app/src/components/ui/envvar.tsx +++ b/frontend/app/src/components/ui/envvar.tsx @@ -33,7 +33,7 @@ const EnvGroupArray: React.FC = ({ if (!values) { setValues([]); } - }, [values]); + }, [setValues, values]); const handleValueChange = (index: number, key: string, value: any) => { const newValues = [...values]; diff --git a/frontend/app/src/lib/api/generated/Api.ts b/frontend/app/src/lib/api/generated/Api.ts index 7d07c8e5a..3049e5106 100644 --- a/frontend/app/src/lib/api/generated/Api.ts +++ b/frontend/app/src/lib/api/generated/Api.ts @@ -82,8 +82,8 @@ import { WorkflowRunStatusList, WorkflowVersion, WorkflowVersionDefinition, -} from "./data-contracts"; -import { ContentType, HttpClient, RequestParams } from "./http-client"; +} from './data-contracts'; +import { ContentType, HttpClient, RequestParams } from './http-client'; export class Api extends HttpClient { /** @@ -97,7 +97,7 @@ export class Api extends HttpClient this.request({ path: `/api/ready`, - method: "GET", + method: 'GET', ...params, }); /** @@ -111,7 +111,7 @@ export class Api extends HttpClient this.request({ path: `/api/live`, - method: "GET", + method: 'GET', ...params, }); /** @@ -125,8 +125,8 @@ export class Api extends HttpClient this.request({ path: `/api/v1/meta`, - method: "GET", - format: "json", + method: 'GET', + format: 'json', ...params, }); /** @@ -140,8 +140,8 @@ export class Api extends HttpClient this.request({ path: `/api/v1/cloud/metadata`, - method: "GET", - format: "json", + method: 'GET', + format: 'json', ...params, }); /** @@ -156,9 +156,9 @@ export class Api extends HttpClient this.request({ path: `/api/v1/meta/integrations`, - method: "GET", + method: 'GET', secure: true, - format: "json", + format: 'json', ...params, }); /** @@ -172,10 +172,10 @@ export class Api extends HttpClient this.request({ path: `/api/v1/users/login`, - method: "POST", + method: 'POST', body: data, type: ContentType.Json, - format: "json", + format: 'json', ...params, }); /** @@ -189,7 +189,7 @@ export class Api extends HttpClient this.request({ path: `/api/v1/users/google/start`, - method: "GET", + method: 'GET', ...params, }); /** @@ -203,7 +203,7 @@ export class Api extends HttpClient this.request({ path: `/api/v1/users/google/callback`, - method: "GET", + method: 'GET', ...params, }); /** @@ -217,7 +217,7 @@ export class Api extends HttpClient this.request({ path: `/api/v1/users/github/start`, - method: "GET", + method: 'GET', ...params, }); /** @@ -231,7 +231,7 @@ export class Api extends HttpClient this.request({ path: `/api/v1/users/github/callback`, - method: "GET", + method: 'GET', ...params, }); /** @@ -246,7 +246,7 @@ export class Api extends HttpClient this.request({ path: `/api/v1/tenants/${tenant}/slack/start`, - method: "GET", + method: 'GET', secure: true, ...params, }); @@ -262,7 +262,7 @@ export class Api extends HttpClient this.request({ path: `/api/v1/users/slack/callback`, - method: "GET", + method: 'GET', secure: true, ...params, }); @@ -277,7 +277,7 @@ export class Api extends HttpClient this.request({ path: `/api/v1/sns/${tenant}/${event}`, - method: "POST", + method: 'POST', ...params, }); /** @@ -292,9 +292,9 @@ export class Api extends HttpClient this.request({ path: `/api/v1/tenants/${tenant}/sns`, - method: "GET", + method: 'GET', secure: true, - format: "json", + format: 'json', ...params, }); /** @@ -309,11 +309,11 @@ export class Api extends HttpClient this.request({ path: `/api/v1/tenants/${tenant}/sns`, - method: "POST", + method: 'POST', body: data, secure: true, type: ContentType.Json, - format: "json", + format: 'json', ...params, }); /** @@ -328,11 +328,11 @@ export class Api extends HttpClient this.request({ path: `/api/v1/tenants/${tenant}/alerting-email-groups`, - method: "POST", + method: 'POST', body: data, secure: true, type: ContentType.Json, - format: "json", + format: 'json', ...params, }); /** @@ -347,9 +347,9 @@ export class Api extends HttpClient this.request({ path: `/api/v1/tenants/${tenant}/alerting-email-groups`, - method: "GET", + method: 'GET', secure: true, - format: "json", + format: 'json', ...params, }); /** @@ -364,9 +364,9 @@ export class Api extends HttpClient this.request({ path: `/api/v1/tenants/${tenant}/resource-policy`, - method: "GET", + method: 'GET', secure: true, - format: "json", + format: 'json', ...params, }); /** @@ -385,11 +385,11 @@ export class Api extends HttpClient this.request({ path: `/api/v1/alerting-email-groups/${alertEmailGroup}`, - method: "PATCH", + method: 'PATCH', body: data, secure: true, type: ContentType.Json, - format: "json", + format: 'json', ...params, }); /** @@ -404,7 +404,7 @@ export class Api extends HttpClient this.request({ path: `/api/v1/alerting-email-groups/${alertEmailGroup}`, - method: "DELETE", + method: 'DELETE', secure: true, ...params, }); @@ -420,7 +420,7 @@ export class Api extends HttpClient this.request({ path: `/api/v1/sns/${sns}`, - method: "DELETE", + method: 'DELETE', secure: true, ...params, }); @@ -436,9 +436,9 @@ export class Api extends HttpClient this.request({ path: `/api/v1/tenants/${tenant}/slack`, - method: "GET", + method: 'GET', secure: true, - format: "json", + format: 'json', ...params, }); /** @@ -453,7 +453,7 @@ export class Api extends HttpClient this.request({ path: `/api/v1/slack/${slack}`, - method: "DELETE", + method: 'DELETE', secure: true, ...params, }); @@ -469,9 +469,9 @@ export class Api extends HttpClient this.request({ path: `/api/v1/users/current`, - method: "GET", + method: 'GET', secure: true, - format: "json", + format: 'json', ...params, }); /** @@ -486,11 +486,11 @@ export class Api extends HttpClient this.request({ path: `/api/v1/users/password`, - method: "POST", + method: 'POST', body: data, secure: true, type: ContentType.Json, - format: "json", + format: 'json', ...params, }); /** @@ -504,10 +504,10 @@ export class Api extends HttpClient this.request({ path: `/api/v1/users/register`, - method: "POST", + method: 'POST', body: data, type: ContentType.Json, - format: "json", + format: 'json', ...params, }); /** @@ -522,9 +522,9 @@ export class Api extends HttpClient this.request({ path: `/api/v1/users/logout`, - method: "POST", + method: 'POST', secure: true, - format: "json", + format: 'json', ...params, }); /** @@ -539,9 +539,9 @@ export class Api extends HttpClient this.request({ path: `/api/v1/users/memberships`, - method: "GET", + method: 'GET', secure: true, - format: "json", + format: 'json', ...params, }); /** @@ -556,9 +556,9 @@ export class Api extends HttpClient this.request({ path: `/api/v1/users/invites`, - method: "GET", + method: 'GET', secure: true, - format: "json", + format: 'json', ...params, }); /** @@ -573,7 +573,7 @@ export class Api extends HttpClient this.request({ path: `/api/v1/users/invites/accept`, - method: "POST", + method: 'POST', body: data, secure: true, type: ContentType.Json, @@ -591,7 +591,7 @@ export class Api extends HttpClient this.request({ path: `/api/v1/users/invites/reject`, - method: "POST", + method: 'POST', body: data, secure: true, type: ContentType.Json, @@ -609,11 +609,11 @@ export class Api extends HttpClient this.request({ path: `/api/v1/tenants`, - method: "POST", + method: 'POST', body: data, secure: true, type: ContentType.Json, - format: "json", + format: 'json', ...params, }); /** @@ -628,11 +628,11 @@ export class Api extends HttpClient this.request({ path: `/api/v1/tenants/${tenant}`, - method: "PATCH", + method: 'PATCH', body: data, secure: true, type: ContentType.Json, - format: "json", + format: 'json', ...params, }); /** @@ -647,9 +647,9 @@ export class Api extends HttpClient this.request({ path: `/api/v1/tenants/${tenant}/alerting/settings`, - method: "GET", + method: 'GET', secure: true, - format: "json", + format: 'json', ...params, }); /** @@ -664,11 +664,11 @@ export class Api extends HttpClient this.request({ path: `/api/v1/tenants/${tenant}/invites`, - method: "POST", + method: 'POST', body: data, secure: true, type: ContentType.Json, - format: "json", + format: 'json', ...params, }); /** @@ -683,9 +683,9 @@ export class Api extends HttpClient this.request({ path: `/api/v1/tenants/${tenant}/invites`, - method: "GET", + method: 'GET', secure: true, - format: "json", + format: 'json', ...params, }); /** @@ -704,11 +704,11 @@ export class Api extends HttpClient this.request({ path: `/api/v1/tenants/${tenant}/invites/${tenantInvite}`, - method: "PATCH", + method: 'PATCH', body: data, secure: true, type: ContentType.Json, - format: "json", + format: 'json', ...params, }); /** @@ -722,9 +722,9 @@ export class Api extends HttpClient this.request({ path: `/api/v1/tenants/${tenant}/invites/${tenantInvite}`, - method: "DELETE", + method: 'DELETE', secure: true, - format: "json", + format: 'json', ...params, }); /** @@ -739,11 +739,11 @@ export class Api extends HttpClient this.request({ path: `/api/v1/tenants/${tenant}/api-tokens`, - method: "POST", + method: 'POST', body: data, secure: true, type: ContentType.Json, - format: "json", + format: 'json', ...params, }); /** @@ -758,9 +758,9 @@ export class Api extends HttpClient this.request({ path: `/api/v1/tenants/${tenant}/api-tokens`, - method: "GET", + method: 'GET', secure: true, - format: "json", + format: 'json', ...params, }); /** @@ -775,7 +775,7 @@ export class Api extends HttpClient this.request({ path: `/api/v1/api-tokens/${apiToken}`, - method: "POST", + method: 'POST', secure: true, ...params, }); @@ -803,10 +803,10 @@ export class Api extends HttpClient this.request({ path: `/api/v1/tenants/${tenant}/queue-metrics`, - method: "GET", + method: 'GET', query: query, secure: true, - format: "json", + format: 'json', ...params, }); /** @@ -853,10 +853,10 @@ export class Api extends HttpClient this.request({ path: `/api/v1/tenants/${tenant}/events`, - method: "GET", + method: 'GET', query: query, secure: true, - format: "json", + format: 'json', ...params, }); /** @@ -871,11 +871,11 @@ export class Api extends HttpClient this.request({ path: `/api/v1/tenants/${tenant}/events`, - method: "POST", + method: 'POST', body: data, secure: true, type: ContentType.Json, - format: "json", + format: 'json', ...params, }); /** @@ -890,11 +890,11 @@ export class Api extends HttpClient this.request({ path: `/api/v1/tenants/${tenant}/events/replay`, - method: "POST", + method: 'POST', body: data, secure: true, type: ContentType.Json, - format: "json", + format: 'json', ...params, }); /** @@ -909,9 +909,9 @@ export class Api extends HttpClient this.request({ path: `/api/v1/tenants/${tenant}/members`, - method: "GET", + method: 'GET', secure: true, - format: "json", + format: 'json', ...params, }); /** @@ -926,9 +926,9 @@ export class Api extends HttpClient this.request({ path: `/api/v1/tenants/${tenant}/members/${member}`, - method: "DELETE", + method: 'DELETE', secure: true, - format: "json", + format: 'json', ...params, }); /** @@ -943,9 +943,9 @@ export class Api extends HttpClient this.request({ path: `/api/v1/events/${event}/data`, - method: "GET", + method: 'GET', secure: true, - format: "json", + format: 'json', ...params, }); /** @@ -960,9 +960,9 @@ export class Api extends HttpClient this.request({ path: `/api/v1/tenants/${tenant}/events/keys`, - method: "GET", + method: 'GET', secure: true, - format: "json", + format: 'json', ...params, }); /** @@ -977,9 +977,9 @@ export class Api extends HttpClient this.request({ path: `/api/v1/tenants/${tenant}/workflows`, - method: "GET", + method: 'GET', secure: true, - format: "json", + format: 'json', ...params, }); /** @@ -999,11 +999,11 @@ export class Api extends HttpClient({ path: `/api/v1/tenants/${tenant}/workflows/cancel`, - method: "POST", + method: 'POST', body: data, secure: true, type: ContentType.Json, - format: "json", + format: 'json', ...params, }); /** @@ -1018,9 +1018,9 @@ export class Api extends HttpClient this.request({ path: `/api/v1/workflows/${workflow}`, - method: "GET", + method: 'GET', secure: true, - format: "json", + format: 'json', ...params, }); /** @@ -1035,7 +1035,7 @@ export class Api extends HttpClient this.request({ path: `/api/v1/workflows/${workflow}`, - method: "DELETE", + method: 'DELETE', secure: true, ...params, }); @@ -1063,10 +1063,10 @@ export class Api extends HttpClient this.request({ path: `/api/v1/workflows/${workflow}/versions`, - method: "GET", + method: 'GET', query: query, secure: true, - format: "json", + format: 'json', ...params, }); /** @@ -1094,12 +1094,12 @@ export class Api extends HttpClient this.request({ path: `/api/v1/workflows/${workflow}/trigger`, - method: "POST", + method: 'POST', query: query, body: data, secure: true, type: ContentType.Json, - format: "json", + format: 'json', ...params, }); /** @@ -1126,10 +1126,10 @@ export class Api extends HttpClient this.request({ path: `/api/v1/workflows/${workflow}/versions/definition`, - method: "GET", + method: 'GET', query: query, secure: true, - format: "json", + format: 'json', ...params, }); /** @@ -1153,10 +1153,10 @@ export class Api extends HttpClient this.request({ path: `/api/v1/workflows/${workflow}/metrics`, - method: "GET", + method: 'GET', query: query, secure: true, - format: "json", + format: 'json', ...params, }); /** @@ -1194,10 +1194,10 @@ export class Api extends HttpClient this.request({ path: `/api/v1/step-runs/${stepRun}/logs`, - method: "GET", + method: 'GET', query: query, secure: true, - format: "json", + format: 'json', ...params, }); /** @@ -1227,10 +1227,10 @@ export class Api extends HttpClient this.request({ path: `/api/v1/step-runs/${stepRun}/events`, - method: "GET", + method: 'GET', query: query, secure: true, - format: "json", + format: 'json', ...params, }); /** @@ -1260,10 +1260,10 @@ export class Api extends HttpClient this.request({ path: `/api/v1/step-runs/${stepRun}/archives`, - method: "GET", + method: 'GET', query: query, secure: true, - format: "json", + format: 'json', ...params, }); /** @@ -1328,10 +1328,10 @@ export class Api extends HttpClient this.request({ path: `/api/v1/tenants/${tenant}/workflows/runs`, - method: "GET", + method: 'GET', query: query, secure: true, - format: "json", + format: 'json', ...params, }); /** @@ -1384,10 +1384,10 @@ export class Api extends HttpClient this.request({ path: `/api/v1/tenants/${tenant}/workflows/runs/metrics`, - method: "GET", + method: 'GET', query: query, secure: true, - format: "json", + format: 'json', ...params, }); /** @@ -1402,9 +1402,9 @@ export class Api extends HttpClient this.request({ path: `/api/v1/tenants/${tenant}/workflow-runs/${workflowRun}`, - method: "GET", + method: 'GET', secure: true, - format: "json", + format: 'json', ...params, }); /** @@ -1419,9 +1419,9 @@ export class Api extends HttpClient this.request({ path: `/api/v1/tenants/${tenant}/step-runs/${stepRun}`, - method: "GET", + method: 'GET', secure: true, - format: "json", + format: 'json', ...params, }); /** @@ -1436,11 +1436,11 @@ export class Api extends HttpClient this.request({ path: `/api/v1/tenants/${tenant}/step-runs/${stepRun}/rerun`, - method: "POST", + method: 'POST', body: data, secure: true, type: ContentType.Json, - format: "json", + format: 'json', ...params, }); /** @@ -1455,9 +1455,9 @@ export class Api extends HttpClient this.request({ path: `/api/v1/tenants/${tenant}/step-runs/${stepRun}/cancel`, - method: "POST", + method: 'POST', secure: true, - format: "json", + format: 'json', ...params, }); /** @@ -1472,9 +1472,9 @@ export class Api extends HttpClient this.request({ path: `/api/v1/tenants/${tenant}/step-runs/${stepRun}/schema`, - method: "GET", + method: 'GET', secure: true, - format: "json", + format: 'json', ...params, }); /** @@ -1489,9 +1489,9 @@ export class Api extends HttpClient this.request({ path: `/api/v1/tenants/${tenant}/worker`, - method: "GET", + method: 'GET', secure: true, - format: "json", + format: 'json', ...params, }); /** @@ -1506,11 +1506,11 @@ export class Api extends HttpClient this.request({ path: `/api/v1/workers/${worker}`, - method: "PATCH", + method: 'PATCH', body: data, secure: true, type: ContentType.Json, - format: "json", + format: 'json', ...params, }); /** @@ -1525,9 +1525,9 @@ export class Api extends HttpClient this.request({ path: `/api/v1/workers/${worker}`, - method: "GET", + method: 'GET', secure: true, - format: "json", + format: 'json', ...params, }); /** @@ -1541,9 +1541,9 @@ export class Api extends HttpClient this.request({ path: `/api/v1/tenants/${tenant}/webhook-workers`, - method: "GET", + method: 'GET', secure: true, - format: "json", + format: 'json', ...params, }); /** @@ -1557,11 +1557,11 @@ export class Api extends HttpClient this.request({ path: `/api/v1/tenants/${tenant}/webhook-workers`, - method: "POST", + method: 'POST', body: data, secure: true, type: ContentType.Json, - format: "json", + format: 'json', ...params, }); /** @@ -1575,7 +1575,7 @@ export class Api extends HttpClient this.request({ path: `/api/v1/webhook-workers/${webhook}`, - method: "DELETE", + method: 'DELETE', secure: true, ...params, }); diff --git a/frontend/app/src/lib/api/generated/data-contracts.ts b/frontend/app/src/lib/api/generated/data-contracts.ts index 2dd8224bb..083f56b2c 100644 --- a/frontend/app/src/lib/api/generated/data-contracts.ts +++ b/frontend/app/src/lib/api/generated/data-contracts.ts @@ -234,17 +234,17 @@ export interface TenantMemberList { } export enum TenantMemberRole { - OWNER = "OWNER", - ADMIN = "ADMIN", - MEMBER = "MEMBER", + OWNER = 'OWNER', + ADMIN = 'ADMIN', + MEMBER = 'MEMBER', } export enum TenantResource { - WORKER = "WORKER", - EVENT = "EVENT", - WORKFLOW_RUN = "WORKFLOW_RUN", - CRON = "CRON", - SCHEDULE = "SCHEDULE", + WORKER = 'WORKER', + EVENT = 'EVENT', + WORKFLOW_RUN = 'WORKFLOW_RUN', + CRON = 'CRON', + SCHEDULE = 'SCHEDULE', } export interface TenantResourceLimit { @@ -464,12 +464,12 @@ export interface EventWorkflowRunSummary { } export enum EventOrderByField { - CreatedAt = "createdAt", + CreatedAt = 'createdAt', } export enum EventOrderByDirection { - Asc = "asc", - Desc = "desc", + Asc = 'asc', + Desc = 'desc', } export type EventSearch = string; @@ -515,7 +515,7 @@ export interface WorkflowConcurrency { */ maxRuns: number; /** The strategy to use when the concurrency limit is reached. */ - limitStrategy: "CANCEL_IN_PROGRESS" | "DROP_NEWEST" | "QUEUE_NEWEST" | "GROUP_ROUND_ROBIN"; + limitStrategy: 'CANCEL_IN_PROGRESS' | 'DROP_NEWEST' | 'QUEUE_NEWEST' | 'GROUP_ROUND_ROBIN'; /** An action which gets the concurrency group for the WorkflowRun. */ getConcurrencyGroup: string; } @@ -655,12 +655,12 @@ export interface WorkflowRunsMetricsCounts { } export enum WorkflowRunStatus { - PENDING = "PENDING", - RUNNING = "RUNNING", - SUCCEEDED = "SUCCEEDED", - FAILED = "FAILED", - CANCELLED = "CANCELLED", - QUEUED = "QUEUED", + PENDING = 'PENDING', + RUNNING = 'RUNNING', + SUCCEEDED = 'SUCCEEDED', + FAILED = 'FAILED', + CANCELLED = 'CANCELLED', + QUEUED = 'QUEUED', } export type WorkflowRunStatusList = WorkflowRunStatus[]; @@ -670,21 +670,21 @@ export interface WorkflowRunsCancelRequest { } export enum JobRunStatus { - PENDING = "PENDING", - RUNNING = "RUNNING", - SUCCEEDED = "SUCCEEDED", - FAILED = "FAILED", - CANCELLED = "CANCELLED", + PENDING = 'PENDING', + RUNNING = 'RUNNING', + SUCCEEDED = 'SUCCEEDED', + FAILED = 'FAILED', + CANCELLED = 'CANCELLED', } export enum StepRunStatus { - PENDING = "PENDING", - PENDING_ASSIGNMENT = "PENDING_ASSIGNMENT", - ASSIGNED = "ASSIGNED", - RUNNING = "RUNNING", - SUCCEEDED = "SUCCEEDED", - FAILED = "FAILED", - CANCELLED = "CANCELLED", + PENDING = 'PENDING', + PENDING_ASSIGNMENT = 'PENDING_ASSIGNMENT', + ASSIGNED = 'ASSIGNED', + RUNNING = 'RUNNING', + SUCCEEDED = 'SUCCEEDED', + FAILED = 'FAILED', + CANCELLED = 'CANCELLED', } export interface JobRun { @@ -754,26 +754,26 @@ export interface StepRun { } export enum StepRunEventReason { - REQUEUED_NO_WORKER = "REQUEUED_NO_WORKER", - REQUEUED_RATE_LIMIT = "REQUEUED_RATE_LIMIT", - SCHEDULING_TIMED_OUT = "SCHEDULING_TIMED_OUT", - ASSIGNED = "ASSIGNED", - STARTED = "STARTED", - FINISHED = "FINISHED", - FAILED = "FAILED", - RETRYING = "RETRYING", - CANCELLED = "CANCELLED", - TIMEOUT_REFRESHED = "TIMEOUT_REFRESHED", - REASSIGNED = "REASSIGNED", - TIMED_OUT = "TIMED_OUT", - SLOT_RELEASED = "SLOT_RELEASED", - RETRIED_BY_USER = "RETRIED_BY_USER", + REQUEUED_NO_WORKER = 'REQUEUED_NO_WORKER', + REQUEUED_RATE_LIMIT = 'REQUEUED_RATE_LIMIT', + SCHEDULING_TIMED_OUT = 'SCHEDULING_TIMED_OUT', + ASSIGNED = 'ASSIGNED', + STARTED = 'STARTED', + FINISHED = 'FINISHED', + FAILED = 'FAILED', + RETRYING = 'RETRYING', + CANCELLED = 'CANCELLED', + TIMEOUT_REFRESHED = 'TIMEOUT_REFRESHED', + REASSIGNED = 'REASSIGNED', + TIMED_OUT = 'TIMED_OUT', + SLOT_RELEASED = 'SLOT_RELEASED', + RETRIED_BY_USER = 'RETRIED_BY_USER', } export enum StepRunEventSeverity { - INFO = "INFO", - WARNING = "WARNING", - CRITICAL = "CRITICAL", + INFO = 'INFO', + WARNING = 'WARNING', + CRITICAL = 'CRITICAL', } export interface StepRunEvent { @@ -850,7 +850,7 @@ export interface Worker { /** The recent step runs for this worker. */ recentStepRuns?: StepRun[]; /** The status of the worker. */ - status?: "ACTIVE" | "INACTIVE" | "PAUSED"; + status?: 'ACTIVE' | 'INACTIVE' | 'PAUSED'; /** The maximum number of runs this worker can execute concurrently. */ maxRuns?: number; /** The number of runs this worker can execute concurrently. */ @@ -943,8 +943,8 @@ export interface PullRequest { } export enum PullRequestState { - Open = "open", - Closed = "closed", + Open = 'open', + Closed = 'closed', } export interface LogLine { @@ -960,10 +960,10 @@ export interface LogLine { } export enum LogLineLevel { - DEBUG = "DEBUG", - INFO = "INFO", - WARN = "WARN", - ERROR = "ERROR", + DEBUG = 'DEBUG', + INFO = 'INFO', + WARN = 'WARN', + ERROR = 'ERROR', } export interface LogLineList { @@ -972,12 +972,12 @@ export interface LogLineList { } export enum LogLineOrderByField { - CreatedAt = "createdAt", + CreatedAt = 'createdAt', } export enum LogLineOrderByDirection { - Asc = "asc", - Desc = "desc", + Asc = 'asc', + Desc = 'desc', } export type LogLineSearch = string; diff --git a/frontend/app/src/lib/api/generated/http-client.ts b/frontend/app/src/lib/api/generated/http-client.ts index 953b6103c..dd7f6368e 100644 --- a/frontend/app/src/lib/api/generated/http-client.ts +++ b/frontend/app/src/lib/api/generated/http-client.ts @@ -9,12 +9,12 @@ * --------------------------------------------------------------- */ -import type { AxiosInstance, AxiosRequestConfig, AxiosResponse, HeadersDefaults, ResponseType } from "axios"; -import axios from "axios"; +import type { AxiosInstance, AxiosRequestConfig, AxiosResponse, HeadersDefaults, ResponseType } from 'axios'; +import axios from 'axios'; export type QueryParamsType = Record; -export interface FullRequestParams extends Omit { +export interface FullRequestParams extends Omit { /** set parameter to `true` for call `securityWorker` for this request */ secure?: boolean; /** request path */ @@ -29,9 +29,9 @@ export interface FullRequestParams extends Omit; +export type RequestParams = Omit; -export interface ApiConfig extends Omit { +export interface ApiConfig extends Omit { securityWorker?: ( securityData: SecurityDataType | null, ) => Promise | AxiosRequestConfig | void; @@ -40,21 +40,21 @@ export interface ApiConfig extends Omit { public instance: AxiosInstance; private securityData: SecurityDataType | null = null; - private securityWorker?: ApiConfig["securityWorker"]; + private securityWorker?: ApiConfig['securityWorker']; private secure?: boolean; private format?: ResponseType; constructor({ securityWorker, secure, format, ...axiosConfig }: ApiConfig = {}) { - this.instance = axios.create({ ...axiosConfig, baseURL: axiosConfig.baseURL || "" }); + this.instance = axios.create({ ...axiosConfig, baseURL: axiosConfig.baseURL || '' }); this.secure = secure; this.format = format; this.securityWorker = securityWorker; @@ -80,7 +80,7 @@ export class HttpClient { } protected stringifyFormItem(formItem: unknown) { - if (typeof formItem === "object" && formItem !== null) { + if (typeof formItem === 'object' && formItem !== null) { return JSON.stringify(formItem); } else { return `${formItem}`; @@ -114,18 +114,18 @@ export class HttpClient { ...params }: FullRequestParams): Promise> => { const secureParams = - ((typeof secure === "boolean" ? secure : this.secure) && + ((typeof secure === 'boolean' ? secure : this.secure) && this.securityWorker && (await this.securityWorker(this.securityData))) || {}; const requestParams = this.mergeRequestParams(params, secureParams); const responseFormat = format || this.format || undefined; - if (type === ContentType.FormData && body && body !== null && typeof body === "object") { + if (type === ContentType.FormData && body && body !== null && typeof body === 'object') { body = this.createFormData(body as Record); } - if (type === ContentType.Text && body && body !== null && typeof body !== "string") { + if (type === ContentType.Text && body && body !== null && typeof body !== 'string') { body = JSON.stringify(body); } @@ -133,7 +133,7 @@ export class HttpClient { ...requestParams, headers: { ...(requestParams.headers || {}), - ...(type && type !== ContentType.FormData ? { "Content-Type": type } : {}), + ...(type && type !== ContentType.FormData ? { 'Content-Type': type } : {}), }, params: query, responseType: responseFormat, diff --git a/hack/oas/generate-clients.sh b/hack/oas/generate-clients.sh index 4e13ce2d8..70cedc062 100644 --- a/hack/oas/generate-clients.sh +++ b/hack/oas/generate-clients.sh @@ -4,4 +4,4 @@ set -eux go run github.com/deepmap/oapi-codegen/v2/cmd/oapi-codegen@v2.0.0 -config ./pkg/client/rest/codegen.yaml ./bin/oas/openapi.yaml -cd frontend && (npx -y swagger-typescript-api -p ../bin/oas/openapi.yaml -o ./app/src/lib/api/generated -n hatchet.ts --modular --axios) +cd frontend/app/ && (pnpm swagger-typescript-api -p ../../bin/oas/openapi.yaml -o ./src/lib/api/generated -n hatchet.ts --modular --axios) diff --git a/hack/oas/generate-server.sh b/hack/oas/generate-server.sh index a3d95fc37..4750f9187 100644 --- a/hack/oas/generate-server.sh +++ b/hack/oas/generate-server.sh @@ -2,5 +2,5 @@ set -eux -npx --yes swagger-cli bundle ./api-contracts/openapi/openapi.yaml --outfile bin/oas/openapi.yaml --type yaml +npx --yes swagger-cli@4.0.4 bundle ./api-contracts/openapi/openapi.yaml --outfile bin/oas/openapi.yaml --type yaml go run github.com/deepmap/oapi-codegen/v2/cmd/oapi-codegen@v2.0.0 -config ./api/v1/server/oas/gen/codegen.yaml ./bin/oas/openapi.yaml From ad2b965efc612f856637b8aac4331193344e848f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Jul 2024 04:45:18 +0000 Subject: [PATCH 9/9] chore(deps): bump google.golang.org/api from 0.186.0 to 0.187.0 (#679) Bumps [google.golang.org/api](https://github.com/googleapis/google-api-go-client) from 0.186.0 to 0.187.0. - [Release notes](https://github.com/googleapis/google-api-go-client/releases) - [Changelog](https://github.com/googleapis/google-api-go-client/blob/main/CHANGES.md) - [Commits](https://github.com/googleapis/google-api-go-client/compare/v0.186.0...v0.187.0) --- updated-dependencies: - dependency-name: google.golang.org/api dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 8 ++++---- go.sum | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index bd0cfe8bd..09c0c0561 100644 --- a/go.mod +++ b/go.mod @@ -34,12 +34,12 @@ require ( go.opentelemetry.io/otel/sdk v1.27.0 go.opentelemetry.io/otel/trace v1.27.0 go.uber.org/goleak v1.3.0 - google.golang.org/api v0.186.0 + google.golang.org/api v0.187.0 sigs.k8s.io/yaml v1.4.0 ) require ( - cloud.google.com/go/auth v0.6.0 // indirect + cloud.google.com/go/auth v0.6.1 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.2 // indirect cloud.google.com/go/compute/metadata v0.3.0 // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect @@ -88,7 +88,7 @@ require ( go.uber.org/multierr v1.9.0 // indirect golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8 // indirect golang.org/x/time v0.5.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240610135401-a8a62080eff3 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240617180043-68d350f18fd4 // indirect ) require ( @@ -128,7 +128,7 @@ require ( golang.org/x/sync v0.7.0 golang.org/x/sys v0.21.0 // indirect golang.org/x/text v0.16.0 - google.golang.org/genproto/googleapis/rpc v0.0.0-20240617180043-68d350f18fd4 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240624140628-dc46fd24d27d // indirect google.golang.org/grpc v1.64.0 google.golang.org/protobuf v1.34.2 gopkg.in/ini.v1 v1.67.0 // indirect diff --git a/go.sum b/go.sum index c90d245a3..f37766755 100644 --- a/go.sum +++ b/go.sum @@ -1,6 +1,6 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go/auth v0.6.0 h1:5x+d6b5zdezZ7gmLWD1m/xNjnaQ2YDhmIz/HH3doy1g= -cloud.google.com/go/auth v0.6.0/go.mod h1:b4acV+jLQDyjwm4OXHYjNvRi4jvGBzHWJRtJcy+2P4g= +cloud.google.com/go/auth v0.6.1 h1:T0Zw1XM5c1GlpN2HYr2s+m3vr1p2wy+8VN+Z1FKxW38= +cloud.google.com/go/auth v0.6.1/go.mod h1:eFHG7zDzbXHKmjJddFG/rBlcGp6t25SwRUiEQSlO4x4= cloud.google.com/go/auth/oauth2adapt v0.2.2 h1:+TTV8aXpjeChS9M+aTtN/TjdQnzJvmzKFt//oWu7HX4= cloud.google.com/go/auth/oauth2adapt v0.2.2/go.mod h1:wcYjgpZI9+Yu7LyYBg4pqSiaRkfEK3GQcpb7C/uyF1Q= cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc= @@ -344,17 +344,17 @@ golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3 golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.186.0 h1:n2OPp+PPXX0Axh4GuSsL5QL8xQCTb2oDwyzPnQvqUug= -google.golang.org/api v0.186.0/go.mod h1:hvRbBmgoje49RV3xqVXrmP6w93n6ehGgIVPYrGtBFFc= +google.golang.org/api v0.187.0 h1:Mxs7VATVC2v7CY+7Xwm4ndkX71hpElcvx0D1Ji/p1eo= +google.golang.org/api v0.187.0/go.mod h1:KIHlTc4x7N7gKKuVsdmfBXN13yEEWXWFURWY6SBp2gk= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto/googleapis/api v0.0.0-20240610135401-a8a62080eff3 h1:QW9+G6Fir4VcRXVH8x3LilNAb6cxBGLa6+GM4hRwexE= -google.golang.org/genproto/googleapis/api v0.0.0-20240610135401-a8a62080eff3/go.mod h1:kdrSS/OiLkPrNUpzD4aHgCq2rVuC/YRxok32HXZ4vRE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240617180043-68d350f18fd4 h1:Di6ANFilr+S60a4S61ZM00vLdw0IrQOSMS2/6mrnOU0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240617180043-68d350f18fd4/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= +google.golang.org/genproto/googleapis/api v0.0.0-20240617180043-68d350f18fd4 h1:MuYw1wJzT+ZkybKfaOXKp5hJiZDn2iHaXRw0mRYdHSc= +google.golang.org/genproto/googleapis/api v0.0.0-20240617180043-68d350f18fd4/go.mod h1:px9SlOOZBg1wM1zdnr8jEL4CNGUBZ+ZKYtNPApNQc4c= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240624140628-dc46fd24d27d h1:k3zyW3BYYR30e8v3x0bTDdE9vpYFjZHK+HcyqkrppWk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240624140628-dc46fd24d27d/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=