From e97704d904eebfaad435219e0fde47b60a52aca4 Mon Sep 17 00:00:00 2001 From: nicktrn <55853254+nicktrn@users.noreply.github.com> Date: Wed, 5 Mar 2025 14:40:14 +0000 Subject: [PATCH] Run Engine 2.0 (WIP) (#1575) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * bump worker version * Suggested glossary for the RunEngine, TBC * Removed BatchTaskRun changes from this branch, they were done in main * Set the BatchTaskRun status to completed when all runs are completed * When dequeuing respect passed in maxResources * Ported over the new run props: idempotencyKeyExpiresAt, versions, oneTimeUseToken, maxDurationInSeconds * Didn’t hit save… the new props when triggering tasks passed through * Idempotency expiration + waitpoint edge case * WIP on creating checkpoint, parking for now * fix worker routes * upgrade webapp node types to support generic event emitter * separate event bus handler singleton and run failure alerts * duration waits * fix execution snapshot debug spans * task waits * fix event bus types * temporary fix for react hook run handle type * disable run notifications for now * convert any typecasts to expect errors to more easily fix later * fix webapp types after node types upgrade * updateEnvConcurrencyLimits across marqs and the runqueue * Pass proper values into the run engine * RunQueue settings and removed unused rebalancing workers * Remove rebalancing prop * Tidied more things up * Update/remove queue limits for MARQS and RunQueue * taskQueue/concurrencyLimit changes ported back into the RunEngine * Reworked completing waitpoints to improve performance and reduce race conditions * Improved test robustness * Down to a single run lock only when a run is totally unblocked and ready to continue * warm starts, worker notifications, wait fixes * Fix for Run Engine poll interval env var * Expect the waitpoint to be completed quickly * If a run is locked then it’s too late to expire it * Added VALKEY_ env vars and plugged them into the run engine * Extracted and updated the guard queue function so it can be used when batching * Added logging and universal concurrency changes to trigger task v1 * Added notes back in * Bump @trigger.dev/worker to 3.3.7 * reportInvocationUsage for the runAttemptStarted event * improve execution snapshot span debug span start times * Unfriendly IDs * update lockfile * Created a shared determineEngineVersion function * disable unfinished commands * save new cli config to different location, misc fixes * add basic engine version check via current deploy * new run engine will default to node 22 runtime * block some actions for projects on previous run engine * fix worker group tests * fix triggerAndWait test * one typescript version to rule them all * redlock type patch * fix type issues caused by ts-reset * improve cleanup scripts * add missing socket.io dep * fix run notification handler type * fix worker group test again * generate prisma client for e2e tests * remove worker group tests for now * prevent image pull rate limits during unit tests * increase timeout for queue concurrency limit test * generate prisma client for preview release * same node types everywhere * Updated engine readme, removed legacy system notes * use default machine preset from platform package * worker instances plural in schema * disable pnpm update notifications * return worker group details from connect call * add workers admin route * fix heartbeat route return type * move deployment labels to core apps * refactor run controller env schema * Add firstAttemptStartedAt to TaskRun * RunEngine 2.0 batch trigger support (#1581) * Make it clear when BatchTriggerV2Service is used * Copy of BatchTriggerV2Service * WIP batch triggering * Allow blocking a run with multiple waitpoints at once. Made it atomic * Removed unused param * New batch service * Pass through the parentRunId and resumeParentOnCompletion * Use the new batch service, and correct trigger task version * Force V1 engine if using BatchTriggerV2Service, we’ve already done the check at this point * Removed the $transaction and early exit if nothing changed * Adedd a simple batch task to the hello world reference catalog * Fix for batch waits not working * Added parentRunId in a couple more places * Removed waitForBatch log * Added another parentRunId * Expanded the example to include all the different triggers * More changes to blocking to support continuing after idempotent completed runs * Fix for the wrong type when blocking a run * remove @map * optimise worker auth query * add engine version header to core api client requests * remove unique constraint for default group id * consolidate migrations * the first managed worker becomes the global default * Debug events off by default, added an admin toggle to show them * worker group name can't be an empty string * add exec helper to core * move machine resources to core * add pre-dequeue callback to determine max resources * optionally skip dequeue * bump worker package * move worker to core * fix ReadableStream type error * fix another type issue * update a few more tsconfigs * add metadata changes introduced in #1563 * Run Engine 2.0 trigger idempotency (#1613) * Return isCached from the trigger API endpoint * Fix for the wrong type when blocking a run * Render the idempotent run in the inspector * Event repository for idempotency * Debug events off by default, added an admin toggle to show them * triggerAndWait idempotency span * Some improvements to the reference idempotency task * Removed the cached tracing from the SDK * Server-side creating cached span * Improved idempotency test task * Create cached task spans in a better way * Idempotency span support inc batch trigger * Simplified how the spans are done, using more of the existing code * Improved the idempotency test task * Added Waitpoint Batch type, add to TaskRunWaitpoint with order * Pass batch ids through to the run engine when triggering * Added batchIndex * Better batch support in the run engine * Added settings to batch trigger service, before major overhaul * Allow the longer run/batch ids in the filters * Changed how batching works, includes breaking changes in CLI * Removed batch idempotency because it gets put on the runs instead * Added `runs` to the batch.retrieve call/API * Set firstAttemptStartedAt when creating the first attempt * Do nothing when receiving a BATCH waitpoint * Some fixes in the new batch trigger service… mostly just passing missing optional params through * Tweaked the idempotency test task for more situations * Only block with a batch if it’s a batchTriggerAndWait… 🤦‍♂️ * Added another case to the idempotency test task: multiple of the same idempotencyKey in a single batch * Support for the same run multiple times in the same batch * Small tweaks * Make sure to complete batches, even if they’re not andWait ones * Export RunDuplicateIdempotencyKeyError from the run engine * Latest lockfile * Trigger with a machine (old run engine) * RE2, allow setting machine when triggering * Fix for new glob patterns * add max run count to dequeue from version route * add worker instance name env var and header * queue consumer pre skip callback * poll for more runs after final execution errors * fix dequeue search param schema * add shortcut to debug switch * expose run engine timeouts as env vars * make warm start durations configurable * add optional status to json reply helper * fix preSkip hook, add debug logs * BLOCKED_BY_WAITPOINTS -> SUSPENDED * exit controller when run suspended * check if already replied before http reply * run controller will wait for next run after the current one is suspended * cancel run button shortcut * minimal event repository environment type * fix update metadata call * run suspension and misc fixes wip * change debug shortcut to shift + D * Started work on the Dev supervisor * Formatting * Fix for bad imports * Before rebuilding SSE * Presence updating from the CLI working via SSE * add worker notification debug logs * send run:stop when exiting run phase * skip current snapshot poll on worker notification * add more logs and route to submit run debug logs * add worker and runner ids to snapshots * improve run notification debug logs * add workload debug log route * misc run controller fixes and refactor * prevent parallel execution of critical functions * update bun to 1.2.1 * WIP with dev dequeuing * Method to convert friendlyIds to non-friendly, do nothing with actual ids * Set the engine on BackgroundWorker, lazily upgrade projects to engine V2 * Runs with ttls were getting immediately expired… oops. * Pass the Waiting for deploy reason through, so we have it on the execution snapshots * Fixed the logic for getting the right background worker for a run * Use the correct ID when dequeuing… * determineEngineVersion is now fully functional * Rate limiter ignores the dev endpoints * Retrieving a batch gives you the runIds * Set a unique version for the RE2 BatchTaskRun * add provisional changeset * The start of dev run execution is working * First dev run working * Moved the dev run controller closer to what Nick did with the managed one * export exec output type * Heartbeat fix: don’t heartbeat if _isHeartbeating == false * Dev runs get notifications, some dev bug fixes * Improved logging or dequeuing * We need to dequeue runs from the latest version too, for triggerAndWait * Ported Eric’s validateWorkerManifest with nicer errors * When flattening an idempotency key if part is undefined, return undefined * Dev logging fixes * Remove sigterm listener * Deprecating workers. Don’t specify a BackgroundWorker when dequeuing an environment * Deleted some old files. Renamed “managed” to “deploy” * When a build finishes, always copy the build dir (otherwise the first one gets trampled on by the 2nd) * Dev master queues should work differently * Deleting old workers * Added debounce function to core * Improvement to canceling * WIP on debounce canceling on socket disconnection * Added environment data to execution snapshots * Dev runs that have stalled get “Canceled” with a reason explaining why * Show CLI messaged when a connection to the platform is lost/restored * Fix TriggerTask after merge * Add trigger task v2 max attempts, replace some findUniques * Port the new queue logic to the run engine * More fixes post-merge * We weren’t setting a `retryConfig` up for the tests… it’s now required * Start the Redis worker inside the Run Engine… 🤦‍♂️ * Trying to make the testcontainers more reliable * Added keyPrefix: "engine:” * Badly placed bracket in trigger task * Better Redis namespacing * Fix for expired run not getting removed from the queue * Don’t create a redis client in the testcontainers, return the redisOptions instead * Cleanup redis client in the run lock tests * Fix for the RunQueue not supporting keyPrefix * Updated more of the RunQueue scripts rebalancing * Trying to make Redis more robust in the tests… * Improved test resiliciency more * Fix for delays (checkpoint check) * Increase the timeout slightly to fix ttl test * Added priority support when triggering * More wip trying to make test containers more reliable * batchTriggerAndWait test is still failing… some wip to try fix it * Fixed redis tests now we’re not providing a client * Separate Redis clients for the run engine worker/queue/runlock * Made the wait for duration test more resilient * Added idempotencyKeyExpiresAt to Waitpoints * Waitpoint timeouts and idempotency expiry * Use finishWaitpoint, removed extra worker job * Added waitpoint idempotency tests * Creating resume tokens is working * Some improvements to the resume tokens * Moved resumeTokens to just be wait functions 🥳 * Delete old RuntimeManagers * Wait for token is working * Better test for the wait tokens * Improved the test task some more * Hide the accessories in the span inspector * WIP on waitpoint inspector * WIP on complete waitpoint form * Span overview panel can be changed based on the entity type * Improved the waitpoint display * WIP on completing waitpoint form * Use the existing CodeBlock for the tip * Style improvements * Complete waitpoint * All waitpoint sidebar variants * Waits now use a pause icon * Durations waits use the API to create/block with a waitpoint, not the runtime * Fix for engine.blockRunWithWaitpoint required org id * Removed old wait code from the run controllers/task run process * Form action for skipping a datetime waitpoint * Move testDockerCheckpoint to a separate core package export (it can’t be bundled on the client) * Fix for glitchy hourglass animation * Completed waitpoints display better * Increase Redis maxRetriesPerRequest to 20 (default) * Completing and skipping waitpoints is working * Remove the database prisma dev command, since we need to use create only now. Updated docs * Added skip timeout, reworked the UI * Tweaked spacing * Added payload limit to waitpoint token completion from dashboard * Test idempotency works on wait.for and wait.until * Moved the worker-actions to /engine/ from /api/ * Moved dev engine endpoints to /engine/ from /api/ * Separate /engine/ rate limiter * Added parallel wait prevention, it’s working for duration waits but not well for triggerAndWait yet * WIP post-merge conflicts * Set taskEventStore column in the new engine * Remove duplicate keys * Post-merge fixes * Fix for span merge layout * Use executedAt instead of firstAttemptStartedAt --------- Co-authored-by: Matt Aitken --- .changeset/breezy-turtles-talk.md | 10 + .configs/tsconfig.base.json | 2 +- .github/workflows/e2e.yml | 3 + .github/workflows/unit-tests.yml | 7 + .npmrc | 3 +- .vscode/launch.json | 8 + CONTRIBUTING.md | 14 +- apps/coordinator/package.json | 4 +- apps/coordinator/src/checkpointer.ts | 2 +- apps/coordinator/tsconfig.json | 4 +- apps/docker-provider/package.json | 4 +- apps/docker-provider/src/index.ts | 3 +- apps/kubernetes-provider/package.json | 3 +- apps/kubernetes-provider/tsconfig.json | 2 +- apps/proxy/package.json | 1 - .../assets/icons/AnimatedHourglassIcon.tsx | 27 + apps/webapp/app/assets/icons/PauseIcon.tsx | 12 + .../app/assets/icons/TaskCachedIcon.tsx | 49 + apps/webapp/app/components/code/CodeBlock.tsx | 2 +- .../app/components/primitives/Switch.tsx | 23 +- .../app/components/runs/v3/BatchFilters.tsx | 4 +- .../app/components/runs/v3/LiveTimer.tsx | 34 + .../app/components/runs/v3/RunFilters.tsx | 4 +- .../webapp/app/components/runs/v3/RunIcon.tsx | 6 +- .../app/components/runs/v3/SpanTitle.tsx | 5 +- apps/webapp/app/consts.ts | 1 - apps/webapp/app/entry.server.tsx | 4 + apps/webapp/app/env.server.ts | 163 + .../app/models/runtimeEnvironment.server.ts | 39 +- .../v3/DeploymentListPresenter.server.ts | 41 +- .../v3/DeploymentPresenter.server.ts | 2 + .../presenters/v3/DevPresenceStream.server.ts | 16 + .../v3/RunStreamPresenter.server.ts | 2 +- .../app/presenters/v3/SpanPresenter.server.ts | 211 +- .../presenters/v3/TaskListPresenter.server.ts | 2 +- .../v3/TasksStreamPresenter.server.ts | 2 +- .../route.tsx | 5 + .../route.tsx | 1 + .../route.tsx | 19 +- .../route.tsx | 2 +- ...dmin.api.v1.environments.$environmentId.ts | 3 +- ...api.v1.orgs.$organizationId.concurrency.ts | 3 +- ...gs.$organizationId.environments.staging.ts | 5 +- .../webapp/app/routes/admin.api.v1.workers.ts | 65 + .../app/routes/api.v1.batches.$batchId.ts | 1 + .../app/routes/api.v1.deployments.latest.ts | 41 + apps/webapp/app/routes/api.v1.deployments.ts | 37 +- .../routes/api.v1.tasks.$taskId.trigger.ts | 30 +- apps/webapp/app/routes/api.v1.tasks.batch.ts | 1 + ...ts.tokens.$waitpointFriendlyId.complete.ts | 68 + .../app/routes/api.v1.waitpoints.tokens.ts | 43 + apps/webapp/app/routes/api.v1.workers.ts | 73 + .../app/routes/api.v2.batches.$batchId.ts | 40 + apps/webapp/app/routes/api.v2.tasks.batch.ts | 152 + .../webapp/app/routes/engine.v1.dev.config.ts | 32 + .../app/routes/engine.v1.dev.dequeue.ts | 92 + .../app/routes/engine.v1.dev.presence.ts | 81 + ...e.v1.dev.runs.$runFriendlyId.logs.debug.ts | 74 + ...s.$snapshotFriendlyId.attempts.complete.ts | 64 + ...hots.$snapshotFriendlyId.attempts.start.ts | 103 + ...snapshots.$snapshotFriendlyId.heartbeat.ts | 59 + ...ev.runs.$runFriendlyId.snapshots.latest.ts | 55 + ...ne.v1.runs.$runFriendlyId.wait.duration.ts | 75 + ...points.tokens.$waitpointFriendlyId.wait.ts | 58 + .../engine.v1.worker-actions.connect.ts | 19 + ...ployments.$deploymentFriendlyId.dequeue.ts | 68 + .../engine.v1.worker-actions.dequeue.ts | 16 + .../engine.v1.worker-actions.heartbeat.ts | 13 + ...-actions.runs.$runFriendlyId.logs.debug.ts | 38 + ...s.$snapshotFriendlyId.attempts.complete.ts | 33 + ...hots.$snapshotFriendlyId.attempts.start.ts | 32 + ....snapshots.$snapshotFriendlyId.continue.ts | 34 + ...snapshots.$snapshotFriendlyId.heartbeat.ts | 26 + ...d.snapshots.$snapshotFriendlyId.restore.ts | 51 + ...d.snapshots.$snapshotFriendlyId.suspend.ts | 51 + ...ns.runs.$runFriendlyId.snapshots.latest.ts | 28 + .../route.tsx | 410 ++ .../route.tsx | 502 +- .../app/services/engineRateLimit.server.ts | 34 + .../services/personalAccessToken.server.ts | 1 + .../routeBuilders/apiBuilder.server.ts | 437 +- apps/webapp/app/services/worker.server.ts | 14 + apps/webapp/app/utils/delays.ts | 29 + apps/webapp/app/utils/sse.server.ts | 4 +- apps/webapp/app/utils/sse.ts | 183 + apps/webapp/app/utils/string.ts | 3 + apps/webapp/app/utils/taskEvent.ts | 4 +- .../authenticatedSocketConnection.server.ts | 8 +- apps/webapp/app/v3/engineVersion.server.ts | 66 + apps/webapp/app/v3/eventRepository.server.ts | 212 +- apps/webapp/app/v3/featureFlags.server.ts | 54 + apps/webapp/app/v3/handleSocketIo.server.ts | 291 +- apps/webapp/app/v3/machinePresets.server.ts | 12 + .../app/v3/marqs/devQueueConsumer.server.ts | 2 +- .../app/v3/models/workerDeployment.server.ts | 59 +- apps/webapp/app/v3/registryProxy.server.ts | 68 +- apps/webapp/app/v3/runEngine.server.ts | 68 + .../webapp/app/v3/runEngineHandlers.server.ts | 521 +++ apps/webapp/app/v3/runQueue.server.ts | 36 + .../app/v3/services/baseService.server.ts | 15 + .../app/v3/services/batchTriggerV3.server.ts | 2 +- .../app/v3/services/batchTriggerV4.server.ts | 683 +++ .../app/v3/services/cancelTaskRun.server.ts | 195 +- .../app/v3/services/cancelTaskRunV1.server.ts | 192 + .../changeCurrentDeployment.server.ts | 2 +- .../services/createBackgroundWorker.server.ts | 28 +- .../v3/services/createCheckpoint.server.ts | 4 +- .../createDeployedBackgroundWorker.server.ts | 31 +- ...createDeploymentBackgroundWorker.server.ts | 19 +- .../v3/services/finalizeDeployment.server.ts | 5 +- .../v3/services/heartbeatService.server.ts | 49 - .../services/initializeDeployment.server.ts | 49 +- .../app/v3/services/replayTaskRun.server.ts | 4 +- .../v3/services/rescheduleTaskRun.server.ts | 2 +- .../app/v3/services/triggerTask.server.ts | 819 +--- .../app/v3/services/triggerTaskV1.server.ts | 758 +++ .../app/v3/services/triggerTaskV2.server.ts | 566 +++ .../worker/workerGroupService.server.ts | 263 ++ .../worker/workerGroupTokenService.server.ts | 824 ++++ apps/webapp/app/v3/taskEventStore.server.ts | 17 +- apps/webapp/package.json | 5 +- apps/webapp/prisma/populate.ts | 231 + apps/webapp/remix.config.js | 1 + apps/webapp/server.ts | 2 + apps/webapp/test/GCRARateLimiter.test.ts | 150 +- .../authorizationRateLimitMiddleware.test.ts | 40 +- .../webapp/test/fairDequeuingStrategy.test.ts | 650 +-- apps/webapp/test/realtimeClient.test.ts | 13 +- apps/webapp/tsconfig.json | 4 +- internal-packages/database/package.json | 6 +- .../migration.sql | 288 ++ .../migration.sql | 2 + .../migration.sql | 13 + .../migration.sql | 8 + .../migration.sql | 2 + .../migration.sql | 14 + .../migration.sql | 14 + .../migration.sql | 2 + .../migration.sql | 2 + .../migration.sql | 13 + .../migration.sql | 2 + .../migration.sql | 9 + .../database/prisma/schema.prisma | 389 +- internal-packages/emails/package.json | 4 +- internal-packages/otlp-importer/package.json | 3 +- internal-packages/redis-worker/src/queue.ts | 2 +- internal-packages/run-engine/README.md | 189 + .../run-engine/execution-states.png | Bin 0 -> 521887 bytes internal-packages/run-engine/package.json | 27 + .../run-engine/src/engine/consts.ts | 1 + .../run-engine/src/engine/db/worker.ts | 277 ++ .../run-engine/src/engine/errors.ts | 58 + .../run-engine/src/engine/eventBus.ts | 180 + .../src/engine/executionSnapshots.ts | 131 + .../run-engine/src/engine/index.ts | 4045 +++++++++++++++++ .../run-engine/src/engine/locking.test.ts | 48 + .../run-engine/src/engine/locking.ts | 60 + .../run-engine/src/engine/machinePresets.ts | 74 + .../run-engine/src/engine/statuses.ts | 46 + .../src/engine/tests/batchTrigger.test.ts | 182 + .../engine/tests/batchTriggerAndWait.test.ts | 374 ++ .../src/engine/tests/cancelling.test.ts | 336 ++ .../src/engine/tests/checkpoints.test.ts | 17 + .../src/engine/tests/delays.test.ts | 192 + .../src/engine/tests/dequeuing.test.ts | 211 + .../src/engine/tests/heartbeats.test.ts | 493 ++ .../src/engine/tests/notDeployed.test.ts | 153 + .../src/engine/tests/priority.test.ts | 145 + .../src/engine/tests/trigger.test.ts | 490 ++ .../src/engine/tests/triggerAndWait.test.ts | 456 ++ .../run-engine/src/engine/tests/ttl.test.ts | 110 + .../src/engine/tests/waitpoints.test.ts | 1163 +++++ .../run-engine/src/engine/types.ts | 89 + internal-packages/run-engine/src/index.ts | 2 + .../run-engine/src/run-queue/index.test.ts | 891 ++++ .../run-engine/src/run-queue/index.ts | 1679 +++++++ .../src/run-queue/keyProducer.test.ts | 361 ++ .../run-engine/src/run-queue/keyProducer.ts | 204 + .../simpleWeightedPriorityStrategy.ts | 130 + .../run-engine/src/run-queue/types.ts | 120 + .../run-engine/src/shared/index.ts | 39 + internal-packages/run-engine/tsconfig.json | 29 + internal-packages/run-engine/vitest.config.ts | 15 + internal-packages/testcontainers/package.json | 4 +- internal-packages/testcontainers/src/index.ts | 94 +- internal-packages/testcontainers/src/setup.ts | 160 + internal-packages/testcontainers/src/utils.ts | 62 +- .../testcontainers/tsconfig.json | 2 +- internal-packages/zod-worker/package.json | 1 - internal-packages/zod-worker/tsconfig.json | 2 +- package.json | 5 +- packages/build/package.json | 4 +- packages/cli-v3/package.json | 6 +- packages/cli-v3/src/apiClient.ts | 262 +- packages/cli-v3/src/build/buildWorker.ts | 53 +- packages/cli-v3/src/build/bundle.ts | 97 +- packages/cli-v3/src/build/entryPoints.ts | 27 +- packages/cli-v3/src/build/packageModules.ts | 199 +- packages/cli-v3/src/cli/common.ts | 8 +- packages/cli-v3/src/cli/index.ts | 6 + packages/cli-v3/src/commands/deploy.ts | 4 +- packages/cli-v3/src/commands/list-profiles.ts | 11 +- packages/cli-v3/src/commands/login.ts | 5 +- packages/cli-v3/src/commands/switch.ts | 89 + packages/cli-v3/src/commands/trigger.ts | 121 + packages/cli-v3/src/commands/workers/build.ts | 550 +++ .../cli-v3/src/commands/workers/create.ts | 135 + packages/cli-v3/src/commands/workers/index.ts | 16 + packages/cli-v3/src/commands/workers/list.ts | 119 + packages/cli-v3/src/commands/workers/run.ts | 151 + packages/cli-v3/src/config.ts | 23 +- packages/cli-v3/src/deploy/buildImage.ts | 102 +- packages/cli-v3/src/dev/backgroundWorker.ts | 436 +- packages/cli-v3/src/dev/devOutput.ts | 23 +- packages/cli-v3/src/dev/devSession.ts | 74 +- packages/cli-v3/src/dev/devSupervisor.ts | 648 +++ packages/cli-v3/src/dev/workerRuntime.ts | 461 +- .../src/entryPoints/deploy-run-controller.ts | 1496 ------ .../src/entryPoints/dev-index-worker.ts | 2 +- .../src/entryPoints/dev-run-controller.ts | 800 ++++ .../cli-v3/src/entryPoints/dev-run-worker.ts | 483 +- ...troller.ts => managed-index-controller.ts} | 1 + ...ndex-worker.ts => managed-index-worker.ts} | 22 +- .../src/entryPoints/managed-run-controller.ts | 1090 +++++ ...oy-run-worker.ts => managed-run-worker.ts} | 75 +- .../cli-v3/src/executions/taskRunProcess.ts | 39 +- packages/cli-v3/src/utilities/configFiles.ts | 134 +- packages/cli-v3/src/utilities/eventBus.ts | 9 +- .../cli-v3/src/utilities/initialBanner.ts | 37 +- .../cli-v3/src/utilities/sanitizeEnvVars.ts | 21 +- packages/core/package.json | 56 +- packages/core/src/debounce.ts | 20 + packages/core/src/v3/apiClient/core.ts | 2 +- packages/core/src/v3/apiClient/index.ts | 97 +- packages/core/src/v3/apiClient/runStream.ts | 9 +- packages/core/src/v3/apps/consts.ts | 2 + packages/core/src/v3/apps/duration.ts | 22 + packages/core/src/v3/apps/exec.ts | 108 + packages/core/src/v3/apps/friendlyId.ts | 85 + packages/core/src/v3/apps/http.ts | 47 +- packages/core/src/v3/apps/index.ts | 5 +- packages/core/src/v3/apps/maxDuration.ts | 22 + packages/core/src/v3/apps/queueName.ts | 4 + packages/core/src/v3/build/resolvedConfig.ts | 4 +- packages/core/src/v3/build/runtime.ts | 7 +- .../v3/{apps => checkpoints}/checkpoints.ts | 2 +- packages/core/src/v3/checkpoints/index.ts | 1 + packages/core/src/v3/config.ts | 7 + packages/core/src/v3/dev/index.ts | 1 - packages/core/src/v3/errors.ts | 13 +- packages/core/src/v3/idempotencyKeys.ts | 27 + packages/core/src/v3/index.ts | 3 + packages/core/src/v3/prod/index.ts | 1 - .../core/src/v3/runEngineWorker/consts.ts | 11 + packages/core/src/v3/runEngineWorker/index.ts | 7 + .../v3/runEngineWorker/supervisor/events.ts | 51 + .../src/v3/runEngineWorker/supervisor/http.ts | 285 ++ .../supervisor/queueConsumer.ts | 111 + .../v3/runEngineWorker/supervisor/schemas.ts | 144 + .../v3/runEngineWorker/supervisor/session.ts | 193 + .../v3/runEngineWorker/supervisor/types.ts | 16 + .../src/v3/runEngineWorker/supervisor/util.ts | 40 + packages/core/src/v3/runEngineWorker/types.ts | 32 + packages/core/src/v3/runEngineWorker/util.ts | 13 + .../src/v3/runEngineWorker/workload/http.ts | 212 + .../v3/runEngineWorker/workload/schemas.ts | 66 + .../src/v3/runEngineWorker/workload/types.ts | 5 + .../src/v3/runEngineWorker/workload/util.ts | 12 + .../core/src/v3/runtime/devRuntimeManager.ts | 114 - packages/core/src/v3/runtime/index.ts | 19 +- .../src/v3/runtime/managedRuntimeManager.ts | 182 + packages/core/src/v3/runtime/manager.ts | 9 +- .../core/src/v3/runtime/noopRuntimeManager.ts | 16 +- .../core/src/v3/runtime/prodRuntimeManager.ts | 137 - packages/core/src/v3/schemas/api.ts | 237 +- packages/core/src/v3/schemas/build.ts | 4 +- packages/core/src/v3/schemas/common.ts | 61 +- packages/core/src/v3/schemas/index.ts | 1 + packages/core/src/v3/schemas/messages.ts | 27 + packages/core/src/v3/schemas/runEngine.ts | 269 ++ packages/core/src/v3/schemas/schemas.ts | 17 + .../core/src/v3/semanticInternalAttributes.ts | 3 + packages/core/src/v3/types/tasks.ts | 64 +- packages/core/src/v3/utils/durations.ts | 3 +- packages/core/src/v3/utils/heartbeat.ts | 88 + packages/core/src/v3/utils/imageRef.ts | 69 + packages/core/src/v3/workers/index.ts | 2 + packages/core/src/v3/workers/taskExecutor.ts | 8 +- packages/react-hooks/package.json | 6 +- packages/rsc/package.json | 5 +- packages/trigger-sdk/package.json | 4 +- packages/trigger-sdk/src/v3/retry.ts | 23 +- packages/trigger-sdk/src/v3/shared.ts | 214 +- packages/trigger-sdk/src/v3/wait.ts | 227 +- pnpm-lock.yaml | 497 +- references/bun-catalog/package.json | 3 +- references/bun-catalog/src/trigger/bun.ts | 1 + references/hello-world/package.json | 3 +- references/hello-world/src/trigger/example.ts | 57 +- .../hello-world/src/trigger/idempotency.ts | 284 ++ .../hello-world/src/trigger/parallel-waits.ts | 12 +- .../hello-world/src/trigger/priority.ts | 32 + references/hello-world/src/trigger/waits.ts | 90 + references/hello-world/trigger.config.ts | 1 + references/init-shell/package.json | 3 +- references/nextjs-realtime/package.json | 4 +- references/v3-catalog/package.json | 4 +- 307 files changed, 31872 insertions(+), 5681 deletions(-) create mode 100644 .changeset/breezy-turtles-talk.md create mode 100644 apps/webapp/app/assets/icons/AnimatedHourglassIcon.tsx create mode 100644 apps/webapp/app/assets/icons/PauseIcon.tsx create mode 100644 apps/webapp/app/assets/icons/TaskCachedIcon.tsx create mode 100644 apps/webapp/app/presenters/v3/DevPresenceStream.server.ts create mode 100644 apps/webapp/app/routes/admin.api.v1.workers.ts create mode 100644 apps/webapp/app/routes/api.v1.deployments.latest.ts create mode 100644 apps/webapp/app/routes/api.v1.waitpoints.tokens.$waitpointFriendlyId.complete.ts create mode 100644 apps/webapp/app/routes/api.v1.waitpoints.tokens.ts create mode 100644 apps/webapp/app/routes/api.v1.workers.ts create mode 100644 apps/webapp/app/routes/api.v2.batches.$batchId.ts create mode 100644 apps/webapp/app/routes/api.v2.tasks.batch.ts create mode 100644 apps/webapp/app/routes/engine.v1.dev.config.ts create mode 100644 apps/webapp/app/routes/engine.v1.dev.dequeue.ts create mode 100644 apps/webapp/app/routes/engine.v1.dev.presence.ts create mode 100644 apps/webapp/app/routes/engine.v1.dev.runs.$runFriendlyId.logs.debug.ts create mode 100644 apps/webapp/app/routes/engine.v1.dev.runs.$runFriendlyId.snapshots.$snapshotFriendlyId.attempts.complete.ts create mode 100644 apps/webapp/app/routes/engine.v1.dev.runs.$runFriendlyId.snapshots.$snapshotFriendlyId.attempts.start.ts create mode 100644 apps/webapp/app/routes/engine.v1.dev.runs.$runFriendlyId.snapshots.$snapshotFriendlyId.heartbeat.ts create mode 100644 apps/webapp/app/routes/engine.v1.dev.runs.$runFriendlyId.snapshots.latest.ts create mode 100644 apps/webapp/app/routes/engine.v1.runs.$runFriendlyId.wait.duration.ts create mode 100644 apps/webapp/app/routes/engine.v1.runs.$runFriendlyId.waitpoints.tokens.$waitpointFriendlyId.wait.ts create mode 100644 apps/webapp/app/routes/engine.v1.worker-actions.connect.ts create mode 100644 apps/webapp/app/routes/engine.v1.worker-actions.deployments.$deploymentFriendlyId.dequeue.ts create mode 100644 apps/webapp/app/routes/engine.v1.worker-actions.dequeue.ts create mode 100644 apps/webapp/app/routes/engine.v1.worker-actions.heartbeat.ts create mode 100644 apps/webapp/app/routes/engine.v1.worker-actions.runs.$runFriendlyId.logs.debug.ts create mode 100644 apps/webapp/app/routes/engine.v1.worker-actions.runs.$runFriendlyId.snapshots.$snapshotFriendlyId.attempts.complete.ts create mode 100644 apps/webapp/app/routes/engine.v1.worker-actions.runs.$runFriendlyId.snapshots.$snapshotFriendlyId.attempts.start.ts create mode 100644 apps/webapp/app/routes/engine.v1.worker-actions.runs.$runFriendlyId.snapshots.$snapshotFriendlyId.continue.ts create mode 100644 apps/webapp/app/routes/engine.v1.worker-actions.runs.$runFriendlyId.snapshots.$snapshotFriendlyId.heartbeat.ts create mode 100644 apps/webapp/app/routes/engine.v1.worker-actions.runs.$runFriendlyId.snapshots.$snapshotFriendlyId.restore.ts create mode 100644 apps/webapp/app/routes/engine.v1.worker-actions.runs.$runFriendlyId.snapshots.$snapshotFriendlyId.suspend.ts create mode 100644 apps/webapp/app/routes/engine.v1.worker-actions.runs.$runFriendlyId.snapshots.latest.ts create mode 100644 apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.waitpoints.$waitpointFriendlyId.complete/route.tsx create mode 100644 apps/webapp/app/services/engineRateLimit.server.ts create mode 100644 apps/webapp/app/utils/sse.ts create mode 100644 apps/webapp/app/utils/string.ts create mode 100644 apps/webapp/app/v3/engineVersion.server.ts create mode 100644 apps/webapp/app/v3/featureFlags.server.ts create mode 100644 apps/webapp/app/v3/runEngine.server.ts create mode 100644 apps/webapp/app/v3/runEngineHandlers.server.ts create mode 100644 apps/webapp/app/v3/runQueue.server.ts create mode 100644 apps/webapp/app/v3/services/batchTriggerV4.server.ts create mode 100644 apps/webapp/app/v3/services/cancelTaskRunV1.server.ts delete mode 100644 apps/webapp/app/v3/services/heartbeatService.server.ts create mode 100644 apps/webapp/app/v3/services/triggerTaskV1.server.ts create mode 100644 apps/webapp/app/v3/services/triggerTaskV2.server.ts create mode 100644 apps/webapp/app/v3/services/worker/workerGroupService.server.ts create mode 100644 apps/webapp/app/v3/services/worker/workerGroupTokenService.server.ts create mode 100644 internal-packages/database/prisma/migrations/20250103152909_add_run_engine_v2/migration.sql create mode 100644 internal-packages/database/prisma/migrations/20250106172943_added_span_id_to_complete_to_task_run_waitpoint/migration.sql create mode 100644 internal-packages/database/prisma/migrations/20250109131442_added_batch_and_index_to_task_run_waitpoint_and_task_run_execution_snapshot/migration.sql create mode 100644 internal-packages/database/prisma/migrations/20250109173506_waitpoint_added_batch_type/migration.sql create mode 100644 internal-packages/database/prisma/migrations/20250109175955_waitpoint_added_completed_by_batch_id_index/migration.sql create mode 100644 internal-packages/database/prisma/migrations/20250114153223_task_run_waitpoint_unique_constraint_added_batch_index/migration.sql create mode 100644 internal-packages/database/prisma/migrations/20250116115746_rename_blocked_by_waitpoints_to_suspended/migration.sql create mode 100644 internal-packages/database/prisma/migrations/20250128160520_add_runner_id_to_execution_snapshots/migration.sql create mode 100644 internal-packages/database/prisma/migrations/20250130173941_background_worker_added_engine_version_column/migration.sql create mode 100644 internal-packages/database/prisma/migrations/20250207104914_added_environment_and_environment_type_to_task_run_execution_snapshot/migration.sql create mode 100644 internal-packages/database/prisma/migrations/20250219140441_waitpoint_added_idempotency_key_expires_at/migration.sql create mode 100644 internal-packages/database/prisma/migrations/20250304184614_remove_task_run_first_attempt_started_at_column/migration.sql create mode 100644 internal-packages/run-engine/README.md create mode 100644 internal-packages/run-engine/execution-states.png create mode 100644 internal-packages/run-engine/package.json create mode 100644 internal-packages/run-engine/src/engine/consts.ts create mode 100644 internal-packages/run-engine/src/engine/db/worker.ts create mode 100644 internal-packages/run-engine/src/engine/errors.ts create mode 100644 internal-packages/run-engine/src/engine/eventBus.ts create mode 100644 internal-packages/run-engine/src/engine/executionSnapshots.ts create mode 100644 internal-packages/run-engine/src/engine/index.ts create mode 100644 internal-packages/run-engine/src/engine/locking.test.ts create mode 100644 internal-packages/run-engine/src/engine/locking.ts create mode 100644 internal-packages/run-engine/src/engine/machinePresets.ts create mode 100644 internal-packages/run-engine/src/engine/statuses.ts create mode 100644 internal-packages/run-engine/src/engine/tests/batchTrigger.test.ts create mode 100644 internal-packages/run-engine/src/engine/tests/batchTriggerAndWait.test.ts create mode 100644 internal-packages/run-engine/src/engine/tests/cancelling.test.ts create mode 100644 internal-packages/run-engine/src/engine/tests/checkpoints.test.ts create mode 100644 internal-packages/run-engine/src/engine/tests/delays.test.ts create mode 100644 internal-packages/run-engine/src/engine/tests/dequeuing.test.ts create mode 100644 internal-packages/run-engine/src/engine/tests/heartbeats.test.ts create mode 100644 internal-packages/run-engine/src/engine/tests/notDeployed.test.ts create mode 100644 internal-packages/run-engine/src/engine/tests/priority.test.ts create mode 100644 internal-packages/run-engine/src/engine/tests/trigger.test.ts create mode 100644 internal-packages/run-engine/src/engine/tests/triggerAndWait.test.ts create mode 100644 internal-packages/run-engine/src/engine/tests/ttl.test.ts create mode 100644 internal-packages/run-engine/src/engine/tests/waitpoints.test.ts create mode 100644 internal-packages/run-engine/src/engine/types.ts create mode 100644 internal-packages/run-engine/src/index.ts create mode 100644 internal-packages/run-engine/src/run-queue/index.test.ts create mode 100644 internal-packages/run-engine/src/run-queue/index.ts create mode 100644 internal-packages/run-engine/src/run-queue/keyProducer.test.ts create mode 100644 internal-packages/run-engine/src/run-queue/keyProducer.ts create mode 100644 internal-packages/run-engine/src/run-queue/simpleWeightedPriorityStrategy.ts create mode 100644 internal-packages/run-engine/src/run-queue/types.ts create mode 100644 internal-packages/run-engine/src/shared/index.ts create mode 100644 internal-packages/run-engine/tsconfig.json create mode 100644 internal-packages/run-engine/vitest.config.ts create mode 100644 internal-packages/testcontainers/src/setup.ts create mode 100644 packages/cli-v3/src/commands/switch.ts create mode 100644 packages/cli-v3/src/commands/trigger.ts create mode 100644 packages/cli-v3/src/commands/workers/build.ts create mode 100644 packages/cli-v3/src/commands/workers/create.ts create mode 100644 packages/cli-v3/src/commands/workers/index.ts create mode 100644 packages/cli-v3/src/commands/workers/list.ts create mode 100644 packages/cli-v3/src/commands/workers/run.ts create mode 100644 packages/cli-v3/src/dev/devSupervisor.ts delete mode 100644 packages/cli-v3/src/entryPoints/deploy-run-controller.ts create mode 100644 packages/cli-v3/src/entryPoints/dev-run-controller.ts rename packages/cli-v3/src/entryPoints/{deploy-index-controller.ts => managed-index-controller.ts} (99%) rename packages/cli-v3/src/entryPoints/{deploy-index-worker.ts => managed-index-worker.ts} (88%) create mode 100644 packages/cli-v3/src/entryPoints/managed-run-controller.ts rename packages/cli-v3/src/entryPoints/{deploy-run-worker.ts => managed-run-worker.ts} (86%) create mode 100644 packages/core/src/debounce.ts create mode 100644 packages/core/src/v3/apps/consts.ts create mode 100644 packages/core/src/v3/apps/exec.ts create mode 100644 packages/core/src/v3/apps/maxDuration.ts create mode 100644 packages/core/src/v3/apps/queueName.ts rename packages/core/src/v3/{apps => checkpoints}/checkpoints.ts (95%) create mode 100644 packages/core/src/v3/checkpoints/index.ts delete mode 100644 packages/core/src/v3/dev/index.ts delete mode 100644 packages/core/src/v3/prod/index.ts create mode 100644 packages/core/src/v3/runEngineWorker/consts.ts create mode 100644 packages/core/src/v3/runEngineWorker/index.ts create mode 100644 packages/core/src/v3/runEngineWorker/supervisor/events.ts create mode 100644 packages/core/src/v3/runEngineWorker/supervisor/http.ts create mode 100644 packages/core/src/v3/runEngineWorker/supervisor/queueConsumer.ts create mode 100644 packages/core/src/v3/runEngineWorker/supervisor/schemas.ts create mode 100644 packages/core/src/v3/runEngineWorker/supervisor/session.ts create mode 100644 packages/core/src/v3/runEngineWorker/supervisor/types.ts create mode 100644 packages/core/src/v3/runEngineWorker/supervisor/util.ts create mode 100644 packages/core/src/v3/runEngineWorker/types.ts create mode 100644 packages/core/src/v3/runEngineWorker/util.ts create mode 100644 packages/core/src/v3/runEngineWorker/workload/http.ts create mode 100644 packages/core/src/v3/runEngineWorker/workload/schemas.ts create mode 100644 packages/core/src/v3/runEngineWorker/workload/types.ts create mode 100644 packages/core/src/v3/runEngineWorker/workload/util.ts delete mode 100644 packages/core/src/v3/runtime/devRuntimeManager.ts create mode 100644 packages/core/src/v3/runtime/managedRuntimeManager.ts delete mode 100644 packages/core/src/v3/runtime/prodRuntimeManager.ts create mode 100644 packages/core/src/v3/schemas/runEngine.ts create mode 100644 packages/core/src/v3/utils/heartbeat.ts create mode 100644 packages/core/src/v3/utils/imageRef.ts create mode 100644 references/hello-world/src/trigger/idempotency.ts create mode 100644 references/hello-world/src/trigger/priority.ts create mode 100644 references/hello-world/src/trigger/waits.ts diff --git a/.changeset/breezy-turtles-talk.md b/.changeset/breezy-turtles-talk.md new file mode 100644 index 000000000..da208cb2c --- /dev/null +++ b/.changeset/breezy-turtles-talk.md @@ -0,0 +1,10 @@ +--- +"@trigger.dev/react-hooks": patch +"@trigger.dev/sdk": patch +"trigger.dev": patch +"@trigger.dev/build": patch +"@trigger.dev/core": patch +"@trigger.dev/rsc": patch +--- + +Run Engine 2.0 (alpha) diff --git a/.configs/tsconfig.base.json b/.configs/tsconfig.base.json index 7224a9a85..3ce4c2db2 100644 --- a/.configs/tsconfig.base.json +++ b/.configs/tsconfig.base.json @@ -1,7 +1,7 @@ { "compilerOptions": { "target": "es2022", - "lib": ["ES2022", "DOM", "DOM.Iterable"], + "lib": ["ES2022", "DOM", "DOM.Iterable", "DOM.AsyncIterable"], "module": "NodeNext", "moduleResolution": "NodeNext", "moduleDetection": "force", diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 25d12a1ed..b53337ecb 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -38,6 +38,9 @@ jobs: - name: 📥 Download deps run: pnpm install --frozen-lockfile --filter trigger.dev... + - name: 📀 Generate Prisma Client + run: pnpm run generate + - name: 🔧 Build v3 cli monorepo dependencies run: pnpm run build --filter trigger.dev^... diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml index aa134d782..9905fc9ef 100644 --- a/.github/workflows/unit-tests.yml +++ b/.github/workflows/unit-tests.yml @@ -24,6 +24,13 @@ jobs: node-version: 20.11.1 cache: "pnpm" + # ..to avoid rate limits when pulling images + - name: 🐳 Login to DockerHub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: 📥 Download deps run: pnpm install --frozen-lockfile diff --git a/.npmrc b/.npmrc index 8dbd39f18..fac274c90 100644 --- a/.npmrc +++ b/.npmrc @@ -1,3 +1,4 @@ link-workspace-packages=false public-hoist-pattern[]=*prisma* -prefer-workspace-packages=true \ No newline at end of file +prefer-workspace-packages=true +update-notifier=false \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json index 3a7492936..40f97bb42 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -133,6 +133,14 @@ "command": "pnpm exec trigger dev", "cwd": "${workspaceFolder}/references/hello-world", "sourceMaps": true + }, + { + "type": "node-terminal", + "request": "launch", + "name": "Debug RunEngine tests", + "command": "pnpm run test --filter @internal/run-engine", + "cwd": "${workspaceFolder}", + "sourceMaps": true } ] } diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 260d9861f..b3ed90761 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -230,13 +230,21 @@ pnpm run db:studio cd packages/database ``` -3. Create and apply the migrations +3. Create a migration ``` - pnpm run db:migrate:dev + pnpm run db:migrate:dev:create ``` - This creates a migration file and executes the migrations against your database and applies changes to the database schema(s) + This creates a migration file. Check the migration file does only what you want. If you're adding any database indexes they must use `CONCURRENTLY`, otherwise they'll lock the table when executed. + +4. Run the migration. + + ``` + pnpm run db:migrate:deploy + pnpm run generate + ``` + This executes the migrations against your database and applies changes to the database schema(s), and then regenerates the Prisma client. 4. Commit generated migrations as well as changes to the schema.prisma file 5. If you're using VSCode you may need to restart the Typescript server in the webapp to get updated type inference. Open a TypeScript file, then open the Command Palette (View > Command Palette) and run `TypeScript: Restart TS server`. diff --git a/apps/coordinator/package.json b/apps/coordinator/package.json index c860adb1c..3b4240bd3 100644 --- a/apps/coordinator/package.json +++ b/apps/coordinator/package.json @@ -23,10 +23,8 @@ "tinyexec": "^0.3.0" }, "devDependencies": { - "@types/node": "^18", "dotenv": "^16.4.2", "esbuild": "^0.19.11", - "tsx": "^4.7.0", - "typescript": "^5.3.3" + "tsx": "^4.7.0" } } \ No newline at end of file diff --git a/apps/coordinator/src/checkpointer.ts b/apps/coordinator/src/checkpointer.ts index 269bf6d42..69c51e2fb 100644 --- a/apps/coordinator/src/checkpointer.ts +++ b/apps/coordinator/src/checkpointer.ts @@ -1,5 +1,5 @@ import { ExponentialBackoff } from "@trigger.dev/core/v3/apps"; -import { testDockerCheckpoint } from "@trigger.dev/core/v3/apps"; +import { testDockerCheckpoint } from "@trigger.dev/core/v3/checkpoints"; import { nanoid } from "nanoid"; import fs from "node:fs/promises"; import { ChaosMonkey } from "./chaosMonkey"; diff --git a/apps/coordinator/tsconfig.json b/apps/coordinator/tsconfig.json index 3c0376085..15cdfe9c1 100644 --- a/apps/coordinator/tsconfig.json +++ b/apps/coordinator/tsconfig.json @@ -1,8 +1,6 @@ { - "include": ["./src/**/*.ts"], - "exclude": ["node_modules"], "compilerOptions": { - "target": "es2016", + "target": "es2018", "module": "commonjs", "esModuleInterop": true, "resolveJsonModule": true, diff --git a/apps/docker-provider/package.json b/apps/docker-provider/package.json index 56d8f89b7..f3e4015ef 100644 --- a/apps/docker-provider/package.json +++ b/apps/docker-provider/package.json @@ -20,10 +20,8 @@ "execa": "^8.0.1" }, "devDependencies": { - "@types/node": "^18.19.8", "dotenv": "^16.4.2", "esbuild": "^0.19.11", - "tsx": "^4.7.0", - "typescript": "^5.3.3" + "tsx": "^4.7.0" } } \ No newline at end of file diff --git a/apps/docker-provider/src/index.ts b/apps/docker-provider/src/index.ts index b789b0d02..3ca5184c7 100644 --- a/apps/docker-provider/src/index.ts +++ b/apps/docker-provider/src/index.ts @@ -7,7 +7,8 @@ import { TaskOperationsRestoreOptions, } from "@trigger.dev/core/v3/apps"; import { SimpleLogger } from "@trigger.dev/core/v3/apps"; -import { isExecaChildProcess, testDockerCheckpoint } from "@trigger.dev/core/v3/apps"; +import { isExecaChildProcess } from "@trigger.dev/core/v3/apps"; +import { testDockerCheckpoint } from "@trigger.dev/core/v3/checkpoints"; import { setTimeout } from "node:timers/promises"; import { PostStartCauses, PreStopCauses } from "@trigger.dev/core/v3"; diff --git a/apps/kubernetes-provider/package.json b/apps/kubernetes-provider/package.json index 3b62f6544..6cb26e2c7 100644 --- a/apps/kubernetes-provider/package.json +++ b/apps/kubernetes-provider/package.json @@ -23,7 +23,6 @@ "devDependencies": { "dotenv": "^16.4.2", "esbuild": "^0.19.11", - "tsx": "^4.7.0", - "typescript": "^5.3.3" + "tsx": "^4.7.0" } } \ No newline at end of file diff --git a/apps/kubernetes-provider/tsconfig.json b/apps/kubernetes-provider/tsconfig.json index 057952409..4635e1764 100644 --- a/apps/kubernetes-provider/tsconfig.json +++ b/apps/kubernetes-provider/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "es2016", + "target": "es2018", "module": "commonjs", "esModuleInterop": true, "forceConsistentCasingInFileNames": true, diff --git a/apps/proxy/package.json b/apps/proxy/package.json index d72311dcf..80646e60a 100644 --- a/apps/proxy/package.json +++ b/apps/proxy/package.json @@ -9,7 +9,6 @@ }, "devDependencies": { "@cloudflare/workers-types": "^4.20240512.0", - "typescript": "^5.0.4", "wrangler": "^3.57.1" }, "dependencies": { diff --git a/apps/webapp/app/assets/icons/AnimatedHourglassIcon.tsx b/apps/webapp/app/assets/icons/AnimatedHourglassIcon.tsx new file mode 100644 index 000000000..3c94426fa --- /dev/null +++ b/apps/webapp/app/assets/icons/AnimatedHourglassIcon.tsx @@ -0,0 +1,27 @@ +import { useAnimate } from "framer-motion"; +import { HourglassIcon } from "lucide-react"; +import { useEffect } from "react"; + +export function AnimatedHourglassIcon({ + className, + delay, +}: { + className?: string; + delay?: number; +}) { + const [scope, animate] = useAnimate(); + + useEffect(() => { + animate( + [ + [scope.current, { rotate: 0 }, { duration: 0.7 }], + [scope.current, { rotate: 180 }, { duration: 0.3 }], + [scope.current, { rotate: 180 }, { duration: 0.7 }], + [scope.current, { rotate: 360 }, { duration: 0.3 }], + ], + { repeat: Infinity, delay } + ); + }, []); + + return ; +} diff --git a/apps/webapp/app/assets/icons/PauseIcon.tsx b/apps/webapp/app/assets/icons/PauseIcon.tsx new file mode 100644 index 000000000..ccbc1d9a4 --- /dev/null +++ b/apps/webapp/app/assets/icons/PauseIcon.tsx @@ -0,0 +1,12 @@ +export function PauseIcon({ className }: { className?: string }) { + return ( + + + + ); +} diff --git a/apps/webapp/app/assets/icons/TaskCachedIcon.tsx b/apps/webapp/app/assets/icons/TaskCachedIcon.tsx new file mode 100644 index 000000000..650f9be39 --- /dev/null +++ b/apps/webapp/app/assets/icons/TaskCachedIcon.tsx @@ -0,0 +1,49 @@ +export function TaskCachedIcon({ className }: { className?: string }) { + return ( + + + + + + + + + + + + + + + + + + + ); +} diff --git a/apps/webapp/app/components/code/CodeBlock.tsx b/apps/webapp/app/components/code/CodeBlock.tsx index db1d16522..ba5101a14 100644 --- a/apps/webapp/app/components/code/CodeBlock.tsx +++ b/apps/webapp/app/components/code/CodeBlock.tsx @@ -53,7 +53,7 @@ type CodeBlockProps = { fileName?: string; /** title text for the Title row */ - rowTitle?: string; + rowTitle?: ReactNode; /** Whether to show the open in modal button */ showOpenInModal?: boolean; diff --git a/apps/webapp/app/components/primitives/Switch.tsx b/apps/webapp/app/components/primitives/Switch.tsx index 5cb860910..e5d89f20d 100644 --- a/apps/webapp/app/components/primitives/Switch.tsx +++ b/apps/webapp/app/components/primitives/Switch.tsx @@ -3,6 +3,7 @@ import * as React from "react"; import * as SwitchPrimitives from "@radix-ui/react-switch"; import { cn } from "~/utils/cn"; +import { ShortcutDefinition, useShortcutKeys } from "~/hooks/useShortcutKeys"; const variations = { large: { @@ -23,14 +24,34 @@ const variations = { type SwitchProps = React.ComponentPropsWithoutRef & { label?: React.ReactNode; variant: keyof typeof variations; + shortcut?: ShortcutDefinition; }; export const Switch = React.forwardRef, SwitchProps>( ({ className, variant, label, ...props }, ref) => { + const innerRef = React.useRef(null); + React.useImperativeHandle(ref, () => innerRef.current as HTMLButtonElement); + const { container, root, thumb, text } = variations[variant]; + if (props.shortcut) { + useShortcutKeys({ + shortcut: props.shortcut, + action: () => { + if (innerRef.current) { + innerRef.current.click(); + } + }, + disabled: props.disabled, + }); + } + return ( - + {label ? (